summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHauke Mehrtens <hauke@hauke-m.de>2017-06-03 12:59:55 +0200
committerHauke Mehrtens <hauke@hauke-m.de>2018-01-20 22:11:33 +0100
commit4336efe14b61e47177a2d0863f8391c48cf4a9f5 (patch)
tree0135be3408bc34b45dba4bde3679e28bbfceee41
parente3c43ade0bae9491aeea50fa361e846bb5002dc0 (diff)
downloadopenwrt-4336efe14b61e47177a2d0863f8391c48cf4a9f5.tar.gz
openwrt-4336efe14b61e47177a2d0863f8391c48cf4a9f5.tar.bz2
openwrt-4336efe14b61e47177a2d0863f8391c48cf4a9f5.zip
kernel: use upstream patches for musl
This replaces the current patches used to make the kernel headers compatible with musl with the version which was accepted upstream. This is included in upstream kernel 4.15. This was compile tested with iproute2 build on all supported kernel versions with musl and one one with glibc. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
-rw-r--r--package/network/utils/iproute2/patches/270-uapi-libc-compat-add-fallback-for-unsupported-libcs.patch147
-rw-r--r--package/network/utils/iproute2/patches/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch107
-rw-r--r--package/network/utils/iproute2/patches/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch46
-rw-r--r--target/linux/generic/backport-4.14/270-uapi-libc-compat-add-fallback-for-unsupported-libcs.patch147
-rw-r--r--target/linux/generic/backport-4.14/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch (renamed from target/linux/generic/pending-4.14/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch)44
-rw-r--r--target/linux/generic/backport-4.9/270-uapi-libc-compat-add-fallback-for-unsupported-libcs.patch147
-rw-r--r--target/linux/generic/backport-4.9/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch (renamed from target/linux/generic/pending-4.9/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch)44
-rw-r--r--target/linux/generic/pending-3.18/002-phy_drivers_backport.patch16
-rw-r--r--target/linux/generic/pending-3.18/270-uapi-kernel.h-glibc-specific-inclusion-of-sysinfo.h.patch34
-rw-r--r--target/linux/generic/pending-3.18/270-uapi-libc-compat-add-fallback-for-unsupported-libcs.patch102
-rw-r--r--target/linux/generic/pending-3.18/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch81
-rw-r--r--target/linux/generic/pending-3.18/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch48
-rw-r--r--target/linux/generic/pending-4.14/270-uapi-kernel.h-glibc-specific-inclusion-of-sysinfo.h.patch32
-rw-r--r--target/linux/generic/pending-4.14/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch105
-rw-r--r--target/linux/generic/pending-4.4/270-uapi-kernel.h-glibc-specific-inclusion-of-sysinfo.h.patch34
-rw-r--r--target/linux/generic/pending-4.4/270-uapi-libc-compat-add-fallback-for-unsupported-libcs.patch130
-rw-r--r--target/linux/generic/pending-4.4/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch94
-rw-r--r--target/linux/generic/pending-4.4/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch46
-rw-r--r--target/linux/generic/pending-4.9/270-uapi-kernel.h-glibc-specific-inclusion-of-sysinfo.h.patch32
-rw-r--r--target/linux/generic/pending-4.9/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch105
-rw-r--r--toolchain/musl/common.mk2
-rw-r--r--toolchain/musl/patches/010-kernel-suppress-some-more-Linux-uapi-definitions.patch59
-rw-r--r--toolchain/musl/patches/400-Add-format-attribute-to-some-function-declarations.patch12
23 files changed, 833 insertions, 781 deletions
diff --git a/package/network/utils/iproute2/patches/270-uapi-libc-compat-add-fallback-for-unsupported-libcs.patch b/package/network/utils/iproute2/patches/270-uapi-libc-compat-add-fallback-for-unsupported-libcs.patch
new file mode 100644
index 0000000000..530a9e8a85
--- /dev/null
+++ b/package/network/utils/iproute2/patches/270-uapi-libc-compat-add-fallback-for-unsupported-libcs.patch
@@ -0,0 +1,147 @@
+From c6bdd0d302119819de72439972d0462c26ef9eda Mon Sep 17 00:00:00 2001
+From: Felix Janda <felix.janda@posteo.de>
+Date: Sun, 12 Nov 2017 13:30:17 -0500
+Subject: uapi libc compat: add fallback for unsupported libcs
+
+libc-compat.h aims to prevent symbol collisions between uapi and libc
+headers for each supported libc. This requires continuous coordination
+between them.
+
+The goal of this commit is to improve the situation for libcs (such as
+musl) which are not yet supported and/or do not wish to be explicitly
+supported, while not affecting supported libcs. More precisely, with
+this commit, unsupported libcs can request the suppression of any
+specific uapi definition by defining the correspondings _UAPI_DEF_*
+macro as 0. This can fix symbol collisions for them, as long as the
+libc headers are included before the uapi headers. Inclusion in the
+other order is outside the scope of this commit.
+
+All infrastructure in order to enable this fallback for unsupported
+libcs is already in place, except that libc-compat.h unconditionally
+defines all _UAPI_DEF_* macros to 1 for all unsupported libcs so that
+any previous definitions are ignored. In order to fix this, this commit
+merely makes these definitions conditional.
+
+This commit together with the musl libc commit
+
+http://git.musl-libc.org/cgit/musl/commit/?id=04983f2272382af92eb8f8838964ff944fbb8258
+
+fixes for example the following compiler errors when <linux/in6.h> is
+included after musl's <netinet/in.h>:
+
+./linux/in6.h:32:8: error: redefinition of 'struct in6_addr'
+./linux/in6.h:49:8: error: redefinition of 'struct sockaddr_in6'
+./linux/in6.h:59:8: error: redefinition of 'struct ipv6_mreq'
+
+The comments referencing glibc are still correct, but this file is not
+only used for glibc any more.
+
+Signed-off-by: Felix Janda <felix.janda@posteo.de>
+Reviewed-by: Hauke Mehrtens <hauke@hauke-m.de>
+---
+ include/uapi/linux/libc-compat.h | 55 +++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 54 insertions(+), 1 deletion(-)
+
+--- a/include/uapi/linux/libc-compat.h
++++ b/include/uapi/linux/libc-compat.h
+@@ -168,46 +168,99 @@
+
+ /* 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. */
++ * 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__ */
+
diff --git a/package/network/utils/iproute2/patches/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch b/package/network/utils/iproute2/patches/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch
deleted file mode 100644
index e3364ad059..0000000000
--- a/package/network/utils/iproute2/patches/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch
+++ /dev/null
@@ -1,107 +0,0 @@
-From f972afc2509eebcb00d370256c55b112a3b5ffca Mon Sep 17 00:00:00 2001
-From: David Heidelberger <david.heidelberger@ixit.cz>
-Date: Mon, 29 Jun 2015 16:50:40 +0200
-Subject: [PATCH 2/3] uapi/libc-compat.h: do not rely on __GLIBC__
-
-Musl provides the same structs as glibc, but does not provide a define to
-allow its detection. Since the absence of __GLIBC__ also can mean that it
-is included from the kernel, change the __GLIBC__ detection to
-!__KERNEL__, which should always be true when included from userspace.
-
-Signed-off-by: John Spencer <maillist-linux@barfooze.de>
-Tested-by: David Heidelberger <david.heidelberger@ixit.cz>
-Signed-off-by: Jonas Gorski <jogo@openwrt.org>
----
- include/uapi/linux/libc-compat.h | 18 +++++++++---------
- 1 file changed, 9 insertions(+), 9 deletions(-)
-
---- a/include/uapi/linux/libc-compat.h
-+++ b/include/uapi/linux/libc-compat.h
-@@ -49,13 +49,13 @@
- #ifndef _LIBC_COMPAT_H
- #define _LIBC_COMPAT_H
-
--/* We have included glibc headers... */
--#if defined(__GLIBC__)
-+/* We have included libc headers... */
-+#if !defined(__KERNEL__)
-
--/* Coordinate with glibc net/if.h header. */
--#if defined(_NET_IF_H) && defined(__USE_MISC)
-+/* Coordinate with libc net/if.h header. */
-+#if defined(_NET_IF_H) && (!defined(__GLIBC__) || defined(__USE_MISC))
-
--/* GLIBC headers included first so don't define anything
-+/* LIBC headers included first so don't define anything
- * that would already be defined. */
-
- #define __UAPI_DEF_IF_IFCONF 0
-@@ -66,7 +66,11 @@
- #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
-+#ifdef __GLIBC__
- #define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1
-+#else
-+#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 0
-+#endif
- #endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */
-
- #else /* _NET_IF_H */
-@@ -86,10 +90,10 @@
-
- #endif /* _NET_IF_H */
-
--/* Coordinate with glibc netinet/in.h header. */
-+/* Coordinate with libc netinet/in.h header. */
- #if defined(_NETINET_IN_H)
-
--/* GLIBC headers included first so don't define anything
-+/* LIBC 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
-@@ -103,7 +107,7 @@
- * 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)
-+#if !defined(__GLIBC__) || defined(__USE_MISC) || defined (__USE_GNU)
- #define __UAPI_DEF_IN6_ADDR_ALT 0
- #else
- #define __UAPI_DEF_IN6_ADDR_ALT 1
-@@ -118,7 +122,7 @@
- #else
-
- /* Linux headers included first, and we must define everything
-- * we need. The expectation is that glibc will check the
-+ * we need. The expectation is that the libc will check the
- * __UAPI_DEF_* defines and adjust appropriately. */
- #define __UAPI_DEF_IN_ADDR 1
- #define __UAPI_DEF_IN_IPPROTO 1
-@@ -128,7 +132,7 @@
- #define __UAPI_DEF_IN_CLASS 1
-
- #define __UAPI_DEF_IN6_ADDR 1
--/* We unconditionally define the in6_addr macros and glibc must
-+/* We unconditionally define the in6_addr macros and the libc must
- * coordinate. */
- #define __UAPI_DEF_IN6_ADDR_ALT 1
- #define __UAPI_DEF_SOCKADDR_IN6 1
-@@ -169,7 +173,7 @@
- /* 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. */
--#else /* !defined(__GLIBC__) */
-+#else /* defined(__KERNEL__) */
-
- /* Definitions for if.h */
- #define __UAPI_DEF_IF_IFCONF 1
-@@ -209,6 +213,6 @@
- /* Definitions for xattr.h */
- #define __UAPI_DEF_XATTR 1
-
--#endif /* __GLIBC__ */
-+#endif /* __KERNEL__ */
-
- #endif /* _LIBC_COMPAT_H */
diff --git a/package/network/utils/iproute2/patches/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch b/package/network/utils/iproute2/patches/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch
index abd1f7eaca..ef4a715bee 100644
--- a/package/network/utils/iproute2/patches/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch
+++ b/package/network/utils/iproute2/patches/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch
@@ -1,18 +1,20 @@
-From fcbb6fed85ea9ff4feb4f1ebd4f0f235fdaf06b6 Mon Sep 17 00:00:00 2001
-From: David Heidelberger <david.heidelberger@ixit.cz>
+From 649affd04813c43e0a72886517fcfccd63230981 Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke@hauke-m.de>
Date: Mon, 29 Jun 2015 16:53:03 +0200
-Subject: [PATCH 3/3] uapi/if_ether.h: prevent redefinition of struct ethhdr
+Subject: uapi/if_ether.h: prevent redefinition of struct ethhdr
Musl provides its own ethhdr struct definition. Add a guard to prevent
its definition of the appropriate musl header has already been included.
-Signed-off-by: John Spencer <maillist-linux@barfooze.de>
-Tested-by: David Heidelberger <david.heidelberger@ixit.cz>
-Signed-off-by: Jonas Gorski <jogo@openwrt.org>
+glibc does not implement this header, but when glibc will implement this
+they can just define __UAPI_DEF_ETHHDR 0 to make it work with the
+kernel.
+
+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
---
- include/uapi/linux/if_ether.h | 3 +++
- include/uapi/linux/libc-compat.h | 11 +++++++++++
- 2 files changed, 14 insertions(+)
+ include/uapi/linux/if_ether.h | 3 +++
+ include/uapi/linux/libc-compat.h | 6 ++++++
+ 2 files changed, 9 insertions(+)
--- a/include/uapi/linux/if_ether.h
+++ b/include/uapi/linux/if_ether.h
@@ -40,28 +42,14 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
#endif /* _LINUX_IF_ETHER_H */
--- a/include/uapi/linux/libc-compat.h
+++ b/include/uapi/linux/libc-compat.h
-@@ -90,6 +90,14 @@
+@@ -264,4 +264,10 @@
- #endif /* _NET_IF_H */
+ #endif /* __GLIBC__ */
-+/* musl defines the ethhdr struct itself in its netinet/if_ether.h.
-+ * Glibc just includes the kernel header and uses a different guard. */
-+#if defined(_NETINET_IF_ETHER_H)
-+#define __UAPI_DEF_ETHHDR 0
-+#else
++/* Definitions for if_ether.h */
++/* allow libcs like musl to deactivate this, glibc does not implement this. */
++#ifndef __UAPI_DEF_ETHHDR
+#define __UAPI_DEF_ETHHDR 1
+#endif
+
- /* Coordinate with libc netinet/in.h header. */
- #if defined(_NETINET_IN_H)
-
-@@ -185,6 +193,9 @@
- /* 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
-
-+/* Definitions for if_ether.h */
-+#define __UAPI_DEF_ETHHDR 1
-+
- /* Definitions for in.h */
- #define __UAPI_DEF_IN_ADDR 1
- #define __UAPI_DEF_IN_IPPROTO 1
+ #endif /* _LIBC_COMPAT_H */
diff --git a/target/linux/generic/backport-4.14/270-uapi-libc-compat-add-fallback-for-unsupported-libcs.patch b/target/linux/generic/backport-4.14/270-uapi-libc-compat-add-fallback-for-unsupported-libcs.patch
new file mode 100644
index 0000000000..530a9e8a85
--- /dev/null
+++ b/target/linux/generic/backport-4.14/270-uapi-libc-compat-add-fallback-for-unsupported-libcs.patch
@@ -0,0 +1,147 @@
+From c6bdd0d302119819de72439972d0462c26ef9eda Mon Sep 17 00:00:00 2001
+From: Felix Janda <felix.janda@posteo.de>
+Date: Sun, 12 Nov 2017 13:30:17 -0500
+Subject: uapi libc compat: add fallback for unsupported libcs
+
+libc-compat.h aims to prevent symbol collisions between uapi and libc
+headers for each supported libc. This requires continuous coordination
+between them.
+
+The goal of this commit is to improve the situation for libcs (such as
+musl) which are not yet supported and/or do not wish to be explicitly
+supported, while not affecting supported libcs. More precisely, with
+this commit, unsupported libcs can request the suppression of any
+specific uapi definition by defining the correspondings _UAPI_DEF_*
+macro as 0. This can fix symbol collisions for them, as long as the
+libc headers are included before the uapi headers. Inclusion in the
+other order is outside the scope of this commit.
+
+All infrastructure in order to enable this fallback for unsupported
+libcs is already in place, except that libc-compat.h unconditionally
+defines all _UAPI_DEF_* macros to 1 for all unsupported libcs so that
+any previous definitions are ignored. In order to fix this, this commit
+merely makes these definitions conditional.
+
+This commit together with the musl libc commit
+
+http://git.musl-libc.org/cgit/musl/commit/?id=04983f2272382af92eb8f8838964ff944fbb8258
+
+fixes for example the following compiler errors when <linux/in6.h> is
+included after musl's <netinet/in.h>:
+
+./linux/in6.h:32:8: error: redefinition of 'struct in6_addr'
+./linux/in6.h:49:8: error: redefinition of 'struct sockaddr_in6'
+./linux/in6.h:59:8: error: redefinition of 'struct ipv6_mreq'
+
+The comments referencing glibc are still correct, but this file is not
+only used for glibc any more.
+
+Signed-off-by: Felix Janda <felix.janda@posteo.de>
+Reviewed-by: Hauke Mehrtens <hauke@hauke-m.de>
+---
+ include/uapi/linux/libc-compat.h | 55 +++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 54 insertions(+), 1 deletion(-)
+
+--- a/include/uapi/linux/libc-compat.h
++++ b/include/uapi/linux/libc-compat.h
+@@ -168,46 +168,99 @@
+
+ /* 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. */
++ * 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__ */
+
diff --git a/target/linux/generic/pending-4.14/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch b/target/linux/generic/backport-4.14/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch
index 1dca07328d..784c548c81 100644
--- a/target/linux/generic/pending-4.14/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch
+++ b/target/linux/generic/backport-4.14/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch
@@ -1,16 +1,20 @@
-From: David Heidelberger <david.heidelberger@ixit.cz>
+From 649affd04813c43e0a72886517fcfccd63230981 Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke@hauke-m.de>
+Date: Mon, 29 Jun 2015 16:53:03 +0200
Subject: uapi/if_ether.h: prevent redefinition of struct ethhdr
Musl provides its own ethhdr struct definition. Add a guard to prevent
its definition of the appropriate musl header has already been included.
-Signed-off-by: John Spencer <maillist-linux@barfooze.de>
-Tested-by: David Heidelberger <david.heidelberger@ixit.cz>
-Signed-off-by: Jonas Gorski <jogo@openwrt.org>
+glibc does not implement this header, but when glibc will implement this
+they can just define __UAPI_DEF_ETHHDR 0 to make it work with the
+kernel.
+
+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
---
- include/uapi/linux/if_ether.h | 3 +++
- include/uapi/linux/libc-compat.h | 11 +++++++++++
- 2 files changed, 14 insertions(+)
+ include/uapi/linux/if_ether.h | 3 +++
+ include/uapi/linux/libc-compat.h | 6 ++++++
+ 2 files changed, 9 insertions(+)
--- a/include/uapi/linux/if_ether.h
+++ b/include/uapi/linux/if_ether.h
@@ -38,28 +42,14 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
#endif /* _UAPI_LINUX_IF_ETHER_H */
--- a/include/uapi/linux/libc-compat.h
+++ b/include/uapi/linux/libc-compat.h
-@@ -90,6 +90,14 @@
+@@ -264,4 +264,10 @@
- #endif /* _NET_IF_H */
+ #endif /* __GLIBC__ */
-+/* musl defines the ethhdr struct itself in its netinet/if_ether.h.
-+ * Glibc just includes the kernel header and uses a different guard. */
-+#if defined(_NETINET_IF_ETHER_H)
-+#define __UAPI_DEF_ETHHDR 0
-+#else
++/* Definitions for if_ether.h */
++/* allow libcs like musl to deactivate this, glibc does not implement this. */
++#ifndef __UAPI_DEF_ETHHDR
+#define __UAPI_DEF_ETHHDR 1
+#endif
+
- /* Coordinate with libc netinet/in.h header. */
- #if defined(_NETINET_IN_H)
-
-@@ -185,6 +193,9 @@
- /* 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
-
-+/* Definitions for if_ether.h */
-+#define __UAPI_DEF_ETHHDR 1
-+
- /* Definitions for in.h */
- #define __UAPI_DEF_IN_ADDR 1
- #define __UAPI_DEF_IN_IPPROTO 1
+ #endif /* _UAPI_LIBC_COMPAT_H */
diff --git a/target/linux/generic/backport-4.9/270-uapi-libc-compat-add-fallback-for-unsupported-libcs.patch b/target/linux/generic/backport-4.9/270-uapi-libc-compat-add-fallback-for-unsupported-libcs.patch
new file mode 100644
index 0000000000..7b82bed535
--- /dev/null
+++ b/target/linux/generic/backport-4.9/270-uapi-libc-compat-add-fallback-for-unsupported-libcs.patch
@@ -0,0 +1,147 @@
+From c6bdd0d302119819de72439972d0462c26ef9eda Mon Sep 17 00:00:00 2001
+From: Felix Janda <felix.janda@posteo.de>
+Date: Sun, 12 Nov 2017 13:30:17 -0500
+Subject: uapi libc compat: add fallback for unsupported libcs
+
+libc-compat.h aims to prevent symbol collisions between uapi and libc
+headers for each supported libc. This requires continuous coordination
+between them.
+
+The goal of this commit is to improve the situation for libcs (such as
+musl) which are not yet supported and/or do not wish to be explicitly
+supported, while not affecting supported libcs. More precisely, with
+this commit, unsupported libcs can request the suppression of any
+specific uapi definition by defining the correspondings _UAPI_DEF_*
+macro as 0. This can fix symbol collisions for them, as long as the
+libc headers are included before the uapi headers. Inclusion in the
+other order is outside the scope of this commit.
+
+All infrastructure in order to enable this fallback for unsupported
+libcs is already in place, except that libc-compat.h unconditionally
+defines all _UAPI_DEF_* macros to 1 for all unsupported libcs so that
+any previous definitions are ignored. In order to fix this, this commit
+merely makes these definitions conditional.
+
+This commit together with the musl libc commit
+
+http://git.musl-libc.org/cgit/musl/commit/?id=04983f2272382af92eb8f8838964ff944fbb8258
+
+fixes for example the following compiler errors when <linux/in6.h> is
+included after musl's <netinet/in.h>:
+
+./linux/in6.h:32:8: error: redefinition of 'struct in6_addr'
+./linux/in6.h:49:8: error: redefinition of 'struct sockaddr_in6'
+./linux/in6.h:59:8: error: redefinition of 'struct ipv6_mreq'
+
+The comments referencing glibc are still correct, but this file is not
+only used for glibc any more.
+
+Signed-off-by: Felix Janda <felix.janda@posteo.de>
+Reviewed-by: Hauke Mehrtens <hauke@hauke-m.de>
+---
+ include/uapi/linux/libc-compat.h | 55 +++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 54 insertions(+), 1 deletion(-)
+
+--- a/include/uapi/linux/libc-compat.h
++++ b/include/uapi/linux/libc-compat.h
+@@ -167,46 +167,99 @@
+
+ /* 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. */
++ * 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__ */
+
diff --git a/target/linux/generic/pending-4.9/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch b/target/linux/generic/backport-4.9/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch
index 7b7b403ed0..38697021d5 100644
--- a/target/linux/generic/pending-4.9/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch
+++ b/target/linux/generic/backport-4.9/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch
@@ -1,16 +1,20 @@
-From: David Heidelberger <david.heidelberger@ixit.cz>
+From 649affd04813c43e0a72886517fcfccd63230981 Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke@hauke-m.de>
+Date: Mon, 29 Jun 2015 16:53:03 +0200
Subject: uapi/if_ether.h: prevent redefinition of struct ethhdr
Musl provides its own ethhdr struct definition. Add a guard to prevent
its definition of the appropriate musl header has already been included.
-Signed-off-by: John Spencer <maillist-linux@barfooze.de>
-Tested-by: David Heidelberger <david.heidelberger@ixit.cz>
-Signed-off-by: Jonas Gorski <jogo@openwrt.org>
+glibc does not implement this header, but when glibc will implement this
+they can just define __UAPI_DEF_ETHHDR 0 to make it work with the
+kernel.
+
+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
---
- include/uapi/linux/if_ether.h | 3 +++
- include/uapi/linux/libc-compat.h | 11 +++++++++++
- 2 files changed, 14 insertions(+)
+ include/uapi/linux/if_ether.h | 3 +++
+ include/uapi/linux/libc-compat.h | 6 ++++++
+ 2 files changed, 9 insertions(+)
--- a/include/uapi/linux/if_ether.h
+++ b/include/uapi/linux/if_ether.h
@@ -38,28 +42,14 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
#endif /* _UAPI_LINUX_IF_ETHER_H */
--- a/include/uapi/linux/libc-compat.h
+++ b/include/uapi/linux/libc-compat.h
-@@ -89,6 +89,14 @@
+@@ -263,4 +263,10 @@
- #endif /* _NET_IF_H */
+ #endif /* __GLIBC__ */
-+/* musl defines the ethhdr struct itself in its netinet/if_ether.h.
-+ * Glibc just includes the kernel header and uses a different guard. */
-+#if defined(_NETINET_IF_ETHER_H)
-+#define __UAPI_DEF_ETHHDR 0
-+#else
++/* Definitions for if_ether.h */
++/* allow libcs like musl to deactivate this, glibc does not implement this. */
++#ifndef __UAPI_DEF_ETHHDR
+#define __UAPI_DEF_ETHHDR 1
+#endif
+
- /* Coordinate with libc netinet/in.h header. */
- #if defined(_NETINET_IN_H)
-
-@@ -184,6 +192,9 @@
- /* 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
-
-+/* Definitions for if_ether.h */
-+#define __UAPI_DEF_ETHHDR 1
-+
- /* Definitions for in.h */
- #define __UAPI_DEF_IN_ADDR 1
- #define __UAPI_DEF_IN_IPPROTO 1
+ #endif /* _UAPI_LIBC_COMPAT_H */
diff --git a/target/linux/generic/pending-3.18/002-phy_drivers_backport.patch b/target/linux/generic/pending-3.18/002-phy_drivers_backport.patch
index 63071c9997..504d772def 100644
--- a/target/linux/generic/pending-3.18/002-phy_drivers_backport.patch
+++ b/target/linux/generic/pending-3.18/002-phy_drivers_backport.patch
@@ -464,7 +464,7 @@
module_init(psb6970_init);
--- a/drivers/net/phy/rtl8306.c
+++ b/drivers/net/phy/rtl8306.c
-@@ -876,7 +876,7 @@ rtl8306_config_init(struct phy_device *p
+@@ -877,7 +877,7 @@ rtl8306_config_init(struct phy_device *p
int err;
/* Only init the switch for the primary PHY */
@@ -473,7 +473,7 @@
return 0;
val.value.i = 1;
-@@ -886,7 +886,7 @@ rtl8306_config_init(struct phy_device *p
+@@ -887,7 +887,7 @@ rtl8306_config_init(struct phy_device *p
priv->dev.ops = &rtl8306_ops;
priv->do_cpu = 0;
priv->page = -1;
@@ -482,7 +482,7 @@
chipid = rtl_get(dev, RTL_REG_CHIPID);
chipver = rtl_get(dev, RTL_REG_CHIPVER);
-@@ -932,13 +932,13 @@ rtl8306_fixup(struct phy_device *pdev)
+@@ -933,13 +933,13 @@ rtl8306_fixup(struct phy_device *pdev)
u16 chipid;
/* Attach to primary LAN port and WAN port */
@@ -498,7 +498,7 @@
chipid = rtl_get(&priv.dev, RTL_REG_CHIPID);
if (chipid == 0x5988)
pdev->phy_id = RTL8306_MAGIC;
-@@ -956,14 +956,14 @@ rtl8306_probe(struct phy_device *pdev)
+@@ -957,14 +957,14 @@ rtl8306_probe(struct phy_device *pdev)
* share one rtl_priv instance between virtual phy
* devices on the same bus
*/
@@ -515,7 +515,7 @@
found:
pdev->priv = priv;
-@@ -984,7 +984,7 @@ rtl8306_config_aneg(struct phy_device *p
+@@ -985,7 +985,7 @@ rtl8306_config_aneg(struct phy_device *p
struct rtl_priv *priv = pdev->priv;
/* Only for WAN */
@@ -524,7 +524,7 @@
return 0;
/* Restart autonegotiation */
-@@ -1000,7 +1000,7 @@ rtl8306_read_status(struct phy_device *p
+@@ -1001,7 +1001,7 @@ rtl8306_read_status(struct phy_device *p
struct rtl_priv *priv = pdev->priv;
struct switch_dev *dev = &priv->dev;
@@ -533,7 +533,7 @@
/* WAN */
pdev->speed = rtl_get(dev, RTL_PORT_REG(4, SPEED)) ? SPEED_100 : SPEED_10;
pdev->duplex = rtl_get(dev, RTL_PORT_REG(4, DUPLEX)) ? DUPLEX_FULL : DUPLEX_HALF;
-@@ -1041,6 +1041,7 @@ static struct phy_driver rtl8306_driver
+@@ -1044,6 +1044,7 @@ static struct phy_driver rtl8306_driver
.config_init = &rtl8306_config_init,
.config_aneg = &rtl8306_config_aneg,
.read_status = &rtl8306_read_status,
@@ -541,7 +541,7 @@
};
-@@ -1048,7 +1049,7 @@ static int __init
+@@ -1051,7 +1052,7 @@ static int __init
rtl_init(void)
{
phy_register_fixup_for_id(PHY_ANY_ID, rtl8306_fixup);
diff --git a/target/linux/generic/pending-3.18/270-uapi-kernel.h-glibc-specific-inclusion-of-sysinfo.h.patch b/target/linux/generic/pending-3.18/270-uapi-kernel.h-glibc-specific-inclusion-of-sysinfo.h.patch
deleted file mode 100644
index 762f4989b6..0000000000
--- a/target/linux/generic/pending-3.18/270-uapi-kernel.h-glibc-specific-inclusion-of-sysinfo.h.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From 8b05e325824d3b38e52a7748b3b5dc34dc1c0f6d Mon Sep 17 00:00:00 2001
-From: David Heidelberger <david.heidelberger@ixit.cz>
-Date: Mon, 29 Jun 2015 14:37:54 +0200
-Subject: [PATCH 1/3] uapi/kernel.h: glibc specific inclusion of sysinfo.h
-
-including sysinfo.h from kernel.h makes no sense whatsoever,
-but removing it breaks glibc's userspace header,
-which includes kernel.h instead of sysinfo.h from their sys/sysinfo.h.
-this seems to be a historical mistake.
-on musl, including any header that uses kernel.h directly or indirectly
-plus sys/sysinfo.h will produce a compile error due to redefinition of
-struct sysinfo from sys/sysinfo.h.
-so for now, only include it on glibc or when including from kernel
-in order not to break their headers.
-
-Signed-off-by: John Spencer <maillist-linux@barfooze.de>
-Signed-off-by: David Heidelberger <david.heidelberger@ixit.cz>
-Signed-off-by: Jonas Gorski <jogo@openwrt.org>
----
- include/uapi/linux/kernel.h | 2 ++
- 1 file changed, 2 insertions(+)
-
---- a/include/uapi/linux/kernel.h
-+++ b/include/uapi/linux/kernel.h
-@@ -1,7 +1,9 @@
- #ifndef _UAPI_LINUX_KERNEL_H
- #define _UAPI_LINUX_KERNEL_H
-
-+#if defined(__KERNEL__) || defined( __GLIBC__)
- #include <linux/sysinfo.h>
-+#endif
-
- /*
- * 'kernel.h' contains some often-used function prototypes etc
diff --git a/target/linux/generic/pending-3.18/270-uapi-libc-compat-add-fallback-for-unsupported-libcs.patch b/target/linux/generic/pending-3.18/270-uapi-libc-compat-add-fallback-for-unsupported-libcs.patch
new file mode 100644
index 0000000000..67895995b2
--- /dev/null
+++ b/target/linux/generic/pending-3.18/270-uapi-libc-compat-add-fallback-for-unsupported-libcs.patch
@@ -0,0 +1,102 @@
+From c6bdd0d302119819de72439972d0462c26ef9eda Mon Sep 17 00:00:00 2001
+From: Felix Janda <felix.janda@posteo.de>
+Date: Sun, 12 Nov 2017 13:30:17 -0500
+Subject: uapi libc compat: add fallback for unsupported libcs
+
+libc-compat.h aims to prevent symbol collisions between uapi and libc
+headers for each supported libc. This requires continuous coordination
+between them.
+
+The goal of this commit is to improve the situation for libcs (such as
+musl) which are not yet supported and/or do not wish to be explicitly
+supported, while not affecting supported libcs. More precisely, with
+this commit, unsupported libcs can request the suppression of any
+specific uapi definition by defining the correspondings _UAPI_DEF_*
+macro as 0. This can fix symbol collisions for them, as long as the
+libc headers are included before the uapi headers. Inclusion in the
+other order is outside the scope of this commit.
+
+All infrastructure in order to enable this fallback for unsupported
+libcs is already in place, except that libc-compat.h unconditionally
+defines all _UAPI_DEF_* macros to 1 for all unsupported libcs so that
+any previous definitions are ignored. In order to fix this, this commit
+merely makes these definitions conditional.
+
+This commit together with the musl libc commit
+
+http://git.musl-libc.org/cgit/musl/commit/?id=04983f2272382af92eb8f8838964ff944fbb8258
+
+fixes for example the following compiler errors when <linux/in6.h> is
+included after musl's <netinet/in.h>:
+
+./linux/in6.h:32:8: error: redefinition of 'struct in6_addr'
+./linux/in6.h:49:8: error: redefinition of 'struct sockaddr_in6'
+./linux/in6.h:59:8: error: redefinition of 'struct ipv6_mreq'
+
+The comments referencing glibc are still correct, but this file is not
+only used for glibc any more.
+
+Signed-off-by: Felix Janda <felix.janda@posteo.de>
+Reviewed-by: Hauke Mehrtens <hauke@hauke-m.de>
+---
+ include/uapi/linux/libc-compat.h | 55 +++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 54 insertions(+), 1 deletion(-)
+
+--- a/include/uapi/linux/libc-compat.h
++++ b/include/uapi/linux/libc-compat.h
+@@ -110,27 +110,54 @@
+
+ /* 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. */
++ * 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 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
+
+ /* Definitions for xattr.h */
++#ifndef __UAPI_DEF_XATTR
+ #define __UAPI_DEF_XATTR 1
++#endif
+
+ #endif /* __GLIBC__ */
+
diff --git a/target/linux/generic/pending-3.18/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch b/target/linux/generic/pending-3.18/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch
deleted file mode 100644
index 891299ead1..0000000000
--- a/target/linux/generic/pending-3.18/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch
+++ /dev/null
@@ -1,81 +0,0 @@
-From f972afc2509eebcb00d370256c55b112a3b5ffca Mon Sep 17 00:00:00 2001
-From: David Heidelberger <david.heidelberger@ixit.cz>
-Date: Mon, 29 Jun 2015 16:50:40 +0200
-Subject: [PATCH 2/3] uapi/libc-compat.h: do not rely on __GLIBC__
-
-Musl provides the same structs as glibc, but does not provide a define to
-allow its detection. Since the absence of __GLIBC__ also can mean that it
-is included from the kernel, change the __GLIBC__ detection to
-!__KERNEL__, which should always be true when included from userspace.
-
-Signed-off-by: John Spencer <maillist-linux@barfooze.de>
-Tested-by: David Heidelberger <david.heidelberger@ixit.cz>
-Signed-off-by: Jonas Gorski <jogo@openwrt.org>
----
- include/uapi/linux/libc-compat.h | 18 +++++++++---------
- 1 file changed, 9 insertions(+), 9 deletions(-)
-
---- a/include/uapi/linux/libc-compat.h
-+++ b/include/uapi/linux/libc-compat.h
-@@ -48,13 +48,13 @@
- #ifndef _UAPI_LIBC_COMPAT_H
- #define _UAPI_LIBC_COMPAT_H
-
--/* We have included glibc headers... */
--#if defined(__GLIBC__)
-+/* We have included libc headers... */
-+#if !defined(__KERNEL__)
-
--/* Coordinate with glibc netinet/in.h header. */
-+/* Coordinate with libc netinet/in.h header. */
- #if defined(_NETINET_IN_H)
-
--/* GLIBC headers included first so don't define anything
-+/* LIBC 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
-@@ -68,7 +68,7 @@
- * 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)
-+#if !defined(__GLIBC__) || defined(__USE_MISC) || defined (__USE_GNU)
- #define __UAPI_DEF_IN6_ADDR_ALT 0
- #else
- #define __UAPI_DEF_IN6_ADDR_ALT 1
-@@ -81,7 +81,7 @@
- #else
-
- /* Linux headers included first, and we must define everything
-- * we need. The expectation is that glibc will check the
-+ * we need. The expectation is that the libc will check the
- * __UAPI_DEF_* defines and adjust appropriately. */
- #define __UAPI_DEF_IN_ADDR 1
- #define __UAPI_DEF_IN_IPPROTO 1
-@@ -91,7 +91,7 @@
- #define __UAPI_DEF_IN_CLASS 1
-
- #define __UAPI_DEF_IN6_ADDR 1
--/* We unconditionally define the in6_addr macros and glibc must
-+/* We unconditionally define the in6_addr macros and the libc must
- * coordinate. */
- #define __UAPI_DEF_IN6_ADDR_ALT 1
- #define __UAPI_DEF_SOCKADDR_IN6 1
-@@ -111,7 +111,7 @@
- /* 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. */
--#else /* !defined(__GLIBC__) */
-+#else /* defined(__KERNEL__) */
-
- /* Definitions for in.h */
- #define __UAPI_DEF_IN_ADDR 1
-@@ -132,6 +132,6 @@
- /* Definitions for xattr.h */
- #define __UAPI_DEF_XATTR 1
-
--#endif /* __GLIBC__ */
-+#endif /* __KERNEL__ */
-
- #endif /* _UAPI_LIBC_COMPAT_H */
diff --git a/target/linux/generic/pending-3.18/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch b/target/linux/generic/pending-3.18/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch
index feea4c31c6..10d698f961 100644
--- a/target/linux/generic/pending-3.18/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch
+++ b/target/linux/generic/pending-3.18/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch
@@ -1,18 +1,20 @@
-From fcbb6fed85ea9ff4feb4f1ebd4f0f235fdaf06b6 Mon Sep 17 00:00:00 2001
-From: David Heidelberger <david.heidelberger@ixit.cz>
+From 649affd04813c43e0a72886517fcfccd63230981 Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke@hauke-m.de>
Date: Mon, 29 Jun 2015 16:53:03 +0200
-Subject: [PATCH 3/3] uapi/if_ether.h: prevent redefinition of struct ethhdr
+Subject: uapi/if_ether.h: prevent redefinition of struct ethhdr
Musl provides its own ethhdr struct definition. Add a guard to prevent
its definition of the appropriate musl header has already been included.
-Signed-off-by: John Spencer <maillist-linux@barfooze.de>
-Tested-by: David Heidelberger <david.heidelberger@ixit.cz>
-Signed-off-by: Jonas Gorski <jogo@openwrt.org>
+glibc does not implement this header, but when glibc will implement this
+they can just define __UAPI_DEF_ETHHDR 0 to make it work with the
+kernel.
+
+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
---
- include/uapi/linux/if_ether.h | 3 +++
- include/uapi/linux/libc-compat.h | 11 +++++++++++
- 2 files changed, 14 insertions(+)
+ include/uapi/linux/if_ether.h | 3 +++
+ include/uapi/linux/libc-compat.h | 6 ++++++
+ 2 files changed, 9 insertions(+)
--- a/include/uapi/linux/if_ether.h
+++ b/include/uapi/linux/if_ether.h
@@ -40,28 +42,14 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
#endif /* _UAPI_LINUX_IF_ETHER_H */
--- a/include/uapi/linux/libc-compat.h
+++ b/include/uapi/linux/libc-compat.h
-@@ -51,6 +51,14 @@
- /* We have included libc headers... */
- #if !defined(__KERNEL__)
+@@ -161,4 +161,10 @@
-+/* musl defines the ethhdr struct itself in its netinet/if_ether.h.
-+ * Glibc just includes the kernel header and uses a different guard. */
-+#if defined(_NETINET_IF_ETHER_H)
-+#define __UAPI_DEF_ETHHDR 0
-+#else
-+#define __UAPI_DEF_ETHHDR 1
-+#endif
-+
- /* Coordinate with libc netinet/in.h header. */
- #if defined(_NETINET_IN_H)
-
-@@ -113,6 +121,9 @@
- * that we need. */
- #else /* defined(__KERNEL__) */
+ #endif /* __GLIBC__ */
+/* Definitions for if_ether.h */
-+#define __UAPI_DEF_ETHHDR 1
++/* allow libcs like musl to deactivate this, glibc does not implement this. */
++#ifndef __UAPI_DEF_ETHHDR
++#define __UAPI_DEF_ETHHDR 1
++#endif
+
- /* Definitions for in.h */
- #define __UAPI_DEF_IN_ADDR 1
- #define __UAPI_DEF_IN_IPPROTO 1
+ #endif /* _UAPI_LIBC_COMPAT_H */
diff --git a/target/linux/generic/pending-4.14/270-uapi-kernel.h-glibc-specific-inclusion-of-sysinfo.h.patch b/target/linux/generic/pending-4.14/270-uapi-kernel.h-glibc-specific-inclusion-of-sysinfo.h.patch
deleted file mode 100644
index 9ec8daf886..0000000000
--- a/target/linux/generic/pending-4.14/270-uapi-kernel.h-glibc-specific-inclusion-of-sysinfo.h.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From: David Heidelberger <david.heidelberger@ixit.cz>
-Subject: uapi/kernel.h: glibc specific inclusion of sysinfo.h
-
-including sysinfo.h from kernel.h makes no sense whatsoever,
-but removing it breaks glibc's userspace header,
-which includes kernel.h instead of sysinfo.h from their sys/sysinfo.h.
-this seems to be a historical mistake.
-on musl, including any header that uses kernel.h directly or indirectly
-plus sys/sysinfo.h will produce a compile error due to redefinition of
-struct sysinfo from sys/sysinfo.h.
-so for now, only include it on glibc or when including from kernel
-in order not to break their headers.
-
-Signed-off-by: John Spencer <maillist-linux@barfooze.de>
-Signed-off-by: David Heidelberger <david.heidelberger@ixit.cz>
-Signed-off-by: Jonas Gorski <jogo@openwrt.org>
----
- include/uapi/linux/kernel.h | 2 ++
- 1 file changed, 2 insertions(+)
-
---- a/include/uapi/linux/kernel.h
-+++ b/include/uapi/linux/kernel.h
-@@ -2,7 +2,9 @@
- #ifndef _UAPI_LINUX_KERNEL_H
- #define _UAPI_LINUX_KERNEL_H
-
-+#if defined(__KERNEL__) || defined( __GLIBC__)
- #include <linux/sysinfo.h>
-+#endif
-
- /*
- * 'kernel.h' contains some often-used function prototypes etc
diff --git a/target/linux/generic/pending-4.14/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch b/target/linux/generic/pending-4.14/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch
deleted file mode 100644
index 9ae148da4f..0000000000
--- a/target/linux/generic/pending-4.14/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch
+++ /dev/null
@@ -1,105 +0,0 @@
-From: David Heidelberger <david.heidelberger@ixit.cz>
-Subject: uapi/libc-compat.h: do not rely on __GLIBC__
-
-Musl provides the same structs as glibc, but does not provide a define to
-allow its detection. Since the absence of __GLIBC__ also can mean that it
-is included from the kernel, change the __GLIBC__ detection to
-!__KERNEL__, which should always be true when included from userspace.
-
-Signed-off-by: John Spencer <maillist-linux@barfooze.de>
-Tested-by: David Heidelberger <david.heidelberger@ixit.cz>
-Signed-off-by: Jonas Gorski <jogo@openwrt.org>
----
- include/uapi/linux/libc-compat.h | 18 +++++++++---------
- 1 file changed, 9 insertions(+), 9 deletions(-)
-
---- a/include/uapi/linux/libc-compat.h
-+++ b/include/uapi/linux/libc-compat.h
-@@ -49,13 +49,13 @@
- #ifndef _UAPI_LIBC_COMPAT_H
- #define _UAPI_LIBC_COMPAT_H
-
--/* We have included glibc headers... */
--#if defined(__GLIBC__)
-+/* We have included libc headers... */
-+#if !defined(__KERNEL__)
-
--/* Coordinate with glibc net/if.h header. */
--#if defined(_NET_IF_H) && defined(__USE_MISC)
-+/* Coordinate with libc net/if.h header. */
-+#if defined(_NET_IF_H) && (!defined(__GLIBC__) || defined(__USE_MISC))
-
--/* GLIBC headers included first so don't define anything
-+/* LIBC headers included first so don't define anything
- * that would already be defined. */
-
- #define __UAPI_DEF_IF_IFCONF 0
-@@ -66,7 +66,11 @@
- #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
-+#ifdef __GLIBC__
- #define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1
-+#else
-+#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 0
-+#endif
- #endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */
-
- #else /* _NET_IF_H */
-@@ -86,10 +90,10 @@
-
- #endif /* _NET_IF_H */
-
--/* Coordinate with glibc netinet/in.h header. */
-+/* Coordinate with libc netinet/in.h header. */
- #if defined(_NETINET_IN_H)
-
--/* GLIBC headers included first so don't define anything
-+/* LIBC 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
-@@ -103,7 +107,7 @@
- * 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)
-+#if !defined(__GLIBC__) || defined(__USE_MISC) || defined (__USE_GNU)
- #define __UAPI_DEF_IN6_ADDR_ALT 0
- #else
- #define __UAPI_DEF_IN6_ADDR_ALT 1
-@@ -118,7 +122,7 @@
- #else
-
- /* Linux headers included first, and we must define everything
-- * we need. The expectation is that glibc will check the
-+ * we need. The expectation is that the libc will check the
- * __UAPI_DEF_* defines and adjust appropriately. */
- #define __UAPI_DEF_IN_ADDR 1
- #define __UAPI_DEF_IN_IPPROTO 1
-@@ -128,7 +132,7 @@
- #define __UAPI_DEF_IN_CLASS 1
-
- #define __UAPI_DEF_IN6_ADDR 1
--/* We unconditionally define the in6_addr macros and glibc must
-+/* We unconditionally define the in6_addr macros and the libc must
- * coordinate. */
- #define __UAPI_DEF_IN6_ADDR_ALT 1
- #define __UAPI_DEF_SOCKADDR_IN6 1
-@@ -169,7 +173,7 @@
- /* 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. */
--#else /* !defined(__GLIBC__) */
-+#else /* defined(__KERNEL__) */
-
- /* Definitions for if.h */
- #define __UAPI_DEF_IF_IFCONF 1
-@@ -209,6 +213,6 @@
- /* Definitions for xattr.h */
- #define __UAPI_DEF_XATTR 1
-
--#endif /* __GLIBC__ */
-+#endif /* __KERNEL__ */
-
- #endif /* _UAPI_LIBC_COMPAT_H */
diff --git a/target/linux/generic/pending-4.4/270-uapi-kernel.h-glibc-specific-inclusion-of-sysinfo.h.patch b/target/linux/generic/pending-4.4/270-uapi-kernel.h-glibc-specific-inclusion-of-sysinfo.h.patch
deleted file mode 100644
index 762f4989b6..0000000000
--- a/target/linux/generic/pending-4.4/270-uapi-kernel.h-glibc-specific-inclusion-of-sysinfo.h.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From 8b05e325824d3b38e52a7748b3b5dc34dc1c0f6d Mon Sep 17 00:00:00 2001
-From: David Heidelberger <david.heidelberger@ixit.cz>
-Date: Mon, 29 Jun 2015 14:37:54 +0200
-Subject: [PATCH 1/3] uapi/kernel.h: glibc specific inclusion of sysinfo.h
-
-including sysinfo.h from kernel.h makes no sense whatsoever,
-but removing it breaks glibc's userspace header,
-which includes kernel.h instead of sysinfo.h from their sys/sysinfo.h.
-this seems to be a historical mistake.
-on musl, including any header that uses kernel.h directly or indirectly
-plus sys/sysinfo.h will produce a compile error due to redefinition of
-struct sysinfo from sys/sysinfo.h.
-so for now, only include it on glibc or when including from kernel
-in order not to break their headers.
-
-Signed-off-by: John Spencer <maillist-linux@barfooze.de>
-Signed-off-by: David Heidelberger <david.heidelberger@ixit.cz>
-Signed-off-by: Jonas Gorski <jogo@openwrt.org>
----
- include/uapi/linux/kernel.h | 2 ++
- 1 file changed, 2 insertions(+)
-
---- a/include/uapi/linux/kernel.h
-+++ b/include/uapi/linux/kernel.h
-@@ -1,7 +1,9 @@
- #ifndef _UAPI_LINUX_KERNEL_H
- #define _UAPI_LINUX_KERNEL_H
-
-+#if defined(__KERNEL__) || defined( __GLIBC__)
- #include <linux/sysinfo.h>
-+#endif
-
- /*
- * 'kernel.h' contains some often-used function prototypes etc
diff --git a/target/linux/generic/pending-4.4/270-uapi-libc-compat-add-fallback-for-unsupported-libcs.patch b/target/linux/generic/pending-4.4/270-uapi-libc-compat-add-fallback-for-unsupported-libcs.patch
new file mode 100644
index 0000000000..06ad9bba9d
--- /dev/null
+++ b/target/linux/generic/pending-4.4/270-uapi-libc-compat-add-fallback-for-unsupported-libcs.patch
@@ -0,0 +1,130 @@
+From c6bdd0d302119819de72439972d0462c26ef9eda Mon Sep 17 00:00:00 2001
+From: Felix Janda <felix.janda@posteo.de>
+Date: Sun, 12 Nov 2017 13:30:17 -0500
+Subject: uapi libc compat: add fallback for unsupported libcs
+
+libc-compat.h aims to prevent symbol collisions between uapi and libc
+headers for each supported libc. This requires continuous coordination
+between them.
+
+The goal of this commit is to improve the situation for libcs (such as
+musl) which are not yet supported and/or do not wish to be explicitly
+supported, while not affecting supported libcs. More precisely, with
+this commit, unsupported libcs can request the suppression of any
+specific uapi definition by defining the correspondings _UAPI_DEF_*
+macro as 0. This can fix symbol collisions for them, as long as the
+libc headers are included before the uapi headers. Inclusion in the
+other order is outside the scope of this commit.
+
+All infrastructure in order to enable this fallback for unsupported
+libcs is already in place, except that libc-compat.h unconditionally
+defines all _UAPI_DEF_* macros to 1 for all unsupported libcs so that
+any previous definitions are ignored. In order to fix this, this commit
+merely makes these definitions conditional.
+
+This commit together with the musl libc commit
+
+http://git.musl-libc.org/cgit/musl/commit/?id=04983f2272382af92eb8f8838964ff944fbb8258
+
+fixes for example the following compiler errors when <linux/in6.h> is
+included after musl's <netinet/in.h>:
+
+./linux/in6.h:32:8: error: redefinition of 'struct in6_addr'
+./linux/in6.h:49:8: error: redefinition of 'struct sockaddr_in6'
+./linux/in6.h:59:8: error: redefinition of 'struct ipv6_mreq'
+
+The comments referencing glibc are still correct, but this file is not
+only used for glibc any more.
+
+Signed-off-by: Felix Janda <felix.janda@posteo.de>
+Reviewed-by: Hauke Mehrtens <hauke@hauke-m.de>
+---
+ include/uapi/linux/libc-compat.h | 55 +++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 54 insertions(+), 1 deletion(-)
+
+--- a/include/uapi/linux/libc-compat.h
++++ b/include/uapi/linux/libc-compat.h
+@@ -148,39 +148,82 @@
+
+ /* 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. */
++ * 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 xattr.h */
++#ifndef __UAPI_DEF_XATTR
+ #define __UAPI_DEF_XATTR 1
++#endif
+
+ #endif /* __GLIBC__ */
+
diff --git a/target/linux/generic/pending-4.4/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch b/target/linux/generic/pending-4.4/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch
deleted file mode 100644
index 2a29535eed..0000000000
--- a/target/linux/generic/pending-4.4/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch
+++ /dev/null
@@ -1,94 +0,0 @@
-From f972afc2509eebcb00d370256c55b112a3b5ffca Mon Sep 17 00:00:00 2001
-From: David Heidelberger <david.heidelberger@ixit.cz>
-Date: Mon, 29 Jun 2015 16:50:40 +0200
-Subject: [PATCH 2/3] uapi/libc-compat.h: do not rely on __GLIBC__
-
-Musl provides the same structs as glibc, but does not provide a define to
-allow its detection. Since the absence of __GLIBC__ also can mean that it
-is included from the kernel, change the __GLIBC__ detection to
-!__KERNEL__, which should always be true when included from userspace.
-
-Signed-off-by: John Spencer <maillist-linux@barfooze.de>
-Tested-by: David Heidelberger <david.heidelberger@ixit.cz>
-Signed-off-by: Jonas Gorski <jogo@openwrt.org>
----
- include/uapi/linux/libc-compat.h | 18 +++++++++---------
- 1 file changed, 9 insertions(+), 9 deletions(-)
-
---- a/include/uapi/linux/libc-compat.h
-+++ b/include/uapi/linux/libc-compat.h
-@@ -48,13 +48,13 @@
- #ifndef _UAPI_LIBC_COMPAT_H
- #define _UAPI_LIBC_COMPAT_H
-
--/* We have included glibc headers... */
--#if defined(__GLIBC__)
-+/* We have included libc headers... */
-+#if !defined(__KERNEL__)
-
--/* Coordinate with glibc net/if.h header. */
-+/* Coordinate with libc net/if.h header. */
- #if defined(_NET_IF_H) && defined(__USE_MISC)
-
--/* GLIBC headers included first so don't define anything
-+/* LIBC headers included first so don't define anything
- * that would already be defined. */
-
- #define __UAPI_DEF_IF_IFCONF 0
-@@ -85,10 +85,10 @@
-
- #endif /* _NET_IF_H */
-
--/* Coordinate with glibc netinet/in.h header. */
-+/* Coordinate with libc netinet/in.h header. */
- #if defined(_NETINET_IN_H)
-
--/* GLIBC headers included first so don't define anything
-+/* LIBC 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
-@@ -102,7 +102,7 @@
- * 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)
-+#if !defined(__GLIBC__) || defined(__USE_MISC) || defined (__USE_GNU)
- #define __UAPI_DEF_IN6_ADDR_ALT 0
- #else
- #define __UAPI_DEF_IN6_ADDR_ALT 1
-@@ -117,7 +117,7 @@
- #else
-
- /* Linux headers included first, and we must define everything
-- * we need. The expectation is that glibc will check the
-+ * we need. The expectation is that the libc will check the
- * __UAPI_DEF_* defines and adjust appropriately. */
- #define __UAPI_DEF_IN_ADDR 1
- #define __UAPI_DEF_IN_IPPROTO 1
-@@ -127,7 +127,7 @@
- #define __UAPI_DEF_IN_CLASS 1
-
- #define __UAPI_DEF_IN6_ADDR 1
--/* We unconditionally define the in6_addr macros and glibc must
-+/* We unconditionally define the in6_addr macros and the libc must
- * coordinate. */
- #define __UAPI_DEF_IN6_ADDR_ALT 1
- #define __UAPI_DEF_SOCKADDR_IN6 1
-@@ -149,7 +149,7 @@
- /* 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. */
--#else /* !defined(__GLIBC__) */
-+#else /* defined(__KERNEL__) */
-
- /* Definitions for if.h */
- #define __UAPI_DEF_IF_IFCONF 1
-@@ -182,6 +182,6 @@
- /* Definitions for xattr.h */
- #define __UAPI_DEF_XATTR 1
-
--#endif /* __GLIBC__ */
-+#endif /* __KERNEL__ */
-
- #endif /* _UAPI_LIBC_COMPAT_H */
diff --git a/target/linux/generic/pending-4.4/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch b/target/linux/generic/pending-4.4/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch
index 9065369040..21494b9256 100644
--- a/target/linux/generic/pending-4.4/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch
+++ b/target/linux/generic/pending-4.4/272-uapi-if_ether.h-prevent-redefinition-of-struct-ethhd.patch
@@ -1,18 +1,20 @@
-From fcbb6fed85ea9ff4feb4f1ebd4f0f235fdaf06b6 Mon Sep 17 00:00:00 2001
-From: David Heidelberger <david.heidelberger@ixit.cz>
+From 649affd04813c43e0a72886517fcfccd63230981 Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke@hauke-m.de>
Date: Mon, 29 Jun 2015 16:53:03 +0200
-Subject: [PATCH 3/3] uapi/if_ether.h: prevent redefinition of struct ethhdr
+Subject: uapi/if_ether.h: prevent redefinition of struct ethhdr
Musl provides its own ethhdr struct definition. Add a guard to prevent
its definition of the appropriate musl header has already been included.
-Signed-off-by: John Spencer <maillist-linux@barfooze.de>
-Tested-by: David Heidelberger <david.heidelberger@ixit.cz>
-Signed-off-by: Jonas Gorski <jogo@openwrt.org>
+glibc does not implement this header, but when glibc will implement this
+they can just define __UAPI_DEF_ETHHDR 0 to make it work with the
+kernel.
+
+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
---
- include/uapi/linux/if_ether.h | 3 +++
- include/uapi/linux/libc-compat.h | 11 +++++++++++
- 2 files changed, 14 insertions(+)
+ include/uapi/linux/if_ether.h | 3 +++
+ include/uapi/linux/libc-compat.h | 6 ++++++
+ 2 files changed, 9 insertions(+)
--- a/include/uapi/linux/if_ether.h
+++ b/include/uapi/linux/if_ether.h
@@ -40,28 +42,14 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
#endif /* _UAPI_LINUX_IF_ETHER_H */
--- a/include/uapi/linux/libc-compat.h
+++ b/include/uapi/linux/libc-compat.h
-@@ -85,6 +85,14 @@
+@@ -227,4 +227,10 @@
- #endif /* _NET_IF_H */
+ #endif /* __GLIBC__ */
-+/* musl defines the ethhdr struct itself in its netinet/if_ether.h.
-+ * Glibc just includes the kernel header and uses a different guard. */
-+#if defined(_NETINET_IF_ETHER_H)
-+#define __UAPI_DEF_ETHHDR 0
-+#else
++/* Definitions for if_ether.h */
++/* allow libcs like musl to deactivate this, glibc does not implement this. */
++#ifndef __UAPI_DEF_ETHHDR
+#define __UAPI_DEF_ETHHDR 1
+#endif
+
- /* Coordinate with libc netinet/in.h header. */
- #if defined(_NETINET_IN_H)
-
-@@ -161,6 +169,9 @@
- /* 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
-
-+/* Definitions for if_ether.h */
-+#define __UAPI_DEF_ETHHDR 1
-+
- /* Definitions for in.h */
- #define __UAPI_DEF_IN_ADDR 1
- #define __UAPI_DEF_IN_IPPROTO 1
+ #endif /* _UAPI_LIBC_COMPAT_H */
diff --git a/target/linux/generic/pending-4.9/270-uapi-kernel.h-glibc-specific-inclusion-of-sysinfo.h.patch b/target/linux/generic/pending-4.9/270-uapi-kernel.h-glibc-specific-inclusion-of-sysinfo.h.patch
deleted file mode 100644
index 9c30fa81bf..0000000000
--- a/target/linux/generic/pending-4.9/270-uapi-kernel.h-glibc-specific-inclusion-of-sysinfo.h.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From: David Heidelberger <david.heidelberger@ixit.cz>
-Subject: uapi/kernel.h: glibc specific inclusion of sysinfo.h
-
-including sysinfo.h from kernel.h makes no sense whatsoever,
-but removing it breaks glibc's userspace header,
-which includes kernel.h instead of sysinfo.h from their sys/sysinfo.h.
-this seems to be a historical mistake.
-on musl, including any header that uses kernel.h directly or indirectly
-plus sys/sysinfo.h will produce a compile error due to redefinition of
-struct sysinfo from sys/sysinfo.h.
-so for now, only include it on glibc or when including from kernel
-in order not to break their headers.
-
-Signed-off-by: John Spencer <maillist-linux@barfooze.de>
-Signed-off-by: David Heidelberger <david.heidelberger@ixit.cz>
-Signed-off-by: Jonas Gorski <jogo@openwrt.org>
----
- include/uapi/linux/kernel.h | 2 ++
- 1 file changed, 2 insertions(+)
-
---- a/include/uapi/linux/kernel.h
-+++ b/include/uapi/linux/kernel.h
-@@ -1,7 +1,9 @@
- #ifndef _UAPI_LINUX_KERNEL_H
- #define _UAPI_LINUX_KERNEL_H
-
-+#if defined(__KERNEL__) || defined( __GLIBC__)
- #include <linux/sysinfo.h>
-+#endif
-
- /*
- * 'kernel.h' contains some often-used function prototypes etc
diff --git a/target/linux/generic/pending-4.9/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch b/target/linux/generic/pending-4.9/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch
deleted file mode 100644
index a4aa1567e1..0000000000
--- a/target/linux/generic/pending-4.9/271-uapi-libc-compat.h-do-not-rely-on-__GLIBC__.patch
+++ /dev/null
@@ -1,105 +0,0 @@
-From: David Heidelberger <david.heidelberger@ixit.cz>
-Subject: uapi/libc-compat.h: do not rely on __GLIBC__
-
-Musl provides the same structs as glibc, but does not provide a define to
-allow its detection. Since the absence of __GLIBC__ also can mean that it
-is included from the kernel, change the __GLIBC__ detection to
-!__KERNEL__, which should always be true when included from userspace.
-
-Signed-off-by: John Spencer <maillist-linux@barfooze.de>
-Tested-by: David Heidelberger <david.heidelberger@ixit.cz>
-Signed-off-by: Jonas Gorski <jogo@openwrt.org>
----
- include/uapi/linux/libc-compat.h | 18 +++++++++---------
- 1 file changed, 9 insertions(+), 9 deletions(-)
-
---- a/include/uapi/linux/libc-compat.h
-+++ b/include/uapi/linux/libc-compat.h
-@@ -48,13 +48,13 @@
- #ifndef _UAPI_LIBC_COMPAT_H
- #define _UAPI_LIBC_COMPAT_H
-
--/* We have included glibc headers... */
--#if defined(__GLIBC__)
-+/* We have included libc headers... */
-+#if !defined(__KERNEL__)
-
--/* Coordinate with glibc net/if.h header. */
--#if defined(_NET_IF_H) && defined(__USE_MISC)
-+/* Coordinate with libc net/if.h header. */
-+#if defined(_NET_IF_H) && (!defined(__GLIBC__) || defined(__USE_MISC))
-
--/* GLIBC headers included first so don't define anything
-+/* LIBC headers included first so don't define anything
- * that would already be defined. */
-
- #define __UAPI_DEF_IF_IFCONF 0
-@@ -65,7 +65,11 @@
- #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
-+#ifdef __GLIBC__
- #define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1
-+#else
-+#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 0
-+#endif
- #endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */
-
- #else /* _NET_IF_H */
-@@ -85,10 +89,10 @@
-
- #endif /* _NET_IF_H */
-
--/* Coordinate with glibc netinet/in.h header. */
-+/* Coordinate with libc netinet/in.h header. */
- #if defined(_NETINET_IN_H)
-
--/* GLIBC headers included first so don't define anything
-+/* LIBC 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
-@@ -102,7 +106,7 @@
- * 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)
-+#if !defined(__GLIBC__) || defined(__USE_MISC) || defined (__USE_GNU)
- #define __UAPI_DEF_IN6_ADDR_ALT 0
- #else
- #define __UAPI_DEF_IN6_ADDR_ALT 1
-@@ -117,7 +121,7 @@
- #else
-
- /* Linux headers included first, and we must define everything
-- * we need. The expectation is that glibc will check the
-+ * we need. The expectation is that the libc will check the
- * __UAPI_DEF_* defines and adjust appropriately. */
- #define __UAPI_DEF_IN_ADDR 1
- #define __UAPI_DEF_IN_IPPROTO 1
-@@ -127,7 +131,7 @@
- #define __UAPI_DEF_IN_CLASS 1
-
- #define __UAPI_DEF_IN6_ADDR 1
--/* We unconditionally define the in6_addr macros and glibc must
-+/* We unconditionally define the in6_addr macros and the libc must
- * coordinate. */
- #define __UAPI_DEF_IN6_ADDR_ALT 1
- #define __UAPI_DEF_SOCKADDR_IN6 1
-@@ -168,7 +172,7 @@
- /* 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. */
--#else /* !defined(__GLIBC__) */
-+#else /* defined(__KERNEL__) */
-
- /* Definitions for if.h */
- #define __UAPI_DEF_IF_IFCONF 1
-@@ -208,6 +212,6 @@
- /* Definitions for xattr.h */
- #define __UAPI_DEF_XATTR 1
-
--#endif /* __GLIBC__ */
-+#endif /* __KERNEL__ */
-
- #endif /* _UAPI_LIBC_COMPAT_H */
diff --git a/toolchain/musl/common.mk b/toolchain/musl/common.mk
index a94a475571..8350197a9f 100644
--- a/toolchain/musl/common.mk
+++ b/toolchain/musl/common.mk
@@ -9,7 +9,7 @@ include $(INCLUDE_DIR)/target.mk
PKG_NAME:=musl
PKG_VERSION:=1.1.18
-PKG_RELEASE=1
+PKG_RELEASE=2
PKG_SOURCE_PROTO:=git
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
diff --git a/toolchain/musl/patches/010-kernel-suppress-some-more-Linux-uapi-definitions.patch b/toolchain/musl/patches/010-kernel-suppress-some-more-Linux-uapi-definitions.patch
new file mode 100644
index 0000000000..78b487faeb
--- /dev/null
+++ b/toolchain/musl/patches/010-kernel-suppress-some-more-Linux-uapi-definitions.patch
@@ -0,0 +1,59 @@
+From 8e85d2c268000b51cc690f3a55a820d8f8a6c0bc Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke@hauke-m.de>
+Date: Thu, 22 Jun 2017 22:04:28 +0200
+Subject: [PATCH] Add additional uapi guards for Linux kernel header files
+
+With Linux kernel 4.15 it will be possible to guard more parts of the
+Linux header files from a libc. Make use of this in musl to guard all
+the structures and other definitions from the Linux header files which
+are also defined by the header files provided by musl. This will make
+musl compile with the unmodified Linux kernel user space headers.
+
+This extends the definitions done in commit 04983f227238 ("make
+netinet/in.h suppress clashing definitions from kernel headers")
+
+The needed patches were recently accepted for Linux 4.15:
+https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c0bace798436bca0fdc221ff61143f1376a9c3de
+https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=6926e041a8920c8ec27e4e155efa760aa01551fd
+---
+ include/net/if.h | 7 +++++++
+ include/netinet/if_ether.h | 1 +
+ include/sys/xattr.h | 2 ++
+ 3 files changed, 10 insertions(+)
+
+--- a/include/net/if.h
++++ b/include/net/if.h
+@@ -125,6 +125,13 @@ struct ifconf {
+ #define ifc_req ifc_ifcu.ifcu_req
+ #define _IOT_ifconf _IOT(_IOTS(struct ifconf),1,0,0,0,0)
+
++#define __UAPI_DEF_IF_IFCONF 0
++#define __UAPI_DEF_IF_IFMAP 0
++#define __UAPI_DEF_IF_IFNAMSIZ 0
++#define __UAPI_DEF_IF_IFREQ 0
++#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 0
++#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 0
++
+ #endif
+
+ #ifdef __cplusplus
+--- a/include/netinet/if_ether.h
++++ b/include/netinet/if_ether.h
+@@ -133,5 +133,6 @@ do { \
+ (enaddr)[5] = ((uint8_t *)ipaddr)[3]; \
+ } while(0)
+
++#define __UAPI_DEF_ETHHDR 0
+
+ #endif
+--- a/include/sys/xattr.h
++++ b/include/sys/xattr.h
+@@ -24,6 +24,8 @@ int removexattr(const char *, const char
+ int lremovexattr(const char *, const char *);
+ int fremovexattr(int, const char *);
+
++#define __UAPI_DEF_XATTR 0
++
+ #ifdef __cplusplus
+ }
+ #endif
diff --git a/toolchain/musl/patches/400-Add-format-attribute-to-some-function-declarations.patch b/toolchain/musl/patches/400-Add-format-attribute-to-some-function-declarations.patch
index c495d67e08..67fedae30a 100644
--- a/toolchain/musl/patches/400-Add-format-attribute-to-some-function-declarations.patch
+++ b/toolchain/musl/patches/400-Add-format-attribute-to-some-function-declarations.patch
@@ -45,11 +45,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+#else
+#define __fp(x, y)
+#endif
-
--_Noreturn void err(int, const char *, ...);
--_Noreturn void verr(int, const char *, va_list);
--_Noreturn void errx(int, const char *, ...);
--_Noreturn void verrx(int, const char *, va_list);
++
+void warn(const char *, ...) __fp(1, 2);
+void vwarn(const char *, va_list) __fp(1, 0);
+void warnx(const char *, ...) __fp(1, 2);
@@ -59,7 +55,11 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+_Noreturn void verr(int, const char *, va_list) __fp(2, 0);
+_Noreturn void errx(int, const char *, ...) __fp(2, 3);
+_Noreturn void verrx(int, const char *, va_list) __fp(2, 0);
-+
+
+-_Noreturn void err(int, const char *, ...);
+-_Noreturn void verr(int, const char *, va_list);
+-_Noreturn void errx(int, const char *, ...);
+-_Noreturn void verrx(int, const char *, va_list);
+#undef __fp
#ifdef __cplusplus