xref: /aosp_15_r20/external/iproute2/include/uapi/linux/libc-compat.h (revision de1e4e894b0c224df933550f0afdecc354b238c4)
1*de1e4e89SAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2*de1e4e89SAndroid Build Coastguard Worker /*
3*de1e4e89SAndroid Build Coastguard Worker  * Compatibility interface for userspace libc header coordination:
4*de1e4e89SAndroid Build Coastguard Worker  *
5*de1e4e89SAndroid Build Coastguard Worker  * Define compatibility macros that are used to control the inclusion or
6*de1e4e89SAndroid Build Coastguard Worker  * exclusion of UAPI structures and definitions in coordination with another
7*de1e4e89SAndroid Build Coastguard Worker  * userspace C library.
8*de1e4e89SAndroid Build Coastguard Worker  *
9*de1e4e89SAndroid Build Coastguard Worker  * This header is intended to solve the problem of UAPI definitions that
10*de1e4e89SAndroid Build Coastguard Worker  * conflict with userspace definitions. If a UAPI header has such conflicting
11*de1e4e89SAndroid Build Coastguard Worker  * definitions then the solution is as follows:
12*de1e4e89SAndroid Build Coastguard Worker  *
13*de1e4e89SAndroid Build Coastguard Worker  * * Synchronize the UAPI header and the libc headers so either one can be
14*de1e4e89SAndroid Build Coastguard Worker  *   used and such that the ABI is preserved. If this is not possible then
15*de1e4e89SAndroid Build Coastguard Worker  *   no simple compatibility interface exists (you need to write translating
16*de1e4e89SAndroid Build Coastguard Worker  *   wrappers and rename things) and you can't use this interface.
17*de1e4e89SAndroid Build Coastguard Worker  *
18*de1e4e89SAndroid Build Coastguard Worker  * Then follow this process:
19*de1e4e89SAndroid Build Coastguard Worker  *
20*de1e4e89SAndroid Build Coastguard Worker  * (a) Include libc-compat.h in the UAPI header.
21*de1e4e89SAndroid Build Coastguard Worker  *      e.g. #include <linux/libc-compat.h>
22*de1e4e89SAndroid Build Coastguard Worker  *     This include must be as early as possible.
23*de1e4e89SAndroid Build Coastguard Worker  *
24*de1e4e89SAndroid Build Coastguard Worker  * (b) In libc-compat.h add enough code to detect that the comflicting
25*de1e4e89SAndroid Build Coastguard Worker  *     userspace libc header has been included first.
26*de1e4e89SAndroid Build Coastguard Worker  *
27*de1e4e89SAndroid Build Coastguard Worker  * (c) If the userspace libc header has been included first define a set of
28*de1e4e89SAndroid Build Coastguard Worker  *     guard macros of the form __UAPI_DEF_FOO and set their values to 1, else
29*de1e4e89SAndroid Build Coastguard Worker  *     set their values to 0.
30*de1e4e89SAndroid Build Coastguard Worker  *
31*de1e4e89SAndroid Build Coastguard Worker  * (d) Back in the UAPI header with the conflicting definitions, guard the
32*de1e4e89SAndroid Build Coastguard Worker  *     definitions with:
33*de1e4e89SAndroid Build Coastguard Worker  *     #if __UAPI_DEF_FOO
34*de1e4e89SAndroid Build Coastguard Worker  *       ...
35*de1e4e89SAndroid Build Coastguard Worker  *     #endif
36*de1e4e89SAndroid Build Coastguard Worker  *
37*de1e4e89SAndroid Build Coastguard Worker  * This fixes the situation where the linux headers are included *after* the
38*de1e4e89SAndroid Build Coastguard Worker  * libc headers. To fix the problem with the inclusion in the other order the
39*de1e4e89SAndroid Build Coastguard Worker  * userspace libc headers must be fixed like this:
40*de1e4e89SAndroid Build Coastguard Worker  *
41*de1e4e89SAndroid Build Coastguard Worker  * * For all definitions that conflict with kernel definitions wrap those
42*de1e4e89SAndroid Build Coastguard Worker  *   defines in the following:
43*de1e4e89SAndroid Build Coastguard Worker  *   #if !__UAPI_DEF_FOO
44*de1e4e89SAndroid Build Coastguard Worker  *     ...
45*de1e4e89SAndroid Build Coastguard Worker  *   #endif
46*de1e4e89SAndroid Build Coastguard Worker  *
47*de1e4e89SAndroid Build Coastguard Worker  * This prevents the redefinition of a construct already defined by the kernel.
48*de1e4e89SAndroid Build Coastguard Worker  */
49*de1e4e89SAndroid Build Coastguard Worker #ifndef _LIBC_COMPAT_H
50*de1e4e89SAndroid Build Coastguard Worker #define _LIBC_COMPAT_H
51*de1e4e89SAndroid Build Coastguard Worker 
52*de1e4e89SAndroid Build Coastguard Worker /* We have included glibc headers... */
53*de1e4e89SAndroid Build Coastguard Worker #if defined(__GLIBC__)
54*de1e4e89SAndroid Build Coastguard Worker 
55*de1e4e89SAndroid Build Coastguard Worker /* Coordinate with glibc net/if.h header. */
56*de1e4e89SAndroid Build Coastguard Worker #if defined(_NET_IF_H) && defined(__USE_MISC)
57*de1e4e89SAndroid Build Coastguard Worker 
58*de1e4e89SAndroid Build Coastguard Worker /* GLIBC headers included first so don't define anything
59*de1e4e89SAndroid Build Coastguard Worker  * that would already be defined. */
60*de1e4e89SAndroid Build Coastguard Worker 
61*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFCONF 0
62*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFMAP 0
63*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFNAMSIZ 0
64*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFREQ 0
65*de1e4e89SAndroid Build Coastguard Worker /* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */
66*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_NET_DEVICE_FLAGS 0
67*de1e4e89SAndroid Build Coastguard Worker /* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */
68*de1e4e89SAndroid Build Coastguard Worker #ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO
69*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1
70*de1e4e89SAndroid Build Coastguard Worker #endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */
71*de1e4e89SAndroid Build Coastguard Worker 
72*de1e4e89SAndroid Build Coastguard Worker #else /* _NET_IF_H */
73*de1e4e89SAndroid Build Coastguard Worker 
74*de1e4e89SAndroid Build Coastguard Worker /* Linux headers included first, and we must define everything
75*de1e4e89SAndroid Build Coastguard Worker  * we need. The expectation is that glibc will check the
76*de1e4e89SAndroid Build Coastguard Worker  * __UAPI_DEF_* defines and adjust appropriately. */
77*de1e4e89SAndroid Build Coastguard Worker 
78*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFCONF 1
79*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFMAP 1
80*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFNAMSIZ 1
81*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFREQ 1
82*de1e4e89SAndroid Build Coastguard Worker /* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */
83*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1
84*de1e4e89SAndroid Build Coastguard Worker /* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */
85*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1
86*de1e4e89SAndroid Build Coastguard Worker 
87*de1e4e89SAndroid Build Coastguard Worker #endif /* _NET_IF_H */
88*de1e4e89SAndroid Build Coastguard Worker 
89*de1e4e89SAndroid Build Coastguard Worker /* Coordinate with glibc netinet/in.h header. */
90*de1e4e89SAndroid Build Coastguard Worker #if defined(_NETINET_IN_H)
91*de1e4e89SAndroid Build Coastguard Worker 
92*de1e4e89SAndroid Build Coastguard Worker /* GLIBC headers included first so don't define anything
93*de1e4e89SAndroid Build Coastguard Worker  * that would already be defined. */
94*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_ADDR		0
95*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_IPPROTO		0
96*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_PKTINFO		0
97*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IP_MREQ		0
98*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_SOCKADDR_IN		0
99*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_CLASS		0
100*de1e4e89SAndroid Build Coastguard Worker 
101*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN6_ADDR		0
102*de1e4e89SAndroid Build Coastguard Worker /* The exception is the in6_addr macros which must be defined
103*de1e4e89SAndroid Build Coastguard Worker  * if the glibc code didn't define them. This guard matches
104*de1e4e89SAndroid Build Coastguard Worker  * the guard in glibc/inet/netinet/in.h which defines the
105*de1e4e89SAndroid Build Coastguard Worker  * additional in6_addr macros e.g. s6_addr16, and s6_addr32. */
106*de1e4e89SAndroid Build Coastguard Worker #if defined(__USE_MISC) || defined (__USE_GNU)
107*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN6_ADDR_ALT		0
108*de1e4e89SAndroid Build Coastguard Worker #else
109*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN6_ADDR_ALT		1
110*de1e4e89SAndroid Build Coastguard Worker #endif
111*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_SOCKADDR_IN6		0
112*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPV6_MREQ		0
113*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPPROTO_V6		0
114*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPV6_OPTIONS		0
115*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN6_PKTINFO		0
116*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IP6_MTUINFO		0
117*de1e4e89SAndroid Build Coastguard Worker 
118*de1e4e89SAndroid Build Coastguard Worker #else
119*de1e4e89SAndroid Build Coastguard Worker 
120*de1e4e89SAndroid Build Coastguard Worker /* Linux headers included first, and we must define everything
121*de1e4e89SAndroid Build Coastguard Worker  * we need. The expectation is that glibc will check the
122*de1e4e89SAndroid Build Coastguard Worker  * __UAPI_DEF_* defines and adjust appropriately. */
123*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_ADDR		1
124*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_IPPROTO		1
125*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_PKTINFO		1
126*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IP_MREQ		1
127*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_SOCKADDR_IN		1
128*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_CLASS		1
129*de1e4e89SAndroid Build Coastguard Worker 
130*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN6_ADDR		1
131*de1e4e89SAndroid Build Coastguard Worker /* We unconditionally define the in6_addr macros and glibc must
132*de1e4e89SAndroid Build Coastguard Worker  * coordinate. */
133*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN6_ADDR_ALT		1
134*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_SOCKADDR_IN6		1
135*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPV6_MREQ		1
136*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPPROTO_V6		1
137*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPV6_OPTIONS		1
138*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN6_PKTINFO		1
139*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IP6_MTUINFO		1
140*de1e4e89SAndroid Build Coastguard Worker 
141*de1e4e89SAndroid Build Coastguard Worker #endif /* _NETINET_IN_H */
142*de1e4e89SAndroid Build Coastguard Worker 
143*de1e4e89SAndroid Build Coastguard Worker /* Coordinate with glibc netipx/ipx.h header. */
144*de1e4e89SAndroid Build Coastguard Worker #if defined(__NETIPX_IPX_H)
145*de1e4e89SAndroid Build Coastguard Worker 
146*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_SOCKADDR_IPX			0
147*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_ROUTE_DEFINITION		0
148*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_INTERFACE_DEFINITION	0
149*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_CONFIG_DATA		0
150*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_ROUTE_DEF		0
151*de1e4e89SAndroid Build Coastguard Worker 
152*de1e4e89SAndroid Build Coastguard Worker #else /* defined(__NETIPX_IPX_H) */
153*de1e4e89SAndroid Build Coastguard Worker 
154*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_SOCKADDR_IPX			1
155*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_ROUTE_DEFINITION		1
156*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_INTERFACE_DEFINITION	1
157*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_CONFIG_DATA		1
158*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_ROUTE_DEF		1
159*de1e4e89SAndroid Build Coastguard Worker 
160*de1e4e89SAndroid Build Coastguard Worker #endif /* defined(__NETIPX_IPX_H) */
161*de1e4e89SAndroid Build Coastguard Worker 
162*de1e4e89SAndroid Build Coastguard Worker /* Definitions for xattr.h */
163*de1e4e89SAndroid Build Coastguard Worker #if defined(_SYS_XATTR_H)
164*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_XATTR		0
165*de1e4e89SAndroid Build Coastguard Worker #else
166*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_XATTR		1
167*de1e4e89SAndroid Build Coastguard Worker #endif
168*de1e4e89SAndroid Build Coastguard Worker 
169*de1e4e89SAndroid Build Coastguard Worker /* If we did not see any headers from any supported C libraries,
170*de1e4e89SAndroid Build Coastguard Worker  * or we are being included in the kernel, then define everything
171*de1e4e89SAndroid Build Coastguard Worker  * that we need. */
172*de1e4e89SAndroid Build Coastguard Worker #else /* !defined(__GLIBC__) */
173*de1e4e89SAndroid Build Coastguard Worker 
174*de1e4e89SAndroid Build Coastguard Worker /* Definitions for if.h */
175*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFCONF 1
176*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFMAP 1
177*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFNAMSIZ 1
178*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFREQ 1
179*de1e4e89SAndroid Build Coastguard Worker /* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */
180*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1
181*de1e4e89SAndroid Build Coastguard Worker /* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */
182*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1
183*de1e4e89SAndroid Build Coastguard Worker 
184*de1e4e89SAndroid Build Coastguard Worker /* Definitions for in.h */
185*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_ADDR		1
186*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_IPPROTO		1
187*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_PKTINFO		1
188*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IP_MREQ		1
189*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_SOCKADDR_IN		1
190*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_CLASS		1
191*de1e4e89SAndroid Build Coastguard Worker 
192*de1e4e89SAndroid Build Coastguard Worker /* Definitions for in6.h */
193*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN6_ADDR		1
194*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN6_ADDR_ALT		1
195*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_SOCKADDR_IN6		1
196*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPV6_MREQ		1
197*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPPROTO_V6		1
198*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPV6_OPTIONS		1
199*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN6_PKTINFO		1
200*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IP6_MTUINFO		1
201*de1e4e89SAndroid Build Coastguard Worker 
202*de1e4e89SAndroid Build Coastguard Worker /* Definitions for ipx.h */
203*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_SOCKADDR_IPX			1
204*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_ROUTE_DEFINITION		1
205*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_INTERFACE_DEFINITION	1
206*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_CONFIG_DATA		1
207*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_ROUTE_DEF		1
208*de1e4e89SAndroid Build Coastguard Worker 
209*de1e4e89SAndroid Build Coastguard Worker /* Definitions for xattr.h */
210*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_XATTR		1
211*de1e4e89SAndroid Build Coastguard Worker 
212*de1e4e89SAndroid Build Coastguard Worker #endif /* __GLIBC__ */
213*de1e4e89SAndroid Build Coastguard Worker 
214*de1e4e89SAndroid Build Coastguard Worker #endif /* _LIBC_COMPAT_H */
215