• Daniel Borkmann's avatar
    net, neigh: Enable state migration between NUD_PERMANENT and NTF_USE · 3dc20f47
    Daniel Borkmann authored
    Currently, it is not possible to migrate a neighbor entry between NUD_PERMANENT
    state and NTF_USE flag with a dynamic NUD state from a user space control plane.
    Similarly, it is not possible to add/remove NTF_EXT_LEARNED flag from an existing
    neighbor entry in combination with NTF_USE flag.
    
    This is due to the latter directly calling into neigh_event_send() without any
    meta data updates as happening in __neigh_update(). Thus, to enable this use
    case, extend the latter with a NEIGH_UPDATE_F_USE flag where we break the
    NUD_PERMANENT state in particular so that a latter neigh_event_send() is able
    to re-resolve a neighbor entry.
    
    Before fix, NUD_PERMANENT -> NUD_* & NTF_USE:
    
      # ./ip/ip n replace 192.168.178.30 dev enp5s0 lladdr f4:8c:50:5e:71:9a
      # ./ip/ip n
      192.168.178.30 dev enp5s0 lladdr f4:8c:50:5e:71:9a PERMANENT
      [...]
      # ./ip/ip n replace 192.168.178.30 dev enp5s0 use extern_learn
      # ./ip/ip n
      192.168.178.30 dev enp5s0 lladdr f4:8c:50:5e:71:9a PERMANENT
      [...]
    
    As can be seen, despite the admin-triggered replace, the entry remains in the
    NUD_PERMANENT state.
    
    After fix, NUD_PERMANENT -> NUD_* & NTF_USE:
    
      # ./ip/ip n replace 192.168.178.30 dev enp5s0 lladdr f4:8c:50:5e:71:9a
      # ./ip/ip n
      192.168.178.30 dev enp5s0 lladdr f4:8c:50:5e:71:9a PERMANENT
      [...]
      # ./ip/ip n replace 192.168.178.30 dev enp5s0 use extern_learn
      # ./ip/ip n
      192.168.178.30 dev enp5s0 lladdr f4:8c:50:5e:71:9a extern_learn REACHABLE
      [...]
      # ./ip/ip n
      192.168.178.30 dev enp5s0 lladdr f4:8c:50:5e:71:9a extern_learn STALE
      [...]
      # ./ip/ip n replace 192.168.178.30 dev enp5s0 lladdr f4:8c:50:5e:71:9a
      # ./ip/ip n
      192.168.178.30 dev enp5s0 lladdr f4:8c:50:5e:71:9a PERMANENT
      [...]
    
    After the fix, the admin-triggered replace switches to a dynamic state from
    the NTF_USE flag which triggered a new neighbor resolution. Likewise, we can
    transition back from there, if needed, into NUD_PERMANENT.
    
    Similar before/after behavior can be observed for below transitions:
    
    Before fix, NTF_USE -> NTF_USE | NTF_EXT_LEARNED -> NTF_USE:
    
      # ./ip/ip n replace 192.168.178.30 dev enp5s0 use
      # ./ip/ip n
      192.168.178.30 dev enp5s0 lladdr f4:8c:50:5e:71:9a REACHABLE
      [...]
      # ./ip/ip n replace 192.168.178.30 dev enp5s0 use extern_learn
      # ./ip/ip n
      192.168.178.30 dev enp5s0 lladdr f4:8c:50:5e:71:9a REACHABLE
      [...]
    
    After fix, NTF_USE -> NTF_USE | NTF_EXT_LEARNED -> NTF_USE:
    
      # ./ip/ip n replace 192.168.178.30 dev enp5s0 use
      # ./ip/ip n
      192.168.178.30 dev enp5s0 lladdr f4:8c:50:5e:71:9a REACHABLE
      [...]
      # ./ip/ip n replace 192.168.178.30 dev enp5s0 use extern_learn
      # ./ip/ip n
      192.168.178.30 dev enp5s0 lladdr f4:8c:50:5e:71:9a extern_learn REACHABLE
      [...]
      # ./ip/ip n replace 192.168.178.30 dev enp5s0 use
      # ./ip/ip n
      192.168.178.30 dev enp5s0 lladdr f4:8c:50:5e:71:9a REACHABLE
      [..]
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarRoopa Prabhu <roopa@nvidia.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    3dc20f47
neighbour.c 91.9 KB