 cfd280c912
			
		
	
	
	cfd280c912
	
	
	
		
			
			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>
		
	
			
		
			
				
	
	
		
			290 lines
		
	
	
	
		
			7 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			290 lines
		
	
	
	
		
			7 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  *	Types and definitions for AF_INET6 
 | |
|  *	Linux INET6 implementation 
 | |
|  *
 | |
|  *	Authors:
 | |
|  *	Pedro Roque		<roque@di.fc.ul.pt>	
 | |
|  *
 | |
|  *	Sources:
 | |
|  *	IPv6 Program Interfaces for BSD Systems
 | |
|  *      <draft-ietf-ipngwg-bsd-api-05.txt>
 | |
|  *
 | |
|  *	Advanced Sockets API for IPv6
 | |
|  *	<draft-stevens-advanced-api-00.txt>
 | |
|  *
 | |
|  *	This program is free software; you can redistribute it and/or
 | |
|  *      modify it under the terms of the GNU General Public License
 | |
|  *      as published by the Free Software Foundation; either version
 | |
|  *      2 of the License, or (at your option) any later version.
 | |
|  */
 | |
| 
 | |
| #ifndef _UAPI_LINUX_IN6_H
 | |
| #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 # */
 | |
| 	__be32			sin6_flowinfo;  /* IPv6 flow information */
 | |
| 	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;
 | |
| 
 | |
| 	/* local IPv6 address of interface */
 | |
| 	int		ipv6mr_ifindex;
 | |
| };
 | |
| #endif /* __UAPI_DEF_IVP6_MREQ */
 | |
| 
 | |
| #define ipv6mr_acaddr	ipv6mr_multiaddr
 | |
| 
 | |
| struct in6_flowlabel_req {
 | |
| 	struct in6_addr	flr_dst;
 | |
| 	__be32	flr_label;
 | |
| 	__u8	flr_action;
 | |
| 	__u8	flr_share;
 | |
| 	__u16	flr_flags;
 | |
| 	__u16 	flr_expires;
 | |
| 	__u16	flr_linger;
 | |
| 	__u32	__flr_pad;
 | |
| 	/* Options in format of IPV6_PKTOPTIONS */
 | |
| };
 | |
| 
 | |
| #define IPV6_FL_A_GET	0
 | |
| #define IPV6_FL_A_PUT	1
 | |
| #define IPV6_FL_A_RENEW	2
 | |
| 
 | |
| #define IPV6_FL_F_CREATE	1
 | |
| #define IPV6_FL_F_EXCL		2
 | |
| 
 | |
| #define IPV6_FL_S_NONE		0
 | |
| #define IPV6_FL_S_EXCL		1
 | |
| #define IPV6_FL_S_PROCESS	2
 | |
| #define IPV6_FL_S_USER		3
 | |
| #define IPV6_FL_S_ANY		255
 | |
| 
 | |
| 
 | |
| /*
 | |
|  *	Bitmask constant declarations to help applications select out the 
 | |
|  *	flow label and priority fields.
 | |
|  *
 | |
|  *	Note that this are in host byte order while the flowinfo field of
 | |
|  *	sockaddr_in6 is in network byte order.
 | |
|  */
 | |
| 
 | |
| #define IPV6_FLOWINFO_FLOWLABEL		0x000fffff
 | |
| #define IPV6_FLOWINFO_PRIORITY		0x0ff00000
 | |
| 
 | |
| /* These definitions are obsolete */
 | |
| #define IPV6_PRIORITY_UNCHARACTERIZED	0x0000
 | |
| #define IPV6_PRIORITY_FILLER		0x0100
 | |
| #define IPV6_PRIORITY_UNATTENDED	0x0200
 | |
| #define IPV6_PRIORITY_RESERVED1		0x0300
 | |
| #define IPV6_PRIORITY_BULK		0x0400
 | |
| #define IPV6_PRIORITY_RESERVED2		0x0500
 | |
| #define IPV6_PRIORITY_INTERACTIVE	0x0600
 | |
| #define IPV6_PRIORITY_CONTROL		0x0700
 | |
| #define IPV6_PRIORITY_8			0x0800
 | |
| #define IPV6_PRIORITY_9			0x0900
 | |
| #define IPV6_PRIORITY_10		0x0a00
 | |
| #define IPV6_PRIORITY_11		0x0b00
 | |
| #define IPV6_PRIORITY_12		0x0c00
 | |
| #define IPV6_PRIORITY_13		0x0d00
 | |
| #define IPV6_PRIORITY_14		0x0e00
 | |
| #define IPV6_PRIORITY_15		0x0f00
 | |
| 
 | |
| /*
 | |
|  *	IPV6 extension headers
 | |
|  */
 | |
| #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.
 | |
|  */
 | |
| #define IPV6_TLV_PAD1		0
 | |
| #define IPV6_TLV_PADN		1
 | |
| #define IPV6_TLV_ROUTERALERT	5
 | |
| #define IPV6_TLV_JUMBO		194
 | |
| #define IPV6_TLV_HAO		201	/* home address option */
 | |
| 
 | |
| /*
 | |
|  *	IPV6 socket options
 | |
|  */
 | |
| 
 | |
| #define IPV6_ADDRFORM		1
 | |
| #define IPV6_2292PKTINFO	2
 | |
| #define IPV6_2292HOPOPTS	3
 | |
| #define IPV6_2292DSTOPTS	4
 | |
| #define IPV6_2292RTHDR		5
 | |
| #define IPV6_2292PKTOPTIONS	6
 | |
| #define IPV6_CHECKSUM		7
 | |
| #define IPV6_2292HOPLIMIT	8
 | |
| #define IPV6_NEXTHOP		9
 | |
| #define IPV6_AUTHHDR		10	/* obsolete */
 | |
| #define IPV6_FLOWINFO		11
 | |
| 
 | |
| #define IPV6_UNICAST_HOPS	16
 | |
| #define IPV6_MULTICAST_IF	17
 | |
| #define IPV6_MULTICAST_HOPS	18
 | |
| #define IPV6_MULTICAST_LOOP	19
 | |
| #define IPV6_ADD_MEMBERSHIP	20
 | |
| #define IPV6_DROP_MEMBERSHIP	21
 | |
| #define IPV6_ROUTER_ALERT	22
 | |
| #define IPV6_MTU_DISCOVER	23
 | |
| #define IPV6_MTU		24
 | |
| #define IPV6_RECVERR		25
 | |
| #define IPV6_V6ONLY		26
 | |
| #define IPV6_JOIN_ANYCAST	27
 | |
| #define IPV6_LEAVE_ANYCAST	28
 | |
| 
 | |
| /* IPV6_MTU_DISCOVER values */
 | |
| #define IPV6_PMTUDISC_DONT		0
 | |
| #define IPV6_PMTUDISC_WANT		1
 | |
| #define IPV6_PMTUDISC_DO		2
 | |
| #define IPV6_PMTUDISC_PROBE		3
 | |
| 
 | |
| /* Flowlabel */
 | |
| #define IPV6_FLOWLABEL_MGR	32
 | |
| #define IPV6_FLOWINFO_SEND	33
 | |
| 
 | |
| #define IPV6_IPSEC_POLICY	34
 | |
| #define IPV6_XFRM_POLICY	35
 | |
| 
 | |
| /*
 | |
|  * Multicast:
 | |
|  * Following socket options are shared between IPv4 and IPv6.
 | |
|  *
 | |
|  * MCAST_JOIN_GROUP		42
 | |
|  * MCAST_BLOCK_SOURCE		43
 | |
|  * MCAST_UNBLOCK_SOURCE		44
 | |
|  * MCAST_LEAVE_GROUP		45
 | |
|  * MCAST_JOIN_SOURCE_GROUP	46
 | |
|  * MCAST_LEAVE_SOURCE_GROUP	47
 | |
|  * MCAST_MSFILTER		48
 | |
|  */
 | |
| 
 | |
| /*
 | |
|  * Advanced API (RFC3542) (1)
 | |
|  *
 | |
|  * Note: IPV6_RECVRTHDRDSTOPTS does not exist. see net/ipv6/datagram.c.
 | |
|  */
 | |
| 
 | |
| #define IPV6_RECVPKTINFO	49
 | |
| #define IPV6_PKTINFO		50
 | |
| #define IPV6_RECVHOPLIMIT	51
 | |
| #define IPV6_HOPLIMIT		52
 | |
| #define IPV6_RECVHOPOPTS	53
 | |
| #define IPV6_HOPOPTS		54
 | |
| #define IPV6_RTHDRDSTOPTS	55
 | |
| #define IPV6_RECVRTHDR		56
 | |
| #define IPV6_RTHDR		57
 | |
| #define IPV6_RECVDSTOPTS	58
 | |
| #define IPV6_DSTOPTS		59
 | |
| #define IPV6_RECVPATHMTU	60
 | |
| #define IPV6_PATHMTU		61
 | |
| #define IPV6_DONTFRAG		62
 | |
| #if 0	/* not yet */
 | |
| #define IPV6_USE_MIN_MTU	63
 | |
| #endif
 | |
| 
 | |
| /*
 | |
|  * Netfilter (1)
 | |
|  *
 | |
|  * Following socket options are used in ip6_tables;
 | |
|  * see include/linux/netfilter_ipv6/ip6_tables.h.
 | |
|  *
 | |
|  * IP6T_SO_SET_REPLACE / IP6T_SO_GET_INFO		64
 | |
|  * IP6T_SO_SET_ADD_COUNTERS / IP6T_SO_GET_ENTRIES	65
 | |
|  */
 | |
| 
 | |
| /*
 | |
|  * Advanced API (RFC3542) (2)
 | |
|  */
 | |
| #define IPV6_RECVTCLASS		66
 | |
| #define IPV6_TCLASS		67
 | |
| 
 | |
| /*
 | |
|  * Netfilter (2)
 | |
|  *
 | |
|  * Following socket options are used in ip6_tables;
 | |
|  * see include/linux/netfilter_ipv6/ip6_tables.h.
 | |
|  *
 | |
|  * IP6T_SO_GET_REVISION_MATCH	68
 | |
|  * IP6T_SO_GET_REVISION_TARGET	69
 | |
|  * IP6T_SO_ORIGINAL_DST		80
 | |
|  */
 | |
| 
 | |
| /* RFC5014: Source address selection */
 | |
| #define IPV6_ADDR_PREFERENCES	72
 | |
| 
 | |
| #define IPV6_PREFER_SRC_TMP		0x0001
 | |
| #define IPV6_PREFER_SRC_PUBLIC		0x0002
 | |
| #define IPV6_PREFER_SRC_PUBTMP_DEFAULT	0x0100
 | |
| #define IPV6_PREFER_SRC_COA		0x0004
 | |
| #define IPV6_PREFER_SRC_HOME		0x0400
 | |
| #define IPV6_PREFER_SRC_CGA		0x0008
 | |
| #define IPV6_PREFER_SRC_NONCGA		0x0800
 | |
| 
 | |
| /* RFC5082: Generalized Ttl Security Mechanism */
 | |
| #define IPV6_MINHOPCOUNT		73
 | |
| 
 | |
| #define IPV6_ORIGDSTADDR        74
 | |
| #define IPV6_RECVORIGDSTADDR    IPV6_ORIGDSTADDR
 | |
| #define IPV6_TRANSPARENT        75
 | |
| #define IPV6_UNICAST_IF         76
 | |
| 
 | |
| /*
 | |
|  * Multicast Routing:
 | |
|  * see include/uapi/linux/mroute6.h.
 | |
|  *
 | |
|  * MRT6_BASE			200
 | |
|  * ...
 | |
|  * MRT6_MAX
 | |
|  */
 | |
| #endif /* _UAPI_LINUX_IN6_H */
 |