net: sync some IP headers with glibc
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: Thomas 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: Cong Wang <amwang@redhat.com>
Signed-off-by: Carlos O'Donell <carlos@redhat.com>
Signed-off-by: Cong Wang <amwang@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
	
	
This commit is contained in:
		
					parent
					
						
							
								42a5a5c128
							
						
					
				
			
			
				commit
				
					
						cfd280c912
					
				
			
		
					 4 changed files with 169 additions and 20 deletions
				
			
		|  | @ -22,22 +22,30 @@ | |||
| #define _UAPI_LINUX_IN6_H | ||||
| 
 | ||||
| #include <linux/types.h> | ||||
| #include <linux/libc-compat.h> | ||||
| 
 | ||||
| /*
 | ||||
|  *	IPv6 address structure | ||||
|  */ | ||||
| 
 | ||||
| #if __UAPI_DEF_IN6_ADDR | ||||
| struct in6_addr { | ||||
| 	union { | ||||
| 		__u8		u6_addr8[16]; | ||||
| #if __UAPI_DEF_IN6_ADDR_ALT | ||||
| 		__be16		u6_addr16[8]; | ||||
| 		__be32		u6_addr32[4]; | ||||
| #endif | ||||
| 	} in6_u; | ||||
| #define s6_addr			in6_u.u6_addr8 | ||||
| #if __UAPI_DEF_IN6_ADDR_ALT | ||||
| #define s6_addr16		in6_u.u6_addr16 | ||||
| #define s6_addr32		in6_u.u6_addr32 | ||||
| #endif | ||||
| }; | ||||
| #endif /* __UAPI_DEF_IN6_ADDR */ | ||||
| 
 | ||||
| #if __UAPI_DEF_SOCKADDR_IN6 | ||||
| struct sockaddr_in6 { | ||||
| 	unsigned short int	sin6_family;    /* AF_INET6 */ | ||||
| 	__be16			sin6_port;      /* Transport layer port # */ | ||||
|  | @ -45,7 +53,9 @@ struct sockaddr_in6 { | |||
| 	struct in6_addr		sin6_addr;      /* IPv6 address */ | ||||
| 	__u32			sin6_scope_id;  /* scope id (new in RFC2553) */ | ||||
| }; | ||||
| #endif /* __UAPI_DEF_SOCKADDR_IN6 */ | ||||
| 
 | ||||
| #if __UAPI_DEF_IPV6_MREQ | ||||
| struct ipv6_mreq { | ||||
| 	/* IPv6 multicast address of group */ | ||||
| 	struct in6_addr ipv6mr_multiaddr; | ||||
|  | @ -53,6 +63,7 @@ struct ipv6_mreq { | |||
| 	/* local IPv6 address of interface */ | ||||
| 	int		ipv6mr_ifindex; | ||||
| }; | ||||
| #endif /* __UAPI_DEF_IVP6_MREQ */ | ||||
| 
 | ||||
| #define ipv6mr_acaddr	ipv6mr_multiaddr | ||||
| 
 | ||||
|  | @ -114,13 +125,24 @@ struct in6_flowlabel_req { | |||
| /*
 | ||||
|  *	IPV6 extension headers | ||||
|  */ | ||||
| #define IPPROTO_HOPOPTS		0	/* IPv6 hop-by-hop options	*/ | ||||
| #define IPPROTO_ROUTING		43	/* IPv6 routing header		*/ | ||||
| #define IPPROTO_FRAGMENT	44	/* IPv6 fragmentation header	*/ | ||||
| #define IPPROTO_ICMPV6		58	/* ICMPv6			*/ | ||||
| #define IPPROTO_NONE		59	/* IPv6 no next header		*/ | ||||
| #define IPPROTO_DSTOPTS		60	/* IPv6 destination options	*/ | ||||
| #define IPPROTO_MH		135	/* IPv6 mobility header		*/ | ||||
| #if __UAPI_DEF_IPPROTO_V6 | ||||
| enum { | ||||
|   IPPROTO_HOPOPTS = 0,		/* IPv6 hop-by-hop options      */ | ||||
| #define IPPROTO_HOPOPTS		IPPROTO_HOPOPTS | ||||
|   IPPROTO_ROUTING = 43,		/* IPv6 routing header          */ | ||||
| #define IPPROTO_ROUTING		IPPROTO_ROUTING | ||||
|   IPPROTO_FRAGMENT = 44,	/* IPv6 fragmentation header    */ | ||||
| #define IPPROTO_FRAGMENT	IPPROTO_FRAGMENT | ||||
|   IPPROTO_ICMPV6 = 58,		/* ICMPv6                       */ | ||||
| #define IPPROTO_ICMPV6		IPPROTO_ICMPV6 | ||||
|   IPPROTO_NONE = 59,		/* IPv6 no next header          */ | ||||
| #define IPPROTO_NONE		IPPROTO_NONE | ||||
|   IPPROTO_DSTOPTS = 60,		/* IPv6 destination options     */ | ||||
| #define IPPROTO_DSTOPTS		IPPROTO_DSTOPTS | ||||
|   IPPROTO_MH = 135,		/* IPv6 mobility header         */ | ||||
| #define IPPROTO_MH		IPPROTO_MH | ||||
| }; | ||||
| #endif /* __UAPI_DEF_IPPROTO_V6 */ | ||||
| 
 | ||||
| /*
 | ||||
|  *	IPv6 TLV options. | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Carlos O'Donell
				Carlos O'Donell