include $(TOPDIR)/rules.mk
PKG_NAME:=iproute2
-PKG_VERSION:=4.4.0
-PKG_RELEASE:=10
+PKG_VERSION:=4.11.0
+PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
PKG_SOURCE_URL:=@KERNEL/linux/utils/net/iproute2
-PKG_HASH:=bc91c367288a19f78ef800cd6840363be1f22da8436fbae88e1a7250490d6514
+PKG_HASH:=72671028bda696d0cb8f48ec8e702581c3a501caeed33eec3a81d7041cbc8026
PKG_BUILD_PARALLEL:=1
+PKG_BUILD_DEPENDS:=iptables
PKG_LICENSE:=GPL-2.0
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
TITLE:=Network statistics utility
endef
+define Package/devlink
+$(call Package/iproute2/Default)
+ TITLE:=Network devlink utility
+ DEPENDS:=+libmnl
+endef
+
ifeq ($(BUILD_VARIANT),tiny)
IP_CONFIG_TINY:=y
endif
> $(PKG_BUILD_DIR)/include/SNAPSHOT.h
endef
-TARGET_CFLAGS += -DHAVE_SETNS
TARGET_CFLAGS += -ffunction-sections -fdata-sections
MAKE_FLAGS += \
- EXTRA_CCOPTS="$(TARGET_CFLAGS) -I../include -I$(STAGING_DIR)/usr/include/libnl-tiny" \
+ EXTRA_CCOPTS="-I$(STAGING_DIR)/usr/include/libnl-tiny" \
KERNEL_INCLUDE="$(LINUX_DIR)/include" \
SHARED_LIBS="" \
LDFLAGS="$(TARGET_LDFLAGS) -Wl,--gc-sections" \
IP_CONFIG_TINY=$(IP_CONFIG_TINY) \
+ IPT_LIB_DIR=/usr/lib/iptables \
FPIC="$(FPIC)"
define Build/Compile
$(INSTALL_BIN) $(PKG_BUILD_DIR)/misc/nstat $(1)/usr/sbin/
endef
+define Package/devlink/install
+ $(INSTALL_DIR) $(1)/usr/sbin
+ $(INSTALL_BIN) $(PKG_BUILD_DIR)/devlink/devlink $(1)/usr/sbin/
+endef
+
$(eval $(call BuildPackage,ip-tiny))
$(eval $(call BuildPackage,ip-full))
$(eval $(call BuildPackage,tc))
$(eval $(call BuildPackage,ip-bridge))
$(eval $(call BuildPackage,ss))
$(eval $(call BuildPackage,nstat))
+$(eval $(call BuildPackage,devlink))
--- /dev/null
+++ b/Config
-@@ -0,0 +1,4 @@
+@@ -0,0 +1,5 @@
+# Fixed config to disable ATM support even if present on host system
++IP_CONFIG_SETNS:=y
+TC_CONFIG_ATM:=n
-+TC_CONFIG_ACTION_GACT=y
-+TC_CONFIG_ACTION_PROB=y
++TC_CONFIG_XT:=y
++HAVE_MNL:=y
--- a/ip/ipxfrm.c
+++ b/ip/ipxfrm.c
-@@ -470,7 +470,6 @@ void xfrm_selector_print(struct xfrm_sel
+@@ -465,7 +465,6 @@ void xfrm_selector_print(struct xfrm_sel
switch (sel->proto) {
case IPPROTO_TCP:
case IPPROTO_UDP:
case IPPROTO_DCCP:
default: /* XXX */
if (sel->sport_mask)
-@@ -1341,7 +1340,6 @@ static int xfrm_selector_upspec_parse(st
+@@ -1321,7 +1320,6 @@ static int xfrm_selector_upspec_parse(st
switch (sel->proto) {
case IPPROTO_TCP:
case IPPROTO_UDP:
--- a/Makefile
+++ b/Makefile
-@@ -41,7 +41,7 @@ WFLAGS += -Wmissing-declarations -Wold-s
+@@ -52,7 +52,7 @@ WFLAGS += -Wmissing-declarations -Wold-s
CFLAGS := $(WFLAGS) $(CCOPTS) -I../include $(DEFINES) $(CFLAGS)
YACCFLAGS = -d -t -v
--SUBDIRS=lib ip tc bridge misc netem genl tipc man
-+SUBDIRS=lib ip tc bridge misc genl tipc man
+-SUBDIRS=lib ip tc bridge misc netem genl tipc devlink man
++SUBDIRS=lib ip tc bridge misc genl tipc devlink man
LIBNETLINK=../lib/libnetlink.a ../lib/libutil.a
LDLIBS += $(LIBNETLINK)
+++ /dev/null
---- a/include/iptables_common.h
-+++ b/include/iptables_common.h
-@@ -2,6 +2,8 @@
- #define _IPTABLES_COMMON_H
- /* Shared definitions between ipv4 and ipv6. */
-
-+#include <stdint.h>
-+
- enum exittype {
- OTHER_PROBLEM = 1,
- PARAMETER_PROBLEM,
-@@ -43,9 +45,9 @@ extern char *lib_dir;
- extern void init_extensions(void);
- #endif
-
--#define __be32 u_int32_t
--#define __le32 u_int32_t
--#define __be16 u_int16_t
--#define __le16 u_int16_t
-+#define __be32 uint32_t
-+#define __le32 uint32_t
-+#define __be16 uint16_t
-+#define __le16 uint16_t
-
- #endif /*_IPTABLES_COMMON_H*/
---- a/include/netinet/tcp.h
-+++ /dev/null
-@@ -1,231 +0,0 @@
--/*
-- * Copyright (c) 1982, 1986, 1993
-- * The Regents of the University of California. All rights reserved.
-- *
-- * Redistribution and use in source and binary forms, with or without
-- * modification, are permitted provided that the following conditions
-- * are met:
-- * 1. Redistributions of source code must retain the above copyright
-- * notice, this list of conditions and the following disclaimer.
-- * 2. Redistributions in binary form must reproduce the above copyright
-- * notice, this list of conditions and the following disclaimer in the
-- * documentation and/or other materials provided with the distribution.
-- * 4. Neither the name of the University nor the names of its contributors
-- * may be used to endorse or promote products derived from this software
-- * without specific prior written permission.
-- *
-- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-- * SUCH DAMAGE.
-- *
-- * @(#)tcp.h 8.1 (Berkeley) 6/10/93
-- */
--
--#ifndef _NETINET_TCP_H
--#define _NETINET_TCP_H 1
--
--#include <features.h>
--
--/*
-- * User-settable options (used with setsockopt).
-- */
--#define TCP_NODELAY 1 /* Don't delay send to coalesce packets */
--#define TCP_MAXSEG 2 /* Set maximum segment size */
--#define TCP_CORK 3 /* Control sending of partial frames */
--#define TCP_KEEPIDLE 4 /* Start keeplives after this period */
--#define TCP_KEEPINTVL 5 /* Interval between keepalives */
--#define TCP_KEEPCNT 6 /* Number of keepalives before death */
--#define TCP_SYNCNT 7 /* Number of SYN retransmits */
--#define TCP_LINGER2 8 /* Life time of orphaned FIN-WAIT-2 state */
--#define TCP_DEFER_ACCEPT 9 /* Wake up listener only when data arrive */
--#define TCP_WINDOW_CLAMP 10 /* Bound advertised window */
--#define TCP_INFO 11 /* Information about this connection. */
--#define TCP_QUICKACK 12 /* Bock/reenable quick ACKs. */
--#define TCP_CONGESTION 13 /* Congestion control algorithm. */
--
--#ifdef __USE_MISC
--# include <sys/types.h>
--
--# ifdef __FAVOR_BSD
--typedef u_int32_t tcp_seq;
--/*
-- * TCP header.
-- * Per RFC 793, September, 1981.
-- */
--struct tcphdr
-- {
-- u_int16_t th_sport; /* source port */
-- u_int16_t th_dport; /* destination port */
-- tcp_seq th_seq; /* sequence number */
-- tcp_seq th_ack; /* acknowledgement number */
--# if __BYTE_ORDER == __LITTLE_ENDIAN
-- u_int8_t th_x2:4; /* (unused) */
-- u_int8_t th_off:4; /* data offset */
--# endif
--# if __BYTE_ORDER == __BIG_ENDIAN
-- u_int8_t th_off:4; /* data offset */
-- u_int8_t th_x2:4; /* (unused) */
--# endif
-- u_int8_t th_flags;
--# define TH_FIN 0x01
--# define TH_SYN 0x02
--# define TH_RST 0x04
--# define TH_PUSH 0x08
--# define TH_ACK 0x10
--# define TH_URG 0x20
-- u_int16_t th_win; /* window */
-- u_int16_t th_sum; /* checksum */
-- u_int16_t th_urp; /* urgent pointer */
--};
--
--# else /* !__FAVOR_BSD */
--struct tcphdr
-- {
-- u_int16_t source;
-- u_int16_t dest;
-- u_int32_t seq;
-- u_int32_t ack_seq;
--# if __BYTE_ORDER == __LITTLE_ENDIAN
-- u_int16_t res1:4;
-- u_int16_t doff:4;
-- u_int16_t fin:1;
-- u_int16_t syn:1;
-- u_int16_t rst:1;
-- u_int16_t psh:1;
-- u_int16_t ack:1;
-- u_int16_t urg:1;
-- u_int16_t res2:2;
--# elif __BYTE_ORDER == __BIG_ENDIAN
-- u_int16_t doff:4;
-- u_int16_t res1:4;
-- u_int16_t res2:2;
-- u_int16_t urg:1;
-- u_int16_t ack:1;
-- u_int16_t psh:1;
-- u_int16_t rst:1;
-- u_int16_t syn:1;
-- u_int16_t fin:1;
--# else
--# error "Adjust your <bits/endian.h> defines"
--# endif
-- u_int16_t window;
-- u_int16_t check;
-- u_int16_t urg_ptr;
--};
--# endif /* __FAVOR_BSD */
--
--enum
--{
-- TCP_ESTABLISHED = 1,
-- TCP_SYN_SENT,
-- TCP_SYN_RECV,
-- TCP_FIN_WAIT1,
-- TCP_FIN_WAIT2,
-- TCP_TIME_WAIT,
-- TCP_CLOSE,
-- TCP_CLOSE_WAIT,
-- TCP_LAST_ACK,
-- TCP_LISTEN,
-- TCP_CLOSING /* now a valid state */
--};
--
--# define TCPOPT_EOL 0
--# define TCPOPT_NOP 1
--# define TCPOPT_MAXSEG 2
--# define TCPOLEN_MAXSEG 4
--# define TCPOPT_WINDOW 3
--# define TCPOLEN_WINDOW 3
--# define TCPOPT_SACK_PERMITTED 4 /* Experimental */
--# define TCPOLEN_SACK_PERMITTED 2
--# define TCPOPT_SACK 5 /* Experimental */
--# define TCPOPT_TIMESTAMP 8
--# define TCPOLEN_TIMESTAMP 10
--# define TCPOLEN_TSTAMP_APPA (TCPOLEN_TIMESTAMP+2) /* appendix A */
--
--# define TCPOPT_TSTAMP_HDR \
-- (TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_TIMESTAMP<<8|TCPOLEN_TIMESTAMP)
--
--/*
-- * Default maximum segment size for TCP.
-- * With an IP MSS of 576, this is 536,
-- * but 512 is probably more convenient.
-- * This should be defined as MIN(512, IP_MSS - sizeof (struct tcpiphdr)).
-- */
--# define TCP_MSS 512
--
--# define TCP_MAXWIN 65535 /* largest value for (unscaled) window */
--
--# define TCP_MAX_WINSHIFT 14 /* maximum window shift */
--
--# define SOL_TCP 6 /* TCP level */
--
--
--# define TCPI_OPT_TIMESTAMPS 1
--# define TCPI_OPT_SACK 2
--# define TCPI_OPT_WSCALE 4
--# define TCPI_OPT_ECN 8
--# define TCPI_OPT_ECN_SEEN 16
--
--/* Values for tcpi_state. */
--enum tcp_ca_state
--{
-- TCP_CA_Open = 0,
-- TCP_CA_Disorder = 1,
-- TCP_CA_CWR = 2,
-- TCP_CA_Recovery = 3,
-- TCP_CA_Loss = 4
--};
--
--struct tcp_info
--{
-- u_int8_t tcpi_state;
-- u_int8_t tcpi_ca_state;
-- u_int8_t tcpi_retransmits;
-- u_int8_t tcpi_probes;
-- u_int8_t tcpi_backoff;
-- u_int8_t tcpi_options;
-- u_int8_t tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;
--
-- u_int32_t tcpi_rto;
-- u_int32_t tcpi_ato;
-- u_int32_t tcpi_snd_mss;
-- u_int32_t tcpi_rcv_mss;
--
-- u_int32_t tcpi_unacked;
-- u_int32_t tcpi_sacked;
-- u_int32_t tcpi_lost;
-- u_int32_t tcpi_retrans;
-- u_int32_t tcpi_fackets;
--
-- /* Times. */
-- u_int32_t tcpi_last_data_sent;
-- u_int32_t tcpi_last_ack_sent; /* Not remembered, sorry. */
-- u_int32_t tcpi_last_data_recv;
-- u_int32_t tcpi_last_ack_recv;
--
-- /* Metrics. */
-- u_int32_t tcpi_pmtu;
-- u_int32_t tcpi_rcv_ssthresh;
-- u_int32_t tcpi_rtt;
-- u_int32_t tcpi_rttvar;
-- u_int32_t tcpi_snd_ssthresh;
-- u_int32_t tcpi_snd_cwnd;
-- u_int32_t tcpi_advmss;
-- u_int32_t tcpi_reordering;
-- u_int32_t tcpi_rcv_rtt;
-- u_int32_t tcpi_rcv_space;
-- u_int32_t tcpi_total_retrans;
--
--};
--
--#endif /* Misc. */
--
--#endif /* netinet/tcp.h */
---- a/include/iptables.h
-+++ b/include/iptables.h
-@@ -20,7 +20,7 @@ struct ipt_get_revision
- {
- char name[IPT_FUNCTION_MAXNAMELEN-1];
-
-- u_int8_t revision;
-+ uint8_t revision;
- };
- #endif /* IPT_SO_GET_REVISION_MATCH Old kernel source */
-
-@@ -39,7 +39,7 @@ struct iptables_match
- ipt_chainlabel name;
-
- /* Revision of match (0 by default). */
-- u_int8_t revision;
-+ uint8_t revision;
-
- const char *version;
-
-@@ -92,7 +92,7 @@ struct iptables_target
- ipt_chainlabel name;
-
- /* Revision of target (0 by default). */
-- u_int8_t revision;
-+ uint8_t revision;
-
- const char *version;
-
-@@ -153,7 +153,7 @@ extern char *mask_to_dotted(const struct
-
- extern void parse_hostnetworkmask(const char *name, struct in_addr **addrpp,
- struct in_addr *maskp, unsigned int *naddrs);
--extern u_int16_t parse_protocol(const char *s);
-+extern uint16_t parse_protocol(const char *s);
-
- extern int do_command(int argc, char *argv[], char **table,
- iptc_handle_t *handle);
---- a/lib/dnet_ntop.c
-+++ b/lib/dnet_ntop.c
-@@ -1,24 +1,25 @@
- #include <errno.h>
- #include <string.h>
-+#include <stdint.h>
- #include <sys/types.h>
- #include <netinet/in.h>
-
- #include "utils.h"
-
--static __inline__ u_int16_t dn_ntohs(u_int16_t addr)
-+static __inline__ uint16_t dn_ntohs(uint16_t addr)
- {
- union {
-- u_int8_t byte[2];
-- u_int16_t word;
-+ uint8_t byte[2];
-+ uint16_t word;
- } u;
-
- u.word = addr;
-- return ((u_int16_t)u.byte[0]) | (((u_int16_t)u.byte[1]) << 8);
-+ return ((uint16_t)u.byte[0]) | (((uint16_t)u.byte[1]) << 8);
- }
-
--static __inline__ int do_digit(char *str, u_int16_t *addr, u_int16_t scale, size_t *pos, size_t len, int *started)
-+static __inline__ int do_digit(char *str, uint16_t *addr, uint16_t scale, size_t *pos, size_t len, int *started)
- {
-- u_int16_t tmp = *addr / scale;
-+ uint16_t tmp = *addr / scale;
-
- if (*pos == len)
- return 1;
-@@ -36,7 +37,7 @@ static __inline__ int do_digit(char *str
-
- static const char *dnet_ntop1(const struct dn_naddr *dna, char *str, size_t len)
- {
-- u_int16_t addr, area;
-+ uint16_t addr, area;
- size_t pos = 0;
- int started = 0;
-
---- a/lib/dnet_pton.c
-+++ b/lib/dnet_pton.c
-@@ -1,23 +1,24 @@
- #include <errno.h>
- #include <string.h>
-+#include <stdint.h>
- #include <sys/types.h>
- #include <netinet/in.h>
-
- #include "utils.h"
-
--static __inline__ u_int16_t dn_htons(u_int16_t addr)
-+static __inline__ uint16_t dn_htons(uint16_t addr)
- {
- union {
-- u_int8_t byte[2];
-- u_int16_t word;
-+ uint8_t byte[2];
-+ uint16_t word;
- } u;
-
- u.word = addr;
-- return ((u_int16_t)u.byte[0]) | (((u_int16_t)u.byte[1]) << 8);
-+ return ((uint16_t)u.byte[0]) | (((uint16_t)u.byte[1]) << 8);
- }
-
-
--static int dnet_num(const char *src, u_int16_t * dst)
-+static int dnet_num(const char *src, uint16_t * dst)
- {
- int rv = 0;
- int tmp;
-@@ -38,9 +39,9 @@ static int dnet_num(const char *src, u_i
-
- static int dnet_pton1(const char *src, struct dn_naddr *dna)
- {
-- u_int16_t addr;
-- u_int16_t area = 0;
-- u_int16_t node = 0;
-+ uint16_t addr;
-+ uint16_t area = 0;
-+ uint16_t node = 0;
- int pos;
-
- pos = dnet_num(src, &area);
---- a/include/libiptc/ipt_kernel_headers.h
-+++ b/include/libiptc/ipt_kernel_headers.h
-@@ -5,7 +5,7 @@
-
- #include <limits.h>
-
--#if defined(__GLIBC__) && __GLIBC__ == 2
-+#if 1
- #include <netinet/ip.h>
- #include <netinet/in.h>
- #include <netinet/ip_icmp.h>
--- a/tc/q_fifo.c
+++ b/tc/q_fifo.c
-@@ -98,5 +98,6 @@ struct qdisc_util pfifo_head_drop_qdisc_
+@@ -97,5 +97,6 @@ struct qdisc_util pfifo_head_drop_qdisc_
extern int prio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt);
struct qdisc_util pfifo_fast_qdisc_util = {
.id = "pfifo_fast",
--- a/Makefile
+++ b/Makefile
-@@ -34,7 +34,7 @@ HOSTCC = gcc
+@@ -45,7 +45,7 @@ HOSTCC ?= $(CC)
DEFINES += -D_GNU_SOURCE
# Turn on transparent support for LFS
DEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
+++ /dev/null
---- a/lib/namespace.c
-+++ b/lib/namespace.c
-@@ -10,6 +10,7 @@
- #include <fcntl.h>
- #include <dirent.h>
- #include <limits.h>
-+#include <sys/param.h>
-
- #include "utils.h"
- #include "namespace.h"
---- a/lib/rt_names.c
-+++ b/lib/rt_names.c
-@@ -18,6 +18,7 @@
- #include <sys/time.h>
- #include <sys/socket.h>
- #include <dirent.h>
-+#include <limits.h>
-
- #include <asm/types.h>
- #include <linux/rtnetlink.h>
--- /dev/null
+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/linux/libc-compat.h
++++ b/include/linux/libc-compat.h
+@@ -48,13 +48,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
+@@ -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 /* _LIBC_COMPAT_H */
--- /dev/null
+From fcbb6fed85ea9ff4feb4f1ebd4f0f235fdaf06b6 Mon Sep 17 00:00:00 2001
+From: David Heidelberger <david.heidelberger@ixit.cz>
+Date: Mon, 29 Jun 2015 16:53:03 +0200
+Subject: [PATCH 3/3] 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>
+---
+ include/uapi/linux/if_ether.h | 3 +++
+ include/uapi/linux/libc-compat.h | 11 +++++++++++
+ 2 files changed, 14 insertions(+)
+
+--- a/include/linux/if_ether.h
++++ b/include/linux/if_ether.h
+@@ -22,6 +22,7 @@
+ #define _LINUX_IF_ETHER_H
+
+ #include <linux/types.h>
++#include <linux/libc-compat.h>
+
+ /*
+ * IEEE 802.3 Ethernet magic constants. The frame sizes omit the preamble
+@@ -142,11 +143,13 @@
+ * This is an Ethernet frame header.
+ */
+
++#if __UAPI_DEF_ETHHDR
+ struct ethhdr {
+ unsigned char h_dest[ETH_ALEN]; /* destination eth addr */
+ unsigned char h_source[ETH_ALEN]; /* source ether addr */
+ __be16 h_proto; /* packet type ID field */
+ } __attribute__((packed));
++#endif
+
+
+ #endif /* _LINUX_IF_ETHER_H */
+--- a/include/linux/libc-compat.h
++++ b/include/linux/libc-compat.h
+@@ -89,6 +89,14 @@
+
+ #endif /* _NET_IF_H */
+
++/* 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)
+
+@@ -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
+--- a/ip/iplink_bridge.c
++++ b/ip/iplink_bridge.c
+@@ -14,8 +14,8 @@
+ #include <string.h>
+ #include <netinet/in.h>
+ #include <linux/if_link.h>
+-#include <linux/if_bridge.h>
+ #include <netinet/ether.h>
++#include <linux/if_bridge.h>
+ #include <net/if.h>
+
+ #include "rt_names.h"
--- a/ip/Makefile
+++ b/ip/Makefile
-@@ -17,6 +17,13 @@ ifeq ($(IP_CONFIG_SETNS),y)
+@@ -19,6 +19,13 @@ ifeq ($(IP_CONFIG_SETNS),y)
CFLAGS += -DHAVE_SETNS
endif
ALLOBJ=$(IPOBJ) $(RTMONOBJ)
SCRIPTS=ifcfg rtpr routel routef
TARGETS=ip rtmon
-@@ -44,7 +51,7 @@ else
+@@ -48,7 +55,7 @@ else
ip: static-syms.o
static-syms.o: static-syms.h
sed -n '/'$$s'[^ ]* =/{s:.* \([^ ]*'$$s'[^ ]*\) .*:extern char \1[] __attribute__((weak)); if (!strcmp(sym, "\1")) return \1;:;p}' $$files ; \
--- a/ip/ip.c
+++ b/ip/ip.c
-@@ -73,30 +73,42 @@ static const struct cmd {
+@@ -74,32 +74,44 @@ static const struct cmd {
int (*func)(int argc, char **argv);
} cmds[] = {
{ "address", do_ipaddr },
{ "l2tp", do_ipl2tp },
{ "fou", do_ipfou },
+#endif
+ { "ila", do_ipila },
+ { "macsec", do_ipmacsec },
{ "tunnel", do_iptunnel },
{ "tunl", do_iptunnel },
+#ifndef IPROUTE2_TINY
+#ifndef IPROUTE2_TINY
{ "netconf", do_ipnetconf },
+#endif
+ { "vrf", do_ipvrf},
{ "help", do_help },
{ 0 }
- };
--- a/lib/utils.c
+++ b/lib/utils.c
-@@ -710,6 +710,7 @@ const char *rt_addr_n2a(int af, int len,
+@@ -777,6 +777,7 @@ const char *rt_addr_n2a_r(int af, int le
return inet_ntop(af, addr, buf, buflen);
case AF_MPLS:
return mpls_ntop(af, addr, buf, buflen);
case AF_IPX:
return ipx_ntop(af, addr, buf, buflen);
case AF_DECnet:
-@@ -718,6 +719,7 @@ const char *rt_addr_n2a(int af, int len,
+@@ -786,6 +787,7 @@ const char *rt_addr_n2a_r(int af, int le
memcpy(dna.a_addr, addr, 2);
return dnet_ntop(af, &dna, buf, buflen);
}
--- a/include/linux/fib_rules.h
+++ b/include/linux/fib_rules.h
-@@ -64,6 +64,10 @@ enum {
+@@ -72,6 +72,10 @@ enum {
FR_ACT_BLACKHOLE, /* Drop without notification */
FR_ACT_UNREACHABLE, /* Drop with ENETUNREACH */
FR_ACT_PROHIBIT, /* Drop with EACCES */
--- a/include/linux/rtnetlink.h
+++ b/include/linux/rtnetlink.h
-@@ -210,6 +210,7 @@ enum {
+@@ -215,6 +215,7 @@ enum {
RTN_THROW, /* Not in this table */
RTN_NAT, /* Translate this address */
RTN_XRESOLVE, /* Use external resolver */
+++ /dev/null
---- a/include/linux/if_bridge.h
-+++ b/include/linux/if_bridge.h
-@@ -15,7 +15,6 @@
-
- #include <linux/types.h>
- #include <linux/if_ether.h>
--#include <linux/in6.h>
-
- #define SYSFS_BRIDGE_ATTR "bridge"
- #define SYSFS_BRIDGE_FDB "brforward"
+++ /dev/null
---- a/include/linux/in.h
-+++ b/include/linux/in.h
-@@ -15,6 +15,7 @@
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- */
-+#ifndef _NETINET_IN_H
- #ifndef _LINUX_IN_H
- #define _LINUX_IN_H
-
-@@ -297,3 +298,4 @@ struct sockaddr_in {
-
-
- #endif /* _LINUX_IN_H */
-+#endif /* _NETINET_IN_H */
---- a/include/linux/in6.h
-+++ b/include/linux/in6.h
-@@ -18,6 +18,7 @@
- * 2 of the License, or (at your option) any later version.
- */
-
-+#ifndef _NETINET_IN_H
- #ifndef _LINUX_IN6_H
- #define _LINUX_IN6_H
-
-@@ -291,3 +292,4 @@ struct in6_flowlabel_req {
- * MRT6_MAX
- */
- #endif /* _LINUX_IN6_H */
-+#endif /* _NETINET_IN_H */
-diff --git a/include/linux/pkt_sched.h b/include/linux/pkt_sched.h
-index 8d2530d..c55a9a8 100644
--- a/include/linux/pkt_sched.h
+++ b/include/linux/pkt_sched.h
-@@ -850,4 +850,60 @@ struct tc_pie_xstats {
+@@ -863,4 +863,60 @@ struct tc_pie_xstats {
__u32 maxq; /* maximum queue size */
__u32 ecn_mark; /* packets marked with ecn*/
};
+};
+
#endif
-diff --git a/tc/Makefile b/tc/Makefile
-index 56acbaa..d421b8e 100644
--- a/tc/Makefile
+++ b/tc/Makefile
-@@ -63,6 +63,7 @@ TCMODULES += q_codel.o
+@@ -67,6 +67,7 @@ TCMODULES += q_codel.o
TCMODULES += q_fq_codel.o
TCMODULES += q_fq.o
TCMODULES += q_pie.o
+TCMODULES += q_cake.o
TCMODULES += q_hhf.o
+ TCMODULES += q_clsact.o
TCMODULES += e_bpf.o
-
-diff --git a/tc/q_cake.c b/tc/q_cake.c
-new file mode 100644
-index 0000000..acbe56c
--- /dev/null
+++ b/tc/q_cake.c
@@ -0,0 +1,692 @@
+++ /dev/null
-From c44003f7e7254ac972eaa1b22a686471ea4ce2d7 Mon Sep 17 00:00:00 2001
-From: Liping Zhang <liping.zhang@spreadtrum.com>
-Date: Tue, 20 Sep 2016 02:09:02 -0700
-Subject: [PATCH] ipmonitor: fix ip monitor can't work when NET_NS is not
- enabled
-
-In ip monitor, netns_map_init will check getnsid is supported or not.
-But when /proc/self/ns/net does not exist, we just print out error
-messages and exit. So user cannot use ip monitor anymore when
-CONFIG_NET_NS is disabled:
- # ip monitor
- open("/proc/self/ns/net"): No such file or directory
-
-If open "/proc/self/ns/net" failed, set have_rtnl_getnsid to false.
-
-Fixes: d652ccbf8195 ("netns: allow to dump and monitor nsid")
-Signed-off-by: Liping Zhang <liping.zhang@spreadtrum.com>
-Acked-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
----
- ip/ipnetns.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/ip/ipnetns.c b/ip/ipnetns.c
-index af87065..ccc652c 100644
---- a/ip/ipnetns.c
-+++ b/ip/ipnetns.c
-@@ -72,8 +72,8 @@ static int ipnetns_have_nsid(void)
- if (have_rtnl_getnsid < 0) {
- fd = open("/proc/self/ns/net", O_RDONLY);
- if (fd < 0) {
-- perror("open(\"/proc/self/ns/net\")");
-- exit(1);
-+ have_rtnl_getnsid = 0;
-+ return 0;
- }
-
- addattr32(&req.n, 1024, NETNSA_FD, fd);
---
-2.6.4
-