• Roopa Prabhu's avatar
    net, neigh: Extend neigh->flags to 32 bit to allow for extensions · 2c611ad9
    Roopa Prabhu authored
    Currently, all bits in struct ndmsg's ndm_flags are used up with the most
    recent addition of 435f2e7c ("net: bridge: add support for sticky fdb
    entries"). This makes it impossible to extend the neighboring subsystem
    with new NTF_* flags:
    
      struct ndmsg {
        __u8   ndm_family;
        __u8   ndm_pad1;
        __u16  ndm_pad2;
        __s32  ndm_ifindex;
        __u16  ndm_state;
        __u8   ndm_flags;
        __u8   ndm_type;
      };
    
    There are ndm_pad{1,2} attributes which are not used. However, due to
    uncareful design, the kernel does not enforce them to be zero upon new
    neighbor entry addition, and given they've been around forever, it is
    not possible to reuse them today due to risk of breakage. One option to
    overcome this limitation is to add a new NDA_FLAGS_EXT attribute for
    extended flags.
    
    In struct neighbour, there is a 3 byte hole between protocol and ha_lock,
    which allows neigh->flags to be extended from 8 to 32 bits while still
    being on the same cacheline as before. This also allows for all future
    NTF_* flags being in neigh->flags rather than yet another flags field.
    Unknown flags in NDA_FLAGS_EXT will be rejected by the kernel.
    Co-developed-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: default avatarRoopa Prabhu <roopa@nvidia.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    2c611ad9
neighbour.c 92.7 KB