Skip to content
  • Thomas Haller's avatar
    platform: fix cache to use kernel's notion for equality of routes · cdd8c657
    Thomas Haller authored
    Until now, NetworkManager's platform cache for routes used the quadruple
    network/plen,metric,ifindex for equaliy. That is not kernel's
    understanding of how routes behave. For example, with `ip route append`
    you can add two IPv4 routes that only differ by their gateway. To
    the previous form of platform cache, these two routes would wrongly
    look identical, as the cache could not contain both routes. This also
    easily leads to cache-inconsistencies.
    
    Now that we have NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID, fix the route's
    compare operator to match kernel's.
    
    Well, not entirely. Kernel understands more properties for routes then
    NetworkManager. Some of these properties may also be part of the ID according
    to kernel. To NetworkManager such routes would still look identical as
    they only differ in a property that is not understood. This can still
    cause cache-inconsistencies. The only fix here is to add support for
    all these properties in NetworkManager as well. However, it's less serious,
    because with this commit we support several of the more important properties.
    See also the related bug rh#1337855 for kernel.
    
    Another difficulty is that `ip route replace` and `ip route change`
    changes an existing route. The replaced route has the same
    NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID, but differ in the actual
    NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID:
    
        # ip -d -4 route show dev v
        # ip monitor route &
        # ip route add 192.168.5.0/24 dev v
        192.168.5.0/24 dev v scope link
        # ip route change 192.168.5.0/24 dev v scope 10
        192.168.5.0/24 dev v scope 10
        # ip -d -4 route show dev v
        unicast 192.168.5.0/24 proto boot scope 10
    
    Note that we only got one RTM_NEWROUTE message, although from NMPCache's
    point of view, a new route (with a particular ID) was added and another
    route (with a different ID) was deleted. The cumbersome workaround is,
    to keep an ordered list of the routes, and figure out which route was
    replaced in response to an RTM_NEWROUTE. In absence of bugs, this should
    work fine. However, as we only rely on events, we might wrongly
    introduce a cache-inconsistancy as well. See the related bug rh#1337860.
    
    Also drop nm_platform_ip4_route_get() and the like. The ID of routes
    is complex, so it makes little sense to look up a route directly.
    cdd8c657