Skip to content
  • Carlos O'Donell's avatar
    net: sync some IP headers with glibc · cfd280c9
    Carlos O'Donell authored
    
    
    Solution:
    =========
    
    - Synchronize linux's `include/uapi/linux/in6.h'
      with glibc's `inet/netinet/in.h'.
    - Synchronize glibc's `inet/netinet/in.h with linux's
      `include/uapi/linux/in6.h'.
    - Allow including the headers in either other.
    - First header included defines the structures and macros.
    
    Details:
    ========
    
    The kernel promises not to break the UAPI ABI so I don't
    see why we can't just have the two userspace headers
    coordinate?
    
    If you include the kernel headers first you get those,
    and if you include the glibc headers first you get those,
    and the following patch arranges a coordination and
    synchronization between the two.
    
    Let's handle `include/uapi/linux/in6.h' from linux,
    and `inet/netinet/in.h' from glibc and ensure they compile
    in any order and preserve the required ABI.
    
    These two patches pass the following compile tests:
    
    cat >> test1.c <<EOF
    int main (void) {
      return 0;
    }
    EOF
    gcc -c test1.c
    
    cat >> test2.c <<EOF
    int main (void) {
      return 0;
    }
    EOF
    gcc -c test2.c
    
    One wrinkle is that the kernel has a different name for one of
    the members in ipv6_mreq. In the kernel patch we create a macro
    to cover the uses of the old name, and while that's not entirely
    clean it's one of the best solutions (aside from an anonymous
    union which has other issues).
    
    I've reviewed the code and it looks to me like the ABI is
    assured and everything matches on both sides.
    
    Notes:
    - You want netinet/in.h to include bits/in.h as early as possible,
      but it needs in_addr so define in_addr early.
    - You want bits/in.h included as early as possible so you can use
      the linux specific code to define __USE_KERNEL_DEFS based on
      the _UAPI_* macro definition and use those to cull in.h.
    - glibc was missing IPPROTO_MH, added here.
    
    Compile tested and inspected.
    
    Reported-by: default avatarThomas Backlund <tmb@mageia.org>
    Cc: Thomas Backlund <tmb@mageia.org>
    Cc: libc-alpha@sourceware.org
    Cc: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
    Cc: David S. Miller <davem@davemloft.net>
    Tested-by: default avatarCong Wang <amwang@redhat.com>
    Signed-off-by: default avatarCarlos O'Donell <carlos@redhat.com>
    Signed-off-by: default avatarCong Wang <amwang@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    cfd280c9