diff options
| author | Louis Scalbert <louis.scalbert@6wind.com> | 2024-01-10 16:24:01 +0100 | 
|---|---|---|
| committer | Louis Scalbert <louis.scalbert@6wind.com> | 2024-04-26 17:11:53 +0200 | 
| commit | 57b9ecf3f96c0e87f3f759c067601731dcfaf5b8 (patch) | |
| tree | 4a0dd0dc0caabbea7db9e0054c64ab9e2bad7c04 /include | |
| parent | 6a7fadaecc5367dcf05694da5dcfc226d5cfec09 (diff) | |
build: include our own copy of if.h and dependencies
Import our a copy of Linux if.h and its dependencies
(compiler_types.h and libc-compat.h) from the above links. In "if.h",
"#include <linux/compiler.h>" has been replaced by
"#include <linux/compiler_types.h>". libc-compat.h is needed to avoid
conflicts with glibc.
Include "linux/if.h" in "zebra.h" when compiling on Linux. De-reference
"net/if.h" in C files.
Note that "net/if.h" is still needed. It is even included in many Linux
kernel files. "linux/if.h" provides additional definitions.
Link: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/include/uapi/linux/if.h?h=v5.5
Link: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/include/uapi/linux/libc-compat.h?h=v5.5
Link: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/include/linux/compiler_types.h?h=v5.5
Link: https://patchwork.ozlabs.org/project/glibc/patch/1461512707-23058-1-git-send-email-mikko.rapeli@iki.fi/
Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/compiler_types.h | 246 | ||||
| -rw-r--r-- | include/linux/if.h | 296 | ||||
| -rw-r--r-- | include/linux/libc-compat.h | 267 | ||||
| -rw-r--r-- | include/subdir.am | 3 | 
4 files changed, 812 insertions, 0 deletions
diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h new file mode 100644 index 0000000000..72393a8c1a --- /dev/null +++ b/include/linux/compiler_types.h @@ -0,0 +1,246 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __LINUX_COMPILER_TYPES_H +#define __LINUX_COMPILER_TYPES_H + +#ifndef __ASSEMBLY__ + +#ifdef __CHECKER__ +# define __user		__attribute__((noderef, address_space(1))) +# define __kernel	__attribute__((address_space(0))) +# define __safe		__attribute__((safe)) +# define __force	__attribute__((force)) +# define __nocast	__attribute__((nocast)) +# define __iomem	__attribute__((noderef, address_space(2))) +# define __must_hold(x)	__attribute__((context(x,1,1))) +# define __acquires(x)	__attribute__((context(x,0,1))) +# define __releases(x)	__attribute__((context(x,1,0))) +# define __acquire(x)	__context__(x,1) +# define __release(x)	__context__(x,-1) +# define __cond_lock(x,c)	((c) ? ({ __acquire(x); 1; }) : 0) +# define __percpu	__attribute__((noderef, address_space(3))) +# define __rcu		__attribute__((noderef, address_space(4))) +# define __private	__attribute__((noderef)) +extern void __chk_user_ptr(const volatile void __user *); +extern void __chk_io_ptr(const volatile void __iomem *); +# define ACCESS_PRIVATE(p, member) (*((typeof((p)->member) __force *) &(p)->member)) +#else /* __CHECKER__ */ +# ifdef STRUCTLEAK_PLUGIN +#  define __user __attribute__((user)) +# else +#  define __user +# endif +# define __kernel +# define __safe +# define __force +# define __nocast +# define __iomem +# define __chk_user_ptr(x) (void)0 +# define __chk_io_ptr(x) (void)0 +# define __builtin_warning(x, y...) (1) +# define __must_hold(x) +# define __acquires(x) +# define __releases(x) +# define __acquire(x) (void)0 +# define __release(x) (void)0 +# define __cond_lock(x,c) (c) +# define __percpu +# define __rcu +# define __private +# define ACCESS_PRIVATE(p, member) ((p)->member) +#endif /* __CHECKER__ */ + +/* Indirect macros required for expanded argument pasting, eg. __LINE__. */ +#define ___PASTE(a,b) a##b +#define __PASTE(a,b) ___PASTE(a,b) + +#ifdef __KERNEL__ + +/* Attributes */ +#include <linux/compiler_attributes.h> + +/* Compiler specific macros. */ +#ifdef __clang__ +#include <linux/compiler-clang.h> +#elif defined(__INTEL_COMPILER) +#include <linux/compiler-intel.h> +#elif defined(__GNUC__) +/* The above compilers also define __GNUC__, so order is important here. */ +#include <linux/compiler-gcc.h> +#else +#error "Unknown compiler" +#endif + +/* + * Some architectures need to provide custom definitions of macros provided + * by linux/compiler-*.h, and can do so using asm/compiler.h. We include that + * conditionally rather than using an asm-generic wrapper in order to avoid + * build failures if any C compilation, which will include this file via an + * -include argument in c_flags, occurs prior to the asm-generic wrappers being + * generated. + */ +#ifdef CONFIG_HAVE_ARCH_COMPILER_H +#include <asm/compiler.h> +#endif + +struct ftrace_branch_data { +	const char *func; +	const char *file; +	unsigned line; +	union { +		struct { +			unsigned long correct; +			unsigned long incorrect; +		}; +		struct { +			unsigned long miss; +			unsigned long hit; +		}; +		unsigned long miss_hit[2]; +	}; +}; + +struct ftrace_likely_data { +	struct ftrace_branch_data	data; +	unsigned long			constant; +}; + +#ifdef CONFIG_ENABLE_MUST_CHECK +#define __must_check		__attribute__((__warn_unused_result__)) +#else +#define __must_check +#endif + +#if defined(CC_USING_HOTPATCH) +#define notrace			__attribute__((hotpatch(0, 0))) +#elif defined(CC_USING_PATCHABLE_FUNCTION_ENTRY) +#define notrace			__attribute__((patchable_function_entry(0, 0))) +#else +#define notrace			__attribute__((__no_instrument_function__)) +#endif + +/* + * it doesn't make sense on ARM (currently the only user of __naked) + * to trace naked functions because then mcount is called without + * stack and frame pointer being set up and there is no chance to + * restore the lr register to the value before mcount was called. + */ +#define __naked			__attribute__((__naked__)) notrace + +#define __compiler_offsetof(a, b)	__builtin_offsetof(a, b) + +/* + * Force always-inline if the user requests it so via the .config. + * Prefer gnu_inline, so that extern inline functions do not emit an + * externally visible function. This makes extern inline behave as per gnu89 + * semantics rather than c99. This prevents multiple symbol definition errors + * of extern inline functions at link time. + * A lot of inline functions can cause havoc with function tracing. + * Do not use __always_inline here, since currently it expands to inline again + * (which would break users of __always_inline). + */ +#if !defined(CONFIG_OPTIMIZE_INLINING) +#define inline inline __attribute__((__always_inline__)) __gnu_inline \ +	__inline_maybe_unused notrace +#else +#define inline inline                                    __gnu_inline \ +	__inline_maybe_unused notrace +#endif + +/* + * gcc provides both __inline__ and __inline as alternate spellings of + * the inline keyword, though the latter is undocumented. New kernel + * code should only use the inline spelling, but some existing code + * uses __inline__. Since we #define inline above, to ensure + * __inline__ has the same semantics, we need this #define. + * + * However, the spelling __inline is strictly reserved for referring + * to the bare keyword. + */ +#define __inline__ inline + +/* + * GCC does not warn about unused static inline functions for -Wunused-function. + * Suppress the warning in clang as well by using __maybe_unused, but enable it + * for W=1 build. This will allow clang to find unused functions. Remove the + * __inline_maybe_unused entirely after fixing most of -Wunused-function warnings. + */ +#ifdef KBUILD_EXTRA_WARN1 +#define __inline_maybe_unused +#else +#define __inline_maybe_unused __maybe_unused +#endif + +/* + * Rather then using noinline to prevent stack consumption, use + * noinline_for_stack instead.  For documentation reasons. + */ +#define noinline_for_stack noinline + +#endif /* __KERNEL__ */ + +#endif /* __ASSEMBLY__ */ + +/* + * The below symbols may be defined for one or more, but not ALL, of the above + * compilers. We don't consider that to be an error, so set them to nothing. + * For example, some of them are for compiler specific plugins. + */ +#ifndef __latent_entropy +# define __latent_entropy +#endif + +#ifndef __randomize_layout +# define __randomize_layout __designated_init +#endif + +#ifndef __no_randomize_layout +# define __no_randomize_layout +#endif + +#ifndef randomized_struct_fields_start +# define randomized_struct_fields_start +# define randomized_struct_fields_end +#endif + +#ifndef asm_volatile_goto +#define asm_volatile_goto(x...) asm goto(x) +#endif + +#ifdef CONFIG_CC_HAS_ASM_INLINE +#define asm_inline asm __inline +#else +#define asm_inline asm +#endif + +#ifndef __no_fgcse +# define __no_fgcse +#endif + +/* Are two types/vars the same type (ignoring qualifiers)? */ +#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) + +/* Is this type a native word size -- useful for atomic operations */ +#define __native_word(t) \ +	(sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || \ +	 sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long)) + +/* Helpers for emitting diagnostics in pragmas. */ +#ifndef __diag +#define __diag(string) +#endif + +#ifndef __diag_GCC +#define __diag_GCC(version, severity, string) +#endif + +#define __diag_push()	__diag(push) +#define __diag_pop()	__diag(pop) + +#define __diag_ignore(compiler, version, option, comment) \ +	__diag_ ## compiler(version, ignore, option) +#define __diag_warn(compiler, version, option, comment) \ +	__diag_ ## compiler(version, warn, option) +#define __diag_error(compiler, version, option, comment) \ +	__diag_ ## compiler(version, error, option) + +#endif /* __LINUX_COMPILER_TYPES_H */ diff --git a/include/linux/if.h b/include/linux/if.h new file mode 100644 index 0000000000..a8ccf6d171 --- /dev/null +++ b/include/linux/if.h @@ -0,0 +1,296 @@ +/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ +/* + * INET		An implementation of the TCP/IP protocol suite for the LINUX + *		operating system.  INET is implemented using the  BSD Socket + *		interface as the means of communication with the user level. + * + *		Global definitions for the INET interface module. + * + * Version:	@(#)if.h	1.0.2	04/18/93 + * + * Authors:	Original taken from Berkeley UNIX 4.3, (c) UCB 1982-1988 + *		Ross Biro + *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> + * + *		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 _LINUX_IF_H +#define _LINUX_IF_H + +#include <linux/libc-compat.h>          /* for compatibility with glibc */ +#include <linux/types.h>		/* for "__kernel_caddr_t" et al	*/ +#include <linux/socket.h>		/* for "struct sockaddr" et al	*/ +#include <linux/compiler_types.h>		/* for "__user" et al           */ + +#ifndef __KERNEL__ +#include <sys/socket.h>			/* for struct sockaddr.		*/ +#endif + +#if __UAPI_DEF_IF_IFNAMSIZ +#define	IFNAMSIZ	16 +#endif /* __UAPI_DEF_IF_IFNAMSIZ */ +#define	IFALIASZ	256 +#define	ALTIFNAMSIZ	128 +#include <linux/hdlc/ioctl.h> + +/* For glibc compatibility. An empty enum does not compile. */ +#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 || \ +    __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0 +/** + * enum net_device_flags - &struct net_device flags + * + * These are the &struct net_device flags, they can be set by drivers, the + * kernel and some can be triggered by userspace. Userspace can query and + * set these flags using userspace utilities but there is also a sysfs + * entry available for all dev flags which can be queried and set. These flags + * are shared for all types of net_devices. The sysfs entries are available + * via /sys/class/net/<dev>/flags. Flags which can be toggled through sysfs + * are annotated below, note that only a few flags can be toggled and some + * other flags are always preserved from the original net_device flags + * even if you try to set them via sysfs. Flags which are always preserved + * are kept under the flag grouping @IFF_VOLATILE. Flags which are volatile + * are annotated below as such. + * + * You should have a pretty good reason to be extending these flags. + * + * @IFF_UP: interface is up. Can be toggled through sysfs. + * @IFF_BROADCAST: broadcast address valid. Volatile. + * @IFF_DEBUG: turn on debugging. Can be toggled through sysfs. + * @IFF_LOOPBACK: is a loopback net. Volatile. + * @IFF_POINTOPOINT: interface is has p-p link. Volatile. + * @IFF_NOTRAILERS: avoid use of trailers. Can be toggled through sysfs. + *	Volatile. + * @IFF_RUNNING: interface RFC2863 OPER_UP. Volatile. + * @IFF_NOARP: no ARP protocol. Can be toggled through sysfs. Volatile. + * @IFF_PROMISC: receive all packets. Can be toggled through sysfs. + * @IFF_ALLMULTI: receive all multicast packets. Can be toggled through + *	sysfs. + * @IFF_MASTER: master of a load balancer. Volatile. + * @IFF_SLAVE: slave of a load balancer. Volatile. + * @IFF_MULTICAST: Supports multicast. Can be toggled through sysfs. + * @IFF_PORTSEL: can set media type. Can be toggled through sysfs. + * @IFF_AUTOMEDIA: auto media select active. Can be toggled through sysfs. + * @IFF_DYNAMIC: dialup device with changing addresses. Can be toggled + *	through sysfs. + * @IFF_LOWER_UP: driver signals L1 up. Volatile. + * @IFF_DORMANT: driver signals dormant. Volatile. + * @IFF_ECHO: echo sent packets. Volatile. + */ +enum net_device_flags { +/* for compatibility with glibc net/if.h */ +#if __UAPI_DEF_IF_NET_DEVICE_FLAGS +	IFF_UP				= 1<<0,  /* sysfs */ +	IFF_BROADCAST			= 1<<1,  /* volatile */ +	IFF_DEBUG			= 1<<2,  /* sysfs */ +	IFF_LOOPBACK			= 1<<3,  /* volatile */ +	IFF_POINTOPOINT			= 1<<4,  /* volatile */ +	IFF_NOTRAILERS			= 1<<5,  /* sysfs */ +	IFF_RUNNING			= 1<<6,  /* volatile */ +	IFF_NOARP			= 1<<7,  /* sysfs */ +	IFF_PROMISC			= 1<<8,  /* sysfs */ +	IFF_ALLMULTI			= 1<<9,  /* sysfs */ +	IFF_MASTER			= 1<<10, /* volatile */ +	IFF_SLAVE			= 1<<11, /* volatile */ +	IFF_MULTICAST			= 1<<12, /* sysfs */ +	IFF_PORTSEL			= 1<<13, /* sysfs */ +	IFF_AUTOMEDIA			= 1<<14, /* sysfs */ +	IFF_DYNAMIC			= 1<<15, /* sysfs */ +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS */ +#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO +	IFF_LOWER_UP			= 1<<16, /* volatile */ +	IFF_DORMANT			= 1<<17, /* volatile */ +	IFF_ECHO			= 1<<18, /* volatile */ +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */ +}; +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 || __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0 */ + +/* for compatibility with glibc net/if.h */ +#if __UAPI_DEF_IF_NET_DEVICE_FLAGS +#define IFF_UP				IFF_UP +#define IFF_BROADCAST			IFF_BROADCAST +#define IFF_DEBUG			IFF_DEBUG +#define IFF_LOOPBACK			IFF_LOOPBACK +#define IFF_POINTOPOINT			IFF_POINTOPOINT +#define IFF_NOTRAILERS			IFF_NOTRAILERS +#define IFF_RUNNING			IFF_RUNNING +#define IFF_NOARP			IFF_NOARP +#define IFF_PROMISC			IFF_PROMISC +#define IFF_ALLMULTI			IFF_ALLMULTI +#define IFF_MASTER			IFF_MASTER +#define IFF_SLAVE			IFF_SLAVE +#define IFF_MULTICAST			IFF_MULTICAST +#define IFF_PORTSEL			IFF_PORTSEL +#define IFF_AUTOMEDIA			IFF_AUTOMEDIA +#define IFF_DYNAMIC			IFF_DYNAMIC +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS */ + +#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO +#define IFF_LOWER_UP			IFF_LOWER_UP +#define IFF_DORMANT			IFF_DORMANT +#define IFF_ECHO			IFF_ECHO +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */ + +#define IFF_VOLATILE	(IFF_LOOPBACK|IFF_POINTOPOINT|IFF_BROADCAST|IFF_ECHO|\ +		IFF_MASTER|IFF_SLAVE|IFF_RUNNING|IFF_LOWER_UP|IFF_DORMANT) + +#define IF_GET_IFACE	0x0001		/* for querying only */ +#define IF_GET_PROTO	0x0002 + +/* For definitions see hdlc.h */ +#define IF_IFACE_V35	0x1000		/* V.35 serial interface	*/ +#define IF_IFACE_V24	0x1001		/* V.24 serial interface	*/ +#define IF_IFACE_X21	0x1002		/* X.21 serial interface	*/ +#define IF_IFACE_T1	0x1003		/* T1 telco serial interface	*/ +#define IF_IFACE_E1	0x1004		/* E1 telco serial interface	*/ +#define IF_IFACE_SYNC_SERIAL 0x1005	/* can't be set by software	*/ +#define IF_IFACE_X21D   0x1006          /* X.21 Dual Clocking (FarSite) */ + +/* For definitions see hdlc.h */ +#define IF_PROTO_HDLC	0x2000		/* raw HDLC protocol		*/ +#define IF_PROTO_PPP	0x2001		/* PPP protocol			*/ +#define IF_PROTO_CISCO	0x2002		/* Cisco HDLC protocol		*/ +#define IF_PROTO_FR	0x2003		/* Frame Relay protocol		*/ +#define IF_PROTO_FR_ADD_PVC 0x2004	/*    Create FR PVC		*/ +#define IF_PROTO_FR_DEL_PVC 0x2005	/*    Delete FR PVC		*/ +#define IF_PROTO_X25	0x2006		/* X.25				*/ +#define IF_PROTO_HDLC_ETH 0x2007	/* raw HDLC, Ethernet emulation	*/ +#define IF_PROTO_FR_ADD_ETH_PVC 0x2008	/*  Create FR Ethernet-bridged PVC */ +#define IF_PROTO_FR_DEL_ETH_PVC 0x2009	/*  Delete FR Ethernet-bridged PVC */ +#define IF_PROTO_FR_PVC	0x200A		/* for reading PVC status	*/ +#define IF_PROTO_FR_ETH_PVC 0x200B +#define IF_PROTO_RAW    0x200C          /* RAW Socket                   */ + +/* RFC 2863 operational status */ +enum { +	IF_OPER_UNKNOWN, +	IF_OPER_NOTPRESENT, +	IF_OPER_DOWN, +	IF_OPER_LOWERLAYERDOWN, +	IF_OPER_TESTING, +	IF_OPER_DORMANT, +	IF_OPER_UP, +}; + +/* link modes */ +enum { +	IF_LINK_MODE_DEFAULT, +	IF_LINK_MODE_DORMANT,	/* limit upward transition to dormant */ +}; + +/* + *	Device mapping structure. I'd just gone off and designed a  + *	beautiful scheme using only loadable modules with arguments + *	for driver options and along come the PCMCIA people 8) + * + *	Ah well. The get() side of this is good for WDSETUP, and it'll + *	be handy for debugging things. The set side is fine for now and + *	being very small might be worth keeping for clean configuration. + */ + +/* for compatibility with glibc net/if.h */ +#if __UAPI_DEF_IF_IFMAP +struct ifmap { +	unsigned long mem_start; +	unsigned long mem_end; +	unsigned short base_addr;  +	unsigned char irq; +	unsigned char dma; +	unsigned char port; +	/* 3 bytes spare */ +}; +#endif /* __UAPI_DEF_IF_IFMAP */ + +struct if_settings { +	unsigned int type;	/* Type of physical device or protocol */ +	unsigned int size;	/* Size of the data allocated by the caller */ +	union { +		/* {atm/eth/dsl}_settings anyone ? */ +		raw_hdlc_proto		__user *raw_hdlc; +		cisco_proto		__user *cisco; +		fr_proto		__user *fr; +		fr_proto_pvc		__user *fr_pvc; +		fr_proto_pvc_info	__user *fr_pvc_info; + +		/* interface settings */ +		sync_serial_settings	__user *sync; +		te1_settings		__user *te1; +	} ifs_ifsu; +}; + +/* + * Interface request structure used for socket + * ioctl's.  All interface ioctl's must have parameter + * definitions which begin with ifr_name.  The + * remainder may be interface specific. + */ + +/* for compatibility with glibc net/if.h */ +#if __UAPI_DEF_IF_IFREQ +struct ifreq { +#define IFHWADDRLEN	6 +	union +	{ +		char	ifrn_name[IFNAMSIZ];		/* if name, e.g. "en0" */ +	} ifr_ifrn; +	 +	union { +		struct	sockaddr ifru_addr; +		struct	sockaddr ifru_dstaddr; +		struct	sockaddr ifru_broadaddr; +		struct	sockaddr ifru_netmask; +		struct  sockaddr ifru_hwaddr; +		short	ifru_flags; +		int	ifru_ivalue; +		int	ifru_mtu; +		struct  ifmap ifru_map; +		char	ifru_slave[IFNAMSIZ];	/* Just fits the size */ +		char	ifru_newname[IFNAMSIZ]; +		void __user *	ifru_data; +		struct	if_settings ifru_settings; +	} ifr_ifru; +}; +#endif /* __UAPI_DEF_IF_IFREQ */ + +#define ifr_name	ifr_ifrn.ifrn_name	/* interface name 	*/ +#define ifr_hwaddr	ifr_ifru.ifru_hwaddr	/* MAC address 		*/ +#define	ifr_addr	ifr_ifru.ifru_addr	/* address		*/ +#define	ifr_dstaddr	ifr_ifru.ifru_dstaddr	/* other end of p-p lnk	*/ +#define	ifr_broadaddr	ifr_ifru.ifru_broadaddr	/* broadcast address	*/ +#define	ifr_netmask	ifr_ifru.ifru_netmask	/* interface net mask	*/ +#define	ifr_flags	ifr_ifru.ifru_flags	/* flags		*/ +#define	ifr_metric	ifr_ifru.ifru_ivalue	/* metric		*/ +#define	ifr_mtu		ifr_ifru.ifru_mtu	/* mtu			*/ +#define ifr_map		ifr_ifru.ifru_map	/* device map		*/ +#define ifr_slave	ifr_ifru.ifru_slave	/* slave device		*/ +#define	ifr_data	ifr_ifru.ifru_data	/* for use by interface	*/ +#define ifr_ifindex	ifr_ifru.ifru_ivalue	/* interface index	*/ +#define ifr_bandwidth	ifr_ifru.ifru_ivalue    /* link bandwidth	*/ +#define ifr_qlen	ifr_ifru.ifru_ivalue	/* Queue length 	*/ +#define ifr_newname	ifr_ifru.ifru_newname	/* New name		*/ +#define ifr_settings	ifr_ifru.ifru_settings	/* Device/proto settings*/ + +/* + * Structure used in SIOCGIFCONF request. + * Used to retrieve interface configuration + * for machine (useful for programs which + * must know all networks accessible). + */ + +/* for compatibility with glibc net/if.h */ +#if __UAPI_DEF_IF_IFCONF +struct ifconf  { +	int	ifc_len;			/* size of buffer	*/ +	union { +		char __user *ifcu_buf; +		struct ifreq __user *ifcu_req; +	} ifc_ifcu; +}; +#endif /* __UAPI_DEF_IF_IFCONF */ + +#define	ifc_buf	ifc_ifcu.ifcu_buf		/* buffer address	*/ +#define	ifc_req	ifc_ifcu.ifcu_req		/* array of structures	*/ + +#endif /* _LINUX_IF_H */ diff --git a/include/linux/libc-compat.h b/include/linux/libc-compat.h new file mode 100644 index 0000000000..8254c937c9 --- /dev/null +++ b/include/linux/libc-compat.h @@ -0,0 +1,267 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* + * Compatibility interface for userspace libc header coordination: + * + * Define compatibility macros that are used to control the inclusion or + * exclusion of UAPI structures and definitions in coordination with another + * userspace C library. + * + * This header is intended to solve the problem of UAPI definitions that + * conflict with userspace definitions. If a UAPI header has such conflicting + * definitions then the solution is as follows: + * + * * Synchronize the UAPI header and the libc headers so either one can be + *   used and such that the ABI is preserved. If this is not possible then + *   no simple compatibility interface exists (you need to write translating + *   wrappers and rename things) and you can't use this interface. + * + * Then follow this process: + * + * (a) Include libc-compat.h in the UAPI header. + *      e.g. #include <linux/libc-compat.h> + *     This include must be as early as possible. + * + * (b) In libc-compat.h add enough code to detect that the comflicting + *     userspace libc header has been included first. + * + * (c) If the userspace libc header has been included first define a set of + *     guard macros of the form __UAPI_DEF_FOO and set their values to 1, else + *     set their values to 0. + * + * (d) Back in the UAPI header with the conflicting definitions, guard the + *     definitions with: + *     #if __UAPI_DEF_FOO + *       ... + *     #endif + * + * This fixes the situation where the linux headers are included *after* the + * libc headers. To fix the problem with the inclusion in the other order the + * userspace libc headers must be fixed like this: + * + * * For all definitions that conflict with kernel definitions wrap those + *   defines in the following: + *   #if !__UAPI_DEF_FOO + *     ... + *   #endif + * + * This prevents the redefinition of a construct already defined by the kernel. + */ +#ifndef _UAPI_LIBC_COMPAT_H +#define _UAPI_LIBC_COMPAT_H + +/* We have included glibc headers... */ +#if defined(__GLIBC__) + +/* Coordinate with glibc net/if.h header. */ +#if defined(_NET_IF_H) && defined(__USE_MISC) + +/* GLIBC headers included first so don't define anything + * that would already be defined. */ + +#define __UAPI_DEF_IF_IFCONF 0 +#define __UAPI_DEF_IF_IFMAP 0 +#define __UAPI_DEF_IF_IFNAMSIZ 0 +#define __UAPI_DEF_IF_IFREQ 0 +/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 0 +/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ +#ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */ + +#else /* _NET_IF_H */ + +/* Linux headers included first, and we must define everything + * we need. The expectation is that glibc will check the + * __UAPI_DEF_* defines and adjust appropriately. */ + +#define __UAPI_DEF_IF_IFCONF 1 +#define __UAPI_DEF_IF_IFMAP 1 +#define __UAPI_DEF_IF_IFNAMSIZ 1 +#define __UAPI_DEF_IF_IFREQ 1 +/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1 +/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 + +#endif /* _NET_IF_H */ + +/* Coordinate with glibc netinet/in.h header. */ +#if defined(_NETINET_IN_H) + +/* GLIBC headers included first so don't define anything + * that would already be defined. */ +#define __UAPI_DEF_IN_ADDR		0 +#define __UAPI_DEF_IN_IPPROTO		0 +#define __UAPI_DEF_IN_PKTINFO		0 +#define __UAPI_DEF_IP_MREQ		0 +#define __UAPI_DEF_SOCKADDR_IN		0 +#define __UAPI_DEF_IN_CLASS		0 + +#define __UAPI_DEF_IN6_ADDR		0 +/* The exception is the in6_addr macros which must be defined + * if the glibc code didn't define them. This guard matches + * the guard in glibc/inet/netinet/in.h which defines the + * additional in6_addr macros e.g. s6_addr16, and s6_addr32. */ +#if defined(__USE_MISC) || defined (__USE_GNU) +#define __UAPI_DEF_IN6_ADDR_ALT		0 +#else +#define __UAPI_DEF_IN6_ADDR_ALT		1 +#endif +#define __UAPI_DEF_SOCKADDR_IN6		0 +#define __UAPI_DEF_IPV6_MREQ		0 +#define __UAPI_DEF_IPPROTO_V6		0 +#define __UAPI_DEF_IPV6_OPTIONS		0 +#define __UAPI_DEF_IN6_PKTINFO		0 +#define __UAPI_DEF_IP6_MTUINFO		0 + +#else + +/* Linux headers included first, and we must define everything + * we need. The expectation is that glibc will check the + * __UAPI_DEF_* defines and adjust appropriately. */ +#define __UAPI_DEF_IN_ADDR		1 +#define __UAPI_DEF_IN_IPPROTO		1 +#define __UAPI_DEF_IN_PKTINFO		1 +#define __UAPI_DEF_IP_MREQ		1 +#define __UAPI_DEF_SOCKADDR_IN		1 +#define __UAPI_DEF_IN_CLASS		1 + +#define __UAPI_DEF_IN6_ADDR		1 +/* We unconditionally define the in6_addr macros and glibc must + * coordinate. */ +#define __UAPI_DEF_IN6_ADDR_ALT		1 +#define __UAPI_DEF_SOCKADDR_IN6		1 +#define __UAPI_DEF_IPV6_MREQ		1 +#define __UAPI_DEF_IPPROTO_V6		1 +#define __UAPI_DEF_IPV6_OPTIONS		1 +#define __UAPI_DEF_IN6_PKTINFO		1 +#define __UAPI_DEF_IP6_MTUINFO		1 + +#endif /* _NETINET_IN_H */ + +/* Coordinate with glibc netipx/ipx.h header. */ +#if defined(__NETIPX_IPX_H) + +#define __UAPI_DEF_SOCKADDR_IPX			0 +#define __UAPI_DEF_IPX_ROUTE_DEFINITION		0 +#define __UAPI_DEF_IPX_INTERFACE_DEFINITION	0 +#define __UAPI_DEF_IPX_CONFIG_DATA		0 +#define __UAPI_DEF_IPX_ROUTE_DEF		0 + +#else /* defined(__NETIPX_IPX_H) */ + +#define __UAPI_DEF_SOCKADDR_IPX			1 +#define __UAPI_DEF_IPX_ROUTE_DEFINITION		1 +#define __UAPI_DEF_IPX_INTERFACE_DEFINITION	1 +#define __UAPI_DEF_IPX_CONFIG_DATA		1 +#define __UAPI_DEF_IPX_ROUTE_DEF		1 + +#endif /* defined(__NETIPX_IPX_H) */ + +/* Definitions for xattr.h */ +#if defined(_SYS_XATTR_H) +#define __UAPI_DEF_XATTR		0 +#else +#define __UAPI_DEF_XATTR		1 +#endif + +/* If we did not see any headers from any supported C libraries, + * or we are being included in the kernel, then define everything + * that we need. Check for previous __UAPI_* definitions to give + * unsupported C libraries a way to opt out of any kernel definition. */ +#else /* !defined(__GLIBC__) */ + +/* Definitions for if.h */ +#ifndef __UAPI_DEF_IF_IFCONF +#define __UAPI_DEF_IF_IFCONF 1 +#endif +#ifndef __UAPI_DEF_IF_IFMAP +#define __UAPI_DEF_IF_IFMAP 1 +#endif +#ifndef __UAPI_DEF_IF_IFNAMSIZ +#define __UAPI_DEF_IF_IFNAMSIZ 1 +#endif +#ifndef __UAPI_DEF_IF_IFREQ +#define __UAPI_DEF_IF_IFREQ 1 +#endif +/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ +#ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1 +#endif +/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ +#ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 +#endif + +/* Definitions for in.h */ +#ifndef __UAPI_DEF_IN_ADDR +#define __UAPI_DEF_IN_ADDR		1 +#endif +#ifndef __UAPI_DEF_IN_IPPROTO +#define __UAPI_DEF_IN_IPPROTO		1 +#endif +#ifndef __UAPI_DEF_IN_PKTINFO +#define __UAPI_DEF_IN_PKTINFO		1 +#endif +#ifndef __UAPI_DEF_IP_MREQ +#define __UAPI_DEF_IP_MREQ		1 +#endif +#ifndef __UAPI_DEF_SOCKADDR_IN +#define __UAPI_DEF_SOCKADDR_IN		1 +#endif +#ifndef __UAPI_DEF_IN_CLASS +#define __UAPI_DEF_IN_CLASS		1 +#endif + +/* Definitions for in6.h */ +#ifndef __UAPI_DEF_IN6_ADDR +#define __UAPI_DEF_IN6_ADDR		1 +#endif +#ifndef __UAPI_DEF_IN6_ADDR_ALT +#define __UAPI_DEF_IN6_ADDR_ALT		1 +#endif +#ifndef __UAPI_DEF_SOCKADDR_IN6 +#define __UAPI_DEF_SOCKADDR_IN6		1 +#endif +#ifndef __UAPI_DEF_IPV6_MREQ +#define __UAPI_DEF_IPV6_MREQ		1 +#endif +#ifndef __UAPI_DEF_IPPROTO_V6 +#define __UAPI_DEF_IPPROTO_V6		1 +#endif +#ifndef __UAPI_DEF_IPV6_OPTIONS +#define __UAPI_DEF_IPV6_OPTIONS		1 +#endif +#ifndef __UAPI_DEF_IN6_PKTINFO +#define __UAPI_DEF_IN6_PKTINFO		1 +#endif +#ifndef __UAPI_DEF_IP6_MTUINFO +#define __UAPI_DEF_IP6_MTUINFO		1 +#endif + +/* Definitions for ipx.h */ +#ifndef __UAPI_DEF_SOCKADDR_IPX +#define __UAPI_DEF_SOCKADDR_IPX			1 +#endif +#ifndef __UAPI_DEF_IPX_ROUTE_DEFINITION +#define __UAPI_DEF_IPX_ROUTE_DEFINITION		1 +#endif +#ifndef __UAPI_DEF_IPX_INTERFACE_DEFINITION +#define __UAPI_DEF_IPX_INTERFACE_DEFINITION	1 +#endif +#ifndef __UAPI_DEF_IPX_CONFIG_DATA +#define __UAPI_DEF_IPX_CONFIG_DATA		1 +#endif +#ifndef __UAPI_DEF_IPX_ROUTE_DEF +#define __UAPI_DEF_IPX_ROUTE_DEF		1 +#endif + +/* Definitions for xattr.h */ +#ifndef __UAPI_DEF_XATTR +#define __UAPI_DEF_XATTR		1 +#endif + +#endif /* __GLIBC__ */ + +#endif /* _UAPI_LIBC_COMPAT_H */ diff --git a/include/subdir.am b/include/subdir.am index 6f07b6bf10..bcf3ef7b9b 100644 --- a/include/subdir.am +++ b/include/subdir.am @@ -1,4 +1,7 @@  noinst_HEADERS += \ +	include/linux/compiler_types.h \ +	include/linux/libc-compat.h \ +	include/linux/if.h \  	include/linux/if_addr.h \  	include/linux/if_bridge.h \  	include/linux/if_link.h \  | 
