diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..669af3f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+SOURCES/iproute-4.11.0-0.el7.tar.xz
diff --git a/.iproute.metadata b/.iproute.metadata
new file mode 100644
index 0000000..5ace8c2
--- /dev/null
+++ b/.iproute.metadata
@@ -0,0 +1 @@
+44b3b021eb4bf5416469e485753d877df1c3c848 SOURCES/iproute-4.11.0-0.el7.tar.xz
diff --git a/SOURCES/0001-Confirm-success-for-each-tc-batch-command.patch b/SOURCES/0001-Confirm-success-for-each-tc-batch-command.patch
new file mode 100644
index 0000000..1920f9f
--- /dev/null
+++ b/SOURCES/0001-Confirm-success-for-each-tc-batch-command.patch
@@ -0,0 +1,105 @@
+From d9a1dc236a9bcc06f04d609e2654f76c6a9459e7 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Mon, 14 Dec 2015 21:02:18 +0100
+Subject: [PATCH] Confirm success for each tc -batch command
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=977844
+Upstream Status: Rejected.
+
+The original patch has been extended by the related man page additions
+which were contained in another local patch.
+
+commit 8c5024483cbbfdc092945a00be05d917485b9af3
+Author: Petr Písař <ppisar@redhat.com>
+Date:   Thu Sep 19 11:25:49 2013 +0200
+
+    Confirm success for each tc -batch command
+
+    If `tc -force -batch' is fed by a controlling program from a pipe,
+    it's not possible to recognize when a command has been processes
+    successfully.
+
+    This patch adds an optional `-OK' option to the tc(8) tool, so `tc
+    -force -OK -batch' will print "OK\n" to standard output on each
+    successfully completed tc command.
+
+    Signed-off-by: Petr Písař <ppisar@redhat.com>
+
+Signed-off-by: Phil Sutter <psutter@redhat.com>
+---
+ man/man8/tc.8 | 8 +++++++-
+ tc/tc.c       | 8 +++++++-
+ 2 files changed, 14 insertions(+), 2 deletions(-)
+
+diff --git a/man/man8/tc.8 b/man/man8/tc.8
+index f96911a..a341a8f 100644
+--- a/man/man8/tc.8
++++ b/man/man8/tc.8
+@@ -62,7 +62,7 @@ tc \- show / manipulate traffic control settings
+ .P
+ .ti 8
+ .IR OPTIONS " := {"
+-\fB[ -force ] -b\fR[\fIatch\fR] \fB[ filename ] \fR|
++\fB[ -force ] [ -OK ] -b\fR[\fIatch\fR] \fB[ filename ] \fR|
+ \fB[ \fB-n\fR[\fIetns\fR] name \fB] \fR|
+ \fB[ \fB-nm \fR| \fB-nam\fR[\fIes\fR] \fB] \fR|
+ \fB[ \fR{ \fB-cf \fR| \fB-c\fR[\fIonf\fR] \fR} \fB[ filename ] \fB] \fR}
+@@ -603,6 +603,12 @@ don't terminate tc on errors in batch mode.
+ If there were any errors during execution of the commands, the application return code will be non zero.
+ 
+ .TP
++.BR "\-OK"
++in batch mode, print
++.B OK
++and a new line on standard output after each successfully interpreted command.
++
++.TP
+ .BR "\-n" , " \-net" , " \-netns " <NETNS>
+ switches
+ .B tc
+diff --git a/tc/tc.c b/tc/tc.c
+index 8e64a82..360c9f1 100644
+--- a/tc/tc.c
++++ b/tc/tc.c
+@@ -42,6 +42,7 @@ int batch_mode;
+ int resolve_hosts;
+ int use_iec;
+ int force;
++int ok;
+ bool use_names;
+ 
+ static char *conf_file;
+@@ -188,7 +189,7 @@ noexist:
+ static void usage(void)
+ {
+ 	fprintf(stderr, "Usage: tc [ OPTIONS ] OBJECT { COMMAND | help }\n"
+-			"       tc [-force] -batch filename\n"
++			"       tc [-force] [-OK] -batch filename\n"
+ 			"where  OBJECT := { qdisc | class | filter | action | monitor | exec }\n"
+ 	                "       OPTIONS := { -s[tatistics] | -d[etails] | -r[aw] | -p[retty] | -b[atch] [filename] | -n[etns] name |\n"
+ 			"                    -nm | -nam[es] | { -cf | -conf } path }\n");
+@@ -254,6 +255,9 @@ static int batch(const char *name)
+ 			ret = 1;
+ 			if (!force)
+ 				break;
++		} else if (ok) {
++			printf("OK\n");
++			fflush(stdout);
+ 		}
+ 	}
+ 	if (line)
+@@ -293,6 +297,8 @@ int main(int argc, char **argv)
+ 			return 0;
+ 		} else if (matches(argv[1], "-force") == 0) {
+ 			++force;
++		} else if (matches(argv[1], "-OK") == 0) {
++			++ok;
+ 		} else if (matches(argv[1], "-batch") == 0) {
+ 			argc--;	argv++;
+ 			if (argc <= 1)
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0002-Really-fix-get_addr-and-get_prefix-error-messages.patch b/SOURCES/0002-Really-fix-get_addr-and-get_prefix-error-messages.patch
new file mode 100644
index 0000000..a54aeea
--- /dev/null
+++ b/SOURCES/0002-Really-fix-get_addr-and-get_prefix-error-messages.patch
@@ -0,0 +1,88 @@
+From aed8229c0bec5c56deaf1ea2047ca0263732477f Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Fri, 11 Aug 2017 11:11:32 +0200
+Subject: [PATCH] Really fix get_addr() and get_prefix() error messages
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1477206
+Upstream Status: iproute2.git commit 34705c807a389
+
+commit 34705c807a38909247d1bb29ccdffe42e5c1dab3
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Tue Aug 1 18:36:11 2017 +0200
+
+    Really fix get_addr() and get_prefix() error messages
+
+    Both functions take the desired address family as a parameter. So using
+    that to notify the user what address family was expected is correct,
+    unlike using dst->family which will tell the user only what address
+    family was specified.
+
+    The situation which commit 334af76143368 tried to fix was when 'ip'
+    would accept addresses from multiple families. In that case, the family
+    parameter is set to AF_UNSPEC so that get_addr_1() may accept any valid
+    address.
+
+    This patch introduces a wrapper around family_name() which returns the
+    string "any valid" for AF_UNSPEC instead of the three question marks
+    unsuitable for use in error messages.
+
+    Tests for AF_UNSPEC:
+
+    | # ip a a 256.10.166.1/24 dev d0
+    | Error: any valid prefix is expected rather than "256.10.166.1/24".
+
+    | # ip neighbor add proxy 2001:db8::g dev d0
+    | Error: any valid address is expected rather than "2001:db8::g".
+
+    Tests for explicit address family:
+
+    | # ip -6 addrlabel add prefix 1.1.1.1/24 label 123
+    | Error: inet6 prefix is expected rather than "1.1.1.1/24".
+
+    | # ip -4 addrlabel add prefix dead:beef::1/24 label 123
+    | Error: inet prefix is expected rather than "dead:beef::1/24".
+
+    Reported-by: Jaroslav Aster <jaster@redhat.com>
+    Fixes: 334af76143368 ("fix get_addr() and get_prefix() error messages")
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ lib/utils.c | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+diff --git a/lib/utils.c b/lib/utils.c
+index 6d5642f..7d6ee53 100644
+--- a/lib/utils.c
++++ b/lib/utils.c
+@@ -613,12 +613,19 @@ done:
+ 	return err;
+ }
+ 
++static const char *family_name_verbose(int family)
++{
++	if (family == AF_UNSPEC)
++		return "any valid";
++	return family_name(family);
++}
++
+ int get_addr(inet_prefix *dst, const char *arg, int family)
+ {
+ 	if (get_addr_1(dst, arg, family)) {
+ 		fprintf(stderr,
+ 			"Error: %s address is expected rather than \"%s\".\n",
+-			family_name(dst->family), arg);
++			family_name_verbose(family), arg);
+ 		exit(1);
+ 	}
+ 	return 0;
+@@ -636,7 +643,7 @@ int get_prefix(inet_prefix *dst, char *arg, int family)
+ 	if (get_prefix_1(dst, arg, family)) {
+ 		fprintf(stderr,
+ 			"Error: %s prefix is expected rather than \"%s\".\n",
+-			family_name(dst->family), arg);
++			family_name_verbose(family), arg);
+ 		exit(1);
+ 	}
+ 	return 0;
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0003-tc-simple-Fix-documentation.patch b/SOURCES/0003-tc-simple-Fix-documentation.patch
new file mode 100644
index 0000000..f7edb1e
--- /dev/null
+++ b/SOURCES/0003-tc-simple-Fix-documentation.patch
@@ -0,0 +1,102 @@
+From 3d016b2ca5862b3f47da5b28aca43bd96d5c3c49 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Fri, 11 Aug 2017 11:13:26 +0200
+Subject: [PATCH] tc-simple: Fix documentation
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1477523
+Upstream Status: iproute2.git commit e2a055dd23f0e
+
+commit e2a055dd23f0e7527a987c24687cb6b0b86f0cde
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 3 17:00:51 2017 +0200
+
+    tc-simple: Fix documentation
+
+    - CONTROL has to come last, otherwise 'index' applies to gact and not
+      simple itself.
+    - Man page wasn't updated to reflect syntax changes.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ man/man8/tc-simple.8 | 29 ++++++++++++++++++++++++++---
+ tc/m_simple.c        |  4 ++--
+ 2 files changed, 28 insertions(+), 5 deletions(-)
+
+diff --git a/man/man8/tc-simple.8 b/man/man8/tc-simple.8
+index 2206dc3..7363ab5 100644
+--- a/man/man8/tc-simple.8
++++ b/man/man8/tc-simple.8
+@@ -6,15 +6,37 @@ simple - basic example action
+ .in +8
+ .ti -8
+ .BR tc " ... " "action simple"
+-.I STRING
++[
++.BI sdata " STRING"
++] [
++.BI index " INDEX"
++] [
++.I CONTROL
++]
++
++.ti -8
++.IR CONTROL " := {"
++.BR reclassify " | " pipe " | " drop " | " continue " | " ok " }"
++
+ .SH DESCRIPTION
+ This is a pedagogical example rather than an actually useful action. Upon every access, it prints the given
+ .I STRING
+ which may be of arbitrary length.
+ .SH OPTIONS
+ .TP
+-.I STRING
++.BI sdata " STRING"
+ The actual string to print.
++.TP
++.BI index " INDEX"
++Optional action index value.
++.TP
++.I CONTROL
++Indicate how
++.B tc
++should proceed after executing the action. For a description of the possible
++.I CONTROL
++values, see
++.BR tc-actions (8).
+ .SH EXAMPLES
+ The following example makes the kernel yell "Incoming ICMP!" every time it sees
+ an incoming ICMP on eth0. Steps are:
+@@ -36,7 +58,7 @@ display stats again and observe increment by 1
+ .EX
+   hadi@noma1:$ tc qdisc add dev eth0 ingress
+   hadi@noma1:$tc filter add dev eth0 parent ffff: protocol ip prio 5 \\
+-	 u32 match ip protocol 1 0xff flowid 1:1 action simple "Incoming ICMP"
++	 u32 match ip protocol 1 0xff flowid 1:1 action simple sdata "Incoming ICMP"
+ 
+   hadi@noma1:$ sudo tc -s filter ls  dev eth0 parent ffff:
+    filter protocol ip pref 5 u32
+@@ -74,3 +96,4 @@ display stats again and observe increment by 1
+ .EE
+ .SH SEE ALSO
+ .BR tc (8)
++.BR tc-actions (8)
+diff --git a/tc/m_simple.c b/tc/m_simple.c
+index 3a8bd91..ab63384 100644
+--- a/tc/m_simple.c
++++ b/tc/m_simple.c
+@@ -81,10 +81,10 @@
+ #endif
+ static void explain(void)
+ {
+-	fprintf(stderr, "Usage:... simple [sdata STRING] [CONTROL] [index INDEX]\n");
++	fprintf(stderr, "Usage:... simple [sdata STRING] [index INDEX] [CONTROL]\n");
+ 	fprintf(stderr, "\tSTRING being an arbitrary string\n"
+-		"\tCONTROL := reclassify|pipe|drop|continue|ok\n"
+ 		"\tINDEX := optional index value used\n");
++		"\tCONTROL := reclassify|pipe|drop|continue|ok\n"
+ }
+ 
+ static void usage(void)
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0004-tc-fix-m_simple-usage.patch b/SOURCES/0004-tc-fix-m_simple-usage.patch
new file mode 100644
index 0000000..f25c633
--- /dev/null
+++ b/SOURCES/0004-tc-fix-m_simple-usage.patch
@@ -0,0 +1,37 @@
+From d203110b883afafa58b735a3e94c71f255db7608 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Fri, 11 Aug 2017 11:13:26 +0200
+Subject: [PATCH] tc: fix m_simple usage
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1477523
+Upstream Status: iproute2.git commit 620fc6696d4f4
+
+commit 620fc6696d4f4e9ad540a45892873b0382907739
+Author: Stephen Hemminger <stephen@networkplumber.org>
+Date:   Thu Aug 3 16:10:18 2017 -0700
+
+    tc: fix m_simple usage
+
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ tc/m_simple.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/tc/m_simple.c b/tc/m_simple.c
+index ab63384..65e48ad 100644
+--- a/tc/m_simple.c
++++ b/tc/m_simple.c
+@@ -83,8 +83,8 @@ static void explain(void)
+ {
+ 	fprintf(stderr, "Usage:... simple [sdata STRING] [index INDEX] [CONTROL]\n");
+ 	fprintf(stderr, "\tSTRING being an arbitrary string\n"
+-		"\tINDEX := optional index value used\n");
+-		"\tCONTROL := reclassify|pipe|drop|continue|ok\n"
++		"\tINDEX := optional index value used\n"
++		"\tCONTROL := reclassify|pipe|drop|continue|ok\n");
+ }
+ 
+ static void usage(void)
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0005-bpf-Make-bytecode-file-reading-a-little-more-robust.patch b/SOURCES/0005-bpf-Make-bytecode-file-reading-a-little-more-robust.patch
new file mode 100644
index 0000000..d135b59
--- /dev/null
+++ b/SOURCES/0005-bpf-Make-bytecode-file-reading-a-little-more-robust.patch
@@ -0,0 +1,96 @@
+From 91cda136ef27402256dbf85434374b43ab52d932 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Fri, 11 Aug 2017 11:15:30 +0200
+Subject: [PATCH] bpf: Make bytecode-file reading a little more robust
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1477491
+Upstream Status: iproute2.git commit 3da3ebfca85b8
+
+commit 3da3ebfca85b8f1e8252b898453d8cb383c5c398
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Wed Aug 2 14:57:56 2017 +0200
+
+    bpf: Make bytecode-file reading a little more robust
+
+    bpf_parse_string() will now correctly handle:
+
+    - Extraneous whitespace,
+    - OPs on multiple lines and
+    - overlong file names.
+
+    The added feature of allowing to have OPs on multiple lines (like e.g.
+    tcpdump prints them) is rather a side effect of fixing detection of
+    malformed bytecode files having random content on a second line, like
+    e.g.:
+
+    | 4,40 0 0 12,21 0 1 2048,6 0 0 262144,6 0 0 0
+    | foobar
+
+    Cc: Daniel Borkmann <daniel@iogearbox.net>
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Acked-by: Daniel Borkmann <daniel@iogearbox.net>
+---
+ lib/bpf.c | 32 ++++++++++++++++++++++++--------
+ 1 file changed, 24 insertions(+), 8 deletions(-)
+
+diff --git a/lib/bpf.c b/lib/bpf.c
+index 04ee1ab..73dac5c 100644
+--- a/lib/bpf.c
++++ b/lib/bpf.c
+@@ -160,11 +160,11 @@ static int bpf_parse_string(char *arg, bool from_file, __u16 *bpf_len,
+ 
+ 	if (from_file) {
+ 		size_t tmp_len, op_len = sizeof("65535 255 255 4294967295,");
+-		char *tmp_string, *last;
++		char *tmp_string, *pos, c, c_prev = ' ';
+ 		FILE *fp;
+ 
+ 		tmp_len = sizeof("4096,") + BPF_MAXINSNS * op_len;
+-		tmp_string = calloc(1, tmp_len);
++		tmp_string = pos = calloc(1, tmp_len);
+ 		if (tmp_string == NULL)
+ 			return -ENOMEM;
+ 
+@@ -175,17 +175,33 @@ static int bpf_parse_string(char *arg, bool from_file, __u16 *bpf_len,
+ 			return -ENOENT;
+ 		}
+ 
+-		if (!fgets(tmp_string, tmp_len, fp)) {
++		while ((c = fgetc(fp)) != EOF) {
++			switch (c) {
++			case '\n':
++				if (c_prev != ',')
++					*(pos++) = ',';
++				break;
++			case ' ':
++			case '\t':
++				if (c_prev != ' ')
++					*(pos++) = c;
++				break;
++			default:
++				*(pos++) = c;
++			}
++			if (pos - tmp_string == tmp_len)
++				break;
++			c_prev = c;
++		}
++
++		if (!feof(fp)) {
+ 			free(tmp_string);
+ 			fclose(fp);
+-			return -EIO;
++			return -E2BIG;
+ 		}
+ 
+ 		fclose(fp);
+-
+-		last = &tmp_string[strlen(tmp_string) - 1];
+-		if (*last == '\n')
+-			*last = 0;
++		*pos = 0;
+ 
+ 		*need_release = true;
+ 		*bpf_string = tmp_string;
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0006-ss-Fix-for-added-diag-support-check.patch b/SOURCES/0006-ss-Fix-for-added-diag-support-check.patch
new file mode 100644
index 0000000..3b2f237
--- /dev/null
+++ b/SOURCES/0006-ss-Fix-for-added-diag-support-check.patch
@@ -0,0 +1,93 @@
+From 2dc48cc4101b9788dcafd38b07a82f8c91b4d3f6 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 31 Aug 2017 14:23:11 +0200
+Subject: [PATCH] ss: Fix for added diag support check
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1487152
+Upstream Status: iproute2.git commit 6c6bbc30f4e7f
+
+commit 6c6bbc30f4e7fedc74381627f7ec86d26050b404
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Mon Aug 28 19:31:22 2017 +0200
+
+    ss: Fix for added diag support check
+
+    Commit 9f66764e308e9 ("libnetlink: Add test for error code returned from
+    netlink reply") changed rtnl_dump_filter_l() to return an error in case
+    NLMSG_DONE would contain one, even if it was ENOENT.
+
+    This in turn breaks ss when it tries to dump DCCP sockets on a system
+    without support for it: The function tcp_show(), which is shared between
+    TCP and DCCP, will start parsing /proc since inet_show_netlink() returns
+    an error - yet it parses /proc/net/tcp which doesn't make sense for DCCP
+    sockets at all.
+
+    On my system, a call to 'ss' without further arguments prints the list
+    of connected TCP sockets twice.
+
+    Fix this by introducing a dedicated function dccp_show() which does not
+    have a fallback to /proc, just like sctp_show(). And since tcp_show()
+    is no longer "multi-purpose", drop it's socktype parameter.
+
+    Fixes: 9f66764e308e9 ("libnetlink: Add test for error code returned from netlink reply")
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ misc/ss.c | 20 ++++++++++++++++----
+ 1 file changed, 16 insertions(+), 4 deletions(-)
+
+diff --git a/misc/ss.c b/misc/ss.c
+index 12763c9..b84baf3 100644
+--- a/misc/ss.c
++++ b/misc/ss.c
+@@ -2735,7 +2735,7 @@ static int tcp_show_netlink_file(struct filter *f)
+ 	}
+ }
+ 
+-static int tcp_show(struct filter *f, int socktype)
++static int tcp_show(struct filter *f)
+ {
+ 	FILE *fp = NULL;
+ 	char *buf = NULL;
+@@ -2750,7 +2750,7 @@ static int tcp_show(struct filter *f, int socktype)
+ 		return tcp_show_netlink_file(f);
+ 
+ 	if (!getenv("PROC_NET_TCP") && !getenv("PROC_ROOT")
+-	    && inet_show_netlink(f, NULL, socktype) == 0)
++	    && inet_show_netlink(f, NULL, IPPROTO_TCP) == 0)
+ 		return 0;
+ 
+ 	/* Sigh... We have to parse /proc/net/tcp... */
+@@ -2818,6 +2818,18 @@ outerr:
+ 	} while (0);
+ }
+ 
++static int dccp_show(struct filter *f)
++{
++	if (!filter_af_get(f, AF_INET) && !filter_af_get(f, AF_INET6))
++		return 0;
++
++	if (!getenv("PROC_NET_DCCP") && !getenv("PROC_ROOT")
++	    && inet_show_netlink(f, NULL, IPPROTO_DCCP) == 0)
++		return 0;
++
++	return 0;
++}
++
+ static int sctp_show(struct filter *f)
+ {
+ 	if (!filter_af_get(f, AF_INET) && !filter_af_get(f, AF_INET6))
+@@ -4368,9 +4380,9 @@ int main(int argc, char *argv[])
+ 	if (current_filter.dbs & (1<<UDP_DB))
+ 		udp_show(&current_filter);
+ 	if (current_filter.dbs & (1<<TCP_DB))
+-		tcp_show(&current_filter, IPPROTO_TCP);
++		tcp_show(&current_filter);
+ 	if (current_filter.dbs & (1<<DCCP_DB))
+-		tcp_show(&current_filter, IPPROTO_DCCP);
++		dccp_show(&current_filter);
+ 	if (current_filter.dbs & (1<<SCTP_DB))
+ 		sctp_show(&current_filter);
+ 
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0007-tc-simple.8-Fix-reference-to-non-existing-tc-actions.patch b/SOURCES/0007-tc-simple.8-Fix-reference-to-non-existing-tc-actions.patch
new file mode 100644
index 0000000..9028079
--- /dev/null
+++ b/SOURCES/0007-tc-simple.8-Fix-reference-to-non-existing-tc-actions.patch
@@ -0,0 +1,31 @@
+From 4917021d1ebea2b75cdcf31272452aa5cc3ff7ec Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Fri, 1 Sep 2017 13:05:45 +0200
+Subject: [PATCH] tc-simple.8: Fix reference to non-existing tc-actions.8
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1477523
+Upstream Status: RHEL-only
+
+The referenced man page doesn't exist in RHEL iproute package, so better
+refer to an existing one which also contains the CONTROL value
+description.
+---
+ man/man8/tc-simple.8 | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/man/man8/tc-simple.8 b/man/man8/tc-simple.8
+index 7363ab5..a0deb0b 100644
+--- a/man/man8/tc-simple.8
++++ b/man/man8/tc-simple.8
+@@ -36,7 +36,7 @@ Indicate how
+ should proceed after executing the action. For a description of the possible
+ .I CONTROL
+ values, see
+-.BR tc-actions (8).
++.BR tc-pedit (8).
+ .SH EXAMPLES
+ The following example makes the kernel yell "Incoming ICMP!" every time it sees
+ an incoming ICMP on eth0. Steps are:
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0008-lib-bpf-Fix-bytecode-file-parsing.patch b/SOURCES/0008-lib-bpf-Fix-bytecode-file-parsing.patch
new file mode 100644
index 0000000..f9247d7
--- /dev/null
+++ b/SOURCES/0008-lib-bpf-Fix-bytecode-file-parsing.patch
@@ -0,0 +1,74 @@
+From 584ca9f67952162dfdd02d984aa12640e45a4235 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Wed, 6 Sep 2017 11:53:53 +0200
+Subject: [PATCH] lib/bpf: Fix bytecode-file parsing
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1477491
+Upstream Status: iproute2.git commit 7c87c7fed18d1
+
+commit 7c87c7fed18d1162e045c8331cb68fa440bc5728
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Tue Aug 29 17:09:45 2017 +0200
+
+    lib/bpf: Fix bytecode-file parsing
+
+    The signedness of char type is implementation dependent, and there are
+    architectures on which it is unsigned by default. In that case, the
+    check whether fgetc() returned EOF failed because the return value was
+    assigned an (unsigned) char variable prior to comparison with EOF (which
+    is defined to -1). Fix this by using int as type for 'c' variable, which
+    also matches the declaration of fgetc().
+
+    While being at it, fix the parser logic to correctly handle multiple
+    empty lines and consecutive whitespace and tab characters to further
+    improve the parser's robustness. Note that this will still detect double
+    separator characters, so doesn't soften up the parser too much.
+
+    Fixes: 3da3ebfca85b8 ("bpf: Make bytecode-file reading a little more robust")
+    Cc: Daniel Borkmann <daniel@iogearbox.net>
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Acked-by: Daniel Borkmann <daniel@iogearbox.net>
+---
+ lib/bpf.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/lib/bpf.c b/lib/bpf.c
+index 73dac5c..3aabf44 100644
+--- a/lib/bpf.c
++++ b/lib/bpf.c
+@@ -160,8 +160,9 @@ static int bpf_parse_string(char *arg, bool from_file, __u16 *bpf_len,
+ 
+ 	if (from_file) {
+ 		size_t tmp_len, op_len = sizeof("65535 255 255 4294967295,");
+-		char *tmp_string, *pos, c, c_prev = ' ';
++		char *tmp_string, *pos, c_prev = ' ';
+ 		FILE *fp;
++		int c;
+ 
+ 		tmp_len = sizeof("4096,") + BPF_MAXINSNS * op_len;
+ 		tmp_string = pos = calloc(1, tmp_len);
+@@ -180,18 +181,20 @@ static int bpf_parse_string(char *arg, bool from_file, __u16 *bpf_len,
+ 			case '\n':
+ 				if (c_prev != ',')
+ 					*(pos++) = ',';
++				c_prev = ',';
+ 				break;
+ 			case ' ':
+ 			case '\t':
+ 				if (c_prev != ' ')
+ 					*(pos++) = c;
++				c_prev = ' ';
+ 				break;
+ 			default:
+ 				*(pos++) = c;
++				c_prev = c;
+ 			}
+ 			if (pos - tmp_string == tmp_len)
+ 				break;
+-			c_prev = c;
+ 		}
+ 
+ 		if (!feof(fp)) {
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0009-tc-simple.8-Fix-one-more-reference-to-non-existing-t.patch b/SOURCES/0009-tc-simple.8-Fix-one-more-reference-to-non-existing-t.patch
new file mode 100644
index 0000000..4ce8185
--- /dev/null
+++ b/SOURCES/0009-tc-simple.8-Fix-one-more-reference-to-non-existing-t.patch
@@ -0,0 +1,27 @@
+From 3905b2d8f676601c022804d197be9165dacff11c Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Wed, 6 Sep 2017 15:44:19 +0200
+Subject: [PATCH] tc-simple.8: Fix one more reference to non-existing
+ tc-actions.8
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1477523
+Upstream Status: RHEL-only
+
+Previous fix missed to update the SEE ALSO section as well.
+---
+ man/man8/tc-simple.8 | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/man/man8/tc-simple.8 b/man/man8/tc-simple.8
+index a0deb0b..beab313 100644
+--- a/man/man8/tc-simple.8
++++ b/man/man8/tc-simple.8
+@@ -96,4 +96,4 @@ display stats again and observe increment by 1
+ .EE
+ .SH SEE ALSO
+ .BR tc (8)
+-.BR tc-actions (8)
++.BR tc-pedit (8)
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0010-tc-m_xt-Prevent-a-segfault-in-libipt.patch b/SOURCES/0010-tc-m_xt-Prevent-a-segfault-in-libipt.patch
new file mode 100644
index 0000000..253d00f
--- /dev/null
+++ b/SOURCES/0010-tc-m_xt-Prevent-a-segfault-in-libipt.patch
@@ -0,0 +1,49 @@
+From 074062808c630f2efb55c7093d510b44a38e74e5 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 14 Sep 2017 15:27:47 +0200
+Subject: [PATCH] tc: m_xt: Prevent a segfault in libipt
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465599
+Upstream Status: iproute2.git commit f6fc1055e41a8
+
+commit f6fc1055e41a8a924313c336b39b9ffe0c86938b
+Author: Phil Sutter <psutter@redhat.com>
+Date:   Tue May 23 15:40:57 2017 +0200
+
+    tc: m_xt: Prevent a segfault in libipt
+
+    This happens with NAT targets, such as SNAT, DNAT and MASQUERADE. These
+    are still not usable with this patch, but at least tc doesn't crash
+    anymore when one tries to use them.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ tc/m_xt.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/tc/m_xt.c b/tc/m_xt.c
+index e59df8e..ad52d23 100644
+--- a/tc/m_xt.c
++++ b/tc/m_xt.c
+@@ -146,6 +146,9 @@ static int parse_ipt(struct action_util *a, int *argc_p,
+ 		     char ***argv_p, int tca_id, struct nlmsghdr *n)
+ {
+ 	struct xtables_target *m = NULL;
++#if XTABLES_VERSION_CODE >= 6
++	struct ipt_entry fw = {};
++#endif
+ 	struct rtattr *tail;
+ 
+ 	int c;
+@@ -206,7 +209,7 @@ static int parse_ipt(struct action_util *a, int *argc_p,
+ 		default:
+ #if XTABLES_VERSION_CODE >= 6
+ 			if (m != NULL && m->x6_parse != NULL) {
+-				xtables_option_tpcall(c, argv, 0, m, NULL);
++				xtables_option_tpcall(c, argv, 0, m, &fw);
+ #else
+ 			if (m != NULL && m->parse != NULL) {
+ 				m->parse(c - m->option_offset, argv, 0,
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0011-link_gre6-really-support-encaplimit-option.patch b/SOURCES/0011-link_gre6-really-support-encaplimit-option.patch
new file mode 100644
index 0000000..5a6eefa
--- /dev/null
+++ b/SOURCES/0011-link_gre6-really-support-encaplimit-option.patch
@@ -0,0 +1,51 @@
+From 2db276543a03633a61ba0815a01c8bb2846830ab Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 14 Sep 2017 15:30:37 +0200
+Subject: [PATCH] link_gre6: really support encaplimit option
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1459600
+Upstream Status: iproute2.git commit a11b7b71a6eba
+Conflicts: Context change due to missing commit ad4b1425c3182
+	   ("iplink: Expose IFLA_*_FWMARK attributes for supported link
+	   types").
+
+commit a11b7b71a6eba4ee80e931e4f75321a0cf0116f1
+Author: Nicolas Dichtel <nicolas.dichtel@6wind.com>
+Date:   Wed Jun 14 18:45:42 2017 +0200
+
+    link_gre6: really support encaplimit option
+
+    This option is documented in gre6 help, but was not supported.
+
+    Fixes: af89576d7a8c ("iproute2: GRE over IPv6 tunnel support.")
+    Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
+---
+ ip/link_gre6.c | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+diff --git a/ip/link_gre6.c b/ip/link_gre6.c
+index 1b4fb05..76416b2 100644
+--- a/ip/link_gre6.c
++++ b/ip/link_gre6.c
+@@ -339,6 +339,18 @@ get_failed:
+ 			encapflags |= TUNNEL_ENCAP_FLAG_REMCSUM;
+ 		} else if (strcmp(*argv, "noencap-remcsum") == 0) {
+ 			encapflags &= ~TUNNEL_ENCAP_FLAG_REMCSUM;
++		} else if (strcmp(*argv, "encaplimit") == 0) {
++			NEXT_ARG();
++			if (strcmp(*argv, "none") == 0) {
++				flags |= IP6_TNL_F_IGN_ENCAP_LIMIT;
++			} else {
++				__u8 uval;
++
++				if (get_u8(&uval, *argv, 0) < -1)
++					invarg("invalid ELIM", *argv);
++				encap_limit = uval;
++				flags &= ~IP6_TNL_F_IGN_ENCAP_LIMIT;
++			}
+ 		} else
+ 			usage();
+ 		argc--; argv++;
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0012-tc-fix-typo-in-manpage.patch b/SOURCES/0012-tc-fix-typo-in-manpage.patch
new file mode 100644
index 0000000..6041fbe
--- /dev/null
+++ b/SOURCES/0012-tc-fix-typo-in-manpage.patch
@@ -0,0 +1,40 @@
+From beb8e1aa7ed08f86fb87ff58f7c69aaa2b68b862 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 14 Sep 2017 15:38:46 +0200
+Subject: [PATCH] tc: fix typo in manpage
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1417162
+Upstream Status: iproute2.git commit b09515553fded
+
+commit b09515553fded944713955815a3f1cc855384abd
+Author: Matteo Croce <mcroce@redhat.com>
+Date:   Fri Jul 7 15:08:33 2017 +0200
+
+    tc: fix typo in manpage
+
+    Fix a typo in the 'tc' manpage and reword some sentences.
+
+    Signed-off-by: Matteo Croce <mcroce@redhat.com>
+---
+ man/man8/tc-csum.8 | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/man/man8/tc-csum.8 b/man/man8/tc-csum.8
+index 718301d..409ab71 100644
+--- a/man/man8/tc-csum.8
++++ b/man/man8/tc-csum.8
+@@ -29,9 +29,9 @@ csum - checksum update action
+ The
+ .B csum
+ action triggers checksum recalculation of specified packet headers. It is
+-commonly used after packet editing using the
++commonly used to fix incorrect checksums after the
+ .B pedit
+-action to fix for then incorrect checksums.
++action has modified the packet content.
+ .SH OPTIONS
+ .TP
+ .I TARGET
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0013-ip-neigh-allow-flush-FAILED-neighbour-entry.patch b/SOURCES/0013-ip-neigh-allow-flush-FAILED-neighbour-entry.patch
new file mode 100644
index 0000000..ed4b410
--- /dev/null
+++ b/SOURCES/0013-ip-neigh-allow-flush-FAILED-neighbour-entry.patch
@@ -0,0 +1,52 @@
+From 3b6fd8227cbb03b5b211d2cb53534ad405673668 Mon Sep 17 00:00:00 2001
+From: Matteo Croce <mcroce@redhat.com>
+Date: Wed, 2 Aug 2017 13:57:17 +0200
+Subject: [PATCH] ip neigh: allow flush FAILED neighbour entry
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1469945
+Tested: locally using proper reproducer
+Upstream Status: merged 37a5f7c5
+
+commit 37a5f7c571623059ae671992f72feaa444a6ffc8
+Author: Hangbin Liu <liuhangbin@gmail.com>
+Date:   Fri Jun 16 11:31:52 2017 +0800
+
+    ip neigh: allow flush FAILED neighbour entry
+
+    After upstream commit 5071034e4af7 ('neigh: Really delete an arp/neigh entry
+    on "ip neigh delete" or "arp -d"'), we could delete a single FAILED neighbour
+    entry now. But `ip neigh flush` still skip the FAILED entry.
+
+    Move the filter after first round flush so we can flush FAILED entry on fixed
+    kernel and also do not keep retrying on old kernel.
+
+    Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
+
+Signed-off-by: Matteo Croce <mcroce@redhat.com>
+---
+ ip/ipneigh.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/ip/ipneigh.c b/ip/ipneigh.c
+index 4d8fc85..9c38a60 100644
+--- a/ip/ipneigh.c
++++ b/ip/ipneigh.c
+@@ -445,7 +445,6 @@ static int do_show_or_flush(int argc, char **argv, int flush)
+ 		filter.flushb = flushb;
+ 		filter.flushp = 0;
+ 		filter.flushe = sizeof(flushb);
+-		filter.state &= ~NUD_FAILED;
+ 
+ 		while (round < MAX_ROUNDS) {
+ 			if (rtnl_dump_request_n(&rth, &req.n) < 0) {
+@@ -474,6 +473,7 @@ static int do_show_or_flush(int argc, char **argv, int flush)
+ 				printf("\n*** Round %d, deleting %d entries ***\n", round, filter.flushed);
+ 				fflush(stdout);
+ 			}
++			filter.state &= ~NUD_FAILED;
+ 		}
+ 		printf("*** Flush not complete bailing out after %d rounds\n",
+ 			MAX_ROUNDS);
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0014-netns-avoid-directory-traversal.patch b/SOURCES/0014-netns-avoid-directory-traversal.patch
new file mode 100644
index 0000000..fc03b02
--- /dev/null
+++ b/SOURCES/0014-netns-avoid-directory-traversal.patch
@@ -0,0 +1,58 @@
+From 74061958f56a4626a3a146c72f16e43012e828f1 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 14 Sep 2017 15:39:23 +0200
+Subject: [PATCH] netns: avoid directory traversal
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1468529
+Upstream Status: iproute2.git commit 79928fd0552b5
+
+commit 79928fd0552b520aa36a22e71144d10a32f7e4fe
+Author: Matteo Croce <mcroce@redhat.com>
+Date:   Thu Jul 20 00:36:32 2017 +0200
+
+    netns: avoid directory traversal
+
+    ip netns keeps track of created namespaces with bind mounts named
+    /var/run/netns/<namespace>. No input sanitization is done, allowing creation and
+    deletion of files relatives to /var/run/netns or, if the path is non existent or
+    invalid, allows to create "untracked" namespaces (invisible to the tool).
+
+    This commit denies creation or deletion of namespaces with names contaning
+    "/" or matching exactly "." or "..".
+
+    Signed-off-by: Matteo Croce <mcroce@redhat.com>
+---
+ ip/ipnetns.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/ip/ipnetns.c b/ip/ipnetns.c
+index 0b0378a..4254994 100644
+--- a/ip/ipnetns.c
++++ b/ip/ipnetns.c
+@@ -766,6 +766,11 @@ static int netns_monitor(int argc, char **argv)
+ 	return 0;
+ }
+ 
++static int invalid_name(const char *name)
++{
++	return strchr(name, '/') || !strcmp(name, ".") || !strcmp(name, "..");
++}
++
+ int do_netns(int argc, char **argv)
+ {
+ 	netns_nsid_socket_init();
+@@ -775,6 +780,11 @@ int do_netns(int argc, char **argv)
+ 		return netns_list(0, NULL);
+ 	}
+ 
++	if (argc > 1 && invalid_name(argv[1])) {
++		fprintf(stderr, "Invalid netns name \"%s\"\n", argv[1]);
++		exit(-1);
++	}
++
+ 	if ((matches(*argv, "list") == 0) || (matches(*argv, "show") == 0) ||
+ 	    (matches(*argv, "lst") == 0)) {
+ 		netns_map_init();
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0015-utils-return-default-family-when-rtm_family-is-not-R.patch b/SOURCES/0015-utils-return-default-family-when-rtm_family-is-not-R.patch
new file mode 100644
index 0000000..5d59c09
--- /dev/null
+++ b/SOURCES/0015-utils-return-default-family-when-rtm_family-is-not-R.patch
@@ -0,0 +1,58 @@
+From 420957e4c56f65703c6f2f24da0ea35c6b7bbcda Mon Sep 17 00:00:00 2001
+From: Stefano Brivio <sbrivio@redhat.com>
+Date: Thu, 27 Jul 2017 21:52:30 +0200
+Subject: [PATCH] utils: return default family when rtm_family is not
+ RTNL_FAMILY_IPMR/IP6MR
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1475762
+Upstream Status: iproute2.git commit 5ce897a03bfd
+
+commit 5ce897a03bfda76dc66dc1acfa014fc0e3d3022a
+Author: Hangbin Liu <liuhangbin@gmail.com>
+Date:   Thu Jul 27 17:44:15 2017 +0800
+
+    utils: return default family when rtm_family is not RTNL_FAMILY_IPMR/IP6MR
+
+    When we get a multicast route, the rtm_type is RTN_MULTICAST, but the
+    rtm_family may be AF_INET. If we only check the type with RTNL_FAMILY_IPMR,
+    we will get malformed address. e.g.
+
+    + ip -4 route add multicast 172.111.1.1 dev em1 table main
+
+    Before fix:
+    + ip route list type multicast table main
+    multicast ac6f:101:800:400:400:0:3c00:0 dev em1 scope link
+
+    After fix:
+    + ip route list type multicast table main
+    multicast 172.111.1.1 dev em1 scope link
+
+    Fixes: 56e3eb4c3400 ("ip: route: fix multicast route dumps")
+    Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
+    Acked-by: Phil Sutter <phil@nwl.cc>
+
+Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
+---
+ lib/utils.c | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+diff --git a/lib/utils.c b/lib/utils.c
+index 7d6ee53..9f55391 100644
+--- a/lib/utils.c
++++ b/lib/utils.c
+@@ -1219,5 +1219,11 @@ int get_real_family(int rtm_type, int rtm_family)
+ 	if (rtm_type != RTN_MULTICAST)
+ 		return rtm_family;
+ 
+-	return rtm_family == RTNL_FAMILY_IPMR ? AF_INET : AF_INET6;
++	if (rtm_family == RTNL_FAMILY_IPMR)
++		return AF_INET;
++
++	if (rtm_family == RTNL_FAMILY_IP6MR)
++		return AF_INET6;
++
++	return rtm_family;
+ }
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0016-link_gre6-Fix-for-changing-tclass-flowlabel.patch b/SOURCES/0016-link_gre6-Fix-for-changing-tclass-flowlabel.patch
new file mode 100644
index 0000000..f098bbe
--- /dev/null
+++ b/SOURCES/0016-link_gre6-Fix-for-changing-tclass-flowlabel.patch
@@ -0,0 +1,49 @@
+From 449517f7769dde4905564ce17e126bfd4e1f7147 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Fri, 6 Oct 2017 17:27:09 +0200
+Subject: [PATCH] link_gre6: Fix for changing tclass/flowlabel
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1487486
+Upstream Status: iproute2.git commit e7fefb3214b5a
+
+commit e7fefb3214b5a1ed030cab9df513560c503a9851
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Fri Sep 1 16:08:08 2017 +0200
+
+    link_gre6: Fix for changing tclass/flowlabel
+
+    When trying to change tclass or flowlabel of a GREv6 tunnel which has
+    the respective value set already, the code accidentally bitwise OR'ed
+    the old and the new value, leading to unexpected results. Fix this by
+    clearing the relevant bits of flowinfo variable prior to assigning the
+    new value.
+
+    Fixes: af89576d7a8c4 ("iproute2: GRE over IPv6 tunnel support.")
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ ip/link_gre6.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/ip/link_gre6.c b/ip/link_gre6.c
+index 76416b2..fe3ab64 100644
+--- a/ip/link_gre6.c
++++ b/ip/link_gre6.c
+@@ -282,6 +282,7 @@ get_failed:
+ 			else {
+ 				if (get_u8(&uval, *argv, 16))
+ 					invarg("invalid TClass", *argv);
++				flowinfo &= ~IP6_FLOWINFO_TCLASS;
+ 				flowinfo |= htonl((__u32)uval << 20) & IP6_FLOWINFO_TCLASS;
+ 				flags &= ~IP6_TNL_F_USE_ORIG_TCLASS;
+ 			}
+@@ -297,6 +298,7 @@ get_failed:
+ 					invarg("invalid Flowlabel", *argv);
+ 				if (uval > 0xFFFFF)
+ 					invarg("invalid Flowlabel", *argv);
++				flowinfo &= ~IP6_FLOWINFO_FLOWLABEL;
+ 				flowinfo |= htonl(uval) & IP6_FLOWINFO_FLOWLABEL;
+ 				flags &= ~IP6_TNL_F_USE_ORIG_FLOWLABEL;
+ 			}
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0017-netlink-Change-rtnl_dump_done-to-always-show-error.patch b/SOURCES/0017-netlink-Change-rtnl_dump_done-to-always-show-error.patch
new file mode 100644
index 0000000..c8d1956
--- /dev/null
+++ b/SOURCES/0017-netlink-Change-rtnl_dump_done-to-always-show-error.patch
@@ -0,0 +1,92 @@
+From 61ccf0f453306e727e254e6de1641bb934a3b7ec Mon Sep 17 00:00:00 2001
+From: Hangbin Liu <haliu@redhat.com>
+Date: Wed, 8 Nov 2017 14:39:07 +0800
+Subject: [PATCH] netlink: Change rtnl_dump_done to always show error
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1380803
+Upstream Status: iproute2.git commit 05a14fc12188
+
+commit 05a14fc1218885ba6236b409fbf6b89976b8636e
+Author: David Ahern <dsahern@gmail.com>
+Date:   Tue May 16 14:22:46 2017 -0700
+
+    netlink: Change rtnl_dump_done to always show error
+
+    The original code which became rtnl_dump_done only shows netlink errors
+    if the protocol is NETLINK_SOCK_DIAG, but netlink dumps always appends
+    the length which contains any error encountered during the dump. Update
+    rtnl_dump_done to always show the error if there is one.
+
+    As an *example* without this patch, dumping a route object that exceeds
+    the internal buffer size terminates with no message to the user -- the
+    dump just ends because the NLMSG_DONE attribute was received. With this
+    patch the user at least gets a message that the dump was aborted.
+
+    $ ip ro ls
+    default via 10.0.2.2 dev eth0
+    10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15
+    10.10.0.0/16 dev veth1 proto kernel scope link src 10.10.0.1
+    172.16.1.0/24 dev br0.11 proto kernel scope link src 172.16.1.1
+    Error: Buffer too small for object
+    Dump terminated
+
+    The point of this patch is to notify the user of a failure versus
+    silently exiting on a partial dump. Because the NLMSG_DONE attribute
+    was received, the entire dump needs to be restarted to use a larger
+    buffer for EMSGSIZE errors. That could be done automatically but it
+    has other user impacts (e.g., duplicate output if the dump is
+    restarted) and should be the subject of a different patch.
+
+    Signed-off-by: David Ahern <dsahern@gmail.com>
+
+Signed-off-by: Hangbin Liu <haliu@redhat.com>
+---
+ lib/libnetlink.c | 28 +++++++++++++++++-----------
+ 1 file changed, 17 insertions(+), 11 deletions(-)
+
+diff --git a/lib/libnetlink.c b/lib/libnetlink.c
+index 9303b66..e91bd5a 100644
+--- a/lib/libnetlink.c
++++ b/lib/libnetlink.c
+@@ -266,21 +266,27 @@ static int rtnl_dump_done(const struct rtnl_handle *rth,
+ {
+ 	int len = *(int *)NLMSG_DATA(h);
+ 
+-	if (rth->proto == NETLINK_SOCK_DIAG) {
+-		if (h->nlmsg_len < NLMSG_LENGTH(sizeof(int))) {
+-			fprintf(stderr, "DONE truncated\n");
+-			return -1;
+-		}
+-
++	if (h->nlmsg_len < NLMSG_LENGTH(sizeof(int))) {
++		fprintf(stderr, "DONE truncated\n");
++		return -1;
++	}
+ 
+-		if (len < 0) {
+-			errno = -len;
+-			if (errno == ENOENT || errno == EOPNOTSUPP)
+-				return -1;
++	if (len < 0) {
++		errno = -len;
++		switch (errno) {
++		case ENOENT:
++		case EOPNOTSUPP:
++			return -1;
++		case EMSGSIZE:
++			fprintf(stderr,
++				"Error: Buffer too small for object.\n");
++			break;
++		default:
+ 			perror("RTNETLINK answers");
+-			return len;
+ 		}
++		return len;
+ 	}
++
+ 	return 0;
+ }
+ 
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0018-libnetlink-drop-unused-parameter-to-rtnl_dump_done.patch b/SOURCES/0018-libnetlink-drop-unused-parameter-to-rtnl_dump_done.patch
new file mode 100644
index 0000000..cccda65
--- /dev/null
+++ b/SOURCES/0018-libnetlink-drop-unused-parameter-to-rtnl_dump_done.patch
@@ -0,0 +1,47 @@
+From 9346e08c2f9059decf889fb89f2859e7ed61f573 Mon Sep 17 00:00:00 2001
+From: Hangbin Liu <haliu@redhat.com>
+Date: Wed, 8 Nov 2017 14:39:08 +0800
+Subject: [PATCH] libnetlink: drop unused parameter to rtnl_dump_done
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1380803
+Upstream Status: iproute2.git commit 0efa625765b4
+
+commit 0efa625765b4481e1e474526eb0feda747b720e5
+Author: Stephen Hemminger <stephen@networkplumber.org>
+Date:   Thu Aug 24 15:02:32 2017 -0700
+
+    libnetlink: drop unused parameter to rtnl_dump_done
+
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+
+Signed-off-by: Hangbin Liu <haliu@redhat.com>
+---
+ lib/libnetlink.c | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/lib/libnetlink.c b/lib/libnetlink.c
+index e91bd5a..b08518d 100644
+--- a/lib/libnetlink.c
++++ b/lib/libnetlink.c
+@@ -261,8 +261,7 @@ int rtnl_dump_request_n(struct rtnl_handle *rth, struct nlmsghdr *n)
+ 	return sendmsg(rth->fd, &msg, 0);
+ }
+ 
+-static int rtnl_dump_done(const struct rtnl_handle *rth,
+-			  struct nlmsghdr *h)
++static int rtnl_dump_done(struct nlmsghdr *h)
+ {
+ 	int len = *(int *)NLMSG_DATA(h);
+ 
+@@ -368,7 +367,7 @@ int rtnl_dump_filter_l(struct rtnl_handle *rth,
+ 					dump_intr = 1;
+ 
+ 				if (h->nlmsg_type == NLMSG_DONE) {
+-					err = rtnl_dump_done(rth, h);
++					err = rtnl_dump_done(h);
+ 					if (err < 0)
+ 						return -1;
+ 
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0019-iproute-Add-support-for-extended-ack-to-rtnl_talk.patch b/SOURCES/0019-iproute-Add-support-for-extended-ack-to-rtnl_talk.patch
new file mode 100644
index 0000000..84cded6
--- /dev/null
+++ b/SOURCES/0019-iproute-Add-support-for-extended-ack-to-rtnl_talk.patch
@@ -0,0 +1,255 @@
+From a9f81b704c4e883a996927e77afdb960a7f47fd9 Mon Sep 17 00:00:00 2001
+From: Hangbin Liu <haliu@redhat.com>
+Date: Wed, 8 Nov 2017 14:39:09 +0800
+Subject: [PATCH] iproute: Add support for extended ack to rtnl_talk
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1380803
+Upstream Status: iproute2.git commit b6432e68ac2f
+Conflicts: Manually added NETLINK_EXT_ACK define to linux headers.
+
+commit b6432e68ac2f1f6b4ea50aa0d6d47e72c445c71c
+Author: Stephen Hemminger <stephen@networkplumber.org>
+Date:   Fri Aug 4 09:52:15 2017 -0700
+
+    iproute: Add support for extended ack to rtnl_talk
+
+    Add support for extended ack error reporting via libmnl.
+    Add a new function rtnl_talk_extack that takes a callback as an input
+    arg. If a netlink response contains extack attributes, the callback is
+    is invoked with the the err string, offset in the message and a pointer
+    to the message returned by the kernel.
+
+    If iproute2 is built without libmnl, it will still work but
+    extended error reports from kernel will not be available.
+
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+
+Signed-off-by: Hangbin Liu <haliu@redhat.com>
+
+squash! iproute: Add support for extended ack to rtnl_talk
+---
+ include/libnetlink.h    |   6 +++
+ include/linux/netlink.h |   1 +
+ lib/Makefile            |   7 ++++
+ lib/libnetlink.c        | 109 ++++++++++++++++++++++++++++++++++++++++++++----
+ 4 files changed, 116 insertions(+), 7 deletions(-)
+
+diff --git a/include/libnetlink.h b/include/libnetlink.h
+index bd0267d..654aebc 100644
+--- a/include/libnetlink.h
++++ b/include/libnetlink.h
+@@ -65,6 +65,9 @@ typedef int (*rtnl_listen_filter_t)(const struct sockaddr_nl *,
+ 				    struct rtnl_ctrl_data *,
+ 				    struct nlmsghdr *n, void *);
+ 
++typedef int (*nl_ext_ack_fn_t)(const char *errmsg, uint32_t off,
++			       const struct nlmsghdr *inner_nlh);
++
+ struct rtnl_dump_filter_arg {
+ 	rtnl_filter_t filter;
+ 	void *arg1;
+@@ -81,6 +84,9 @@ int rtnl_dump_filter_nc(struct rtnl_handle *rth,
+ int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+ 	      struct nlmsghdr *answer, size_t len)
+ 	__attribute__((warn_unused_result));
++int rtnl_talk_extack(struct rtnl_handle *rtnl, struct nlmsghdr *n,
++	      struct nlmsghdr *answer, size_t len, nl_ext_ack_fn_t errfn)
++	__attribute__((warn_unused_result));
+ int rtnl_talk_suppress_rtnl_errmsg(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+ 				   struct nlmsghdr *answer, size_t len)
+ 	__attribute__((warn_unused_result));
+diff --git a/include/linux/netlink.h b/include/linux/netlink.h
+index a982b3c..d1e26a2 100644
+--- a/include/linux/netlink.h
++++ b/include/linux/netlink.h
+@@ -113,6 +113,7 @@ struct nlmsgerr {
+ #define NETLINK_LISTEN_ALL_NSID		8
+ #define NETLINK_LIST_MEMBERSHIPS	9
+ #define NETLINK_CAP_ACK			10
++#define NETLINK_EXT_ACK			11
+ 
+ struct nl_pktinfo {
+ 	__u32	group;
+diff --git a/lib/Makefile b/lib/Makefile
+index 1d24ca2..f81888c 100644
+--- a/lib/Makefile
++++ b/lib/Makefile
+@@ -4,6 +4,13 @@ ifeq ($(IP_CONFIG_SETNS),y)
+ 	CFLAGS += -DHAVE_SETNS
+ endif
+ 
++ifeq ($(HAVE_MNL),y)
++	CFLAGS += $(shell $(PKG_CONFIG) libmnl --cflags)
++	LDLIBS += $(shell $(PKG_CONFIG) libmnl --libs)
++else
++@warn "libmnl required for error support"
++endif
++
+ CFLAGS += -fPIC
+ 
+ UTILOBJ = utils.o rt_names.o ll_types.o ll_proto.o ll_addr.o \
+diff --git a/lib/libnetlink.c b/lib/libnetlink.c
+index b08518d..a057831 100644
+--- a/lib/libnetlink.c
++++ b/lib/libnetlink.c
+@@ -36,6 +36,79 @@
+ 
+ int rcvbuf = 1024 * 1024;
+ 
++#ifdef HAVE_LIBMNL
++#include <libmnl/libmnl.h>
++
++static const enum mnl_attr_data_type extack_policy[NLMSGERR_ATTR_MAX + 1] = {
++	[NLMSGERR_ATTR_MSG]	= MNL_TYPE_NUL_STRING,
++	[NLMSGERR_ATTR_OFFS]	= MNL_TYPE_U32,
++};
++
++static int err_attr_cb(const struct nlattr *attr, void *data)
++{
++	const struct nlattr **tb = data;
++	uint16_t type;
++
++	if (mnl_attr_type_valid(attr, NLMSGERR_ATTR_MAX) < 0)
++		return MNL_CB_ERROR;
++
++	type = mnl_attr_get_type(attr);
++	if (mnl_attr_validate(attr, extack_policy[type]) < 0)
++		return MNL_CB_ERROR;
++
++
++	tb[type] = attr;
++	return MNL_CB_OK;
++}
++
++
++/* dump netlink extended ack error message */
++static int nl_dump_ext_err(const struct nlmsghdr *nlh, nl_ext_ack_fn_t errfn)
++{
++	struct nlattr *tb[NLMSGERR_ATTR_MAX + 1];
++	const struct nlmsgerr *err = mnl_nlmsg_get_payload(nlh);
++	const struct nlmsghdr *err_nlh = NULL;
++	unsigned int hlen = sizeof(*err);
++	const char *errmsg = NULL;
++	uint32_t off = 0;
++
++	if (!errfn)
++		return 0;
++
++	/* no TLVs, nothing to do here */
++	if (!(nlh->nlmsg_flags & NLM_F_ACK_TLVS))
++		return 0;
++
++	/* if NLM_F_CAPPED is set then the inner err msg was capped */
++	if (!(nlh->nlmsg_flags & NLM_F_CAPPED))
++		hlen += mnl_nlmsg_get_payload_len(&err->msg);
++
++	mnl_attr_parse(nlh, hlen, err_attr_cb, tb);
++
++	if (tb[NLMSGERR_ATTR_MSG])
++		errmsg = mnl_attr_get_str(tb[NLMSGERR_ATTR_MSG]);
++
++	if (tb[NLMSGERR_ATTR_OFFS]) {
++		off = mnl_attr_get_u32(tb[NLMSGERR_ATTR_OFFS]);
++
++		if (off > nlh->nlmsg_len) {
++			fprintf(stderr,
++				"Invalid offset for NLMSGERR_ATTR_OFFS\n");
++			off = 0;
++		} else if (!(nlh->nlmsg_flags & NLM_F_CAPPED))
++			err_nlh = &err->msg;
++	}
++
++	return errfn(errmsg, off, err_nlh);
++}
++#else
++/* No extended error ack without libmnl */
++static int nl_dump_ext_err(const struct nlmsghdr *nlh, nl_ext_ack_fn_t errfn)
++{
++	return 0;
++}
++#endif
++
+ void rtnl_close(struct rtnl_handle *rth)
+ {
+ 	if (rth->fd >= 0) {
+@@ -49,6 +122,7 @@ int rtnl_open_byproto(struct rtnl_handle *rth, unsigned int subscriptions,
+ {
+ 	socklen_t addr_len;
+ 	int sndbuf = 32768;
++	int one = 1;
+ 
+ 	memset(rth, 0, sizeof(*rth));
+ 
+@@ -71,6 +145,10 @@ int rtnl_open_byproto(struct rtnl_handle *rth, unsigned int subscriptions,
+ 		return -1;
+ 	}
+ 
++	/* Older kernels may no support extended ACK reporting */
++	setsockopt(rth->fd, SOL_NETLINK, NETLINK_EXT_ACK,
++		   &one, sizeof(one));
++
+ 	memset(&rth->local, 0, sizeof(rth->local));
+ 	rth->local.nl_family = AF_NETLINK;
+ 	rth->local.nl_groups = subscriptions;
+@@ -421,9 +499,19 @@ int rtnl_dump_filter_nc(struct rtnl_handle *rth,
+ 	return rtnl_dump_filter_l(rth, a);
+ }
+ 
++static void rtnl_talk_error(struct nlmsghdr *h, struct nlmsgerr *err,
++			    nl_ext_ack_fn_t errfn)
++{
++	if (nl_dump_ext_err(h, errfn))
++		return;
++
++	fprintf(stderr, "RTNETLINK answers: %s\n",
++		strerror(-err->error));
++}
++
+ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+ 		       struct nlmsghdr *answer, size_t maxlen,
+-		       bool show_rtnl_err)
++		       bool show_rtnl_err, nl_ext_ack_fn_t errfn)
+ {
+ 	int status;
+ 	unsigned int seq;
+@@ -510,10 +598,10 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+ 					return 0;
+ 				}
+ 
+-				if (rtnl->proto != NETLINK_SOCK_DIAG && show_rtnl_err)
+-					fprintf(stderr,
+-						"RTNETLINK answers: %s\n",
+-						strerror(-err->error));
++				if (rtnl->proto != NETLINK_SOCK_DIAG &&
++				    show_rtnl_err)
++					rtnl_talk_error(h, err, errfn);
++
+ 				errno = -err->error;
+ 				return -1;
+ 			}
+@@ -545,13 +633,20 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+ int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+ 	      struct nlmsghdr *answer, size_t maxlen)
+ {
+-	return __rtnl_talk(rtnl, n, answer, maxlen, true);
++	return __rtnl_talk(rtnl, n, answer, maxlen, true, NULL);
++}
++
++int rtnl_talk_extack(struct rtnl_handle *rtnl, struct nlmsghdr *n,
++		     struct nlmsghdr *answer, size_t maxlen,
++		     nl_ext_ack_fn_t errfn)
++{
++	return __rtnl_talk(rtnl, n, answer, maxlen, true, errfn);
+ }
+ 
+ int rtnl_talk_suppress_rtnl_errmsg(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+ 				   struct nlmsghdr *answer, size_t maxlen)
+ {
+-	return __rtnl_talk(rtnl, n, answer, maxlen, false);
++	return __rtnl_talk(rtnl, n, answer, maxlen, false, NULL);
+ }
+ 
+ int rtnl_listen_all_nsid(struct rtnl_handle *rth)
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0020-iplink-check-for-message-truncation-in-iplink_get.patch b/SOURCES/0020-iplink-check-for-message-truncation-in-iplink_get.patch
new file mode 100644
index 0000000..00b71ef
--- /dev/null
+++ b/SOURCES/0020-iplink-check-for-message-truncation-in-iplink_get.patch
@@ -0,0 +1,51 @@
+From 8372b7bb8f7211563d888fdd30e473c161f7d0a0 Mon Sep 17 00:00:00 2001
+From: Hangbin Liu <haliu@redhat.com>
+Date: Wed, 8 Nov 2017 14:39:10 +0800
+Subject: [PATCH] iplink: check for message truncation in iplink_get()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1380803
+Upstream Status: iproute2.git commit 6599162b958e
+
+commit 6599162b958ea5a43d729df4f30aad515db26ff4
+Author: Michal Kubecek <mkubecek@suse.cz>
+Date:   Fri Sep 1 18:39:11 2017 +0200
+
+    iplink: check for message truncation in iplink_get()
+
+    If message length exceeds maxlen argument of rtnl_talk(), it is truncated
+    to maxlen but unlike in the case of truncation to the length of local
+    buffer in rtnl_talk(), the caller doesn't get any indication of a problem.
+
+    In particular, iplink_get() passes the truncated message on and parsing it
+    results in various warnings and sometimes even a segfault (observed with
+    "ip link show dev ..." for a NIC with 125 VFs).
+
+    Handle message truncation in iplink_get() the same way as truncation in
+    rtnl_talk() would be handled: return an error.
+
+    Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
+
+Signed-off-by: Hangbin Liu <haliu@redhat.com>
+---
+ ip/iplink.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/ip/iplink.c b/ip/iplink.c
+index da3f9a7..2b2421f 100644
+--- a/ip/iplink.c
++++ b/ip/iplink.c
+@@ -1031,6 +1031,11 @@ int iplink_get(unsigned int flags, char *name, __u32 filt_mask)
+ 
+ 	if (rtnl_talk(&rth, &req.n, &answer.n, sizeof(answer)) < 0)
+ 		return -2;
++	if (answer.n.nlmsg_len > sizeof(answer.buf)) {
++		fprintf(stderr, "Message truncated from %u to %lu\n",
++			answer.n.nlmsg_len, sizeof(answer.buf));
++		return -2;
++	}
+ 
+ 	if (brief)
+ 		print_linkinfo_brief(NULL, &answer.n, stdout);
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0021-iplink-double-the-buffer-size-also-in-iplink_get.patch b/SOURCES/0021-iplink-double-the-buffer-size-also-in-iplink_get.patch
new file mode 100644
index 0000000..c6d653a
--- /dev/null
+++ b/SOURCES/0021-iplink-double-the-buffer-size-also-in-iplink_get.patch
@@ -0,0 +1,48 @@
+From c560900fc16eeac064cc7c43a96c5343fe68ae76 Mon Sep 17 00:00:00 2001
+From: Hangbin Liu <haliu@redhat.com>
+Date: Wed, 8 Nov 2017 14:39:11 +0800
+Subject: [PATCH] iplink: double the buffer size also in iplink_get()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1380803
+Upstream Status: iproute2.git commit 460c03f3f3cc
+
+commit 460c03f3f3cc436ff4673d75722ba68a6ec9343d
+Author: Michal Kubecek <mkubecek@suse.cz>
+Date:   Fri Sep 1 18:39:16 2017 +0200
+
+    iplink: double the buffer size also in iplink_get()
+
+    Commit 72b365e8e0fd ("libnetlink: Double the dump buffer size") increased
+    the buffer size for "ip link show" command to 32 KB to handle NICs with
+    large number of VFs. With "dev" filter, a different code path is taken and
+    iplink_get() still uses only 16 KB buffer.
+
+    The size of 32768 is not very future-proof as NICs supporting 120-128 VFs
+    are already in use so that single RTM_NEWLINK message in the dump can
+    exceed 30000 bytes. But it's what rtnl_talk() and rtnl_dump_filter_l() use
+    so let's be consistent. Once this proves insufficient, all three sizes
+    should be increased.
+
+    Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
+
+Signed-off-by: Hangbin Liu <haliu@redhat.com>
+---
+ ip/iplink.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/ip/iplink.c b/ip/iplink.c
+index 2b2421f..5afbadf 100644
+--- a/ip/iplink.c
++++ b/ip/iplink.c
+@@ -1015,7 +1015,7 @@ int iplink_get(unsigned int flags, char *name, __u32 filt_mask)
+ 	};
+ 	struct {
+ 		struct nlmsghdr n;
+-		char buf[16384];
++		char buf[32768];
+ 	} answer;
+ 
+ 	if (name) {
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0022-lib-libnetlink-re-malloc-buff-if-size-is-not-enough.patch b/SOURCES/0022-lib-libnetlink-re-malloc-buff-if-size-is-not-enough.patch
new file mode 100644
index 0000000..8e429aa
--- /dev/null
+++ b/SOURCES/0022-lib-libnetlink-re-malloc-buff-if-size-is-not-enough.patch
@@ -0,0 +1,252 @@
+From 49e7c0e7c8c9a982fd3aa69bbed4e306a1dcb331 Mon Sep 17 00:00:00 2001
+From: Hangbin Liu <haliu@redhat.com>
+Date: Wed, 8 Nov 2017 14:39:12 +0800
+Subject: [PATCH] lib/libnetlink: re malloc buff if size is not enough
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1380803
+Upstream Status: iproute2.git net-next commit 2d34851cd341
+
+commit 2d34851cd341f0e1b3fc17ca3e6e874229f3a1f8
+Author: Hangbin Liu <liuhangbin@gmail.com>
+Date:   Thu Oct 26 09:41:46 2017 +0800
+
+    lib/libnetlink: re malloc buff if size is not enough
+
+    With commit 72b365e8e0fd ("libnetlink: Double the dump buffer size")
+    we doubled the buffer size to support more VFs. But the VFs number is
+    increasing all the time. Some customers even use more than 200 VFs now.
+
+    We could not double it everytime when the buffer is not enough. Let's just
+    not hard code the buffer size and malloc the correct number when running.
+
+    Introduce function rtnl_recvmsg() to always return a newly allocated buffer.
+    The caller need to free it after using.
+
+    Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+
+Signed-off-by: Hangbin Liu <haliu@redhat.com>
+---
+ lib/libnetlink.c | 114 ++++++++++++++++++++++++++++++++++++++-----------------
+ 1 file changed, 80 insertions(+), 34 deletions(-)
+
+diff --git a/lib/libnetlink.c b/lib/libnetlink.c
+index a057831..446c960 100644
+--- a/lib/libnetlink.c
++++ b/lib/libnetlink.c
+@@ -386,6 +386,64 @@ static void rtnl_dump_error(const struct rtnl_handle *rth,
+ 	}
+ }
+ 
++static int __rtnl_recvmsg(int fd, struct msghdr *msg, int flags)
++{
++	int len;
++
++	do {
++		len = recvmsg(fd, msg, flags);
++	} while (len < 0 && (errno == EINTR || errno == EAGAIN));
++
++	if (len < 0) {
++		fprintf(stderr, "netlink receive error %s (%d)\n",
++			strerror(errno), errno);
++		return -errno;
++	}
++
++	if (len == 0) {
++		fprintf(stderr, "EOF on netlink\n");
++		return -ENODATA;
++	}
++
++	return len;
++}
++
++static int rtnl_recvmsg(int fd, struct msghdr *msg, char **answer)
++{
++	struct iovec *iov = msg->msg_iov;
++	char *buf;
++	int len;
++
++	iov->iov_base = NULL;
++	iov->iov_len = 0;
++
++	len = __rtnl_recvmsg(fd, msg, MSG_PEEK | MSG_TRUNC);
++	if (len < 0)
++		return len;
++
++	buf = malloc(len);
++	if (!buf) {
++		fprintf(stderr, "malloc error: not enough buffer\n");
++		return -ENOMEM;
++	}
++
++	iov->iov_base = buf;
++	iov->iov_len = len;
++
++	len = __rtnl_recvmsg(fd, msg, 0);
++	if (len < 0) {
++		free(buf);
++		return len;
++	}
++
++	if (answer)
++		*answer = buf;
++	else
++		free(buf);
++
++	return len;
++}
++
+ int rtnl_dump_filter_l(struct rtnl_handle *rth,
+ 		       const struct rtnl_dump_filter_arg *arg)
+ {
+@@ -397,31 +455,18 @@ int rtnl_dump_filter_l(struct rtnl_handle *rth,
+ 		.msg_iov = &iov,
+ 		.msg_iovlen = 1,
+ 	};
+-	char buf[32768];
++	char *buf;
+ 	int dump_intr = 0;
+ 
+-	iov.iov_base = buf;
+ 	while (1) {
+ 		int status;
+ 		const struct rtnl_dump_filter_arg *a;
+ 		int found_done = 0;
+ 		int msglen = 0;
+ 
+-		iov.iov_len = sizeof(buf);
+-		status = recvmsg(rth->fd, &msg, 0);
+-
+-		if (status < 0) {
+-			if (errno == EINTR || errno == EAGAIN)
+-				continue;
+-			fprintf(stderr, "netlink receive error %s (%d)\n",
+-				strerror(errno), errno);
+-			return -1;
+-		}
+-
+-		if (status == 0) {
+-			fprintf(stderr, "EOF on netlink\n");
+-			return -1;
+-		}
++		status = rtnl_recvmsg(rth->fd, &msg, &buf);
++		if (status < 0)
++			return status;
+ 
+ 		if (rth->dump_fp)
+ 			fwrite(buf, 1, NLMSG_ALIGN(status), rth->dump_fp);
+@@ -446,8 +491,10 @@ int rtnl_dump_filter_l(struct rtnl_handle *rth,
+ 
+ 				if (h->nlmsg_type == NLMSG_DONE) {
+ 					err = rtnl_dump_done(h);
+-					if (err < 0)
++					if (err < 0) {
++						free(buf);
+ 						return -1;
++					}
+ 
+ 					found_done = 1;
+ 					break; /* process next filter */
+@@ -455,19 +502,23 @@ int rtnl_dump_filter_l(struct rtnl_handle *rth,
+ 
+ 				if (h->nlmsg_type == NLMSG_ERROR) {
+ 					rtnl_dump_error(rth, h);
++					free(buf);
+ 					return -1;
+ 				}
+ 
+ 				if (!rth->dump_fp) {
+ 					err = a->filter(&nladdr, h, a->arg1);
+-					if (err < 0)
++					if (err < 0) {
++						free(buf);
+ 						return err;
++					}
+ 				}
+ 
+ skip_it:
+ 				h = NLMSG_NEXT(h, msglen);
+ 			}
+ 		}
++		free(buf);
+ 
+ 		if (found_done) {
+ 			if (dump_intr)
+@@ -527,7 +578,7 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+ 		.msg_iov = &iov,
+ 		.msg_iovlen = 1,
+ 	};
+-	char   buf[32768] = {};
++	char *buf;
+ 
+ 	n->nlmsg_seq = seq = ++rtnl->seq;
+ 
+@@ -540,22 +591,12 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+ 		return -1;
+ 	}
+ 
+-	iov.iov_base = buf;
+ 	while (1) {
+-		iov.iov_len = sizeof(buf);
+-		status = recvmsg(rtnl->fd, &msg, 0);
++		status = rtnl_recvmsg(rtnl->fd, &msg, &buf);
++
++		if (status < 0)
++			return status;
+ 
+-		if (status < 0) {
+-			if (errno == EINTR || errno == EAGAIN)
+-				continue;
+-			fprintf(stderr, "netlink receive error %s (%d)\n",
+-				strerror(errno), errno);
+-			return -1;
+-		}
+-		if (status == 0) {
+-			fprintf(stderr, "EOF on netlink\n");
+-			return -1;
+-		}
+ 		if (msg.msg_namelen != sizeof(nladdr)) {
+ 			fprintf(stderr,
+ 				"sender address length == %d\n",
+@@ -569,6 +610,7 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+ 			if (l < 0 || len > status) {
+ 				if (msg.msg_flags & MSG_TRUNC) {
+ 					fprintf(stderr, "Truncated message\n");
++					free(buf);
+ 					return -1;
+ 				}
+ 				fprintf(stderr,
+@@ -595,6 +637,7 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+ 					if (answer)
+ 						memcpy(answer, h,
+ 						       MIN(maxlen, h->nlmsg_len));
++					free(buf);
+ 					return 0;
+ 				}
+ 
+@@ -603,12 +646,14 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+ 					rtnl_talk_error(h, err, errfn);
+ 
+ 				errno = -err->error;
++				free(buf);
+ 				return -1;
+ 			}
+ 
+ 			if (answer) {
+ 				memcpy(answer, h,
+ 				       MIN(maxlen, h->nlmsg_len));
++				free(buf);
+ 				return 0;
+ 			}
+ 
+@@ -617,6 +662,7 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+ 			status -= NLMSG_ALIGN(len);
+ 			h = (struct nlmsghdr *)((char *)h + NLMSG_ALIGN(len));
+ 		}
++		free(buf);
+ 
+ 		if (msg.msg_flags & MSG_TRUNC) {
+ 			fprintf(stderr, "Message truncated\n");
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0023-lib-libnetlink-update-rtnl_talk-to-support-malloc-bu.patch b/SOURCES/0023-lib-libnetlink-update-rtnl_talk-to-support-malloc-bu.patch
new file mode 100644
index 0000000..7080671
--- /dev/null
+++ b/SOURCES/0023-lib-libnetlink-update-rtnl_talk-to-support-malloc-bu.patch
@@ -0,0 +1,1604 @@
+From 3d76c7eea3caaddcc0608ad35a9e6fab3df11f8e Mon Sep 17 00:00:00 2001
+From: Hangbin Liu <haliu@redhat.com>
+Date: Wed, 8 Nov 2017 14:39:13 +0800
+Subject: [PATCH] lib/libnetlink: update rtnl_talk to support malloc buff at
+ run time
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1380803
+Upstream Status: iproute2.git net-next commit 86bf43c7c2fd
+
+Conflicts:
+- iplink_get@ip/iplink.c: no function open_json_object() due to missing
+  e4a1216aeb2a ("ip: iplink.c: open/close json obj for ip -brief -json link
+  show dev DEV"). Lack of last parameter for print_linkinfo_brief() due to
+  missing 63891c70137f ("ip address: Change print_linkinfo_brief to take
+  filter as an input")
+- gre_parse_opt@ip/link_gre.c: context conflicts due to missing new
+  flag IFLA_GRE_ERSPAN_INDEX.
+- gre_parse_opt@ip/link_gre6.c: context conflicts due to missing new
+  flag IFLA_GRE_FWMARK.
+- ip6tunnel_parse_opt@ip/link_ip6tnl.c: context conflicts due to missing new
+  flag IFLA_IPTUN_FWMARK.
+- iptunnel_parse_opt@ip/link_iptnl.c: context conflicts due to missing new
+  flag IFLA_IPTUN_FWMARK.
+- vti_parse_opt@ip/link_vti.c: context conflicts due to missing new flag
+  IFLA_VTI_FWMARK
+- vti6_parse_opt@ip/link_vti6.c: context conflicts due to missing new flag
+  IFLA_VTI_FWMARK
+
+commit 86bf43c7c2fdc33d7c021b4a1add1c8facbca51c
+Author: Hangbin Liu <liuhangbin@gmail.com>
+Date:   Thu Oct 26 09:41:47 2017 +0800
+
+    lib/libnetlink: update rtnl_talk to support malloc buff at run time
+
+    This is an update for 460c03f3f3cc ("iplink: double the buffer size also in
+    iplink_get()"). After update, we will not need to double the buffer size
+    every time when VFs number increased.
+
+    With call like rtnl_talk(&rth, &req.n, NULL, 0), we can simply remove the
+    length parameter.
+
+    With call like rtnl_talk(&rth, nlh, nlh, sizeof(req), I add a new variable
+    answer to avoid overwrite data in nlh, because it may has more info after
+    nlh. also this will avoid nlh buffer not enough issue.
+
+    We need to free answer after using.
+
+    Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+
+Signed-off-by: Hangbin Liu <haliu@redhat.com>
+---
+ bridge/fdb.c         |  2 +-
+ bridge/link.c        |  2 +-
+ bridge/mdb.c         |  2 +-
+ bridge/vlan.c        |  2 +-
+ genl/ctrl.c          | 19 ++++++++++++-------
+ include/libnetlink.h |  6 +++---
+ ip/ipaddress.c       |  4 ++--
+ ip/ipaddrlabel.c     |  4 ++--
+ ip/ipfou.c           |  4 ++--
+ ip/ipila.c           |  4 ++--
+ ip/ipl2tp.c          |  8 ++++----
+ ip/iplink.c          | 38 +++++++++++++++++++-------------------
+ ip/iplink_vrf.c      | 44 ++++++++++++++++++++------------------------
+ ip/ipmacsec.c        |  2 +-
+ ip/ipneigh.c         |  2 +-
+ ip/ipnetns.c         | 23 ++++++++++++++---------
+ ip/ipntable.c        |  2 +-
+ ip/iproute.c         | 26 +++++++++++++++++---------
+ ip/iprule.c          |  6 +++---
+ ip/iptoken.c         |  2 +-
+ ip/link_gre.c        | 11 +++++++----
+ ip/link_gre6.c       | 11 +++++++----
+ ip/link_ip6tnl.c     | 11 +++++++----
+ ip/link_iptnl.c      | 11 +++++++----
+ ip/link_vti.c        | 11 +++++++----
+ ip/link_vti6.c       | 11 +++++++----
+ ip/tcp_metrics.c     |  8 +++++---
+ ip/xfrm_policy.c     | 25 +++++++++++++------------
+ ip/xfrm_state.c      | 30 ++++++++++++++++--------------
+ lib/libgenl.c        |  9 +++++++--
+ lib/libnetlink.c     | 24 +++++++++++-------------
+ misc/ss.c            |  2 +-
+ tc/m_action.c        | 12 ++++++------
+ tc/tc_class.c        |  2 +-
+ tc/tc_filter.c       |  8 +++++---
+ tc/tc_qdisc.c        |  2 +-
+ 36 files changed, 216 insertions(+), 174 deletions(-)
+
+diff --git a/bridge/fdb.c b/bridge/fdb.c
+index a71a78f..4859edb 100644
+--- a/bridge/fdb.c
++++ b/bridge/fdb.c
+@@ -529,7 +529,7 @@ static int fdb_modify(int cmd, int flags, int argc, char **argv)
+ 		return -1;
+ 	}
+ 
+-	if (rtnl_talk(&rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&rth, &req.n, NULL) < 0)
+ 		return -1;
+ 
+ 	return 0;
+diff --git a/bridge/link.c b/bridge/link.c
+index 93472ad..cc29a2a 100644
+--- a/bridge/link.c
++++ b/bridge/link.c
+@@ -426,7 +426,7 @@ static int brlink_modify(int argc, char **argv)
+ 		addattr_nest_end(&req.n, nest);
+ 	}
+ 
+-	if (rtnl_talk(&rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&rth, &req.n, NULL) < 0)
+ 		return -1;
+ 
+ 	return 0;
+diff --git a/bridge/mdb.c b/bridge/mdb.c
+index e60ff3e..fbd8184 100644
+--- a/bridge/mdb.c
++++ b/bridge/mdb.c
+@@ -298,7 +298,7 @@ static int mdb_modify(int cmd, int flags, int argc, char **argv)
+ 	entry.vid = vid;
+ 	addattr_l(&req.n, sizeof(req), MDBA_SET_ENTRY, &entry, sizeof(entry));
+ 
+-	if (rtnl_talk(&rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&rth, &req.n, NULL) < 0)
+ 		return -1;
+ 
+ 	return 0;
+diff --git a/bridge/vlan.c b/bridge/vlan.c
+index ebcdace..5d68359 100644
+--- a/bridge/vlan.c
++++ b/bridge/vlan.c
+@@ -133,7 +133,7 @@ static int vlan_modify(int cmd, int argc, char **argv)
+ 
+ 	addattr_nest_end(&req.n, afspec);
+ 
+-	if (rtnl_talk(&rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&rth, &req.n, NULL) < 0)
+ 		return -1;
+ 
+ 	return 0;
+diff --git a/genl/ctrl.c b/genl/ctrl.c
+index 6abd525..21e857c 100644
+--- a/genl/ctrl.c
++++ b/genl/ctrl.c
+@@ -55,6 +55,7 @@ int genl_ctrl_resolve_family(const char *family)
+ 	};
+ 	struct nlmsghdr *nlh = &req.n;
+ 	struct genlmsghdr *ghdr = &req.g;
++	struct nlmsghdr *answer = NULL;
+ 
+ 	if (rtnl_open_byproto(&rth, 0, NETLINK_GENERIC) < 0) {
+ 		fprintf(stderr, "Cannot open generic netlink socket\n");
+@@ -63,19 +64,19 @@ int genl_ctrl_resolve_family(const char *family)
+ 
+ 	addattr_l(nlh, 128, CTRL_ATTR_FAMILY_NAME, family, strlen(family) + 1);
+ 
+-	if (rtnl_talk(&rth, nlh, nlh, sizeof(req)) < 0) {
++	if (rtnl_talk(&rth, nlh, &answer) < 0) {
+ 		fprintf(stderr, "Error talking to the kernel\n");
+ 		goto errout;
+ 	}
+ 
+ 	{
+ 		struct rtattr *tb[CTRL_ATTR_MAX + 1];
+-		int len = nlh->nlmsg_len;
++		int len = answer->nlmsg_len;
+ 		struct rtattr *attrs;
+ 
+-		if (nlh->nlmsg_type !=  GENL_ID_CTRL) {
++		if (answer->nlmsg_type !=  GENL_ID_CTRL) {
+ 			fprintf(stderr, "Not a controller message, nlmsg_len=%d "
+-				"nlmsg_type=0x%x\n", nlh->nlmsg_len, nlh->nlmsg_type);
++				"nlmsg_type=0x%x\n", answer->nlmsg_len, answer->nlmsg_type);
+ 			goto errout;
+ 		}
+ 
+@@ -88,10 +89,11 @@ int genl_ctrl_resolve_family(const char *family)
+ 
+ 		if (len < 0) {
+ 			fprintf(stderr, "wrong controller message len %d\n", len);
++			free(answer);
+ 			return -1;
+ 		}
+ 
+-		attrs = (struct rtattr *) ((char *) ghdr + GENL_HDRLEN);
++		attrs = (struct rtattr *) ((char *) answer + NLMSG_LENGTH(GENL_HDRLEN));
+ 		parse_rtattr(tb, CTRL_ATTR_MAX, attrs, len);
+ 
+ 		if (tb[CTRL_ATTR_FAMILY_ID] == NULL) {
+@@ -103,6 +105,7 @@ int genl_ctrl_resolve_family(const char *family)
+ 	}
+ 
+ errout:
++	free(answer);
+ 	rtnl_close(&rth);
+ 	return ret;
+ }
+@@ -299,6 +302,7 @@ static int ctrl_list(int cmd, int argc, char **argv)
+ 		.g.cmd = CTRL_CMD_GETFAMILY,
+ 	};
+ 	struct nlmsghdr *nlh = &req.n;
++	struct nlmsghdr *answer = NULL;
+ 
+ 	if (rtnl_open_byproto(&rth, 0, NETLINK_GENERIC) < 0) {
+ 		fprintf(stderr, "Cannot open generic netlink socket\n");
+@@ -331,12 +335,12 @@ static int ctrl_list(int cmd, int argc, char **argv)
+ 			goto ctrl_done;
+ 		}
+ 
+-		if (rtnl_talk(&rth, nlh, nlh, sizeof(req)) < 0) {
++		if (rtnl_talk(&rth, nlh, &answer) < 0) {
+ 			fprintf(stderr, "Error talking to the kernel\n");
+ 			goto ctrl_done;
+ 		}
+ 
+-		if (print_ctrl2(NULL, nlh, (void *) stdout) < 0) {
++		if (print_ctrl2(NULL, answer, (void *) stdout) < 0) {
+ 			fprintf(stderr, "Dump terminated\n");
+ 			goto ctrl_done;
+ 		}
+@@ -358,6 +362,7 @@ static int ctrl_list(int cmd, int argc, char **argv)
+ 
+ 	ret = 0;
+ ctrl_done:
++	free(answer);
+ 	rtnl_close(&rth);
+ 	return ret;
+ }
+diff --git a/include/libnetlink.h b/include/libnetlink.h
+index 654aebc..2136d2b 100644
+--- a/include/libnetlink.h
++++ b/include/libnetlink.h
+@@ -82,13 +82,13 @@ int rtnl_dump_filter_nc(struct rtnl_handle *rth,
+ #define rtnl_dump_filter(rth, filter, arg) \
+ 	rtnl_dump_filter_nc(rth, filter, arg, 0)
+ int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+-	      struct nlmsghdr *answer, size_t len)
++	      struct nlmsghdr **answer)
+ 	__attribute__((warn_unused_result));
+ int rtnl_talk_extack(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+-	      struct nlmsghdr *answer, size_t len, nl_ext_ack_fn_t errfn)
++	      struct nlmsghdr **answer, nl_ext_ack_fn_t errfn)
+ 	__attribute__((warn_unused_result));
+ int rtnl_talk_suppress_rtnl_errmsg(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+-				   struct nlmsghdr *answer, size_t len)
++				   struct nlmsghdr **answer)
+ 	__attribute__((warn_unused_result));
+ int rtnl_send(struct rtnl_handle *rth, const void *buf, int)
+ 	__attribute__((warn_unused_result));
+diff --git a/ip/ipaddress.c b/ip/ipaddress.c
+index b8d9c7d..7492075 100644
+--- a/ip/ipaddress.c
++++ b/ip/ipaddress.c
+@@ -1356,7 +1356,7 @@ static int restore_handler(const struct sockaddr_nl *nl,
+ 
+ 	ll_init_map(&rth);
+ 
+-	ret = rtnl_talk(&rth, n, n, sizeof(*n));
++	ret = rtnl_talk(&rth, n, NULL);
+ 	if ((ret < 0) && (errno == EEXIST))
+ 		ret = 0;
+ 
+@@ -2064,7 +2064,7 @@ static int ipaddr_modify(int cmd, int flags, int argc, char **argv)
+ 		return -1;
+ 	}
+ 
+-	if (rtnl_talk(&rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&rth, &req.n, NULL) < 0)
+ 		return -2;
+ 
+ 	return 0;
+diff --git a/ip/ipaddrlabel.c b/ip/ipaddrlabel.c
+index 1d324da..6ea9bff 100644
+--- a/ip/ipaddrlabel.c
++++ b/ip/ipaddrlabel.c
+@@ -176,7 +176,7 @@ static int ipaddrlabel_modify(int cmd, int argc, char **argv)
+ 	if (req.ifal.ifal_family == AF_UNSPEC)
+ 		req.ifal.ifal_family = AF_INET6;
+ 
+-	if (rtnl_talk(&rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&rth, &req.n, NULL) < 0)
+ 		return -2;
+ 
+ 	return 0;
+@@ -203,7 +203,7 @@ static int flush_addrlabel(const struct sockaddr_nl *who, struct nlmsghdr *n, vo
+ 		if (rtnl_open(&rth2, 0) < 0)
+ 			return -1;
+ 
+-		if (rtnl_talk(&rth2, n, NULL, 0) < 0)
++		if (rtnl_talk(&rth2, n, NULL) < 0)
+ 			return -2;
+ 
+ 		rtnl_close(&rth2);
+diff --git a/ip/ipfou.c b/ip/ipfou.c
+index 00dbe15..23000dc 100644
+--- a/ip/ipfou.c
++++ b/ip/ipfou.c
+@@ -116,7 +116,7 @@ static int do_add(int argc, char **argv)
+ 
+ 	fou_parse_opt(argc, argv, &req.n, true);
+ 
+-	if (rtnl_talk(&genl_rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&genl_rth, &req.n, NULL) < 0)
+ 		return -2;
+ 
+ 	return 0;
+@@ -128,7 +128,7 @@ static int do_del(int argc, char **argv)
+ 
+ 	fou_parse_opt(argc, argv, &req.n, false);
+ 
+-	if (rtnl_talk(&genl_rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&genl_rth, &req.n, NULL) < 0)
+ 		return -2;
+ 
+ 	return 0;
+diff --git a/ip/ipila.c b/ip/ipila.c
+index 843cc16..0403fc4 100644
+--- a/ip/ipila.c
++++ b/ip/ipila.c
+@@ -220,7 +220,7 @@ static int do_add(int argc, char **argv)
+ 
+ 	ila_parse_opt(argc, argv, &req.n, true);
+ 
+-	if (rtnl_talk(&genl_rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&genl_rth, &req.n, NULL) < 0)
+ 		return -2;
+ 
+ 	return 0;
+@@ -232,7 +232,7 @@ static int do_del(int argc, char **argv)
+ 
+ 	ila_parse_opt(argc, argv, &req.n, false);
+ 
+-	if (rtnl_talk(&genl_rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&genl_rth, &req.n, NULL) < 0)
+ 		return -2;
+ 
+ 	return 0;
+diff --git a/ip/ipl2tp.c b/ip/ipl2tp.c
+index 88664c9..742adbe 100644
+--- a/ip/ipl2tp.c
++++ b/ip/ipl2tp.c
+@@ -129,7 +129,7 @@ static int create_tunnel(struct l2tp_parm *p)
+ 			addattr(&req.n, 1024, L2TP_ATTR_UDP_ZERO_CSUM6_RX);
+ 	}
+ 
+-	if (rtnl_talk(&genl_rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&genl_rth, &req.n, NULL) < 0)
+ 		return -2;
+ 
+ 	return 0;
+@@ -142,7 +142,7 @@ static int delete_tunnel(struct l2tp_parm *p)
+ 
+ 	addattr32(&req.n, 128, L2TP_ATTR_CONN_ID, p->tunnel_id);
+ 
+-	if (rtnl_talk(&genl_rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&genl_rth, &req.n, NULL) < 0)
+ 		return -2;
+ 
+ 	return 0;
+@@ -185,7 +185,7 @@ static int create_session(struct l2tp_parm *p)
+ 	if (p->ifname && p->ifname[0])
+ 		addattrstrz(&req.n, 1024, L2TP_ATTR_IFNAME, p->ifname);
+ 
+-	if (rtnl_talk(&genl_rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&genl_rth, &req.n, NULL) < 0)
+ 		return -2;
+ 
+ 	return 0;
+@@ -198,7 +198,7 @@ static int delete_session(struct l2tp_parm *p)
+ 
+ 	addattr32(&req.n, 1024, L2TP_ATTR_CONN_ID, p->tunnel_id);
+ 	addattr32(&req.n, 1024, L2TP_ATTR_SESSION_ID, p->session_id);
+-	if (rtnl_talk(&genl_rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&genl_rth, &req.n, NULL) < 0)
+ 		return -2;
+ 
+ 	return 0;
+diff --git a/ip/iplink.c b/ip/iplink.c
+index 5afbadf..b08d227 100644
+--- a/ip/iplink.c
++++ b/ip/iplink.c
+@@ -247,19 +247,26 @@ static int nl_get_ll_addr_len(unsigned int dev_index)
+ 			.ifi_index = dev_index,
+ 		}
+ 	};
++	struct nlmsghdr *answer;
+ 	struct rtattr *tb[IFLA_MAX+1];
+ 
+-	if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0)
++	if (rtnl_talk(&rth, &req.n, &answer) < 0)
+ 		return -1;
+ 
+-	len = req.n.nlmsg_len - NLMSG_LENGTH(sizeof(req.i));
+-	if (len < 0)
++	len = answer->nlmsg_len - NLMSG_LENGTH(sizeof(struct ifinfomsg));
++	if (len < 0) {
++		free(answer);
+ 		return -1;
++	}
+ 
+-	parse_rtattr_flags(tb, IFLA_MAX, IFLA_RTA(&req.i), len, NLA_F_NESTED);
+-	if (!tb[IFLA_ADDRESS])
++	parse_rtattr_flags(tb, IFLA_MAX, IFLA_RTA(NLMSG_DATA(answer)),
++			   len, NLA_F_NESTED);
++	if (!tb[IFLA_ADDRESS]) {
++		free(answer);
+ 		return -1;
++	}
+ 
++	free(answer);
+ 	return RTA_PAYLOAD(tb[IFLA_ADDRESS]);
+ }
+ 
+@@ -903,7 +910,7 @@ static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv)
+ 
+ 			req.i.ifi_index = 0;
+ 			addattr32(&req.n, sizeof(req), IFLA_GROUP, group);
+-			if (rtnl_talk(&rth, &req.n, NULL, 0) < 0)
++			if (rtnl_talk(&rth, &req.n, NULL) < 0)
+ 				return -2;
+ 			return 0;
+ 		}
+@@ -998,7 +1005,7 @@ static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv)
+ 		return -1;
+ 	}
+ 
+-	if (rtnl_talk(&rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&rth, &req.n, NULL) < 0)
+ 		return -2;
+ 
+ 	return 0;
+@@ -1013,10 +1020,7 @@ int iplink_get(unsigned int flags, char *name, __u32 filt_mask)
+ 		.n.nlmsg_type = RTM_GETLINK,
+ 		.i.ifi_family = preferred_family,
+ 	};
+-	struct {
+-		struct nlmsghdr n;
+-		char buf[32768];
+-	} answer;
++	struct nlmsghdr *answer;
+ 
+ 	if (name) {
+ 		len = strlen(name) + 1;
+@@ -1029,19 +1033,15 @@ int iplink_get(unsigned int flags, char *name, __u32 filt_mask)
+ 	}
+ 	addattr32(&req.n, sizeof(req), IFLA_EXT_MASK, filt_mask);
+ 
+-	if (rtnl_talk(&rth, &req.n, &answer.n, sizeof(answer)) < 0)
+-		return -2;
+-	if (answer.n.nlmsg_len > sizeof(answer.buf)) {
+-		fprintf(stderr, "Message truncated from %u to %lu\n",
+-			answer.n.nlmsg_len, sizeof(answer.buf));
++	if (rtnl_talk(&rth, &req.n, &answer) < 0)
+ 		return -2;
+-	}
+ 
+ 	if (brief)
+-		print_linkinfo_brief(NULL, &answer.n, stdout);
++		print_linkinfo_brief(NULL, answer, stdout);
+ 	else
+-		print_linkinfo(NULL, &answer.n, stdout);
++		print_linkinfo(NULL, answer, stdout);
+ 
++	free(answer);
+ 	return 0;
+ }
+ 
+diff --git a/ip/iplink_vrf.c b/ip/iplink_vrf.c
+index 917630e..370bb86 100644
+--- a/ip/iplink_vrf.c
++++ b/ip/iplink_vrf.c
+@@ -114,10 +114,7 @@ __u32 ipvrf_get_table(const char *name)
+ 			.ifi_family  = preferred_family,
+ 		},
+ 	};
+-	struct {
+-		struct nlmsghdr n;
+-		char buf[8192];
+-	} answer;
++	struct nlmsghdr *answer;
+ 	struct rtattr *tb[IFLA_MAX+1];
+ 	struct rtattr *li[IFLA_INFO_MAX+1];
+ 	struct rtattr *vrf_attr[IFLA_VRF_MAX + 1];
+@@ -127,8 +124,7 @@ __u32 ipvrf_get_table(const char *name)
+ 
+ 	addattr_l(&req.n, sizeof(req), IFLA_IFNAME, name, strlen(name) + 1);
+ 
+-	if (rtnl_talk_suppress_rtnl_errmsg(&rth, &req.n,
+-					   &answer.n, sizeof(answer)) < 0) {
++	if (rtnl_talk_suppress_rtnl_errmsg(&rth, &req.n, &answer) < 0) {
+ 		/* special case "default" vrf to be the main table */
+ 		if (errno == ENODEV && !strcmp(name, "default"))
+ 			rtnl_rttable_a2n(&tb_id, "main");
+@@ -136,25 +132,25 @@ __u32 ipvrf_get_table(const char *name)
+ 		return tb_id;
+ 	}
+ 
+-	ifi = NLMSG_DATA(&answer.n);
+-	len = answer.n.nlmsg_len - NLMSG_LENGTH(sizeof(*ifi));
++	ifi = NLMSG_DATA(answer);
++	len = answer->nlmsg_len - NLMSG_LENGTH(sizeof(*ifi));
+ 	if (len < 0) {
+ 		fprintf(stderr, "BUG: Invalid response to link query.\n");
+-		return 0;
++		goto out;
+ 	}
+ 
+ 	parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), len);
+ 
+ 	if (!tb[IFLA_LINKINFO])
+-		return 0;
++		goto out;
+ 
+ 	parse_rtattr_nested(li, IFLA_INFO_MAX, tb[IFLA_LINKINFO]);
+ 
+ 	if (!li[IFLA_INFO_KIND] || !li[IFLA_INFO_DATA])
+-		return 0;
++		goto out;
+ 
+ 	if (strcmp(RTA_DATA(li[IFLA_INFO_KIND]), "vrf"))
+-		return 0;
++		goto out;
+ 
+ 	parse_rtattr_nested(vrf_attr, IFLA_VRF_MAX, li[IFLA_INFO_DATA]);
+ 	if (vrf_attr[IFLA_VRF_TABLE])
+@@ -163,6 +159,8 @@ __u32 ipvrf_get_table(const char *name)
+ 	if (!tb_id)
+ 		fprintf(stderr, "BUG: VRF %s is missing table id\n", name);
+ 
++out:
++	free(answer);
+ 	return tb_id;
+ }
+ 
+@@ -182,10 +180,7 @@ int name_is_vrf(const char *name)
+ 			.ifi_family  = preferred_family,
+ 		},
+ 	};
+-	struct {
+-		struct nlmsghdr n;
+-		char buf[8192];
+-	} answer;
++	struct nlmsghdr *answer;
+ 	struct rtattr *tb[IFLA_MAX+1];
+ 	struct rtattr *li[IFLA_INFO_MAX+1];
+ 	struct ifinfomsg *ifi;
+@@ -193,29 +188,30 @@ int name_is_vrf(const char *name)
+ 
+ 	addattr_l(&req.n, sizeof(req), IFLA_IFNAME, name, strlen(name) + 1);
+ 
+-	if (rtnl_talk_suppress_rtnl_errmsg(&rth, &req.n,
+-					   &answer.n, sizeof(answer)) < 0)
++	if (rtnl_talk_suppress_rtnl_errmsg(&rth, &req.n, &answer) < 0)
+ 		return 0;
+ 
+-	ifi = NLMSG_DATA(&answer.n);
+-	len = answer.n.nlmsg_len - NLMSG_LENGTH(sizeof(*ifi));
++	ifi = NLMSG_DATA(answer);
++	len = answer->nlmsg_len - NLMSG_LENGTH(sizeof(*ifi));
+ 	if (len < 0) {
+ 		fprintf(stderr, "BUG: Invalid response to link query.\n");
+-		return 0;
++		goto out;
+ 	}
+ 
+ 	parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), len);
+ 
+ 	if (!tb[IFLA_LINKINFO])
+-		return 0;
++		goto out;
+ 
+ 	parse_rtattr_nested(li, IFLA_INFO_MAX, tb[IFLA_LINKINFO]);
+ 
+ 	if (!li[IFLA_INFO_KIND])
+-		return 0;
++		goto out;
+ 
+ 	if (strcmp(RTA_DATA(li[IFLA_INFO_KIND]), "vrf"))
+-		return 0;
++		goto out;
+ 
++out:
++	free(answer);
+ 	return ifi->ifi_index;
+ }
+diff --git a/ip/ipmacsec.c b/ip/ipmacsec.c
+index aa89a00..9a2d0eb 100644
+--- a/ip/ipmacsec.c
++++ b/ip/ipmacsec.c
+@@ -421,7 +421,7 @@ static int do_modify_nl(enum cmd c, enum macsec_nl_commands cmd, int ifindex,
+ 	addattr_nest_end(&req.n, attr_sa);
+ 
+ talk:
+-	if (rtnl_talk(&genl_rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&genl_rth, &req.n, NULL) < 0)
+ 		return -2;
+ 
+ 	return 0;
+diff --git a/ip/ipneigh.c b/ip/ipneigh.c
+index 9c38a60..32f2d55 100644
+--- a/ip/ipneigh.c
++++ b/ip/ipneigh.c
+@@ -184,7 +184,7 @@ static int ipneigh_modify(int cmd, int flags, int argc, char **argv)
+ 		return -1;
+ 	}
+ 
+-	if (rtnl_talk(&rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&rth, &req.n, NULL) < 0)
+ 		exit(2);
+ 
+ 	return 0;
+diff --git a/ip/ipnetns.c b/ip/ipnetns.c
+index 4254994..1c0ade9 100644
+--- a/ip/ipnetns.c
++++ b/ip/ipnetns.c
+@@ -95,12 +95,13 @@ static int get_netnsid_from_name(const char *name)
+ 		struct nlmsghdr n;
+ 		struct rtgenmsg g;
+ 		char            buf[1024];
+-	} answer, req = {
++	} req = {
+ 		.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtgenmsg)),
+ 		.n.nlmsg_flags = NLM_F_REQUEST,
+ 		.n.nlmsg_type = RTM_GETNSID,
+ 		.g.rtgen_family = AF_UNSPEC,
+ 	};
++	struct nlmsghdr *answer;
+ 	struct rtattr *tb[NETNSA_MAX + 1];
+ 	struct rtgenmsg *rthdr;
+ 	int len, fd;
+@@ -110,26 +111,30 @@ static int get_netnsid_from_name(const char *name)
+ 		return fd;
+ 
+ 	addattr32(&req.n, 1024, NETNSA_FD, fd);
+-	if (rtnl_talk(&rtnsh, &req.n, &answer.n, sizeof(answer)) < 0) {
++	if (rtnl_talk(&rtnsh, &req.n, &answer) < 0) {
+ 		close(fd);
+ 		return -2;
+ 	}
+ 	close(fd);
+ 
+ 	/* Validate message and parse attributes */
+-	if (answer.n.nlmsg_type == NLMSG_ERROR)
+-		return -1;
++	if (answer->nlmsg_type == NLMSG_ERROR)
++		goto err_out;
+ 
+-	rthdr = NLMSG_DATA(&answer.n);
+-	len = answer.n.nlmsg_len - NLMSG_SPACE(sizeof(*rthdr));
++	rthdr = NLMSG_DATA(answer);
++	len = answer->nlmsg_len - NLMSG_SPACE(sizeof(*rthdr));
+ 	if (len < 0)
+-		return -1;
++		goto err_out;
+ 
+ 	parse_rtattr(tb, NETNSA_MAX, NETNS_RTA(rthdr), len);
+ 
+-	if (tb[NETNSA_NSID])
++	if (tb[NETNSA_NSID]) {
++		free(answer);
+ 		return rta_getattr_u32(tb[NETNSA_NSID]);
++	}
+ 
++err_out:
++	free(answer);
+ 	return -1;
+ }
+ 
+@@ -690,7 +695,7 @@ static int set_netnsid_from_name(const char *name, int nsid)
+ 
+ 	addattr32(&req.n, 1024, NETNSA_FD, fd);
+ 	addattr32(&req.n, 1024, NETNSA_NSID, nsid);
+-	if (rtnl_talk(&rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&rth, &req.n, NULL) < 0)
+ 		err = -2;
+ 
+ 	close(fd);
+diff --git a/ip/ipntable.c b/ip/ipntable.c
+index 879626e..6506332 100644
+--- a/ip/ipntable.c
++++ b/ip/ipntable.c
+@@ -306,7 +306,7 @@ static int ipntable_modify(int cmd, int flags, int argc, char **argv)
+ 			  RTA_PAYLOAD(parms_rta));
+ 	}
+ 
+-	if (rtnl_talk(&rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&rth, &req.n, NULL) < 0)
+ 		exit(2);
+ 
+ 	return 0;
+diff --git a/ip/iproute.c b/ip/iproute.c
+index 5e23613..35fdce8 100644
+--- a/ip/iproute.c
++++ b/ip/iproute.c
+@@ -1271,7 +1271,7 @@ static int iproute_modify(int cmd, unsigned int flags, int argc, char **argv)
+ 	if (!type_ok && req.r.rtm_family == AF_MPLS)
+ 		req.r.rtm_type = RTN_UNICAST;
+ 
+-	if (rtnl_talk(&rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&rth, &req.n, NULL) < 0)
+ 		return -2;
+ 
+ 	return 0;
+@@ -1649,6 +1649,7 @@ static int iproute_get(int argc, char **argv)
+ 	};
+ 	char  *idev = NULL;
+ 	char  *odev = NULL;
++	struct nlmsghdr *answer;
+ 	int connected = 0;
+ 	int from_ok = 0;
+ 	unsigned int mark = 0;
+@@ -1753,26 +1754,29 @@ static int iproute_get(int argc, char **argv)
+ 
+ 	req.r.rtm_flags |= RTM_F_LOOKUP_TABLE;
+ 
+-	if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0)
++	if (rtnl_talk(&rth, &req.n, &answer) < 0)
+ 		return -2;
+ 
+ 	if (connected && !from_ok) {
+-		struct rtmsg *r = NLMSG_DATA(&req.n);
+-		int len = req.n.nlmsg_len;
++		struct rtmsg *r = NLMSG_DATA(answer);
++		int len = answer->nlmsg_len;
+ 		struct rtattr *tb[RTA_MAX+1];
+ 
+-		if (print_route(NULL, &req.n, (void *)stdout) < 0) {
++		if (print_route(NULL, answer, (void *)stdout) < 0) {
+ 			fprintf(stderr, "An error :-)\n");
++			free(answer);
+ 			return -1;
+ 		}
+ 
+-		if (req.n.nlmsg_type != RTM_NEWROUTE) {
++		if (answer->nlmsg_type != RTM_NEWROUTE) {
+ 			fprintf(stderr, "Not a route?\n");
++			free(answer);
+ 			return -1;
+ 		}
+ 		len -= NLMSG_LENGTH(sizeof(*r));
+ 		if (len < 0) {
+ 			fprintf(stderr, "Wrong len %d\n", len);
++			free(answer);
+ 			return -1;
+ 		}
+ 
+@@ -1783,6 +1787,7 @@ static int iproute_get(int argc, char **argv)
+ 			r->rtm_src_len = 8*RTA_PAYLOAD(tb[RTA_PREFSRC]);
+ 		} else if (!tb[RTA_SRC]) {
+ 			fprintf(stderr, "Failed to connect the route\n");
++			free(answer);
+ 			return -1;
+ 		}
+ 		if (!odev && tb[RTA_OIF])
+@@ -1796,15 +1801,18 @@ static int iproute_get(int argc, char **argv)
+ 		req.n.nlmsg_flags = NLM_F_REQUEST;
+ 		req.n.nlmsg_type = RTM_GETROUTE;
+ 
+-		if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0)
++		free(answer);
++		if (rtnl_talk(&rth, &req.n, &answer) < 0)
+ 			return -2;
+ 	}
+ 
+-	if (print_route(NULL, &req.n, (void *)stdout) < 0) {
++	if (print_route(NULL, answer, (void *)stdout) < 0) {
+ 		fprintf(stderr, "An error :-)\n");
++		free(answer);
+ 		return -1;
+ 	}
+ 
++	free(answer);
+ 	return 0;
+ }
+ 
+@@ -1848,7 +1856,7 @@ restore:
+ 
+ 	ll_init_map(&rth);
+ 
+-	ret = rtnl_talk(&rth, n, n, sizeof(*n));
++	ret = rtnl_talk(&rth, n, NULL);
+ 	if ((ret < 0) && (errno == EEXIST))
+ 		ret = 0;
+ 
+diff --git a/ip/iprule.c b/ip/iprule.c
+index 8313138..e64b4d7 100644
+--- a/ip/iprule.c
++++ b/ip/iprule.c
+@@ -393,7 +393,7 @@ static int flush_rule(const struct sockaddr_nl *who, struct nlmsghdr *n,
+ 		if (rtnl_open(&rth2, 0) < 0)
+ 			return -1;
+ 
+-		if (rtnl_talk(&rth2, n, NULL, 0) < 0)
++		if (rtnl_talk(&rth2, n, NULL) < 0)
+ 			return -2;
+ 
+ 		rtnl_close(&rth2);
+@@ -553,7 +553,7 @@ static int restore_handler(const struct sockaddr_nl *nl,
+ 
+ 	ll_init_map(&rth);
+ 
+-	ret = rtnl_talk(&rth, n, n, sizeof(*n));
++	ret = rtnl_talk(&rth, n, NULL);
+ 	if ((ret < 0) && (errno == EEXIST))
+ 		ret = 0;
+ 
+@@ -760,7 +760,7 @@ static int iprule_modify(int cmd, int argc, char **argv)
+ 	if (!table_ok && cmd == RTM_NEWRULE)
+ 		req.r.rtm_table = RT_TABLE_MAIN;
+ 
+-	if (rtnl_talk(&rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&rth, &req.n, NULL) < 0)
+ 		return -2;
+ 
+ 	return 0;
+diff --git a/ip/iptoken.c b/ip/iptoken.c
+index 1869f76..0528bad 100644
+--- a/ip/iptoken.c
++++ b/ip/iptoken.c
+@@ -166,7 +166,7 @@ static int iptoken_set(int argc, char **argv, bool delete)
+ 	addattr_nest_end(&req.n, afs6);
+ 	addattr_nest_end(&req.n, afs);
+ 
+-	if (rtnl_talk(&rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&rth, &req.n, NULL) < 0)
+ 		return -2;
+ 
+ 	return 0;
+diff --git a/ip/link_gre.c b/ip/link_gre.c
+index 35d437a..ced9936 100644
+--- a/ip/link_gre.c
++++ b/ip/link_gre.c
+@@ -64,7 +64,6 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
+ 	struct {
+ 		struct nlmsghdr n;
+ 		struct ifinfomsg i;
+-		char buf[16384];
+ 	} req = {
+ 		.n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi)),
+ 		.n.nlmsg_flags = NLM_F_REQUEST,
+@@ -72,6 +71,7 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
+ 		.i.ifi_family = preferred_family,
+ 		.i.ifi_index = ifi->ifi_index,
+ 	};
++	struct nlmsghdr *answer = NULL;
+ 	struct rtattr *tb[IFLA_MAX + 1];
+ 	struct rtattr *linkinfo[IFLA_INFO_MAX+1];
+ 	struct rtattr *greinfo[IFLA_GRE_MAX + 1];
+@@ -93,19 +93,20 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
+ 	__u8 metadata = 0;
+ 
+ 	if (!(n->nlmsg_flags & NLM_F_CREATE)) {
+-		if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) {
++		if (rtnl_talk(&rth, &req.n, &answer) < 0) {
+ get_failed:
+ 			fprintf(stderr,
+ 				"Failed to get existing tunnel info.\n");
++			free(answer);
+ 			return -1;
+ 		}
+ 
+-		len = req.n.nlmsg_len;
++		len = answer->nlmsg_len;
+ 		len -= NLMSG_LENGTH(sizeof(*ifi));
+ 		if (len < 0)
+ 			goto get_failed;
+ 
+-		parse_rtattr(tb, IFLA_MAX, IFLA_RTA(&req.i), len);
++		parse_rtattr(tb, IFLA_MAX, IFLA_RTA(NLMSG_DATA(answer)), len);
+ 
+ 		if (!tb[IFLA_LINKINFO])
+ 			goto get_failed;
+@@ -160,6 +161,8 @@ get_failed:
+ 
+ 		if (greinfo[IFLA_GRE_COLLECT_METADATA])
+ 			metadata = 1;
++
++		free(answer);
+ 	}
+ 
+ 	while (argc > 0) {
+diff --git a/ip/link_gre6.c b/ip/link_gre6.c
+index fe3ab64..932f9ee 100644
+--- a/ip/link_gre6.c
++++ b/ip/link_gre6.c
+@@ -76,7 +76,6 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
+ 	struct {
+ 		struct nlmsghdr n;
+ 		struct ifinfomsg i;
+-		char buf[1024];
+ 	} req = {
+ 		.n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi)),
+ 		.n.nlmsg_flags = NLM_F_REQUEST,
+@@ -84,6 +83,7 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
+ 		.i.ifi_family = preferred_family,
+ 		.i.ifi_index = ifi->ifi_index,
+ 	};
++	struct nlmsghdr *answer = NULL;
+ 	struct rtattr *tb[IFLA_MAX + 1];
+ 	struct rtattr *linkinfo[IFLA_INFO_MAX+1];
+ 	struct rtattr *greinfo[IFLA_GRE_MAX + 1];
+@@ -105,19 +105,20 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
+ 	int len;
+ 
+ 	if (!(n->nlmsg_flags & NLM_F_CREATE)) {
+-		if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) {
++		if (rtnl_talk(&rth, &req.n, &answer) < 0) {
+ get_failed:
+ 			fprintf(stderr,
+ 				"Failed to get existing tunnel info.\n");
++			free(answer);
+ 			return -1;
+ 		}
+ 
+-		len = req.n.nlmsg_len;
++		len = answer->nlmsg_len;
+ 		len -= NLMSG_LENGTH(sizeof(*ifi));
+ 		if (len < 0)
+ 			goto get_failed;
+ 
+-		parse_rtattr(tb, IFLA_MAX, IFLA_RTA(&req.i), len);
++		parse_rtattr(tb, IFLA_MAX, IFLA_RTA(NLMSG_DATA(answer)), len);
+ 
+ 		if (!tb[IFLA_LINKINFO])
+ 			goto get_failed;
+@@ -174,6 +175,8 @@ get_failed:
+ 
+ 		if (greinfo[IFLA_GRE_ENCAP_DPORT])
+ 			encapdport = rta_getattr_u16(greinfo[IFLA_GRE_ENCAP_DPORT]);
++
++		free(answer);
+ 	}
+ 
+ 	while (argc > 0) {
+diff --git a/ip/link_ip6tnl.c b/ip/link_ip6tnl.c
+index 6bb968d..2304364 100644
+--- a/ip/link_ip6tnl.c
++++ b/ip/link_ip6tnl.c
+@@ -74,7 +74,6 @@ static int ip6tunnel_parse_opt(struct link_util *lu, int argc, char **argv,
+ 	struct {
+ 		struct nlmsghdr n;
+ 		struct ifinfomsg i;
+-		char buf[2048];
+ 	} req = {
+ 		.n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi)),
+ 		.n.nlmsg_flags = NLM_F_REQUEST,
+@@ -82,6 +81,7 @@ static int ip6tunnel_parse_opt(struct link_util *lu, int argc, char **argv,
+ 		.i.ifi_family = preferred_family,
+ 		.i.ifi_index = ifi->ifi_index,
+ 	};
++	struct nlmsghdr *answer = NULL;
+ 	struct rtattr *tb[IFLA_MAX + 1];
+ 	struct rtattr *linkinfo[IFLA_INFO_MAX+1];
+ 	struct rtattr *iptuninfo[IFLA_IPTUN_MAX + 1];
+@@ -101,19 +101,20 @@ static int ip6tunnel_parse_opt(struct link_util *lu, int argc, char **argv,
+ 	__u8 metadata = 0;
+ 
+ 	if (!(n->nlmsg_flags & NLM_F_CREATE)) {
+-		if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) {
++		if (rtnl_talk(&rth, &req.n, &answer) < 0) {
+ get_failed:
+ 			fprintf(stderr,
+ 				"Failed to get existing tunnel info.\n");
++			free(answer);
+ 			return -1;
+ 		}
+ 
+-		len = req.n.nlmsg_len;
++		len = answer->nlmsg_len;
+ 		len -= NLMSG_LENGTH(sizeof(*ifi));
+ 		if (len < 0)
+ 			goto get_failed;
+ 
+-		parse_rtattr(tb, IFLA_MAX, IFLA_RTA(&req.i), len);
++		parse_rtattr(tb, IFLA_MAX, IFLA_RTA(NLMSG_DATA(answer)), len);
+ 
+ 		if (!tb[IFLA_LINKINFO])
+ 			goto get_failed;
+@@ -153,6 +154,8 @@ get_failed:
+ 			proto = rta_getattr_u8(iptuninfo[IFLA_IPTUN_PROTO]);
+ 		if (iptuninfo[IFLA_IPTUN_COLLECT_METADATA])
+ 			metadata = 1;
++
++		free(answer);
+ 	}
+ 
+ 	while (argc > 0) {
+diff --git a/ip/link_iptnl.c b/ip/link_iptnl.c
+index f180b92..528e287 100644
+--- a/ip/link_iptnl.c
++++ b/ip/link_iptnl.c
+@@ -72,7 +72,6 @@ static int iptunnel_parse_opt(struct link_util *lu, int argc, char **argv,
+ 	struct {
+ 		struct nlmsghdr n;
+ 		struct ifinfomsg i;
+-		char buf[2048];
+ 	} req = {
+ 		.n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi)),
+ 		.n.nlmsg_flags = NLM_F_REQUEST,
+@@ -80,6 +79,7 @@ static int iptunnel_parse_opt(struct link_util *lu, int argc, char **argv,
+ 		.i.ifi_family = preferred_family,
+ 		.i.ifi_index = ifi->ifi_index,
+ 	};
++	struct nlmsghdr *answer = NULL;
+ 	struct rtattr *tb[IFLA_MAX + 1];
+ 	struct rtattr *linkinfo[IFLA_INFO_MAX+1];
+ 	struct rtattr *iptuninfo[IFLA_IPTUN_MAX + 1];
+@@ -103,19 +103,20 @@ static int iptunnel_parse_opt(struct link_util *lu, int argc, char **argv,
+ 	__u8 metadata = 0;
+ 
+ 	if (!(n->nlmsg_flags & NLM_F_CREATE)) {
+-		if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) {
++		if (rtnl_talk(&rth, &req.n, &answer) < 0) {
+ get_failed:
+ 			fprintf(stderr,
+ 				"Failed to get existing tunnel info.\n");
++			free(answer);
+ 			return -1;
+ 		}
+ 
+-		len = req.n.nlmsg_len;
++		len = answer->nlmsg_len;
+ 		len -= NLMSG_LENGTH(sizeof(*ifi));
+ 		if (len < 0)
+ 			goto get_failed;
+ 
+-		parse_rtattr(tb, IFLA_MAX, IFLA_RTA(&req.i), len);
++		parse_rtattr(tb, IFLA_MAX, IFLA_RTA(NLMSG_DATA(answer)), len);
+ 
+ 		if (!tb[IFLA_LINKINFO])
+ 			goto get_failed;
+@@ -179,6 +180,8 @@ get_failed:
+ 				rta_getattr_u16(iptuninfo[IFLA_IPTUN_6RD_RELAY_PREFIXLEN]);
+ 		if (iptuninfo[IFLA_IPTUN_COLLECT_METADATA])
+ 			metadata = 1;
++
++		free(answer);
+ 	}
+ 
+ 	while (argc > 0) {
+diff --git a/ip/link_vti.c b/ip/link_vti.c
+index 95bc23e..d2aacbe 100644
+--- a/ip/link_vti.c
++++ b/ip/link_vti.c
+@@ -51,7 +51,6 @@ static int vti_parse_opt(struct link_util *lu, int argc, char **argv,
+ 	struct {
+ 		struct nlmsghdr n;
+ 		struct ifinfomsg i;
+-		char buf[1024];
+ 	} req = {
+ 		.n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi)),
+ 		.n.nlmsg_flags = NLM_F_REQUEST,
+@@ -59,6 +58,7 @@ static int vti_parse_opt(struct link_util *lu, int argc, char **argv,
+ 		.i.ifi_family = preferred_family,
+ 		.i.ifi_index = ifi->ifi_index,
+ 	};
++	struct nlmsghdr *answer = NULL;
+ 	struct rtattr *tb[IFLA_MAX + 1];
+ 	struct rtattr *linkinfo[IFLA_INFO_MAX+1];
+ 	struct rtattr *vtiinfo[IFLA_VTI_MAX + 1];
+@@ -70,19 +70,20 @@ static int vti_parse_opt(struct link_util *lu, int argc, char **argv,
+ 	int len;
+ 
+ 	if (!(n->nlmsg_flags & NLM_F_CREATE)) {
+-		if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) {
++		if (rtnl_talk(&rth, &req.n, &answer) < 0) {
+ get_failed:
+ 			fprintf(stderr,
+ 				"Failed to get existing tunnel info.\n");
++			free(answer);
+ 			return -1;
+ 		}
+ 
+-		len = req.n.nlmsg_len;
++		len = answer->nlmsg_len;
+ 		len -= NLMSG_LENGTH(sizeof(*ifi));
+ 		if (len < 0)
+ 			goto get_failed;
+ 
+-		parse_rtattr(tb, IFLA_MAX, IFLA_RTA(&req.i), len);
++		parse_rtattr(tb, IFLA_MAX, IFLA_RTA(NLMSG_DATA(answer)), len);
+ 
+ 		if (!tb[IFLA_LINKINFO])
+ 			goto get_failed;
+@@ -109,6 +110,8 @@ get_failed:
+ 
+ 		if (vtiinfo[IFLA_VTI_LINK])
+ 			link = rta_getattr_u8(vtiinfo[IFLA_VTI_LINK]);
++
++		free(answer);
+ 	}
+ 
+ 	while (argc > 0) {
+diff --git a/ip/link_vti6.c b/ip/link_vti6.c
+index 9ca127a..aedfbea 100644
+--- a/ip/link_vti6.c
++++ b/ip/link_vti6.c
+@@ -46,7 +46,6 @@ static int vti6_parse_opt(struct link_util *lu, int argc, char **argv,
+ 	struct {
+ 		struct nlmsghdr n;
+ 		struct ifinfomsg i;
+-		char buf[1024];
+ 	} req = {
+ 		.n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi)),
+ 		.n.nlmsg_flags = NLM_F_REQUEST,
+@@ -54,6 +53,7 @@ static int vti6_parse_opt(struct link_util *lu, int argc, char **argv,
+ 		.i.ifi_family = preferred_family,
+ 		.i.ifi_index = ifi->ifi_index,
+ 	};
++	struct nlmsghdr *answer = NULL;
+ 	struct rtattr *tb[IFLA_MAX + 1];
+ 	struct rtattr *linkinfo[IFLA_INFO_MAX+1];
+ 	struct rtattr *vtiinfo[IFLA_VTI_MAX + 1];
+@@ -65,19 +65,20 @@ static int vti6_parse_opt(struct link_util *lu, int argc, char **argv,
+ 	int len;
+ 
+ 	if (!(n->nlmsg_flags & NLM_F_CREATE)) {
+-		if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) {
++		if (rtnl_talk(&rth, &req.n, &answer) < 0) {
+ get_failed:
+ 			fprintf(stderr,
+ 				"Failed to get existing tunnel info.\n");
++			free(answer);
+ 			return -1;
+ 		}
+ 
+-		len = req.n.nlmsg_len;
++		len = answer->nlmsg_len;
+ 		len -= NLMSG_LENGTH(sizeof(*ifi));
+ 		if (len < 0)
+ 			goto get_failed;
+ 
+-		parse_rtattr(tb, IFLA_MAX, IFLA_RTA(&req.i), len);
++		parse_rtattr(tb, IFLA_MAX, IFLA_RTA(NLMSG_DATA(answer)), len);
+ 
+ 		if (!tb[IFLA_LINKINFO])
+ 			goto get_failed;
+@@ -104,6 +105,8 @@ get_failed:
+ 
+ 		if (vtiinfo[IFLA_VTI_LINK])
+ 			link = rta_getattr_u8(vtiinfo[IFLA_VTI_LINK]);
++
++		free(answer);
+ 	}
+ 
+ 	while (argc > 0) {
+diff --git a/ip/tcp_metrics.c b/ip/tcp_metrics.c
+index 8972acd..3f9790e 100644
+--- a/ip/tcp_metrics.c
++++ b/ip/tcp_metrics.c
+@@ -306,6 +306,7 @@ static int process_msg(const struct sockaddr_nl *who, struct nlmsghdr *n,
+ static int tcpm_do_cmd(int cmd, int argc, char **argv)
+ {
+ 	TCPM_REQUEST(req, 1024, TCP_METRICS_CMD_GET, NLM_F_REQUEST);
++	struct nlmsghdr *answer;
+ 	int atype = -1, stype = -1;
+ 	int ack;
+ 
+@@ -457,15 +458,16 @@ static int tcpm_do_cmd(int cmd, int argc, char **argv)
+ 	}
+ 
+ 	if (ack) {
+-		if (rtnl_talk(&grth, &req.n, NULL, 0) < 0)
++		if (rtnl_talk(&grth, &req.n, NULL) < 0)
+ 			return -2;
+ 	} else if (atype >= 0) {
+-		if (rtnl_talk(&grth, &req.n, &req.n, sizeof(req)) < 0)
++		if (rtnl_talk(&grth, &req.n, &answer) < 0)
+ 			return -2;
+-		if (process_msg(NULL, &req.n, stdout) < 0) {
++		if (process_msg(NULL, answer, stdout) < 0) {
+ 			fprintf(stderr, "Dump terminated\n");
+ 			exit(1);
+ 		}
++		free(answer);
+ 	} else {
+ 		req.n.nlmsg_seq = grth.dump = ++grth.seq;
+ 		if (rtnl_send(&grth, &req, req.n.nlmsg_len) < 0) {
+diff --git a/ip/xfrm_policy.c b/ip/xfrm_policy.c
+index de689c4..98460a0 100644
+--- a/ip/xfrm_policy.c
++++ b/ip/xfrm_policy.c
+@@ -386,7 +386,7 @@ static int xfrm_policy_modify(int cmd, unsigned int flags, int argc, char **argv
+ 	if (req.xpinfo.sel.family == AF_UNSPEC)
+ 		req.xpinfo.sel.family = AF_INET;
+ 
+-	if (rtnl_talk(&rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&rth, &req.n, NULL) < 0)
+ 		exit(2);
+ 
+ 	rtnl_close(&rth);
+@@ -548,7 +548,7 @@ int xfrm_policy_print(const struct sockaddr_nl *who, struct nlmsghdr *n,
+ }
+ 
+ static int xfrm_policy_get_or_delete(int argc, char **argv, int delete,
+-				     void *res_nlbuf, size_t res_size)
++				     struct nlmsghdr **answer)
+ {
+ 	struct rtnl_handle rth;
+ 	struct {
+@@ -659,7 +659,7 @@ static int xfrm_policy_get_or_delete(int argc, char **argv, int delete,
+ 			  (void *)&ctx, ctx.sctx.len);
+ 	}
+ 
+-	if (rtnl_talk(&rth, &req.n, res_nlbuf, res_size) < 0)
++	if (rtnl_talk(&rth, &req.n, answer) < 0)
+ 		exit(2);
+ 
+ 	rtnl_close(&rth);
+@@ -669,21 +669,21 @@ static int xfrm_policy_get_or_delete(int argc, char **argv, int delete,
+ 
+ static int xfrm_policy_delete(int argc, char **argv)
+ {
+-	return xfrm_policy_get_or_delete(argc, argv, 1, NULL, 0);
++	return xfrm_policy_get_or_delete(argc, argv, 1, NULL);
+ }
+ 
+ static int xfrm_policy_get(int argc, char **argv)
+ {
+-	char buf[NLMSG_BUF_SIZE] = {};
+-	struct nlmsghdr *n = (struct nlmsghdr *)buf;
++	struct nlmsghdr *n = NULL;
+ 
+-	xfrm_policy_get_or_delete(argc, argv, 0, n, sizeof(buf));
++	xfrm_policy_get_or_delete(argc, argv, 0, &n);
+ 
+ 	if (xfrm_policy_print(NULL, n, (void *)stdout) < 0) {
+ 		fprintf(stderr, "An error :-)\n");
+ 		exit(1);
+ 	}
+ 
++	free(n);
+ 	return 0;
+ }
+ 
+@@ -1049,7 +1049,7 @@ static int xfrm_spd_setinfo(int argc, char **argv)
+ 	if (rtnl_open_byproto(&rth, 0, NETLINK_XFRM) < 0)
+ 		exit(1);
+ 
+-	if (rtnl_talk(&rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&rth, &req.n, NULL) < 0)
+ 		exit(2);
+ 
+ 	rtnl_close(&rth);
+@@ -1063,22 +1063,23 @@ static int xfrm_spd_getinfo(int argc, char **argv)
+ 	struct {
+ 		struct nlmsghdr			n;
+ 		__u32				flags;
+-		char				ans[128];
+ 	} req = {
+ 		.n.nlmsg_len = NLMSG_LENGTH(sizeof(__u32)),
+ 		.n.nlmsg_flags = NLM_F_REQUEST,
+ 		.n.nlmsg_type = XFRM_MSG_GETSPDINFO,
+ 		.flags = 0XFFFFFFFF,
+ 	};
++	struct nlmsghdr *answer;
+ 
+ 	if (rtnl_open_byproto(&rth, 0, NETLINK_XFRM) < 0)
+ 		exit(1);
+ 
+-	if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0)
++	if (rtnl_talk(&rth, &req.n, &answer) < 0)
+ 		exit(2);
+ 
+-	print_spdinfo(&req.n, (void *)stdout);
++	print_spdinfo(answer, (void *)stdout);
+ 
++	free(answer);
+ 	rtnl_close(&rth);
+ 
+ 	return 0;
+@@ -1123,7 +1124,7 @@ static int xfrm_policy_flush(int argc, char **argv)
+ 	if (show_stats > 1)
+ 		fprintf(stderr, "Flush policy\n");
+ 
+-	if (rtnl_talk(&rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&rth, &req.n, NULL) < 0)
+ 		exit(2);
+ 
+ 	rtnl_close(&rth);
+diff --git a/ip/xfrm_state.c b/ip/xfrm_state.c
+index ea7d4f3..04ed349 100644
+--- a/ip/xfrm_state.c
++++ b/ip/xfrm_state.c
+@@ -677,7 +677,7 @@ static int xfrm_state_modify(int cmd, unsigned int flags, int argc, char **argv)
+ 	if (req.xsinfo.family == AF_UNSPEC)
+ 		req.xsinfo.family = AF_INET;
+ 
+-	if (rtnl_talk(&rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&rth, &req.n, NULL) < 0)
+ 		exit(2);
+ 
+ 	rtnl_close(&rth);
+@@ -708,8 +708,7 @@ static int xfrm_state_allocspi(int argc, char **argv)
+ 	char *minp = NULL;
+ 	char *maxp = NULL;
+ 	struct xfrm_mark mark = {0, 0};
+-	char res_buf[NLMSG_BUF_SIZE] = {};
+-	struct nlmsghdr *res_n = (struct nlmsghdr *)res_buf;
++	struct nlmsghdr *answer;
+ 
+ 	while (argc > 0) {
+ 		if (strcmp(*argv, "mode") == 0) {
+@@ -809,14 +808,15 @@ static int xfrm_state_allocspi(int argc, char **argv)
+ 		req.xspi.info.family = AF_INET;
+ 
+ 
+-	if (rtnl_talk(&rth, &req.n, res_n, sizeof(res_buf)) < 0)
++	if (rtnl_talk(&rth, &req.n, &answer) < 0)
+ 		exit(2);
+ 
+-	if (xfrm_state_print(NULL, res_n, (void *)stdout) < 0) {
++	if (xfrm_state_print(NULL, answer, (void *)stdout) < 0) {
+ 		fprintf(stderr, "An error :-)\n");
+ 		exit(1);
+ 	}
+ 
++	free(answer);
+ 	rtnl_close(&rth);
+ 
+ 	return 0;
+@@ -997,19 +997,20 @@ static int xfrm_state_get_or_delete(int argc, char **argv, int delete)
+ 		req.xsid.family = AF_INET;
+ 
+ 	if (delete) {
+-		if (rtnl_talk(&rth, &req.n, NULL, 0) < 0)
++		if (rtnl_talk(&rth, &req.n, NULL) < 0)
+ 			exit(2);
+ 	} else {
+-		char buf[NLMSG_BUF_SIZE] = {};
+-		struct nlmsghdr *res_n = (struct nlmsghdr *)buf;
++		struct nlmsghdr *answer;
+ 
+-		if (rtnl_talk(&rth, &req.n, res_n, sizeof(req)) < 0)
++		if (rtnl_talk(&rth, &req.n, &answer) < 0)
+ 			exit(2);
+ 
+-		if (xfrm_state_print(NULL, res_n, (void *)stdout) < 0) {
++		if (xfrm_state_print(NULL, answer, (void *)stdout) < 0) {
+ 			fprintf(stderr, "An error :-)\n");
+ 			exit(1);
+ 		}
++
++		free(answer);
+ 	}
+ 
+ 	rtnl_close(&rth);
+@@ -1265,22 +1266,23 @@ static int xfrm_sad_getinfo(int argc, char **argv)
+ 	struct {
+ 		struct nlmsghdr			n;
+ 		__u32				flags;
+-		char				ans[64];
+ 	} req = {
+ 		.n.nlmsg_len = NLMSG_LENGTH(sizeof(req.flags)),
+ 		.n.nlmsg_flags = NLM_F_REQUEST,
+ 		.n.nlmsg_type = XFRM_MSG_GETSADINFO,
+ 		.flags = 0XFFFFFFFF,
+ 	};
++	struct nlmsghdr *answer;
+ 
+ 	if (rtnl_open_byproto(&rth, 0, NETLINK_XFRM) < 0)
+ 		exit(1);
+ 
+-	if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0)
++	if (rtnl_talk(&rth, &req.n, &answer) < 0)
+ 		exit(2);
+ 
+-	print_sadinfo(&req.n, (void *)stdout);
++	print_sadinfo(answer, (void *)stdout);
+ 
++	free(answer);
+ 	rtnl_close(&rth);
+ 
+ 	return 0;
+@@ -1327,7 +1329,7 @@ static int xfrm_state_flush(int argc, char **argv)
+ 		fprintf(stderr, "Flush state with XFRM-PROTO value \"%s\"\n",
+ 			strxf_xfrmproto(req.xsf.proto));
+ 
+-	if (rtnl_talk(&rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&rth, &req.n, NULL) < 0)
+ 		exit(2);
+ 
+ 	rtnl_close(&rth);
+diff --git a/lib/libgenl.c b/lib/libgenl.c
+index 50d2d92..bb5fbb5 100644
+--- a/lib/libgenl.c
++++ b/lib/libgenl.c
+@@ -49,16 +49,21 @@ int genl_resolve_family(struct rtnl_handle *grth, const char *family)
+ {
+ 	GENL_REQUEST(req, 1024, GENL_ID_CTRL, 0, 0, CTRL_CMD_GETFAMILY,
+ 		     NLM_F_REQUEST);
++	struct nlmsghdr *answer;
++	int fnum;
+ 
+ 	addattr_l(&req.n, sizeof(req), CTRL_ATTR_FAMILY_NAME,
+ 		  family, strlen(family) + 1);
+ 
+-	if (rtnl_talk(grth, &req.n, &req.n, sizeof(req)) < 0) {
++	if (rtnl_talk(grth, &req.n, &answer) < 0) {
+ 		fprintf(stderr, "Error talking to the kernel\n");
+ 		return -2;
+ 	}
+ 
+-	return genl_parse_getfamily(&req.n);
++	fnum = genl_parse_getfamily(answer);
++	free(answer);
++
++	return fnum;
+ }
+ 
+ int genl_init_handle(struct rtnl_handle *grth, const char *family,
+diff --git a/lib/libnetlink.c b/lib/libnetlink.c
+index 446c960..75e20ab 100644
+--- a/lib/libnetlink.c
++++ b/lib/libnetlink.c
+@@ -561,7 +561,7 @@ static void rtnl_talk_error(struct nlmsghdr *h, struct nlmsgerr *err,
+ }
+ 
+ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+-		       struct nlmsghdr *answer, size_t maxlen,
++		       struct nlmsghdr **answer,
+ 		       bool show_rtnl_err, nl_ext_ack_fn_t errfn)
+ {
+ 	int status;
+@@ -635,9 +635,9 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+ 					fprintf(stderr, "ERROR truncated\n");
+ 				} else if (!err->error) {
+ 					if (answer)
+-						memcpy(answer, h,
+-						       MIN(maxlen, h->nlmsg_len));
+-					free(buf);
++						*answer = (struct nlmsghdr *)buf;
++					else
++						free(buf);
+ 					return 0;
+ 				}
+ 
+@@ -651,9 +651,7 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+ 			}
+ 
+ 			if (answer) {
+-				memcpy(answer, h,
+-				       MIN(maxlen, h->nlmsg_len));
+-				free(buf);
++				*answer = (struct nlmsghdr *)buf;
+ 				return 0;
+ 			}
+ 
+@@ -677,22 +675,22 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+ }
+ 
+ int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+-	      struct nlmsghdr *answer, size_t maxlen)
++	      struct nlmsghdr **answer)
+ {
+-	return __rtnl_talk(rtnl, n, answer, maxlen, true, NULL);
++	return __rtnl_talk(rtnl, n, answer, true, NULL);
+ }
+ 
+ int rtnl_talk_extack(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+-		     struct nlmsghdr *answer, size_t maxlen,
++		     struct nlmsghdr **answer,
+ 		     nl_ext_ack_fn_t errfn)
+ {
+-	return __rtnl_talk(rtnl, n, answer, maxlen, true, errfn);
++	return __rtnl_talk(rtnl, n, answer, true, errfn);
+ }
+ 
+ int rtnl_talk_suppress_rtnl_errmsg(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+-				   struct nlmsghdr *answer, size_t maxlen)
++				   struct nlmsghdr **answer)
+ {
+-	return __rtnl_talk(rtnl, n, answer, maxlen, false, NULL);
++	return __rtnl_talk(rtnl, n, answer, false, NULL);
+ }
+ 
+ int rtnl_listen_all_nsid(struct rtnl_handle *rth)
+diff --git a/misc/ss.c b/misc/ss.c
+index b84baf3..d3fb9a7 100644
+--- a/misc/ss.c
++++ b/misc/ss.c
+@@ -2588,7 +2588,7 @@ static int kill_inet_sock(struct nlmsghdr *h, void *arg, struct sockstat *s)
+ 		raw->sdiag_raw_protocol = s->raw_prot;
+ 	}
+ 
+-	return rtnl_talk(rth, &req.nlh, NULL, 0);
++	return rtnl_talk(rth, &req.nlh, NULL);
+ }
+ 
+ static int show_one_inet_sock(const struct sockaddr_nl *addr,
+diff --git a/tc/m_action.c b/tc/m_action.c
+index 6ebe85e..90b2a11 100644
+--- a/tc/m_action.c
++++ b/tc/m_action.c
+@@ -506,18 +506,18 @@ static int tc_action_gd(int cmd, unsigned int flags, int *argc_p, char ***argv_p
+ 	tail->rta_len = (void *) NLMSG_TAIL(&req.n) - (void *) tail;
+ 
+ 	req.n.nlmsg_seq = rth.dump = ++rth.seq;
+-	if (cmd == RTM_GETACTION)
+-		ans = &req.n;
+ 
+-	if (rtnl_talk(&rth, &req.n, ans, MAX_MSG) < 0) {
++	if (rtnl_talk(&rth, &req.n, &ans) < 0) {
+ 		fprintf(stderr, "We have an error talking to the kernel\n");
+ 		return 1;
+ 	}
+ 
+-	if (ans && print_action(NULL, &req.n, (void *)stdout) < 0) {
++	if (cmd == RTM_GETACTION && print_action(NULL, ans, stdout) < 0) {
+ 		fprintf(stderr, "Dump terminated\n");
++		free(ans);
+ 		return 1;
+ 	}
++	free(ans);
+ 
+ 	*argc_p = argc;
+ 	*argv_p = argv;
+@@ -550,7 +550,7 @@ static int tc_action_modify(int cmd, unsigned int flags, int *argc_p, char ***ar
+ 	}
+ 	tail->rta_len = (void *) NLMSG_TAIL(&req.n) - (void *) tail;
+ 
+-	if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) {
++	if (rtnl_talk(&rth, &req.n, NULL) < 0) {
+ 		fprintf(stderr, "We have an error talking to the kernel\n");
+ 		ret = -1;
+ 	}
+@@ -617,7 +617,7 @@ static int tc_act_list_or_flush(int argc, char **argv, int event)
+ 		req.n.nlmsg_type = RTM_DELACTION;
+ 		req.n.nlmsg_flags |= NLM_F_ROOT;
+ 		req.n.nlmsg_flags |= NLM_F_REQUEST;
+-		if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) {
++		if (rtnl_talk(&rth, &req.n, NULL) < 0) {
+ 			fprintf(stderr, "We have an error flushing\n");
+ 			return 1;
+ 		}
+diff --git a/tc/tc_class.c b/tc/tc_class.c
+index 1a1f1fa..0214775 100644
+--- a/tc/tc_class.c
++++ b/tc/tc_class.c
+@@ -149,7 +149,7 @@ static int tc_class_modify(int cmd, unsigned int flags, int argc, char **argv)
+ 		}
+ 	}
+ 
+-	if (rtnl_talk(&rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&rth, &req.n, NULL) < 0)
+ 		return 2;
+ 
+ 	return 0;
+diff --git a/tc/tc_filter.c b/tc/tc_filter.c
+index ff8713b..e640492 100644
+--- a/tc/tc_filter.c
++++ b/tc/tc_filter.c
+@@ -181,7 +181,7 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv)
+ 		}
+ 	}
+ 
+-	if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) {
++	if (rtnl_talk(&rth, &req.n, NULL) < 0) {
+ 		fprintf(stderr, "We have an error talking to the kernel\n");
+ 		return 2;
+ 	}
+@@ -307,6 +307,7 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv)
+ 		.t.tcm_parent = TC_H_UNSPEC,
+ 		.t.tcm_family = AF_UNSPEC,
+ 	};
++	struct nlmsghdr *answer;
+ 	struct filter_util *q = NULL;
+ 	__u32 prio = 0;
+ 	__u32 protocol = 0;
+@@ -445,13 +446,14 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv)
+ 		return -1;
+ 	}
+ 
+-	if (rtnl_talk(&rth, &req.n, &req.n, MAX_MSG) < 0) {
++	if (rtnl_talk(&rth, &req.n, &answer) < 0) {
+ 		fprintf(stderr, "We have an error talking to the kernel\n");
+ 		return 2;
+ 	}
+ 
+-	print_filter(NULL, &req.n, (void *)stdout);
++	print_filter(NULL, answer, (void *)stdout);
+ 
++	free(answer);
+ 	return 0;
+ }
+ 
+diff --git a/tc/tc_qdisc.c b/tc/tc_qdisc.c
+index 3a3701c..8b0c5c7 100644
+--- a/tc/tc_qdisc.c
++++ b/tc/tc_qdisc.c
+@@ -190,7 +190,7 @@ static int tc_qdisc_modify(int cmd, unsigned int flags, int argc, char **argv)
+ 		req.t.tcm_ifindex = idx;
+ 	}
+ 
+-	if (rtnl_talk(&rth, &req.n, NULL, 0) < 0)
++	if (rtnl_talk(&rth, &req.n, NULL) < 0)
+ 		return 2;
+ 
+ 	return 0;
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0024-Update-linux-headers.patch b/SOURCES/0024-Update-linux-headers.patch
new file mode 100644
index 0000000..a7c413c
--- /dev/null
+++ b/SOURCES/0024-Update-linux-headers.patch
@@ -0,0 +1,2048 @@
+From 7f123fac8aa0ff7741777935121e1b394c56e75a Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Fri, 10 Nov 2017 10:19:43 +0100
+Subject: [PATCH] Update linux headers
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539
+
+This updates include/linux to the state just before commit 596b1c94aa38e
+("iproute: build more easily on Android").
+---
+ include/linux/bpf.h                  | 253 ++++++++++++++++++++++-
+ include/linux/can/vxcan.h            |  12 ++
+ include/linux/devlink.h              |  92 ++++++++-
+ include/linux/elf-em.h               |   1 -
+ include/linux/if_arp.h               |   2 +
+ include/linux/if_ether.h             |   6 +
+ include/linux/if_link.h              |  37 +++-
+ include/linux/if_packet.h            |   1 +
+ include/linux/if_tunnel.h            |   4 +
+ include/linux/inet_diag.h            |   2 +
+ include/linux/ipsec.h                |  47 +++++
+ include/linux/lwtunnel.h             |   1 +
+ include/linux/magic.h                |   3 +
+ include/linux/mpls_iptunnel.h        |   2 +
+ include/linux/neighbour.h            |   1 +
+ include/linux/netlink.h              |  67 +++++-
+ include/linux/netlink_diag.h         |  10 +
+ include/linux/pfkeyv2.h              | 383 +++++++++++++++++++++++++++++++++++
+ include/linux/pkt_cls.h              |  37 +++-
+ include/linux/pkt_sched.h            |   8 +
+ include/linux/rtnetlink.h            |  36 +++-
+ include/linux/sctp.h                 |  38 ++++
+ include/linux/seg6.h                 |  54 +++++
+ include/linux/seg6_genl.h            |  32 +++
+ include/linux/seg6_hmac.h            |  22 ++
+ include/linux/seg6_iptunnel.h        |  40 ++++
+ include/linux/seg6_local.h           |  68 +++++++
+ include/linux/tc_act/tc_bpf.h        |   1 +
+ include/linux/tc_act/tc_tunnel_key.h |   1 +
+ include/linux/tcp.h                  |  27 ++-
+ include/linux/xfrm.h                 |   9 +
+ 31 files changed, 1272 insertions(+), 25 deletions(-)
+ create mode 100644 include/linux/can/vxcan.h
+ create mode 100644 include/linux/ipsec.h
+ create mode 100644 include/linux/pfkeyv2.h
+ create mode 100644 include/linux/seg6.h
+ create mode 100644 include/linux/seg6_genl.h
+ create mode 100644 include/linux/seg6_hmac.h
+ create mode 100644 include/linux/seg6_iptunnel.h
+ create mode 100644 include/linux/seg6_local.h
+
+diff --git a/include/linux/bpf.h b/include/linux/bpf.h
+index 178e20c..0895a52 100644
+--- a/include/linux/bpf.h
++++ b/include/linux/bpf.h
+@@ -30,9 +30,14 @@
+ #define BPF_FROM_LE	BPF_TO_LE
+ #define BPF_FROM_BE	BPF_TO_BE
+ 
++/* jmp encodings */
+ #define BPF_JNE		0x50	/* jump != */
++#define BPF_JLT		0xa0	/* LT is unsigned, '<' */
++#define BPF_JLE		0xb0	/* LE is unsigned, '<=' */
+ #define BPF_JSGT	0x60	/* SGT is signed '>', GT in x86 */
+ #define BPF_JSGE	0x70	/* SGE is signed '>=', GE in x86 */
++#define BPF_JSLT	0xc0	/* SLT is signed, '<' */
++#define BPF_JSLE	0xd0	/* SLE is signed, '<=' */
+ #define BPF_CALL	0x80	/* function call */
+ #define BPF_EXIT	0x90	/* function return */
+ 
+@@ -81,6 +86,12 @@ enum bpf_cmd {
+ 	BPF_OBJ_GET,
+ 	BPF_PROG_ATTACH,
+ 	BPF_PROG_DETACH,
++	BPF_PROG_TEST_RUN,
++	BPF_PROG_GET_NEXT_ID,
++	BPF_MAP_GET_NEXT_ID,
++	BPF_PROG_GET_FD_BY_ID,
++	BPF_MAP_GET_FD_BY_ID,
++	BPF_OBJ_GET_INFO_BY_FD,
+ };
+ 
+ enum bpf_map_type {
+@@ -96,6 +107,10 @@ enum bpf_map_type {
+ 	BPF_MAP_TYPE_LRU_HASH,
+ 	BPF_MAP_TYPE_LRU_PERCPU_HASH,
+ 	BPF_MAP_TYPE_LPM_TRIE,
++	BPF_MAP_TYPE_ARRAY_OF_MAPS,
++	BPF_MAP_TYPE_HASH_OF_MAPS,
++	BPF_MAP_TYPE_DEVMAP,
++	BPF_MAP_TYPE_SOCKMAP,
+ };
+ 
+ enum bpf_prog_type {
+@@ -112,12 +127,17 @@ enum bpf_prog_type {
+ 	BPF_PROG_TYPE_LWT_IN,
+ 	BPF_PROG_TYPE_LWT_OUT,
+ 	BPF_PROG_TYPE_LWT_XMIT,
++	BPF_PROG_TYPE_SOCK_OPS,
++	BPF_PROG_TYPE_SK_SKB,
+ };
+ 
+ enum bpf_attach_type {
+ 	BPF_CGROUP_INET_INGRESS,
+ 	BPF_CGROUP_INET_EGRESS,
+ 	BPF_CGROUP_INET_SOCK_CREATE,
++	BPF_CGROUP_SOCK_OPS,
++	BPF_SK_SKB_STREAM_PARSER,
++	BPF_SK_SKB_STREAM_VERDICT,
+ 	__MAX_BPF_ATTACH_TYPE
+ };
+ 
+@@ -129,6 +149,13 @@ enum bpf_attach_type {
+  */
+ #define BPF_F_ALLOW_OVERRIDE	(1U << 0)
+ 
++/* If BPF_F_STRICT_ALIGNMENT is used in BPF_PROG_LOAD command, the
++ * verifier will perform strict alignment checking as if the kernel
++ * has been built with CONFIG_EFFICIENT_UNALIGNED_ACCESS not set,
++ * and NET_IP_ALIGN defined to 2.
++ */
++#define BPF_F_STRICT_ALIGNMENT	(1U << 0)
++
+ #define BPF_PSEUDO_MAP_FD	1
+ 
+ /* flags for BPF_MAP_UPDATE_ELEM command */
+@@ -136,6 +163,7 @@ enum bpf_attach_type {
+ #define BPF_NOEXIST	1 /* create new element if it didn't exist */
+ #define BPF_EXIST	2 /* update existing element */
+ 
++/* flags for BPF_MAP_CREATE command */
+ #define BPF_F_NO_PREALLOC	(1U << 0)
+ /* Instead of having one common LRU list in the
+  * BPF_MAP_TYPE_LRU_[PERCPU_]HASH map, use a percpu LRU list
+@@ -144,6 +172,8 @@ enum bpf_attach_type {
+  * across different LRU lists.
+  */
+ #define BPF_F_NO_COMMON_LRU	(1U << 1)
++/* Specify numa node during map creation */
++#define BPF_F_NUMA_NODE		(1U << 2)
+ 
+ union bpf_attr {
+ 	struct { /* anonymous struct used by BPF_MAP_CREATE command */
+@@ -151,7 +181,13 @@ union bpf_attr {
+ 		__u32	key_size;	/* size of key in bytes */
+ 		__u32	value_size;	/* size of value in bytes */
+ 		__u32	max_entries;	/* max number of entries in a map */
+-		__u32	map_flags;	/* prealloc or not */
++		__u32	map_flags;	/* BPF_MAP_CREATE related
++					 * flags defined above.
++					 */
++		__u32	inner_map_fd;	/* fd pointing to the inner map */
++		__u32	numa_node;	/* numa node (effective only if
++					 * BPF_F_NUMA_NODE is set).
++					 */
+ 	};
+ 
+ 	struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */
+@@ -173,6 +209,7 @@ union bpf_attr {
+ 		__u32		log_size;	/* size of user buffer */
+ 		__aligned_u64	log_buf;	/* user supplied buffer */
+ 		__u32		kern_version;	/* checked when prog_type=kprobe */
++		__u32		prog_flags;
+ 	};
+ 
+ 	struct { /* anonymous struct used by BPF_OBJ_* commands */
+@@ -186,6 +223,32 @@ union bpf_attr {
+ 		__u32		attach_type;
+ 		__u32		attach_flags;
+ 	};
++
++	struct { /* anonymous struct used by BPF_PROG_TEST_RUN command */
++		__u32		prog_fd;
++		__u32		retval;
++		__u32		data_size_in;
++		__u32		data_size_out;
++		__aligned_u64	data_in;
++		__aligned_u64	data_out;
++		__u32		repeat;
++		__u32		duration;
++	} test;
++
++	struct { /* anonymous struct used by BPF_*_GET_*_ID */
++		union {
++			__u32		start_id;
++			__u32		prog_id;
++			__u32		map_id;
++		};
++		__u32		next_id;
++	};
++
++	struct { /* anonymous struct used by BPF_OBJ_GET_INFO_BY_FD */
++		__u32		bpf_fd;
++		__u32		info_len;
++		__aligned_u64	info;
++	} info;
+ } __attribute__((aligned(8)));
+ 
+ /* BPF helper function descriptions:
+@@ -290,26 +353,40 @@ union bpf_attr {
+  *     @flags: room for future extensions
+  *     Return: 0 on success or negative error
+  *
+- * u64 bpf_perf_event_read(&map, index)
+- *     Return: Number events read or error code
++ * u64 bpf_perf_event_read(map, flags)
++ *     read perf event counter value
++ *     @map: pointer to perf_event_array map
++ *     @flags: index of event in the map or bitmask flags
++ *     Return: value of perf event counter read or error code
+  *
+  * int bpf_redirect(ifindex, flags)
+  *     redirect to another netdev
+  *     @ifindex: ifindex of the net device
+- *     @flags: bit 0 - if set, redirect to ingress instead of egress
+- *             other bits - reserved
+- *     Return: TC_ACT_REDIRECT
++ *     @flags:
++ *	  cls_bpf:
++ *          bit 0 - if set, redirect to ingress instead of egress
++ *          other bits - reserved
++ *	  xdp_bpf:
++ *	    all bits - reserved
++ *     Return: cls_bpf: TC_ACT_REDIRECT on success or TC_ACT_SHOT on error
++ *	       xdp_bfp: XDP_REDIRECT on success or XDP_ABORT on error
++ * int bpf_redirect_map(map, key, flags)
++ *     redirect to endpoint in map
++ *     @map: pointer to dev map
++ *     @key: index in map to lookup
++ *     @flags: --
++ *     Return: XDP_REDIRECT on success or XDP_ABORT on error
+  *
+  * u32 bpf_get_route_realm(skb)
+  *     retrieve a dst's tclassid
+  *     @skb: pointer to skb
+  *     Return: realm if != 0
+  *
+- * int bpf_perf_event_output(ctx, map, index, data, size)
++ * int bpf_perf_event_output(ctx, map, flags, data, size)
+  *     output perf raw sample
+  *     @ctx: struct pt_regs*
+  *     @map: pointer to perf_event_array map
+- *     @index: index of event in the map
++ *     @flags: index of event in the map or bitmask flags
+  *     @data: data on stack to be output as raw data
+  *     @size: size of data
+  *     Return: 0 on success or negative error
+@@ -456,6 +533,55 @@ union bpf_attr {
+  *     Return:
+  *       > 0 length of the string including the trailing NUL on success
+  *       < 0 error
++ *
++ * u64 bpf_get_socket_cookie(skb)
++ *     Get the cookie for the socket stored inside sk_buff.
++ *     @skb: pointer to skb
++ *     Return: 8 Bytes non-decreasing number on success or 0 if the socket
++ *     field is missing inside sk_buff
++ *
++ * u32 bpf_get_socket_uid(skb)
++ *     Get the owner uid of the socket stored inside sk_buff.
++ *     @skb: pointer to skb
++ *     Return: uid of the socket owner on success or overflowuid if failed.
++ *
++ * u32 bpf_set_hash(skb, hash)
++ *     Set full skb->hash.
++ *     @skb: pointer to skb
++ *     @hash: hash to set
++ *
++ * int bpf_setsockopt(bpf_socket, level, optname, optval, optlen)
++ *     Calls setsockopt. Not all opts are available, only those with
++ *     integer optvals plus TCP_CONGESTION.
++ *     Supported levels: SOL_SOCKET and IPROTO_TCP
++ *     @bpf_socket: pointer to bpf_socket
++ *     @level: SOL_SOCKET or IPROTO_TCP
++ *     @optname: option name
++ *     @optval: pointer to option value
++ *     @optlen: length of optval in byes
++ *     Return: 0 or negative error
++ *
++ * int bpf_skb_adjust_room(skb, len_diff, mode, flags)
++ *     Grow or shrink room in sk_buff.
++ *     @skb: pointer to skb
++ *     @len_diff: (signed) amount of room to grow/shrink
++ *     @mode: operation mode (enum bpf_adj_room_mode)
++ *     @flags: reserved for future use
++ *     Return: 0 on success or negative error code
++ *
++ * int bpf_sk_redirect_map(map, key, flags)
++ *     Redirect skb to a sock in map using key as a lookup key for the
++ *     sock in map.
++ *     @map: pointer to sockmap
++ *     @key: key to lookup sock in map
++ *     @flags: reserved for future use
++ *     Return: SK_REDIRECT
++ *
++ * int bpf_sock_map_update(skops, map, key, flags)
++ *	@skops: pointer to bpf_sock_ops
++ *	@map: pointer to sockmap to update
++ *	@key: key to insert/update sock in map
++ *	@flags: same flags as map update elem
+  */
+ #define __BPF_FUNC_MAPPER(FN)		\
+ 	FN(unspec),			\
+@@ -503,7 +629,15 @@ union bpf_attr {
+ 	FN(get_numa_node_id),		\
+ 	FN(skb_change_head),		\
+ 	FN(xdp_adjust_head),		\
+-	FN(probe_read_str),
++	FN(probe_read_str),		\
++	FN(get_socket_cookie),		\
++	FN(get_socket_uid),		\
++	FN(set_hash),			\
++	FN(setsockopt),			\
++	FN(skb_adjust_room),		\
++	FN(redirect_map),		\
++	FN(sk_redirect_map),		\
++	FN(sock_map_update),		\
+ 
+ /* integer value in 'imm' field of BPF_CALL instruction selects which helper
+  * function eBPF program intends to call
+@@ -553,6 +687,11 @@ enum bpf_func_id {
+ /* BPF_FUNC_perf_event_output for sk_buff input context. */
+ #define BPF_F_CTXLEN_MASK		(0xfffffULL << 32)
+ 
++/* Mode for BPF_FUNC_skb_adjust_room helper. */
++enum bpf_adj_room_mode {
++	BPF_ADJ_ROOM_NET,
++};
++
+ /* user accessible mirror of in-kernel sk_buff.
+  * new fields can only be added to the end of this structure
+  */
+@@ -574,6 +713,16 @@ struct __sk_buff {
+ 	__u32 tc_classid;
+ 	__u32 data;
+ 	__u32 data_end;
++	__u32 napi_id;
++
++	/* accessed by BPF_PROG_TYPE_sk_skb types */
++	__u32 family;
++	__u32 remote_ip4;	/* Stored in network byte order */
++	__u32 local_ip4;	/* Stored in network byte order */
++	__u32 remote_ip6[4];	/* Stored in network byte order */
++	__u32 local_ip6[4];	/* Stored in network byte order */
++	__u32 remote_port;	/* Stored in network byte order */
++	__u32 local_port;	/* stored in host byte order */
+ };
+ 
+ struct bpf_tunnel_key {
+@@ -609,20 +758,23 @@ struct bpf_sock {
+ 	__u32 family;
+ 	__u32 type;
+ 	__u32 protocol;
++	__u32 mark;
++	__u32 priority;
+ };
+ 
+ #define XDP_PACKET_HEADROOM 256
+ 
+ /* User return codes for XDP prog type.
+  * A valid XDP program must return one of these defined values. All other
+- * return codes are reserved for future use. Unknown return codes will result
+- * in packet drop.
++ * return codes are reserved for future use. Unknown return codes will
++ * result in packet drops and a warning via bpf_warn_invalid_xdp_action().
+  */
+ enum xdp_action {
+ 	XDP_ABORTED = 0,
+ 	XDP_DROP,
+ 	XDP_PASS,
+ 	XDP_TX,
++	XDP_REDIRECT,
+ };
+ 
+ /* user accessible metadata for XDP packet hook
+@@ -633,4 +785,83 @@ struct xdp_md {
+ 	__u32 data_end;
+ };
+ 
++enum sk_action {
++	SK_ABORTED = 0,
++	SK_DROP,
++	SK_REDIRECT,
++};
++
++#define BPF_TAG_SIZE	8
++
++struct bpf_prog_info {
++	__u32 type;
++	__u32 id;
++	__u8  tag[BPF_TAG_SIZE];
++	__u32 jited_prog_len;
++	__u32 xlated_prog_len;
++	__aligned_u64 jited_prog_insns;
++	__aligned_u64 xlated_prog_insns;
++} __attribute__((aligned(8)));
++
++struct bpf_map_info {
++	__u32 type;
++	__u32 id;
++	__u32 key_size;
++	__u32 value_size;
++	__u32 max_entries;
++	__u32 map_flags;
++} __attribute__((aligned(8)));
++
++/* User bpf_sock_ops struct to access socket values and specify request ops
++ * and their replies.
++ * Some of this fields are in network (bigendian) byte order and may need
++ * to be converted before use (bpf_ntohl() defined in samples/bpf/bpf_endian.h).
++ * New fields can only be added at the end of this structure
++ */
++struct bpf_sock_ops {
++	__u32 op;
++	union {
++		__u32 reply;
++		__u32 replylong[4];
++	};
++	__u32 family;
++	__u32 remote_ip4;	/* Stored in network byte order */
++	__u32 local_ip4;	/* Stored in network byte order */
++	__u32 remote_ip6[4];	/* Stored in network byte order */
++	__u32 local_ip6[4];	/* Stored in network byte order */
++	__u32 remote_port;	/* Stored in network byte order */
++	__u32 local_port;	/* stored in host byte order */
++};
++
++/* List of known BPF sock_ops operators.
++ * New entries can only be added at the end
++ */
++enum {
++	BPF_SOCK_OPS_VOID,
++	BPF_SOCK_OPS_TIMEOUT_INIT,	/* Should return SYN-RTO value to use or
++					 * -1 if default value should be used
++					 */
++	BPF_SOCK_OPS_RWND_INIT,		/* Should return initial advertized
++					 * window (in packets) or -1 if default
++					 * value should be used
++					 */
++	BPF_SOCK_OPS_TCP_CONNECT_CB,	/* Calls BPF program right before an
++					 * active connection is initialized
++					 */
++	BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB,	/* Calls BPF program when an
++						 * active connection is
++						 * established
++						 */
++	BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB,	/* Calls BPF program when a
++						 * passive connection is
++						 * established
++						 */
++	BPF_SOCK_OPS_NEEDS_ECN,		/* If connection's congestion control
++					 * needs ECN
++					 */
++};
++
++#define TCP_BPF_IW		1001	/* Set TCP initial congestion window */
++#define TCP_BPF_SNDCWND_CLAMP	1002	/* Set sndcwnd_clamp */
++
+ #endif /* __LINUX_BPF_H__ */
+diff --git a/include/linux/can/vxcan.h b/include/linux/can/vxcan.h
+new file mode 100644
+index 0000000..5b29e8a
+--- /dev/null
++++ b/include/linux/can/vxcan.h
+@@ -0,0 +1,12 @@
++#ifndef _CAN_VXCAN_H
++#define _CAN_VXCAN_H
++
++enum {
++	VXCAN_INFO_UNSPEC,
++	VXCAN_INFO_PEER,
++
++	__VXCAN_INFO_MAX
++#define VXCAN_INFO_MAX	(__VXCAN_INFO_MAX - 1)
++};
++
++#endif
+diff --git a/include/linux/devlink.h b/include/linux/devlink.h
+index 2ad3585..a62695e 100644
+--- a/include/linux/devlink.h
++++ b/include/linux/devlink.h
+@@ -65,8 +65,12 @@ enum devlink_command {
+ #define DEVLINK_CMD_ESWITCH_MODE_SET /* obsolete, never use this! */ \
+ 	DEVLINK_CMD_ESWITCH_SET
+ 
+-	/* add new commands above here */
++	DEVLINK_CMD_DPIPE_TABLE_GET,
++	DEVLINK_CMD_DPIPE_ENTRIES_GET,
++	DEVLINK_CMD_DPIPE_HEADERS_GET,
++	DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET,
+ 
++	/* add new commands above here */
+ 	__DEVLINK_CMD_MAX,
+ 	DEVLINK_CMD_MAX = __DEVLINK_CMD_MAX - 1
+ };
+@@ -115,6 +119,11 @@ enum devlink_eswitch_inline_mode {
+ 	DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT,
+ };
+ 
++enum devlink_eswitch_encap_mode {
++	DEVLINK_ESWITCH_ENCAP_MODE_NONE,
++	DEVLINK_ESWITCH_ENCAP_MODE_BASIC,
++};
++
+ enum devlink_attr {
+ 	/* don't change the order or add anything between, this is ABI! */
+ 	DEVLINK_ATTR_UNSPEC,
+@@ -148,10 +157,91 @@ enum devlink_attr {
+ 	DEVLINK_ATTR_ESWITCH_MODE,		/* u16 */
+ 	DEVLINK_ATTR_ESWITCH_INLINE_MODE,	/* u8 */
+ 
++	DEVLINK_ATTR_DPIPE_TABLES,		/* nested */
++	DEVLINK_ATTR_DPIPE_TABLE,		/* nested */
++	DEVLINK_ATTR_DPIPE_TABLE_NAME,		/* string */
++	DEVLINK_ATTR_DPIPE_TABLE_SIZE,		/* u64 */
++	DEVLINK_ATTR_DPIPE_TABLE_MATCHES,	/* nested */
++	DEVLINK_ATTR_DPIPE_TABLE_ACTIONS,	/* nested */
++	DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED,	/* u8 */
++
++	DEVLINK_ATTR_DPIPE_ENTRIES,		/* nested */
++	DEVLINK_ATTR_DPIPE_ENTRY,		/* nested */
++	DEVLINK_ATTR_DPIPE_ENTRY_INDEX,		/* u64 */
++	DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES,	/* nested */
++	DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES,	/* nested */
++	DEVLINK_ATTR_DPIPE_ENTRY_COUNTER,	/* u64 */
++
++	DEVLINK_ATTR_DPIPE_MATCH,		/* nested */
++	DEVLINK_ATTR_DPIPE_MATCH_VALUE,		/* nested */
++	DEVLINK_ATTR_DPIPE_MATCH_TYPE,		/* u32 */
++
++	DEVLINK_ATTR_DPIPE_ACTION,		/* nested */
++	DEVLINK_ATTR_DPIPE_ACTION_VALUE,	/* nested */
++	DEVLINK_ATTR_DPIPE_ACTION_TYPE,		/* u32 */
++
++	DEVLINK_ATTR_DPIPE_VALUE,
++	DEVLINK_ATTR_DPIPE_VALUE_MASK,
++	DEVLINK_ATTR_DPIPE_VALUE_MAPPING,	/* u32 */
++
++	DEVLINK_ATTR_DPIPE_HEADERS,		/* nested */
++	DEVLINK_ATTR_DPIPE_HEADER,		/* nested */
++	DEVLINK_ATTR_DPIPE_HEADER_NAME,		/* string */
++	DEVLINK_ATTR_DPIPE_HEADER_ID,		/* u32 */
++	DEVLINK_ATTR_DPIPE_HEADER_FIELDS,	/* nested */
++	DEVLINK_ATTR_DPIPE_HEADER_GLOBAL,	/* u8 */
++	DEVLINK_ATTR_DPIPE_HEADER_INDEX,	/* u32 */
++
++	DEVLINK_ATTR_DPIPE_FIELD,		/* nested */
++	DEVLINK_ATTR_DPIPE_FIELD_NAME,		/* string */
++	DEVLINK_ATTR_DPIPE_FIELD_ID,		/* u32 */
++	DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH,	/* u32 */
++	DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE,	/* u32 */
++
++	DEVLINK_ATTR_PAD,
++
++	DEVLINK_ATTR_ESWITCH_ENCAP_MODE,	/* u8 */
++
+ 	/* add new attributes above here, update the policy in devlink.c */
+ 
+ 	__DEVLINK_ATTR_MAX,
+ 	DEVLINK_ATTR_MAX = __DEVLINK_ATTR_MAX - 1
+ };
+ 
++/* Mapping between internal resource described by the field and system
++ * structure
++ */
++enum devlink_dpipe_field_mapping_type {
++	DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE,
++	DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX,
++};
++
++/* Match type - specify the type of the match */
++enum devlink_dpipe_match_type {
++	DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT,
++};
++
++/* Action type - specify the action type */
++enum devlink_dpipe_action_type {
++	DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY,
++};
++
++enum devlink_dpipe_field_ethernet_id {
++	DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC,
++};
++
++enum devlink_dpipe_field_ipv4_id {
++	DEVLINK_DPIPE_FIELD_IPV4_DST_IP,
++};
++
++enum devlink_dpipe_field_ipv6_id {
++	DEVLINK_DPIPE_FIELD_IPV6_DST_IP,
++};
++
++enum devlink_dpipe_header_id {
++	DEVLINK_DPIPE_HEADER_ETHERNET,
++	DEVLINK_DPIPE_HEADER_IPV4,
++	DEVLINK_DPIPE_HEADER_IPV6,
++};
++
+ #endif /* _LINUX_DEVLINK_H_ */
+diff --git a/include/linux/elf-em.h b/include/linux/elf-em.h
+index cb5d1a5..9cd1de9 100644
+--- a/include/linux/elf-em.h
++++ b/include/linux/elf-em.h
+@@ -42,7 +42,6 @@
+ #define EM_TILEGX	191	/* Tilera TILE-Gx */
+ #define EM_BPF		247	/* Linux BPF - in-kernel virtual machine */
+ #define EM_FRV		0x5441	/* Fujitsu FR-V */
+-#define EM_AVR32	0x18ad	/* Atmel AVR32 */
+ 
+ /*
+  * This is an interim value that we will use until the committee comes
+diff --git a/include/linux/if_arp.h b/include/linux/if_arp.h
+index d001bdb..199f253 100644
+--- a/include/linux/if_arp.h
++++ b/include/linux/if_arp.h
+@@ -59,6 +59,7 @@
+ #define ARPHRD_LAPB	516		/* LAPB				*/
+ #define ARPHRD_DDCMP    517		/* Digital's DDCMP protocol     */
+ #define ARPHRD_RAWHDLC	518		/* Raw HDLC			*/
++#define ARPHRD_RAWIP    519		/* Raw IP                       */
+ 
+ #define ARPHRD_TUNNEL	768		/* IPIP tunnel			*/
+ #define ARPHRD_TUNNEL6	769		/* IP6IP6 tunnel       		*/
+@@ -95,6 +96,7 @@
+ #define ARPHRD_IP6GRE	823		/* GRE over IPv6		*/
+ #define ARPHRD_NETLINK	824		/* Netlink header		*/
+ #define ARPHRD_6LOWPAN	825		/* IPv6 over LoWPAN             */
++#define ARPHRD_VSOCKMON	826		/* Vsock monitor header		*/
+ 
+ #define ARPHRD_VOID	  0xFFFF	/* Void type, nothing is known */
+ #define ARPHRD_NONE	  0xFFFE	/* zero header length */
+diff --git a/include/linux/if_ether.h b/include/linux/if_ether.h
+index b7d3beb..7dde037 100644
+--- a/include/linux/if_ether.h
++++ b/include/linux/if_ether.h
+@@ -66,6 +66,7 @@
+ #define ETH_P_ATALK	0x809B		/* Appletalk DDP		*/
+ #define ETH_P_AARP	0x80F3		/* Appletalk AARP		*/
+ #define ETH_P_8021Q	0x8100          /* 802.1Q VLAN Extended Header  */
++#define ETH_P_ERSPAN	0x88BE		/* ERSPAN type II		*/
+ #define ETH_P_IPX	0x8137		/* IPX over DIX			*/
+ #define ETH_P_IPV6	0x86DD		/* IPv6 over bluebook		*/
+ #define ETH_P_PAUSE	0x8808		/* IEEE Pause frames. See 802.3 31B */
+@@ -98,11 +99,13 @@
+ #define ETH_P_FIP	0x8914		/* FCoE Initialization Protocol */
+ #define ETH_P_80221	0x8917		/* IEEE 802.21 Media Independent Handover Protocol */
+ #define ETH_P_HSR	0x892F		/* IEC 62439-3 HSRv1	*/
++#define ETH_P_NSH	0x894F		/* Network Service Header */
+ #define ETH_P_LOOPBACK	0x9000		/* Ethernet loopback packet, per IEEE 802.3 */
+ #define ETH_P_QINQ1	0x9100		/* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */
+ #define ETH_P_QINQ2	0x9200		/* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */
+ #define ETH_P_QINQ3	0x9300		/* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */
+ #define ETH_P_EDSA	0xDADA		/* Ethertype DSA [ NOT AN OFFICIALLY REGISTERED ID ] */
++#define ETH_P_IFE	0xED3E		/* ForCES inter-FE LFB type */
+ #define ETH_P_AF_IUCV   0xFBFB		/* IBM af_iucv [ NOT AN OFFICIALLY REGISTERED ID ] */
+ 
+ #define ETH_P_802_3_MIN	0x0600		/* If the value in the ethernet type is less than this value
+@@ -137,6 +140,9 @@
+ #define ETH_P_IEEE802154 0x00F6		/* IEEE802.15.4 frame		*/
+ #define ETH_P_CAIF	0x00F7		/* ST-Ericsson CAIF protocol	*/
+ #define ETH_P_XDSA	0x00F8		/* Multiplexed DSA protocol	*/
++#define ETH_P_MAP	0x00F9		/* Qualcomm multiplexing and
++					 * aggregation protocol
++					 */
+ 
+ /*
+  *	This is an Ethernet frame header.
+diff --git a/include/linux/if_link.h b/include/linux/if_link.h
+index b0bdbd6..1f97d05 100644
+--- a/include/linux/if_link.h
++++ b/include/linux/if_link.h
+@@ -157,6 +157,7 @@ enum {
+ 	IFLA_GSO_MAX_SIZE,
+ 	IFLA_PAD,
+ 	IFLA_XDP,
++	IFLA_EVENT,
+ 	__IFLA_MAX
+ };
+ 
+@@ -321,6 +322,7 @@ enum {
+ 	IFLA_BRPORT_MCAST_FLOOD,
+ 	IFLA_BRPORT_MCAST_TO_UCAST,
+ 	IFLA_BRPORT_VLAN_TUNNEL,
++	IFLA_BRPORT_BCAST_FLOOD,
+ 	__IFLA_BRPORT_MAX
+ };
+ #define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1)
+@@ -536,11 +538,18 @@ enum {
+ #define IFLA_PPP_MAX (__IFLA_PPP_MAX - 1)
+ 
+ /* GTP section */
++
++enum ifla_gtp_role {
++	GTP_ROLE_GGSN = 0,
++	GTP_ROLE_SGSN,
++};
++
+ enum {
+ 	IFLA_GTP_UNSPEC,
+ 	IFLA_GTP_FD0,
+ 	IFLA_GTP_FD1,
+ 	IFLA_GTP_PDP_HASHSIZE,
++	IFLA_GTP_ROLE,
+ 	__IFLA_GTP_MAX,
+ };
+ #define IFLA_GTP_MAX (__IFLA_GTP_MAX - 1)
+@@ -878,16 +887,42 @@ enum {
+ /* XDP section */
+ 
+ #define XDP_FLAGS_UPDATE_IF_NOEXIST	(1U << 0)
+-#define XDP_FLAGS_MASK			(XDP_FLAGS_UPDATE_IF_NOEXIST)
++#define XDP_FLAGS_SKB_MODE		(1U << 1)
++#define XDP_FLAGS_DRV_MODE		(1U << 2)
++#define XDP_FLAGS_HW_MODE		(1U << 3)
++#define XDP_FLAGS_MODES			(XDP_FLAGS_SKB_MODE | \
++					 XDP_FLAGS_DRV_MODE | \
++					 XDP_FLAGS_HW_MODE)
++#define XDP_FLAGS_MASK			(XDP_FLAGS_UPDATE_IF_NOEXIST | \
++					 XDP_FLAGS_MODES)
++
++/* These are stored into IFLA_XDP_ATTACHED on dump. */
++enum {
++	XDP_ATTACHED_NONE = 0,
++	XDP_ATTACHED_DRV,
++	XDP_ATTACHED_SKB,
++	XDP_ATTACHED_HW,
++};
+ 
+ enum {
+ 	IFLA_XDP_UNSPEC,
+ 	IFLA_XDP_FD,
+ 	IFLA_XDP_ATTACHED,
+ 	IFLA_XDP_FLAGS,
++	IFLA_XDP_PROG_ID,
+ 	__IFLA_XDP_MAX,
+ };
+ 
+ #define IFLA_XDP_MAX (__IFLA_XDP_MAX - 1)
+ 
++enum {
++	IFLA_EVENT_NONE,
++	IFLA_EVENT_REBOOT,		/* internal reset / reboot */
++	IFLA_EVENT_FEATURES,		/* change in offload features */
++	IFLA_EVENT_BONDING_FAILOVER,	/* change in active slave */
++	IFLA_EVENT_NOTIFY_PEERS,	/* re-sent grat. arp/ndisc */
++	IFLA_EVENT_IGMP_RESEND,		/* re-sent IGMP JOIN */
++	IFLA_EVENT_BONDING_OPTIONS,	/* change in bonding options */
++};
++
+ #endif /* _LINUX_IF_LINK_H */
+diff --git a/include/linux/if_packet.h b/include/linux/if_packet.h
+index 9e7edfd..4df96a7 100644
+--- a/include/linux/if_packet.h
++++ b/include/linux/if_packet.h
+@@ -66,6 +66,7 @@ struct sockaddr_ll {
+ #define PACKET_FANOUT_CBPF		6
+ #define PACKET_FANOUT_EBPF		7
+ #define PACKET_FANOUT_FLAG_ROLLOVER	0x1000
++#define PACKET_FANOUT_FLAG_UNIQUEID	0x2000
+ #define PACKET_FANOUT_FLAG_DEFRAG	0x8000
+ 
+ struct tpacket_stats {
+diff --git a/include/linux/if_tunnel.h b/include/linux/if_tunnel.h
+index 4f975f5..21834ca 100644
+--- a/include/linux/if_tunnel.h
++++ b/include/linux/if_tunnel.h
+@@ -75,6 +75,7 @@ enum {
+ 	IFLA_IPTUN_ENCAP_SPORT,
+ 	IFLA_IPTUN_ENCAP_DPORT,
+ 	IFLA_IPTUN_COLLECT_METADATA,
++	IFLA_IPTUN_FWMARK,
+ 	__IFLA_IPTUN_MAX,
+ };
+ #define IFLA_IPTUN_MAX	(__IFLA_IPTUN_MAX - 1)
+@@ -132,6 +133,8 @@ enum {
+ 	IFLA_GRE_ENCAP_DPORT,
+ 	IFLA_GRE_COLLECT_METADATA,
+ 	IFLA_GRE_IGNORE_DF,
++	IFLA_GRE_FWMARK,
++	IFLA_GRE_ERSPAN_INDEX,
+ 	__IFLA_GRE_MAX,
+ };
+ 
+@@ -147,6 +150,7 @@ enum {
+ 	IFLA_VTI_OKEY,
+ 	IFLA_VTI_LOCAL,
+ 	IFLA_VTI_REMOTE,
++	IFLA_VTI_FWMARK,
+ 	__IFLA_VTI_MAX,
+ };
+ 
+diff --git a/include/linux/inet_diag.h b/include/linux/inet_diag.h
+index f7bf781..bada4d7 100644
+--- a/include/linux/inet_diag.h
++++ b/include/linux/inet_diag.h
+@@ -142,6 +142,8 @@ enum {
+ 	INET_DIAG_PAD,
+ 	INET_DIAG_MARK,
+ 	INET_DIAG_BBRINFO,
++	INET_DIAG_CLASS_ID,
++	INET_DIAG_MD5SIG,
+ 	__INET_DIAG_MAX,
+ };
+ 
+diff --git a/include/linux/ipsec.h b/include/linux/ipsec.h
+new file mode 100644
+index 0000000..d17a630
+--- /dev/null
++++ b/include/linux/ipsec.h
+@@ -0,0 +1,47 @@
++#ifndef _LINUX_IPSEC_H
++#define _LINUX_IPSEC_H
++
++/* The definitions, required to talk to KAME racoon IKE. */
++
++#include <linux/pfkeyv2.h>
++
++#define IPSEC_PORT_ANY		0
++#define IPSEC_ULPROTO_ANY	255
++#define IPSEC_PROTO_ANY		255
++
++enum {
++	IPSEC_MODE_ANY		= 0,	/* We do not support this for SA */
++	IPSEC_MODE_TRANSPORT	= 1,
++	IPSEC_MODE_TUNNEL	= 2,
++	IPSEC_MODE_BEET         = 3
++};
++
++enum {
++	IPSEC_DIR_ANY		= 0,
++	IPSEC_DIR_INBOUND	= 1,
++	IPSEC_DIR_OUTBOUND	= 2,
++	IPSEC_DIR_FWD		= 3,	/* It is our own */
++	IPSEC_DIR_MAX		= 4,
++	IPSEC_DIR_INVALID	= 5
++};
++
++enum {
++	IPSEC_POLICY_DISCARD	= 0,
++	IPSEC_POLICY_NONE	= 1,
++	IPSEC_POLICY_IPSEC	= 2,
++	IPSEC_POLICY_ENTRUST	= 3,
++	IPSEC_POLICY_BYPASS	= 4
++};
++
++enum {
++	IPSEC_LEVEL_DEFAULT	= 0,
++	IPSEC_LEVEL_USE		= 1,
++	IPSEC_LEVEL_REQUIRE	= 2,
++	IPSEC_LEVEL_UNIQUE	= 3
++};
++
++#define IPSEC_MANUAL_REQID_MAX	0x3fff
++
++#define IPSEC_REPLAYWSIZE  32
++
++#endif	/* _LINUX_IPSEC_H */
+diff --git a/include/linux/lwtunnel.h b/include/linux/lwtunnel.h
+index faa6eab..3298426 100644
+--- a/include/linux/lwtunnel.h
++++ b/include/linux/lwtunnel.h
+@@ -11,6 +11,7 @@ enum lwtunnel_encap_types {
+ 	LWTUNNEL_ENCAP_IP6,
+ 	LWTUNNEL_ENCAP_SEG6,
+ 	LWTUNNEL_ENCAP_BPF,
++	LWTUNNEL_ENCAP_SEG6_LOCAL,
+ 	__LWTUNNEL_ENCAP_MAX,
+ };
+ 
+diff --git a/include/linux/magic.h b/include/linux/magic.h
+index e230af2..e439565 100644
+--- a/include/linux/magic.h
++++ b/include/linux/magic.h
+@@ -42,6 +42,7 @@
+ #define MSDOS_SUPER_MAGIC	0x4d44		/* MD */
+ #define NCP_SUPER_MAGIC		0x564c		/* Guess, what 0x564c is :-) */
+ #define NFS_SUPER_MAGIC		0x6969
++#define OCFS2_SUPER_MAGIC	0x7461636f
+ #define OPENPROM_SUPER_MAGIC	0x9fa1
+ #define QNX4_SUPER_MAGIC	0x002f		/* qnx4 fs detection */
+ #define QNX6_SUPER_MAGIC	0x68191122	/* qnx6 fs detection */
+@@ -80,6 +81,8 @@
+ #define BTRFS_TEST_MAGIC	0x73727279
+ #define NSFS_MAGIC		0x6e736673
+ #define BPF_FS_MAGIC		0xcafe4a11
++#define AAFS_MAGIC		0x5a3c69f0
++
+ /* Since UDF 2.01 is ISO 13346 based... */
+ #define UDF_SUPER_MAGIC		0x15013346
+ #define BALLOON_KVM_MAGIC	0x13661366
+diff --git a/include/linux/mpls_iptunnel.h b/include/linux/mpls_iptunnel.h
+index 4132c3c..1a0e57b 100644
+--- a/include/linux/mpls_iptunnel.h
++++ b/include/linux/mpls_iptunnel.h
+@@ -16,11 +16,13 @@
+ /* MPLS tunnel attributes
+  * [RTA_ENCAP] = {
+  *     [MPLS_IPTUNNEL_DST]
++ *     [MPLS_IPTUNNEL_TTL]
+  * }
+  */
+ enum {
+ 	MPLS_IPTUNNEL_UNSPEC,
+ 	MPLS_IPTUNNEL_DST,
++	MPLS_IPTUNNEL_TTL,
+ 	__MPLS_IPTUNNEL_MAX,
+ };
+ #define MPLS_IPTUNNEL_MAX (__MPLS_IPTUNNEL_MAX - 1)
+diff --git a/include/linux/neighbour.h b/include/linux/neighbour.h
+index f3d16db..3199d28 100644
+--- a/include/linux/neighbour.h
++++ b/include/linux/neighbour.h
+@@ -41,6 +41,7 @@ enum {
+ #define NTF_MASTER	0x04
+ #define NTF_PROXY	0x08	/* == ATF_PUBL */
+ #define NTF_EXT_LEARNED	0x10
++#define NTF_OFFLOADED   0x20
+ #define NTF_ROUTER	0x80
+ 
+ /*
+diff --git a/include/linux/netlink.h b/include/linux/netlink.h
+index d1e26a2..ec0690b 100644
+--- a/include/linux/netlink.h
++++ b/include/linux/netlink.h
+@@ -50,12 +50,12 @@ struct nlmsghdr {
+ 
+ /* Flags values */
+ 
+-#define NLM_F_REQUEST		1	/* It is request message. 	*/
+-#define NLM_F_MULTI		2	/* Multipart message, terminated by NLMSG_DONE */
+-#define NLM_F_ACK		4	/* Reply with ack, with zero or error code */
+-#define NLM_F_ECHO		8	/* Echo this request 		*/
+-#define NLM_F_DUMP_INTR		16	/* Dump was inconsistent due to sequence change */
+-#define NLM_F_DUMP_FILTERED	32	/* Dump was filtered as requested */
++#define NLM_F_REQUEST		0x01	/* It is request message. 	*/
++#define NLM_F_MULTI		0x02	/* Multipart message, terminated by NLMSG_DONE */
++#define NLM_F_ACK		0x04	/* Reply with ack, with zero or error code */
++#define NLM_F_ECHO		0x08	/* Echo this request 		*/
++#define NLM_F_DUMP_INTR		0x10	/* Dump was inconsistent due to sequence change */
++#define NLM_F_DUMP_FILTERED	0x20	/* Dump was filtered as requested */
+ 
+ /* Modifiers to GET request */
+ #define NLM_F_ROOT	0x100	/* specify tree	root	*/
+@@ -69,6 +69,13 @@ struct nlmsghdr {
+ #define NLM_F_CREATE	0x400	/* Create, if it does not exist	*/
+ #define NLM_F_APPEND	0x800	/* Add to end of list		*/
+ 
++/* Modifiers to DELETE request */
++#define NLM_F_NONREC	0x100	/* Do not delete recursively	*/
++
++/* Flags for ACK message */
++#define NLM_F_CAPPED	0x100	/* request was capped */
++#define NLM_F_ACK_TLVS	0x200	/* extended ACK TVLs were included */
++
+ /*
+    4.4BSD ADD		NLM_F_CREATE|NLM_F_EXCL
+    4.4BSD CHANGE	NLM_F_REPLACE
+@@ -101,6 +108,37 @@ struct nlmsghdr {
+ struct nlmsgerr {
+ 	int		error;
+ 	struct nlmsghdr msg;
++	/*
++	 * followed by the message contents unless NETLINK_CAP_ACK was set
++	 * or the ACK indicates success (error == 0)
++	 * message length is aligned with NLMSG_ALIGN()
++	 */
++	/*
++	 * followed by TLVs defined in enum nlmsgerr_attrs
++	 * if NETLINK_EXT_ACK was set
++	 */
++};
++
++/**
++ * enum nlmsgerr_attrs - nlmsgerr attributes
++ * @NLMSGERR_ATTR_UNUSED: unused
++ * @NLMSGERR_ATTR_MSG: error message string (string)
++ * @NLMSGERR_ATTR_OFFS: offset of the invalid attribute in the original
++ *	 message, counting from the beginning of the header (u32)
++ * @NLMSGERR_ATTR_COOKIE: arbitrary subsystem specific cookie to
++ *	be used - in the success case - to identify a created
++ *	object or operation or similar (binary)
++ * @__NLMSGERR_ATTR_MAX: number of attributes
++ * @NLMSGERR_ATTR_MAX: highest attribute number
++ */
++enum nlmsgerr_attrs {
++	NLMSGERR_ATTR_UNUSED,
++	NLMSGERR_ATTR_MSG,
++	NLMSGERR_ATTR_OFFS,
++	NLMSGERR_ATTR_COOKIE,
++
++	__NLMSGERR_ATTR_MAX,
++	NLMSGERR_ATTR_MAX = __NLMSGERR_ATTR_MAX - 1
+ };
+ 
+ #define NETLINK_ADD_MEMBERSHIP		1
+@@ -187,5 +225,22 @@ struct nlattr {
+ #define NLA_ALIGN(len)		(((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1))
+ #define NLA_HDRLEN		((int) NLA_ALIGN(sizeof(struct nlattr)))
+ 
++/* Generic 32 bitflags attribute content sent to the kernel.
++ *
++ * The value is a bitmap that defines the values being set
++ * The selector is a bitmask that defines which value is legit
++ *
++ * Examples:
++ *  value = 0x0, and selector = 0x1
++ *  implies we are selecting bit 1 and we want to set its value to 0.
++ *
++ *  value = 0x2, and selector = 0x2
++ *  implies we are selecting bit 2 and we want to set its value to 1.
++ *
++ */
++struct nla_bitfield32 {
++	__u32 value;
++	__u32 selector;
++};
+ 
+ #endif /* __LINUX_NETLINK_H */
+diff --git a/include/linux/netlink_diag.h b/include/linux/netlink_diag.h
+index defd25f..c8c8c7d 100644
+--- a/include/linux/netlink_diag.h
++++ b/include/linux/netlink_diag.h
+@@ -38,6 +38,7 @@ enum {
+ 	NETLINK_DIAG_GROUPS,
+ 	NETLINK_DIAG_RX_RING,
+ 	NETLINK_DIAG_TX_RING,
++	NETLINK_DIAG_FLAGS,
+ 
+ 	__NETLINK_DIAG_MAX,
+ };
+@@ -50,5 +51,14 @@ enum {
+ #define NDIAG_SHOW_GROUPS	0x00000002 /* show groups of a netlink socket */
+ /* deprecated since 4.6 */
+ #define NDIAG_SHOW_RING_CFG	0x00000004 /* show ring configuration */
++#define NDIAG_SHOW_FLAGS	0x00000008 /* show flags of a netlink socket */
++
++/* flags */
++#define NDIAG_FLAG_CB_RUNNING		0x00000001
++#define NDIAG_FLAG_PKTINFO		0x00000002
++#define NDIAG_FLAG_BROADCAST_ERROR	0x00000004
++#define NDIAG_FLAG_NO_ENOBUFS		0x00000008
++#define NDIAG_FLAG_LISTEN_ALL_NSID	0x00000010
++#define NDIAG_FLAG_CAP_ACK		0x00000020
+ 
+ #endif
+diff --git a/include/linux/pfkeyv2.h b/include/linux/pfkeyv2.h
+new file mode 100644
+index 0000000..ada7f01
+--- /dev/null
++++ b/include/linux/pfkeyv2.h
+@@ -0,0 +1,383 @@
++/* PF_KEY user interface, this is defined by rfc2367 so
++ * do not make arbitrary modifications or else this header
++ * file will not be compliant.
++ */
++
++#ifndef _LINUX_PFKEY2_H
++#define _LINUX_PFKEY2_H
++
++#include <linux/types.h>
++
++#define PF_KEY_V2		2
++#define PFKEYV2_REVISION	199806L
++
++struct sadb_msg {
++	__u8		sadb_msg_version;
++	__u8		sadb_msg_type;
++	__u8		sadb_msg_errno;
++	__u8		sadb_msg_satype;
++	__u16	sadb_msg_len;
++	__u16	sadb_msg_reserved;
++	__u32	sadb_msg_seq;
++	__u32	sadb_msg_pid;
++} __attribute__((packed));
++/* sizeof(struct sadb_msg) == 16 */
++
++struct sadb_ext {
++	__u16	sadb_ext_len;
++	__u16	sadb_ext_type;
++} __attribute__((packed));
++/* sizeof(struct sadb_ext) == 4 */
++
++struct sadb_sa {
++	__u16	sadb_sa_len;
++	__u16	sadb_sa_exttype;
++	__be32		sadb_sa_spi;
++	__u8		sadb_sa_replay;
++	__u8		sadb_sa_state;
++	__u8		sadb_sa_auth;
++	__u8		sadb_sa_encrypt;
++	__u32	sadb_sa_flags;
++} __attribute__((packed));
++/* sizeof(struct sadb_sa) == 16 */
++
++struct sadb_lifetime {
++	__u16	sadb_lifetime_len;
++	__u16	sadb_lifetime_exttype;
++	__u32	sadb_lifetime_allocations;
++	__u64	sadb_lifetime_bytes;
++	__u64	sadb_lifetime_addtime;
++	__u64	sadb_lifetime_usetime;
++} __attribute__((packed));
++/* sizeof(struct sadb_lifetime) == 32 */
++
++struct sadb_address {
++	__u16	sadb_address_len;
++	__u16	sadb_address_exttype;
++	__u8		sadb_address_proto;
++	__u8		sadb_address_prefixlen;
++	__u16	sadb_address_reserved;
++} __attribute__((packed));
++/* sizeof(struct sadb_address) == 8 */
++
++struct sadb_key {
++	__u16	sadb_key_len;
++	__u16	sadb_key_exttype;
++	__u16	sadb_key_bits;
++	__u16	sadb_key_reserved;
++} __attribute__((packed));
++/* sizeof(struct sadb_key) == 8 */
++
++struct sadb_ident {
++	__u16	sadb_ident_len;
++	__u16	sadb_ident_exttype;
++	__u16	sadb_ident_type;
++	__u16	sadb_ident_reserved;
++	__u64	sadb_ident_id;
++} __attribute__((packed));
++/* sizeof(struct sadb_ident) == 16 */
++
++struct sadb_sens {
++	__u16	sadb_sens_len;
++	__u16	sadb_sens_exttype;
++	__u32	sadb_sens_dpd;
++	__u8		sadb_sens_sens_level;
++	__u8		sadb_sens_sens_len;
++	__u8		sadb_sens_integ_level;
++	__u8		sadb_sens_integ_len;
++	__u32	sadb_sens_reserved;
++} __attribute__((packed));
++/* sizeof(struct sadb_sens) == 16 */
++
++/* followed by:
++	__u64	sadb_sens_bitmap[sens_len];
++	__u64	sadb_integ_bitmap[integ_len];  */
++
++struct sadb_prop {
++	__u16	sadb_prop_len;
++	__u16	sadb_prop_exttype;
++	__u8		sadb_prop_replay;
++	__u8		sadb_prop_reserved[3];
++} __attribute__((packed));
++/* sizeof(struct sadb_prop) == 8 */
++
++/* followed by:
++	struct sadb_comb sadb_combs[(sadb_prop_len +
++		sizeof(__u64) - sizeof(struct sadb_prop)) /
++		sizeof(struct sadb_comb)]; */
++
++struct sadb_comb {
++	__u8		sadb_comb_auth;
++	__u8		sadb_comb_encrypt;
++	__u16	sadb_comb_flags;
++	__u16	sadb_comb_auth_minbits;
++	__u16	sadb_comb_auth_maxbits;
++	__u16	sadb_comb_encrypt_minbits;
++	__u16	sadb_comb_encrypt_maxbits;
++	__u32	sadb_comb_reserved;
++	__u32	sadb_comb_soft_allocations;
++	__u32	sadb_comb_hard_allocations;
++	__u64	sadb_comb_soft_bytes;
++	__u64	sadb_comb_hard_bytes;
++	__u64	sadb_comb_soft_addtime;
++	__u64	sadb_comb_hard_addtime;
++	__u64	sadb_comb_soft_usetime;
++	__u64	sadb_comb_hard_usetime;
++} __attribute__((packed));
++/* sizeof(struct sadb_comb) == 72 */
++
++struct sadb_supported {
++	__u16	sadb_supported_len;
++	__u16	sadb_supported_exttype;
++	__u32	sadb_supported_reserved;
++} __attribute__((packed));
++/* sizeof(struct sadb_supported) == 8 */
++
++/* followed by:
++	struct sadb_alg sadb_algs[(sadb_supported_len +
++		sizeof(__u64) - sizeof(struct sadb_supported)) /
++		sizeof(struct sadb_alg)]; */
++
++struct sadb_alg {
++	__u8		sadb_alg_id;
++	__u8		sadb_alg_ivlen;
++	__u16	sadb_alg_minbits;
++	__u16	sadb_alg_maxbits;
++	__u16	sadb_alg_reserved;
++} __attribute__((packed));
++/* sizeof(struct sadb_alg) == 8 */
++
++struct sadb_spirange {
++	__u16	sadb_spirange_len;
++	__u16	sadb_spirange_exttype;
++	__u32	sadb_spirange_min;
++	__u32	sadb_spirange_max;
++	__u32	sadb_spirange_reserved;
++} __attribute__((packed));
++/* sizeof(struct sadb_spirange) == 16 */
++
++struct sadb_x_kmprivate {
++	__u16	sadb_x_kmprivate_len;
++	__u16	sadb_x_kmprivate_exttype;
++	__u32	sadb_x_kmprivate_reserved;
++} __attribute__((packed));
++/* sizeof(struct sadb_x_kmprivate) == 8 */
++
++struct sadb_x_sa2 {
++	__u16	sadb_x_sa2_len;
++	__u16	sadb_x_sa2_exttype;
++	__u8		sadb_x_sa2_mode;
++	__u8		sadb_x_sa2_reserved1;
++	__u16	sadb_x_sa2_reserved2;
++	__u32	sadb_x_sa2_sequence;
++	__u32	sadb_x_sa2_reqid;
++} __attribute__((packed));
++/* sizeof(struct sadb_x_sa2) == 16 */
++
++struct sadb_x_policy {
++	__u16	sadb_x_policy_len;
++	__u16	sadb_x_policy_exttype;
++	__u16	sadb_x_policy_type;
++	__u8		sadb_x_policy_dir;
++	__u8		sadb_x_policy_reserved;
++	__u32	sadb_x_policy_id;
++	__u32	sadb_x_policy_priority;
++} __attribute__((packed));
++/* sizeof(struct sadb_x_policy) == 16 */
++
++struct sadb_x_ipsecrequest {
++	__u16	sadb_x_ipsecrequest_len;
++	__u16	sadb_x_ipsecrequest_proto;
++	__u8		sadb_x_ipsecrequest_mode;
++	__u8		sadb_x_ipsecrequest_level;
++	__u16	sadb_x_ipsecrequest_reserved1;
++	__u32	sadb_x_ipsecrequest_reqid;
++	__u32	sadb_x_ipsecrequest_reserved2;
++} __attribute__((packed));
++/* sizeof(struct sadb_x_ipsecrequest) == 16 */
++
++/* This defines the TYPE of Nat Traversal in use.  Currently only one
++ * type of NAT-T is supported, draft-ietf-ipsec-udp-encaps-06
++ */
++struct sadb_x_nat_t_type {
++	__u16	sadb_x_nat_t_type_len;
++	__u16	sadb_x_nat_t_type_exttype;
++	__u8		sadb_x_nat_t_type_type;
++	__u8		sadb_x_nat_t_type_reserved[3];
++} __attribute__((packed));
++/* sizeof(struct sadb_x_nat_t_type) == 8 */
++
++/* Pass a NAT Traversal port (Source or Dest port) */
++struct sadb_x_nat_t_port {
++	__u16	sadb_x_nat_t_port_len;
++	__u16	sadb_x_nat_t_port_exttype;
++	__be16		sadb_x_nat_t_port_port;
++	__u16	sadb_x_nat_t_port_reserved;
++} __attribute__((packed));
++/* sizeof(struct sadb_x_nat_t_port) == 8 */
++
++/* Generic LSM security context */
++struct sadb_x_sec_ctx {
++	__u16	sadb_x_sec_len;
++	__u16	sadb_x_sec_exttype;
++	__u8		sadb_x_ctx_alg;  /* LSMs: e.g., selinux == 1 */
++	__u8		sadb_x_ctx_doi;
++	__u16	sadb_x_ctx_len;
++} __attribute__((packed));
++/* sizeof(struct sadb_sec_ctx) = 8 */
++
++/* Used by MIGRATE to pass addresses IKE will use to perform
++ * negotiation with the peer */
++struct sadb_x_kmaddress {
++	__u16	sadb_x_kmaddress_len;
++	__u16	sadb_x_kmaddress_exttype;
++	__u32	sadb_x_kmaddress_reserved;
++} __attribute__((packed));
++/* sizeof(struct sadb_x_kmaddress) == 8 */
++
++/* To specify the SA dump filter */
++struct sadb_x_filter {
++	__u16	sadb_x_filter_len;
++	__u16	sadb_x_filter_exttype;
++	__u32	sadb_x_filter_saddr[4];
++	__u32	sadb_x_filter_daddr[4];
++	__u16	sadb_x_filter_family;
++	__u8	sadb_x_filter_splen;
++	__u8	sadb_x_filter_dplen;
++} __attribute__((packed));
++/* sizeof(struct sadb_x_filter) == 40 */
++
++/* Message types */
++#define SADB_RESERVED		0
++#define SADB_GETSPI		1
++#define SADB_UPDATE		2
++#define SADB_ADD		3
++#define SADB_DELETE		4
++#define SADB_GET		5
++#define SADB_ACQUIRE		6
++#define SADB_REGISTER		7
++#define SADB_EXPIRE		8
++#define SADB_FLUSH		9
++#define SADB_DUMP		10
++#define SADB_X_PROMISC		11
++#define SADB_X_PCHANGE		12
++#define SADB_X_SPDUPDATE	13
++#define SADB_X_SPDADD		14
++#define SADB_X_SPDDELETE	15
++#define SADB_X_SPDGET		16
++#define SADB_X_SPDACQUIRE	17
++#define SADB_X_SPDDUMP		18
++#define SADB_X_SPDFLUSH		19
++#define SADB_X_SPDSETIDX	20
++#define SADB_X_SPDEXPIRE	21
++#define SADB_X_SPDDELETE2	22
++#define SADB_X_NAT_T_NEW_MAPPING	23
++#define SADB_X_MIGRATE		24
++#define SADB_MAX		24
++
++/* Security Association flags */
++#define SADB_SAFLAGS_PFS	1
++#define SADB_SAFLAGS_NOPMTUDISC	0x20000000
++#define SADB_SAFLAGS_DECAP_DSCP	0x40000000
++#define SADB_SAFLAGS_NOECN	0x80000000
++
++/* Security Association states */
++#define SADB_SASTATE_LARVAL	0
++#define SADB_SASTATE_MATURE	1
++#define SADB_SASTATE_DYING	2
++#define SADB_SASTATE_DEAD	3
++#define SADB_SASTATE_MAX	3
++
++/* Security Association types */
++#define SADB_SATYPE_UNSPEC	0
++#define SADB_SATYPE_AH		2
++#define SADB_SATYPE_ESP		3
++#define SADB_SATYPE_RSVP	5
++#define SADB_SATYPE_OSPFV2	6
++#define SADB_SATYPE_RIPV2	7
++#define SADB_SATYPE_MIP		8
++#define SADB_X_SATYPE_IPCOMP	9
++#define SADB_SATYPE_MAX		9
++
++/* Authentication algorithms */
++#define SADB_AALG_NONE			0
++#define SADB_AALG_MD5HMAC		2
++#define SADB_AALG_SHA1HMAC		3
++#define SADB_X_AALG_SHA2_256HMAC	5
++#define SADB_X_AALG_SHA2_384HMAC	6
++#define SADB_X_AALG_SHA2_512HMAC	7
++#define SADB_X_AALG_RIPEMD160HMAC	8
++#define SADB_X_AALG_AES_XCBC_MAC	9
++#define SADB_X_AALG_NULL		251	/* kame */
++#define SADB_AALG_MAX			251
++
++/* Encryption algorithms */
++#define SADB_EALG_NONE			0
++#define SADB_EALG_DESCBC		2
++#define SADB_EALG_3DESCBC		3
++#define SADB_X_EALG_CASTCBC		6
++#define SADB_X_EALG_BLOWFISHCBC		7
++#define SADB_EALG_NULL			11
++#define SADB_X_EALG_AESCBC		12
++#define SADB_X_EALG_AESCTR		13
++#define SADB_X_EALG_AES_CCM_ICV8	14
++#define SADB_X_EALG_AES_CCM_ICV12	15
++#define SADB_X_EALG_AES_CCM_ICV16	16
++#define SADB_X_EALG_AES_GCM_ICV8	18
++#define SADB_X_EALG_AES_GCM_ICV12	19
++#define SADB_X_EALG_AES_GCM_ICV16	20
++#define SADB_X_EALG_CAMELLIACBC		22
++#define SADB_X_EALG_NULL_AES_GMAC	23
++#define SADB_EALG_MAX                   253 /* last EALG */
++/* private allocations should use 249-255 (RFC2407) */
++#define SADB_X_EALG_SERPENTCBC  252     /* draft-ietf-ipsec-ciph-aes-cbc-00 */
++#define SADB_X_EALG_TWOFISHCBC  253     /* draft-ietf-ipsec-ciph-aes-cbc-00 */
++
++/* Compression algorithms */
++#define SADB_X_CALG_NONE		0
++#define SADB_X_CALG_OUI			1
++#define SADB_X_CALG_DEFLATE		2
++#define SADB_X_CALG_LZS			3
++#define SADB_X_CALG_LZJH		4
++#define SADB_X_CALG_MAX			4
++
++/* Extension Header values */
++#define SADB_EXT_RESERVED		0
++#define SADB_EXT_SA			1
++#define SADB_EXT_LIFETIME_CURRENT	2
++#define SADB_EXT_LIFETIME_HARD		3
++#define SADB_EXT_LIFETIME_SOFT		4
++#define SADB_EXT_ADDRESS_SRC		5
++#define SADB_EXT_ADDRESS_DST		6
++#define SADB_EXT_ADDRESS_PROXY		7
++#define SADB_EXT_KEY_AUTH		8
++#define SADB_EXT_KEY_ENCRYPT		9
++#define SADB_EXT_IDENTITY_SRC		10
++#define SADB_EXT_IDENTITY_DST		11
++#define SADB_EXT_SENSITIVITY		12
++#define SADB_EXT_PROPOSAL		13
++#define SADB_EXT_SUPPORTED_AUTH		14
++#define SADB_EXT_SUPPORTED_ENCRYPT	15
++#define SADB_EXT_SPIRANGE		16
++#define SADB_X_EXT_KMPRIVATE		17
++#define SADB_X_EXT_POLICY		18
++#define SADB_X_EXT_SA2			19
++/* The next four entries are for setting up NAT Traversal */
++#define SADB_X_EXT_NAT_T_TYPE		20
++#define SADB_X_EXT_NAT_T_SPORT		21
++#define SADB_X_EXT_NAT_T_DPORT		22
++#define SADB_X_EXT_NAT_T_OA		23
++#define SADB_X_EXT_SEC_CTX		24
++/* Used with MIGRATE to pass @ to IKE for negotiation */
++#define SADB_X_EXT_KMADDRESS		25
++#define SADB_X_EXT_FILTER		26
++#define SADB_EXT_MAX			26
++
++/* Identity Extension values */
++#define SADB_IDENTTYPE_RESERVED	0
++#define SADB_IDENTTYPE_PREFIX	1
++#define SADB_IDENTTYPE_FQDN	2
++#define SADB_IDENTTYPE_USERFQDN	3
++#define SADB_IDENTTYPE_MAX	3
++
++#endif /* !(_LINUX_PFKEY2_H) */
+diff --git a/include/linux/pkt_cls.h b/include/linux/pkt_cls.h
+index 7a69f2a..d5e2bf6 100644
+--- a/include/linux/pkt_cls.h
++++ b/include/linux/pkt_cls.h
+@@ -37,7 +37,28 @@ enum {
+ #define TC_ACT_QUEUED		5
+ #define TC_ACT_REPEAT		6
+ #define TC_ACT_REDIRECT		7
+-#define TC_ACT_JUMP		0x10000000
++#define TC_ACT_TRAP		8 /* For hw path, this means "trap to cpu"
++				   * and don't further process the frame
++				   * in hardware. For sw path, this is
++				   * equivalent of TC_ACT_STOLEN - drop
++				   * the skb and act like everything
++				   * is alright.
++				   */
++
++/* There is a special kind of actions called "extended actions",
++ * which need a value parameter. These have a local opcode located in
++ * the highest nibble, starting from 1. The rest of the bits
++ * are used to carry the value. These two parts together make
++ * a combined opcode.
++ */
++#define __TC_ACT_EXT_SHIFT 28
++#define __TC_ACT_EXT(local) ((local) << __TC_ACT_EXT_SHIFT)
++#define TC_ACT_EXT_VAL_MASK ((1 << __TC_ACT_EXT_SHIFT) - 1)
++#define TC_ACT_EXT_CMP(combined, opcode) \
++	(((combined) & (~TC_ACT_EXT_VAL_MASK)) == opcode)
++
++#define TC_ACT_JUMP __TC_ACT_EXT(1)
++#define TC_ACT_GOTO_CHAIN __TC_ACT_EXT(2)
+ 
+ /* Action type identifiers*/
+ enum {
+@@ -348,6 +369,7 @@ enum {
+ 	TCA_BPF_FLAGS,
+ 	TCA_BPF_FLAGS_GEN,
+ 	TCA_BPF_TAG,
++	TCA_BPF_ID,
+ 	__TCA_BPF_MAX,
+ };
+ 
+@@ -432,6 +454,19 @@ enum {
+ 	TCA_FLOWER_KEY_ARP_THA,		/* ETH_ALEN */
+ 	TCA_FLOWER_KEY_ARP_THA_MASK,	/* ETH_ALEN */
+ 
++	TCA_FLOWER_KEY_MPLS_TTL,	/* u8 - 8 bits */
++	TCA_FLOWER_KEY_MPLS_BOS,	/* u8 - 1 bit */
++	TCA_FLOWER_KEY_MPLS_TC,		/* u8 - 3 bits */
++	TCA_FLOWER_KEY_MPLS_LABEL,	/* be32 - 20 bits */
++
++	TCA_FLOWER_KEY_TCP_FLAGS,	/* be16 */
++	TCA_FLOWER_KEY_TCP_FLAGS_MASK,	/* be16 */
++
++	TCA_FLOWER_KEY_IP_TOS,		/* u8 */
++	TCA_FLOWER_KEY_IP_TOS_MASK,	/* u8 */
++	TCA_FLOWER_KEY_IP_TTL,		/* u8 */
++	TCA_FLOWER_KEY_IP_TTL_MASK,	/* u8 */
++
+ 	__TCA_FLOWER_MAX,
+ };
+ 
+diff --git a/include/linux/pkt_sched.h b/include/linux/pkt_sched.h
+index df7451d..099bf55 100644
+--- a/include/linux/pkt_sched.h
++++ b/include/linux/pkt_sched.h
+@@ -617,6 +617,14 @@ struct tc_drr_stats {
+ #define TC_QOPT_BITMASK 15
+ #define TC_QOPT_MAX_QUEUE 16
+ 
++enum {
++	TC_MQPRIO_HW_OFFLOAD_NONE,	/* no offload requested */
++	TC_MQPRIO_HW_OFFLOAD_TCS,	/* offload TCs, no queue counts */
++	__TC_MQPRIO_HW_OFFLOAD_MAX
++};
++
++#define TC_MQPRIO_HW_OFFLOAD_MAX (__TC_MQPRIO_HW_OFFLOAD_MAX - 1)
++
+ struct tc_mqprio_qopt {
+ 	__u8	num_tc;
+ 	__u8	prio_tc_map[TC_QOPT_BITMASK + 1];
+diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h
+index d42fe83..813e9e0 100644
+--- a/include/linux/rtnetlink.h
++++ b/include/linux/rtnetlink.h
+@@ -122,6 +122,8 @@ enum {
+ 
+ 	RTM_NEWNETCONF = 80,
+ #define RTM_NEWNETCONF RTM_NEWNETCONF
++	RTM_DELNETCONF,
++#define RTM_DELNETCONF RTM_DELNETCONF
+ 	RTM_GETNETCONF = 82,
+ #define RTM_GETNETCONF RTM_GETNETCONF
+ 
+@@ -144,6 +146,9 @@ enum {
+ 	RTM_GETSTATS = 94,
+ #define RTM_GETSTATS RTM_GETSTATS
+ 
++	RTM_NEWCACHEREPORT = 96,
++#define RTM_NEWCACHEREPORT RTM_NEWCACHEREPORT
++
+ 	__RTM_MAX,
+ #define RTM_MAX		(((__RTM_MAX + 3) & ~3) - 1)
+ };
+@@ -276,6 +281,7 @@ enum rt_scope_t {
+ #define RTM_F_EQUALIZE		0x400	/* Multipath equalizer: NI	*/
+ #define RTM_F_PREFIX		0x800	/* Prefix addresses		*/
+ #define RTM_F_LOOKUP_TABLE	0x1000	/* set rtm_table to FIB lookup result */
++#define RTM_F_FIB_MATCH	        0x2000	/* return full fib lookup match */
+ 
+ /* Reserved table identifiers */
+ 
+@@ -319,6 +325,7 @@ enum rtattr_type_t {
+ 	RTA_EXPIRES,
+ 	RTA_PAD,
+ 	RTA_UID,
++	RTA_TTL_PROPAGATE,
+ 	__RTA_MAX
+ };
+ 
+@@ -545,6 +552,8 @@ enum {
+ 	TCA_STATS2,
+ 	TCA_STAB,
+ 	TCA_PAD,
++	TCA_DUMP_INVISIBLE,
++	TCA_CHAIN,
+ 	__TCA_MAX
+ };
+ 
+@@ -658,6 +667,10 @@ enum rtnetlink_groups {
+ #define RTNLGRP_NSID		RTNLGRP_NSID
+ 	RTNLGRP_MPLS_NETCONF,
+ #define RTNLGRP_MPLS_NETCONF	RTNLGRP_MPLS_NETCONF
++	RTNLGRP_IPV4_MROUTE_R,
++#define RTNLGRP_IPV4_MROUTE_R	RTNLGRP_IPV4_MROUTE_R
++	RTNLGRP_IPV6_MROUTE_R,
++#define RTNLGRP_IPV6_MROUTE_R	RTNLGRP_IPV6_MROUTE_R
+ 	__RTNLGRP_MAX
+ };
+ #define RTNLGRP_MAX	(__RTNLGRP_MAX - 1)
+@@ -668,10 +681,29 @@ struct tcamsg {
+ 	unsigned char	tca__pad1;
+ 	unsigned short	tca__pad2;
+ };
++
++enum {
++	TCA_ROOT_UNSPEC,
++	TCA_ROOT_TAB,
++#define TCA_ACT_TAB TCA_ROOT_TAB
++#define TCAA_MAX TCA_ROOT_TAB
++	TCA_ROOT_FLAGS,
++	TCA_ROOT_COUNT,
++	TCA_ROOT_TIME_DELTA, /* in msecs */
++	__TCA_ROOT_MAX,
++#define	TCA_ROOT_MAX (__TCA_ROOT_MAX - 1)
++};
++
+ #define TA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcamsg))))
+ #define TA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcamsg))
+-#define TCA_ACT_TAB 1 /* attr type must be >=1 */	
+-#define TCAA_MAX 1
++/* tcamsg flags stored in attribute TCA_ROOT_FLAGS
++ *
++ * TCA_FLAG_LARGE_DUMP_ON user->kernel to request for larger than TCA_ACT_MAX_PRIO
++ * actions in a dump. All dump responses will contain the number of actions
++ * being dumped stored in for user app's consumption in TCA_ROOT_COUNT
++ *
++ */
++#define TCA_FLAG_LARGE_DUMP_ON		(1 << 0)
+ 
+ /* New extended info filters for IFLA_EXT_MASK */
+ #define RTEXT_FILTER_VF		(1 << 0)
+diff --git a/include/linux/sctp.h b/include/linux/sctp.h
+index 5e08b3d..fec24c4 100644
+--- a/include/linux/sctp.h
++++ b/include/linux/sctp.h
+@@ -115,10 +115,13 @@ typedef __s32 sctp_assoc_t;
+ #define SCTP_PR_SUPPORTED	113
+ #define SCTP_DEFAULT_PRINFO	114
+ #define SCTP_PR_ASSOC_STATUS	115
++#define SCTP_PR_STREAM_STATUS	116
++#define SCTP_RECONFIG_SUPPORTED	117
+ #define SCTP_ENABLE_STREAM_RESET	118
+ #define SCTP_RESET_STREAMS	119
+ #define SCTP_RESET_ASSOC	120
+ #define SCTP_ADD_STREAMS	121
++#define SCTP_SOCKOPT_PEELOFF_FLAGS 122
+ 
+ /* PR-SCTP policies */
+ #define SCTP_PR_SCTP_NONE	0x0000
+@@ -502,6 +505,28 @@ struct sctp_stream_reset_event {
+ 	__u16 strreset_stream_list[];
+ };
+ 
++#define SCTP_ASSOC_RESET_DENIED		0x0004
++#define SCTP_ASSOC_RESET_FAILED		0x0008
++struct sctp_assoc_reset_event {
++	__u16 assocreset_type;
++	__u16 assocreset_flags;
++	__u32 assocreset_length;
++	sctp_assoc_t assocreset_assoc_id;
++	__u32 assocreset_local_tsn;
++	__u32 assocreset_remote_tsn;
++};
++
++#define SCTP_ASSOC_CHANGE_DENIED	0x0004
++#define SCTP_ASSOC_CHANGE_FAILED	0x0008
++struct sctp_stream_change_event {
++	__u16 strchange_type;
++	__u16 strchange_flags;
++	__u32 strchange_length;
++	sctp_assoc_t strchange_assoc_id;
++	__u16 strchange_instrms;
++	__u16 strchange_outstrms;
++};
++
+ /*
+  * Described in Section 7.3
+  *   Ancillary Data and Notification Interest Options
+@@ -518,6 +543,8 @@ struct sctp_event_subscribe {
+ 	__u8 sctp_authentication_event;
+ 	__u8 sctp_sender_dry_event;
+ 	__u8 sctp_stream_reset_event;
++	__u8 sctp_assoc_reset_event;
++	__u8 sctp_stream_change_event;
+ };
+ 
+ /*
+@@ -543,6 +570,8 @@ union sctp_notification {
+ 	struct sctp_authkey_event sn_authkey_event;
+ 	struct sctp_sender_dry_event sn_sender_dry_event;
+ 	struct sctp_stream_reset_event sn_strreset_event;
++	struct sctp_assoc_reset_event sn_assocreset_event;
++	struct sctp_stream_change_event sn_strchange_event;
+ };
+ 
+ /* Section 5.3.1
+@@ -572,6 +601,10 @@ enum sctp_sn_type {
+ #define SCTP_SENDER_DRY_EVENT		SCTP_SENDER_DRY_EVENT
+ 	SCTP_STREAM_RESET_EVENT,
+ #define SCTP_STREAM_RESET_EVENT		SCTP_STREAM_RESET_EVENT
++	SCTP_ASSOC_RESET_EVENT,
++#define SCTP_ASSOC_RESET_EVENT		SCTP_ASSOC_RESET_EVENT
++	SCTP_STREAM_CHANGE_EVENT,
++#define SCTP_STREAM_CHANGE_EVENT	SCTP_STREAM_CHANGE_EVENT
+ };
+ 
+ /* Notification error codes used to fill up the error fields in some
+@@ -940,6 +973,11 @@ typedef struct {
+ 	int sd;
+ } sctp_peeloff_arg_t;
+ 
++typedef struct {
++	sctp_peeloff_arg_t p_arg;
++	unsigned flags;
++} sctp_peeloff_flags_arg_t;
++
+ /*
+  *  Peer Address Thresholds socket option
+  */
+diff --git a/include/linux/seg6.h b/include/linux/seg6.h
+new file mode 100644
+index 0000000..0715279
+--- /dev/null
++++ b/include/linux/seg6.h
+@@ -0,0 +1,54 @@
++/*
++ *  SR-IPv6 implementation
++ *
++ *  Author:
++ *  David Lebrun <david.lebrun@uclouvain.be>
++ *
++ *
++ *  This program is free software; you can redistribute it and/or
++ *      modify it under the terms of the GNU General Public License
++ *      as published by the Free Software Foundation; either version
++ *      2 of the License, or (at your option) any later version.
++ */
++
++#ifndef _LINUX_SEG6_H
++#define _LINUX_SEG6_H
++
++#include <linux/types.h>
++#include <linux/in6.h>		/* For struct in6_addr. */
++
++/*
++ * SRH
++ */
++struct ipv6_sr_hdr {
++	__u8	nexthdr;
++	__u8	hdrlen;
++	__u8	type;
++	__u8	segments_left;
++	__u8	first_segment;
++	__u8	flags;
++	__u16	reserved;
++
++	struct in6_addr segments[0];
++};
++
++#define SR6_FLAG1_PROTECTED	(1 << 6)
++#define SR6_FLAG1_OAM		(1 << 5)
++#define SR6_FLAG1_ALERT		(1 << 4)
++#define SR6_FLAG1_HMAC		(1 << 3)
++
++#define SR6_TLV_INGRESS		1
++#define SR6_TLV_EGRESS		2
++#define SR6_TLV_OPAQUE		3
++#define SR6_TLV_PADDING		4
++#define SR6_TLV_HMAC		5
++
++#define sr_has_hmac(srh) ((srh)->flags & SR6_FLAG1_HMAC)
++
++struct sr6_tlv {
++	__u8 type;
++	__u8 len;
++	__u8 data[0];
++};
++
++#endif
+diff --git a/include/linux/seg6_genl.h b/include/linux/seg6_genl.h
+new file mode 100644
+index 0000000..99382f9
+--- /dev/null
++++ b/include/linux/seg6_genl.h
+@@ -0,0 +1,32 @@
++#ifndef _LINUX_SEG6_GENL_H
++#define _LINUX_SEG6_GENL_H
++
++#define SEG6_GENL_NAME		"SEG6"
++#define SEG6_GENL_VERSION	0x1
++
++enum {
++	SEG6_ATTR_UNSPEC,
++	SEG6_ATTR_DST,
++	SEG6_ATTR_DSTLEN,
++	SEG6_ATTR_HMACKEYID,
++	SEG6_ATTR_SECRET,
++	SEG6_ATTR_SECRETLEN,
++	SEG6_ATTR_ALGID,
++	SEG6_ATTR_HMACINFO,
++	__SEG6_ATTR_MAX,
++};
++
++#define SEG6_ATTR_MAX (__SEG6_ATTR_MAX - 1)
++
++enum {
++	SEG6_CMD_UNSPEC,
++	SEG6_CMD_SETHMAC,
++	SEG6_CMD_DUMPHMAC,
++	SEG6_CMD_SET_TUNSRC,
++	SEG6_CMD_GET_TUNSRC,
++	__SEG6_CMD_MAX,
++};
++
++#define SEG6_CMD_MAX (__SEG6_CMD_MAX - 1)
++
++#endif
+diff --git a/include/linux/seg6_hmac.h b/include/linux/seg6_hmac.h
+new file mode 100644
+index 0000000..704f93e
+--- /dev/null
++++ b/include/linux/seg6_hmac.h
+@@ -0,0 +1,22 @@
++#ifndef _LINUX_SEG6_HMAC_H
++#define _LINUX_SEG6_HMAC_H
++
++#include <linux/types.h>
++#include <linux/seg6.h>
++
++#define SEG6_HMAC_SECRET_LEN	64
++#define SEG6_HMAC_FIELD_LEN	32
++
++struct sr6_tlv_hmac {
++	struct sr6_tlv tlvhdr;
++	__u16 reserved;
++	__be32 hmackeyid;
++	__u8 hmac[SEG6_HMAC_FIELD_LEN];
++};
++
++enum {
++	SEG6_HMAC_ALGO_SHA1 = 1,
++	SEG6_HMAC_ALGO_SHA256 = 2,
++};
++
++#endif
+diff --git a/include/linux/seg6_iptunnel.h b/include/linux/seg6_iptunnel.h
+new file mode 100644
+index 0000000..a5dc05a
+--- /dev/null
++++ b/include/linux/seg6_iptunnel.h
+@@ -0,0 +1,40 @@
++/*
++ *  SR-IPv6 implementation
++ *
++ *  Author:
++ *  David Lebrun <david.lebrun@uclouvain.be>
++ *
++ *
++ *  This program is free software; you can redistribute it and/or
++ *      modify it under the terms of the GNU General Public License
++ *      as published by the Free Software Foundation; either version
++ *      2 of the License, or (at your option) any later version.
++ */
++
++#ifndef _LINUX_SEG6_IPTUNNEL_H
++#define _LINUX_SEG6_IPTUNNEL_H
++
++#include <linux/seg6.h>		/* For struct ipv6_sr_hdr. */
++
++enum {
++	SEG6_IPTUNNEL_UNSPEC,
++	SEG6_IPTUNNEL_SRH,
++	__SEG6_IPTUNNEL_MAX,
++};
++#define SEG6_IPTUNNEL_MAX (__SEG6_IPTUNNEL_MAX - 1)
++
++struct seg6_iptunnel_encap {
++	int mode;
++	struct ipv6_sr_hdr srh[0];
++};
++
++#define SEG6_IPTUN_ENCAP_SIZE(x) ((sizeof(*x)) + (((x)->srh->hdrlen + 1) << 3))
++
++enum {
++	SEG6_IPTUN_MODE_INLINE,
++	SEG6_IPTUN_MODE_ENCAP,
++	SEG6_IPTUN_MODE_L2ENCAP,
++};
++
++
++#endif
+diff --git a/include/linux/seg6_local.h b/include/linux/seg6_local.h
+new file mode 100644
+index 0000000..76b90d6
+--- /dev/null
++++ b/include/linux/seg6_local.h
+@@ -0,0 +1,68 @@
++/*
++ *  SR-IPv6 implementation
++ *
++ *  Author:
++ *  David Lebrun <david.lebrun@uclouvain.be>
++ *
++ *
++ *  This program is free software; you can redistribute it and/or
++ *      modify it under the terms of the GNU General Public License
++ *      as published by the Free Software Foundation; either version
++ *      2 of the License, or (at your option) any later version.
++ */
++
++#ifndef _LINUX_SEG6_LOCAL_H
++#define _LINUX_SEG6_LOCAL_H
++
++#include <linux/seg6.h>
++
++enum {
++	SEG6_LOCAL_UNSPEC,
++	SEG6_LOCAL_ACTION,
++	SEG6_LOCAL_SRH,
++	SEG6_LOCAL_TABLE,
++	SEG6_LOCAL_NH4,
++	SEG6_LOCAL_NH6,
++	SEG6_LOCAL_IIF,
++	SEG6_LOCAL_OIF,
++	__SEG6_LOCAL_MAX,
++};
++#define SEG6_LOCAL_MAX (__SEG6_LOCAL_MAX - 1)
++
++enum {
++	SEG6_LOCAL_ACTION_UNSPEC	= 0,
++	/* node segment */
++	SEG6_LOCAL_ACTION_END		= 1,
++	/* adjacency segment (IPv6 cross-connect) */
++	SEG6_LOCAL_ACTION_END_X		= 2,
++	/* lookup of next seg NH in table */
++	SEG6_LOCAL_ACTION_END_T		= 3,
++	/* decap and L2 cross-connect */
++	SEG6_LOCAL_ACTION_END_DX2	= 4,
++	/* decap and IPv6 cross-connect */
++	SEG6_LOCAL_ACTION_END_DX6	= 5,
++	/* decap and IPv4 cross-connect */
++	SEG6_LOCAL_ACTION_END_DX4	= 6,
++	/* decap and lookup of DA in v6 table */
++	SEG6_LOCAL_ACTION_END_DT6	= 7,
++	/* decap and lookup of DA in v4 table */
++	SEG6_LOCAL_ACTION_END_DT4	= 8,
++	/* binding segment with insertion */
++	SEG6_LOCAL_ACTION_END_B6	= 9,
++	/* binding segment with encapsulation */
++	SEG6_LOCAL_ACTION_END_B6_ENCAP	= 10,
++	/* binding segment with MPLS encap */
++	SEG6_LOCAL_ACTION_END_BM	= 11,
++	/* lookup last seg in table */
++	SEG6_LOCAL_ACTION_END_S		= 12,
++	/* forward to SR-unaware VNF with static proxy */
++	SEG6_LOCAL_ACTION_END_AS	= 13,
++	/* forward to SR-unaware VNF with masquerading */
++	SEG6_LOCAL_ACTION_END_AM	= 14,
++
++	__SEG6_LOCAL_ACTION_MAX,
++};
++
++#define SEG6_LOCAL_ACTION_MAX (__SEG6_LOCAL_ACTION_MAX - 1)
++
++#endif
+diff --git a/include/linux/tc_act/tc_bpf.h b/include/linux/tc_act/tc_bpf.h
+index 975b50d..8dc2ac0 100644
+--- a/include/linux/tc_act/tc_bpf.h
++++ b/include/linux/tc_act/tc_bpf.h
+@@ -28,6 +28,7 @@ enum {
+ 	TCA_ACT_BPF_NAME,
+ 	TCA_ACT_BPF_PAD,
+ 	TCA_ACT_BPF_TAG,
++	TCA_ACT_BPF_ID,
+ 	__TCA_ACT_BPF_MAX,
+ };
+ #define TCA_ACT_BPF_MAX (__TCA_ACT_BPF_MAX - 1)
+diff --git a/include/linux/tc_act/tc_tunnel_key.h b/include/linux/tc_act/tc_tunnel_key.h
+index 84ea55e..afcd4be 100644
+--- a/include/linux/tc_act/tc_tunnel_key.h
++++ b/include/linux/tc_act/tc_tunnel_key.h
+@@ -34,6 +34,7 @@ enum {
+ 	TCA_TUNNEL_KEY_ENC_KEY_ID,	/* be64 */
+ 	TCA_TUNNEL_KEY_PAD,
+ 	TCA_TUNNEL_KEY_ENC_DST_PORT,	/* be16 */
++	TCA_TUNNEL_KEY_NO_CSUM,		/* u8 */
+ 	__TCA_TUNNEL_KEY_MAX,
+ };
+ 
+diff --git a/include/linux/tcp.h b/include/linux/tcp.h
+index d34fb5c..8edad3f 100644
+--- a/include/linux/tcp.h
++++ b/include/linux/tcp.h
+@@ -117,6 +117,8 @@ enum {
+ #define TCP_SAVED_SYN		28	/* Get SYN headers recorded for connection */
+ #define TCP_REPAIR_WINDOW	29	/* Get/set window parameters */
+ #define TCP_FASTOPEN_CONNECT	30	/* Attempt FastOpen with connect */
++#define TCP_ULP			31	/* Attach a ULP to a TCP connection */
++#define TCP_MD5SIG_EXT		32	/* TCP MD5 Signature with extensions */
+ 
+ struct tcp_repair_opt {
+ 	__u32	opt_code;
+@@ -229,17 +231,38 @@ enum {
+ 	TCP_NLA_SNDBUF_LIMITED,	/* Time (usec) limited by send buffer */
+ 	TCP_NLA_DATA_SEGS_OUT,	/* Data pkts sent including retransmission */
+ 	TCP_NLA_TOTAL_RETRANS,	/* Data pkts retransmitted */
++	TCP_NLA_PACING_RATE,    /* Pacing rate in bytes per second */
++	TCP_NLA_DELIVERY_RATE,  /* Delivery rate in bytes per second */
++	TCP_NLA_SND_CWND,       /* Sending congestion window */
++	TCP_NLA_REORDERING,     /* Reordering metric */
++	TCP_NLA_MIN_RTT,        /* minimum RTT */
++	TCP_NLA_RECUR_RETRANS,  /* Recurring retransmits for the current pkt */
++	TCP_NLA_DELIVERY_RATE_APP_LMT, /* delivery rate application limited ? */
++
+ };
+ 
+ /* for TCP_MD5SIG socket option */
+ #define TCP_MD5SIG_MAXKEYLEN	80
+ 
++/* tcp_md5sig extension flags for TCP_MD5SIG_EXT */
++#define TCP_MD5SIG_FLAG_PREFIX		1	/* address prefix length */
++
+ struct tcp_md5sig {
+ 	struct __kernel_sockaddr_storage tcpm_addr;	/* address associated */
+-	__u16	__tcpm_pad1;				/* zero */
++	__u8	tcpm_flags;				/* extension flags */
++	__u8	tcpm_prefixlen;				/* address prefix */
+ 	__u16	tcpm_keylen;				/* key length */
+-	__u32	__tcpm_pad2;				/* zero */
++	__u32	__tcpm_pad;				/* zero */
+ 	__u8	tcpm_key[TCP_MD5SIG_MAXKEYLEN];		/* key (binary) */
+ };
+ 
++/* INET_DIAG_MD5SIG */
++struct tcp_diag_md5sig {
++	__u8	tcpm_family;
++	__u8	tcpm_prefixlen;
++	__u16	tcpm_keylen;
++	__be32	tcpm_addr[4];
++	__u8	tcpm_key[TCP_MD5SIG_MAXKEYLEN];
++};
++
+ #endif /* _LINUX_TCP_H */
+diff --git a/include/linux/xfrm.h b/include/linux/xfrm.h
+index d2dd1fd..5790293 100644
+--- a/include/linux/xfrm.h
++++ b/include/linux/xfrm.h
+@@ -303,6 +303,8 @@ enum xfrm_attr_type_t {
+ 	XFRMA_PROTO,		/* __u8 */
+ 	XFRMA_ADDRESS_FILTER,	/* struct xfrm_address_filter */
+ 	XFRMA_PAD,
++	XFRMA_OFFLOAD_DEV,	/* struct xfrm_state_offload */
++	XFRMA_OUTPUT_MARK,	/* __u32 */
+ 	__XFRMA_MAX
+ 
+ #define XFRMA_MAX (__XFRMA_MAX - 1)
+@@ -494,6 +496,13 @@ struct xfrm_address_filter {
+ 	__u8				dplen;
+ };
+ 
++struct xfrm_user_offload {
++	int				ifindex;
++	__u8				flags;
++};
++#define XFRM_OFFLOAD_IPV6	1
++#define XFRM_OFFLOAD_INBOUND	2
++
+ /* backwards compatibility for userspace */
+ #define XFRMGRP_ACQUIRE		1
+ #define XFRMGRP_EXPIRE		2
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0025-devlink-Change-netlink-attribute-validation.patch b/SOURCES/0025-devlink-Change-netlink-attribute-validation.patch
new file mode 100644
index 0000000..832c7da
--- /dev/null
+++ b/SOURCES/0025-devlink-Change-netlink-attribute-validation.patch
@@ -0,0 +1,151 @@
+From 56a3a027d053ab592a3363a92108c93c150301f5 Mon Sep 17 00:00:00 2001
+From: Kamal Heib <kheib@redhat.com>
+Date: Thu, 9 Nov 2017 04:44:32 -0500
+Subject: [PATCH] devlink: Change netlink attribute validation
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539
+
+commit 4f10cede93b758785f5b201774ed3e02eaf1a7bb
+Author: Arkadi Sharshevsky <arkadis@mellanox.com>
+Date:   Wed May 3 13:25:22 2017 +0200
+
+    devlink: Change netlink attribute validation
+
+    Currently the netlink attribute resolving is done by a sequence of
+    if's. Change the attribute resolving to table lookup.
+
+    Signed-off-by: Arkadi Sharshevsky <arkadis@mellanox.com>
+    Signed-off-by: Jiri Pirko <jiri@mellanox.com>
+    Reviewed-by: Greg Rose <gvrose8192@gmail.com>
+
+Signed-off-by: Kamal Heib <kheib@redhat.com>
+---
+ devlink/devlink.c | 103 ++++++++++++++++--------------------------------------
+ 1 file changed, 30 insertions(+), 73 deletions(-)
+
+diff --git a/devlink/devlink.c b/devlink/devlink.c
+index e90226e..35220d8 100644
+--- a/devlink/devlink.c
++++ b/devlink/devlink.c
+@@ -232,88 +232,45 @@ static bool dl_no_arg(struct dl *dl)
+ 	return dl_argc(dl) == 0;
+ }
+ 
++static const enum mnl_attr_data_type devlink_policy[DEVLINK_ATTR_MAX + 1] = {
++	[DEVLINK_ATTR_BUS_NAME] = MNL_TYPE_NUL_STRING,
++	[DEVLINK_ATTR_DEV_NAME] = MNL_TYPE_NUL_STRING,
++	[DEVLINK_ATTR_PORT_INDEX] = MNL_TYPE_U32,
++	[DEVLINK_ATTR_PORT_TYPE] = MNL_TYPE_U16,
++	[DEVLINK_ATTR_PORT_DESIRED_TYPE] = MNL_TYPE_U16,
++	[DEVLINK_ATTR_PORT_NETDEV_IFINDEX] = MNL_TYPE_U32,
++	[DEVLINK_ATTR_PORT_NETDEV_NAME] = MNL_TYPE_NUL_STRING,
++	[DEVLINK_ATTR_PORT_IBDEV_NAME] = MNL_TYPE_NUL_STRING,
++	[DEVLINK_ATTR_SB_INDEX] = MNL_TYPE_U32,
++	[DEVLINK_ATTR_SB_SIZE] = MNL_TYPE_U32,
++	[DEVLINK_ATTR_SB_INGRESS_POOL_COUNT] = MNL_TYPE_U16,
++	[DEVLINK_ATTR_SB_EGRESS_POOL_COUNT] = MNL_TYPE_U16,
++	[DEVLINK_ATTR_SB_INGRESS_TC_COUNT] = MNL_TYPE_U16,
++	[DEVLINK_ATTR_SB_EGRESS_TC_COUNT] = MNL_TYPE_U16,
++	[DEVLINK_ATTR_SB_POOL_INDEX] = MNL_TYPE_U16,
++	[DEVLINK_ATTR_SB_POOL_TYPE] = MNL_TYPE_U8,
++	[DEVLINK_ATTR_SB_POOL_SIZE] = MNL_TYPE_U32,
++	[DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE] = MNL_TYPE_U8,
++	[DEVLINK_ATTR_SB_THRESHOLD] = MNL_TYPE_U32,
++	[DEVLINK_ATTR_SB_TC_INDEX] = MNL_TYPE_U16,
++	[DEVLINK_ATTR_SB_OCC_CUR] = MNL_TYPE_U32,
++	[DEVLINK_ATTR_SB_OCC_MAX] = MNL_TYPE_U32,
++	[DEVLINK_ATTR_ESWITCH_MODE] = MNL_TYPE_U16,
++	[DEVLINK_ATTR_ESWITCH_INLINE_MODE] = MNL_TYPE_U8,
++};
++
+ static int attr_cb(const struct nlattr *attr, void *data)
+ {
+ 	const struct nlattr **tb = data;
+ 	int type;
+ 
+-	type = mnl_attr_get_type(attr);
+-
+ 	if (mnl_attr_type_valid(attr, DEVLINK_ATTR_MAX) < 0)
+ 		return MNL_CB_ERROR;
+ 
+-	if (type == DEVLINK_ATTR_BUS_NAME &&
+-	    mnl_attr_validate(attr, MNL_TYPE_NUL_STRING) < 0)
+-		return MNL_CB_ERROR;
+-	if (type == DEVLINK_ATTR_DEV_NAME &&
+-	    mnl_attr_validate(attr, MNL_TYPE_NUL_STRING) < 0)
+-		return MNL_CB_ERROR;
+-	if (type == DEVLINK_ATTR_PORT_INDEX &&
+-	    mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+-		return MNL_CB_ERROR;
+-	if (type == DEVLINK_ATTR_PORT_TYPE &&
+-	    mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
+-		return MNL_CB_ERROR;
+-	if (type == DEVLINK_ATTR_PORT_DESIRED_TYPE &&
+-	    mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
+-		return MNL_CB_ERROR;
+-	if (type == DEVLINK_ATTR_PORT_NETDEV_IFINDEX &&
+-	    mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+-		return MNL_CB_ERROR;
+-	if (type == DEVLINK_ATTR_PORT_NETDEV_NAME &&
+-	    mnl_attr_validate(attr, MNL_TYPE_NUL_STRING) < 0)
+-		return MNL_CB_ERROR;
+-	if (type == DEVLINK_ATTR_PORT_IBDEV_NAME &&
+-	    mnl_attr_validate(attr, MNL_TYPE_NUL_STRING) < 0)
+-		return MNL_CB_ERROR;
+-	if (type == DEVLINK_ATTR_SB_INDEX &&
+-	    mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+-		return MNL_CB_ERROR;
+-	if (type == DEVLINK_ATTR_SB_SIZE &&
+-	    mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+-		return MNL_CB_ERROR;
+-	if (type == DEVLINK_ATTR_SB_INGRESS_POOL_COUNT &&
+-	    mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
+-		return MNL_CB_ERROR;
+-	if (type == DEVLINK_ATTR_SB_EGRESS_POOL_COUNT &&
+-	    mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
+-		return MNL_CB_ERROR;
+-	if (type == DEVLINK_ATTR_SB_INGRESS_TC_COUNT &&
+-	    mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
+-		return MNL_CB_ERROR;
+-	if (type == DEVLINK_ATTR_SB_EGRESS_TC_COUNT &&
+-	    mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
+-		return MNL_CB_ERROR;
+-	if (type == DEVLINK_ATTR_SB_POOL_INDEX &&
+-	    mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
+-		return MNL_CB_ERROR;
+-	if (type == DEVLINK_ATTR_SB_POOL_TYPE &&
+-	    mnl_attr_validate(attr, MNL_TYPE_U8) < 0)
+-		return MNL_CB_ERROR;
+-	if (type == DEVLINK_ATTR_SB_POOL_SIZE &&
+-	    mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+-		return MNL_CB_ERROR;
+-	if (type == DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE &&
+-	    mnl_attr_validate(attr, MNL_TYPE_U8) < 0)
+-		return MNL_CB_ERROR;
+-	if (type == DEVLINK_ATTR_SB_THRESHOLD &&
+-	    mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+-		return MNL_CB_ERROR;
+-	if (type == DEVLINK_ATTR_SB_TC_INDEX &&
+-	    mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
+-		return MNL_CB_ERROR;
+-	if (type == DEVLINK_ATTR_SB_OCC_CUR &&
+-	    mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+-		return MNL_CB_ERROR;
+-	if (type == DEVLINK_ATTR_SB_OCC_MAX &&
+-	    mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
+-		return MNL_CB_ERROR;
+-	if (type == DEVLINK_ATTR_ESWITCH_MODE &&
+-	    mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
+-		return MNL_CB_ERROR;
+-	if (type == DEVLINK_ATTR_ESWITCH_INLINE_MODE &&
+-	    mnl_attr_validate(attr, MNL_TYPE_U8) < 0)
++	type = mnl_attr_get_type(attr);
++	if (mnl_attr_validate(attr, devlink_policy[type]) < 0)
+ 		return MNL_CB_ERROR;
++
+ 	tb[type] = attr;
+ 	return MNL_CB_OK;
+ }
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0026-devlink-Add-support-for-pipeline-debug-dpipe.patch b/SOURCES/0026-devlink-Add-support-for-pipeline-debug-dpipe.patch
new file mode 100644
index 0000000..7bebb6c
--- /dev/null
+++ b/SOURCES/0026-devlink-Add-support-for-pipeline-debug-dpipe.patch
@@ -0,0 +1,1597 @@
+From 120f9c488ba7d291f899f1ec2f77e0ae33efcd88 Mon Sep 17 00:00:00 2001
+From: Kamal Heib <kheib@redhat.com>
+Date: Thu, 9 Nov 2017 04:44:32 -0500
+Subject: [PATCH] devlink: Add support for pipeline debug (dpipe)
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539
+
+commit 153c1a9b21e5b7b78e066de2b93a4edb8c3dc498
+Author: Arkadi Sharshevsky <arkadis@mellanox.com>
+Date:   Wed May 3 13:25:23 2017 +0200
+
+    devlink: Add support for pipeline debug (dpipe)
+
+    Add support for pipeline debug (dpipe). The headers are used both the
+    gain visibillity into the headers supported by the hardware, and to
+    build the headers/field database which is used by other commands.
+
+    Examples:
+
+    First we can see the headers supported by the hardware:
+
+    $devlink dpipe header show pci/0000:03:00.0
+
+    pci/0000:03:00.0:
+      name mlxsw_meta
+      field:
+        name erif_port bitwidth 32 mapping_type ifindex
+        name l3_forward bitwidth 1
+        name l3_drop bitwidth 1
+
+    Note that mapping_type is presented only if relevant. Also the header/
+    field id's are reported by the kernel they are not shown by default.
+    They can be observed by using the -v option. Also the headers scope
+    (global/local) is specified.
+
+    $devlink -v dpipe header show pci/0000:03:00.0
+
+    pci/0000:03:00.0:
+      name mlxsw_meta id 0 global false
+      field:
+        name erif_port id 0 bitwidth 32 mapping_type ifindex
+        name l3_forward id 1 bitwidth 1
+        name l3_drop id 2 bitwidth 1
+
+    Second we can examine the tables supported by the hardware. In order
+    to dump all the tables no table name should be provided:
+    $devlink dpipe table show pci/0000:03:00.0
+
+    In order to examine specific table its name have to be specified:
+    $devlink dpipe table show pci/0000:03:00.0 name erif
+
+    pci/0000:03:00.0:
+      name mlxsw_erif size 800 counters_enabled true
+      match:
+        type field_exact header mlxsw_meta field erif_port mapping ifindex
+      action:
+        type field_modify header mlxsw_meta field l3_forward
+        type field_modify header mlxsw_meta field l3_drop
+
+    To enable/disable counters on the table:
+    $devlink dpipe table set pci/0000:03:00.0 name erif counters enable
+    $devlink dpipe table set pci/0000:03:00.0 name erif counters disable
+
+    In order to see the current entries in the hardware for specific table:
+    $devlink dpipe table dump pci/0000:03:00.0 name erif
+
+    pci/0000:03:00.0:
+      index 0 counter 0
+      match_value:
+        type field_exact header mlxsw_meta field erif_port mapping ifindex mapping_value 383 value 0
+      action_value:
+        type field_modify header mlxsw_meta field l3_forward value 1
+
+      index 1 counter 0
+      match_value:
+        type field_exact header mlxsw_meta field erif_port mapping ifindex mapping_value 381 value 1
+      action_value:
+        type field_modify header mlxsw_meta field l3_forward value 1
+
+    In the above example the table contains two entries which does match
+    on erif port and forwards the packet or drop it (currently only the
+    forward count is implemented). The counter values are provided for
+    example. In case the counting is not enabled on the table the counters
+    will not be available.
+
+    Signed-off-by: Arkadi Sharshevsky <arkadis@mellanox.com>
+    Signed-off-by: Jiri Pirko <jiri@mellanox.com>
+
+Signed-off-by: Kamal Heib <kheib@redhat.com>
+---
+ devlink/devlink.c | 1353 +++++++++++++++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 1254 insertions(+), 99 deletions(-)
+
+diff --git a/devlink/devlink.c b/devlink/devlink.c
+index 35220d8..e22ee0a 100644
+--- a/devlink/devlink.c
++++ b/devlink/devlink.c
+@@ -34,7 +34,15 @@
+ #define ESWITCH_INLINE_MODE_TRANSPORT "transport"
+ 
+ #define pr_err(args...) fprintf(stderr, ##args)
+-#define pr_out(args...) fprintf(stdout, ##args)
++#define pr_out(args...)						\
++	do {							\
++		if (g_indent_newline) {				\
++			fprintf(stdout, "%s", g_indent_str);	\
++			g_indent_newline = false;		\
++		}						\
++		fprintf(stdout, ##args);			\
++	} while (0)
++
+ #define pr_out_sp(num, args...)					\
+ 	do {							\
+ 		int ret = fprintf(stdout, ##args);		\
+@@ -42,6 +50,35 @@
+ 			fprintf(stdout, "%*s", num - ret, "");	\
+ 	} while (0)
+ 
++static int g_indent_level;
++static bool g_indent_newline;
++#define INDENT_STR_STEP 2
++#define INDENT_STR_MAXLEN 32
++static char g_indent_str[INDENT_STR_MAXLEN + 1] = "";
++
++static void __pr_out_indent_inc(void)
++{
++	if (g_indent_level + INDENT_STR_STEP > INDENT_STR_MAXLEN)
++		return;
++	g_indent_level += INDENT_STR_STEP;
++	memset(g_indent_str, ' ', sizeof(g_indent_str));
++	g_indent_str[g_indent_level] = '\0';
++}
++
++static void __pr_out_indent_dec(void)
++{
++	if (g_indent_level - INDENT_STR_STEP < 0)
++		return;
++	g_indent_level -= INDENT_STR_STEP;
++	g_indent_str[g_indent_level] = '\0';
++}
++
++static void __pr_out_newline(void)
++{
++	pr_out("\n");
++	g_indent_newline = true;
++}
++
+ static int _mnlg_socket_recv_run(struct mnlg_socket *nlg,
+ 				 mnl_cb_t data_cb, void *data)
+ {
+@@ -137,6 +174,8 @@ static void ifname_map_free(struct ifname_map *ifname_map)
+ #define DL_OPT_SB_TC		BIT(10)
+ #define DL_OPT_ESWITCH_MODE	BIT(11)
+ #define DL_OPT_ESWITCH_INLINE_MODE	BIT(12)
++#define DL_OPT_DPIPE_TABLE_NAME	BIT(13)
++#define DL_OPT_DPIPE_TABLE_COUNTERS	BIT(14)
+ 
+ struct dl_opts {
+ 	uint32_t present; /* flags of present items */
+@@ -154,6 +193,8 @@ struct dl_opts {
+ 	uint16_t sb_tc_index;
+ 	enum devlink_eswitch_mode eswitch_mode;
+ 	enum devlink_eswitch_inline_mode eswitch_inline_mode;
++	const char *dpipe_table_name;
++	bool dpipe_counters_enable;
+ };
+ 
+ struct dl {
+@@ -166,6 +207,7 @@ struct dl {
+ 	json_writer_t *jw;
+ 	bool json_output;
+ 	bool pretty_output;
++	bool verbose;
+ 	struct {
+ 		bool present;
+ 		char *bus_name;
+@@ -257,6 +299,38 @@ static const enum mnl_attr_data_type devlink_policy[DEVLINK_ATTR_MAX + 1] = {
+ 	[DEVLINK_ATTR_SB_OCC_MAX] = MNL_TYPE_U32,
+ 	[DEVLINK_ATTR_ESWITCH_MODE] = MNL_TYPE_U16,
+ 	[DEVLINK_ATTR_ESWITCH_INLINE_MODE] = MNL_TYPE_U8,
++	[DEVLINK_ATTR_DPIPE_TABLES] = MNL_TYPE_NESTED,
++	[DEVLINK_ATTR_DPIPE_TABLE] = MNL_TYPE_NESTED,
++	[DEVLINK_ATTR_DPIPE_TABLE_NAME] = MNL_TYPE_STRING,
++	[DEVLINK_ATTR_DPIPE_TABLE_SIZE] = MNL_TYPE_U64,
++	[DEVLINK_ATTR_DPIPE_TABLE_MATCHES] = MNL_TYPE_NESTED,
++	[DEVLINK_ATTR_DPIPE_TABLE_ACTIONS] = MNL_TYPE_NESTED,
++	[DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED] =  MNL_TYPE_U8,
++	[DEVLINK_ATTR_DPIPE_ENTRIES] = MNL_TYPE_NESTED,
++	[DEVLINK_ATTR_DPIPE_ENTRY] = MNL_TYPE_NESTED,
++	[DEVLINK_ATTR_DPIPE_ENTRY_INDEX] = MNL_TYPE_U64,
++	[DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES] = MNL_TYPE_NESTED,
++	[DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES] = MNL_TYPE_NESTED,
++	[DEVLINK_ATTR_DPIPE_ENTRY_COUNTER] = MNL_TYPE_U64,
++	[DEVLINK_ATTR_DPIPE_MATCH] = MNL_TYPE_NESTED,
++	[DEVLINK_ATTR_DPIPE_MATCH_VALUE] = MNL_TYPE_NESTED,
++	[DEVLINK_ATTR_DPIPE_MATCH_TYPE] = MNL_TYPE_U32,
++	[DEVLINK_ATTR_DPIPE_ACTION] = MNL_TYPE_NESTED,
++	[DEVLINK_ATTR_DPIPE_ACTION_VALUE] = MNL_TYPE_NESTED,
++	[DEVLINK_ATTR_DPIPE_ACTION_TYPE] = MNL_TYPE_U32,
++	[DEVLINK_ATTR_DPIPE_VALUE_MAPPING] = MNL_TYPE_U32,
++	[DEVLINK_ATTR_DPIPE_HEADERS] = MNL_TYPE_NESTED,
++	[DEVLINK_ATTR_DPIPE_HEADER] = MNL_TYPE_NESTED,
++	[DEVLINK_ATTR_DPIPE_HEADER_NAME] = MNL_TYPE_STRING,
++	[DEVLINK_ATTR_DPIPE_HEADER_ID] = MNL_TYPE_U32,
++	[DEVLINK_ATTR_DPIPE_HEADER_FIELDS] = MNL_TYPE_NESTED,
++	[DEVLINK_ATTR_DPIPE_HEADER_GLOBAL] = MNL_TYPE_U8,
++	[DEVLINK_ATTR_DPIPE_HEADER_INDEX] = MNL_TYPE_U32,
++	[DEVLINK_ATTR_DPIPE_FIELD] = MNL_TYPE_NESTED,
++	[DEVLINK_ATTR_DPIPE_FIELD_NAME] = MNL_TYPE_STRING,
++	[DEVLINK_ATTR_DPIPE_FIELD_ID] = MNL_TYPE_U32,
++	[DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH] = MNL_TYPE_U32,
++	[DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE] = MNL_TYPE_U32,
+ };
+ 
+ static int attr_cb(const struct nlattr *attr, void *data)
+@@ -666,6 +740,20 @@ static int eswitch_inline_mode_get(const char *typestr,
+ 	return 0;
+ }
+ 
++static int dpipe_counters_enable_get(const char *typestr,
++				     bool *counters_enable)
++{
++	if (strcmp(typestr, "enable") == 0) {
++		*counters_enable = 1;
++	} else if (strcmp(typestr, "disable") == 0) {
++		*counters_enable = 0;
++	} else {
++		pr_err("Unknown counter_state \"%s\"\n", typestr);
++		return -EINVAL;
++	}
++	return 0;
++}
++
+ static int dl_argv_parse(struct dl *dl, uint32_t o_required,
+ 			 uint32_t o_optional)
+ {
+@@ -800,6 +888,27 @@ static int dl_argv_parse(struct dl *dl, uint32_t o_required,
+ 			if (err)
+ 				return err;
+ 			o_found |= DL_OPT_ESWITCH_INLINE_MODE;
++		} else if (dl_argv_match(dl, "name") &&
++			   (o_all & DL_OPT_DPIPE_TABLE_NAME)) {
++			dl_arg_inc(dl);
++			err = dl_argv_str(dl, &opts->dpipe_table_name);
++			if (err)
++				return err;
++			o_found |= DL_OPT_DPIPE_TABLE_NAME;
++		} else if (dl_argv_match(dl, "counters") &&
++			   (o_all & DL_OPT_DPIPE_TABLE_COUNTERS)) {
++			const char *typestr;
++
++			dl_arg_inc(dl);
++			err = dl_argv_str(dl, &typestr);
++			if (err)
++				return err;
++			err = dpipe_counters_enable_get(typestr,
++							&opts->dpipe_counters_enable);
++			if (err)
++				return err;
++			o_found |= DL_OPT_DPIPE_TABLE_COUNTERS;
++
+ 		} else {
+ 			pr_err("Unknown option \"%s\"\n", dl_argv(dl));
+ 			return -EINVAL;
+@@ -866,6 +975,17 @@ static int dl_argv_parse(struct dl *dl, uint32_t o_required,
+ 		return -EINVAL;
+ 	}
+ 
++	if ((o_required & DL_OPT_DPIPE_TABLE_NAME) &&
++	    !(o_found & DL_OPT_DPIPE_TABLE_NAME)) {
++		pr_err("Dpipe table name expected\n");
++		return -EINVAL;
++	}
++
++	if ((o_required & DL_OPT_DPIPE_TABLE_COUNTERS) &&
++	    !(o_found & DL_OPT_DPIPE_TABLE_COUNTERS)) {
++		pr_err("Dpipe table counter state expected\n");
++		return -EINVAL;
++	}
+ 	return 0;
+ }
+ 
+@@ -915,6 +1035,12 @@ static void dl_opts_put(struct nlmsghdr *nlh, struct dl *dl)
+ 	if (opts->present & DL_OPT_ESWITCH_INLINE_MODE)
+ 		mnl_attr_put_u8(nlh, DEVLINK_ATTR_ESWITCH_INLINE_MODE,
+ 				opts->eswitch_inline_mode);
++	if (opts->present & DL_OPT_DPIPE_TABLE_NAME)
++		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DPIPE_TABLE_NAME,
++				  opts->dpipe_table_name);
++	if (opts->present & DL_OPT_DPIPE_TABLE_COUNTERS)
++		mnl_attr_put_u8(nlh, DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED,
++				opts->dpipe_counters_enable);
+ }
+ 
+ static int dl_argv_parse_put(struct nlmsghdr *nlh, struct dl *dl,
+@@ -1033,7 +1159,19 @@ static void __pr_out_handle_start(struct dl *dl, struct nlattr **tb,
+ 			jsonw_start_object(dl->jw);
+ 		}
+ 	} else {
+-		pr_out("%s%s", buf, content ? ":" : "");
++		if (array) {
++			if (should_arr_last_handle_end(dl, bus_name, dev_name))
++				__pr_out_indent_dec();
++			if (should_arr_last_handle_start(dl, bus_name,
++							 dev_name)) {
++				pr_out("%s%s", buf, content ? ":" : "");
++				__pr_out_newline();
++				__pr_out_indent_inc();
++				arr_last_handle_set(dl, bus_name, dev_name);
++			}
++		} else {
++			pr_out("%s%s", buf, content ? ":" : "");
++		}
+ 	}
+ }
+ 
+@@ -1047,7 +1185,7 @@ static void pr_out_handle_end(struct dl *dl)
+ 	if (dl->json_output)
+ 		jsonw_end_object(dl->jw);
+ 	else
+-		pr_out("\n");
++		__pr_out_newline();
+ }
+ 
+ static void pr_out_handle(struct dl *dl, struct nlattr **tb)
+@@ -1163,18 +1301,26 @@ static void pr_out_port_handle_end(struct dl *dl)
+ 
+ static void pr_out_str(struct dl *dl, const char *name, const char *val)
+ {
+-	if (dl->json_output)
++	if (dl->json_output) {
+ 		jsonw_string_field(dl->jw, name, val);
+-	else
+-		pr_out(" %s %s", name, val);
++	} else {
++		if (g_indent_newline)
++			pr_out("%s %s", name, val);
++		else
++			pr_out(" %s %s", name, val);
++	}
+ }
+ 
+ static void pr_out_uint(struct dl *dl, const char *name, unsigned int val)
+ {
+-	if (dl->json_output)
++	if (dl->json_output) {
+ 		jsonw_uint_field(dl->jw, name, val);
+-	else
+-		pr_out(" %s %u", name, val);
++	} else {
++		if (g_indent_newline)
++			pr_out("%s %u", name, val);
++		else
++			pr_out(" %s %u", name, val);
++	}
+ }
+ 
+ static void pr_out_dev(struct dl *dl, struct nlattr **tb)
+@@ -1201,6 +1347,42 @@ static void pr_out_section_end(struct dl *dl)
+ 	}
+ }
+ 
++static void pr_out_array_start(struct dl *dl, const char *name)
++{
++	if (dl->json_output) {
++		jsonw_name(dl->jw, name);
++		jsonw_start_array(dl->jw);
++	} else {
++		if (!g_indent_newline)
++			__pr_out_newline();
++		pr_out("%s:", name);
++		__pr_out_newline();
++		__pr_out_indent_inc();
++	}
++}
++
++static void pr_out_array_end(struct dl *dl)
++{
++	if (dl->json_output)
++		jsonw_end_array(dl->jw);
++	else
++		__pr_out_indent_dec();
++}
++
++static void pr_out_entry_start(struct dl *dl)
++{
++	if (dl->json_output)
++		jsonw_start_object(dl->jw);
++}
++
++static void pr_out_entry_end(struct dl *dl)
++{
++	if (dl->json_output)
++		jsonw_end_object(dl->jw);
++	else
++		__pr_out_newline();
++}
++
+ static const char *eswitch_mode_name(uint32_t mode)
+ {
+ 	switch (mode) {
+@@ -2423,129 +2605,1102 @@ static int cmd_mon(struct dl *dl)
+ 	return -ENOENT;
+ }
+ 
+-static void help(void)
++struct dpipe_field {
++	char *name;
++	unsigned int id;
++	unsigned int bitwidth;
++	enum devlink_dpipe_field_mapping_type mapping_type;
++};
++
++struct dpipe_header {
++	struct list_head list;
++	char *name;
++	unsigned int id;
++	struct dpipe_field *fields;
++	unsigned int fields_count;
++};
++
++struct dpipe_ctx {
++	struct dl *dl;
++	int err;
++	struct list_head global_headers;
++	struct list_head local_headers;
++	bool print_headers;
++};
++
++static struct dpipe_header *dpipe_header_alloc(unsigned int fields_count)
+ {
+-	pr_err("Usage: devlink [ OPTIONS ] OBJECT { COMMAND | help }\n"
+-	       "where  OBJECT := { dev | port | sb | monitor }\n"
+-	       "       OPTIONS := { -V[ersion] | -n[no-nice-names] | -j[json] | -p[pretty] }\n");
++	struct dpipe_header *header;
++
++	header = calloc(1, sizeof(struct dpipe_header));
++	if (!header)
++		return NULL;
++	header->fields = calloc(fields_count, sizeof(struct dpipe_field));
++	if (!header->fields)
++		goto err_fields_alloc;
++	header->fields_count = fields_count;
++	return header;
++
++err_fields_alloc:
++	free(header);
++	return NULL;
+ }
+ 
+-static int dl_cmd(struct dl *dl)
++static void dpipe_header_free(struct dpipe_header *header)
+ {
+-	if (dl_argv_match(dl, "help") || dl_no_arg(dl)) {
+-		help();
+-		return 0;
+-	} else if (dl_argv_match(dl, "dev")) {
+-		dl_arg_inc(dl);
+-		return cmd_dev(dl);
+-	} else if (dl_argv_match(dl, "port")) {
+-		dl_arg_inc(dl);
+-		return cmd_port(dl);
+-	} else if (dl_argv_match(dl, "sb")) {
+-		dl_arg_inc(dl);
+-		return cmd_sb(dl);
+-	} else if (dl_argv_match(dl, "monitor")) {
+-		dl_arg_inc(dl);
+-		return cmd_mon(dl);
++	free(header->fields);
++	free(header);
++}
++
++static void dpipe_header_clear(struct dpipe_header *header)
++{
++	struct dpipe_field *field;
++	int i;
++
++	for (i = 0; i < header->fields_count; i++) {
++		field = &header->fields[i];
++		free(field->name);
+ 	}
+-	pr_err("Object \"%s\" not found\n", dl_argv(dl));
+-	return -ENOENT;
++	free(header->name);
+ }
+ 
+-static int dl_init(struct dl *dl, int argc, char **argv)
++static void dpipe_header_add(struct dpipe_ctx *ctx,
++			     struct dpipe_header *header, bool global)
+ {
+-	int err;
++	if (global)
++		list_add(&header->list, &ctx->global_headers);
++	else
++		list_add(&header->list, &ctx->local_headers);
++}
+ 
+-	dl->argc = argc;
+-	dl->argv = argv;
++static void dpipe_header_del(struct dpipe_header *header)
++{
++	list_del(&header->list);
++}
+ 
+-	dl->nlg = mnlg_socket_open(DEVLINK_GENL_NAME, DEVLINK_GENL_VERSION);
+-	if (!dl->nlg) {
+-		pr_err("Failed to connect to devlink Netlink\n");
+-		return -errno;
++static struct dpipe_ctx *dpipe_ctx_alloc(struct dl *dl)
++{
++	struct dpipe_ctx *ctx;
++
++	ctx = calloc(1, sizeof(struct dpipe_ctx));
++	if (!ctx)
++		return NULL;
++	ctx->dl = dl;
++	INIT_LIST_HEAD(&ctx->global_headers);
++	INIT_LIST_HEAD(&ctx->local_headers);
++	return ctx;
++}
++
++static void dpipe_ctx_free(struct dpipe_ctx *ctx)
++{
++	free(ctx);
++}
++
++static void dpipe_ctx_clear(struct dpipe_ctx *ctx)
++{
++	struct dpipe_header *header, *tmp;
++
++	list_for_each_entry_safe(header, tmp, &ctx->global_headers,
++				 list) {
++		dpipe_header_del(header);
++		dpipe_header_clear(header);
++		dpipe_header_free(header);
++	}
++	list_for_each_entry_safe(header, tmp, &ctx->local_headers,
++				 list) {
++		dpipe_header_del(header);
++		dpipe_header_clear(header);
++		dpipe_header_free(header);
+ 	}
++}
+ 
+-	err = ifname_map_init(dl);
+-	if (err) {
+-		pr_err("Failed to create index map\n");
+-		goto err_ifname_map_create;
++static const char *dpipe_header_id2s(struct dpipe_ctx *ctx,
++				     uint32_t header_id, bool global)
++{
++	struct list_head *header_list;
++	struct dpipe_header *header;
++
++	if (global)
++		header_list = &ctx->global_headers;
++	else
++		header_list = &ctx->local_headers;
++	list_for_each_entry(header, header_list, list) {
++		if (header->id != header_id)
++			continue;
++		return header->name;
+ 	}
+-	if (dl->json_output) {
+-		dl->jw = jsonw_new(stdout);
+-		if (!dl->jw) {
+-			pr_err("Failed to create JSON writer\n");
+-			goto err_json_new;
+-		}
+-		jsonw_pretty(dl->jw, dl->pretty_output);
++	return NULL;
++}
++
++static const char *dpipe_field_id2s(struct dpipe_ctx *ctx,
++				    uint32_t header_id,
++				    uint32_t field_id, bool global)
++{
++	struct list_head *header_list;
++	struct dpipe_header *header;
++
++	if (global)
++		header_list = &ctx->global_headers;
++	else
++		header_list = &ctx->local_headers;
++	list_for_each_entry(header, header_list, list) {
++		if (header->id != header_id)
++			continue;
++		return header->fields[field_id].name;
+ 	}
+-	return 0;
++	return NULL;
++}
+ 
+-err_json_new:
+-	ifname_map_fini(dl);
+-err_ifname_map_create:
+-	mnlg_socket_close(dl->nlg);
+-	return err;
++static const char *
++dpipe_field_mapping_e2s(enum devlink_dpipe_field_mapping_type mapping_type)
++{
++	switch (mapping_type) {
++	case DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE:
++		return NULL;
++	case DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX:
++		return "ifindex";
++	default:
++		return "<unknown>";
++	}
+ }
+ 
+-static void dl_fini(struct dl *dl)
++static const char *
++dpipe_mapping_get(struct dpipe_ctx *ctx, uint32_t header_id,
++		  uint32_t field_id, bool global)
+ {
+-	if (dl->json_output)
+-		jsonw_destroy(&dl->jw);
+-	ifname_map_fini(dl);
+-	mnlg_socket_close(dl->nlg);
++	enum devlink_dpipe_field_mapping_type mapping_type;
++	struct list_head *header_list;
++	struct dpipe_header *header;
++
++	if (global)
++		header_list = &ctx->global_headers;
++	else
++		header_list = &ctx->local_headers;
++	list_for_each_entry(header, header_list, list) {
++		if (header->id != header_id)
++			continue;
++		mapping_type = header->fields[field_id].mapping_type;
++		return dpipe_field_mapping_e2s(mapping_type);
++	}
++	return NULL;
+ }
+ 
+-static struct dl *dl_alloc(void)
++static void pr_out_dpipe_fields(struct dpipe_ctx *ctx,
++				struct dpipe_field *fields,
++				unsigned int field_count)
+ {
+-	struct dl *dl;
++	struct dpipe_field *field;
++	int i;
+ 
+-	dl = calloc(1, sizeof(*dl));
+-	if (!dl)
+-		return NULL;
+-	return dl;
++	for (i = 0; i < field_count; i++) {
++		field = &fields[i];
++		pr_out_entry_start(ctx->dl);
++		pr_out_str(ctx->dl, "name", field->name);
++		if (ctx->dl->verbose)
++			pr_out_uint(ctx->dl, "id", field->id);
++		pr_out_uint(ctx->dl, "bitwidth", field->bitwidth);
++		if (field->mapping_type)
++			pr_out_str(ctx->dl, "mapping_type",
++				   dpipe_field_mapping_e2s(field->mapping_type));
++		pr_out_entry_end(ctx->dl);
++	}
+ }
+ 
+-static void dl_free(struct dl *dl)
++static void
++pr_out_dpipe_header(struct dpipe_ctx *ctx, struct nlattr **tb,
++		    struct dpipe_header *header, bool global)
+ {
+-	free(dl);
++	pr_out_handle_start_arr(ctx->dl, tb);
++	pr_out_str(ctx->dl, "name", header->name);
++	if (ctx->dl->verbose) {
++		pr_out_uint(ctx->dl, "id", header->id);
++		pr_out_str(ctx->dl, "global",
++			   global ? "true" : "false");
++	}
++	pr_out_array_start(ctx->dl, "field");
++	pr_out_dpipe_fields(ctx, header->fields,
++			    header->fields_count);
++	pr_out_array_end(ctx->dl);
++	pr_out_handle_end(ctx->dl);
+ }
+ 
+-int main(int argc, char **argv)
++static void pr_out_dpipe_headers(struct dpipe_ctx *ctx,
++				 struct nlattr **tb)
+ {
+-	static const struct option long_options[] = {
+-		{ "Version",		no_argument,		NULL, 'V' },
+-		{ "no-nice-names",	no_argument,		NULL, 'n' },
+-		{ "json",		no_argument,		NULL, 'j' },
+-		{ "pretty",		no_argument,		NULL, 'p' },
+-		{ NULL, 0, NULL, 0 }
+-	};
+-	struct dl *dl;
+-	int opt;
++	struct dpipe_header *header;
++
++	list_for_each_entry(header, &ctx->local_headers, list)
++		pr_out_dpipe_header(ctx, tb, header, false);
++
++	list_for_each_entry(header, &ctx->global_headers, list)
++		pr_out_dpipe_header(ctx, tb, header, true);
++}
++
++static int dpipe_header_field_get(struct nlattr *nl, struct dpipe_field *field)
++{
++	struct nlattr *nla_field[DEVLINK_ATTR_MAX + 1] = {};
++	const char *name;
+ 	int err;
+-	int ret;
+ 
+-	dl = dl_alloc();
+-	if (!dl) {
+-		pr_err("Failed to allocate memory for devlink\n");
+-		return EXIT_FAILURE;
++	err = mnl_attr_parse_nested(nl, attr_cb, nla_field);
++	if (err != MNL_CB_OK)
++		return -EINVAL;
++	if (!nla_field[DEVLINK_ATTR_DPIPE_FIELD_ID] ||
++	    !nla_field[DEVLINK_ATTR_DPIPE_FIELD_NAME] ||
++	    !nla_field[DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH] ||
++	    !nla_field[DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE])
++		return -EINVAL;
++
++	name = mnl_attr_get_str(nla_field[DEVLINK_ATTR_DPIPE_FIELD_NAME]);
++	field->id = mnl_attr_get_u32(nla_field[DEVLINK_ATTR_DPIPE_FIELD_ID]);
++	field->bitwidth = mnl_attr_get_u32(nla_field[DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH]);
++	field->name = strdup(name);
++	if (!field->name)
++		return -ENOMEM;
++	field->mapping_type = mnl_attr_get_u32(nla_field[DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE]);
++	return 0;
++}
++
++static int dpipe_header_fields_get(struct nlattr *nla_fields,
++				   struct dpipe_field *fields)
++{
++	struct nlattr *nla_field;
++	int count = 0;
++	int err;
++
++	mnl_attr_for_each_nested(nla_field, nla_fields) {
++		err = dpipe_header_field_get(nla_field, &fields[count]);
++		if (err)
++			return err;
++		count++;
+ 	}
++	return 0;
++}
+ 
+-	while ((opt = getopt_long(argc, argv, "Vnjp",
+-				  long_options, NULL)) >= 0) {
++static unsigned int dpipe_header_field_count_get(struct nlattr *nla_fields)
++{
++	struct nlattr *nla_field;
++	unsigned int count = 0;
+ 
+-		switch (opt) {
+-		case 'V':
+-			printf("devlink utility, iproute2-ss%s\n", SNAPSHOT);
+-			ret = EXIT_SUCCESS;
+-			goto dl_free;
+-		case 'n':
+-			dl->no_nice_names = true;
+-			break;
+-		case 'j':
+-			dl->json_output = true;
+-			break;
+-		case 'p':
+-			dl->pretty_output = true;
++	mnl_attr_for_each_nested(nla_field, nla_fields)
++		count++;
++	return count;
++}
++
++static int dpipe_header_get(struct dpipe_ctx *ctx, struct nlattr *nl)
++{
++	struct nlattr *nla_header[DEVLINK_ATTR_MAX + 1] = {};
++	struct dpipe_header *header;
++	unsigned int fields_count;
++	const char *header_name;
++	bool global;
++	int err;
++
++	err = mnl_attr_parse_nested(nl, attr_cb, nla_header);
++	if (err != MNL_CB_OK)
++		return -EINVAL;
++
++	if (!nla_header[DEVLINK_ATTR_DPIPE_HEADER_NAME] ||
++	    !nla_header[DEVLINK_ATTR_DPIPE_HEADER_ID] ||
++	    !nla_header[DEVLINK_ATTR_DPIPE_HEADER_FIELDS])
++		return -EINVAL;
++
++	fields_count = dpipe_header_field_count_get(nla_header[DEVLINK_ATTR_DPIPE_HEADER_FIELDS]);
++	header = dpipe_header_alloc(fields_count);
++	if (!header)
++		return -ENOMEM;
++
++	header_name = mnl_attr_get_str(nla_header[DEVLINK_ATTR_DPIPE_HEADER_NAME]);
++	header->name = strdup(header_name);
++	header->id = mnl_attr_get_u32(nla_header[DEVLINK_ATTR_DPIPE_HEADER_ID]);
++	header->fields_count = fields_count;
++	global = !!mnl_attr_get_u8(nla_header[DEVLINK_ATTR_DPIPE_HEADER_GLOBAL]);
++
++	err = dpipe_header_fields_get(nla_header[DEVLINK_ATTR_DPIPE_HEADER_FIELDS],
++				      header->fields);
++	if (err)
++		goto err_field_get;
++	dpipe_header_add(ctx, header, global);
++	return 0;
++
++err_field_get:
++	dpipe_header_free(header);
++	return err;
++}
++
++static int dpipe_headers_get(struct dpipe_ctx *ctx, struct nlattr **tb)
++{
++	struct nlattr *nla_headers = tb[DEVLINK_ATTR_DPIPE_HEADERS];
++	struct nlattr *nla_header;
++	int err;
++
++	mnl_attr_for_each_nested(nla_header, nla_headers) {
++		err = dpipe_header_get(ctx, nla_header);
++		if (err)
++			return err;
++	}
++	return 0;
++}
++
++static int cmd_dpipe_header_cb(const struct nlmsghdr *nlh, void *data)
++{
++	struct dpipe_ctx *ctx = data;
++	struct nlattr *tb[DEVLINK_ATTR_MAX + 1] = {};
++	struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
++	int err;
++
++	mnl_attr_parse(nlh, sizeof(*genl), attr_cb, tb);
++	if (!tb[DEVLINK_ATTR_BUS_NAME] || !tb[DEVLINK_ATTR_DEV_NAME] ||
++	    !tb[DEVLINK_ATTR_DPIPE_HEADERS])
++		return MNL_CB_ERROR;
++	err = dpipe_headers_get(ctx, tb);
++	if (err) {
++		ctx->err = err;
++		return MNL_CB_ERROR;
++	}
++
++	if (ctx->print_headers)
++		pr_out_dpipe_headers(ctx, tb);
++	return MNL_CB_OK;
++}
++
++static int cmd_dpipe_headers_show(struct dl *dl)
++{
++	struct nlmsghdr *nlh;
++	struct dpipe_ctx *ctx;
++	uint16_t flags = NLM_F_REQUEST | NLM_F_ACK;
++	int err;
++
++	nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_DPIPE_HEADERS_GET, flags);
++
++	err = dl_argv_parse_put(nlh, dl, DL_OPT_HANDLE, 0);
++	if (err)
++		return err;
++
++	ctx = dpipe_ctx_alloc(dl);
++	if (!ctx)
++		return -ENOMEM;
++
++	ctx->print_headers = true;
++
++	pr_out_section_start(dl, "header");
++	err = _mnlg_socket_sndrcv(dl->nlg, nlh, cmd_dpipe_header_cb, ctx);
++	if (err)
++		pr_err("error get headers %s\n", strerror(ctx->err));
++	pr_out_section_end(dl);
++
++	dpipe_ctx_clear(ctx);
++	dpipe_ctx_free(ctx);
++	return err;
++}
++
++static void cmd_dpipe_header_help(void)
++{
++	pr_err("Usage: devlink dpipe headers show DEV\n");
++}
++
++static int cmd_dpipe_header(struct dl *dl)
++{
++	if (dl_argv_match(dl, "help") || dl_no_arg(dl)) {
++		cmd_dpipe_header_help();
++		return 0;
++	} else if (dl_argv_match(dl, "show")) {
++		dl_arg_inc(dl);
++		return cmd_dpipe_headers_show(dl);
++	}
++	pr_err("Command \"%s\" not found\n", dl_argv(dl));
++	return -ENOENT;
++}
++
++static const char
++*dpipe_action_type_e2s(enum devlink_dpipe_action_type action_type)
++{
++	switch (action_type) {
++	case DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY:
++		return "field_modify";
++	default:
++		return "<unknown>";
++	}
++}
++
++static void pr_out_dpipe_action(struct dpipe_ctx *ctx,
++				uint32_t header_id, uint32_t field_id,
++				uint32_t action_type, bool global)
++{
++	const char *mapping;
++
++	pr_out_str(ctx->dl, "type", dpipe_action_type_e2s(action_type));
++	pr_out_str(ctx->dl, "header", dpipe_header_id2s(ctx, header_id,
++							global));
++	pr_out_str(ctx->dl, "field", dpipe_field_id2s(ctx, header_id, field_id,
++						      global));
++	mapping = dpipe_mapping_get(ctx, header_id, field_id, global);
++	if (mapping)
++		pr_out_str(ctx->dl, "mapping", mapping);
++}
++
++static int dpipe_action_show(struct dpipe_ctx *ctx, struct nlattr *nl)
++{
++	struct nlattr *nla_action[DEVLINK_ATTR_MAX + 1] = {};
++	uint32_t header_id, field_id, action_type;
++	bool global;
++	int err;
++
++	err = mnl_attr_parse_nested(nl, attr_cb, nla_action);
++	if (err != MNL_CB_OK)
++		return -EINVAL;
++
++	if (!nla_action[DEVLINK_ATTR_DPIPE_ACTION_TYPE] ||
++	    !nla_action[DEVLINK_ATTR_DPIPE_HEADER_INDEX] ||
++	    !nla_action[DEVLINK_ATTR_DPIPE_HEADER_ID] ||
++	    !nla_action[DEVLINK_ATTR_DPIPE_FIELD_ID]) {
++		return -EINVAL;
++	}
++
++	header_id = mnl_attr_get_u32(nla_action[DEVLINK_ATTR_DPIPE_HEADER_ID]);
++	field_id = mnl_attr_get_u32(nla_action[DEVLINK_ATTR_DPIPE_FIELD_ID]);
++	action_type = mnl_attr_get_u32(nla_action[DEVLINK_ATTR_DPIPE_ACTION_TYPE]);
++	global = !!mnl_attr_get_u8(nla_action[DEVLINK_ATTR_DPIPE_HEADER_GLOBAL]);
++
++	pr_out_dpipe_action(ctx, header_id, field_id, action_type, global);
++	return 0;
++}
++
++static int dpipe_table_actions_show(struct dpipe_ctx *ctx,
++				    struct nlattr *nla_actions)
++{
++	struct nlattr *nla_action;
++
++	mnl_attr_for_each_nested(nla_action, nla_actions) {
++		pr_out_entry_start(ctx->dl);
++		if (dpipe_action_show(ctx, nla_action))
++			goto err_action_show;
++		pr_out_entry_end(ctx->dl);
++	}
++	return 0;
++
++err_action_show:
++	pr_out_entry_end(ctx->dl);
++	return -EINVAL;
++}
++
++static const char *
++dpipe_match_type_e2s(enum devlink_dpipe_match_type match_type)
++{
++	switch (match_type) {
++	case DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT:
++		return "field_exact";
++	default:
++		return "<unknown>";
++	}
++}
++
++static void pr_out_dpipe_match(struct dpipe_ctx *ctx,
++			       uint32_t header_id, uint32_t field_id,
++			       uint32_t match_type, bool global)
++{
++	const char *mapping;
++
++	pr_out_str(ctx->dl, "type", dpipe_match_type_e2s(match_type));
++	pr_out_str(ctx->dl, "header", dpipe_header_id2s(ctx, header_id,
++							global));
++	pr_out_str(ctx->dl, "field", dpipe_field_id2s(ctx, header_id, field_id,
++						      global));
++	mapping = dpipe_mapping_get(ctx, header_id, field_id, global);
++	if (mapping)
++		pr_out_str(ctx->dl, "mapping", mapping);
++
++}
++
++static int dpipe_match_show(struct dpipe_ctx *ctx, struct nlattr *nl)
++{
++	struct nlattr *nla_match[DEVLINK_ATTR_MAX + 1] = {};
++	uint32_t header_id, field_id, match_type;
++	bool global;
++	int err;
++
++	err = mnl_attr_parse_nested(nl, attr_cb, nla_match);
++	if (err != MNL_CB_OK)
++		return -EINVAL;
++
++	if (!nla_match[DEVLINK_ATTR_DPIPE_MATCH_TYPE] ||
++	    !nla_match[DEVLINK_ATTR_DPIPE_HEADER_INDEX] ||
++	    !nla_match[DEVLINK_ATTR_DPIPE_HEADER_ID] ||
++	    !nla_match[DEVLINK_ATTR_DPIPE_FIELD_ID]) {
++		return -EINVAL;
++	}
++
++	match_type = mnl_attr_get_u32(nla_match[DEVLINK_ATTR_DPIPE_MATCH_TYPE]);
++	header_id = mnl_attr_get_u32(nla_match[DEVLINK_ATTR_DPIPE_HEADER_ID]);
++	field_id = mnl_attr_get_u32(nla_match[DEVLINK_ATTR_DPIPE_FIELD_ID]);
++	global = !!mnl_attr_get_u8(nla_match[DEVLINK_ATTR_DPIPE_HEADER_GLOBAL]);
++
++	pr_out_dpipe_match(ctx, header_id, field_id, match_type, global);
++	return 0;
++}
++
++static int dpipe_table_matches_show(struct dpipe_ctx *ctx,
++				    struct nlattr *nla_matches)
++{
++	struct nlattr *nla_match;
++
++	mnl_attr_for_each_nested(nla_match, nla_matches) {
++		pr_out_entry_start(ctx->dl);
++		if (dpipe_match_show(ctx, nla_match))
++			goto err_match_show;
++		pr_out_entry_end(ctx->dl);
++	}
++	return 0;
++
++err_match_show:
++	pr_out_entry_end(ctx->dl);
++	return -EINVAL;
++}
++
++static int dpipe_table_show(struct dpipe_ctx *ctx, struct nlattr *nl)
++{
++	struct nlattr *nla_table[DEVLINK_ATTR_MAX + 1] = {};
++	bool counters_enabled;
++	const char *name;
++	uint32_t size;
++	int err;
++
++	err = mnl_attr_parse_nested(nl, attr_cb, nla_table);
++	if (err != MNL_CB_OK)
++		return -EINVAL;
++
++	if (!nla_table[DEVLINK_ATTR_DPIPE_TABLE_NAME] ||
++	    !nla_table[DEVLINK_ATTR_DPIPE_TABLE_SIZE] ||
++	    !nla_table[DEVLINK_ATTR_DPIPE_TABLE_ACTIONS] ||
++	    !nla_table[DEVLINK_ATTR_DPIPE_TABLE_MATCHES] ||
++	    !nla_table[DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED]) {
++		return -EINVAL;
++	}
++
++	name = mnl_attr_get_str(nla_table[DEVLINK_ATTR_DPIPE_TABLE_NAME]);
++	size = mnl_attr_get_u32(nla_table[DEVLINK_ATTR_DPIPE_TABLE_SIZE]);
++	counters_enabled = !!mnl_attr_get_u8(nla_table[DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED]);
++
++	pr_out_str(ctx->dl, "name", name);
++	pr_out_uint(ctx->dl, "size", size);
++	pr_out_str(ctx->dl, "counters_enabled",
++		   counters_enabled ? "true" : "false");
++
++	pr_out_array_start(ctx->dl, "match");
++	if (dpipe_table_matches_show(ctx, nla_table[DEVLINK_ATTR_DPIPE_TABLE_MATCHES]))
++		goto err_matches_show;
++	pr_out_array_end(ctx->dl);
++
++	pr_out_array_start(ctx->dl, "action");
++	if (dpipe_table_actions_show(ctx, nla_table[DEVLINK_ATTR_DPIPE_TABLE_ACTIONS]))
++		goto err_actions_show;
++	pr_out_array_end(ctx->dl);
++
++	return 0;
++
++err_actions_show:
++err_matches_show:
++	pr_out_array_end(ctx->dl);
++	return -EINVAL;
++}
++
++static int dpipe_tables_show(struct dpipe_ctx *ctx, struct nlattr **tb)
++{
++	struct nlattr *nla_tables = tb[DEVLINK_ATTR_DPIPE_TABLES];
++	struct nlattr *nla_table;
++
++	mnl_attr_for_each_nested(nla_table, nla_tables) {
++		pr_out_handle_start_arr(ctx->dl, tb);
++		if (dpipe_table_show(ctx, nla_table))
++			goto err_table_show;
++		pr_out_handle_end(ctx->dl);
++	}
++	return 0;
++
++err_table_show:
++	pr_out_handle_end(ctx->dl);
++	return -EINVAL;
++}
++
++static int cmd_dpipe_table_show_cb(const struct nlmsghdr *nlh, void *data)
++{
++	struct dpipe_ctx *ctx = data;
++	struct nlattr *tb[DEVLINK_ATTR_MAX + 1] = {};
++	struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
++
++	mnl_attr_parse(nlh, sizeof(*genl), attr_cb, tb);
++	if (!tb[DEVLINK_ATTR_BUS_NAME] || !tb[DEVLINK_ATTR_DEV_NAME] ||
++	    !tb[DEVLINK_ATTR_DPIPE_TABLES])
++		return MNL_CB_ERROR;
++
++	if (dpipe_tables_show(ctx, tb))
++		return MNL_CB_ERROR;
++	return MNL_CB_OK;
++}
++
++static int cmd_dpipe_table_show(struct dl *dl)
++{
++	struct nlmsghdr *nlh;
++	struct dpipe_ctx *ctx;
++	uint16_t flags = NLM_F_REQUEST;
++	int err;
++
++	ctx = dpipe_ctx_alloc(dl);
++	if (!ctx)
++		return -ENOMEM;
++
++	err = dl_argv_parse(dl, DL_OPT_HANDLE, DL_OPT_DPIPE_TABLE_NAME);
++	if (err)
++		goto out;
++
++	nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_DPIPE_HEADERS_GET, flags);
++	dl_opts_put(nlh, dl);
++	err = _mnlg_socket_sndrcv(dl->nlg, nlh, cmd_dpipe_header_cb, ctx);
++	if (err) {
++		pr_err("error get headers %s\n", strerror(ctx->err));
++		goto out;
++	}
++
++	flags = NLM_F_REQUEST | NLM_F_ACK;
++	nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_DPIPE_TABLE_GET, flags);
++	dl_opts_put(nlh, dl);
++
++	pr_out_section_start(dl, "table");
++	_mnlg_socket_sndrcv(dl->nlg, nlh, cmd_dpipe_table_show_cb, ctx);
++	pr_out_section_end(dl);
++out:
++	dpipe_ctx_clear(ctx);
++	dpipe_ctx_free(ctx);
++	return err;
++}
++
++static int cmd_dpipe_table_set(struct dl *dl)
++{
++	struct nlmsghdr *nlh;
++	int err;
++
++	nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET,
++			       NLM_F_REQUEST | NLM_F_ACK);
++
++	err = dl_argv_parse_put(nlh, dl,
++				DL_OPT_HANDLE | DL_OPT_DPIPE_TABLE_NAME |
++				DL_OPT_DPIPE_TABLE_COUNTERS, 0);
++	if (err)
++		return err;
++
++	return _mnlg_socket_sndrcv(dl->nlg, nlh, NULL, NULL);
++}
++
++static int dpipe_entry_value_show(struct dpipe_ctx *ctx,
++				  struct nlattr **nla_match_value)
++{
++	uint16_t value_len;
++	bool mask, mapping;
++
++	mask = !!nla_match_value[DEVLINK_ATTR_DPIPE_VALUE_MASK];
++	mapping = !!nla_match_value[DEVLINK_ATTR_DPIPE_VALUE_MAPPING];
++
++	value_len = mnl_attr_get_payload_len(nla_match_value[DEVLINK_ATTR_DPIPE_VALUE]);
++	if (value_len == sizeof(uint32_t)) {
++		uint32_t value, value_mask, value_mapping;
++
++		if (mapping) {
++			value_mapping = mnl_attr_get_u32(nla_match_value[DEVLINK_ATTR_DPIPE_VALUE_MAPPING]);
++			pr_out_uint(ctx->dl, "mapping_value", value_mapping);
++		}
++
++		if (mask) {
++			value_mask = mnl_attr_get_u32(nla_match_value[DEVLINK_ATTR_DPIPE_VALUE_MASK]);
++			pr_out_uint(ctx->dl, "mask_value", value_mask);
++		}
++
++		value = mnl_attr_get_u32(nla_match_value[DEVLINK_ATTR_DPIPE_VALUE]);
++		pr_out_uint(ctx->dl, "value", value);
++
++	} else {
++		return -EINVAL;
++	}
++
++	return 0;
++}
++
++static int dpipe_entry_match_value_show(struct dpipe_ctx *ctx,
++					struct nlattr *nl)
++{
++	struct nlattr *nla_match_value[DEVLINK_ATTR_MAX + 1] = {};
++	int err;
++
++	err = mnl_attr_parse_nested(nl, attr_cb, nla_match_value);
++	if (err != MNL_CB_OK)
++		return -EINVAL;
++
++	if (!nla_match_value[DEVLINK_ATTR_DPIPE_MATCH] ||
++	    !nla_match_value[DEVLINK_ATTR_DPIPE_VALUE]) {
++		return -EINVAL;
++	}
++
++	pr_out_entry_start(ctx->dl);
++	if (dpipe_match_show(ctx, nla_match_value[DEVLINK_ATTR_DPIPE_MATCH]))
++		goto err_match_show;
++	if (dpipe_entry_value_show(ctx, nla_match_value))
++		goto err_value_show;
++	pr_out_entry_end(ctx->dl);
++
++	return 0;
++
++err_match_show:
++err_value_show:
++	pr_out_entry_end(ctx->dl);
++	return -EINVAL;
++}
++
++static int dpipe_entry_action_value_show(struct dpipe_ctx *ctx,
++					 struct nlattr *nl)
++{
++	struct nlattr *nla_action_value[DEVLINK_ATTR_MAX + 1] = {};
++	int err;
++
++	err = mnl_attr_parse_nested(nl, attr_cb, nla_action_value);
++	if (err != MNL_CB_OK)
++		return -EINVAL;
++
++	if (!nla_action_value[DEVLINK_ATTR_DPIPE_ACTION] ||
++	    !nla_action_value[DEVLINK_ATTR_DPIPE_VALUE]) {
++		return -EINVAL;
++	}
++
++	pr_out_entry_start(ctx->dl);
++	if (dpipe_action_show(ctx, nla_action_value[DEVLINK_ATTR_DPIPE_ACTION]))
++		goto err_action_show;
++	if (dpipe_entry_value_show(ctx, nla_action_value))
++		goto err_value_show;
++	pr_out_entry_end(ctx->dl);
++
++	return 0;
++
++err_action_show:
++err_value_show:
++	pr_out_entry_end(ctx->dl);
++	return -EINVAL;
++}
++
++static int
++dpipe_tables_action_values_show(struct dpipe_ctx *ctx,
++				struct nlattr *nla_action_values)
++{
++	struct nlattr *nla_action_value;
++
++	mnl_attr_for_each_nested(nla_action_value, nla_action_values) {
++		if (dpipe_entry_action_value_show(ctx, nla_action_value))
++			return -EINVAL;
++	}
++	return 0;
++}
++
++static int
++dpipe_tables_match_values_show(struct dpipe_ctx *ctx,
++			       struct nlattr *nla_match_values)
++{
++	struct nlattr *nla_match_value;
++
++	mnl_attr_for_each_nested(nla_match_value, nla_match_values) {
++		if (dpipe_entry_match_value_show(ctx, nla_match_value))
++			return -EINVAL;
++	}
++	return 0;
++}
++
++static int dpipe_entry_show(struct dpipe_ctx *ctx, struct nlattr *nl)
++{
++	struct nlattr *nla_entry[DEVLINK_ATTR_MAX + 1] = {};
++	uint32_t entry_index;
++	uint64_t counter;
++	int err;
++
++	err = mnl_attr_parse_nested(nl, attr_cb, nla_entry);
++	if (err != MNL_CB_OK)
++		return -EINVAL;
++
++	if (!nla_entry[DEVLINK_ATTR_DPIPE_ENTRY_INDEX] ||
++	    !nla_entry[DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES] ||
++	    !nla_entry[DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES]) {
++		return -EINVAL;
++	}
++
++	entry_index = mnl_attr_get_u32(nla_entry[DEVLINK_ATTR_DPIPE_ENTRY_INDEX]);
++	pr_out_uint(ctx->dl, "index", entry_index);
++
++	if (nla_entry[DEVLINK_ATTR_DPIPE_ENTRY_COUNTER]) {
++		counter = mnl_attr_get_u64(nla_entry[DEVLINK_ATTR_DPIPE_ENTRY_COUNTER]);
++		pr_out_uint(ctx->dl, "counter", counter);
++	}
++
++	pr_out_array_start(ctx->dl, "match_value");
++	if (dpipe_tables_match_values_show(ctx,
++					   nla_entry[DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES]))
++		goto err_match_values_show;
++	pr_out_array_end(ctx->dl);
++
++	pr_out_array_start(ctx->dl, "action_value");
++	if (dpipe_tables_action_values_show(ctx,
++					    nla_entry[DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES]))
++		goto err_action_values_show;
++	pr_out_array_end(ctx->dl);
++	return 0;
++
++err_action_values_show:
++err_match_values_show:
++	pr_out_array_end(ctx->dl);
++	return -EINVAL;
++}
++
++static int dpipe_table_entries_show(struct dpipe_ctx *ctx, struct nlattr **tb)
++{
++	struct nlattr *nla_entries = tb[DEVLINK_ATTR_DPIPE_ENTRIES];
++	struct nlattr *nla_entry;
++
++	mnl_attr_for_each_nested(nla_entry, nla_entries) {
++		pr_out_handle_start_arr(ctx->dl, tb);
++		if (dpipe_entry_show(ctx, nla_entry))
++			goto err_entry_show;
++		pr_out_handle_end(ctx->dl);
++	}
++	return 0;
++
++err_entry_show:
++	pr_out_handle_end(ctx->dl);
++	return -EINVAL;
++}
++
++static int cmd_dpipe_table_entry_dump_cb(const struct nlmsghdr *nlh, void *data)
++{
++	struct dpipe_ctx *ctx = data;
++	struct nlattr *tb[DEVLINK_ATTR_MAX + 1] = {};
++	struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
++
++	mnl_attr_parse(nlh, sizeof(*genl), attr_cb, tb);
++	if (!tb[DEVLINK_ATTR_BUS_NAME] || !tb[DEVLINK_ATTR_DEV_NAME] ||
++	    !tb[DEVLINK_ATTR_DPIPE_ENTRIES])
++		return MNL_CB_ERROR;
++
++	if (dpipe_table_entries_show(ctx, tb))
++		return MNL_CB_ERROR;
++	return MNL_CB_OK;
++}
++
++static int cmd_dpipe_table_dump(struct dl *dl)
++{
++	struct nlmsghdr *nlh;
++	struct dpipe_ctx *ctx;
++	uint16_t flags = NLM_F_REQUEST;
++	int err;
++
++	ctx = dpipe_ctx_alloc(dl);
++	if (!ctx)
++		return -ENOMEM;
++
++	err = dl_argv_parse(dl, DL_OPT_HANDLE | DL_OPT_DPIPE_TABLE_NAME, 0);
++	if (err)
++		goto out;
++
++	nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_DPIPE_HEADERS_GET, flags);
++	dl_opts_put(nlh, dl);
++	err = _mnlg_socket_sndrcv(dl->nlg, nlh, cmd_dpipe_header_cb, ctx);
++	if (err) {
++		pr_err("error get headers %s\n", strerror(ctx->err));
++		goto out;
++	}
++
++	flags = NLM_F_REQUEST | NLM_F_ACK;
++	nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_DPIPE_ENTRIES_GET, flags);
++	dl_opts_put(nlh, dl);
++
++	pr_out_section_start(dl, "table_entry");
++	_mnlg_socket_sndrcv(dl->nlg, nlh, cmd_dpipe_table_entry_dump_cb, ctx);
++	pr_out_section_end(dl);
++out:
++	dpipe_ctx_clear(ctx);
++	dpipe_ctx_free(ctx);
++	return err;
++}
++
++static void cmd_dpipe_table_help(void)
++{
++	pr_err("Usage: devlink dpipe table [ OBJECT-LIST ]\n"
++	       "where  OBJECT-LIST := { show | set | dump }\n");
++}
++
++static int cmd_dpipe_table(struct dl *dl)
++{
++	if (dl_argv_match(dl, "help") || dl_no_arg(dl)) {
++		cmd_dpipe_table_help();
++		return 0;
++	} else if (dl_argv_match(dl, "show")) {
++		dl_arg_inc(dl);
++		return cmd_dpipe_table_show(dl);
++	} else if (dl_argv_match(dl, "set")) {
++		dl_arg_inc(dl);
++		return cmd_dpipe_table_set(dl);
++	}  else if (dl_argv_match(dl, "dump")) {
++		dl_arg_inc(dl);
++		return cmd_dpipe_table_dump(dl);
++	}
++	pr_err("Command \"%s\" not found\n", dl_argv(dl));
++	return -ENOENT;
++}
++
++static void cmd_dpipe_help(void)
++{
++	pr_err("Usage: devlink dpipe [ OBJECT-LIST ]\n"
++	       "where  OBJECT-LIST := { header | table }\n");
++}
++
++static int cmd_dpipe(struct dl *dl)
++{
++	if (dl_argv_match(dl, "help") || dl_no_arg(dl)) {
++		cmd_dpipe_help();
++		return 0;
++	} else if (dl_argv_match(dl, "header")) {
++		dl_arg_inc(dl);
++		return cmd_dpipe_header(dl);
++	} else if (dl_argv_match(dl, "table")) {
++		dl_arg_inc(dl);
++		return cmd_dpipe_table(dl);
++	}
++	pr_err("Command \"%s\" not found\n", dl_argv(dl));
++	return -ENOENT;
++}
++
++static void help(void)
++{
++	pr_err("Usage: devlink [ OPTIONS ] OBJECT { COMMAND | help }\n"
++	       "where  OBJECT := { dev | port | sb | monitor | dpipe }\n"
++	       "       OPTIONS := { -V[ersion] | -n[no-nice-names] | -j[json] | -p[pretty] | -v[verbose] }\n");
++}
++
++static int dl_cmd(struct dl *dl)
++{
++	if (dl_argv_match(dl, "help") || dl_no_arg(dl)) {
++		help();
++		return 0;
++	} else if (dl_argv_match(dl, "dev")) {
++		dl_arg_inc(dl);
++		return cmd_dev(dl);
++	} else if (dl_argv_match(dl, "port")) {
++		dl_arg_inc(dl);
++		return cmd_port(dl);
++	} else if (dl_argv_match(dl, "sb")) {
++		dl_arg_inc(dl);
++		return cmd_sb(dl);
++	} else if (dl_argv_match(dl, "monitor")) {
++		dl_arg_inc(dl);
++		return cmd_mon(dl);
++	} else if (dl_argv_match(dl, "dpipe")) {
++		dl_arg_inc(dl);
++		return cmd_dpipe(dl);
++	}
++	pr_err("Object \"%s\" not found\n", dl_argv(dl));
++	return -ENOENT;
++}
++
++static int dl_init(struct dl *dl, int argc, char **argv)
++{
++	int err;
++
++	dl->argc = argc;
++	dl->argv = argv;
++
++	dl->nlg = mnlg_socket_open(DEVLINK_GENL_NAME, DEVLINK_GENL_VERSION);
++	if (!dl->nlg) {
++		pr_err("Failed to connect to devlink Netlink\n");
++		return -errno;
++	}
++
++	err = ifname_map_init(dl);
++	if (err) {
++		pr_err("Failed to create index map\n");
++		goto err_ifname_map_create;
++	}
++	if (dl->json_output) {
++		dl->jw = jsonw_new(stdout);
++		if (!dl->jw) {
++			pr_err("Failed to create JSON writer\n");
++			goto err_json_new;
++		}
++		jsonw_pretty(dl->jw, dl->pretty_output);
++	}
++	return 0;
++
++err_json_new:
++	ifname_map_fini(dl);
++err_ifname_map_create:
++	mnlg_socket_close(dl->nlg);
++	return err;
++}
++
++static void dl_fini(struct dl *dl)
++{
++	if (dl->json_output)
++		jsonw_destroy(&dl->jw);
++	ifname_map_fini(dl);
++	mnlg_socket_close(dl->nlg);
++}
++
++static struct dl *dl_alloc(void)
++{
++	struct dl *dl;
++
++	dl = calloc(1, sizeof(*dl));
++	if (!dl)
++		return NULL;
++	return dl;
++}
++
++static void dl_free(struct dl *dl)
++{
++	free(dl);
++}
++
++int main(int argc, char **argv)
++{
++	static const struct option long_options[] = {
++		{ "Version",		no_argument,		NULL, 'V' },
++		{ "no-nice-names",	no_argument,		NULL, 'n' },
++		{ "json",		no_argument,		NULL, 'j' },
++		{ "pretty",		no_argument,		NULL, 'p' },
++		{ "verbose",		no_argument,		NULL, 'v' },
++		{ NULL, 0, NULL, 0 }
++	};
++	struct dl *dl;
++	int opt;
++	int err;
++	int ret;
++
++	dl = dl_alloc();
++	if (!dl) {
++		pr_err("Failed to allocate memory for devlink\n");
++		return EXIT_FAILURE;
++	}
++
++	while ((opt = getopt_long(argc, argv, "Vnjpv",
++				  long_options, NULL)) >= 0) {
++
++		switch (opt) {
++		case 'V':
++			printf("devlink utility, iproute2-ss%s\n", SNAPSHOT);
++			ret = EXIT_SUCCESS;
++			goto dl_free;
++		case 'n':
++			dl->no_nice_names = true;
++			break;
++		case 'j':
++			dl->json_output = true;
++			break;
++		case 'p':
++			dl->pretty_output = true;
++			break;
++		case 'v':
++			dl->verbose = true;
+ 			break;
+ 		default:
+ 			pr_err("Unknown option.\n");
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0027-tc-Reflect-HW-offload-status.patch b/SOURCES/0027-tc-Reflect-HW-offload-status.patch
new file mode 100644
index 0000000..5a21a4d
--- /dev/null
+++ b/SOURCES/0027-tc-Reflect-HW-offload-status.patch
@@ -0,0 +1,104 @@
+From 724d67b36f9e6bbbfac88b29fee019c05284a888 Mon Sep 17 00:00:00 2001
+From: Kamal Heib <kheib@redhat.com>
+Date: Thu, 9 Nov 2017 04:44:32 -0500
+Subject: [PATCH] tc: Reflect HW offload status
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539
+
+commit e57285b81a098ed705d683ce94f9abd1cc53438a
+Author: Or Gerlitz <ogerlitz@mellanox.com>
+Date:   Thu May 4 16:15:15 2017 +0300
+
+    tc: Reflect HW offload status
+
+    Currently there is no way of querying whether a filter is
+    offloaded to HW or not when using "both" policy (where none
+    of skip_sw or skip_hw flags are set by user-space).
+
+    Add two new flags, "in hw" and "not in hw" such that user
+    space can determine if a filter is actually offloaded to
+    hw or not. The "in hw" UAPI semantics was chosen so it's
+    similar to the "skip hw" flag logic.
+
+    If none of these two flags are set, this signals running
+    over older kernel.
+
+    Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
+    Reviewed-by: Jiri Pirko <jiri@mellanox.com>
+    Reviewed-by: Simon Horman <simon.horman@netronome.com>
+
+Signed-off-by: Kamal Heib <kheib@redhat.com>
+---
+ tc/f_bpf.c      | 5 +++++
+ tc/f_flower.c   | 5 +++++
+ tc/f_matchall.c | 5 +++++
+ tc/f_u32.c      | 5 +++++
+ 4 files changed, 20 insertions(+)
+
+diff --git a/tc/f_bpf.c b/tc/f_bpf.c
+index df8a259..75c44c0 100644
+--- a/tc/f_bpf.c
++++ b/tc/f_bpf.c
+@@ -210,6 +210,11 @@ static int bpf_print_opt(struct filter_util *qu, FILE *f,
+ 			fprintf(f, "skip_hw ");
+ 		if (flags & TCA_CLS_FLAGS_SKIP_SW)
+ 			fprintf(f, "skip_sw ");
++
++		if (flags & TCA_CLS_FLAGS_IN_HW)
++			fprintf(f, "in_hw ");
++		else if (flags & TCA_CLS_FLAGS_NOT_IN_HW)
++			fprintf(f, "not_in_hw ");
+ 	}
+ 
+ 	if (tb[TCA_BPF_OPS] && tb[TCA_BPF_OPS_LEN])
+diff --git a/tc/f_flower.c b/tc/f_flower.c
+index 5aac4a0..ebc63ca 100644
+--- a/tc/f_flower.c
++++ b/tc/f_flower.c
+@@ -1171,6 +1171,11 @@ static int flower_print_opt(struct filter_util *qu, FILE *f,
+ 			fprintf(f, "\n  skip_hw");
+ 		if (flags & TCA_CLS_FLAGS_SKIP_SW)
+ 			fprintf(f, "\n  skip_sw");
++
++		if (flags & TCA_CLS_FLAGS_IN_HW)
++			fprintf(f, "\n  in_hw");
++		else if (flags & TCA_CLS_FLAGS_NOT_IN_HW)
++			fprintf(f, "\n  not_in_hw");
+ 	}
+ 
+ 	if (tb[TCA_FLOWER_ACT])
+diff --git a/tc/f_matchall.c b/tc/f_matchall.c
+index ac48630..5a51e75 100644
+--- a/tc/f_matchall.c
++++ b/tc/f_matchall.c
+@@ -137,6 +137,11 @@ static int matchall_print_opt(struct filter_util *qu, FILE *f,
+ 			fprintf(f, "\n  skip_hw");
+ 		if (flags & TCA_CLS_FLAGS_SKIP_SW)
+ 			fprintf(f, "\n  skip_sw");
++
++		if (flags & TCA_CLS_FLAGS_IN_HW)
++			fprintf(f, "\n  in_hw");
++		else if (flags & TCA_CLS_FLAGS_NOT_IN_HW)
++			fprintf(f, "\n  not_in_hw");
+ 	}
+ 
+ 	if (tb[TCA_MATCHALL_ACT])
+diff --git a/tc/f_u32.c b/tc/f_u32.c
+index 92c1fcd..ff700e9 100644
+--- a/tc/f_u32.c
++++ b/tc/f_u32.c
+@@ -1264,6 +1264,11 @@ static int u32_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt,
+ 			fprintf(f, "skip_hw ");
+ 		if (flags & TCA_CLS_FLAGS_SKIP_SW)
+ 			fprintf(f, "skip_sw ");
++
++		if (flags & TCA_CLS_FLAGS_IN_HW)
++			fprintf(f, "in_hw ");
++		else if (flags & TCA_CLS_FLAGS_NOT_IN_HW)
++			fprintf(f, "not_in_hw ");
+ 	}
+ 
+ 	if (tb[TCA_U32_PCNT]) {
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0028-pedit-Fix-a-typo-in-warning.patch b/SOURCES/0028-pedit-Fix-a-typo-in-warning.patch
new file mode 100644
index 0000000..e19cd7d
--- /dev/null
+++ b/SOURCES/0028-pedit-Fix-a-typo-in-warning.patch
@@ -0,0 +1,39 @@
+From b2e49d92325d876d29e2d4f1a83bd86adfc4bc73 Mon Sep 17 00:00:00 2001
+From: Kamal Heib <kheib@redhat.com>
+Date: Thu, 9 Nov 2017 04:44:32 -0500
+Subject: [PATCH] pedit: Fix a typo in warning
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539
+
+commit 290cdc058d8bbcae3cfefafe83d8263e02ac5a6f
+Author: Amir Vadai <amir@vadai.me>
+Date:   Sun May 14 11:17:43 2017 +0300
+
+    pedit: Fix a typo in warning
+
+    'ex' attribute should be placed after 'action pedit' and not after
+    'munge'.
+
+    Signed-off-by: Amir Vadai <amir@vadai.me>
+
+Signed-off-by: Kamal Heib <kheib@redhat.com>
+---
+ tc/m_pedit.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tc/m_pedit.c b/tc/m_pedit.c
+index 6498dd9..7ef2acc 100644
+--- a/tc/m_pedit.c
++++ b/tc/m_pedit.c
+@@ -146,7 +146,7 @@ int pack_key(struct m_pedit_sel *_sel, struct m_pedit_key *tkey)
+ 		if (tkey->htype != TCA_PEDIT_KEY_EX_HDR_TYPE_NETWORK ||
+ 		    tkey->cmd != TCA_PEDIT_KEY_EX_CMD_SET) {
+ 			fprintf(stderr,
+-				"Munge parameters not supported. Use 'munge ex'.\n");
++				"Munge parameters not supported. Use 'pedit ex munge ...'.\n");
+ 			return -1;
+ 		}
+ 	}
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0029-pedit-Do-not-allow-using-retain-for-too-big-fields.patch b/SOURCES/0029-pedit-Do-not-allow-using-retain-for-too-big-fields.patch
new file mode 100644
index 0000000..8a3d95b
--- /dev/null
+++ b/SOURCES/0029-pedit-Do-not-allow-using-retain-for-too-big-fields.patch
@@ -0,0 +1,58 @@
+From 2bf855b076bbe5aa4665f7efd8bcaf882821cab5 Mon Sep 17 00:00:00 2001
+From: Kamal Heib <kheib@redhat.com>
+Date: Thu, 9 Nov 2017 04:44:32 -0500
+Subject: [PATCH] pedit: Do not allow using retain for too big fields
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539
+
+commit cdca191862775c47533908301760edd55763e861
+Author: Amir Vadai <amir@vadai.me>
+Date:   Sun May 14 11:17:44 2017 +0300
+
+    pedit: Do not allow using retain for too big fields
+
+    Using retain for fields longer than 32 bits is not supported.
+    Do not allow user to do it.
+
+    Signed-off-by: Amir Vadai <amir@vadai.me>
+
+Signed-off-by: Kamal Heib <kheib@redhat.com>
+---
+ man/man8/tc-pedit.8 | 3 ++-
+ tc/m_pedit.c        | 6 ++++++
+ 2 files changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/man/man8/tc-pedit.8 b/man/man8/tc-pedit.8
+index 7f482ea..9c4d57b 100644
+--- a/man/man8/tc-pedit.8
++++ b/man/man8/tc-pedit.8
+@@ -266,7 +266,8 @@ Keep the addressed data as is.
+ .BI retain " RVAL"
+ This optional extra part of
+ .I CMD_SPEC
+-allows to exclude bits from being changed.
++allows to exclude bits from being changed. Supported only for 32 bits fields
++or smaller.
+ .TP
+ .I CONTROL
+ The following keywords allow to control how the tree of qdisc, classes,
+diff --git a/tc/m_pedit.c b/tc/m_pedit.c
+index 7ef2acc..9b74c96 100644
+--- a/tc/m_pedit.c
++++ b/tc/m_pedit.c
+@@ -353,6 +353,12 @@ int parse_cmd(int *argc_p, char ***argv_p, __u32 len, int type, __u32 retain,
+ 		argv++;
+ 	}
+ 
++	if (len > 4 && retain != ~0) {
++		fprintf(stderr,
++			"retain is not supported for fields longer the 32 bits\n");
++		return -1;
++	}
++
+ 	if (type == TMAC) {
+ 		res = pack_mac(sel, tkey, (__u8 *)val);
+ 		goto done;
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0030-pedit-Check-for-extended-capability-in-protocol-pars.patch b/SOURCES/0030-pedit-Check-for-extended-capability-in-protocol-pars.patch
new file mode 100644
index 0000000..81a89ce
--- /dev/null
+++ b/SOURCES/0030-pedit-Check-for-extended-capability-in-protocol-pars.patch
@@ -0,0 +1,55 @@
+From 0bc6d74ce3291b669bc05524b404bc6914dab5ba Mon Sep 17 00:00:00 2001
+From: Kamal Heib <kheib@redhat.com>
+Date: Thu, 9 Nov 2017 04:44:32 -0500
+Subject: [PATCH] pedit: Check for extended capability in protocol parser
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539
+
+commit a13426fe1a2b0fdebacc33820105523934eb355f
+Author: Amir Vadai <amir@vadai.me>
+Date:   Sun May 14 11:17:45 2017 +0300
+
+    pedit: Check for extended capability in protocol parser
+
+    Do not allow using eth and udp header types if non-extended pedit kABI
+    is being used. Other protocol parsers already have this check.
+
+    Signed-off-by: Amir Vadai <amir@vadai.me>
+
+Signed-off-by: Kamal Heib <kheib@redhat.com>
+---
+ tc/p_eth.c | 3 +++
+ tc/p_udp.c | 3 +++
+ 2 files changed, 6 insertions(+)
+
+diff --git a/tc/p_eth.c b/tc/p_eth.c
+index ad3e28f..2d2f96c 100644
+--- a/tc/p_eth.c
++++ b/tc/p_eth.c
+@@ -34,6 +34,9 @@ parse_eth(int *argc_p, char ***argv_p,
+ 	if (argc < 2)
+ 		return -1;
+ 
++	if (!sel->extended)
++		return -1;
++
+ 	tkey->htype = TCA_PEDIT_KEY_EX_HDR_TYPE_ETH;
+ 
+ 	if (strcmp(*argv, "type") == 0) {
+diff --git a/tc/p_udp.c b/tc/p_udp.c
+index a56a1b5..3916d95 100644
+--- a/tc/p_udp.c
++++ b/tc/p_udp.c
+@@ -34,6 +34,9 @@ parse_udp(int *argc_p, char ***argv_p,
+ 	if (argc < 2)
+ 		return -1;
+ 
++	if (!sel->extended)
++		return -1;
++
+ 	tkey->htype = TCA_PEDIT_KEY_EX_HDR_TYPE_UDP;
+ 
+ 	if (strcmp(*argv, "sport") == 0) {
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0031-pedit-Introduce-ipv6-support.patch b/SOURCES/0031-pedit-Introduce-ipv6-support.patch
new file mode 100644
index 0000000..aacdc14
--- /dev/null
+++ b/SOURCES/0031-pedit-Introduce-ipv6-support.patch
@@ -0,0 +1,304 @@
+From 26ab66d7c43c3ef60ab058d4c3da8989a5c1dd46 Mon Sep 17 00:00:00 2001
+From: Kamal Heib <kheib@redhat.com>
+Date: Thu, 9 Nov 2017 04:44:32 -0500
+Subject: [PATCH] pedit: Introduce ipv6 support
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539
+
+commit f3e1b2448a95baef587965b08f48d49b6e1ec2cb
+Author: Amir Vadai <amir@vadai.me>
+Date:   Sun May 14 11:17:46 2017 +0300
+
+    pedit: Introduce ipv6 support
+
+    Add support for modifying IPv6 headers using pedit.
+
+    Signed-off-by: Amir Vadai <amir@vadai.me>
+
+Signed-off-by: Kamal Heib <kheib@redhat.com>
+---
+ man/man8/tc-pedit.8 | 30 ++++++++++++++++++
+ tc/Makefile         |  1 +
+ tc/m_pedit.c        | 43 +++++++++++++++++++++++--
+ tc/p_ip.c           | 17 +---------
+ tc/p_ip6.c          | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 5 files changed, 164 insertions(+), 18 deletions(-)
+ create mode 100644 tc/p_ip6.c
+
+diff --git a/man/man8/tc-pedit.8 b/man/man8/tc-pedit.8
+index 9c4d57b..82d4217 100644
+--- a/man/man8/tc-pedit.8
++++ b/man/man8/tc-pedit.8
+@@ -33,6 +33,8 @@ pedit - generic packet editor action
+ |
+ .BI ip " EX_IPHDR_FIELD"
+ |
++.BI ip6 " IP6HDR_FIELD"
++|
+ .BI tcp " TCPHDR_FIELD"
+ |
+ .BI udp " UDPHDR_FIELD"
+@@ -55,6 +57,12 @@ pedit - generic packet editor action
+ .IR EX_IPHDR_FIELD " := { "
+ .BR ttl " }"
+ 
++
++.ti -8
++.IR IP6HDR_FIELD " := { "
++.BR src " | " dst " | " flow_lbl " | " payload_len " | " nexthdr " |"
++.BR hoplimit " }"
++
+ .ti -8
+ .IR TCPHDR_FIELD " := { "
+ .BR sport " | " dport " | " flags " }"
+@@ -211,6 +219,25 @@ are:
+ .B ttl
+ .RE
+ .TP
++.BI ip6 " IP6HDR_FIELD"
++The supported keywords for
++.I IP6HDR_FIELD
++are:
++.RS
++.TP
++.B src
++.TQ
++.B dst
++.TQ
++.B flow_lbl
++.TQ
++.B payload_len
++.TQ
++.B nexthdr
++.TQ
++.B hoplimit
++.RE
++.TP
+ .BI tcp " TCPHDR_FIELD"
+ The supported keywords for
+ .I TCPHDR_FIELD
+@@ -331,6 +358,9 @@ tc filter add dev eth0 parent ffff: u32 \\
+ 	action pedit ex munge ip dst set 192.168.1.199
+ tc filter add dev eth0 parent ffff: u32 \\
+ 	match ip sport 22 0xffff \\
++	action pedit ex munge ip6 dst set fe80::dacb:8aff:fec7:320e
++tc filter add dev eth0 parent ffff: u32 \\
++	match ip sport 22 0xffff \\
+ 	action pedit ex munge eth dst set 11:22:33:44:55:66
+ tc filter add dev eth0 parent ffff: u32 \\
+ 	match ip dport 23 0xffff \\
+diff --git a/tc/Makefile b/tc/Makefile
+index 446a113..9a6bb1d 100644
+--- a/tc/Makefile
++++ b/tc/Makefile
+@@ -53,6 +53,7 @@ TCMODULES += m_bpf.o
+ TCMODULES += m_tunnel_key.o
+ TCMODULES += m_sample.o
+ TCMODULES += p_ip.o
++TCMODULES += p_ip6.o
+ TCMODULES += p_icmp.o
+ TCMODULES += p_eth.o
+ TCMODULES += p_tcp.o
+diff --git a/tc/m_pedit.c b/tc/m_pedit.c
+index 9b74c96..dfa6b2c 100644
+--- a/tc/m_pedit.c
++++ b/tc/m_pedit.c
+@@ -257,6 +257,32 @@ static int pack_mac(struct m_pedit_sel *sel, struct m_pedit_key *tkey,
+ 	return ret;
+ }
+ 
++static int pack_ipv6(struct m_pedit_sel *sel, struct m_pedit_key *tkey,
++		     __u32 *ipv6)
++{
++	int ret = 0;
++	int i;
++
++	if (tkey->off & 0x3) {
++		fprintf(stderr,
++			"pack_ipv6: IPv6 offsets must begin in 32bit boundaries\n");
++		return -1;
++	}
++
++	for (i = 0; i < 4; i++) {
++		tkey->mask = 0;
++		tkey->val = ntohl(ipv6[i]);
++
++		ret = pack_key32(~0, sel, tkey);
++		if (ret)
++			return ret;
++
++		tkey->off += 4;
++	}
++
++	return 0;
++}
++
+ int parse_val(int *argc_p, char ***argv_p, __u32 *val, int type)
+ {
+ 	int argc = *argc_p;
+@@ -281,8 +307,16 @@ int parse_val(int *argc_p, char ***argv_p, __u32 *val, int type)
+ 		return 0;
+ 	}
+ 
+-	if (type == TIPV6)
+-		return -1; /* not implemented yet */
++	if (type == TIPV6) {
++		inet_prefix addr;
++
++		if (get_prefix_1(&addr, *argv, AF_INET6))
++			return -1;
++
++		memcpy(val, addr.data, addr.bytelen);
++
++		return 0;
++	}
+ 
+ 	if (type == TMAC) {
+ #define MAC_ALEN 6
+@@ -364,6 +398,11 @@ int parse_cmd(int *argc_p, char ***argv_p, __u32 len, int type, __u32 retain,
+ 		goto done;
+ 	}
+ 
++	if (type == TIPV6) {
++		res = pack_ipv6(sel, tkey, val);
++		goto done;
++	}
++
+ 	tkey->val = *v;
+ 	tkey->mask = *m;
+ 
+diff --git a/tc/p_ip.c b/tc/p_ip.c
+index 22fe650..0272a6e 100644
+--- a/tc/p_ip.c
++++ b/tc/p_ip.c
+@@ -1,5 +1,5 @@
+ /*
+- * m_pedit.c		packet editor: IPV4/6 header
++ * p_ip.c		packet editor: IPV4 header
+  *
+  *		This program is free software; you can distribute it and/or
+  *		modify it under the terms of the GNU General Public License
+@@ -156,23 +156,8 @@ done:
+ 	return res;
+ }
+ 
+-static int
+-parse_ip6(int *argc_p, char ***argv_p,
+-	  struct m_pedit_sel *sel, struct m_pedit_key *tkey)
+-{
+-	int res = -1;
+-	return res;
+-}
+-
+ struct m_pedit_util p_pedit_ip = {
+ 	NULL,
+ 	"ip",
+ 	parse_ip,
+ };
+-
+-
+-struct m_pedit_util p_pedit_ip6 = {
+-	NULL,
+-	"ip6",
+-	parse_ip6,
+-};
+diff --git a/tc/p_ip6.c b/tc/p_ip6.c
+new file mode 100644
+index 0000000..a4824bd
+--- /dev/null
++++ b/tc/p_ip6.c
+@@ -0,0 +1,91 @@
++/*
++ * p_ip6.c		packet editor: IPV6 header
++ *
++ *		This program is free software; you can distribute it and/or
++ *		modify it under the terms of the GNU General Public License
++ *		as published by the Free Software Foundation; either version
++ *		2 of the License, or (at your option) any later version.
++ *
++ * Authors:  Amir Vadai <amir@vadai.me>
++ *
++ */
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include <syslog.h>
++#include <fcntl.h>
++#include <sys/socket.h>
++#include <netinet/in.h>
++#include <arpa/inet.h>
++#include <string.h>
++#include "utils.h"
++#include "tc_util.h"
++#include "m_pedit.h"
++
++static int
++parse_ip6(int *argc_p, char ***argv_p,
++	  struct m_pedit_sel *sel, struct m_pedit_key *tkey)
++{
++	int res = -1;
++	int argc = *argc_p;
++	char **argv = *argv_p;
++
++	if (argc < 2)
++		return -1;
++
++	if (!sel->extended)
++		return -1;
++
++	tkey->htype = TCA_PEDIT_KEY_EX_HDR_TYPE_IP6;
++
++	if (strcmp(*argv, "src") == 0) {
++		NEXT_ARG();
++		tkey->off = 8;
++		res = parse_cmd(&argc, &argv, 16, TIPV6, RU32, sel, tkey);
++		goto done;
++	}
++	if (strcmp(*argv, "dst") == 0) {
++		NEXT_ARG();
++		tkey->off = 24;
++		res = parse_cmd(&argc, &argv, 16, TIPV6, RU32, sel, tkey);
++		goto done;
++	}
++	if (strcmp(*argv, "flow_lbl") == 0) {
++		NEXT_ARG();
++		tkey->off = 0;
++		res = parse_cmd(&argc, &argv, 4, TU32, 0x0007ffff, sel, tkey);
++		goto done;
++	}
++	if (strcmp(*argv, "payload_len") == 0) {
++		NEXT_ARG();
++		tkey->off = 4;
++		res = parse_cmd(&argc, &argv, 2, TU32, RU16, sel, tkey);
++		goto done;
++	}
++	if (strcmp(*argv, "nexthdr") == 0) {
++		NEXT_ARG();
++		tkey->off = 6;
++		res = parse_cmd(&argc, &argv, 1, TU32, RU8, sel, tkey);
++		goto done;
++	}
++	if (strcmp(*argv, "hoplimit") == 0) {
++		NEXT_ARG();
++		tkey->off = 7;
++		res = parse_cmd(&argc, &argv, 1, TU32, RU8, sel, tkey);
++		goto done;
++	}
++
++	return -1;
++
++done:
++	*argc_p = argc;
++	*argv_p = argv;
++	return res;
++}
++
++struct m_pedit_util p_pedit_ip6 = {
++	NULL,
++	"ipv6",
++	parse_ip6,
++};
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0032-devlink-Add-option-to-set-and-show-eswitch-encapsula.patch b/SOURCES/0032-devlink-Add-option-to-set-and-show-eswitch-encapsula.patch
new file mode 100644
index 0000000..00d638f
--- /dev/null
+++ b/SOURCES/0032-devlink-Add-option-to-set-and-show-eswitch-encapsula.patch
@@ -0,0 +1,189 @@
+From d9857ffec0266aea1c56ee26369972ade68f501a Mon Sep 17 00:00:00 2001
+From: Kamal Heib <kheib@redhat.com>
+Date: Thu, 9 Nov 2017 04:44:32 -0500
+Subject: [PATCH] devlink: Add option to set and show eswitch encapsulation
+ support
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539
+
+commit d315b706e9d4a550096140aa298d46b2aa7733e9
+Author: Roi Dayan <roid@mellanox.com>
+Date:   Sun May 21 08:37:27 2017 +0300
+
+    devlink: Add option to set and show eswitch encapsulation support
+
+    This is an e-switch global knob to enable HW support for applying
+    encapsulation/decapsulation to VF traffic as part of SRIOV e-switch offloading.
+
+    The actual encap/decap is carried out (along with the matching and other
+    actions) per offloaded e-switch rules, e.g as done when offloading the TC tunnel
+    key action.
+
+    Possible values are enable/disable.
+
+    Signed-off-by: Roi Dayan <roid@mellanox.com>
+    Reviewed-by: Jiri Pirko <jiri@mellanox.com>
+
+Signed-off-by: Kamal Heib <kheib@redhat.com>
+---
+ devlink/devlink.c      | 48 +++++++++++++++++++++++++++++++++++++++++++++++-
+ man/man8/devlink-dev.8 | 13 +++++++++++++
+ 2 files changed, 60 insertions(+), 1 deletion(-)
+
+diff --git a/devlink/devlink.c b/devlink/devlink.c
+index e22ee0a..f9bc16c 100644
+--- a/devlink/devlink.c
++++ b/devlink/devlink.c
+@@ -176,6 +176,7 @@ static void ifname_map_free(struct ifname_map *ifname_map)
+ #define DL_OPT_ESWITCH_INLINE_MODE	BIT(12)
+ #define DL_OPT_DPIPE_TABLE_NAME	BIT(13)
+ #define DL_OPT_DPIPE_TABLE_COUNTERS	BIT(14)
++#define DL_OPT_ESWITCH_ENCAP_MODE	BIT(15)
+ 
+ struct dl_opts {
+ 	uint32_t present; /* flags of present items */
+@@ -195,6 +196,7 @@ struct dl_opts {
+ 	enum devlink_eswitch_inline_mode eswitch_inline_mode;
+ 	const char *dpipe_table_name;
+ 	bool dpipe_counters_enable;
++	bool eswitch_encap_mode;
+ };
+ 
+ struct dl {
+@@ -299,6 +301,7 @@ static const enum mnl_attr_data_type devlink_policy[DEVLINK_ATTR_MAX + 1] = {
+ 	[DEVLINK_ATTR_SB_OCC_MAX] = MNL_TYPE_U32,
+ 	[DEVLINK_ATTR_ESWITCH_MODE] = MNL_TYPE_U16,
+ 	[DEVLINK_ATTR_ESWITCH_INLINE_MODE] = MNL_TYPE_U8,
++	[DEVLINK_ATTR_ESWITCH_ENCAP_MODE] = MNL_TYPE_U8,
+ 	[DEVLINK_ATTR_DPIPE_TABLES] = MNL_TYPE_NESTED,
+ 	[DEVLINK_ATTR_DPIPE_TABLE] = MNL_TYPE_NESTED,
+ 	[DEVLINK_ATTR_DPIPE_TABLE_NAME] = MNL_TYPE_STRING,
+@@ -754,6 +757,19 @@ static int dpipe_counters_enable_get(const char *typestr,
+ 	return 0;
+ }
+ 
++static int eswitch_encap_mode_get(const char *typestr, bool *p_mode)
++{
++	if (strcmp(typestr, "enable") == 0) {
++		*p_mode = true;
++	} else if (strcmp(typestr, "disable") == 0) {
++		*p_mode = false;
++	} else {
++		pr_err("Unknown eswitch encap mode \"%s\"\n", typestr);
++		return -EINVAL;
++	}
++	return 0;
++}
++
+ static int dl_argv_parse(struct dl *dl, uint32_t o_required,
+ 			 uint32_t o_optional)
+ {
+@@ -908,7 +924,19 @@ static int dl_argv_parse(struct dl *dl, uint32_t o_required,
+ 			if (err)
+ 				return err;
+ 			o_found |= DL_OPT_DPIPE_TABLE_COUNTERS;
++		} else if (dl_argv_match(dl, "encap") &&
++			   (o_all & DL_OPT_ESWITCH_ENCAP_MODE)) {
++			const char *typestr;
+ 
++			dl_arg_inc(dl);
++			err = dl_argv_str(dl, &typestr);
++			if (err)
++				return err;
++			err = eswitch_encap_mode_get(typestr,
++						     &opts->eswitch_encap_mode);
++			if (err)
++				return err;
++			o_found |= DL_OPT_ESWITCH_ENCAP_MODE;
+ 		} else {
+ 			pr_err("Unknown option \"%s\"\n", dl_argv(dl));
+ 			return -EINVAL;
+@@ -986,6 +1014,13 @@ static int dl_argv_parse(struct dl *dl, uint32_t o_required,
+ 		pr_err("Dpipe table counter state expected\n");
+ 		return -EINVAL;
+ 	}
++
++	if ((o_required & DL_OPT_ESWITCH_ENCAP_MODE) &&
++	    !(o_found & DL_OPT_ESWITCH_ENCAP_MODE)) {
++		pr_err("E-Switch encapsulation option expected.\n");
++		return -EINVAL;
++	}
++
+ 	return 0;
+ }
+ 
+@@ -1041,6 +1076,9 @@ static void dl_opts_put(struct nlmsghdr *nlh, struct dl *dl)
+ 	if (opts->present & DL_OPT_DPIPE_TABLE_COUNTERS)
+ 		mnl_attr_put_u8(nlh, DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED,
+ 				opts->dpipe_counters_enable);
++	if (opts->present & DL_OPT_ESWITCH_ENCAP_MODE)
++		mnl_attr_put_u8(nlh, DEVLINK_ATTR_ESWITCH_ENCAP_MODE,
++				opts->eswitch_encap_mode);
+ }
+ 
+ static int dl_argv_parse_put(struct nlmsghdr *nlh, struct dl *dl,
+@@ -1097,6 +1135,7 @@ static void cmd_dev_help(void)
+ 	pr_err("Usage: devlink dev show [ DEV ]\n");
+ 	pr_err("       devlink dev eswitch set DEV [ mode { legacy | switchdev } ]\n");
+ 	pr_err("                               [ inline-mode { none | link | network | transport } ]\n");
++	pr_err("                               [ encap { disable | enable } ]\n");
+ 	pr_err("       devlink dev eswitch show DEV\n");
+ }
+ 
+@@ -1421,6 +1460,12 @@ static void pr_out_eswitch(struct dl *dl, struct nlattr **tb)
+ 			   eswitch_inline_mode_name(mnl_attr_get_u8(
+ 				   tb[DEVLINK_ATTR_ESWITCH_INLINE_MODE])));
+ 
++	if (tb[DEVLINK_ATTR_ESWITCH_ENCAP_MODE]) {
++		bool encap_mode = !!mnl_attr_get_u8(tb[DEVLINK_ATTR_ESWITCH_ENCAP_MODE]);
++
++		pr_out_str(dl, "encap", encap_mode ? "enable" : "disable");
++	}
++
+ 	pr_out_handle_end(dl);
+ }
+ 
+@@ -1465,7 +1510,8 @@ static int cmd_dev_eswitch_set(struct dl *dl)
+ 
+ 	err = dl_argv_parse_put(nlh, dl, DL_OPT_HANDLE,
+ 				DL_OPT_ESWITCH_MODE |
+-				DL_OPT_ESWITCH_INLINE_MODE);
++				DL_OPT_ESWITCH_INLINE_MODE |
++				DL_OPT_ESWITCH_ENCAP_MODE);
+ 
+ 	if (err)
+ 		return err;
+diff --git a/man/man8/devlink-dev.8 b/man/man8/devlink-dev.8
+index 6bfe66f..b074d57 100644
+--- a/man/man8/devlink-dev.8
++++ b/man/man8/devlink-dev.8
+@@ -34,6 +34,9 @@ devlink-dev \- devlink device configuration
+ .RI "[ "
+ .BR inline-mode " { " none " | " link " | " network " | " transport " } "
+ .RI "]"
++.RI "[ "
++.BR encap " { " disable " | " enable " } "
++.RI "]"
+ 
+ .ti -8
+ .BR "devlink dev eswitch show"
+@@ -81,6 +84,16 @@ Some HWs need the VF driver to put part of the packet headers on the TX descript
+ .I transport
+ - L4 mode
+ 
++.TP
++.BR encap " { " disable " | " enable " } "
++Set eswitch encapsulation support
++
++.I disable
++- Disable encapsulation support
++
++.I enable
++- Enable encapsulation support
++
+ .SH "EXAMPLES"
+ .PP
+ devlink dev show
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0033-tc-flower-add-support-for-tcp-flags.patch b/SOURCES/0033-tc-flower-add-support-for-tcp-flags.patch
new file mode 100644
index 0000000..333ce11
--- /dev/null
+++ b/SOURCES/0033-tc-flower-add-support-for-tcp-flags.patch
@@ -0,0 +1,154 @@
+From 7cbf364a5f68ba008c5e0702266fe3dc606b1d6f Mon Sep 17 00:00:00 2001
+From: Kamal Heib <kheib@redhat.com>
+Date: Thu, 9 Nov 2017 04:44:32 -0500
+Subject: [PATCH] tc: flower: add support for tcp flags
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539
+
+commit 0c30d14d0a2fc2fb6b7fef62bea05f2e5c3eb26a
+Author: Jiri Pirko <jiri@mellanox.com>
+Date:   Tue May 23 23:51:39 2017 +0200
+
+    tc: flower: add support for tcp flags
+
+    Allow user to insert a flower classifier filter rule which includes
+    match for tcp flags.
+
+    Signed-off-by: Jiri Pirko <jiri@mellanox.com>
+
+Signed-off-by: Kamal Heib <kheib@redhat.com>
+---
+ man/man8/tc-flower.8 |  8 +++++++
+ tc/f_flower.c        | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 70 insertions(+)
+
+diff --git a/man/man8/tc-flower.8 b/man/man8/tc-flower.8
+index ba29065..7648079 100644
+--- a/man/man8/tc-flower.8
++++ b/man/man8/tc-flower.8
+@@ -35,6 +35,8 @@ flower \- flow based traffic control filter
+ .IR PREFIX " | { "
+ .BR dst_port " | " src_port " } "
+ .IR port_number " } | "
++.B tcp_flags
++.IR MASKED_TCP_FLAGS " | "
+ .B type
+ .IR MASKED_TYPE " | "
+ .B code
+@@ -136,6 +138,12 @@ Match on layer 4 protocol source or destination port number. Only available for
+ .BR ip_proto " values " udp ", " tcp  " and " sctp
+ which have to be specified in beforehand.
+ .TP
++.BI tcp_flags " MASKED_TCP_FLAGS"
++Match on TCP flags represented as 12bit bitfield in in hexadecimal format.
++A mask may be optionally provided to limit the bits which are matched. A mask
++is provided by following the value with a slash and then the mask. If the mask
++is missing then a match on all bits is assumed.
++.TP
+ .BI type " MASKED_TYPE"
+ .TQ
+ .BI code " MASKED_CODE"
+diff --git a/tc/f_flower.c b/tc/f_flower.c
+index ebc63ca..1b6b46e 100644
+--- a/tc/f_flower.c
++++ b/tc/f_flower.c
+@@ -57,6 +57,7 @@ static void explain(void)
+ 		"                       src_ip PREFIX |\n"
+ 		"                       dst_port PORT-NUMBER |\n"
+ 		"                       src_port PORT-NUMBER |\n"
++		"                       tcp_flags MASKED-TCP_FLAGS |\n"
+ 		"                       type MASKED-ICMP-TYPE |\n"
+ 		"                       code MASKED-ICMP-CODE |\n"
+ 		"                       arp_tip IPV4-PREFIX |\n"
+@@ -474,6 +475,41 @@ static int flower_parse_port(char *str, __u8 ip_proto,
+ 	return 0;
+ }
+ 
++#define TCP_FLAGS_MAX_MASK 0xfff
++
++static int flower_parse_tcp_flags(char *str, int flags_type, int mask_type,
++				  struct nlmsghdr *n)
++{
++	char *slash;
++	int ret, err = -1;
++	__u16 flags;
++
++	slash = strchr(str, '/');
++	if (slash)
++		*slash = '\0';
++
++	ret = get_u16(&flags, str, 16);
++	if (ret < 0 || flags & ~TCP_FLAGS_MAX_MASK)
++		goto err;
++
++	addattr16(n, MAX_MSG, flags_type, htons(flags));
++
++	if (slash) {
++		ret = get_u16(&flags, slash + 1, 16);
++		if (ret < 0 || flags & ~TCP_FLAGS_MAX_MASK)
++			goto err;
++	} else {
++		flags = TCP_FLAGS_MAX_MASK;
++	}
++	addattr16(n, MAX_MSG, mask_type, htons(flags));
++
++	err = 0;
++err:
++	if (slash)
++		*slash = '/';
++	return err;
++}
++
+ static int flower_parse_key_id(const char *str, int type, struct nlmsghdr *n)
+ {
+ 	int ret;
+@@ -671,6 +707,16 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
+ 				fprintf(stderr, "Illegal \"src_port\"\n");
+ 				return -1;
+ 			}
++		} else if (matches(*argv, "tcp_flags") == 0) {
++			NEXT_ARG();
++			ret = flower_parse_tcp_flags(*argv,
++						     TCA_FLOWER_KEY_TCP_FLAGS,
++						     TCA_FLOWER_KEY_TCP_FLAGS_MASK,
++						     n);
++			if (ret < 0) {
++				fprintf(stderr, "Illegal \"tcp_flags\"\n");
++				return -1;
++			}
+ 		} else if (matches(*argv, "type") == 0) {
+ 			NEXT_ARG();
+ 			ret = flower_parse_icmp(*argv, eth_type, ip_proto,
+@@ -1000,6 +1046,19 @@ static void flower_print_port(FILE *f, char *name, struct rtattr *attr)
+ 		fprintf(f, "\n  %s %d", name, rta_getattr_be16(attr));
+ }
+ 
++static void flower_print_tcp_flags(FILE *f, char *name,
++				  struct rtattr *flags_attr,
++				  struct rtattr *mask_attr)
++{
++	if (!flags_attr)
++		return;
++	fprintf(f, "\n  %s %x", name, rta_getattr_be16(flags_attr));
++	if (!mask_attr)
++		return;
++	fprintf(f, "/%x", rta_getattr_be16(mask_attr));
++}
++
++
+ static void flower_print_key_id(FILE *f, const char *name,
+ 				struct rtattr *attr)
+ {
+@@ -1110,6 +1169,9 @@ static int flower_print_opt(struct filter_util *qu, FILE *f,
+ 	if (nl_type >= 0)
+ 		flower_print_port(f, "src_port", tb[nl_type]);
+ 
++	flower_print_tcp_flags(f, "tcp_flags", tb[TCA_FLOWER_KEY_TCP_FLAGS],
++			       tb[TCA_FLOWER_KEY_TCP_FLAGS_MASK]);
++
+ 	nl_type = flower_icmp_attr_type(eth_type, ip_proto,
+ 					FLOWER_ICMP_FIELD_TYPE);
+ 	nl_mask_type = flower_icmp_attr_mask_type(eth_type, ip_proto,
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0034-iplink-Update-usage-in-help-message.patch b/SOURCES/0034-iplink-Update-usage-in-help-message.patch
new file mode 100644
index 0000000..63422a8
--- /dev/null
+++ b/SOURCES/0034-iplink-Update-usage-in-help-message.patch
@@ -0,0 +1,60 @@
+From 41b38afb79a82eec66fea08fc021a35cf1d550fc Mon Sep 17 00:00:00 2001
+From: Kamal Heib <kheib@redhat.com>
+Date: Thu, 9 Nov 2017 04:44:32 -0500
+Subject: [PATCH] iplink: Update usage in help message
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539
+
+commit 5a3ec4ba64783a640e7716a37faae4be49489e51
+Author: Eli Cohen <eli@mellanox.com>
+Date:   Sun Jun 4 15:36:48 2017 +0300
+
+    iplink: Update usage in help message
+
+    Add to usage message a description of how to configure Infiniband node
+    and port GUIDs. Also modify the man page to emphasize the GUIDs are
+    configured for Infiniband VFs.
+
+    Fixes: d91fb3f4c7e4 ("Add support for configuring Infiniband GUIDs")
+    Signed-off-by: Eli Cohen <eli@mellanox.com>
+    Signed-off-by: Tariq Toukan <tariqt@mellanox.com>
+
+Signed-off-by: Kamal Heib <kheib@redhat.com>
+---
+ ip/iplink.c           | 2 ++
+ man/man8/ip-link.8.in | 4 ++--
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/ip/iplink.c b/ip/iplink.c
+index b08d227..193997c 100644
+--- a/ip/iplink.c
++++ b/ip/iplink.c
+@@ -91,6 +91,8 @@ void iplink_usage(void)
+ 		"				   [ query_rss { on | off} ]\n"
+ 		"				   [ state { auto | enable | disable} ] ]\n"
+ 		"				   [ trust { on | off} ] ]\n"
++		"				   [ node_guid { eui64 } ]\n"
++		"				   [ port_guid { eui64 } ]\n"
+ 		"			  [ xdp { off |\n"
+ 		"				  object FILE [ section NAME ] [ verbose ] |\n"
+ 		"				  pinned FILE } ]\n"
+diff --git a/man/man8/ip-link.8.in b/man/man8/ip-link.8.in
+index a5ddfe7..48417db 100644
+--- a/man/man8/ip-link.8.in
++++ b/man/man8/ip-link.8.in
+@@ -1564,10 +1564,10 @@ sent by the VF.
+ which may impact security and/or performance. (e.g. VF multicast promiscuous mode)
+ .sp
+ .BI node_guid " eui64"
+-- configure node GUID for the VF.
++- configure node GUID for Infiniband VFs.
+ .sp
+ .BI port_guid " eui64"
+-- configure port GUID for the VF.
++- configure port GUID for Infiniband VFs.
+ .in -8
+ 
+ .TP
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0035-tc-flower-add-support-for-matching-on-ip-tos-and-ttl.patch b/SOURCES/0035-tc-flower-add-support-for-matching-on-ip-tos-and-ttl.patch
new file mode 100644
index 0000000..7aef8b0
--- /dev/null
+++ b/SOURCES/0035-tc-flower-add-support-for-matching-on-ip-tos-and-ttl.patch
@@ -0,0 +1,177 @@
+From f8e5b20689cdc1f488140d9da4adf6f3ca421d3f Mon Sep 17 00:00:00 2001
+From: Kamal Heib <kheib@redhat.com>
+Date: Thu, 9 Nov 2017 04:44:32 -0500
+Subject: [PATCH] tc: flower: add support for matching on ip tos and ttl
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539
+
+commit 6ea2c2b1cff676be2d01029a01cbd84d0675213c
+Author: Or Gerlitz <ogerlitz@mellanox.com>
+Date:   Wed Jun 7 15:17:54 2017 +0300
+
+    tc: flower: add support for matching on ip tos and ttl
+
+    Allow users to set flower classifier filter rules which
+    include matches for ip tos and ttl.
+
+    Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
+    Reviewed-by: Jiri Pirko <jiri@mellanox.com>
+
+Signed-off-by: Kamal Heib <kheib@redhat.com>
+---
+ man/man8/tc-flower.8 | 17 +++++++++++-
+ tc/f_flower.c        | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 91 insertions(+), 1 deletion(-)
+
+diff --git a/man/man8/tc-flower.8 b/man/man8/tc-flower.8
+index 7648079..be46f02 100644
+--- a/man/man8/tc-flower.8
++++ b/man/man8/tc-flower.8
+@@ -30,7 +30,11 @@ flower \- flow based traffic control filter
+ .BR vlan_ethtype " { " ipv4 " | " ipv6 " | "
+ .IR ETH_TYPE " } | "
+ .BR ip_proto " { " tcp " | " udp " | " sctp " | " icmp " | " icmpv6 " | "
+-.IR IP_PROTO " } | { "
++.IR IP_PROTO " } | "
++.B ip_tos
++.IR MASKED_IP_TOS " | "
++.B ip_ttl
++.IR MASKED_IP_TTL " | { "
+ .BR dst_ip " | " src_ip " } "
+ .IR PREFIX " | { "
+ .BR dst_port " | " src_port " } "
+@@ -122,6 +126,17 @@ may be
+ .BR tcp ", " udp ", " sctp ", " icmp ", " icmpv6
+ or an unsigned 8bit value in hexadecimal format.
+ .TP
++.BI ip_tos " MASKED_IP_TOS"
++Match on ipv4 TOS or ipv6 traffic-class - eight bits in hexadecimal format.
++A mask may be optionally provided to limit the bits which are matched. A mask
++is provided by following the value with a slash and then the mask. If the mask
++is missing then a match on all bits is assumed.
++.TP
++.BI ip_ttl " MASKED_IP_TTL"
++Match on ipv4 TTL or ipv6 hop-limit  - eight bits value in decimal or hexadecimal format.
++A mask may be optionally provided to limit the bits which are matched. Same
++logic is used for the mask as with matching on ip_tos.
++.TP
+ .BI dst_ip " PREFIX"
+ .TQ
+ .BI src_ip " PREFIX"
+diff --git a/tc/f_flower.c b/tc/f_flower.c
+index 1b6b46e..5be693a 100644
+--- a/tc/f_flower.c
++++ b/tc/f_flower.c
+@@ -53,6 +53,8 @@ static void explain(void)
+ 		"                       dst_mac MASKED-LLADDR |\n"
+ 		"                       src_mac MASKED-LLADDR |\n"
+ 		"                       ip_proto [tcp | udp | sctp | icmp | icmpv6 | IP-PROTO ] |\n"
++		"                       ip_tos MASKED-IP_TOS |\n"
++		"                       ip_ttl MASKED-IP_TTL |\n"
+ 		"                       dst_ip PREFIX |\n"
+ 		"                       src_ip PREFIX |\n"
+ 		"                       dst_port PORT-NUMBER |\n"
+@@ -510,6 +512,41 @@ err:
+ 	return err;
+ }
+ 
++static int flower_parse_ip_tos_ttl(char *str, int key_type, int mask_type,
++				   struct nlmsghdr *n)
++{
++	char *slash;
++	int ret, err = -1;
++	__u8 tos_ttl;
++
++	slash = strchr(str, '/');
++	if (slash)
++		*slash = '\0';
++
++	ret = get_u8(&tos_ttl, str, 10);
++	if (ret < 0)
++		ret = get_u8(&tos_ttl, str, 16);
++	if (ret < 0)
++		goto err;
++
++	addattr8(n, MAX_MSG, key_type, tos_ttl);
++
++	if (slash) {
++		ret = get_u8(&tos_ttl, slash + 1, 16);
++		if (ret < 0)
++			goto err;
++	} else {
++		tos_ttl = 0xff;
++	}
++	addattr8(n, MAX_MSG, mask_type, tos_ttl);
++
++	err = 0;
++err:
++	if (slash)
++		*slash = '/';
++	return err;
++}
++
+ static int flower_parse_key_id(const char *str, int type, struct nlmsghdr *n)
+ {
+ 	int ret;
+@@ -665,6 +702,26 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
+ 				fprintf(stderr, "Illegal \"ip_proto\"\n");
+ 				return -1;
+ 			}
++		} else if (matches(*argv, "ip_tos") == 0) {
++			NEXT_ARG();
++			ret = flower_parse_ip_tos_ttl(*argv,
++						      TCA_FLOWER_KEY_IP_TOS,
++						      TCA_FLOWER_KEY_IP_TOS_MASK,
++						      n);
++			if (ret < 0) {
++				fprintf(stderr, "Illegal \"ip_tos\"\n");
++				return -1;
++			}
++		} else if (matches(*argv, "ip_ttl") == 0) {
++			NEXT_ARG();
++			ret = flower_parse_ip_tos_ttl(*argv,
++						      TCA_FLOWER_KEY_IP_TTL,
++						      TCA_FLOWER_KEY_IP_TTL_MASK,
++						      n);
++			if (ret < 0) {
++				fprintf(stderr, "Illegal \"ip_ttl\"\n");
++				return -1;
++			}
+ 		} else if (matches(*argv, "dst_ip") == 0) {
+ 			NEXT_ARG();
+ 			ret = flower_parse_ip_addr(*argv, vlan_ethtype ?
+@@ -963,6 +1020,19 @@ static void flower_print_ip_proto(FILE *f, __u8 *p_ip_proto,
+ 	*p_ip_proto = ip_proto;
+ }
+ 
++static void flower_print_ip_attr(FILE *f, char *name,
++				 struct rtattr *key_attr,
++				 struct rtattr *mask_attr)
++{
++	if (!key_attr)
++		return;
++
++	fprintf(f, "\n  %s %x", name, rta_getattr_u8(key_attr));
++	if (!mask_attr)
++		return;
++	fprintf(f, "/%x", rta_getattr_u8(mask_attr));
++}
++
+ static void flower_print_matching_flags(FILE *f, char *name,
+ 					enum flower_matching_flags type,
+ 					struct rtattr *attr,
+@@ -1150,6 +1220,11 @@ static int flower_print_opt(struct filter_util *qu, FILE *f,
+ 	flower_print_eth_type(f, &eth_type, tb[TCA_FLOWER_KEY_ETH_TYPE]);
+ 	flower_print_ip_proto(f, &ip_proto, tb[TCA_FLOWER_KEY_IP_PROTO]);
+ 
++	flower_print_ip_attr(f, "ip_tos", tb[TCA_FLOWER_KEY_IP_TOS],
++			    tb[TCA_FLOWER_KEY_IP_TOS_MASK]);
++	flower_print_ip_attr(f, "ip_ttl", tb[TCA_FLOWER_KEY_IP_TTL],
++			    tb[TCA_FLOWER_KEY_IP_TTL_MASK]);
++
+ 	flower_print_ip_addr(f, "dst_ip", eth_type,
+ 			     tb[TCA_FLOWER_KEY_IPV4_DST],
+ 			     tb[TCA_FLOWER_KEY_IPV4_DST_MASK],
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0036-iproute-build-more-easily-on-Android.patch b/SOURCES/0036-iproute-build-more-easily-on-Android.patch
new file mode 100644
index 0000000..29c0186
--- /dev/null
+++ b/SOURCES/0036-iproute-build-more-easily-on-Android.patch
@@ -0,0 +1,33934 @@
+From 9b0d1f60b01ac442ee3ec15c47c99d3756938034 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Mon, 13 Nov 2017 18:09:56 +0100
+Subject: [PATCH] iproute: build more easily on Android
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1472759
+Upstream Status: iproute2.git commit 596b1c94aa38e
+
+commit 596b1c94aa38e21b7a8c8562e8b61ccb744255d2
+Author: Lorenzo Colitti <lorenzo@google.com>
+Date:   Tue Oct 3 02:03:37 2017 +0900
+
+    iproute: build more easily on Android
+
+    iproute2 contains a bunch of kernel headers, including uapi ones.
+    Android's libc uses uapi headers almost directly, and uses a
+    script to fix kernel types that don't match what userspace
+    expects.
+
+    For example: https://issuetracker.google.com/36987220 reports
+    that our struct ip_mreq_source contains "__be32 imr_multiaddr"
+    rather than "struct in_addr imr_multiaddr". The script addresses
+    this by replacing the uapi struct definition with a #include
+    <bits/ip_mreq.h> which contains the traditional userspace
+    definition.
+
+    Unfortunately, when we compile iproute2, this definition
+    conflicts with the one in iproute2's linux/in.h.
+
+    Historically we've just solved this problem by running "git rm"
+    on all the iproute2 include/linux headers that break Android's
+    libc.  However, deleting the files in this way makes it harder to
+    keep up with upstream, because every upstream change to
+    an include file causes a merge conflict with the delete.
+
+    This patch fixes the problem by moving the iproute2 linux headers
+    from include/linux to include/uapi/linux.
+
+    Tested: compiles on ubuntu trusty (glibc)
+
+    Signed-off-by: Elliott Hughes <enh@google.com>
+    Signed-off-by: Lorenzo Colitti <lorenzo@google.com>
+---
+ Makefile                                       |    2 +-
+ include/linux/atm.h                            |  241 ------
+ include/linux/atmapi.h                         |   29 -
+ include/linux/atmarp.h                         |   41 -
+ include/linux/atmdev.h                         |  215 -----
+ include/linux/atmioc.h                         |   41 -
+ include/linux/atmsap.h                         |  162 ----
+ include/linux/bpf.h                            |  867 -------------------
+ include/linux/bpf_common.h                     |   55 --
+ include/linux/can.h                            |  201 -----
+ include/linux/can/netlink.h                    |  142 ----
+ include/linux/can/vxcan.h                      |   12 -
+ include/linux/devlink.h                        |  247 ------
+ include/linux/elf-em.h                         |   60 --
+ include/linux/fib_rules.h                      |   80 --
+ include/linux/filter.h                         |   89 --
+ include/linux/fou.h                            |   41 -
+ include/linux/gen_stats.h                      |   79 --
+ include/linux/genetlink.h                      |   88 --
+ include/linux/hdlc/ioctl.h                     |   84 --
+ include/linux/icmpv6.h                         |  166 ----
+ include/linux/if.h                             |  292 -------
+ include/linux/if_addr.h                        |   67 --
+ include/linux/if_addrlabel.h                   |   32 -
+ include/linux/if_alg.h                         |   42 -
+ include/linux/if_arp.h                         |  163 ----
+ include/linux/if_bonding.h                     |  130 ---
+ include/linux/if_bridge.h                      |  294 -------
+ include/linux/if_ether.h                       |  158 ----
+ include/linux/if_link.h                        |  928 --------------------
+ include/linux/if_macsec.h                      |  171 ----
+ include/linux/if_packet.h                      |  302 -------
+ include/linux/if_tun.h                         |  107 ---
+ include/linux/if_tunnel.h                      |  158 ----
+ include/linux/if_vlan.h                        |   64 --
+ include/linux/ife.h                            |   18 -
+ include/linux/ila.h                            |   45 -
+ include/linux/in.h                             |  300 -------
+ include/linux/in6.h                            |  296 -------
+ include/linux/in_route.h                       |   32 -
+ include/linux/inet_diag.h                      |  196 -----
+ include/linux/ip.h                             |  175 ----
+ include/linux/ip6_tunnel.h                     |   53 --
+ include/linux/ipsec.h                          |   47 -
+ include/linux/kernel.h                         |   14 -
+ include/linux/l2tp.h                           |  199 -----
+ include/linux/libc-compat.h                    |  213 -----
+ include/linux/limits.h                         |   20 -
+ include/linux/lwtunnel.h                       |   70 --
+ include/linux/magic.h                          |   91 --
+ include/linux/mpls.h                           |   76 --
+ include/linux/mpls_iptunnel.h                  |   30 -
+ include/linux/neighbour.h                      |  171 ----
+ include/linux/net_namespace.h                  |   23 -
+ include/linux/netconf.h                        |   28 -
+ include/linux/netdevice.h                      |   65 --
+ include/linux/netfilter.h                      |   77 --
+ include/linux/netfilter/ipset/ip_set.h         |  304 -------
+ include/linux/netfilter/x_tables.h             |  185 ----
+ include/linux/netfilter/xt_set.h               |   93 --
+ include/linux/netfilter/xt_tcpudp.h            |   36 -
+ include/linux/netfilter_ipv4.h                 |   79 --
+ include/linux/netfilter_ipv4/ip_tables.h       |  228 -----
+ include/linux/netfilter_ipv6.h                 |   77 --
+ include/linux/netfilter_ipv6/ip6_tables.h      |  269 ------
+ include/linux/netlink.h                        |  246 ------
+ include/linux/netlink_diag.h                   |   64 --
+ include/linux/packet_diag.h                    |   80 --
+ include/linux/param.h                          |    6 -
+ include/linux/pfkeyv2.h                        |  383 ---------
+ include/linux/pkt_cls.h                        |  569 -------------
+ include/linux/pkt_sched.h                      |  874 -------------------
+ include/linux/posix_types.h                    |   37 -
+ include/linux/rtnetlink.h                      |  718 ----------------
+ include/linux/sctp.h                           | 1085 ------------------------
+ include/linux/seg6.h                           |   54 --
+ include/linux/seg6_genl.h                      |   32 -
+ include/linux/seg6_hmac.h                      |   22 -
+ include/linux/seg6_iptunnel.h                  |   40 -
+ include/linux/seg6_local.h                     |   68 --
+ include/linux/sock_diag.h                      |   38 -
+ include/linux/socket.h                         |   21 -
+ include/linux/sockios.h                        |  152 ----
+ include/linux/stddef.h                         |    5 -
+ include/linux/sysinfo.h                        |   24 -
+ include/linux/tc_act/tc_bpf.h                  |   36 -
+ include/linux/tc_act/tc_connmark.h             |   23 -
+ include/linux/tc_act/tc_csum.h                 |   34 -
+ include/linux/tc_act/tc_defact.h               |   20 -
+ include/linux/tc_act/tc_gact.h                 |   33 -
+ include/linux/tc_act/tc_ife.h                  |   32 -
+ include/linux/tc_act/tc_ipt.h                  |   22 -
+ include/linux/tc_act/tc_mirred.h               |   28 -
+ include/linux/tc_act/tc_nat.h                  |   28 -
+ include/linux/tc_act/tc_pedit.h                |   66 --
+ include/linux/tc_act/tc_sample.h               |   26 -
+ include/linux/tc_act/tc_skbedit.h              |   51 --
+ include/linux/tc_act/tc_skbmod.h               |   39 -
+ include/linux/tc_act/tc_tunnel_key.h           |   43 -
+ include/linux/tc_act/tc_vlan.h                 |   38 -
+ include/linux/tc_ematch/tc_em_cmp.h            |   25 -
+ include/linux/tc_ematch/tc_em_meta.h           |   92 --
+ include/linux/tc_ematch/tc_em_nbyte.h          |   13 -
+ include/linux/tcp.h                            |  268 ------
+ include/linux/tcp_metrics.h                    |   60 --
+ include/linux/tipc.h                           |  256 ------
+ include/linux/tipc_netlink.h                   |  294 -------
+ include/linux/types.h                          |   47 -
+ include/linux/unix_diag.h                      |   58 --
+ include/linux/veth.h                           |   12 -
+ include/linux/xfrm.h                           |  536 ------------
+ include/uapi/linux/atm.h                       |  241 ++++++
+ include/uapi/linux/atmapi.h                    |   29 +
+ include/uapi/linux/atmarp.h                    |   41 +
+ include/uapi/linux/atmdev.h                    |  215 +++++
+ include/uapi/linux/atmioc.h                    |   41 +
+ include/uapi/linux/atmsap.h                    |  162 ++++
+ include/uapi/linux/bpf.h                       |  867 +++++++++++++++++++
+ include/uapi/linux/bpf_common.h                |   55 ++
+ include/uapi/linux/can.h                       |  201 +++++
+ include/uapi/linux/can/netlink.h               |  142 ++++
+ include/uapi/linux/can/vxcan.h                 |   12 +
+ include/uapi/linux/devlink.h                   |  247 ++++++
+ include/uapi/linux/elf-em.h                    |   60 ++
+ include/uapi/linux/fib_rules.h                 |   80 ++
+ include/uapi/linux/filter.h                    |   89 ++
+ include/uapi/linux/fou.h                       |   41 +
+ include/uapi/linux/gen_stats.h                 |   79 ++
+ include/uapi/linux/genetlink.h                 |   88 ++
+ include/uapi/linux/hdlc/ioctl.h                |   84 ++
+ include/uapi/linux/icmpv6.h                    |  166 ++++
+ include/uapi/linux/if.h                        |  292 +++++++
+ include/uapi/linux/if_addr.h                   |   67 ++
+ include/uapi/linux/if_addrlabel.h              |   32 +
+ include/uapi/linux/if_alg.h                    |   42 +
+ include/uapi/linux/if_arp.h                    |  163 ++++
+ include/uapi/linux/if_bonding.h                |  130 +++
+ include/uapi/linux/if_bridge.h                 |  294 +++++++
+ include/uapi/linux/if_ether.h                  |  158 ++++
+ include/uapi/linux/if_link.h                   |  928 ++++++++++++++++++++
+ include/uapi/linux/if_macsec.h                 |  171 ++++
+ include/uapi/linux/if_packet.h                 |  302 +++++++
+ include/uapi/linux/if_tun.h                    |  107 +++
+ include/uapi/linux/if_tunnel.h                 |  158 ++++
+ include/uapi/linux/if_vlan.h                   |   64 ++
+ include/uapi/linux/ife.h                       |   18 +
+ include/uapi/linux/ila.h                       |   45 +
+ include/uapi/linux/in.h                        |  300 +++++++
+ include/uapi/linux/in6.h                       |  296 +++++++
+ include/uapi/linux/in_route.h                  |   32 +
+ include/uapi/linux/inet_diag.h                 |  196 +++++
+ include/uapi/linux/ip.h                        |  175 ++++
+ include/uapi/linux/ip6_tunnel.h                |   53 ++
+ include/uapi/linux/ipsec.h                     |   47 +
+ include/uapi/linux/kernel.h                    |   14 +
+ include/uapi/linux/l2tp.h                      |  199 +++++
+ include/uapi/linux/libc-compat.h               |  213 +++++
+ include/uapi/linux/limits.h                    |   20 +
+ include/uapi/linux/lwtunnel.h                  |   70 ++
+ include/uapi/linux/magic.h                     |   91 ++
+ include/uapi/linux/mpls.h                      |   76 ++
+ include/uapi/linux/mpls_iptunnel.h             |   30 +
+ include/uapi/linux/neighbour.h                 |  171 ++++
+ include/uapi/linux/net_namespace.h             |   23 +
+ include/uapi/linux/netconf.h                   |   28 +
+ include/uapi/linux/netdevice.h                 |   65 ++
+ include/uapi/linux/netfilter.h                 |   77 ++
+ include/uapi/linux/netfilter/ipset/ip_set.h    |  304 +++++++
+ include/uapi/linux/netfilter/x_tables.h        |  185 ++++
+ include/uapi/linux/netfilter/xt_set.h          |   93 ++
+ include/uapi/linux/netfilter/xt_tcpudp.h       |   36 +
+ include/uapi/linux/netfilter_ipv4.h            |   79 ++
+ include/uapi/linux/netfilter_ipv4/ip_tables.h  |  228 +++++
+ include/uapi/linux/netfilter_ipv6.h            |   77 ++
+ include/uapi/linux/netfilter_ipv6/ip6_tables.h |  269 ++++++
+ include/uapi/linux/netlink.h                   |  246 ++++++
+ include/uapi/linux/netlink_diag.h              |   64 ++
+ include/uapi/linux/packet_diag.h               |   80 ++
+ include/uapi/linux/param.h                     |    6 +
+ include/uapi/linux/pfkeyv2.h                   |  383 +++++++++
+ include/uapi/linux/pkt_cls.h                   |  569 +++++++++++++
+ include/uapi/linux/pkt_sched.h                 |  874 +++++++++++++++++++
+ include/uapi/linux/posix_types.h               |   37 +
+ include/uapi/linux/rtnetlink.h                 |  718 ++++++++++++++++
+ include/uapi/linux/sctp.h                      | 1085 ++++++++++++++++++++++++
+ include/uapi/linux/seg6.h                      |   54 ++
+ include/uapi/linux/seg6_genl.h                 |   32 +
+ include/uapi/linux/seg6_hmac.h                 |   22 +
+ include/uapi/linux/seg6_iptunnel.h             |   40 +
+ include/uapi/linux/seg6_local.h                |   68 ++
+ include/uapi/linux/sock_diag.h                 |   38 +
+ include/uapi/linux/socket.h                    |   21 +
+ include/uapi/linux/sockios.h                   |  152 ++++
+ include/uapi/linux/stddef.h                    |    5 +
+ include/uapi/linux/sysinfo.h                   |   24 +
+ include/uapi/linux/tc_act/tc_bpf.h             |   36 +
+ include/uapi/linux/tc_act/tc_connmark.h        |   23 +
+ include/uapi/linux/tc_act/tc_csum.h            |   34 +
+ include/uapi/linux/tc_act/tc_defact.h          |   20 +
+ include/uapi/linux/tc_act/tc_gact.h            |   33 +
+ include/uapi/linux/tc_act/tc_ife.h             |   32 +
+ include/uapi/linux/tc_act/tc_ipt.h             |   22 +
+ include/uapi/linux/tc_act/tc_mirred.h          |   28 +
+ include/uapi/linux/tc_act/tc_nat.h             |   28 +
+ include/uapi/linux/tc_act/tc_pedit.h           |   66 ++
+ include/uapi/linux/tc_act/tc_sample.h          |   26 +
+ include/uapi/linux/tc_act/tc_skbedit.h         |   51 ++
+ include/uapi/linux/tc_act/tc_skbmod.h          |   39 +
+ include/uapi/linux/tc_act/tc_tunnel_key.h      |   43 +
+ include/uapi/linux/tc_act/tc_vlan.h            |   38 +
+ include/uapi/linux/tc_ematch/tc_em_cmp.h       |   25 +
+ include/uapi/linux/tc_ematch/tc_em_meta.h      |   92 ++
+ include/uapi/linux/tc_ematch/tc_em_nbyte.h     |   13 +
+ include/uapi/linux/tcp.h                       |  268 ++++++
+ include/uapi/linux/tcp_metrics.h               |   60 ++
+ include/uapi/linux/tipc.h                      |  256 ++++++
+ include/uapi/linux/tipc_netlink.h              |  294 +++++++
+ include/uapi/linux/types.h                     |   47 +
+ include/uapi/linux/unix_diag.h                 |   58 ++
+ include/uapi/linux/veth.h                      |   12 +
+ include/uapi/linux/xfrm.h                      |  536 ++++++++++++
+ 221 files changed, 16057 insertions(+), 16057 deletions(-)
+ delete mode 100644 include/linux/atm.h
+ delete mode 100644 include/linux/atmapi.h
+ delete mode 100644 include/linux/atmarp.h
+ delete mode 100644 include/linux/atmdev.h
+ delete mode 100644 include/linux/atmioc.h
+ delete mode 100644 include/linux/atmsap.h
+ delete mode 100644 include/linux/bpf.h
+ delete mode 100644 include/linux/bpf_common.h
+ delete mode 100644 include/linux/can.h
+ delete mode 100644 include/linux/can/netlink.h
+ delete mode 100644 include/linux/can/vxcan.h
+ delete mode 100644 include/linux/devlink.h
+ delete mode 100644 include/linux/elf-em.h
+ delete mode 100644 include/linux/fib_rules.h
+ delete mode 100644 include/linux/filter.h
+ delete mode 100644 include/linux/fou.h
+ delete mode 100644 include/linux/gen_stats.h
+ delete mode 100644 include/linux/genetlink.h
+ delete mode 100644 include/linux/hdlc/ioctl.h
+ delete mode 100644 include/linux/icmpv6.h
+ delete mode 100644 include/linux/if.h
+ delete mode 100644 include/linux/if_addr.h
+ delete mode 100644 include/linux/if_addrlabel.h
+ delete mode 100644 include/linux/if_alg.h
+ delete mode 100644 include/linux/if_arp.h
+ delete mode 100644 include/linux/if_bonding.h
+ delete mode 100644 include/linux/if_bridge.h
+ delete mode 100644 include/linux/if_ether.h
+ delete mode 100644 include/linux/if_link.h
+ delete mode 100644 include/linux/if_macsec.h
+ delete mode 100644 include/linux/if_packet.h
+ delete mode 100644 include/linux/if_tun.h
+ delete mode 100644 include/linux/if_tunnel.h
+ delete mode 100644 include/linux/if_vlan.h
+ delete mode 100644 include/linux/ife.h
+ delete mode 100644 include/linux/ila.h
+ delete mode 100644 include/linux/in.h
+ delete mode 100644 include/linux/in6.h
+ delete mode 100644 include/linux/in_route.h
+ delete mode 100644 include/linux/inet_diag.h
+ delete mode 100644 include/linux/ip.h
+ delete mode 100644 include/linux/ip6_tunnel.h
+ delete mode 100644 include/linux/ipsec.h
+ delete mode 100644 include/linux/kernel.h
+ delete mode 100644 include/linux/l2tp.h
+ delete mode 100644 include/linux/libc-compat.h
+ delete mode 100644 include/linux/limits.h
+ delete mode 100644 include/linux/lwtunnel.h
+ delete mode 100644 include/linux/magic.h
+ delete mode 100644 include/linux/mpls.h
+ delete mode 100644 include/linux/mpls_iptunnel.h
+ delete mode 100644 include/linux/neighbour.h
+ delete mode 100644 include/linux/net_namespace.h
+ delete mode 100644 include/linux/netconf.h
+ delete mode 100644 include/linux/netdevice.h
+ delete mode 100644 include/linux/netfilter.h
+ delete mode 100644 include/linux/netfilter/ipset/ip_set.h
+ delete mode 100644 include/linux/netfilter/x_tables.h
+ delete mode 100644 include/linux/netfilter/xt_set.h
+ delete mode 100644 include/linux/netfilter/xt_tcpudp.h
+ delete mode 100644 include/linux/netfilter_ipv4.h
+ delete mode 100644 include/linux/netfilter_ipv4/ip_tables.h
+ delete mode 100644 include/linux/netfilter_ipv6.h
+ delete mode 100644 include/linux/netfilter_ipv6/ip6_tables.h
+ delete mode 100644 include/linux/netlink.h
+ delete mode 100644 include/linux/netlink_diag.h
+ delete mode 100644 include/linux/packet_diag.h
+ delete mode 100644 include/linux/param.h
+ delete mode 100644 include/linux/pfkeyv2.h
+ delete mode 100644 include/linux/pkt_cls.h
+ delete mode 100644 include/linux/pkt_sched.h
+ delete mode 100644 include/linux/posix_types.h
+ delete mode 100644 include/linux/rtnetlink.h
+ delete mode 100644 include/linux/sctp.h
+ delete mode 100644 include/linux/seg6.h
+ delete mode 100644 include/linux/seg6_genl.h
+ delete mode 100644 include/linux/seg6_hmac.h
+ delete mode 100644 include/linux/seg6_iptunnel.h
+ delete mode 100644 include/linux/seg6_local.h
+ delete mode 100644 include/linux/sock_diag.h
+ delete mode 100644 include/linux/socket.h
+ delete mode 100644 include/linux/sockios.h
+ delete mode 100644 include/linux/stddef.h
+ delete mode 100644 include/linux/sysinfo.h
+ delete mode 100644 include/linux/tc_act/tc_bpf.h
+ delete mode 100644 include/linux/tc_act/tc_connmark.h
+ delete mode 100644 include/linux/tc_act/tc_csum.h
+ delete mode 100644 include/linux/tc_act/tc_defact.h
+ delete mode 100644 include/linux/tc_act/tc_gact.h
+ delete mode 100644 include/linux/tc_act/tc_ife.h
+ delete mode 100644 include/linux/tc_act/tc_ipt.h
+ delete mode 100644 include/linux/tc_act/tc_mirred.h
+ delete mode 100644 include/linux/tc_act/tc_nat.h
+ delete mode 100644 include/linux/tc_act/tc_pedit.h
+ delete mode 100644 include/linux/tc_act/tc_sample.h
+ delete mode 100644 include/linux/tc_act/tc_skbedit.h
+ delete mode 100644 include/linux/tc_act/tc_skbmod.h
+ delete mode 100644 include/linux/tc_act/tc_tunnel_key.h
+ delete mode 100644 include/linux/tc_act/tc_vlan.h
+ delete mode 100644 include/linux/tc_ematch/tc_em_cmp.h
+ delete mode 100644 include/linux/tc_ematch/tc_em_meta.h
+ delete mode 100644 include/linux/tc_ematch/tc_em_nbyte.h
+ delete mode 100644 include/linux/tcp.h
+ delete mode 100644 include/linux/tcp_metrics.h
+ delete mode 100644 include/linux/tipc.h
+ delete mode 100644 include/linux/tipc_netlink.h
+ delete mode 100644 include/linux/types.h
+ delete mode 100644 include/linux/unix_diag.h
+ delete mode 100644 include/linux/veth.h
+ delete mode 100644 include/linux/xfrm.h
+ create mode 100644 include/uapi/linux/atm.h
+ create mode 100644 include/uapi/linux/atmapi.h
+ create mode 100644 include/uapi/linux/atmarp.h
+ create mode 100644 include/uapi/linux/atmdev.h
+ create mode 100644 include/uapi/linux/atmioc.h
+ create mode 100644 include/uapi/linux/atmsap.h
+ create mode 100644 include/uapi/linux/bpf.h
+ create mode 100644 include/uapi/linux/bpf_common.h
+ create mode 100644 include/uapi/linux/can.h
+ create mode 100644 include/uapi/linux/can/netlink.h
+ create mode 100644 include/uapi/linux/can/vxcan.h
+ create mode 100644 include/uapi/linux/devlink.h
+ create mode 100644 include/uapi/linux/elf-em.h
+ create mode 100644 include/uapi/linux/fib_rules.h
+ create mode 100644 include/uapi/linux/filter.h
+ create mode 100644 include/uapi/linux/fou.h
+ create mode 100644 include/uapi/linux/gen_stats.h
+ create mode 100644 include/uapi/linux/genetlink.h
+ create mode 100644 include/uapi/linux/hdlc/ioctl.h
+ create mode 100644 include/uapi/linux/icmpv6.h
+ create mode 100644 include/uapi/linux/if.h
+ create mode 100644 include/uapi/linux/if_addr.h
+ create mode 100644 include/uapi/linux/if_addrlabel.h
+ create mode 100644 include/uapi/linux/if_alg.h
+ create mode 100644 include/uapi/linux/if_arp.h
+ create mode 100644 include/uapi/linux/if_bonding.h
+ create mode 100644 include/uapi/linux/if_bridge.h
+ create mode 100644 include/uapi/linux/if_ether.h
+ create mode 100644 include/uapi/linux/if_link.h
+ create mode 100644 include/uapi/linux/if_macsec.h
+ create mode 100644 include/uapi/linux/if_packet.h
+ create mode 100644 include/uapi/linux/if_tun.h
+ create mode 100644 include/uapi/linux/if_tunnel.h
+ create mode 100644 include/uapi/linux/if_vlan.h
+ create mode 100644 include/uapi/linux/ife.h
+ create mode 100644 include/uapi/linux/ila.h
+ create mode 100644 include/uapi/linux/in.h
+ create mode 100644 include/uapi/linux/in6.h
+ create mode 100644 include/uapi/linux/in_route.h
+ create mode 100644 include/uapi/linux/inet_diag.h
+ create mode 100644 include/uapi/linux/ip.h
+ create mode 100644 include/uapi/linux/ip6_tunnel.h
+ create mode 100644 include/uapi/linux/ipsec.h
+ create mode 100644 include/uapi/linux/kernel.h
+ create mode 100644 include/uapi/linux/l2tp.h
+ create mode 100644 include/uapi/linux/libc-compat.h
+ create mode 100644 include/uapi/linux/limits.h
+ create mode 100644 include/uapi/linux/lwtunnel.h
+ create mode 100644 include/uapi/linux/magic.h
+ create mode 100644 include/uapi/linux/mpls.h
+ create mode 100644 include/uapi/linux/mpls_iptunnel.h
+ create mode 100644 include/uapi/linux/neighbour.h
+ create mode 100644 include/uapi/linux/net_namespace.h
+ create mode 100644 include/uapi/linux/netconf.h
+ create mode 100644 include/uapi/linux/netdevice.h
+ create mode 100644 include/uapi/linux/netfilter.h
+ create mode 100644 include/uapi/linux/netfilter/ipset/ip_set.h
+ create mode 100644 include/uapi/linux/netfilter/x_tables.h
+ create mode 100644 include/uapi/linux/netfilter/xt_set.h
+ create mode 100644 include/uapi/linux/netfilter/xt_tcpudp.h
+ create mode 100644 include/uapi/linux/netfilter_ipv4.h
+ create mode 100644 include/uapi/linux/netfilter_ipv4/ip_tables.h
+ create mode 100644 include/uapi/linux/netfilter_ipv6.h
+ create mode 100644 include/uapi/linux/netfilter_ipv6/ip6_tables.h
+ create mode 100644 include/uapi/linux/netlink.h
+ create mode 100644 include/uapi/linux/netlink_diag.h
+ create mode 100644 include/uapi/linux/packet_diag.h
+ create mode 100644 include/uapi/linux/param.h
+ create mode 100644 include/uapi/linux/pfkeyv2.h
+ create mode 100644 include/uapi/linux/pkt_cls.h
+ create mode 100644 include/uapi/linux/pkt_sched.h
+ create mode 100644 include/uapi/linux/posix_types.h
+ create mode 100644 include/uapi/linux/rtnetlink.h
+ create mode 100644 include/uapi/linux/sctp.h
+ create mode 100644 include/uapi/linux/seg6.h
+ create mode 100644 include/uapi/linux/seg6_genl.h
+ create mode 100644 include/uapi/linux/seg6_hmac.h
+ create mode 100644 include/uapi/linux/seg6_iptunnel.h
+ create mode 100644 include/uapi/linux/seg6_local.h
+ create mode 100644 include/uapi/linux/sock_diag.h
+ create mode 100644 include/uapi/linux/socket.h
+ create mode 100644 include/uapi/linux/sockios.h
+ create mode 100644 include/uapi/linux/stddef.h
+ create mode 100644 include/uapi/linux/sysinfo.h
+ create mode 100644 include/uapi/linux/tc_act/tc_bpf.h
+ create mode 100644 include/uapi/linux/tc_act/tc_connmark.h
+ create mode 100644 include/uapi/linux/tc_act/tc_csum.h
+ create mode 100644 include/uapi/linux/tc_act/tc_defact.h
+ create mode 100644 include/uapi/linux/tc_act/tc_gact.h
+ create mode 100644 include/uapi/linux/tc_act/tc_ife.h
+ create mode 100644 include/uapi/linux/tc_act/tc_ipt.h
+ create mode 100644 include/uapi/linux/tc_act/tc_mirred.h
+ create mode 100644 include/uapi/linux/tc_act/tc_nat.h
+ create mode 100644 include/uapi/linux/tc_act/tc_pedit.h
+ create mode 100644 include/uapi/linux/tc_act/tc_sample.h
+ create mode 100644 include/uapi/linux/tc_act/tc_skbedit.h
+ create mode 100644 include/uapi/linux/tc_act/tc_skbmod.h
+ create mode 100644 include/uapi/linux/tc_act/tc_tunnel_key.h
+ create mode 100644 include/uapi/linux/tc_act/tc_vlan.h
+ create mode 100644 include/uapi/linux/tc_ematch/tc_em_cmp.h
+ create mode 100644 include/uapi/linux/tc_ematch/tc_em_meta.h
+ create mode 100644 include/uapi/linux/tc_ematch/tc_em_nbyte.h
+ create mode 100644 include/uapi/linux/tcp.h
+ create mode 100644 include/uapi/linux/tcp_metrics.h
+ create mode 100644 include/uapi/linux/tipc.h
+ create mode 100644 include/uapi/linux/tipc_netlink.h
+ create mode 100644 include/uapi/linux/types.h
+ create mode 100644 include/uapi/linux/unix_diag.h
+ create mode 100644 include/uapi/linux/veth.h
+ create mode 100644 include/uapi/linux/xfrm.h
+
+diff --git a/Makefile b/Makefile
+index 18de7dc..df2fa33 100644
+--- a/Makefile
++++ b/Makefile
+@@ -49,7 +49,7 @@ CCOPTS = -O2
+ WFLAGS := -Wall -Wstrict-prototypes  -Wmissing-prototypes
+ WFLAGS += -Wmissing-declarations -Wold-style-definition -Wformat=2
+ 
+-CFLAGS := $(WFLAGS) $(CCOPTS) -I../include $(DEFINES) $(CFLAGS)
++CFLAGS := $(WFLAGS) $(CCOPTS) -I../include -I../include/uapi $(DEFINES) $(CFLAGS)
+ YACCFLAGS = -d -t -v
+ 
+ SUBDIRS=lib ip tc bridge misc netem genl tipc devlink man
+diff --git a/include/linux/atm.h b/include/linux/atm.h
+deleted file mode 100644
+index 08e27be..0000000
+--- a/include/linux/atm.h
++++ /dev/null
+@@ -1,241 +0,0 @@
+-/* atm.h - general ATM declarations */
+- 
+-/* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
+- 
+-
+-/*
+- * WARNING: User-space programs should not #include <linux/atm.h> directly.
+- *          Instead, #include <atm.h>
+- */
+-
+-#ifndef _LINUX_ATM_H
+-#define _LINUX_ATM_H
+-
+-/*
+- * BEGIN_xx and END_xx markers are used for automatic generation of
+- * documentation. Do not change them.
+- */
+-
+-
+-#include <linux/atmapi.h>
+-#include <linux/atmsap.h>
+-#include <linux/atmioc.h>
+-#include <linux/types.h>
+-
+-
+-/* general ATM constants */
+-#define ATM_CELL_SIZE		    53	/* ATM cell size incl. header */
+-#define ATM_CELL_PAYLOAD	    48	/* ATM payload size */
+-#define ATM_AAL0_SDU		    52	/* AAL0 SDU size */
+-#define ATM_MAX_AAL34_PDU	 65535	/* maximum AAL3/4 PDU payload */
+-#define ATM_AAL5_TRAILER	     8	/* AAL5 trailer size */
+-#define ATM_MAX_AAL5_PDU	 65535	/* maximum AAL5 PDU payload */
+-#define ATM_MAX_CDV		  9999	/* maximum (default) CDV */
+-#define ATM_NOT_RSV_VCI		    32	/* first non-reserved VCI value */
+-
+-#define ATM_MAX_VPI		   255	/* maximum VPI at the UNI */
+-#define ATM_MAX_VPI_NNI		  4096	/* maximum VPI at the NNI */
+-#define ATM_MAX_VCI		 65535	/* maximum VCI */
+-
+-
+-/* "protcol" values for the socket system call */
+-#define ATM_NO_AAL	0		/* AAL not specified */
+-#define ATM_AAL0	13		/* "raw" ATM cells */
+-#define ATM_AAL1	1		/* AAL1 (CBR) */
+-#define ATM_AAL2	2		/* AAL2 (VBR) */
+-#define ATM_AAL34	3		/* AAL3/4 (data) */
+-#define ATM_AAL5	5		/* AAL5 (data) */
+-
+-/*
+- * socket option name coding functions
+- *
+- * Note that __SO_ENCODE and __SO_LEVEL are somewhat a hack since the
+- * << 22 only reserves 9 bits for the level.  On some architectures
+- * SOL_SOCKET is 0xFFFF, so that's a bit of a problem
+- */
+-
+-#define __SO_ENCODE(l,n,t)	((((l) & 0x1FF) << 22) | ((n) << 16) | \
+-				sizeof(t))
+-#define __SO_LEVEL_MATCH(c,m)	(((c) >> 22) == ((m) & 0x1FF))
+-#define __SO_NUMBER(c)		(((c) >> 16) & 0x3f)
+-#define __SO_SIZE(c)		((c) & 0x3fff)
+-
+-/*
+- * ATM layer
+- */
+-
+-#define SO_SETCLP	__SO_ENCODE(SOL_ATM,0,int)
+-			    /* set CLP bit value - TODO */
+-#define SO_CIRANGE	__SO_ENCODE(SOL_ATM,1,struct atm_cirange)
+-			    /* connection identifier range; socket must be
+-			       bound or connected */
+-#define SO_ATMQOS	__SO_ENCODE(SOL_ATM,2,struct atm_qos)
+-			    /* Quality of Service setting */
+-#define SO_ATMSAP	__SO_ENCODE(SOL_ATM,3,struct atm_sap)
+-			    /* Service Access Point */
+-#define SO_ATMPVC	__SO_ENCODE(SOL_ATM,4,struct sockaddr_atmpvc)
+-			    /* "PVC" address (also for SVCs); get only */
+-#define SO_MULTIPOINT	__SO_ENCODE(SOL_ATM, 5, int)
+-			    /* make this vc a p2mp */
+-
+-
+-/*
+- * Note @@@: since the socket layers don't really distinguish the control and
+- * the data plane but generally seems to be data plane-centric, any layer is
+- * about equally wrong for the SAP. If you have a better idea about this,
+- * please speak up ...
+- */
+-
+-
+-/* ATM cell header (for AAL0) */
+-
+-/* BEGIN_CH */
+-#define ATM_HDR_GFC_MASK	0xf0000000
+-#define ATM_HDR_GFC_SHIFT	28
+-#define ATM_HDR_VPI_MASK	0x0ff00000
+-#define ATM_HDR_VPI_SHIFT	20
+-#define ATM_HDR_VCI_MASK	0x000ffff0
+-#define ATM_HDR_VCI_SHIFT	4
+-#define ATM_HDR_PTI_MASK	0x0000000e
+-#define ATM_HDR_PTI_SHIFT	1
+-#define ATM_HDR_CLP		0x00000001
+-/* END_CH */
+-
+-
+-/* PTI codings */
+-
+-/* BEGIN_PTI */
+-#define ATM_PTI_US0	0  /* user data cell, congestion not exp, SDU-type 0 */
+-#define ATM_PTI_US1	1  /* user data cell, congestion not exp, SDU-type 1 */
+-#define ATM_PTI_UCES0	2  /* user data cell, cong. experienced, SDU-type 0 */
+-#define ATM_PTI_UCES1	3  /* user data cell, cong. experienced, SDU-type 1 */
+-#define ATM_PTI_SEGF5	4  /* segment OAM F5 flow related cell */
+-#define ATM_PTI_E2EF5	5  /* end-to-end OAM F5 flow related cell */
+-#define ATM_PTI_RSV_RM	6  /* reserved for traffic control/resource mgmt */
+-#define ATM_PTI_RSV	7  /* reserved */
+-/* END_PTI */
+-
+-
+-/*
+- * The following items should stay in linux/atm.h, which should be linked to
+- * netatm/atm.h
+- */
+-
+-/* Traffic description */
+-
+-#define ATM_NONE	0		/* no traffic */
+-#define ATM_UBR		1
+-#define ATM_CBR		2
+-#define ATM_VBR		3
+-#define ATM_ABR		4
+-#define ATM_ANYCLASS	5		/* compatible with everything */
+-
+-#define ATM_MAX_PCR	-1		/* maximum available PCR */
+-
+-struct atm_trafprm {
+-	unsigned char	traffic_class;	/* traffic class (ATM_UBR, ...) */
+-	int		max_pcr;	/* maximum PCR in cells per second */
+-	int		pcr;		/* desired PCR in cells per second */
+-	int		min_pcr;	/* minimum PCR in cells per second */
+-	int		max_cdv;	/* maximum CDV in microseconds */
+-	int		max_sdu;	/* maximum SDU in bytes */
+-        /* extra params for ABR */
+-        unsigned int 	icr;         	/* Initial Cell Rate (24-bit) */
+-        unsigned int	tbe;		/* Transient Buffer Exposure (24-bit) */ 
+-        unsigned int 	frtt : 24;	/* Fixed Round Trip Time (24-bit) */
+-        unsigned int 	rif  : 4;       /* Rate Increment Factor (4-bit) */
+-        unsigned int 	rdf  : 4;       /* Rate Decrease Factor (4-bit) */
+-        unsigned int nrm_pres  :1;      /* nrm present bit */
+-        unsigned int trm_pres  :1;     	/* rm present bit */
+-        unsigned int adtf_pres :1;     	/* adtf present bit */
+-        unsigned int cdf_pres  :1;    	/* cdf present bit*/
+-        unsigned int nrm       :3;     	/* Max # of Cells for each forward RM cell (3-bit) */
+-        unsigned int trm       :3;    	/* Time between forward RM cells (3-bit) */    
+-	unsigned int adtf      :10;     /* ACR Decrease Time Factor (10-bit) */
+-	unsigned int cdf       :3;      /* Cutoff Decrease Factor (3-bit) */
+-        unsigned int spare     :9;      /* spare bits */ 
+-};
+-
+-struct atm_qos {
+-	struct atm_trafprm txtp;	/* parameters in TX direction */
+-	struct atm_trafprm rxtp __ATM_API_ALIGN;
+-					/* parameters in RX direction */
+-	unsigned char aal __ATM_API_ALIGN;
+-};
+-
+-/* PVC addressing */
+-
+-#define ATM_ITF_ANY	-1		/* "magic" PVC address values */
+-#define ATM_VPI_ANY	-1
+-#define ATM_VCI_ANY	-1
+-#define ATM_VPI_UNSPEC	-2
+-#define ATM_VCI_UNSPEC	-2
+-
+-
+-struct sockaddr_atmpvc {
+-	unsigned short 	sap_family;	/* address family, AF_ATMPVC  */
+-	struct {			/* PVC address */
+-		short	itf;		/* ATM interface */
+-		short	vpi;		/* VPI (only 8 bits at UNI) */
+-		int	vci;		/* VCI (only 16 bits at UNI) */
+-	} sap_addr __ATM_API_ALIGN;	/* PVC address */
+-};
+-
+-/* SVC addressing */
+-
+-#define	ATM_ESA_LEN	20		/* ATM End System Address length */
+-#define ATM_E164_LEN	12		/* maximum E.164 number length */
+-
+-#define ATM_AFI_DCC	0x39		/* DCC ATM Format */
+-#define ATM_AFI_ICD	0x47		/* ICD ATM Format */
+-#define ATM_AFI_E164	0x45		/* E.164 ATM Format */
+-#define ATM_AFI_LOCAL	0x49		/* Local ATM Format */ 
+-
+-#define ATM_AFI_DCC_GROUP	0xBD	/* DCC ATM Group Format */
+-#define ATM_AFI_ICD_GROUP	0xC5	/* ICD ATM Group Format */
+-#define ATM_AFI_E164_GROUP	0xC3	/* E.164 ATM Group Format */
+-#define ATM_AFI_LOCAL_GROUP	0xC7	/* Local ATM Group Format */
+-
+-#define ATM_LIJ_NONE	0		/* no leaf-initiated join */
+-#define ATM_LIJ		1		/* request joining */
+-#define ATM_LIJ_RPJ	2		/* set to root-prompted join */
+-#define ATM_LIJ_NJ	3		/* set to network join */
+-
+-
+-struct sockaddr_atmsvc {
+-    unsigned short 	sas_family;	/* address family, AF_ATMSVC */
+-    struct {				/* SVC address */
+-        unsigned char	prv[ATM_ESA_LEN];/* private ATM address */
+-        char		pub[ATM_E164_LEN+1]; /* public address (E.164) */
+-    					/* unused addresses must be bzero'ed */
+-	char		lij_type;	/* role in LIJ call; one of ATM_LIJ* */
+-	__u32	lij_id;		/* LIJ call identifier */
+-    } sas_addr __ATM_API_ALIGN;		/* SVC address */
+-};
+-
+-
+-static __inline__ int atmsvc_addr_in_use(struct sockaddr_atmsvc addr)
+-{
+-	return *addr.sas_addr.prv || *addr.sas_addr.pub;
+-}
+-
+-
+-static __inline__ int atmpvc_addr_in_use(struct sockaddr_atmpvc addr)
+-{
+-	return addr.sap_addr.itf || addr.sap_addr.vpi || addr.sap_addr.vci;
+-}
+-
+-
+-/*
+- * Some stuff for linux/sockios.h
+- */
+-
+-struct atmif_sioc {
+-	int number;
+-	int length;
+-	void *arg;
+-};
+-
+-
+-typedef unsigned short atm_backend_t;
+-#endif /* _LINUX_ATM_H */
+diff --git a/include/linux/atmapi.h b/include/linux/atmapi.h
+deleted file mode 100644
+index 8fe54d9..0000000
+--- a/include/linux/atmapi.h
++++ /dev/null
+@@ -1,29 +0,0 @@
+-/* atmapi.h - ATM API user space/kernel compatibility */
+- 
+-/* Written 1999,2000 by Werner Almesberger, EPFL ICA */
+- 
+-
+-#ifndef _LINUX_ATMAPI_H
+-#define _LINUX_ATMAPI_H
+-
+-#if defined(__sparc__) || defined(__ia64__)
+-/* such alignment is not required on 32 bit sparcs, but we can't
+-   figure that we are on a sparc64 while compiling user-space programs. */
+-#define __ATM_API_ALIGN	__attribute__((aligned(8)))
+-#else
+-#define __ATM_API_ALIGN
+-#endif
+-
+-
+-/*
+- * Opaque type for kernel pointers. Note that _ is never accessed. We need
+- * the struct in order hide the array, so that we can make simple assignments
+- * instead of being forced to use memcpy. It also improves error reporting for
+- * code that still assumes that we're passing unsigned longs.
+- *
+- * Convention: NULL pointers are passed as a field of all zeroes.
+- */
+- 
+-typedef struct { unsigned char _[8]; } __ATM_API_ALIGN atm_kptr_t;
+-
+-#endif
+diff --git a/include/linux/atmarp.h b/include/linux/atmarp.h
+deleted file mode 100644
+index 231f4bd..0000000
+--- a/include/linux/atmarp.h
++++ /dev/null
+@@ -1,41 +0,0 @@
+-/* atmarp.h - ATM ARP protocol and kernel-demon interface definitions */
+- 
+-/* Written 1995-1999 by Werner Almesberger, EPFL LRC/ICA */
+- 
+-
+-#ifndef _LINUX_ATMARP_H
+-#define _LINUX_ATMARP_H
+-
+-#include <linux/types.h>
+-#include <linux/atmapi.h>
+-#include <linux/atmioc.h>
+-
+-
+-#define ATMARP_RETRY_DELAY 30		/* request next resolution or forget
+-					   NAK after 30 sec - should go into
+-					   atmclip.h */
+-#define ATMARP_MAX_UNRES_PACKETS 5	/* queue that many packets while
+-					   waiting for the resolver */
+-
+-
+-#define ATMARPD_CTRL	_IO('a',ATMIOC_CLIP+1)	/* become atmarpd ctrl sock */
+-#define ATMARP_MKIP	_IO('a',ATMIOC_CLIP+2)	/* attach socket to IP */
+-#define ATMARP_SETENTRY	_IO('a',ATMIOC_CLIP+3)	/* fill or hide ARP entry */
+-#define ATMARP_ENCAP	_IO('a',ATMIOC_CLIP+5)	/* change encapsulation */
+-
+-
+-enum atmarp_ctrl_type {
+-	act_invalid,		/* catch uninitialized structures */
+-	act_need,		/* need address resolution */
+-	act_up,			/* interface is coming up */
+-	act_down,		/* interface is going down */
+-	act_change		/* interface configuration has changed */
+-};
+-
+-struct atmarp_ctrl {
+-	enum atmarp_ctrl_type	type;	/* message type */
+-	int			itf_num;/* interface number (if present) */
+-	__be32			ip;	/* IP address (act_need only) */
+-};
+-
+-#endif
+diff --git a/include/linux/atmdev.h b/include/linux/atmdev.h
+deleted file mode 100644
+index 8faa8b9..0000000
+--- a/include/linux/atmdev.h
++++ /dev/null
+@@ -1,215 +0,0 @@
+-/* atmdev.h - ATM device driver declarations and various related items */
+- 
+-/* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
+- 
+-
+-#ifndef LINUX_ATMDEV_H
+-#define LINUX_ATMDEV_H
+-
+-
+-#include <linux/atmapi.h>
+-#include <linux/atm.h>
+-#include <linux/atmioc.h>
+-
+-
+-#define ESI_LEN		6
+-
+-#define ATM_OC3_PCR	(155520000/270*260/8/53)
+-			/* OC3 link rate:  155520000 bps
+-			   SONET overhead: /270*260 (9 section, 1 path)
+-			   bits per cell:  /8/53
+-			   max cell rate:  353207.547 cells/sec */
+-#define ATM_25_PCR	((25600000/8-8000)/54)
+-			/* 25 Mbps ATM cell rate (59111) */
+-#define ATM_OC12_PCR	(622080000/1080*1040/8/53)
+-			/* OC12 link rate: 622080000 bps
+-			   SONET overhead: /1080*1040
+-			   bits per cell:  /8/53
+-			   max cell rate:  1412830.188 cells/sec */
+-#define ATM_DS3_PCR	(8000*12)
+-			/* DS3: 12 cells in a 125 usec time slot */
+-
+-
+-#define __AAL_STAT_ITEMS \
+-    __HANDLE_ITEM(tx);			/* TX okay */ \
+-    __HANDLE_ITEM(tx_err);		/* TX errors */ \
+-    __HANDLE_ITEM(rx);			/* RX okay */ \
+-    __HANDLE_ITEM(rx_err);		/* RX errors */ \
+-    __HANDLE_ITEM(rx_drop);		/* RX out of memory */
+-
+-struct atm_aal_stats {
+-#define __HANDLE_ITEM(i) int i
+-	__AAL_STAT_ITEMS
+-#undef __HANDLE_ITEM
+-};
+-
+-
+-struct atm_dev_stats {
+-	struct atm_aal_stats aal0;
+-	struct atm_aal_stats aal34;
+-	struct atm_aal_stats aal5;
+-} __ATM_API_ALIGN;
+-
+-
+-#define ATM_GETLINKRATE	_IOW('a',ATMIOC_ITF+1,struct atmif_sioc)
+-					/* get link rate */
+-#define ATM_GETNAMES	_IOW('a',ATMIOC_ITF+3,struct atm_iobuf)
+-					/* get interface names (numbers) */
+-#define ATM_GETTYPE	_IOW('a',ATMIOC_ITF+4,struct atmif_sioc)
+-					/* get interface type name */
+-#define ATM_GETESI	_IOW('a',ATMIOC_ITF+5,struct atmif_sioc)
+-					/* get interface ESI */
+-#define ATM_GETADDR	_IOW('a',ATMIOC_ITF+6,struct atmif_sioc)
+-					/* get itf's local ATM addr. list */
+-#define ATM_RSTADDR	_IOW('a',ATMIOC_ITF+7,struct atmif_sioc)
+-					/* reset itf's ATM address list */
+-#define ATM_ADDADDR	_IOW('a',ATMIOC_ITF+8,struct atmif_sioc)
+-					/* add a local ATM address */
+-#define ATM_DELADDR	_IOW('a',ATMIOC_ITF+9,struct atmif_sioc)
+-					/* remove a local ATM address */
+-#define ATM_GETCIRANGE	_IOW('a',ATMIOC_ITF+10,struct atmif_sioc)
+-					/* get connection identifier range */
+-#define ATM_SETCIRANGE	_IOW('a',ATMIOC_ITF+11,struct atmif_sioc)
+-					/* set connection identifier range */
+-#define ATM_SETESI	_IOW('a',ATMIOC_ITF+12,struct atmif_sioc)
+-					/* set interface ESI */
+-#define ATM_SETESIF	_IOW('a',ATMIOC_ITF+13,struct atmif_sioc)
+-					/* force interface ESI */
+-#define ATM_ADDLECSADDR	_IOW('a', ATMIOC_ITF+14, struct atmif_sioc)
+-					/* register a LECS address */
+-#define ATM_DELLECSADDR	_IOW('a', ATMIOC_ITF+15, struct atmif_sioc)
+-					/* unregister a LECS address */
+-#define ATM_GETLECSADDR	_IOW('a', ATMIOC_ITF+16, struct atmif_sioc)
+-					/* retrieve LECS address(es) */
+-
+-#define ATM_GETSTAT	_IOW('a',ATMIOC_SARCOM+0,struct atmif_sioc)
+-					/* get AAL layer statistics */
+-#define ATM_GETSTATZ	_IOW('a',ATMIOC_SARCOM+1,struct atmif_sioc)
+-					/* get AAL layer statistics and zero */
+-#define ATM_GETLOOP	_IOW('a',ATMIOC_SARCOM+2,struct atmif_sioc)
+-					/* get loopback mode */
+-#define ATM_SETLOOP	_IOW('a',ATMIOC_SARCOM+3,struct atmif_sioc)
+-					/* set loopback mode */
+-#define ATM_QUERYLOOP	_IOW('a',ATMIOC_SARCOM+4,struct atmif_sioc)
+-					/* query supported loopback modes */
+-#define ATM_SETSC	_IOW('a',ATMIOC_SPECIAL+1,int)
+-					/* enable or disable single-copy */
+-#define ATM_SETBACKEND	_IOW('a',ATMIOC_SPECIAL+2,atm_backend_t)
+-					/* set backend handler */
+-#define ATM_NEWBACKENDIF _IOW('a',ATMIOC_SPECIAL+3,atm_backend_t)
+-					/* use backend to make new if */
+-#define ATM_ADDPARTY  	_IOW('a', ATMIOC_SPECIAL+4,struct atm_iobuf)
+- 					/* add party to p2mp call */
+-#ifdef CONFIG_COMPAT
+-/* It actually takes struct sockaddr_atmsvc, not struct atm_iobuf */
+-#define COMPAT_ATM_ADDPARTY  	_IOW('a', ATMIOC_SPECIAL+4,struct compat_atm_iobuf)
+-#endif
+-#define ATM_DROPPARTY 	_IOW('a', ATMIOC_SPECIAL+5,int)
+-					/* drop party from p2mp call */
+-
+-/*
+- * These are backend handkers that can be set via the ATM_SETBACKEND call
+- * above.  In the future we may support dynamic loading of these - for now,
+- * they're just being used to share the ATMIOC_BACKEND ioctls
+- */
+-#define ATM_BACKEND_RAW		0	
+-#define ATM_BACKEND_PPP		1	/* PPPoATM - RFC2364 */
+-#define ATM_BACKEND_BR2684	2	/* Bridged RFC1483/2684 */
+-
+-/* for ATM_GETTYPE */
+-#define ATM_ITFTYP_LEN	8	/* maximum length of interface type name */
+-
+-/*
+- * Loopback modes for ATM_{PHY,SAR}_{GET,SET}LOOP
+- */
+-
+-/* Point of loopback				CPU-->SAR-->PHY-->line--> ... */
+-#define __ATM_LM_NONE	0	/* no loop back     ^     ^     ^      ^      */
+-#define __ATM_LM_AAL	1	/* loop back PDUs --'     |     |      |      */
+-#define __ATM_LM_ATM	2	/* loop back ATM cells ---'     |      |      */
+-/* RESERVED		4	loop back on PHY side  ---'		      */
+-#define __ATM_LM_PHY	8	/* loop back bits (digital) ----'      |      */
+-#define __ATM_LM_ANALOG 16	/* loop back the analog signal --------'      */
+-
+-/* Direction of loopback */
+-#define __ATM_LM_MKLOC(n)	((n))	    /* Local (i.e. loop TX to RX) */
+-#define __ATM_LM_MKRMT(n)	((n) << 8)  /* Remote (i.e. loop RX to TX) */
+-
+-#define __ATM_LM_XTLOC(n)	((n) & 0xff)
+-#define __ATM_LM_XTRMT(n)	(((n) >> 8) & 0xff)
+-
+-#define ATM_LM_NONE	0	/* no loopback */
+-
+-#define ATM_LM_LOC_AAL	__ATM_LM_MKLOC(__ATM_LM_AAL)
+-#define ATM_LM_LOC_ATM	__ATM_LM_MKLOC(__ATM_LM_ATM)
+-#define ATM_LM_LOC_PHY	__ATM_LM_MKLOC(__ATM_LM_PHY)
+-#define ATM_LM_LOC_ANALOG __ATM_LM_MKLOC(__ATM_LM_ANALOG)
+-
+-#define ATM_LM_RMT_AAL	__ATM_LM_MKRMT(__ATM_LM_AAL)
+-#define ATM_LM_RMT_ATM	__ATM_LM_MKRMT(__ATM_LM_ATM)
+-#define ATM_LM_RMT_PHY	__ATM_LM_MKRMT(__ATM_LM_PHY)
+-#define ATM_LM_RMT_ANALOG __ATM_LM_MKRMT(__ATM_LM_ANALOG)
+-
+-/*
+- * Note: ATM_LM_LOC_* and ATM_LM_RMT_* can be combined, provided that
+- * __ATM_LM_XTLOC(x) <= __ATM_LM_XTRMT(x)
+- */
+-
+-
+-struct atm_iobuf {
+-	int length;
+-	void *buffer;
+-};
+-
+-/* for ATM_GETCIRANGE / ATM_SETCIRANGE */
+-
+-#define ATM_CI_MAX      -1              /* use maximum range of VPI/VCI */
+- 
+-struct atm_cirange {
+-	signed char	vpi_bits;	/* 1..8, ATM_CI_MAX (-1) for maximum */
+-	signed char	vci_bits;	/* 1..16, ATM_CI_MAX (-1) for maximum */
+-};
+-
+-/* for ATM_SETSC; actually taken from the ATM_VF number space */
+-
+-#define ATM_SC_RX	1024		/* enable RX single-copy */
+-#define ATM_SC_TX	2048		/* enable TX single-copy */
+-
+-#define ATM_BACKLOG_DEFAULT 32 /* if we get more, we're likely to time out
+-				  anyway */
+-
+-/* MF: change_qos (Modify) flags */
+-
+-#define ATM_MF_IMMED	 1	/* Block until change is effective */
+-#define ATM_MF_INC_RSV	 2	/* Change reservation on increase */
+-#define ATM_MF_INC_SHP	 4	/* Change shaping on increase */
+-#define ATM_MF_DEC_RSV	 8	/* Change reservation on decrease */
+-#define ATM_MF_DEC_SHP	16	/* Change shaping on decrease */
+-#define ATM_MF_BWD	32	/* Set the backward direction parameters */
+-
+-#define ATM_MF_SET	(ATM_MF_INC_RSV | ATM_MF_INC_SHP | ATM_MF_DEC_RSV | \
+-			  ATM_MF_DEC_SHP | ATM_MF_BWD)
+-
+-/*
+- * ATM_VS_* are used to express VC state in a human-friendly way.
+- */
+-
+-#define ATM_VS_IDLE	0	/* VC is not used */
+-#define ATM_VS_CONNECTED 1	/* VC is connected */
+-#define ATM_VS_CLOSING	2	/* VC is closing */
+-#define ATM_VS_LISTEN	3	/* VC is listening for incoming setups */
+-#define ATM_VS_INUSE	4	/* VC is in use (registered with atmsigd) */
+-#define ATM_VS_BOUND	5	/* VC is bound */
+-
+-#define ATM_VS2TXT_MAP \
+-    "IDLE", "CONNECTED", "CLOSING", "LISTEN", "INUSE", "BOUND"
+-
+-#define ATM_VF2TXT_MAP \
+-    "ADDR",	"READY",	"PARTIAL",	"REGIS", \
+-    "RELEASED", "HASQOS",	"LISTEN",	"META", \
+-    "256",	"512",		"1024",		"2048", \
+-    "SESSION",	"HASSAP",	"BOUND",	"CLOSE"
+-
+-
+-
+-#endif /* LINUX_ATMDEV_H */
+diff --git a/include/linux/atmioc.h b/include/linux/atmioc.h
+deleted file mode 100644
+index 37f67aa..0000000
+--- a/include/linux/atmioc.h
++++ /dev/null
+@@ -1,41 +0,0 @@
+-/* atmioc.h - ranges for ATM-related ioctl numbers */
+- 
+-/* Written 1995-1999 by Werner Almesberger, EPFL LRC/ICA */
+-
+-
+-/*
+- * See http://icawww1.epfl.ch/linux-atm/magic.html for the complete list of
+- * "magic" ioctl numbers.
+- */
+-
+-
+-#ifndef _LINUX_ATMIOC_H
+-#define _LINUX_ATMIOC_H
+-
+-#include <asm/ioctl.h>
+-		/* everybody including atmioc.h will also need _IO{,R,W,WR} */
+-
+-#define ATMIOC_PHYCOM	  0x00 /* PHY device common ioctls, globally unique */
+-#define ATMIOC_PHYCOM_END 0x0f
+-#define ATMIOC_PHYTYP	  0x10 /* PHY dev type ioctls, unique per PHY type */
+-#define ATMIOC_PHYTYP_END 0x2f
+-#define ATMIOC_PHYPRV	  0x30 /* PHY dev private ioctls, unique per driver */
+-#define ATMIOC_PHYPRV_END 0x4f
+-#define ATMIOC_SARCOM	  0x50 /* SAR device common ioctls, globally unique */
+-#define ATMIOC_SARCOM_END 0x50
+-#define ATMIOC_SARPRV	  0x60 /* SAR dev private ioctls, unique per driver */
+-#define ATMIOC_SARPRV_END 0x7f
+-#define ATMIOC_ITF	  0x80 /* Interface ioctls, globally unique */
+-#define ATMIOC_ITF_END	  0x8f
+-#define ATMIOC_BACKEND	  0x90 /* ATM generic backend ioctls, u. per backend */
+-#define ATMIOC_BACKEND_END 0xaf
+-/* 0xb0-0xbf: Reserved for future use */
+-#define ATMIOC_AREQUIPA	  0xc0 /* Application requested IP over ATM, glob. u. */
+-#define ATMIOC_LANE	  0xd0 /* LAN Emulation, globally unique */
+-#define ATMIOC_MPOA       0xd8 /* MPOA, globally unique */
+-#define	ATMIOC_CLIP	  0xe0 /* Classical IP over ATM control, globally u. */
+-#define	ATMIOC_CLIP_END	  0xef
+-#define	ATMIOC_SPECIAL	  0xf0 /* Special-purpose controls, globally unique */
+-#define	ATMIOC_SPECIAL_END 0xff
+-
+-#endif
+diff --git a/include/linux/atmsap.h b/include/linux/atmsap.h
+deleted file mode 100644
+index 799b104..0000000
+--- a/include/linux/atmsap.h
++++ /dev/null
+@@ -1,162 +0,0 @@
+-/* atmsap.h - ATM Service Access Point addressing definitions */
+-
+-/* Written 1995-1999 by Werner Almesberger, EPFL LRC/ICA */
+-
+-
+-#ifndef _LINUX_ATMSAP_H
+-#define _LINUX_ATMSAP_H
+-
+-#include <linux/atmapi.h>
+-
+-/*
+- * BEGIN_xx and END_xx markers are used for automatic generation of
+- * documentation. Do not change them.
+- */
+-
+-
+-/*
+- * Layer 2 protocol identifiers
+- */
+-
+-/* BEGIN_L2 */
+-#define ATM_L2_NONE	0	/* L2 not specified */
+-#define ATM_L2_ISO1745  0x01	/* Basic mode ISO 1745 */
+-#define ATM_L2_Q291	0x02	/* ITU-T Q.291 (Rec. I.441) */
+-#define ATM_L2_X25_LL	0x06	/* ITU-T X.25, link layer */
+-#define ATM_L2_X25_ML	0x07	/* ITU-T X.25, multilink */
+-#define ATM_L2_LAPB	0x08	/* Extended LAPB, half-duplex (Rec. T.71) */
+-#define ATM_L2_HDLC_ARM	0x09	/* HDLC ARM (ISO/IEC 4335) */
+-#define ATM_L2_HDLC_NRM	0x0a	/* HDLC NRM (ISO/IEC 4335) */
+-#define ATM_L2_HDLC_ABM	0x0b	/* HDLC ABM (ISO/IEC 4335) */
+-#define ATM_L2_ISO8802	0x0c	/* LAN LLC (ISO/IEC 8802/2) */
+-#define ATM_L2_X75	0x0d	/* ITU-T X.75, SLP */
+-#define ATM_L2_Q922	0x0e	/* ITU-T Q.922 */
+-#define ATM_L2_USER	0x10	/* user-specified */
+-#define ATM_L2_ISO7776	0x11	/* ISO 7776 DTE-DTE */
+-/* END_L2 */
+-
+-
+-/*
+- * Layer 3 protocol identifiers
+- */
+-
+-/* BEGIN_L3 */
+-#define ATM_L3_NONE	0	/* L3 not specified */
+-#define ATM_L3_X25	0x06	/* ITU-T X.25, packet layer */
+-#define ATM_L3_ISO8208	0x07	/* ISO/IEC 8208 */
+-#define ATM_L3_X223	0x08	/* ITU-T X.223 | ISO/IEC 8878 */
+-#define ATM_L3_ISO8473	0x09	/* ITU-T X.233 | ISO/IEC 8473 */
+-#define ATM_L3_T70	0x0a	/* ITU-T T.70 minimum network layer */
+-#define ATM_L3_TR9577	0x0b	/* ISO/IEC TR 9577 */
+-#define ATM_L3_H310	0x0c	/* ITU-T Recommendation H.310 */
+-#define ATM_L3_H321	0x0d	/* ITU-T Recommendation H.321 */
+-#define ATM_L3_USER	0x10	/* user-specified */
+-/* END_L3 */
+-
+-
+-/*
+- * High layer identifiers
+- */
+-
+-/* BEGIN_HL */
+-#define ATM_HL_NONE	0	/* HL not specified */
+-#define ATM_HL_ISO	0x01	/* ISO */
+-#define ATM_HL_USER	0x02	/* user-specific */
+-#define ATM_HL_HLP	0x03	/* high layer profile - UNI 3.0 only */
+-#define ATM_HL_VENDOR	0x04	/* vendor-specific application identifier */
+-/* END_HL */
+-
+-
+-/*
+- * ITU-T coded mode of operation
+- */
+-
+-/* BEGIN_IMD */
+-#define ATM_IMD_NONE	 0	/* mode not specified */
+-#define ATM_IMD_NORMAL	 1	/* normal mode of operation */
+-#define ATM_IMD_EXTENDED 2	/* extended mode of operation */
+-/* END_IMD */
+-
+-/*
+- * H.310 code points
+- */
+-
+-#define ATM_TT_NONE	0	/* terminal type not specified */
+-#define ATM_TT_RX	1	/* receive only */
+-#define ATM_TT_TX	2	/* send only */
+-#define ATM_TT_RXTX	3	/* receive and send */
+-
+-#define ATM_MC_NONE	0	/* no multiplexing */
+-#define ATM_MC_TS	1	/* transport stream (TS) */
+-#define ATM_MC_TS_FEC	2	/* transport stream with forward error corr. */
+-#define ATM_MC_PS	3	/* program stream (PS) */
+-#define ATM_MC_PS_FEC	4	/* program stream with forward error corr. */
+-#define ATM_MC_H221	5	/* ITU-T Rec. H.221 */
+-
+-/*
+- * SAP structures
+- */
+-
+-#define ATM_MAX_HLI	8	/* maximum high-layer information length */
+-
+-
+-struct atm_blli {
+-    unsigned char l2_proto;	/* layer 2 protocol */
+-    union {
+-	struct {
+-	    unsigned char mode;	/* mode of operation (ATM_IMD_xxx), 0 if */
+-				/* absent */
+-	    unsigned char window; /* window size (k), 1-127 (0 to omit) */
+-	} itu;			/* ITU-T encoding */
+-	unsigned char user;	/* user-specified l2 information */
+-    } l2;
+-    unsigned char l3_proto;	/* layer 3 protocol */
+-    union {
+-	struct {
+-	    unsigned char mode;	/* mode of operation (ATM_IMD_xxx), 0 if */
+-				/* absent */
+-	    unsigned char def_size; /* default packet size (log2), 4-12 (0 to */
+-				    /* omit) */
+-	    unsigned char window;/* packet window size, 1-127 (0 to omit) */
+-	} itu;			/* ITU-T encoding */
+-	unsigned char user;	/* user specified l3 information */
+-	struct {		      /* if l3_proto = ATM_L3_H310 */
+-	    unsigned char term_type;  /* terminal type */
+-	    unsigned char fw_mpx_cap; /* forward multiplexing capability */
+-				      /* only if term_type != ATM_TT_NONE */
+-	    unsigned char bw_mpx_cap; /* backward multiplexing capability */
+-				      /* only if term_type != ATM_TT_NONE */
+-	} h310;
+-	struct {		  /* if l3_proto = ATM_L3_TR9577 */
+-	    unsigned char ipi;	  /* initial protocol id */
+-	    unsigned char snap[5];/* IEEE 802.1 SNAP identifier */
+-				  /* (only if ipi == NLPID_IEEE802_1_SNAP) */
+-	} tr9577;
+-    } l3;
+-} __ATM_API_ALIGN;
+-
+-
+-struct atm_bhli {
+-    unsigned char hl_type;	/* high layer information type */
+-    unsigned char hl_length;	/* length (only if hl_type == ATM_HL_USER || */
+-				/* hl_type == ATM_HL_ISO) */
+-    unsigned char hl_info[ATM_MAX_HLI];/* high layer information */
+-};
+-
+-
+-#define ATM_MAX_BLLI	3		/* maximum number of BLLI elements */
+-
+-
+-struct atm_sap {
+-	struct atm_bhli bhli;		/* local SAP, high-layer information */
+-	struct atm_blli blli[ATM_MAX_BLLI] __ATM_API_ALIGN;
+-					/* local SAP, low-layer info */
+-};
+-
+-
+-static __inline__ int blli_in_use(struct atm_blli blli)
+-{
+-	return blli.l2_proto || blli.l3_proto;
+-}
+-
+-#endif
+diff --git a/include/linux/bpf.h b/include/linux/bpf.h
+deleted file mode 100644
+index 0895a52..0000000
+--- a/include/linux/bpf.h
++++ /dev/null
+@@ -1,867 +0,0 @@
+-/* Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com
+- *
+- * This program is free software; you can redistribute it and/or
+- * modify it under the terms of version 2 of the GNU General Public
+- * License as published by the Free Software Foundation.
+- */
+-#ifndef __LINUX_BPF_H__
+-#define __LINUX_BPF_H__
+-
+-#include <linux/types.h>
+-#include <linux/bpf_common.h>
+-
+-/* Extended instruction set based on top of classic BPF */
+-
+-/* instruction classes */
+-#define BPF_ALU64	0x07	/* alu mode in double word width */
+-
+-/* ld/ldx fields */
+-#define BPF_DW		0x18	/* double word */
+-#define BPF_XADD	0xc0	/* exclusive add */
+-
+-/* alu/jmp fields */
+-#define BPF_MOV		0xb0	/* mov reg to reg */
+-#define BPF_ARSH	0xc0	/* sign extending arithmetic shift right */
+-
+-/* change endianness of a register */
+-#define BPF_END		0xd0	/* flags for endianness conversion: */
+-#define BPF_TO_LE	0x00	/* convert to little-endian */
+-#define BPF_TO_BE	0x08	/* convert to big-endian */
+-#define BPF_FROM_LE	BPF_TO_LE
+-#define BPF_FROM_BE	BPF_TO_BE
+-
+-/* jmp encodings */
+-#define BPF_JNE		0x50	/* jump != */
+-#define BPF_JLT		0xa0	/* LT is unsigned, '<' */
+-#define BPF_JLE		0xb0	/* LE is unsigned, '<=' */
+-#define BPF_JSGT	0x60	/* SGT is signed '>', GT in x86 */
+-#define BPF_JSGE	0x70	/* SGE is signed '>=', GE in x86 */
+-#define BPF_JSLT	0xc0	/* SLT is signed, '<' */
+-#define BPF_JSLE	0xd0	/* SLE is signed, '<=' */
+-#define BPF_CALL	0x80	/* function call */
+-#define BPF_EXIT	0x90	/* function return */
+-
+-/* Register numbers */
+-enum {
+-	BPF_REG_0 = 0,
+-	BPF_REG_1,
+-	BPF_REG_2,
+-	BPF_REG_3,
+-	BPF_REG_4,
+-	BPF_REG_5,
+-	BPF_REG_6,
+-	BPF_REG_7,
+-	BPF_REG_8,
+-	BPF_REG_9,
+-	BPF_REG_10,
+-	__MAX_BPF_REG,
+-};
+-
+-/* BPF has 10 general purpose 64-bit registers and stack frame. */
+-#define MAX_BPF_REG	__MAX_BPF_REG
+-
+-struct bpf_insn {
+-	__u8	code;		/* opcode */
+-	__u8	dst_reg:4;	/* dest register */
+-	__u8	src_reg:4;	/* source register */
+-	__s16	off;		/* signed offset */
+-	__s32	imm;		/* signed immediate constant */
+-};
+-
+-/* Key of an a BPF_MAP_TYPE_LPM_TRIE entry */
+-struct bpf_lpm_trie_key {
+-	__u32	prefixlen;	/* up to 32 for AF_INET, 128 for AF_INET6 */
+-	__u8	data[0];	/* Arbitrary size */
+-};
+-
+-/* BPF syscall commands, see bpf(2) man-page for details. */
+-enum bpf_cmd {
+-	BPF_MAP_CREATE,
+-	BPF_MAP_LOOKUP_ELEM,
+-	BPF_MAP_UPDATE_ELEM,
+-	BPF_MAP_DELETE_ELEM,
+-	BPF_MAP_GET_NEXT_KEY,
+-	BPF_PROG_LOAD,
+-	BPF_OBJ_PIN,
+-	BPF_OBJ_GET,
+-	BPF_PROG_ATTACH,
+-	BPF_PROG_DETACH,
+-	BPF_PROG_TEST_RUN,
+-	BPF_PROG_GET_NEXT_ID,
+-	BPF_MAP_GET_NEXT_ID,
+-	BPF_PROG_GET_FD_BY_ID,
+-	BPF_MAP_GET_FD_BY_ID,
+-	BPF_OBJ_GET_INFO_BY_FD,
+-};
+-
+-enum bpf_map_type {
+-	BPF_MAP_TYPE_UNSPEC,
+-	BPF_MAP_TYPE_HASH,
+-	BPF_MAP_TYPE_ARRAY,
+-	BPF_MAP_TYPE_PROG_ARRAY,
+-	BPF_MAP_TYPE_PERF_EVENT_ARRAY,
+-	BPF_MAP_TYPE_PERCPU_HASH,
+-	BPF_MAP_TYPE_PERCPU_ARRAY,
+-	BPF_MAP_TYPE_STACK_TRACE,
+-	BPF_MAP_TYPE_CGROUP_ARRAY,
+-	BPF_MAP_TYPE_LRU_HASH,
+-	BPF_MAP_TYPE_LRU_PERCPU_HASH,
+-	BPF_MAP_TYPE_LPM_TRIE,
+-	BPF_MAP_TYPE_ARRAY_OF_MAPS,
+-	BPF_MAP_TYPE_HASH_OF_MAPS,
+-	BPF_MAP_TYPE_DEVMAP,
+-	BPF_MAP_TYPE_SOCKMAP,
+-};
+-
+-enum bpf_prog_type {
+-	BPF_PROG_TYPE_UNSPEC,
+-	BPF_PROG_TYPE_SOCKET_FILTER,
+-	BPF_PROG_TYPE_KPROBE,
+-	BPF_PROG_TYPE_SCHED_CLS,
+-	BPF_PROG_TYPE_SCHED_ACT,
+-	BPF_PROG_TYPE_TRACEPOINT,
+-	BPF_PROG_TYPE_XDP,
+-	BPF_PROG_TYPE_PERF_EVENT,
+-	BPF_PROG_TYPE_CGROUP_SKB,
+-	BPF_PROG_TYPE_CGROUP_SOCK,
+-	BPF_PROG_TYPE_LWT_IN,
+-	BPF_PROG_TYPE_LWT_OUT,
+-	BPF_PROG_TYPE_LWT_XMIT,
+-	BPF_PROG_TYPE_SOCK_OPS,
+-	BPF_PROG_TYPE_SK_SKB,
+-};
+-
+-enum bpf_attach_type {
+-	BPF_CGROUP_INET_INGRESS,
+-	BPF_CGROUP_INET_EGRESS,
+-	BPF_CGROUP_INET_SOCK_CREATE,
+-	BPF_CGROUP_SOCK_OPS,
+-	BPF_SK_SKB_STREAM_PARSER,
+-	BPF_SK_SKB_STREAM_VERDICT,
+-	__MAX_BPF_ATTACH_TYPE
+-};
+-
+-#define MAX_BPF_ATTACH_TYPE __MAX_BPF_ATTACH_TYPE
+-
+-/* If BPF_F_ALLOW_OVERRIDE flag is used in BPF_PROG_ATTACH command
+- * to the given target_fd cgroup the descendent cgroup will be able to
+- * override effective bpf program that was inherited from this cgroup
+- */
+-#define BPF_F_ALLOW_OVERRIDE	(1U << 0)
+-
+-/* If BPF_F_STRICT_ALIGNMENT is used in BPF_PROG_LOAD command, the
+- * verifier will perform strict alignment checking as if the kernel
+- * has been built with CONFIG_EFFICIENT_UNALIGNED_ACCESS not set,
+- * and NET_IP_ALIGN defined to 2.
+- */
+-#define BPF_F_STRICT_ALIGNMENT	(1U << 0)
+-
+-#define BPF_PSEUDO_MAP_FD	1
+-
+-/* flags for BPF_MAP_UPDATE_ELEM command */
+-#define BPF_ANY		0 /* create new element or update existing */
+-#define BPF_NOEXIST	1 /* create new element if it didn't exist */
+-#define BPF_EXIST	2 /* update existing element */
+-
+-/* flags for BPF_MAP_CREATE command */
+-#define BPF_F_NO_PREALLOC	(1U << 0)
+-/* Instead of having one common LRU list in the
+- * BPF_MAP_TYPE_LRU_[PERCPU_]HASH map, use a percpu LRU list
+- * which can scale and perform better.
+- * Note, the LRU nodes (including free nodes) cannot be moved
+- * across different LRU lists.
+- */
+-#define BPF_F_NO_COMMON_LRU	(1U << 1)
+-/* Specify numa node during map creation */
+-#define BPF_F_NUMA_NODE		(1U << 2)
+-
+-union bpf_attr {
+-	struct { /* anonymous struct used by BPF_MAP_CREATE command */
+-		__u32	map_type;	/* one of enum bpf_map_type */
+-		__u32	key_size;	/* size of key in bytes */
+-		__u32	value_size;	/* size of value in bytes */
+-		__u32	max_entries;	/* max number of entries in a map */
+-		__u32	map_flags;	/* BPF_MAP_CREATE related
+-					 * flags defined above.
+-					 */
+-		__u32	inner_map_fd;	/* fd pointing to the inner map */
+-		__u32	numa_node;	/* numa node (effective only if
+-					 * BPF_F_NUMA_NODE is set).
+-					 */
+-	};
+-
+-	struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */
+-		__u32		map_fd;
+-		__aligned_u64	key;
+-		union {
+-			__aligned_u64 value;
+-			__aligned_u64 next_key;
+-		};
+-		__u64		flags;
+-	};
+-
+-	struct { /* anonymous struct used by BPF_PROG_LOAD command */
+-		__u32		prog_type;	/* one of enum bpf_prog_type */
+-		__u32		insn_cnt;
+-		__aligned_u64	insns;
+-		__aligned_u64	license;
+-		__u32		log_level;	/* verbosity level of verifier */
+-		__u32		log_size;	/* size of user buffer */
+-		__aligned_u64	log_buf;	/* user supplied buffer */
+-		__u32		kern_version;	/* checked when prog_type=kprobe */
+-		__u32		prog_flags;
+-	};
+-
+-	struct { /* anonymous struct used by BPF_OBJ_* commands */
+-		__aligned_u64	pathname;
+-		__u32		bpf_fd;
+-	};
+-
+-	struct { /* anonymous struct used by BPF_PROG_ATTACH/DETACH commands */
+-		__u32		target_fd;	/* container object to attach to */
+-		__u32		attach_bpf_fd;	/* eBPF program to attach */
+-		__u32		attach_type;
+-		__u32		attach_flags;
+-	};
+-
+-	struct { /* anonymous struct used by BPF_PROG_TEST_RUN command */
+-		__u32		prog_fd;
+-		__u32		retval;
+-		__u32		data_size_in;
+-		__u32		data_size_out;
+-		__aligned_u64	data_in;
+-		__aligned_u64	data_out;
+-		__u32		repeat;
+-		__u32		duration;
+-	} test;
+-
+-	struct { /* anonymous struct used by BPF_*_GET_*_ID */
+-		union {
+-			__u32		start_id;
+-			__u32		prog_id;
+-			__u32		map_id;
+-		};
+-		__u32		next_id;
+-	};
+-
+-	struct { /* anonymous struct used by BPF_OBJ_GET_INFO_BY_FD */
+-		__u32		bpf_fd;
+-		__u32		info_len;
+-		__aligned_u64	info;
+-	} info;
+-} __attribute__((aligned(8)));
+-
+-/* BPF helper function descriptions:
+- *
+- * void *bpf_map_lookup_elem(&map, &key)
+- *     Return: Map value or NULL
+- *
+- * int bpf_map_update_elem(&map, &key, &value, flags)
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_map_delete_elem(&map, &key)
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_probe_read(void *dst, int size, void *src)
+- *     Return: 0 on success or negative error
+- *
+- * u64 bpf_ktime_get_ns(void)
+- *     Return: current ktime
+- *
+- * int bpf_trace_printk(const char *fmt, int fmt_size, ...)
+- *     Return: length of buffer written or negative error
+- *
+- * u32 bpf_prandom_u32(void)
+- *     Return: random value
+- *
+- * u32 bpf_raw_smp_processor_id(void)
+- *     Return: SMP processor ID
+- *
+- * int bpf_skb_store_bytes(skb, offset, from, len, flags)
+- *     store bytes into packet
+- *     @skb: pointer to skb
+- *     @offset: offset within packet from skb->mac_header
+- *     @from: pointer where to copy bytes from
+- *     @len: number of bytes to store into packet
+- *     @flags: bit 0 - if true, recompute skb->csum
+- *             other bits - reserved
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_l3_csum_replace(skb, offset, from, to, flags)
+- *     recompute IP checksum
+- *     @skb: pointer to skb
+- *     @offset: offset within packet where IP checksum is located
+- *     @from: old value of header field
+- *     @to: new value of header field
+- *     @flags: bits 0-3 - size of header field
+- *             other bits - reserved
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_l4_csum_replace(skb, offset, from, to, flags)
+- *     recompute TCP/UDP checksum
+- *     @skb: pointer to skb
+- *     @offset: offset within packet where TCP/UDP checksum is located
+- *     @from: old value of header field
+- *     @to: new value of header field
+- *     @flags: bits 0-3 - size of header field
+- *             bit 4 - is pseudo header
+- *             other bits - reserved
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_tail_call(ctx, prog_array_map, index)
+- *     jump into another BPF program
+- *     @ctx: context pointer passed to next program
+- *     @prog_array_map: pointer to map which type is BPF_MAP_TYPE_PROG_ARRAY
+- *     @index: index inside array that selects specific program to run
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_clone_redirect(skb, ifindex, flags)
+- *     redirect to another netdev
+- *     @skb: pointer to skb
+- *     @ifindex: ifindex of the net device
+- *     @flags: bit 0 - if set, redirect to ingress instead of egress
+- *             other bits - reserved
+- *     Return: 0 on success or negative error
+- *
+- * u64 bpf_get_current_pid_tgid(void)
+- *     Return: current->tgid << 32 | current->pid
+- *
+- * u64 bpf_get_current_uid_gid(void)
+- *     Return: current_gid << 32 | current_uid
+- *
+- * int bpf_get_current_comm(char *buf, int size_of_buf)
+- *     stores current->comm into buf
+- *     Return: 0 on success or negative error
+- *
+- * u32 bpf_get_cgroup_classid(skb)
+- *     retrieve a proc's classid
+- *     @skb: pointer to skb
+- *     Return: classid if != 0
+- *
+- * int bpf_skb_vlan_push(skb, vlan_proto, vlan_tci)
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_skb_vlan_pop(skb)
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_skb_get_tunnel_key(skb, key, size, flags)
+- * int bpf_skb_set_tunnel_key(skb, key, size, flags)
+- *     retrieve or populate tunnel metadata
+- *     @skb: pointer to skb
+- *     @key: pointer to 'struct bpf_tunnel_key'
+- *     @size: size of 'struct bpf_tunnel_key'
+- *     @flags: room for future extensions
+- *     Return: 0 on success or negative error
+- *
+- * u64 bpf_perf_event_read(map, flags)
+- *     read perf event counter value
+- *     @map: pointer to perf_event_array map
+- *     @flags: index of event in the map or bitmask flags
+- *     Return: value of perf event counter read or error code
+- *
+- * int bpf_redirect(ifindex, flags)
+- *     redirect to another netdev
+- *     @ifindex: ifindex of the net device
+- *     @flags:
+- *	  cls_bpf:
+- *          bit 0 - if set, redirect to ingress instead of egress
+- *          other bits - reserved
+- *	  xdp_bpf:
+- *	    all bits - reserved
+- *     Return: cls_bpf: TC_ACT_REDIRECT on success or TC_ACT_SHOT on error
+- *	       xdp_bfp: XDP_REDIRECT on success or XDP_ABORT on error
+- * int bpf_redirect_map(map, key, flags)
+- *     redirect to endpoint in map
+- *     @map: pointer to dev map
+- *     @key: index in map to lookup
+- *     @flags: --
+- *     Return: XDP_REDIRECT on success or XDP_ABORT on error
+- *
+- * u32 bpf_get_route_realm(skb)
+- *     retrieve a dst's tclassid
+- *     @skb: pointer to skb
+- *     Return: realm if != 0
+- *
+- * int bpf_perf_event_output(ctx, map, flags, data, size)
+- *     output perf raw sample
+- *     @ctx: struct pt_regs*
+- *     @map: pointer to perf_event_array map
+- *     @flags: index of event in the map or bitmask flags
+- *     @data: data on stack to be output as raw data
+- *     @size: size of data
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_get_stackid(ctx, map, flags)
+- *     walk user or kernel stack and return id
+- *     @ctx: struct pt_regs*
+- *     @map: pointer to stack_trace map
+- *     @flags: bits 0-7 - numer of stack frames to skip
+- *             bit 8 - collect user stack instead of kernel
+- *             bit 9 - compare stacks by hash only
+- *             bit 10 - if two different stacks hash into the same stackid
+- *                      discard old
+- *             other bits - reserved
+- *     Return: >= 0 stackid on success or negative error
+- *
+- * s64 bpf_csum_diff(from, from_size, to, to_size, seed)
+- *     calculate csum diff
+- *     @from: raw from buffer
+- *     @from_size: length of from buffer
+- *     @to: raw to buffer
+- *     @to_size: length of to buffer
+- *     @seed: optional seed
+- *     Return: csum result or negative error code
+- *
+- * int bpf_skb_get_tunnel_opt(skb, opt, size)
+- *     retrieve tunnel options metadata
+- *     @skb: pointer to skb
+- *     @opt: pointer to raw tunnel option data
+- *     @size: size of @opt
+- *     Return: option size
+- *
+- * int bpf_skb_set_tunnel_opt(skb, opt, size)
+- *     populate tunnel options metadata
+- *     @skb: pointer to skb
+- *     @opt: pointer to raw tunnel option data
+- *     @size: size of @opt
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_skb_change_proto(skb, proto, flags)
+- *     Change protocol of the skb. Currently supported is v4 -> v6,
+- *     v6 -> v4 transitions. The helper will also resize the skb. eBPF
+- *     program is expected to fill the new headers via skb_store_bytes
+- *     and lX_csum_replace.
+- *     @skb: pointer to skb
+- *     @proto: new skb->protocol type
+- *     @flags: reserved
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_skb_change_type(skb, type)
+- *     Change packet type of skb.
+- *     @skb: pointer to skb
+- *     @type: new skb->pkt_type type
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_skb_under_cgroup(skb, map, index)
+- *     Check cgroup2 membership of skb
+- *     @skb: pointer to skb
+- *     @map: pointer to bpf_map in BPF_MAP_TYPE_CGROUP_ARRAY type
+- *     @index: index of the cgroup in the bpf_map
+- *     Return:
+- *       == 0 skb failed the cgroup2 descendant test
+- *       == 1 skb succeeded the cgroup2 descendant test
+- *        < 0 error
+- *
+- * u32 bpf_get_hash_recalc(skb)
+- *     Retrieve and possibly recalculate skb->hash.
+- *     @skb: pointer to skb
+- *     Return: hash
+- *
+- * u64 bpf_get_current_task(void)
+- *     Returns current task_struct
+- *     Return: current
+- *
+- * int bpf_probe_write_user(void *dst, void *src, int len)
+- *     safely attempt to write to a location
+- *     @dst: destination address in userspace
+- *     @src: source address on stack
+- *     @len: number of bytes to copy
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_current_task_under_cgroup(map, index)
+- *     Check cgroup2 membership of current task
+- *     @map: pointer to bpf_map in BPF_MAP_TYPE_CGROUP_ARRAY type
+- *     @index: index of the cgroup in the bpf_map
+- *     Return:
+- *       == 0 current failed the cgroup2 descendant test
+- *       == 1 current succeeded the cgroup2 descendant test
+- *        < 0 error
+- *
+- * int bpf_skb_change_tail(skb, len, flags)
+- *     The helper will resize the skb to the given new size, to be used f.e.
+- *     with control messages.
+- *     @skb: pointer to skb
+- *     @len: new skb length
+- *     @flags: reserved
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_skb_pull_data(skb, len)
+- *     The helper will pull in non-linear data in case the skb is non-linear
+- *     and not all of len are part of the linear section. Only needed for
+- *     read/write with direct packet access.
+- *     @skb: pointer to skb
+- *     @len: len to make read/writeable
+- *     Return: 0 on success or negative error
+- *
+- * s64 bpf_csum_update(skb, csum)
+- *     Adds csum into skb->csum in case of CHECKSUM_COMPLETE.
+- *     @skb: pointer to skb
+- *     @csum: csum to add
+- *     Return: csum on success or negative error
+- *
+- * void bpf_set_hash_invalid(skb)
+- *     Invalidate current skb->hash.
+- *     @skb: pointer to skb
+- *
+- * int bpf_get_numa_node_id()
+- *     Return: Id of current NUMA node.
+- *
+- * int bpf_skb_change_head()
+- *     Grows headroom of skb and adjusts MAC header offset accordingly.
+- *     Will extends/reallocae as required automatically.
+- *     May change skb data pointer and will thus invalidate any check
+- *     performed for direct packet access.
+- *     @skb: pointer to skb
+- *     @len: length of header to be pushed in front
+- *     @flags: Flags (unused for now)
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_xdp_adjust_head(xdp_md, delta)
+- *     Adjust the xdp_md.data by delta
+- *     @xdp_md: pointer to xdp_md
+- *     @delta: An positive/negative integer to be added to xdp_md.data
+- *     Return: 0 on success or negative on error
+- *
+- * int bpf_probe_read_str(void *dst, int size, const void *unsafe_ptr)
+- *     Copy a NUL terminated string from unsafe address. In case the string
+- *     length is smaller than size, the target is not padded with further NUL
+- *     bytes. In case the string length is larger than size, just count-1
+- *     bytes are copied and the last byte is set to NUL.
+- *     @dst: destination address
+- *     @size: maximum number of bytes to copy, including the trailing NUL
+- *     @unsafe_ptr: unsafe address
+- *     Return:
+- *       > 0 length of the string including the trailing NUL on success
+- *       < 0 error
+- *
+- * u64 bpf_get_socket_cookie(skb)
+- *     Get the cookie for the socket stored inside sk_buff.
+- *     @skb: pointer to skb
+- *     Return: 8 Bytes non-decreasing number on success or 0 if the socket
+- *     field is missing inside sk_buff
+- *
+- * u32 bpf_get_socket_uid(skb)
+- *     Get the owner uid of the socket stored inside sk_buff.
+- *     @skb: pointer to skb
+- *     Return: uid of the socket owner on success or overflowuid if failed.
+- *
+- * u32 bpf_set_hash(skb, hash)
+- *     Set full skb->hash.
+- *     @skb: pointer to skb
+- *     @hash: hash to set
+- *
+- * int bpf_setsockopt(bpf_socket, level, optname, optval, optlen)
+- *     Calls setsockopt. Not all opts are available, only those with
+- *     integer optvals plus TCP_CONGESTION.
+- *     Supported levels: SOL_SOCKET and IPROTO_TCP
+- *     @bpf_socket: pointer to bpf_socket
+- *     @level: SOL_SOCKET or IPROTO_TCP
+- *     @optname: option name
+- *     @optval: pointer to option value
+- *     @optlen: length of optval in byes
+- *     Return: 0 or negative error
+- *
+- * int bpf_skb_adjust_room(skb, len_diff, mode, flags)
+- *     Grow or shrink room in sk_buff.
+- *     @skb: pointer to skb
+- *     @len_diff: (signed) amount of room to grow/shrink
+- *     @mode: operation mode (enum bpf_adj_room_mode)
+- *     @flags: reserved for future use
+- *     Return: 0 on success or negative error code
+- *
+- * int bpf_sk_redirect_map(map, key, flags)
+- *     Redirect skb to a sock in map using key as a lookup key for the
+- *     sock in map.
+- *     @map: pointer to sockmap
+- *     @key: key to lookup sock in map
+- *     @flags: reserved for future use
+- *     Return: SK_REDIRECT
+- *
+- * int bpf_sock_map_update(skops, map, key, flags)
+- *	@skops: pointer to bpf_sock_ops
+- *	@map: pointer to sockmap to update
+- *	@key: key to insert/update sock in map
+- *	@flags: same flags as map update elem
+- */
+-#define __BPF_FUNC_MAPPER(FN)		\
+-	FN(unspec),			\
+-	FN(map_lookup_elem),		\
+-	FN(map_update_elem),		\
+-	FN(map_delete_elem),		\
+-	FN(probe_read),			\
+-	FN(ktime_get_ns),		\
+-	FN(trace_printk),		\
+-	FN(get_prandom_u32),		\
+-	FN(get_smp_processor_id),	\
+-	FN(skb_store_bytes),		\
+-	FN(l3_csum_replace),		\
+-	FN(l4_csum_replace),		\
+-	FN(tail_call),			\
+-	FN(clone_redirect),		\
+-	FN(get_current_pid_tgid),	\
+-	FN(get_current_uid_gid),	\
+-	FN(get_current_comm),		\
+-	FN(get_cgroup_classid),		\
+-	FN(skb_vlan_push),		\
+-	FN(skb_vlan_pop),		\
+-	FN(skb_get_tunnel_key),		\
+-	FN(skb_set_tunnel_key),		\
+-	FN(perf_event_read),		\
+-	FN(redirect),			\
+-	FN(get_route_realm),		\
+-	FN(perf_event_output),		\
+-	FN(skb_load_bytes),		\
+-	FN(get_stackid),		\
+-	FN(csum_diff),			\
+-	FN(skb_get_tunnel_opt),		\
+-	FN(skb_set_tunnel_opt),		\
+-	FN(skb_change_proto),		\
+-	FN(skb_change_type),		\
+-	FN(skb_under_cgroup),		\
+-	FN(get_hash_recalc),		\
+-	FN(get_current_task),		\
+-	FN(probe_write_user),		\
+-	FN(current_task_under_cgroup),	\
+-	FN(skb_change_tail),		\
+-	FN(skb_pull_data),		\
+-	FN(csum_update),		\
+-	FN(set_hash_invalid),		\
+-	FN(get_numa_node_id),		\
+-	FN(skb_change_head),		\
+-	FN(xdp_adjust_head),		\
+-	FN(probe_read_str),		\
+-	FN(get_socket_cookie),		\
+-	FN(get_socket_uid),		\
+-	FN(set_hash),			\
+-	FN(setsockopt),			\
+-	FN(skb_adjust_room),		\
+-	FN(redirect_map),		\
+-	FN(sk_redirect_map),		\
+-	FN(sock_map_update),		\
+-
+-/* integer value in 'imm' field of BPF_CALL instruction selects which helper
+- * function eBPF program intends to call
+- */
+-#define __BPF_ENUM_FN(x) BPF_FUNC_ ## x
+-enum bpf_func_id {
+-	__BPF_FUNC_MAPPER(__BPF_ENUM_FN)
+-	__BPF_FUNC_MAX_ID,
+-};
+-#undef __BPF_ENUM_FN
+-
+-/* All flags used by eBPF helper functions, placed here. */
+-
+-/* BPF_FUNC_skb_store_bytes flags. */
+-#define BPF_F_RECOMPUTE_CSUM		(1ULL << 0)
+-#define BPF_F_INVALIDATE_HASH		(1ULL << 1)
+-
+-/* BPF_FUNC_l3_csum_replace and BPF_FUNC_l4_csum_replace flags.
+- * First 4 bits are for passing the header field size.
+- */
+-#define BPF_F_HDR_FIELD_MASK		0xfULL
+-
+-/* BPF_FUNC_l4_csum_replace flags. */
+-#define BPF_F_PSEUDO_HDR		(1ULL << 4)
+-#define BPF_F_MARK_MANGLED_0		(1ULL << 5)
+-#define BPF_F_MARK_ENFORCE		(1ULL << 6)
+-
+-/* BPF_FUNC_clone_redirect and BPF_FUNC_redirect flags. */
+-#define BPF_F_INGRESS			(1ULL << 0)
+-
+-/* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */
+-#define BPF_F_TUNINFO_IPV6		(1ULL << 0)
+-
+-/* BPF_FUNC_get_stackid flags. */
+-#define BPF_F_SKIP_FIELD_MASK		0xffULL
+-#define BPF_F_USER_STACK		(1ULL << 8)
+-#define BPF_F_FAST_STACK_CMP		(1ULL << 9)
+-#define BPF_F_REUSE_STACKID		(1ULL << 10)
+-
+-/* BPF_FUNC_skb_set_tunnel_key flags. */
+-#define BPF_F_ZERO_CSUM_TX		(1ULL << 1)
+-#define BPF_F_DONT_FRAGMENT		(1ULL << 2)
+-
+-/* BPF_FUNC_perf_event_output and BPF_FUNC_perf_event_read flags. */
+-#define BPF_F_INDEX_MASK		0xffffffffULL
+-#define BPF_F_CURRENT_CPU		BPF_F_INDEX_MASK
+-/* BPF_FUNC_perf_event_output for sk_buff input context. */
+-#define BPF_F_CTXLEN_MASK		(0xfffffULL << 32)
+-
+-/* Mode for BPF_FUNC_skb_adjust_room helper. */
+-enum bpf_adj_room_mode {
+-	BPF_ADJ_ROOM_NET,
+-};
+-
+-/* user accessible mirror of in-kernel sk_buff.
+- * new fields can only be added to the end of this structure
+- */
+-struct __sk_buff {
+-	__u32 len;
+-	__u32 pkt_type;
+-	__u32 mark;
+-	__u32 queue_mapping;
+-	__u32 protocol;
+-	__u32 vlan_present;
+-	__u32 vlan_tci;
+-	__u32 vlan_proto;
+-	__u32 priority;
+-	__u32 ingress_ifindex;
+-	__u32 ifindex;
+-	__u32 tc_index;
+-	__u32 cb[5];
+-	__u32 hash;
+-	__u32 tc_classid;
+-	__u32 data;
+-	__u32 data_end;
+-	__u32 napi_id;
+-
+-	/* accessed by BPF_PROG_TYPE_sk_skb types */
+-	__u32 family;
+-	__u32 remote_ip4;	/* Stored in network byte order */
+-	__u32 local_ip4;	/* Stored in network byte order */
+-	__u32 remote_ip6[4];	/* Stored in network byte order */
+-	__u32 local_ip6[4];	/* Stored in network byte order */
+-	__u32 remote_port;	/* Stored in network byte order */
+-	__u32 local_port;	/* stored in host byte order */
+-};
+-
+-struct bpf_tunnel_key {
+-	__u32 tunnel_id;
+-	union {
+-		__u32 remote_ipv4;
+-		__u32 remote_ipv6[4];
+-	};
+-	__u8 tunnel_tos;
+-	__u8 tunnel_ttl;
+-	__u16 tunnel_ext;
+-	__u32 tunnel_label;
+-};
+-
+-/* Generic BPF return codes which all BPF program types may support.
+- * The values are binary compatible with their TC_ACT_* counter-part to
+- * provide backwards compatibility with existing SCHED_CLS and SCHED_ACT
+- * programs.
+- *
+- * XDP is handled seprately, see XDP_*.
+- */
+-enum bpf_ret_code {
+-	BPF_OK = 0,
+-	/* 1 reserved */
+-	BPF_DROP = 2,
+-	/* 3-6 reserved */
+-	BPF_REDIRECT = 7,
+-	/* >127 are reserved for prog type specific return codes */
+-};
+-
+-struct bpf_sock {
+-	__u32 bound_dev_if;
+-	__u32 family;
+-	__u32 type;
+-	__u32 protocol;
+-	__u32 mark;
+-	__u32 priority;
+-};
+-
+-#define XDP_PACKET_HEADROOM 256
+-
+-/* User return codes for XDP prog type.
+- * A valid XDP program must return one of these defined values. All other
+- * return codes are reserved for future use. Unknown return codes will
+- * result in packet drops and a warning via bpf_warn_invalid_xdp_action().
+- */
+-enum xdp_action {
+-	XDP_ABORTED = 0,
+-	XDP_DROP,
+-	XDP_PASS,
+-	XDP_TX,
+-	XDP_REDIRECT,
+-};
+-
+-/* user accessible metadata for XDP packet hook
+- * new fields must be added to the end of this structure
+- */
+-struct xdp_md {
+-	__u32 data;
+-	__u32 data_end;
+-};
+-
+-enum sk_action {
+-	SK_ABORTED = 0,
+-	SK_DROP,
+-	SK_REDIRECT,
+-};
+-
+-#define BPF_TAG_SIZE	8
+-
+-struct bpf_prog_info {
+-	__u32 type;
+-	__u32 id;
+-	__u8  tag[BPF_TAG_SIZE];
+-	__u32 jited_prog_len;
+-	__u32 xlated_prog_len;
+-	__aligned_u64 jited_prog_insns;
+-	__aligned_u64 xlated_prog_insns;
+-} __attribute__((aligned(8)));
+-
+-struct bpf_map_info {
+-	__u32 type;
+-	__u32 id;
+-	__u32 key_size;
+-	__u32 value_size;
+-	__u32 max_entries;
+-	__u32 map_flags;
+-} __attribute__((aligned(8)));
+-
+-/* User bpf_sock_ops struct to access socket values and specify request ops
+- * and their replies.
+- * Some of this fields are in network (bigendian) byte order and may need
+- * to be converted before use (bpf_ntohl() defined in samples/bpf/bpf_endian.h).
+- * New fields can only be added at the end of this structure
+- */
+-struct bpf_sock_ops {
+-	__u32 op;
+-	union {
+-		__u32 reply;
+-		__u32 replylong[4];
+-	};
+-	__u32 family;
+-	__u32 remote_ip4;	/* Stored in network byte order */
+-	__u32 local_ip4;	/* Stored in network byte order */
+-	__u32 remote_ip6[4];	/* Stored in network byte order */
+-	__u32 local_ip6[4];	/* Stored in network byte order */
+-	__u32 remote_port;	/* Stored in network byte order */
+-	__u32 local_port;	/* stored in host byte order */
+-};
+-
+-/* List of known BPF sock_ops operators.
+- * New entries can only be added at the end
+- */
+-enum {
+-	BPF_SOCK_OPS_VOID,
+-	BPF_SOCK_OPS_TIMEOUT_INIT,	/* Should return SYN-RTO value to use or
+-					 * -1 if default value should be used
+-					 */
+-	BPF_SOCK_OPS_RWND_INIT,		/* Should return initial advertized
+-					 * window (in packets) or -1 if default
+-					 * value should be used
+-					 */
+-	BPF_SOCK_OPS_TCP_CONNECT_CB,	/* Calls BPF program right before an
+-					 * active connection is initialized
+-					 */
+-	BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB,	/* Calls BPF program when an
+-						 * active connection is
+-						 * established
+-						 */
+-	BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB,	/* Calls BPF program when a
+-						 * passive connection is
+-						 * established
+-						 */
+-	BPF_SOCK_OPS_NEEDS_ECN,		/* If connection's congestion control
+-					 * needs ECN
+-					 */
+-};
+-
+-#define TCP_BPF_IW		1001	/* Set TCP initial congestion window */
+-#define TCP_BPF_SNDCWND_CLAMP	1002	/* Set sndcwnd_clamp */
+-
+-#endif /* __LINUX_BPF_H__ */
+diff --git a/include/linux/bpf_common.h b/include/linux/bpf_common.h
+deleted file mode 100644
+index afe7433..0000000
+--- a/include/linux/bpf_common.h
++++ /dev/null
+@@ -1,55 +0,0 @@
+-#ifndef __LINUX_BPF_COMMON_H__
+-#define __LINUX_BPF_COMMON_H__
+-
+-/* Instruction classes */
+-#define BPF_CLASS(code) ((code) & 0x07)
+-#define		BPF_LD		0x00
+-#define		BPF_LDX		0x01
+-#define		BPF_ST		0x02
+-#define		BPF_STX		0x03
+-#define		BPF_ALU		0x04
+-#define		BPF_JMP		0x05
+-#define		BPF_RET		0x06
+-#define		BPF_MISC        0x07
+-
+-/* ld/ldx fields */
+-#define BPF_SIZE(code)  ((code) & 0x18)
+-#define		BPF_W		0x00
+-#define		BPF_H		0x08
+-#define		BPF_B		0x10
+-#define BPF_MODE(code)  ((code) & 0xe0)
+-#define		BPF_IMM		0x00
+-#define		BPF_ABS		0x20
+-#define		BPF_IND		0x40
+-#define		BPF_MEM		0x60
+-#define		BPF_LEN		0x80
+-#define		BPF_MSH		0xa0
+-
+-/* alu/jmp fields */
+-#define BPF_OP(code)    ((code) & 0xf0)
+-#define		BPF_ADD		0x00
+-#define		BPF_SUB		0x10
+-#define		BPF_MUL		0x20
+-#define		BPF_DIV		0x30
+-#define		BPF_OR		0x40
+-#define		BPF_AND		0x50
+-#define		BPF_LSH		0x60
+-#define		BPF_RSH		0x70
+-#define		BPF_NEG		0x80
+-#define		BPF_MOD		0x90
+-#define		BPF_XOR		0xa0
+-
+-#define		BPF_JA		0x00
+-#define		BPF_JEQ		0x10
+-#define		BPF_JGT		0x20
+-#define		BPF_JGE		0x30
+-#define		BPF_JSET        0x40
+-#define BPF_SRC(code)   ((code) & 0x08)
+-#define		BPF_K		0x00
+-#define		BPF_X		0x08
+-
+-#ifndef BPF_MAXINSNS
+-#define BPF_MAXINSNS 4096
+-#endif
+-
+-#endif /* __LINUX_BPF_COMMON_H__ */
+diff --git a/include/linux/can.h b/include/linux/can.h
+deleted file mode 100644
+index f7a810d..0000000
+--- a/include/linux/can.h
++++ /dev/null
+@@ -1,201 +0,0 @@
+-/*
+- * linux/can.h
+- *
+- * Definitions for CAN network layer (socket addr / CAN frame / CAN filter)
+- *
+- * Authors: Oliver Hartkopp <oliver.hartkopp@volkswagen.de>
+- *          Urs Thuermann   <urs.thuermann@volkswagen.de>
+- * Copyright (c) 2002-2007 Volkswagen Group Electronic Research
+- * 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.
+- * 3. Neither the name of Volkswagen nor the names of its contributors
+- *    may be used to endorse or promote products derived from this software
+- *    without specific prior written permission.
+- *
+- * Alternatively, provided that this notice is retained in full, this
+- * software may be distributed under the terms of the GNU General
+- * Public License ("GPL") version 2, in which case the provisions of the
+- * GPL apply INSTEAD OF those given above.
+- *
+- * The provided data structures and external interfaces from this code
+- * are not restricted to be used by modules with a GPL compatible license.
+- *
+- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
+- * OWNER 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.
+- */
+-
+-#ifndef _CAN_H
+-#define _CAN_H
+-
+-#include <linux/types.h>
+-#include <linux/socket.h>
+-
+-/* controller area network (CAN) kernel definitions */
+-
+-/* special address description flags for the CAN_ID */
+-#define CAN_EFF_FLAG 0x80000000U /* EFF/SFF is set in the MSB */
+-#define CAN_RTR_FLAG 0x40000000U /* remote transmission request */
+-#define CAN_ERR_FLAG 0x20000000U /* error message frame */
+-
+-/* valid bits in CAN ID for frame formats */
+-#define CAN_SFF_MASK 0x000007FFU /* standard frame format (SFF) */
+-#define CAN_EFF_MASK 0x1FFFFFFFU /* extended frame format (EFF) */
+-#define CAN_ERR_MASK 0x1FFFFFFFU /* omit EFF, RTR, ERR flags */
+-
+-/*
+- * Controller Area Network Identifier structure
+- *
+- * bit 0-28	: CAN identifier (11/29 bit)
+- * bit 29	: error message frame flag (0 = data frame, 1 = error message)
+- * bit 30	: remote transmission request flag (1 = rtr frame)
+- * bit 31	: frame format flag (0 = standard 11 bit, 1 = extended 29 bit)
+- */
+-typedef __u32 canid_t;
+-
+-#define CAN_SFF_ID_BITS		11
+-#define CAN_EFF_ID_BITS		29
+-
+-/*
+- * Controller Area Network Error Message Frame Mask structure
+- *
+- * bit 0-28	: error class mask (see include/linux/can/error.h)
+- * bit 29-31	: set to zero
+- */
+-typedef __u32 can_err_mask_t;
+-
+-/* CAN payload length and DLC definitions according to ISO 11898-1 */
+-#define CAN_MAX_DLC 8
+-#define CAN_MAX_DLEN 8
+-
+-/* CAN FD payload length and DLC definitions according to ISO 11898-7 */
+-#define CANFD_MAX_DLC 15
+-#define CANFD_MAX_DLEN 64
+-
+-/**
+- * struct can_frame - basic CAN frame structure
+- * @can_id:  CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition
+- * @can_dlc: frame payload length in byte (0 .. 8) aka data length code
+- *           N.B. the DLC field from ISO 11898-1 Chapter 8.4.2.3 has a 1:1
+- *           mapping of the 'data length code' to the real payload length
+- * @__pad:   padding
+- * @__res0:  reserved / padding
+- * @__res1:  reserved / padding
+- * @data:    CAN frame payload (up to 8 byte)
+- */
+-struct can_frame {
+-	canid_t can_id;  /* 32 bit CAN_ID + EFF/RTR/ERR flags */
+-	__u8    can_dlc; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */
+-	__u8    __pad;   /* padding */
+-	__u8    __res0;  /* reserved / padding */
+-	__u8    __res1;  /* reserved / padding */
+-	__u8    data[CAN_MAX_DLEN] __attribute__((aligned(8)));
+-};
+-
+-/*
+- * defined bits for canfd_frame.flags
+- *
+- * The use of struct canfd_frame implies the Extended Data Length (EDL) bit to
+- * be set in the CAN frame bitstream on the wire. The EDL bit switch turns
+- * the CAN controllers bitstream processor into the CAN FD mode which creates
+- * two new options within the CAN FD frame specification:
+- *
+- * Bit Rate Switch - to indicate a second bitrate is/was used for the payload
+- * Error State Indicator - represents the error state of the transmitting node
+- *
+- * As the CANFD_ESI bit is internally generated by the transmitting CAN
+- * controller only the CANFD_BRS bit is relevant for real CAN controllers when
+- * building a CAN FD frame for transmission. Setting the CANFD_ESI bit can make
+- * sense for virtual CAN interfaces to test applications with echoed frames.
+- */
+-#define CANFD_BRS 0x01 /* bit rate switch (second bitrate for payload data) */
+-#define CANFD_ESI 0x02 /* error state indicator of the transmitting node */
+-
+-/**
+- * struct canfd_frame - CAN flexible data rate frame structure
+- * @can_id: CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition
+- * @len:    frame payload length in byte (0 .. CANFD_MAX_DLEN)
+- * @flags:  additional flags for CAN FD
+- * @__res0: reserved / padding
+- * @__res1: reserved / padding
+- * @data:   CAN FD frame payload (up to CANFD_MAX_DLEN byte)
+- */
+-struct canfd_frame {
+-	canid_t can_id;  /* 32 bit CAN_ID + EFF/RTR/ERR flags */
+-	__u8    len;     /* frame payload length in byte */
+-	__u8    flags;   /* additional flags for CAN FD */
+-	__u8    __res0;  /* reserved / padding */
+-	__u8    __res1;  /* reserved / padding */
+-	__u8    data[CANFD_MAX_DLEN] __attribute__((aligned(8)));
+-};
+-
+-#define CAN_MTU		(sizeof(struct can_frame))
+-#define CANFD_MTU	(sizeof(struct canfd_frame))
+-
+-/* particular protocols of the protocol family PF_CAN */
+-#define CAN_RAW		1 /* RAW sockets */
+-#define CAN_BCM		2 /* Broadcast Manager */
+-#define CAN_TP16	3 /* VAG Transport Protocol v1.6 */
+-#define CAN_TP20	4 /* VAG Transport Protocol v2.0 */
+-#define CAN_MCNET	5 /* Bosch MCNet */
+-#define CAN_ISOTP	6 /* ISO 15765-2 Transport Protocol */
+-#define CAN_NPROTO	7
+-
+-#define SOL_CAN_BASE 100
+-
+-/**
+- * struct sockaddr_can - the sockaddr structure for CAN sockets
+- * @can_family:  address family number AF_CAN.
+- * @can_ifindex: CAN network interface index.
+- * @can_addr:    protocol specific address information
+- */
+-struct sockaddr_can {
+-	__kernel_sa_family_t can_family;
+-	int         can_ifindex;
+-	union {
+-		/* transport protocol class address information (e.g. ISOTP) */
+-		struct { canid_t rx_id, tx_id; } tp;
+-
+-		/* reserved for future CAN protocols address information */
+-	} can_addr;
+-};
+-
+-/**
+- * struct can_filter - CAN ID based filter in can_register().
+- * @can_id:   relevant bits of CAN ID which are not masked out.
+- * @can_mask: CAN mask (see description)
+- *
+- * Description:
+- * A filter matches, when
+- *
+- *          <received_can_id> & mask == can_id & mask
+- *
+- * The filter can be inverted (CAN_INV_FILTER bit set in can_id) or it can
+- * filter for error message frames (CAN_ERR_FLAG bit set in mask).
+- */
+-struct can_filter {
+-	canid_t can_id;
+-	canid_t can_mask;
+-};
+-
+-#define CAN_INV_FILTER 0x20000000U /* to be set in can_filter.can_id */
+-#define CAN_RAW_FILTER_MAX 512 /* maximum number of can_filter set via setsockopt() */
+-
+-#endif /* !_UAPI_CAN_H */
+diff --git a/include/linux/can/netlink.h b/include/linux/can/netlink.h
+deleted file mode 100644
+index b9214bd..0000000
+--- a/include/linux/can/netlink.h
++++ /dev/null
+@@ -1,142 +0,0 @@
+-/*
+- * linux/can/netlink.h
+- *
+- * Definitions for the CAN netlink interface
+- *
+- * Copyright (c) 2009 Wolfgang Grandegger <wg@grandegger.com>
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the version 2 of the GNU General Public License
+- * as published by the Free Software Foundation
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU General Public License for more details.
+- */
+-
+-#ifndef _CAN_NETLINK_H
+-#define _CAN_NETLINK_H
+-
+-#include <linux/types.h>
+-
+-/*
+- * CAN bit-timing parameters
+- *
+- * For further information, please read chapter "8 BIT TIMING
+- * REQUIREMENTS" of the "Bosch CAN Specification version 2.0"
+- * at http://www.semiconductors.bosch.de/pdf/can2spec.pdf.
+- */
+-struct can_bittiming {
+-	__u32 bitrate;		/* Bit-rate in bits/second */
+-	__u32 sample_point;	/* Sample point in one-tenth of a percent */
+-	__u32 tq;		/* Time quanta (TQ) in nanoseconds */
+-	__u32 prop_seg;		/* Propagation segment in TQs */
+-	__u32 phase_seg1;	/* Phase buffer segment 1 in TQs */
+-	__u32 phase_seg2;	/* Phase buffer segment 2 in TQs */
+-	__u32 sjw;		/* Synchronisation jump width in TQs */
+-	__u32 brp;		/* Bit-rate prescaler */
+-};
+-
+-/*
+- * CAN harware-dependent bit-timing constant
+- *
+- * Used for calculating and checking bit-timing parameters
+- */
+-struct can_bittiming_const {
+-	char name[16];		/* Name of the CAN controller hardware */
+-	__u32 tseg1_min;	/* Time segement 1 = prop_seg + phase_seg1 */
+-	__u32 tseg1_max;
+-	__u32 tseg2_min;	/* Time segement 2 = phase_seg2 */
+-	__u32 tseg2_max;
+-	__u32 sjw_max;		/* Synchronisation jump width */
+-	__u32 brp_min;		/* Bit-rate prescaler */
+-	__u32 brp_max;
+-	__u32 brp_inc;
+-};
+-
+-/*
+- * CAN clock parameters
+- */
+-struct can_clock {
+-	__u32 freq;		/* CAN system clock frequency in Hz */
+-};
+-
+-/*
+- * CAN operational and error states
+- */
+-enum can_state {
+-	CAN_STATE_ERROR_ACTIVE = 0,	/* RX/TX error count < 96 */
+-	CAN_STATE_ERROR_WARNING,	/* RX/TX error count < 128 */
+-	CAN_STATE_ERROR_PASSIVE,	/* RX/TX error count < 256 */
+-	CAN_STATE_BUS_OFF,		/* RX/TX error count >= 256 */
+-	CAN_STATE_STOPPED,		/* Device is stopped */
+-	CAN_STATE_SLEEPING,		/* Device is sleeping */
+-	CAN_STATE_MAX
+-};
+-
+-/*
+- * CAN bus error counters
+- */
+-struct can_berr_counter {
+-	__u16 txerr;
+-	__u16 rxerr;
+-};
+-
+-/*
+- * CAN controller mode
+- */
+-struct can_ctrlmode {
+-	__u32 mask;
+-	__u32 flags;
+-};
+-
+-#define CAN_CTRLMODE_LOOPBACK		0x01	/* Loopback mode */
+-#define CAN_CTRLMODE_LISTENONLY		0x02	/* Listen-only mode */
+-#define CAN_CTRLMODE_3_SAMPLES		0x04	/* Triple sampling mode */
+-#define CAN_CTRLMODE_ONE_SHOT		0x08	/* One-Shot mode */
+-#define CAN_CTRLMODE_BERR_REPORTING	0x10	/* Bus-error reporting */
+-#define CAN_CTRLMODE_FD			0x20	/* CAN FD mode */
+-#define CAN_CTRLMODE_PRESUME_ACK	0x40	/* Ignore missing CAN ACKs */
+-#define CAN_CTRLMODE_FD_NON_ISO		0x80	/* CAN FD in non-ISO mode */
+-
+-/*
+- * CAN device statistics
+- */
+-struct can_device_stats {
+-	__u32 bus_error;	/* Bus errors */
+-	__u32 error_warning;	/* Changes to error warning state */
+-	__u32 error_passive;	/* Changes to error passive state */
+-	__u32 bus_off;		/* Changes to bus off state */
+-	__u32 arbitration_lost; /* Arbitration lost errors */
+-	__u32 restarts;		/* CAN controller re-starts */
+-};
+-
+-/*
+- * CAN netlink interface
+- */
+-enum {
+-	IFLA_CAN_UNSPEC,
+-	IFLA_CAN_BITTIMING,
+-	IFLA_CAN_BITTIMING_CONST,
+-	IFLA_CAN_CLOCK,
+-	IFLA_CAN_STATE,
+-	IFLA_CAN_CTRLMODE,
+-	IFLA_CAN_RESTART_MS,
+-	IFLA_CAN_RESTART,
+-	IFLA_CAN_BERR_COUNTER,
+-	IFLA_CAN_DATA_BITTIMING,
+-	IFLA_CAN_DATA_BITTIMING_CONST,
+-	IFLA_CAN_TERMINATION,
+-	IFLA_CAN_TERMINATION_CONST,
+-	IFLA_CAN_BITRATE_CONST,
+-	IFLA_CAN_DATA_BITRATE_CONST,
+-	__IFLA_CAN_MAX
+-};
+-
+-#define IFLA_CAN_MAX	(__IFLA_CAN_MAX - 1)
+-
+-/* u16 termination range: 1..65535 Ohms */
+-#define CAN_TERMINATION_DISABLED 0
+-
+-#endif /* !_UAPI_CAN_NETLINK_H */
+diff --git a/include/linux/can/vxcan.h b/include/linux/can/vxcan.h
+deleted file mode 100644
+index 5b29e8a..0000000
+--- a/include/linux/can/vxcan.h
++++ /dev/null
+@@ -1,12 +0,0 @@
+-#ifndef _CAN_VXCAN_H
+-#define _CAN_VXCAN_H
+-
+-enum {
+-	VXCAN_INFO_UNSPEC,
+-	VXCAN_INFO_PEER,
+-
+-	__VXCAN_INFO_MAX
+-#define VXCAN_INFO_MAX	(__VXCAN_INFO_MAX - 1)
+-};
+-
+-#endif
+diff --git a/include/linux/devlink.h b/include/linux/devlink.h
+deleted file mode 100644
+index a62695e..0000000
+--- a/include/linux/devlink.h
++++ /dev/null
+@@ -1,247 +0,0 @@
+-/*
+- * include/uapi/linux/devlink.h - Network physical device Netlink interface
+- * Copyright (c) 2016 Mellanox Technologies. All rights reserved.
+- * Copyright (c) 2016 Jiri Pirko <jiri@mellanox.com>
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- */
+-
+-#ifndef _LINUX_DEVLINK_H_
+-#define _LINUX_DEVLINK_H_
+-
+-#define DEVLINK_GENL_NAME "devlink"
+-#define DEVLINK_GENL_VERSION 0x1
+-#define DEVLINK_GENL_MCGRP_CONFIG_NAME "config"
+-
+-enum devlink_command {
+-	/* don't change the order or add anything between, this is ABI! */
+-	DEVLINK_CMD_UNSPEC,
+-
+-	DEVLINK_CMD_GET,		/* can dump */
+-	DEVLINK_CMD_SET,
+-	DEVLINK_CMD_NEW,
+-	DEVLINK_CMD_DEL,
+-
+-	DEVLINK_CMD_PORT_GET,		/* can dump */
+-	DEVLINK_CMD_PORT_SET,
+-	DEVLINK_CMD_PORT_NEW,
+-	DEVLINK_CMD_PORT_DEL,
+-
+-	DEVLINK_CMD_PORT_SPLIT,
+-	DEVLINK_CMD_PORT_UNSPLIT,
+-
+-	DEVLINK_CMD_SB_GET,		/* can dump */
+-	DEVLINK_CMD_SB_SET,
+-	DEVLINK_CMD_SB_NEW,
+-	DEVLINK_CMD_SB_DEL,
+-
+-	DEVLINK_CMD_SB_POOL_GET,	/* can dump */
+-	DEVLINK_CMD_SB_POOL_SET,
+-	DEVLINK_CMD_SB_POOL_NEW,
+-	DEVLINK_CMD_SB_POOL_DEL,
+-
+-	DEVLINK_CMD_SB_PORT_POOL_GET,	/* can dump */
+-	DEVLINK_CMD_SB_PORT_POOL_SET,
+-	DEVLINK_CMD_SB_PORT_POOL_NEW,
+-	DEVLINK_CMD_SB_PORT_POOL_DEL,
+-
+-	DEVLINK_CMD_SB_TC_POOL_BIND_GET,	/* can dump */
+-	DEVLINK_CMD_SB_TC_POOL_BIND_SET,
+-	DEVLINK_CMD_SB_TC_POOL_BIND_NEW,
+-	DEVLINK_CMD_SB_TC_POOL_BIND_DEL,
+-
+-	/* Shared buffer occupancy monitoring commands */
+-	DEVLINK_CMD_SB_OCC_SNAPSHOT,
+-	DEVLINK_CMD_SB_OCC_MAX_CLEAR,
+-
+-	DEVLINK_CMD_ESWITCH_GET,
+-#define DEVLINK_CMD_ESWITCH_MODE_GET /* obsolete, never use this! */ \
+-	DEVLINK_CMD_ESWITCH_GET
+-
+-	DEVLINK_CMD_ESWITCH_SET,
+-#define DEVLINK_CMD_ESWITCH_MODE_SET /* obsolete, never use this! */ \
+-	DEVLINK_CMD_ESWITCH_SET
+-
+-	DEVLINK_CMD_DPIPE_TABLE_GET,
+-	DEVLINK_CMD_DPIPE_ENTRIES_GET,
+-	DEVLINK_CMD_DPIPE_HEADERS_GET,
+-	DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET,
+-
+-	/* add new commands above here */
+-	__DEVLINK_CMD_MAX,
+-	DEVLINK_CMD_MAX = __DEVLINK_CMD_MAX - 1
+-};
+-
+-enum devlink_port_type {
+-	DEVLINK_PORT_TYPE_NOTSET,
+-	DEVLINK_PORT_TYPE_AUTO,
+-	DEVLINK_PORT_TYPE_ETH,
+-	DEVLINK_PORT_TYPE_IB,
+-};
+-
+-enum devlink_sb_pool_type {
+-	DEVLINK_SB_POOL_TYPE_INGRESS,
+-	DEVLINK_SB_POOL_TYPE_EGRESS,
+-};
+-
+-/* static threshold - limiting the maximum number of bytes.
+- * dynamic threshold - limiting the maximum number of bytes
+- *   based on the currently available free space in the shared buffer pool.
+- *   In this mode, the maximum quota is calculated based
+- *   on the following formula:
+- *     max_quota = alpha / (1 + alpha) * Free_Buffer
+- *   While Free_Buffer is the amount of none-occupied buffer associated to
+- *   the relevant pool.
+- *   The value range which can be passed is 0-20 and serves
+- *   for computation of alpha by following formula:
+- *     alpha = 2 ^ (passed_value - 10)
+- */
+-
+-enum devlink_sb_threshold_type {
+-	DEVLINK_SB_THRESHOLD_TYPE_STATIC,
+-	DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC,
+-};
+-
+-#define DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX 20
+-
+-enum devlink_eswitch_mode {
+-	DEVLINK_ESWITCH_MODE_LEGACY,
+-	DEVLINK_ESWITCH_MODE_SWITCHDEV,
+-};
+-
+-enum devlink_eswitch_inline_mode {
+-	DEVLINK_ESWITCH_INLINE_MODE_NONE,
+-	DEVLINK_ESWITCH_INLINE_MODE_LINK,
+-	DEVLINK_ESWITCH_INLINE_MODE_NETWORK,
+-	DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT,
+-};
+-
+-enum devlink_eswitch_encap_mode {
+-	DEVLINK_ESWITCH_ENCAP_MODE_NONE,
+-	DEVLINK_ESWITCH_ENCAP_MODE_BASIC,
+-};
+-
+-enum devlink_attr {
+-	/* don't change the order or add anything between, this is ABI! */
+-	DEVLINK_ATTR_UNSPEC,
+-
+-	/* bus name + dev name together are a handle for devlink entity */
+-	DEVLINK_ATTR_BUS_NAME,			/* string */
+-	DEVLINK_ATTR_DEV_NAME,			/* string */
+-
+-	DEVLINK_ATTR_PORT_INDEX,		/* u32 */
+-	DEVLINK_ATTR_PORT_TYPE,			/* u16 */
+-	DEVLINK_ATTR_PORT_DESIRED_TYPE,		/* u16 */
+-	DEVLINK_ATTR_PORT_NETDEV_IFINDEX,	/* u32 */
+-	DEVLINK_ATTR_PORT_NETDEV_NAME,		/* string */
+-	DEVLINK_ATTR_PORT_IBDEV_NAME,		/* string */
+-	DEVLINK_ATTR_PORT_SPLIT_COUNT,		/* u32 */
+-	DEVLINK_ATTR_PORT_SPLIT_GROUP,		/* u32 */
+-	DEVLINK_ATTR_SB_INDEX,			/* u32 */
+-	DEVLINK_ATTR_SB_SIZE,			/* u32 */
+-	DEVLINK_ATTR_SB_INGRESS_POOL_COUNT,	/* u16 */
+-	DEVLINK_ATTR_SB_EGRESS_POOL_COUNT,	/* u16 */
+-	DEVLINK_ATTR_SB_INGRESS_TC_COUNT,	/* u16 */
+-	DEVLINK_ATTR_SB_EGRESS_TC_COUNT,	/* u16 */
+-	DEVLINK_ATTR_SB_POOL_INDEX,		/* u16 */
+-	DEVLINK_ATTR_SB_POOL_TYPE,		/* u8 */
+-	DEVLINK_ATTR_SB_POOL_SIZE,		/* u32 */
+-	DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE,	/* u8 */
+-	DEVLINK_ATTR_SB_THRESHOLD,		/* u32 */
+-	DEVLINK_ATTR_SB_TC_INDEX,		/* u16 */
+-	DEVLINK_ATTR_SB_OCC_CUR,		/* u32 */
+-	DEVLINK_ATTR_SB_OCC_MAX,		/* u32 */
+-	DEVLINK_ATTR_ESWITCH_MODE,		/* u16 */
+-	DEVLINK_ATTR_ESWITCH_INLINE_MODE,	/* u8 */
+-
+-	DEVLINK_ATTR_DPIPE_TABLES,		/* nested */
+-	DEVLINK_ATTR_DPIPE_TABLE,		/* nested */
+-	DEVLINK_ATTR_DPIPE_TABLE_NAME,		/* string */
+-	DEVLINK_ATTR_DPIPE_TABLE_SIZE,		/* u64 */
+-	DEVLINK_ATTR_DPIPE_TABLE_MATCHES,	/* nested */
+-	DEVLINK_ATTR_DPIPE_TABLE_ACTIONS,	/* nested */
+-	DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED,	/* u8 */
+-
+-	DEVLINK_ATTR_DPIPE_ENTRIES,		/* nested */
+-	DEVLINK_ATTR_DPIPE_ENTRY,		/* nested */
+-	DEVLINK_ATTR_DPIPE_ENTRY_INDEX,		/* u64 */
+-	DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES,	/* nested */
+-	DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES,	/* nested */
+-	DEVLINK_ATTR_DPIPE_ENTRY_COUNTER,	/* u64 */
+-
+-	DEVLINK_ATTR_DPIPE_MATCH,		/* nested */
+-	DEVLINK_ATTR_DPIPE_MATCH_VALUE,		/* nested */
+-	DEVLINK_ATTR_DPIPE_MATCH_TYPE,		/* u32 */
+-
+-	DEVLINK_ATTR_DPIPE_ACTION,		/* nested */
+-	DEVLINK_ATTR_DPIPE_ACTION_VALUE,	/* nested */
+-	DEVLINK_ATTR_DPIPE_ACTION_TYPE,		/* u32 */
+-
+-	DEVLINK_ATTR_DPIPE_VALUE,
+-	DEVLINK_ATTR_DPIPE_VALUE_MASK,
+-	DEVLINK_ATTR_DPIPE_VALUE_MAPPING,	/* u32 */
+-
+-	DEVLINK_ATTR_DPIPE_HEADERS,		/* nested */
+-	DEVLINK_ATTR_DPIPE_HEADER,		/* nested */
+-	DEVLINK_ATTR_DPIPE_HEADER_NAME,		/* string */
+-	DEVLINK_ATTR_DPIPE_HEADER_ID,		/* u32 */
+-	DEVLINK_ATTR_DPIPE_HEADER_FIELDS,	/* nested */
+-	DEVLINK_ATTR_DPIPE_HEADER_GLOBAL,	/* u8 */
+-	DEVLINK_ATTR_DPIPE_HEADER_INDEX,	/* u32 */
+-
+-	DEVLINK_ATTR_DPIPE_FIELD,		/* nested */
+-	DEVLINK_ATTR_DPIPE_FIELD_NAME,		/* string */
+-	DEVLINK_ATTR_DPIPE_FIELD_ID,		/* u32 */
+-	DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH,	/* u32 */
+-	DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE,	/* u32 */
+-
+-	DEVLINK_ATTR_PAD,
+-
+-	DEVLINK_ATTR_ESWITCH_ENCAP_MODE,	/* u8 */
+-
+-	/* add new attributes above here, update the policy in devlink.c */
+-
+-	__DEVLINK_ATTR_MAX,
+-	DEVLINK_ATTR_MAX = __DEVLINK_ATTR_MAX - 1
+-};
+-
+-/* Mapping between internal resource described by the field and system
+- * structure
+- */
+-enum devlink_dpipe_field_mapping_type {
+-	DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE,
+-	DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX,
+-};
+-
+-/* Match type - specify the type of the match */
+-enum devlink_dpipe_match_type {
+-	DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT,
+-};
+-
+-/* Action type - specify the action type */
+-enum devlink_dpipe_action_type {
+-	DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY,
+-};
+-
+-enum devlink_dpipe_field_ethernet_id {
+-	DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC,
+-};
+-
+-enum devlink_dpipe_field_ipv4_id {
+-	DEVLINK_DPIPE_FIELD_IPV4_DST_IP,
+-};
+-
+-enum devlink_dpipe_field_ipv6_id {
+-	DEVLINK_DPIPE_FIELD_IPV6_DST_IP,
+-};
+-
+-enum devlink_dpipe_header_id {
+-	DEVLINK_DPIPE_HEADER_ETHERNET,
+-	DEVLINK_DPIPE_HEADER_IPV4,
+-	DEVLINK_DPIPE_HEADER_IPV6,
+-};
+-
+-#endif /* _LINUX_DEVLINK_H_ */
+diff --git a/include/linux/elf-em.h b/include/linux/elf-em.h
+deleted file mode 100644
+index 9cd1de9..0000000
+--- a/include/linux/elf-em.h
++++ /dev/null
+@@ -1,60 +0,0 @@
+-#ifndef _LINUX_ELF_EM_H
+-#define _LINUX_ELF_EM_H
+-
+-/* These constants define the various ELF target machines */
+-#define EM_NONE		0
+-#define EM_M32		1
+-#define EM_SPARC	2
+-#define EM_386		3
+-#define EM_68K		4
+-#define EM_88K		5
+-#define EM_486		6	/* Perhaps disused */
+-#define EM_860		7
+-#define EM_MIPS		8	/* MIPS R3000 (officially, big-endian only) */
+-				/* Next two are historical and binaries and
+-				   modules of these types will be rejected by
+-				   Linux.  */
+-#define EM_MIPS_RS3_LE	10	/* MIPS R3000 little-endian */
+-#define EM_MIPS_RS4_BE	10	/* MIPS R4000 big-endian */
+-
+-#define EM_PARISC	15	/* HPPA */
+-#define EM_SPARC32PLUS	18	/* Sun's "v8plus" */
+-#define EM_PPC		20	/* PowerPC */
+-#define EM_PPC64	21	 /* PowerPC64 */
+-#define EM_SPU		23	/* Cell BE SPU */
+-#define EM_ARM		40	/* ARM 32 bit */
+-#define EM_SH		42	/* SuperH */
+-#define EM_SPARCV9	43	/* SPARC v9 64-bit */
+-#define EM_H8_300	46	/* Renesas H8/300 */
+-#define EM_IA_64	50	/* HP/Intel IA-64 */
+-#define EM_X86_64	62	/* AMD x86-64 */
+-#define EM_S390		22	/* IBM S/390 */
+-#define EM_CRIS		76	/* Axis Communications 32-bit embedded processor */
+-#define EM_M32R		88	/* Renesas M32R */
+-#define EM_MN10300	89	/* Panasonic/MEI MN10300, AM33 */
+-#define EM_OPENRISC     92     /* OpenRISC 32-bit embedded processor */
+-#define EM_BLACKFIN     106     /* ADI Blackfin Processor */
+-#define EM_ALTERA_NIOS2	113	/* Altera Nios II soft-core processor */
+-#define EM_TI_C6000	140	/* TI C6X DSPs */
+-#define EM_AARCH64	183	/* ARM 64 bit */
+-#define EM_TILEPRO	188	/* Tilera TILEPro */
+-#define EM_MICROBLAZE	189	/* Xilinx MicroBlaze */
+-#define EM_TILEGX	191	/* Tilera TILE-Gx */
+-#define EM_BPF		247	/* Linux BPF - in-kernel virtual machine */
+-#define EM_FRV		0x5441	/* Fujitsu FR-V */
+-
+-/*
+- * This is an interim value that we will use until the committee comes
+- * up with a final number.
+- */
+-#define EM_ALPHA	0x9026
+-
+-/* Bogus old m32r magic number, used by old tools. */
+-#define EM_CYGNUS_M32R	0x9041
+-/* This is the old interim value for S/390 architecture */
+-#define EM_S390_OLD	0xA390
+-/* Also Panasonic/MEI MN10300, AM33 */
+-#define EM_CYGNUS_MN10300 0xbeef
+-
+-
+-#endif /* _LINUX_ELF_EM_H */
+diff --git a/include/linux/fib_rules.h b/include/linux/fib_rules.h
+deleted file mode 100644
+index bbf02a6..0000000
+--- a/include/linux/fib_rules.h
++++ /dev/null
+@@ -1,80 +0,0 @@
+-#ifndef __LINUX_FIB_RULES_H
+-#define __LINUX_FIB_RULES_H
+-
+-#include <linux/types.h>
+-#include <linux/rtnetlink.h>
+-
+-/* rule is permanent, and cannot be deleted */
+-#define FIB_RULE_PERMANENT	0x00000001
+-#define FIB_RULE_INVERT		0x00000002
+-#define FIB_RULE_UNRESOLVED	0x00000004
+-#define FIB_RULE_IIF_DETACHED	0x00000008
+-#define FIB_RULE_DEV_DETACHED	FIB_RULE_IIF_DETACHED
+-#define FIB_RULE_OIF_DETACHED	0x00000010
+-
+-/* try to find source address in routing lookups */
+-#define FIB_RULE_FIND_SADDR	0x00010000
+-
+-struct fib_rule_hdr {
+-	__u8		family;
+-	__u8		dst_len;
+-	__u8		src_len;
+-	__u8		tos;
+-
+-	__u8		table;
+-	__u8		res1;	/* reserved */
+-	__u8		res2;	/* reserved */
+-	__u8		action;
+-
+-	__u32		flags;
+-};
+-
+-struct fib_rule_uid_range {
+-	__u32		start;
+-	__u32		end;
+-};
+-
+-enum {
+-	FRA_UNSPEC,
+-	FRA_DST,	/* destination address */
+-	FRA_SRC,	/* source address */
+-	FRA_IIFNAME,	/* interface name */
+-#define FRA_IFNAME	FRA_IIFNAME
+-	FRA_GOTO,	/* target to jump to (FR_ACT_GOTO) */
+-	FRA_UNUSED2,
+-	FRA_PRIORITY,	/* priority/preference */
+-	FRA_UNUSED3,
+-	FRA_UNUSED4,
+-	FRA_UNUSED5,
+-	FRA_FWMARK,	/* mark */
+-	FRA_FLOW,	/* flow/class id */
+-	FRA_TUN_ID,
+-	FRA_SUPPRESS_IFGROUP,
+-	FRA_SUPPRESS_PREFIXLEN,
+-	FRA_TABLE,	/* Extended table id */
+-	FRA_FWMASK,	/* mask for netfilter mark */
+-	FRA_OIFNAME,
+-	FRA_PAD,
+-	FRA_L3MDEV,	/* iif or oif is l3mdev goto its table */
+-	FRA_UID_RANGE,	/* UID range */
+-	__FRA_MAX
+-};
+-
+-#define FRA_MAX (__FRA_MAX - 1)
+-
+-enum {
+-	FR_ACT_UNSPEC,
+-	FR_ACT_TO_TBL,		/* Pass to fixed table */
+-	FR_ACT_GOTO,		/* Jump to another rule */
+-	FR_ACT_NOP,		/* No operation */
+-	FR_ACT_RES3,
+-	FR_ACT_RES4,
+-	FR_ACT_BLACKHOLE,	/* Drop without notification */
+-	FR_ACT_UNREACHABLE,	/* Drop with ENETUNREACH */
+-	FR_ACT_PROHIBIT,	/* Drop with EACCES */
+-	__FR_ACT_MAX,
+-};
+-
+-#define FR_ACT_MAX (__FR_ACT_MAX - 1)
+-
+-#endif
+diff --git a/include/linux/filter.h b/include/linux/filter.h
+deleted file mode 100644
+index e4f2f74..0000000
+--- a/include/linux/filter.h
++++ /dev/null
+@@ -1,89 +0,0 @@
+-/*
+- * Linux Socket Filter Data Structures
+- */
+-
+-#ifndef __LINUX_FILTER_H__
+-#define __LINUX_FILTER_H__
+-
+-
+-#include <linux/types.h>
+-#include <linux/bpf_common.h>
+-
+-/*
+- * Current version of the filter code architecture.
+- */
+-#define BPF_MAJOR_VERSION 1
+-#define BPF_MINOR_VERSION 1
+-
+-/*
+- *	Try and keep these values and structures similar to BSD, especially
+- *	the BPF code definitions which need to match so you can share filters
+- */
+- 
+-struct sock_filter {	/* Filter block */
+-	__u16	code;   /* Actual filter code */
+-	__u8	jt;	/* Jump true */
+-	__u8	jf;	/* Jump false */
+-	__u32	k;      /* Generic multiuse field */
+-};
+-
+-struct sock_fprog {	/* Required for SO_ATTACH_FILTER. */
+-	unsigned short		len;	/* Number of filter blocks */
+-	struct sock_filter *filter;
+-};
+-
+-/* ret - BPF_K and BPF_X also apply */
+-#define BPF_RVAL(code)  ((code) & 0x18)
+-#define         BPF_A           0x10
+-
+-/* misc */
+-#define BPF_MISCOP(code) ((code) & 0xf8)
+-#define         BPF_TAX         0x00
+-#define         BPF_TXA         0x80
+-
+-/*
+- * Macros for filter block array initializers.
+- */
+-#ifndef BPF_STMT
+-#define BPF_STMT(code, k) { (unsigned short)(code), 0, 0, k }
+-#endif
+-#ifndef BPF_JUMP
+-#define BPF_JUMP(code, k, jt, jf) { (unsigned short)(code), jt, jf, k }
+-#endif
+-
+-/*
+- * Number of scratch memory words for: BPF_ST and BPF_STX
+- */
+-#define BPF_MEMWORDS 16
+-
+-/* RATIONALE. Negative offsets are invalid in BPF.
+-   We use them to reference ancillary data.
+-   Unlike introduction new instructions, it does not break
+-   existing compilers/optimizers.
+- */
+-#define SKF_AD_OFF    (-0x1000)
+-#define SKF_AD_PROTOCOL 0
+-#define SKF_AD_PKTTYPE 	4
+-#define SKF_AD_IFINDEX 	8
+-#define SKF_AD_NLATTR	12
+-#define SKF_AD_NLATTR_NEST	16
+-#define SKF_AD_MARK 	20
+-#define SKF_AD_QUEUE	24
+-#define SKF_AD_HATYPE	28
+-#define SKF_AD_RXHASH	32
+-#define SKF_AD_CPU	36
+-#define SKF_AD_ALU_XOR_X	40
+-#define SKF_AD_VLAN_TAG	44
+-#define SKF_AD_VLAN_TAG_PRESENT 48
+-#define SKF_AD_PAY_OFFSET	52
+-#define SKF_AD_RANDOM	56
+-#define SKF_AD_VLAN_TPID	60
+-#define SKF_AD_MAX	64
+-
+-#define SKF_NET_OFF	(-0x100000)
+-#define SKF_LL_OFF	(-0x200000)
+-
+-#define BPF_NET_OFF	SKF_NET_OFF
+-#define BPF_LL_OFF	SKF_LL_OFF
+-
+-#endif /* __LINUX_FILTER_H__ */
+diff --git a/include/linux/fou.h b/include/linux/fou.h
+deleted file mode 100644
+index 744c323..0000000
+--- a/include/linux/fou.h
++++ /dev/null
+@@ -1,41 +0,0 @@
+-/* fou.h - FOU Interface */
+-
+-#ifndef _LINUX_FOU_H
+-#define _LINUX_FOU_H
+-
+-/* NETLINK_GENERIC related info
+- */
+-#define FOU_GENL_NAME		"fou"
+-#define FOU_GENL_VERSION	0x1
+-
+-enum {
+-	FOU_ATTR_UNSPEC,
+-	FOU_ATTR_PORT,				/* u16 */
+-	FOU_ATTR_AF,				/* u8 */
+-	FOU_ATTR_IPPROTO,			/* u8 */
+-	FOU_ATTR_TYPE,				/* u8 */
+-	FOU_ATTR_REMCSUM_NOPARTIAL,		/* flag */
+-
+-	__FOU_ATTR_MAX,
+-};
+-
+-#define FOU_ATTR_MAX		(__FOU_ATTR_MAX - 1)
+-
+-enum {
+-	FOU_CMD_UNSPEC,
+-	FOU_CMD_ADD,
+-	FOU_CMD_DEL,
+-	FOU_CMD_GET,
+-
+-	__FOU_CMD_MAX,
+-};
+-
+-enum {
+-	FOU_ENCAP_UNSPEC,
+-	FOU_ENCAP_DIRECT,
+-	FOU_ENCAP_GUE,
+-};
+-
+-#define FOU_CMD_MAX	(__FOU_CMD_MAX - 1)
+-
+-#endif /* _LINUX_FOU_H */
+diff --git a/include/linux/gen_stats.h b/include/linux/gen_stats.h
+deleted file mode 100644
+index 52deccc..0000000
+--- a/include/linux/gen_stats.h
++++ /dev/null
+@@ -1,79 +0,0 @@
+-#ifndef __LINUX_GEN_STATS_H
+-#define __LINUX_GEN_STATS_H
+-
+-#include <linux/types.h>
+-
+-enum {
+-	TCA_STATS_UNSPEC,
+-	TCA_STATS_BASIC,
+-	TCA_STATS_RATE_EST,
+-	TCA_STATS_QUEUE,
+-	TCA_STATS_APP,
+-	TCA_STATS_RATE_EST64,
+-	TCA_STATS_PAD,
+-	__TCA_STATS_MAX,
+-};
+-#define TCA_STATS_MAX (__TCA_STATS_MAX - 1)
+-
+-/**
+- * struct gnet_stats_basic - byte/packet throughput statistics
+- * @bytes: number of seen bytes
+- * @packets: number of seen packets
+- */
+-struct gnet_stats_basic {
+-	__u64	bytes;
+-	__u32	packets;
+-};
+-struct gnet_stats_basic_packed {
+-	__u64	bytes;
+-	__u32	packets;
+-} __attribute__ ((packed));
+-
+-/**
+- * struct gnet_stats_rate_est - rate estimator
+- * @bps: current byte rate
+- * @pps: current packet rate
+- */
+-struct gnet_stats_rate_est {
+-	__u32	bps;
+-	__u32	pps;
+-};
+-
+-/**
+- * struct gnet_stats_rate_est64 - rate estimator
+- * @bps: current byte rate
+- * @pps: current packet rate
+- */
+-struct gnet_stats_rate_est64 {
+-	__u64	bps;
+-	__u64	pps;
+-};
+-
+-/**
+- * struct gnet_stats_queue - queuing statistics
+- * @qlen: queue length
+- * @backlog: backlog size of queue
+- * @drops: number of dropped packets
+- * @requeues: number of requeues
+- * @overlimits: number of enqueues over the limit
+- */
+-struct gnet_stats_queue {
+-	__u32	qlen;
+-	__u32	backlog;
+-	__u32	drops;
+-	__u32	requeues;
+-	__u32	overlimits;
+-};
+-
+-/**
+- * struct gnet_estimator - rate estimator configuration
+- * @interval: sampling period
+- * @ewma_log: the log of measurement window weight
+- */
+-struct gnet_estimator {
+-	signed char	interval;
+-	unsigned char	ewma_log;
+-};
+-
+-
+-#endif /* __LINUX_GEN_STATS_H */
+diff --git a/include/linux/genetlink.h b/include/linux/genetlink.h
+deleted file mode 100644
+index 08239d8..0000000
+--- a/include/linux/genetlink.h
++++ /dev/null
+@@ -1,88 +0,0 @@
+-#ifndef __LINUX_GENERIC_NETLINK_H
+-#define __LINUX_GENERIC_NETLINK_H
+-
+-#include <linux/types.h>
+-#include <linux/netlink.h>
+-
+-#define GENL_NAMSIZ	16	/* length of family name */
+-
+-#define GENL_MIN_ID	NLMSG_MIN_TYPE
+-#define GENL_MAX_ID	1023
+-
+-struct genlmsghdr {
+-	__u8	cmd;
+-	__u8	version;
+-	__u16	reserved;
+-};
+-
+-#define GENL_HDRLEN	NLMSG_ALIGN(sizeof(struct genlmsghdr))
+-
+-#define GENL_ADMIN_PERM		0x01
+-#define GENL_CMD_CAP_DO		0x02
+-#define GENL_CMD_CAP_DUMP	0x04
+-#define GENL_CMD_CAP_HASPOL	0x08
+-#define GENL_UNS_ADMIN_PERM	0x10
+-
+-/*
+- * List of reserved static generic netlink identifiers:
+- */
+-#define GENL_ID_CTRL		NLMSG_MIN_TYPE
+-#define GENL_ID_VFS_DQUOT	(NLMSG_MIN_TYPE + 1)
+-#define GENL_ID_PMCRAID		(NLMSG_MIN_TYPE + 2)
+-/* must be last reserved + 1 */
+-#define GENL_START_ALLOC	(NLMSG_MIN_TYPE + 3)
+-
+-/**************************************************************************
+- * Controller
+- **************************************************************************/
+-
+-enum {
+-	CTRL_CMD_UNSPEC,
+-	CTRL_CMD_NEWFAMILY,
+-	CTRL_CMD_DELFAMILY,
+-	CTRL_CMD_GETFAMILY,
+-	CTRL_CMD_NEWOPS,
+-	CTRL_CMD_DELOPS,
+-	CTRL_CMD_GETOPS,
+-	CTRL_CMD_NEWMCAST_GRP,
+-	CTRL_CMD_DELMCAST_GRP,
+-	CTRL_CMD_GETMCAST_GRP, /* unused */
+-	__CTRL_CMD_MAX,
+-};
+-
+-#define CTRL_CMD_MAX (__CTRL_CMD_MAX - 1)
+-
+-enum {
+-	CTRL_ATTR_UNSPEC,
+-	CTRL_ATTR_FAMILY_ID,
+-	CTRL_ATTR_FAMILY_NAME,
+-	CTRL_ATTR_VERSION,
+-	CTRL_ATTR_HDRSIZE,
+-	CTRL_ATTR_MAXATTR,
+-	CTRL_ATTR_OPS,
+-	CTRL_ATTR_MCAST_GROUPS,
+-	__CTRL_ATTR_MAX,
+-};
+-
+-#define CTRL_ATTR_MAX (__CTRL_ATTR_MAX - 1)
+-
+-enum {
+-	CTRL_ATTR_OP_UNSPEC,
+-	CTRL_ATTR_OP_ID,
+-	CTRL_ATTR_OP_FLAGS,
+-	__CTRL_ATTR_OP_MAX,
+-};
+-
+-#define CTRL_ATTR_OP_MAX (__CTRL_ATTR_OP_MAX - 1)
+-
+-enum {
+-	CTRL_ATTR_MCAST_GRP_UNSPEC,
+-	CTRL_ATTR_MCAST_GRP_NAME,
+-	CTRL_ATTR_MCAST_GRP_ID,
+-	__CTRL_ATTR_MCAST_GRP_MAX,
+-};
+-
+-#define CTRL_ATTR_MCAST_GRP_MAX (__CTRL_ATTR_MCAST_GRP_MAX - 1)
+-
+-
+-#endif /* __LINUX_GENERIC_NETLINK_H */
+diff --git a/include/linux/hdlc/ioctl.h b/include/linux/hdlc/ioctl.h
+deleted file mode 100644
+index 04bc027..0000000
+--- a/include/linux/hdlc/ioctl.h
++++ /dev/null
+@@ -1,84 +0,0 @@
+-#ifndef __HDLC_IOCTL_H__
+-#define __HDLC_IOCTL_H__
+-
+-
+-#define GENERIC_HDLC_VERSION 4	/* For synchronization with sethdlc utility */
+-
+-#define CLOCK_DEFAULT   0	/* Default setting */
+-#define CLOCK_EXT	1	/* External TX and RX clock - DTE */
+-#define CLOCK_INT	2	/* Internal TX and RX clock - DCE */
+-#define CLOCK_TXINT	3	/* Internal TX and external RX clock */
+-#define CLOCK_TXFROMRX	4	/* TX clock derived from external RX clock */
+-
+-
+-#define ENCODING_DEFAULT	0 /* Default setting */
+-#define ENCODING_NRZ		1
+-#define ENCODING_NRZI		2
+-#define ENCODING_FM_MARK	3
+-#define ENCODING_FM_SPACE	4
+-#define ENCODING_MANCHESTER	5
+-
+-
+-#define PARITY_DEFAULT		0 /* Default setting */
+-#define PARITY_NONE		1 /* No parity */
+-#define PARITY_CRC16_PR0	2 /* CRC16, initial value 0x0000 */
+-#define PARITY_CRC16_PR1	3 /* CRC16, initial value 0xFFFF */
+-#define PARITY_CRC16_PR0_CCITT	4 /* CRC16, initial 0x0000, ITU-T version */
+-#define PARITY_CRC16_PR1_CCITT	5 /* CRC16, initial 0xFFFF, ITU-T version */
+-#define PARITY_CRC32_PR0_CCITT	6 /* CRC32, initial value 0x00000000 */
+-#define PARITY_CRC32_PR1_CCITT	7 /* CRC32, initial value 0xFFFFFFFF */
+-
+-#define LMI_DEFAULT		0 /* Default setting */
+-#define LMI_NONE		1 /* No LMI, all PVCs are static */
+-#define LMI_ANSI		2 /* ANSI Annex D */
+-#define LMI_CCITT		3 /* ITU-T Annex A */
+-#define LMI_CISCO		4 /* The "original" LMI, aka Gang of Four */
+-
+-#ifndef __ASSEMBLY__
+-
+-typedef struct {
+-	unsigned int clock_rate; /* bits per second */
+-	unsigned int clock_type; /* internal, external, TX-internal etc. */
+-	unsigned short loopback;
+-} sync_serial_settings;          /* V.35, V.24, X.21 */
+-
+-typedef struct {
+-	unsigned int clock_rate; /* bits per second */
+-	unsigned int clock_type; /* internal, external, TX-internal etc. */
+-	unsigned short loopback;
+-	unsigned int slot_map;
+-} te1_settings;                  /* T1, E1 */
+-
+-typedef struct {
+-	unsigned short encoding;
+-	unsigned short parity;
+-} raw_hdlc_proto;
+-
+-typedef struct {
+-	unsigned int t391;
+-	unsigned int t392;
+-	unsigned int n391;
+-	unsigned int n392;
+-	unsigned int n393;
+-	unsigned short lmi;
+-	unsigned short dce; /* 1 for DCE (network side) operation */
+-} fr_proto;
+-
+-typedef struct {
+-	unsigned int dlci;
+-} fr_proto_pvc;          /* for creating/deleting FR PVCs */
+-
+-typedef struct {
+-	unsigned int dlci;
+-	char master[IFNAMSIZ];	/* Name of master FRAD device */
+-}fr_proto_pvc_info;		/* for returning PVC information only */
+-
+-typedef struct {
+-    unsigned int interval;
+-    unsigned int timeout;
+-} cisco_proto;
+-
+-/* PPP doesn't need any info now - supply length = 0 to ioctl */
+-
+-#endif /* __ASSEMBLY__ */
+-#endif /* __HDLC_IOCTL_H__ */
+diff --git a/include/linux/icmpv6.h b/include/linux/icmpv6.h
+deleted file mode 100644
+index a2e839e..0000000
+--- a/include/linux/icmpv6.h
++++ /dev/null
+@@ -1,166 +0,0 @@
+-#ifndef _LINUX_ICMPV6_H
+-#define _LINUX_ICMPV6_H
+-
+-#include <linux/types.h>
+-#include <asm/byteorder.h>
+-
+-struct icmp6hdr {
+-
+-	__u8		icmp6_type;
+-	__u8		icmp6_code;
+-	__sum16		icmp6_cksum;
+-
+-
+-	union {
+-		__be32			un_data32[1];
+-		__be16			un_data16[2];
+-		__u8			un_data8[4];
+-
+-		struct icmpv6_echo {
+-			__be16		identifier;
+-			__be16		sequence;
+-		} u_echo;
+-
+-                struct icmpv6_nd_advt {
+-#if defined(__LITTLE_ENDIAN_BITFIELD)
+-                        __u32		reserved:5,
+-                        		override:1,
+-                        		solicited:1,
+-                        		router:1,
+-					reserved2:24;
+-#elif defined(__BIG_ENDIAN_BITFIELD)
+-                        __u32		router:1,
+-					solicited:1,
+-                        		override:1,
+-                        		reserved:29;
+-#else
+-#error	"Please fix <asm/byteorder.h>"
+-#endif						
+-                } u_nd_advt;
+-
+-                struct icmpv6_nd_ra {
+-			__u8		hop_limit;
+-#if defined(__LITTLE_ENDIAN_BITFIELD)
+-			__u8		reserved:3,
+-					router_pref:2,
+-					home_agent:1,
+-					other:1,
+-					managed:1;
+-
+-#elif defined(__BIG_ENDIAN_BITFIELD)
+-			__u8		managed:1,
+-					other:1,
+-					home_agent:1,
+-					router_pref:2,
+-					reserved:3;
+-#else
+-#error	"Please fix <asm/byteorder.h>"
+-#endif
+-			__be16		rt_lifetime;
+-                } u_nd_ra;
+-
+-	} icmp6_dataun;
+-
+-#define icmp6_identifier	icmp6_dataun.u_echo.identifier
+-#define icmp6_sequence		icmp6_dataun.u_echo.sequence
+-#define icmp6_pointer		icmp6_dataun.un_data32[0]
+-#define icmp6_mtu		icmp6_dataun.un_data32[0]
+-#define icmp6_unused		icmp6_dataun.un_data32[0]
+-#define icmp6_maxdelay		icmp6_dataun.un_data16[0]
+-#define icmp6_router		icmp6_dataun.u_nd_advt.router
+-#define icmp6_solicited		icmp6_dataun.u_nd_advt.solicited
+-#define icmp6_override		icmp6_dataun.u_nd_advt.override
+-#define icmp6_ndiscreserved	icmp6_dataun.u_nd_advt.reserved
+-#define icmp6_hop_limit		icmp6_dataun.u_nd_ra.hop_limit
+-#define icmp6_addrconf_managed	icmp6_dataun.u_nd_ra.managed
+-#define icmp6_addrconf_other	icmp6_dataun.u_nd_ra.other
+-#define icmp6_rt_lifetime	icmp6_dataun.u_nd_ra.rt_lifetime
+-#define icmp6_router_pref	icmp6_dataun.u_nd_ra.router_pref
+-};
+-
+-
+-#define ICMPV6_ROUTER_PREF_LOW		0x3
+-#define ICMPV6_ROUTER_PREF_MEDIUM	0x0
+-#define ICMPV6_ROUTER_PREF_HIGH		0x1
+-#define ICMPV6_ROUTER_PREF_INVALID	0x2
+-
+-#define ICMPV6_DEST_UNREACH		1
+-#define ICMPV6_PKT_TOOBIG		2
+-#define ICMPV6_TIME_EXCEED		3
+-#define ICMPV6_PARAMPROB		4
+-
+-#define ICMPV6_INFOMSG_MASK		0x80
+-
+-#define ICMPV6_ECHO_REQUEST		128
+-#define ICMPV6_ECHO_REPLY		129
+-#define ICMPV6_MGM_QUERY		130
+-#define ICMPV6_MGM_REPORT       	131
+-#define ICMPV6_MGM_REDUCTION    	132
+-
+-#define ICMPV6_NI_QUERY			139
+-#define ICMPV6_NI_REPLY			140
+-
+-#define ICMPV6_MLD2_REPORT		143
+-
+-#define ICMPV6_DHAAD_REQUEST		144
+-#define ICMPV6_DHAAD_REPLY		145
+-#define ICMPV6_MOBILE_PREFIX_SOL	146
+-#define ICMPV6_MOBILE_PREFIX_ADV	147
+-
+-/*
+- *	Codes for Destination Unreachable
+- */
+-#define ICMPV6_NOROUTE			0
+-#define ICMPV6_ADM_PROHIBITED		1
+-#define ICMPV6_NOT_NEIGHBOUR		2
+-#define ICMPV6_ADDR_UNREACH		3
+-#define ICMPV6_PORT_UNREACH		4
+-#define ICMPV6_POLICY_FAIL		5
+-#define ICMPV6_REJECT_ROUTE		6
+-
+-/*
+- *	Codes for Time Exceeded
+- */
+-#define ICMPV6_EXC_HOPLIMIT		0
+-#define ICMPV6_EXC_FRAGTIME		1
+-
+-/*
+- *	Codes for Parameter Problem
+- */
+-#define ICMPV6_HDR_FIELD		0
+-#define ICMPV6_UNK_NEXTHDR		1
+-#define ICMPV6_UNK_OPTION		2
+-
+-/*
+- *	constants for (set|get)sockopt
+- */
+-
+-#define ICMPV6_FILTER			1
+-
+-/*
+- *	ICMPV6 filter
+- */
+-
+-#define ICMPV6_FILTER_BLOCK		1
+-#define ICMPV6_FILTER_PASS		2
+-#define ICMPV6_FILTER_BLOCKOTHERS	3
+-#define ICMPV6_FILTER_PASSONLY		4
+-
+-struct icmp6_filter {
+-	__u32		data[8];
+-};
+-
+-/*
+- *	Definitions for MLDv2
+- */
+-#define MLD2_MODE_IS_INCLUDE	1
+-#define MLD2_MODE_IS_EXCLUDE	2
+-#define MLD2_CHANGE_TO_INCLUDE	3
+-#define MLD2_CHANGE_TO_EXCLUDE	4
+-#define MLD2_ALLOW_NEW_SOURCES	5
+-#define MLD2_BLOCK_OLD_SOURCES	6
+-
+-#define MLD2_ALL_MCR_INIT { { { 0xff,0x02,0,0,0,0,0,0,0,0,0,0,0,0,0,0x16 } } }
+-
+-
+-#endif /* _LINUX_ICMPV6_H */
+diff --git a/include/linux/if.h b/include/linux/if.h
+deleted file mode 100644
+index b4ba020..0000000
+--- a/include/linux/if.h
++++ /dev/null
+@@ -1,292 +0,0 @@
+-/*
+- * INET		An implementation of the TCP/IP protocol suite for the LINUX
+- *		operating system.  INET is implemented using the  BSD Socket
+- *		interface as the means of communication with the user level.
+- *
+- *		Global definitions for the INET interface module.
+- *
+- * Version:	@(#)if.h	1.0.2	04/18/93
+- *
+- * Authors:	Original taken from Berkeley UNIX 4.3, (c) UCB 1982-1988
+- *		Ross Biro
+- *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
+- *
+- *		This program is free software; you can redistribute it and/or
+- *		modify it under the terms of the GNU General Public License
+- *		as published by the Free Software Foundation; either version
+- *		2 of the License, or (at your option) any later version.
+- */
+-#ifndef _LINUX_IF_H
+-#define _LINUX_IF_H
+-
+-#include <linux/libc-compat.h>          /* for compatibility with glibc */
+-#include <linux/types.h>		/* for "__kernel_caddr_t" et al	*/
+-#include <linux/socket.h>		/* for "struct sockaddr" et al	*/
+-		/* for "__user" et al           */
+-
+-#include <sys/socket.h>			/* for struct sockaddr.		*/
+-
+-#if __UAPI_DEF_IF_IFNAMSIZ
+-#define	IFNAMSIZ	16
+-#endif /* __UAPI_DEF_IF_IFNAMSIZ */
+-#define	IFALIASZ	256
+-#include <linux/hdlc/ioctl.h>
+-
+-/* For glibc compatibility. An empty enum does not compile. */
+-#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 || \
+-    __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0
+-/**
+- * enum net_device_flags - &struct net_device flags
+- *
+- * These are the &struct net_device flags, they can be set by drivers, the
+- * kernel and some can be triggered by userspace. Userspace can query and
+- * set these flags using userspace utilities but there is also a sysfs
+- * entry available for all dev flags which can be queried and set. These flags
+- * are shared for all types of net_devices. The sysfs entries are available
+- * via /sys/class/net/<dev>/flags. Flags which can be toggled through sysfs
+- * are annotated below, note that only a few flags can be toggled and some
+- * other flags are always preserved from the original net_device flags
+- * even if you try to set them via sysfs. Flags which are always preserved
+- * are kept under the flag grouping @IFF_VOLATILE. Flags which are __volatile__
+- * are annotated below as such.
+- *
+- * You should have a pretty good reason to be extending these flags.
+- *
+- * @IFF_UP: interface is up. Can be toggled through sysfs.
+- * @IFF_BROADCAST: broadcast address valid. Volatile.
+- * @IFF_DEBUG: turn on debugging. Can be toggled through sysfs.
+- * @IFF_LOOPBACK: is a loopback net. Volatile.
+- * @IFF_POINTOPOINT: interface is has p-p link. Volatile.
+- * @IFF_NOTRAILERS: avoid use of trailers. Can be toggled through sysfs.
+- *	Volatile.
+- * @IFF_RUNNING: interface RFC2863 OPER_UP. Volatile.
+- * @IFF_NOARP: no ARP protocol. Can be toggled through sysfs. Volatile.
+- * @IFF_PROMISC: receive all packets. Can be toggled through sysfs.
+- * @IFF_ALLMULTI: receive all multicast packets. Can be toggled through
+- *	sysfs.
+- * @IFF_MASTER: master of a load balancer. Volatile.
+- * @IFF_SLAVE: slave of a load balancer. Volatile.
+- * @IFF_MULTICAST: Supports multicast. Can be toggled through sysfs.
+- * @IFF_PORTSEL: can set media type. Can be toggled through sysfs.
+- * @IFF_AUTOMEDIA: auto media select active. Can be toggled through sysfs.
+- * @IFF_DYNAMIC: dialup device with changing addresses. Can be toggled
+- *	through sysfs.
+- * @IFF_LOWER_UP: driver signals L1 up. Volatile.
+- * @IFF_DORMANT: driver signals dormant. Volatile.
+- * @IFF_ECHO: echo sent packets. Volatile.
+- */
+-enum net_device_flags {
+-/* for compatibility with glibc net/if.h */
+-#if __UAPI_DEF_IF_NET_DEVICE_FLAGS
+-	IFF_UP				= 1<<0,  /* sysfs */
+-	IFF_BROADCAST			= 1<<1,  /* __volatile__ */
+-	IFF_DEBUG			= 1<<2,  /* sysfs */
+-	IFF_LOOPBACK			= 1<<3,  /* __volatile__ */
+-	IFF_POINTOPOINT			= 1<<4,  /* __volatile__ */
+-	IFF_NOTRAILERS			= 1<<5,  /* sysfs */
+-	IFF_RUNNING			= 1<<6,  /* __volatile__ */
+-	IFF_NOARP			= 1<<7,  /* sysfs */
+-	IFF_PROMISC			= 1<<8,  /* sysfs */
+-	IFF_ALLMULTI			= 1<<9,  /* sysfs */
+-	IFF_MASTER			= 1<<10, /* __volatile__ */
+-	IFF_SLAVE			= 1<<11, /* __volatile__ */
+-	IFF_MULTICAST			= 1<<12, /* sysfs */
+-	IFF_PORTSEL			= 1<<13, /* sysfs */
+-	IFF_AUTOMEDIA			= 1<<14, /* sysfs */
+-	IFF_DYNAMIC			= 1<<15, /* sysfs */
+-#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS */
+-#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO
+-	IFF_LOWER_UP			= 1<<16, /* __volatile__ */
+-	IFF_DORMANT			= 1<<17, /* __volatile__ */
+-	IFF_ECHO			= 1<<18, /* __volatile__ */
+-#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */
+-};
+-#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 || __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0 */
+-
+-/* for compatibility with glibc net/if.h */
+-#if __UAPI_DEF_IF_NET_DEVICE_FLAGS
+-#define IFF_UP				IFF_UP
+-#define IFF_BROADCAST			IFF_BROADCAST
+-#define IFF_DEBUG			IFF_DEBUG
+-#define IFF_LOOPBACK			IFF_LOOPBACK
+-#define IFF_POINTOPOINT			IFF_POINTOPOINT
+-#define IFF_NOTRAILERS			IFF_NOTRAILERS
+-#define IFF_RUNNING			IFF_RUNNING
+-#define IFF_NOARP			IFF_NOARP
+-#define IFF_PROMISC			IFF_PROMISC
+-#define IFF_ALLMULTI			IFF_ALLMULTI
+-#define IFF_MASTER			IFF_MASTER
+-#define IFF_SLAVE			IFF_SLAVE
+-#define IFF_MULTICAST			IFF_MULTICAST
+-#define IFF_PORTSEL			IFF_PORTSEL
+-#define IFF_AUTOMEDIA			IFF_AUTOMEDIA
+-#define IFF_DYNAMIC			IFF_DYNAMIC
+-#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS */
+-
+-#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO
+-#define IFF_LOWER_UP			IFF_LOWER_UP
+-#define IFF_DORMANT			IFF_DORMANT
+-#define IFF_ECHO			IFF_ECHO
+-#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */
+-
+-#define IFF_VOLATILE	(IFF_LOOPBACK|IFF_POINTOPOINT|IFF_BROADCAST|IFF_ECHO|\
+-		IFF_MASTER|IFF_SLAVE|IFF_RUNNING|IFF_LOWER_UP|IFF_DORMANT)
+-
+-#define IF_GET_IFACE	0x0001		/* for querying only */
+-#define IF_GET_PROTO	0x0002
+-
+-/* For definitions see hdlc.h */
+-#define IF_IFACE_V35	0x1000		/* V.35 serial interface	*/
+-#define IF_IFACE_V24	0x1001		/* V.24 serial interface	*/
+-#define IF_IFACE_X21	0x1002		/* X.21 serial interface	*/
+-#define IF_IFACE_T1	0x1003		/* T1 telco serial interface	*/
+-#define IF_IFACE_E1	0x1004		/* E1 telco serial interface	*/
+-#define IF_IFACE_SYNC_SERIAL 0x1005	/* can't be set by software	*/
+-#define IF_IFACE_X21D   0x1006          /* X.21 Dual Clocking (FarSite) */
+-
+-/* For definitions see hdlc.h */
+-#define IF_PROTO_HDLC	0x2000		/* raw HDLC protocol		*/
+-#define IF_PROTO_PPP	0x2001		/* PPP protocol			*/
+-#define IF_PROTO_CISCO	0x2002		/* Cisco HDLC protocol		*/
+-#define IF_PROTO_FR	0x2003		/* Frame Relay protocol		*/
+-#define IF_PROTO_FR_ADD_PVC 0x2004	/*    Create FR PVC		*/
+-#define IF_PROTO_FR_DEL_PVC 0x2005	/*    Delete FR PVC		*/
+-#define IF_PROTO_X25	0x2006		/* X.25				*/
+-#define IF_PROTO_HDLC_ETH 0x2007	/* raw HDLC, Ethernet emulation	*/
+-#define IF_PROTO_FR_ADD_ETH_PVC 0x2008	/*  Create FR Ethernet-bridged PVC */
+-#define IF_PROTO_FR_DEL_ETH_PVC 0x2009	/*  Delete FR Ethernet-bridged PVC */
+-#define IF_PROTO_FR_PVC	0x200A		/* for reading PVC status	*/
+-#define IF_PROTO_FR_ETH_PVC 0x200B
+-#define IF_PROTO_RAW    0x200C          /* RAW Socket                   */
+-
+-/* RFC 2863 operational status */
+-enum {
+-	IF_OPER_UNKNOWN,
+-	IF_OPER_NOTPRESENT,
+-	IF_OPER_DOWN,
+-	IF_OPER_LOWERLAYERDOWN,
+-	IF_OPER_TESTING,
+-	IF_OPER_DORMANT,
+-	IF_OPER_UP,
+-};
+-
+-/* link modes */
+-enum {
+-	IF_LINK_MODE_DEFAULT,
+-	IF_LINK_MODE_DORMANT,	/* limit upward transition to dormant */
+-};
+-
+-/*
+- *	Device mapping structure. I'd just gone off and designed a 
+- *	beautiful scheme using only loadable modules with arguments
+- *	for driver options and along come the PCMCIA people 8)
+- *
+- *	Ah well. The get() side of this is good for WDSETUP, and it'll
+- *	be handy for debugging things. The set side is fine for now and
+- *	being very small might be worth keeping for clean configuration.
+- */
+-
+-/* for compatibility with glibc net/if.h */
+-#if __UAPI_DEF_IF_IFMAP
+-struct ifmap {
+-	unsigned long mem_start;
+-	unsigned long mem_end;
+-	unsigned short base_addr; 
+-	unsigned char irq;
+-	unsigned char dma;
+-	unsigned char port;
+-	/* 3 bytes spare */
+-};
+-#endif /* __UAPI_DEF_IF_IFMAP */
+-
+-struct if_settings {
+-	unsigned int type;	/* Type of physical device or protocol */
+-	unsigned int size;	/* Size of the data allocated by the caller */
+-	union {
+-		/* {atm/eth/dsl}_settings anyone ? */
+-		raw_hdlc_proto		*raw_hdlc;
+-		cisco_proto		*cisco;
+-		fr_proto		*fr;
+-		fr_proto_pvc		*fr_pvc;
+-		fr_proto_pvc_info	*fr_pvc_info;
+-
+-		/* interface settings */
+-		sync_serial_settings	*sync;
+-		te1_settings		*te1;
+-	} ifs_ifsu;
+-};
+-
+-/*
+- * Interface request structure used for socket
+- * ioctl's.  All interface ioctl's must have parameter
+- * definitions which begin with ifr_name.  The
+- * remainder may be interface specific.
+- */
+-
+-/* for compatibility with glibc net/if.h */
+-#if __UAPI_DEF_IF_IFREQ
+-struct ifreq {
+-#define IFHWADDRLEN	6
+-	union
+-	{
+-		char	ifrn_name[IFNAMSIZ];		/* if name, e.g. "en0" */
+-	} ifr_ifrn;
+-	
+-	union {
+-		struct	sockaddr ifru_addr;
+-		struct	sockaddr ifru_dstaddr;
+-		struct	sockaddr ifru_broadaddr;
+-		struct	sockaddr ifru_netmask;
+-		struct  sockaddr ifru_hwaddr;
+-		short	ifru_flags;
+-		int	ifru_ivalue;
+-		int	ifru_mtu;
+-		struct  ifmap ifru_map;
+-		char	ifru_slave[IFNAMSIZ];	/* Just fits the size */
+-		char	ifru_newname[IFNAMSIZ];
+-		void *	ifru_data;
+-		struct	if_settings ifru_settings;
+-	} ifr_ifru;
+-};
+-#endif /* __UAPI_DEF_IF_IFREQ */
+-
+-#define ifr_name	ifr_ifrn.ifrn_name	/* interface name 	*/
+-#define ifr_hwaddr	ifr_ifru.ifru_hwaddr	/* MAC address 		*/
+-#define	ifr_addr	ifr_ifru.ifru_addr	/* address		*/
+-#define	ifr_dstaddr	ifr_ifru.ifru_dstaddr	/* other end of p-p lnk	*/
+-#define	ifr_broadaddr	ifr_ifru.ifru_broadaddr	/* broadcast address	*/
+-#define	ifr_netmask	ifr_ifru.ifru_netmask	/* interface net mask	*/
+-#define	ifr_flags	ifr_ifru.ifru_flags	/* flags		*/
+-#define	ifr_metric	ifr_ifru.ifru_ivalue	/* metric		*/
+-#define	ifr_mtu		ifr_ifru.ifru_mtu	/* mtu			*/
+-#define ifr_map		ifr_ifru.ifru_map	/* device map		*/
+-#define ifr_slave	ifr_ifru.ifru_slave	/* slave device		*/
+-#define	ifr_data	ifr_ifru.ifru_data	/* for use by interface	*/
+-#define ifr_ifindex	ifr_ifru.ifru_ivalue	/* interface index	*/
+-#define ifr_bandwidth	ifr_ifru.ifru_ivalue    /* link bandwidth	*/
+-#define ifr_qlen	ifr_ifru.ifru_ivalue	/* Queue length 	*/
+-#define ifr_newname	ifr_ifru.ifru_newname	/* New name		*/
+-#define ifr_settings	ifr_ifru.ifru_settings	/* Device/proto settings*/
+-
+-/*
+- * Structure used in SIOCGIFCONF request.
+- * Used to retrieve interface configuration
+- * for machine (useful for programs which
+- * must know all networks accessible).
+- */
+-
+-/* for compatibility with glibc net/if.h */
+-#if __UAPI_DEF_IF_IFCONF
+-struct ifconf  {
+-	int	ifc_len;			/* size of buffer	*/
+-	union {
+-		char *ifcu_buf;
+-		struct ifreq *ifcu_req;
+-	} ifc_ifcu;
+-};
+-#endif /* __UAPI_DEF_IF_IFCONF */
+-
+-#define	ifc_buf	ifc_ifcu.ifcu_buf		/* buffer address	*/
+-#define	ifc_req	ifc_ifcu.ifcu_req		/* array of structures	*/
+-
+-#endif /* _LINUX_IF_H */
+diff --git a/include/linux/if_addr.h b/include/linux/if_addr.h
+deleted file mode 100644
+index 26f0ecf..0000000
+--- a/include/linux/if_addr.h
++++ /dev/null
+@@ -1,67 +0,0 @@
+-#ifndef __LINUX_IF_ADDR_H
+-#define __LINUX_IF_ADDR_H
+-
+-#include <linux/types.h>
+-#include <linux/netlink.h>
+-
+-struct ifaddrmsg {
+-	__u8		ifa_family;
+-	__u8		ifa_prefixlen;	/* The prefix length		*/
+-	__u8		ifa_flags;	/* Flags			*/
+-	__u8		ifa_scope;	/* Address scope		*/
+-	__u32		ifa_index;	/* Link index			*/
+-};
+-
+-/*
+- * Important comment:
+- * IFA_ADDRESS is prefix address, rather than local interface address.
+- * It makes no difference for normally configured broadcast interfaces,
+- * but for point-to-point IFA_ADDRESS is DESTINATION address,
+- * local address is supplied in IFA_LOCAL attribute.
+- *
+- * IFA_FLAGS is a u32 attribute that extends the u8 field ifa_flags.
+- * If present, the value from struct ifaddrmsg will be ignored.
+- */
+-enum {
+-	IFA_UNSPEC,
+-	IFA_ADDRESS,
+-	IFA_LOCAL,
+-	IFA_LABEL,
+-	IFA_BROADCAST,
+-	IFA_ANYCAST,
+-	IFA_CACHEINFO,
+-	IFA_MULTICAST,
+-	IFA_FLAGS,
+-	__IFA_MAX,
+-};
+-
+-#define IFA_MAX (__IFA_MAX - 1)
+-
+-/* ifa_flags */
+-#define IFA_F_SECONDARY		0x01
+-#define IFA_F_TEMPORARY		IFA_F_SECONDARY
+-
+-#define	IFA_F_NODAD		0x02
+-#define IFA_F_OPTIMISTIC	0x04
+-#define IFA_F_DADFAILED		0x08
+-#define	IFA_F_HOMEADDRESS	0x10
+-#define IFA_F_DEPRECATED	0x20
+-#define IFA_F_TENTATIVE		0x40
+-#define IFA_F_PERMANENT		0x80
+-#define IFA_F_MANAGETEMPADDR	0x100
+-#define IFA_F_NOPREFIXROUTE	0x200
+-#define IFA_F_MCAUTOJOIN	0x400
+-#define IFA_F_STABLE_PRIVACY	0x800
+-
+-struct ifa_cacheinfo {
+-	__u32	ifa_prefered;
+-	__u32	ifa_valid;
+-	__u32	cstamp; /* created timestamp, hundredths of seconds */
+-	__u32	tstamp; /* updated timestamp, hundredths of seconds */
+-};
+-
+-/* backwards compatibility for userspace */
+-#define IFA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg))))
+-#define IFA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifaddrmsg))
+-
+-#endif
+diff --git a/include/linux/if_addrlabel.h b/include/linux/if_addrlabel.h
+deleted file mode 100644
+index 54580c2..0000000
+--- a/include/linux/if_addrlabel.h
++++ /dev/null
+@@ -1,32 +0,0 @@
+-/*
+- * if_addrlabel.h - netlink interface for address labels
+- *
+- * Copyright (C)2007 USAGI/WIDE Project,  All Rights Reserved.
+- *
+- * Authors:
+- *	YOSHIFUJI Hideaki @ USAGI/WIDE <yoshfuji@linux-ipv6.org>
+- */
+-
+-#ifndef __LINUX_IF_ADDRLABEL_H
+-#define __LINUX_IF_ADDRLABEL_H
+-
+-#include <linux/types.h>
+-
+-struct ifaddrlblmsg {
+-	__u8		ifal_family;		/* Address family */
+-	__u8		__ifal_reserved;	/* Reserved */
+-	__u8		ifal_prefixlen;		/* Prefix length */
+-	__u8		ifal_flags;		/* Flags */
+-	__u32		ifal_index;		/* Link index */
+-	__u32		ifal_seq;		/* sequence number */
+-};
+-
+-enum {
+-	IFAL_ADDRESS = 1,
+-	IFAL_LABEL = 2,
+-	__IFAL_MAX
+-};
+-
+-#define IFAL_MAX	(__IFAL_MAX - 1)
+-
+-#endif
+diff --git a/include/linux/if_alg.h b/include/linux/if_alg.h
+deleted file mode 100644
+index f2acd2f..0000000
+--- a/include/linux/if_alg.h
++++ /dev/null
+@@ -1,42 +0,0 @@
+-/*
+- * if_alg: User-space algorithm interface
+- *
+- * Copyright (c) 2010 Herbert Xu <herbert@gondor.apana.org.au>
+- *
+- * This program is free software; you can redistribute it and/or modify it
+- * under the terms of the GNU General Public License as published by the Free
+- * Software Foundation; either version 2 of the License, or (at your option)
+- * any later version.
+- *
+- */
+-
+-#ifndef _LINUX_IF_ALG_H
+-#define _LINUX_IF_ALG_H
+-
+-#include <linux/types.h>
+-
+-struct sockaddr_alg {
+-	__u16	salg_family;
+-	__u8	salg_type[14];
+-	__u32	salg_feat;
+-	__u32	salg_mask;
+-	__u8	salg_name[64];
+-};
+-
+-struct af_alg_iv {
+-	__u32	ivlen;
+-	__u8	iv[0];
+-};
+-
+-/* Socket options */
+-#define ALG_SET_KEY			1
+-#define ALG_SET_IV			2
+-#define ALG_SET_OP			3
+-#define ALG_SET_AEAD_ASSOCLEN		4
+-#define ALG_SET_AEAD_AUTHSIZE		5
+-
+-/* Operations */
+-#define ALG_OP_DECRYPT			0
+-#define ALG_OP_ENCRYPT			1
+-
+-#endif	/* _LINUX_IF_ALG_H */
+diff --git a/include/linux/if_arp.h b/include/linux/if_arp.h
+deleted file mode 100644
+index 199f253..0000000
+--- a/include/linux/if_arp.h
++++ /dev/null
+@@ -1,163 +0,0 @@
+-/*
+- * INET		An implementation of the TCP/IP protocol suite for the LINUX
+- *		operating system.  INET is implemented using the  BSD Socket
+- *		interface as the means of communication with the user level.
+- *
+- *		Global definitions for the ARP (RFC 826) protocol.
+- *
+- * Version:	@(#)if_arp.h	1.0.1	04/16/93
+- *
+- * Authors:	Original taken from Berkeley UNIX 4.3, (c) UCB 1986-1988
+- *		Portions taken from the KA9Q/NOS (v2.00m PA0GRI) source.
+- *		Ross Biro
+- *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
+- *		Florian La Roche,
+- *		Jonathan Layes <layes@loran.com>
+- *		Arnaldo Carvalho de Melo <acme@conectiva.com.br> ARPHRD_HWX25
+- *
+- *		This program is free software; you can redistribute it and/or
+- *		modify it under the terms of the GNU General Public License
+- *		as published by the Free Software Foundation; either version
+- *		2 of the License, or (at your option) any later version.
+- */
+-#ifndef _LINUX_IF_ARP_H
+-#define _LINUX_IF_ARP_H
+-
+-#include <linux/netdevice.h>
+-
+-/* ARP protocol HARDWARE identifiers. */
+-#define ARPHRD_NETROM	0		/* from KA9Q: NET/ROM pseudo	*/
+-#define ARPHRD_ETHER 	1		/* Ethernet 10Mbps		*/
+-#define	ARPHRD_EETHER	2		/* Experimental Ethernet	*/
+-#define	ARPHRD_AX25	3		/* AX.25 Level 2		*/
+-#define	ARPHRD_PRONET	4		/* PROnet token ring		*/
+-#define	ARPHRD_CHAOS	5		/* Chaosnet			*/
+-#define	ARPHRD_IEEE802	6		/* IEEE 802.2 Ethernet/TR/TB	*/
+-#define	ARPHRD_ARCNET	7		/* ARCnet			*/
+-#define	ARPHRD_APPLETLK	8		/* APPLEtalk			*/
+-#define ARPHRD_DLCI	15		/* Frame Relay DLCI		*/
+-#define ARPHRD_ATM	19		/* ATM 				*/
+-#define ARPHRD_METRICOM	23		/* Metricom STRIP (new IANA id)	*/
+-#define	ARPHRD_IEEE1394	24		/* IEEE 1394 IPv4 - RFC 2734	*/
+-#define ARPHRD_EUI64	27		/* EUI-64                       */
+-#define ARPHRD_INFINIBAND 32		/* InfiniBand			*/
+-
+-/* Dummy types for non ARP hardware */
+-#define ARPHRD_SLIP	256
+-#define ARPHRD_CSLIP	257
+-#define ARPHRD_SLIP6	258
+-#define ARPHRD_CSLIP6	259
+-#define ARPHRD_RSRVD	260		/* Notional KISS type 		*/
+-#define ARPHRD_ADAPT	264
+-#define ARPHRD_ROSE	270
+-#define ARPHRD_X25	271		/* CCITT X.25			*/
+-#define ARPHRD_HWX25	272		/* Boards with X.25 in firmware	*/
+-#define ARPHRD_CAN	280		/* Controller Area Network      */
+-#define ARPHRD_PPP	512
+-#define ARPHRD_CISCO	513		/* Cisco HDLC	 		*/
+-#define ARPHRD_HDLC	ARPHRD_CISCO
+-#define ARPHRD_LAPB	516		/* LAPB				*/
+-#define ARPHRD_DDCMP    517		/* Digital's DDCMP protocol     */
+-#define ARPHRD_RAWHDLC	518		/* Raw HDLC			*/
+-#define ARPHRD_RAWIP    519		/* Raw IP                       */
+-
+-#define ARPHRD_TUNNEL	768		/* IPIP tunnel			*/
+-#define ARPHRD_TUNNEL6	769		/* IP6IP6 tunnel       		*/
+-#define ARPHRD_FRAD	770             /* Frame Relay Access Device    */
+-#define ARPHRD_SKIP	771		/* SKIP vif			*/
+-#define ARPHRD_LOOPBACK	772		/* Loopback device		*/
+-#define ARPHRD_LOCALTLK 773		/* Localtalk device		*/
+-#define ARPHRD_FDDI	774		/* Fiber Distributed Data Interface */
+-#define ARPHRD_BIF      775             /* AP1000 BIF                   */
+-#define ARPHRD_SIT	776		/* sit0 device - IPv6-in-IPv4	*/
+-#define ARPHRD_IPDDP	777		/* IP over DDP tunneller	*/
+-#define ARPHRD_IPGRE	778		/* GRE over IP			*/
+-#define ARPHRD_PIMREG	779		/* PIMSM register interface	*/
+-#define ARPHRD_HIPPI	780		/* High Performance Parallel Interface */
+-#define ARPHRD_ASH	781		/* Nexus 64Mbps Ash		*/
+-#define ARPHRD_ECONET	782		/* Acorn Econet			*/
+-#define ARPHRD_IRDA 	783		/* Linux-IrDA			*/
+-/* ARP works differently on different FC media .. so  */
+-#define ARPHRD_FCPP	784		/* Point to point fibrechannel	*/
+-#define ARPHRD_FCAL	785		/* Fibrechannel arbitrated loop */
+-#define ARPHRD_FCPL	786		/* Fibrechannel public loop	*/
+-#define ARPHRD_FCFABRIC	787		/* Fibrechannel fabric		*/
+-	/* 787->799 reserved for fibrechannel media types */
+-#define ARPHRD_IEEE802_TR 800		/* Magic type ident for TR	*/
+-#define ARPHRD_IEEE80211 801		/* IEEE 802.11			*/
+-#define ARPHRD_IEEE80211_PRISM 802	/* IEEE 802.11 + Prism2 header  */
+-#define ARPHRD_IEEE80211_RADIOTAP 803	/* IEEE 802.11 + radiotap header */
+-#define ARPHRD_IEEE802154	  804
+-#define ARPHRD_IEEE802154_MONITOR 805	/* IEEE 802.15.4 network monitor */
+-
+-#define ARPHRD_PHONET	820		/* PhoNet media type		*/
+-#define ARPHRD_PHONET_PIPE 821		/* PhoNet pipe header		*/
+-#define ARPHRD_CAIF	822		/* CAIF media type		*/
+-#define ARPHRD_IP6GRE	823		/* GRE over IPv6		*/
+-#define ARPHRD_NETLINK	824		/* Netlink header		*/
+-#define ARPHRD_6LOWPAN	825		/* IPv6 over LoWPAN             */
+-#define ARPHRD_VSOCKMON	826		/* Vsock monitor header		*/
+-
+-#define ARPHRD_VOID	  0xFFFF	/* Void type, nothing is known */
+-#define ARPHRD_NONE	  0xFFFE	/* zero header length */
+-
+-/* ARP protocol opcodes. */
+-#define	ARPOP_REQUEST	1		/* ARP request			*/
+-#define	ARPOP_REPLY	2		/* ARP reply			*/
+-#define	ARPOP_RREQUEST	3		/* RARP request			*/
+-#define	ARPOP_RREPLY	4		/* RARP reply			*/
+-#define	ARPOP_InREQUEST	8		/* InARP request		*/
+-#define	ARPOP_InREPLY	9		/* InARP reply			*/
+-#define	ARPOP_NAK	10		/* (ATM)ARP NAK			*/
+-
+-
+-/* ARP ioctl request. */
+-struct arpreq {
+-  struct sockaddr	arp_pa;		/* protocol address		*/
+-  struct sockaddr	arp_ha;		/* hardware address		*/
+-  int			arp_flags;	/* flags			*/
+-  struct sockaddr       arp_netmask;    /* netmask (only for proxy arps) */
+-  char			arp_dev[16];
+-};
+-
+-struct arpreq_old {
+-  struct sockaddr	arp_pa;		/* protocol address		*/
+-  struct sockaddr	arp_ha;		/* hardware address		*/
+-  int			arp_flags;	/* flags			*/
+-  struct sockaddr       arp_netmask;    /* netmask (only for proxy arps) */
+-};
+-
+-/* ARP Flag values. */
+-#define ATF_COM		0x02		/* completed entry (ha valid)	*/
+-#define	ATF_PERM	0x04		/* permanent entry		*/
+-#define	ATF_PUBL	0x08		/* publish entry		*/
+-#define	ATF_USETRAILERS	0x10		/* has requested trailers	*/
+-#define ATF_NETMASK     0x20            /* want to use a netmask (only
+-					   for proxy entries) */
+-#define ATF_DONTPUB	0x40		/* don't answer this addresses	*/
+-
+-/*
+- *	This structure defines an ethernet arp header.
+- */
+-
+-struct arphdr {
+-	__be16		ar_hrd;		/* format of hardware address	*/
+-	__be16		ar_pro;		/* format of protocol address	*/
+-	unsigned char	ar_hln;		/* length of hardware address	*/
+-	unsigned char	ar_pln;		/* length of protocol address	*/
+-	__be16		ar_op;		/* ARP opcode (command)		*/
+-
+-#if 0
+-	 /*
+-	  *	 Ethernet looks like this : This bit is variable sized however...
+-	  */
+-	unsigned char		ar_sha[ETH_ALEN];	/* sender hardware address	*/
+-	unsigned char		ar_sip[4];		/* sender IP address		*/
+-	unsigned char		ar_tha[ETH_ALEN];	/* target hardware address	*/
+-	unsigned char		ar_tip[4];		/* target IP address		*/
+-#endif
+-
+-};
+-
+-
+-#endif /* _LINUX_IF_ARP_H */
+diff --git a/include/linux/if_bonding.h b/include/linux/if_bonding.h
+deleted file mode 100644
+index 9635a62..0000000
+--- a/include/linux/if_bonding.h
++++ /dev/null
+@@ -1,130 +0,0 @@
+-/*
+- * Bond several ethernet interfaces into a Cisco, running 'Etherchannel'.
+- *
+- *
+- * Portions are (c) Copyright 1995 Simon "Guru Aleph-Null" Janes
+- * NCM: Network and Communications Management, Inc.
+- *
+- * BUT, I'm the one who modified it for ethernet, so:
+- * (c) Copyright 1999, Thomas Davis, tadavis@lbl.gov
+- *
+- *	This software may be used and distributed according to the terms
+- *	of the GNU Public License, incorporated herein by reference.
+- *
+- * 2003/03/18 - Amir Noam <amir.noam at intel dot com>
+- *	- Added support for getting slave's speed and duplex via ethtool.
+- *	  Needed for 802.3ad and other future modes.
+- *
+- * 2003/03/18 - Tsippy Mendelson <tsippy.mendelson at intel dot com> and
+- *		Shmulik Hen <shmulik.hen at intel dot com>
+- *	- Enable support of modes that need to use the unique mac address of
+- *	  each slave.
+- *
+- * 2003/03/18 - Tsippy Mendelson <tsippy.mendelson at intel dot com> and
+- *		Amir Noam <amir.noam at intel dot com>
+- *	- Moved driver's private data types to bonding.h
+- *
+- * 2003/03/18 - Amir Noam <amir.noam at intel dot com>,
+- *		Tsippy Mendelson <tsippy.mendelson at intel dot com> and
+- *		Shmulik Hen <shmulik.hen at intel dot com>
+- *	- Added support for IEEE 802.3ad Dynamic link aggregation mode.
+- *
+- * 2003/05/01 - Amir Noam <amir.noam at intel dot com>
+- *	- Added ABI version control to restore compatibility between
+- *	  new/old ifenslave and new/old bonding.
+- *
+- * 2003/12/01 - Shmulik Hen <shmulik.hen at intel dot com>
+- *	- Code cleanup and style changes
+- *
+- * 2005/05/05 - Jason Gabler <jygabler at lbl dot gov>
+- *      - added definitions for various XOR hashing policies
+- */
+-
+-#ifndef _LINUX_IF_BONDING_H
+-#define _LINUX_IF_BONDING_H
+-
+-#include <linux/if.h>
+-#include <linux/types.h>
+-#include <linux/if_ether.h>
+-
+-/* userland - kernel ABI version (2003/05/08) */
+-#define BOND_ABI_VERSION 2
+-
+-/*
+- * We can remove these ioctl definitions in 2.5.  People should use the
+- * SIOC*** versions of them instead
+- */
+-#define BOND_ENSLAVE_OLD		(SIOCDEVPRIVATE)
+-#define BOND_RELEASE_OLD		(SIOCDEVPRIVATE + 1)
+-#define BOND_SETHWADDR_OLD		(SIOCDEVPRIVATE + 2)
+-#define BOND_SLAVE_INFO_QUERY_OLD	(SIOCDEVPRIVATE + 11)
+-#define BOND_INFO_QUERY_OLD		(SIOCDEVPRIVATE + 12)
+-#define BOND_CHANGE_ACTIVE_OLD		(SIOCDEVPRIVATE + 13)
+-
+-#define BOND_CHECK_MII_STATUS	(SIOCGMIIPHY)
+-
+-#define BOND_MODE_ROUNDROBIN	0
+-#define BOND_MODE_ACTIVEBACKUP	1
+-#define BOND_MODE_XOR		2
+-#define BOND_MODE_BROADCAST	3
+-#define BOND_MODE_8023AD        4
+-#define BOND_MODE_TLB           5
+-#define BOND_MODE_ALB		6 /* TLB + RLB (receive load balancing) */
+-
+-/* each slave's link has 4 states */
+-#define BOND_LINK_UP    0           /* link is up and running */
+-#define BOND_LINK_FAIL  1           /* link has just gone down */
+-#define BOND_LINK_DOWN  2           /* link has been down for too long time */
+-#define BOND_LINK_BACK  3           /* link is going back */
+-
+-/* each slave has several states */
+-#define BOND_STATE_ACTIVE       0   /* link is active */
+-#define BOND_STATE_BACKUP       1   /* link is backup */
+-
+-#define BOND_DEFAULT_MAX_BONDS  1   /* Default maximum number of devices to support */
+-
+-#define BOND_DEFAULT_TX_QUEUES 16   /* Default number of tx queues per device */
+-
+-#define BOND_DEFAULT_RESEND_IGMP	1 /* Default number of IGMP membership reports */
+-
+-/* hashing types */
+-#define BOND_XMIT_POLICY_LAYER2		0 /* layer 2 (MAC only), default */
+-#define BOND_XMIT_POLICY_LAYER34	1 /* layer 3+4 (IP ^ (TCP || UDP)) */
+-#define BOND_XMIT_POLICY_LAYER23	2 /* layer 2+3 (IP ^ MAC) */
+-#define BOND_XMIT_POLICY_ENCAP23	3 /* encapsulated layer 2+3 */
+-#define BOND_XMIT_POLICY_ENCAP34	4 /* encapsulated layer 3+4 */
+-
+-typedef struct ifbond {
+-	__s32 bond_mode;
+-	__s32 num_slaves;
+-	__s32 miimon;
+-} ifbond;
+-
+-typedef struct ifslave {
+-	__s32 slave_id; /* Used as an IN param to the BOND_SLAVE_INFO_QUERY ioctl */
+-	char slave_name[IFNAMSIZ];
+-	__s8 link;
+-	__s8 state;
+-	__u32  link_failure_count;
+-} ifslave;
+-
+-struct ad_info {
+-	__u16 aggregator_id;
+-	__u16 ports;
+-	__u16 actor_key;
+-	__u16 partner_key;
+-	__u8 partner_system[ETH_ALEN];
+-};
+-
+-#endif /* _LINUX_IF_BONDING_H */
+-
+-/*
+- * Local variables:
+- *  version-control: t
+- *  kept-new-versions: 5
+- *  c-indent-level: 8
+- *  c-basic-offset: 8
+- *  tab-width: 8
+- * End:
+- */
+-
+diff --git a/include/linux/if_bridge.h b/include/linux/if_bridge.h
+deleted file mode 100644
+index 156f443..0000000
+--- a/include/linux/if_bridge.h
++++ /dev/null
+@@ -1,294 +0,0 @@
+-/*
+- *	Linux ethernet bridge
+- *
+- *	Authors:
+- *	Lennert Buytenhek		<buytenh@gnu.org>
+- *
+- *	This program is free software; you can redistribute it and/or
+- *	modify it under the terms of the GNU General Public License
+- *	as published by the Free Software Foundation; either version
+- *	2 of the License, or (at your option) any later version.
+- */
+-
+-#ifndef _LINUX_IF_BRIDGE_H
+-#define _LINUX_IF_BRIDGE_H
+-
+-#include <linux/types.h>
+-#include <linux/if_ether.h>
+-#include <linux/in6.h>
+-
+-#define SYSFS_BRIDGE_ATTR	"bridge"
+-#define SYSFS_BRIDGE_FDB	"brforward"
+-#define SYSFS_BRIDGE_PORT_SUBDIR "brif"
+-#define SYSFS_BRIDGE_PORT_ATTR	"brport"
+-#define SYSFS_BRIDGE_PORT_LINK	"bridge"
+-
+-#define BRCTL_VERSION 1
+-
+-#define BRCTL_GET_VERSION 0
+-#define BRCTL_GET_BRIDGES 1
+-#define BRCTL_ADD_BRIDGE 2
+-#define BRCTL_DEL_BRIDGE 3
+-#define BRCTL_ADD_IF 4
+-#define BRCTL_DEL_IF 5
+-#define BRCTL_GET_BRIDGE_INFO 6
+-#define BRCTL_GET_PORT_LIST 7
+-#define BRCTL_SET_BRIDGE_FORWARD_DELAY 8
+-#define BRCTL_SET_BRIDGE_HELLO_TIME 9
+-#define BRCTL_SET_BRIDGE_MAX_AGE 10
+-#define BRCTL_SET_AGEING_TIME 11
+-#define BRCTL_SET_GC_INTERVAL 12
+-#define BRCTL_GET_PORT_INFO 13
+-#define BRCTL_SET_BRIDGE_STP_STATE 14
+-#define BRCTL_SET_BRIDGE_PRIORITY 15
+-#define BRCTL_SET_PORT_PRIORITY 16
+-#define BRCTL_SET_PATH_COST 17
+-#define BRCTL_GET_FDB_ENTRIES 18
+-
+-#define BR_STATE_DISABLED 0
+-#define BR_STATE_LISTENING 1
+-#define BR_STATE_LEARNING 2
+-#define BR_STATE_FORWARDING 3
+-#define BR_STATE_BLOCKING 4
+-
+-struct __bridge_info {
+-	__u64 designated_root;
+-	__u64 bridge_id;
+-	__u32 root_path_cost;
+-	__u32 max_age;
+-	__u32 hello_time;
+-	__u32 forward_delay;
+-	__u32 bridge_max_age;
+-	__u32 bridge_hello_time;
+-	__u32 bridge_forward_delay;
+-	__u8 topology_change;
+-	__u8 topology_change_detected;
+-	__u8 root_port;
+-	__u8 stp_enabled;
+-	__u32 ageing_time;
+-	__u32 gc_interval;
+-	__u32 hello_timer_value;
+-	__u32 tcn_timer_value;
+-	__u32 topology_change_timer_value;
+-	__u32 gc_timer_value;
+-};
+-
+-struct __port_info {
+-	__u64 designated_root;
+-	__u64 designated_bridge;
+-	__u16 port_id;
+-	__u16 designated_port;
+-	__u32 path_cost;
+-	__u32 designated_cost;
+-	__u8 state;
+-	__u8 top_change_ack;
+-	__u8 config_pending;
+-	__u8 unused0;
+-	__u32 message_age_timer_value;
+-	__u32 forward_delay_timer_value;
+-	__u32 hold_timer_value;
+-};
+-
+-struct __fdb_entry {
+-	__u8 mac_addr[ETH_ALEN];
+-	__u8 port_no;
+-	__u8 is_local;
+-	__u32 ageing_timer_value;
+-	__u8 port_hi;
+-	__u8 pad0;
+-	__u16 unused;
+-};
+-
+-/* Bridge Flags */
+-#define BRIDGE_FLAGS_MASTER	1	/* Bridge command to/from master */
+-#define BRIDGE_FLAGS_SELF	2	/* Bridge command to/from lowerdev */
+-
+-#define BRIDGE_MODE_VEB		0	/* Default loopback mode */
+-#define BRIDGE_MODE_VEPA	1	/* 802.1Qbg defined VEPA mode */
+-#define BRIDGE_MODE_UNDEF	0xFFFF  /* mode undefined */
+-
+-/* Bridge management nested attributes
+- * [IFLA_AF_SPEC] = {
+- *     [IFLA_BRIDGE_FLAGS]
+- *     [IFLA_BRIDGE_MODE]
+- *     [IFLA_BRIDGE_VLAN_INFO]
+- * }
+- */
+-enum {
+-	IFLA_BRIDGE_FLAGS,
+-	IFLA_BRIDGE_MODE,
+-	IFLA_BRIDGE_VLAN_INFO,
+-	IFLA_BRIDGE_VLAN_TUNNEL_INFO,
+-	__IFLA_BRIDGE_MAX,
+-};
+-#define IFLA_BRIDGE_MAX (__IFLA_BRIDGE_MAX - 1)
+-
+-#define BRIDGE_VLAN_INFO_MASTER	(1<<0)	/* Operate on Bridge device as well */
+-#define BRIDGE_VLAN_INFO_PVID	(1<<1)	/* VLAN is PVID, ingress untagged */
+-#define BRIDGE_VLAN_INFO_UNTAGGED	(1<<2)	/* VLAN egresses untagged */
+-#define BRIDGE_VLAN_INFO_RANGE_BEGIN	(1<<3) /* VLAN is start of vlan range */
+-#define BRIDGE_VLAN_INFO_RANGE_END	(1<<4) /* VLAN is end of vlan range */
+-#define BRIDGE_VLAN_INFO_BRENTRY	(1<<5) /* Global bridge VLAN entry */
+-
+-struct bridge_vlan_info {
+-	__u16 flags;
+-	__u16 vid;
+-};
+-
+-enum {
+-	IFLA_BRIDGE_VLAN_TUNNEL_UNSPEC,
+-	IFLA_BRIDGE_VLAN_TUNNEL_ID,
+-	IFLA_BRIDGE_VLAN_TUNNEL_VID,
+-	IFLA_BRIDGE_VLAN_TUNNEL_FLAGS,
+-	__IFLA_BRIDGE_VLAN_TUNNEL_MAX,
+-};
+-
+-#define IFLA_BRIDGE_VLAN_TUNNEL_MAX (__IFLA_BRIDGE_VLAN_TUNNEL_MAX - 1)
+-
+-struct bridge_vlan_xstats {
+-	__u64 rx_bytes;
+-	__u64 rx_packets;
+-	__u64 tx_bytes;
+-	__u64 tx_packets;
+-	__u16 vid;
+-	__u16 flags;
+-	__u32 pad2;
+-};
+-
+-/* Bridge multicast database attributes
+- * [MDBA_MDB] = {
+- *     [MDBA_MDB_ENTRY] = {
+- *         [MDBA_MDB_ENTRY_INFO] {
+- *		struct br_mdb_entry
+- *		[MDBA_MDB_EATTR attributes]
+- *         }
+- *     }
+- * }
+- * [MDBA_ROUTER] = {
+- *    [MDBA_ROUTER_PORT] = {
+- *        u32 ifindex
+- *        [MDBA_ROUTER_PATTR attributes]
+- *    }
+- * }
+- */
+-enum {
+-	MDBA_UNSPEC,
+-	MDBA_MDB,
+-	MDBA_ROUTER,
+-	__MDBA_MAX,
+-};
+-#define MDBA_MAX (__MDBA_MAX - 1)
+-
+-enum {
+-	MDBA_MDB_UNSPEC,
+-	MDBA_MDB_ENTRY,
+-	__MDBA_MDB_MAX,
+-};
+-#define MDBA_MDB_MAX (__MDBA_MDB_MAX - 1)
+-
+-enum {
+-	MDBA_MDB_ENTRY_UNSPEC,
+-	MDBA_MDB_ENTRY_INFO,
+-	__MDBA_MDB_ENTRY_MAX,
+-};
+-#define MDBA_MDB_ENTRY_MAX (__MDBA_MDB_ENTRY_MAX - 1)
+-
+-/* per mdb entry additional attributes */
+-enum {
+-	MDBA_MDB_EATTR_UNSPEC,
+-	MDBA_MDB_EATTR_TIMER,
+-	__MDBA_MDB_EATTR_MAX
+-};
+-#define MDBA_MDB_EATTR_MAX (__MDBA_MDB_EATTR_MAX - 1)
+-
+-/* multicast router types */
+-enum {
+-	MDB_RTR_TYPE_DISABLED,
+-	MDB_RTR_TYPE_TEMP_QUERY,
+-	MDB_RTR_TYPE_PERM,
+-	MDB_RTR_TYPE_TEMP
+-};
+-
+-enum {
+-	MDBA_ROUTER_UNSPEC,
+-	MDBA_ROUTER_PORT,
+-	__MDBA_ROUTER_MAX,
+-};
+-#define MDBA_ROUTER_MAX (__MDBA_ROUTER_MAX - 1)
+-
+-/* router port attributes */
+-enum {
+-	MDBA_ROUTER_PATTR_UNSPEC,
+-	MDBA_ROUTER_PATTR_TIMER,
+-	MDBA_ROUTER_PATTR_TYPE,
+-	__MDBA_ROUTER_PATTR_MAX
+-};
+-#define MDBA_ROUTER_PATTR_MAX (__MDBA_ROUTER_PATTR_MAX - 1)
+-
+-struct br_port_msg {
+-	__u8  family;
+-	__u32 ifindex;
+-};
+-
+-struct br_mdb_entry {
+-	__u32 ifindex;
+-#define MDB_TEMPORARY 0
+-#define MDB_PERMANENT 1
+-	__u8 state;
+-#define MDB_FLAGS_OFFLOAD	(1 << 0)
+-	__u8 flags;
+-	__u16 vid;
+-	struct {
+-		union {
+-			__be32	ip4;
+-			struct in6_addr ip6;
+-		} u;
+-		__be16		proto;
+-	} addr;
+-};
+-
+-enum {
+-	MDBA_SET_ENTRY_UNSPEC,
+-	MDBA_SET_ENTRY,
+-	__MDBA_SET_ENTRY_MAX,
+-};
+-#define MDBA_SET_ENTRY_MAX (__MDBA_SET_ENTRY_MAX - 1)
+-
+-/* Embedded inside LINK_XSTATS_TYPE_BRIDGE */
+-enum {
+-	BRIDGE_XSTATS_UNSPEC,
+-	BRIDGE_XSTATS_VLAN,
+-	BRIDGE_XSTATS_MCAST,
+-	BRIDGE_XSTATS_PAD,
+-	__BRIDGE_XSTATS_MAX
+-};
+-#define BRIDGE_XSTATS_MAX (__BRIDGE_XSTATS_MAX - 1)
+-
+-enum {
+-	BR_MCAST_DIR_RX,
+-	BR_MCAST_DIR_TX,
+-	BR_MCAST_DIR_SIZE
+-};
+-
+-/* IGMP/MLD statistics */
+-struct br_mcast_stats {
+-	__u64 igmp_v1queries[BR_MCAST_DIR_SIZE];
+-	__u64 igmp_v2queries[BR_MCAST_DIR_SIZE];
+-	__u64 igmp_v3queries[BR_MCAST_DIR_SIZE];
+-	__u64 igmp_leaves[BR_MCAST_DIR_SIZE];
+-	__u64 igmp_v1reports[BR_MCAST_DIR_SIZE];
+-	__u64 igmp_v2reports[BR_MCAST_DIR_SIZE];
+-	__u64 igmp_v3reports[BR_MCAST_DIR_SIZE];
+-	__u64 igmp_parse_errors;
+-
+-	__u64 mld_v1queries[BR_MCAST_DIR_SIZE];
+-	__u64 mld_v2queries[BR_MCAST_DIR_SIZE];
+-	__u64 mld_leaves[BR_MCAST_DIR_SIZE];
+-	__u64 mld_v1reports[BR_MCAST_DIR_SIZE];
+-	__u64 mld_v2reports[BR_MCAST_DIR_SIZE];
+-	__u64 mld_parse_errors;
+-
+-	__u64 mcast_bytes[BR_MCAST_DIR_SIZE];
+-	__u64 mcast_packets[BR_MCAST_DIR_SIZE];
+-};
+-#endif /* _LINUX_IF_BRIDGE_H */
+diff --git a/include/linux/if_ether.h b/include/linux/if_ether.h
+deleted file mode 100644
+index 7dde037..0000000
+--- a/include/linux/if_ether.h
++++ /dev/null
+@@ -1,158 +0,0 @@
+-/*
+- * INET		An implementation of the TCP/IP protocol suite for the LINUX
+- *		operating system.  INET is implemented using the  BSD Socket
+- *		interface as the means of communication with the user level.
+- *
+- *		Global definitions for the Ethernet IEEE 802.3 interface.
+- *
+- * Version:	@(#)if_ether.h	1.0.1a	02/08/94
+- *
+- * Author:	Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
+- *		Donald Becker, <becker@super.org>
+- *		Alan Cox, <alan@lxorguk.ukuu.org.uk>
+- *		Steve Whitehouse, <gw7rrm@eeshack3.swan.ac.uk>
+- *
+- *		This program is free software; you can redistribute it and/or
+- *		modify it under the terms of the GNU General Public License
+- *		as published by the Free Software Foundation; either version
+- *		2 of the License, or (at your option) any later version.
+- */
+-
+-#ifndef _LINUX_IF_ETHER_H
+-#define _LINUX_IF_ETHER_H
+-
+-#include <linux/types.h>
+-
+-/*
+- *	IEEE 802.3 Ethernet magic constants.  The frame sizes omit the preamble
+- *	and FCS/CRC (frame check sequence).
+- */
+-
+-#define ETH_ALEN	6		/* Octets in one ethernet addr	 */
+-#define ETH_HLEN	14		/* Total octets in header.	 */
+-#define ETH_ZLEN	60		/* Min. octets in frame sans FCS */
+-#define ETH_DATA_LEN	1500		/* Max. octets in payload	 */
+-#define ETH_FRAME_LEN	1514		/* Max. octets in frame sans FCS */
+-#define ETH_FCS_LEN	4		/* Octets in the FCS		 */
+-
+-#define ETH_MIN_MTU	68		/* Min IPv4 MTU per RFC791	*/
+-#define ETH_MAX_MTU	0xFFFFU		/* 65535, same as IP_MAX_MTU	*/
+-
+-/*
+- *	These are the defined Ethernet Protocol ID's.
+- */
+-
+-#define ETH_P_LOOP	0x0060		/* Ethernet Loopback packet	*/
+-#define ETH_P_PUP	0x0200		/* Xerox PUP packet		*/
+-#define ETH_P_PUPAT	0x0201		/* Xerox PUP Addr Trans packet	*/
+-#define ETH_P_TSN	0x22F0		/* TSN (IEEE 1722) packet	*/
+-#define ETH_P_IP	0x0800		/* Internet Protocol packet	*/
+-#define ETH_P_X25	0x0805		/* CCITT X.25			*/
+-#define ETH_P_ARP	0x0806		/* Address Resolution packet	*/
+-#define	ETH_P_BPQ	0x08FF		/* G8BPQ AX.25 Ethernet Packet	[ NOT AN OFFICIALLY REGISTERED ID ] */
+-#define ETH_P_IEEEPUP	0x0a00		/* Xerox IEEE802.3 PUP packet */
+-#define ETH_P_IEEEPUPAT	0x0a01		/* Xerox IEEE802.3 PUP Addr Trans packet */
+-#define ETH_P_BATMAN	0x4305		/* B.A.T.M.A.N.-Advanced packet [ NOT AN OFFICIALLY REGISTERED ID ] */
+-#define ETH_P_DEC       0x6000          /* DEC Assigned proto           */
+-#define ETH_P_DNA_DL    0x6001          /* DEC DNA Dump/Load            */
+-#define ETH_P_DNA_RC    0x6002          /* DEC DNA Remote Console       */
+-#define ETH_P_DNA_RT    0x6003          /* DEC DNA Routing              */
+-#define ETH_P_LAT       0x6004          /* DEC LAT                      */
+-#define ETH_P_DIAG      0x6005          /* DEC Diagnostics              */
+-#define ETH_P_CUST      0x6006          /* DEC Customer use             */
+-#define ETH_P_SCA       0x6007          /* DEC Systems Comms Arch       */
+-#define ETH_P_TEB	0x6558		/* Trans Ether Bridging		*/
+-#define ETH_P_RARP      0x8035		/* Reverse Addr Res packet	*/
+-#define ETH_P_ATALK	0x809B		/* Appletalk DDP		*/
+-#define ETH_P_AARP	0x80F3		/* Appletalk AARP		*/
+-#define ETH_P_8021Q	0x8100          /* 802.1Q VLAN Extended Header  */
+-#define ETH_P_ERSPAN	0x88BE		/* ERSPAN type II		*/
+-#define ETH_P_IPX	0x8137		/* IPX over DIX			*/
+-#define ETH_P_IPV6	0x86DD		/* IPv6 over bluebook		*/
+-#define ETH_P_PAUSE	0x8808		/* IEEE Pause frames. See 802.3 31B */
+-#define ETH_P_SLOW	0x8809		/* Slow Protocol. See 802.3ad 43B */
+-#define ETH_P_WCCP	0x883E		/* Web-cache coordination protocol
+-					 * defined in draft-wilson-wrec-wccp-v2-00.txt */
+-#define ETH_P_MPLS_UC	0x8847		/* MPLS Unicast traffic		*/
+-#define ETH_P_MPLS_MC	0x8848		/* MPLS Multicast traffic	*/
+-#define ETH_P_ATMMPOA	0x884c		/* MultiProtocol Over ATM	*/
+-#define ETH_P_PPP_DISC	0x8863		/* PPPoE discovery messages     */
+-#define ETH_P_PPP_SES	0x8864		/* PPPoE session messages	*/
+-#define ETH_P_LINK_CTL	0x886c		/* HPNA, wlan link local tunnel */
+-#define ETH_P_ATMFATE	0x8884		/* Frame-based ATM Transport
+-					 * over Ethernet
+-					 */
+-#define ETH_P_PAE	0x888E		/* Port Access Entity (IEEE 802.1X) */
+-#define ETH_P_AOE	0x88A2		/* ATA over Ethernet		*/
+-#define ETH_P_8021AD	0x88A8          /* 802.1ad Service VLAN		*/
+-#define ETH_P_802_EX1	0x88B5		/* 802.1 Local Experimental 1.  */
+-#define ETH_P_TIPC	0x88CA		/* TIPC 			*/
+-#define ETH_P_MACSEC	0x88E5		/* 802.1ae MACsec */
+-#define ETH_P_8021AH	0x88E7          /* 802.1ah Backbone Service Tag */
+-#define ETH_P_MVRP	0x88F5          /* 802.1Q MVRP                  */
+-#define ETH_P_1588	0x88F7		/* IEEE 1588 Timesync */
+-#define ETH_P_NCSI	0x88F8		/* NCSI protocol		*/
+-#define ETH_P_PRP	0x88FB		/* IEC 62439-3 PRP/HSRv0	*/
+-#define ETH_P_FCOE	0x8906		/* Fibre Channel over Ethernet  */
+-#define ETH_P_IBOE	0x8915		/* Infiniband over Ethernet	*/
+-#define ETH_P_TDLS	0x890D          /* TDLS */
+-#define ETH_P_FIP	0x8914		/* FCoE Initialization Protocol */
+-#define ETH_P_80221	0x8917		/* IEEE 802.21 Media Independent Handover Protocol */
+-#define ETH_P_HSR	0x892F		/* IEC 62439-3 HSRv1	*/
+-#define ETH_P_NSH	0x894F		/* Network Service Header */
+-#define ETH_P_LOOPBACK	0x9000		/* Ethernet loopback packet, per IEEE 802.3 */
+-#define ETH_P_QINQ1	0x9100		/* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */
+-#define ETH_P_QINQ2	0x9200		/* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */
+-#define ETH_P_QINQ3	0x9300		/* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */
+-#define ETH_P_EDSA	0xDADA		/* Ethertype DSA [ NOT AN OFFICIALLY REGISTERED ID ] */
+-#define ETH_P_IFE	0xED3E		/* ForCES inter-FE LFB type */
+-#define ETH_P_AF_IUCV   0xFBFB		/* IBM af_iucv [ NOT AN OFFICIALLY REGISTERED ID ] */
+-
+-#define ETH_P_802_3_MIN	0x0600		/* If the value in the ethernet type is less than this value
+-					 * then the frame is Ethernet II. Else it is 802.3 */
+-
+-/*
+- *	Non DIX types. Won't clash for 1500 types.
+- */
+-
+-#define ETH_P_802_3	0x0001		/* Dummy type for 802.3 frames  */
+-#define ETH_P_AX25	0x0002		/* Dummy protocol id for AX.25  */
+-#define ETH_P_ALL	0x0003		/* Every packet (be careful!!!) */
+-#define ETH_P_802_2	0x0004		/* 802.2 frames 		*/
+-#define ETH_P_SNAP	0x0005		/* Internal only		*/
+-#define ETH_P_DDCMP     0x0006          /* DEC DDCMP: Internal only     */
+-#define ETH_P_WAN_PPP   0x0007          /* Dummy type for WAN PPP frames*/
+-#define ETH_P_PPP_MP    0x0008          /* Dummy type for PPP MP frames */
+-#define ETH_P_LOCALTALK 0x0009		/* Localtalk pseudo type 	*/
+-#define ETH_P_CAN	0x000C		/* CAN: Controller Area Network */
+-#define ETH_P_CANFD	0x000D		/* CANFD: CAN flexible data rate*/
+-#define ETH_P_PPPTALK	0x0010		/* Dummy type for Atalk over PPP*/
+-#define ETH_P_TR_802_2	0x0011		/* 802.2 frames 		*/
+-#define ETH_P_MOBITEX	0x0015		/* Mobitex (kaz@cafe.net)	*/
+-#define ETH_P_CONTROL	0x0016		/* Card specific control frames */
+-#define ETH_P_IRDA	0x0017		/* Linux-IrDA			*/
+-#define ETH_P_ECONET	0x0018		/* Acorn Econet			*/
+-#define ETH_P_HDLC	0x0019		/* HDLC frames			*/
+-#define ETH_P_ARCNET	0x001A		/* 1A for ArcNet :-)            */
+-#define ETH_P_DSA	0x001B		/* Distributed Switch Arch.	*/
+-#define ETH_P_TRAILER	0x001C		/* Trailer switch tagging	*/
+-#define ETH_P_PHONET	0x00F5		/* Nokia Phonet frames          */
+-#define ETH_P_IEEE802154 0x00F6		/* IEEE802.15.4 frame		*/
+-#define ETH_P_CAIF	0x00F7		/* ST-Ericsson CAIF protocol	*/
+-#define ETH_P_XDSA	0x00F8		/* Multiplexed DSA protocol	*/
+-#define ETH_P_MAP	0x00F9		/* Qualcomm multiplexing and
+-					 * aggregation protocol
+-					 */
+-
+-/*
+- *	This is an Ethernet frame header.
+- */
+-
+-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 /* _LINUX_IF_ETHER_H */
+diff --git a/include/linux/if_link.h b/include/linux/if_link.h
+deleted file mode 100644
+index 1f97d05..0000000
+--- a/include/linux/if_link.h
++++ /dev/null
+@@ -1,928 +0,0 @@
+-#ifndef _LINUX_IF_LINK_H
+-#define _LINUX_IF_LINK_H
+-
+-#include <linux/types.h>
+-#include <linux/netlink.h>
+-
+-/* This struct should be in sync with struct rtnl_link_stats64 */
+-struct rtnl_link_stats {
+-	__u32	rx_packets;		/* total packets received	*/
+-	__u32	tx_packets;		/* total packets transmitted	*/
+-	__u32	rx_bytes;		/* total bytes received 	*/
+-	__u32	tx_bytes;		/* total bytes transmitted	*/
+-	__u32	rx_errors;		/* bad packets received		*/
+-	__u32	tx_errors;		/* packet transmit problems	*/
+-	__u32	rx_dropped;		/* no space in linux buffers	*/
+-	__u32	tx_dropped;		/* no space available in linux	*/
+-	__u32	multicast;		/* multicast packets received	*/
+-	__u32	collisions;
+-
+-	/* detailed rx_errors: */
+-	__u32	rx_length_errors;
+-	__u32	rx_over_errors;		/* receiver ring buff overflow	*/
+-	__u32	rx_crc_errors;		/* recved pkt with crc error	*/
+-	__u32	rx_frame_errors;	/* recv'd frame alignment error */
+-	__u32	rx_fifo_errors;		/* recv'r fifo overrun		*/
+-	__u32	rx_missed_errors;	/* receiver missed packet	*/
+-
+-	/* detailed tx_errors */
+-	__u32	tx_aborted_errors;
+-	__u32	tx_carrier_errors;
+-	__u32	tx_fifo_errors;
+-	__u32	tx_heartbeat_errors;
+-	__u32	tx_window_errors;
+-
+-	/* for cslip etc */
+-	__u32	rx_compressed;
+-	__u32	tx_compressed;
+-
+-	__u32	rx_nohandler;		/* dropped, no handler found	*/
+-};
+-
+-/* The main device statistics structure */
+-struct rtnl_link_stats64 {
+-	__u64	rx_packets;		/* total packets received	*/
+-	__u64	tx_packets;		/* total packets transmitted	*/
+-	__u64	rx_bytes;		/* total bytes received 	*/
+-	__u64	tx_bytes;		/* total bytes transmitted	*/
+-	__u64	rx_errors;		/* bad packets received		*/
+-	__u64	tx_errors;		/* packet transmit problems	*/
+-	__u64	rx_dropped;		/* no space in linux buffers	*/
+-	__u64	tx_dropped;		/* no space available in linux	*/
+-	__u64	multicast;		/* multicast packets received	*/
+-	__u64	collisions;
+-
+-	/* detailed rx_errors: */
+-	__u64	rx_length_errors;
+-	__u64	rx_over_errors;		/* receiver ring buff overflow	*/
+-	__u64	rx_crc_errors;		/* recved pkt with crc error	*/
+-	__u64	rx_frame_errors;	/* recv'd frame alignment error */
+-	__u64	rx_fifo_errors;		/* recv'r fifo overrun		*/
+-	__u64	rx_missed_errors;	/* receiver missed packet	*/
+-
+-	/* detailed tx_errors */
+-	__u64	tx_aborted_errors;
+-	__u64	tx_carrier_errors;
+-	__u64	tx_fifo_errors;
+-	__u64	tx_heartbeat_errors;
+-	__u64	tx_window_errors;
+-
+-	/* for cslip etc */
+-	__u64	rx_compressed;
+-	__u64	tx_compressed;
+-
+-	__u64	rx_nohandler;		/* dropped, no handler found	*/
+-};
+-
+-/* The struct should be in sync with struct ifmap */
+-struct rtnl_link_ifmap {
+-	__u64	mem_start;
+-	__u64	mem_end;
+-	__u64	base_addr;
+-	__u16	irq;
+-	__u8	dma;
+-	__u8	port;
+-};
+-
+-/*
+- * IFLA_AF_SPEC
+- *   Contains nested attributes for address family specific attributes.
+- *   Each address family may create a attribute with the address family
+- *   number as type and create its own attribute structure in it.
+- *
+- *   Example:
+- *   [IFLA_AF_SPEC] = {
+- *       [AF_INET] = {
+- *           [IFLA_INET_CONF] = ...,
+- *       },
+- *       [AF_INET6] = {
+- *           [IFLA_INET6_FLAGS] = ...,
+- *           [IFLA_INET6_CONF] = ...,
+- *       }
+- *   }
+- */
+-
+-enum {
+-	IFLA_UNSPEC,
+-	IFLA_ADDRESS,
+-	IFLA_BROADCAST,
+-	IFLA_IFNAME,
+-	IFLA_MTU,
+-	IFLA_LINK,
+-	IFLA_QDISC,
+-	IFLA_STATS,
+-	IFLA_COST,
+-#define IFLA_COST IFLA_COST
+-	IFLA_PRIORITY,
+-#define IFLA_PRIORITY IFLA_PRIORITY
+-	IFLA_MASTER,
+-#define IFLA_MASTER IFLA_MASTER
+-	IFLA_WIRELESS,		/* Wireless Extension event - see wireless.h */
+-#define IFLA_WIRELESS IFLA_WIRELESS
+-	IFLA_PROTINFO,		/* Protocol specific information for a link */
+-#define IFLA_PROTINFO IFLA_PROTINFO
+-	IFLA_TXQLEN,
+-#define IFLA_TXQLEN IFLA_TXQLEN
+-	IFLA_MAP,
+-#define IFLA_MAP IFLA_MAP
+-	IFLA_WEIGHT,
+-#define IFLA_WEIGHT IFLA_WEIGHT
+-	IFLA_OPERSTATE,
+-	IFLA_LINKMODE,
+-	IFLA_LINKINFO,
+-#define IFLA_LINKINFO IFLA_LINKINFO
+-	IFLA_NET_NS_PID,
+-	IFLA_IFALIAS,
+-	IFLA_NUM_VF,		/* Number of VFs if device is SR-IOV PF */
+-	IFLA_VFINFO_LIST,
+-	IFLA_STATS64,
+-	IFLA_VF_PORTS,
+-	IFLA_PORT_SELF,
+-	IFLA_AF_SPEC,
+-	IFLA_GROUP,		/* Group the device belongs to */
+-	IFLA_NET_NS_FD,
+-	IFLA_EXT_MASK,		/* Extended info mask, VFs, etc */
+-	IFLA_PROMISCUITY,	/* Promiscuity count: > 0 means acts PROMISC */
+-#define IFLA_PROMISCUITY IFLA_PROMISCUITY
+-	IFLA_NUM_TX_QUEUES,
+-	IFLA_NUM_RX_QUEUES,
+-	IFLA_CARRIER,
+-	IFLA_PHYS_PORT_ID,
+-	IFLA_CARRIER_CHANGES,
+-	IFLA_PHYS_SWITCH_ID,
+-	IFLA_LINK_NETNSID,
+-	IFLA_PHYS_PORT_NAME,
+-	IFLA_PROTO_DOWN,
+-	IFLA_GSO_MAX_SEGS,
+-	IFLA_GSO_MAX_SIZE,
+-	IFLA_PAD,
+-	IFLA_XDP,
+-	IFLA_EVENT,
+-	__IFLA_MAX
+-};
+-
+-
+-#define IFLA_MAX (__IFLA_MAX - 1)
+-
+-/* backwards compatibility for userspace */
+-#define IFLA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg))))
+-#define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg))
+-
+-enum {
+-	IFLA_INET_UNSPEC,
+-	IFLA_INET_CONF,
+-	__IFLA_INET_MAX,
+-};
+-
+-#define IFLA_INET_MAX (__IFLA_INET_MAX - 1)
+-
+-/* ifi_flags.
+-
+-   IFF_* flags.
+-
+-   The only change is:
+-   IFF_LOOPBACK, IFF_BROADCAST and IFF_POINTOPOINT are
+-   more not changeable by user. They describe link media
+-   characteristics and set by device driver.
+-
+-   Comments:
+-   - Combination IFF_BROADCAST|IFF_POINTOPOINT is invalid
+-   - If neither of these three flags are set;
+-     the interface is NBMA.
+-
+-   - IFF_MULTICAST does not mean anything special:
+-   multicasts can be used on all not-NBMA links.
+-   IFF_MULTICAST means that this media uses special encapsulation
+-   for multicast frames. Apparently, all IFF_POINTOPOINT and
+-   IFF_BROADCAST devices are able to use multicasts too.
+- */
+-
+-/* IFLA_LINK.
+-   For usual devices it is equal ifi_index.
+-   If it is a "virtual interface" (f.e. tunnel), ifi_link
+-   can point to real physical interface (f.e. for bandwidth calculations),
+-   or maybe 0, what means, that real media is unknown (usual
+-   for IPIP tunnels, when route to endpoint is allowed to change)
+- */
+-
+-/* Subtype attributes for IFLA_PROTINFO */
+-enum {
+-	IFLA_INET6_UNSPEC,
+-	IFLA_INET6_FLAGS,	/* link flags			*/
+-	IFLA_INET6_CONF,	/* sysctl parameters		*/
+-	IFLA_INET6_STATS,	/* statistics			*/
+-	IFLA_INET6_MCAST,	/* MC things. What of them?	*/
+-	IFLA_INET6_CACHEINFO,	/* time values and max reasm size */
+-	IFLA_INET6_ICMP6STATS,	/* statistics (icmpv6)		*/
+-	IFLA_INET6_TOKEN,	/* device token			*/
+-	IFLA_INET6_ADDR_GEN_MODE, /* implicit address generator mode */
+-	__IFLA_INET6_MAX
+-};
+-
+-#define IFLA_INET6_MAX	(__IFLA_INET6_MAX - 1)
+-
+-enum in6_addr_gen_mode {
+-	IN6_ADDR_GEN_MODE_EUI64,
+-	IN6_ADDR_GEN_MODE_NONE,
+-	IN6_ADDR_GEN_MODE_STABLE_PRIVACY,
+-	IN6_ADDR_GEN_MODE_RANDOM,
+-};
+-
+-/* Bridge section */
+-
+-enum {
+-	IFLA_BR_UNSPEC,
+-	IFLA_BR_FORWARD_DELAY,
+-	IFLA_BR_HELLO_TIME,
+-	IFLA_BR_MAX_AGE,
+-	IFLA_BR_AGEING_TIME,
+-	IFLA_BR_STP_STATE,
+-	IFLA_BR_PRIORITY,
+-	IFLA_BR_VLAN_FILTERING,
+-	IFLA_BR_VLAN_PROTOCOL,
+-	IFLA_BR_GROUP_FWD_MASK,
+-	IFLA_BR_ROOT_ID,
+-	IFLA_BR_BRIDGE_ID,
+-	IFLA_BR_ROOT_PORT,
+-	IFLA_BR_ROOT_PATH_COST,
+-	IFLA_BR_TOPOLOGY_CHANGE,
+-	IFLA_BR_TOPOLOGY_CHANGE_DETECTED,
+-	IFLA_BR_HELLO_TIMER,
+-	IFLA_BR_TCN_TIMER,
+-	IFLA_BR_TOPOLOGY_CHANGE_TIMER,
+-	IFLA_BR_GC_TIMER,
+-	IFLA_BR_GROUP_ADDR,
+-	IFLA_BR_FDB_FLUSH,
+-	IFLA_BR_MCAST_ROUTER,
+-	IFLA_BR_MCAST_SNOOPING,
+-	IFLA_BR_MCAST_QUERY_USE_IFADDR,
+-	IFLA_BR_MCAST_QUERIER,
+-	IFLA_BR_MCAST_HASH_ELASTICITY,
+-	IFLA_BR_MCAST_HASH_MAX,
+-	IFLA_BR_MCAST_LAST_MEMBER_CNT,
+-	IFLA_BR_MCAST_STARTUP_QUERY_CNT,
+-	IFLA_BR_MCAST_LAST_MEMBER_INTVL,
+-	IFLA_BR_MCAST_MEMBERSHIP_INTVL,
+-	IFLA_BR_MCAST_QUERIER_INTVL,
+-	IFLA_BR_MCAST_QUERY_INTVL,
+-	IFLA_BR_MCAST_QUERY_RESPONSE_INTVL,
+-	IFLA_BR_MCAST_STARTUP_QUERY_INTVL,
+-	IFLA_BR_NF_CALL_IPTABLES,
+-	IFLA_BR_NF_CALL_IP6TABLES,
+-	IFLA_BR_NF_CALL_ARPTABLES,
+-	IFLA_BR_VLAN_DEFAULT_PVID,
+-	IFLA_BR_PAD,
+-	IFLA_BR_VLAN_STATS_ENABLED,
+-	IFLA_BR_MCAST_STATS_ENABLED,
+-	IFLA_BR_MCAST_IGMP_VERSION,
+-	IFLA_BR_MCAST_MLD_VERSION,
+-	__IFLA_BR_MAX,
+-};
+-
+-#define IFLA_BR_MAX	(__IFLA_BR_MAX - 1)
+-
+-struct ifla_bridge_id {
+-	__u8	prio[2];
+-	__u8	addr[6]; /* ETH_ALEN */
+-};
+-
+-enum {
+-	BRIDGE_MODE_UNSPEC,
+-	BRIDGE_MODE_HAIRPIN,
+-};
+-
+-enum {
+-	IFLA_BRPORT_UNSPEC,
+-	IFLA_BRPORT_STATE,	/* Spanning tree state     */
+-	IFLA_BRPORT_PRIORITY,	/* "             priority  */
+-	IFLA_BRPORT_COST,	/* "             cost      */
+-	IFLA_BRPORT_MODE,	/* mode (hairpin)          */
+-	IFLA_BRPORT_GUARD,	/* bpdu guard              */
+-	IFLA_BRPORT_PROTECT,	/* root port protection    */
+-	IFLA_BRPORT_FAST_LEAVE,	/* multicast fast leave    */
+-	IFLA_BRPORT_LEARNING,	/* mac learning */
+-	IFLA_BRPORT_UNICAST_FLOOD, /* flood unicast traffic */
+-	IFLA_BRPORT_PROXYARP,	/* proxy ARP */
+-	IFLA_BRPORT_LEARNING_SYNC, /* mac learning sync from device */
+-	IFLA_BRPORT_PROXYARP_WIFI, /* proxy ARP for Wi-Fi */
+-	IFLA_BRPORT_ROOT_ID,	/* designated root */
+-	IFLA_BRPORT_BRIDGE_ID,	/* designated bridge */
+-	IFLA_BRPORT_DESIGNATED_PORT,
+-	IFLA_BRPORT_DESIGNATED_COST,
+-	IFLA_BRPORT_ID,
+-	IFLA_BRPORT_NO,
+-	IFLA_BRPORT_TOPOLOGY_CHANGE_ACK,
+-	IFLA_BRPORT_CONFIG_PENDING,
+-	IFLA_BRPORT_MESSAGE_AGE_TIMER,
+-	IFLA_BRPORT_FORWARD_DELAY_TIMER,
+-	IFLA_BRPORT_HOLD_TIMER,
+-	IFLA_BRPORT_FLUSH,
+-	IFLA_BRPORT_MULTICAST_ROUTER,
+-	IFLA_BRPORT_PAD,
+-	IFLA_BRPORT_MCAST_FLOOD,
+-	IFLA_BRPORT_MCAST_TO_UCAST,
+-	IFLA_BRPORT_VLAN_TUNNEL,
+-	IFLA_BRPORT_BCAST_FLOOD,
+-	__IFLA_BRPORT_MAX
+-};
+-#define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1)
+-
+-struct ifla_cacheinfo {
+-	__u32	max_reasm_len;
+-	__u32	tstamp;		/* ipv6InterfaceTable updated timestamp */
+-	__u32	reachable_time;
+-	__u32	retrans_time;
+-};
+-
+-enum {
+-	IFLA_INFO_UNSPEC,
+-	IFLA_INFO_KIND,
+-	IFLA_INFO_DATA,
+-	IFLA_INFO_XSTATS,
+-	IFLA_INFO_SLAVE_KIND,
+-	IFLA_INFO_SLAVE_DATA,
+-	__IFLA_INFO_MAX,
+-};
+-
+-#define IFLA_INFO_MAX	(__IFLA_INFO_MAX - 1)
+-
+-/* VLAN section */
+-
+-enum {
+-	IFLA_VLAN_UNSPEC,
+-	IFLA_VLAN_ID,
+-	IFLA_VLAN_FLAGS,
+-	IFLA_VLAN_EGRESS_QOS,
+-	IFLA_VLAN_INGRESS_QOS,
+-	IFLA_VLAN_PROTOCOL,
+-	__IFLA_VLAN_MAX,
+-};
+-
+-#define IFLA_VLAN_MAX	(__IFLA_VLAN_MAX - 1)
+-
+-struct ifla_vlan_flags {
+-	__u32	flags;
+-	__u32	mask;
+-};
+-
+-enum {
+-	IFLA_VLAN_QOS_UNSPEC,
+-	IFLA_VLAN_QOS_MAPPING,
+-	__IFLA_VLAN_QOS_MAX
+-};
+-
+-#define IFLA_VLAN_QOS_MAX	(__IFLA_VLAN_QOS_MAX - 1)
+-
+-struct ifla_vlan_qos_mapping {
+-	__u32 from;
+-	__u32 to;
+-};
+-
+-/* MACVLAN section */
+-enum {
+-	IFLA_MACVLAN_UNSPEC,
+-	IFLA_MACVLAN_MODE,
+-	IFLA_MACVLAN_FLAGS,
+-	IFLA_MACVLAN_MACADDR_MODE,
+-	IFLA_MACVLAN_MACADDR,
+-	IFLA_MACVLAN_MACADDR_DATA,
+-	IFLA_MACVLAN_MACADDR_COUNT,
+-	__IFLA_MACVLAN_MAX,
+-};
+-
+-#define IFLA_MACVLAN_MAX (__IFLA_MACVLAN_MAX - 1)
+-
+-enum macvlan_mode {
+-	MACVLAN_MODE_PRIVATE = 1, /* don't talk to other macvlans */
+-	MACVLAN_MODE_VEPA    = 2, /* talk to other ports through ext bridge */
+-	MACVLAN_MODE_BRIDGE  = 4, /* talk to bridge ports directly */
+-	MACVLAN_MODE_PASSTHRU = 8,/* take over the underlying device */
+-	MACVLAN_MODE_SOURCE  = 16,/* use source MAC address list to assign */
+-};
+-
+-enum macvlan_macaddr_mode {
+-	MACVLAN_MACADDR_ADD,
+-	MACVLAN_MACADDR_DEL,
+-	MACVLAN_MACADDR_FLUSH,
+-	MACVLAN_MACADDR_SET,
+-};
+-
+-#define MACVLAN_FLAG_NOPROMISC	1
+-
+-/* VRF section */
+-enum {
+-	IFLA_VRF_UNSPEC,
+-	IFLA_VRF_TABLE,
+-	__IFLA_VRF_MAX
+-};
+-
+-#define IFLA_VRF_MAX (__IFLA_VRF_MAX - 1)
+-
+-enum {
+-	IFLA_VRF_PORT_UNSPEC,
+-	IFLA_VRF_PORT_TABLE,
+-	__IFLA_VRF_PORT_MAX
+-};
+-
+-#define IFLA_VRF_PORT_MAX (__IFLA_VRF_PORT_MAX - 1)
+-
+-/* MACSEC section */
+-enum {
+-	IFLA_MACSEC_UNSPEC,
+-	IFLA_MACSEC_SCI,
+-	IFLA_MACSEC_PORT,
+-	IFLA_MACSEC_ICV_LEN,
+-	IFLA_MACSEC_CIPHER_SUITE,
+-	IFLA_MACSEC_WINDOW,
+-	IFLA_MACSEC_ENCODING_SA,
+-	IFLA_MACSEC_ENCRYPT,
+-	IFLA_MACSEC_PROTECT,
+-	IFLA_MACSEC_INC_SCI,
+-	IFLA_MACSEC_ES,
+-	IFLA_MACSEC_SCB,
+-	IFLA_MACSEC_REPLAY_PROTECT,
+-	IFLA_MACSEC_VALIDATION,
+-	IFLA_MACSEC_PAD,
+-	__IFLA_MACSEC_MAX,
+-};
+-
+-#define IFLA_MACSEC_MAX (__IFLA_MACSEC_MAX - 1)
+-
+-enum macsec_validation_type {
+-	MACSEC_VALIDATE_DISABLED = 0,
+-	MACSEC_VALIDATE_CHECK = 1,
+-	MACSEC_VALIDATE_STRICT = 2,
+-	__MACSEC_VALIDATE_END,
+-	MACSEC_VALIDATE_MAX = __MACSEC_VALIDATE_END - 1,
+-};
+-
+-/* IPVLAN section */
+-enum {
+-	IFLA_IPVLAN_UNSPEC,
+-	IFLA_IPVLAN_MODE,
+-	__IFLA_IPVLAN_MAX
+-};
+-
+-#define IFLA_IPVLAN_MAX (__IFLA_IPVLAN_MAX - 1)
+-
+-enum ipvlan_mode {
+-	IPVLAN_MODE_L2 = 0,
+-	IPVLAN_MODE_L3,
+-	IPVLAN_MODE_L3S,
+-	IPVLAN_MODE_MAX
+-};
+-
+-/* VXLAN section */
+-enum {
+-	IFLA_VXLAN_UNSPEC,
+-	IFLA_VXLAN_ID,
+-	IFLA_VXLAN_GROUP,	/* group or remote address */
+-	IFLA_VXLAN_LINK,
+-	IFLA_VXLAN_LOCAL,
+-	IFLA_VXLAN_TTL,
+-	IFLA_VXLAN_TOS,
+-	IFLA_VXLAN_LEARNING,
+-	IFLA_VXLAN_AGEING,
+-	IFLA_VXLAN_LIMIT,
+-	IFLA_VXLAN_PORT_RANGE,	/* source port */
+-	IFLA_VXLAN_PROXY,
+-	IFLA_VXLAN_RSC,
+-	IFLA_VXLAN_L2MISS,
+-	IFLA_VXLAN_L3MISS,
+-	IFLA_VXLAN_PORT,	/* destination port */
+-	IFLA_VXLAN_GROUP6,
+-	IFLA_VXLAN_LOCAL6,
+-	IFLA_VXLAN_UDP_CSUM,
+-	IFLA_VXLAN_UDP_ZERO_CSUM6_TX,
+-	IFLA_VXLAN_UDP_ZERO_CSUM6_RX,
+-	IFLA_VXLAN_REMCSUM_TX,
+-	IFLA_VXLAN_REMCSUM_RX,
+-	IFLA_VXLAN_GBP,
+-	IFLA_VXLAN_REMCSUM_NOPARTIAL,
+-	IFLA_VXLAN_COLLECT_METADATA,
+-	IFLA_VXLAN_LABEL,
+-	IFLA_VXLAN_GPE,
+-	__IFLA_VXLAN_MAX
+-};
+-#define IFLA_VXLAN_MAX	(__IFLA_VXLAN_MAX - 1)
+-
+-struct ifla_vxlan_port_range {
+-	__be16	low;
+-	__be16	high;
+-};
+-
+-/* GENEVE section */
+-enum {
+-	IFLA_GENEVE_UNSPEC,
+-	IFLA_GENEVE_ID,
+-	IFLA_GENEVE_REMOTE,
+-	IFLA_GENEVE_TTL,
+-	IFLA_GENEVE_TOS,
+-	IFLA_GENEVE_PORT,	/* destination port */
+-	IFLA_GENEVE_COLLECT_METADATA,
+-	IFLA_GENEVE_REMOTE6,
+-	IFLA_GENEVE_UDP_CSUM,
+-	IFLA_GENEVE_UDP_ZERO_CSUM6_TX,
+-	IFLA_GENEVE_UDP_ZERO_CSUM6_RX,
+-	IFLA_GENEVE_LABEL,
+-	__IFLA_GENEVE_MAX
+-};
+-#define IFLA_GENEVE_MAX	(__IFLA_GENEVE_MAX - 1)
+-
+-/* PPP section */
+-enum {
+-	IFLA_PPP_UNSPEC,
+-	IFLA_PPP_DEV_FD,
+-	__IFLA_PPP_MAX
+-};
+-#define IFLA_PPP_MAX (__IFLA_PPP_MAX - 1)
+-
+-/* GTP section */
+-
+-enum ifla_gtp_role {
+-	GTP_ROLE_GGSN = 0,
+-	GTP_ROLE_SGSN,
+-};
+-
+-enum {
+-	IFLA_GTP_UNSPEC,
+-	IFLA_GTP_FD0,
+-	IFLA_GTP_FD1,
+-	IFLA_GTP_PDP_HASHSIZE,
+-	IFLA_GTP_ROLE,
+-	__IFLA_GTP_MAX,
+-};
+-#define IFLA_GTP_MAX (__IFLA_GTP_MAX - 1)
+-
+-/* Bonding section */
+-
+-enum {
+-	IFLA_BOND_UNSPEC,
+-	IFLA_BOND_MODE,
+-	IFLA_BOND_ACTIVE_SLAVE,
+-	IFLA_BOND_MIIMON,
+-	IFLA_BOND_UPDELAY,
+-	IFLA_BOND_DOWNDELAY,
+-	IFLA_BOND_USE_CARRIER,
+-	IFLA_BOND_ARP_INTERVAL,
+-	IFLA_BOND_ARP_IP_TARGET,
+-	IFLA_BOND_ARP_VALIDATE,
+-	IFLA_BOND_ARP_ALL_TARGETS,
+-	IFLA_BOND_PRIMARY,
+-	IFLA_BOND_PRIMARY_RESELECT,
+-	IFLA_BOND_FAIL_OVER_MAC,
+-	IFLA_BOND_XMIT_HASH_POLICY,
+-	IFLA_BOND_RESEND_IGMP,
+-	IFLA_BOND_NUM_PEER_NOTIF,
+-	IFLA_BOND_ALL_SLAVES_ACTIVE,
+-	IFLA_BOND_MIN_LINKS,
+-	IFLA_BOND_LP_INTERVAL,
+-	IFLA_BOND_PACKETS_PER_SLAVE,
+-	IFLA_BOND_AD_LACP_RATE,
+-	IFLA_BOND_AD_SELECT,
+-	IFLA_BOND_AD_INFO,
+-	IFLA_BOND_AD_ACTOR_SYS_PRIO,
+-	IFLA_BOND_AD_USER_PORT_KEY,
+-	IFLA_BOND_AD_ACTOR_SYSTEM,
+-	IFLA_BOND_TLB_DYNAMIC_LB,
+-	__IFLA_BOND_MAX,
+-};
+-
+-#define IFLA_BOND_MAX	(__IFLA_BOND_MAX - 1)
+-
+-enum {
+-	IFLA_BOND_AD_INFO_UNSPEC,
+-	IFLA_BOND_AD_INFO_AGGREGATOR,
+-	IFLA_BOND_AD_INFO_NUM_PORTS,
+-	IFLA_BOND_AD_INFO_ACTOR_KEY,
+-	IFLA_BOND_AD_INFO_PARTNER_KEY,
+-	IFLA_BOND_AD_INFO_PARTNER_MAC,
+-	__IFLA_BOND_AD_INFO_MAX,
+-};
+-
+-#define IFLA_BOND_AD_INFO_MAX	(__IFLA_BOND_AD_INFO_MAX - 1)
+-
+-enum {
+-	IFLA_BOND_SLAVE_UNSPEC,
+-	IFLA_BOND_SLAVE_STATE,
+-	IFLA_BOND_SLAVE_MII_STATUS,
+-	IFLA_BOND_SLAVE_LINK_FAILURE_COUNT,
+-	IFLA_BOND_SLAVE_PERM_HWADDR,
+-	IFLA_BOND_SLAVE_QUEUE_ID,
+-	IFLA_BOND_SLAVE_AD_AGGREGATOR_ID,
+-	IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE,
+-	IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE,
+-	__IFLA_BOND_SLAVE_MAX,
+-};
+-
+-#define IFLA_BOND_SLAVE_MAX	(__IFLA_BOND_SLAVE_MAX - 1)
+-
+-/* SR-IOV virtual function management section */
+-
+-enum {
+-	IFLA_VF_INFO_UNSPEC,
+-	IFLA_VF_INFO,
+-	__IFLA_VF_INFO_MAX,
+-};
+-
+-#define IFLA_VF_INFO_MAX (__IFLA_VF_INFO_MAX - 1)
+-
+-enum {
+-	IFLA_VF_UNSPEC,
+-	IFLA_VF_MAC,		/* Hardware queue specific attributes */
+-	IFLA_VF_VLAN,		/* VLAN ID and QoS */
+-	IFLA_VF_TX_RATE,	/* Max TX Bandwidth Allocation */
+-	IFLA_VF_SPOOFCHK,	/* Spoof Checking on/off switch */
+-	IFLA_VF_LINK_STATE,	/* link state enable/disable/auto switch */
+-	IFLA_VF_RATE,		/* Min and Max TX Bandwidth Allocation */
+-	IFLA_VF_RSS_QUERY_EN,	/* RSS Redirection Table and Hash Key query
+-				 * on/off switch
+-				 */
+-	IFLA_VF_STATS,		/* network device statistics */
+-	IFLA_VF_TRUST,		/* Trust VF */
+-	IFLA_VF_IB_NODE_GUID,	/* VF Infiniband node GUID */
+-	IFLA_VF_IB_PORT_GUID,	/* VF Infiniband port GUID */
+-	IFLA_VF_VLAN_LIST,	/* nested list of vlans, option for QinQ */
+-	__IFLA_VF_MAX,
+-};
+-
+-#define IFLA_VF_MAX (__IFLA_VF_MAX - 1)
+-
+-struct ifla_vf_mac {
+-	__u32 vf;
+-	__u8 mac[32]; /* MAX_ADDR_LEN */
+-};
+-
+-struct ifla_vf_vlan {
+-	__u32 vf;
+-	__u32 vlan; /* 0 - 4095, 0 disables VLAN filter */
+-	__u32 qos;
+-};
+-
+-enum {
+-	IFLA_VF_VLAN_INFO_UNSPEC,
+-	IFLA_VF_VLAN_INFO,	/* VLAN ID, QoS and VLAN protocol */
+-	__IFLA_VF_VLAN_INFO_MAX,
+-};
+-
+-#define IFLA_VF_VLAN_INFO_MAX (__IFLA_VF_VLAN_INFO_MAX - 1)
+-#define MAX_VLAN_LIST_LEN 1
+-
+-struct ifla_vf_vlan_info {
+-	__u32 vf;
+-	__u32 vlan; /* 0 - 4095, 0 disables VLAN filter */
+-	__u32 qos;
+-	__be16 vlan_proto; /* VLAN protocol either 802.1Q or 802.1ad */
+-};
+-
+-struct ifla_vf_tx_rate {
+-	__u32 vf;
+-	__u32 rate; /* Max TX bandwidth in Mbps, 0 disables throttling */
+-};
+-
+-struct ifla_vf_rate {
+-	__u32 vf;
+-	__u32 min_tx_rate; /* Min Bandwidth in Mbps */
+-	__u32 max_tx_rate; /* Max Bandwidth in Mbps */
+-};
+-
+-struct ifla_vf_spoofchk {
+-	__u32 vf;
+-	__u32 setting;
+-};
+-
+-struct ifla_vf_guid {
+-	__u32 vf;
+-	__u64 guid;
+-};
+-
+-enum {
+-	IFLA_VF_LINK_STATE_AUTO,	/* link state of the uplink */
+-	IFLA_VF_LINK_STATE_ENABLE,	/* link always up */
+-	IFLA_VF_LINK_STATE_DISABLE,	/* link always down */
+-	__IFLA_VF_LINK_STATE_MAX,
+-};
+-
+-struct ifla_vf_link_state {
+-	__u32 vf;
+-	__u32 link_state;
+-};
+-
+-struct ifla_vf_rss_query_en {
+-	__u32 vf;
+-	__u32 setting;
+-};
+-
+-enum {
+-	IFLA_VF_STATS_RX_PACKETS,
+-	IFLA_VF_STATS_TX_PACKETS,
+-	IFLA_VF_STATS_RX_BYTES,
+-	IFLA_VF_STATS_TX_BYTES,
+-	IFLA_VF_STATS_BROADCAST,
+-	IFLA_VF_STATS_MULTICAST,
+-	IFLA_VF_STATS_PAD,
+-	__IFLA_VF_STATS_MAX,
+-};
+-
+-#define IFLA_VF_STATS_MAX (__IFLA_VF_STATS_MAX - 1)
+-
+-struct ifla_vf_trust {
+-	__u32 vf;
+-	__u32 setting;
+-};
+-
+-/* VF ports management section
+- *
+- *	Nested layout of set/get msg is:
+- *
+- *		[IFLA_NUM_VF]
+- *		[IFLA_VF_PORTS]
+- *			[IFLA_VF_PORT]
+- *				[IFLA_PORT_*], ...
+- *			[IFLA_VF_PORT]
+- *				[IFLA_PORT_*], ...
+- *			...
+- *		[IFLA_PORT_SELF]
+- *			[IFLA_PORT_*], ...
+- */
+-
+-enum {
+-	IFLA_VF_PORT_UNSPEC,
+-	IFLA_VF_PORT,			/* nest */
+-	__IFLA_VF_PORT_MAX,
+-};
+-
+-#define IFLA_VF_PORT_MAX (__IFLA_VF_PORT_MAX - 1)
+-
+-enum {
+-	IFLA_PORT_UNSPEC,
+-	IFLA_PORT_VF,			/* __u32 */
+-	IFLA_PORT_PROFILE,		/* string */
+-	IFLA_PORT_VSI_TYPE,		/* 802.1Qbg (pre-)standard VDP */
+-	IFLA_PORT_INSTANCE_UUID,	/* binary UUID */
+-	IFLA_PORT_HOST_UUID,		/* binary UUID */
+-	IFLA_PORT_REQUEST,		/* __u8 */
+-	IFLA_PORT_RESPONSE,		/* __u16, output only */
+-	__IFLA_PORT_MAX,
+-};
+-
+-#define IFLA_PORT_MAX (__IFLA_PORT_MAX - 1)
+-
+-#define PORT_PROFILE_MAX	40
+-#define PORT_UUID_MAX		16
+-#define PORT_SELF_VF		-1
+-
+-enum {
+-	PORT_REQUEST_PREASSOCIATE = 0,
+-	PORT_REQUEST_PREASSOCIATE_RR,
+-	PORT_REQUEST_ASSOCIATE,
+-	PORT_REQUEST_DISASSOCIATE,
+-};
+-
+-enum {
+-	PORT_VDP_RESPONSE_SUCCESS = 0,
+-	PORT_VDP_RESPONSE_INVALID_FORMAT,
+-	PORT_VDP_RESPONSE_INSUFFICIENT_RESOURCES,
+-	PORT_VDP_RESPONSE_UNUSED_VTID,
+-	PORT_VDP_RESPONSE_VTID_VIOLATION,
+-	PORT_VDP_RESPONSE_VTID_VERSION_VIOALTION,
+-	PORT_VDP_RESPONSE_OUT_OF_SYNC,
+-	/* 0x08-0xFF reserved for future VDP use */
+-	PORT_PROFILE_RESPONSE_SUCCESS = 0x100,
+-	PORT_PROFILE_RESPONSE_INPROGRESS,
+-	PORT_PROFILE_RESPONSE_INVALID,
+-	PORT_PROFILE_RESPONSE_BADSTATE,
+-	PORT_PROFILE_RESPONSE_INSUFFICIENT_RESOURCES,
+-	PORT_PROFILE_RESPONSE_ERROR,
+-};
+-
+-struct ifla_port_vsi {
+-	__u8 vsi_mgr_id;
+-	__u8 vsi_type_id[3];
+-	__u8 vsi_type_version;
+-	__u8 pad[3];
+-};
+-
+-
+-/* IPoIB section */
+-
+-enum {
+-	IFLA_IPOIB_UNSPEC,
+-	IFLA_IPOIB_PKEY,
+-	IFLA_IPOIB_MODE,
+-	IFLA_IPOIB_UMCAST,
+-	__IFLA_IPOIB_MAX
+-};
+-
+-enum {
+-	IPOIB_MODE_DATAGRAM  = 0, /* using unreliable datagram QPs */
+-	IPOIB_MODE_CONNECTED = 1, /* using connected QPs */
+-};
+-
+-#define IFLA_IPOIB_MAX (__IFLA_IPOIB_MAX - 1)
+-
+-
+-/* HSR section */
+-
+-enum {
+-	IFLA_HSR_UNSPEC,
+-	IFLA_HSR_SLAVE1,
+-	IFLA_HSR_SLAVE2,
+-	IFLA_HSR_MULTICAST_SPEC,	/* Last byte of supervision addr */
+-	IFLA_HSR_SUPERVISION_ADDR,	/* Supervision frame multicast addr */
+-	IFLA_HSR_SEQ_NR,
+-	IFLA_HSR_VERSION,		/* HSR version */
+-	__IFLA_HSR_MAX,
+-};
+-
+-#define IFLA_HSR_MAX (__IFLA_HSR_MAX - 1)
+-
+-/* STATS section */
+-
+-struct if_stats_msg {
+-	__u8  family;
+-	__u8  pad1;
+-	__u16 pad2;
+-	__u32 ifindex;
+-	__u32 filter_mask;
+-};
+-
+-/* A stats attribute can be netdev specific or a global stat.
+- * For netdev stats, lets use the prefix IFLA_STATS_LINK_*
+- */
+-enum {
+-	IFLA_STATS_UNSPEC, /* also used as 64bit pad attribute */
+-	IFLA_STATS_LINK_64,
+-	IFLA_STATS_LINK_XSTATS,
+-	IFLA_STATS_LINK_XSTATS_SLAVE,
+-	IFLA_STATS_LINK_OFFLOAD_XSTATS,
+-	IFLA_STATS_AF_SPEC,
+-	__IFLA_STATS_MAX,
+-};
+-
+-#define IFLA_STATS_MAX (__IFLA_STATS_MAX - 1)
+-
+-#define IFLA_STATS_FILTER_BIT(ATTR)	(1 << (ATTR - 1))
+-
+-/* These are embedded into IFLA_STATS_LINK_XSTATS:
+- * [IFLA_STATS_LINK_XSTATS]
+- * -> [LINK_XSTATS_TYPE_xxx]
+- *    -> [rtnl link type specific attributes]
+- */
+-enum {
+-	LINK_XSTATS_TYPE_UNSPEC,
+-	LINK_XSTATS_TYPE_BRIDGE,
+-	__LINK_XSTATS_TYPE_MAX
+-};
+-#define LINK_XSTATS_TYPE_MAX (__LINK_XSTATS_TYPE_MAX - 1)
+-
+-/* These are stats embedded into IFLA_STATS_LINK_OFFLOAD_XSTATS */
+-enum {
+-	IFLA_OFFLOAD_XSTATS_UNSPEC,
+-	IFLA_OFFLOAD_XSTATS_CPU_HIT, /* struct rtnl_link_stats64 */
+-	__IFLA_OFFLOAD_XSTATS_MAX
+-};
+-#define IFLA_OFFLOAD_XSTATS_MAX (__IFLA_OFFLOAD_XSTATS_MAX - 1)
+-
+-/* XDP section */
+-
+-#define XDP_FLAGS_UPDATE_IF_NOEXIST	(1U << 0)
+-#define XDP_FLAGS_SKB_MODE		(1U << 1)
+-#define XDP_FLAGS_DRV_MODE		(1U << 2)
+-#define XDP_FLAGS_HW_MODE		(1U << 3)
+-#define XDP_FLAGS_MODES			(XDP_FLAGS_SKB_MODE | \
+-					 XDP_FLAGS_DRV_MODE | \
+-					 XDP_FLAGS_HW_MODE)
+-#define XDP_FLAGS_MASK			(XDP_FLAGS_UPDATE_IF_NOEXIST | \
+-					 XDP_FLAGS_MODES)
+-
+-/* These are stored into IFLA_XDP_ATTACHED on dump. */
+-enum {
+-	XDP_ATTACHED_NONE = 0,
+-	XDP_ATTACHED_DRV,
+-	XDP_ATTACHED_SKB,
+-	XDP_ATTACHED_HW,
+-};
+-
+-enum {
+-	IFLA_XDP_UNSPEC,
+-	IFLA_XDP_FD,
+-	IFLA_XDP_ATTACHED,
+-	IFLA_XDP_FLAGS,
+-	IFLA_XDP_PROG_ID,
+-	__IFLA_XDP_MAX,
+-};
+-
+-#define IFLA_XDP_MAX (__IFLA_XDP_MAX - 1)
+-
+-enum {
+-	IFLA_EVENT_NONE,
+-	IFLA_EVENT_REBOOT,		/* internal reset / reboot */
+-	IFLA_EVENT_FEATURES,		/* change in offload features */
+-	IFLA_EVENT_BONDING_FAILOVER,	/* change in active slave */
+-	IFLA_EVENT_NOTIFY_PEERS,	/* re-sent grat. arp/ndisc */
+-	IFLA_EVENT_IGMP_RESEND,		/* re-sent IGMP JOIN */
+-	IFLA_EVENT_BONDING_OPTIONS,	/* change in bonding options */
+-};
+-
+-#endif /* _LINUX_IF_LINK_H */
+diff --git a/include/linux/if_macsec.h b/include/linux/if_macsec.h
+deleted file mode 100644
+index 22939a3..0000000
+--- a/include/linux/if_macsec.h
++++ /dev/null
+@@ -1,171 +0,0 @@
+-/*
+- * include/uapi/linux/if_macsec.h - MACsec device
+- *
+- * Copyright (c) 2015 Sabrina Dubroca <sd@queasysnail.net>
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- */
+-
+-#ifndef _MACSEC_H
+-#define _MACSEC_H
+-
+-#include <linux/types.h>
+-
+-#define MACSEC_GENL_NAME "macsec"
+-#define MACSEC_GENL_VERSION 1
+-
+-#define MACSEC_MAX_KEY_LEN 128
+-
+-#define MACSEC_KEYID_LEN 16
+-
+-#define MACSEC_DEFAULT_CIPHER_ID   0x0080020001000001ULL
+-#define MACSEC_DEFAULT_CIPHER_ALT  0x0080C20001000001ULL
+-
+-#define MACSEC_MIN_ICV_LEN 8
+-#define MACSEC_MAX_ICV_LEN 32
+-/* upper limit for ICV length as recommended by IEEE802.1AE-2006 */
+-#define MACSEC_STD_ICV_LEN 16
+-
+-enum macsec_attrs {
+-	MACSEC_ATTR_UNSPEC,
+-	MACSEC_ATTR_IFINDEX,     /* u32, ifindex of the MACsec netdevice */
+-	MACSEC_ATTR_RXSC_CONFIG, /* config, nested macsec_rxsc_attrs */
+-	MACSEC_ATTR_SA_CONFIG,   /* config, nested macsec_sa_attrs */
+-	MACSEC_ATTR_SECY,        /* dump, nested macsec_secy_attrs */
+-	MACSEC_ATTR_TXSA_LIST,   /* dump, nested, macsec_sa_attrs for each TXSA */
+-	MACSEC_ATTR_RXSC_LIST,   /* dump, nested, macsec_rxsc_attrs for each RXSC */
+-	MACSEC_ATTR_TXSC_STATS,  /* dump, nested, macsec_txsc_stats_attr */
+-	MACSEC_ATTR_SECY_STATS,  /* dump, nested, macsec_secy_stats_attr */
+-	__MACSEC_ATTR_END,
+-	NUM_MACSEC_ATTR = __MACSEC_ATTR_END,
+-	MACSEC_ATTR_MAX = __MACSEC_ATTR_END - 1,
+-};
+-
+-enum macsec_secy_attrs {
+-	MACSEC_SECY_ATTR_UNSPEC,
+-	MACSEC_SECY_ATTR_SCI,
+-	MACSEC_SECY_ATTR_ENCODING_SA,
+-	MACSEC_SECY_ATTR_WINDOW,
+-	MACSEC_SECY_ATTR_CIPHER_SUITE,
+-	MACSEC_SECY_ATTR_ICV_LEN,
+-	MACSEC_SECY_ATTR_PROTECT,
+-	MACSEC_SECY_ATTR_REPLAY,
+-	MACSEC_SECY_ATTR_OPER,
+-	MACSEC_SECY_ATTR_VALIDATE,
+-	MACSEC_SECY_ATTR_ENCRYPT,
+-	MACSEC_SECY_ATTR_INC_SCI,
+-	MACSEC_SECY_ATTR_ES,
+-	MACSEC_SECY_ATTR_SCB,
+-	MACSEC_SECY_ATTR_PAD,
+-	__MACSEC_SECY_ATTR_END,
+-	NUM_MACSEC_SECY_ATTR = __MACSEC_SECY_ATTR_END,
+-	MACSEC_SECY_ATTR_MAX = __MACSEC_SECY_ATTR_END - 1,
+-};
+-
+-enum macsec_rxsc_attrs {
+-	MACSEC_RXSC_ATTR_UNSPEC,
+-	MACSEC_RXSC_ATTR_SCI,     /* config/dump, u64 */
+-	MACSEC_RXSC_ATTR_ACTIVE,  /* config/dump, u8 0..1 */
+-	MACSEC_RXSC_ATTR_SA_LIST, /* dump, nested */
+-	MACSEC_RXSC_ATTR_STATS,   /* dump, nested, macsec_rxsc_stats_attr */
+-	MACSEC_RXSC_ATTR_PAD,
+-	__MACSEC_RXSC_ATTR_END,
+-	NUM_MACSEC_RXSC_ATTR = __MACSEC_RXSC_ATTR_END,
+-	MACSEC_RXSC_ATTR_MAX = __MACSEC_RXSC_ATTR_END - 1,
+-};
+-
+-enum macsec_sa_attrs {
+-	MACSEC_SA_ATTR_UNSPEC,
+-	MACSEC_SA_ATTR_AN,     /* config/dump, u8 0..3 */
+-	MACSEC_SA_ATTR_ACTIVE, /* config/dump, u8 0..1 */
+-	MACSEC_SA_ATTR_PN,     /* config/dump, u32 */
+-	MACSEC_SA_ATTR_KEY,    /* config, data */
+-	MACSEC_SA_ATTR_KEYID,  /* config/dump, 128-bit */
+-	MACSEC_SA_ATTR_STATS,  /* dump, nested, macsec_sa_stats_attr */
+-	MACSEC_SA_ATTR_PAD,
+-	__MACSEC_SA_ATTR_END,
+-	NUM_MACSEC_SA_ATTR = __MACSEC_SA_ATTR_END,
+-	MACSEC_SA_ATTR_MAX = __MACSEC_SA_ATTR_END - 1,
+-};
+-
+-enum macsec_nl_commands {
+-	MACSEC_CMD_GET_TXSC,
+-	MACSEC_CMD_ADD_RXSC,
+-	MACSEC_CMD_DEL_RXSC,
+-	MACSEC_CMD_UPD_RXSC,
+-	MACSEC_CMD_ADD_TXSA,
+-	MACSEC_CMD_DEL_TXSA,
+-	MACSEC_CMD_UPD_TXSA,
+-	MACSEC_CMD_ADD_RXSA,
+-	MACSEC_CMD_DEL_RXSA,
+-	MACSEC_CMD_UPD_RXSA,
+-};
+-
+-/* u64 per-RXSC stats */
+-enum macsec_rxsc_stats_attr {
+-	MACSEC_RXSC_STATS_ATTR_UNSPEC,
+-	MACSEC_RXSC_STATS_ATTR_IN_OCTETS_VALIDATED,
+-	MACSEC_RXSC_STATS_ATTR_IN_OCTETS_DECRYPTED,
+-	MACSEC_RXSC_STATS_ATTR_IN_PKTS_UNCHECKED,
+-	MACSEC_RXSC_STATS_ATTR_IN_PKTS_DELAYED,
+-	MACSEC_RXSC_STATS_ATTR_IN_PKTS_OK,
+-	MACSEC_RXSC_STATS_ATTR_IN_PKTS_INVALID,
+-	MACSEC_RXSC_STATS_ATTR_IN_PKTS_LATE,
+-	MACSEC_RXSC_STATS_ATTR_IN_PKTS_NOT_VALID,
+-	MACSEC_RXSC_STATS_ATTR_IN_PKTS_NOT_USING_SA,
+-	MACSEC_RXSC_STATS_ATTR_IN_PKTS_UNUSED_SA,
+-	MACSEC_RXSC_STATS_ATTR_PAD,
+-	__MACSEC_RXSC_STATS_ATTR_END,
+-	NUM_MACSEC_RXSC_STATS_ATTR = __MACSEC_RXSC_STATS_ATTR_END,
+-	MACSEC_RXSC_STATS_ATTR_MAX = __MACSEC_RXSC_STATS_ATTR_END - 1,
+-};
+-
+-/* u32 per-{RX,TX}SA stats */
+-enum macsec_sa_stats_attr {
+-	MACSEC_SA_STATS_ATTR_UNSPEC,
+-	MACSEC_SA_STATS_ATTR_IN_PKTS_OK,
+-	MACSEC_SA_STATS_ATTR_IN_PKTS_INVALID,
+-	MACSEC_SA_STATS_ATTR_IN_PKTS_NOT_VALID,
+-	MACSEC_SA_STATS_ATTR_IN_PKTS_NOT_USING_SA,
+-	MACSEC_SA_STATS_ATTR_IN_PKTS_UNUSED_SA,
+-	MACSEC_SA_STATS_ATTR_OUT_PKTS_PROTECTED,
+-	MACSEC_SA_STATS_ATTR_OUT_PKTS_ENCRYPTED,
+-	__MACSEC_SA_STATS_ATTR_END,
+-	NUM_MACSEC_SA_STATS_ATTR = __MACSEC_SA_STATS_ATTR_END,
+-	MACSEC_SA_STATS_ATTR_MAX = __MACSEC_SA_STATS_ATTR_END - 1,
+-};
+-
+-/* u64 per-TXSC stats */
+-enum macsec_txsc_stats_attr {
+-	MACSEC_TXSC_STATS_ATTR_UNSPEC,
+-	MACSEC_TXSC_STATS_ATTR_OUT_PKTS_PROTECTED,
+-	MACSEC_TXSC_STATS_ATTR_OUT_PKTS_ENCRYPTED,
+-	MACSEC_TXSC_STATS_ATTR_OUT_OCTETS_PROTECTED,
+-	MACSEC_TXSC_STATS_ATTR_OUT_OCTETS_ENCRYPTED,
+-	MACSEC_TXSC_STATS_ATTR_PAD,
+-	__MACSEC_TXSC_STATS_ATTR_END,
+-	NUM_MACSEC_TXSC_STATS_ATTR = __MACSEC_TXSC_STATS_ATTR_END,
+-	MACSEC_TXSC_STATS_ATTR_MAX = __MACSEC_TXSC_STATS_ATTR_END - 1,
+-};
+-
+-/* u64 per-SecY stats */
+-enum macsec_secy_stats_attr {
+-	MACSEC_SECY_STATS_ATTR_UNSPEC,
+-	MACSEC_SECY_STATS_ATTR_OUT_PKTS_UNTAGGED,
+-	MACSEC_SECY_STATS_ATTR_IN_PKTS_UNTAGGED,
+-	MACSEC_SECY_STATS_ATTR_OUT_PKTS_TOO_LONG,
+-	MACSEC_SECY_STATS_ATTR_IN_PKTS_NO_TAG,
+-	MACSEC_SECY_STATS_ATTR_IN_PKTS_BAD_TAG,
+-	MACSEC_SECY_STATS_ATTR_IN_PKTS_UNKNOWN_SCI,
+-	MACSEC_SECY_STATS_ATTR_IN_PKTS_NO_SCI,
+-	MACSEC_SECY_STATS_ATTR_IN_PKTS_OVERRUN,
+-	MACSEC_SECY_STATS_ATTR_PAD,
+-	__MACSEC_SECY_STATS_ATTR_END,
+-	NUM_MACSEC_SECY_STATS_ATTR = __MACSEC_SECY_STATS_ATTR_END,
+-	MACSEC_SECY_STATS_ATTR_MAX = __MACSEC_SECY_STATS_ATTR_END - 1,
+-};
+-
+-#endif /* _MACSEC_H */
+diff --git a/include/linux/if_packet.h b/include/linux/if_packet.h
+deleted file mode 100644
+index 4df96a7..0000000
+--- a/include/linux/if_packet.h
++++ /dev/null
+@@ -1,302 +0,0 @@
+-#ifndef __LINUX_IF_PACKET_H
+-#define __LINUX_IF_PACKET_H
+-
+-#include <linux/types.h>
+-
+-struct sockaddr_pkt {
+-	unsigned short spkt_family;
+-	unsigned char spkt_device[14];
+-	__be16 spkt_protocol;
+-};
+-
+-struct sockaddr_ll {
+-	unsigned short	sll_family;
+-	__be16		sll_protocol;
+-	int		sll_ifindex;
+-	unsigned short	sll_hatype;
+-	unsigned char	sll_pkttype;
+-	unsigned char	sll_halen;
+-	unsigned char	sll_addr[8];
+-};
+-
+-/* Packet types */
+-
+-#define PACKET_HOST		0		/* To us		*/
+-#define PACKET_BROADCAST	1		/* To all		*/
+-#define PACKET_MULTICAST	2		/* To group		*/
+-#define PACKET_OTHERHOST	3		/* To someone else 	*/
+-#define PACKET_OUTGOING		4		/* Outgoing of any type */
+-#define PACKET_LOOPBACK		5		/* MC/BRD frame looped back */
+-#define PACKET_USER		6		/* To user space	*/
+-#define PACKET_KERNEL		7		/* To kernel space	*/
+-/* Unused, PACKET_FASTROUTE and PACKET_LOOPBACK are invisible to user space */
+-#define PACKET_FASTROUTE	6		/* Fastrouted frame	*/
+-
+-/* Packet socket options */
+-
+-#define PACKET_ADD_MEMBERSHIP		1
+-#define PACKET_DROP_MEMBERSHIP		2
+-#define PACKET_RECV_OUTPUT		3
+-/* Value 4 is still used by obsolete turbo-packet. */
+-#define PACKET_RX_RING			5
+-#define PACKET_STATISTICS		6
+-#define PACKET_COPY_THRESH		7
+-#define PACKET_AUXDATA			8
+-#define PACKET_ORIGDEV			9
+-#define PACKET_VERSION			10
+-#define PACKET_HDRLEN			11
+-#define PACKET_RESERVE			12
+-#define PACKET_TX_RING			13
+-#define PACKET_LOSS			14
+-#define PACKET_VNET_HDR			15
+-#define PACKET_TX_TIMESTAMP		16
+-#define PACKET_TIMESTAMP		17
+-#define PACKET_FANOUT			18
+-#define PACKET_TX_HAS_OFF		19
+-#define PACKET_QDISC_BYPASS		20
+-#define PACKET_ROLLOVER_STATS		21
+-#define PACKET_FANOUT_DATA		22
+-
+-#define PACKET_FANOUT_HASH		0
+-#define PACKET_FANOUT_LB		1
+-#define PACKET_FANOUT_CPU		2
+-#define PACKET_FANOUT_ROLLOVER		3
+-#define PACKET_FANOUT_RND		4
+-#define PACKET_FANOUT_QM		5
+-#define PACKET_FANOUT_CBPF		6
+-#define PACKET_FANOUT_EBPF		7
+-#define PACKET_FANOUT_FLAG_ROLLOVER	0x1000
+-#define PACKET_FANOUT_FLAG_UNIQUEID	0x2000
+-#define PACKET_FANOUT_FLAG_DEFRAG	0x8000
+-
+-struct tpacket_stats {
+-	unsigned int	tp_packets;
+-	unsigned int	tp_drops;
+-};
+-
+-struct tpacket_stats_v3 {
+-	unsigned int	tp_packets;
+-	unsigned int	tp_drops;
+-	unsigned int	tp_freeze_q_cnt;
+-};
+-
+-struct tpacket_rollover_stats {
+-	__aligned_u64	tp_all;
+-	__aligned_u64	tp_huge;
+-	__aligned_u64	tp_failed;
+-};
+-
+-union tpacket_stats_u {
+-	struct tpacket_stats stats1;
+-	struct tpacket_stats_v3 stats3;
+-};
+-
+-struct tpacket_auxdata {
+-	__u32		tp_status;
+-	__u32		tp_len;
+-	__u32		tp_snaplen;
+-	__u16		tp_mac;
+-	__u16		tp_net;
+-	__u16		tp_vlan_tci;
+-	__u16		tp_vlan_tpid;
+-};
+-
+-/* Rx ring - header status */
+-#define TP_STATUS_KERNEL		      0
+-#define TP_STATUS_USER			(1 << 0)
+-#define TP_STATUS_COPY			(1 << 1)
+-#define TP_STATUS_LOSING		(1 << 2)
+-#define TP_STATUS_CSUMNOTREADY		(1 << 3)
+-#define TP_STATUS_VLAN_VALID		(1 << 4) /* auxdata has valid tp_vlan_tci */
+-#define TP_STATUS_BLK_TMO		(1 << 5)
+-#define TP_STATUS_VLAN_TPID_VALID	(1 << 6) /* auxdata has valid tp_vlan_tpid */
+-#define TP_STATUS_CSUM_VALID		(1 << 7)
+-
+-/* Tx ring - header status */
+-#define TP_STATUS_AVAILABLE	      0
+-#define TP_STATUS_SEND_REQUEST	(1 << 0)
+-#define TP_STATUS_SENDING	(1 << 1)
+-#define TP_STATUS_WRONG_FORMAT	(1 << 2)
+-
+-/* Rx and Tx ring - header status */
+-#define TP_STATUS_TS_SOFTWARE		(1 << 29)
+-#define TP_STATUS_TS_SYS_HARDWARE	(1 << 30) /* deprecated, never set */
+-#define TP_STATUS_TS_RAW_HARDWARE	(1 << 31)
+-
+-/* Rx ring - feature request bits */
+-#define TP_FT_REQ_FILL_RXHASH	0x1
+-
+-struct tpacket_hdr {
+-	unsigned long	tp_status;
+-	unsigned int	tp_len;
+-	unsigned int	tp_snaplen;
+-	unsigned short	tp_mac;
+-	unsigned short	tp_net;
+-	unsigned int	tp_sec;
+-	unsigned int	tp_usec;
+-};
+-
+-#define TPACKET_ALIGNMENT	16
+-#define TPACKET_ALIGN(x)	(((x)+TPACKET_ALIGNMENT-1)&~(TPACKET_ALIGNMENT-1))
+-#define TPACKET_HDRLEN		(TPACKET_ALIGN(sizeof(struct tpacket_hdr)) + sizeof(struct sockaddr_ll))
+-
+-struct tpacket2_hdr {
+-	__u32		tp_status;
+-	__u32		tp_len;
+-	__u32		tp_snaplen;
+-	__u16		tp_mac;
+-	__u16		tp_net;
+-	__u32		tp_sec;
+-	__u32		tp_nsec;
+-	__u16		tp_vlan_tci;
+-	__u16		tp_vlan_tpid;
+-	__u8		tp_padding[4];
+-};
+-
+-struct tpacket_hdr_variant1 {
+-	__u32	tp_rxhash;
+-	__u32	tp_vlan_tci;
+-	__u16	tp_vlan_tpid;
+-	__u16	tp_padding;
+-};
+-
+-struct tpacket3_hdr {
+-	__u32		tp_next_offset;
+-	__u32		tp_sec;
+-	__u32		tp_nsec;
+-	__u32		tp_snaplen;
+-	__u32		tp_len;
+-	__u32		tp_status;
+-	__u16		tp_mac;
+-	__u16		tp_net;
+-	/* pkt_hdr variants */
+-	union {
+-		struct tpacket_hdr_variant1 hv1;
+-	};
+-	__u8		tp_padding[8];
+-};
+-
+-struct tpacket_bd_ts {
+-	unsigned int ts_sec;
+-	union {
+-		unsigned int ts_usec;
+-		unsigned int ts_nsec;
+-	};
+-};
+-
+-struct tpacket_hdr_v1 {
+-	__u32	block_status;
+-	__u32	num_pkts;
+-	__u32	offset_to_first_pkt;
+-
+-	/* Number of valid bytes (including padding)
+-	 * blk_len <= tp_block_size
+-	 */
+-	__u32	blk_len;
+-
+-	/*
+-	 * Quite a few uses of sequence number:
+-	 * 1. Make sure cache flush etc worked.
+-	 *    Well, one can argue - why not use the increasing ts below?
+-	 *    But look at 2. below first.
+-	 * 2. When you pass around blocks to other user space decoders,
+-	 *    you can see which blk[s] is[are] outstanding etc.
+-	 * 3. Validate kernel code.
+-	 */
+-	__aligned_u64	seq_num;
+-
+-	/*
+-	 * ts_last_pkt:
+-	 *
+-	 * Case 1.	Block has 'N'(N >=1) packets and TMO'd(timed out)
+-	 *		ts_last_pkt == 'time-stamp of last packet' and NOT the
+-	 *		time when the timer fired and the block was closed.
+-	 *		By providing the ts of the last packet we can absolutely
+-	 *		guarantee that time-stamp wise, the first packet in the
+-	 *		next block will never precede the last packet of the
+-	 *		previous block.
+-	 * Case 2.	Block has zero packets and TMO'd
+-	 *		ts_last_pkt = time when the timer fired and the block
+-	 *		was closed.
+-	 * Case 3.	Block has 'N' packets and NO TMO.
+-	 *		ts_last_pkt = time-stamp of the last pkt in the block.
+-	 *
+-	 * ts_first_pkt:
+-	 *		Is always the time-stamp when the block was opened.
+-	 *		Case a)	ZERO packets
+-	 *			No packets to deal with but atleast you know the
+-	 *			time-interval of this block.
+-	 *		Case b) Non-zero packets
+-	 *			Use the ts of the first packet in the block.
+-	 *
+-	 */
+-	struct tpacket_bd_ts	ts_first_pkt, ts_last_pkt;
+-};
+-
+-union tpacket_bd_header_u {
+-	struct tpacket_hdr_v1 bh1;
+-};
+-
+-struct tpacket_block_desc {
+-	__u32 version;
+-	__u32 offset_to_priv;
+-	union tpacket_bd_header_u hdr;
+-};
+-
+-#define TPACKET2_HDRLEN		(TPACKET_ALIGN(sizeof(struct tpacket2_hdr)) + sizeof(struct sockaddr_ll))
+-#define TPACKET3_HDRLEN		(TPACKET_ALIGN(sizeof(struct tpacket3_hdr)) + sizeof(struct sockaddr_ll))
+-
+-enum tpacket_versions {
+-	TPACKET_V1,
+-	TPACKET_V2,
+-	TPACKET_V3
+-};
+-
+-/*
+-   Frame structure:
+-
+-   - Start. Frame must be aligned to TPACKET_ALIGNMENT=16
+-   - struct tpacket_hdr
+-   - pad to TPACKET_ALIGNMENT=16
+-   - struct sockaddr_ll
+-   - Gap, chosen so that packet data (Start+tp_net) alignes to TPACKET_ALIGNMENT=16
+-   - Start+tp_mac: [ Optional MAC header ]
+-   - Start+tp_net: Packet data, aligned to TPACKET_ALIGNMENT=16.
+-   - Pad to align to TPACKET_ALIGNMENT=16
+- */
+-
+-struct tpacket_req {
+-	unsigned int	tp_block_size;	/* Minimal size of contiguous block */
+-	unsigned int	tp_block_nr;	/* Number of blocks */
+-	unsigned int	tp_frame_size;	/* Size of frame */
+-	unsigned int	tp_frame_nr;	/* Total number of frames */
+-};
+-
+-struct tpacket_req3 {
+-	unsigned int	tp_block_size;	/* Minimal size of contiguous block */
+-	unsigned int	tp_block_nr;	/* Number of blocks */
+-	unsigned int	tp_frame_size;	/* Size of frame */
+-	unsigned int	tp_frame_nr;	/* Total number of frames */
+-	unsigned int	tp_retire_blk_tov; /* timeout in msecs */
+-	unsigned int	tp_sizeof_priv; /* offset to private data area */
+-	unsigned int	tp_feature_req_word;
+-};
+-
+-union tpacket_req_u {
+-	struct tpacket_req	req;
+-	struct tpacket_req3	req3;
+-};
+-
+-struct packet_mreq {
+-	int		mr_ifindex;
+-	unsigned short	mr_type;
+-	unsigned short	mr_alen;
+-	unsigned char	mr_address[8];
+-};
+-
+-#define PACKET_MR_MULTICAST	0
+-#define PACKET_MR_PROMISC	1
+-#define PACKET_MR_ALLMULTI	2
+-#define PACKET_MR_UNICAST	3
+-
+-#endif
+diff --git a/include/linux/if_tun.h b/include/linux/if_tun.h
+deleted file mode 100644
+index d5ecb42..0000000
+--- a/include/linux/if_tun.h
++++ /dev/null
+@@ -1,107 +0,0 @@
+-/*
+- *  Universal TUN/TAP device driver.
+- *  Copyright (C) 1999-2000 Maxim Krasnyansky <max_mk@yahoo.com>
+- *
+- *  This program is free software; you can redistribute it and/or modify
+- *  it under the terms of the GNU General Public License as published by
+- *  the Free Software Foundation; either version 2 of the License, or
+- *  (at your option) any later version.
+- *
+- *  This program is distributed in the hope that it will be useful,
+- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- *  GNU General Public License for more details.
+- */
+-
+-#ifndef __IF_TUN_H
+-#define __IF_TUN_H
+-
+-#include <linux/types.h>
+-#include <linux/if_ether.h>
+-#include <linux/filter.h>
+-
+-/* Read queue size */
+-#define TUN_READQ_SIZE	500
+-/* TUN device type flags: deprecated. Use IFF_TUN/IFF_TAP instead. */
+-#define TUN_TUN_DEV 	IFF_TUN
+-#define TUN_TAP_DEV	IFF_TAP
+-#define TUN_TYPE_MASK   0x000f
+-
+-/* Ioctl defines */
+-#define TUNSETNOCSUM  _IOW('T', 200, int) 
+-#define TUNSETDEBUG   _IOW('T', 201, int) 
+-#define TUNSETIFF     _IOW('T', 202, int) 
+-#define TUNSETPERSIST _IOW('T', 203, int) 
+-#define TUNSETOWNER   _IOW('T', 204, int)
+-#define TUNSETLINK    _IOW('T', 205, int)
+-#define TUNSETGROUP   _IOW('T', 206, int)
+-#define TUNGETFEATURES _IOR('T', 207, unsigned int)
+-#define TUNSETOFFLOAD  _IOW('T', 208, unsigned int)
+-#define TUNSETTXFILTER _IOW('T', 209, unsigned int)
+-#define TUNGETIFF      _IOR('T', 210, unsigned int)
+-#define TUNGETSNDBUF   _IOR('T', 211, int)
+-#define TUNSETSNDBUF   _IOW('T', 212, int)
+-#define TUNATTACHFILTER _IOW('T', 213, struct sock_fprog)
+-#define TUNDETACHFILTER _IOW('T', 214, struct sock_fprog)
+-#define TUNGETVNETHDRSZ _IOR('T', 215, int)
+-#define TUNSETVNETHDRSZ _IOW('T', 216, int)
+-#define TUNSETQUEUE  _IOW('T', 217, int)
+-#define TUNSETIFINDEX	_IOW('T', 218, unsigned int)
+-#define TUNGETFILTER _IOR('T', 219, struct sock_fprog)
+-#define TUNSETVNETLE _IOW('T', 220, int)
+-#define TUNGETVNETLE _IOR('T', 221, int)
+-/* The TUNSETVNETBE and TUNGETVNETBE ioctls are for cross-endian support on
+- * little-endian hosts. Not all kernel configurations support them, but all
+- * configurations that support SET also support GET.
+- */
+-#define TUNSETVNETBE _IOW('T', 222, int)
+-#define TUNGETVNETBE _IOR('T', 223, int)
+-
+-/* TUNSETIFF ifr flags */
+-#define IFF_TUN		0x0001
+-#define IFF_TAP		0x0002
+-#define IFF_NO_PI	0x1000
+-/* This flag has no real effect */
+-#define IFF_ONE_QUEUE	0x2000
+-#define IFF_VNET_HDR	0x4000
+-#define IFF_TUN_EXCL	0x8000
+-#define IFF_MULTI_QUEUE 0x0100
+-#define IFF_ATTACH_QUEUE 0x0200
+-#define IFF_DETACH_QUEUE 0x0400
+-/* read-only flag */
+-#define IFF_PERSIST	0x0800
+-#define IFF_NOFILTER	0x1000
+-
+-/* Socket options */
+-#define TUN_TX_TIMESTAMP 1
+-
+-/* Features for GSO (TUNSETOFFLOAD). */
+-#define TUN_F_CSUM	0x01	/* You can hand me unchecksummed packets. */
+-#define TUN_F_TSO4	0x02	/* I can handle TSO for IPv4 packets */
+-#define TUN_F_TSO6	0x04	/* I can handle TSO for IPv6 packets */
+-#define TUN_F_TSO_ECN	0x08	/* I can handle TSO with ECN bits. */
+-#define TUN_F_UFO	0x10	/* I can handle UFO packets */
+-
+-/* Protocol info prepended to the packets (when IFF_NO_PI is not set) */
+-#define TUN_PKT_STRIP	0x0001
+-struct tun_pi {
+-	__u16  flags;
+-	__be16 proto;
+-};
+-
+-/*
+- * Filter spec (used for SETXXFILTER ioctls)
+- * This stuff is applicable only to the TAP (Ethernet) devices.
+- * If the count is zero the filter is disabled and the driver accepts
+- * all packets (promisc mode).
+- * If the filter is enabled in order to accept broadcast packets
+- * broadcast addr must be explicitly included in the addr list.
+- */
+-#define TUN_FLT_ALLMULTI 0x0001 /* Accept all multicast packets */
+-struct tun_filter {
+-	__u16  flags; /* TUN_FLT_ flags see above */
+-	__u16  count; /* Number of addresses */
+-	__u8   addr[0][ETH_ALEN];
+-};
+-
+-#endif /* __IF_TUN_H */
+diff --git a/include/linux/if_tunnel.h b/include/linux/if_tunnel.h
+deleted file mode 100644
+index 21834ca..0000000
+--- a/include/linux/if_tunnel.h
++++ /dev/null
+@@ -1,158 +0,0 @@
+-#ifndef _IF_TUNNEL_H_
+-#define _IF_TUNNEL_H_
+-
+-#include <linux/types.h>
+-#include <linux/if.h>
+-#include <linux/ip.h>
+-#include <linux/in6.h>
+-#include <asm/byteorder.h>
+-
+-
+-#define SIOCGETTUNNEL   (SIOCDEVPRIVATE + 0)
+-#define SIOCADDTUNNEL   (SIOCDEVPRIVATE + 1)
+-#define SIOCDELTUNNEL   (SIOCDEVPRIVATE + 2)
+-#define SIOCCHGTUNNEL   (SIOCDEVPRIVATE + 3)
+-#define SIOCGETPRL      (SIOCDEVPRIVATE + 4)
+-#define SIOCADDPRL      (SIOCDEVPRIVATE + 5)
+-#define SIOCDELPRL      (SIOCDEVPRIVATE + 6)
+-#define SIOCCHGPRL      (SIOCDEVPRIVATE + 7)
+-#define SIOCGET6RD      (SIOCDEVPRIVATE + 8)
+-#define SIOCADD6RD      (SIOCDEVPRIVATE + 9)
+-#define SIOCDEL6RD      (SIOCDEVPRIVATE + 10)
+-#define SIOCCHG6RD      (SIOCDEVPRIVATE + 11)
+-
+-#define GRE_CSUM	__cpu_to_be16(0x8000)
+-#define GRE_ROUTING	__cpu_to_be16(0x4000)
+-#define GRE_KEY		__cpu_to_be16(0x2000)
+-#define GRE_SEQ		__cpu_to_be16(0x1000)
+-#define GRE_STRICT	__cpu_to_be16(0x0800)
+-#define GRE_REC		__cpu_to_be16(0x0700)
+-#define GRE_ACK		__cpu_to_be16(0x0080)
+-#define GRE_FLAGS	__cpu_to_be16(0x0078)
+-#define GRE_VERSION	__cpu_to_be16(0x0007)
+-
+-#define GRE_IS_CSUM(f)		((f) & GRE_CSUM)
+-#define GRE_IS_ROUTING(f)	((f) & GRE_ROUTING)
+-#define GRE_IS_KEY(f)		((f) & GRE_KEY)
+-#define GRE_IS_SEQ(f)		((f) & GRE_SEQ)
+-#define GRE_IS_STRICT(f)	((f) & GRE_STRICT)
+-#define GRE_IS_REC(f)		((f) & GRE_REC)
+-#define GRE_IS_ACK(f)		((f) & GRE_ACK)
+-
+-#define GRE_VERSION_0		__cpu_to_be16(0x0000)
+-#define GRE_VERSION_1		__cpu_to_be16(0x0001)
+-#define GRE_PROTO_PPP		__cpu_to_be16(0x880b)
+-#define GRE_PPTP_KEY_MASK	__cpu_to_be32(0xffff)
+-
+-struct ip_tunnel_parm {
+-	char			name[IFNAMSIZ];
+-	int			link;
+-	__be16			i_flags;
+-	__be16			o_flags;
+-	__be32			i_key;
+-	__be32			o_key;
+-	struct iphdr		iph;
+-};
+-
+-enum {
+-	IFLA_IPTUN_UNSPEC,
+-	IFLA_IPTUN_LINK,
+-	IFLA_IPTUN_LOCAL,
+-	IFLA_IPTUN_REMOTE,
+-	IFLA_IPTUN_TTL,
+-	IFLA_IPTUN_TOS,
+-	IFLA_IPTUN_ENCAP_LIMIT,
+-	IFLA_IPTUN_FLOWINFO,
+-	IFLA_IPTUN_FLAGS,
+-	IFLA_IPTUN_PROTO,
+-	IFLA_IPTUN_PMTUDISC,
+-	IFLA_IPTUN_6RD_PREFIX,
+-	IFLA_IPTUN_6RD_RELAY_PREFIX,
+-	IFLA_IPTUN_6RD_PREFIXLEN,
+-	IFLA_IPTUN_6RD_RELAY_PREFIXLEN,
+-	IFLA_IPTUN_ENCAP_TYPE,
+-	IFLA_IPTUN_ENCAP_FLAGS,
+-	IFLA_IPTUN_ENCAP_SPORT,
+-	IFLA_IPTUN_ENCAP_DPORT,
+-	IFLA_IPTUN_COLLECT_METADATA,
+-	IFLA_IPTUN_FWMARK,
+-	__IFLA_IPTUN_MAX,
+-};
+-#define IFLA_IPTUN_MAX	(__IFLA_IPTUN_MAX - 1)
+-
+-enum tunnel_encap_types {
+-	TUNNEL_ENCAP_NONE,
+-	TUNNEL_ENCAP_FOU,
+-	TUNNEL_ENCAP_GUE,
+-};
+-
+-#define TUNNEL_ENCAP_FLAG_CSUM		(1<<0)
+-#define TUNNEL_ENCAP_FLAG_CSUM6		(1<<1)
+-#define TUNNEL_ENCAP_FLAG_REMCSUM	(1<<2)
+-
+-/* SIT-mode i_flags */
+-#define	SIT_ISATAP	0x0001
+-
+-struct ip_tunnel_prl {
+-	__be32			addr;
+-	__u16			flags;
+-	__u16			__reserved;
+-	__u32			datalen;
+-	__u32			__reserved2;
+-	/* data follows */
+-};
+-
+-/* PRL flags */
+-#define	PRL_DEFAULT		0x0001
+-
+-struct ip_tunnel_6rd {
+-	struct in6_addr		prefix;
+-	__be32			relay_prefix;
+-	__u16			prefixlen;
+-	__u16			relay_prefixlen;
+-};
+-
+-enum {
+-	IFLA_GRE_UNSPEC,
+-	IFLA_GRE_LINK,
+-	IFLA_GRE_IFLAGS,
+-	IFLA_GRE_OFLAGS,
+-	IFLA_GRE_IKEY,
+-	IFLA_GRE_OKEY,
+-	IFLA_GRE_LOCAL,
+-	IFLA_GRE_REMOTE,
+-	IFLA_GRE_TTL,
+-	IFLA_GRE_TOS,
+-	IFLA_GRE_PMTUDISC,
+-	IFLA_GRE_ENCAP_LIMIT,
+-	IFLA_GRE_FLOWINFO,
+-	IFLA_GRE_FLAGS,
+-	IFLA_GRE_ENCAP_TYPE,
+-	IFLA_GRE_ENCAP_FLAGS,
+-	IFLA_GRE_ENCAP_SPORT,
+-	IFLA_GRE_ENCAP_DPORT,
+-	IFLA_GRE_COLLECT_METADATA,
+-	IFLA_GRE_IGNORE_DF,
+-	IFLA_GRE_FWMARK,
+-	IFLA_GRE_ERSPAN_INDEX,
+-	__IFLA_GRE_MAX,
+-};
+-
+-#define IFLA_GRE_MAX	(__IFLA_GRE_MAX - 1)
+-
+-/* VTI-mode i_flags */
+-#define VTI_ISVTI ((__be16)0x0001)
+-
+-enum {
+-	IFLA_VTI_UNSPEC,
+-	IFLA_VTI_LINK,
+-	IFLA_VTI_IKEY,
+-	IFLA_VTI_OKEY,
+-	IFLA_VTI_LOCAL,
+-	IFLA_VTI_REMOTE,
+-	IFLA_VTI_FWMARK,
+-	__IFLA_VTI_MAX,
+-};
+-
+-#define IFLA_VTI_MAX	(__IFLA_VTI_MAX - 1)
+-#endif /* _IF_TUNNEL_H_ */
+diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h
+deleted file mode 100644
+index 24ae007..0000000
+--- a/include/linux/if_vlan.h
++++ /dev/null
+@@ -1,64 +0,0 @@
+-/*
+- * VLAN		An implementation of 802.1Q VLAN tagging.
+- *
+- * Authors:	Ben Greear <greearb@candelatech.com>
+- *
+- *		This program is free software; you can redistribute it and/or
+- *		modify it under the terms of the GNU General Public License
+- *		as published by the Free Software Foundation; either version
+- *		2 of the License, or (at your option) any later version.
+- *
+- */
+-
+-#ifndef _LINUX_IF_VLAN_H_
+-#define _LINUX_IF_VLAN_H_
+-
+-
+-/* VLAN IOCTLs are found in sockios.h */
+-
+-/* Passed in vlan_ioctl_args structure to determine behaviour. */
+-enum vlan_ioctl_cmds {
+-	ADD_VLAN_CMD,
+-	DEL_VLAN_CMD,
+-	SET_VLAN_INGRESS_PRIORITY_CMD,
+-	SET_VLAN_EGRESS_PRIORITY_CMD,
+-	GET_VLAN_INGRESS_PRIORITY_CMD,
+-	GET_VLAN_EGRESS_PRIORITY_CMD,
+-	SET_VLAN_NAME_TYPE_CMD,
+-	SET_VLAN_FLAG_CMD,
+-	GET_VLAN_REALDEV_NAME_CMD, /* If this works, you know it's a VLAN device, btw */
+-	GET_VLAN_VID_CMD /* Get the VID of this VLAN (specified by name) */
+-};
+-
+-enum vlan_flags {
+-	VLAN_FLAG_REORDER_HDR	= 0x1,
+-	VLAN_FLAG_GVRP		= 0x2,
+-	VLAN_FLAG_LOOSE_BINDING	= 0x4,
+-	VLAN_FLAG_MVRP		= 0x8,
+-};
+-
+-enum vlan_name_types {
+-	VLAN_NAME_TYPE_PLUS_VID, /* Name will look like:  vlan0005 */
+-	VLAN_NAME_TYPE_RAW_PLUS_VID, /* name will look like:  eth1.0005 */
+-	VLAN_NAME_TYPE_PLUS_VID_NO_PAD, /* Name will look like:  vlan5 */
+-	VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD, /* Name will look like:  eth0.5 */
+-	VLAN_NAME_TYPE_HIGHEST
+-};
+-
+-struct vlan_ioctl_args {
+-	int cmd; /* Should be one of the vlan_ioctl_cmds enum above. */
+-	char device1[24];
+-
+-        union {
+-		char device2[24];
+-		int VID;
+-		unsigned int skb_priority;
+-		unsigned int name_type;
+-		unsigned int bind_type;
+-		unsigned int flag; /* Matches vlan_dev_priv flags */
+-        } u;
+-
+-	short vlan_qos;   
+-};
+-
+-#endif /* _LINUX_IF_VLAN_H_ */
+diff --git a/include/linux/ife.h b/include/linux/ife.h
+deleted file mode 100644
+index 2954da3..0000000
+--- a/include/linux/ife.h
++++ /dev/null
+@@ -1,18 +0,0 @@
+-#ifndef __UAPI_IFE_H
+-#define __UAPI_IFE_H
+-
+-#define IFE_METAHDRLEN 2
+-
+-enum {
+-	IFE_META_SKBMARK = 1,
+-	IFE_META_HASHID,
+-	IFE_META_PRIO,
+-	IFE_META_QMAP,
+-	IFE_META_TCINDEX,
+-	__IFE_META_MAX
+-};
+-
+-/*Can be overridden at runtime by module option*/
+-#define IFE_META_MAX (__IFE_META_MAX - 1)
+-
+-#endif
+diff --git a/include/linux/ila.h b/include/linux/ila.h
+deleted file mode 100644
+index 7e328d7..0000000
+--- a/include/linux/ila.h
++++ /dev/null
+@@ -1,45 +0,0 @@
+-/* ila.h - ILA Interface */
+-
+-#ifndef _LINUX_ILA_H
+-#define _LINUX_ILA_H
+-
+-/* NETLINK_GENERIC related info */
+-#define ILA_GENL_NAME		"ila"
+-#define ILA_GENL_VERSION	0x1
+-
+-enum {
+-	ILA_ATTR_UNSPEC,
+-	ILA_ATTR_LOCATOR,			/* u64 */
+-	ILA_ATTR_IDENTIFIER,			/* u64 */
+-	ILA_ATTR_LOCATOR_MATCH,			/* u64 */
+-	ILA_ATTR_IFINDEX,			/* s32 */
+-	ILA_ATTR_DIR,				/* u32 */
+-	ILA_ATTR_PAD,
+-	ILA_ATTR_CSUM_MODE,			/* u8 */
+-
+-	__ILA_ATTR_MAX,
+-};
+-
+-#define ILA_ATTR_MAX		(__ILA_ATTR_MAX - 1)
+-
+-enum {
+-	ILA_CMD_UNSPEC,
+-	ILA_CMD_ADD,
+-	ILA_CMD_DEL,
+-	ILA_CMD_GET,
+-
+-	__ILA_CMD_MAX,
+-};
+-
+-#define ILA_CMD_MAX	(__ILA_CMD_MAX - 1)
+-
+-#define ILA_DIR_IN	(1 << 0)
+-#define ILA_DIR_OUT	(1 << 1)
+-
+-enum {
+-	ILA_CSUM_ADJUST_TRANSPORT,
+-	ILA_CSUM_NEUTRAL_MAP,
+-	ILA_CSUM_NO_ACTION,
+-};
+-
+-#endif /* _LINUX_ILA_H */
+diff --git a/include/linux/in.h b/include/linux/in.h
+deleted file mode 100644
+index 9439efa..0000000
+--- a/include/linux/in.h
++++ /dev/null
+@@ -1,300 +0,0 @@
+-/*
+- * INET		An implementation of the TCP/IP protocol suite for the LINUX
+- *		operating system.  INET is implemented using the  BSD Socket
+- *		interface as the means of communication with the user level.
+- *
+- *		Definitions of the Internet Protocol.
+- *
+- * Version:	@(#)in.h	1.0.1	04/21/93
+- *
+- * Authors:	Original taken from the GNU Project <netinet/in.h> file.
+- *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
+- *
+- *		This program is free software; you can redistribute it and/or
+- *		modify it under the terms of the GNU General Public License
+- *		as published by the Free Software Foundation; either version
+- *		2 of the License, or (at your option) any later version.
+- */
+-#ifndef _LINUX_IN_H
+-#define _LINUX_IN_H
+-
+-#include <linux/types.h>
+-#include <linux/libc-compat.h>
+-#include <linux/socket.h>
+-
+-#if __UAPI_DEF_IN_IPPROTO
+-/* Standard well-defined IP protocols.  */
+-enum {
+-  IPPROTO_IP = 0,		/* Dummy protocol for TCP		*/
+-#define IPPROTO_IP		IPPROTO_IP
+-  IPPROTO_ICMP = 1,		/* Internet Control Message Protocol	*/
+-#define IPPROTO_ICMP		IPPROTO_ICMP
+-  IPPROTO_IGMP = 2,		/* Internet Group Management Protocol	*/
+-#define IPPROTO_IGMP		IPPROTO_IGMP
+-  IPPROTO_IPIP = 4,		/* IPIP tunnels (older KA9Q tunnels use 94) */
+-#define IPPROTO_IPIP		IPPROTO_IPIP
+-  IPPROTO_TCP = 6,		/* Transmission Control Protocol	*/
+-#define IPPROTO_TCP		IPPROTO_TCP
+-  IPPROTO_EGP = 8,		/* Exterior Gateway Protocol		*/
+-#define IPPROTO_EGP		IPPROTO_EGP
+-  IPPROTO_PUP = 12,		/* PUP protocol				*/
+-#define IPPROTO_PUP		IPPROTO_PUP
+-  IPPROTO_UDP = 17,		/* User Datagram Protocol		*/
+-#define IPPROTO_UDP		IPPROTO_UDP
+-  IPPROTO_IDP = 22,		/* XNS IDP protocol			*/
+-#define IPPROTO_IDP		IPPROTO_IDP
+-  IPPROTO_TP = 29,		/* SO Transport Protocol Class 4	*/
+-#define IPPROTO_TP		IPPROTO_TP
+-  IPPROTO_DCCP = 33,		/* Datagram Congestion Control Protocol */
+-#define IPPROTO_DCCP		IPPROTO_DCCP
+-  IPPROTO_IPV6 = 41,		/* IPv6-in-IPv4 tunnelling		*/
+-#define IPPROTO_IPV6		IPPROTO_IPV6
+-  IPPROTO_RSVP = 46,		/* RSVP Protocol			*/
+-#define IPPROTO_RSVP		IPPROTO_RSVP
+-  IPPROTO_GRE = 47,		/* Cisco GRE tunnels (rfc 1701,1702)	*/
+-#define IPPROTO_GRE		IPPROTO_GRE
+-  IPPROTO_ESP = 50,		/* Encapsulation Security Payload protocol */
+-#define IPPROTO_ESP		IPPROTO_ESP
+-  IPPROTO_AH = 51,		/* Authentication Header protocol	*/
+-#define IPPROTO_AH		IPPROTO_AH
+-  IPPROTO_MTP = 92,		/* Multicast Transport Protocol		*/
+-#define IPPROTO_MTP		IPPROTO_MTP
+-  IPPROTO_BEETPH = 94,		/* IP option pseudo header for BEET	*/
+-#define IPPROTO_BEETPH		IPPROTO_BEETPH
+-  IPPROTO_ENCAP = 98,		/* Encapsulation Header			*/
+-#define IPPROTO_ENCAP		IPPROTO_ENCAP
+-  IPPROTO_PIM = 103,		/* Protocol Independent Multicast	*/
+-#define IPPROTO_PIM		IPPROTO_PIM
+-  IPPROTO_COMP = 108,		/* Compression Header Protocol		*/
+-#define IPPROTO_COMP		IPPROTO_COMP
+-  IPPROTO_SCTP = 132,		/* Stream Control Transport Protocol	*/
+-#define IPPROTO_SCTP		IPPROTO_SCTP
+-  IPPROTO_UDPLITE = 136,	/* UDP-Lite (RFC 3828)			*/
+-#define IPPROTO_UDPLITE		IPPROTO_UDPLITE
+-  IPPROTO_MPLS = 137,		/* MPLS in IP (RFC 4023)		*/
+-#define IPPROTO_MPLS		IPPROTO_MPLS
+-  IPPROTO_RAW = 255,		/* Raw IP packets			*/
+-#define IPPROTO_RAW		IPPROTO_RAW
+-  IPPROTO_MAX
+-};
+-#endif
+-
+-#if __UAPI_DEF_IN_ADDR
+-/* Internet address. */
+-struct in_addr {
+-	__be32	s_addr;
+-};
+-#endif
+-
+-#define IP_TOS		1
+-#define IP_TTL		2
+-#define IP_HDRINCL	3
+-#define IP_OPTIONS	4
+-#define IP_ROUTER_ALERT	5
+-#define IP_RECVOPTS	6
+-#define IP_RETOPTS	7
+-#define IP_PKTINFO	8
+-#define IP_PKTOPTIONS	9
+-#define IP_MTU_DISCOVER	10
+-#define IP_RECVERR	11
+-#define IP_RECVTTL	12
+-#define	IP_RECVTOS	13
+-#define IP_MTU		14
+-#define IP_FREEBIND	15
+-#define IP_IPSEC_POLICY	16
+-#define IP_XFRM_POLICY	17
+-#define IP_PASSSEC	18
+-#define IP_TRANSPARENT	19
+-
+-/* BSD compatibility */
+-#define IP_RECVRETOPTS	IP_RETOPTS
+-
+-/* TProxy original addresses */
+-#define IP_ORIGDSTADDR       20
+-#define IP_RECVORIGDSTADDR   IP_ORIGDSTADDR
+-
+-#define IP_MINTTL       21
+-#define IP_NODEFRAG     22
+-#define IP_CHECKSUM	23
+-#define IP_BIND_ADDRESS_NO_PORT	24
+-#define IP_RECVFRAGSIZE	25
+-
+-/* IP_MTU_DISCOVER values */
+-#define IP_PMTUDISC_DONT		0	/* Never send DF frames */
+-#define IP_PMTUDISC_WANT		1	/* Use per route hints	*/
+-#define IP_PMTUDISC_DO			2	/* Always DF		*/
+-#define IP_PMTUDISC_PROBE		3       /* Ignore dst pmtu      */
+-/* Always use interface mtu (ignores dst pmtu) but don't set DF flag.
+- * Also incoming ICMP frag_needed notifications will be ignored on
+- * this socket to prevent accepting spoofed ones.
+- */
+-#define IP_PMTUDISC_INTERFACE		4
+-/* weaker version of IP_PMTUDISC_INTERFACE, which allos packets to get
+- * fragmented if they exeed the interface mtu
+- */
+-#define IP_PMTUDISC_OMIT		5
+-
+-#define IP_MULTICAST_IF			32
+-#define IP_MULTICAST_TTL 		33
+-#define IP_MULTICAST_LOOP 		34
+-#define IP_ADD_MEMBERSHIP		35
+-#define IP_DROP_MEMBERSHIP		36
+-#define IP_UNBLOCK_SOURCE		37
+-#define IP_BLOCK_SOURCE			38
+-#define IP_ADD_SOURCE_MEMBERSHIP	39
+-#define IP_DROP_SOURCE_MEMBERSHIP	40
+-#define IP_MSFILTER			41
+-#define MCAST_JOIN_GROUP		42
+-#define MCAST_BLOCK_SOURCE		43
+-#define MCAST_UNBLOCK_SOURCE		44
+-#define MCAST_LEAVE_GROUP		45
+-#define MCAST_JOIN_SOURCE_GROUP		46
+-#define MCAST_LEAVE_SOURCE_GROUP	47
+-#define MCAST_MSFILTER			48
+-#define IP_MULTICAST_ALL		49
+-#define IP_UNICAST_IF			50
+-
+-#define MCAST_EXCLUDE	0
+-#define MCAST_INCLUDE	1
+-
+-/* These need to appear somewhere around here */
+-#define IP_DEFAULT_MULTICAST_TTL        1
+-#define IP_DEFAULT_MULTICAST_LOOP       1
+-
+-/* Request struct for multicast socket ops */
+-
+-#if __UAPI_DEF_IP_MREQ
+-struct ip_mreq  {
+-	struct in_addr imr_multiaddr;	/* IP multicast address of group */
+-	struct in_addr imr_interface;	/* local IP address of interface */
+-};
+-
+-struct ip_mreqn {
+-	struct in_addr	imr_multiaddr;		/* IP multicast address of group */
+-	struct in_addr	imr_address;		/* local IP address of interface */
+-	int		imr_ifindex;		/* Interface index */
+-};
+-
+-struct ip_mreq_source {
+-	__be32		imr_multiaddr;
+-	__be32		imr_interface;
+-	__be32		imr_sourceaddr;
+-};
+-
+-struct ip_msfilter {
+-	__be32		imsf_multiaddr;
+-	__be32		imsf_interface;
+-	__u32		imsf_fmode;
+-	__u32		imsf_numsrc;
+-	__be32		imsf_slist[1];
+-};
+-
+-#define IP_MSFILTER_SIZE(numsrc) \
+-	(sizeof(struct ip_msfilter) - sizeof(__u32) \
+-	+ (numsrc) * sizeof(__u32))
+-
+-struct group_req {
+-	__u32				 gr_interface;	/* interface index */
+-	struct __kernel_sockaddr_storage gr_group;	/* group address */
+-};
+-
+-struct group_source_req {
+-	__u32				 gsr_interface;	/* interface index */
+-	struct __kernel_sockaddr_storage gsr_group;	/* group address */
+-	struct __kernel_sockaddr_storage gsr_source;	/* source address */
+-};
+-
+-struct group_filter {
+-	__u32				 gf_interface;	/* interface index */
+-	struct __kernel_sockaddr_storage gf_group;	/* multicast address */
+-	__u32				 gf_fmode;	/* filter mode */
+-	__u32				 gf_numsrc;	/* number of sources */
+-	struct __kernel_sockaddr_storage gf_slist[1];	/* interface index */
+-};
+-
+-#define GROUP_FILTER_SIZE(numsrc) \
+-	(sizeof(struct group_filter) - sizeof(struct __kernel_sockaddr_storage) \
+-	+ (numsrc) * sizeof(struct __kernel_sockaddr_storage))
+-#endif
+-
+-#if __UAPI_DEF_IN_PKTINFO
+-struct in_pktinfo {
+-	int		ipi_ifindex;
+-	struct in_addr	ipi_spec_dst;
+-	struct in_addr	ipi_addr;
+-};
+-#endif
+-
+-/* Structure describing an Internet (IP) socket address. */
+-#if  __UAPI_DEF_SOCKADDR_IN
+-#define __SOCK_SIZE__	16		/* sizeof(struct sockaddr)	*/
+-struct sockaddr_in {
+-  __kernel_sa_family_t	sin_family;	/* Address family		*/
+-  __be16		sin_port;	/* Port number			*/
+-  struct in_addr	sin_addr;	/* Internet address		*/
+-
+-  /* Pad to size of `struct sockaddr'. */
+-  unsigned char		__pad[__SOCK_SIZE__ - sizeof(short int) -
+-			sizeof(unsigned short int) - sizeof(struct in_addr)];
+-};
+-#define sin_zero	__pad		/* for BSD UNIX comp. -FvK	*/
+-#endif
+-
+-#if __UAPI_DEF_IN_CLASS
+-/*
+- * Definitions of the bits in an Internet address integer.
+- * On subnets, host and network parts are found according
+- * to the subnet mask, not these masks.
+- */
+-#define	IN_CLASSA(a)		((((long int) (a)) & 0x80000000) == 0)
+-#define	IN_CLASSA_NET		0xff000000
+-#define	IN_CLASSA_NSHIFT	24
+-#define	IN_CLASSA_HOST		(0xffffffff & ~IN_CLASSA_NET)
+-#define	IN_CLASSA_MAX		128
+-
+-#define	IN_CLASSB(a)		((((long int) (a)) & 0xc0000000) == 0x80000000)
+-#define	IN_CLASSB_NET		0xffff0000
+-#define	IN_CLASSB_NSHIFT	16
+-#define	IN_CLASSB_HOST		(0xffffffff & ~IN_CLASSB_NET)
+-#define	IN_CLASSB_MAX		65536
+-
+-#define	IN_CLASSC(a)		((((long int) (a)) & 0xe0000000) == 0xc0000000)
+-#define	IN_CLASSC_NET		0xffffff00
+-#define	IN_CLASSC_NSHIFT	8
+-#define	IN_CLASSC_HOST		(0xffffffff & ~IN_CLASSC_NET)
+-
+-#define	IN_CLASSD(a)		((((long int) (a)) & 0xf0000000) == 0xe0000000)
+-#define	IN_MULTICAST(a)		IN_CLASSD(a)
+-#define IN_MULTICAST_NET	0xF0000000
+-
+-#define	IN_EXPERIMENTAL(a)	((((long int) (a)) & 0xf0000000) == 0xf0000000)
+-#define	IN_BADCLASS(a)		IN_EXPERIMENTAL((a))
+-
+-/* Address to accept any incoming messages. */
+-#define	INADDR_ANY		((unsigned long int) 0x00000000)
+-
+-/* Address to send to all hosts. */
+-#define	INADDR_BROADCAST	((unsigned long int) 0xffffffff)
+-
+-/* Address indicating an error return. */
+-#define	INADDR_NONE		((unsigned long int) 0xffffffff)
+-
+-/* Network number for local host loopback. */
+-#define	IN_LOOPBACKNET		127
+-
+-/* Address to loopback in software to local host.  */
+-#define	INADDR_LOOPBACK		0x7f000001	/* 127.0.0.1   */
+-#define	IN_LOOPBACK(a)		((((long int) (a)) & 0xff000000) == 0x7f000000)
+-
+-/* Defines for Multicast INADDR */
+-#define INADDR_UNSPEC_GROUP   	0xe0000000U	/* 224.0.0.0   */
+-#define INADDR_ALLHOSTS_GROUP 	0xe0000001U	/* 224.0.0.1   */
+-#define INADDR_ALLRTRS_GROUP    0xe0000002U	/* 224.0.0.2 */
+-#define INADDR_MAX_LOCAL_GROUP  0xe00000ffU	/* 224.0.0.255 */
+-#endif
+-
+-/* <asm/byteorder.h> contains the htonl type stuff.. */
+-#include <asm/byteorder.h> 
+-
+-
+-#endif /* _LINUX_IN_H */
+diff --git a/include/linux/in6.h b/include/linux/in6.h
+deleted file mode 100644
+index 6f3bdee..0000000
+--- a/include/linux/in6.h
++++ /dev/null
+@@ -1,296 +0,0 @@
+-/*
+- *	Types and definitions for AF_INET6 
+- *	Linux INET6 implementation 
+- *
+- *	Authors:
+- *	Pedro Roque		<roque@di.fc.ul.pt>	
+- *
+- *	Sources:
+- *	IPv6 Program Interfaces for BSD Systems
+- *      <draft-ietf-ipngwg-bsd-api-05.txt>
+- *
+- *	Advanced Sockets API for IPv6
+- *	<draft-stevens-advanced-api-00.txt>
+- *
+- *	This program is free software; you can redistribute it and/or
+- *      modify it under the terms of the GNU General Public License
+- *      as published by the Free Software Foundation; either version
+- *      2 of the License, or (at your option) any later version.
+- */
+-
+-#ifndef _LINUX_IN6_H
+-#define _LINUX_IN6_H
+-
+-#include <linux/types.h>
+-#include <linux/libc-compat.h>
+-
+-/*
+- *	IPv6 address structure
+- */
+-
+-#if __UAPI_DEF_IN6_ADDR
+-struct in6_addr {
+-	union {
+-		__u8		u6_addr8[16];
+-#if __UAPI_DEF_IN6_ADDR_ALT
+-		__be16		u6_addr16[8];
+-		__be32		u6_addr32[4];
+-#endif
+-	} in6_u;
+-#define s6_addr			in6_u.u6_addr8
+-#if __UAPI_DEF_IN6_ADDR_ALT
+-#define s6_addr16		in6_u.u6_addr16
+-#define s6_addr32		in6_u.u6_addr32
+-#endif
+-};
+-#endif /* __UAPI_DEF_IN6_ADDR */
+-
+-#if __UAPI_DEF_SOCKADDR_IN6
+-struct sockaddr_in6 {
+-	unsigned short int	sin6_family;    /* AF_INET6 */
+-	__be16			sin6_port;      /* Transport layer port # */
+-	__be32			sin6_flowinfo;  /* IPv6 flow information */
+-	struct in6_addr		sin6_addr;      /* IPv6 address */
+-	__u32			sin6_scope_id;  /* scope id (new in RFC2553) */
+-};
+-#endif /* __UAPI_DEF_SOCKADDR_IN6 */
+-
+-#if __UAPI_DEF_IPV6_MREQ
+-struct ipv6_mreq {
+-	/* IPv6 multicast address of group */
+-	struct in6_addr ipv6mr_multiaddr;
+-
+-	/* local IPv6 address of interface */
+-	int		ipv6mr_ifindex;
+-};
+-#endif /* __UAPI_DEF_IVP6_MREQ */
+-
+-#define ipv6mr_acaddr	ipv6mr_multiaddr
+-
+-struct in6_flowlabel_req {
+-	struct in6_addr	flr_dst;
+-	__be32	flr_label;
+-	__u8	flr_action;
+-	__u8	flr_share;
+-	__u16	flr_flags;
+-	__u16 	flr_expires;
+-	__u16	flr_linger;
+-	__u32	__flr_pad;
+-	/* Options in format of IPV6_PKTOPTIONS */
+-};
+-
+-#define IPV6_FL_A_GET	0
+-#define IPV6_FL_A_PUT	1
+-#define IPV6_FL_A_RENEW	2
+-
+-#define IPV6_FL_F_CREATE	1
+-#define IPV6_FL_F_EXCL		2
+-#define IPV6_FL_F_REFLECT	4
+-#define IPV6_FL_F_REMOTE	8
+-
+-#define IPV6_FL_S_NONE		0
+-#define IPV6_FL_S_EXCL		1
+-#define IPV6_FL_S_PROCESS	2
+-#define IPV6_FL_S_USER		3
+-#define IPV6_FL_S_ANY		255
+-
+-
+-/*
+- *	Bitmask constant declarations to help applications select out the 
+- *	flow label and priority fields.
+- *
+- *	Note that this are in host byte order while the flowinfo field of
+- *	sockaddr_in6 is in network byte order.
+- */
+-
+-#define IPV6_FLOWINFO_FLOWLABEL		0x000fffff
+-#define IPV6_FLOWINFO_PRIORITY		0x0ff00000
+-
+-/* These definitions are obsolete */
+-#define IPV6_PRIORITY_UNCHARACTERIZED	0x0000
+-#define IPV6_PRIORITY_FILLER		0x0100
+-#define IPV6_PRIORITY_UNATTENDED	0x0200
+-#define IPV6_PRIORITY_RESERVED1		0x0300
+-#define IPV6_PRIORITY_BULK		0x0400
+-#define IPV6_PRIORITY_RESERVED2		0x0500
+-#define IPV6_PRIORITY_INTERACTIVE	0x0600
+-#define IPV6_PRIORITY_CONTROL		0x0700
+-#define IPV6_PRIORITY_8			0x0800
+-#define IPV6_PRIORITY_9			0x0900
+-#define IPV6_PRIORITY_10		0x0a00
+-#define IPV6_PRIORITY_11		0x0b00
+-#define IPV6_PRIORITY_12		0x0c00
+-#define IPV6_PRIORITY_13		0x0d00
+-#define IPV6_PRIORITY_14		0x0e00
+-#define IPV6_PRIORITY_15		0x0f00
+-
+-/*
+- *	IPV6 extension headers
+- */
+-#if __UAPI_DEF_IPPROTO_V6
+-#define IPPROTO_HOPOPTS		0	/* IPv6 hop-by-hop options	*/
+-#define IPPROTO_ROUTING		43	/* IPv6 routing header		*/
+-#define IPPROTO_FRAGMENT	44	/* IPv6 fragmentation header	*/
+-#define IPPROTO_ICMPV6		58	/* ICMPv6			*/
+-#define IPPROTO_NONE		59	/* IPv6 no next header		*/
+-#define IPPROTO_DSTOPTS		60	/* IPv6 destination options	*/
+-#define IPPROTO_MH		135	/* IPv6 mobility header		*/
+-#endif /* __UAPI_DEF_IPPROTO_V6 */
+-
+-/*
+- *	IPv6 TLV options.
+- */
+-#define IPV6_TLV_PAD1		0
+-#define IPV6_TLV_PADN		1
+-#define IPV6_TLV_ROUTERALERT	5
+-#define IPV6_TLV_CALIPSO	7	/* RFC 5570 */
+-#define IPV6_TLV_JUMBO		194
+-#define IPV6_TLV_HAO		201	/* home address option */
+-
+-/*
+- *	IPV6 socket options
+- */
+-#if __UAPI_DEF_IPV6_OPTIONS
+-#define IPV6_ADDRFORM		1
+-#define IPV6_2292PKTINFO	2
+-#define IPV6_2292HOPOPTS	3
+-#define IPV6_2292DSTOPTS	4
+-#define IPV6_2292RTHDR		5
+-#define IPV6_2292PKTOPTIONS	6
+-#define IPV6_CHECKSUM		7
+-#define IPV6_2292HOPLIMIT	8
+-#define IPV6_NEXTHOP		9
+-#define IPV6_AUTHHDR		10	/* obsolete */
+-#define IPV6_FLOWINFO		11
+-
+-#define IPV6_UNICAST_HOPS	16
+-#define IPV6_MULTICAST_IF	17
+-#define IPV6_MULTICAST_HOPS	18
+-#define IPV6_MULTICAST_LOOP	19
+-#define IPV6_ADD_MEMBERSHIP	20
+-#define IPV6_DROP_MEMBERSHIP	21
+-#define IPV6_ROUTER_ALERT	22
+-#define IPV6_MTU_DISCOVER	23
+-#define IPV6_MTU		24
+-#define IPV6_RECVERR		25
+-#define IPV6_V6ONLY		26
+-#define IPV6_JOIN_ANYCAST	27
+-#define IPV6_LEAVE_ANYCAST	28
+-
+-/* IPV6_MTU_DISCOVER values */
+-#define IPV6_PMTUDISC_DONT		0
+-#define IPV6_PMTUDISC_WANT		1
+-#define IPV6_PMTUDISC_DO		2
+-#define IPV6_PMTUDISC_PROBE		3
+-/* same as IPV6_PMTUDISC_PROBE, provided for symetry with IPv4
+- * also see comments on IP_PMTUDISC_INTERFACE
+- */
+-#define IPV6_PMTUDISC_INTERFACE		4
+-/* weaker version of IPV6_PMTUDISC_INTERFACE, which allows packets to
+- * get fragmented if they exceed the interface mtu
+- */
+-#define IPV6_PMTUDISC_OMIT		5
+-
+-/* Flowlabel */
+-#define IPV6_FLOWLABEL_MGR	32
+-#define IPV6_FLOWINFO_SEND	33
+-
+-#define IPV6_IPSEC_POLICY	34
+-#define IPV6_XFRM_POLICY	35
+-#define IPV6_HDRINCL		36
+-#endif
+-
+-/*
+- * Multicast:
+- * Following socket options are shared between IPv4 and IPv6.
+- *
+- * MCAST_JOIN_GROUP		42
+- * MCAST_BLOCK_SOURCE		43
+- * MCAST_UNBLOCK_SOURCE		44
+- * MCAST_LEAVE_GROUP		45
+- * MCAST_JOIN_SOURCE_GROUP	46
+- * MCAST_LEAVE_SOURCE_GROUP	47
+- * MCAST_MSFILTER		48
+- */
+-
+-/*
+- * Advanced API (RFC3542) (1)
+- *
+- * Note: IPV6_RECVRTHDRDSTOPTS does not exist. see net/ipv6/datagram.c.
+- */
+-
+-#define IPV6_RECVPKTINFO	49
+-#define IPV6_PKTINFO		50
+-#define IPV6_RECVHOPLIMIT	51
+-#define IPV6_HOPLIMIT		52
+-#define IPV6_RECVHOPOPTS	53
+-#define IPV6_HOPOPTS		54
+-#define IPV6_RTHDRDSTOPTS	55
+-#define IPV6_RECVRTHDR		56
+-#define IPV6_RTHDR		57
+-#define IPV6_RECVDSTOPTS	58
+-#define IPV6_DSTOPTS		59
+-#define IPV6_RECVPATHMTU	60
+-#define IPV6_PATHMTU		61
+-#define IPV6_DONTFRAG		62
+-#if 0	/* not yet */
+-#define IPV6_USE_MIN_MTU	63
+-#endif
+-
+-/*
+- * Netfilter (1)
+- *
+- * Following socket options are used in ip6_tables;
+- * see include/linux/netfilter_ipv6/ip6_tables.h.
+- *
+- * IP6T_SO_SET_REPLACE / IP6T_SO_GET_INFO		64
+- * IP6T_SO_SET_ADD_COUNTERS / IP6T_SO_GET_ENTRIES	65
+- */
+-
+-/*
+- * Advanced API (RFC3542) (2)
+- */
+-#define IPV6_RECVTCLASS		66
+-#define IPV6_TCLASS		67
+-
+-/*
+- * Netfilter (2)
+- *
+- * Following socket options are used in ip6_tables;
+- * see include/linux/netfilter_ipv6/ip6_tables.h.
+- *
+- * IP6T_SO_GET_REVISION_MATCH	68
+- * IP6T_SO_GET_REVISION_TARGET	69
+- * IP6T_SO_ORIGINAL_DST		80
+- */
+-
+-#define IPV6_AUTOFLOWLABEL	70
+-/* RFC5014: Source address selection */
+-#define IPV6_ADDR_PREFERENCES	72
+-
+-#define IPV6_PREFER_SRC_TMP		0x0001
+-#define IPV6_PREFER_SRC_PUBLIC		0x0002
+-#define IPV6_PREFER_SRC_PUBTMP_DEFAULT	0x0100
+-#define IPV6_PREFER_SRC_COA		0x0004
+-#define IPV6_PREFER_SRC_HOME		0x0400
+-#define IPV6_PREFER_SRC_CGA		0x0008
+-#define IPV6_PREFER_SRC_NONCGA		0x0800
+-
+-/* RFC5082: Generalized Ttl Security Mechanism */
+-#define IPV6_MINHOPCOUNT		73
+-
+-#define IPV6_ORIGDSTADDR        74
+-#define IPV6_RECVORIGDSTADDR    IPV6_ORIGDSTADDR
+-#define IPV6_TRANSPARENT        75
+-#define IPV6_UNICAST_IF         76
+-#define IPV6_RECVFRAGSIZE	77
+-
+-/*
+- * Multicast Routing:
+- * see include/uapi/linux/mroute6.h.
+- *
+- * MRT6_BASE			200
+- * ...
+- * MRT6_MAX
+- */
+-#endif /* _LINUX_IN6_H */
+diff --git a/include/linux/in_route.h b/include/linux/in_route.h
+deleted file mode 100644
+index b261b8c..0000000
+--- a/include/linux/in_route.h
++++ /dev/null
+@@ -1,32 +0,0 @@
+-#ifndef _LINUX_IN_ROUTE_H
+-#define _LINUX_IN_ROUTE_H
+-
+-/* IPv4 routing cache flags */
+-
+-#define RTCF_DEAD	RTNH_F_DEAD
+-#define RTCF_ONLINK	RTNH_F_ONLINK
+-
+-/* Obsolete flag. About to be deleted */
+-#define RTCF_NOPMTUDISC RTM_F_NOPMTUDISC
+-
+-#define RTCF_NOTIFY	0x00010000
+-#define RTCF_DIRECTDST	0x00020000 /* unused */
+-#define RTCF_REDIRECTED	0x00040000
+-#define RTCF_TPROXY	0x00080000 /* unused */
+-
+-#define RTCF_FAST	0x00200000 /* unused */
+-#define RTCF_MASQ	0x00400000 /* unused */
+-#define RTCF_SNAT	0x00800000 /* unused */
+-#define RTCF_DOREDIRECT 0x01000000
+-#define RTCF_DIRECTSRC	0x04000000
+-#define RTCF_DNAT	0x08000000
+-#define RTCF_BROADCAST	0x10000000
+-#define RTCF_MULTICAST	0x20000000
+-#define RTCF_REJECT	0x40000000 /* unused */
+-#define RTCF_LOCAL	0x80000000
+-
+-#define RTCF_NAT	(RTCF_DNAT|RTCF_SNAT)
+-
+-#define RT_TOS(tos)	((tos)&IPTOS_TOS_MASK)
+-
+-#endif /* _LINUX_IN_ROUTE_H */
+diff --git a/include/linux/inet_diag.h b/include/linux/inet_diag.h
+deleted file mode 100644
+index bada4d7..0000000
+--- a/include/linux/inet_diag.h
++++ /dev/null
+@@ -1,196 +0,0 @@
+-#ifndef _INET_DIAG_H_
+-#define _INET_DIAG_H_
+-
+-#include <linux/types.h>
+-
+-/* Just some random number */
+-#define TCPDIAG_GETSOCK 18
+-#define DCCPDIAG_GETSOCK 19
+-
+-#define INET_DIAG_GETSOCK_MAX 24
+-
+-/* Socket identity */
+-struct inet_diag_sockid {
+-	__be16	idiag_sport;
+-	__be16	idiag_dport;
+-	__be32	idiag_src[4];
+-	__be32	idiag_dst[4];
+-	__u32	idiag_if;
+-	__u32	idiag_cookie[2];
+-#define INET_DIAG_NOCOOKIE (~0U)
+-};
+-
+-/* Request structure */
+-
+-struct inet_diag_req {
+-	__u8	idiag_family;		/* Family of addresses. */
+-	__u8	idiag_src_len;
+-	__u8	idiag_dst_len;
+-	__u8	idiag_ext;		/* Query extended information */
+-
+-	struct inet_diag_sockid id;
+-
+-	__u32	idiag_states;		/* States to dump */
+-	__u32	idiag_dbs;		/* Tables to dump (NI) */
+-};
+-
+-struct inet_diag_req_v2 {
+-	__u8	sdiag_family;
+-	__u8	sdiag_protocol;
+-	__u8	idiag_ext;
+-	__u8	pad;
+-	__u32	idiag_states;
+-	struct inet_diag_sockid id;
+-};
+-
+-/*
+- * SOCK_RAW sockets require the underlied protocol to be
+- * additionally specified so we can use @pad member for
+- * this, but we can't rename it because userspace programs
+- * still may depend on this name. Instead lets use another
+- * structure definition as an alias for struct
+- * @inet_diag_req_v2.
+- */
+-struct inet_diag_req_raw {
+-	__u8	sdiag_family;
+-	__u8	sdiag_protocol;
+-	__u8	idiag_ext;
+-	__u8	sdiag_raw_protocol;
+-	__u32	idiag_states;
+-	struct inet_diag_sockid id;
+-};
+-
+-enum {
+-	INET_DIAG_REQ_NONE,
+-	INET_DIAG_REQ_BYTECODE,
+-};
+-
+-#define INET_DIAG_REQ_MAX INET_DIAG_REQ_BYTECODE
+-
+-/* Bytecode is sequence of 4 byte commands followed by variable arguments.
+- * All the commands identified by "code" are conditional jumps forward:
+- * to offset cc+"yes" or to offset cc+"no". "yes" is supposed to be
+- * length of the command and its arguments.
+- */
+- 
+-struct inet_diag_bc_op {
+-	unsigned char	code;
+-	unsigned char	yes;
+-	unsigned short	no;
+-};
+-
+-enum {
+-	INET_DIAG_BC_NOP,
+-	INET_DIAG_BC_JMP,
+-	INET_DIAG_BC_S_GE,
+-	INET_DIAG_BC_S_LE,
+-	INET_DIAG_BC_D_GE,
+-	INET_DIAG_BC_D_LE,
+-	INET_DIAG_BC_AUTO,
+-	INET_DIAG_BC_S_COND,
+-	INET_DIAG_BC_D_COND,
+-	INET_DIAG_BC_DEV_COND,   /* u32 ifindex */
+-	INET_DIAG_BC_MARK_COND,
+-};
+-
+-struct inet_diag_hostcond {
+-	__u8	family;
+-	__u8	prefix_len;
+-	int	port;
+-	__be32	addr[0];
+-};
+-
+-struct inet_diag_markcond {
+-	__u32 mark;
+-	__u32 mask;
+-};
+-
+-/* Base info structure. It contains socket identity (addrs/ports/cookie)
+- * and, alas, the information shown by netstat. */
+-struct inet_diag_msg {
+-	__u8	idiag_family;
+-	__u8	idiag_state;
+-	__u8	idiag_timer;
+-	__u8	idiag_retrans;
+-
+-	struct inet_diag_sockid id;
+-
+-	__u32	idiag_expires;
+-	__u32	idiag_rqueue;
+-	__u32	idiag_wqueue;
+-	__u32	idiag_uid;
+-	__u32	idiag_inode;
+-};
+-
+-/* Extensions */
+-
+-enum {
+-	INET_DIAG_NONE,
+-	INET_DIAG_MEMINFO,
+-	INET_DIAG_INFO,
+-	INET_DIAG_VEGASINFO,
+-	INET_DIAG_CONG,
+-	INET_DIAG_TOS,
+-	INET_DIAG_TCLASS,
+-	INET_DIAG_SKMEMINFO,
+-	INET_DIAG_SHUTDOWN,
+-	INET_DIAG_DCTCPINFO,
+-	INET_DIAG_PROTOCOL,  /* response attribute only */
+-	INET_DIAG_SKV6ONLY,
+-	INET_DIAG_LOCALS,
+-	INET_DIAG_PEERS,
+-	INET_DIAG_PAD,
+-	INET_DIAG_MARK,
+-	INET_DIAG_BBRINFO,
+-	INET_DIAG_CLASS_ID,
+-	INET_DIAG_MD5SIG,
+-	__INET_DIAG_MAX,
+-};
+-
+-#define INET_DIAG_MAX (__INET_DIAG_MAX - 1)
+-
+-/* INET_DIAG_MEM */
+-
+-struct inet_diag_meminfo {
+-	__u32	idiag_rmem;
+-	__u32	idiag_wmem;
+-	__u32	idiag_fmem;
+-	__u32	idiag_tmem;
+-};
+-
+-/* INET_DIAG_VEGASINFO */
+-
+-struct tcpvegas_info {
+-	__u32	tcpv_enabled;
+-	__u32	tcpv_rttcnt;
+-	__u32	tcpv_rtt;
+-	__u32	tcpv_minrtt;
+-};
+-
+-/* INET_DIAG_DCTCPINFO */
+-
+-struct tcp_dctcp_info {
+-	__u16	dctcp_enabled;
+-	__u16	dctcp_ce_state;
+-	__u32	dctcp_alpha;
+-	__u32	dctcp_ab_ecn;
+-	__u32	dctcp_ab_tot;
+-};
+-
+-/* INET_DIAG_BBRINFO */
+-
+-struct tcp_bbr_info {
+-	/* u64 bw: max-filtered BW (app throughput) estimate in Byte per sec: */
+-	__u32	bbr_bw_lo;		/* lower 32 bits of bw */
+-	__u32	bbr_bw_hi;		/* upper 32 bits of bw */
+-	__u32	bbr_min_rtt;		/* min-filtered RTT in uSec */
+-	__u32	bbr_pacing_gain;	/* pacing gain shifted left 8 bits */
+-	__u32	bbr_cwnd_gain;		/* cwnd gain shifted left 8 bits */
+-};
+-
+-union tcp_cc_info {
+-	struct tcpvegas_info	vegas;
+-	struct tcp_dctcp_info	dctcp;
+-	struct tcp_bbr_info	bbr;
+-};
+-#endif /* _INET_DIAG_H_ */
+diff --git a/include/linux/ip.h b/include/linux/ip.h
+deleted file mode 100644
+index 1907284..0000000
+--- a/include/linux/ip.h
++++ /dev/null
+@@ -1,175 +0,0 @@
+-/*
+- * INET		An implementation of the TCP/IP protocol suite for the LINUX
+- *		operating system.  INET is implemented using the  BSD Socket
+- *		interface as the means of communication with the user level.
+- *
+- *		Definitions for the IP protocol.
+- *
+- * Version:	@(#)ip.h	1.0.2	04/28/93
+- *
+- * Authors:	Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
+- *
+- *		This program is free software; you can redistribute it and/or
+- *		modify it under the terms of the GNU General Public License
+- *		as published by the Free Software Foundation; either version
+- *		2 of the License, or (at your option) any later version.
+- */
+-#ifndef _LINUX_IP_H
+-#define _LINUX_IP_H
+-#include <linux/types.h>
+-#include <asm/byteorder.h>
+-
+-#define IPTOS_TOS_MASK		0x1E
+-#define IPTOS_TOS(tos)		((tos)&IPTOS_TOS_MASK)
+-#define	IPTOS_LOWDELAY		0x10
+-#define	IPTOS_THROUGHPUT	0x08
+-#define	IPTOS_RELIABILITY	0x04
+-#define	IPTOS_MINCOST		0x02
+-
+-#define IPTOS_PREC_MASK		0xE0
+-#define IPTOS_PREC(tos)		((tos)&IPTOS_PREC_MASK)
+-#define IPTOS_PREC_NETCONTROL           0xe0
+-#define IPTOS_PREC_INTERNETCONTROL      0xc0
+-#define IPTOS_PREC_CRITIC_ECP           0xa0
+-#define IPTOS_PREC_FLASHOVERRIDE        0x80
+-#define IPTOS_PREC_FLASH                0x60
+-#define IPTOS_PREC_IMMEDIATE            0x40
+-#define IPTOS_PREC_PRIORITY             0x20
+-#define IPTOS_PREC_ROUTINE              0x00
+-
+-
+-/* IP options */
+-#define IPOPT_COPY		0x80
+-#define IPOPT_CLASS_MASK	0x60
+-#define IPOPT_NUMBER_MASK	0x1f
+-
+-#define	IPOPT_COPIED(o)		((o)&IPOPT_COPY)
+-#define	IPOPT_CLASS(o)		((o)&IPOPT_CLASS_MASK)
+-#define	IPOPT_NUMBER(o)		((o)&IPOPT_NUMBER_MASK)
+-
+-#define	IPOPT_CONTROL		0x00
+-#define	IPOPT_RESERVED1		0x20
+-#define	IPOPT_MEASUREMENT	0x40
+-#define	IPOPT_RESERVED2		0x60
+-
+-#define IPOPT_END	(0 |IPOPT_CONTROL)
+-#define IPOPT_NOOP	(1 |IPOPT_CONTROL)
+-#define IPOPT_SEC	(2 |IPOPT_CONTROL|IPOPT_COPY)
+-#define IPOPT_LSRR	(3 |IPOPT_CONTROL|IPOPT_COPY)
+-#define IPOPT_TIMESTAMP	(4 |IPOPT_MEASUREMENT)
+-#define IPOPT_CIPSO	(6 |IPOPT_CONTROL|IPOPT_COPY)
+-#define IPOPT_RR	(7 |IPOPT_CONTROL)
+-#define IPOPT_SID	(8 |IPOPT_CONTROL|IPOPT_COPY)
+-#define IPOPT_SSRR	(9 |IPOPT_CONTROL|IPOPT_COPY)
+-#define IPOPT_RA	(20|IPOPT_CONTROL|IPOPT_COPY)
+-
+-#define IPVERSION	4
+-#define MAXTTL		255
+-#define IPDEFTTL	64
+-
+-#define IPOPT_OPTVAL 0
+-#define IPOPT_OLEN   1
+-#define IPOPT_OFFSET 2
+-#define IPOPT_MINOFF 4
+-#define MAX_IPOPTLEN 40
+-#define IPOPT_NOP IPOPT_NOOP
+-#define IPOPT_EOL IPOPT_END
+-#define IPOPT_TS  IPOPT_TIMESTAMP
+-
+-#define	IPOPT_TS_TSONLY		0		/* timestamps only */
+-#define	IPOPT_TS_TSANDADDR	1		/* timestamps and addresses */
+-#define	IPOPT_TS_PRESPEC	3		/* specified modules only */
+-
+-#define IPV4_BEET_PHMAXLEN 8
+-
+-struct iphdr {
+-#if defined(__LITTLE_ENDIAN_BITFIELD)
+-	__u8	ihl:4,
+-		version:4;
+-#elif defined (__BIG_ENDIAN_BITFIELD)
+-	__u8	version:4,
+-  		ihl:4;
+-#else
+-#error	"Please fix <asm/byteorder.h>"
+-#endif
+-	__u8	tos;
+-	__be16	tot_len;
+-	__be16	id;
+-	__be16	frag_off;
+-	__u8	ttl;
+-	__u8	protocol;
+-	__sum16	check;
+-	__be32	saddr;
+-	__be32	daddr;
+-	/*The options start here. */
+-};
+-
+-
+-struct ip_auth_hdr {
+-	__u8  nexthdr;
+-	__u8  hdrlen;		/* This one is measured in 32 bit units! */
+-	__be16 reserved;
+-	__be32 spi;
+-	__be32 seq_no;		/* Sequence number */
+-	__u8  auth_data[0];	/* Variable len but >=4. Mind the 64 bit alignment! */
+-};
+-
+-struct ip_esp_hdr {
+-	__be32 spi;
+-	__be32 seq_no;		/* Sequence number */
+-	__u8  enc_data[0];	/* Variable len but >=8. Mind the 64 bit alignment! */
+-};
+-
+-struct ip_comp_hdr {
+-	__u8 nexthdr;
+-	__u8 flags;
+-	__be16 cpi;
+-};
+-
+-struct ip_beet_phdr {
+-	__u8 nexthdr;
+-	__u8 hdrlen;
+-	__u8 padlen;
+-	__u8 reserved;
+-};
+-
+-/* index values for the variables in ipv4_devconf */
+-enum
+-{
+-	IPV4_DEVCONF_FORWARDING=1,
+-	IPV4_DEVCONF_MC_FORWARDING,
+-	IPV4_DEVCONF_PROXY_ARP,
+-	IPV4_DEVCONF_ACCEPT_REDIRECTS,
+-	IPV4_DEVCONF_SECURE_REDIRECTS,
+-	IPV4_DEVCONF_SEND_REDIRECTS,
+-	IPV4_DEVCONF_SHARED_MEDIA,
+-	IPV4_DEVCONF_RP_FILTER,
+-	IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE,
+-	IPV4_DEVCONF_BOOTP_RELAY,
+-	IPV4_DEVCONF_LOG_MARTIANS,
+-	IPV4_DEVCONF_TAG,
+-	IPV4_DEVCONF_ARPFILTER,
+-	IPV4_DEVCONF_MEDIUM_ID,
+-	IPV4_DEVCONF_NOXFRM,
+-	IPV4_DEVCONF_NOPOLICY,
+-	IPV4_DEVCONF_FORCE_IGMP_VERSION,
+-	IPV4_DEVCONF_ARP_ANNOUNCE,
+-	IPV4_DEVCONF_ARP_IGNORE,
+-	IPV4_DEVCONF_PROMOTE_SECONDARIES,
+-	IPV4_DEVCONF_ARP_ACCEPT,
+-	IPV4_DEVCONF_ARP_NOTIFY,
+-	IPV4_DEVCONF_ACCEPT_LOCAL,
+-	IPV4_DEVCONF_SRC_VMARK,
+-	IPV4_DEVCONF_PROXY_ARP_PVLAN,
+-	IPV4_DEVCONF_ROUTE_LOCALNET,
+-	IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL,
+-	IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL,
+-	IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN,
+-	IPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST,
+-	IPV4_DEVCONF_DROP_GRATUITOUS_ARP,
+-	__IPV4_DEVCONF_MAX
+-};
+-
+-#define IPV4_DEVCONF_MAX (__IPV4_DEVCONF_MAX - 1)
+-
+-#endif /* _LINUX_IP_H */
+diff --git a/include/linux/ip6_tunnel.h b/include/linux/ip6_tunnel.h
+deleted file mode 100644
+index 425926c..0000000
+--- a/include/linux/ip6_tunnel.h
++++ /dev/null
+@@ -1,53 +0,0 @@
+-#ifndef _IP6_TUNNEL_H
+-#define _IP6_TUNNEL_H
+-
+-#include <linux/types.h>
+-#include <linux/if.h>		/* For IFNAMSIZ. */
+-#include <linux/in6.h>		/* For struct in6_addr. */
+-
+-#define IPV6_TLV_TNL_ENCAP_LIMIT 4
+-#define IPV6_DEFAULT_TNL_ENCAP_LIMIT 4
+-
+-/* don't add encapsulation limit if one isn't present in inner packet */
+-#define IP6_TNL_F_IGN_ENCAP_LIMIT 0x1
+-/* copy the traffic class field from the inner packet */
+-#define IP6_TNL_F_USE_ORIG_TCLASS 0x2
+-/* copy the flowlabel from the inner packet */
+-#define IP6_TNL_F_USE_ORIG_FLOWLABEL 0x4
+-/* being used for Mobile IPv6 */
+-#define IP6_TNL_F_MIP6_DEV 0x8
+-/* copy DSCP from the outer packet */
+-#define IP6_TNL_F_RCV_DSCP_COPY 0x10
+-/* copy fwmark from inner packet */
+-#define IP6_TNL_F_USE_ORIG_FWMARK 0x20
+-
+-struct ip6_tnl_parm {
+-	char name[IFNAMSIZ];	/* name of tunnel device */
+-	int link;		/* ifindex of underlying L2 interface */
+-	__u8 proto;		/* tunnel protocol */
+-	__u8 encap_limit;	/* encapsulation limit for tunnel */
+-	__u8 hop_limit;		/* hop limit for tunnel */
+-	__be32 flowinfo;	/* traffic class and flowlabel for tunnel */
+-	__u32 flags;		/* tunnel flags */
+-	struct in6_addr laddr;	/* local tunnel end-point address */
+-	struct in6_addr raddr;	/* remote tunnel end-point address */
+-};
+-
+-struct ip6_tnl_parm2 {
+-	char name[IFNAMSIZ];	/* name of tunnel device */
+-	int link;		/* ifindex of underlying L2 interface */
+-	__u8 proto;		/* tunnel protocol */
+-	__u8 encap_limit;	/* encapsulation limit for tunnel */
+-	__u8 hop_limit;		/* hop limit for tunnel */
+-	__be32 flowinfo;	/* traffic class and flowlabel for tunnel */
+-	__u32 flags;		/* tunnel flags */
+-	struct in6_addr laddr;	/* local tunnel end-point address */
+-	struct in6_addr raddr;	/* remote tunnel end-point address */
+-
+-	__be16			i_flags;
+-	__be16			o_flags;
+-	__be32			i_key;
+-	__be32			o_key;
+-};
+-
+-#endif
+diff --git a/include/linux/ipsec.h b/include/linux/ipsec.h
+deleted file mode 100644
+index d17a630..0000000
+--- a/include/linux/ipsec.h
++++ /dev/null
+@@ -1,47 +0,0 @@
+-#ifndef _LINUX_IPSEC_H
+-#define _LINUX_IPSEC_H
+-
+-/* The definitions, required to talk to KAME racoon IKE. */
+-
+-#include <linux/pfkeyv2.h>
+-
+-#define IPSEC_PORT_ANY		0
+-#define IPSEC_ULPROTO_ANY	255
+-#define IPSEC_PROTO_ANY		255
+-
+-enum {
+-	IPSEC_MODE_ANY		= 0,	/* We do not support this for SA */
+-	IPSEC_MODE_TRANSPORT	= 1,
+-	IPSEC_MODE_TUNNEL	= 2,
+-	IPSEC_MODE_BEET         = 3
+-};
+-
+-enum {
+-	IPSEC_DIR_ANY		= 0,
+-	IPSEC_DIR_INBOUND	= 1,
+-	IPSEC_DIR_OUTBOUND	= 2,
+-	IPSEC_DIR_FWD		= 3,	/* It is our own */
+-	IPSEC_DIR_MAX		= 4,
+-	IPSEC_DIR_INVALID	= 5
+-};
+-
+-enum {
+-	IPSEC_POLICY_DISCARD	= 0,
+-	IPSEC_POLICY_NONE	= 1,
+-	IPSEC_POLICY_IPSEC	= 2,
+-	IPSEC_POLICY_ENTRUST	= 3,
+-	IPSEC_POLICY_BYPASS	= 4
+-};
+-
+-enum {
+-	IPSEC_LEVEL_DEFAULT	= 0,
+-	IPSEC_LEVEL_USE		= 1,
+-	IPSEC_LEVEL_REQUIRE	= 2,
+-	IPSEC_LEVEL_UNIQUE	= 3
+-};
+-
+-#define IPSEC_MANUAL_REQID_MAX	0x3fff
+-
+-#define IPSEC_REPLAYWSIZE  32
+-
+-#endif	/* _LINUX_IPSEC_H */
+diff --git a/include/linux/kernel.h b/include/linux/kernel.h
+deleted file mode 100644
+index 527549f..0000000
+--- a/include/linux/kernel.h
++++ /dev/null
+@@ -1,14 +0,0 @@
+-#ifndef _LINUX_KERNEL_H
+-#define _LINUX_KERNEL_H
+-
+-#include <linux/sysinfo.h>
+-
+-/*
+- * 'kernel.h' contains some often-used function prototypes etc
+- */
+-#define __ALIGN_KERNEL(x, a)		__ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1)
+-#define __ALIGN_KERNEL_MASK(x, mask)	(((x) + (mask)) & ~(mask))
+-
+-#define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
+-
+-#endif /* _LINUX_KERNEL_H */
+diff --git a/include/linux/l2tp.h b/include/linux/l2tp.h
+deleted file mode 100644
+index 8a80007..0000000
+--- a/include/linux/l2tp.h
++++ /dev/null
+@@ -1,199 +0,0 @@
+-/*
+- * L2TP-over-IP socket for L2TPv3.
+- *
+- * Author: James Chapman <jchapman@katalix.com>
+- */
+-
+-#ifndef _LINUX_L2TP_H_
+-#define _LINUX_L2TP_H_
+-
+-#include <linux/types.h>
+-#include <linux/socket.h>
+-#include <linux/in.h>
+-#include <linux/in6.h>
+-
+-#define IPPROTO_L2TP		115
+-
+-/**
+- * struct sockaddr_l2tpip - the sockaddr structure for L2TP-over-IP sockets
+- * @l2tp_family:  address family number AF_L2TPIP.
+- * @l2tp_addr:    protocol specific address information
+- * @l2tp_conn_id: connection id of tunnel
+- */
+-#define __SOCK_SIZE__	16		/* sizeof(struct sockaddr)	*/
+-struct sockaddr_l2tpip {
+-	/* The first fields must match struct sockaddr_in */
+-	__kernel_sa_family_t l2tp_family; /* AF_INET */
+-	__be16		l2tp_unused;	/* INET port number (unused) */
+-	struct in_addr	l2tp_addr;	/* Internet address */
+-
+-	__u32		l2tp_conn_id;	/* Connection ID of tunnel */
+-
+-	/* Pad to size of `struct sockaddr'. */
+-	unsigned char	__pad[__SOCK_SIZE__ -
+-			      sizeof(__kernel_sa_family_t) -
+-			      sizeof(__be16) - sizeof(struct in_addr) -
+-			      sizeof(__u32)];
+-};
+-
+-/**
+- * struct sockaddr_l2tpip6 - the sockaddr structure for L2TP-over-IPv6 sockets
+- * @l2tp_family:  address family number AF_L2TPIP.
+- * @l2tp_addr:    protocol specific address information
+- * @l2tp_conn_id: connection id of tunnel
+- */
+-struct sockaddr_l2tpip6 {
+-	/* The first fields must match struct sockaddr_in6 */
+-	__kernel_sa_family_t l2tp_family; /* AF_INET6 */
+-	__be16		l2tp_unused;	/* INET port number (unused) */
+-	__be32		l2tp_flowinfo;	/* IPv6 flow information */
+-	struct in6_addr	l2tp_addr;	/* IPv6 address */
+-	__u32		l2tp_scope_id;	/* scope id (new in RFC2553) */
+-	__u32		l2tp_conn_id;	/* Connection ID of tunnel */
+-};
+-
+-/*****************************************************************************
+- *  NETLINK_GENERIC netlink family.
+- *****************************************************************************/
+-
+-/*
+- * Commands.
+- * Valid TLVs of each command are:-
+- * TUNNEL_CREATE	- CONN_ID, pw_type, netns, ifname, ipinfo, udpinfo, udpcsum, vlanid
+- * TUNNEL_DELETE	- CONN_ID
+- * TUNNEL_MODIFY	- CONN_ID, udpcsum
+- * TUNNEL_GETSTATS	- CONN_ID, (stats)
+- * TUNNEL_GET		- CONN_ID, (...)
+- * SESSION_CREATE	- SESSION_ID, PW_TYPE, offset, data_seq, cookie, peer_cookie, offset, l2spec
+- * SESSION_DELETE	- SESSION_ID
+- * SESSION_MODIFY	- SESSION_ID, data_seq
+- * SESSION_GET		- SESSION_ID, (...)
+- * SESSION_GETSTATS	- SESSION_ID, (stats)
+- *
+- */
+-enum {
+-	L2TP_CMD_NOOP,
+-	L2TP_CMD_TUNNEL_CREATE,
+-	L2TP_CMD_TUNNEL_DELETE,
+-	L2TP_CMD_TUNNEL_MODIFY,
+-	L2TP_CMD_TUNNEL_GET,
+-	L2TP_CMD_SESSION_CREATE,
+-	L2TP_CMD_SESSION_DELETE,
+-	L2TP_CMD_SESSION_MODIFY,
+-	L2TP_CMD_SESSION_GET,
+-	__L2TP_CMD_MAX,
+-};
+-
+-#define L2TP_CMD_MAX			(__L2TP_CMD_MAX - 1)
+-
+-/*
+- * ATTR types defined for L2TP
+- */
+-enum {
+-	L2TP_ATTR_NONE,			/* no data */
+-	L2TP_ATTR_PW_TYPE,		/* u16, enum l2tp_pwtype */
+-	L2TP_ATTR_ENCAP_TYPE,		/* u16, enum l2tp_encap_type */
+-	L2TP_ATTR_OFFSET,		/* u16 */
+-	L2TP_ATTR_DATA_SEQ,		/* u16 */
+-	L2TP_ATTR_L2SPEC_TYPE,		/* u8, enum l2tp_l2spec_type */
+-	L2TP_ATTR_L2SPEC_LEN,		/* u8, enum l2tp_l2spec_type */
+-	L2TP_ATTR_PROTO_VERSION,	/* u8 */
+-	L2TP_ATTR_IFNAME,		/* string */
+-	L2TP_ATTR_CONN_ID,		/* u32 */
+-	L2TP_ATTR_PEER_CONN_ID,		/* u32 */
+-	L2TP_ATTR_SESSION_ID,		/* u32 */
+-	L2TP_ATTR_PEER_SESSION_ID,	/* u32 */
+-	L2TP_ATTR_UDP_CSUM,		/* u8 */
+-	L2TP_ATTR_VLAN_ID,		/* u16 */
+-	L2TP_ATTR_COOKIE,		/* 0, 4 or 8 bytes */
+-	L2TP_ATTR_PEER_COOKIE,		/* 0, 4 or 8 bytes */
+-	L2TP_ATTR_DEBUG,		/* u32, enum l2tp_debug_flags */
+-	L2TP_ATTR_RECV_SEQ,		/* u8 */
+-	L2TP_ATTR_SEND_SEQ,		/* u8 */
+-	L2TP_ATTR_LNS_MODE,		/* u8 */
+-	L2TP_ATTR_USING_IPSEC,		/* u8 */
+-	L2TP_ATTR_RECV_TIMEOUT,		/* msec */
+-	L2TP_ATTR_FD,			/* int */
+-	L2TP_ATTR_IP_SADDR,		/* u32 */
+-	L2TP_ATTR_IP_DADDR,		/* u32 */
+-	L2TP_ATTR_UDP_SPORT,		/* u16 */
+-	L2TP_ATTR_UDP_DPORT,		/* u16 */
+-	L2TP_ATTR_MTU,			/* u16 */
+-	L2TP_ATTR_MRU,			/* u16 */
+-	L2TP_ATTR_STATS,		/* nested */
+-	L2TP_ATTR_IP6_SADDR,		/* struct in6_addr */
+-	L2TP_ATTR_IP6_DADDR,		/* struct in6_addr */
+-	L2TP_ATTR_UDP_ZERO_CSUM6_TX,	/* flag */
+-	L2TP_ATTR_UDP_ZERO_CSUM6_RX,	/* flag */
+-	L2TP_ATTR_PAD,
+-	__L2TP_ATTR_MAX,
+-};
+-
+-#define L2TP_ATTR_MAX			(__L2TP_ATTR_MAX - 1)
+-
+-/* Nested in L2TP_ATTR_STATS */
+-enum {
+-	L2TP_ATTR_STATS_NONE,		/* no data */
+-	L2TP_ATTR_TX_PACKETS,		/* u64 */
+-	L2TP_ATTR_TX_BYTES,		/* u64 */
+-	L2TP_ATTR_TX_ERRORS,		/* u64 */
+-	L2TP_ATTR_RX_PACKETS,		/* u64 */
+-	L2TP_ATTR_RX_BYTES,		/* u64 */
+-	L2TP_ATTR_RX_SEQ_DISCARDS,	/* u64 */
+-	L2TP_ATTR_RX_OOS_PACKETS,	/* u64 */
+-	L2TP_ATTR_RX_ERRORS,		/* u64 */
+-	L2TP_ATTR_STATS_PAD,
+-	__L2TP_ATTR_STATS_MAX,
+-};
+-
+-#define L2TP_ATTR_STATS_MAX		(__L2TP_ATTR_STATS_MAX - 1)
+-
+-enum l2tp_pwtype {
+-	L2TP_PWTYPE_NONE = 0x0000,
+-	L2TP_PWTYPE_ETH_VLAN = 0x0004,
+-	L2TP_PWTYPE_ETH = 0x0005,
+-	L2TP_PWTYPE_PPP = 0x0007,
+-	L2TP_PWTYPE_PPP_AC = 0x0008,
+-	L2TP_PWTYPE_IP = 0x000b,
+-	__L2TP_PWTYPE_MAX
+-};
+-
+-enum l2tp_l2spec_type {
+-	L2TP_L2SPECTYPE_NONE,
+-	L2TP_L2SPECTYPE_DEFAULT,
+-};
+-
+-enum l2tp_encap_type {
+-	L2TP_ENCAPTYPE_UDP,
+-	L2TP_ENCAPTYPE_IP,
+-};
+-
+-enum l2tp_seqmode {
+-	L2TP_SEQ_NONE = 0,
+-	L2TP_SEQ_IP = 1,
+-	L2TP_SEQ_ALL = 2,
+-};
+-
+-/**
+- * enum l2tp_debug_flags - debug message categories for L2TP tunnels/sessions
+- *
+- * @L2TP_MSG_DEBUG: verbose debug (if compiled in)
+- * @L2TP_MSG_CONTROL: userspace - kernel interface
+- * @L2TP_MSG_SEQ: sequence numbers
+- * @L2TP_MSG_DATA: data packets
+- */
+-enum l2tp_debug_flags {
+-	L2TP_MSG_DEBUG		= (1 << 0),
+-	L2TP_MSG_CONTROL	= (1 << 1),
+-	L2TP_MSG_SEQ		= (1 << 2),
+-	L2TP_MSG_DATA		= (1 << 3),
+-};
+-
+-/*
+- * NETLINK_GENERIC related info
+- */
+-#define L2TP_GENL_NAME		"l2tp"
+-#define L2TP_GENL_VERSION	0x1
+-#define L2TP_GENL_MCGROUP       "l2tp"
+-
+-#endif /* _LINUX_L2TP_H_ */
+diff --git a/include/linux/libc-compat.h b/include/linux/libc-compat.h
+deleted file mode 100644
+index f38571d..0000000
+--- a/include/linux/libc-compat.h
++++ /dev/null
+@@ -1,213 +0,0 @@
+-/*
+- * Compatibility interface for userspace libc header coordination:
+- *
+- * Define compatibility macros that are used to control the inclusion or
+- * exclusion of UAPI structures and definitions in coordination with another
+- * userspace C library.
+- *
+- * This header is intended to solve the problem of UAPI definitions that
+- * conflict with userspace definitions. If a UAPI header has such conflicting
+- * definitions then the solution is as follows:
+- *
+- * * Synchronize the UAPI header and the libc headers so either one can be
+- *   used and such that the ABI is preserved. If this is not possible then
+- *   no simple compatibility interface exists (you need to write translating
+- *   wrappers and rename things) and you can't use this interface.
+- *
+- * Then follow this process:
+- *
+- * (a) Include libc-compat.h in the UAPI header.
+- *      e.g. #include <linux/libc-compat.h>
+- *     This include must be as early as possible.
+- *
+- * (b) In libc-compat.h add enough code to detect that the comflicting
+- *     userspace libc header has been included first.
+- *
+- * (c) If the userspace libc header has been included first define a set of
+- *     guard macros of the form __UAPI_DEF_FOO and set their values to 1, else
+- *     set their values to 0.
+- *
+- * (d) Back in the UAPI header with the conflicting definitions, guard the
+- *     definitions with:
+- *     #if __UAPI_DEF_FOO
+- *       ...
+- *     #endif
+- *
+- * This fixes the situation where the linux headers are included *after* the
+- * libc headers. To fix the problem with the inclusion in the other order the
+- * userspace libc headers must be fixed like this:
+- *
+- * * For all definitions that conflict with kernel definitions wrap those
+- *   defines in the following:
+- *   #if !__UAPI_DEF_FOO
+- *     ...
+- *   #endif
+- *
+- * This prevents the redefinition of a construct already defined by the kernel.
+- */
+-#ifndef _LIBC_COMPAT_H
+-#define _LIBC_COMPAT_H
+-
+-/* We have included glibc headers... */
+-#if defined(__GLIBC__)
+-
+-/* Coordinate with glibc net/if.h header. */
+-#if defined(_NET_IF_H) && defined(__USE_MISC)
+-
+-/* GLIBC headers included first so don't define anything
+- * that would already be defined. */
+-
+-#define __UAPI_DEF_IF_IFCONF 0
+-#define __UAPI_DEF_IF_IFMAP 0
+-#define __UAPI_DEF_IF_IFNAMSIZ 0
+-#define __UAPI_DEF_IF_IFREQ 0
+-/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */
+-#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 0
+-/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */
+-#ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO
+-#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1
+-#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */
+-
+-#else /* _NET_IF_H */
+-
+-/* Linux headers included first, and we must define everything
+- * we need. The expectation is that glibc will check the
+- * __UAPI_DEF_* defines and adjust appropriately. */
+-
+-#define __UAPI_DEF_IF_IFCONF 1
+-#define __UAPI_DEF_IF_IFMAP 1
+-#define __UAPI_DEF_IF_IFNAMSIZ 1
+-#define __UAPI_DEF_IF_IFREQ 1
+-/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */
+-#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1
+-/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */
+-#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1
+-
+-#endif /* _NET_IF_H */
+-
+-/* Coordinate with glibc netinet/in.h header. */
+-#if defined(_NETINET_IN_H)
+-
+-/* GLIBC headers included first so don't define anything
+- * that would already be defined. */
+-#define __UAPI_DEF_IN_ADDR		0
+-#define __UAPI_DEF_IN_IPPROTO		0
+-#define __UAPI_DEF_IN_PKTINFO		0
+-#define __UAPI_DEF_IP_MREQ		0
+-#define __UAPI_DEF_SOCKADDR_IN		0
+-#define __UAPI_DEF_IN_CLASS		0
+-
+-#define __UAPI_DEF_IN6_ADDR		0
+-/* The exception is the in6_addr macros which must be defined
+- * if the glibc code didn't define them. This guard matches
+- * the guard in glibc/inet/netinet/in.h which defines the
+- * additional in6_addr macros e.g. s6_addr16, and s6_addr32. */
+-#if defined(__USE_MISC) || defined (__USE_GNU)
+-#define __UAPI_DEF_IN6_ADDR_ALT		0
+-#else
+-#define __UAPI_DEF_IN6_ADDR_ALT		1
+-#endif
+-#define __UAPI_DEF_SOCKADDR_IN6		0
+-#define __UAPI_DEF_IPV6_MREQ		0
+-#define __UAPI_DEF_IPPROTO_V6		0
+-#define __UAPI_DEF_IPV6_OPTIONS		0
+-#define __UAPI_DEF_IN6_PKTINFO		0
+-#define __UAPI_DEF_IP6_MTUINFO		0
+-
+-#else
+-
+-/* Linux headers included first, and we must define everything
+- * we need. The expectation is that glibc will check the
+- * __UAPI_DEF_* defines and adjust appropriately. */
+-#define __UAPI_DEF_IN_ADDR		1
+-#define __UAPI_DEF_IN_IPPROTO		1
+-#define __UAPI_DEF_IN_PKTINFO		1
+-#define __UAPI_DEF_IP_MREQ		1
+-#define __UAPI_DEF_SOCKADDR_IN		1
+-#define __UAPI_DEF_IN_CLASS		1
+-
+-#define __UAPI_DEF_IN6_ADDR		1
+-/* We unconditionally define the in6_addr macros and glibc must
+- * coordinate. */
+-#define __UAPI_DEF_IN6_ADDR_ALT		1
+-#define __UAPI_DEF_SOCKADDR_IN6		1
+-#define __UAPI_DEF_IPV6_MREQ		1
+-#define __UAPI_DEF_IPPROTO_V6		1
+-#define __UAPI_DEF_IPV6_OPTIONS		1
+-#define __UAPI_DEF_IN6_PKTINFO		1
+-#define __UAPI_DEF_IP6_MTUINFO		1
+-
+-#endif /* _NETINET_IN_H */
+-
+-/* Coordinate with glibc netipx/ipx.h header. */
+-#if defined(__NETIPX_IPX_H)
+-
+-#define __UAPI_DEF_SOCKADDR_IPX			0
+-#define __UAPI_DEF_IPX_ROUTE_DEFINITION		0
+-#define __UAPI_DEF_IPX_INTERFACE_DEFINITION	0
+-#define __UAPI_DEF_IPX_CONFIG_DATA		0
+-#define __UAPI_DEF_IPX_ROUTE_DEF		0
+-
+-#else /* defined(__NETIPX_IPX_H) */
+-
+-#define __UAPI_DEF_SOCKADDR_IPX			1
+-#define __UAPI_DEF_IPX_ROUTE_DEFINITION		1
+-#define __UAPI_DEF_IPX_INTERFACE_DEFINITION	1
+-#define __UAPI_DEF_IPX_CONFIG_DATA		1
+-#define __UAPI_DEF_IPX_ROUTE_DEF		1
+-
+-#endif /* defined(__NETIPX_IPX_H) */
+-
+-/* Definitions for xattr.h */
+-#if defined(_SYS_XATTR_H)
+-#define __UAPI_DEF_XATTR		0
+-#else
+-#define __UAPI_DEF_XATTR		1
+-#endif
+-
+-/* If we did not see any headers from any supported C libraries,
+- * or we are being included in the kernel, then define everything
+- * that we need. */
+-#else /* !defined(__GLIBC__) */
+-
+-/* Definitions for if.h */
+-#define __UAPI_DEF_IF_IFCONF 1
+-#define __UAPI_DEF_IF_IFMAP 1
+-#define __UAPI_DEF_IF_IFNAMSIZ 1
+-#define __UAPI_DEF_IF_IFREQ 1
+-/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */
+-#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1
+-/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */
+-#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1
+-
+-/* Definitions for in.h */
+-#define __UAPI_DEF_IN_ADDR		1
+-#define __UAPI_DEF_IN_IPPROTO		1
+-#define __UAPI_DEF_IN_PKTINFO		1
+-#define __UAPI_DEF_IP_MREQ		1
+-#define __UAPI_DEF_SOCKADDR_IN		1
+-#define __UAPI_DEF_IN_CLASS		1
+-
+-/* Definitions for in6.h */
+-#define __UAPI_DEF_IN6_ADDR		1
+-#define __UAPI_DEF_IN6_ADDR_ALT		1
+-#define __UAPI_DEF_SOCKADDR_IN6		1
+-#define __UAPI_DEF_IPV6_MREQ		1
+-#define __UAPI_DEF_IPPROTO_V6		1
+-#define __UAPI_DEF_IPV6_OPTIONS		1
+-#define __UAPI_DEF_IN6_PKTINFO		1
+-#define __UAPI_DEF_IP6_MTUINFO		1
+-
+-/* Definitions for ipx.h */
+-#define __UAPI_DEF_SOCKADDR_IPX			1
+-#define __UAPI_DEF_IPX_ROUTE_DEFINITION		1
+-#define __UAPI_DEF_IPX_INTERFACE_DEFINITION	1
+-#define __UAPI_DEF_IPX_CONFIG_DATA		1
+-#define __UAPI_DEF_IPX_ROUTE_DEF		1
+-
+-/* Definitions for xattr.h */
+-#define __UAPI_DEF_XATTR		1
+-
+-#endif /* __GLIBC__ */
+-
+-#endif /* _LIBC_COMPAT_H */
+diff --git a/include/linux/limits.h b/include/linux/limits.h
+deleted file mode 100644
+index 2d0f941..0000000
+--- a/include/linux/limits.h
++++ /dev/null
+@@ -1,20 +0,0 @@
+-#ifndef _LINUX_LIMITS_H
+-#define _LINUX_LIMITS_H
+-
+-#define NR_OPEN	        1024
+-
+-#define NGROUPS_MAX    65536	/* supplemental group IDs are available */
+-#define ARG_MAX       131072	/* # bytes of args + environ for exec() */
+-#define LINK_MAX         127	/* # links a file may have */
+-#define MAX_CANON        255	/* size of the canonical input queue */
+-#define MAX_INPUT        255	/* size of the type-ahead buffer */
+-#define NAME_MAX         255	/* # chars in a file name */
+-#define PATH_MAX        4096	/* # chars in a path name including nul */
+-#define PIPE_BUF        4096	/* # bytes in atomic write to a pipe */
+-#define XATTR_NAME_MAX   255	/* # chars in an extended attribute name */
+-#define XATTR_SIZE_MAX 65536	/* size of an extended attribute value (64k) */
+-#define XATTR_LIST_MAX 65536	/* size of extended attribute namelist (64k) */
+-
+-#define RTSIG_MAX	  32
+-
+-#endif
+diff --git a/include/linux/lwtunnel.h b/include/linux/lwtunnel.h
+deleted file mode 100644
+index 3298426..0000000
+--- a/include/linux/lwtunnel.h
++++ /dev/null
+@@ -1,70 +0,0 @@
+-#ifndef _LWTUNNEL_H_
+-#define _LWTUNNEL_H_
+-
+-#include <linux/types.h>
+-
+-enum lwtunnel_encap_types {
+-	LWTUNNEL_ENCAP_NONE,
+-	LWTUNNEL_ENCAP_MPLS,
+-	LWTUNNEL_ENCAP_IP,
+-	LWTUNNEL_ENCAP_ILA,
+-	LWTUNNEL_ENCAP_IP6,
+-	LWTUNNEL_ENCAP_SEG6,
+-	LWTUNNEL_ENCAP_BPF,
+-	LWTUNNEL_ENCAP_SEG6_LOCAL,
+-	__LWTUNNEL_ENCAP_MAX,
+-};
+-
+-#define LWTUNNEL_ENCAP_MAX (__LWTUNNEL_ENCAP_MAX - 1)
+-
+-enum lwtunnel_ip_t {
+-	LWTUNNEL_IP_UNSPEC,
+-	LWTUNNEL_IP_ID,
+-	LWTUNNEL_IP_DST,
+-	LWTUNNEL_IP_SRC,
+-	LWTUNNEL_IP_TTL,
+-	LWTUNNEL_IP_TOS,
+-	LWTUNNEL_IP_FLAGS,
+-	LWTUNNEL_IP_PAD,
+-	__LWTUNNEL_IP_MAX,
+-};
+-
+-#define LWTUNNEL_IP_MAX (__LWTUNNEL_IP_MAX - 1)
+-
+-enum lwtunnel_ip6_t {
+-	LWTUNNEL_IP6_UNSPEC,
+-	LWTUNNEL_IP6_ID,
+-	LWTUNNEL_IP6_DST,
+-	LWTUNNEL_IP6_SRC,
+-	LWTUNNEL_IP6_HOPLIMIT,
+-	LWTUNNEL_IP6_TC,
+-	LWTUNNEL_IP6_FLAGS,
+-	LWTUNNEL_IP6_PAD,
+-	__LWTUNNEL_IP6_MAX,
+-};
+-
+-#define LWTUNNEL_IP6_MAX (__LWTUNNEL_IP6_MAX - 1)
+-
+-enum {
+-	LWT_BPF_PROG_UNSPEC,
+-	LWT_BPF_PROG_FD,
+-	LWT_BPF_PROG_NAME,
+-	__LWT_BPF_PROG_MAX,
+-};
+-
+-#define LWT_BPF_PROG_MAX (__LWT_BPF_PROG_MAX - 1)
+-
+-enum {
+-	LWT_BPF_UNSPEC,
+-	LWT_BPF_IN,
+-	LWT_BPF_OUT,
+-	LWT_BPF_XMIT,
+-	LWT_BPF_XMIT_HEADROOM,
+-	__LWT_BPF_MAX,
+-};
+-
+-#define LWT_BPF_MAX (__LWT_BPF_MAX - 1)
+-
+-#define LWT_BPF_MAX_HEADROOM 256
+-
+-#endif /* _LWTUNNEL_H_ */
+diff --git a/include/linux/magic.h b/include/linux/magic.h
+deleted file mode 100644
+index e439565..0000000
+--- a/include/linux/magic.h
++++ /dev/null
+@@ -1,91 +0,0 @@
+-#ifndef __LINUX_MAGIC_H__
+-#define __LINUX_MAGIC_H__
+-
+-#define ADFS_SUPER_MAGIC	0xadf5
+-#define AFFS_SUPER_MAGIC	0xadff
+-#define AFS_SUPER_MAGIC                0x5346414F
+-#define AUTOFS_SUPER_MAGIC	0x0187
+-#define CODA_SUPER_MAGIC	0x73757245
+-#define CRAMFS_MAGIC		0x28cd3d45	/* some random number */
+-#define CRAMFS_MAGIC_WEND	0x453dcd28	/* magic number with the wrong endianess */
+-#define DEBUGFS_MAGIC          0x64626720
+-#define SECURITYFS_MAGIC	0x73636673
+-#define SELINUX_MAGIC		0xf97cff8c
+-#define SMACK_MAGIC		0x43415d53	/* "SMAC" */
+-#define RAMFS_MAGIC		0x858458f6	/* some random number */
+-#define TMPFS_MAGIC		0x01021994
+-#define HUGETLBFS_MAGIC 	0x958458f6	/* some random number */
+-#define SQUASHFS_MAGIC		0x73717368
+-#define ECRYPTFS_SUPER_MAGIC	0xf15f
+-#define EFS_SUPER_MAGIC		0x414A53
+-#define EXT2_SUPER_MAGIC	0xEF53
+-#define EXT3_SUPER_MAGIC	0xEF53
+-#define XENFS_SUPER_MAGIC	0xabba1974
+-#define EXT4_SUPER_MAGIC	0xEF53
+-#define BTRFS_SUPER_MAGIC	0x9123683E
+-#define NILFS_SUPER_MAGIC	0x3434
+-#define F2FS_SUPER_MAGIC	0xF2F52010
+-#define HPFS_SUPER_MAGIC	0xf995e849
+-#define ISOFS_SUPER_MAGIC	0x9660
+-#define JFFS2_SUPER_MAGIC	0x72b6
+-#define PSTOREFS_MAGIC		0x6165676C
+-#define EFIVARFS_MAGIC		0xde5e81e4
+-#define HOSTFS_SUPER_MAGIC	0x00c0ffee
+-#define OVERLAYFS_SUPER_MAGIC	0x794c7630
+-
+-#define MINIX_SUPER_MAGIC	0x137F		/* minix v1 fs, 14 char names */
+-#define MINIX_SUPER_MAGIC2	0x138F		/* minix v1 fs, 30 char names */
+-#define MINIX2_SUPER_MAGIC	0x2468		/* minix v2 fs, 14 char names */
+-#define MINIX2_SUPER_MAGIC2	0x2478		/* minix v2 fs, 30 char names */
+-#define MINIX3_SUPER_MAGIC	0x4d5a		/* minix v3 fs, 60 char names */
+-
+-#define MSDOS_SUPER_MAGIC	0x4d44		/* MD */
+-#define NCP_SUPER_MAGIC		0x564c		/* Guess, what 0x564c is :-) */
+-#define NFS_SUPER_MAGIC		0x6969
+-#define OCFS2_SUPER_MAGIC	0x7461636f
+-#define OPENPROM_SUPER_MAGIC	0x9fa1
+-#define QNX4_SUPER_MAGIC	0x002f		/* qnx4 fs detection */
+-#define QNX6_SUPER_MAGIC	0x68191122	/* qnx6 fs detection */
+-
+-#define REISERFS_SUPER_MAGIC	0x52654973	/* used by gcc */
+-					/* used by file system utilities that
+-	                                   look at the superblock, etc.  */
+-#define REISERFS_SUPER_MAGIC_STRING	"ReIsErFs"
+-#define REISER2FS_SUPER_MAGIC_STRING	"ReIsEr2Fs"
+-#define REISER2FS_JR_SUPER_MAGIC_STRING	"ReIsEr3Fs"
+-
+-#define SMB_SUPER_MAGIC		0x517B
+-#define CGROUP_SUPER_MAGIC	0x27e0eb
+-#define CGROUP2_SUPER_MAGIC	0x63677270
+-
+-#define RDTGROUP_SUPER_MAGIC	0x7655821
+-
+-#define STACK_END_MAGIC		0x57AC6E9D
+-
+-#define TRACEFS_MAGIC          0x74726163
+-
+-#define V9FS_MAGIC		0x01021997
+-
+-#define BDEVFS_MAGIC            0x62646576
+-#define DAXFS_MAGIC             0x64646178
+-#define BINFMTFS_MAGIC          0x42494e4d
+-#define DEVPTS_SUPER_MAGIC	0x1cd1
+-#define FUTEXFS_SUPER_MAGIC	0xBAD1DEA
+-#define PIPEFS_MAGIC            0x50495045
+-#define PROC_SUPER_MAGIC	0x9fa0
+-#define SOCKFS_MAGIC		0x534F434B
+-#define SYSFS_MAGIC		0x62656572
+-#define USBDEVICE_SUPER_MAGIC	0x9fa2
+-#define MTD_INODE_FS_MAGIC      0x11307854
+-#define ANON_INODE_FS_MAGIC	0x09041934
+-#define BTRFS_TEST_MAGIC	0x73727279
+-#define NSFS_MAGIC		0x6e736673
+-#define BPF_FS_MAGIC		0xcafe4a11
+-#define AAFS_MAGIC		0x5a3c69f0
+-
+-/* Since UDF 2.01 is ISO 13346 based... */
+-#define UDF_SUPER_MAGIC		0x15013346
+-#define BALLOON_KVM_MAGIC	0x13661366
+-#define ZSMALLOC_MAGIC		0x58295829
+-
+-#endif /* __LINUX_MAGIC_H__ */
+diff --git a/include/linux/mpls.h b/include/linux/mpls.h
+deleted file mode 100644
+index bf5b625..0000000
+--- a/include/linux/mpls.h
++++ /dev/null
+@@ -1,76 +0,0 @@
+-#ifndef _MPLS_H
+-#define _MPLS_H
+-
+-#include <linux/types.h>
+-#include <asm/byteorder.h>
+-
+-/* Reference: RFC 5462, RFC 3032
+- *
+- *  0                   1                   2                   3
+- *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+- * |                Label                  | TC  |S|       TTL     |
+- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+- *
+- *	Label:  Label Value, 20 bits
+- *	TC:     Traffic Class field, 3 bits
+- *	S:      Bottom of Stack, 1 bit
+- *	TTL:    Time to Live, 8 bits
+- */
+-
+-struct mpls_label {
+-	__be32 entry;
+-};
+-
+-#define MPLS_LS_LABEL_MASK      0xFFFFF000
+-#define MPLS_LS_LABEL_SHIFT     12
+-#define MPLS_LS_TC_MASK         0x00000E00
+-#define MPLS_LS_TC_SHIFT        9
+-#define MPLS_LS_S_MASK          0x00000100
+-#define MPLS_LS_S_SHIFT         8
+-#define MPLS_LS_TTL_MASK        0x000000FF
+-#define MPLS_LS_TTL_SHIFT       0
+-
+-/* Reserved labels */
+-#define MPLS_LABEL_IPV4NULL		0 /* RFC3032 */
+-#define MPLS_LABEL_RTALERT		1 /* RFC3032 */
+-#define MPLS_LABEL_IPV6NULL		2 /* RFC3032 */
+-#define MPLS_LABEL_IMPLNULL		3 /* RFC3032 */
+-#define MPLS_LABEL_ENTROPY		7 /* RFC6790 */
+-#define MPLS_LABEL_GAL			13 /* RFC5586 */
+-#define MPLS_LABEL_OAMALERT		14 /* RFC3429 */
+-#define MPLS_LABEL_EXTENSION		15 /* RFC7274 */
+-
+-#define MPLS_LABEL_FIRST_UNRESERVED	16 /* RFC3032 */
+-
+-/* These are embedded into IFLA_STATS_AF_SPEC:
+- * [IFLA_STATS_AF_SPEC]
+- * -> [AF_MPLS]
+- *    -> [MPLS_STATS_xxx]
+- *
+- * Attributes:
+- * [MPLS_STATS_LINK] = {
+- *     struct mpls_link_stats
+- * }
+- */
+-enum {
+-	MPLS_STATS_UNSPEC, /* also used as 64bit pad attribute */
+-	MPLS_STATS_LINK,
+-	__MPLS_STATS_MAX,
+-};
+-
+-#define MPLS_STATS_MAX (__MPLS_STATS_MAX - 1)
+-
+-struct mpls_link_stats {
+-	__u64	rx_packets;		/* total packets received	*/
+-	__u64	tx_packets;		/* total packets transmitted	*/
+-	__u64	rx_bytes;		/* total bytes received		*/
+-	__u64	tx_bytes;		/* total bytes transmitted	*/
+-	__u64	rx_errors;		/* bad packets received		*/
+-	__u64	tx_errors;		/* packet transmit problems	*/
+-	__u64	rx_dropped;		/* packet dropped on receive	*/
+-	__u64	tx_dropped;		/* packet dropped on transmit	*/
+-	__u64	rx_noroute;		/* no route for packet dest	*/
+-};
+-
+-#endif /* _MPLS_H */
+diff --git a/include/linux/mpls_iptunnel.h b/include/linux/mpls_iptunnel.h
+deleted file mode 100644
+index 1a0e57b..0000000
+--- a/include/linux/mpls_iptunnel.h
++++ /dev/null
+@@ -1,30 +0,0 @@
+-/*
+- *	mpls tunnel api
+- *
+- *	Authors:
+- *		Roopa Prabhu <roopa@cumulusnetworks.com>
+- *
+- *	This program is free software; you can redistribute it and/or
+- *	modify it under the terms of the GNU General Public License
+- *	as published by the Free Software Foundation; either version
+- *	2 of the License, or (at your option) any later version.
+- */
+-
+-#ifndef _LINUX_MPLS_IPTUNNEL_H
+-#define _LINUX_MPLS_IPTUNNEL_H
+-
+-/* MPLS tunnel attributes
+- * [RTA_ENCAP] = {
+- *     [MPLS_IPTUNNEL_DST]
+- *     [MPLS_IPTUNNEL_TTL]
+- * }
+- */
+-enum {
+-	MPLS_IPTUNNEL_UNSPEC,
+-	MPLS_IPTUNNEL_DST,
+-	MPLS_IPTUNNEL_TTL,
+-	__MPLS_IPTUNNEL_MAX,
+-};
+-#define MPLS_IPTUNNEL_MAX (__MPLS_IPTUNNEL_MAX - 1)
+-
+-#endif /* _LINUX_MPLS_IPTUNNEL_H */
+diff --git a/include/linux/neighbour.h b/include/linux/neighbour.h
+deleted file mode 100644
+index 3199d28..0000000
+--- a/include/linux/neighbour.h
++++ /dev/null
+@@ -1,171 +0,0 @@
+-#ifndef __LINUX_NEIGHBOUR_H
+-#define __LINUX_NEIGHBOUR_H
+-
+-#include <linux/types.h>
+-#include <linux/netlink.h>
+-
+-struct ndmsg {
+-	__u8		ndm_family;
+-	__u8		ndm_pad1;
+-	__u16		ndm_pad2;
+-	__s32		ndm_ifindex;
+-	__u16		ndm_state;
+-	__u8		ndm_flags;
+-	__u8		ndm_type;
+-};
+-
+-enum {
+-	NDA_UNSPEC,
+-	NDA_DST,
+-	NDA_LLADDR,
+-	NDA_CACHEINFO,
+-	NDA_PROBES,
+-	NDA_VLAN,
+-	NDA_PORT,
+-	NDA_VNI,
+-	NDA_IFINDEX,
+-	NDA_MASTER,
+-	NDA_LINK_NETNSID,
+-	NDA_SRC_VNI,
+-	__NDA_MAX
+-};
+-
+-#define NDA_MAX (__NDA_MAX - 1)
+-
+-/*
+- *	Neighbor Cache Entry Flags
+- */
+-
+-#define NTF_USE		0x01
+-#define NTF_SELF	0x02
+-#define NTF_MASTER	0x04
+-#define NTF_PROXY	0x08	/* == ATF_PUBL */
+-#define NTF_EXT_LEARNED	0x10
+-#define NTF_OFFLOADED   0x20
+-#define NTF_ROUTER	0x80
+-
+-/*
+- *	Neighbor Cache Entry States.
+- */
+-
+-#define NUD_INCOMPLETE	0x01
+-#define NUD_REACHABLE	0x02
+-#define NUD_STALE	0x04
+-#define NUD_DELAY	0x08
+-#define NUD_PROBE	0x10
+-#define NUD_FAILED	0x20
+-
+-/* Dummy states */
+-#define NUD_NOARP	0x40
+-#define NUD_PERMANENT	0x80
+-#define NUD_NONE	0x00
+-
+-/* NUD_NOARP & NUD_PERMANENT are pseudostates, they never change
+-   and make no address resolution or NUD.
+-   NUD_PERMANENT also cannot be deleted by garbage collectors.
+- */
+-
+-struct nda_cacheinfo {
+-	__u32		ndm_confirmed;
+-	__u32		ndm_used;
+-	__u32		ndm_updated;
+-	__u32		ndm_refcnt;
+-};
+-
+-/*****************************************************************
+- *		Neighbour tables specific messages.
+- *
+- * To retrieve the neighbour tables send RTM_GETNEIGHTBL with the
+- * NLM_F_DUMP flag set. Every neighbour table configuration is
+- * spread over multiple messages to avoid running into message
+- * size limits on systems with many interfaces. The first message
+- * in the sequence transports all not device specific data such as
+- * statistics, configuration, and the default parameter set.
+- * This message is followed by 0..n messages carrying device
+- * specific parameter sets.
+- * Although the ordering should be sufficient, NDTA_NAME can be
+- * used to identify sequences. The initial message can be identified
+- * by checking for NDTA_CONFIG. The device specific messages do
+- * not contain this TLV but have NDTPA_IFINDEX set to the
+- * corresponding interface index.
+- *
+- * To change neighbour table attributes, send RTM_SETNEIGHTBL
+- * with NDTA_NAME set. Changeable attribute include NDTA_THRESH[1-3],
+- * NDTA_GC_INTERVAL, and all TLVs in NDTA_PARMS unless marked
+- * otherwise. Device specific parameter sets can be changed by
+- * setting NDTPA_IFINDEX to the interface index of the corresponding
+- * device.
+- ****/
+-
+-struct ndt_stats {
+-	__u64		ndts_allocs;
+-	__u64		ndts_destroys;
+-	__u64		ndts_hash_grows;
+-	__u64		ndts_res_failed;
+-	__u64		ndts_lookups;
+-	__u64		ndts_hits;
+-	__u64		ndts_rcv_probes_mcast;
+-	__u64		ndts_rcv_probes_ucast;
+-	__u64		ndts_periodic_gc_runs;
+-	__u64		ndts_forced_gc_runs;
+-	__u64		ndts_table_fulls;
+-};
+-
+-enum {
+-	NDTPA_UNSPEC,
+-	NDTPA_IFINDEX,			/* u32, unchangeable */
+-	NDTPA_REFCNT,			/* u32, read-only */
+-	NDTPA_REACHABLE_TIME,		/* u64, read-only, msecs */
+-	NDTPA_BASE_REACHABLE_TIME,	/* u64, msecs */
+-	NDTPA_RETRANS_TIME,		/* u64, msecs */
+-	NDTPA_GC_STALETIME,		/* u64, msecs */
+-	NDTPA_DELAY_PROBE_TIME,		/* u64, msecs */
+-	NDTPA_QUEUE_LEN,		/* u32 */
+-	NDTPA_APP_PROBES,		/* u32 */
+-	NDTPA_UCAST_PROBES,		/* u32 */
+-	NDTPA_MCAST_PROBES,		/* u32 */
+-	NDTPA_ANYCAST_DELAY,		/* u64, msecs */
+-	NDTPA_PROXY_DELAY,		/* u64, msecs */
+-	NDTPA_PROXY_QLEN,		/* u32 */
+-	NDTPA_LOCKTIME,			/* u64, msecs */
+-	NDTPA_QUEUE_LENBYTES,		/* u32 */
+-	NDTPA_MCAST_REPROBES,		/* u32 */
+-	NDTPA_PAD,
+-	__NDTPA_MAX
+-};
+-#define NDTPA_MAX (__NDTPA_MAX - 1)
+-
+-struct ndtmsg {
+-	__u8		ndtm_family;
+-	__u8		ndtm_pad1;
+-	__u16		ndtm_pad2;
+-};
+-
+-struct ndt_config {
+-	__u16		ndtc_key_len;
+-	__u16		ndtc_entry_size;
+-	__u32		ndtc_entries;
+-	__u32		ndtc_last_flush;	/* delta to now in msecs */
+-	__u32		ndtc_last_rand;		/* delta to now in msecs */
+-	__u32		ndtc_hash_rnd;
+-	__u32		ndtc_hash_mask;
+-	__u32		ndtc_hash_chain_gc;
+-	__u32		ndtc_proxy_qlen;
+-};
+-
+-enum {
+-	NDTA_UNSPEC,
+-	NDTA_NAME,			/* char *, unchangeable */
+-	NDTA_THRESH1,			/* u32 */
+-	NDTA_THRESH2,			/* u32 */
+-	NDTA_THRESH3,			/* u32 */
+-	NDTA_CONFIG,			/* struct ndt_config, read-only */
+-	NDTA_PARMS,			/* nested TLV NDTPA_* */
+-	NDTA_STATS,			/* struct ndt_stats, read-only */
+-	NDTA_GC_INTERVAL,		/* u64, msecs */
+-	NDTA_PAD,
+-	__NDTA_MAX
+-};
+-#define NDTA_MAX (__NDTA_MAX - 1)
+-
+-#endif
+diff --git a/include/linux/net_namespace.h b/include/linux/net_namespace.h
+deleted file mode 100644
+index 9a92b7e..0000000
+--- a/include/linux/net_namespace.h
++++ /dev/null
+@@ -1,23 +0,0 @@
+-/* Copyright (c) 2015 6WIND S.A.
+- * Author: Nicolas Dichtel <nicolas.dichtel@6wind.com>
+- *
+- * This program is free software; you can redistribute it and/or modify it
+- * under the terms and conditions of the GNU General Public License,
+- * version 2, as published by the Free Software Foundation.
+- */
+-#ifndef _LINUX_NET_NAMESPACE_H_
+-#define _LINUX_NET_NAMESPACE_H_
+-
+-/* Attributes of RTM_NEWNSID/RTM_GETNSID messages */
+-enum {
+-	NETNSA_NONE,
+-#define NETNSA_NSID_NOT_ASSIGNED -1
+-	NETNSA_NSID,
+-	NETNSA_PID,
+-	NETNSA_FD,
+-	__NETNSA_MAX,
+-};
+-
+-#define NETNSA_MAX		(__NETNSA_MAX - 1)
+-
+-#endif /* _LINUX_NET_NAMESPACE_H_ */
+diff --git a/include/linux/netconf.h b/include/linux/netconf.h
+deleted file mode 100644
+index 4afbd7d..0000000
+--- a/include/linux/netconf.h
++++ /dev/null
+@@ -1,28 +0,0 @@
+-#ifndef _LINUX_NETCONF_H_
+-#define _LINUX_NETCONF_H_
+-
+-#include <linux/types.h>
+-#include <linux/netlink.h>
+-
+-struct netconfmsg {
+-	__u8	ncm_family;
+-};
+-
+-enum {
+-	NETCONFA_UNSPEC,
+-	NETCONFA_IFINDEX,
+-	NETCONFA_FORWARDING,
+-	NETCONFA_RP_FILTER,
+-	NETCONFA_MC_FORWARDING,
+-	NETCONFA_PROXY_NEIGH,
+-	NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN,
+-	NETCONFA_INPUT,
+-	__NETCONFA_MAX
+-};
+-#define NETCONFA_MAX	(__NETCONFA_MAX - 1)
+-#define NETCONFA_ALL	-1
+-
+-#define NETCONFA_IFINDEX_ALL		-1
+-#define NETCONFA_IFINDEX_DEFAULT	-2
+-
+-#endif /* _LINUX_NETCONF_H_ */
+diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
+deleted file mode 100644
+index 66fceb4..0000000
+--- a/include/linux/netdevice.h
++++ /dev/null
+@@ -1,65 +0,0 @@
+-/*
+- * INET		An implementation of the TCP/IP protocol suite for the LINUX
+- *		operating system.  INET is implemented using the  BSD Socket
+- *		interface as the means of communication with the user level.
+- *
+- *		Definitions for the Interfaces handler.
+- *
+- * Version:	@(#)dev.h	1.0.10	08/12/93
+- *
+- * Authors:	Ross Biro
+- *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
+- *		Corey Minyard <wf-rch!minyard@relay.EU.net>
+- *		Donald J. Becker, <becker@cesdis.gsfc.nasa.gov>
+- *		Alan Cox, <alan@lxorguk.ukuu.org.uk>
+- *		Bjorn Ekwall. <bj0rn@blox.se>
+- *              Pekka Riikonen <priikone@poseidon.pspt.fi>
+- *
+- *		This program is free software; you can redistribute it and/or
+- *		modify it under the terms of the GNU General Public License
+- *		as published by the Free Software Foundation; either version
+- *		2 of the License, or (at your option) any later version.
+- *
+- *		Moved to /usr/include/linux for NET3
+- */
+-#ifndef _LINUX_NETDEVICE_H
+-#define _LINUX_NETDEVICE_H
+-
+-#include <linux/if.h>
+-#include <linux/if_ether.h>
+-#include <linux/if_packet.h>
+-#include <linux/if_link.h>
+-
+-
+-#define MAX_ADDR_LEN	32		/* Largest hardware address length */
+-
+-/* Initial net device group. All devices belong to group 0 by default. */
+-#define INIT_NETDEV_GROUP	0
+-
+-
+-/* interface name assignment types (sysfs name_assign_type attribute) */
+-#define NET_NAME_UNKNOWN	0	/* unknown origin (not exposed to userspace) */
+-#define NET_NAME_ENUM		1	/* enumerated by kernel */
+-#define NET_NAME_PREDICTABLE	2	/* predictably named by the kernel */
+-#define NET_NAME_USER		3	/* provided by user-space */
+-#define NET_NAME_RENAMED	4	/* renamed by user-space */
+-
+-/* Media selection options. */
+-enum {
+-        IF_PORT_UNKNOWN = 0,
+-        IF_PORT_10BASE2,
+-        IF_PORT_10BASET,
+-        IF_PORT_AUI,
+-        IF_PORT_100BASET,
+-        IF_PORT_100BASETX,
+-        IF_PORT_100BASEFX
+-};
+-
+-/* hardware address assignment types */
+-#define NET_ADDR_PERM		0	/* address is permanent (default) */
+-#define NET_ADDR_RANDOM		1	/* address is generated randomly */
+-#define NET_ADDR_STOLEN		2	/* address is stolen from other device */
+-#define NET_ADDR_SET		3	/* address is set using
+-					 * dev_set_mac_address() */
+-
+-#endif /* _LINUX_NETDEVICE_H */
+diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h
+deleted file mode 100644
+index ff4a4a5..0000000
+--- a/include/linux/netfilter.h
++++ /dev/null
+@@ -1,77 +0,0 @@
+-#ifndef __LINUX_NETFILTER_H
+-#define __LINUX_NETFILTER_H
+-
+-#include <linux/types.h>
+-
+-#include <linux/in.h>
+-#include <linux/in6.h>
+-
+-/* Responses from hook functions. */
+-#define NF_DROP 0
+-#define NF_ACCEPT 1
+-#define NF_STOLEN 2
+-#define NF_QUEUE 3
+-#define NF_REPEAT 4
+-#define NF_STOP 5	/* Deprecated, for userspace nf_queue compatibility. */
+-#define NF_MAX_VERDICT NF_STOP
+-
+-/* we overload the higher bits for encoding auxiliary data such as the queue
+- * number or errno values. Not nice, but better than additional function
+- * arguments. */
+-#define NF_VERDICT_MASK 0x000000ff
+-
+-/* extra verdict flags have mask 0x0000ff00 */
+-#define NF_VERDICT_FLAG_QUEUE_BYPASS	0x00008000
+-
+-/* queue number (NF_QUEUE) or errno (NF_DROP) */
+-#define NF_VERDICT_QMASK 0xffff0000
+-#define NF_VERDICT_QBITS 16
+-
+-#define NF_QUEUE_NR(x) ((((x) << 16) & NF_VERDICT_QMASK) | NF_QUEUE)
+-
+-#define NF_DROP_ERR(x) (((-x) << 16) | NF_DROP)
+-
+-/* only for userspace compatibility */
+-/* Generic cache responses from hook functions.
+-   <= 0x2000 is used for protocol-flags. */
+-#define NFC_UNKNOWN 0x4000
+-#define NFC_ALTERED 0x8000
+-
+-/* NF_VERDICT_BITS should be 8 now, but userspace might break if this changes */
+-#define NF_VERDICT_BITS 16
+-
+-enum nf_inet_hooks {
+-	NF_INET_PRE_ROUTING,
+-	NF_INET_LOCAL_IN,
+-	NF_INET_FORWARD,
+-	NF_INET_LOCAL_OUT,
+-	NF_INET_POST_ROUTING,
+-	NF_INET_NUMHOOKS
+-};
+-
+-enum nf_dev_hooks {
+-	NF_NETDEV_INGRESS,
+-	NF_NETDEV_NUMHOOKS
+-};
+-
+-enum {
+-	NFPROTO_UNSPEC =  0,
+-	NFPROTO_INET   =  1,
+-	NFPROTO_IPV4   =  2,
+-	NFPROTO_ARP    =  3,
+-	NFPROTO_NETDEV =  5,
+-	NFPROTO_BRIDGE =  7,
+-	NFPROTO_IPV6   = 10,
+-	NFPROTO_DECNET = 12,
+-	NFPROTO_NUMPROTO,
+-};
+-
+-union nf_inet_addr {
+-	__u32		all[4];
+-	__be32		ip;
+-	__be32		ip6[4];
+-	struct in_addr	in;
+-	struct in6_addr	in6;
+-};
+-
+-#endif /* __LINUX_NETFILTER_H */
+diff --git a/include/linux/netfilter/ipset/ip_set.h b/include/linux/netfilter/ipset/ip_set.h
+deleted file mode 100644
+index a6c96b0..0000000
+--- a/include/linux/netfilter/ipset/ip_set.h
++++ /dev/null
+@@ -1,304 +0,0 @@
+-/* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu>
+- *                         Patrick Schaaf <bof@bof.de>
+- *                         Martin Josefsson <gandalf@wlug.westbo.se>
+- * Copyright (C) 2003-2011 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License version 2 as
+- * published by the Free Software Foundation.
+- */
+-#ifndef _IP_SET_H
+-#define _IP_SET_H
+-
+-#include <linux/types.h>
+-
+-/* The protocol version */
+-#define IPSET_PROTOCOL		6
+-
+-/* The max length of strings including NUL: set and type identifiers */
+-#define IPSET_MAXNAMELEN	32
+-
+-/* The maximum permissible comment length we will accept over netlink */
+-#define IPSET_MAX_COMMENT_SIZE	255
+-
+-/* Message types and commands */
+-enum ipset_cmd {
+-	IPSET_CMD_NONE,
+-	IPSET_CMD_PROTOCOL,	/* 1: Return protocol version */
+-	IPSET_CMD_CREATE,	/* 2: Create a new (empty) set */
+-	IPSET_CMD_DESTROY,	/* 3: Destroy a (empty) set */
+-	IPSET_CMD_FLUSH,	/* 4: Remove all elements from a set */
+-	IPSET_CMD_RENAME,	/* 5: Rename a set */
+-	IPSET_CMD_SWAP,		/* 6: Swap two sets */
+-	IPSET_CMD_LIST,		/* 7: List sets */
+-	IPSET_CMD_SAVE,		/* 8: Save sets */
+-	IPSET_CMD_ADD,		/* 9: Add an element to a set */
+-	IPSET_CMD_DEL,		/* 10: Delete an element from a set */
+-	IPSET_CMD_TEST,		/* 11: Test an element in a set */
+-	IPSET_CMD_HEADER,	/* 12: Get set header data only */
+-	IPSET_CMD_TYPE,		/* 13: Get set type */
+-	IPSET_MSG_MAX,		/* Netlink message commands */
+-
+-	/* Commands in userspace: */
+-	IPSET_CMD_RESTORE = IPSET_MSG_MAX, /* 14: Enter restore mode */
+-	IPSET_CMD_HELP,		/* 15: Get help */
+-	IPSET_CMD_VERSION,	/* 16: Get program version */
+-	IPSET_CMD_QUIT,		/* 17: Quit from interactive mode */
+-
+-	IPSET_CMD_MAX,
+-
+-	IPSET_CMD_COMMIT = IPSET_CMD_MAX, /* 18: Commit buffered commands */
+-};
+-
+-/* Attributes at command level */
+-enum {
+-	IPSET_ATTR_UNSPEC,
+-	IPSET_ATTR_PROTOCOL,	/* 1: Protocol version */
+-	IPSET_ATTR_SETNAME,	/* 2: Name of the set */
+-	IPSET_ATTR_TYPENAME,	/* 3: Typename */
+-	IPSET_ATTR_SETNAME2 = IPSET_ATTR_TYPENAME, /* Setname at rename/swap */
+-	IPSET_ATTR_REVISION,	/* 4: Settype revision */
+-	IPSET_ATTR_FAMILY,	/* 5: Settype family */
+-	IPSET_ATTR_FLAGS,	/* 6: Flags at command level */
+-	IPSET_ATTR_DATA,	/* 7: Nested attributes */
+-	IPSET_ATTR_ADT,		/* 8: Multiple data containers */
+-	IPSET_ATTR_LINENO,	/* 9: Restore lineno */
+-	IPSET_ATTR_PROTOCOL_MIN, /* 10: Minimal supported version number */
+-	IPSET_ATTR_REVISION_MIN	= IPSET_ATTR_PROTOCOL_MIN, /* type rev min */
+-	__IPSET_ATTR_CMD_MAX,
+-};
+-#define IPSET_ATTR_CMD_MAX	(__IPSET_ATTR_CMD_MAX - 1)
+-
+-/* CADT specific attributes */
+-enum {
+-	IPSET_ATTR_IP = IPSET_ATTR_UNSPEC + 1,
+-	IPSET_ATTR_IP_FROM = IPSET_ATTR_IP,
+-	IPSET_ATTR_IP_TO,	/* 2 */
+-	IPSET_ATTR_CIDR,	/* 3 */
+-	IPSET_ATTR_PORT,	/* 4 */
+-	IPSET_ATTR_PORT_FROM = IPSET_ATTR_PORT,
+-	IPSET_ATTR_PORT_TO,	/* 5 */
+-	IPSET_ATTR_TIMEOUT,	/* 6 */
+-	IPSET_ATTR_PROTO,	/* 7 */
+-	IPSET_ATTR_CADT_FLAGS,	/* 8 */
+-	IPSET_ATTR_CADT_LINENO = IPSET_ATTR_LINENO,	/* 9 */
+-	IPSET_ATTR_MARK,	/* 10 */
+-	IPSET_ATTR_MARKMASK,	/* 11 */
+-	/* Reserve empty slots */
+-	IPSET_ATTR_CADT_MAX = 16,
+-	/* Create-only specific attributes */
+-	IPSET_ATTR_GC,
+-	IPSET_ATTR_HASHSIZE,
+-	IPSET_ATTR_MAXELEM,
+-	IPSET_ATTR_NETMASK,
+-	IPSET_ATTR_PROBES,
+-	IPSET_ATTR_RESIZE,
+-	IPSET_ATTR_SIZE,
+-	/* Kernel-only */
+-	IPSET_ATTR_ELEMENTS,
+-	IPSET_ATTR_REFERENCES,
+-	IPSET_ATTR_MEMSIZE,
+-
+-	__IPSET_ATTR_CREATE_MAX,
+-};
+-#define IPSET_ATTR_CREATE_MAX	(__IPSET_ATTR_CREATE_MAX - 1)
+-
+-/* ADT specific attributes */
+-enum {
+-	IPSET_ATTR_ETHER = IPSET_ATTR_CADT_MAX + 1,
+-	IPSET_ATTR_NAME,
+-	IPSET_ATTR_NAMEREF,
+-	IPSET_ATTR_IP2,
+-	IPSET_ATTR_CIDR2,
+-	IPSET_ATTR_IP2_TO,
+-	IPSET_ATTR_IFACE,
+-	IPSET_ATTR_BYTES,
+-	IPSET_ATTR_PACKETS,
+-	IPSET_ATTR_COMMENT,
+-	IPSET_ATTR_SKBMARK,
+-	IPSET_ATTR_SKBPRIO,
+-	IPSET_ATTR_SKBQUEUE,
+-	IPSET_ATTR_PAD,
+-	__IPSET_ATTR_ADT_MAX,
+-};
+-#define IPSET_ATTR_ADT_MAX	(__IPSET_ATTR_ADT_MAX - 1)
+-
+-/* IP specific attributes */
+-enum {
+-	IPSET_ATTR_IPADDR_IPV4 = IPSET_ATTR_UNSPEC + 1,
+-	IPSET_ATTR_IPADDR_IPV6,
+-	__IPSET_ATTR_IPADDR_MAX,
+-};
+-#define IPSET_ATTR_IPADDR_MAX	(__IPSET_ATTR_IPADDR_MAX - 1)
+-
+-/* Error codes */
+-enum ipset_errno {
+-	IPSET_ERR_PRIVATE = 4096,
+-	IPSET_ERR_PROTOCOL,
+-	IPSET_ERR_FIND_TYPE,
+-	IPSET_ERR_MAX_SETS,
+-	IPSET_ERR_BUSY,
+-	IPSET_ERR_EXIST_SETNAME2,
+-	IPSET_ERR_TYPE_MISMATCH,
+-	IPSET_ERR_EXIST,
+-	IPSET_ERR_INVALID_CIDR,
+-	IPSET_ERR_INVALID_NETMASK,
+-	IPSET_ERR_INVALID_FAMILY,
+-	IPSET_ERR_TIMEOUT,
+-	IPSET_ERR_REFERENCED,
+-	IPSET_ERR_IPADDR_IPV4,
+-	IPSET_ERR_IPADDR_IPV6,
+-	IPSET_ERR_COUNTER,
+-	IPSET_ERR_COMMENT,
+-	IPSET_ERR_INVALID_MARKMASK,
+-	IPSET_ERR_SKBINFO,
+-
+-	/* Type specific error codes */
+-	IPSET_ERR_TYPE_SPECIFIC = 4352,
+-};
+-
+-/* Flags at command level or match/target flags, lower half of cmdattrs*/
+-enum ipset_cmd_flags {
+-	IPSET_FLAG_BIT_EXIST	= 0,
+-	IPSET_FLAG_EXIST	= (1 << IPSET_FLAG_BIT_EXIST),
+-	IPSET_FLAG_BIT_LIST_SETNAME = 1,
+-	IPSET_FLAG_LIST_SETNAME	= (1 << IPSET_FLAG_BIT_LIST_SETNAME),
+-	IPSET_FLAG_BIT_LIST_HEADER = 2,
+-	IPSET_FLAG_LIST_HEADER	= (1 << IPSET_FLAG_BIT_LIST_HEADER),
+-	IPSET_FLAG_BIT_SKIP_COUNTER_UPDATE = 3,
+-	IPSET_FLAG_SKIP_COUNTER_UPDATE =
+-		(1 << IPSET_FLAG_BIT_SKIP_COUNTER_UPDATE),
+-	IPSET_FLAG_BIT_SKIP_SUBCOUNTER_UPDATE = 4,
+-	IPSET_FLAG_SKIP_SUBCOUNTER_UPDATE =
+-		(1 << IPSET_FLAG_BIT_SKIP_SUBCOUNTER_UPDATE),
+-	IPSET_FLAG_BIT_MATCH_COUNTERS = 5,
+-	IPSET_FLAG_MATCH_COUNTERS = (1 << IPSET_FLAG_BIT_MATCH_COUNTERS),
+-	IPSET_FLAG_BIT_RETURN_NOMATCH = 7,
+-	IPSET_FLAG_RETURN_NOMATCH = (1 << IPSET_FLAG_BIT_RETURN_NOMATCH),
+-	IPSET_FLAG_BIT_MAP_SKBMARK = 8,
+-	IPSET_FLAG_MAP_SKBMARK = (1 << IPSET_FLAG_BIT_MAP_SKBMARK),
+-	IPSET_FLAG_BIT_MAP_SKBPRIO = 9,
+-	IPSET_FLAG_MAP_SKBPRIO = (1 << IPSET_FLAG_BIT_MAP_SKBPRIO),
+-	IPSET_FLAG_BIT_MAP_SKBQUEUE = 10,
+-	IPSET_FLAG_MAP_SKBQUEUE = (1 << IPSET_FLAG_BIT_MAP_SKBQUEUE),
+-	IPSET_FLAG_CMD_MAX = 15,
+-};
+-
+-/* Flags at CADT attribute level, upper half of cmdattrs */
+-enum ipset_cadt_flags {
+-	IPSET_FLAG_BIT_BEFORE	= 0,
+-	IPSET_FLAG_BEFORE	= (1 << IPSET_FLAG_BIT_BEFORE),
+-	IPSET_FLAG_BIT_PHYSDEV	= 1,
+-	IPSET_FLAG_PHYSDEV	= (1 << IPSET_FLAG_BIT_PHYSDEV),
+-	IPSET_FLAG_BIT_NOMATCH	= 2,
+-	IPSET_FLAG_NOMATCH	= (1 << IPSET_FLAG_BIT_NOMATCH),
+-	IPSET_FLAG_BIT_WITH_COUNTERS = 3,
+-	IPSET_FLAG_WITH_COUNTERS = (1 << IPSET_FLAG_BIT_WITH_COUNTERS),
+-	IPSET_FLAG_BIT_WITH_COMMENT = 4,
+-	IPSET_FLAG_WITH_COMMENT = (1 << IPSET_FLAG_BIT_WITH_COMMENT),
+-	IPSET_FLAG_BIT_WITH_FORCEADD = 5,
+-	IPSET_FLAG_WITH_FORCEADD = (1 << IPSET_FLAG_BIT_WITH_FORCEADD),
+-	IPSET_FLAG_BIT_WITH_SKBINFO = 6,
+-	IPSET_FLAG_WITH_SKBINFO = (1 << IPSET_FLAG_BIT_WITH_SKBINFO),
+-	IPSET_FLAG_CADT_MAX	= 15,
+-};
+-
+-/* The flag bits which correspond to the non-extension create flags */
+-enum ipset_create_flags {
+-	IPSET_CREATE_FLAG_BIT_FORCEADD = 0,
+-	IPSET_CREATE_FLAG_FORCEADD = (1 << IPSET_CREATE_FLAG_BIT_FORCEADD),
+-	IPSET_CREATE_FLAG_BIT_MAX = 7,
+-};
+-
+-/* Commands with settype-specific attributes */
+-enum ipset_adt {
+-	IPSET_ADD,
+-	IPSET_DEL,
+-	IPSET_TEST,
+-	IPSET_ADT_MAX,
+-	IPSET_CREATE = IPSET_ADT_MAX,
+-	IPSET_CADT_MAX,
+-};
+-
+-/* Sets are identified by an index in kernel space. Tweak with ip_set_id_t
+- * and IPSET_INVALID_ID if you want to increase the max number of sets.
+- */
+-typedef __u16 ip_set_id_t;
+-
+-#define IPSET_INVALID_ID		65535
+-
+-enum ip_set_dim {
+-	IPSET_DIM_ZERO = 0,
+-	IPSET_DIM_ONE,
+-	IPSET_DIM_TWO,
+-	IPSET_DIM_THREE,
+-	/* Max dimension in elements.
+-	 * If changed, new revision of iptables match/target is required.
+-	 */
+-	IPSET_DIM_MAX = 6,
+-	/* Backward compatibility: set match revision 2 */
+-	IPSET_BIT_RETURN_NOMATCH = 7,
+-};
+-
+-/* Option flags for kernel operations */
+-enum ip_set_kopt {
+-	IPSET_INV_MATCH = (1 << IPSET_DIM_ZERO),
+-	IPSET_DIM_ONE_SRC = (1 << IPSET_DIM_ONE),
+-	IPSET_DIM_TWO_SRC = (1 << IPSET_DIM_TWO),
+-	IPSET_DIM_THREE_SRC = (1 << IPSET_DIM_THREE),
+-	IPSET_RETURN_NOMATCH = (1 << IPSET_BIT_RETURN_NOMATCH),
+-};
+-
+-enum {
+-	IPSET_COUNTER_NONE = 0,
+-	IPSET_COUNTER_EQ,
+-	IPSET_COUNTER_NE,
+-	IPSET_COUNTER_LT,
+-	IPSET_COUNTER_GT,
+-};
+-
+-/* Backward compatibility for set match v3 */
+-struct ip_set_counter_match0 {
+-	__u8 op;
+-	__u64 value;
+-};
+-
+-struct ip_set_counter_match {
+-	__aligned_u64 value;
+-	__u8 op;
+-};
+-
+-/* Interface to iptables/ip6tables */
+-
+-#define SO_IP_SET		83
+-
+-union ip_set_name_index {
+-	char name[IPSET_MAXNAMELEN];
+-	ip_set_id_t index;
+-};
+-
+-#define IP_SET_OP_GET_BYNAME	0x00000006	/* Get set index by name */
+-struct ip_set_req_get_set {
+-	unsigned int op;
+-	unsigned int version;
+-	union ip_set_name_index set;
+-};
+-
+-#define IP_SET_OP_GET_BYINDEX	0x00000007	/* Get set name by index */
+-/* Uses ip_set_req_get_set */
+-
+-#define IP_SET_OP_GET_FNAME	0x00000008	/* Get set index and family */
+-struct ip_set_req_get_set_family {
+-	unsigned int op;
+-	unsigned int version;
+-	unsigned int family;
+-	union ip_set_name_index set;
+-};
+-
+-#define IP_SET_OP_VERSION	0x00000100	/* Ask kernel version */
+-struct ip_set_req_version {
+-	unsigned int op;
+-	unsigned int version;
+-};
+-
+-#endif /* _IP_SET_H */
+diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h
+deleted file mode 100644
+index 4120970..0000000
+--- a/include/linux/netfilter/x_tables.h
++++ /dev/null
+@@ -1,185 +0,0 @@
+-#ifndef _X_TABLES_H
+-#define _X_TABLES_H
+-#include <linux/kernel.h>
+-#include <linux/types.h>
+-
+-#define XT_FUNCTION_MAXNAMELEN 30
+-#define XT_EXTENSION_MAXNAMELEN 29
+-#define XT_TABLE_MAXNAMELEN 32
+-
+-struct xt_entry_match {
+-	union {
+-		struct {
+-			__u16 match_size;
+-
+-			/* Used by userspace */
+-			char name[XT_EXTENSION_MAXNAMELEN];
+-			__u8 revision;
+-		} user;
+-		struct {
+-			__u16 match_size;
+-
+-			/* Used inside the kernel */
+-			struct xt_match *match;
+-		} kernel;
+-
+-		/* Total length */
+-		__u16 match_size;
+-	} u;
+-
+-	unsigned char data[0];
+-};
+-
+-struct xt_entry_target {
+-	union {
+-		struct {
+-			__u16 target_size;
+-
+-			/* Used by userspace */
+-			char name[XT_EXTENSION_MAXNAMELEN];
+-			__u8 revision;
+-		} user;
+-		struct {
+-			__u16 target_size;
+-
+-			/* Used inside the kernel */
+-			struct xt_target *target;
+-		} kernel;
+-
+-		/* Total length */
+-		__u16 target_size;
+-	} u;
+-
+-	unsigned char data[0];
+-};
+-
+-#define XT_TARGET_INIT(__name, __size)					       \
+-{									       \
+-	.target.u.user = {						       \
+-		.target_size	= XT_ALIGN(__size),			       \
+-		.name		= __name,				       \
+-	},								       \
+-}
+-
+-struct xt_standard_target {
+-	struct xt_entry_target target;
+-	int verdict;
+-};
+-
+-struct xt_error_target {
+-	struct xt_entry_target target;
+-	char errorname[XT_FUNCTION_MAXNAMELEN];
+-};
+-
+-/* The argument to IPT_SO_GET_REVISION_*.  Returns highest revision
+- * kernel supports, if >= revision. */
+-struct xt_get_revision {
+-	char name[XT_EXTENSION_MAXNAMELEN];
+-	__u8 revision;
+-};
+-
+-/* CONTINUE verdict for targets */
+-#define XT_CONTINUE 0xFFFFFFFF
+-
+-/* For standard target */
+-#define XT_RETURN (-NF_REPEAT - 1)
+-
+-/* this is a dummy structure to find out the alignment requirement for a struct
+- * containing all the fundamental data types that are used in ipt_entry,
+- * ip6t_entry and arpt_entry.  This sucks, and it is a hack.  It will be my
+- * personal pleasure to remove it -HW
+- */
+-struct _xt_align {
+-	__u8 u8;
+-	__u16 u16;
+-	__u32 u32;
+-	__u64 u64;
+-};
+-
+-#define XT_ALIGN(s) __ALIGN_KERNEL((s), __alignof__(struct _xt_align))
+-
+-/* Standard return verdict, or do jump. */
+-#define XT_STANDARD_TARGET ""
+-/* Error verdict. */
+-#define XT_ERROR_TARGET "ERROR"
+-
+-#define SET_COUNTER(c,b,p) do { (c).bcnt = (b); (c).pcnt = (p); } while(0)
+-#define ADD_COUNTER(c,b,p) do { (c).bcnt += (b); (c).pcnt += (p); } while(0)
+-
+-struct xt_counters {
+-	__u64 pcnt, bcnt;			/* Packet and byte counters */
+-};
+-
+-/* The argument to IPT_SO_ADD_COUNTERS. */
+-struct xt_counters_info {
+-	/* Which table. */
+-	char name[XT_TABLE_MAXNAMELEN];
+-
+-	unsigned int num_counters;
+-
+-	/* The counters (actually `number' of these). */
+-	struct xt_counters counters[0];
+-};
+-
+-#define XT_INV_PROTO		0x40	/* Invert the sense of PROTO. */
+-
+-/* fn returns 0 to continue iteration */
+-#define XT_MATCH_ITERATE(type, e, fn, args...)			\
+-({								\
+-	unsigned int __i;					\
+-	int __ret = 0;						\
+-	struct xt_entry_match *__m;				\
+-								\
+-	for (__i = sizeof(type);				\
+-	     __i < (e)->target_offset;				\
+-	     __i += __m->u.match_size) {			\
+-		__m = (void *)e + __i;				\
+-								\
+-		__ret = fn(__m , ## args);			\
+-		if (__ret != 0)					\
+-			break;					\
+-	}							\
+-	__ret;							\
+-})
+-
+-/* fn returns 0 to continue iteration */
+-#define XT_ENTRY_ITERATE_CONTINUE(type, entries, size, n, fn, args...) \
+-({								\
+-	unsigned int __i, __n;					\
+-	int __ret = 0;						\
+-	type *__entry;						\
+-								\
+-	for (__i = 0, __n = 0; __i < (size);			\
+-	     __i += __entry->next_offset, __n++) { 		\
+-		__entry = (void *)(entries) + __i;		\
+-		if (__n < n)					\
+-			continue;				\
+-								\
+-		__ret = fn(__entry , ## args);			\
+-		if (__ret != 0)					\
+-			break;					\
+-	}							\
+-	__ret;							\
+-})
+-
+-/* fn returns 0 to continue iteration */
+-#define XT_ENTRY_ITERATE(type, entries, size, fn, args...) \
+-	XT_ENTRY_ITERATE_CONTINUE(type, entries, size, 0, fn, args)
+-
+-
+-/* pos is normally a struct ipt_entry/ip6t_entry/etc. */
+-#define xt_entry_foreach(pos, ehead, esize) \
+-	for ((pos) = (typeof(pos))(ehead); \
+-	     (pos) < (typeof(pos))((char *)(ehead) + (esize)); \
+-	     (pos) = (typeof(pos))((char *)(pos) + (pos)->next_offset))
+-
+-/* can only be xt_entry_match, so no use of typeof here */
+-#define xt_ematch_foreach(pos, entry) \
+-	for ((pos) = (struct xt_entry_match *)entry->elems; \
+-	     (pos) < (struct xt_entry_match *)((char *)(entry) + \
+-	             (entry)->target_offset); \
+-	     (pos) = (struct xt_entry_match *)((char *)(pos) + \
+-	             (pos)->u.match_size))
+-
+-
+-#endif /* _X_TABLES_H */
+diff --git a/include/linux/netfilter/xt_set.h b/include/linux/netfilter/xt_set.h
+deleted file mode 100644
+index d4e0234..0000000
+--- a/include/linux/netfilter/xt_set.h
++++ /dev/null
+@@ -1,93 +0,0 @@
+-#ifndef _XT_SET_H
+-#define _XT_SET_H
+-
+-#include <linux/types.h>
+-#include <linux/netfilter/ipset/ip_set.h>
+-
+-/* Revision 0 interface: backward compatible with netfilter/iptables */
+-
+-/*
+- * Option flags for kernel operations (xt_set_info_v0)
+- */
+-#define IPSET_SRC		0x01	/* Source match/add */
+-#define IPSET_DST		0x02	/* Destination match/add */
+-#define IPSET_MATCH_INV		0x04	/* Inverse matching */
+-
+-struct xt_set_info_v0 {
+-	ip_set_id_t index;
+-	union {
+-		__u32 flags[IPSET_DIM_MAX + 1];
+-		struct {
+-			__u32 __flags[IPSET_DIM_MAX];
+-			__u8 dim;
+-			__u8 flags;
+-		} compat;
+-	} u;
+-};
+-
+-/* match and target infos */
+-struct xt_set_info_match_v0 {
+-	struct xt_set_info_v0 match_set;
+-};
+-
+-struct xt_set_info_target_v0 {
+-	struct xt_set_info_v0 add_set;
+-	struct xt_set_info_v0 del_set;
+-};
+-
+-/* Revision 1  match and target */
+-
+-struct xt_set_info {
+-	ip_set_id_t index;
+-	__u8 dim;
+-	__u8 flags;
+-};
+-
+-/* match and target infos */
+-struct xt_set_info_match_v1 {
+-	struct xt_set_info match_set;
+-};
+-
+-struct xt_set_info_target_v1 {
+-	struct xt_set_info add_set;
+-	struct xt_set_info del_set;
+-};
+-
+-/* Revision 2 target */
+-
+-struct xt_set_info_target_v2 {
+-	struct xt_set_info add_set;
+-	struct xt_set_info del_set;
+-	__u32 flags;
+-	__u32 timeout;
+-};
+-
+-/* Revision 3 match */
+-
+-struct xt_set_info_match_v3 {
+-	struct xt_set_info match_set;
+-	struct ip_set_counter_match0 packets;
+-	struct ip_set_counter_match0 bytes;
+-	__u32 flags;
+-};
+-
+-/* Revision 3 target */
+-
+-struct xt_set_info_target_v3 {
+-	struct xt_set_info add_set;
+-	struct xt_set_info del_set;
+-	struct xt_set_info map_set;
+-	__u32 flags;
+-	__u32 timeout;
+-};
+-
+-/* Revision 4 match */
+-
+-struct xt_set_info_match_v4 {
+-	struct xt_set_info match_set;
+-	struct ip_set_counter_match packets;
+-	struct ip_set_counter_match bytes;
+-	__u32 flags;
+-};
+-
+-#endif /*_XT_SET_H*/
+diff --git a/include/linux/netfilter/xt_tcpudp.h b/include/linux/netfilter/xt_tcpudp.h
+deleted file mode 100644
+index 38aa7b3..0000000
+--- a/include/linux/netfilter/xt_tcpudp.h
++++ /dev/null
+@@ -1,36 +0,0 @@
+-#ifndef _XT_TCPUDP_H
+-#define _XT_TCPUDP_H
+-
+-#include <linux/types.h>
+-
+-/* TCP matching stuff */
+-struct xt_tcp {
+-	__u16 spts[2];			/* Source port range. */
+-	__u16 dpts[2];			/* Destination port range. */
+-	__u8 option;			/* TCP Option iff non-zero*/
+-	__u8 flg_mask;			/* TCP flags mask byte */
+-	__u8 flg_cmp;			/* TCP flags compare byte */
+-	__u8 invflags;			/* Inverse flags */
+-};
+-
+-/* Values for "inv" field in struct ipt_tcp. */
+-#define XT_TCP_INV_SRCPT	0x01	/* Invert the sense of source ports. */
+-#define XT_TCP_INV_DSTPT	0x02	/* Invert the sense of dest ports. */
+-#define XT_TCP_INV_FLAGS	0x04	/* Invert the sense of TCP flags. */
+-#define XT_TCP_INV_OPTION	0x08	/* Invert the sense of option test. */
+-#define XT_TCP_INV_MASK		0x0F	/* All possible flags. */
+-
+-/* UDP matching stuff */
+-struct xt_udp {
+-	__u16 spts[2];			/* Source port range. */
+-	__u16 dpts[2];			/* Destination port range. */
+-	__u8 invflags;			/* Inverse flags */
+-};
+-
+-/* Values for "invflags" field in struct ipt_udp. */
+-#define XT_UDP_INV_SRCPT	0x01	/* Invert the sense of source ports. */
+-#define XT_UDP_INV_DSTPT	0x02	/* Invert the sense of dest ports. */
+-#define XT_UDP_INV_MASK	0x03	/* All possible flags. */
+-
+-
+-#endif
+diff --git a/include/linux/netfilter_ipv4.h b/include/linux/netfilter_ipv4.h
+deleted file mode 100644
+index a5f4dc7..0000000
+--- a/include/linux/netfilter_ipv4.h
++++ /dev/null
+@@ -1,79 +0,0 @@
+-/* IPv4-specific defines for netfilter. 
+- * (C)1998 Rusty Russell -- This code is GPL.
+- */
+-#ifndef __LINUX_IP_NETFILTER_H
+-#define __LINUX_IP_NETFILTER_H
+-
+-
+-#include <linux/netfilter.h>
+-
+-/* only for userspace compatibility */
+-
+-#include <limits.h> /* for INT_MIN, INT_MAX */
+-
+-/* IP Cache bits. */
+-/* Src IP address. */
+-#define NFC_IP_SRC		0x0001
+-/* Dest IP address. */
+-#define NFC_IP_DST		0x0002
+-/* Input device. */
+-#define NFC_IP_IF_IN		0x0004
+-/* Output device. */
+-#define NFC_IP_IF_OUT		0x0008
+-/* TOS. */
+-#define NFC_IP_TOS		0x0010
+-/* Protocol. */
+-#define NFC_IP_PROTO		0x0020
+-/* IP options. */
+-#define NFC_IP_OPTIONS		0x0040
+-/* Frag & flags. */
+-#define NFC_IP_FRAG		0x0080
+-
+-/* Per-protocol information: only matters if proto match. */
+-/* TCP flags. */
+-#define NFC_IP_TCPFLAGS		0x0100
+-/* Source port. */
+-#define NFC_IP_SRC_PT		0x0200
+-/* Dest port. */
+-#define NFC_IP_DST_PT		0x0400
+-/* Something else about the proto */
+-#define NFC_IP_PROTO_UNKNOWN	0x2000
+-
+-/* IP Hooks */
+-/* After promisc drops, checksum checks. */
+-#define NF_IP_PRE_ROUTING	0
+-/* If the packet is destined for this box. */
+-#define NF_IP_LOCAL_IN		1
+-/* If the packet is destined for another interface. */
+-#define NF_IP_FORWARD		2
+-/* Packets coming from a local process. */
+-#define NF_IP_LOCAL_OUT		3
+-/* Packets about to hit the wire. */
+-#define NF_IP_POST_ROUTING	4
+-#define NF_IP_NUMHOOKS		5
+-
+-enum nf_ip_hook_priorities {
+-	NF_IP_PRI_FIRST = INT_MIN,
+-	NF_IP_PRI_CONNTRACK_DEFRAG = -400,
+-	NF_IP_PRI_RAW = -300,
+-	NF_IP_PRI_SELINUX_FIRST = -225,
+-	NF_IP_PRI_CONNTRACK = -200,
+-	NF_IP_PRI_MANGLE = -150,
+-	NF_IP_PRI_NAT_DST = -100,
+-	NF_IP_PRI_FILTER = 0,
+-	NF_IP_PRI_SECURITY = 50,
+-	NF_IP_PRI_NAT_SRC = 100,
+-	NF_IP_PRI_SELINUX_LAST = 225,
+-	NF_IP_PRI_CONNTRACK_HELPER = 300,
+-	NF_IP_PRI_CONNTRACK_CONFIRM = INT_MAX,
+-	NF_IP_PRI_LAST = INT_MAX,
+-};
+-
+-/* Arguments for setsockopt SOL_IP: */
+-/* 2.0 firewalling went from 64 through 71 (and +256, +512, etc). */
+-/* 2.2 firewalling (+ masq) went from 64 through 76 */
+-/* 2.4 firewalling went 64 through 67. */
+-#define SO_ORIGINAL_DST 80
+-
+-
+-#endif /* __LINUX_IP_NETFILTER_H */
+diff --git a/include/linux/netfilter_ipv4/ip_tables.h b/include/linux/netfilter_ipv4/ip_tables.h
+deleted file mode 100644
+index 456fb86..0000000
+--- a/include/linux/netfilter_ipv4/ip_tables.h
++++ /dev/null
+@@ -1,228 +0,0 @@
+-/*
+- * 25-Jul-1998 Major changes to allow for ip chain table
+- *
+- * 3-Jan-2000 Named tables to allow packet selection for different uses.
+- */
+-
+-/*
+- * 	Format of an IP firewall descriptor
+- *
+- * 	src, dst, src_mask, dst_mask are always stored in network byte order.
+- * 	flags are stored in host byte order (of course).
+- * 	Port numbers are stored in HOST byte order.
+- */
+-
+-#ifndef _IPTABLES_H
+-#define _IPTABLES_H
+-
+-#include <linux/types.h>
+-
+-#include <linux/if.h>
+-#include <linux/netfilter_ipv4.h>
+-
+-#include <linux/netfilter/x_tables.h>
+-
+-#define IPT_FUNCTION_MAXNAMELEN XT_FUNCTION_MAXNAMELEN
+-#define IPT_TABLE_MAXNAMELEN XT_TABLE_MAXNAMELEN
+-#define ipt_match xt_match
+-#define ipt_target xt_target
+-#define ipt_table xt_table
+-#define ipt_get_revision xt_get_revision
+-#define ipt_entry_match xt_entry_match
+-#define ipt_entry_target xt_entry_target
+-#define ipt_standard_target xt_standard_target
+-#define ipt_error_target xt_error_target
+-#define ipt_counters xt_counters
+-#define IPT_CONTINUE XT_CONTINUE
+-#define IPT_RETURN XT_RETURN
+-
+-/* This group is older than old (iptables < v1.4.0-rc1~89) */
+-#include <linux/netfilter/xt_tcpudp.h>
+-#define ipt_udp xt_udp
+-#define ipt_tcp xt_tcp
+-#define IPT_TCP_INV_SRCPT	XT_TCP_INV_SRCPT
+-#define IPT_TCP_INV_DSTPT	XT_TCP_INV_DSTPT
+-#define IPT_TCP_INV_FLAGS	XT_TCP_INV_FLAGS
+-#define IPT_TCP_INV_OPTION	XT_TCP_INV_OPTION
+-#define IPT_TCP_INV_MASK	XT_TCP_INV_MASK
+-#define IPT_UDP_INV_SRCPT	XT_UDP_INV_SRCPT
+-#define IPT_UDP_INV_DSTPT	XT_UDP_INV_DSTPT
+-#define IPT_UDP_INV_MASK	XT_UDP_INV_MASK
+-
+-/* The argument to IPT_SO_ADD_COUNTERS. */
+-#define ipt_counters_info xt_counters_info
+-/* Standard return verdict, or do jump. */
+-#define IPT_STANDARD_TARGET XT_STANDARD_TARGET
+-/* Error verdict. */
+-#define IPT_ERROR_TARGET XT_ERROR_TARGET
+-
+-/* fn returns 0 to continue iteration */
+-#define IPT_MATCH_ITERATE(e, fn, args...) \
+-	XT_MATCH_ITERATE(struct ipt_entry, e, fn, ## args)
+-
+-/* fn returns 0 to continue iteration */
+-#define IPT_ENTRY_ITERATE(entries, size, fn, args...) \
+-	XT_ENTRY_ITERATE(struct ipt_entry, entries, size, fn, ## args)
+-
+-/* Yes, Virginia, you have to zero the padding. */
+-struct ipt_ip {
+-	/* Source and destination IP addr */
+-	struct in_addr src, dst;
+-	/* Mask for src and dest IP addr */
+-	struct in_addr smsk, dmsk;
+-	char iniface[IFNAMSIZ], outiface[IFNAMSIZ];
+-	unsigned char iniface_mask[IFNAMSIZ], outiface_mask[IFNAMSIZ];
+-
+-	/* Protocol, 0 = ANY */
+-	__u16 proto;
+-
+-	/* Flags word */
+-	__u8 flags;
+-	/* Inverse flags */
+-	__u8 invflags;
+-};
+-
+-/* Values for "flag" field in struct ipt_ip (general ip structure). */
+-#define IPT_F_FRAG		0x01	/* Set if rule is a fragment rule */
+-#define IPT_F_GOTO		0x02	/* Set if jump is a goto */
+-#define IPT_F_MASK		0x03	/* All possible flag bits mask. */
+-
+-/* Values for "inv" field in struct ipt_ip. */
+-#define IPT_INV_VIA_IN		0x01	/* Invert the sense of IN IFACE. */
+-#define IPT_INV_VIA_OUT		0x02	/* Invert the sense of OUT IFACE */
+-#define IPT_INV_TOS		0x04	/* Invert the sense of TOS. */
+-#define IPT_INV_SRCIP		0x08	/* Invert the sense of SRC IP. */
+-#define IPT_INV_DSTIP		0x10	/* Invert the sense of DST OP. */
+-#define IPT_INV_FRAG		0x20	/* Invert the sense of FRAG. */
+-#define IPT_INV_PROTO		XT_INV_PROTO
+-#define IPT_INV_MASK		0x7F	/* All possible flag bits mask. */
+-
+-/* This structure defines each of the firewall rules.  Consists of 3
+-   parts which are 1) general IP header stuff 2) match specific
+-   stuff 3) the target to perform if the rule matches */
+-struct ipt_entry {
+-	struct ipt_ip ip;
+-
+-	/* Mark with fields that we care about. */
+-	unsigned int nfcache;
+-
+-	/* Size of ipt_entry + matches */
+-	__u16 target_offset;
+-	/* Size of ipt_entry + matches + target */
+-	__u16 next_offset;
+-
+-	/* Back pointer */
+-	unsigned int comefrom;
+-
+-	/* Packet and byte counters. */
+-	struct xt_counters counters;
+-
+-	/* The matches (if any), then the target. */
+-	unsigned char elems[0];
+-};
+-
+-/*
+- * New IP firewall options for [gs]etsockopt at the RAW IP level.
+- * Unlike BSD Linux inherits IP options so you don't have to use a raw
+- * socket for this. Instead we check rights in the calls.
+- *
+- * ATTENTION: check linux/in.h before adding new number here.
+- */
+-#define IPT_BASE_CTL		64
+-
+-#define IPT_SO_SET_REPLACE	(IPT_BASE_CTL)
+-#define IPT_SO_SET_ADD_COUNTERS	(IPT_BASE_CTL + 1)
+-#define IPT_SO_SET_MAX		IPT_SO_SET_ADD_COUNTERS
+-
+-#define IPT_SO_GET_INFO			(IPT_BASE_CTL)
+-#define IPT_SO_GET_ENTRIES		(IPT_BASE_CTL + 1)
+-#define IPT_SO_GET_REVISION_MATCH	(IPT_BASE_CTL + 2)
+-#define IPT_SO_GET_REVISION_TARGET	(IPT_BASE_CTL + 3)
+-#define IPT_SO_GET_MAX			IPT_SO_GET_REVISION_TARGET
+-
+-/* ICMP matching stuff */
+-struct ipt_icmp {
+-	__u8 type;				/* type to match */
+-	__u8 code[2];				/* range of code */
+-	__u8 invflags;				/* Inverse flags */
+-};
+-
+-/* Values for "inv" field for struct ipt_icmp. */
+-#define IPT_ICMP_INV	0x01	/* Invert the sense of type/code test */
+-
+-/* The argument to IPT_SO_GET_INFO */
+-struct ipt_getinfo {
+-	/* Which table: caller fills this in. */
+-	char name[XT_TABLE_MAXNAMELEN];
+-
+-	/* Kernel fills these in. */
+-	/* Which hook entry points are valid: bitmask */
+-	unsigned int valid_hooks;
+-
+-	/* Hook entry points: one per netfilter hook. */
+-	unsigned int hook_entry[NF_INET_NUMHOOKS];
+-
+-	/* Underflow points. */
+-	unsigned int underflow[NF_INET_NUMHOOKS];
+-
+-	/* Number of entries */
+-	unsigned int num_entries;
+-
+-	/* Size of entries. */
+-	unsigned int size;
+-};
+-
+-/* The argument to IPT_SO_SET_REPLACE. */
+-struct ipt_replace {
+-	/* Which table. */
+-	char name[XT_TABLE_MAXNAMELEN];
+-
+-	/* Which hook entry points are valid: bitmask.  You can't
+-           change this. */
+-	unsigned int valid_hooks;
+-
+-	/* Number of entries */
+-	unsigned int num_entries;
+-
+-	/* Total size of new entries */
+-	unsigned int size;
+-
+-	/* Hook entry points. */
+-	unsigned int hook_entry[NF_INET_NUMHOOKS];
+-
+-	/* Underflow points. */
+-	unsigned int underflow[NF_INET_NUMHOOKS];
+-
+-	/* Information about old entries: */
+-	/* Number of counters (must be equal to current number of entries). */
+-	unsigned int num_counters;
+-	/* The old entries' counters. */
+-	struct xt_counters *counters;
+-
+-	/* The entries (hang off end: not really an array). */
+-	struct ipt_entry entries[0];
+-};
+-
+-/* The argument to IPT_SO_GET_ENTRIES. */
+-struct ipt_get_entries {
+-	/* Which table: user fills this in. */
+-	char name[XT_TABLE_MAXNAMELEN];
+-
+-	/* User fills this in: total entry size. */
+-	unsigned int size;
+-
+-	/* The entries. */
+-	struct ipt_entry entrytable[0];
+-};
+-
+-/* Helper functions */
+-static __inline__ struct xt_entry_target *
+-ipt_get_target(struct ipt_entry *e)
+-{
+-	return (void *)e + e->target_offset;
+-}
+-
+-/*
+- *	Main firewall chains definitions and global var's definitions.
+- */
+-#endif /* _IPTABLES_H */
+diff --git a/include/linux/netfilter_ipv6.h b/include/linux/netfilter_ipv6.h
+deleted file mode 100644
+index 8483d1d..0000000
+--- a/include/linux/netfilter_ipv6.h
++++ /dev/null
+@@ -1,77 +0,0 @@
+-/* IPv6-specific defines for netfilter. 
+- * (C)1998 Rusty Russell -- This code is GPL.
+- * (C)1999 David Jeffery
+- *   this header was blatantly ripped from netfilter_ipv4.h 
+- *   it's amazing what adding a bunch of 6s can do =8^)
+- */
+-#ifndef __LINUX_IP6_NETFILTER_H
+-#define __LINUX_IP6_NETFILTER_H
+-
+-
+-#include <linux/netfilter.h>
+-
+-/* only for userspace compatibility */
+-
+-#include <limits.h> /* for INT_MIN, INT_MAX */
+-
+-/* IP Cache bits. */
+-/* Src IP address. */
+-#define NFC_IP6_SRC              0x0001
+-/* Dest IP address. */
+-#define NFC_IP6_DST              0x0002
+-/* Input device. */
+-#define NFC_IP6_IF_IN            0x0004
+-/* Output device. */
+-#define NFC_IP6_IF_OUT           0x0008
+-/* TOS. */
+-#define NFC_IP6_TOS              0x0010
+-/* Protocol. */
+-#define NFC_IP6_PROTO            0x0020
+-/* IP options. */
+-#define NFC_IP6_OPTIONS          0x0040
+-/* Frag & flags. */
+-#define NFC_IP6_FRAG             0x0080
+-
+-
+-/* Per-protocol information: only matters if proto match. */
+-/* TCP flags. */
+-#define NFC_IP6_TCPFLAGS         0x0100
+-/* Source port. */
+-#define NFC_IP6_SRC_PT           0x0200
+-/* Dest port. */
+-#define NFC_IP6_DST_PT           0x0400
+-/* Something else about the proto */
+-#define NFC_IP6_PROTO_UNKNOWN    0x2000
+-
+-/* IP6 Hooks */
+-/* After promisc drops, checksum checks. */
+-#define NF_IP6_PRE_ROUTING	0
+-/* If the packet is destined for this box. */
+-#define NF_IP6_LOCAL_IN		1
+-/* If the packet is destined for another interface. */
+-#define NF_IP6_FORWARD		2
+-/* Packets coming from a local process. */
+-#define NF_IP6_LOCAL_OUT		3
+-/* Packets about to hit the wire. */
+-#define NF_IP6_POST_ROUTING	4
+-#define NF_IP6_NUMHOOKS		5
+-
+-
+-enum nf_ip6_hook_priorities {
+-	NF_IP6_PRI_FIRST = INT_MIN,
+-	NF_IP6_PRI_CONNTRACK_DEFRAG = -400,
+-	NF_IP6_PRI_RAW = -300,
+-	NF_IP6_PRI_SELINUX_FIRST = -225,
+-	NF_IP6_PRI_CONNTRACK = -200,
+-	NF_IP6_PRI_MANGLE = -150,
+-	NF_IP6_PRI_NAT_DST = -100,
+-	NF_IP6_PRI_FILTER = 0,
+-	NF_IP6_PRI_SECURITY = 50,
+-	NF_IP6_PRI_NAT_SRC = 100,
+-	NF_IP6_PRI_SELINUX_LAST = 225,
+-	NF_IP6_PRI_CONNTRACK_HELPER = 300,
+-	NF_IP6_PRI_LAST = INT_MAX,
+-};
+-
+-
+-#endif /* __LINUX_IP6_NETFILTER_H */
+diff --git a/include/linux/netfilter_ipv6/ip6_tables.h b/include/linux/netfilter_ipv6/ip6_tables.h
+deleted file mode 100644
+index fcc8cca..0000000
+--- a/include/linux/netfilter_ipv6/ip6_tables.h
++++ /dev/null
+@@ -1,269 +0,0 @@
+-/*
+- * 25-Jul-1998 Major changes to allow for ip chain table
+- *
+- * 3-Jan-2000 Named tables to allow packet selection for different uses.
+- */
+-
+-/*
+- * 	Format of an IP6 firewall descriptor
+- *
+- * 	src, dst, src_mask, dst_mask are always stored in network byte order.
+- * 	flags are stored in host byte order (of course).
+- * 	Port numbers are stored in HOST byte order.
+- */
+-
+-#ifndef _IP6_TABLES_H
+-#define _IP6_TABLES_H
+-
+-#include <linux/types.h>
+-
+-#include <linux/if.h>
+-#include <linux/netfilter_ipv6.h>
+-
+-#include <linux/netfilter/x_tables.h>
+-
+-#define IP6T_FUNCTION_MAXNAMELEN XT_FUNCTION_MAXNAMELEN
+-#define IP6T_TABLE_MAXNAMELEN XT_TABLE_MAXNAMELEN
+-#define ip6t_match xt_match
+-#define ip6t_target xt_target
+-#define ip6t_table xt_table
+-#define ip6t_get_revision xt_get_revision
+-#define ip6t_entry_match xt_entry_match
+-#define ip6t_entry_target xt_entry_target
+-#define ip6t_standard_target xt_standard_target
+-#define ip6t_error_target xt_error_target
+-#define ip6t_counters xt_counters
+-#define IP6T_CONTINUE XT_CONTINUE
+-#define IP6T_RETURN XT_RETURN
+-
+-/* Pre-iptables-1.4.0 */
+-#include <linux/netfilter/xt_tcpudp.h>
+-#define ip6t_tcp xt_tcp
+-#define ip6t_udp xt_udp
+-#define IP6T_TCP_INV_SRCPT	XT_TCP_INV_SRCPT
+-#define IP6T_TCP_INV_DSTPT	XT_TCP_INV_DSTPT
+-#define IP6T_TCP_INV_FLAGS	XT_TCP_INV_FLAGS
+-#define IP6T_TCP_INV_OPTION	XT_TCP_INV_OPTION
+-#define IP6T_TCP_INV_MASK	XT_TCP_INV_MASK
+-#define IP6T_UDP_INV_SRCPT	XT_UDP_INV_SRCPT
+-#define IP6T_UDP_INV_DSTPT	XT_UDP_INV_DSTPT
+-#define IP6T_UDP_INV_MASK	XT_UDP_INV_MASK
+-
+-#define ip6t_counters_info xt_counters_info
+-#define IP6T_STANDARD_TARGET XT_STANDARD_TARGET
+-#define IP6T_ERROR_TARGET XT_ERROR_TARGET
+-#define IP6T_MATCH_ITERATE(e, fn, args...) \
+-	XT_MATCH_ITERATE(struct ip6t_entry, e, fn, ## args)
+-#define IP6T_ENTRY_ITERATE(entries, size, fn, args...) \
+-	XT_ENTRY_ITERATE(struct ip6t_entry, entries, size, fn, ## args)
+-
+-/* Yes, Virginia, you have to zero the padding. */
+-struct ip6t_ip6 {
+-	/* Source and destination IP6 addr */
+-	struct in6_addr src, dst;		
+-	/* Mask for src and dest IP6 addr */
+-	struct in6_addr smsk, dmsk;
+-	char iniface[IFNAMSIZ], outiface[IFNAMSIZ];
+-	unsigned char iniface_mask[IFNAMSIZ], outiface_mask[IFNAMSIZ];
+-
+-	/* Upper protocol number
+-	 * - The allowed value is 0 (any) or protocol number of last parsable
+-	 *   header, which is 50 (ESP), 59 (No Next Header), 135 (MH), or
+-	 *   the non IPv6 extension headers.
+-	 * - The protocol numbers of IPv6 extension headers except of ESP and
+-	 *   MH do not match any packets.
+-	 * - You also need to set IP6T_FLAGS_PROTO to "flags" to check protocol.
+-	 */
+-	__u16 proto;
+-	/* TOS to match iff flags & IP6T_F_TOS */
+-	__u8 tos;
+-
+-	/* Flags word */
+-	__u8 flags;
+-	/* Inverse flags */
+-	__u8 invflags;
+-};
+-
+-/* Values for "flag" field in struct ip6t_ip6 (general ip6 structure). */
+-#define IP6T_F_PROTO		0x01	/* Set if rule cares about upper 
+-					   protocols */
+-#define IP6T_F_TOS		0x02	/* Match the TOS. */
+-#define IP6T_F_GOTO		0x04	/* Set if jump is a goto */
+-#define IP6T_F_MASK		0x07	/* All possible flag bits mask. */
+-
+-/* Values for "inv" field in struct ip6t_ip6. */
+-#define IP6T_INV_VIA_IN		0x01	/* Invert the sense of IN IFACE. */
+-#define IP6T_INV_VIA_OUT		0x02	/* Invert the sense of OUT IFACE */
+-#define IP6T_INV_TOS		0x04	/* Invert the sense of TOS. */
+-#define IP6T_INV_SRCIP		0x08	/* Invert the sense of SRC IP. */
+-#define IP6T_INV_DSTIP		0x10	/* Invert the sense of DST OP. */
+-#define IP6T_INV_FRAG		0x20	/* Invert the sense of FRAG. */
+-#define IP6T_INV_PROTO		XT_INV_PROTO
+-#define IP6T_INV_MASK		0x7F	/* All possible flag bits mask. */
+-
+-/* This structure defines each of the firewall rules.  Consists of 3
+-   parts which are 1) general IP header stuff 2) match specific
+-   stuff 3) the target to perform if the rule matches */
+-struct ip6t_entry {
+-	struct ip6t_ip6 ipv6;
+-
+-	/* Mark with fields that we care about. */
+-	unsigned int nfcache;
+-
+-	/* Size of ipt_entry + matches */
+-	__u16 target_offset;
+-	/* Size of ipt_entry + matches + target */
+-	__u16 next_offset;
+-
+-	/* Back pointer */
+-	unsigned int comefrom;
+-
+-	/* Packet and byte counters. */
+-	struct xt_counters counters;
+-
+-	/* The matches (if any), then the target. */
+-	unsigned char elems[0];
+-};
+-
+-/* Standard entry */
+-struct ip6t_standard {
+-	struct ip6t_entry entry;
+-	struct xt_standard_target target;
+-};
+-
+-struct ip6t_error {
+-	struct ip6t_entry entry;
+-	struct xt_error_target target;
+-};
+-
+-#define IP6T_ENTRY_INIT(__size)						       \
+-{									       \
+-	.target_offset	= sizeof(struct ip6t_entry),			       \
+-	.next_offset	= (__size),					       \
+-}
+-
+-#define IP6T_STANDARD_INIT(__verdict)					       \
+-{									       \
+-	.entry		= IP6T_ENTRY_INIT(sizeof(struct ip6t_standard)),       \
+-	.target		= XT_TARGET_INIT(XT_STANDARD_TARGET,		       \
+-					 sizeof(struct xt_standard_target)),   \
+-	.target.verdict	= -(__verdict) - 1,				       \
+-}
+-
+-#define IP6T_ERROR_INIT							       \
+-{									       \
+-	.entry		= IP6T_ENTRY_INIT(sizeof(struct ip6t_error)),	       \
+-	.target		= XT_TARGET_INIT(XT_ERROR_TARGET,		       \
+-					 sizeof(struct xt_error_target)),      \
+-	.target.errorname = "ERROR",					       \
+-}
+-
+-/*
+- * New IP firewall options for [gs]etsockopt at the RAW IP level.
+- * Unlike BSD Linux inherits IP options so you don't have to use
+- * a raw socket for this. Instead we check rights in the calls.
+- *
+- * ATTENTION: check linux/in6.h before adding new number here.
+- */
+-#define IP6T_BASE_CTL			64
+-
+-#define IP6T_SO_SET_REPLACE		(IP6T_BASE_CTL)
+-#define IP6T_SO_SET_ADD_COUNTERS	(IP6T_BASE_CTL + 1)
+-#define IP6T_SO_SET_MAX			IP6T_SO_SET_ADD_COUNTERS
+-
+-#define IP6T_SO_GET_INFO		(IP6T_BASE_CTL)
+-#define IP6T_SO_GET_ENTRIES		(IP6T_BASE_CTL + 1)
+-#define IP6T_SO_GET_REVISION_MATCH	(IP6T_BASE_CTL + 4)
+-#define IP6T_SO_GET_REVISION_TARGET	(IP6T_BASE_CTL + 5)
+-#define IP6T_SO_GET_MAX			IP6T_SO_GET_REVISION_TARGET
+-
+-/* obtain original address if REDIRECT'd connection */
+-#define IP6T_SO_ORIGINAL_DST            80
+-
+-/* ICMP matching stuff */
+-struct ip6t_icmp {
+-	__u8 type;				/* type to match */
+-	__u8 code[2];				/* range of code */
+-	__u8 invflags;				/* Inverse flags */
+-};
+-
+-/* Values for "inv" field for struct ipt_icmp. */
+-#define IP6T_ICMP_INV	0x01	/* Invert the sense of type/code test */
+-
+-/* The argument to IP6T_SO_GET_INFO */
+-struct ip6t_getinfo {
+-	/* Which table: caller fills this in. */
+-	char name[XT_TABLE_MAXNAMELEN];
+-
+-	/* Kernel fills these in. */
+-	/* Which hook entry points are valid: bitmask */
+-	unsigned int valid_hooks;
+-
+-	/* Hook entry points: one per netfilter hook. */
+-	unsigned int hook_entry[NF_INET_NUMHOOKS];
+-
+-	/* Underflow points. */
+-	unsigned int underflow[NF_INET_NUMHOOKS];
+-
+-	/* Number of entries */
+-	unsigned int num_entries;
+-
+-	/* Size of entries. */
+-	unsigned int size;
+-};
+-
+-/* The argument to IP6T_SO_SET_REPLACE. */
+-struct ip6t_replace {
+-	/* Which table. */
+-	char name[XT_TABLE_MAXNAMELEN];
+-
+-	/* Which hook entry points are valid: bitmask.  You can't
+-           change this. */
+-	unsigned int valid_hooks;
+-
+-	/* Number of entries */
+-	unsigned int num_entries;
+-
+-	/* Total size of new entries */
+-	unsigned int size;
+-
+-	/* Hook entry points. */
+-	unsigned int hook_entry[NF_INET_NUMHOOKS];
+-
+-	/* Underflow points. */
+-	unsigned int underflow[NF_INET_NUMHOOKS];
+-
+-	/* Information about old entries: */
+-	/* Number of counters (must be equal to current number of entries). */
+-	unsigned int num_counters;
+-	/* The old entries' counters. */
+-	struct xt_counters *counters;
+-
+-	/* The entries (hang off end: not really an array). */
+-	struct ip6t_entry entries[0];
+-};
+-
+-/* The argument to IP6T_SO_GET_ENTRIES. */
+-struct ip6t_get_entries {
+-	/* Which table: user fills this in. */
+-	char name[XT_TABLE_MAXNAMELEN];
+-
+-	/* User fills this in: total entry size. */
+-	unsigned int size;
+-
+-	/* The entries. */
+-	struct ip6t_entry entrytable[0];
+-};
+-
+-/* Helper functions */
+-static __inline__ struct xt_entry_target *
+-ip6t_get_target(struct ip6t_entry *e)
+-{
+-	return (void *)e + e->target_offset;
+-}
+-
+-/*
+- *	Main firewall chains definitions and global var's definitions.
+- */
+-
+-#endif /* _IP6_TABLES_H */
+diff --git a/include/linux/netlink.h b/include/linux/netlink.h
+deleted file mode 100644
+index ec0690b..0000000
+--- a/include/linux/netlink.h
++++ /dev/null
+@@ -1,246 +0,0 @@
+-#ifndef __LINUX_NETLINK_H
+-#define __LINUX_NETLINK_H
+-
+-#include <linux/kernel.h>
+-#include <linux/socket.h> /* for __kernel_sa_family_t */
+-#include <linux/types.h>
+-
+-#define NETLINK_ROUTE		0	/* Routing/device hook				*/
+-#define NETLINK_UNUSED		1	/* Unused number				*/
+-#define NETLINK_USERSOCK	2	/* Reserved for user mode socket protocols 	*/
+-#define NETLINK_FIREWALL	3	/* Unused number, formerly ip_queue		*/
+-#define NETLINK_SOCK_DIAG	4	/* socket monitoring				*/
+-#define NETLINK_NFLOG		5	/* netfilter/iptables ULOG */
+-#define NETLINK_XFRM		6	/* ipsec */
+-#define NETLINK_SELINUX		7	/* SELinux event notifications */
+-#define NETLINK_ISCSI		8	/* Open-iSCSI */
+-#define NETLINK_AUDIT		9	/* auditing */
+-#define NETLINK_FIB_LOOKUP	10	
+-#define NETLINK_CONNECTOR	11
+-#define NETLINK_NETFILTER	12	/* netfilter subsystem */
+-#define NETLINK_IP6_FW		13
+-#define NETLINK_DNRTMSG		14	/* DECnet routing messages */
+-#define NETLINK_KOBJECT_UEVENT	15	/* Kernel messages to userspace */
+-#define NETLINK_GENERIC		16
+-/* leave room for NETLINK_DM (DM Events) */
+-#define NETLINK_SCSITRANSPORT	18	/* SCSI Transports */
+-#define NETLINK_ECRYPTFS	19
+-#define NETLINK_RDMA		20
+-#define NETLINK_CRYPTO		21	/* Crypto layer */
+-#define NETLINK_SMC		22	/* SMC monitoring */
+-
+-#define NETLINK_INET_DIAG	NETLINK_SOCK_DIAG
+-
+-#define MAX_LINKS 32		
+-
+-struct sockaddr_nl {
+-	__kernel_sa_family_t	nl_family;	/* AF_NETLINK	*/
+-	unsigned short	nl_pad;		/* zero		*/
+-	__u32		nl_pid;		/* port ID	*/
+-       	__u32		nl_groups;	/* multicast groups mask */
+-};
+-
+-struct nlmsghdr {
+-	__u32		nlmsg_len;	/* Length of message including header */
+-	__u16		nlmsg_type;	/* Message content */
+-	__u16		nlmsg_flags;	/* Additional flags */
+-	__u32		nlmsg_seq;	/* Sequence number */
+-	__u32		nlmsg_pid;	/* Sending process port ID */
+-};
+-
+-/* Flags values */
+-
+-#define NLM_F_REQUEST		0x01	/* It is request message. 	*/
+-#define NLM_F_MULTI		0x02	/* Multipart message, terminated by NLMSG_DONE */
+-#define NLM_F_ACK		0x04	/* Reply with ack, with zero or error code */
+-#define NLM_F_ECHO		0x08	/* Echo this request 		*/
+-#define NLM_F_DUMP_INTR		0x10	/* Dump was inconsistent due to sequence change */
+-#define NLM_F_DUMP_FILTERED	0x20	/* Dump was filtered as requested */
+-
+-/* Modifiers to GET request */
+-#define NLM_F_ROOT	0x100	/* specify tree	root	*/
+-#define NLM_F_MATCH	0x200	/* return all matching	*/
+-#define NLM_F_ATOMIC	0x400	/* atomic GET		*/
+-#define NLM_F_DUMP	(NLM_F_ROOT|NLM_F_MATCH)
+-
+-/* Modifiers to NEW request */
+-#define NLM_F_REPLACE	0x100	/* Override existing		*/
+-#define NLM_F_EXCL	0x200	/* Do not touch, if it exists	*/
+-#define NLM_F_CREATE	0x400	/* Create, if it does not exist	*/
+-#define NLM_F_APPEND	0x800	/* Add to end of list		*/
+-
+-/* Modifiers to DELETE request */
+-#define NLM_F_NONREC	0x100	/* Do not delete recursively	*/
+-
+-/* Flags for ACK message */
+-#define NLM_F_CAPPED	0x100	/* request was capped */
+-#define NLM_F_ACK_TLVS	0x200	/* extended ACK TVLs were included */
+-
+-/*
+-   4.4BSD ADD		NLM_F_CREATE|NLM_F_EXCL
+-   4.4BSD CHANGE	NLM_F_REPLACE
+-
+-   True CHANGE		NLM_F_CREATE|NLM_F_REPLACE
+-   Append		NLM_F_CREATE
+-   Check		NLM_F_EXCL
+- */
+-
+-#define NLMSG_ALIGNTO	4U
+-#define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) )
+-#define NLMSG_HDRLEN	 ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr)))
+-#define NLMSG_LENGTH(len) ((len) + NLMSG_HDRLEN)
+-#define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len))
+-#define NLMSG_DATA(nlh)  ((void*)(((char*)nlh) + NLMSG_LENGTH(0)))
+-#define NLMSG_NEXT(nlh,len)	 ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \
+-				  (struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len)))
+-#define NLMSG_OK(nlh,len) ((len) >= (int)sizeof(struct nlmsghdr) && \
+-			   (nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \
+-			   (nlh)->nlmsg_len <= (len))
+-#define NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len)))
+-
+-#define NLMSG_NOOP		0x1	/* Nothing.		*/
+-#define NLMSG_ERROR		0x2	/* Error		*/
+-#define NLMSG_DONE		0x3	/* End of a dump	*/
+-#define NLMSG_OVERRUN		0x4	/* Data lost		*/
+-
+-#define NLMSG_MIN_TYPE		0x10	/* < 0x10: reserved control messages */
+-
+-struct nlmsgerr {
+-	int		error;
+-	struct nlmsghdr msg;
+-	/*
+-	 * followed by the message contents unless NETLINK_CAP_ACK was set
+-	 * or the ACK indicates success (error == 0)
+-	 * message length is aligned with NLMSG_ALIGN()
+-	 */
+-	/*
+-	 * followed by TLVs defined in enum nlmsgerr_attrs
+-	 * if NETLINK_EXT_ACK was set
+-	 */
+-};
+-
+-/**
+- * enum nlmsgerr_attrs - nlmsgerr attributes
+- * @NLMSGERR_ATTR_UNUSED: unused
+- * @NLMSGERR_ATTR_MSG: error message string (string)
+- * @NLMSGERR_ATTR_OFFS: offset of the invalid attribute in the original
+- *	 message, counting from the beginning of the header (u32)
+- * @NLMSGERR_ATTR_COOKIE: arbitrary subsystem specific cookie to
+- *	be used - in the success case - to identify a created
+- *	object or operation or similar (binary)
+- * @__NLMSGERR_ATTR_MAX: number of attributes
+- * @NLMSGERR_ATTR_MAX: highest attribute number
+- */
+-enum nlmsgerr_attrs {
+-	NLMSGERR_ATTR_UNUSED,
+-	NLMSGERR_ATTR_MSG,
+-	NLMSGERR_ATTR_OFFS,
+-	NLMSGERR_ATTR_COOKIE,
+-
+-	__NLMSGERR_ATTR_MAX,
+-	NLMSGERR_ATTR_MAX = __NLMSGERR_ATTR_MAX - 1
+-};
+-
+-#define NETLINK_ADD_MEMBERSHIP		1
+-#define NETLINK_DROP_MEMBERSHIP		2
+-#define NETLINK_PKTINFO			3
+-#define NETLINK_BROADCAST_ERROR		4
+-#define NETLINK_NO_ENOBUFS		5
+-#define NETLINK_RX_RING			6
+-#define NETLINK_TX_RING			7
+-#define NETLINK_LISTEN_ALL_NSID		8
+-#define NETLINK_LIST_MEMBERSHIPS	9
+-#define NETLINK_CAP_ACK			10
+-#define NETLINK_EXT_ACK			11
+-
+-struct nl_pktinfo {
+-	__u32	group;
+-};
+-
+-struct nl_mmap_req {
+-	unsigned int	nm_block_size;
+-	unsigned int	nm_block_nr;
+-	unsigned int	nm_frame_size;
+-	unsigned int	nm_frame_nr;
+-};
+-
+-struct nl_mmap_hdr {
+-	unsigned int	nm_status;
+-	unsigned int	nm_len;
+-	__u32		nm_group;
+-	/* credentials */
+-	__u32		nm_pid;
+-	__u32		nm_uid;
+-	__u32		nm_gid;
+-};
+-
+-enum nl_mmap_status {
+-	NL_MMAP_STATUS_UNUSED,
+-	NL_MMAP_STATUS_RESERVED,
+-	NL_MMAP_STATUS_VALID,
+-	NL_MMAP_STATUS_COPY,
+-	NL_MMAP_STATUS_SKIP,
+-};
+-
+-#define NL_MMAP_MSG_ALIGNMENT		NLMSG_ALIGNTO
+-#define NL_MMAP_MSG_ALIGN(sz)		__ALIGN_KERNEL(sz, NL_MMAP_MSG_ALIGNMENT)
+-#define NL_MMAP_HDRLEN			NL_MMAP_MSG_ALIGN(sizeof(struct nl_mmap_hdr))
+-
+-#define NET_MAJOR 36		/* Major 36 is reserved for networking 						*/
+-
+-enum {
+-	NETLINK_UNCONNECTED = 0,
+-	NETLINK_CONNECTED,
+-};
+-
+-/*
+- *  <------- NLA_HDRLEN ------> <-- NLA_ALIGN(payload)-->
+- * +---------------------+- - -+- - - - - - - - - -+- - -+
+- * |        Header       | Pad |     Payload       | Pad |
+- * |   (struct nlattr)   | ing |                   | ing |
+- * +---------------------+- - -+- - - - - - - - - -+- - -+
+- *  <-------------- nlattr->nla_len -------------->
+- */
+-
+-struct nlattr {
+-	__u16           nla_len;
+-	__u16           nla_type;
+-};
+-
+-/*
+- * nla_type (16 bits)
+- * +---+---+-------------------------------+
+- * | N | O | Attribute Type                |
+- * +---+---+-------------------------------+
+- * N := Carries nested attributes
+- * O := Payload stored in network byte order
+- *
+- * Note: The N and O flag are mutually exclusive.
+- */
+-#define NLA_F_NESTED		(1 << 15)
+-#define NLA_F_NET_BYTEORDER	(1 << 14)
+-#define NLA_TYPE_MASK		~(NLA_F_NESTED | NLA_F_NET_BYTEORDER)
+-
+-#define NLA_ALIGNTO		4
+-#define NLA_ALIGN(len)		(((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1))
+-#define NLA_HDRLEN		((int) NLA_ALIGN(sizeof(struct nlattr)))
+-
+-/* Generic 32 bitflags attribute content sent to the kernel.
+- *
+- * The value is a bitmap that defines the values being set
+- * The selector is a bitmask that defines which value is legit
+- *
+- * Examples:
+- *  value = 0x0, and selector = 0x1
+- *  implies we are selecting bit 1 and we want to set its value to 0.
+- *
+- *  value = 0x2, and selector = 0x2
+- *  implies we are selecting bit 2 and we want to set its value to 1.
+- *
+- */
+-struct nla_bitfield32 {
+-	__u32 value;
+-	__u32 selector;
+-};
+-
+-#endif /* __LINUX_NETLINK_H */
+diff --git a/include/linux/netlink_diag.h b/include/linux/netlink_diag.h
+deleted file mode 100644
+index c8c8c7d..0000000
+--- a/include/linux/netlink_diag.h
++++ /dev/null
+@@ -1,64 +0,0 @@
+-#ifndef __NETLINK_DIAG_H__
+-#define __NETLINK_DIAG_H__
+-
+-#include <linux/types.h>
+-
+-struct netlink_diag_req {
+-	__u8	sdiag_family;
+-	__u8	sdiag_protocol;
+-	__u16	pad;
+-	__u32	ndiag_ino;
+-	__u32	ndiag_show;
+-	__u32	ndiag_cookie[2];
+-};
+-
+-struct netlink_diag_msg {
+-	__u8	ndiag_family;
+-	__u8	ndiag_type;
+-	__u8	ndiag_protocol;
+-	__u8	ndiag_state;
+-
+-	__u32	ndiag_portid;
+-	__u32	ndiag_dst_portid;
+-	__u32	ndiag_dst_group;
+-	__u32	ndiag_ino;
+-	__u32	ndiag_cookie[2];
+-};
+-
+-struct netlink_diag_ring {
+-	__u32	ndr_block_size;
+-	__u32	ndr_block_nr;
+-	__u32	ndr_frame_size;
+-	__u32	ndr_frame_nr;
+-};
+-
+-enum {
+-	/* NETLINK_DIAG_NONE, standard nl API requires this attribute!  */
+-	NETLINK_DIAG_MEMINFO,
+-	NETLINK_DIAG_GROUPS,
+-	NETLINK_DIAG_RX_RING,
+-	NETLINK_DIAG_TX_RING,
+-	NETLINK_DIAG_FLAGS,
+-
+-	__NETLINK_DIAG_MAX,
+-};
+-
+-#define NETLINK_DIAG_MAX (__NETLINK_DIAG_MAX - 1)
+-
+-#define NDIAG_PROTO_ALL		((__u8) ~0)
+-
+-#define NDIAG_SHOW_MEMINFO	0x00000001 /* show memory info of a socket */
+-#define NDIAG_SHOW_GROUPS	0x00000002 /* show groups of a netlink socket */
+-/* deprecated since 4.6 */
+-#define NDIAG_SHOW_RING_CFG	0x00000004 /* show ring configuration */
+-#define NDIAG_SHOW_FLAGS	0x00000008 /* show flags of a netlink socket */
+-
+-/* flags */
+-#define NDIAG_FLAG_CB_RUNNING		0x00000001
+-#define NDIAG_FLAG_PKTINFO		0x00000002
+-#define NDIAG_FLAG_BROADCAST_ERROR	0x00000004
+-#define NDIAG_FLAG_NO_ENOBUFS		0x00000008
+-#define NDIAG_FLAG_LISTEN_ALL_NSID	0x00000010
+-#define NDIAG_FLAG_CAP_ACK		0x00000020
+-
+-#endif
+diff --git a/include/linux/packet_diag.h b/include/linux/packet_diag.h
+deleted file mode 100644
+index 0c5d5dd..0000000
+--- a/include/linux/packet_diag.h
++++ /dev/null
+@@ -1,80 +0,0 @@
+-#ifndef __PACKET_DIAG_H__
+-#define __PACKET_DIAG_H__
+-
+-#include <linux/types.h>
+-
+-struct packet_diag_req {
+-	__u8	sdiag_family;
+-	__u8	sdiag_protocol;
+-	__u16	pad;
+-	__u32	pdiag_ino;
+-	__u32	pdiag_show;
+-	__u32	pdiag_cookie[2];
+-};
+-
+-#define PACKET_SHOW_INFO	0x00000001 /* Basic packet_sk information */
+-#define PACKET_SHOW_MCLIST	0x00000002 /* A set of packet_diag_mclist-s */
+-#define PACKET_SHOW_RING_CFG	0x00000004 /* Rings configuration parameters */
+-#define PACKET_SHOW_FANOUT	0x00000008
+-#define PACKET_SHOW_MEMINFO	0x00000010
+-#define PACKET_SHOW_FILTER	0x00000020
+-
+-struct packet_diag_msg {
+-	__u8	pdiag_family;
+-	__u8	pdiag_type;
+-	__u16	pdiag_num;
+-
+-	__u32	pdiag_ino;
+-	__u32	pdiag_cookie[2];
+-};
+-
+-enum {
+-	/* PACKET_DIAG_NONE, standard nl API requires this attribute!  */
+-	PACKET_DIAG_INFO,
+-	PACKET_DIAG_MCLIST,
+-	PACKET_DIAG_RX_RING,
+-	PACKET_DIAG_TX_RING,
+-	PACKET_DIAG_FANOUT,
+-	PACKET_DIAG_UID,
+-	PACKET_DIAG_MEMINFO,
+-	PACKET_DIAG_FILTER,
+-
+-	__PACKET_DIAG_MAX,
+-};
+-
+-#define PACKET_DIAG_MAX (__PACKET_DIAG_MAX - 1)
+-
+-struct packet_diag_info {
+-	__u32	pdi_index;
+-	__u32	pdi_version;
+-	__u32	pdi_reserve;
+-	__u32	pdi_copy_thresh;
+-	__u32	pdi_tstamp;
+-	__u32	pdi_flags;
+-
+-#define PDI_RUNNING	0x1
+-#define PDI_AUXDATA	0x2
+-#define PDI_ORIGDEV	0x4
+-#define PDI_VNETHDR	0x8
+-#define PDI_LOSS	0x10
+-};
+-
+-struct packet_diag_mclist {
+-	__u32	pdmc_index;
+-	__u32	pdmc_count;
+-	__u16	pdmc_type;
+-	__u16	pdmc_alen;
+-	__u8	pdmc_addr[32]; /* MAX_ADDR_LEN */
+-};
+-
+-struct packet_diag_ring {
+-	__u32	pdr_block_size;
+-	__u32	pdr_block_nr;
+-	__u32	pdr_frame_size;
+-	__u32	pdr_frame_nr;
+-	__u32	pdr_retire_tmo;
+-	__u32	pdr_sizeof_priv;
+-	__u32	pdr_features;
+-};
+-
+-#endif
+diff --git a/include/linux/param.h b/include/linux/param.h
+deleted file mode 100644
+index 092e92f..0000000
+--- a/include/linux/param.h
++++ /dev/null
+@@ -1,6 +0,0 @@
+-#ifndef _LINUX_PARAM_H
+-#define _LINUX_PARAM_H
+-
+-#include <asm/param.h>
+-
+-#endif
+diff --git a/include/linux/pfkeyv2.h b/include/linux/pfkeyv2.h
+deleted file mode 100644
+index ada7f01..0000000
+--- a/include/linux/pfkeyv2.h
++++ /dev/null
+@@ -1,383 +0,0 @@
+-/* PF_KEY user interface, this is defined by rfc2367 so
+- * do not make arbitrary modifications or else this header
+- * file will not be compliant.
+- */
+-
+-#ifndef _LINUX_PFKEY2_H
+-#define _LINUX_PFKEY2_H
+-
+-#include <linux/types.h>
+-
+-#define PF_KEY_V2		2
+-#define PFKEYV2_REVISION	199806L
+-
+-struct sadb_msg {
+-	__u8		sadb_msg_version;
+-	__u8		sadb_msg_type;
+-	__u8		sadb_msg_errno;
+-	__u8		sadb_msg_satype;
+-	__u16	sadb_msg_len;
+-	__u16	sadb_msg_reserved;
+-	__u32	sadb_msg_seq;
+-	__u32	sadb_msg_pid;
+-} __attribute__((packed));
+-/* sizeof(struct sadb_msg) == 16 */
+-
+-struct sadb_ext {
+-	__u16	sadb_ext_len;
+-	__u16	sadb_ext_type;
+-} __attribute__((packed));
+-/* sizeof(struct sadb_ext) == 4 */
+-
+-struct sadb_sa {
+-	__u16	sadb_sa_len;
+-	__u16	sadb_sa_exttype;
+-	__be32		sadb_sa_spi;
+-	__u8		sadb_sa_replay;
+-	__u8		sadb_sa_state;
+-	__u8		sadb_sa_auth;
+-	__u8		sadb_sa_encrypt;
+-	__u32	sadb_sa_flags;
+-} __attribute__((packed));
+-/* sizeof(struct sadb_sa) == 16 */
+-
+-struct sadb_lifetime {
+-	__u16	sadb_lifetime_len;
+-	__u16	sadb_lifetime_exttype;
+-	__u32	sadb_lifetime_allocations;
+-	__u64	sadb_lifetime_bytes;
+-	__u64	sadb_lifetime_addtime;
+-	__u64	sadb_lifetime_usetime;
+-} __attribute__((packed));
+-/* sizeof(struct sadb_lifetime) == 32 */
+-
+-struct sadb_address {
+-	__u16	sadb_address_len;
+-	__u16	sadb_address_exttype;
+-	__u8		sadb_address_proto;
+-	__u8		sadb_address_prefixlen;
+-	__u16	sadb_address_reserved;
+-} __attribute__((packed));
+-/* sizeof(struct sadb_address) == 8 */
+-
+-struct sadb_key {
+-	__u16	sadb_key_len;
+-	__u16	sadb_key_exttype;
+-	__u16	sadb_key_bits;
+-	__u16	sadb_key_reserved;
+-} __attribute__((packed));
+-/* sizeof(struct sadb_key) == 8 */
+-
+-struct sadb_ident {
+-	__u16	sadb_ident_len;
+-	__u16	sadb_ident_exttype;
+-	__u16	sadb_ident_type;
+-	__u16	sadb_ident_reserved;
+-	__u64	sadb_ident_id;
+-} __attribute__((packed));
+-/* sizeof(struct sadb_ident) == 16 */
+-
+-struct sadb_sens {
+-	__u16	sadb_sens_len;
+-	__u16	sadb_sens_exttype;
+-	__u32	sadb_sens_dpd;
+-	__u8		sadb_sens_sens_level;
+-	__u8		sadb_sens_sens_len;
+-	__u8		sadb_sens_integ_level;
+-	__u8		sadb_sens_integ_len;
+-	__u32	sadb_sens_reserved;
+-} __attribute__((packed));
+-/* sizeof(struct sadb_sens) == 16 */
+-
+-/* followed by:
+-	__u64	sadb_sens_bitmap[sens_len];
+-	__u64	sadb_integ_bitmap[integ_len];  */
+-
+-struct sadb_prop {
+-	__u16	sadb_prop_len;
+-	__u16	sadb_prop_exttype;
+-	__u8		sadb_prop_replay;
+-	__u8		sadb_prop_reserved[3];
+-} __attribute__((packed));
+-/* sizeof(struct sadb_prop) == 8 */
+-
+-/* followed by:
+-	struct sadb_comb sadb_combs[(sadb_prop_len +
+-		sizeof(__u64) - sizeof(struct sadb_prop)) /
+-		sizeof(struct sadb_comb)]; */
+-
+-struct sadb_comb {
+-	__u8		sadb_comb_auth;
+-	__u8		sadb_comb_encrypt;
+-	__u16	sadb_comb_flags;
+-	__u16	sadb_comb_auth_minbits;
+-	__u16	sadb_comb_auth_maxbits;
+-	__u16	sadb_comb_encrypt_minbits;
+-	__u16	sadb_comb_encrypt_maxbits;
+-	__u32	sadb_comb_reserved;
+-	__u32	sadb_comb_soft_allocations;
+-	__u32	sadb_comb_hard_allocations;
+-	__u64	sadb_comb_soft_bytes;
+-	__u64	sadb_comb_hard_bytes;
+-	__u64	sadb_comb_soft_addtime;
+-	__u64	sadb_comb_hard_addtime;
+-	__u64	sadb_comb_soft_usetime;
+-	__u64	sadb_comb_hard_usetime;
+-} __attribute__((packed));
+-/* sizeof(struct sadb_comb) == 72 */
+-
+-struct sadb_supported {
+-	__u16	sadb_supported_len;
+-	__u16	sadb_supported_exttype;
+-	__u32	sadb_supported_reserved;
+-} __attribute__((packed));
+-/* sizeof(struct sadb_supported) == 8 */
+-
+-/* followed by:
+-	struct sadb_alg sadb_algs[(sadb_supported_len +
+-		sizeof(__u64) - sizeof(struct sadb_supported)) /
+-		sizeof(struct sadb_alg)]; */
+-
+-struct sadb_alg {
+-	__u8		sadb_alg_id;
+-	__u8		sadb_alg_ivlen;
+-	__u16	sadb_alg_minbits;
+-	__u16	sadb_alg_maxbits;
+-	__u16	sadb_alg_reserved;
+-} __attribute__((packed));
+-/* sizeof(struct sadb_alg) == 8 */
+-
+-struct sadb_spirange {
+-	__u16	sadb_spirange_len;
+-	__u16	sadb_spirange_exttype;
+-	__u32	sadb_spirange_min;
+-	__u32	sadb_spirange_max;
+-	__u32	sadb_spirange_reserved;
+-} __attribute__((packed));
+-/* sizeof(struct sadb_spirange) == 16 */
+-
+-struct sadb_x_kmprivate {
+-	__u16	sadb_x_kmprivate_len;
+-	__u16	sadb_x_kmprivate_exttype;
+-	__u32	sadb_x_kmprivate_reserved;
+-} __attribute__((packed));
+-/* sizeof(struct sadb_x_kmprivate) == 8 */
+-
+-struct sadb_x_sa2 {
+-	__u16	sadb_x_sa2_len;
+-	__u16	sadb_x_sa2_exttype;
+-	__u8		sadb_x_sa2_mode;
+-	__u8		sadb_x_sa2_reserved1;
+-	__u16	sadb_x_sa2_reserved2;
+-	__u32	sadb_x_sa2_sequence;
+-	__u32	sadb_x_sa2_reqid;
+-} __attribute__((packed));
+-/* sizeof(struct sadb_x_sa2) == 16 */
+-
+-struct sadb_x_policy {
+-	__u16	sadb_x_policy_len;
+-	__u16	sadb_x_policy_exttype;
+-	__u16	sadb_x_policy_type;
+-	__u8		sadb_x_policy_dir;
+-	__u8		sadb_x_policy_reserved;
+-	__u32	sadb_x_policy_id;
+-	__u32	sadb_x_policy_priority;
+-} __attribute__((packed));
+-/* sizeof(struct sadb_x_policy) == 16 */
+-
+-struct sadb_x_ipsecrequest {
+-	__u16	sadb_x_ipsecrequest_len;
+-	__u16	sadb_x_ipsecrequest_proto;
+-	__u8		sadb_x_ipsecrequest_mode;
+-	__u8		sadb_x_ipsecrequest_level;
+-	__u16	sadb_x_ipsecrequest_reserved1;
+-	__u32	sadb_x_ipsecrequest_reqid;
+-	__u32	sadb_x_ipsecrequest_reserved2;
+-} __attribute__((packed));
+-/* sizeof(struct sadb_x_ipsecrequest) == 16 */
+-
+-/* This defines the TYPE of Nat Traversal in use.  Currently only one
+- * type of NAT-T is supported, draft-ietf-ipsec-udp-encaps-06
+- */
+-struct sadb_x_nat_t_type {
+-	__u16	sadb_x_nat_t_type_len;
+-	__u16	sadb_x_nat_t_type_exttype;
+-	__u8		sadb_x_nat_t_type_type;
+-	__u8		sadb_x_nat_t_type_reserved[3];
+-} __attribute__((packed));
+-/* sizeof(struct sadb_x_nat_t_type) == 8 */
+-
+-/* Pass a NAT Traversal port (Source or Dest port) */
+-struct sadb_x_nat_t_port {
+-	__u16	sadb_x_nat_t_port_len;
+-	__u16	sadb_x_nat_t_port_exttype;
+-	__be16		sadb_x_nat_t_port_port;
+-	__u16	sadb_x_nat_t_port_reserved;
+-} __attribute__((packed));
+-/* sizeof(struct sadb_x_nat_t_port) == 8 */
+-
+-/* Generic LSM security context */
+-struct sadb_x_sec_ctx {
+-	__u16	sadb_x_sec_len;
+-	__u16	sadb_x_sec_exttype;
+-	__u8		sadb_x_ctx_alg;  /* LSMs: e.g., selinux == 1 */
+-	__u8		sadb_x_ctx_doi;
+-	__u16	sadb_x_ctx_len;
+-} __attribute__((packed));
+-/* sizeof(struct sadb_sec_ctx) = 8 */
+-
+-/* Used by MIGRATE to pass addresses IKE will use to perform
+- * negotiation with the peer */
+-struct sadb_x_kmaddress {
+-	__u16	sadb_x_kmaddress_len;
+-	__u16	sadb_x_kmaddress_exttype;
+-	__u32	sadb_x_kmaddress_reserved;
+-} __attribute__((packed));
+-/* sizeof(struct sadb_x_kmaddress) == 8 */
+-
+-/* To specify the SA dump filter */
+-struct sadb_x_filter {
+-	__u16	sadb_x_filter_len;
+-	__u16	sadb_x_filter_exttype;
+-	__u32	sadb_x_filter_saddr[4];
+-	__u32	sadb_x_filter_daddr[4];
+-	__u16	sadb_x_filter_family;
+-	__u8	sadb_x_filter_splen;
+-	__u8	sadb_x_filter_dplen;
+-} __attribute__((packed));
+-/* sizeof(struct sadb_x_filter) == 40 */
+-
+-/* Message types */
+-#define SADB_RESERVED		0
+-#define SADB_GETSPI		1
+-#define SADB_UPDATE		2
+-#define SADB_ADD		3
+-#define SADB_DELETE		4
+-#define SADB_GET		5
+-#define SADB_ACQUIRE		6
+-#define SADB_REGISTER		7
+-#define SADB_EXPIRE		8
+-#define SADB_FLUSH		9
+-#define SADB_DUMP		10
+-#define SADB_X_PROMISC		11
+-#define SADB_X_PCHANGE		12
+-#define SADB_X_SPDUPDATE	13
+-#define SADB_X_SPDADD		14
+-#define SADB_X_SPDDELETE	15
+-#define SADB_X_SPDGET		16
+-#define SADB_X_SPDACQUIRE	17
+-#define SADB_X_SPDDUMP		18
+-#define SADB_X_SPDFLUSH		19
+-#define SADB_X_SPDSETIDX	20
+-#define SADB_X_SPDEXPIRE	21
+-#define SADB_X_SPDDELETE2	22
+-#define SADB_X_NAT_T_NEW_MAPPING	23
+-#define SADB_X_MIGRATE		24
+-#define SADB_MAX		24
+-
+-/* Security Association flags */
+-#define SADB_SAFLAGS_PFS	1
+-#define SADB_SAFLAGS_NOPMTUDISC	0x20000000
+-#define SADB_SAFLAGS_DECAP_DSCP	0x40000000
+-#define SADB_SAFLAGS_NOECN	0x80000000
+-
+-/* Security Association states */
+-#define SADB_SASTATE_LARVAL	0
+-#define SADB_SASTATE_MATURE	1
+-#define SADB_SASTATE_DYING	2
+-#define SADB_SASTATE_DEAD	3
+-#define SADB_SASTATE_MAX	3
+-
+-/* Security Association types */
+-#define SADB_SATYPE_UNSPEC	0
+-#define SADB_SATYPE_AH		2
+-#define SADB_SATYPE_ESP		3
+-#define SADB_SATYPE_RSVP	5
+-#define SADB_SATYPE_OSPFV2	6
+-#define SADB_SATYPE_RIPV2	7
+-#define SADB_SATYPE_MIP		8
+-#define SADB_X_SATYPE_IPCOMP	9
+-#define SADB_SATYPE_MAX		9
+-
+-/* Authentication algorithms */
+-#define SADB_AALG_NONE			0
+-#define SADB_AALG_MD5HMAC		2
+-#define SADB_AALG_SHA1HMAC		3
+-#define SADB_X_AALG_SHA2_256HMAC	5
+-#define SADB_X_AALG_SHA2_384HMAC	6
+-#define SADB_X_AALG_SHA2_512HMAC	7
+-#define SADB_X_AALG_RIPEMD160HMAC	8
+-#define SADB_X_AALG_AES_XCBC_MAC	9
+-#define SADB_X_AALG_NULL		251	/* kame */
+-#define SADB_AALG_MAX			251
+-
+-/* Encryption algorithms */
+-#define SADB_EALG_NONE			0
+-#define SADB_EALG_DESCBC		2
+-#define SADB_EALG_3DESCBC		3
+-#define SADB_X_EALG_CASTCBC		6
+-#define SADB_X_EALG_BLOWFISHCBC		7
+-#define SADB_EALG_NULL			11
+-#define SADB_X_EALG_AESCBC		12
+-#define SADB_X_EALG_AESCTR		13
+-#define SADB_X_EALG_AES_CCM_ICV8	14
+-#define SADB_X_EALG_AES_CCM_ICV12	15
+-#define SADB_X_EALG_AES_CCM_ICV16	16
+-#define SADB_X_EALG_AES_GCM_ICV8	18
+-#define SADB_X_EALG_AES_GCM_ICV12	19
+-#define SADB_X_EALG_AES_GCM_ICV16	20
+-#define SADB_X_EALG_CAMELLIACBC		22
+-#define SADB_X_EALG_NULL_AES_GMAC	23
+-#define SADB_EALG_MAX                   253 /* last EALG */
+-/* private allocations should use 249-255 (RFC2407) */
+-#define SADB_X_EALG_SERPENTCBC  252     /* draft-ietf-ipsec-ciph-aes-cbc-00 */
+-#define SADB_X_EALG_TWOFISHCBC  253     /* draft-ietf-ipsec-ciph-aes-cbc-00 */
+-
+-/* Compression algorithms */
+-#define SADB_X_CALG_NONE		0
+-#define SADB_X_CALG_OUI			1
+-#define SADB_X_CALG_DEFLATE		2
+-#define SADB_X_CALG_LZS			3
+-#define SADB_X_CALG_LZJH		4
+-#define SADB_X_CALG_MAX			4
+-
+-/* Extension Header values */
+-#define SADB_EXT_RESERVED		0
+-#define SADB_EXT_SA			1
+-#define SADB_EXT_LIFETIME_CURRENT	2
+-#define SADB_EXT_LIFETIME_HARD		3
+-#define SADB_EXT_LIFETIME_SOFT		4
+-#define SADB_EXT_ADDRESS_SRC		5
+-#define SADB_EXT_ADDRESS_DST		6
+-#define SADB_EXT_ADDRESS_PROXY		7
+-#define SADB_EXT_KEY_AUTH		8
+-#define SADB_EXT_KEY_ENCRYPT		9
+-#define SADB_EXT_IDENTITY_SRC		10
+-#define SADB_EXT_IDENTITY_DST		11
+-#define SADB_EXT_SENSITIVITY		12
+-#define SADB_EXT_PROPOSAL		13
+-#define SADB_EXT_SUPPORTED_AUTH		14
+-#define SADB_EXT_SUPPORTED_ENCRYPT	15
+-#define SADB_EXT_SPIRANGE		16
+-#define SADB_X_EXT_KMPRIVATE		17
+-#define SADB_X_EXT_POLICY		18
+-#define SADB_X_EXT_SA2			19
+-/* The next four entries are for setting up NAT Traversal */
+-#define SADB_X_EXT_NAT_T_TYPE		20
+-#define SADB_X_EXT_NAT_T_SPORT		21
+-#define SADB_X_EXT_NAT_T_DPORT		22
+-#define SADB_X_EXT_NAT_T_OA		23
+-#define SADB_X_EXT_SEC_CTX		24
+-/* Used with MIGRATE to pass @ to IKE for negotiation */
+-#define SADB_X_EXT_KMADDRESS		25
+-#define SADB_X_EXT_FILTER		26
+-#define SADB_EXT_MAX			26
+-
+-/* Identity Extension values */
+-#define SADB_IDENTTYPE_RESERVED	0
+-#define SADB_IDENTTYPE_PREFIX	1
+-#define SADB_IDENTTYPE_FQDN	2
+-#define SADB_IDENTTYPE_USERFQDN	3
+-#define SADB_IDENTTYPE_MAX	3
+-
+-#endif /* !(_LINUX_PFKEY2_H) */
+diff --git a/include/linux/pkt_cls.h b/include/linux/pkt_cls.h
+deleted file mode 100644
+index d5e2bf6..0000000
+--- a/include/linux/pkt_cls.h
++++ /dev/null
+@@ -1,569 +0,0 @@
+-#ifndef __LINUX_PKT_CLS_H
+-#define __LINUX_PKT_CLS_H
+-
+-#include <linux/types.h>
+-#include <linux/pkt_sched.h>
+-
+-#define TC_COOKIE_MAX_SIZE 16
+-
+-/* Action attributes */
+-enum {
+-	TCA_ACT_UNSPEC,
+-	TCA_ACT_KIND,
+-	TCA_ACT_OPTIONS,
+-	TCA_ACT_INDEX,
+-	TCA_ACT_STATS,
+-	TCA_ACT_PAD,
+-	TCA_ACT_COOKIE,
+-	__TCA_ACT_MAX
+-};
+-
+-#define TCA_ACT_MAX __TCA_ACT_MAX
+-#define TCA_OLD_COMPAT (TCA_ACT_MAX+1)
+-#define TCA_ACT_MAX_PRIO 32
+-#define TCA_ACT_BIND	1
+-#define TCA_ACT_NOBIND	0
+-#define TCA_ACT_UNBIND	1
+-#define TCA_ACT_NOUNBIND	0
+-#define TCA_ACT_REPLACE		1
+-#define TCA_ACT_NOREPLACE	0
+-
+-#define TC_ACT_UNSPEC	(-1)
+-#define TC_ACT_OK		0
+-#define TC_ACT_RECLASSIFY	1
+-#define TC_ACT_SHOT		2
+-#define TC_ACT_PIPE		3
+-#define TC_ACT_STOLEN		4
+-#define TC_ACT_QUEUED		5
+-#define TC_ACT_REPEAT		6
+-#define TC_ACT_REDIRECT		7
+-#define TC_ACT_TRAP		8 /* For hw path, this means "trap to cpu"
+-				   * and don't further process the frame
+-				   * in hardware. For sw path, this is
+-				   * equivalent of TC_ACT_STOLEN - drop
+-				   * the skb and act like everything
+-				   * is alright.
+-				   */
+-
+-/* There is a special kind of actions called "extended actions",
+- * which need a value parameter. These have a local opcode located in
+- * the highest nibble, starting from 1. The rest of the bits
+- * are used to carry the value. These two parts together make
+- * a combined opcode.
+- */
+-#define __TC_ACT_EXT_SHIFT 28
+-#define __TC_ACT_EXT(local) ((local) << __TC_ACT_EXT_SHIFT)
+-#define TC_ACT_EXT_VAL_MASK ((1 << __TC_ACT_EXT_SHIFT) - 1)
+-#define TC_ACT_EXT_CMP(combined, opcode) \
+-	(((combined) & (~TC_ACT_EXT_VAL_MASK)) == opcode)
+-
+-#define TC_ACT_JUMP __TC_ACT_EXT(1)
+-#define TC_ACT_GOTO_CHAIN __TC_ACT_EXT(2)
+-
+-/* Action type identifiers*/
+-enum {
+-	TCA_ID_UNSPEC=0,
+-	TCA_ID_POLICE=1,
+-	/* other actions go here */
+-	__TCA_ID_MAX=255
+-};
+-
+-#define TCA_ID_MAX __TCA_ID_MAX
+-
+-struct tc_police {
+-	__u32			index;
+-	int			action;
+-#define TC_POLICE_UNSPEC	TC_ACT_UNSPEC
+-#define TC_POLICE_OK		TC_ACT_OK
+-#define TC_POLICE_RECLASSIFY	TC_ACT_RECLASSIFY
+-#define TC_POLICE_SHOT		TC_ACT_SHOT
+-#define TC_POLICE_PIPE		TC_ACT_PIPE
+-
+-	__u32			limit;
+-	__u32			burst;
+-	__u32			mtu;
+-	struct tc_ratespec	rate;
+-	struct tc_ratespec	peakrate;
+-	int			refcnt;
+-	int			bindcnt;
+-	__u32			capab;
+-};
+-
+-struct tcf_t {
+-	__u64   install;
+-	__u64   lastuse;
+-	__u64   expires;
+-	__u64   firstuse;
+-};
+-
+-struct tc_cnt {
+-	int                   refcnt;
+-	int                   bindcnt;
+-};
+-
+-#define tc_gen \
+-	__u32                 index; \
+-	__u32                 capab; \
+-	int                   action; \
+-	int                   refcnt; \
+-	int                   bindcnt
+-
+-enum {
+-	TCA_POLICE_UNSPEC,
+-	TCA_POLICE_TBF,
+-	TCA_POLICE_RATE,
+-	TCA_POLICE_PEAKRATE,
+-	TCA_POLICE_AVRATE,
+-	TCA_POLICE_RESULT,
+-	TCA_POLICE_TM,
+-	TCA_POLICE_PAD,
+-	__TCA_POLICE_MAX
+-#define TCA_POLICE_RESULT TCA_POLICE_RESULT
+-};
+-
+-#define TCA_POLICE_MAX (__TCA_POLICE_MAX - 1)
+-
+-/* tca flags definitions */
+-#define TCA_CLS_FLAGS_SKIP_HW	(1 << 0) /* don't offload filter to HW */
+-#define TCA_CLS_FLAGS_SKIP_SW	(1 << 1) /* don't use filter in SW */
+-#define TCA_CLS_FLAGS_IN_HW	(1 << 2) /* filter is offloaded to HW */
+-#define TCA_CLS_FLAGS_NOT_IN_HW (1 << 3) /* filter isn't offloaded to HW */
+-
+-/* U32 filters */
+-
+-#define TC_U32_HTID(h) ((h)&0xFFF00000)
+-#define TC_U32_USERHTID(h) (TC_U32_HTID(h)>>20)
+-#define TC_U32_HASH(h) (((h)>>12)&0xFF)
+-#define TC_U32_NODE(h) ((h)&0xFFF)
+-#define TC_U32_KEY(h) ((h)&0xFFFFF)
+-#define TC_U32_UNSPEC	0
+-#define TC_U32_ROOT	(0xFFF00000)
+-
+-enum {
+-	TCA_U32_UNSPEC,
+-	TCA_U32_CLASSID,
+-	TCA_U32_HASH,
+-	TCA_U32_LINK,
+-	TCA_U32_DIVISOR,
+-	TCA_U32_SEL,
+-	TCA_U32_POLICE,
+-	TCA_U32_ACT,
+-	TCA_U32_INDEV,
+-	TCA_U32_PCNT,
+-	TCA_U32_MARK,
+-	TCA_U32_FLAGS,
+-	TCA_U32_PAD,
+-	__TCA_U32_MAX
+-};
+-
+-#define TCA_U32_MAX (__TCA_U32_MAX - 1)
+-
+-struct tc_u32_key {
+-	__be32		mask;
+-	__be32		val;
+-	int		off;
+-	int		offmask;
+-};
+-
+-struct tc_u32_sel {
+-	unsigned char		flags;
+-	unsigned char		offshift;
+-	unsigned char		nkeys;
+-
+-	__be16			offmask;
+-	__u16			off;
+-	short			offoff;
+-
+-	short			hoff;
+-	__be32			hmask;
+-	struct tc_u32_key	keys[0];
+-};
+-
+-struct tc_u32_mark {
+-	__u32		val;
+-	__u32		mask;
+-	__u32		success;
+-};
+-
+-struct tc_u32_pcnt {
+-	__u64 rcnt;
+-	__u64 rhit;
+-	__u64 kcnts[0];
+-};
+-
+-/* Flags */
+-
+-#define TC_U32_TERMINAL		1
+-#define TC_U32_OFFSET		2
+-#define TC_U32_VAROFFSET	4
+-#define TC_U32_EAT		8
+-
+-#define TC_U32_MAXDEPTH 8
+-
+-
+-/* RSVP filter */
+-
+-enum {
+-	TCA_RSVP_UNSPEC,
+-	TCA_RSVP_CLASSID,
+-	TCA_RSVP_DST,
+-	TCA_RSVP_SRC,
+-	TCA_RSVP_PINFO,
+-	TCA_RSVP_POLICE,
+-	TCA_RSVP_ACT,
+-	__TCA_RSVP_MAX
+-};
+-
+-#define TCA_RSVP_MAX (__TCA_RSVP_MAX - 1 )
+-
+-struct tc_rsvp_gpi {
+-	__u32	key;
+-	__u32	mask;
+-	int	offset;
+-};
+-
+-struct tc_rsvp_pinfo {
+-	struct tc_rsvp_gpi dpi;
+-	struct tc_rsvp_gpi spi;
+-	__u8	protocol;
+-	__u8	tunnelid;
+-	__u8	tunnelhdr;
+-	__u8	pad;
+-};
+-
+-/* ROUTE filter */
+-
+-enum {
+-	TCA_ROUTE4_UNSPEC,
+-	TCA_ROUTE4_CLASSID,
+-	TCA_ROUTE4_TO,
+-	TCA_ROUTE4_FROM,
+-	TCA_ROUTE4_IIF,
+-	TCA_ROUTE4_POLICE,
+-	TCA_ROUTE4_ACT,
+-	__TCA_ROUTE4_MAX
+-};
+-
+-#define TCA_ROUTE4_MAX (__TCA_ROUTE4_MAX - 1)
+-
+-
+-/* FW filter */
+-
+-enum {
+-	TCA_FW_UNSPEC,
+-	TCA_FW_CLASSID,
+-	TCA_FW_POLICE,
+-	TCA_FW_INDEV, /*  used by CONFIG_NET_CLS_IND */
+-	TCA_FW_ACT, /* used by CONFIG_NET_CLS_ACT */
+-	TCA_FW_MASK,
+-	__TCA_FW_MAX
+-};
+-
+-#define TCA_FW_MAX (__TCA_FW_MAX - 1)
+-
+-/* TC index filter */
+-
+-enum {
+-	TCA_TCINDEX_UNSPEC,
+-	TCA_TCINDEX_HASH,
+-	TCA_TCINDEX_MASK,
+-	TCA_TCINDEX_SHIFT,
+-	TCA_TCINDEX_FALL_THROUGH,
+-	TCA_TCINDEX_CLASSID,
+-	TCA_TCINDEX_POLICE,
+-	TCA_TCINDEX_ACT,
+-	__TCA_TCINDEX_MAX
+-};
+-
+-#define TCA_TCINDEX_MAX     (__TCA_TCINDEX_MAX - 1)
+-
+-/* Flow filter */
+-
+-enum {
+-	FLOW_KEY_SRC,
+-	FLOW_KEY_DST,
+-	FLOW_KEY_PROTO,
+-	FLOW_KEY_PROTO_SRC,
+-	FLOW_KEY_PROTO_DST,
+-	FLOW_KEY_IIF,
+-	FLOW_KEY_PRIORITY,
+-	FLOW_KEY_MARK,
+-	FLOW_KEY_NFCT,
+-	FLOW_KEY_NFCT_SRC,
+-	FLOW_KEY_NFCT_DST,
+-	FLOW_KEY_NFCT_PROTO_SRC,
+-	FLOW_KEY_NFCT_PROTO_DST,
+-	FLOW_KEY_RTCLASSID,
+-	FLOW_KEY_SKUID,
+-	FLOW_KEY_SKGID,
+-	FLOW_KEY_VLAN_TAG,
+-	FLOW_KEY_RXHASH,
+-	__FLOW_KEY_MAX,
+-};
+-
+-#define FLOW_KEY_MAX	(__FLOW_KEY_MAX - 1)
+-
+-enum {
+-	FLOW_MODE_MAP,
+-	FLOW_MODE_HASH,
+-};
+-
+-enum {
+-	TCA_FLOW_UNSPEC,
+-	TCA_FLOW_KEYS,
+-	TCA_FLOW_MODE,
+-	TCA_FLOW_BASECLASS,
+-	TCA_FLOW_RSHIFT,
+-	TCA_FLOW_ADDEND,
+-	TCA_FLOW_MASK,
+-	TCA_FLOW_XOR,
+-	TCA_FLOW_DIVISOR,
+-	TCA_FLOW_ACT,
+-	TCA_FLOW_POLICE,
+-	TCA_FLOW_EMATCHES,
+-	TCA_FLOW_PERTURB,
+-	__TCA_FLOW_MAX
+-};
+-
+-#define TCA_FLOW_MAX	(__TCA_FLOW_MAX - 1)
+-
+-/* Basic filter */
+-
+-enum {
+-	TCA_BASIC_UNSPEC,
+-	TCA_BASIC_CLASSID,
+-	TCA_BASIC_EMATCHES,
+-	TCA_BASIC_ACT,
+-	TCA_BASIC_POLICE,
+-	__TCA_BASIC_MAX
+-};
+-
+-#define TCA_BASIC_MAX (__TCA_BASIC_MAX - 1)
+-
+-
+-/* Cgroup classifier */
+-
+-enum {
+-	TCA_CGROUP_UNSPEC,
+-	TCA_CGROUP_ACT,
+-	TCA_CGROUP_POLICE,
+-	TCA_CGROUP_EMATCHES,
+-	__TCA_CGROUP_MAX,
+-};
+-
+-#define TCA_CGROUP_MAX (__TCA_CGROUP_MAX - 1)
+-
+-/* BPF classifier */
+-
+-#define TCA_BPF_FLAG_ACT_DIRECT		(1 << 0)
+-
+-enum {
+-	TCA_BPF_UNSPEC,
+-	TCA_BPF_ACT,
+-	TCA_BPF_POLICE,
+-	TCA_BPF_CLASSID,
+-	TCA_BPF_OPS_LEN,
+-	TCA_BPF_OPS,
+-	TCA_BPF_FD,
+-	TCA_BPF_NAME,
+-	TCA_BPF_FLAGS,
+-	TCA_BPF_FLAGS_GEN,
+-	TCA_BPF_TAG,
+-	TCA_BPF_ID,
+-	__TCA_BPF_MAX,
+-};
+-
+-#define TCA_BPF_MAX (__TCA_BPF_MAX - 1)
+-
+-/* Flower classifier */
+-
+-enum {
+-	TCA_FLOWER_UNSPEC,
+-	TCA_FLOWER_CLASSID,
+-	TCA_FLOWER_INDEV,
+-	TCA_FLOWER_ACT,
+-	TCA_FLOWER_KEY_ETH_DST,		/* ETH_ALEN */
+-	TCA_FLOWER_KEY_ETH_DST_MASK,	/* ETH_ALEN */
+-	TCA_FLOWER_KEY_ETH_SRC,		/* ETH_ALEN */
+-	TCA_FLOWER_KEY_ETH_SRC_MASK,	/* ETH_ALEN */
+-	TCA_FLOWER_KEY_ETH_TYPE,	/* be16 */
+-	TCA_FLOWER_KEY_IP_PROTO,	/* u8 */
+-	TCA_FLOWER_KEY_IPV4_SRC,	/* be32 */
+-	TCA_FLOWER_KEY_IPV4_SRC_MASK,	/* be32 */
+-	TCA_FLOWER_KEY_IPV4_DST,	/* be32 */
+-	TCA_FLOWER_KEY_IPV4_DST_MASK,	/* be32 */
+-	TCA_FLOWER_KEY_IPV6_SRC,	/* struct in6_addr */
+-	TCA_FLOWER_KEY_IPV6_SRC_MASK,	/* struct in6_addr */
+-	TCA_FLOWER_KEY_IPV6_DST,	/* struct in6_addr */
+-	TCA_FLOWER_KEY_IPV6_DST_MASK,	/* struct in6_addr */
+-	TCA_FLOWER_KEY_TCP_SRC,		/* be16 */
+-	TCA_FLOWER_KEY_TCP_DST,		/* be16 */
+-	TCA_FLOWER_KEY_UDP_SRC,		/* be16 */
+-	TCA_FLOWER_KEY_UDP_DST,		/* be16 */
+-
+-	TCA_FLOWER_FLAGS,
+-	TCA_FLOWER_KEY_VLAN_ID,		/* be16 */
+-	TCA_FLOWER_KEY_VLAN_PRIO,	/* u8   */
+-	TCA_FLOWER_KEY_VLAN_ETH_TYPE,	/* be16 */
+-
+-	TCA_FLOWER_KEY_ENC_KEY_ID,	/* be32 */
+-	TCA_FLOWER_KEY_ENC_IPV4_SRC,	/* be32 */
+-	TCA_FLOWER_KEY_ENC_IPV4_SRC_MASK,/* be32 */
+-	TCA_FLOWER_KEY_ENC_IPV4_DST,	/* be32 */
+-	TCA_FLOWER_KEY_ENC_IPV4_DST_MASK,/* be32 */
+-	TCA_FLOWER_KEY_ENC_IPV6_SRC,	/* struct in6_addr */
+-	TCA_FLOWER_KEY_ENC_IPV6_SRC_MASK,/* struct in6_addr */
+-	TCA_FLOWER_KEY_ENC_IPV6_DST,	/* struct in6_addr */
+-	TCA_FLOWER_KEY_ENC_IPV6_DST_MASK,/* struct in6_addr */
+-
+-	TCA_FLOWER_KEY_TCP_SRC_MASK,	/* be16 */
+-	TCA_FLOWER_KEY_TCP_DST_MASK,	/* be16 */
+-	TCA_FLOWER_KEY_UDP_SRC_MASK,	/* be16 */
+-	TCA_FLOWER_KEY_UDP_DST_MASK,	/* be16 */
+-	TCA_FLOWER_KEY_SCTP_SRC_MASK,	/* be16 */
+-	TCA_FLOWER_KEY_SCTP_DST_MASK,	/* be16 */
+-
+-	TCA_FLOWER_KEY_SCTP_SRC,	/* be16 */
+-	TCA_FLOWER_KEY_SCTP_DST,	/* be16 */
+-
+-	TCA_FLOWER_KEY_ENC_UDP_SRC_PORT,	/* be16 */
+-	TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK,	/* be16 */
+-	TCA_FLOWER_KEY_ENC_UDP_DST_PORT,	/* be16 */
+-	TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK,	/* be16 */
+-
+-	TCA_FLOWER_KEY_FLAGS,		/* be32 */
+-	TCA_FLOWER_KEY_FLAGS_MASK,	/* be32 */
+-
+-	TCA_FLOWER_KEY_ICMPV4_CODE,	/* u8 */
+-	TCA_FLOWER_KEY_ICMPV4_CODE_MASK,/* u8 */
+-	TCA_FLOWER_KEY_ICMPV4_TYPE,	/* u8 */
+-	TCA_FLOWER_KEY_ICMPV4_TYPE_MASK,/* u8 */
+-	TCA_FLOWER_KEY_ICMPV6_CODE,	/* u8 */
+-	TCA_FLOWER_KEY_ICMPV6_CODE_MASK,/* u8 */
+-	TCA_FLOWER_KEY_ICMPV6_TYPE,	/* u8 */
+-	TCA_FLOWER_KEY_ICMPV6_TYPE_MASK,/* u8 */
+-
+-	TCA_FLOWER_KEY_ARP_SIP,		/* be32 */
+-	TCA_FLOWER_KEY_ARP_SIP_MASK,	/* be32 */
+-	TCA_FLOWER_KEY_ARP_TIP,		/* be32 */
+-	TCA_FLOWER_KEY_ARP_TIP_MASK,	/* be32 */
+-	TCA_FLOWER_KEY_ARP_OP,		/* u8 */
+-	TCA_FLOWER_KEY_ARP_OP_MASK,	/* u8 */
+-	TCA_FLOWER_KEY_ARP_SHA,		/* ETH_ALEN */
+-	TCA_FLOWER_KEY_ARP_SHA_MASK,	/* ETH_ALEN */
+-	TCA_FLOWER_KEY_ARP_THA,		/* ETH_ALEN */
+-	TCA_FLOWER_KEY_ARP_THA_MASK,	/* ETH_ALEN */
+-
+-	TCA_FLOWER_KEY_MPLS_TTL,	/* u8 - 8 bits */
+-	TCA_FLOWER_KEY_MPLS_BOS,	/* u8 - 1 bit */
+-	TCA_FLOWER_KEY_MPLS_TC,		/* u8 - 3 bits */
+-	TCA_FLOWER_KEY_MPLS_LABEL,	/* be32 - 20 bits */
+-
+-	TCA_FLOWER_KEY_TCP_FLAGS,	/* be16 */
+-	TCA_FLOWER_KEY_TCP_FLAGS_MASK,	/* be16 */
+-
+-	TCA_FLOWER_KEY_IP_TOS,		/* u8 */
+-	TCA_FLOWER_KEY_IP_TOS_MASK,	/* u8 */
+-	TCA_FLOWER_KEY_IP_TTL,		/* u8 */
+-	TCA_FLOWER_KEY_IP_TTL_MASK,	/* u8 */
+-
+-	__TCA_FLOWER_MAX,
+-};
+-
+-#define TCA_FLOWER_MAX (__TCA_FLOWER_MAX - 1)
+-
+-enum {
+-	TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT = (1 << 0),
+-};
+-
+-/* Match-all classifier */
+-
+-enum {
+-	TCA_MATCHALL_UNSPEC,
+-	TCA_MATCHALL_CLASSID,
+-	TCA_MATCHALL_ACT,
+-	TCA_MATCHALL_FLAGS,
+-	__TCA_MATCHALL_MAX,
+-};
+-
+-#define TCA_MATCHALL_MAX (__TCA_MATCHALL_MAX - 1)
+-
+-/* Extended Matches */
+-
+-struct tcf_ematch_tree_hdr {
+-	__u16		nmatches;
+-	__u16		progid;
+-};
+-
+-enum {
+-	TCA_EMATCH_TREE_UNSPEC,
+-	TCA_EMATCH_TREE_HDR,
+-	TCA_EMATCH_TREE_LIST,
+-	__TCA_EMATCH_TREE_MAX
+-};
+-#define TCA_EMATCH_TREE_MAX (__TCA_EMATCH_TREE_MAX - 1)
+-
+-struct tcf_ematch_hdr {
+-	__u16		matchid;
+-	__u16		kind;
+-	__u16		flags;
+-	__u16		pad; /* currently unused */
+-};
+-
+-/*  0                   1
+- *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 
+- * +-----------------------+-+-+---+
+- * |         Unused        |S|I| R |
+- * +-----------------------+-+-+---+
+- *
+- * R(2) ::= relation to next ematch
+- *          where: 0 0 END (last ematch)
+- *                 0 1 AND
+- *                 1 0 OR
+- *                 1 1 Unused (invalid)
+- * I(1) ::= invert result
+- * S(1) ::= simple payload
+- */
+-#define TCF_EM_REL_END	0
+-#define TCF_EM_REL_AND	(1<<0)
+-#define TCF_EM_REL_OR	(1<<1)
+-#define TCF_EM_INVERT	(1<<2)
+-#define TCF_EM_SIMPLE	(1<<3)
+-
+-#define TCF_EM_REL_MASK	3
+-#define TCF_EM_REL_VALID(v) (((v) & TCF_EM_REL_MASK) != TCF_EM_REL_MASK)
+-
+-enum {
+-	TCF_LAYER_LINK,
+-	TCF_LAYER_NETWORK,
+-	TCF_LAYER_TRANSPORT,
+-	__TCF_LAYER_MAX
+-};
+-#define TCF_LAYER_MAX (__TCF_LAYER_MAX - 1)
+-
+-/* Ematch type assignments
+- *   1..32767		Reserved for ematches inside kernel tree
+- *   32768..65535	Free to use, not reliable
+- */
+-#define	TCF_EM_CONTAINER	0
+-#define	TCF_EM_CMP		1
+-#define	TCF_EM_NBYTE		2
+-#define	TCF_EM_U32		3
+-#define	TCF_EM_META		4
+-#define	TCF_EM_TEXT		5
+-#define	TCF_EM_VLAN		6
+-#define	TCF_EM_CANID		7
+-#define	TCF_EM_IPSET		8
+-#define	TCF_EM_MAX		8
+-
+-enum {
+-	TCF_EM_PROG_TC
+-};
+-
+-enum {
+-	TCF_EM_OPND_EQ,
+-	TCF_EM_OPND_GT,
+-	TCF_EM_OPND_LT
+-};
+-
+-#endif
+diff --git a/include/linux/pkt_sched.h b/include/linux/pkt_sched.h
+deleted file mode 100644
+index 099bf55..0000000
+--- a/include/linux/pkt_sched.h
++++ /dev/null
+@@ -1,874 +0,0 @@
+-#ifndef __LINUX_PKT_SCHED_H
+-#define __LINUX_PKT_SCHED_H
+-
+-#include <linux/types.h>
+-
+-/* Logical priority bands not depending on specific packet scheduler.
+-   Every scheduler will map them to real traffic classes, if it has
+-   no more precise mechanism to classify packets.
+-
+-   These numbers have no special meaning, though their coincidence
+-   with obsolete IPv6 values is not occasional :-). New IPv6 drafts
+-   preferred full anarchy inspired by diffserv group.
+-
+-   Note: TC_PRIO_BESTEFFORT does not mean that it is the most unhappy
+-   class, actually, as rule it will be handled with more care than
+-   filler or even bulk.
+- */
+-
+-#define TC_PRIO_BESTEFFORT		0
+-#define TC_PRIO_FILLER			1
+-#define TC_PRIO_BULK			2
+-#define TC_PRIO_INTERACTIVE_BULK	4
+-#define TC_PRIO_INTERACTIVE		6
+-#define TC_PRIO_CONTROL			7
+-
+-#define TC_PRIO_MAX			15
+-
+-/* Generic queue statistics, available for all the elements.
+-   Particular schedulers may have also their private records.
+- */
+-
+-struct tc_stats {
+-	__u64	bytes;			/* Number of enqueued bytes */
+-	__u32	packets;		/* Number of enqueued packets	*/
+-	__u32	drops;			/* Packets dropped because of lack of resources */
+-	__u32	overlimits;		/* Number of throttle events when this
+-					 * flow goes out of allocated bandwidth */
+-	__u32	bps;			/* Current flow byte rate */
+-	__u32	pps;			/* Current flow packet rate */
+-	__u32	qlen;
+-	__u32	backlog;
+-};
+-
+-struct tc_estimator {
+-	signed char	interval;
+-	unsigned char	ewma_log;
+-};
+-
+-/* "Handles"
+-   ---------
+-
+-    All the traffic control objects have 32bit identifiers, or "handles".
+-
+-    They can be considered as opaque numbers from user API viewpoint,
+-    but actually they always consist of two fields: major and
+-    minor numbers, which are interpreted by kernel specially,
+-    that may be used by applications, though not recommended.
+-
+-    F.e. qdisc handles always have minor number equal to zero,
+-    classes (or flows) have major equal to parent qdisc major, and
+-    minor uniquely identifying class inside qdisc.
+-
+-    Macros to manipulate handles:
+- */
+-
+-#define TC_H_MAJ_MASK (0xFFFF0000U)
+-#define TC_H_MIN_MASK (0x0000FFFFU)
+-#define TC_H_MAJ(h) ((h)&TC_H_MAJ_MASK)
+-#define TC_H_MIN(h) ((h)&TC_H_MIN_MASK)
+-#define TC_H_MAKE(maj,min) (((maj)&TC_H_MAJ_MASK)|((min)&TC_H_MIN_MASK))
+-
+-#define TC_H_UNSPEC	(0U)
+-#define TC_H_ROOT	(0xFFFFFFFFU)
+-#define TC_H_INGRESS    (0xFFFFFFF1U)
+-#define TC_H_CLSACT	TC_H_INGRESS
+-
+-#define TC_H_MIN_INGRESS	0xFFF2U
+-#define TC_H_MIN_EGRESS		0xFFF3U
+-
+-/* Need to corrospond to iproute2 tc/tc_core.h "enum link_layer" */
+-enum tc_link_layer {
+-	TC_LINKLAYER_UNAWARE, /* Indicate unaware old iproute2 util */
+-	TC_LINKLAYER_ETHERNET,
+-	TC_LINKLAYER_ATM,
+-};
+-#define TC_LINKLAYER_MASK 0x0F /* limit use to lower 4 bits */
+-
+-struct tc_ratespec {
+-	unsigned char	cell_log;
+-	__u8		linklayer; /* lower 4 bits */
+-	unsigned short	overhead;
+-	short		cell_align;
+-	unsigned short	mpu;
+-	__u32		rate;
+-};
+-
+-#define TC_RTAB_SIZE	1024
+-
+-struct tc_sizespec {
+-	unsigned char	cell_log;
+-	unsigned char	size_log;
+-	short		cell_align;
+-	int		overhead;
+-	unsigned int	linklayer;
+-	unsigned int	mpu;
+-	unsigned int	mtu;
+-	unsigned int	tsize;
+-};
+-
+-enum {
+-	TCA_STAB_UNSPEC,
+-	TCA_STAB_BASE,
+-	TCA_STAB_DATA,
+-	__TCA_STAB_MAX
+-};
+-
+-#define TCA_STAB_MAX (__TCA_STAB_MAX - 1)
+-
+-/* FIFO section */
+-
+-struct tc_fifo_qopt {
+-	__u32	limit;	/* Queue length: bytes for bfifo, packets for pfifo */
+-};
+-
+-/* PRIO section */
+-
+-#define TCQ_PRIO_BANDS	16
+-#define TCQ_MIN_PRIO_BANDS 2
+-
+-struct tc_prio_qopt {
+-	int	bands;			/* Number of bands */
+-	__u8	priomap[TC_PRIO_MAX+1];	/* Map: logical priority -> PRIO band */
+-};
+-
+-/* MULTIQ section */
+-
+-struct tc_multiq_qopt {
+-	__u16	bands;			/* Number of bands */
+-	__u16	max_bands;		/* Maximum number of queues */
+-};
+-
+-/* PLUG section */
+-
+-#define TCQ_PLUG_BUFFER                0
+-#define TCQ_PLUG_RELEASE_ONE           1
+-#define TCQ_PLUG_RELEASE_INDEFINITE    2
+-#define TCQ_PLUG_LIMIT                 3
+-
+-struct tc_plug_qopt {
+-	/* TCQ_PLUG_BUFFER: Inset a plug into the queue and
+-	 *  buffer any incoming packets
+-	 * TCQ_PLUG_RELEASE_ONE: Dequeue packets from queue head
+-	 *   to beginning of the next plug.
+-	 * TCQ_PLUG_RELEASE_INDEFINITE: Dequeue all packets from queue.
+-	 *   Stop buffering packets until the next TCQ_PLUG_BUFFER
+-	 *   command is received (just act as a pass-thru queue).
+-	 * TCQ_PLUG_LIMIT: Increase/decrease queue size
+-	 */
+-	int             action;
+-	__u32           limit;
+-};
+-
+-/* TBF section */
+-
+-struct tc_tbf_qopt {
+-	struct tc_ratespec rate;
+-	struct tc_ratespec peakrate;
+-	__u32		limit;
+-	__u32		buffer;
+-	__u32		mtu;
+-};
+-
+-enum {
+-	TCA_TBF_UNSPEC,
+-	TCA_TBF_PARMS,
+-	TCA_TBF_RTAB,
+-	TCA_TBF_PTAB,
+-	TCA_TBF_RATE64,
+-	TCA_TBF_PRATE64,
+-	TCA_TBF_BURST,
+-	TCA_TBF_PBURST,
+-	TCA_TBF_PAD,
+-	__TCA_TBF_MAX,
+-};
+-
+-#define TCA_TBF_MAX (__TCA_TBF_MAX - 1)
+-
+-
+-/* TEQL section */
+-
+-/* TEQL does not require any parameters */
+-
+-/* SFQ section */
+-
+-struct tc_sfq_qopt {
+-	unsigned	quantum;	/* Bytes per round allocated to flow */
+-	int		perturb_period;	/* Period of hash perturbation */
+-	__u32		limit;		/* Maximal packets in queue */
+-	unsigned	divisor;	/* Hash divisor  */
+-	unsigned	flows;		/* Maximal number of flows  */
+-};
+-
+-struct tc_sfqred_stats {
+-	__u32           prob_drop;      /* Early drops, below max threshold */
+-	__u32           forced_drop;	/* Early drops, after max threshold */
+-	__u32           prob_mark;      /* Marked packets, below max threshold */
+-	__u32           forced_mark;    /* Marked packets, after max threshold */
+-	__u32           prob_mark_head; /* Marked packets, below max threshold */
+-	__u32           forced_mark_head;/* Marked packets, after max threshold */
+-};
+-
+-struct tc_sfq_qopt_v1 {
+-	struct tc_sfq_qopt v0;
+-	unsigned int	depth;		/* max number of packets per flow */
+-	unsigned int	headdrop;
+-/* SFQRED parameters */
+-	__u32		limit;		/* HARD maximal flow queue length (bytes) */
+-	__u32		qth_min;	/* Min average length threshold (bytes) */
+-	__u32		qth_max;	/* Max average length threshold (bytes) */
+-	unsigned char   Wlog;		/* log(W)		*/
+-	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
+-	unsigned char   Scell_log;	/* cell size for idle damping */
+-	unsigned char	flags;
+-	__u32		max_P;		/* probability, high resolution */
+-/* SFQRED stats */
+-	struct tc_sfqred_stats stats;
+-};
+-
+-
+-struct tc_sfq_xstats {
+-	__s32		allot;
+-};
+-
+-/* RED section */
+-
+-enum {
+-	TCA_RED_UNSPEC,
+-	TCA_RED_PARMS,
+-	TCA_RED_STAB,
+-	TCA_RED_MAX_P,
+-	__TCA_RED_MAX,
+-};
+-
+-#define TCA_RED_MAX (__TCA_RED_MAX - 1)
+-
+-struct tc_red_qopt {
+-	__u32		limit;		/* HARD maximal queue length (bytes)	*/
+-	__u32		qth_min;	/* Min average length threshold (bytes) */
+-	__u32		qth_max;	/* Max average length threshold (bytes) */
+-	unsigned char   Wlog;		/* log(W)		*/
+-	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
+-	unsigned char   Scell_log;	/* cell size for idle damping */
+-	unsigned char	flags;
+-#define TC_RED_ECN		1
+-#define TC_RED_HARDDROP		2
+-#define TC_RED_ADAPTATIVE	4
+-};
+-
+-struct tc_red_xstats {
+-	__u32           early;          /* Early drops */
+-	__u32           pdrop;          /* Drops due to queue limits */
+-	__u32           other;          /* Drops due to drop() calls */
+-	__u32           marked;         /* Marked packets */
+-};
+-
+-/* GRED section */
+-
+-#define MAX_DPs 16
+-
+-enum {
+-       TCA_GRED_UNSPEC,
+-       TCA_GRED_PARMS,
+-       TCA_GRED_STAB,
+-       TCA_GRED_DPS,
+-       TCA_GRED_MAX_P,
+-       TCA_GRED_LIMIT,
+-       __TCA_GRED_MAX,
+-};
+-
+-#define TCA_GRED_MAX (__TCA_GRED_MAX - 1)
+-
+-struct tc_gred_qopt {
+-	__u32		limit;        /* HARD maximal queue length (bytes)    */
+-	__u32		qth_min;      /* Min average length threshold (bytes) */
+-	__u32		qth_max;      /* Max average length threshold (bytes) */
+-	__u32		DP;           /* up to 2^32 DPs */
+-	__u32		backlog;
+-	__u32		qave;
+-	__u32		forced;
+-	__u32		early;
+-	__u32		other;
+-	__u32		pdrop;
+-	__u8		Wlog;         /* log(W)               */
+-	__u8		Plog;         /* log(P_max/(qth_max-qth_min)) */
+-	__u8		Scell_log;    /* cell size for idle damping */
+-	__u8		prio;         /* prio of this VQ */
+-	__u32		packets;
+-	__u32		bytesin;
+-};
+-
+-/* gred setup */
+-struct tc_gred_sopt {
+-	__u32		DPs;
+-	__u32		def_DP;
+-	__u8		grio;
+-	__u8		flags;
+-	__u16		pad1;
+-};
+-
+-/* CHOKe section */
+-
+-enum {
+-	TCA_CHOKE_UNSPEC,
+-	TCA_CHOKE_PARMS,
+-	TCA_CHOKE_STAB,
+-	TCA_CHOKE_MAX_P,
+-	__TCA_CHOKE_MAX,
+-};
+-
+-#define TCA_CHOKE_MAX (__TCA_CHOKE_MAX - 1)
+-
+-struct tc_choke_qopt {
+-	__u32		limit;		/* Hard queue length (packets)	*/
+-	__u32		qth_min;	/* Min average threshold (packets) */
+-	__u32		qth_max;	/* Max average threshold (packets) */
+-	unsigned char   Wlog;		/* log(W)		*/
+-	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
+-	unsigned char   Scell_log;	/* cell size for idle damping */
+-	unsigned char	flags;		/* see RED flags */
+-};
+-
+-struct tc_choke_xstats {
+-	__u32		early;          /* Early drops */
+-	__u32		pdrop;          /* Drops due to queue limits */
+-	__u32		other;          /* Drops due to drop() calls */
+-	__u32		marked;         /* Marked packets */
+-	__u32		matched;	/* Drops due to flow match */
+-};
+-
+-/* HTB section */
+-#define TC_HTB_NUMPRIO		8
+-#define TC_HTB_MAXDEPTH		8
+-#define TC_HTB_PROTOVER		3 /* the same as HTB and TC's major */
+-
+-struct tc_htb_opt {
+-	struct tc_ratespec 	rate;
+-	struct tc_ratespec 	ceil;
+-	__u32	buffer;
+-	__u32	cbuffer;
+-	__u32	quantum;
+-	__u32	level;		/* out only */
+-	__u32	prio;
+-};
+-struct tc_htb_glob {
+-	__u32 version;		/* to match HTB/TC */
+-    	__u32 rate2quantum;	/* bps->quantum divisor */
+-    	__u32 defcls;		/* default class number */
+-	__u32 debug;		/* debug flags */
+-
+-	/* stats */
+-	__u32 direct_pkts; /* count of non shaped packets */
+-};
+-enum {
+-	TCA_HTB_UNSPEC,
+-	TCA_HTB_PARMS,
+-	TCA_HTB_INIT,
+-	TCA_HTB_CTAB,
+-	TCA_HTB_RTAB,
+-	TCA_HTB_DIRECT_QLEN,
+-	TCA_HTB_RATE64,
+-	TCA_HTB_CEIL64,
+-	TCA_HTB_PAD,
+-	__TCA_HTB_MAX,
+-};
+-
+-#define TCA_HTB_MAX (__TCA_HTB_MAX - 1)
+-
+-struct tc_htb_xstats {
+-	__u32 lends;
+-	__u32 borrows;
+-	__u32 giants;	/* too big packets (rate will not be accurate) */
+-	__u32 tokens;
+-	__u32 ctokens;
+-};
+-
+-/* HFSC section */
+-
+-struct tc_hfsc_qopt {
+-	__u16	defcls;		/* default class */
+-};
+-
+-struct tc_service_curve {
+-	__u32	m1;		/* slope of the first segment in bps */
+-	__u32	d;		/* x-projection of the first segment in us */
+-	__u32	m2;		/* slope of the second segment in bps */
+-};
+-
+-struct tc_hfsc_stats {
+-	__u64	work;		/* total work done */
+-	__u64	rtwork;		/* work done by real-time criteria */
+-	__u32	period;		/* current period */
+-	__u32	level;		/* class level in hierarchy */
+-};
+-
+-enum {
+-	TCA_HFSC_UNSPEC,
+-	TCA_HFSC_RSC,
+-	TCA_HFSC_FSC,
+-	TCA_HFSC_USC,
+-	__TCA_HFSC_MAX,
+-};
+-
+-#define TCA_HFSC_MAX (__TCA_HFSC_MAX - 1)
+-
+-
+-/* CBQ section */
+-
+-#define TC_CBQ_MAXPRIO		8
+-#define TC_CBQ_MAXLEVEL		8
+-#define TC_CBQ_DEF_EWMA		5
+-
+-struct tc_cbq_lssopt {
+-	unsigned char	change;
+-	unsigned char	flags;
+-#define TCF_CBQ_LSS_BOUNDED	1
+-#define TCF_CBQ_LSS_ISOLATED	2
+-	unsigned char  	ewma_log;
+-	unsigned char  	level;
+-#define TCF_CBQ_LSS_FLAGS	1
+-#define TCF_CBQ_LSS_EWMA	2
+-#define TCF_CBQ_LSS_MAXIDLE	4
+-#define TCF_CBQ_LSS_MINIDLE	8
+-#define TCF_CBQ_LSS_OFFTIME	0x10
+-#define TCF_CBQ_LSS_AVPKT	0x20
+-	__u32		maxidle;
+-	__u32		minidle;
+-	__u32		offtime;
+-	__u32		avpkt;
+-};
+-
+-struct tc_cbq_wrropt {
+-	unsigned char	flags;
+-	unsigned char	priority;
+-	unsigned char	cpriority;
+-	unsigned char	__reserved;
+-	__u32		allot;
+-	__u32		weight;
+-};
+-
+-struct tc_cbq_ovl {
+-	unsigned char	strategy;
+-#define	TC_CBQ_OVL_CLASSIC	0
+-#define	TC_CBQ_OVL_DELAY	1
+-#define	TC_CBQ_OVL_LOWPRIO	2
+-#define	TC_CBQ_OVL_DROP		3
+-#define	TC_CBQ_OVL_RCLASSIC	4
+-	unsigned char	priority2;
+-	__u16		pad;
+-	__u32		penalty;
+-};
+-
+-struct tc_cbq_police {
+-	unsigned char	police;
+-	unsigned char	__res1;
+-	unsigned short	__res2;
+-};
+-
+-struct tc_cbq_fopt {
+-	__u32		split;
+-	__u32		defmap;
+-	__u32		defchange;
+-};
+-
+-struct tc_cbq_xstats {
+-	__u32		borrows;
+-	__u32		overactions;
+-	__s32		avgidle;
+-	__s32		undertime;
+-};
+-
+-enum {
+-	TCA_CBQ_UNSPEC,
+-	TCA_CBQ_LSSOPT,
+-	TCA_CBQ_WRROPT,
+-	TCA_CBQ_FOPT,
+-	TCA_CBQ_OVL_STRATEGY,
+-	TCA_CBQ_RATE,
+-	TCA_CBQ_RTAB,
+-	TCA_CBQ_POLICE,
+-	__TCA_CBQ_MAX,
+-};
+-
+-#define TCA_CBQ_MAX	(__TCA_CBQ_MAX - 1)
+-
+-/* dsmark section */
+-
+-enum {
+-	TCA_DSMARK_UNSPEC,
+-	TCA_DSMARK_INDICES,
+-	TCA_DSMARK_DEFAULT_INDEX,
+-	TCA_DSMARK_SET_TC_INDEX,
+-	TCA_DSMARK_MASK,
+-	TCA_DSMARK_VALUE,
+-	__TCA_DSMARK_MAX,
+-};
+-
+-#define TCA_DSMARK_MAX (__TCA_DSMARK_MAX - 1)
+-
+-/* ATM  section */
+-
+-enum {
+-	TCA_ATM_UNSPEC,
+-	TCA_ATM_FD,		/* file/socket descriptor */
+-	TCA_ATM_PTR,		/* pointer to descriptor - later */
+-	TCA_ATM_HDR,		/* LL header */
+-	TCA_ATM_EXCESS,		/* excess traffic class (0 for CLP)  */
+-	TCA_ATM_ADDR,		/* PVC address (for output only) */
+-	TCA_ATM_STATE,		/* VC state (ATM_VS_*; for output only) */
+-	__TCA_ATM_MAX,
+-};
+-
+-#define TCA_ATM_MAX	(__TCA_ATM_MAX - 1)
+-
+-/* Network emulator */
+-
+-enum {
+-	TCA_NETEM_UNSPEC,
+-	TCA_NETEM_CORR,
+-	TCA_NETEM_DELAY_DIST,
+-	TCA_NETEM_REORDER,
+-	TCA_NETEM_CORRUPT,
+-	TCA_NETEM_LOSS,
+-	TCA_NETEM_RATE,
+-	TCA_NETEM_ECN,
+-	TCA_NETEM_RATE64,
+-	TCA_NETEM_PAD,
+-	__TCA_NETEM_MAX,
+-};
+-
+-#define TCA_NETEM_MAX (__TCA_NETEM_MAX - 1)
+-
+-struct tc_netem_qopt {
+-	__u32	latency;	/* added delay (us) */
+-	__u32   limit;		/* fifo limit (packets) */
+-	__u32	loss;		/* random packet loss (0=none ~0=100%) */
+-	__u32	gap;		/* re-ordering gap (0 for none) */
+-	__u32   duplicate;	/* random packet dup  (0=none ~0=100%) */
+-	__u32	jitter;		/* random jitter in latency (us) */
+-};
+-
+-struct tc_netem_corr {
+-	__u32	delay_corr;	/* delay correlation */
+-	__u32	loss_corr;	/* packet loss correlation */
+-	__u32	dup_corr;	/* duplicate correlation  */
+-};
+-
+-struct tc_netem_reorder {
+-	__u32	probability;
+-	__u32	correlation;
+-};
+-
+-struct tc_netem_corrupt {
+-	__u32	probability;
+-	__u32	correlation;
+-};
+-
+-struct tc_netem_rate {
+-	__u32	rate;	/* byte/s */
+-	__s32	packet_overhead;
+-	__u32	cell_size;
+-	__s32	cell_overhead;
+-};
+-
+-enum {
+-	NETEM_LOSS_UNSPEC,
+-	NETEM_LOSS_GI,		/* General Intuitive - 4 state model */
+-	NETEM_LOSS_GE,		/* Gilbert Elliot models */
+-	__NETEM_LOSS_MAX
+-};
+-#define NETEM_LOSS_MAX (__NETEM_LOSS_MAX - 1)
+-
+-/* State transition probabilities for 4 state model */
+-struct tc_netem_gimodel {
+-	__u32	p13;
+-	__u32	p31;
+-	__u32	p32;
+-	__u32	p14;
+-	__u32	p23;
+-};
+-
+-/* Gilbert-Elliot models */
+-struct tc_netem_gemodel {
+-	__u32 p;
+-	__u32 r;
+-	__u32 h;
+-	__u32 k1;
+-};
+-
+-#define NETEM_DIST_SCALE	8192
+-#define NETEM_DIST_MAX		16384
+-
+-/* DRR */
+-
+-enum {
+-	TCA_DRR_UNSPEC,
+-	TCA_DRR_QUANTUM,
+-	__TCA_DRR_MAX
+-};
+-
+-#define TCA_DRR_MAX	(__TCA_DRR_MAX - 1)
+-
+-struct tc_drr_stats {
+-	__u32	deficit;
+-};
+-
+-/* MQPRIO */
+-#define TC_QOPT_BITMASK 15
+-#define TC_QOPT_MAX_QUEUE 16
+-
+-enum {
+-	TC_MQPRIO_HW_OFFLOAD_NONE,	/* no offload requested */
+-	TC_MQPRIO_HW_OFFLOAD_TCS,	/* offload TCs, no queue counts */
+-	__TC_MQPRIO_HW_OFFLOAD_MAX
+-};
+-
+-#define TC_MQPRIO_HW_OFFLOAD_MAX (__TC_MQPRIO_HW_OFFLOAD_MAX - 1)
+-
+-struct tc_mqprio_qopt {
+-	__u8	num_tc;
+-	__u8	prio_tc_map[TC_QOPT_BITMASK + 1];
+-	__u8	hw;
+-	__u16	count[TC_QOPT_MAX_QUEUE];
+-	__u16	offset[TC_QOPT_MAX_QUEUE];
+-};
+-
+-/* SFB */
+-
+-enum {
+-	TCA_SFB_UNSPEC,
+-	TCA_SFB_PARMS,
+-	__TCA_SFB_MAX,
+-};
+-
+-#define TCA_SFB_MAX (__TCA_SFB_MAX - 1)
+-
+-/*
+- * Note: increment, decrement are Q0.16 fixed-point values.
+- */
+-struct tc_sfb_qopt {
+-	__u32 rehash_interval;	/* delay between hash move, in ms */
+-	__u32 warmup_time;	/* double buffering warmup time in ms (warmup_time < rehash_interval) */
+-	__u32 max;		/* max len of qlen_min */
+-	__u32 bin_size;		/* maximum queue length per bin */
+-	__u32 increment;	/* probability increment, (d1 in Blue) */
+-	__u32 decrement;	/* probability decrement, (d2 in Blue) */
+-	__u32 limit;		/* max SFB queue length */
+-	__u32 penalty_rate;	/* inelastic flows are rate limited to 'rate' pps */
+-	__u32 penalty_burst;
+-};
+-
+-struct tc_sfb_xstats {
+-	__u32 earlydrop;
+-	__u32 penaltydrop;
+-	__u32 bucketdrop;
+-	__u32 queuedrop;
+-	__u32 childdrop; /* drops in child qdisc */
+-	__u32 marked;
+-	__u32 maxqlen;
+-	__u32 maxprob;
+-	__u32 avgprob;
+-};
+-
+-#define SFB_MAX_PROB 0xFFFF
+-
+-/* QFQ */
+-enum {
+-	TCA_QFQ_UNSPEC,
+-	TCA_QFQ_WEIGHT,
+-	TCA_QFQ_LMAX,
+-	__TCA_QFQ_MAX
+-};
+-
+-#define TCA_QFQ_MAX	(__TCA_QFQ_MAX - 1)
+-
+-struct tc_qfq_stats {
+-	__u32 weight;
+-	__u32 lmax;
+-};
+-
+-/* CODEL */
+-
+-enum {
+-	TCA_CODEL_UNSPEC,
+-	TCA_CODEL_TARGET,
+-	TCA_CODEL_LIMIT,
+-	TCA_CODEL_INTERVAL,
+-	TCA_CODEL_ECN,
+-	TCA_CODEL_CE_THRESHOLD,
+-	__TCA_CODEL_MAX
+-};
+-
+-#define TCA_CODEL_MAX	(__TCA_CODEL_MAX - 1)
+-
+-struct tc_codel_xstats {
+-	__u32	maxpacket; /* largest packet we've seen so far */
+-	__u32	count;	   /* how many drops we've done since the last time we
+-			    * entered dropping state
+-			    */
+-	__u32	lastcount; /* count at entry to dropping state */
+-	__u32	ldelay;    /* in-queue delay seen by most recently dequeued packet */
+-	__s32	drop_next; /* time to drop next packet */
+-	__u32	drop_overlimit; /* number of time max qdisc packet limit was hit */
+-	__u32	ecn_mark;  /* number of packets we ECN marked instead of dropped */
+-	__u32	dropping;  /* are we in dropping state ? */
+-	__u32	ce_mark;   /* number of CE marked packets because of ce_threshold */
+-};
+-
+-/* FQ_CODEL */
+-
+-enum {
+-	TCA_FQ_CODEL_UNSPEC,
+-	TCA_FQ_CODEL_TARGET,
+-	TCA_FQ_CODEL_LIMIT,
+-	TCA_FQ_CODEL_INTERVAL,
+-	TCA_FQ_CODEL_ECN,
+-	TCA_FQ_CODEL_FLOWS,
+-	TCA_FQ_CODEL_QUANTUM,
+-	TCA_FQ_CODEL_CE_THRESHOLD,
+-	TCA_FQ_CODEL_DROP_BATCH_SIZE,
+-	TCA_FQ_CODEL_MEMORY_LIMIT,
+-	__TCA_FQ_CODEL_MAX
+-};
+-
+-#define TCA_FQ_CODEL_MAX	(__TCA_FQ_CODEL_MAX - 1)
+-
+-enum {
+-	TCA_FQ_CODEL_XSTATS_QDISC,
+-	TCA_FQ_CODEL_XSTATS_CLASS,
+-};
+-
+-struct tc_fq_codel_qd_stats {
+-	__u32	maxpacket;	/* largest packet we've seen so far */
+-	__u32	drop_overlimit; /* number of time max qdisc
+-				 * packet limit was hit
+-				 */
+-	__u32	ecn_mark;	/* number of packets we ECN marked
+-				 * instead of being dropped
+-				 */
+-	__u32	new_flow_count; /* number of time packets
+-				 * created a 'new flow'
+-				 */
+-	__u32	new_flows_len;	/* count of flows in new list */
+-	__u32	old_flows_len;	/* count of flows in old list */
+-	__u32	ce_mark;	/* packets above ce_threshold */
+-	__u32	memory_usage;	/* in bytes */
+-	__u32	drop_overmemory;
+-};
+-
+-struct tc_fq_codel_cl_stats {
+-	__s32	deficit;
+-	__u32	ldelay;		/* in-queue delay seen by most recently
+-				 * dequeued packet
+-				 */
+-	__u32	count;
+-	__u32	lastcount;
+-	__u32	dropping;
+-	__s32	drop_next;
+-};
+-
+-struct tc_fq_codel_xstats {
+-	__u32	type;
+-	union {
+-		struct tc_fq_codel_qd_stats qdisc_stats;
+-		struct tc_fq_codel_cl_stats class_stats;
+-	};
+-};
+-
+-/* FQ */
+-
+-enum {
+-	TCA_FQ_UNSPEC,
+-
+-	TCA_FQ_PLIMIT,		/* limit of total number of packets in queue */
+-
+-	TCA_FQ_FLOW_PLIMIT,	/* limit of packets per flow */
+-
+-	TCA_FQ_QUANTUM,		/* RR quantum */
+-
+-	TCA_FQ_INITIAL_QUANTUM,		/* RR quantum for new flow */
+-
+-	TCA_FQ_RATE_ENABLE,	/* enable/disable rate limiting */
+-
+-	TCA_FQ_FLOW_DEFAULT_RATE,/* obsolete, do not use */
+-
+-	TCA_FQ_FLOW_MAX_RATE,	/* per flow max rate */
+-
+-	TCA_FQ_BUCKETS_LOG,	/* log2(number of buckets) */
+-
+-	TCA_FQ_FLOW_REFILL_DELAY,	/* flow credit refill delay in usec */
+-
+-	TCA_FQ_ORPHAN_MASK,	/* mask applied to orphaned skb hashes */
+-
+-	TCA_FQ_LOW_RATE_THRESHOLD, /* per packet delay under this rate */
+-
+-	__TCA_FQ_MAX
+-};
+-
+-#define TCA_FQ_MAX	(__TCA_FQ_MAX - 1)
+-
+-struct tc_fq_qd_stats {
+-	__u64	gc_flows;
+-	__u64	highprio_packets;
+-	__u64	tcp_retrans;
+-	__u64	throttled;
+-	__u64	flows_plimit;
+-	__u64	pkts_too_long;
+-	__u64	allocation_errors;
+-	__s64	time_next_delayed_flow;
+-	__u32	flows;
+-	__u32	inactive_flows;
+-	__u32	throttled_flows;
+-	__u32	unthrottle_latency_ns;
+-};
+-
+-/* Heavy-Hitter Filter */
+-
+-enum {
+-	TCA_HHF_UNSPEC,
+-	TCA_HHF_BACKLOG_LIMIT,
+-	TCA_HHF_QUANTUM,
+-	TCA_HHF_HH_FLOWS_LIMIT,
+-	TCA_HHF_RESET_TIMEOUT,
+-	TCA_HHF_ADMIT_BYTES,
+-	TCA_HHF_EVICT_TIMEOUT,
+-	TCA_HHF_NON_HH_WEIGHT,
+-	__TCA_HHF_MAX
+-};
+-
+-#define TCA_HHF_MAX	(__TCA_HHF_MAX - 1)
+-
+-struct tc_hhf_xstats {
+-	__u32	drop_overlimit; /* number of times max qdisc packet limit
+-				 * was hit
+-				 */
+-	__u32	hh_overlimit;   /* number of times max heavy-hitters was hit */
+-	__u32	hh_tot_count;   /* number of captured heavy-hitters so far */
+-	__u32	hh_cur_count;   /* number of current heavy-hitters */
+-};
+-
+-/* PIE */
+-enum {
+-	TCA_PIE_UNSPEC,
+-	TCA_PIE_TARGET,
+-	TCA_PIE_LIMIT,
+-	TCA_PIE_TUPDATE,
+-	TCA_PIE_ALPHA,
+-	TCA_PIE_BETA,
+-	TCA_PIE_ECN,
+-	TCA_PIE_BYTEMODE,
+-	__TCA_PIE_MAX
+-};
+-#define TCA_PIE_MAX   (__TCA_PIE_MAX - 1)
+-
+-struct tc_pie_xstats {
+-	__u32 prob;             /* current probability */
+-	__u32 delay;            /* current delay in ms */
+-	__u32 avg_dq_rate;      /* current average dq_rate in bits/pie_time */
+-	__u32 packets_in;       /* total number of packets enqueued */
+-	__u32 dropped;          /* packets dropped due to pie_action */
+-	__u32 overlimit;        /* dropped due to lack of space in queue */
+-	__u32 maxq;             /* maximum queue size */
+-	__u32 ecn_mark;         /* packets marked with ecn*/
+-};
+-#endif
+diff --git a/include/linux/posix_types.h b/include/linux/posix_types.h
+deleted file mode 100644
+index 988f76e..0000000
+--- a/include/linux/posix_types.h
++++ /dev/null
+@@ -1,37 +0,0 @@
+-#ifndef _LINUX_POSIX_TYPES_H
+-#define _LINUX_POSIX_TYPES_H
+-
+-#include <linux/stddef.h>
+-
+-/*
+- * This allows for 1024 file descriptors: if NR_OPEN is ever grown
+- * beyond that you'll have to change this too. But 1024 fd's seem to be
+- * enough even for such "real" unices like OSF/1, so hopefully this is
+- * one limit that doesn't have to be changed [again].
+- *
+- * Note that POSIX wants the FD_CLEAR(fd,fdsetp) defines to be in
+- * <sys/time.h> (and thus <linux/time.h>) - but this is a more logical
+- * place for them. Solved by having dummy defines in <sys/time.h>.
+- */
+-
+-/*
+- * This macro may have been defined in <gnu/types.h>. But we always
+- * use the one here.
+- */
+-#undef __FD_SETSIZE
+-#define __FD_SETSIZE	1024
+-
+-typedef struct {
+-	unsigned long fds_bits[__FD_SETSIZE / (8 * sizeof(long))];
+-} __kernel_fd_set;
+-
+-/* Type of a signal handler.  */
+-typedef void (*__kernel_sighandler_t)(int);
+-
+-/* Type of a SYSV IPC key.  */
+-typedef int __kernel_key_t;
+-typedef int __kernel_mqd_t;
+-
+-#include <asm/posix_types.h>
+-
+-#endif /* _LINUX_POSIX_TYPES_H */
+diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h
+deleted file mode 100644
+index 813e9e0..0000000
+--- a/include/linux/rtnetlink.h
++++ /dev/null
+@@ -1,718 +0,0 @@
+-#ifndef __LINUX_RTNETLINK_H
+-#define __LINUX_RTNETLINK_H
+-
+-#include <linux/types.h>
+-#include <linux/netlink.h>
+-#include <linux/if_link.h>
+-#include <linux/if_addr.h>
+-#include <linux/neighbour.h>
+-
+-/* rtnetlink families. Values up to 127 are reserved for real address
+- * families, values above 128 may be used arbitrarily.
+- */
+-#define RTNL_FAMILY_IPMR		128
+-#define RTNL_FAMILY_IP6MR		129
+-#define RTNL_FAMILY_MAX			129
+-
+-/****
+- *		Routing/neighbour discovery messages.
+- ****/
+-
+-/* Types of messages */
+-
+-enum {
+-	RTM_BASE	= 16,
+-#define RTM_BASE	RTM_BASE
+-
+-	RTM_NEWLINK	= 16,
+-#define RTM_NEWLINK	RTM_NEWLINK
+-	RTM_DELLINK,
+-#define RTM_DELLINK	RTM_DELLINK
+-	RTM_GETLINK,
+-#define RTM_GETLINK	RTM_GETLINK
+-	RTM_SETLINK,
+-#define RTM_SETLINK	RTM_SETLINK
+-
+-	RTM_NEWADDR	= 20,
+-#define RTM_NEWADDR	RTM_NEWADDR
+-	RTM_DELADDR,
+-#define RTM_DELADDR	RTM_DELADDR
+-	RTM_GETADDR,
+-#define RTM_GETADDR	RTM_GETADDR
+-
+-	RTM_NEWROUTE	= 24,
+-#define RTM_NEWROUTE	RTM_NEWROUTE
+-	RTM_DELROUTE,
+-#define RTM_DELROUTE	RTM_DELROUTE
+-	RTM_GETROUTE,
+-#define RTM_GETROUTE	RTM_GETROUTE
+-
+-	RTM_NEWNEIGH	= 28,
+-#define RTM_NEWNEIGH	RTM_NEWNEIGH
+-	RTM_DELNEIGH,
+-#define RTM_DELNEIGH	RTM_DELNEIGH
+-	RTM_GETNEIGH,
+-#define RTM_GETNEIGH	RTM_GETNEIGH
+-
+-	RTM_NEWRULE	= 32,
+-#define RTM_NEWRULE	RTM_NEWRULE
+-	RTM_DELRULE,
+-#define RTM_DELRULE	RTM_DELRULE
+-	RTM_GETRULE,
+-#define RTM_GETRULE	RTM_GETRULE
+-
+-	RTM_NEWQDISC	= 36,
+-#define RTM_NEWQDISC	RTM_NEWQDISC
+-	RTM_DELQDISC,
+-#define RTM_DELQDISC	RTM_DELQDISC
+-	RTM_GETQDISC,
+-#define RTM_GETQDISC	RTM_GETQDISC
+-
+-	RTM_NEWTCLASS	= 40,
+-#define RTM_NEWTCLASS	RTM_NEWTCLASS
+-	RTM_DELTCLASS,
+-#define RTM_DELTCLASS	RTM_DELTCLASS
+-	RTM_GETTCLASS,
+-#define RTM_GETTCLASS	RTM_GETTCLASS
+-
+-	RTM_NEWTFILTER	= 44,
+-#define RTM_NEWTFILTER	RTM_NEWTFILTER
+-	RTM_DELTFILTER,
+-#define RTM_DELTFILTER	RTM_DELTFILTER
+-	RTM_GETTFILTER,
+-#define RTM_GETTFILTER	RTM_GETTFILTER
+-
+-	RTM_NEWACTION	= 48,
+-#define RTM_NEWACTION   RTM_NEWACTION
+-	RTM_DELACTION,
+-#define RTM_DELACTION   RTM_DELACTION
+-	RTM_GETACTION,
+-#define RTM_GETACTION   RTM_GETACTION
+-
+-	RTM_NEWPREFIX	= 52,
+-#define RTM_NEWPREFIX	RTM_NEWPREFIX
+-
+-	RTM_GETMULTICAST = 58,
+-#define RTM_GETMULTICAST RTM_GETMULTICAST
+-
+-	RTM_GETANYCAST	= 62,
+-#define RTM_GETANYCAST	RTM_GETANYCAST
+-
+-	RTM_NEWNEIGHTBL	= 64,
+-#define RTM_NEWNEIGHTBL	RTM_NEWNEIGHTBL
+-	RTM_GETNEIGHTBL	= 66,
+-#define RTM_GETNEIGHTBL	RTM_GETNEIGHTBL
+-	RTM_SETNEIGHTBL,
+-#define RTM_SETNEIGHTBL	RTM_SETNEIGHTBL
+-
+-	RTM_NEWNDUSEROPT = 68,
+-#define RTM_NEWNDUSEROPT RTM_NEWNDUSEROPT
+-
+-	RTM_NEWADDRLABEL = 72,
+-#define RTM_NEWADDRLABEL RTM_NEWADDRLABEL
+-	RTM_DELADDRLABEL,
+-#define RTM_DELADDRLABEL RTM_DELADDRLABEL
+-	RTM_GETADDRLABEL,
+-#define RTM_GETADDRLABEL RTM_GETADDRLABEL
+-
+-	RTM_GETDCB = 78,
+-#define RTM_GETDCB RTM_GETDCB
+-	RTM_SETDCB,
+-#define RTM_SETDCB RTM_SETDCB
+-
+-	RTM_NEWNETCONF = 80,
+-#define RTM_NEWNETCONF RTM_NEWNETCONF
+-	RTM_DELNETCONF,
+-#define RTM_DELNETCONF RTM_DELNETCONF
+-	RTM_GETNETCONF = 82,
+-#define RTM_GETNETCONF RTM_GETNETCONF
+-
+-	RTM_NEWMDB = 84,
+-#define RTM_NEWMDB RTM_NEWMDB
+-	RTM_DELMDB = 85,
+-#define RTM_DELMDB RTM_DELMDB
+-	RTM_GETMDB = 86,
+-#define RTM_GETMDB RTM_GETMDB
+-
+-	RTM_NEWNSID = 88,
+-#define RTM_NEWNSID RTM_NEWNSID
+-	RTM_DELNSID = 89,
+-#define RTM_DELNSID RTM_DELNSID
+-	RTM_GETNSID = 90,
+-#define RTM_GETNSID RTM_GETNSID
+-
+-	RTM_NEWSTATS = 92,
+-#define RTM_NEWSTATS RTM_NEWSTATS
+-	RTM_GETSTATS = 94,
+-#define RTM_GETSTATS RTM_GETSTATS
+-
+-	RTM_NEWCACHEREPORT = 96,
+-#define RTM_NEWCACHEREPORT RTM_NEWCACHEREPORT
+-
+-	__RTM_MAX,
+-#define RTM_MAX		(((__RTM_MAX + 3) & ~3) - 1)
+-};
+-
+-#define RTM_NR_MSGTYPES	(RTM_MAX + 1 - RTM_BASE)
+-#define RTM_NR_FAMILIES	(RTM_NR_MSGTYPES >> 2)
+-#define RTM_FAM(cmd)	(((cmd) - RTM_BASE) >> 2)
+-
+-/* 
+-   Generic structure for encapsulation of optional route information.
+-   It is reminiscent of sockaddr, but with sa_family replaced
+-   with attribute type.
+- */
+-
+-struct rtattr {
+-	unsigned short	rta_len;
+-	unsigned short	rta_type;
+-};
+-
+-/* Macros to handle rtattributes */
+-
+-#define RTA_ALIGNTO	4U
+-#define RTA_ALIGN(len) ( ((len)+RTA_ALIGNTO-1) & ~(RTA_ALIGNTO-1) )
+-#define RTA_OK(rta,len) ((len) >= (int)sizeof(struct rtattr) && \
+-			 (rta)->rta_len >= sizeof(struct rtattr) && \
+-			 (rta)->rta_len <= (len))
+-#define RTA_NEXT(rta,attrlen)	((attrlen) -= RTA_ALIGN((rta)->rta_len), \
+-				 (struct rtattr*)(((char*)(rta)) + RTA_ALIGN((rta)->rta_len)))
+-#define RTA_LENGTH(len)	(RTA_ALIGN(sizeof(struct rtattr)) + (len))
+-#define RTA_SPACE(len)	RTA_ALIGN(RTA_LENGTH(len))
+-#define RTA_DATA(rta)   ((void*)(((char*)(rta)) + RTA_LENGTH(0)))
+-#define RTA_PAYLOAD(rta) ((int)((rta)->rta_len) - RTA_LENGTH(0))
+-
+-
+-
+-
+-/******************************************************************************
+- *		Definitions used in routing table administration.
+- ****/
+-
+-struct rtmsg {
+-	unsigned char		rtm_family;
+-	unsigned char		rtm_dst_len;
+-	unsigned char		rtm_src_len;
+-	unsigned char		rtm_tos;
+-
+-	unsigned char		rtm_table;	/* Routing table id */
+-	unsigned char		rtm_protocol;	/* Routing protocol; see below	*/
+-	unsigned char		rtm_scope;	/* See below */	
+-	unsigned char		rtm_type;	/* See below	*/
+-
+-	unsigned		rtm_flags;
+-};
+-
+-/* rtm_type */
+-
+-enum {
+-	RTN_UNSPEC,
+-	RTN_UNICAST,		/* Gateway or direct route	*/
+-	RTN_LOCAL,		/* Accept locally		*/
+-	RTN_BROADCAST,		/* Accept locally as broadcast,
+-				   send as broadcast */
+-	RTN_ANYCAST,		/* Accept locally as broadcast,
+-				   but send as unicast */
+-	RTN_MULTICAST,		/* Multicast route		*/
+-	RTN_BLACKHOLE,		/* Drop				*/
+-	RTN_UNREACHABLE,	/* Destination is unreachable   */
+-	RTN_PROHIBIT,		/* Administratively prohibited	*/
+-	RTN_THROW,		/* Not in this table		*/
+-	RTN_NAT,		/* Translate this address	*/
+-	RTN_XRESOLVE,		/* Use external resolver	*/
+-	__RTN_MAX
+-};
+-
+-#define RTN_MAX (__RTN_MAX - 1)
+-
+-
+-/* rtm_protocol */
+-
+-#define RTPROT_UNSPEC	0
+-#define RTPROT_REDIRECT	1	/* Route installed by ICMP redirects;
+-				   not used by current IPv4 */
+-#define RTPROT_KERNEL	2	/* Route installed by kernel		*/
+-#define RTPROT_BOOT	3	/* Route installed during boot		*/
+-#define RTPROT_STATIC	4	/* Route installed by administrator	*/
+-
+-/* Values of protocol >= RTPROT_STATIC are not interpreted by kernel;
+-   they are just passed from user and back as is.
+-   It will be used by hypothetical multiple routing daemons.
+-   Note that protocol values should be standardized in order to
+-   avoid conflicts.
+- */
+-
+-#define RTPROT_GATED	8	/* Apparently, GateD */
+-#define RTPROT_RA	9	/* RDISC/ND router advertisements */
+-#define RTPROT_MRT	10	/* Merit MRT */
+-#define RTPROT_ZEBRA	11	/* Zebra */
+-#define RTPROT_BIRD	12	/* BIRD */
+-#define RTPROT_DNROUTED	13	/* DECnet routing daemon */
+-#define RTPROT_XORP	14	/* XORP */
+-#define RTPROT_NTK	15	/* Netsukuku */
+-#define RTPROT_DHCP	16      /* DHCP client */
+-#define RTPROT_MROUTED	17      /* Multicast daemon */
+-#define RTPROT_BABEL	42      /* Babel daemon */
+-
+-/* rtm_scope
+-
+-   Really it is not scope, but sort of distance to the destination.
+-   NOWHERE are reserved for not existing destinations, HOST is our
+-   local addresses, LINK are destinations, located on directly attached
+-   link and UNIVERSE is everywhere in the Universe.
+-
+-   Intermediate values are also possible f.e. interior routes
+-   could be assigned a value between UNIVERSE and LINK.
+-*/
+-
+-enum rt_scope_t {
+-	RT_SCOPE_UNIVERSE=0,
+-/* User defined values  */
+-	RT_SCOPE_SITE=200,
+-	RT_SCOPE_LINK=253,
+-	RT_SCOPE_HOST=254,
+-	RT_SCOPE_NOWHERE=255
+-};
+-
+-/* rtm_flags */
+-
+-#define RTM_F_NOTIFY		0x100	/* Notify user of route change	*/
+-#define RTM_F_CLONED		0x200	/* This route is cloned		*/
+-#define RTM_F_EQUALIZE		0x400	/* Multipath equalizer: NI	*/
+-#define RTM_F_PREFIX		0x800	/* Prefix addresses		*/
+-#define RTM_F_LOOKUP_TABLE	0x1000	/* set rtm_table to FIB lookup result */
+-#define RTM_F_FIB_MATCH	        0x2000	/* return full fib lookup match */
+-
+-/* Reserved table identifiers */
+-
+-enum rt_class_t {
+-	RT_TABLE_UNSPEC=0,
+-/* User defined values */
+-	RT_TABLE_COMPAT=252,
+-	RT_TABLE_DEFAULT=253,
+-	RT_TABLE_MAIN=254,
+-	RT_TABLE_LOCAL=255,
+-	RT_TABLE_MAX=0xFFFFFFFF
+-};
+-
+-
+-/* Routing message attributes */
+-
+-enum rtattr_type_t {
+-	RTA_UNSPEC,
+-	RTA_DST,
+-	RTA_SRC,
+-	RTA_IIF,
+-	RTA_OIF,
+-	RTA_GATEWAY,
+-	RTA_PRIORITY,
+-	RTA_PREFSRC,
+-	RTA_METRICS,
+-	RTA_MULTIPATH,
+-	RTA_PROTOINFO, /* no longer used */
+-	RTA_FLOW,
+-	RTA_CACHEINFO,
+-	RTA_SESSION, /* no longer used */
+-	RTA_MP_ALGO, /* no longer used */
+-	RTA_TABLE,
+-	RTA_MARK,
+-	RTA_MFC_STATS,
+-	RTA_VIA,
+-	RTA_NEWDST,
+-	RTA_PREF,
+-	RTA_ENCAP_TYPE,
+-	RTA_ENCAP,
+-	RTA_EXPIRES,
+-	RTA_PAD,
+-	RTA_UID,
+-	RTA_TTL_PROPAGATE,
+-	__RTA_MAX
+-};
+-
+-#define RTA_MAX (__RTA_MAX - 1)
+-
+-#define RTM_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct rtmsg))))
+-#define RTM_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct rtmsg))
+-
+-/* RTM_MULTIPATH --- array of struct rtnexthop.
+- *
+- * "struct rtnexthop" describes all necessary nexthop information,
+- * i.e. parameters of path to a destination via this nexthop.
+- *
+- * At the moment it is impossible to set different prefsrc, mtu, window
+- * and rtt for different paths from multipath.
+- */
+-
+-struct rtnexthop {
+-	unsigned short		rtnh_len;
+-	unsigned char		rtnh_flags;
+-	unsigned char		rtnh_hops;
+-	int			rtnh_ifindex;
+-};
+-
+-/* rtnh_flags */
+-
+-#define RTNH_F_DEAD		1	/* Nexthop is dead (used by multipath)	*/
+-#define RTNH_F_PERVASIVE	2	/* Do recursive gateway lookup	*/
+-#define RTNH_F_ONLINK		4	/* Gateway is forced on link	*/
+-#define RTNH_F_OFFLOAD		8	/* offloaded route */
+-#define RTNH_F_LINKDOWN		16	/* carrier-down on nexthop */
+-#define RTNH_F_UNRESOLVED	32	/* The entry is unresolved (ipmr) */
+-
+-#define RTNH_COMPARE_MASK	(RTNH_F_DEAD | RTNH_F_LINKDOWN | RTNH_F_OFFLOAD)
+-
+-/* Macros to handle hexthops */
+-
+-#define RTNH_ALIGNTO	4
+-#define RTNH_ALIGN(len) ( ((len)+RTNH_ALIGNTO-1) & ~(RTNH_ALIGNTO-1) )
+-#define RTNH_OK(rtnh,len) ((rtnh)->rtnh_len >= sizeof(struct rtnexthop) && \
+-			   ((int)(rtnh)->rtnh_len) <= (len))
+-#define RTNH_NEXT(rtnh)	((struct rtnexthop*)(((char*)(rtnh)) + RTNH_ALIGN((rtnh)->rtnh_len)))
+-#define RTNH_LENGTH(len) (RTNH_ALIGN(sizeof(struct rtnexthop)) + (len))
+-#define RTNH_SPACE(len)	RTNH_ALIGN(RTNH_LENGTH(len))
+-#define RTNH_DATA(rtnh)   ((struct rtattr*)(((char*)(rtnh)) + RTNH_LENGTH(0)))
+-
+-/* RTA_VIA */
+-struct rtvia {
+-	__kernel_sa_family_t	rtvia_family;
+-	__u8			rtvia_addr[0];
+-};
+-
+-/* RTM_CACHEINFO */
+-
+-struct rta_cacheinfo {
+-	__u32	rta_clntref;
+-	__u32	rta_lastuse;
+-	__s32	rta_expires;
+-	__u32	rta_error;
+-	__u32	rta_used;
+-
+-#define RTNETLINK_HAVE_PEERINFO 1
+-	__u32	rta_id;
+-	__u32	rta_ts;
+-	__u32	rta_tsage;
+-};
+-
+-/* RTM_METRICS --- array of struct rtattr with types of RTAX_* */
+-
+-enum {
+-	RTAX_UNSPEC,
+-#define RTAX_UNSPEC RTAX_UNSPEC
+-	RTAX_LOCK,
+-#define RTAX_LOCK RTAX_LOCK
+-	RTAX_MTU,
+-#define RTAX_MTU RTAX_MTU
+-	RTAX_WINDOW,
+-#define RTAX_WINDOW RTAX_WINDOW
+-	RTAX_RTT,
+-#define RTAX_RTT RTAX_RTT
+-	RTAX_RTTVAR,
+-#define RTAX_RTTVAR RTAX_RTTVAR
+-	RTAX_SSTHRESH,
+-#define RTAX_SSTHRESH RTAX_SSTHRESH
+-	RTAX_CWND,
+-#define RTAX_CWND RTAX_CWND
+-	RTAX_ADVMSS,
+-#define RTAX_ADVMSS RTAX_ADVMSS
+-	RTAX_REORDERING,
+-#define RTAX_REORDERING RTAX_REORDERING
+-	RTAX_HOPLIMIT,
+-#define RTAX_HOPLIMIT RTAX_HOPLIMIT
+-	RTAX_INITCWND,
+-#define RTAX_INITCWND RTAX_INITCWND
+-	RTAX_FEATURES,
+-#define RTAX_FEATURES RTAX_FEATURES
+-	RTAX_RTO_MIN,
+-#define RTAX_RTO_MIN RTAX_RTO_MIN
+-	RTAX_INITRWND,
+-#define RTAX_INITRWND RTAX_INITRWND
+-	RTAX_QUICKACK,
+-#define RTAX_QUICKACK RTAX_QUICKACK
+-	RTAX_CC_ALGO,
+-#define RTAX_CC_ALGO RTAX_CC_ALGO
+-	__RTAX_MAX
+-};
+-
+-#define RTAX_MAX (__RTAX_MAX - 1)
+-
+-#define RTAX_FEATURE_ECN	(1 << 0)
+-#define RTAX_FEATURE_SACK	(1 << 1)
+-#define RTAX_FEATURE_TIMESTAMP	(1 << 2)
+-#define RTAX_FEATURE_ALLFRAG	(1 << 3)
+-
+-#define RTAX_FEATURE_MASK	(RTAX_FEATURE_ECN | RTAX_FEATURE_SACK | \
+-				 RTAX_FEATURE_TIMESTAMP | RTAX_FEATURE_ALLFRAG)
+-
+-struct rta_session {
+-	__u8	proto;
+-	__u8	pad1;
+-	__u16	pad2;
+-
+-	union {
+-		struct {
+-			__u16	sport;
+-			__u16	dport;
+-		} ports;
+-
+-		struct {
+-			__u8	type;
+-			__u8	code;
+-			__u16	ident;
+-		} icmpt;
+-
+-		__u32		spi;
+-	} u;
+-};
+-
+-struct rta_mfc_stats {
+-	__u64	mfcs_packets;
+-	__u64	mfcs_bytes;
+-	__u64	mfcs_wrong_if;
+-};
+-
+-/****
+- *		General form of address family dependent message.
+- ****/
+-
+-struct rtgenmsg {
+-	unsigned char		rtgen_family;
+-};
+-
+-/*****************************************************************
+- *		Link layer specific messages.
+- ****/
+-
+-/* struct ifinfomsg
+- * passes link level specific information, not dependent
+- * on network protocol.
+- */
+-
+-struct ifinfomsg {
+-	unsigned char	ifi_family;
+-	unsigned char	__ifi_pad;
+-	unsigned short	ifi_type;		/* ARPHRD_* */
+-	int		ifi_index;		/* Link index	*/
+-	unsigned	ifi_flags;		/* IFF_* flags	*/
+-	unsigned	ifi_change;		/* IFF_* change mask */
+-};
+-
+-/********************************************************************
+- *		prefix information 
+- ****/
+-
+-struct prefixmsg {
+-	unsigned char	prefix_family;
+-	unsigned char	prefix_pad1;
+-	unsigned short	prefix_pad2;
+-	int		prefix_ifindex;
+-	unsigned char	prefix_type;
+-	unsigned char	prefix_len;
+-	unsigned char	prefix_flags;
+-	unsigned char	prefix_pad3;
+-};
+-
+-enum 
+-{
+-	PREFIX_UNSPEC,
+-	PREFIX_ADDRESS,
+-	PREFIX_CACHEINFO,
+-	__PREFIX_MAX
+-};
+-
+-#define PREFIX_MAX	(__PREFIX_MAX - 1)
+-
+-struct prefix_cacheinfo {
+-	__u32	preferred_time;
+-	__u32	valid_time;
+-};
+-
+-
+-/*****************************************************************
+- *		Traffic control messages.
+- ****/
+-
+-struct tcmsg {
+-	unsigned char	tcm_family;
+-	unsigned char	tcm__pad1;
+-	unsigned short	tcm__pad2;
+-	int		tcm_ifindex;
+-	__u32		tcm_handle;
+-	__u32		tcm_parent;
+-	__u32		tcm_info;
+-};
+-
+-enum {
+-	TCA_UNSPEC,
+-	TCA_KIND,
+-	TCA_OPTIONS,
+-	TCA_STATS,
+-	TCA_XSTATS,
+-	TCA_RATE,
+-	TCA_FCNT,
+-	TCA_STATS2,
+-	TCA_STAB,
+-	TCA_PAD,
+-	TCA_DUMP_INVISIBLE,
+-	TCA_CHAIN,
+-	__TCA_MAX
+-};
+-
+-#define TCA_MAX (__TCA_MAX - 1)
+-
+-#define TCA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcmsg))))
+-#define TCA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcmsg))
+-
+-/********************************************************************
+- *		Neighbor Discovery userland options
+- ****/
+-
+-struct nduseroptmsg {
+-	unsigned char	nduseropt_family;
+-	unsigned char	nduseropt_pad1;
+-	unsigned short	nduseropt_opts_len;	/* Total length of options */
+-	int		nduseropt_ifindex;
+-	__u8		nduseropt_icmp_type;
+-	__u8		nduseropt_icmp_code;
+-	unsigned short	nduseropt_pad2;
+-	unsigned int	nduseropt_pad3;
+-	/* Followed by one or more ND options */
+-};
+-
+-enum {
+-	NDUSEROPT_UNSPEC,
+-	NDUSEROPT_SRCADDR,
+-	__NDUSEROPT_MAX
+-};
+-
+-#define NDUSEROPT_MAX	(__NDUSEROPT_MAX - 1)
+-
+-/* RTnetlink multicast groups - backwards compatibility for userspace */
+-#define RTMGRP_LINK		1
+-#define RTMGRP_NOTIFY		2
+-#define RTMGRP_NEIGH		4
+-#define RTMGRP_TC		8
+-
+-#define RTMGRP_IPV4_IFADDR	0x10
+-#define RTMGRP_IPV4_MROUTE	0x20
+-#define RTMGRP_IPV4_ROUTE	0x40
+-#define RTMGRP_IPV4_RULE	0x80
+-
+-#define RTMGRP_IPV6_IFADDR	0x100
+-#define RTMGRP_IPV6_MROUTE	0x200
+-#define RTMGRP_IPV6_ROUTE	0x400
+-#define RTMGRP_IPV6_IFINFO	0x800
+-
+-#define RTMGRP_DECnet_IFADDR    0x1000
+-#define RTMGRP_DECnet_ROUTE     0x4000
+-
+-#define RTMGRP_IPV6_PREFIX	0x20000
+-
+-/* RTnetlink multicast groups */
+-enum rtnetlink_groups {
+-	RTNLGRP_NONE,
+-#define RTNLGRP_NONE		RTNLGRP_NONE
+-	RTNLGRP_LINK,
+-#define RTNLGRP_LINK		RTNLGRP_LINK
+-	RTNLGRP_NOTIFY,
+-#define RTNLGRP_NOTIFY		RTNLGRP_NOTIFY
+-	RTNLGRP_NEIGH,
+-#define RTNLGRP_NEIGH		RTNLGRP_NEIGH
+-	RTNLGRP_TC,
+-#define RTNLGRP_TC		RTNLGRP_TC
+-	RTNLGRP_IPV4_IFADDR,
+-#define RTNLGRP_IPV4_IFADDR	RTNLGRP_IPV4_IFADDR
+-	RTNLGRP_IPV4_MROUTE,
+-#define	RTNLGRP_IPV4_MROUTE	RTNLGRP_IPV4_MROUTE
+-	RTNLGRP_IPV4_ROUTE,
+-#define RTNLGRP_IPV4_ROUTE	RTNLGRP_IPV4_ROUTE
+-	RTNLGRP_IPV4_RULE,
+-#define RTNLGRP_IPV4_RULE	RTNLGRP_IPV4_RULE
+-	RTNLGRP_IPV6_IFADDR,
+-#define RTNLGRP_IPV6_IFADDR	RTNLGRP_IPV6_IFADDR
+-	RTNLGRP_IPV6_MROUTE,
+-#define RTNLGRP_IPV6_MROUTE	RTNLGRP_IPV6_MROUTE
+-	RTNLGRP_IPV6_ROUTE,
+-#define RTNLGRP_IPV6_ROUTE	RTNLGRP_IPV6_ROUTE
+-	RTNLGRP_IPV6_IFINFO,
+-#define RTNLGRP_IPV6_IFINFO	RTNLGRP_IPV6_IFINFO
+-	RTNLGRP_DECnet_IFADDR,
+-#define RTNLGRP_DECnet_IFADDR	RTNLGRP_DECnet_IFADDR
+-	RTNLGRP_NOP2,
+-	RTNLGRP_DECnet_ROUTE,
+-#define RTNLGRP_DECnet_ROUTE	RTNLGRP_DECnet_ROUTE
+-	RTNLGRP_DECnet_RULE,
+-#define RTNLGRP_DECnet_RULE	RTNLGRP_DECnet_RULE
+-	RTNLGRP_NOP4,
+-	RTNLGRP_IPV6_PREFIX,
+-#define RTNLGRP_IPV6_PREFIX	RTNLGRP_IPV6_PREFIX
+-	RTNLGRP_IPV6_RULE,
+-#define RTNLGRP_IPV6_RULE	RTNLGRP_IPV6_RULE
+-	RTNLGRP_ND_USEROPT,
+-#define RTNLGRP_ND_USEROPT	RTNLGRP_ND_USEROPT
+-	RTNLGRP_PHONET_IFADDR,
+-#define RTNLGRP_PHONET_IFADDR	RTNLGRP_PHONET_IFADDR
+-	RTNLGRP_PHONET_ROUTE,
+-#define RTNLGRP_PHONET_ROUTE	RTNLGRP_PHONET_ROUTE
+-	RTNLGRP_DCB,
+-#define RTNLGRP_DCB		RTNLGRP_DCB
+-	RTNLGRP_IPV4_NETCONF,
+-#define RTNLGRP_IPV4_NETCONF	RTNLGRP_IPV4_NETCONF
+-	RTNLGRP_IPV6_NETCONF,
+-#define RTNLGRP_IPV6_NETCONF	RTNLGRP_IPV6_NETCONF
+-	RTNLGRP_MDB,
+-#define RTNLGRP_MDB		RTNLGRP_MDB
+-	RTNLGRP_MPLS_ROUTE,
+-#define RTNLGRP_MPLS_ROUTE	RTNLGRP_MPLS_ROUTE
+-	RTNLGRP_NSID,
+-#define RTNLGRP_NSID		RTNLGRP_NSID
+-	RTNLGRP_MPLS_NETCONF,
+-#define RTNLGRP_MPLS_NETCONF	RTNLGRP_MPLS_NETCONF
+-	RTNLGRP_IPV4_MROUTE_R,
+-#define RTNLGRP_IPV4_MROUTE_R	RTNLGRP_IPV4_MROUTE_R
+-	RTNLGRP_IPV6_MROUTE_R,
+-#define RTNLGRP_IPV6_MROUTE_R	RTNLGRP_IPV6_MROUTE_R
+-	__RTNLGRP_MAX
+-};
+-#define RTNLGRP_MAX	(__RTNLGRP_MAX - 1)
+-
+-/* TC action piece */
+-struct tcamsg {
+-	unsigned char	tca_family;
+-	unsigned char	tca__pad1;
+-	unsigned short	tca__pad2;
+-};
+-
+-enum {
+-	TCA_ROOT_UNSPEC,
+-	TCA_ROOT_TAB,
+-#define TCA_ACT_TAB TCA_ROOT_TAB
+-#define TCAA_MAX TCA_ROOT_TAB
+-	TCA_ROOT_FLAGS,
+-	TCA_ROOT_COUNT,
+-	TCA_ROOT_TIME_DELTA, /* in msecs */
+-	__TCA_ROOT_MAX,
+-#define	TCA_ROOT_MAX (__TCA_ROOT_MAX - 1)
+-};
+-
+-#define TA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcamsg))))
+-#define TA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcamsg))
+-/* tcamsg flags stored in attribute TCA_ROOT_FLAGS
+- *
+- * TCA_FLAG_LARGE_DUMP_ON user->kernel to request for larger than TCA_ACT_MAX_PRIO
+- * actions in a dump. All dump responses will contain the number of actions
+- * being dumped stored in for user app's consumption in TCA_ROOT_COUNT
+- *
+- */
+-#define TCA_FLAG_LARGE_DUMP_ON		(1 << 0)
+-
+-/* New extended info filters for IFLA_EXT_MASK */
+-#define RTEXT_FILTER_VF		(1 << 0)
+-#define RTEXT_FILTER_BRVLAN	(1 << 1)
+-#define RTEXT_FILTER_BRVLAN_COMPRESSED	(1 << 2)
+-#define	RTEXT_FILTER_SKIP_STATS	(1 << 3)
+-
+-/* End of information exported to user level */
+-
+-
+-
+-#endif /* __LINUX_RTNETLINK_H */
+diff --git a/include/linux/sctp.h b/include/linux/sctp.h
+deleted file mode 100644
+index fec24c4..0000000
+--- a/include/linux/sctp.h
++++ /dev/null
+@@ -1,1085 +0,0 @@
+-/* SCTP kernel implementation
+- * (C) Copyright IBM Corp. 2001, 2004
+- * Copyright (c) 1999-2000 Cisco, Inc.
+- * Copyright (c) 1999-2001 Motorola, Inc.
+- * Copyright (c) 2002 Intel Corp.
+- *
+- * This file is part of the SCTP kernel implementation
+- *
+- * This header represents the structures and constants needed to support
+- * the SCTP Extension to the Sockets API.
+- *
+- * This SCTP implementation is free software;
+- * you can redistribute it and/or modify it under the terms of
+- * the GNU General Public License as published by
+- * the Free Software Foundation; either version 2, or (at your option)
+- * any later version.
+- *
+- * This SCTP implementation is distributed in the hope that it
+- * will be useful, but WITHOUT ANY WARRANTY; without even the implied
+- *                 ************************
+- * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+- * See the GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with GNU CC; see the file COPYING.  If not, see
+- * <http://www.gnu.org/licenses/>.
+- *
+- * Please send any bug reports or fixes you make to the
+- * email address(es):
+- *    lksctp developers <linux-sctp@vger.kernel.org>
+- *
+- * Or submit a bug report through the following website:
+- *    http://www.sf.net/projects/lksctp
+- *
+- * Written or modified by:
+- *    La Monte H.P. Yarroll    <piggy@acm.org>
+- *    R. Stewart               <randall@sctp.chicago.il.us>
+- *    K. Morneau               <kmorneau@cisco.com>
+- *    Q. Xie                   <qxie1@email.mot.com>
+- *    Karl Knutson             <karl@athena.chicago.il.us>
+- *    Jon Grimm                <jgrimm@us.ibm.com>
+- *    Daisy Chang              <daisyc@us.ibm.com>
+- *    Ryan Layer               <rmlayer@us.ibm.com>
+- *    Ardelle Fan              <ardelle.fan@intel.com>
+- *    Sridhar Samudrala        <sri@us.ibm.com>
+- *    Inaky Perez-Gonzalez     <inaky.gonzalez@intel.com>
+- *    Vlad Yasevich            <vladislav.yasevich@hp.com>
+- *
+- * Any bugs reported given to us we will try to fix... any fixes shared will
+- * be incorporated into the next SCTP release.
+- */
+-
+-#ifndef _SCTP_H
+-#define _SCTP_H
+-
+-#include <linux/types.h>
+-#include <linux/socket.h>
+-
+-typedef __s32 sctp_assoc_t;
+-
+-/* The following symbols come from the Sockets API Extensions for
+- * SCTP <draft-ietf-tsvwg-sctpsocket-07.txt>.
+- */
+-#define SCTP_RTOINFO	0
+-#define SCTP_ASSOCINFO  1
+-#define SCTP_INITMSG	2
+-#define SCTP_NODELAY	3		/* Get/set nodelay option. */
+-#define SCTP_AUTOCLOSE	4
+-#define SCTP_SET_PEER_PRIMARY_ADDR 5
+-#define SCTP_PRIMARY_ADDR	6
+-#define SCTP_ADAPTATION_LAYER	7
+-#define SCTP_DISABLE_FRAGMENTS	8
+-#define SCTP_PEER_ADDR_PARAMS	9
+-#define SCTP_DEFAULT_SEND_PARAM	10
+-#define SCTP_EVENTS	11
+-#define SCTP_I_WANT_MAPPED_V4_ADDR 12	/* Turn on/off mapped v4 addresses  */
+-#define SCTP_MAXSEG	13		/* Get/set maximum fragment. */
+-#define SCTP_STATUS	14
+-#define SCTP_GET_PEER_ADDR_INFO	15
+-#define SCTP_DELAYED_ACK_TIME	16
+-#define SCTP_DELAYED_ACK SCTP_DELAYED_ACK_TIME
+-#define SCTP_DELAYED_SACK SCTP_DELAYED_ACK_TIME
+-#define SCTP_CONTEXT	17
+-#define SCTP_FRAGMENT_INTERLEAVE	18
+-#define SCTP_PARTIAL_DELIVERY_POINT	19 /* Set/Get partial delivery point */
+-#define SCTP_MAX_BURST	20		/* Set/Get max burst */
+-#define SCTP_AUTH_CHUNK	21	/* Set only: add a chunk type to authenticate */
+-#define SCTP_HMAC_IDENT	22
+-#define SCTP_AUTH_KEY	23
+-#define SCTP_AUTH_ACTIVE_KEY	24
+-#define SCTP_AUTH_DELETE_KEY	25
+-#define SCTP_PEER_AUTH_CHUNKS	26	/* Read only */
+-#define SCTP_LOCAL_AUTH_CHUNKS	27	/* Read only */
+-#define SCTP_GET_ASSOC_NUMBER	28	/* Read only */
+-#define SCTP_GET_ASSOC_ID_LIST	29	/* Read only */
+-#define SCTP_AUTO_ASCONF       30
+-#define SCTP_PEER_ADDR_THLDS	31
+-#define SCTP_RECVRCVINFO	32
+-#define SCTP_RECVNXTINFO	33
+-#define SCTP_DEFAULT_SNDINFO	34
+-
+-/* Internal Socket Options. Some of the sctp library functions are
+- * implemented using these socket options.
+- */
+-#define SCTP_SOCKOPT_BINDX_ADD	100	/* BINDX requests for adding addrs */
+-#define SCTP_SOCKOPT_BINDX_REM	101	/* BINDX requests for removing addrs. */
+-#define SCTP_SOCKOPT_PEELOFF	102	/* peel off association. */
+-/* Options 104-106 are deprecated and removed. Do not use this space */
+-#define SCTP_SOCKOPT_CONNECTX_OLD	107	/* CONNECTX old requests. */
+-#define SCTP_GET_PEER_ADDRS	108		/* Get all peer address. */
+-#define SCTP_GET_LOCAL_ADDRS	109		/* Get all local address. */
+-#define SCTP_SOCKOPT_CONNECTX	110		/* CONNECTX requests. */
+-#define SCTP_SOCKOPT_CONNECTX3	111	/* CONNECTX requests (updated) */
+-#define SCTP_GET_ASSOC_STATS	112	/* Read only */
+-#define SCTP_PR_SUPPORTED	113
+-#define SCTP_DEFAULT_PRINFO	114
+-#define SCTP_PR_ASSOC_STATUS	115
+-#define SCTP_PR_STREAM_STATUS	116
+-#define SCTP_RECONFIG_SUPPORTED	117
+-#define SCTP_ENABLE_STREAM_RESET	118
+-#define SCTP_RESET_STREAMS	119
+-#define SCTP_RESET_ASSOC	120
+-#define SCTP_ADD_STREAMS	121
+-#define SCTP_SOCKOPT_PEELOFF_FLAGS 122
+-
+-/* PR-SCTP policies */
+-#define SCTP_PR_SCTP_NONE	0x0000
+-#define SCTP_PR_SCTP_TTL	0x0010
+-#define SCTP_PR_SCTP_RTX	0x0020
+-#define SCTP_PR_SCTP_PRIO	0x0030
+-#define SCTP_PR_SCTP_MAX	SCTP_PR_SCTP_PRIO
+-#define SCTP_PR_SCTP_MASK	0x0030
+-
+-#define __SCTP_PR_INDEX(x)	((x >> 4) - 1)
+-#define SCTP_PR_INDEX(x)	__SCTP_PR_INDEX(SCTP_PR_SCTP_ ## x)
+-
+-#define SCTP_PR_POLICY(x)	((x) & SCTP_PR_SCTP_MASK)
+-#define SCTP_PR_SET_POLICY(flags, x)	\
+-	do {				\
+-		flags &= ~SCTP_PR_SCTP_MASK;	\
+-		flags |= x;		\
+-	} while (0)
+-
+-#define SCTP_PR_TTL_ENABLED(x)	(SCTP_PR_POLICY(x) == SCTP_PR_SCTP_TTL)
+-#define SCTP_PR_RTX_ENABLED(x)	(SCTP_PR_POLICY(x) == SCTP_PR_SCTP_RTX)
+-#define SCTP_PR_PRIO_ENABLED(x)	(SCTP_PR_POLICY(x) == SCTP_PR_SCTP_PRIO)
+-
+-/* For enable stream reset */
+-#define SCTP_ENABLE_RESET_STREAM_REQ	0x01
+-#define SCTP_ENABLE_RESET_ASSOC_REQ	0x02
+-#define SCTP_ENABLE_CHANGE_ASSOC_REQ	0x04
+-#define SCTP_ENABLE_STRRESET_MASK	0x07
+-
+-#define SCTP_STREAM_RESET_INCOMING	0x01
+-#define SCTP_STREAM_RESET_OUTGOING	0x02
+-
+-/* These are bit fields for msghdr->msg_flags.  See section 5.1.  */
+-/* On user space Linux, these live in <bits/socket.h> as an enum.  */
+-enum sctp_msg_flags {
+-	MSG_NOTIFICATION = 0x8000,
+-#define MSG_NOTIFICATION MSG_NOTIFICATION
+-};
+-
+-/* 5.3.1 SCTP Initiation Structure (SCTP_INIT)
+- *
+- *   This cmsghdr structure provides information for initializing new
+- *   SCTP associations with sendmsg().  The SCTP_INITMSG socket option
+- *   uses this same data structure.  This structure is not used for
+- *   recvmsg().
+- *
+- *   cmsg_level    cmsg_type      cmsg_data[]
+- *   ------------  ------------   ----------------------
+- *   IPPROTO_SCTP  SCTP_INIT      struct sctp_initmsg
+- */
+-struct sctp_initmsg {
+-	__u16 sinit_num_ostreams;
+-	__u16 sinit_max_instreams;
+-	__u16 sinit_max_attempts;
+-	__u16 sinit_max_init_timeo;
+-};
+-
+-/* 5.3.2 SCTP Header Information Structure (SCTP_SNDRCV)
+- *
+- *   This cmsghdr structure specifies SCTP options for sendmsg() and
+- *   describes SCTP header information about a received message through
+- *   recvmsg().
+- *
+- *   cmsg_level    cmsg_type      cmsg_data[]
+- *   ------------  ------------   ----------------------
+- *   IPPROTO_SCTP  SCTP_SNDRCV    struct sctp_sndrcvinfo
+- */
+-struct sctp_sndrcvinfo {
+-	__u16 sinfo_stream;
+-	__u16 sinfo_ssn;
+-	__u16 sinfo_flags;
+-	__u32 sinfo_ppid;
+-	__u32 sinfo_context;
+-	__u32 sinfo_timetolive;
+-	__u32 sinfo_tsn;
+-	__u32 sinfo_cumtsn;
+-	sctp_assoc_t sinfo_assoc_id;
+-};
+-
+-/* 5.3.4 SCTP Send Information Structure (SCTP_SNDINFO)
+- *
+- *   This cmsghdr structure specifies SCTP options for sendmsg().
+- *
+- *   cmsg_level    cmsg_type      cmsg_data[]
+- *   ------------  ------------   -------------------
+- *   IPPROTO_SCTP  SCTP_SNDINFO   struct sctp_sndinfo
+- */
+-struct sctp_sndinfo {
+-	__u16 snd_sid;
+-	__u16 snd_flags;
+-	__u32 snd_ppid;
+-	__u32 snd_context;
+-	sctp_assoc_t snd_assoc_id;
+-};
+-
+-/* 5.3.5 SCTP Receive Information Structure (SCTP_RCVINFO)
+- *
+- *   This cmsghdr structure describes SCTP receive information
+- *   about a received message through recvmsg().
+- *
+- *   cmsg_level    cmsg_type      cmsg_data[]
+- *   ------------  ------------   -------------------
+- *   IPPROTO_SCTP  SCTP_RCVINFO   struct sctp_rcvinfo
+- */
+-struct sctp_rcvinfo {
+-	__u16 rcv_sid;
+-	__u16 rcv_ssn;
+-	__u16 rcv_flags;
+-	__u32 rcv_ppid;
+-	__u32 rcv_tsn;
+-	__u32 rcv_cumtsn;
+-	__u32 rcv_context;
+-	sctp_assoc_t rcv_assoc_id;
+-};
+-
+-/* 5.3.6 SCTP Next Receive Information Structure (SCTP_NXTINFO)
+- *
+- *   This cmsghdr structure describes SCTP receive information
+- *   of the next message that will be delivered through recvmsg()
+- *   if this information is already available when delivering
+- *   the current message.
+- *
+- *   cmsg_level    cmsg_type      cmsg_data[]
+- *   ------------  ------------   -------------------
+- *   IPPROTO_SCTP  SCTP_NXTINFO   struct sctp_nxtinfo
+- */
+-struct sctp_nxtinfo {
+-	__u16 nxt_sid;
+-	__u16 nxt_flags;
+-	__u32 nxt_ppid;
+-	__u32 nxt_length;
+-	sctp_assoc_t nxt_assoc_id;
+-};
+-
+-/*
+- *  sinfo_flags: 16 bits (unsigned integer)
+- *
+- *   This field may contain any of the following flags and is composed of
+- *   a bitwise OR of these values.
+- */
+-enum sctp_sinfo_flags {
+-	SCTP_UNORDERED		= (1 << 0), /* Send/receive message unordered. */
+-	SCTP_ADDR_OVER		= (1 << 1), /* Override the primary destination. */
+-	SCTP_ABORT		= (1 << 2), /* Send an ABORT message to the peer. */
+-	SCTP_SACK_IMMEDIATELY	= (1 << 3), /* SACK should be sent without delay. */
+-	SCTP_NOTIFICATION	= MSG_NOTIFICATION, /* Next message is not user msg but notification. */
+-	SCTP_EOF		= MSG_FIN,  /* Initiate graceful shutdown process. */
+-};
+-
+-typedef union {
+-	__u8   			raw;
+-	struct sctp_initmsg	init;
+-	struct sctp_sndrcvinfo	sndrcv;
+-} sctp_cmsg_data_t;
+-
+-/* These are cmsg_types.  */
+-typedef enum sctp_cmsg_type {
+-	SCTP_INIT,		/* 5.2.1 SCTP Initiation Structure */
+-#define SCTP_INIT	SCTP_INIT
+-	SCTP_SNDRCV,		/* 5.2.2 SCTP Header Information Structure */
+-#define SCTP_SNDRCV	SCTP_SNDRCV
+-	SCTP_SNDINFO,		/* 5.3.4 SCTP Send Information Structure */
+-#define SCTP_SNDINFO	SCTP_SNDINFO
+-	SCTP_RCVINFO,		/* 5.3.5 SCTP Receive Information Structure */
+-#define SCTP_RCVINFO	SCTP_RCVINFO
+-	SCTP_NXTINFO,		/* 5.3.6 SCTP Next Receive Information Structure */
+-#define SCTP_NXTINFO	SCTP_NXTINFO
+-} sctp_cmsg_t;
+-
+-/*
+- * 5.3.1.1 SCTP_ASSOC_CHANGE
+- *
+- *   Communication notifications inform the ULP that an SCTP association
+- *   has either begun or ended. The identifier for a new association is
+- *   provided by this notificaion. The notification information has the
+- *   following format:
+- *
+- */
+-struct sctp_assoc_change {
+-	__u16 sac_type;
+-	__u16 sac_flags;
+-	__u32 sac_length;
+-	__u16 sac_state;
+-	__u16 sac_error;
+-	__u16 sac_outbound_streams;
+-	__u16 sac_inbound_streams;
+-	sctp_assoc_t sac_assoc_id;
+-	__u8 sac_info[0];
+-};
+-
+-/*
+- *   sac_state: 32 bits (signed integer)
+- *
+- *   This field holds one of a number of values that communicate the
+- *   event that happened to the association.  They include:
+- *
+- *   Note:  The following state names deviate from the API draft as
+- *   the names clash too easily with other kernel symbols.
+- */
+-enum sctp_sac_state {
+-	SCTP_COMM_UP,
+-	SCTP_COMM_LOST,
+-	SCTP_RESTART,
+-	SCTP_SHUTDOWN_COMP,
+-	SCTP_CANT_STR_ASSOC,
+-};
+-
+-/*
+- * 5.3.1.2 SCTP_PEER_ADDR_CHANGE
+- *
+- *   When a destination address on a multi-homed peer encounters a change
+- *   an interface details event is sent.  The information has the
+- *   following structure:
+- */
+-struct sctp_paddr_change {
+-	__u16 spc_type;
+-	__u16 spc_flags;
+-	__u32 spc_length;
+-	struct sockaddr_storage spc_aaddr;
+-	int spc_state;
+-	int spc_error;
+-	sctp_assoc_t spc_assoc_id;
+-} __attribute__((packed, aligned(4)));
+-
+-/*
+- *    spc_state:  32 bits (signed integer)
+- *
+- *   This field holds one of a number of values that communicate the
+- *   event that happened to the address.  They include:
+- */
+-enum sctp_spc_state {
+-	SCTP_ADDR_AVAILABLE,
+-	SCTP_ADDR_UNREACHABLE,
+-	SCTP_ADDR_REMOVED,
+-	SCTP_ADDR_ADDED,
+-	SCTP_ADDR_MADE_PRIM,
+-	SCTP_ADDR_CONFIRMED,
+-};
+-
+-
+-/*
+- * 5.3.1.3 SCTP_REMOTE_ERROR
+- *
+- *   A remote peer may send an Operational Error message to its peer.
+- *   This message indicates a variety of error conditions on an
+- *   association. The entire error TLV as it appears on the wire is
+- *   included in a SCTP_REMOTE_ERROR event.  Please refer to the SCTP
+- *   specification [SCTP] and any extensions for a list of possible
+- *   error formats. SCTP error TLVs have the format:
+- */
+-struct sctp_remote_error {
+-	__u16 sre_type;
+-	__u16 sre_flags;
+-	__u32 sre_length;
+-	__u16 sre_error;
+-	sctp_assoc_t sre_assoc_id;
+-	__u8 sre_data[0];
+-};
+-
+-
+-/*
+- * 5.3.1.4 SCTP_SEND_FAILED
+- *
+- *   If SCTP cannot deliver a message it may return the message as a
+- *   notification.
+- */
+-struct sctp_send_failed {
+-	__u16 ssf_type;
+-	__u16 ssf_flags;
+-	__u32 ssf_length;
+-	__u32 ssf_error;
+-	struct sctp_sndrcvinfo ssf_info;
+-	sctp_assoc_t ssf_assoc_id;
+-	__u8 ssf_data[0];
+-};
+-
+-/*
+- *   ssf_flags: 16 bits (unsigned integer)
+- *
+- *   The flag value will take one of the following values
+- *
+- *   SCTP_DATA_UNSENT  - Indicates that the data was never put on
+- *                       the wire.
+- *
+- *   SCTP_DATA_SENT    - Indicates that the data was put on the wire.
+- *                       Note that this does not necessarily mean that the
+- *                       data was (or was not) successfully delivered.
+- */
+-enum sctp_ssf_flags {
+-	SCTP_DATA_UNSENT,
+-	SCTP_DATA_SENT,
+-};
+-
+-/*
+- * 5.3.1.5 SCTP_SHUTDOWN_EVENT
+- *
+- *   When a peer sends a SHUTDOWN, SCTP delivers this notification to
+- *   inform the application that it should cease sending data.
+- */
+-struct sctp_shutdown_event {
+-	__u16 sse_type;
+-	__u16 sse_flags;
+-	__u32 sse_length;
+-	sctp_assoc_t sse_assoc_id;
+-};
+-
+-/*
+- * 5.3.1.6 SCTP_ADAPTATION_INDICATION
+- *
+- *   When a peer sends a Adaptation Layer Indication parameter , SCTP
+- *   delivers this notification to inform the application
+- *   that of the peers requested adaptation layer.
+- */
+-struct sctp_adaptation_event {
+-	__u16 sai_type;
+-	__u16 sai_flags;
+-	__u32 sai_length;
+-	__u32 sai_adaptation_ind;
+-	sctp_assoc_t sai_assoc_id;
+-};
+-
+-/*
+- * 5.3.1.7 SCTP_PARTIAL_DELIVERY_EVENT
+- *
+- *   When a receiver is engaged in a partial delivery of a
+- *   message this notification will be used to indicate
+- *   various events.
+- */
+-struct sctp_pdapi_event {
+-	__u16 pdapi_type;
+-	__u16 pdapi_flags;
+-	__u32 pdapi_length;
+-	__u32 pdapi_indication;
+-	sctp_assoc_t pdapi_assoc_id;
+-};
+-
+-enum { SCTP_PARTIAL_DELIVERY_ABORTED=0, };
+-
+-/*
+- * 5.3.1.8.  SCTP_AUTHENTICATION_EVENT
+- *
+- *  When a receiver is using authentication this message will provide
+- *  notifications regarding new keys being made active as well as errors.
+- */
+-struct sctp_authkey_event {
+-	__u16 auth_type;
+-	__u16 auth_flags;
+-	__u32 auth_length;
+-	__u16 auth_keynumber;
+-	__u16 auth_altkeynumber;
+-	__u32 auth_indication;
+-	sctp_assoc_t auth_assoc_id;
+-};
+-
+-enum { SCTP_AUTH_NEWKEY = 0, };
+-
+-/*
+- * 6.1.9. SCTP_SENDER_DRY_EVENT
+- *
+- * When the SCTP stack has no more user data to send or retransmit, this
+- * notification is given to the user. Also, at the time when a user app
+- * subscribes to this event, if there is no data to be sent or
+- * retransmit, the stack will immediately send up this notification.
+- */
+-struct sctp_sender_dry_event {
+-	__u16 sender_dry_type;
+-	__u16 sender_dry_flags;
+-	__u32 sender_dry_length;
+-	sctp_assoc_t sender_dry_assoc_id;
+-};
+-
+-#define SCTP_STREAM_RESET_INCOMING_SSN	0x0001
+-#define SCTP_STREAM_RESET_OUTGOING_SSN	0x0002
+-#define SCTP_STREAM_RESET_DENIED	0x0004
+-#define SCTP_STREAM_RESET_FAILED	0x0008
+-struct sctp_stream_reset_event {
+-	__u16 strreset_type;
+-	__u16 strreset_flags;
+-	__u32 strreset_length;
+-	sctp_assoc_t strreset_assoc_id;
+-	__u16 strreset_stream_list[];
+-};
+-
+-#define SCTP_ASSOC_RESET_DENIED		0x0004
+-#define SCTP_ASSOC_RESET_FAILED		0x0008
+-struct sctp_assoc_reset_event {
+-	__u16 assocreset_type;
+-	__u16 assocreset_flags;
+-	__u32 assocreset_length;
+-	sctp_assoc_t assocreset_assoc_id;
+-	__u32 assocreset_local_tsn;
+-	__u32 assocreset_remote_tsn;
+-};
+-
+-#define SCTP_ASSOC_CHANGE_DENIED	0x0004
+-#define SCTP_ASSOC_CHANGE_FAILED	0x0008
+-struct sctp_stream_change_event {
+-	__u16 strchange_type;
+-	__u16 strchange_flags;
+-	__u32 strchange_length;
+-	sctp_assoc_t strchange_assoc_id;
+-	__u16 strchange_instrms;
+-	__u16 strchange_outstrms;
+-};
+-
+-/*
+- * Described in Section 7.3
+- *   Ancillary Data and Notification Interest Options
+- */
+-struct sctp_event_subscribe {
+-	__u8 sctp_data_io_event;
+-	__u8 sctp_association_event;
+-	__u8 sctp_address_event;
+-	__u8 sctp_send_failure_event;
+-	__u8 sctp_peer_error_event;
+-	__u8 sctp_shutdown_event;
+-	__u8 sctp_partial_delivery_event;
+-	__u8 sctp_adaptation_layer_event;
+-	__u8 sctp_authentication_event;
+-	__u8 sctp_sender_dry_event;
+-	__u8 sctp_stream_reset_event;
+-	__u8 sctp_assoc_reset_event;
+-	__u8 sctp_stream_change_event;
+-};
+-
+-/*
+- * 5.3.1 SCTP Notification Structure
+- *
+- *   The notification structure is defined as the union of all
+- *   notification types.
+- *
+- */
+-union sctp_notification {
+-	struct {
+-		__u16 sn_type;             /* Notification type. */
+-		__u16 sn_flags;
+-		__u32 sn_length;
+-	} sn_header;
+-	struct sctp_assoc_change sn_assoc_change;
+-	struct sctp_paddr_change sn_paddr_change;
+-	struct sctp_remote_error sn_remote_error;
+-	struct sctp_send_failed sn_send_failed;
+-	struct sctp_shutdown_event sn_shutdown_event;
+-	struct sctp_adaptation_event sn_adaptation_event;
+-	struct sctp_pdapi_event sn_pdapi_event;
+-	struct sctp_authkey_event sn_authkey_event;
+-	struct sctp_sender_dry_event sn_sender_dry_event;
+-	struct sctp_stream_reset_event sn_strreset_event;
+-	struct sctp_assoc_reset_event sn_assocreset_event;
+-	struct sctp_stream_change_event sn_strchange_event;
+-};
+-
+-/* Section 5.3.1
+- * All standard values for sn_type flags are greater than 2^15.
+- * Values from 2^15 and down are reserved.
+- */
+-
+-enum sctp_sn_type {
+-	SCTP_SN_TYPE_BASE     = (1<<15),
+-	SCTP_ASSOC_CHANGE,
+-#define SCTP_ASSOC_CHANGE		SCTP_ASSOC_CHANGE
+-	SCTP_PEER_ADDR_CHANGE,
+-#define SCTP_PEER_ADDR_CHANGE		SCTP_PEER_ADDR_CHANGE
+-	SCTP_SEND_FAILED,
+-#define SCTP_SEND_FAILED		SCTP_SEND_FAILED
+-	SCTP_REMOTE_ERROR,
+-#define SCTP_REMOTE_ERROR		SCTP_REMOTE_ERROR
+-	SCTP_SHUTDOWN_EVENT,
+-#define SCTP_SHUTDOWN_EVENT		SCTP_SHUTDOWN_EVENT
+-	SCTP_PARTIAL_DELIVERY_EVENT,
+-#define SCTP_PARTIAL_DELIVERY_EVENT	SCTP_PARTIAL_DELIVERY_EVENT
+-	SCTP_ADAPTATION_INDICATION,
+-#define SCTP_ADAPTATION_INDICATION	SCTP_ADAPTATION_INDICATION
+-	SCTP_AUTHENTICATION_EVENT,
+-#define SCTP_AUTHENTICATION_INDICATION	SCTP_AUTHENTICATION_EVENT
+-	SCTP_SENDER_DRY_EVENT,
+-#define SCTP_SENDER_DRY_EVENT		SCTP_SENDER_DRY_EVENT
+-	SCTP_STREAM_RESET_EVENT,
+-#define SCTP_STREAM_RESET_EVENT		SCTP_STREAM_RESET_EVENT
+-	SCTP_ASSOC_RESET_EVENT,
+-#define SCTP_ASSOC_RESET_EVENT		SCTP_ASSOC_RESET_EVENT
+-	SCTP_STREAM_CHANGE_EVENT,
+-#define SCTP_STREAM_CHANGE_EVENT	SCTP_STREAM_CHANGE_EVENT
+-};
+-
+-/* Notification error codes used to fill up the error fields in some
+- * notifications.
+- * SCTP_PEER_ADDRESS_CHAGE 	: spc_error
+- * SCTP_ASSOC_CHANGE		: sac_error
+- * These names should be potentially included in the draft 04 of the SCTP
+- * sockets API specification.
+- */
+-typedef enum sctp_sn_error {
+-	SCTP_FAILED_THRESHOLD,
+-	SCTP_RECEIVED_SACK,
+-	SCTP_HEARTBEAT_SUCCESS,
+-	SCTP_RESPONSE_TO_USER_REQ,
+-	SCTP_INTERNAL_ERROR,
+-	SCTP_SHUTDOWN_GUARD_EXPIRES,
+-	SCTP_PEER_FAULTY,
+-} sctp_sn_error_t;
+-
+-/*
+- * 7.1.1 Retransmission Timeout Parameters (SCTP_RTOINFO)
+- *
+- *   The protocol parameters used to initialize and bound retransmission
+- *   timeout (RTO) are tunable.  See [SCTP] for more information on how
+- *   these parameters are used in RTO calculation.
+- */
+-struct sctp_rtoinfo {
+-	sctp_assoc_t	srto_assoc_id;
+-	__u32		srto_initial;
+-	__u32		srto_max;
+-	__u32		srto_min;
+-};
+-
+-/*
+- * 7.1.2 Association Parameters (SCTP_ASSOCINFO)
+- *
+- *   This option is used to both examine and set various association and
+- *   endpoint parameters.
+- */
+-struct sctp_assocparams {
+-	sctp_assoc_t	sasoc_assoc_id;
+-	__u16		sasoc_asocmaxrxt;
+-	__u16		sasoc_number_peer_destinations;
+-	__u32		sasoc_peer_rwnd;
+-	__u32		sasoc_local_rwnd;
+-	__u32		sasoc_cookie_life;
+-};
+-
+-/*
+- * 7.1.9 Set Peer Primary Address (SCTP_SET_PEER_PRIMARY_ADDR)
+- *
+- *  Requests that the peer mark the enclosed address as the association
+- *  primary. The enclosed address must be one of the association's
+- *  locally bound addresses. The following structure is used to make a
+- *   set primary request:
+- */
+-struct sctp_setpeerprim {
+-	sctp_assoc_t            sspp_assoc_id;
+-	struct sockaddr_storage sspp_addr;
+-} __attribute__((packed, aligned(4)));
+-
+-/*
+- * 7.1.10 Set Primary Address (SCTP_PRIMARY_ADDR)
+- *
+- *  Requests that the local SCTP stack use the enclosed peer address as
+- *  the association primary. The enclosed address must be one of the
+- *  association peer's addresses. The following structure is used to
+- *  make a set peer primary request:
+- */
+-struct sctp_prim {
+-	sctp_assoc_t            ssp_assoc_id;
+-	struct sockaddr_storage ssp_addr;
+-} __attribute__((packed, aligned(4)));
+-
+-/* For backward compatibility use, define the old name too */
+-#define sctp_setprim	sctp_prim
+-
+-/*
+- * 7.1.11 Set Adaptation Layer Indicator (SCTP_ADAPTATION_LAYER)
+- *
+- * Requests that the local endpoint set the specified Adaptation Layer
+- * Indication parameter for all future INIT and INIT-ACK exchanges.
+- */
+-struct sctp_setadaptation {
+-	__u32	ssb_adaptation_ind;
+-};
+-
+-/*
+- * 7.1.13 Peer Address Parameters  (SCTP_PEER_ADDR_PARAMS)
+- *
+- *   Applications can enable or disable heartbeats for any peer address
+- *   of an association, modify an address's heartbeat interval, force a
+- *   heartbeat to be sent immediately, and adjust the address's maximum
+- *   number of retransmissions sent before an address is considered
+- *   unreachable. The following structure is used to access and modify an
+- *   address's parameters:
+- */
+-enum  sctp_spp_flags {
+-	SPP_HB_ENABLE = 1<<0,		/*Enable heartbeats*/
+-	SPP_HB_DISABLE = 1<<1,		/*Disable heartbeats*/
+-	SPP_HB = SPP_HB_ENABLE | SPP_HB_DISABLE,
+-	SPP_HB_DEMAND = 1<<2,		/*Send heartbeat immediately*/
+-	SPP_PMTUD_ENABLE = 1<<3,	/*Enable PMTU discovery*/
+-	SPP_PMTUD_DISABLE = 1<<4,	/*Disable PMTU discovery*/
+-	SPP_PMTUD = SPP_PMTUD_ENABLE | SPP_PMTUD_DISABLE,
+-	SPP_SACKDELAY_ENABLE = 1<<5,	/*Enable SACK*/
+-	SPP_SACKDELAY_DISABLE = 1<<6,	/*Disable SACK*/
+-	SPP_SACKDELAY = SPP_SACKDELAY_ENABLE | SPP_SACKDELAY_DISABLE,
+-	SPP_HB_TIME_IS_ZERO = 1<<7,	/* Set HB delay to 0 */
+-};
+-
+-struct sctp_paddrparams {
+-	sctp_assoc_t		spp_assoc_id;
+-	struct sockaddr_storage	spp_address;
+-	__u32			spp_hbinterval;
+-	__u16			spp_pathmaxrxt;
+-	__u32			spp_pathmtu;
+-	__u32			spp_sackdelay;
+-	__u32			spp_flags;
+-} __attribute__((packed, aligned(4)));
+-
+-/*
+- * 7.1.18.  Add a chunk that must be authenticated (SCTP_AUTH_CHUNK)
+- *
+- * This set option adds a chunk type that the user is requesting to be
+- * received only in an authenticated way.  Changes to the list of chunks
+- * will only effect future associations on the socket.
+- */
+-struct sctp_authchunk {
+-	__u8		sauth_chunk;
+-};
+-
+-/*
+- * 7.1.19.  Get or set the list of supported HMAC Identifiers (SCTP_HMAC_IDENT)
+- *
+- * This option gets or sets the list of HMAC algorithms that the local
+- * endpoint requires the peer to use.
+- */
+-/* This here is only used by user space as is. It might not be a good idea
+- * to export/reveal the whole structure with reserved fields etc.
+- */
+-enum {
+-	SCTP_AUTH_HMAC_ID_SHA1 = 1,
+-	SCTP_AUTH_HMAC_ID_SHA256 = 3,
+-};
+-
+-struct sctp_hmacalgo {
+-	__u32		shmac_num_idents;
+-	__u16		shmac_idents[];
+-};
+-
+-/* Sadly, user and kernel space have different names for
+- * this structure member, so this is to not break anything.
+- */
+-#define shmac_number_of_idents	shmac_num_idents
+-
+-/*
+- * 7.1.20.  Set a shared key (SCTP_AUTH_KEY)
+- *
+- * This option will set a shared secret key which is used to build an
+- * association shared key.
+- */
+-struct sctp_authkey {
+-	sctp_assoc_t	sca_assoc_id;
+-	__u16		sca_keynumber;
+-	__u16		sca_keylength;
+-	__u8		sca_key[];
+-};
+-
+-/*
+- * 7.1.21.  Get or set the active shared key (SCTP_AUTH_ACTIVE_KEY)
+- *
+- * This option will get or set the active shared key to be used to build
+- * the association shared key.
+- */
+-
+-struct sctp_authkeyid {
+-	sctp_assoc_t	scact_assoc_id;
+-	__u16		scact_keynumber;
+-};
+-
+-
+-/*
+- * 7.1.23.  Get or set delayed ack timer (SCTP_DELAYED_SACK)
+- *
+- * This option will effect the way delayed acks are performed.  This
+- * option allows you to get or set the delayed ack time, in
+- * milliseconds.  It also allows changing the delayed ack frequency.
+- * Changing the frequency to 1 disables the delayed sack algorithm.  If
+- * the assoc_id is 0, then this sets or gets the endpoints default
+- * values.  If the assoc_id field is non-zero, then the set or get
+- * effects the specified association for the one to many model (the
+- * assoc_id field is ignored by the one to one model).  Note that if
+- * sack_delay or sack_freq are 0 when setting this option, then the
+- * current values will remain unchanged.
+- */
+-struct sctp_sack_info {
+-	sctp_assoc_t	sack_assoc_id;
+-	uint32_t	sack_delay;
+-	uint32_t	sack_freq;
+-};
+-
+-struct sctp_assoc_value {
+-    sctp_assoc_t            assoc_id;
+-    uint32_t                assoc_value;
+-};
+-
+-/*
+- * 7.2.2 Peer Address Information
+- *
+- *   Applications can retrieve information about a specific peer address
+- *   of an association, including its reachability state, congestion
+- *   window, and retransmission timer values.  This information is
+- *   read-only. The following structure is used to access this
+- *   information:
+- */
+-struct sctp_paddrinfo {
+-	sctp_assoc_t		spinfo_assoc_id;
+-	struct sockaddr_storage	spinfo_address;
+-	__s32			spinfo_state;
+-	__u32			spinfo_cwnd;
+-	__u32			spinfo_srtt;
+-	__u32			spinfo_rto;
+-	__u32			spinfo_mtu;
+-} __attribute__((packed, aligned(4)));
+-
+-/* Peer addresses's state. */
+-/* UNKNOWN: Peer address passed by the upper layer in sendmsg or connect[x]
+- * calls.
+- * UNCONFIRMED: Peer address received in INIT/INIT-ACK address parameters.
+- *              Not yet confirmed by a heartbeat and not available for data
+- *		transfers.
+- * ACTIVE : Peer address confirmed, active and available for data transfers.
+- * INACTIVE: Peer address inactive and not available for data transfers.
+- */
+-enum sctp_spinfo_state {
+-	SCTP_INACTIVE,
+-	SCTP_PF,
+-	SCTP_ACTIVE,
+-	SCTP_UNCONFIRMED,
+-	SCTP_UNKNOWN = 0xffff  /* Value used for transport state unknown */
+-};
+-
+-/*
+- * 7.2.1 Association Status (SCTP_STATUS)
+- *
+- *   Applications can retrieve current status information about an
+- *   association, including association state, peer receiver window size,
+- *   number of unacked data chunks, and number of data chunks pending
+- *   receipt.  This information is read-only.  The following structure is
+- *   used to access this information:
+- */
+-struct sctp_status {
+-	sctp_assoc_t		sstat_assoc_id;
+-	__s32			sstat_state;
+-	__u32			sstat_rwnd;
+-	__u16			sstat_unackdata;
+-	__u16			sstat_penddata;
+-	__u16			sstat_instrms;
+-	__u16			sstat_outstrms;
+-	__u32			sstat_fragmentation_point;
+-	struct sctp_paddrinfo	sstat_primary;
+-};
+-
+-/*
+- * 7.2.3.  Get the list of chunks the peer requires to be authenticated
+- *         (SCTP_PEER_AUTH_CHUNKS)
+- *
+- * This option gets a list of chunks for a specified association that
+- * the peer requires to be received authenticated only.
+- */
+-struct sctp_authchunks {
+-	sctp_assoc_t	gauth_assoc_id;
+-	__u32		gauth_number_of_chunks;
+-	uint8_t		gauth_chunks[];
+-};
+-
+-/* The broken spelling has been released already in lksctp-tools header,
+- * so don't break anyone, now that it's fixed.
+- */
+-#define guth_number_of_chunks	gauth_number_of_chunks
+-
+-/* Association states.  */
+-enum sctp_sstat_state {
+-	SCTP_EMPTY                = 0,
+-	SCTP_CLOSED               = 1,
+-	SCTP_COOKIE_WAIT          = 2,
+-	SCTP_COOKIE_ECHOED        = 3,
+-	SCTP_ESTABLISHED          = 4,
+-	SCTP_SHUTDOWN_PENDING     = 5,
+-	SCTP_SHUTDOWN_SENT        = 6,
+-	SCTP_SHUTDOWN_RECEIVED    = 7,
+-	SCTP_SHUTDOWN_ACK_SENT    = 8,
+-};
+-
+-/*
+- * 8.2.6. Get the Current Identifiers of Associations
+- *        (SCTP_GET_ASSOC_ID_LIST)
+- *
+- * This option gets the current list of SCTP association identifiers of
+- * the SCTP associations handled by a one-to-many style socket.
+- */
+-struct sctp_assoc_ids {
+-	__u32		gaids_number_of_ids;
+-	sctp_assoc_t	gaids_assoc_id[];
+-};
+-
+-/*
+- * 8.3, 8.5 get all peer/local addresses in an association.
+- * This parameter struct is used by SCTP_GET_PEER_ADDRS and
+- * SCTP_GET_LOCAL_ADDRS socket options used internally to implement
+- * sctp_getpaddrs() and sctp_getladdrs() API.
+- */
+-struct sctp_getaddrs_old {
+-	sctp_assoc_t            assoc_id;
+-	int			addr_num;
+-	struct sockaddr		*addrs;
+-};
+-
+-struct sctp_getaddrs {
+-	sctp_assoc_t		assoc_id; /*input*/
+-	__u32			addr_num; /*output*/
+-	__u8			addrs[0]; /*output, variable size*/
+-};
+-
+-/* A socket user request obtained via SCTP_GET_ASSOC_STATS that retrieves
+- * association stats. All stats are counts except sas_maxrto and
+- * sas_obs_rto_ipaddr. maxrto is the max observed rto + transport since
+- * the last call. Will return 0 when RTO was not update since last call
+- */
+-struct sctp_assoc_stats {
+-	sctp_assoc_t	sas_assoc_id;    /* Input */
+-					 /* Transport of observed max RTO */
+-	struct sockaddr_storage sas_obs_rto_ipaddr;
+-	__u64		sas_maxrto;      /* Maximum Observed RTO for period */
+-	__u64		sas_isacks;	 /* SACKs received */
+-	__u64		sas_osacks;	 /* SACKs sent */
+-	__u64		sas_opackets;	 /* Packets sent */
+-	__u64		sas_ipackets;	 /* Packets received */
+-	__u64		sas_rtxchunks;   /* Retransmitted Chunks */
+-	__u64		sas_outofseqtsns;/* TSN received > next expected */
+-	__u64		sas_idupchunks;  /* Dups received (ordered+unordered) */
+-	__u64		sas_gapcnt;      /* Gap Acknowledgements Received */
+-	__u64		sas_ouodchunks;  /* Unordered data chunks sent */
+-	__u64		sas_iuodchunks;  /* Unordered data chunks received */
+-	__u64		sas_oodchunks;	 /* Ordered data chunks sent */
+-	__u64		sas_iodchunks;	 /* Ordered data chunks received */
+-	__u64		sas_octrlchunks; /* Control chunks sent */
+-	__u64		sas_ictrlchunks; /* Control chunks received */
+-};
+-
+-/*
+- * 8.1 sctp_bindx()
+- *
+- * The flags parameter is formed from the bitwise OR of zero or more of the
+- * following currently defined flags:
+- */
+-#define SCTP_BINDX_ADD_ADDR 0x01
+-#define SCTP_BINDX_REM_ADDR 0x02
+-
+-/* This is the structure that is passed as an argument(optval) to
+- * getsockopt(SCTP_SOCKOPT_PEELOFF).
+- */
+-typedef struct {
+-	sctp_assoc_t associd;
+-	int sd;
+-} sctp_peeloff_arg_t;
+-
+-typedef struct {
+-	sctp_peeloff_arg_t p_arg;
+-	unsigned flags;
+-} sctp_peeloff_flags_arg_t;
+-
+-/*
+- *  Peer Address Thresholds socket option
+- */
+-struct sctp_paddrthlds {
+-	sctp_assoc_t spt_assoc_id;
+-	struct sockaddr_storage spt_address;
+-	__u16 spt_pathmaxrxt;
+-	__u16 spt_pathpfthld;
+-};
+-
+-/*
+- * Socket Option for Getting the Association/Stream-Specific PR-SCTP Status
+- */
+-struct sctp_prstatus {
+-	sctp_assoc_t sprstat_assoc_id;
+-	__u16 sprstat_sid;
+-	__u16 sprstat_policy;
+-	__u64 sprstat_abandoned_unsent;
+-	__u64 sprstat_abandoned_sent;
+-};
+-
+-struct sctp_default_prinfo {
+-	sctp_assoc_t pr_assoc_id;
+-	__u32 pr_value;
+-	__u16 pr_policy;
+-};
+-
+-struct sctp_info {
+-	__u32	sctpi_tag;
+-	__u32	sctpi_state;
+-	__u32	sctpi_rwnd;
+-	__u16	sctpi_unackdata;
+-	__u16	sctpi_penddata;
+-	__u16	sctpi_instrms;
+-	__u16	sctpi_outstrms;
+-	__u32	sctpi_fragmentation_point;
+-	__u32	sctpi_inqueue;
+-	__u32	sctpi_outqueue;
+-	__u32	sctpi_overall_error;
+-	__u32	sctpi_max_burst;
+-	__u32	sctpi_maxseg;
+-	__u32	sctpi_peer_rwnd;
+-	__u32	sctpi_peer_tag;
+-	__u8	sctpi_peer_capable;
+-	__u8	sctpi_peer_sack;
+-	__u16	__reserved1;
+-
+-	/* assoc status info */
+-	__u64	sctpi_isacks;
+-	__u64	sctpi_osacks;
+-	__u64	sctpi_opackets;
+-	__u64	sctpi_ipackets;
+-	__u64	sctpi_rtxchunks;
+-	__u64	sctpi_outofseqtsns;
+-	__u64	sctpi_idupchunks;
+-	__u64	sctpi_gapcnt;
+-	__u64	sctpi_ouodchunks;
+-	__u64	sctpi_iuodchunks;
+-	__u64	sctpi_oodchunks;
+-	__u64	sctpi_iodchunks;
+-	__u64	sctpi_octrlchunks;
+-	__u64	sctpi_ictrlchunks;
+-
+-	/* primary transport info */
+-	struct sockaddr_storage	sctpi_p_address;
+-	__s32	sctpi_p_state;
+-	__u32	sctpi_p_cwnd;
+-	__u32	sctpi_p_srtt;
+-	__u32	sctpi_p_rto;
+-	__u32	sctpi_p_hbinterval;
+-	__u32	sctpi_p_pathmaxrxt;
+-	__u32	sctpi_p_sackdelay;
+-	__u32	sctpi_p_sackfreq;
+-	__u32	sctpi_p_ssthresh;
+-	__u32	sctpi_p_partial_bytes_acked;
+-	__u32	sctpi_p_flight_size;
+-	__u16	sctpi_p_error;
+-	__u16	__reserved2;
+-
+-	/* sctp sock info */
+-	__u32	sctpi_s_autoclose;
+-	__u32	sctpi_s_adaptation_ind;
+-	__u32	sctpi_s_pd_point;
+-	__u8	sctpi_s_nodelay;
+-	__u8	sctpi_s_disable_fragments;
+-	__u8	sctpi_s_v4mapped;
+-	__u8	sctpi_s_frag_interleave;
+-	__u32	sctpi_s_type;
+-	__u32	__reserved3;
+-};
+-
+-struct sctp_reset_streams {
+-	sctp_assoc_t srs_assoc_id;
+-	uint16_t srs_flags;
+-	uint16_t srs_number_streams;	/* 0 == ALL */
+-	uint16_t srs_stream_list[];	/* list if srs_num_streams is not 0 */
+-};
+-
+-struct sctp_add_streams {
+-	sctp_assoc_t sas_assoc_id;
+-	uint16_t sas_instrms;
+-	uint16_t sas_outstrms;
+-};
+-
+-#endif /* _SCTP_H */
+diff --git a/include/linux/seg6.h b/include/linux/seg6.h
+deleted file mode 100644
+index 0715279..0000000
+--- a/include/linux/seg6.h
++++ /dev/null
+@@ -1,54 +0,0 @@
+-/*
+- *  SR-IPv6 implementation
+- *
+- *  Author:
+- *  David Lebrun <david.lebrun@uclouvain.be>
+- *
+- *
+- *  This program is free software; you can redistribute it and/or
+- *      modify it under the terms of the GNU General Public License
+- *      as published by the Free Software Foundation; either version
+- *      2 of the License, or (at your option) any later version.
+- */
+-
+-#ifndef _LINUX_SEG6_H
+-#define _LINUX_SEG6_H
+-
+-#include <linux/types.h>
+-#include <linux/in6.h>		/* For struct in6_addr. */
+-
+-/*
+- * SRH
+- */
+-struct ipv6_sr_hdr {
+-	__u8	nexthdr;
+-	__u8	hdrlen;
+-	__u8	type;
+-	__u8	segments_left;
+-	__u8	first_segment;
+-	__u8	flags;
+-	__u16	reserved;
+-
+-	struct in6_addr segments[0];
+-};
+-
+-#define SR6_FLAG1_PROTECTED	(1 << 6)
+-#define SR6_FLAG1_OAM		(1 << 5)
+-#define SR6_FLAG1_ALERT		(1 << 4)
+-#define SR6_FLAG1_HMAC		(1 << 3)
+-
+-#define SR6_TLV_INGRESS		1
+-#define SR6_TLV_EGRESS		2
+-#define SR6_TLV_OPAQUE		3
+-#define SR6_TLV_PADDING		4
+-#define SR6_TLV_HMAC		5
+-
+-#define sr_has_hmac(srh) ((srh)->flags & SR6_FLAG1_HMAC)
+-
+-struct sr6_tlv {
+-	__u8 type;
+-	__u8 len;
+-	__u8 data[0];
+-};
+-
+-#endif
+diff --git a/include/linux/seg6_genl.h b/include/linux/seg6_genl.h
+deleted file mode 100644
+index 99382f9..0000000
+--- a/include/linux/seg6_genl.h
++++ /dev/null
+@@ -1,32 +0,0 @@
+-#ifndef _LINUX_SEG6_GENL_H
+-#define _LINUX_SEG6_GENL_H
+-
+-#define SEG6_GENL_NAME		"SEG6"
+-#define SEG6_GENL_VERSION	0x1
+-
+-enum {
+-	SEG6_ATTR_UNSPEC,
+-	SEG6_ATTR_DST,
+-	SEG6_ATTR_DSTLEN,
+-	SEG6_ATTR_HMACKEYID,
+-	SEG6_ATTR_SECRET,
+-	SEG6_ATTR_SECRETLEN,
+-	SEG6_ATTR_ALGID,
+-	SEG6_ATTR_HMACINFO,
+-	__SEG6_ATTR_MAX,
+-};
+-
+-#define SEG6_ATTR_MAX (__SEG6_ATTR_MAX - 1)
+-
+-enum {
+-	SEG6_CMD_UNSPEC,
+-	SEG6_CMD_SETHMAC,
+-	SEG6_CMD_DUMPHMAC,
+-	SEG6_CMD_SET_TUNSRC,
+-	SEG6_CMD_GET_TUNSRC,
+-	__SEG6_CMD_MAX,
+-};
+-
+-#define SEG6_CMD_MAX (__SEG6_CMD_MAX - 1)
+-
+-#endif
+diff --git a/include/linux/seg6_hmac.h b/include/linux/seg6_hmac.h
+deleted file mode 100644
+index 704f93e..0000000
+--- a/include/linux/seg6_hmac.h
++++ /dev/null
+@@ -1,22 +0,0 @@
+-#ifndef _LINUX_SEG6_HMAC_H
+-#define _LINUX_SEG6_HMAC_H
+-
+-#include <linux/types.h>
+-#include <linux/seg6.h>
+-
+-#define SEG6_HMAC_SECRET_LEN	64
+-#define SEG6_HMAC_FIELD_LEN	32
+-
+-struct sr6_tlv_hmac {
+-	struct sr6_tlv tlvhdr;
+-	__u16 reserved;
+-	__be32 hmackeyid;
+-	__u8 hmac[SEG6_HMAC_FIELD_LEN];
+-};
+-
+-enum {
+-	SEG6_HMAC_ALGO_SHA1 = 1,
+-	SEG6_HMAC_ALGO_SHA256 = 2,
+-};
+-
+-#endif
+diff --git a/include/linux/seg6_iptunnel.h b/include/linux/seg6_iptunnel.h
+deleted file mode 100644
+index a5dc05a..0000000
+--- a/include/linux/seg6_iptunnel.h
++++ /dev/null
+@@ -1,40 +0,0 @@
+-/*
+- *  SR-IPv6 implementation
+- *
+- *  Author:
+- *  David Lebrun <david.lebrun@uclouvain.be>
+- *
+- *
+- *  This program is free software; you can redistribute it and/or
+- *      modify it under the terms of the GNU General Public License
+- *      as published by the Free Software Foundation; either version
+- *      2 of the License, or (at your option) any later version.
+- */
+-
+-#ifndef _LINUX_SEG6_IPTUNNEL_H
+-#define _LINUX_SEG6_IPTUNNEL_H
+-
+-#include <linux/seg6.h>		/* For struct ipv6_sr_hdr. */
+-
+-enum {
+-	SEG6_IPTUNNEL_UNSPEC,
+-	SEG6_IPTUNNEL_SRH,
+-	__SEG6_IPTUNNEL_MAX,
+-};
+-#define SEG6_IPTUNNEL_MAX (__SEG6_IPTUNNEL_MAX - 1)
+-
+-struct seg6_iptunnel_encap {
+-	int mode;
+-	struct ipv6_sr_hdr srh[0];
+-};
+-
+-#define SEG6_IPTUN_ENCAP_SIZE(x) ((sizeof(*x)) + (((x)->srh->hdrlen + 1) << 3))
+-
+-enum {
+-	SEG6_IPTUN_MODE_INLINE,
+-	SEG6_IPTUN_MODE_ENCAP,
+-	SEG6_IPTUN_MODE_L2ENCAP,
+-};
+-
+-
+-#endif
+diff --git a/include/linux/seg6_local.h b/include/linux/seg6_local.h
+deleted file mode 100644
+index 76b90d6..0000000
+--- a/include/linux/seg6_local.h
++++ /dev/null
+@@ -1,68 +0,0 @@
+-/*
+- *  SR-IPv6 implementation
+- *
+- *  Author:
+- *  David Lebrun <david.lebrun@uclouvain.be>
+- *
+- *
+- *  This program is free software; you can redistribute it and/or
+- *      modify it under the terms of the GNU General Public License
+- *      as published by the Free Software Foundation; either version
+- *      2 of the License, or (at your option) any later version.
+- */
+-
+-#ifndef _LINUX_SEG6_LOCAL_H
+-#define _LINUX_SEG6_LOCAL_H
+-
+-#include <linux/seg6.h>
+-
+-enum {
+-	SEG6_LOCAL_UNSPEC,
+-	SEG6_LOCAL_ACTION,
+-	SEG6_LOCAL_SRH,
+-	SEG6_LOCAL_TABLE,
+-	SEG6_LOCAL_NH4,
+-	SEG6_LOCAL_NH6,
+-	SEG6_LOCAL_IIF,
+-	SEG6_LOCAL_OIF,
+-	__SEG6_LOCAL_MAX,
+-};
+-#define SEG6_LOCAL_MAX (__SEG6_LOCAL_MAX - 1)
+-
+-enum {
+-	SEG6_LOCAL_ACTION_UNSPEC	= 0,
+-	/* node segment */
+-	SEG6_LOCAL_ACTION_END		= 1,
+-	/* adjacency segment (IPv6 cross-connect) */
+-	SEG6_LOCAL_ACTION_END_X		= 2,
+-	/* lookup of next seg NH in table */
+-	SEG6_LOCAL_ACTION_END_T		= 3,
+-	/* decap and L2 cross-connect */
+-	SEG6_LOCAL_ACTION_END_DX2	= 4,
+-	/* decap and IPv6 cross-connect */
+-	SEG6_LOCAL_ACTION_END_DX6	= 5,
+-	/* decap and IPv4 cross-connect */
+-	SEG6_LOCAL_ACTION_END_DX4	= 6,
+-	/* decap and lookup of DA in v6 table */
+-	SEG6_LOCAL_ACTION_END_DT6	= 7,
+-	/* decap and lookup of DA in v4 table */
+-	SEG6_LOCAL_ACTION_END_DT4	= 8,
+-	/* binding segment with insertion */
+-	SEG6_LOCAL_ACTION_END_B6	= 9,
+-	/* binding segment with encapsulation */
+-	SEG6_LOCAL_ACTION_END_B6_ENCAP	= 10,
+-	/* binding segment with MPLS encap */
+-	SEG6_LOCAL_ACTION_END_BM	= 11,
+-	/* lookup last seg in table */
+-	SEG6_LOCAL_ACTION_END_S		= 12,
+-	/* forward to SR-unaware VNF with static proxy */
+-	SEG6_LOCAL_ACTION_END_AS	= 13,
+-	/* forward to SR-unaware VNF with masquerading */
+-	SEG6_LOCAL_ACTION_END_AM	= 14,
+-
+-	__SEG6_LOCAL_ACTION_MAX,
+-};
+-
+-#define SEG6_LOCAL_ACTION_MAX (__SEG6_LOCAL_ACTION_MAX - 1)
+-
+-#endif
+diff --git a/include/linux/sock_diag.h b/include/linux/sock_diag.h
+deleted file mode 100644
+index 901231e..0000000
+--- a/include/linux/sock_diag.h
++++ /dev/null
+@@ -1,38 +0,0 @@
+-#ifndef __SOCK_DIAG_H__
+-#define __SOCK_DIAG_H__
+-
+-#include <linux/types.h>
+-
+-#define SOCK_DIAG_BY_FAMILY 20
+-#define SOCK_DESTROY 21
+-
+-struct sock_diag_req {
+-	__u8	sdiag_family;
+-	__u8	sdiag_protocol;
+-};
+-
+-enum {
+-	SK_MEMINFO_RMEM_ALLOC,
+-	SK_MEMINFO_RCVBUF,
+-	SK_MEMINFO_WMEM_ALLOC,
+-	SK_MEMINFO_SNDBUF,
+-	SK_MEMINFO_FWD_ALLOC,
+-	SK_MEMINFO_WMEM_QUEUED,
+-	SK_MEMINFO_OPTMEM,
+-	SK_MEMINFO_BACKLOG,
+-	SK_MEMINFO_DROPS,
+-
+-	SK_MEMINFO_VARS,
+-};
+-
+-enum sknetlink_groups {
+-	SKNLGRP_NONE,
+-	SKNLGRP_INET_TCP_DESTROY,
+-	SKNLGRP_INET_UDP_DESTROY,
+-	SKNLGRP_INET6_TCP_DESTROY,
+-	SKNLGRP_INET6_UDP_DESTROY,
+-	__SKNLGRP_MAX,
+-};
+-#define SKNLGRP_MAX	(__SKNLGRP_MAX - 1)
+-
+-#endif /* __SOCK_DIAG_H__ */
+diff --git a/include/linux/socket.h b/include/linux/socket.h
+deleted file mode 100644
+index 8c1e501..0000000
+--- a/include/linux/socket.h
++++ /dev/null
+@@ -1,21 +0,0 @@
+-#ifndef _LINUX_SOCKET_H
+-#define _LINUX_SOCKET_H
+-
+-/*
+- * Desired design of maximum size and alignment (see RFC2553)
+- */
+-#define _K_SS_MAXSIZE	128	/* Implementation specific max size */
+-#define _K_SS_ALIGNSIZE	(__alignof__ (struct sockaddr *))
+-				/* Implementation specific desired alignment */
+-
+-typedef unsigned short __kernel_sa_family_t;
+-
+-struct __kernel_sockaddr_storage {
+-	__kernel_sa_family_t	ss_family;		/* address family */
+-	/* Following field(s) are implementation specific */
+-	char		__data[_K_SS_MAXSIZE - sizeof(unsigned short)];
+-				/* space to achieve desired size, */
+-				/* _SS_MAXSIZE value minus size of ss_family */
+-} __attribute__ ((aligned(_K_SS_ALIGNSIZE)));	/* force desired alignment */
+-
+-#endif /* _LINUX_SOCKET_H */
+diff --git a/include/linux/sockios.h b/include/linux/sockios.h
+deleted file mode 100644
+index 79d029d..0000000
+--- a/include/linux/sockios.h
++++ /dev/null
+@@ -1,152 +0,0 @@
+-/*
+- * INET		An implementation of the TCP/IP protocol suite for the LINUX
+- *		operating system.  INET is implemented using the  BSD Socket
+- *		interface as the means of communication with the user level.
+- *
+- *		Definitions of the socket-level I/O control calls.
+- *
+- * Version:	@(#)sockios.h	1.0.2	03/09/93
+- *
+- * Authors:	Ross Biro
+- *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
+- *
+- *		This program is free software; you can redistribute it and/or
+- *		modify it under the terms of the GNU General Public License
+- *		as published by the Free Software Foundation; either version
+- *		2 of the License, or (at your option) any later version.
+- */
+-#ifndef _LINUX_SOCKIOS_H
+-#define _LINUX_SOCKIOS_H
+-
+-#include <asm/sockios.h>
+-
+-/* Linux-specific socket ioctls */
+-#define SIOCINQ		FIONREAD
+-#define SIOCOUTQ	TIOCOUTQ        /* output queue size (not sent + not acked) */
+-
+-#define SOCK_IOC_TYPE	0x89
+-
+-/* Routing table calls. */
+-#define SIOCADDRT	0x890B		/* add routing table entry	*/
+-#define SIOCDELRT	0x890C		/* delete routing table entry	*/
+-#define SIOCRTMSG	0x890D		/* unused			*/
+-
+-/* Socket configuration controls. */
+-#define SIOCGIFNAME	0x8910		/* get iface name		*/
+-#define SIOCSIFLINK	0x8911		/* set iface channel		*/
+-#define SIOCGIFCONF	0x8912		/* get iface list		*/
+-#define SIOCGIFFLAGS	0x8913		/* get flags			*/
+-#define SIOCSIFFLAGS	0x8914		/* set flags			*/
+-#define SIOCGIFADDR	0x8915		/* get PA address		*/
+-#define SIOCSIFADDR	0x8916		/* set PA address		*/
+-#define SIOCGIFDSTADDR	0x8917		/* get remote PA address	*/
+-#define SIOCSIFDSTADDR	0x8918		/* set remote PA address	*/
+-#define SIOCGIFBRDADDR	0x8919		/* get broadcast PA address	*/
+-#define SIOCSIFBRDADDR	0x891a		/* set broadcast PA address	*/
+-#define SIOCGIFNETMASK	0x891b		/* get network PA mask		*/
+-#define SIOCSIFNETMASK	0x891c		/* set network PA mask		*/
+-#define SIOCGIFMETRIC	0x891d		/* get metric			*/
+-#define SIOCSIFMETRIC	0x891e		/* set metric			*/
+-#define SIOCGIFMEM	0x891f		/* get memory address (BSD)	*/
+-#define SIOCSIFMEM	0x8920		/* set memory address (BSD)	*/
+-#define SIOCGIFMTU	0x8921		/* get MTU size			*/
+-#define SIOCSIFMTU	0x8922		/* set MTU size			*/
+-#define SIOCSIFNAME	0x8923		/* set interface name */
+-#define	SIOCSIFHWADDR	0x8924		/* set hardware address 	*/
+-#define SIOCGIFENCAP	0x8925		/* get/set encapsulations       */
+-#define SIOCSIFENCAP	0x8926		
+-#define SIOCGIFHWADDR	0x8927		/* Get hardware address		*/
+-#define SIOCGIFSLAVE	0x8929		/* Driver slaving support	*/
+-#define SIOCSIFSLAVE	0x8930
+-#define SIOCADDMULTI	0x8931		/* Multicast address lists	*/
+-#define SIOCDELMULTI	0x8932
+-#define SIOCGIFINDEX	0x8933		/* name -> if_index mapping	*/
+-#define SIOGIFINDEX	SIOCGIFINDEX	/* misprint compatibility :-)	*/
+-#define SIOCSIFPFLAGS	0x8934		/* set/get extended flags set	*/
+-#define SIOCGIFPFLAGS	0x8935
+-#define SIOCDIFADDR	0x8936		/* delete PA address		*/
+-#define	SIOCSIFHWBROADCAST	0x8937	/* set hardware broadcast addr	*/
+-#define SIOCGIFCOUNT	0x8938		/* get number of devices */
+-
+-#define SIOCGIFBR	0x8940		/* Bridging support		*/
+-#define SIOCSIFBR	0x8941		/* Set bridging options 	*/
+-
+-#define SIOCGIFTXQLEN	0x8942		/* Get the tx queue length	*/
+-#define SIOCSIFTXQLEN	0x8943		/* Set the tx queue length 	*/
+-
+-/* SIOCGIFDIVERT was:	0x8944		Frame diversion support */
+-/* SIOCSIFDIVERT was:	0x8945		Set frame diversion options */
+-
+-#define SIOCETHTOOL	0x8946		/* Ethtool interface		*/
+-
+-#define SIOCGMIIPHY	0x8947		/* Get address of MII PHY in use. */
+-#define SIOCGMIIREG	0x8948		/* Read MII PHY register.	*/
+-#define SIOCSMIIREG	0x8949		/* Write MII PHY register.	*/
+-
+-#define SIOCWANDEV	0x894A		/* get/set netdev parameters	*/
+-
+-#define SIOCOUTQNSD	0x894B		/* output queue size (not sent only) */
+-#define SIOCGSKNS	0x894C		/* get socket network namespace */
+-
+-/* ARP cache control calls. */
+-		    /*  0x8950 - 0x8952  * obsolete calls, don't re-use */
+-#define SIOCDARP	0x8953		/* delete ARP table entry	*/
+-#define SIOCGARP	0x8954		/* get ARP table entry		*/
+-#define SIOCSARP	0x8955		/* set ARP table entry		*/
+-
+-/* RARP cache control calls. */
+-#define SIOCDRARP	0x8960		/* delete RARP table entry	*/
+-#define SIOCGRARP	0x8961		/* get RARP table entry		*/
+-#define SIOCSRARP	0x8962		/* set RARP table entry		*/
+-
+-/* Driver configuration calls */
+-
+-#define SIOCGIFMAP	0x8970		/* Get device parameters	*/
+-#define SIOCSIFMAP	0x8971		/* Set device parameters	*/
+-
+-/* DLCI configuration calls */
+-
+-#define SIOCADDDLCI	0x8980		/* Create new DLCI device	*/
+-#define SIOCDELDLCI	0x8981		/* Delete DLCI device		*/
+-
+-#define SIOCGIFVLAN	0x8982		/* 802.1Q VLAN support		*/
+-#define SIOCSIFVLAN	0x8983		/* Set 802.1Q VLAN options 	*/
+-
+-/* bonding calls */
+-
+-#define SIOCBONDENSLAVE	0x8990		/* enslave a device to the bond */
+-#define SIOCBONDRELEASE 0x8991		/* release a slave from the bond*/
+-#define SIOCBONDSETHWADDR      0x8992	/* set the hw addr of the bond  */
+-#define SIOCBONDSLAVEINFOQUERY 0x8993   /* rtn info about slave state   */
+-#define SIOCBONDINFOQUERY      0x8994	/* rtn info about bond state    */
+-#define SIOCBONDCHANGEACTIVE   0x8995   /* update to a new active slave */
+-			
+-/* bridge calls */
+-#define SIOCBRADDBR     0x89a0		/* create new bridge device     */
+-#define SIOCBRDELBR     0x89a1		/* remove bridge device         */
+-#define SIOCBRADDIF	0x89a2		/* add interface to bridge      */
+-#define SIOCBRDELIF	0x89a3		/* remove interface from bridge */
+-
+-/* hardware time stamping: parameters in linux/net_tstamp.h */
+-#define SIOCSHWTSTAMP	0x89b0		/* set and get config		*/
+-#define SIOCGHWTSTAMP	0x89b1		/* get config			*/
+-
+-/* Device private ioctl calls */
+-
+-/*
+- *	These 16 ioctls are available to devices via the do_ioctl() device
+- *	vector. Each device should include this file and redefine these names
+- *	as their own. Because these are device dependent it is a good idea
+- *	_NOT_ to issue them to random objects and hope.
+- *
+- *	THESE IOCTLS ARE _DEPRECATED_ AND WILL DISAPPEAR IN 2.5.X -DaveM
+- */
+- 
+-#define SIOCDEVPRIVATE	0x89F0	/* to 89FF */
+-
+-/*
+- *	These 16 ioctl calls are protocol private
+- */
+- 
+-#define SIOCPROTOPRIVATE 0x89E0 /* to 89EF */
+-#endif	/* _LINUX_SOCKIOS_H */
+diff --git a/include/linux/stddef.h b/include/linux/stddef.h
+deleted file mode 100644
+index 4bb69de..0000000
+--- a/include/linux/stddef.h
++++ /dev/null
+@@ -1,5 +0,0 @@
+-
+-
+-#ifndef __always_inline
+-#define __always_inline __inline__
+-#endif
+diff --git a/include/linux/sysinfo.h b/include/linux/sysinfo.h
+deleted file mode 100644
+index 934335a..0000000
+--- a/include/linux/sysinfo.h
++++ /dev/null
+@@ -1,24 +0,0 @@
+-#ifndef _LINUX_SYSINFO_H
+-#define _LINUX_SYSINFO_H
+-
+-#include <linux/types.h>
+-
+-#define SI_LOAD_SHIFT	16
+-struct sysinfo {
+-	__kernel_long_t uptime;		/* Seconds since boot */
+-	__kernel_ulong_t loads[3];	/* 1, 5, and 15 minute load averages */
+-	__kernel_ulong_t totalram;	/* Total usable main memory size */
+-	__kernel_ulong_t freeram;	/* Available memory size */
+-	__kernel_ulong_t sharedram;	/* Amount of shared memory */
+-	__kernel_ulong_t bufferram;	/* Memory used by buffers */
+-	__kernel_ulong_t totalswap;	/* Total swap space size */
+-	__kernel_ulong_t freeswap;	/* swap space still available */
+-	__u16 procs;		   	/* Number of current processes */
+-	__u16 pad;		   	/* Explicit padding for m68k */
+-	__kernel_ulong_t totalhigh;	/* Total high memory size */
+-	__kernel_ulong_t freehigh;	/* Available high memory size */
+-	__u32 mem_unit;			/* Memory unit size in bytes */
+-	char _f[20-2*sizeof(__kernel_ulong_t)-sizeof(__u32)];	/* Padding: libc5 uses this.. */
+-};
+-
+-#endif /* _LINUX_SYSINFO_H */
+diff --git a/include/linux/tc_act/tc_bpf.h b/include/linux/tc_act/tc_bpf.h
+deleted file mode 100644
+index 8dc2ac0..0000000
+--- a/include/linux/tc_act/tc_bpf.h
++++ /dev/null
+@@ -1,36 +0,0 @@
+-/*
+- * Copyright (c) 2015 Jiri Pirko <jiri@resnulli.us>
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- */
+-
+-#ifndef __LINUX_TC_BPF_H
+-#define __LINUX_TC_BPF_H
+-
+-#include <linux/pkt_cls.h>
+-
+-#define TCA_ACT_BPF 13
+-
+-struct tc_act_bpf {
+-	tc_gen;
+-};
+-
+-enum {
+-	TCA_ACT_BPF_UNSPEC,
+-	TCA_ACT_BPF_TM,
+-	TCA_ACT_BPF_PARMS,
+-	TCA_ACT_BPF_OPS_LEN,
+-	TCA_ACT_BPF_OPS,
+-	TCA_ACT_BPF_FD,
+-	TCA_ACT_BPF_NAME,
+-	TCA_ACT_BPF_PAD,
+-	TCA_ACT_BPF_TAG,
+-	TCA_ACT_BPF_ID,
+-	__TCA_ACT_BPF_MAX,
+-};
+-#define TCA_ACT_BPF_MAX (__TCA_ACT_BPF_MAX - 1)
+-
+-#endif
+diff --git a/include/linux/tc_act/tc_connmark.h b/include/linux/tc_act/tc_connmark.h
+deleted file mode 100644
+index 62a5e94..0000000
+--- a/include/linux/tc_act/tc_connmark.h
++++ /dev/null
+@@ -1,23 +0,0 @@
+-#ifndef __UAPI_TC_CONNMARK_H
+-#define __UAPI_TC_CONNMARK_H
+-
+-#include <linux/types.h>
+-#include <linux/pkt_cls.h>
+-
+-#define TCA_ACT_CONNMARK 14
+-
+-struct tc_connmark {
+-	tc_gen;
+-	__u16 zone;
+-};
+-
+-enum {
+-	TCA_CONNMARK_UNSPEC,
+-	TCA_CONNMARK_PARMS,
+-	TCA_CONNMARK_TM,
+-	TCA_CONNMARK_PAD,
+-	__TCA_CONNMARK_MAX
+-};
+-#define TCA_CONNMARK_MAX (__TCA_CONNMARK_MAX - 1)
+-
+-#endif
+diff --git a/include/linux/tc_act/tc_csum.h b/include/linux/tc_act/tc_csum.h
+deleted file mode 100644
+index a11bb35..0000000
+--- a/include/linux/tc_act/tc_csum.h
++++ /dev/null
+@@ -1,34 +0,0 @@
+-#ifndef __LINUX_TC_CSUM_H
+-#define __LINUX_TC_CSUM_H
+-
+-#include <linux/types.h>
+-#include <linux/pkt_cls.h>
+-
+-#define TCA_ACT_CSUM 16
+-
+-enum {
+-	TCA_CSUM_UNSPEC,
+-	TCA_CSUM_PARMS,
+-	TCA_CSUM_TM,
+-	TCA_CSUM_PAD,
+-	__TCA_CSUM_MAX
+-};
+-#define TCA_CSUM_MAX (__TCA_CSUM_MAX - 1)
+-
+-enum {
+-	TCA_CSUM_UPDATE_FLAG_IPV4HDR = 1,
+-	TCA_CSUM_UPDATE_FLAG_ICMP    = 2,
+-	TCA_CSUM_UPDATE_FLAG_IGMP    = 4,
+-	TCA_CSUM_UPDATE_FLAG_TCP     = 8,
+-	TCA_CSUM_UPDATE_FLAG_UDP     = 16,
+-	TCA_CSUM_UPDATE_FLAG_UDPLITE = 32,
+-	TCA_CSUM_UPDATE_FLAG_SCTP    = 64,
+-};
+-
+-struct tc_csum {
+-	tc_gen;
+-
+-	__u32 update_flags;
+-};
+-
+-#endif /* __LINUX_TC_CSUM_H */
+diff --git a/include/linux/tc_act/tc_defact.h b/include/linux/tc_act/tc_defact.h
+deleted file mode 100644
+index d2a3abb..0000000
+--- a/include/linux/tc_act/tc_defact.h
++++ /dev/null
+@@ -1,20 +0,0 @@
+-#ifndef __LINUX_TC_DEF_H
+-#define __LINUX_TC_DEF_H
+-
+-#include <linux/pkt_cls.h>
+-
+-struct tc_defact {
+-	tc_gen;
+-};
+-
+-enum {
+-	TCA_DEF_UNSPEC,
+-	TCA_DEF_TM,
+-	TCA_DEF_PARMS,
+-	TCA_DEF_DATA,
+-	TCA_DEF_PAD,
+-	__TCA_DEF_MAX
+-};
+-#define TCA_DEF_MAX (__TCA_DEF_MAX - 1)
+-
+-#endif
+diff --git a/include/linux/tc_act/tc_gact.h b/include/linux/tc_act/tc_gact.h
+deleted file mode 100644
+index 70b536a..0000000
+--- a/include/linux/tc_act/tc_gact.h
++++ /dev/null
+@@ -1,33 +0,0 @@
+-#ifndef __LINUX_TC_GACT_H
+-#define __LINUX_TC_GACT_H
+-
+-#include <linux/types.h>
+-#include <linux/pkt_cls.h>
+-
+-#define TCA_ACT_GACT 5
+-struct tc_gact {
+-	tc_gen;
+-
+-};
+-
+-struct tc_gact_p {
+-#define PGACT_NONE              0
+-#define PGACT_NETRAND           1
+-#define PGACT_DETERM            2
+-#define MAX_RAND                (PGACT_DETERM + 1 )
+-	__u16                 ptype;
+-	__u16                 pval;
+-	int                   paction;
+-};
+- 
+-enum {
+-	TCA_GACT_UNSPEC,
+-	TCA_GACT_TM,
+-	TCA_GACT_PARMS,
+-	TCA_GACT_PROB,
+-	TCA_GACT_PAD,
+-	__TCA_GACT_MAX
+-};
+-#define TCA_GACT_MAX (__TCA_GACT_MAX - 1)
+- 
+-#endif
+diff --git a/include/linux/tc_act/tc_ife.h b/include/linux/tc_act/tc_ife.h
+deleted file mode 100644
+index 7c28178..0000000
+--- a/include/linux/tc_act/tc_ife.h
++++ /dev/null
+@@ -1,32 +0,0 @@
+-#ifndef __UAPI_TC_IFE_H
+-#define __UAPI_TC_IFE_H
+-
+-#include <linux/types.h>
+-#include <linux/pkt_cls.h>
+-#include <linux/ife.h>
+-
+-#define TCA_ACT_IFE 25
+-/* Flag bits for now just encoding/decoding; mutually exclusive */
+-#define IFE_ENCODE 1
+-#define IFE_DECODE 0
+-
+-struct tc_ife {
+-	tc_gen;
+-	__u16 flags;
+-};
+-
+-/*XXX: We need to encode the total number of bytes consumed */
+-enum {
+-	TCA_IFE_UNSPEC,
+-	TCA_IFE_PARMS,
+-	TCA_IFE_TM,
+-	TCA_IFE_DMAC,
+-	TCA_IFE_SMAC,
+-	TCA_IFE_TYPE,
+-	TCA_IFE_METALST,
+-	TCA_IFE_PAD,
+-	__TCA_IFE_MAX
+-};
+-#define TCA_IFE_MAX (__TCA_IFE_MAX - 1)
+-
+-#endif
+diff --git a/include/linux/tc_act/tc_ipt.h b/include/linux/tc_act/tc_ipt.h
+deleted file mode 100644
+index 7c6e155..0000000
+--- a/include/linux/tc_act/tc_ipt.h
++++ /dev/null
+@@ -1,22 +0,0 @@
+-#ifndef __LINUX_TC_IPT_H
+-#define __LINUX_TC_IPT_H
+-
+-#include <linux/pkt_cls.h>
+-
+-#define TCA_ACT_IPT 6
+-#define TCA_ACT_XT 10
+-
+-enum {
+-	TCA_IPT_UNSPEC,
+-	TCA_IPT_TABLE,
+-	TCA_IPT_HOOK,
+-	TCA_IPT_INDEX,
+-	TCA_IPT_CNT,
+-	TCA_IPT_TM,
+-	TCA_IPT_TARG,
+-	TCA_IPT_PAD,
+-	__TCA_IPT_MAX
+-};
+-#define TCA_IPT_MAX (__TCA_IPT_MAX - 1)
+-                                                                                
+-#endif
+diff --git a/include/linux/tc_act/tc_mirred.h b/include/linux/tc_act/tc_mirred.h
+deleted file mode 100644
+index 3d7a2b3..0000000
+--- a/include/linux/tc_act/tc_mirred.h
++++ /dev/null
+@@ -1,28 +0,0 @@
+-#ifndef __LINUX_TC_MIR_H
+-#define __LINUX_TC_MIR_H
+-
+-#include <linux/types.h>
+-#include <linux/pkt_cls.h>
+-
+-#define TCA_ACT_MIRRED 8
+-#define TCA_EGRESS_REDIR 1  /* packet redirect to EGRESS*/
+-#define TCA_EGRESS_MIRROR 2 /* mirror packet to EGRESS */
+-#define TCA_INGRESS_REDIR 3  /* packet redirect to INGRESS*/
+-#define TCA_INGRESS_MIRROR 4 /* mirror packet to INGRESS */
+-                                                                                
+-struct tc_mirred {
+-	tc_gen;
+-	int                     eaction;   /* one of IN/EGRESS_MIRROR/REDIR */
+-	__u32                   ifindex;  /* ifindex of egress port */
+-};
+-                                                                                
+-enum {
+-	TCA_MIRRED_UNSPEC,
+-	TCA_MIRRED_TM,
+-	TCA_MIRRED_PARMS,
+-	TCA_MIRRED_PAD,
+-	__TCA_MIRRED_MAX
+-};
+-#define TCA_MIRRED_MAX (__TCA_MIRRED_MAX - 1)
+-                                                                                
+-#endif
+diff --git a/include/linux/tc_act/tc_nat.h b/include/linux/tc_act/tc_nat.h
+deleted file mode 100644
+index 923457c..0000000
+--- a/include/linux/tc_act/tc_nat.h
++++ /dev/null
+@@ -1,28 +0,0 @@
+-#ifndef __LINUX_TC_NAT_H
+-#define __LINUX_TC_NAT_H
+-
+-#include <linux/pkt_cls.h>
+-#include <linux/types.h>
+-
+-#define TCA_ACT_NAT 9
+-
+-enum {
+-	TCA_NAT_UNSPEC,
+-	TCA_NAT_PARMS,
+-	TCA_NAT_TM,
+-	TCA_NAT_PAD,
+-	__TCA_NAT_MAX
+-};
+-#define TCA_NAT_MAX (__TCA_NAT_MAX - 1)
+-
+-#define TCA_NAT_FLAG_EGRESS 1
+-
+-struct tc_nat {
+-	tc_gen;
+-	__be32 old_addr;
+-	__be32 new_addr;
+-	__be32 mask;
+-	__u32 flags;
+-};
+-
+-#endif
+diff --git a/include/linux/tc_act/tc_pedit.h b/include/linux/tc_act/tc_pedit.h
+deleted file mode 100644
+index 143d2b3..0000000
+--- a/include/linux/tc_act/tc_pedit.h
++++ /dev/null
+@@ -1,66 +0,0 @@
+-#ifndef __LINUX_TC_PED_H
+-#define __LINUX_TC_PED_H
+-
+-#include <linux/types.h>
+-#include <linux/pkt_cls.h>
+-
+-#define TCA_ACT_PEDIT 7
+-
+-enum {
+-	TCA_PEDIT_UNSPEC,
+-	TCA_PEDIT_TM,
+-	TCA_PEDIT_PARMS,
+-	TCA_PEDIT_PAD,
+-	TCA_PEDIT_PARMS_EX,
+-	TCA_PEDIT_KEYS_EX,
+-	TCA_PEDIT_KEY_EX,
+-	__TCA_PEDIT_MAX
+-};
+-#define TCA_PEDIT_MAX (__TCA_PEDIT_MAX - 1)
+-                                                                                
+-enum {
+-	TCA_PEDIT_KEY_EX_HTYPE = 1,
+-	TCA_PEDIT_KEY_EX_CMD = 2,
+-	__TCA_PEDIT_KEY_EX_MAX
+-};
+-#define TCA_PEDIT_KEY_EX_MAX (__TCA_PEDIT_KEY_EX_MAX - 1)
+-
+- /* TCA_PEDIT_KEY_EX_HDR_TYPE_NETWROK is a special case for legacy users. It
+-  * means no specific header type - offset is relative to the network layer
+-  */
+-enum pedit_header_type {
+-	TCA_PEDIT_KEY_EX_HDR_TYPE_NETWORK = 0,
+-	TCA_PEDIT_KEY_EX_HDR_TYPE_ETH = 1,
+-	TCA_PEDIT_KEY_EX_HDR_TYPE_IP4 = 2,
+-	TCA_PEDIT_KEY_EX_HDR_TYPE_IP6 = 3,
+-	TCA_PEDIT_KEY_EX_HDR_TYPE_TCP = 4,
+-	TCA_PEDIT_KEY_EX_HDR_TYPE_UDP = 5,
+-	__PEDIT_HDR_TYPE_MAX,
+-};
+-#define TCA_PEDIT_HDR_TYPE_MAX (__PEDIT_HDR_TYPE_MAX - 1)
+-
+-enum pedit_cmd {
+-	TCA_PEDIT_KEY_EX_CMD_SET = 0,
+-	TCA_PEDIT_KEY_EX_CMD_ADD = 1,
+-	__PEDIT_CMD_MAX,
+-};
+-#define TCA_PEDIT_CMD_MAX (__PEDIT_CMD_MAX - 1)
+-
+-struct tc_pedit_key {
+-	__u32           mask;  /* AND */
+-	__u32           val;   /*XOR */
+-	__u32           off;  /*offset */
+-	__u32           at;
+-	__u32           offmask;
+-	__u32           shift;
+-};
+-                                                                                
+-struct tc_pedit_sel {
+-	tc_gen;
+-	unsigned char           nkeys;
+-	unsigned char           flags;
+-	struct tc_pedit_key     keys[0];
+-};
+-#define tc_pedit tc_pedit_sel
+-
+-#endif
+diff --git a/include/linux/tc_act/tc_sample.h b/include/linux/tc_act/tc_sample.h
+deleted file mode 100644
+index edc9058..0000000
+--- a/include/linux/tc_act/tc_sample.h
++++ /dev/null
+@@ -1,26 +0,0 @@
+-#ifndef __LINUX_TC_SAMPLE_H
+-#define __LINUX_TC_SAMPLE_H
+-
+-#include <linux/types.h>
+-#include <linux/pkt_cls.h>
+-#include <linux/if_ether.h>
+-
+-#define TCA_ACT_SAMPLE 26
+-
+-struct tc_sample {
+-	tc_gen;
+-};
+-
+-enum {
+-	TCA_SAMPLE_UNSPEC,
+-	TCA_SAMPLE_TM,
+-	TCA_SAMPLE_PARMS,
+-	TCA_SAMPLE_RATE,
+-	TCA_SAMPLE_TRUNC_SIZE,
+-	TCA_SAMPLE_PSAMPLE_GROUP,
+-	TCA_SAMPLE_PAD,
+-	__TCA_SAMPLE_MAX
+-};
+-#define TCA_SAMPLE_MAX (__TCA_SAMPLE_MAX - 1)
+-
+-#endif
+diff --git a/include/linux/tc_act/tc_skbedit.h b/include/linux/tc_act/tc_skbedit.h
+deleted file mode 100644
+index 2884425..0000000
+--- a/include/linux/tc_act/tc_skbedit.h
++++ /dev/null
+@@ -1,51 +0,0 @@
+-/*
+- * Copyright (c) 2008, Intel Corporation.
+- *
+- * This program is free software; you can redistribute it and/or modify it
+- * under the terms and conditions of the GNU General Public License,
+- * version 2, as published by the Free Software Foundation.
+- *
+- * This program is distributed in the hope it will be useful, but WITHOUT
+- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+- * more details.
+- *
+- * You should have received a copy of the GNU General Public License along with
+- * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+- * Place - Suite 330, Boston, MA 02111-1307 USA.
+- *
+- * Author: Alexander Duyck <alexander.h.duyck@intel.com>
+- */
+-
+-#ifndef __LINUX_TC_SKBEDIT_H
+-#define __LINUX_TC_SKBEDIT_H
+-
+-#include <linux/pkt_cls.h>
+-
+-#define TCA_ACT_SKBEDIT 11
+-
+-#define SKBEDIT_F_PRIORITY		0x1
+-#define SKBEDIT_F_QUEUE_MAPPING		0x2
+-#define SKBEDIT_F_MARK			0x4
+-#define SKBEDIT_F_PTYPE			0x8
+-#define SKBEDIT_F_MASK			0x10
+-
+-struct tc_skbedit {
+-	tc_gen;
+-};
+-
+-enum {
+-	TCA_SKBEDIT_UNSPEC,
+-	TCA_SKBEDIT_TM,
+-	TCA_SKBEDIT_PARMS,
+-	TCA_SKBEDIT_PRIORITY,
+-	TCA_SKBEDIT_QUEUE_MAPPING,
+-	TCA_SKBEDIT_MARK,
+-	TCA_SKBEDIT_PAD,
+-	TCA_SKBEDIT_PTYPE,
+-	TCA_SKBEDIT_MASK,
+-	__TCA_SKBEDIT_MAX
+-};
+-#define TCA_SKBEDIT_MAX (__TCA_SKBEDIT_MAX - 1)
+-
+-#endif
+diff --git a/include/linux/tc_act/tc_skbmod.h b/include/linux/tc_act/tc_skbmod.h
+deleted file mode 100644
+index 10fc07d..0000000
+--- a/include/linux/tc_act/tc_skbmod.h
++++ /dev/null
+@@ -1,39 +0,0 @@
+-/*
+- * Copyright (c) 2016, Jamal Hadi Salim
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+-*/
+-
+-#ifndef __LINUX_TC_SKBMOD_H
+-#define __LINUX_TC_SKBMOD_H
+-
+-#include <linux/pkt_cls.h>
+-
+-#define TCA_ACT_SKBMOD 15
+-
+-#define SKBMOD_F_DMAC	0x1
+-#define SKBMOD_F_SMAC	0x2
+-#define SKBMOD_F_ETYPE	0x4
+-#define SKBMOD_F_SWAPMAC 0x8
+-
+-struct tc_skbmod {
+-	tc_gen;
+-	__u64 flags;
+-};
+-
+-enum {
+-	TCA_SKBMOD_UNSPEC,
+-	TCA_SKBMOD_TM,
+-	TCA_SKBMOD_PARMS,
+-	TCA_SKBMOD_DMAC,
+-	TCA_SKBMOD_SMAC,
+-	TCA_SKBMOD_ETYPE,
+-	TCA_SKBMOD_PAD,
+-	__TCA_SKBMOD_MAX
+-};
+-#define TCA_SKBMOD_MAX (__TCA_SKBMOD_MAX - 1)
+-
+-#endif
+diff --git a/include/linux/tc_act/tc_tunnel_key.h b/include/linux/tc_act/tc_tunnel_key.h
+deleted file mode 100644
+index afcd4be..0000000
+--- a/include/linux/tc_act/tc_tunnel_key.h
++++ /dev/null
+@@ -1,43 +0,0 @@
+-/*
+- * Copyright (c) 2016, Amir Vadai <amir@vadai.me>
+- * Copyright (c) 2016, Mellanox Technologies. All rights reserved.
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- */
+-
+-#ifndef __LINUX_TC_TUNNEL_KEY_H
+-#define __LINUX_TC_TUNNEL_KEY_H
+-
+-#include <linux/pkt_cls.h>
+-
+-#define TCA_ACT_TUNNEL_KEY 17
+-
+-#define TCA_TUNNEL_KEY_ACT_SET	    1
+-#define TCA_TUNNEL_KEY_ACT_RELEASE  2
+-
+-struct tc_tunnel_key {
+-	tc_gen;
+-	int t_action;
+-};
+-
+-enum {
+-	TCA_TUNNEL_KEY_UNSPEC,
+-	TCA_TUNNEL_KEY_TM,
+-	TCA_TUNNEL_KEY_PARMS,
+-	TCA_TUNNEL_KEY_ENC_IPV4_SRC,	/* be32 */
+-	TCA_TUNNEL_KEY_ENC_IPV4_DST,	/* be32 */
+-	TCA_TUNNEL_KEY_ENC_IPV6_SRC,	/* struct in6_addr */
+-	TCA_TUNNEL_KEY_ENC_IPV6_DST,	/* struct in6_addr */
+-	TCA_TUNNEL_KEY_ENC_KEY_ID,	/* be64 */
+-	TCA_TUNNEL_KEY_PAD,
+-	TCA_TUNNEL_KEY_ENC_DST_PORT,	/* be16 */
+-	TCA_TUNNEL_KEY_NO_CSUM,		/* u8 */
+-	__TCA_TUNNEL_KEY_MAX,
+-};
+-
+-#define TCA_TUNNEL_KEY_MAX (__TCA_TUNNEL_KEY_MAX - 1)
+-
+-#endif
+diff --git a/include/linux/tc_act/tc_vlan.h b/include/linux/tc_act/tc_vlan.h
+deleted file mode 100644
+index bddb272..0000000
+--- a/include/linux/tc_act/tc_vlan.h
++++ /dev/null
+@@ -1,38 +0,0 @@
+-/*
+- * Copyright (c) 2014 Jiri Pirko <jiri@resnulli.us>
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- */
+-
+-#ifndef __LINUX_TC_VLAN_H
+-#define __LINUX_TC_VLAN_H
+-
+-#include <linux/pkt_cls.h>
+-
+-#define TCA_ACT_VLAN 12
+-
+-#define TCA_VLAN_ACT_POP	1
+-#define TCA_VLAN_ACT_PUSH	2
+-#define TCA_VLAN_ACT_MODIFY	3
+-
+-struct tc_vlan {
+-	tc_gen;
+-	int v_action;
+-};
+-
+-enum {
+-	TCA_VLAN_UNSPEC,
+-	TCA_VLAN_TM,
+-	TCA_VLAN_PARMS,
+-	TCA_VLAN_PUSH_VLAN_ID,
+-	TCA_VLAN_PUSH_VLAN_PROTOCOL,
+-	TCA_VLAN_PAD,
+-	TCA_VLAN_PUSH_VLAN_PRIORITY,
+-	__TCA_VLAN_MAX,
+-};
+-#define TCA_VLAN_MAX (__TCA_VLAN_MAX - 1)
+-
+-#endif
+diff --git a/include/linux/tc_ematch/tc_em_cmp.h b/include/linux/tc_ematch/tc_em_cmp.h
+deleted file mode 100644
+index f34bb1b..0000000
+--- a/include/linux/tc_ematch/tc_em_cmp.h
++++ /dev/null
+@@ -1,25 +0,0 @@
+-#ifndef __LINUX_TC_EM_CMP_H
+-#define __LINUX_TC_EM_CMP_H
+-
+-#include <linux/types.h>
+-#include <linux/pkt_cls.h>
+-
+-struct tcf_em_cmp {
+-	__u32		val;
+-	__u32		mask;
+-	__u16		off;
+-	__u8		align:4;
+-	__u8		flags:4;
+-	__u8		layer:4;
+-	__u8		opnd:4;
+-};
+-
+-enum {
+-	TCF_EM_ALIGN_U8  = 1,
+-	TCF_EM_ALIGN_U16 = 2,
+-	TCF_EM_ALIGN_U32 = 4
+-};
+-
+-#define TCF_EM_CMP_TRANS	1
+-
+-#endif
+diff --git a/include/linux/tc_ematch/tc_em_meta.h b/include/linux/tc_ematch/tc_em_meta.h
+deleted file mode 100644
+index b11f8ce..0000000
+--- a/include/linux/tc_ematch/tc_em_meta.h
++++ /dev/null
+@@ -1,92 +0,0 @@
+-#ifndef __LINUX_TC_EM_META_H
+-#define __LINUX_TC_EM_META_H
+-
+-#include <linux/types.h>
+-#include <linux/pkt_cls.h>
+-
+-enum {
+-	TCA_EM_META_UNSPEC,
+-	TCA_EM_META_HDR,
+-	TCA_EM_META_LVALUE,
+-	TCA_EM_META_RVALUE,
+-	__TCA_EM_META_MAX
+-};
+-#define TCA_EM_META_MAX (__TCA_EM_META_MAX - 1)
+-
+-struct tcf_meta_val {
+-	__u16			kind;
+-	__u8			shift;
+-	__u8			op;
+-};
+-
+-#define TCF_META_TYPE_MASK	(0xf << 12)
+-#define TCF_META_TYPE(kind)	(((kind) & TCF_META_TYPE_MASK) >> 12)
+-#define TCF_META_ID_MASK	0x7ff
+-#define TCF_META_ID(kind)	((kind) & TCF_META_ID_MASK)
+-
+-enum {
+-	TCF_META_TYPE_VAR,
+-	TCF_META_TYPE_INT,
+-	__TCF_META_TYPE_MAX
+-};
+-#define TCF_META_TYPE_MAX (__TCF_META_TYPE_MAX - 1)
+-
+-enum {
+-	TCF_META_ID_VALUE,
+-	TCF_META_ID_RANDOM,
+-	TCF_META_ID_LOADAVG_0,
+-	TCF_META_ID_LOADAVG_1,
+-	TCF_META_ID_LOADAVG_2,
+-	TCF_META_ID_DEV,
+-	TCF_META_ID_PRIORITY,
+-	TCF_META_ID_PROTOCOL,
+-	TCF_META_ID_PKTTYPE,
+-	TCF_META_ID_PKTLEN,
+-	TCF_META_ID_DATALEN,
+-	TCF_META_ID_MACLEN,
+-	TCF_META_ID_NFMARK,
+-	TCF_META_ID_TCINDEX,
+-	TCF_META_ID_RTCLASSID,
+-	TCF_META_ID_RTIIF,
+-	TCF_META_ID_SK_FAMILY,
+-	TCF_META_ID_SK_STATE,
+-	TCF_META_ID_SK_REUSE,
+-	TCF_META_ID_SK_BOUND_IF,
+-	TCF_META_ID_SK_REFCNT,
+-	TCF_META_ID_SK_SHUTDOWN,
+-	TCF_META_ID_SK_PROTO,
+-	TCF_META_ID_SK_TYPE,
+-	TCF_META_ID_SK_RCVBUF,
+-	TCF_META_ID_SK_RMEM_ALLOC,
+-	TCF_META_ID_SK_WMEM_ALLOC,
+-	TCF_META_ID_SK_OMEM_ALLOC,
+-	TCF_META_ID_SK_WMEM_QUEUED,
+-	TCF_META_ID_SK_RCV_QLEN,
+-	TCF_META_ID_SK_SND_QLEN,
+- 	TCF_META_ID_SK_ERR_QLEN,
+-	TCF_META_ID_SK_FORWARD_ALLOCS,
+-	TCF_META_ID_SK_SNDBUF,
+- 	TCF_META_ID_SK_ALLOCS,
+-	__TCF_META_ID_SK_ROUTE_CAPS,	/* unimplemented but in ABI already */
+- 	TCF_META_ID_SK_HASH,
+- 	TCF_META_ID_SK_LINGERTIME,
+- 	TCF_META_ID_SK_ACK_BACKLOG,
+- 	TCF_META_ID_SK_MAX_ACK_BACKLOG,
+- 	TCF_META_ID_SK_PRIO,
+- 	TCF_META_ID_SK_RCVLOWAT,
+- 	TCF_META_ID_SK_RCVTIMEO,
+- 	TCF_META_ID_SK_SNDTIMEO,
+- 	TCF_META_ID_SK_SENDMSG_OFF,
+- 	TCF_META_ID_SK_WRITE_PENDING,
+-	TCF_META_ID_VLAN_TAG,
+-	TCF_META_ID_RXHASH,
+-	__TCF_META_ID_MAX
+-};
+-#define TCF_META_ID_MAX (__TCF_META_ID_MAX - 1)
+-
+-struct tcf_meta_hdr {
+-	struct tcf_meta_val	left;
+-	struct tcf_meta_val	right;
+-};
+-
+-#endif
+diff --git a/include/linux/tc_ematch/tc_em_nbyte.h b/include/linux/tc_ematch/tc_em_nbyte.h
+deleted file mode 100644
+index 7172cfb..0000000
+--- a/include/linux/tc_ematch/tc_em_nbyte.h
++++ /dev/null
+@@ -1,13 +0,0 @@
+-#ifndef __LINUX_TC_EM_NBYTE_H
+-#define __LINUX_TC_EM_NBYTE_H
+-
+-#include <linux/types.h>
+-#include <linux/pkt_cls.h>
+-
+-struct tcf_em_nbyte {
+-	__u16		off;
+-	__u16		len:12;
+-	__u8		layer:4;
+-};
+-
+-#endif
+diff --git a/include/linux/tcp.h b/include/linux/tcp.h
+deleted file mode 100644
+index 8edad3f..0000000
+--- a/include/linux/tcp.h
++++ /dev/null
+@@ -1,268 +0,0 @@
+-/*
+- * INET		An implementation of the TCP/IP protocol suite for the LINUX
+- *		operating system.  INET is implemented using the  BSD Socket
+- *		interface as the means of communication with the user level.
+- *
+- *		Definitions for the TCP protocol.
+- *
+- * Version:	@(#)tcp.h	1.0.2	04/28/93
+- *
+- * Author:	Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
+- *
+- *		This program is free software; you can redistribute it and/or
+- *		modify it under the terms of the GNU General Public License
+- *		as published by the Free Software Foundation; either version
+- *		2 of the License, or (at your option) any later version.
+- */
+-#ifndef _LINUX_TCP_H
+-#define _LINUX_TCP_H
+-
+-#include <linux/types.h>
+-#include <asm/byteorder.h>
+-#include <linux/socket.h>
+-
+-struct tcphdr {
+-	__be16	source;
+-	__be16	dest;
+-	__be32	seq;
+-	__be32	ack_seq;
+-#if defined(__LITTLE_ENDIAN_BITFIELD)
+-	__u16	res1:4,
+-		doff:4,
+-		fin:1,
+-		syn:1,
+-		rst:1,
+-		psh:1,
+-		ack:1,
+-		urg:1,
+-		ece:1,
+-		cwr:1;
+-#elif defined(__BIG_ENDIAN_BITFIELD)
+-	__u16	doff:4,
+-		res1:4,
+-		cwr:1,
+-		ece:1,
+-		urg:1,
+-		ack:1,
+-		psh:1,
+-		rst:1,
+-		syn:1,
+-		fin:1;
+-#else
+-#error	"Adjust your <asm/byteorder.h> defines"
+-#endif	
+-	__be16	window;
+-	__sum16	check;
+-	__be16	urg_ptr;
+-};
+-
+-/*
+- *	The union cast uses a gcc extension to avoid aliasing problems
+- *  (union is compatible to any of its members)
+- *  This means this part of the code is -fstrict-aliasing safe now.
+- */
+-union tcp_word_hdr { 
+-	struct tcphdr hdr;
+-	__be32 		  words[5];
+-}; 
+-
+-#define tcp_flag_word(tp) ( ((union tcp_word_hdr *)(tp))->words [3]) 
+-
+-enum { 
+-	TCP_FLAG_CWR = __constant_cpu_to_be32(0x00800000),
+-	TCP_FLAG_ECE = __constant_cpu_to_be32(0x00400000),
+-	TCP_FLAG_URG = __constant_cpu_to_be32(0x00200000),
+-	TCP_FLAG_ACK = __constant_cpu_to_be32(0x00100000),
+-	TCP_FLAG_PSH = __constant_cpu_to_be32(0x00080000),
+-	TCP_FLAG_RST = __constant_cpu_to_be32(0x00040000),
+-	TCP_FLAG_SYN = __constant_cpu_to_be32(0x00020000),
+-	TCP_FLAG_FIN = __constant_cpu_to_be32(0x00010000),
+-	TCP_RESERVED_BITS = __constant_cpu_to_be32(0x0F000000),
+-	TCP_DATA_OFFSET = __constant_cpu_to_be32(0xF0000000)
+-}; 
+-
+-/*
+- * TCP general constants
+- */
+-#define TCP_MSS_DEFAULT		 536U	/* IPv4 (RFC1122, RFC2581) */
+-#define TCP_MSS_DESIRED		1220U	/* IPv6 (tunneled), EDNS0 (RFC3226) */
+-
+-/* TCP socket options */
+-#define TCP_NODELAY		1	/* Turn off Nagle's algorithm. */
+-#define TCP_MAXSEG		2	/* Limit MSS */
+-#define TCP_CORK		3	/* Never send partially complete segments */
+-#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	/* Block/reenable quick acks */
+-#define TCP_CONGESTION		13	/* Congestion control algorithm */
+-#define TCP_MD5SIG		14	/* TCP MD5 Signature (RFC2385) */
+-#define TCP_THIN_LINEAR_TIMEOUTS 16      /* Use linear timeouts for thin streams*/
+-#define TCP_THIN_DUPACK         17      /* Fast retrans. after 1 dupack */
+-#define TCP_USER_TIMEOUT	18	/* How long for loss retry before timeout */
+-#define TCP_REPAIR		19	/* TCP sock is under repair right now */
+-#define TCP_REPAIR_QUEUE	20
+-#define TCP_QUEUE_SEQ		21
+-#define TCP_REPAIR_OPTIONS	22
+-#define TCP_FASTOPEN		23	/* Enable FastOpen on listeners */
+-#define TCP_TIMESTAMP		24
+-#define TCP_NOTSENT_LOWAT	25	/* limit number of unsent bytes in write queue */
+-#define TCP_CC_INFO		26	/* Get Congestion Control (optional) info */
+-#define TCP_SAVE_SYN		27	/* Record SYN headers for new connections */
+-#define TCP_SAVED_SYN		28	/* Get SYN headers recorded for connection */
+-#define TCP_REPAIR_WINDOW	29	/* Get/set window parameters */
+-#define TCP_FASTOPEN_CONNECT	30	/* Attempt FastOpen with connect */
+-#define TCP_ULP			31	/* Attach a ULP to a TCP connection */
+-#define TCP_MD5SIG_EXT		32	/* TCP MD5 Signature with extensions */
+-
+-struct tcp_repair_opt {
+-	__u32	opt_code;
+-	__u32	opt_val;
+-};
+-
+-struct tcp_repair_window {
+-	__u32	snd_wl1;
+-	__u32	snd_wnd;
+-	__u32	max_window;
+-
+-	__u32	rcv_wnd;
+-	__u32	rcv_wup;
+-};
+-
+-enum {
+-	TCP_NO_QUEUE,
+-	TCP_RECV_QUEUE,
+-	TCP_SEND_QUEUE,
+-	TCP_QUEUES_NR,
+-};
+-
+-/* for TCP_INFO socket option */
+-#define TCPI_OPT_TIMESTAMPS	1
+-#define TCPI_OPT_SACK		2
+-#define TCPI_OPT_WSCALE		4
+-#define TCPI_OPT_ECN		8 /* ECN was negociated at TCP session init */
+-#define TCPI_OPT_ECN_SEEN	16 /* we received at least one packet with ECT */
+-#define TCPI_OPT_SYN_DATA	32 /* SYN-ACK acked data in SYN sent or rcvd */
+-
+-enum tcp_ca_state {
+-	TCP_CA_Open = 0,
+-#define TCPF_CA_Open	(1<<TCP_CA_Open)
+-	TCP_CA_Disorder = 1,
+-#define TCPF_CA_Disorder (1<<TCP_CA_Disorder)
+-	TCP_CA_CWR = 2,
+-#define TCPF_CA_CWR	(1<<TCP_CA_CWR)
+-	TCP_CA_Recovery = 3,
+-#define TCPF_CA_Recovery (1<<TCP_CA_Recovery)
+-	TCP_CA_Loss = 4
+-#define TCPF_CA_Loss	(1<<TCP_CA_Loss)
+-};
+-
+-struct tcp_info {
+-	__u8	tcpi_state;
+-	__u8	tcpi_ca_state;
+-	__u8	tcpi_retransmits;
+-	__u8	tcpi_probes;
+-	__u8	tcpi_backoff;
+-	__u8	tcpi_options;
+-	__u8	tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;
+-	__u8	tcpi_delivery_rate_app_limited:1;
+-
+-	__u32	tcpi_rto;
+-	__u32	tcpi_ato;
+-	__u32	tcpi_snd_mss;
+-	__u32	tcpi_rcv_mss;
+-
+-	__u32	tcpi_unacked;
+-	__u32	tcpi_sacked;
+-	__u32	tcpi_lost;
+-	__u32	tcpi_retrans;
+-	__u32	tcpi_fackets;
+-
+-	/* Times. */
+-	__u32	tcpi_last_data_sent;
+-	__u32	tcpi_last_ack_sent;     /* Not remembered, sorry. */
+-	__u32	tcpi_last_data_recv;
+-	__u32	tcpi_last_ack_recv;
+-
+-	/* Metrics. */
+-	__u32	tcpi_pmtu;
+-	__u32	tcpi_rcv_ssthresh;
+-	__u32	tcpi_rtt;
+-	__u32	tcpi_rttvar;
+-	__u32	tcpi_snd_ssthresh;
+-	__u32	tcpi_snd_cwnd;
+-	__u32	tcpi_advmss;
+-	__u32	tcpi_reordering;
+-
+-	__u32	tcpi_rcv_rtt;
+-	__u32	tcpi_rcv_space;
+-
+-	__u32	tcpi_total_retrans;
+-
+-	__u64	tcpi_pacing_rate;
+-	__u64	tcpi_max_pacing_rate;
+-	__u64	tcpi_bytes_acked;    /* RFC4898 tcpEStatsAppHCThruOctetsAcked */
+-	__u64	tcpi_bytes_received; /* RFC4898 tcpEStatsAppHCThruOctetsReceived */
+-	__u32	tcpi_segs_out;	     /* RFC4898 tcpEStatsPerfSegsOut */
+-	__u32	tcpi_segs_in;	     /* RFC4898 tcpEStatsPerfSegsIn */
+-
+-	__u32	tcpi_notsent_bytes;
+-	__u32	tcpi_min_rtt;
+-	__u32	tcpi_data_segs_in;	/* RFC4898 tcpEStatsDataSegsIn */
+-	__u32	tcpi_data_segs_out;	/* RFC4898 tcpEStatsDataSegsOut */
+-
+-	__u64   tcpi_delivery_rate;
+-
+-	__u64	tcpi_busy_time;      /* Time (usec) busy sending data */
+-	__u64	tcpi_rwnd_limited;   /* Time (usec) limited by receive window */
+-	__u64	tcpi_sndbuf_limited; /* Time (usec) limited by send buffer */
+-};
+-
+-/* netlink attributes types for SCM_TIMESTAMPING_OPT_STATS */
+-enum {
+-	TCP_NLA_PAD,
+-	TCP_NLA_BUSY,		/* Time (usec) busy sending data */
+-	TCP_NLA_RWND_LIMITED,	/* Time (usec) limited by receive window */
+-	TCP_NLA_SNDBUF_LIMITED,	/* Time (usec) limited by send buffer */
+-	TCP_NLA_DATA_SEGS_OUT,	/* Data pkts sent including retransmission */
+-	TCP_NLA_TOTAL_RETRANS,	/* Data pkts retransmitted */
+-	TCP_NLA_PACING_RATE,    /* Pacing rate in bytes per second */
+-	TCP_NLA_DELIVERY_RATE,  /* Delivery rate in bytes per second */
+-	TCP_NLA_SND_CWND,       /* Sending congestion window */
+-	TCP_NLA_REORDERING,     /* Reordering metric */
+-	TCP_NLA_MIN_RTT,        /* minimum RTT */
+-	TCP_NLA_RECUR_RETRANS,  /* Recurring retransmits for the current pkt */
+-	TCP_NLA_DELIVERY_RATE_APP_LMT, /* delivery rate application limited ? */
+-
+-};
+-
+-/* for TCP_MD5SIG socket option */
+-#define TCP_MD5SIG_MAXKEYLEN	80
+-
+-/* tcp_md5sig extension flags for TCP_MD5SIG_EXT */
+-#define TCP_MD5SIG_FLAG_PREFIX		1	/* address prefix length */
+-
+-struct tcp_md5sig {
+-	struct __kernel_sockaddr_storage tcpm_addr;	/* address associated */
+-	__u8	tcpm_flags;				/* extension flags */
+-	__u8	tcpm_prefixlen;				/* address prefix */
+-	__u16	tcpm_keylen;				/* key length */
+-	__u32	__tcpm_pad;				/* zero */
+-	__u8	tcpm_key[TCP_MD5SIG_MAXKEYLEN];		/* key (binary) */
+-};
+-
+-/* INET_DIAG_MD5SIG */
+-struct tcp_diag_md5sig {
+-	__u8	tcpm_family;
+-	__u8	tcpm_prefixlen;
+-	__u16	tcpm_keylen;
+-	__be32	tcpm_addr[4];
+-	__u8	tcpm_key[TCP_MD5SIG_MAXKEYLEN];
+-};
+-
+-#endif /* _LINUX_TCP_H */
+diff --git a/include/linux/tcp_metrics.h b/include/linux/tcp_metrics.h
+deleted file mode 100644
+index 80ad90d..0000000
+--- a/include/linux/tcp_metrics.h
++++ /dev/null
+@@ -1,60 +0,0 @@
+-/* tcp_metrics.h - TCP Metrics Interface */
+-
+-#ifndef _LINUX_TCP_METRICS_H
+-#define _LINUX_TCP_METRICS_H
+-
+-#include <linux/types.h>
+-
+-/* NETLINK_GENERIC related info
+- */
+-#define TCP_METRICS_GENL_NAME		"tcp_metrics"
+-#define TCP_METRICS_GENL_VERSION	0x1
+-
+-enum tcp_metric_index {
+-	TCP_METRIC_RTT,		/* in ms units */
+-	TCP_METRIC_RTTVAR,	/* in ms units */
+-	TCP_METRIC_SSTHRESH,
+-	TCP_METRIC_CWND,
+-	TCP_METRIC_REORDERING,
+-
+-	TCP_METRIC_RTT_US,	/* in usec units */
+-	TCP_METRIC_RTTVAR_US,	/* in usec units */
+-
+-	/* Always last.  */
+-	__TCP_METRIC_MAX,
+-};
+-
+-#define TCP_METRIC_MAX	(__TCP_METRIC_MAX - 1)
+-
+-enum {
+-	TCP_METRICS_ATTR_UNSPEC,
+-	TCP_METRICS_ATTR_ADDR_IPV4,		/* u32 */
+-	TCP_METRICS_ATTR_ADDR_IPV6,		/* binary */
+-	TCP_METRICS_ATTR_AGE,			/* msecs */
+-	TCP_METRICS_ATTR_TW_TSVAL,		/* u32, raw, rcv tsval */
+-	TCP_METRICS_ATTR_TW_TS_STAMP,		/* s32, sec age */
+-	TCP_METRICS_ATTR_VALS,			/* nested +1, u32 */
+-	TCP_METRICS_ATTR_FOPEN_MSS,		/* u16 */
+-	TCP_METRICS_ATTR_FOPEN_SYN_DROPS,	/* u16, count of drops */
+-	TCP_METRICS_ATTR_FOPEN_SYN_DROP_TS,	/* msecs age */
+-	TCP_METRICS_ATTR_FOPEN_COOKIE,		/* binary */
+-	TCP_METRICS_ATTR_SADDR_IPV4,		/* u32 */
+-	TCP_METRICS_ATTR_SADDR_IPV6,		/* binary */
+-	TCP_METRICS_ATTR_PAD,
+-
+-	__TCP_METRICS_ATTR_MAX,
+-};
+-
+-#define TCP_METRICS_ATTR_MAX	(__TCP_METRICS_ATTR_MAX - 1)
+-
+-enum {
+-	TCP_METRICS_CMD_UNSPEC,
+-	TCP_METRICS_CMD_GET,
+-	TCP_METRICS_CMD_DEL,
+-
+-	__TCP_METRICS_CMD_MAX,
+-};
+-
+-#define TCP_METRICS_CMD_MAX	(__TCP_METRICS_CMD_MAX - 1)
+-
+-#endif /* _LINUX_TCP_METRICS_H */
+diff --git a/include/linux/tipc.h b/include/linux/tipc.h
+deleted file mode 100644
+index 924fb5c..0000000
+--- a/include/linux/tipc.h
++++ /dev/null
+@@ -1,256 +0,0 @@
+-/*
+- * include/uapi/linux/tipc.h: Header for TIPC socket interface
+- *
+- * Copyright (c) 2003-2006, 2015-2016 Ericsson AB
+- * Copyright (c) 2005, 2010-2011, Wind River Systems
+- * 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.
+- * 3. Neither the names of the copyright holders nor the names of its
+- *    contributors may be used to endorse or promote products derived from
+- *    this software without specific prior written permission.
+- *
+- * Alternatively, this software may be distributed under the terms of the
+- * GNU General Public License ("GPL") version 2 as published by the Free
+- * Software Foundation.
+- *
+- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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.
+- */
+-
+-#ifndef _LINUX_TIPC_H_
+-#define _LINUX_TIPC_H_
+-
+-#include <linux/types.h>
+-#include <linux/sockios.h>
+-
+-/*
+- * TIPC addressing primitives
+- */
+-
+-struct tipc_portid {
+-	__u32 ref;
+-	__u32 node;
+-};
+-
+-struct tipc_name {
+-	__u32 type;
+-	__u32 instance;
+-};
+-
+-struct tipc_name_seq {
+-	__u32 type;
+-	__u32 lower;
+-	__u32 upper;
+-};
+-
+-/* TIPC Address Size, Offset, Mask specification for Z.C.N
+- */
+-#define TIPC_NODE_BITS          12
+-#define TIPC_CLUSTER_BITS       12
+-#define TIPC_ZONE_BITS          8
+-
+-#define TIPC_NODE_OFFSET        0
+-#define TIPC_CLUSTER_OFFSET     TIPC_NODE_BITS
+-#define TIPC_ZONE_OFFSET        (TIPC_CLUSTER_OFFSET + TIPC_CLUSTER_BITS)
+-
+-#define TIPC_NODE_SIZE          ((1UL << TIPC_NODE_BITS) - 1)
+-#define TIPC_CLUSTER_SIZE       ((1UL << TIPC_CLUSTER_BITS) - 1)
+-#define TIPC_ZONE_SIZE          ((1UL << TIPC_ZONE_BITS) - 1)
+-
+-#define TIPC_NODE_MASK		(TIPC_NODE_SIZE << TIPC_NODE_OFFSET)
+-#define TIPC_CLUSTER_MASK	(TIPC_CLUSTER_SIZE << TIPC_CLUSTER_OFFSET)
+-#define TIPC_ZONE_MASK		(TIPC_ZONE_SIZE << TIPC_ZONE_OFFSET)
+-
+-#define TIPC_ZONE_CLUSTER_MASK (TIPC_ZONE_MASK | TIPC_CLUSTER_MASK)
+-
+-static __inline__ __u32 tipc_addr(unsigned int zone,
+-			      unsigned int cluster,
+-			      unsigned int node)
+-{
+-	return (zone << TIPC_ZONE_OFFSET) |
+-		(cluster << TIPC_CLUSTER_OFFSET) |
+-		node;
+-}
+-
+-static __inline__ unsigned int tipc_zone(__u32 addr)
+-{
+-	return addr >> TIPC_ZONE_OFFSET;
+-}
+-
+-static __inline__ unsigned int tipc_cluster(__u32 addr)
+-{
+-	return (addr & TIPC_CLUSTER_MASK) >> TIPC_CLUSTER_OFFSET;
+-}
+-
+-static __inline__ unsigned int tipc_node(__u32 addr)
+-{
+-	return addr & TIPC_NODE_MASK;
+-}
+-
+-/*
+- * Application-accessible port name types
+- */
+-
+-#define TIPC_CFG_SRV		0	/* configuration service name type */
+-#define TIPC_TOP_SRV		1	/* topology service name type */
+-#define TIPC_LINK_STATE		2	/* link state name type */
+-#define TIPC_RESERVED_TYPES	64	/* lowest user-publishable name type */
+-
+-/*
+- * Publication scopes when binding port names and port name sequences
+- */
+-
+-#define TIPC_ZONE_SCOPE		1
+-#define TIPC_CLUSTER_SCOPE	2
+-#define TIPC_NODE_SCOPE		3
+-
+-/*
+- * Limiting values for messages
+- */
+-
+-#define TIPC_MAX_USER_MSG_SIZE	66000U
+-
+-/*
+- * Message importance levels
+- */
+-
+-#define TIPC_LOW_IMPORTANCE		0
+-#define TIPC_MEDIUM_IMPORTANCE		1
+-#define TIPC_HIGH_IMPORTANCE		2
+-#define TIPC_CRITICAL_IMPORTANCE	3
+-
+-/*
+- * Msg rejection/connection shutdown reasons
+- */
+-
+-#define TIPC_OK			0
+-#define TIPC_ERR_NO_NAME	1
+-#define TIPC_ERR_NO_PORT	2
+-#define TIPC_ERR_NO_NODE	3
+-#define TIPC_ERR_OVERLOAD	4
+-#define TIPC_CONN_SHUTDOWN	5
+-
+-/*
+- * TIPC topology subscription service definitions
+- */
+-
+-#define TIPC_SUB_PORTS		0x01	/* filter for port availability */
+-#define TIPC_SUB_SERVICE	0x02	/* filter for service availability */
+-#define TIPC_SUB_CANCEL		0x04	/* cancel a subscription */
+-
+-#define TIPC_WAIT_FOREVER	(~0)	/* timeout for permanent subscription */
+-
+-struct tipc_subscr {
+-	struct tipc_name_seq seq;	/* name sequence of interest */
+-	__u32 timeout;			/* subscription duration (in ms) */
+-	__u32 filter;			/* bitmask of filter options */
+-	char usr_handle[8];		/* available for subscriber use */
+-};
+-
+-#define TIPC_PUBLISHED		1	/* publication event */
+-#define TIPC_WITHDRAWN		2	/* withdraw event */
+-#define TIPC_SUBSCR_TIMEOUT	3	/* subscription timeout event */
+-
+-struct tipc_event {
+-	__u32 event;			/* event type */
+-	__u32 found_lower;		/* matching name seq instances */
+-	__u32 found_upper;		/*    "      "    "     "      */
+-	struct tipc_portid port;	/* associated port */
+-	struct tipc_subscr s;		/* associated subscription */
+-};
+-
+-/*
+- * Socket API
+- */
+-
+-#ifndef AF_TIPC
+-#define AF_TIPC		30
+-#endif
+-
+-#ifndef PF_TIPC
+-#define PF_TIPC		AF_TIPC
+-#endif
+-
+-#ifndef SOL_TIPC
+-#define SOL_TIPC	271
+-#endif
+-
+-#define TIPC_ADDR_NAMESEQ	1
+-#define TIPC_ADDR_MCAST		1
+-#define TIPC_ADDR_NAME		2
+-#define TIPC_ADDR_ID		3
+-
+-struct sockaddr_tipc {
+-	unsigned short family;
+-	unsigned char  addrtype;
+-	signed   char  scope;
+-	union {
+-		struct tipc_portid id;
+-		struct tipc_name_seq nameseq;
+-		struct {
+-			struct tipc_name name;
+-			__u32 domain;
+-		} name;
+-	} addr;
+-};
+-
+-/*
+- * Ancillary data objects supported by recvmsg()
+- */
+-
+-#define TIPC_ERRINFO	1	/* error info */
+-#define TIPC_RETDATA	2	/* returned data */
+-#define TIPC_DESTNAME	3	/* destination name */
+-
+-/*
+- * TIPC-specific socket option names
+- */
+-
+-#define TIPC_IMPORTANCE		127	/* Default: TIPC_LOW_IMPORTANCE */
+-#define TIPC_SRC_DROPPABLE	128	/* Default: based on socket type */
+-#define TIPC_DEST_DROPPABLE	129	/* Default: based on socket type */
+-#define TIPC_CONN_TIMEOUT	130	/* Default: 8000 (ms)  */
+-#define TIPC_NODE_RECVQ_DEPTH	131	/* Default: none (read only) */
+-#define TIPC_SOCK_RECVQ_DEPTH	132	/* Default: none (read only) */
+-#define TIPC_MCAST_BROADCAST    133     /* Default: TIPC selects. No arg */
+-#define TIPC_MCAST_REPLICAST    134     /* Default: TIPC selects. No arg */
+-
+-/*
+- * Maximum sizes of TIPC bearer-related names (including terminating NULL)
+- * The string formatting for each name element is:
+- * media: media
+- * interface: media:interface name
+- * link: Z.C.N:interface-Z.C.N:interface
+- *
+- */
+-
+-#define TIPC_MAX_MEDIA_NAME	16
+-#define TIPC_MAX_IF_NAME	16
+-#define TIPC_MAX_BEARER_NAME	32
+-#define TIPC_MAX_LINK_NAME	60
+-
+-#define SIOCGETLINKNAME		SIOCPROTOPRIVATE
+-
+-struct tipc_sioc_ln_req {
+-	__u32 peer;
+-	__u32 bearer_id;
+-	char linkname[TIPC_MAX_LINK_NAME];
+-};
+-#endif
+diff --git a/include/linux/tipc_netlink.h b/include/linux/tipc_netlink.h
+deleted file mode 100644
+index f9edd20..0000000
+--- a/include/linux/tipc_netlink.h
++++ /dev/null
+@@ -1,294 +0,0 @@
+-/*
+- * Copyright (c) 2014, Ericsson AB
+- * 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.
+- * 3. Neither the names of the copyright holders nor the names of its
+- *    contributors may be used to endorse or promote products derived from
+- *    this software without specific prior written permission.
+- *
+- * Alternatively, this software may be distributed under the terms of the
+- * GNU General Public License ("GPL") version 2 as published by the Free
+- * Software Foundation.
+- *
+- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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.
+- */
+-
+-#ifndef _LINUX_TIPC_NETLINK_H_
+-#define _LINUX_TIPC_NETLINK_H_
+-
+-#define TIPC_GENL_V2_NAME      "TIPCv2"
+-#define TIPC_GENL_V2_VERSION   0x1
+-
+-/* Netlink commands */
+-enum {
+-	TIPC_NL_UNSPEC,
+-	TIPC_NL_LEGACY,
+-	TIPC_NL_BEARER_DISABLE,
+-	TIPC_NL_BEARER_ENABLE,
+-	TIPC_NL_BEARER_GET,
+-	TIPC_NL_BEARER_SET,
+-	TIPC_NL_SOCK_GET,
+-	TIPC_NL_PUBL_GET,
+-	TIPC_NL_LINK_GET,
+-	TIPC_NL_LINK_SET,
+-	TIPC_NL_LINK_RESET_STATS,
+-	TIPC_NL_MEDIA_GET,
+-	TIPC_NL_MEDIA_SET,
+-	TIPC_NL_NODE_GET,
+-	TIPC_NL_NET_GET,
+-	TIPC_NL_NET_SET,
+-	TIPC_NL_NAME_TABLE_GET,
+-	TIPC_NL_MON_SET,
+-	TIPC_NL_MON_GET,
+-	TIPC_NL_MON_PEER_GET,
+-	TIPC_NL_PEER_REMOVE,
+-	TIPC_NL_BEARER_ADD,
+-	TIPC_NL_UDP_GET_REMOTEIP,
+-
+-	__TIPC_NL_CMD_MAX,
+-	TIPC_NL_CMD_MAX = __TIPC_NL_CMD_MAX - 1
+-};
+-
+-/* Top level netlink attributes */
+-enum {
+-	TIPC_NLA_UNSPEC,
+-	TIPC_NLA_BEARER,		/* nest */
+-	TIPC_NLA_SOCK,			/* nest */
+-	TIPC_NLA_PUBL,			/* nest */
+-	TIPC_NLA_LINK,			/* nest */
+-	TIPC_NLA_MEDIA,			/* nest */
+-	TIPC_NLA_NODE,			/* nest */
+-	TIPC_NLA_NET,			/* nest */
+-	TIPC_NLA_NAME_TABLE,		/* nest */
+-	TIPC_NLA_MON,			/* nest */
+-	TIPC_NLA_MON_PEER,		/* nest */
+-
+-	__TIPC_NLA_MAX,
+-	TIPC_NLA_MAX = __TIPC_NLA_MAX - 1
+-};
+-
+-/* Bearer info */
+-enum {
+-	TIPC_NLA_BEARER_UNSPEC,
+-	TIPC_NLA_BEARER_NAME,		/* string */
+-	TIPC_NLA_BEARER_PROP,		/* nest */
+-	TIPC_NLA_BEARER_DOMAIN,		/* u32 */
+-	TIPC_NLA_BEARER_UDP_OPTS,	/* nest */
+-
+-	__TIPC_NLA_BEARER_MAX,
+-	TIPC_NLA_BEARER_MAX = __TIPC_NLA_BEARER_MAX - 1
+-};
+-
+-enum {
+-	TIPC_NLA_UDP_UNSPEC,
+-	TIPC_NLA_UDP_LOCAL,		/* sockaddr_storage */
+-	TIPC_NLA_UDP_REMOTE,		/* sockaddr_storage */
+-	TIPC_NLA_UDP_MULTI_REMOTEIP,	/* flag */
+-
+-	__TIPC_NLA_UDP_MAX,
+-	TIPC_NLA_UDP_MAX = __TIPC_NLA_UDP_MAX - 1
+-};
+-/* Socket info */
+-enum {
+-	TIPC_NLA_SOCK_UNSPEC,
+-	TIPC_NLA_SOCK_ADDR,		/* u32 */
+-	TIPC_NLA_SOCK_REF,		/* u32 */
+-	TIPC_NLA_SOCK_CON,		/* nest */
+-	TIPC_NLA_SOCK_HAS_PUBL,		/* flag */
+-
+-	__TIPC_NLA_SOCK_MAX,
+-	TIPC_NLA_SOCK_MAX = __TIPC_NLA_SOCK_MAX - 1
+-};
+-
+-/* Link info */
+-enum {
+-	TIPC_NLA_LINK_UNSPEC,
+-	TIPC_NLA_LINK_NAME,		/* string */
+-	TIPC_NLA_LINK_DEST,		/* u32 */
+-	TIPC_NLA_LINK_MTU,		/* u32 */
+-	TIPC_NLA_LINK_BROADCAST,	/* flag */
+-	TIPC_NLA_LINK_UP,		/* flag */
+-	TIPC_NLA_LINK_ACTIVE,		/* flag */
+-	TIPC_NLA_LINK_PROP,		/* nest */
+-	TIPC_NLA_LINK_STATS,		/* nest */
+-	TIPC_NLA_LINK_RX,		/* u32 */
+-	TIPC_NLA_LINK_TX,		/* u32 */
+-
+-	__TIPC_NLA_LINK_MAX,
+-	TIPC_NLA_LINK_MAX = __TIPC_NLA_LINK_MAX - 1
+-};
+-
+-/* Media info */
+-enum {
+-	TIPC_NLA_MEDIA_UNSPEC,
+-	TIPC_NLA_MEDIA_NAME,		/* string */
+-	TIPC_NLA_MEDIA_PROP,		/* nest */
+-
+-	__TIPC_NLA_MEDIA_MAX,
+-	TIPC_NLA_MEDIA_MAX = __TIPC_NLA_MEDIA_MAX - 1
+-};
+-
+-/* Node info */
+-enum {
+-	TIPC_NLA_NODE_UNSPEC,
+-	TIPC_NLA_NODE_ADDR,		/* u32 */
+-	TIPC_NLA_NODE_UP,		/* flag */
+-
+-	__TIPC_NLA_NODE_MAX,
+-	TIPC_NLA_NODE_MAX = __TIPC_NLA_NODE_MAX - 1
+-};
+-
+-/* Net info */
+-enum {
+-	TIPC_NLA_NET_UNSPEC,
+-	TIPC_NLA_NET_ID,		/* u32 */
+-	TIPC_NLA_NET_ADDR,		/* u32 */
+-
+-	__TIPC_NLA_NET_MAX,
+-	TIPC_NLA_NET_MAX = __TIPC_NLA_NET_MAX - 1
+-};
+-
+-/* Name table info */
+-enum {
+-	TIPC_NLA_NAME_TABLE_UNSPEC,
+-	TIPC_NLA_NAME_TABLE_PUBL,	/* nest */
+-
+-	__TIPC_NLA_NAME_TABLE_MAX,
+-	TIPC_NLA_NAME_TABLE_MAX = __TIPC_NLA_NAME_TABLE_MAX - 1
+-};
+-
+-/* Monitor info */
+-enum {
+-	TIPC_NLA_MON_UNSPEC,
+-	TIPC_NLA_MON_ACTIVATION_THRESHOLD,	/* u32 */
+-	TIPC_NLA_MON_REF,			/* u32 */
+-	TIPC_NLA_MON_ACTIVE,			/* flag */
+-	TIPC_NLA_MON_BEARER_NAME,		/* string */
+-	TIPC_NLA_MON_PEERCNT,			/* u32 */
+-	TIPC_NLA_MON_LISTGEN,			/* u32 */
+-
+-	__TIPC_NLA_MON_MAX,
+-	TIPC_NLA_MON_MAX = __TIPC_NLA_MON_MAX - 1
+-};
+-
+-/* Publication info */
+-enum {
+-	TIPC_NLA_PUBL_UNSPEC,
+-
+-	TIPC_NLA_PUBL_TYPE,		/* u32 */
+-	TIPC_NLA_PUBL_LOWER,		/* u32 */
+-	TIPC_NLA_PUBL_UPPER,		/* u32 */
+-	TIPC_NLA_PUBL_SCOPE,		/* u32 */
+-	TIPC_NLA_PUBL_NODE,		/* u32 */
+-	TIPC_NLA_PUBL_REF,		/* u32 */
+-	TIPC_NLA_PUBL_KEY,		/* u32 */
+-
+-	__TIPC_NLA_PUBL_MAX,
+-	TIPC_NLA_PUBL_MAX = __TIPC_NLA_PUBL_MAX - 1
+-};
+-
+-/* Monitor peer info */
+-enum {
+-	TIPC_NLA_MON_PEER_UNSPEC,
+-
+-	TIPC_NLA_MON_PEER_ADDR,			/* u32 */
+-	TIPC_NLA_MON_PEER_DOMGEN,		/* u32 */
+-	TIPC_NLA_MON_PEER_APPLIED,		/* u32 */
+-	TIPC_NLA_MON_PEER_UPMAP,		/* u64 */
+-	TIPC_NLA_MON_PEER_MEMBERS,		/* tlv */
+-	TIPC_NLA_MON_PEER_UP,			/* flag */
+-	TIPC_NLA_MON_PEER_HEAD,			/* flag */
+-	TIPC_NLA_MON_PEER_LOCAL,		/* flag */
+-	TIPC_NLA_MON_PEER_PAD,			/* flag */
+-
+-	__TIPC_NLA_MON_PEER_MAX,
+-	TIPC_NLA_MON_PEER_MAX = __TIPC_NLA_MON_PEER_MAX - 1
+-};
+-
+-/* Nest, connection info */
+-enum {
+-	TIPC_NLA_CON_UNSPEC,
+-
+-	TIPC_NLA_CON_FLAG,		/* flag */
+-	TIPC_NLA_CON_NODE,		/* u32 */
+-	TIPC_NLA_CON_SOCK,		/* u32 */
+-	TIPC_NLA_CON_TYPE,		/* u32 */
+-	TIPC_NLA_CON_INST,		/* u32 */
+-
+-	__TIPC_NLA_CON_MAX,
+-	TIPC_NLA_CON_MAX = __TIPC_NLA_CON_MAX - 1
+-};
+-
+-/* Nest, link propreties. Valid for link, media and bearer */
+-enum {
+-	TIPC_NLA_PROP_UNSPEC,
+-
+-	TIPC_NLA_PROP_PRIO,		/* u32 */
+-	TIPC_NLA_PROP_TOL,		/* u32 */
+-	TIPC_NLA_PROP_WIN,		/* u32 */
+-
+-	__TIPC_NLA_PROP_MAX,
+-	TIPC_NLA_PROP_MAX = __TIPC_NLA_PROP_MAX - 1
+-};
+-
+-/* Nest, statistics info */
+-enum {
+-	TIPC_NLA_STATS_UNSPEC,
+-
+-	TIPC_NLA_STATS_RX_INFO,		/* u32 */
+-	TIPC_NLA_STATS_RX_FRAGMENTS,	/* u32 */
+-	TIPC_NLA_STATS_RX_FRAGMENTED,	/* u32 */
+-	TIPC_NLA_STATS_RX_BUNDLES,	/* u32 */
+-	TIPC_NLA_STATS_RX_BUNDLED,	/* u32 */
+-	TIPC_NLA_STATS_TX_INFO,		/* u32 */
+-	TIPC_NLA_STATS_TX_FRAGMENTS,	/* u32 */
+-	TIPC_NLA_STATS_TX_FRAGMENTED,	/* u32 */
+-	TIPC_NLA_STATS_TX_BUNDLES,	/* u32 */
+-	TIPC_NLA_STATS_TX_BUNDLED,	/* u32 */
+-	TIPC_NLA_STATS_MSG_PROF_TOT,	/* u32 */
+-	TIPC_NLA_STATS_MSG_LEN_CNT,	/* u32 */
+-	TIPC_NLA_STATS_MSG_LEN_TOT,	/* u32 */
+-	TIPC_NLA_STATS_MSG_LEN_P0,	/* u32 */
+-	TIPC_NLA_STATS_MSG_LEN_P1,	/* u32 */
+-	TIPC_NLA_STATS_MSG_LEN_P2,	/* u32 */
+-	TIPC_NLA_STATS_MSG_LEN_P3,	/* u32 */
+-	TIPC_NLA_STATS_MSG_LEN_P4,	/* u32 */
+-	TIPC_NLA_STATS_MSG_LEN_P5,	/* u32 */
+-	TIPC_NLA_STATS_MSG_LEN_P6,	/* u32 */
+-	TIPC_NLA_STATS_RX_STATES,	/* u32 */
+-	TIPC_NLA_STATS_RX_PROBES,	/* u32 */
+-	TIPC_NLA_STATS_RX_NACKS,	/* u32 */
+-	TIPC_NLA_STATS_RX_DEFERRED,	/* u32 */
+-	TIPC_NLA_STATS_TX_STATES,	/* u32 */
+-	TIPC_NLA_STATS_TX_PROBES,	/* u32 */
+-	TIPC_NLA_STATS_TX_NACKS,	/* u32 */
+-	TIPC_NLA_STATS_TX_ACKS,		/* u32 */
+-	TIPC_NLA_STATS_RETRANSMITTED,	/* u32 */
+-	TIPC_NLA_STATS_DUPLICATES,	/* u32 */
+-	TIPC_NLA_STATS_LINK_CONGS,	/* u32 */
+-	TIPC_NLA_STATS_MAX_QUEUE,	/* u32 */
+-	TIPC_NLA_STATS_AVG_QUEUE,	/* u32 */
+-
+-	__TIPC_NLA_STATS_MAX,
+-	TIPC_NLA_STATS_MAX = __TIPC_NLA_STATS_MAX - 1
+-};
+-
+-#endif
+diff --git a/include/linux/types.h b/include/linux/types.h
+deleted file mode 100644
+index c640657..0000000
+--- a/include/linux/types.h
++++ /dev/null
+@@ -1,47 +0,0 @@
+-#ifndef _LINUX_TYPES_H
+-#define _LINUX_TYPES_H
+-
+-#include <asm/types.h>
+-
+-#ifndef __ASSEMBLY__
+-
+-#include <linux/posix_types.h>
+-
+-
+-/*
+- * Below are truly Linux-specific types that should never collide with
+- * any application/library that wants linux/types.h.
+- */
+-
+-#ifdef __CHECKER__
+-#define __bitwise__ __attribute__((bitwise))
+-#else
+-#define __bitwise__
+-#endif
+-#define __bitwise __bitwise__
+-
+-typedef __u16 __bitwise __le16;
+-typedef __u16 __bitwise __be16;
+-typedef __u32 __bitwise __le32;
+-typedef __u32 __bitwise __be32;
+-typedef __u64 __bitwise __le64;
+-typedef __u64 __bitwise __be64;
+-
+-typedef __u16 __bitwise __sum16;
+-typedef __u32 __bitwise __wsum;
+-
+-/*
+- * aligned_u64 should be used in defining kernel<->userspace ABIs to avoid
+- * common 32/64-bit compat problems.
+- * 64-bit values align to 4-byte boundaries on x86_32 (and possibly other
+- * architectures) and to 8-byte boundaries on 64-bit architectures.  The new
+- * aligned_64 type enforces 8-byte alignment so that structs containing
+- * aligned_64 values have the same alignment on 32-bit and 64-bit architectures.
+- * No conversions are necessary between 32-bit user-space and a 64-bit kernel.
+- */
+-#define __aligned_u64 __u64 __attribute__((aligned(8)))
+-#define __aligned_be64 __be64 __attribute__((aligned(8)))
+-#define __aligned_le64 __le64 __attribute__((aligned(8)))
+-
+-#endif /*  __ASSEMBLY__ */
+-#endif /* _LINUX_TYPES_H */
+diff --git a/include/linux/unix_diag.h b/include/linux/unix_diag.h
+deleted file mode 100644
+index 1eb0b8d..0000000
+--- a/include/linux/unix_diag.h
++++ /dev/null
+@@ -1,58 +0,0 @@
+-#ifndef __UNIX_DIAG_H__
+-#define __UNIX_DIAG_H__
+-
+-#include <linux/types.h>
+-
+-struct unix_diag_req {
+-	__u8	sdiag_family;
+-	__u8	sdiag_protocol;
+-	__u16	pad;
+-	__u32	udiag_states;
+-	__u32	udiag_ino;
+-	__u32	udiag_show;
+-	__u32	udiag_cookie[2];
+-};
+-
+-#define UDIAG_SHOW_NAME		0x00000001	/* show name (not path) */
+-#define UDIAG_SHOW_VFS		0x00000002	/* show VFS inode info */
+-#define UDIAG_SHOW_PEER		0x00000004	/* show peer socket info */
+-#define UDIAG_SHOW_ICONS	0x00000008	/* show pending connections */
+-#define UDIAG_SHOW_RQLEN	0x00000010	/* show skb receive queue len */
+-#define UDIAG_SHOW_MEMINFO	0x00000020	/* show memory info of a socket */
+-
+-struct unix_diag_msg {
+-	__u8	udiag_family;
+-	__u8	udiag_type;
+-	__u8	udiag_state;
+-	__u8	pad;
+-
+-	__u32	udiag_ino;
+-	__u32	udiag_cookie[2];
+-};
+-
+-enum {
+-	/* UNIX_DIAG_NONE, standard nl API requires this attribute!  */
+-	UNIX_DIAG_NAME,
+-	UNIX_DIAG_VFS,
+-	UNIX_DIAG_PEER,
+-	UNIX_DIAG_ICONS,
+-	UNIX_DIAG_RQLEN,
+-	UNIX_DIAG_MEMINFO,
+-	UNIX_DIAG_SHUTDOWN,
+-
+-	__UNIX_DIAG_MAX,
+-};
+-
+-#define UNIX_DIAG_MAX (__UNIX_DIAG_MAX - 1)
+-
+-struct unix_diag_vfs {
+-	__u32	udiag_vfs_ino;
+-	__u32	udiag_vfs_dev;
+-};
+-
+-struct unix_diag_rqlen {
+-	__u32	udiag_rqueue;
+-	__u32	udiag_wqueue;
+-};
+-
+-#endif
+diff --git a/include/linux/veth.h b/include/linux/veth.h
+deleted file mode 100644
+index 3354c1e..0000000
+--- a/include/linux/veth.h
++++ /dev/null
+@@ -1,12 +0,0 @@
+-#ifndef __NET_VETH_H_
+-#define __NET_VETH_H_
+-
+-enum {
+-	VETH_INFO_UNSPEC,
+-	VETH_INFO_PEER,
+-
+-	__VETH_INFO_MAX
+-#define VETH_INFO_MAX	(__VETH_INFO_MAX - 1)
+-};
+-
+-#endif
+diff --git a/include/linux/xfrm.h b/include/linux/xfrm.h
+deleted file mode 100644
+index 5790293..0000000
+--- a/include/linux/xfrm.h
++++ /dev/null
+@@ -1,536 +0,0 @@
+-#ifndef _LINUX_XFRM_H
+-#define _LINUX_XFRM_H
+-
+-#include <linux/in6.h>
+-#include <linux/types.h>
+-
+-/* All of the structures in this file may not change size as they are
+- * passed into the kernel from userspace via netlink sockets.
+- */
+-
+-/* Structure to encapsulate addresses. I do not want to use
+- * "standard" structure. My apologies.
+- */
+-typedef union {
+-	__be32		a4;
+-	__be32		a6[4];
+-	struct in6_addr	in6;
+-} xfrm_address_t;
+-
+-/* Ident of a specific xfrm_state. It is used on input to lookup
+- * the state by (spi,daddr,ah/esp) or to store information about
+- * spi, protocol and tunnel address on output.
+- */
+-struct xfrm_id {
+-	xfrm_address_t	daddr;
+-	__be32		spi;
+-	__u8		proto;
+-};
+-
+-struct xfrm_sec_ctx {
+-	__u8	ctx_doi;
+-	__u8	ctx_alg;
+-	__u16	ctx_len;
+-	__u32	ctx_sid;
+-	char	ctx_str[0];
+-};
+-
+-/* Security Context Domains of Interpretation */
+-#define XFRM_SC_DOI_RESERVED 0
+-#define XFRM_SC_DOI_LSM 1
+-
+-/* Security Context Algorithms */
+-#define XFRM_SC_ALG_RESERVED 0
+-#define XFRM_SC_ALG_SELINUX 1
+-
+-/* Selector, used as selector both on policy rules (SPD) and SAs. */
+-
+-struct xfrm_selector {
+-	xfrm_address_t	daddr;
+-	xfrm_address_t	saddr;
+-	__be16	dport;
+-	__be16	dport_mask;
+-	__be16	sport;
+-	__be16	sport_mask;
+-	__u16	family;
+-	__u8	prefixlen_d;
+-	__u8	prefixlen_s;
+-	__u8	proto;
+-	int	ifindex;
+-	__kernel_uid32_t	user;
+-};
+-
+-#define XFRM_INF (~(__u64)0)
+-
+-struct xfrm_lifetime_cfg {
+-	__u64	soft_byte_limit;
+-	__u64	hard_byte_limit;
+-	__u64	soft_packet_limit;
+-	__u64	hard_packet_limit;
+-	__u64	soft_add_expires_seconds;
+-	__u64	hard_add_expires_seconds;
+-	__u64	soft_use_expires_seconds;
+-	__u64	hard_use_expires_seconds;
+-};
+-
+-struct xfrm_lifetime_cur {
+-	__u64	bytes;
+-	__u64	packets;
+-	__u64	add_time;
+-	__u64	use_time;
+-};
+-
+-struct xfrm_replay_state {
+-	__u32	oseq;
+-	__u32	seq;
+-	__u32	bitmap;
+-};
+-
+-#define XFRMA_REPLAY_ESN_MAX	4096
+-
+-struct xfrm_replay_state_esn {
+-	unsigned int	bmp_len;
+-	__u32		oseq;
+-	__u32		seq;
+-	__u32		oseq_hi;
+-	__u32		seq_hi;
+-	__u32		replay_window;
+-	__u32		bmp[0];
+-};
+-
+-struct xfrm_algo {
+-	char		alg_name[64];
+-	unsigned int	alg_key_len;    /* in bits */
+-	char		alg_key[0];
+-};
+-
+-struct xfrm_algo_auth {
+-	char		alg_name[64];
+-	unsigned int	alg_key_len;    /* in bits */
+-	unsigned int	alg_trunc_len;  /* in bits */
+-	char		alg_key[0];
+-};
+-
+-struct xfrm_algo_aead {
+-	char		alg_name[64];
+-	unsigned int	alg_key_len;	/* in bits */
+-	unsigned int	alg_icv_len;	/* in bits */
+-	char		alg_key[0];
+-};
+-
+-struct xfrm_stats {
+-	__u32	replay_window;
+-	__u32	replay;
+-	__u32	integrity_failed;
+-};
+-
+-enum {
+-	XFRM_POLICY_TYPE_MAIN	= 0,
+-	XFRM_POLICY_TYPE_SUB	= 1,
+-	XFRM_POLICY_TYPE_MAX	= 2,
+-	XFRM_POLICY_TYPE_ANY	= 255
+-};
+-
+-enum {
+-	XFRM_POLICY_IN	= 0,
+-	XFRM_POLICY_OUT	= 1,
+-	XFRM_POLICY_FWD	= 2,
+-	XFRM_POLICY_MASK = 3,
+-	XFRM_POLICY_MAX	= 3
+-};
+-
+-enum {
+-	XFRM_SHARE_ANY,		/* No limitations */
+-	XFRM_SHARE_SESSION,	/* For this session only */
+-	XFRM_SHARE_USER,	/* For this user only */
+-	XFRM_SHARE_UNIQUE	/* Use once */
+-};
+-
+-#define XFRM_MODE_TRANSPORT 0
+-#define XFRM_MODE_TUNNEL 1
+-#define XFRM_MODE_ROUTEOPTIMIZATION 2
+-#define XFRM_MODE_IN_TRIGGER 3
+-#define XFRM_MODE_BEET 4
+-#define XFRM_MODE_MAX 5
+-
+-/* Netlink configuration messages.  */
+-enum {
+-	XFRM_MSG_BASE = 0x10,
+-
+-	XFRM_MSG_NEWSA = 0x10,
+-#define XFRM_MSG_NEWSA XFRM_MSG_NEWSA
+-	XFRM_MSG_DELSA,
+-#define XFRM_MSG_DELSA XFRM_MSG_DELSA
+-	XFRM_MSG_GETSA,
+-#define XFRM_MSG_GETSA XFRM_MSG_GETSA
+-
+-	XFRM_MSG_NEWPOLICY,
+-#define XFRM_MSG_NEWPOLICY XFRM_MSG_NEWPOLICY
+-	XFRM_MSG_DELPOLICY,
+-#define XFRM_MSG_DELPOLICY XFRM_MSG_DELPOLICY
+-	XFRM_MSG_GETPOLICY,
+-#define XFRM_MSG_GETPOLICY XFRM_MSG_GETPOLICY
+-
+-	XFRM_MSG_ALLOCSPI,
+-#define XFRM_MSG_ALLOCSPI XFRM_MSG_ALLOCSPI
+-	XFRM_MSG_ACQUIRE,
+-#define XFRM_MSG_ACQUIRE XFRM_MSG_ACQUIRE
+-	XFRM_MSG_EXPIRE,
+-#define XFRM_MSG_EXPIRE XFRM_MSG_EXPIRE
+-
+-	XFRM_MSG_UPDPOLICY,
+-#define XFRM_MSG_UPDPOLICY XFRM_MSG_UPDPOLICY
+-	XFRM_MSG_UPDSA,
+-#define XFRM_MSG_UPDSA XFRM_MSG_UPDSA
+-
+-	XFRM_MSG_POLEXPIRE,
+-#define XFRM_MSG_POLEXPIRE XFRM_MSG_POLEXPIRE
+-
+-	XFRM_MSG_FLUSHSA,
+-#define XFRM_MSG_FLUSHSA XFRM_MSG_FLUSHSA
+-	XFRM_MSG_FLUSHPOLICY,
+-#define XFRM_MSG_FLUSHPOLICY XFRM_MSG_FLUSHPOLICY
+-
+-	XFRM_MSG_NEWAE,
+-#define XFRM_MSG_NEWAE XFRM_MSG_NEWAE
+-	XFRM_MSG_GETAE,
+-#define XFRM_MSG_GETAE XFRM_MSG_GETAE
+-
+-	XFRM_MSG_REPORT,
+-#define XFRM_MSG_REPORT XFRM_MSG_REPORT
+-
+-	XFRM_MSG_MIGRATE,
+-#define XFRM_MSG_MIGRATE XFRM_MSG_MIGRATE
+-
+-	XFRM_MSG_NEWSADINFO,
+-#define XFRM_MSG_NEWSADINFO XFRM_MSG_NEWSADINFO
+-	XFRM_MSG_GETSADINFO,
+-#define XFRM_MSG_GETSADINFO XFRM_MSG_GETSADINFO
+-
+-	XFRM_MSG_NEWSPDINFO,
+-#define XFRM_MSG_NEWSPDINFO XFRM_MSG_NEWSPDINFO
+-	XFRM_MSG_GETSPDINFO,
+-#define XFRM_MSG_GETSPDINFO XFRM_MSG_GETSPDINFO
+-
+-	XFRM_MSG_MAPPING,
+-#define XFRM_MSG_MAPPING XFRM_MSG_MAPPING
+-	__XFRM_MSG_MAX
+-};
+-#define XFRM_MSG_MAX (__XFRM_MSG_MAX - 1)
+-
+-#define XFRM_NR_MSGTYPES (XFRM_MSG_MAX + 1 - XFRM_MSG_BASE)
+-
+-/*
+- * Generic LSM security context for comunicating to user space
+- * NOTE: Same format as sadb_x_sec_ctx
+- */
+-struct xfrm_user_sec_ctx {
+-	__u16			len;
+-	__u16			exttype;
+-	__u8			ctx_alg;  /* LSMs: e.g., selinux == 1 */
+-	__u8			ctx_doi;
+-	__u16			ctx_len;
+-};
+-
+-struct xfrm_user_tmpl {
+-	struct xfrm_id		id;
+-	__u16			family;
+-	xfrm_address_t		saddr;
+-	__u32			reqid;
+-	__u8			mode;
+-	__u8			share;
+-	__u8			optional;
+-	__u32			aalgos;
+-	__u32			ealgos;
+-	__u32			calgos;
+-};
+-
+-struct xfrm_encap_tmpl {
+-	__u16		encap_type;
+-	__be16		encap_sport;
+-	__be16		encap_dport;
+-	xfrm_address_t	encap_oa;
+-};
+-
+-/* AEVENT flags  */
+-enum xfrm_ae_ftype_t {
+-	XFRM_AE_UNSPEC,
+-	XFRM_AE_RTHR=1,	/* replay threshold*/
+-	XFRM_AE_RVAL=2, /* replay value */
+-	XFRM_AE_LVAL=4, /* lifetime value */
+-	XFRM_AE_ETHR=8, /* expiry timer threshold */
+-	XFRM_AE_CR=16, /* Event cause is replay update */
+-	XFRM_AE_CE=32, /* Event cause is timer expiry */
+-	XFRM_AE_CU=64, /* Event cause is policy update */
+-	__XFRM_AE_MAX
+-
+-#define XFRM_AE_MAX (__XFRM_AE_MAX - 1)
+-};
+-
+-struct xfrm_userpolicy_type {
+-	__u8		type;
+-	__u16		reserved1;
+-	__u8		reserved2;
+-};
+-
+-/* Netlink message attributes.  */
+-enum xfrm_attr_type_t {
+-	XFRMA_UNSPEC,
+-	XFRMA_ALG_AUTH,		/* struct xfrm_algo */
+-	XFRMA_ALG_CRYPT,	/* struct xfrm_algo */
+-	XFRMA_ALG_COMP,		/* struct xfrm_algo */
+-	XFRMA_ENCAP,		/* struct xfrm_algo + struct xfrm_encap_tmpl */
+-	XFRMA_TMPL,		/* 1 or more struct xfrm_user_tmpl */
+-	XFRMA_SA,		/* struct xfrm_usersa_info  */
+-	XFRMA_POLICY,		/*struct xfrm_userpolicy_info */
+-	XFRMA_SEC_CTX,		/* struct xfrm_sec_ctx */
+-	XFRMA_LTIME_VAL,
+-	XFRMA_REPLAY_VAL,
+-	XFRMA_REPLAY_THRESH,
+-	XFRMA_ETIMER_THRESH,
+-	XFRMA_SRCADDR,		/* xfrm_address_t */
+-	XFRMA_COADDR,		/* xfrm_address_t */
+-	XFRMA_LASTUSED,		/* unsigned long  */
+-	XFRMA_POLICY_TYPE,	/* struct xfrm_userpolicy_type */
+-	XFRMA_MIGRATE,
+-	XFRMA_ALG_AEAD,		/* struct xfrm_algo_aead */
+-	XFRMA_KMADDRESS,        /* struct xfrm_user_kmaddress */
+-	XFRMA_ALG_AUTH_TRUNC,	/* struct xfrm_algo_auth */
+-	XFRMA_MARK,		/* struct xfrm_mark */
+-	XFRMA_TFCPAD,		/* __u32 */
+-	XFRMA_REPLAY_ESN_VAL,	/* struct xfrm_replay_state_esn */
+-	XFRMA_SA_EXTRA_FLAGS,	/* __u32 */
+-	XFRMA_PROTO,		/* __u8 */
+-	XFRMA_ADDRESS_FILTER,	/* struct xfrm_address_filter */
+-	XFRMA_PAD,
+-	XFRMA_OFFLOAD_DEV,	/* struct xfrm_state_offload */
+-	XFRMA_OUTPUT_MARK,	/* __u32 */
+-	__XFRMA_MAX
+-
+-#define XFRMA_MAX (__XFRMA_MAX - 1)
+-};
+-
+-struct xfrm_mark {
+-	__u32           v; /* value */
+-	__u32           m; /* mask */
+-};
+-
+-enum xfrm_sadattr_type_t {
+-	XFRMA_SAD_UNSPEC,
+-	XFRMA_SAD_CNT,
+-	XFRMA_SAD_HINFO,
+-	__XFRMA_SAD_MAX
+-
+-#define XFRMA_SAD_MAX (__XFRMA_SAD_MAX - 1)
+-};
+-
+-struct xfrmu_sadhinfo {
+-	__u32 sadhcnt; /* current hash bkts */
+-	__u32 sadhmcnt; /* max allowed hash bkts */
+-};
+-
+-enum xfrm_spdattr_type_t {
+-	XFRMA_SPD_UNSPEC,
+-	XFRMA_SPD_INFO,
+-	XFRMA_SPD_HINFO,
+-	XFRMA_SPD_IPV4_HTHRESH,
+-	XFRMA_SPD_IPV6_HTHRESH,
+-	__XFRMA_SPD_MAX
+-
+-#define XFRMA_SPD_MAX (__XFRMA_SPD_MAX - 1)
+-};
+-
+-struct xfrmu_spdinfo {
+-	__u32 incnt;
+-	__u32 outcnt;
+-	__u32 fwdcnt;
+-	__u32 inscnt;
+-	__u32 outscnt;
+-	__u32 fwdscnt;
+-};
+-
+-struct xfrmu_spdhinfo {
+-	__u32 spdhcnt;
+-	__u32 spdhmcnt;
+-};
+-
+-struct xfrmu_spdhthresh {
+-	__u8 lbits;
+-	__u8 rbits;
+-};
+-
+-struct xfrm_usersa_info {
+-	struct xfrm_selector		sel;
+-	struct xfrm_id			id;
+-	xfrm_address_t			saddr;
+-	struct xfrm_lifetime_cfg	lft;
+-	struct xfrm_lifetime_cur	curlft;
+-	struct xfrm_stats		stats;
+-	__u32				seq;
+-	__u32				reqid;
+-	__u16				family;
+-	__u8				mode;		/* XFRM_MODE_xxx */
+-	__u8				replay_window;
+-	__u8				flags;
+-#define XFRM_STATE_NOECN	1
+-#define XFRM_STATE_DECAP_DSCP	2
+-#define XFRM_STATE_NOPMTUDISC	4
+-#define XFRM_STATE_WILDRECV	8
+-#define XFRM_STATE_ICMP		16
+-#define XFRM_STATE_AF_UNSPEC	32
+-#define XFRM_STATE_ALIGN4	64
+-#define XFRM_STATE_ESN		128
+-};
+-
+-#define XFRM_SA_XFLAG_DONT_ENCAP_DSCP	1
+-
+-struct xfrm_usersa_id {
+-	xfrm_address_t			daddr;
+-	__be32				spi;
+-	__u16				family;
+-	__u8				proto;
+-};
+-
+-struct xfrm_aevent_id {
+-	struct xfrm_usersa_id		sa_id;
+-	xfrm_address_t			saddr;
+-	__u32				flags;
+-	__u32				reqid;
+-};
+-
+-struct xfrm_userspi_info {
+-	struct xfrm_usersa_info		info;
+-	__u32				min;
+-	__u32				max;
+-};
+-
+-struct xfrm_userpolicy_info {
+-	struct xfrm_selector		sel;
+-	struct xfrm_lifetime_cfg	lft;
+-	struct xfrm_lifetime_cur	curlft;
+-	__u32				priority;
+-	__u32				index;
+-	__u8				dir;
+-	__u8				action;
+-#define XFRM_POLICY_ALLOW	0
+-#define XFRM_POLICY_BLOCK	1
+-	__u8				flags;
+-#define XFRM_POLICY_LOCALOK	1	/* Allow user to override global policy */
+-	/* Automatically expand selector to include matching ICMP payloads. */
+-#define XFRM_POLICY_ICMP	2
+-	__u8				share;
+-};
+-
+-struct xfrm_userpolicy_id {
+-	struct xfrm_selector		sel;
+-	__u32				index;
+-	__u8				dir;
+-};
+-
+-struct xfrm_user_acquire {
+-	struct xfrm_id			id;
+-	xfrm_address_t			saddr;
+-	struct xfrm_selector		sel;
+-	struct xfrm_userpolicy_info	policy;
+-	__u32				aalgos;
+-	__u32				ealgos;
+-	__u32				calgos;
+-	__u32				seq;
+-};
+-
+-struct xfrm_user_expire {
+-	struct xfrm_usersa_info		state;
+-	__u8				hard;
+-};
+-
+-struct xfrm_user_polexpire {
+-	struct xfrm_userpolicy_info	pol;
+-	__u8				hard;
+-};
+-
+-struct xfrm_usersa_flush {
+-	__u8				proto;
+-};
+-
+-struct xfrm_user_report {
+-	__u8				proto;
+-	struct xfrm_selector		sel;
+-};
+-
+-/* Used by MIGRATE to pass addresses IKE should use to perform
+- * SA negotiation with the peer */
+-struct xfrm_user_kmaddress {
+-	xfrm_address_t                  local;
+-	xfrm_address_t                  remote;
+-	__u32				reserved;
+-	__u16				family;
+-};
+-
+-struct xfrm_user_migrate {
+-	xfrm_address_t			old_daddr;
+-	xfrm_address_t			old_saddr;
+-	xfrm_address_t			new_daddr;
+-	xfrm_address_t			new_saddr;
+-	__u8				proto;
+-	__u8				mode;
+-	__u16				reserved;
+-	__u32				reqid;
+-	__u16				old_family;
+-	__u16				new_family;
+-};
+-
+-struct xfrm_user_mapping {
+-	struct xfrm_usersa_id		id;
+-	__u32				reqid;
+-	xfrm_address_t			old_saddr;
+-	xfrm_address_t			new_saddr;
+-	__be16				old_sport;
+-	__be16				new_sport;
+-};
+-
+-struct xfrm_address_filter {
+-	xfrm_address_t			saddr;
+-	xfrm_address_t			daddr;
+-	__u16				family;
+-	__u8				splen;
+-	__u8				dplen;
+-};
+-
+-struct xfrm_user_offload {
+-	int				ifindex;
+-	__u8				flags;
+-};
+-#define XFRM_OFFLOAD_IPV6	1
+-#define XFRM_OFFLOAD_INBOUND	2
+-
+-/* backwards compatibility for userspace */
+-#define XFRMGRP_ACQUIRE		1
+-#define XFRMGRP_EXPIRE		2
+-#define XFRMGRP_SA		4
+-#define XFRMGRP_POLICY		8
+-#define XFRMGRP_REPORT		0x20
+-
+-enum xfrm_nlgroups {
+-	XFRMNLGRP_NONE,
+-#define XFRMNLGRP_NONE		XFRMNLGRP_NONE
+-	XFRMNLGRP_ACQUIRE,
+-#define XFRMNLGRP_ACQUIRE	XFRMNLGRP_ACQUIRE
+-	XFRMNLGRP_EXPIRE,
+-#define XFRMNLGRP_EXPIRE	XFRMNLGRP_EXPIRE
+-	XFRMNLGRP_SA,
+-#define XFRMNLGRP_SA		XFRMNLGRP_SA
+-	XFRMNLGRP_POLICY,
+-#define XFRMNLGRP_POLICY	XFRMNLGRP_POLICY
+-	XFRMNLGRP_AEVENTS,
+-#define XFRMNLGRP_AEVENTS	XFRMNLGRP_AEVENTS
+-	XFRMNLGRP_REPORT,
+-#define XFRMNLGRP_REPORT	XFRMNLGRP_REPORT
+-	XFRMNLGRP_MIGRATE,
+-#define XFRMNLGRP_MIGRATE	XFRMNLGRP_MIGRATE
+-	XFRMNLGRP_MAPPING,
+-#define XFRMNLGRP_MAPPING	XFRMNLGRP_MAPPING
+-	__XFRMNLGRP_MAX
+-};
+-#define XFRMNLGRP_MAX	(__XFRMNLGRP_MAX - 1)
+-
+-#endif /* _LINUX_XFRM_H */
+diff --git a/include/uapi/linux/atm.h b/include/uapi/linux/atm.h
+new file mode 100644
+index 0000000..08e27be
+--- /dev/null
++++ b/include/uapi/linux/atm.h
+@@ -0,0 +1,241 @@
++/* atm.h - general ATM declarations */
++ 
++/* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
++ 
++
++/*
++ * WARNING: User-space programs should not #include <linux/atm.h> directly.
++ *          Instead, #include <atm.h>
++ */
++
++#ifndef _LINUX_ATM_H
++#define _LINUX_ATM_H
++
++/*
++ * BEGIN_xx and END_xx markers are used for automatic generation of
++ * documentation. Do not change them.
++ */
++
++
++#include <linux/atmapi.h>
++#include <linux/atmsap.h>
++#include <linux/atmioc.h>
++#include <linux/types.h>
++
++
++/* general ATM constants */
++#define ATM_CELL_SIZE		    53	/* ATM cell size incl. header */
++#define ATM_CELL_PAYLOAD	    48	/* ATM payload size */
++#define ATM_AAL0_SDU		    52	/* AAL0 SDU size */
++#define ATM_MAX_AAL34_PDU	 65535	/* maximum AAL3/4 PDU payload */
++#define ATM_AAL5_TRAILER	     8	/* AAL5 trailer size */
++#define ATM_MAX_AAL5_PDU	 65535	/* maximum AAL5 PDU payload */
++#define ATM_MAX_CDV		  9999	/* maximum (default) CDV */
++#define ATM_NOT_RSV_VCI		    32	/* first non-reserved VCI value */
++
++#define ATM_MAX_VPI		   255	/* maximum VPI at the UNI */
++#define ATM_MAX_VPI_NNI		  4096	/* maximum VPI at the NNI */
++#define ATM_MAX_VCI		 65535	/* maximum VCI */
++
++
++/* "protcol" values for the socket system call */
++#define ATM_NO_AAL	0		/* AAL not specified */
++#define ATM_AAL0	13		/* "raw" ATM cells */
++#define ATM_AAL1	1		/* AAL1 (CBR) */
++#define ATM_AAL2	2		/* AAL2 (VBR) */
++#define ATM_AAL34	3		/* AAL3/4 (data) */
++#define ATM_AAL5	5		/* AAL5 (data) */
++
++/*
++ * socket option name coding functions
++ *
++ * Note that __SO_ENCODE and __SO_LEVEL are somewhat a hack since the
++ * << 22 only reserves 9 bits for the level.  On some architectures
++ * SOL_SOCKET is 0xFFFF, so that's a bit of a problem
++ */
++
++#define __SO_ENCODE(l,n,t)	((((l) & 0x1FF) << 22) | ((n) << 16) | \
++				sizeof(t))
++#define __SO_LEVEL_MATCH(c,m)	(((c) >> 22) == ((m) & 0x1FF))
++#define __SO_NUMBER(c)		(((c) >> 16) & 0x3f)
++#define __SO_SIZE(c)		((c) & 0x3fff)
++
++/*
++ * ATM layer
++ */
++
++#define SO_SETCLP	__SO_ENCODE(SOL_ATM,0,int)
++			    /* set CLP bit value - TODO */
++#define SO_CIRANGE	__SO_ENCODE(SOL_ATM,1,struct atm_cirange)
++			    /* connection identifier range; socket must be
++			       bound or connected */
++#define SO_ATMQOS	__SO_ENCODE(SOL_ATM,2,struct atm_qos)
++			    /* Quality of Service setting */
++#define SO_ATMSAP	__SO_ENCODE(SOL_ATM,3,struct atm_sap)
++			    /* Service Access Point */
++#define SO_ATMPVC	__SO_ENCODE(SOL_ATM,4,struct sockaddr_atmpvc)
++			    /* "PVC" address (also for SVCs); get only */
++#define SO_MULTIPOINT	__SO_ENCODE(SOL_ATM, 5, int)
++			    /* make this vc a p2mp */
++
++
++/*
++ * Note @@@: since the socket layers don't really distinguish the control and
++ * the data plane but generally seems to be data plane-centric, any layer is
++ * about equally wrong for the SAP. If you have a better idea about this,
++ * please speak up ...
++ */
++
++
++/* ATM cell header (for AAL0) */
++
++/* BEGIN_CH */
++#define ATM_HDR_GFC_MASK	0xf0000000
++#define ATM_HDR_GFC_SHIFT	28
++#define ATM_HDR_VPI_MASK	0x0ff00000
++#define ATM_HDR_VPI_SHIFT	20
++#define ATM_HDR_VCI_MASK	0x000ffff0
++#define ATM_HDR_VCI_SHIFT	4
++#define ATM_HDR_PTI_MASK	0x0000000e
++#define ATM_HDR_PTI_SHIFT	1
++#define ATM_HDR_CLP		0x00000001
++/* END_CH */
++
++
++/* PTI codings */
++
++/* BEGIN_PTI */
++#define ATM_PTI_US0	0  /* user data cell, congestion not exp, SDU-type 0 */
++#define ATM_PTI_US1	1  /* user data cell, congestion not exp, SDU-type 1 */
++#define ATM_PTI_UCES0	2  /* user data cell, cong. experienced, SDU-type 0 */
++#define ATM_PTI_UCES1	3  /* user data cell, cong. experienced, SDU-type 1 */
++#define ATM_PTI_SEGF5	4  /* segment OAM F5 flow related cell */
++#define ATM_PTI_E2EF5	5  /* end-to-end OAM F5 flow related cell */
++#define ATM_PTI_RSV_RM	6  /* reserved for traffic control/resource mgmt */
++#define ATM_PTI_RSV	7  /* reserved */
++/* END_PTI */
++
++
++/*
++ * The following items should stay in linux/atm.h, which should be linked to
++ * netatm/atm.h
++ */
++
++/* Traffic description */
++
++#define ATM_NONE	0		/* no traffic */
++#define ATM_UBR		1
++#define ATM_CBR		2
++#define ATM_VBR		3
++#define ATM_ABR		4
++#define ATM_ANYCLASS	5		/* compatible with everything */
++
++#define ATM_MAX_PCR	-1		/* maximum available PCR */
++
++struct atm_trafprm {
++	unsigned char	traffic_class;	/* traffic class (ATM_UBR, ...) */
++	int		max_pcr;	/* maximum PCR in cells per second */
++	int		pcr;		/* desired PCR in cells per second */
++	int		min_pcr;	/* minimum PCR in cells per second */
++	int		max_cdv;	/* maximum CDV in microseconds */
++	int		max_sdu;	/* maximum SDU in bytes */
++        /* extra params for ABR */
++        unsigned int 	icr;         	/* Initial Cell Rate (24-bit) */
++        unsigned int	tbe;		/* Transient Buffer Exposure (24-bit) */ 
++        unsigned int 	frtt : 24;	/* Fixed Round Trip Time (24-bit) */
++        unsigned int 	rif  : 4;       /* Rate Increment Factor (4-bit) */
++        unsigned int 	rdf  : 4;       /* Rate Decrease Factor (4-bit) */
++        unsigned int nrm_pres  :1;      /* nrm present bit */
++        unsigned int trm_pres  :1;     	/* rm present bit */
++        unsigned int adtf_pres :1;     	/* adtf present bit */
++        unsigned int cdf_pres  :1;    	/* cdf present bit*/
++        unsigned int nrm       :3;     	/* Max # of Cells for each forward RM cell (3-bit) */
++        unsigned int trm       :3;    	/* Time between forward RM cells (3-bit) */    
++	unsigned int adtf      :10;     /* ACR Decrease Time Factor (10-bit) */
++	unsigned int cdf       :3;      /* Cutoff Decrease Factor (3-bit) */
++        unsigned int spare     :9;      /* spare bits */ 
++};
++
++struct atm_qos {
++	struct atm_trafprm txtp;	/* parameters in TX direction */
++	struct atm_trafprm rxtp __ATM_API_ALIGN;
++					/* parameters in RX direction */
++	unsigned char aal __ATM_API_ALIGN;
++};
++
++/* PVC addressing */
++
++#define ATM_ITF_ANY	-1		/* "magic" PVC address values */
++#define ATM_VPI_ANY	-1
++#define ATM_VCI_ANY	-1
++#define ATM_VPI_UNSPEC	-2
++#define ATM_VCI_UNSPEC	-2
++
++
++struct sockaddr_atmpvc {
++	unsigned short 	sap_family;	/* address family, AF_ATMPVC  */
++	struct {			/* PVC address */
++		short	itf;		/* ATM interface */
++		short	vpi;		/* VPI (only 8 bits at UNI) */
++		int	vci;		/* VCI (only 16 bits at UNI) */
++	} sap_addr __ATM_API_ALIGN;	/* PVC address */
++};
++
++/* SVC addressing */
++
++#define	ATM_ESA_LEN	20		/* ATM End System Address length */
++#define ATM_E164_LEN	12		/* maximum E.164 number length */
++
++#define ATM_AFI_DCC	0x39		/* DCC ATM Format */
++#define ATM_AFI_ICD	0x47		/* ICD ATM Format */
++#define ATM_AFI_E164	0x45		/* E.164 ATM Format */
++#define ATM_AFI_LOCAL	0x49		/* Local ATM Format */ 
++
++#define ATM_AFI_DCC_GROUP	0xBD	/* DCC ATM Group Format */
++#define ATM_AFI_ICD_GROUP	0xC5	/* ICD ATM Group Format */
++#define ATM_AFI_E164_GROUP	0xC3	/* E.164 ATM Group Format */
++#define ATM_AFI_LOCAL_GROUP	0xC7	/* Local ATM Group Format */
++
++#define ATM_LIJ_NONE	0		/* no leaf-initiated join */
++#define ATM_LIJ		1		/* request joining */
++#define ATM_LIJ_RPJ	2		/* set to root-prompted join */
++#define ATM_LIJ_NJ	3		/* set to network join */
++
++
++struct sockaddr_atmsvc {
++    unsigned short 	sas_family;	/* address family, AF_ATMSVC */
++    struct {				/* SVC address */
++        unsigned char	prv[ATM_ESA_LEN];/* private ATM address */
++        char		pub[ATM_E164_LEN+1]; /* public address (E.164) */
++    					/* unused addresses must be bzero'ed */
++	char		lij_type;	/* role in LIJ call; one of ATM_LIJ* */
++	__u32	lij_id;		/* LIJ call identifier */
++    } sas_addr __ATM_API_ALIGN;		/* SVC address */
++};
++
++
++static __inline__ int atmsvc_addr_in_use(struct sockaddr_atmsvc addr)
++{
++	return *addr.sas_addr.prv || *addr.sas_addr.pub;
++}
++
++
++static __inline__ int atmpvc_addr_in_use(struct sockaddr_atmpvc addr)
++{
++	return addr.sap_addr.itf || addr.sap_addr.vpi || addr.sap_addr.vci;
++}
++
++
++/*
++ * Some stuff for linux/sockios.h
++ */
++
++struct atmif_sioc {
++	int number;
++	int length;
++	void *arg;
++};
++
++
++typedef unsigned short atm_backend_t;
++#endif /* _LINUX_ATM_H */
+diff --git a/include/uapi/linux/atmapi.h b/include/uapi/linux/atmapi.h
+new file mode 100644
+index 0000000..8fe54d9
+--- /dev/null
++++ b/include/uapi/linux/atmapi.h
+@@ -0,0 +1,29 @@
++/* atmapi.h - ATM API user space/kernel compatibility */
++ 
++/* Written 1999,2000 by Werner Almesberger, EPFL ICA */
++ 
++
++#ifndef _LINUX_ATMAPI_H
++#define _LINUX_ATMAPI_H
++
++#if defined(__sparc__) || defined(__ia64__)
++/* such alignment is not required on 32 bit sparcs, but we can't
++   figure that we are on a sparc64 while compiling user-space programs. */
++#define __ATM_API_ALIGN	__attribute__((aligned(8)))
++#else
++#define __ATM_API_ALIGN
++#endif
++
++
++/*
++ * Opaque type for kernel pointers. Note that _ is never accessed. We need
++ * the struct in order hide the array, so that we can make simple assignments
++ * instead of being forced to use memcpy. It also improves error reporting for
++ * code that still assumes that we're passing unsigned longs.
++ *
++ * Convention: NULL pointers are passed as a field of all zeroes.
++ */
++ 
++typedef struct { unsigned char _[8]; } __ATM_API_ALIGN atm_kptr_t;
++
++#endif
+diff --git a/include/uapi/linux/atmarp.h b/include/uapi/linux/atmarp.h
+new file mode 100644
+index 0000000..231f4bd
+--- /dev/null
++++ b/include/uapi/linux/atmarp.h
+@@ -0,0 +1,41 @@
++/* atmarp.h - ATM ARP protocol and kernel-demon interface definitions */
++ 
++/* Written 1995-1999 by Werner Almesberger, EPFL LRC/ICA */
++ 
++
++#ifndef _LINUX_ATMARP_H
++#define _LINUX_ATMARP_H
++
++#include <linux/types.h>
++#include <linux/atmapi.h>
++#include <linux/atmioc.h>
++
++
++#define ATMARP_RETRY_DELAY 30		/* request next resolution or forget
++					   NAK after 30 sec - should go into
++					   atmclip.h */
++#define ATMARP_MAX_UNRES_PACKETS 5	/* queue that many packets while
++					   waiting for the resolver */
++
++
++#define ATMARPD_CTRL	_IO('a',ATMIOC_CLIP+1)	/* become atmarpd ctrl sock */
++#define ATMARP_MKIP	_IO('a',ATMIOC_CLIP+2)	/* attach socket to IP */
++#define ATMARP_SETENTRY	_IO('a',ATMIOC_CLIP+3)	/* fill or hide ARP entry */
++#define ATMARP_ENCAP	_IO('a',ATMIOC_CLIP+5)	/* change encapsulation */
++
++
++enum atmarp_ctrl_type {
++	act_invalid,		/* catch uninitialized structures */
++	act_need,		/* need address resolution */
++	act_up,			/* interface is coming up */
++	act_down,		/* interface is going down */
++	act_change		/* interface configuration has changed */
++};
++
++struct atmarp_ctrl {
++	enum atmarp_ctrl_type	type;	/* message type */
++	int			itf_num;/* interface number (if present) */
++	__be32			ip;	/* IP address (act_need only) */
++};
++
++#endif
+diff --git a/include/uapi/linux/atmdev.h b/include/uapi/linux/atmdev.h
+new file mode 100644
+index 0000000..8faa8b9
+--- /dev/null
++++ b/include/uapi/linux/atmdev.h
+@@ -0,0 +1,215 @@
++/* atmdev.h - ATM device driver declarations and various related items */
++ 
++/* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
++ 
++
++#ifndef LINUX_ATMDEV_H
++#define LINUX_ATMDEV_H
++
++
++#include <linux/atmapi.h>
++#include <linux/atm.h>
++#include <linux/atmioc.h>
++
++
++#define ESI_LEN		6
++
++#define ATM_OC3_PCR	(155520000/270*260/8/53)
++			/* OC3 link rate:  155520000 bps
++			   SONET overhead: /270*260 (9 section, 1 path)
++			   bits per cell:  /8/53
++			   max cell rate:  353207.547 cells/sec */
++#define ATM_25_PCR	((25600000/8-8000)/54)
++			/* 25 Mbps ATM cell rate (59111) */
++#define ATM_OC12_PCR	(622080000/1080*1040/8/53)
++			/* OC12 link rate: 622080000 bps
++			   SONET overhead: /1080*1040
++			   bits per cell:  /8/53
++			   max cell rate:  1412830.188 cells/sec */
++#define ATM_DS3_PCR	(8000*12)
++			/* DS3: 12 cells in a 125 usec time slot */
++
++
++#define __AAL_STAT_ITEMS \
++    __HANDLE_ITEM(tx);			/* TX okay */ \
++    __HANDLE_ITEM(tx_err);		/* TX errors */ \
++    __HANDLE_ITEM(rx);			/* RX okay */ \
++    __HANDLE_ITEM(rx_err);		/* RX errors */ \
++    __HANDLE_ITEM(rx_drop);		/* RX out of memory */
++
++struct atm_aal_stats {
++#define __HANDLE_ITEM(i) int i
++	__AAL_STAT_ITEMS
++#undef __HANDLE_ITEM
++};
++
++
++struct atm_dev_stats {
++	struct atm_aal_stats aal0;
++	struct atm_aal_stats aal34;
++	struct atm_aal_stats aal5;
++} __ATM_API_ALIGN;
++
++
++#define ATM_GETLINKRATE	_IOW('a',ATMIOC_ITF+1,struct atmif_sioc)
++					/* get link rate */
++#define ATM_GETNAMES	_IOW('a',ATMIOC_ITF+3,struct atm_iobuf)
++					/* get interface names (numbers) */
++#define ATM_GETTYPE	_IOW('a',ATMIOC_ITF+4,struct atmif_sioc)
++					/* get interface type name */
++#define ATM_GETESI	_IOW('a',ATMIOC_ITF+5,struct atmif_sioc)
++					/* get interface ESI */
++#define ATM_GETADDR	_IOW('a',ATMIOC_ITF+6,struct atmif_sioc)
++					/* get itf's local ATM addr. list */
++#define ATM_RSTADDR	_IOW('a',ATMIOC_ITF+7,struct atmif_sioc)
++					/* reset itf's ATM address list */
++#define ATM_ADDADDR	_IOW('a',ATMIOC_ITF+8,struct atmif_sioc)
++					/* add a local ATM address */
++#define ATM_DELADDR	_IOW('a',ATMIOC_ITF+9,struct atmif_sioc)
++					/* remove a local ATM address */
++#define ATM_GETCIRANGE	_IOW('a',ATMIOC_ITF+10,struct atmif_sioc)
++					/* get connection identifier range */
++#define ATM_SETCIRANGE	_IOW('a',ATMIOC_ITF+11,struct atmif_sioc)
++					/* set connection identifier range */
++#define ATM_SETESI	_IOW('a',ATMIOC_ITF+12,struct atmif_sioc)
++					/* set interface ESI */
++#define ATM_SETESIF	_IOW('a',ATMIOC_ITF+13,struct atmif_sioc)
++					/* force interface ESI */
++#define ATM_ADDLECSADDR	_IOW('a', ATMIOC_ITF+14, struct atmif_sioc)
++					/* register a LECS address */
++#define ATM_DELLECSADDR	_IOW('a', ATMIOC_ITF+15, struct atmif_sioc)
++					/* unregister a LECS address */
++#define ATM_GETLECSADDR	_IOW('a', ATMIOC_ITF+16, struct atmif_sioc)
++					/* retrieve LECS address(es) */
++
++#define ATM_GETSTAT	_IOW('a',ATMIOC_SARCOM+0,struct atmif_sioc)
++					/* get AAL layer statistics */
++#define ATM_GETSTATZ	_IOW('a',ATMIOC_SARCOM+1,struct atmif_sioc)
++					/* get AAL layer statistics and zero */
++#define ATM_GETLOOP	_IOW('a',ATMIOC_SARCOM+2,struct atmif_sioc)
++					/* get loopback mode */
++#define ATM_SETLOOP	_IOW('a',ATMIOC_SARCOM+3,struct atmif_sioc)
++					/* set loopback mode */
++#define ATM_QUERYLOOP	_IOW('a',ATMIOC_SARCOM+4,struct atmif_sioc)
++					/* query supported loopback modes */
++#define ATM_SETSC	_IOW('a',ATMIOC_SPECIAL+1,int)
++					/* enable or disable single-copy */
++#define ATM_SETBACKEND	_IOW('a',ATMIOC_SPECIAL+2,atm_backend_t)
++					/* set backend handler */
++#define ATM_NEWBACKENDIF _IOW('a',ATMIOC_SPECIAL+3,atm_backend_t)
++					/* use backend to make new if */
++#define ATM_ADDPARTY  	_IOW('a', ATMIOC_SPECIAL+4,struct atm_iobuf)
++ 					/* add party to p2mp call */
++#ifdef CONFIG_COMPAT
++/* It actually takes struct sockaddr_atmsvc, not struct atm_iobuf */
++#define COMPAT_ATM_ADDPARTY  	_IOW('a', ATMIOC_SPECIAL+4,struct compat_atm_iobuf)
++#endif
++#define ATM_DROPPARTY 	_IOW('a', ATMIOC_SPECIAL+5,int)
++					/* drop party from p2mp call */
++
++/*
++ * These are backend handkers that can be set via the ATM_SETBACKEND call
++ * above.  In the future we may support dynamic loading of these - for now,
++ * they're just being used to share the ATMIOC_BACKEND ioctls
++ */
++#define ATM_BACKEND_RAW		0	
++#define ATM_BACKEND_PPP		1	/* PPPoATM - RFC2364 */
++#define ATM_BACKEND_BR2684	2	/* Bridged RFC1483/2684 */
++
++/* for ATM_GETTYPE */
++#define ATM_ITFTYP_LEN	8	/* maximum length of interface type name */
++
++/*
++ * Loopback modes for ATM_{PHY,SAR}_{GET,SET}LOOP
++ */
++
++/* Point of loopback				CPU-->SAR-->PHY-->line--> ... */
++#define __ATM_LM_NONE	0	/* no loop back     ^     ^     ^      ^      */
++#define __ATM_LM_AAL	1	/* loop back PDUs --'     |     |      |      */
++#define __ATM_LM_ATM	2	/* loop back ATM cells ---'     |      |      */
++/* RESERVED		4	loop back on PHY side  ---'		      */
++#define __ATM_LM_PHY	8	/* loop back bits (digital) ----'      |      */
++#define __ATM_LM_ANALOG 16	/* loop back the analog signal --------'      */
++
++/* Direction of loopback */
++#define __ATM_LM_MKLOC(n)	((n))	    /* Local (i.e. loop TX to RX) */
++#define __ATM_LM_MKRMT(n)	((n) << 8)  /* Remote (i.e. loop RX to TX) */
++
++#define __ATM_LM_XTLOC(n)	((n) & 0xff)
++#define __ATM_LM_XTRMT(n)	(((n) >> 8) & 0xff)
++
++#define ATM_LM_NONE	0	/* no loopback */
++
++#define ATM_LM_LOC_AAL	__ATM_LM_MKLOC(__ATM_LM_AAL)
++#define ATM_LM_LOC_ATM	__ATM_LM_MKLOC(__ATM_LM_ATM)
++#define ATM_LM_LOC_PHY	__ATM_LM_MKLOC(__ATM_LM_PHY)
++#define ATM_LM_LOC_ANALOG __ATM_LM_MKLOC(__ATM_LM_ANALOG)
++
++#define ATM_LM_RMT_AAL	__ATM_LM_MKRMT(__ATM_LM_AAL)
++#define ATM_LM_RMT_ATM	__ATM_LM_MKRMT(__ATM_LM_ATM)
++#define ATM_LM_RMT_PHY	__ATM_LM_MKRMT(__ATM_LM_PHY)
++#define ATM_LM_RMT_ANALOG __ATM_LM_MKRMT(__ATM_LM_ANALOG)
++
++/*
++ * Note: ATM_LM_LOC_* and ATM_LM_RMT_* can be combined, provided that
++ * __ATM_LM_XTLOC(x) <= __ATM_LM_XTRMT(x)
++ */
++
++
++struct atm_iobuf {
++	int length;
++	void *buffer;
++};
++
++/* for ATM_GETCIRANGE / ATM_SETCIRANGE */
++
++#define ATM_CI_MAX      -1              /* use maximum range of VPI/VCI */
++ 
++struct atm_cirange {
++	signed char	vpi_bits;	/* 1..8, ATM_CI_MAX (-1) for maximum */
++	signed char	vci_bits;	/* 1..16, ATM_CI_MAX (-1) for maximum */
++};
++
++/* for ATM_SETSC; actually taken from the ATM_VF number space */
++
++#define ATM_SC_RX	1024		/* enable RX single-copy */
++#define ATM_SC_TX	2048		/* enable TX single-copy */
++
++#define ATM_BACKLOG_DEFAULT 32 /* if we get more, we're likely to time out
++				  anyway */
++
++/* MF: change_qos (Modify) flags */
++
++#define ATM_MF_IMMED	 1	/* Block until change is effective */
++#define ATM_MF_INC_RSV	 2	/* Change reservation on increase */
++#define ATM_MF_INC_SHP	 4	/* Change shaping on increase */
++#define ATM_MF_DEC_RSV	 8	/* Change reservation on decrease */
++#define ATM_MF_DEC_SHP	16	/* Change shaping on decrease */
++#define ATM_MF_BWD	32	/* Set the backward direction parameters */
++
++#define ATM_MF_SET	(ATM_MF_INC_RSV | ATM_MF_INC_SHP | ATM_MF_DEC_RSV | \
++			  ATM_MF_DEC_SHP | ATM_MF_BWD)
++
++/*
++ * ATM_VS_* are used to express VC state in a human-friendly way.
++ */
++
++#define ATM_VS_IDLE	0	/* VC is not used */
++#define ATM_VS_CONNECTED 1	/* VC is connected */
++#define ATM_VS_CLOSING	2	/* VC is closing */
++#define ATM_VS_LISTEN	3	/* VC is listening for incoming setups */
++#define ATM_VS_INUSE	4	/* VC is in use (registered with atmsigd) */
++#define ATM_VS_BOUND	5	/* VC is bound */
++
++#define ATM_VS2TXT_MAP \
++    "IDLE", "CONNECTED", "CLOSING", "LISTEN", "INUSE", "BOUND"
++
++#define ATM_VF2TXT_MAP \
++    "ADDR",	"READY",	"PARTIAL",	"REGIS", \
++    "RELEASED", "HASQOS",	"LISTEN",	"META", \
++    "256",	"512",		"1024",		"2048", \
++    "SESSION",	"HASSAP",	"BOUND",	"CLOSE"
++
++
++
++#endif /* LINUX_ATMDEV_H */
+diff --git a/include/uapi/linux/atmioc.h b/include/uapi/linux/atmioc.h
+new file mode 100644
+index 0000000..37f67aa
+--- /dev/null
++++ b/include/uapi/linux/atmioc.h
+@@ -0,0 +1,41 @@
++/* atmioc.h - ranges for ATM-related ioctl numbers */
++ 
++/* Written 1995-1999 by Werner Almesberger, EPFL LRC/ICA */
++
++
++/*
++ * See http://icawww1.epfl.ch/linux-atm/magic.html for the complete list of
++ * "magic" ioctl numbers.
++ */
++
++
++#ifndef _LINUX_ATMIOC_H
++#define _LINUX_ATMIOC_H
++
++#include <asm/ioctl.h>
++		/* everybody including atmioc.h will also need _IO{,R,W,WR} */
++
++#define ATMIOC_PHYCOM	  0x00 /* PHY device common ioctls, globally unique */
++#define ATMIOC_PHYCOM_END 0x0f
++#define ATMIOC_PHYTYP	  0x10 /* PHY dev type ioctls, unique per PHY type */
++#define ATMIOC_PHYTYP_END 0x2f
++#define ATMIOC_PHYPRV	  0x30 /* PHY dev private ioctls, unique per driver */
++#define ATMIOC_PHYPRV_END 0x4f
++#define ATMIOC_SARCOM	  0x50 /* SAR device common ioctls, globally unique */
++#define ATMIOC_SARCOM_END 0x50
++#define ATMIOC_SARPRV	  0x60 /* SAR dev private ioctls, unique per driver */
++#define ATMIOC_SARPRV_END 0x7f
++#define ATMIOC_ITF	  0x80 /* Interface ioctls, globally unique */
++#define ATMIOC_ITF_END	  0x8f
++#define ATMIOC_BACKEND	  0x90 /* ATM generic backend ioctls, u. per backend */
++#define ATMIOC_BACKEND_END 0xaf
++/* 0xb0-0xbf: Reserved for future use */
++#define ATMIOC_AREQUIPA	  0xc0 /* Application requested IP over ATM, glob. u. */
++#define ATMIOC_LANE	  0xd0 /* LAN Emulation, globally unique */
++#define ATMIOC_MPOA       0xd8 /* MPOA, globally unique */
++#define	ATMIOC_CLIP	  0xe0 /* Classical IP over ATM control, globally u. */
++#define	ATMIOC_CLIP_END	  0xef
++#define	ATMIOC_SPECIAL	  0xf0 /* Special-purpose controls, globally unique */
++#define	ATMIOC_SPECIAL_END 0xff
++
++#endif
+diff --git a/include/uapi/linux/atmsap.h b/include/uapi/linux/atmsap.h
+new file mode 100644
+index 0000000..799b104
+--- /dev/null
++++ b/include/uapi/linux/atmsap.h
+@@ -0,0 +1,162 @@
++/* atmsap.h - ATM Service Access Point addressing definitions */
++
++/* Written 1995-1999 by Werner Almesberger, EPFL LRC/ICA */
++
++
++#ifndef _LINUX_ATMSAP_H
++#define _LINUX_ATMSAP_H
++
++#include <linux/atmapi.h>
++
++/*
++ * BEGIN_xx and END_xx markers are used for automatic generation of
++ * documentation. Do not change them.
++ */
++
++
++/*
++ * Layer 2 protocol identifiers
++ */
++
++/* BEGIN_L2 */
++#define ATM_L2_NONE	0	/* L2 not specified */
++#define ATM_L2_ISO1745  0x01	/* Basic mode ISO 1745 */
++#define ATM_L2_Q291	0x02	/* ITU-T Q.291 (Rec. I.441) */
++#define ATM_L2_X25_LL	0x06	/* ITU-T X.25, link layer */
++#define ATM_L2_X25_ML	0x07	/* ITU-T X.25, multilink */
++#define ATM_L2_LAPB	0x08	/* Extended LAPB, half-duplex (Rec. T.71) */
++#define ATM_L2_HDLC_ARM	0x09	/* HDLC ARM (ISO/IEC 4335) */
++#define ATM_L2_HDLC_NRM	0x0a	/* HDLC NRM (ISO/IEC 4335) */
++#define ATM_L2_HDLC_ABM	0x0b	/* HDLC ABM (ISO/IEC 4335) */
++#define ATM_L2_ISO8802	0x0c	/* LAN LLC (ISO/IEC 8802/2) */
++#define ATM_L2_X75	0x0d	/* ITU-T X.75, SLP */
++#define ATM_L2_Q922	0x0e	/* ITU-T Q.922 */
++#define ATM_L2_USER	0x10	/* user-specified */
++#define ATM_L2_ISO7776	0x11	/* ISO 7776 DTE-DTE */
++/* END_L2 */
++
++
++/*
++ * Layer 3 protocol identifiers
++ */
++
++/* BEGIN_L3 */
++#define ATM_L3_NONE	0	/* L3 not specified */
++#define ATM_L3_X25	0x06	/* ITU-T X.25, packet layer */
++#define ATM_L3_ISO8208	0x07	/* ISO/IEC 8208 */
++#define ATM_L3_X223	0x08	/* ITU-T X.223 | ISO/IEC 8878 */
++#define ATM_L3_ISO8473	0x09	/* ITU-T X.233 | ISO/IEC 8473 */
++#define ATM_L3_T70	0x0a	/* ITU-T T.70 minimum network layer */
++#define ATM_L3_TR9577	0x0b	/* ISO/IEC TR 9577 */
++#define ATM_L3_H310	0x0c	/* ITU-T Recommendation H.310 */
++#define ATM_L3_H321	0x0d	/* ITU-T Recommendation H.321 */
++#define ATM_L3_USER	0x10	/* user-specified */
++/* END_L3 */
++
++
++/*
++ * High layer identifiers
++ */
++
++/* BEGIN_HL */
++#define ATM_HL_NONE	0	/* HL not specified */
++#define ATM_HL_ISO	0x01	/* ISO */
++#define ATM_HL_USER	0x02	/* user-specific */
++#define ATM_HL_HLP	0x03	/* high layer profile - UNI 3.0 only */
++#define ATM_HL_VENDOR	0x04	/* vendor-specific application identifier */
++/* END_HL */
++
++
++/*
++ * ITU-T coded mode of operation
++ */
++
++/* BEGIN_IMD */
++#define ATM_IMD_NONE	 0	/* mode not specified */
++#define ATM_IMD_NORMAL	 1	/* normal mode of operation */
++#define ATM_IMD_EXTENDED 2	/* extended mode of operation */
++/* END_IMD */
++
++/*
++ * H.310 code points
++ */
++
++#define ATM_TT_NONE	0	/* terminal type not specified */
++#define ATM_TT_RX	1	/* receive only */
++#define ATM_TT_TX	2	/* send only */
++#define ATM_TT_RXTX	3	/* receive and send */
++
++#define ATM_MC_NONE	0	/* no multiplexing */
++#define ATM_MC_TS	1	/* transport stream (TS) */
++#define ATM_MC_TS_FEC	2	/* transport stream with forward error corr. */
++#define ATM_MC_PS	3	/* program stream (PS) */
++#define ATM_MC_PS_FEC	4	/* program stream with forward error corr. */
++#define ATM_MC_H221	5	/* ITU-T Rec. H.221 */
++
++/*
++ * SAP structures
++ */
++
++#define ATM_MAX_HLI	8	/* maximum high-layer information length */
++
++
++struct atm_blli {
++    unsigned char l2_proto;	/* layer 2 protocol */
++    union {
++	struct {
++	    unsigned char mode;	/* mode of operation (ATM_IMD_xxx), 0 if */
++				/* absent */
++	    unsigned char window; /* window size (k), 1-127 (0 to omit) */
++	} itu;			/* ITU-T encoding */
++	unsigned char user;	/* user-specified l2 information */
++    } l2;
++    unsigned char l3_proto;	/* layer 3 protocol */
++    union {
++	struct {
++	    unsigned char mode;	/* mode of operation (ATM_IMD_xxx), 0 if */
++				/* absent */
++	    unsigned char def_size; /* default packet size (log2), 4-12 (0 to */
++				    /* omit) */
++	    unsigned char window;/* packet window size, 1-127 (0 to omit) */
++	} itu;			/* ITU-T encoding */
++	unsigned char user;	/* user specified l3 information */
++	struct {		      /* if l3_proto = ATM_L3_H310 */
++	    unsigned char term_type;  /* terminal type */
++	    unsigned char fw_mpx_cap; /* forward multiplexing capability */
++				      /* only if term_type != ATM_TT_NONE */
++	    unsigned char bw_mpx_cap; /* backward multiplexing capability */
++				      /* only if term_type != ATM_TT_NONE */
++	} h310;
++	struct {		  /* if l3_proto = ATM_L3_TR9577 */
++	    unsigned char ipi;	  /* initial protocol id */
++	    unsigned char snap[5];/* IEEE 802.1 SNAP identifier */
++				  /* (only if ipi == NLPID_IEEE802_1_SNAP) */
++	} tr9577;
++    } l3;
++} __ATM_API_ALIGN;
++
++
++struct atm_bhli {
++    unsigned char hl_type;	/* high layer information type */
++    unsigned char hl_length;	/* length (only if hl_type == ATM_HL_USER || */
++				/* hl_type == ATM_HL_ISO) */
++    unsigned char hl_info[ATM_MAX_HLI];/* high layer information */
++};
++
++
++#define ATM_MAX_BLLI	3		/* maximum number of BLLI elements */
++
++
++struct atm_sap {
++	struct atm_bhli bhli;		/* local SAP, high-layer information */
++	struct atm_blli blli[ATM_MAX_BLLI] __ATM_API_ALIGN;
++					/* local SAP, low-layer info */
++};
++
++
++static __inline__ int blli_in_use(struct atm_blli blli)
++{
++	return blli.l2_proto || blli.l3_proto;
++}
++
++#endif
+diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
+new file mode 100644
+index 0000000..0895a52
+--- /dev/null
++++ b/include/uapi/linux/bpf.h
+@@ -0,0 +1,867 @@
++/* Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of version 2 of the GNU General Public
++ * License as published by the Free Software Foundation.
++ */
++#ifndef __LINUX_BPF_H__
++#define __LINUX_BPF_H__
++
++#include <linux/types.h>
++#include <linux/bpf_common.h>
++
++/* Extended instruction set based on top of classic BPF */
++
++/* instruction classes */
++#define BPF_ALU64	0x07	/* alu mode in double word width */
++
++/* ld/ldx fields */
++#define BPF_DW		0x18	/* double word */
++#define BPF_XADD	0xc0	/* exclusive add */
++
++/* alu/jmp fields */
++#define BPF_MOV		0xb0	/* mov reg to reg */
++#define BPF_ARSH	0xc0	/* sign extending arithmetic shift right */
++
++/* change endianness of a register */
++#define BPF_END		0xd0	/* flags for endianness conversion: */
++#define BPF_TO_LE	0x00	/* convert to little-endian */
++#define BPF_TO_BE	0x08	/* convert to big-endian */
++#define BPF_FROM_LE	BPF_TO_LE
++#define BPF_FROM_BE	BPF_TO_BE
++
++/* jmp encodings */
++#define BPF_JNE		0x50	/* jump != */
++#define BPF_JLT		0xa0	/* LT is unsigned, '<' */
++#define BPF_JLE		0xb0	/* LE is unsigned, '<=' */
++#define BPF_JSGT	0x60	/* SGT is signed '>', GT in x86 */
++#define BPF_JSGE	0x70	/* SGE is signed '>=', GE in x86 */
++#define BPF_JSLT	0xc0	/* SLT is signed, '<' */
++#define BPF_JSLE	0xd0	/* SLE is signed, '<=' */
++#define BPF_CALL	0x80	/* function call */
++#define BPF_EXIT	0x90	/* function return */
++
++/* Register numbers */
++enum {
++	BPF_REG_0 = 0,
++	BPF_REG_1,
++	BPF_REG_2,
++	BPF_REG_3,
++	BPF_REG_4,
++	BPF_REG_5,
++	BPF_REG_6,
++	BPF_REG_7,
++	BPF_REG_8,
++	BPF_REG_9,
++	BPF_REG_10,
++	__MAX_BPF_REG,
++};
++
++/* BPF has 10 general purpose 64-bit registers and stack frame. */
++#define MAX_BPF_REG	__MAX_BPF_REG
++
++struct bpf_insn {
++	__u8	code;		/* opcode */
++	__u8	dst_reg:4;	/* dest register */
++	__u8	src_reg:4;	/* source register */
++	__s16	off;		/* signed offset */
++	__s32	imm;		/* signed immediate constant */
++};
++
++/* Key of an a BPF_MAP_TYPE_LPM_TRIE entry */
++struct bpf_lpm_trie_key {
++	__u32	prefixlen;	/* up to 32 for AF_INET, 128 for AF_INET6 */
++	__u8	data[0];	/* Arbitrary size */
++};
++
++/* BPF syscall commands, see bpf(2) man-page for details. */
++enum bpf_cmd {
++	BPF_MAP_CREATE,
++	BPF_MAP_LOOKUP_ELEM,
++	BPF_MAP_UPDATE_ELEM,
++	BPF_MAP_DELETE_ELEM,
++	BPF_MAP_GET_NEXT_KEY,
++	BPF_PROG_LOAD,
++	BPF_OBJ_PIN,
++	BPF_OBJ_GET,
++	BPF_PROG_ATTACH,
++	BPF_PROG_DETACH,
++	BPF_PROG_TEST_RUN,
++	BPF_PROG_GET_NEXT_ID,
++	BPF_MAP_GET_NEXT_ID,
++	BPF_PROG_GET_FD_BY_ID,
++	BPF_MAP_GET_FD_BY_ID,
++	BPF_OBJ_GET_INFO_BY_FD,
++};
++
++enum bpf_map_type {
++	BPF_MAP_TYPE_UNSPEC,
++	BPF_MAP_TYPE_HASH,
++	BPF_MAP_TYPE_ARRAY,
++	BPF_MAP_TYPE_PROG_ARRAY,
++	BPF_MAP_TYPE_PERF_EVENT_ARRAY,
++	BPF_MAP_TYPE_PERCPU_HASH,
++	BPF_MAP_TYPE_PERCPU_ARRAY,
++	BPF_MAP_TYPE_STACK_TRACE,
++	BPF_MAP_TYPE_CGROUP_ARRAY,
++	BPF_MAP_TYPE_LRU_HASH,
++	BPF_MAP_TYPE_LRU_PERCPU_HASH,
++	BPF_MAP_TYPE_LPM_TRIE,
++	BPF_MAP_TYPE_ARRAY_OF_MAPS,
++	BPF_MAP_TYPE_HASH_OF_MAPS,
++	BPF_MAP_TYPE_DEVMAP,
++	BPF_MAP_TYPE_SOCKMAP,
++};
++
++enum bpf_prog_type {
++	BPF_PROG_TYPE_UNSPEC,
++	BPF_PROG_TYPE_SOCKET_FILTER,
++	BPF_PROG_TYPE_KPROBE,
++	BPF_PROG_TYPE_SCHED_CLS,
++	BPF_PROG_TYPE_SCHED_ACT,
++	BPF_PROG_TYPE_TRACEPOINT,
++	BPF_PROG_TYPE_XDP,
++	BPF_PROG_TYPE_PERF_EVENT,
++	BPF_PROG_TYPE_CGROUP_SKB,
++	BPF_PROG_TYPE_CGROUP_SOCK,
++	BPF_PROG_TYPE_LWT_IN,
++	BPF_PROG_TYPE_LWT_OUT,
++	BPF_PROG_TYPE_LWT_XMIT,
++	BPF_PROG_TYPE_SOCK_OPS,
++	BPF_PROG_TYPE_SK_SKB,
++};
++
++enum bpf_attach_type {
++	BPF_CGROUP_INET_INGRESS,
++	BPF_CGROUP_INET_EGRESS,
++	BPF_CGROUP_INET_SOCK_CREATE,
++	BPF_CGROUP_SOCK_OPS,
++	BPF_SK_SKB_STREAM_PARSER,
++	BPF_SK_SKB_STREAM_VERDICT,
++	__MAX_BPF_ATTACH_TYPE
++};
++
++#define MAX_BPF_ATTACH_TYPE __MAX_BPF_ATTACH_TYPE
++
++/* If BPF_F_ALLOW_OVERRIDE flag is used in BPF_PROG_ATTACH command
++ * to the given target_fd cgroup the descendent cgroup will be able to
++ * override effective bpf program that was inherited from this cgroup
++ */
++#define BPF_F_ALLOW_OVERRIDE	(1U << 0)
++
++/* If BPF_F_STRICT_ALIGNMENT is used in BPF_PROG_LOAD command, the
++ * verifier will perform strict alignment checking as if the kernel
++ * has been built with CONFIG_EFFICIENT_UNALIGNED_ACCESS not set,
++ * and NET_IP_ALIGN defined to 2.
++ */
++#define BPF_F_STRICT_ALIGNMENT	(1U << 0)
++
++#define BPF_PSEUDO_MAP_FD	1
++
++/* flags for BPF_MAP_UPDATE_ELEM command */
++#define BPF_ANY		0 /* create new element or update existing */
++#define BPF_NOEXIST	1 /* create new element if it didn't exist */
++#define BPF_EXIST	2 /* update existing element */
++
++/* flags for BPF_MAP_CREATE command */
++#define BPF_F_NO_PREALLOC	(1U << 0)
++/* Instead of having one common LRU list in the
++ * BPF_MAP_TYPE_LRU_[PERCPU_]HASH map, use a percpu LRU list
++ * which can scale and perform better.
++ * Note, the LRU nodes (including free nodes) cannot be moved
++ * across different LRU lists.
++ */
++#define BPF_F_NO_COMMON_LRU	(1U << 1)
++/* Specify numa node during map creation */
++#define BPF_F_NUMA_NODE		(1U << 2)
++
++union bpf_attr {
++	struct { /* anonymous struct used by BPF_MAP_CREATE command */
++		__u32	map_type;	/* one of enum bpf_map_type */
++		__u32	key_size;	/* size of key in bytes */
++		__u32	value_size;	/* size of value in bytes */
++		__u32	max_entries;	/* max number of entries in a map */
++		__u32	map_flags;	/* BPF_MAP_CREATE related
++					 * flags defined above.
++					 */
++		__u32	inner_map_fd;	/* fd pointing to the inner map */
++		__u32	numa_node;	/* numa node (effective only if
++					 * BPF_F_NUMA_NODE is set).
++					 */
++	};
++
++	struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */
++		__u32		map_fd;
++		__aligned_u64	key;
++		union {
++			__aligned_u64 value;
++			__aligned_u64 next_key;
++		};
++		__u64		flags;
++	};
++
++	struct { /* anonymous struct used by BPF_PROG_LOAD command */
++		__u32		prog_type;	/* one of enum bpf_prog_type */
++		__u32		insn_cnt;
++		__aligned_u64	insns;
++		__aligned_u64	license;
++		__u32		log_level;	/* verbosity level of verifier */
++		__u32		log_size;	/* size of user buffer */
++		__aligned_u64	log_buf;	/* user supplied buffer */
++		__u32		kern_version;	/* checked when prog_type=kprobe */
++		__u32		prog_flags;
++	};
++
++	struct { /* anonymous struct used by BPF_OBJ_* commands */
++		__aligned_u64	pathname;
++		__u32		bpf_fd;
++	};
++
++	struct { /* anonymous struct used by BPF_PROG_ATTACH/DETACH commands */
++		__u32		target_fd;	/* container object to attach to */
++		__u32		attach_bpf_fd;	/* eBPF program to attach */
++		__u32		attach_type;
++		__u32		attach_flags;
++	};
++
++	struct { /* anonymous struct used by BPF_PROG_TEST_RUN command */
++		__u32		prog_fd;
++		__u32		retval;
++		__u32		data_size_in;
++		__u32		data_size_out;
++		__aligned_u64	data_in;
++		__aligned_u64	data_out;
++		__u32		repeat;
++		__u32		duration;
++	} test;
++
++	struct { /* anonymous struct used by BPF_*_GET_*_ID */
++		union {
++			__u32		start_id;
++			__u32		prog_id;
++			__u32		map_id;
++		};
++		__u32		next_id;
++	};
++
++	struct { /* anonymous struct used by BPF_OBJ_GET_INFO_BY_FD */
++		__u32		bpf_fd;
++		__u32		info_len;
++		__aligned_u64	info;
++	} info;
++} __attribute__((aligned(8)));
++
++/* BPF helper function descriptions:
++ *
++ * void *bpf_map_lookup_elem(&map, &key)
++ *     Return: Map value or NULL
++ *
++ * int bpf_map_update_elem(&map, &key, &value, flags)
++ *     Return: 0 on success or negative error
++ *
++ * int bpf_map_delete_elem(&map, &key)
++ *     Return: 0 on success or negative error
++ *
++ * int bpf_probe_read(void *dst, int size, void *src)
++ *     Return: 0 on success or negative error
++ *
++ * u64 bpf_ktime_get_ns(void)
++ *     Return: current ktime
++ *
++ * int bpf_trace_printk(const char *fmt, int fmt_size, ...)
++ *     Return: length of buffer written or negative error
++ *
++ * u32 bpf_prandom_u32(void)
++ *     Return: random value
++ *
++ * u32 bpf_raw_smp_processor_id(void)
++ *     Return: SMP processor ID
++ *
++ * int bpf_skb_store_bytes(skb, offset, from, len, flags)
++ *     store bytes into packet
++ *     @skb: pointer to skb
++ *     @offset: offset within packet from skb->mac_header
++ *     @from: pointer where to copy bytes from
++ *     @len: number of bytes to store into packet
++ *     @flags: bit 0 - if true, recompute skb->csum
++ *             other bits - reserved
++ *     Return: 0 on success or negative error
++ *
++ * int bpf_l3_csum_replace(skb, offset, from, to, flags)
++ *     recompute IP checksum
++ *     @skb: pointer to skb
++ *     @offset: offset within packet where IP checksum is located
++ *     @from: old value of header field
++ *     @to: new value of header field
++ *     @flags: bits 0-3 - size of header field
++ *             other bits - reserved
++ *     Return: 0 on success or negative error
++ *
++ * int bpf_l4_csum_replace(skb, offset, from, to, flags)
++ *     recompute TCP/UDP checksum
++ *     @skb: pointer to skb
++ *     @offset: offset within packet where TCP/UDP checksum is located
++ *     @from: old value of header field
++ *     @to: new value of header field
++ *     @flags: bits 0-3 - size of header field
++ *             bit 4 - is pseudo header
++ *             other bits - reserved
++ *     Return: 0 on success or negative error
++ *
++ * int bpf_tail_call(ctx, prog_array_map, index)
++ *     jump into another BPF program
++ *     @ctx: context pointer passed to next program
++ *     @prog_array_map: pointer to map which type is BPF_MAP_TYPE_PROG_ARRAY
++ *     @index: index inside array that selects specific program to run
++ *     Return: 0 on success or negative error
++ *
++ * int bpf_clone_redirect(skb, ifindex, flags)
++ *     redirect to another netdev
++ *     @skb: pointer to skb
++ *     @ifindex: ifindex of the net device
++ *     @flags: bit 0 - if set, redirect to ingress instead of egress
++ *             other bits - reserved
++ *     Return: 0 on success or negative error
++ *
++ * u64 bpf_get_current_pid_tgid(void)
++ *     Return: current->tgid << 32 | current->pid
++ *
++ * u64 bpf_get_current_uid_gid(void)
++ *     Return: current_gid << 32 | current_uid
++ *
++ * int bpf_get_current_comm(char *buf, int size_of_buf)
++ *     stores current->comm into buf
++ *     Return: 0 on success or negative error
++ *
++ * u32 bpf_get_cgroup_classid(skb)
++ *     retrieve a proc's classid
++ *     @skb: pointer to skb
++ *     Return: classid if != 0
++ *
++ * int bpf_skb_vlan_push(skb, vlan_proto, vlan_tci)
++ *     Return: 0 on success or negative error
++ *
++ * int bpf_skb_vlan_pop(skb)
++ *     Return: 0 on success or negative error
++ *
++ * int bpf_skb_get_tunnel_key(skb, key, size, flags)
++ * int bpf_skb_set_tunnel_key(skb, key, size, flags)
++ *     retrieve or populate tunnel metadata
++ *     @skb: pointer to skb
++ *     @key: pointer to 'struct bpf_tunnel_key'
++ *     @size: size of 'struct bpf_tunnel_key'
++ *     @flags: room for future extensions
++ *     Return: 0 on success or negative error
++ *
++ * u64 bpf_perf_event_read(map, flags)
++ *     read perf event counter value
++ *     @map: pointer to perf_event_array map
++ *     @flags: index of event in the map or bitmask flags
++ *     Return: value of perf event counter read or error code
++ *
++ * int bpf_redirect(ifindex, flags)
++ *     redirect to another netdev
++ *     @ifindex: ifindex of the net device
++ *     @flags:
++ *	  cls_bpf:
++ *          bit 0 - if set, redirect to ingress instead of egress
++ *          other bits - reserved
++ *	  xdp_bpf:
++ *	    all bits - reserved
++ *     Return: cls_bpf: TC_ACT_REDIRECT on success or TC_ACT_SHOT on error
++ *	       xdp_bfp: XDP_REDIRECT on success or XDP_ABORT on error
++ * int bpf_redirect_map(map, key, flags)
++ *     redirect to endpoint in map
++ *     @map: pointer to dev map
++ *     @key: index in map to lookup
++ *     @flags: --
++ *     Return: XDP_REDIRECT on success or XDP_ABORT on error
++ *
++ * u32 bpf_get_route_realm(skb)
++ *     retrieve a dst's tclassid
++ *     @skb: pointer to skb
++ *     Return: realm if != 0
++ *
++ * int bpf_perf_event_output(ctx, map, flags, data, size)
++ *     output perf raw sample
++ *     @ctx: struct pt_regs*
++ *     @map: pointer to perf_event_array map
++ *     @flags: index of event in the map or bitmask flags
++ *     @data: data on stack to be output as raw data
++ *     @size: size of data
++ *     Return: 0 on success or negative error
++ *
++ * int bpf_get_stackid(ctx, map, flags)
++ *     walk user or kernel stack and return id
++ *     @ctx: struct pt_regs*
++ *     @map: pointer to stack_trace map
++ *     @flags: bits 0-7 - numer of stack frames to skip
++ *             bit 8 - collect user stack instead of kernel
++ *             bit 9 - compare stacks by hash only
++ *             bit 10 - if two different stacks hash into the same stackid
++ *                      discard old
++ *             other bits - reserved
++ *     Return: >= 0 stackid on success or negative error
++ *
++ * s64 bpf_csum_diff(from, from_size, to, to_size, seed)
++ *     calculate csum diff
++ *     @from: raw from buffer
++ *     @from_size: length of from buffer
++ *     @to: raw to buffer
++ *     @to_size: length of to buffer
++ *     @seed: optional seed
++ *     Return: csum result or negative error code
++ *
++ * int bpf_skb_get_tunnel_opt(skb, opt, size)
++ *     retrieve tunnel options metadata
++ *     @skb: pointer to skb
++ *     @opt: pointer to raw tunnel option data
++ *     @size: size of @opt
++ *     Return: option size
++ *
++ * int bpf_skb_set_tunnel_opt(skb, opt, size)
++ *     populate tunnel options metadata
++ *     @skb: pointer to skb
++ *     @opt: pointer to raw tunnel option data
++ *     @size: size of @opt
++ *     Return: 0 on success or negative error
++ *
++ * int bpf_skb_change_proto(skb, proto, flags)
++ *     Change protocol of the skb. Currently supported is v4 -> v6,
++ *     v6 -> v4 transitions. The helper will also resize the skb. eBPF
++ *     program is expected to fill the new headers via skb_store_bytes
++ *     and lX_csum_replace.
++ *     @skb: pointer to skb
++ *     @proto: new skb->protocol type
++ *     @flags: reserved
++ *     Return: 0 on success or negative error
++ *
++ * int bpf_skb_change_type(skb, type)
++ *     Change packet type of skb.
++ *     @skb: pointer to skb
++ *     @type: new skb->pkt_type type
++ *     Return: 0 on success or negative error
++ *
++ * int bpf_skb_under_cgroup(skb, map, index)
++ *     Check cgroup2 membership of skb
++ *     @skb: pointer to skb
++ *     @map: pointer to bpf_map in BPF_MAP_TYPE_CGROUP_ARRAY type
++ *     @index: index of the cgroup in the bpf_map
++ *     Return:
++ *       == 0 skb failed the cgroup2 descendant test
++ *       == 1 skb succeeded the cgroup2 descendant test
++ *        < 0 error
++ *
++ * u32 bpf_get_hash_recalc(skb)
++ *     Retrieve and possibly recalculate skb->hash.
++ *     @skb: pointer to skb
++ *     Return: hash
++ *
++ * u64 bpf_get_current_task(void)
++ *     Returns current task_struct
++ *     Return: current
++ *
++ * int bpf_probe_write_user(void *dst, void *src, int len)
++ *     safely attempt to write to a location
++ *     @dst: destination address in userspace
++ *     @src: source address on stack
++ *     @len: number of bytes to copy
++ *     Return: 0 on success or negative error
++ *
++ * int bpf_current_task_under_cgroup(map, index)
++ *     Check cgroup2 membership of current task
++ *     @map: pointer to bpf_map in BPF_MAP_TYPE_CGROUP_ARRAY type
++ *     @index: index of the cgroup in the bpf_map
++ *     Return:
++ *       == 0 current failed the cgroup2 descendant test
++ *       == 1 current succeeded the cgroup2 descendant test
++ *        < 0 error
++ *
++ * int bpf_skb_change_tail(skb, len, flags)
++ *     The helper will resize the skb to the given new size, to be used f.e.
++ *     with control messages.
++ *     @skb: pointer to skb
++ *     @len: new skb length
++ *     @flags: reserved
++ *     Return: 0 on success or negative error
++ *
++ * int bpf_skb_pull_data(skb, len)
++ *     The helper will pull in non-linear data in case the skb is non-linear
++ *     and not all of len are part of the linear section. Only needed for
++ *     read/write with direct packet access.
++ *     @skb: pointer to skb
++ *     @len: len to make read/writeable
++ *     Return: 0 on success or negative error
++ *
++ * s64 bpf_csum_update(skb, csum)
++ *     Adds csum into skb->csum in case of CHECKSUM_COMPLETE.
++ *     @skb: pointer to skb
++ *     @csum: csum to add
++ *     Return: csum on success or negative error
++ *
++ * void bpf_set_hash_invalid(skb)
++ *     Invalidate current skb->hash.
++ *     @skb: pointer to skb
++ *
++ * int bpf_get_numa_node_id()
++ *     Return: Id of current NUMA node.
++ *
++ * int bpf_skb_change_head()
++ *     Grows headroom of skb and adjusts MAC header offset accordingly.
++ *     Will extends/reallocae as required automatically.
++ *     May change skb data pointer and will thus invalidate any check
++ *     performed for direct packet access.
++ *     @skb: pointer to skb
++ *     @len: length of header to be pushed in front
++ *     @flags: Flags (unused for now)
++ *     Return: 0 on success or negative error
++ *
++ * int bpf_xdp_adjust_head(xdp_md, delta)
++ *     Adjust the xdp_md.data by delta
++ *     @xdp_md: pointer to xdp_md
++ *     @delta: An positive/negative integer to be added to xdp_md.data
++ *     Return: 0 on success or negative on error
++ *
++ * int bpf_probe_read_str(void *dst, int size, const void *unsafe_ptr)
++ *     Copy a NUL terminated string from unsafe address. In case the string
++ *     length is smaller than size, the target is not padded with further NUL
++ *     bytes. In case the string length is larger than size, just count-1
++ *     bytes are copied and the last byte is set to NUL.
++ *     @dst: destination address
++ *     @size: maximum number of bytes to copy, including the trailing NUL
++ *     @unsafe_ptr: unsafe address
++ *     Return:
++ *       > 0 length of the string including the trailing NUL on success
++ *       < 0 error
++ *
++ * u64 bpf_get_socket_cookie(skb)
++ *     Get the cookie for the socket stored inside sk_buff.
++ *     @skb: pointer to skb
++ *     Return: 8 Bytes non-decreasing number on success or 0 if the socket
++ *     field is missing inside sk_buff
++ *
++ * u32 bpf_get_socket_uid(skb)
++ *     Get the owner uid of the socket stored inside sk_buff.
++ *     @skb: pointer to skb
++ *     Return: uid of the socket owner on success or overflowuid if failed.
++ *
++ * u32 bpf_set_hash(skb, hash)
++ *     Set full skb->hash.
++ *     @skb: pointer to skb
++ *     @hash: hash to set
++ *
++ * int bpf_setsockopt(bpf_socket, level, optname, optval, optlen)
++ *     Calls setsockopt. Not all opts are available, only those with
++ *     integer optvals plus TCP_CONGESTION.
++ *     Supported levels: SOL_SOCKET and IPROTO_TCP
++ *     @bpf_socket: pointer to bpf_socket
++ *     @level: SOL_SOCKET or IPROTO_TCP
++ *     @optname: option name
++ *     @optval: pointer to option value
++ *     @optlen: length of optval in byes
++ *     Return: 0 or negative error
++ *
++ * int bpf_skb_adjust_room(skb, len_diff, mode, flags)
++ *     Grow or shrink room in sk_buff.
++ *     @skb: pointer to skb
++ *     @len_diff: (signed) amount of room to grow/shrink
++ *     @mode: operation mode (enum bpf_adj_room_mode)
++ *     @flags: reserved for future use
++ *     Return: 0 on success or negative error code
++ *
++ * int bpf_sk_redirect_map(map, key, flags)
++ *     Redirect skb to a sock in map using key as a lookup key for the
++ *     sock in map.
++ *     @map: pointer to sockmap
++ *     @key: key to lookup sock in map
++ *     @flags: reserved for future use
++ *     Return: SK_REDIRECT
++ *
++ * int bpf_sock_map_update(skops, map, key, flags)
++ *	@skops: pointer to bpf_sock_ops
++ *	@map: pointer to sockmap to update
++ *	@key: key to insert/update sock in map
++ *	@flags: same flags as map update elem
++ */
++#define __BPF_FUNC_MAPPER(FN)		\
++	FN(unspec),			\
++	FN(map_lookup_elem),		\
++	FN(map_update_elem),		\
++	FN(map_delete_elem),		\
++	FN(probe_read),			\
++	FN(ktime_get_ns),		\
++	FN(trace_printk),		\
++	FN(get_prandom_u32),		\
++	FN(get_smp_processor_id),	\
++	FN(skb_store_bytes),		\
++	FN(l3_csum_replace),		\
++	FN(l4_csum_replace),		\
++	FN(tail_call),			\
++	FN(clone_redirect),		\
++	FN(get_current_pid_tgid),	\
++	FN(get_current_uid_gid),	\
++	FN(get_current_comm),		\
++	FN(get_cgroup_classid),		\
++	FN(skb_vlan_push),		\
++	FN(skb_vlan_pop),		\
++	FN(skb_get_tunnel_key),		\
++	FN(skb_set_tunnel_key),		\
++	FN(perf_event_read),		\
++	FN(redirect),			\
++	FN(get_route_realm),		\
++	FN(perf_event_output),		\
++	FN(skb_load_bytes),		\
++	FN(get_stackid),		\
++	FN(csum_diff),			\
++	FN(skb_get_tunnel_opt),		\
++	FN(skb_set_tunnel_opt),		\
++	FN(skb_change_proto),		\
++	FN(skb_change_type),		\
++	FN(skb_under_cgroup),		\
++	FN(get_hash_recalc),		\
++	FN(get_current_task),		\
++	FN(probe_write_user),		\
++	FN(current_task_under_cgroup),	\
++	FN(skb_change_tail),		\
++	FN(skb_pull_data),		\
++	FN(csum_update),		\
++	FN(set_hash_invalid),		\
++	FN(get_numa_node_id),		\
++	FN(skb_change_head),		\
++	FN(xdp_adjust_head),		\
++	FN(probe_read_str),		\
++	FN(get_socket_cookie),		\
++	FN(get_socket_uid),		\
++	FN(set_hash),			\
++	FN(setsockopt),			\
++	FN(skb_adjust_room),		\
++	FN(redirect_map),		\
++	FN(sk_redirect_map),		\
++	FN(sock_map_update),		\
++
++/* integer value in 'imm' field of BPF_CALL instruction selects which helper
++ * function eBPF program intends to call
++ */
++#define __BPF_ENUM_FN(x) BPF_FUNC_ ## x
++enum bpf_func_id {
++	__BPF_FUNC_MAPPER(__BPF_ENUM_FN)
++	__BPF_FUNC_MAX_ID,
++};
++#undef __BPF_ENUM_FN
++
++/* All flags used by eBPF helper functions, placed here. */
++
++/* BPF_FUNC_skb_store_bytes flags. */
++#define BPF_F_RECOMPUTE_CSUM		(1ULL << 0)
++#define BPF_F_INVALIDATE_HASH		(1ULL << 1)
++
++/* BPF_FUNC_l3_csum_replace and BPF_FUNC_l4_csum_replace flags.
++ * First 4 bits are for passing the header field size.
++ */
++#define BPF_F_HDR_FIELD_MASK		0xfULL
++
++/* BPF_FUNC_l4_csum_replace flags. */
++#define BPF_F_PSEUDO_HDR		(1ULL << 4)
++#define BPF_F_MARK_MANGLED_0		(1ULL << 5)
++#define BPF_F_MARK_ENFORCE		(1ULL << 6)
++
++/* BPF_FUNC_clone_redirect and BPF_FUNC_redirect flags. */
++#define BPF_F_INGRESS			(1ULL << 0)
++
++/* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */
++#define BPF_F_TUNINFO_IPV6		(1ULL << 0)
++
++/* BPF_FUNC_get_stackid flags. */
++#define BPF_F_SKIP_FIELD_MASK		0xffULL
++#define BPF_F_USER_STACK		(1ULL << 8)
++#define BPF_F_FAST_STACK_CMP		(1ULL << 9)
++#define BPF_F_REUSE_STACKID		(1ULL << 10)
++
++/* BPF_FUNC_skb_set_tunnel_key flags. */
++#define BPF_F_ZERO_CSUM_TX		(1ULL << 1)
++#define BPF_F_DONT_FRAGMENT		(1ULL << 2)
++
++/* BPF_FUNC_perf_event_output and BPF_FUNC_perf_event_read flags. */
++#define BPF_F_INDEX_MASK		0xffffffffULL
++#define BPF_F_CURRENT_CPU		BPF_F_INDEX_MASK
++/* BPF_FUNC_perf_event_output for sk_buff input context. */
++#define BPF_F_CTXLEN_MASK		(0xfffffULL << 32)
++
++/* Mode for BPF_FUNC_skb_adjust_room helper. */
++enum bpf_adj_room_mode {
++	BPF_ADJ_ROOM_NET,
++};
++
++/* user accessible mirror of in-kernel sk_buff.
++ * new fields can only be added to the end of this structure
++ */
++struct __sk_buff {
++	__u32 len;
++	__u32 pkt_type;
++	__u32 mark;
++	__u32 queue_mapping;
++	__u32 protocol;
++	__u32 vlan_present;
++	__u32 vlan_tci;
++	__u32 vlan_proto;
++	__u32 priority;
++	__u32 ingress_ifindex;
++	__u32 ifindex;
++	__u32 tc_index;
++	__u32 cb[5];
++	__u32 hash;
++	__u32 tc_classid;
++	__u32 data;
++	__u32 data_end;
++	__u32 napi_id;
++
++	/* accessed by BPF_PROG_TYPE_sk_skb types */
++	__u32 family;
++	__u32 remote_ip4;	/* Stored in network byte order */
++	__u32 local_ip4;	/* Stored in network byte order */
++	__u32 remote_ip6[4];	/* Stored in network byte order */
++	__u32 local_ip6[4];	/* Stored in network byte order */
++	__u32 remote_port;	/* Stored in network byte order */
++	__u32 local_port;	/* stored in host byte order */
++};
++
++struct bpf_tunnel_key {
++	__u32 tunnel_id;
++	union {
++		__u32 remote_ipv4;
++		__u32 remote_ipv6[4];
++	};
++	__u8 tunnel_tos;
++	__u8 tunnel_ttl;
++	__u16 tunnel_ext;
++	__u32 tunnel_label;
++};
++
++/* Generic BPF return codes which all BPF program types may support.
++ * The values are binary compatible with their TC_ACT_* counter-part to
++ * provide backwards compatibility with existing SCHED_CLS and SCHED_ACT
++ * programs.
++ *
++ * XDP is handled seprately, see XDP_*.
++ */
++enum bpf_ret_code {
++	BPF_OK = 0,
++	/* 1 reserved */
++	BPF_DROP = 2,
++	/* 3-6 reserved */
++	BPF_REDIRECT = 7,
++	/* >127 are reserved for prog type specific return codes */
++};
++
++struct bpf_sock {
++	__u32 bound_dev_if;
++	__u32 family;
++	__u32 type;
++	__u32 protocol;
++	__u32 mark;
++	__u32 priority;
++};
++
++#define XDP_PACKET_HEADROOM 256
++
++/* User return codes for XDP prog type.
++ * A valid XDP program must return one of these defined values. All other
++ * return codes are reserved for future use. Unknown return codes will
++ * result in packet drops and a warning via bpf_warn_invalid_xdp_action().
++ */
++enum xdp_action {
++	XDP_ABORTED = 0,
++	XDP_DROP,
++	XDP_PASS,
++	XDP_TX,
++	XDP_REDIRECT,
++};
++
++/* user accessible metadata for XDP packet hook
++ * new fields must be added to the end of this structure
++ */
++struct xdp_md {
++	__u32 data;
++	__u32 data_end;
++};
++
++enum sk_action {
++	SK_ABORTED = 0,
++	SK_DROP,
++	SK_REDIRECT,
++};
++
++#define BPF_TAG_SIZE	8
++
++struct bpf_prog_info {
++	__u32 type;
++	__u32 id;
++	__u8  tag[BPF_TAG_SIZE];
++	__u32 jited_prog_len;
++	__u32 xlated_prog_len;
++	__aligned_u64 jited_prog_insns;
++	__aligned_u64 xlated_prog_insns;
++} __attribute__((aligned(8)));
++
++struct bpf_map_info {
++	__u32 type;
++	__u32 id;
++	__u32 key_size;
++	__u32 value_size;
++	__u32 max_entries;
++	__u32 map_flags;
++} __attribute__((aligned(8)));
++
++/* User bpf_sock_ops struct to access socket values and specify request ops
++ * and their replies.
++ * Some of this fields are in network (bigendian) byte order and may need
++ * to be converted before use (bpf_ntohl() defined in samples/bpf/bpf_endian.h).
++ * New fields can only be added at the end of this structure
++ */
++struct bpf_sock_ops {
++	__u32 op;
++	union {
++		__u32 reply;
++		__u32 replylong[4];
++	};
++	__u32 family;
++	__u32 remote_ip4;	/* Stored in network byte order */
++	__u32 local_ip4;	/* Stored in network byte order */
++	__u32 remote_ip6[4];	/* Stored in network byte order */
++	__u32 local_ip6[4];	/* Stored in network byte order */
++	__u32 remote_port;	/* Stored in network byte order */
++	__u32 local_port;	/* stored in host byte order */
++};
++
++/* List of known BPF sock_ops operators.
++ * New entries can only be added at the end
++ */
++enum {
++	BPF_SOCK_OPS_VOID,
++	BPF_SOCK_OPS_TIMEOUT_INIT,	/* Should return SYN-RTO value to use or
++					 * -1 if default value should be used
++					 */
++	BPF_SOCK_OPS_RWND_INIT,		/* Should return initial advertized
++					 * window (in packets) or -1 if default
++					 * value should be used
++					 */
++	BPF_SOCK_OPS_TCP_CONNECT_CB,	/* Calls BPF program right before an
++					 * active connection is initialized
++					 */
++	BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB,	/* Calls BPF program when an
++						 * active connection is
++						 * established
++						 */
++	BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB,	/* Calls BPF program when a
++						 * passive connection is
++						 * established
++						 */
++	BPF_SOCK_OPS_NEEDS_ECN,		/* If connection's congestion control
++					 * needs ECN
++					 */
++};
++
++#define TCP_BPF_IW		1001	/* Set TCP initial congestion window */
++#define TCP_BPF_SNDCWND_CLAMP	1002	/* Set sndcwnd_clamp */
++
++#endif /* __LINUX_BPF_H__ */
+diff --git a/include/uapi/linux/bpf_common.h b/include/uapi/linux/bpf_common.h
+new file mode 100644
+index 0000000..afe7433
+--- /dev/null
++++ b/include/uapi/linux/bpf_common.h
+@@ -0,0 +1,55 @@
++#ifndef __LINUX_BPF_COMMON_H__
++#define __LINUX_BPF_COMMON_H__
++
++/* Instruction classes */
++#define BPF_CLASS(code) ((code) & 0x07)
++#define		BPF_LD		0x00
++#define		BPF_LDX		0x01
++#define		BPF_ST		0x02
++#define		BPF_STX		0x03
++#define		BPF_ALU		0x04
++#define		BPF_JMP		0x05
++#define		BPF_RET		0x06
++#define		BPF_MISC        0x07
++
++/* ld/ldx fields */
++#define BPF_SIZE(code)  ((code) & 0x18)
++#define		BPF_W		0x00
++#define		BPF_H		0x08
++#define		BPF_B		0x10
++#define BPF_MODE(code)  ((code) & 0xe0)
++#define		BPF_IMM		0x00
++#define		BPF_ABS		0x20
++#define		BPF_IND		0x40
++#define		BPF_MEM		0x60
++#define		BPF_LEN		0x80
++#define		BPF_MSH		0xa0
++
++/* alu/jmp fields */
++#define BPF_OP(code)    ((code) & 0xf0)
++#define		BPF_ADD		0x00
++#define		BPF_SUB		0x10
++#define		BPF_MUL		0x20
++#define		BPF_DIV		0x30
++#define		BPF_OR		0x40
++#define		BPF_AND		0x50
++#define		BPF_LSH		0x60
++#define		BPF_RSH		0x70
++#define		BPF_NEG		0x80
++#define		BPF_MOD		0x90
++#define		BPF_XOR		0xa0
++
++#define		BPF_JA		0x00
++#define		BPF_JEQ		0x10
++#define		BPF_JGT		0x20
++#define		BPF_JGE		0x30
++#define		BPF_JSET        0x40
++#define BPF_SRC(code)   ((code) & 0x08)
++#define		BPF_K		0x00
++#define		BPF_X		0x08
++
++#ifndef BPF_MAXINSNS
++#define BPF_MAXINSNS 4096
++#endif
++
++#endif /* __LINUX_BPF_COMMON_H__ */
+diff --git a/include/uapi/linux/can.h b/include/uapi/linux/can.h
+new file mode 100644
+index 0000000..f7a810d
+--- /dev/null
++++ b/include/uapi/linux/can.h
+@@ -0,0 +1,201 @@
++/*
++ * linux/can.h
++ *
++ * Definitions for CAN network layer (socket addr / CAN frame / CAN filter)
++ *
++ * Authors: Oliver Hartkopp <oliver.hartkopp@volkswagen.de>
++ *          Urs Thuermann   <urs.thuermann@volkswagen.de>
++ * Copyright (c) 2002-2007 Volkswagen Group Electronic Research
++ * 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.
++ * 3. Neither the name of Volkswagen nor the names of its contributors
++ *    may be used to endorse or promote products derived from this software
++ *    without specific prior written permission.
++ *
++ * Alternatively, provided that this notice is retained in full, this
++ * software may be distributed under the terms of the GNU General
++ * Public License ("GPL") version 2, in which case the provisions of the
++ * GPL apply INSTEAD OF those given above.
++ *
++ * The provided data structures and external interfaces from this code
++ * are not restricted to be used by modules with a GPL compatible license.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
++ * OWNER 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.
++ */
++
++#ifndef _CAN_H
++#define _CAN_H
++
++#include <linux/types.h>
++#include <linux/socket.h>
++
++/* controller area network (CAN) kernel definitions */
++
++/* special address description flags for the CAN_ID */
++#define CAN_EFF_FLAG 0x80000000U /* EFF/SFF is set in the MSB */
++#define CAN_RTR_FLAG 0x40000000U /* remote transmission request */
++#define CAN_ERR_FLAG 0x20000000U /* error message frame */
++
++/* valid bits in CAN ID for frame formats */
++#define CAN_SFF_MASK 0x000007FFU /* standard frame format (SFF) */
++#define CAN_EFF_MASK 0x1FFFFFFFU /* extended frame format (EFF) */
++#define CAN_ERR_MASK 0x1FFFFFFFU /* omit EFF, RTR, ERR flags */
++
++/*
++ * Controller Area Network Identifier structure
++ *
++ * bit 0-28	: CAN identifier (11/29 bit)
++ * bit 29	: error message frame flag (0 = data frame, 1 = error message)
++ * bit 30	: remote transmission request flag (1 = rtr frame)
++ * bit 31	: frame format flag (0 = standard 11 bit, 1 = extended 29 bit)
++ */
++typedef __u32 canid_t;
++
++#define CAN_SFF_ID_BITS		11
++#define CAN_EFF_ID_BITS		29
++
++/*
++ * Controller Area Network Error Message Frame Mask structure
++ *
++ * bit 0-28	: error class mask (see include/linux/can/error.h)
++ * bit 29-31	: set to zero
++ */
++typedef __u32 can_err_mask_t;
++
++/* CAN payload length and DLC definitions according to ISO 11898-1 */
++#define CAN_MAX_DLC 8
++#define CAN_MAX_DLEN 8
++
++/* CAN FD payload length and DLC definitions according to ISO 11898-7 */
++#define CANFD_MAX_DLC 15
++#define CANFD_MAX_DLEN 64
++
++/**
++ * struct can_frame - basic CAN frame structure
++ * @can_id:  CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition
++ * @can_dlc: frame payload length in byte (0 .. 8) aka data length code
++ *           N.B. the DLC field from ISO 11898-1 Chapter 8.4.2.3 has a 1:1
++ *           mapping of the 'data length code' to the real payload length
++ * @__pad:   padding
++ * @__res0:  reserved / padding
++ * @__res1:  reserved / padding
++ * @data:    CAN frame payload (up to 8 byte)
++ */
++struct can_frame {
++	canid_t can_id;  /* 32 bit CAN_ID + EFF/RTR/ERR flags */
++	__u8    can_dlc; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */
++	__u8    __pad;   /* padding */
++	__u8    __res0;  /* reserved / padding */
++	__u8    __res1;  /* reserved / padding */
++	__u8    data[CAN_MAX_DLEN] __attribute__((aligned(8)));
++};
++
++/*
++ * defined bits for canfd_frame.flags
++ *
++ * The use of struct canfd_frame implies the Extended Data Length (EDL) bit to
++ * be set in the CAN frame bitstream on the wire. The EDL bit switch turns
++ * the CAN controllers bitstream processor into the CAN FD mode which creates
++ * two new options within the CAN FD frame specification:
++ *
++ * Bit Rate Switch - to indicate a second bitrate is/was used for the payload
++ * Error State Indicator - represents the error state of the transmitting node
++ *
++ * As the CANFD_ESI bit is internally generated by the transmitting CAN
++ * controller only the CANFD_BRS bit is relevant for real CAN controllers when
++ * building a CAN FD frame for transmission. Setting the CANFD_ESI bit can make
++ * sense for virtual CAN interfaces to test applications with echoed frames.
++ */
++#define CANFD_BRS 0x01 /* bit rate switch (second bitrate for payload data) */
++#define CANFD_ESI 0x02 /* error state indicator of the transmitting node */
++
++/**
++ * struct canfd_frame - CAN flexible data rate frame structure
++ * @can_id: CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition
++ * @len:    frame payload length in byte (0 .. CANFD_MAX_DLEN)
++ * @flags:  additional flags for CAN FD
++ * @__res0: reserved / padding
++ * @__res1: reserved / padding
++ * @data:   CAN FD frame payload (up to CANFD_MAX_DLEN byte)
++ */
++struct canfd_frame {
++	canid_t can_id;  /* 32 bit CAN_ID + EFF/RTR/ERR flags */
++	__u8    len;     /* frame payload length in byte */
++	__u8    flags;   /* additional flags for CAN FD */
++	__u8    __res0;  /* reserved / padding */
++	__u8    __res1;  /* reserved / padding */
++	__u8    data[CANFD_MAX_DLEN] __attribute__((aligned(8)));
++};
++
++#define CAN_MTU		(sizeof(struct can_frame))
++#define CANFD_MTU	(sizeof(struct canfd_frame))
++
++/* particular protocols of the protocol family PF_CAN */
++#define CAN_RAW		1 /* RAW sockets */
++#define CAN_BCM		2 /* Broadcast Manager */
++#define CAN_TP16	3 /* VAG Transport Protocol v1.6 */
++#define CAN_TP20	4 /* VAG Transport Protocol v2.0 */
++#define CAN_MCNET	5 /* Bosch MCNet */
++#define CAN_ISOTP	6 /* ISO 15765-2 Transport Protocol */
++#define CAN_NPROTO	7
++
++#define SOL_CAN_BASE 100
++
++/**
++ * struct sockaddr_can - the sockaddr structure for CAN sockets
++ * @can_family:  address family number AF_CAN.
++ * @can_ifindex: CAN network interface index.
++ * @can_addr:    protocol specific address information
++ */
++struct sockaddr_can {
++	__kernel_sa_family_t can_family;
++	int         can_ifindex;
++	union {
++		/* transport protocol class address information (e.g. ISOTP) */
++		struct { canid_t rx_id, tx_id; } tp;
++
++		/* reserved for future CAN protocols address information */
++	} can_addr;
++};
++
++/**
++ * struct can_filter - CAN ID based filter in can_register().
++ * @can_id:   relevant bits of CAN ID which are not masked out.
++ * @can_mask: CAN mask (see description)
++ *
++ * Description:
++ * A filter matches, when
++ *
++ *          <received_can_id> & mask == can_id & mask
++ *
++ * The filter can be inverted (CAN_INV_FILTER bit set in can_id) or it can
++ * filter for error message frames (CAN_ERR_FLAG bit set in mask).
++ */
++struct can_filter {
++	canid_t can_id;
++	canid_t can_mask;
++};
++
++#define CAN_INV_FILTER 0x20000000U /* to be set in can_filter.can_id */
++#define CAN_RAW_FILTER_MAX 512 /* maximum number of can_filter set via setsockopt() */
++
++#endif /* !_UAPI_CAN_H */
+diff --git a/include/uapi/linux/can/netlink.h b/include/uapi/linux/can/netlink.h
+new file mode 100644
+index 0000000..b9214bd
+--- /dev/null
++++ b/include/uapi/linux/can/netlink.h
+@@ -0,0 +1,142 @@
++/*
++ * linux/can/netlink.h
++ *
++ * Definitions for the CAN netlink interface
++ *
++ * Copyright (c) 2009 Wolfgang Grandegger <wg@grandegger.com>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the version 2 of the GNU General Public License
++ * as published by the Free Software Foundation
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ */
++
++#ifndef _CAN_NETLINK_H
++#define _CAN_NETLINK_H
++
++#include <linux/types.h>
++
++/*
++ * CAN bit-timing parameters
++ *
++ * For further information, please read chapter "8 BIT TIMING
++ * REQUIREMENTS" of the "Bosch CAN Specification version 2.0"
++ * at http://www.semiconductors.bosch.de/pdf/can2spec.pdf.
++ */
++struct can_bittiming {
++	__u32 bitrate;		/* Bit-rate in bits/second */
++	__u32 sample_point;	/* Sample point in one-tenth of a percent */
++	__u32 tq;		/* Time quanta (TQ) in nanoseconds */
++	__u32 prop_seg;		/* Propagation segment in TQs */
++	__u32 phase_seg1;	/* Phase buffer segment 1 in TQs */
++	__u32 phase_seg2;	/* Phase buffer segment 2 in TQs */
++	__u32 sjw;		/* Synchronisation jump width in TQs */
++	__u32 brp;		/* Bit-rate prescaler */
++};
++
++/*
++ * CAN harware-dependent bit-timing constant
++ *
++ * Used for calculating and checking bit-timing parameters
++ */
++struct can_bittiming_const {
++	char name[16];		/* Name of the CAN controller hardware */
++	__u32 tseg1_min;	/* Time segement 1 = prop_seg + phase_seg1 */
++	__u32 tseg1_max;
++	__u32 tseg2_min;	/* Time segement 2 = phase_seg2 */
++	__u32 tseg2_max;
++	__u32 sjw_max;		/* Synchronisation jump width */
++	__u32 brp_min;		/* Bit-rate prescaler */
++	__u32 brp_max;
++	__u32 brp_inc;
++};
++
++/*
++ * CAN clock parameters
++ */
++struct can_clock {
++	__u32 freq;		/* CAN system clock frequency in Hz */
++};
++
++/*
++ * CAN operational and error states
++ */
++enum can_state {
++	CAN_STATE_ERROR_ACTIVE = 0,	/* RX/TX error count < 96 */
++	CAN_STATE_ERROR_WARNING,	/* RX/TX error count < 128 */
++	CAN_STATE_ERROR_PASSIVE,	/* RX/TX error count < 256 */
++	CAN_STATE_BUS_OFF,		/* RX/TX error count >= 256 */
++	CAN_STATE_STOPPED,		/* Device is stopped */
++	CAN_STATE_SLEEPING,		/* Device is sleeping */
++	CAN_STATE_MAX
++};
++
++/*
++ * CAN bus error counters
++ */
++struct can_berr_counter {
++	__u16 txerr;
++	__u16 rxerr;
++};
++
++/*
++ * CAN controller mode
++ */
++struct can_ctrlmode {
++	__u32 mask;
++	__u32 flags;
++};
++
++#define CAN_CTRLMODE_LOOPBACK		0x01	/* Loopback mode */
++#define CAN_CTRLMODE_LISTENONLY		0x02	/* Listen-only mode */
++#define CAN_CTRLMODE_3_SAMPLES		0x04	/* Triple sampling mode */
++#define CAN_CTRLMODE_ONE_SHOT		0x08	/* One-Shot mode */
++#define CAN_CTRLMODE_BERR_REPORTING	0x10	/* Bus-error reporting */
++#define CAN_CTRLMODE_FD			0x20	/* CAN FD mode */
++#define CAN_CTRLMODE_PRESUME_ACK	0x40	/* Ignore missing CAN ACKs */
++#define CAN_CTRLMODE_FD_NON_ISO		0x80	/* CAN FD in non-ISO mode */
++
++/*
++ * CAN device statistics
++ */
++struct can_device_stats {
++	__u32 bus_error;	/* Bus errors */
++	__u32 error_warning;	/* Changes to error warning state */
++	__u32 error_passive;	/* Changes to error passive state */
++	__u32 bus_off;		/* Changes to bus off state */
++	__u32 arbitration_lost; /* Arbitration lost errors */
++	__u32 restarts;		/* CAN controller re-starts */
++};
++
++/*
++ * CAN netlink interface
++ */
++enum {
++	IFLA_CAN_UNSPEC,
++	IFLA_CAN_BITTIMING,
++	IFLA_CAN_BITTIMING_CONST,
++	IFLA_CAN_CLOCK,
++	IFLA_CAN_STATE,
++	IFLA_CAN_CTRLMODE,
++	IFLA_CAN_RESTART_MS,
++	IFLA_CAN_RESTART,
++	IFLA_CAN_BERR_COUNTER,
++	IFLA_CAN_DATA_BITTIMING,
++	IFLA_CAN_DATA_BITTIMING_CONST,
++	IFLA_CAN_TERMINATION,
++	IFLA_CAN_TERMINATION_CONST,
++	IFLA_CAN_BITRATE_CONST,
++	IFLA_CAN_DATA_BITRATE_CONST,
++	__IFLA_CAN_MAX
++};
++
++#define IFLA_CAN_MAX	(__IFLA_CAN_MAX - 1)
++
++/* u16 termination range: 1..65535 Ohms */
++#define CAN_TERMINATION_DISABLED 0
++
++#endif /* !_UAPI_CAN_NETLINK_H */
+diff --git a/include/uapi/linux/can/vxcan.h b/include/uapi/linux/can/vxcan.h
+new file mode 100644
+index 0000000..5b29e8a
+--- /dev/null
++++ b/include/uapi/linux/can/vxcan.h
+@@ -0,0 +1,12 @@
++#ifndef _CAN_VXCAN_H
++#define _CAN_VXCAN_H
++
++enum {
++	VXCAN_INFO_UNSPEC,
++	VXCAN_INFO_PEER,
++
++	__VXCAN_INFO_MAX
++#define VXCAN_INFO_MAX	(__VXCAN_INFO_MAX - 1)
++};
++
++#endif
+diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h
+new file mode 100644
+index 0000000..a62695e
+--- /dev/null
++++ b/include/uapi/linux/devlink.h
+@@ -0,0 +1,247 @@
++/*
++ * include/uapi/linux/devlink.h - Network physical device Netlink interface
++ * Copyright (c) 2016 Mellanox Technologies. All rights reserved.
++ * Copyright (c) 2016 Jiri Pirko <jiri@mellanox.com>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ */
++
++#ifndef _LINUX_DEVLINK_H_
++#define _LINUX_DEVLINK_H_
++
++#define DEVLINK_GENL_NAME "devlink"
++#define DEVLINK_GENL_VERSION 0x1
++#define DEVLINK_GENL_MCGRP_CONFIG_NAME "config"
++
++enum devlink_command {
++	/* don't change the order or add anything between, this is ABI! */
++	DEVLINK_CMD_UNSPEC,
++
++	DEVLINK_CMD_GET,		/* can dump */
++	DEVLINK_CMD_SET,
++	DEVLINK_CMD_NEW,
++	DEVLINK_CMD_DEL,
++
++	DEVLINK_CMD_PORT_GET,		/* can dump */
++	DEVLINK_CMD_PORT_SET,
++	DEVLINK_CMD_PORT_NEW,
++	DEVLINK_CMD_PORT_DEL,
++
++	DEVLINK_CMD_PORT_SPLIT,
++	DEVLINK_CMD_PORT_UNSPLIT,
++
++	DEVLINK_CMD_SB_GET,		/* can dump */
++	DEVLINK_CMD_SB_SET,
++	DEVLINK_CMD_SB_NEW,
++	DEVLINK_CMD_SB_DEL,
++
++	DEVLINK_CMD_SB_POOL_GET,	/* can dump */
++	DEVLINK_CMD_SB_POOL_SET,
++	DEVLINK_CMD_SB_POOL_NEW,
++	DEVLINK_CMD_SB_POOL_DEL,
++
++	DEVLINK_CMD_SB_PORT_POOL_GET,	/* can dump */
++	DEVLINK_CMD_SB_PORT_POOL_SET,
++	DEVLINK_CMD_SB_PORT_POOL_NEW,
++	DEVLINK_CMD_SB_PORT_POOL_DEL,
++
++	DEVLINK_CMD_SB_TC_POOL_BIND_GET,	/* can dump */
++	DEVLINK_CMD_SB_TC_POOL_BIND_SET,
++	DEVLINK_CMD_SB_TC_POOL_BIND_NEW,
++	DEVLINK_CMD_SB_TC_POOL_BIND_DEL,
++
++	/* Shared buffer occupancy monitoring commands */
++	DEVLINK_CMD_SB_OCC_SNAPSHOT,
++	DEVLINK_CMD_SB_OCC_MAX_CLEAR,
++
++	DEVLINK_CMD_ESWITCH_GET,
++#define DEVLINK_CMD_ESWITCH_MODE_GET /* obsolete, never use this! */ \
++	DEVLINK_CMD_ESWITCH_GET
++
++	DEVLINK_CMD_ESWITCH_SET,
++#define DEVLINK_CMD_ESWITCH_MODE_SET /* obsolete, never use this! */ \
++	DEVLINK_CMD_ESWITCH_SET
++
++	DEVLINK_CMD_DPIPE_TABLE_GET,
++	DEVLINK_CMD_DPIPE_ENTRIES_GET,
++	DEVLINK_CMD_DPIPE_HEADERS_GET,
++	DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET,
++
++	/* add new commands above here */
++	__DEVLINK_CMD_MAX,
++	DEVLINK_CMD_MAX = __DEVLINK_CMD_MAX - 1
++};
++
++enum devlink_port_type {
++	DEVLINK_PORT_TYPE_NOTSET,
++	DEVLINK_PORT_TYPE_AUTO,
++	DEVLINK_PORT_TYPE_ETH,
++	DEVLINK_PORT_TYPE_IB,
++};
++
++enum devlink_sb_pool_type {
++	DEVLINK_SB_POOL_TYPE_INGRESS,
++	DEVLINK_SB_POOL_TYPE_EGRESS,
++};
++
++/* static threshold - limiting the maximum number of bytes.
++ * dynamic threshold - limiting the maximum number of bytes
++ *   based on the currently available free space in the shared buffer pool.
++ *   In this mode, the maximum quota is calculated based
++ *   on the following formula:
++ *     max_quota = alpha / (1 + alpha) * Free_Buffer
++ *   While Free_Buffer is the amount of none-occupied buffer associated to
++ *   the relevant pool.
++ *   The value range which can be passed is 0-20 and serves
++ *   for computation of alpha by following formula:
++ *     alpha = 2 ^ (passed_value - 10)
++ */
++
++enum devlink_sb_threshold_type {
++	DEVLINK_SB_THRESHOLD_TYPE_STATIC,
++	DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC,
++};
++
++#define DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX 20
++
++enum devlink_eswitch_mode {
++	DEVLINK_ESWITCH_MODE_LEGACY,
++	DEVLINK_ESWITCH_MODE_SWITCHDEV,
++};
++
++enum devlink_eswitch_inline_mode {
++	DEVLINK_ESWITCH_INLINE_MODE_NONE,
++	DEVLINK_ESWITCH_INLINE_MODE_LINK,
++	DEVLINK_ESWITCH_INLINE_MODE_NETWORK,
++	DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT,
++};
++
++enum devlink_eswitch_encap_mode {
++	DEVLINK_ESWITCH_ENCAP_MODE_NONE,
++	DEVLINK_ESWITCH_ENCAP_MODE_BASIC,
++};
++
++enum devlink_attr {
++	/* don't change the order or add anything between, this is ABI! */
++	DEVLINK_ATTR_UNSPEC,
++
++	/* bus name + dev name together are a handle for devlink entity */
++	DEVLINK_ATTR_BUS_NAME,			/* string */
++	DEVLINK_ATTR_DEV_NAME,			/* string */
++
++	DEVLINK_ATTR_PORT_INDEX,		/* u32 */
++	DEVLINK_ATTR_PORT_TYPE,			/* u16 */
++	DEVLINK_ATTR_PORT_DESIRED_TYPE,		/* u16 */
++	DEVLINK_ATTR_PORT_NETDEV_IFINDEX,	/* u32 */
++	DEVLINK_ATTR_PORT_NETDEV_NAME,		/* string */
++	DEVLINK_ATTR_PORT_IBDEV_NAME,		/* string */
++	DEVLINK_ATTR_PORT_SPLIT_COUNT,		/* u32 */
++	DEVLINK_ATTR_PORT_SPLIT_GROUP,		/* u32 */
++	DEVLINK_ATTR_SB_INDEX,			/* u32 */
++	DEVLINK_ATTR_SB_SIZE,			/* u32 */
++	DEVLINK_ATTR_SB_INGRESS_POOL_COUNT,	/* u16 */
++	DEVLINK_ATTR_SB_EGRESS_POOL_COUNT,	/* u16 */
++	DEVLINK_ATTR_SB_INGRESS_TC_COUNT,	/* u16 */
++	DEVLINK_ATTR_SB_EGRESS_TC_COUNT,	/* u16 */
++	DEVLINK_ATTR_SB_POOL_INDEX,		/* u16 */
++	DEVLINK_ATTR_SB_POOL_TYPE,		/* u8 */
++	DEVLINK_ATTR_SB_POOL_SIZE,		/* u32 */
++	DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE,	/* u8 */
++	DEVLINK_ATTR_SB_THRESHOLD,		/* u32 */
++	DEVLINK_ATTR_SB_TC_INDEX,		/* u16 */
++	DEVLINK_ATTR_SB_OCC_CUR,		/* u32 */
++	DEVLINK_ATTR_SB_OCC_MAX,		/* u32 */
++	DEVLINK_ATTR_ESWITCH_MODE,		/* u16 */
++	DEVLINK_ATTR_ESWITCH_INLINE_MODE,	/* u8 */
++
++	DEVLINK_ATTR_DPIPE_TABLES,		/* nested */
++	DEVLINK_ATTR_DPIPE_TABLE,		/* nested */
++	DEVLINK_ATTR_DPIPE_TABLE_NAME,		/* string */
++	DEVLINK_ATTR_DPIPE_TABLE_SIZE,		/* u64 */
++	DEVLINK_ATTR_DPIPE_TABLE_MATCHES,	/* nested */
++	DEVLINK_ATTR_DPIPE_TABLE_ACTIONS,	/* nested */
++	DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED,	/* u8 */
++
++	DEVLINK_ATTR_DPIPE_ENTRIES,		/* nested */
++	DEVLINK_ATTR_DPIPE_ENTRY,		/* nested */
++	DEVLINK_ATTR_DPIPE_ENTRY_INDEX,		/* u64 */
++	DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES,	/* nested */
++	DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES,	/* nested */
++	DEVLINK_ATTR_DPIPE_ENTRY_COUNTER,	/* u64 */
++
++	DEVLINK_ATTR_DPIPE_MATCH,		/* nested */
++	DEVLINK_ATTR_DPIPE_MATCH_VALUE,		/* nested */
++	DEVLINK_ATTR_DPIPE_MATCH_TYPE,		/* u32 */
++
++	DEVLINK_ATTR_DPIPE_ACTION,		/* nested */
++	DEVLINK_ATTR_DPIPE_ACTION_VALUE,	/* nested */
++	DEVLINK_ATTR_DPIPE_ACTION_TYPE,		/* u32 */
++
++	DEVLINK_ATTR_DPIPE_VALUE,
++	DEVLINK_ATTR_DPIPE_VALUE_MASK,
++	DEVLINK_ATTR_DPIPE_VALUE_MAPPING,	/* u32 */
++
++	DEVLINK_ATTR_DPIPE_HEADERS,		/* nested */
++	DEVLINK_ATTR_DPIPE_HEADER,		/* nested */
++	DEVLINK_ATTR_DPIPE_HEADER_NAME,		/* string */
++	DEVLINK_ATTR_DPIPE_HEADER_ID,		/* u32 */
++	DEVLINK_ATTR_DPIPE_HEADER_FIELDS,	/* nested */
++	DEVLINK_ATTR_DPIPE_HEADER_GLOBAL,	/* u8 */
++	DEVLINK_ATTR_DPIPE_HEADER_INDEX,	/* u32 */
++
++	DEVLINK_ATTR_DPIPE_FIELD,		/* nested */
++	DEVLINK_ATTR_DPIPE_FIELD_NAME,		/* string */
++	DEVLINK_ATTR_DPIPE_FIELD_ID,		/* u32 */
++	DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH,	/* u32 */
++	DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE,	/* u32 */
++
++	DEVLINK_ATTR_PAD,
++
++	DEVLINK_ATTR_ESWITCH_ENCAP_MODE,	/* u8 */
++
++	/* add new attributes above here, update the policy in devlink.c */
++
++	__DEVLINK_ATTR_MAX,
++	DEVLINK_ATTR_MAX = __DEVLINK_ATTR_MAX - 1
++};
++
++/* Mapping between internal resource described by the field and system
++ * structure
++ */
++enum devlink_dpipe_field_mapping_type {
++	DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE,
++	DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX,
++};
++
++/* Match type - specify the type of the match */
++enum devlink_dpipe_match_type {
++	DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT,
++};
++
++/* Action type - specify the action type */
++enum devlink_dpipe_action_type {
++	DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY,
++};
++
++enum devlink_dpipe_field_ethernet_id {
++	DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC,
++};
++
++enum devlink_dpipe_field_ipv4_id {
++	DEVLINK_DPIPE_FIELD_IPV4_DST_IP,
++};
++
++enum devlink_dpipe_field_ipv6_id {
++	DEVLINK_DPIPE_FIELD_IPV6_DST_IP,
++};
++
++enum devlink_dpipe_header_id {
++	DEVLINK_DPIPE_HEADER_ETHERNET,
++	DEVLINK_DPIPE_HEADER_IPV4,
++	DEVLINK_DPIPE_HEADER_IPV6,
++};
++
++#endif /* _LINUX_DEVLINK_H_ */
+diff --git a/include/uapi/linux/elf-em.h b/include/uapi/linux/elf-em.h
+new file mode 100644
+index 0000000..9cd1de9
+--- /dev/null
++++ b/include/uapi/linux/elf-em.h
+@@ -0,0 +1,60 @@
++#ifndef _LINUX_ELF_EM_H
++#define _LINUX_ELF_EM_H
++
++/* These constants define the various ELF target machines */
++#define EM_NONE		0
++#define EM_M32		1
++#define EM_SPARC	2
++#define EM_386		3
++#define EM_68K		4
++#define EM_88K		5
++#define EM_486		6	/* Perhaps disused */
++#define EM_860		7
++#define EM_MIPS		8	/* MIPS R3000 (officially, big-endian only) */
++				/* Next two are historical and binaries and
++				   modules of these types will be rejected by
++				   Linux.  */
++#define EM_MIPS_RS3_LE	10	/* MIPS R3000 little-endian */
++#define EM_MIPS_RS4_BE	10	/* MIPS R4000 big-endian */
++
++#define EM_PARISC	15	/* HPPA */
++#define EM_SPARC32PLUS	18	/* Sun's "v8plus" */
++#define EM_PPC		20	/* PowerPC */
++#define EM_PPC64	21	 /* PowerPC64 */
++#define EM_SPU		23	/* Cell BE SPU */
++#define EM_ARM		40	/* ARM 32 bit */
++#define EM_SH		42	/* SuperH */
++#define EM_SPARCV9	43	/* SPARC v9 64-bit */
++#define EM_H8_300	46	/* Renesas H8/300 */
++#define EM_IA_64	50	/* HP/Intel IA-64 */
++#define EM_X86_64	62	/* AMD x86-64 */
++#define EM_S390		22	/* IBM S/390 */
++#define EM_CRIS		76	/* Axis Communications 32-bit embedded processor */
++#define EM_M32R		88	/* Renesas M32R */
++#define EM_MN10300	89	/* Panasonic/MEI MN10300, AM33 */
++#define EM_OPENRISC     92     /* OpenRISC 32-bit embedded processor */
++#define EM_BLACKFIN     106     /* ADI Blackfin Processor */
++#define EM_ALTERA_NIOS2	113	/* Altera Nios II soft-core processor */
++#define EM_TI_C6000	140	/* TI C6X DSPs */
++#define EM_AARCH64	183	/* ARM 64 bit */
++#define EM_TILEPRO	188	/* Tilera TILEPro */
++#define EM_MICROBLAZE	189	/* Xilinx MicroBlaze */
++#define EM_TILEGX	191	/* Tilera TILE-Gx */
++#define EM_BPF		247	/* Linux BPF - in-kernel virtual machine */
++#define EM_FRV		0x5441	/* Fujitsu FR-V */
++
++/*
++ * This is an interim value that we will use until the committee comes
++ * up with a final number.
++ */
++#define EM_ALPHA	0x9026
++
++/* Bogus old m32r magic number, used by old tools. */
++#define EM_CYGNUS_M32R	0x9041
++/* This is the old interim value for S/390 architecture */
++#define EM_S390_OLD	0xA390
++/* Also Panasonic/MEI MN10300, AM33 */
++#define EM_CYGNUS_MN10300 0xbeef
++
++
++#endif /* _LINUX_ELF_EM_H */
+diff --git a/include/uapi/linux/fib_rules.h b/include/uapi/linux/fib_rules.h
+new file mode 100644
+index 0000000..bbf02a6
+--- /dev/null
++++ b/include/uapi/linux/fib_rules.h
+@@ -0,0 +1,80 @@
++#ifndef __LINUX_FIB_RULES_H
++#define __LINUX_FIB_RULES_H
++
++#include <linux/types.h>
++#include <linux/rtnetlink.h>
++
++/* rule is permanent, and cannot be deleted */
++#define FIB_RULE_PERMANENT	0x00000001
++#define FIB_RULE_INVERT		0x00000002
++#define FIB_RULE_UNRESOLVED	0x00000004
++#define FIB_RULE_IIF_DETACHED	0x00000008
++#define FIB_RULE_DEV_DETACHED	FIB_RULE_IIF_DETACHED
++#define FIB_RULE_OIF_DETACHED	0x00000010
++
++/* try to find source address in routing lookups */
++#define FIB_RULE_FIND_SADDR	0x00010000
++
++struct fib_rule_hdr {
++	__u8		family;
++	__u8		dst_len;
++	__u8		src_len;
++	__u8		tos;
++
++	__u8		table;
++	__u8		res1;	/* reserved */
++	__u8		res2;	/* reserved */
++	__u8		action;
++
++	__u32		flags;
++};
++
++struct fib_rule_uid_range {
++	__u32		start;
++	__u32		end;
++};
++
++enum {
++	FRA_UNSPEC,
++	FRA_DST,	/* destination address */
++	FRA_SRC,	/* source address */
++	FRA_IIFNAME,	/* interface name */
++#define FRA_IFNAME	FRA_IIFNAME
++	FRA_GOTO,	/* target to jump to (FR_ACT_GOTO) */
++	FRA_UNUSED2,
++	FRA_PRIORITY,	/* priority/preference */
++	FRA_UNUSED3,
++	FRA_UNUSED4,
++	FRA_UNUSED5,
++	FRA_FWMARK,	/* mark */
++	FRA_FLOW,	/* flow/class id */
++	FRA_TUN_ID,
++	FRA_SUPPRESS_IFGROUP,
++	FRA_SUPPRESS_PREFIXLEN,
++	FRA_TABLE,	/* Extended table id */
++	FRA_FWMASK,	/* mask for netfilter mark */
++	FRA_OIFNAME,
++	FRA_PAD,
++	FRA_L3MDEV,	/* iif or oif is l3mdev goto its table */
++	FRA_UID_RANGE,	/* UID range */
++	__FRA_MAX
++};
++
++#define FRA_MAX (__FRA_MAX - 1)
++
++enum {
++	FR_ACT_UNSPEC,
++	FR_ACT_TO_TBL,		/* Pass to fixed table */
++	FR_ACT_GOTO,		/* Jump to another rule */
++	FR_ACT_NOP,		/* No operation */
++	FR_ACT_RES3,
++	FR_ACT_RES4,
++	FR_ACT_BLACKHOLE,	/* Drop without notification */
++	FR_ACT_UNREACHABLE,	/* Drop with ENETUNREACH */
++	FR_ACT_PROHIBIT,	/* Drop with EACCES */
++	__FR_ACT_MAX,
++};
++
++#define FR_ACT_MAX (__FR_ACT_MAX - 1)
++
++#endif
+diff --git a/include/uapi/linux/filter.h b/include/uapi/linux/filter.h
+new file mode 100644
+index 0000000..e4f2f74
+--- /dev/null
++++ b/include/uapi/linux/filter.h
+@@ -0,0 +1,89 @@
++/*
++ * Linux Socket Filter Data Structures
++ */
++
++#ifndef __LINUX_FILTER_H__
++#define __LINUX_FILTER_H__
++
++
++#include <linux/types.h>
++#include <linux/bpf_common.h>
++
++/*
++ * Current version of the filter code architecture.
++ */
++#define BPF_MAJOR_VERSION 1
++#define BPF_MINOR_VERSION 1
++
++/*
++ *	Try and keep these values and structures similar to BSD, especially
++ *	the BPF code definitions which need to match so you can share filters
++ */
++ 
++struct sock_filter {	/* Filter block */
++	__u16	code;   /* Actual filter code */
++	__u8	jt;	/* Jump true */
++	__u8	jf;	/* Jump false */
++	__u32	k;      /* Generic multiuse field */
++};
++
++struct sock_fprog {	/* Required for SO_ATTACH_FILTER. */
++	unsigned short		len;	/* Number of filter blocks */
++	struct sock_filter *filter;
++};
++
++/* ret - BPF_K and BPF_X also apply */
++#define BPF_RVAL(code)  ((code) & 0x18)
++#define         BPF_A           0x10
++
++/* misc */
++#define BPF_MISCOP(code) ((code) & 0xf8)
++#define         BPF_TAX         0x00
++#define         BPF_TXA         0x80
++
++/*
++ * Macros for filter block array initializers.
++ */
++#ifndef BPF_STMT
++#define BPF_STMT(code, k) { (unsigned short)(code), 0, 0, k }
++#endif
++#ifndef BPF_JUMP
++#define BPF_JUMP(code, k, jt, jf) { (unsigned short)(code), jt, jf, k }
++#endif
++
++/*
++ * Number of scratch memory words for: BPF_ST and BPF_STX
++ */
++#define BPF_MEMWORDS 16
++
++/* RATIONALE. Negative offsets are invalid in BPF.
++   We use them to reference ancillary data.
++   Unlike introduction new instructions, it does not break
++   existing compilers/optimizers.
++ */
++#define SKF_AD_OFF    (-0x1000)
++#define SKF_AD_PROTOCOL 0
++#define SKF_AD_PKTTYPE 	4
++#define SKF_AD_IFINDEX 	8
++#define SKF_AD_NLATTR	12
++#define SKF_AD_NLATTR_NEST	16
++#define SKF_AD_MARK 	20
++#define SKF_AD_QUEUE	24
++#define SKF_AD_HATYPE	28
++#define SKF_AD_RXHASH	32
++#define SKF_AD_CPU	36
++#define SKF_AD_ALU_XOR_X	40
++#define SKF_AD_VLAN_TAG	44
++#define SKF_AD_VLAN_TAG_PRESENT 48
++#define SKF_AD_PAY_OFFSET	52
++#define SKF_AD_RANDOM	56
++#define SKF_AD_VLAN_TPID	60
++#define SKF_AD_MAX	64
++
++#define SKF_NET_OFF	(-0x100000)
++#define SKF_LL_OFF	(-0x200000)
++
++#define BPF_NET_OFF	SKF_NET_OFF
++#define BPF_LL_OFF	SKF_LL_OFF
++
++#endif /* __LINUX_FILTER_H__ */
+diff --git a/include/uapi/linux/fou.h b/include/uapi/linux/fou.h
+new file mode 100644
+index 0000000..744c323
+--- /dev/null
++++ b/include/uapi/linux/fou.h
+@@ -0,0 +1,41 @@
++/* fou.h - FOU Interface */
++
++#ifndef _LINUX_FOU_H
++#define _LINUX_FOU_H
++
++/* NETLINK_GENERIC related info
++ */
++#define FOU_GENL_NAME		"fou"
++#define FOU_GENL_VERSION	0x1
++
++enum {
++	FOU_ATTR_UNSPEC,
++	FOU_ATTR_PORT,				/* u16 */
++	FOU_ATTR_AF,				/* u8 */
++	FOU_ATTR_IPPROTO,			/* u8 */
++	FOU_ATTR_TYPE,				/* u8 */
++	FOU_ATTR_REMCSUM_NOPARTIAL,		/* flag */
++
++	__FOU_ATTR_MAX,
++};
++
++#define FOU_ATTR_MAX		(__FOU_ATTR_MAX - 1)
++
++enum {
++	FOU_CMD_UNSPEC,
++	FOU_CMD_ADD,
++	FOU_CMD_DEL,
++	FOU_CMD_GET,
++
++	__FOU_CMD_MAX,
++};
++
++enum {
++	FOU_ENCAP_UNSPEC,
++	FOU_ENCAP_DIRECT,
++	FOU_ENCAP_GUE,
++};
++
++#define FOU_CMD_MAX	(__FOU_CMD_MAX - 1)
++
++#endif /* _LINUX_FOU_H */
+diff --git a/include/uapi/linux/gen_stats.h b/include/uapi/linux/gen_stats.h
+new file mode 100644
+index 0000000..52deccc
+--- /dev/null
++++ b/include/uapi/linux/gen_stats.h
+@@ -0,0 +1,79 @@
++#ifndef __LINUX_GEN_STATS_H
++#define __LINUX_GEN_STATS_H
++
++#include <linux/types.h>
++
++enum {
++	TCA_STATS_UNSPEC,
++	TCA_STATS_BASIC,
++	TCA_STATS_RATE_EST,
++	TCA_STATS_QUEUE,
++	TCA_STATS_APP,
++	TCA_STATS_RATE_EST64,
++	TCA_STATS_PAD,
++	__TCA_STATS_MAX,
++};
++#define TCA_STATS_MAX (__TCA_STATS_MAX - 1)
++
++/**
++ * struct gnet_stats_basic - byte/packet throughput statistics
++ * @bytes: number of seen bytes
++ * @packets: number of seen packets
++ */
++struct gnet_stats_basic {
++	__u64	bytes;
++	__u32	packets;
++};
++struct gnet_stats_basic_packed {
++	__u64	bytes;
++	__u32	packets;
++} __attribute__ ((packed));
++
++/**
++ * struct gnet_stats_rate_est - rate estimator
++ * @bps: current byte rate
++ * @pps: current packet rate
++ */
++struct gnet_stats_rate_est {
++	__u32	bps;
++	__u32	pps;
++};
++
++/**
++ * struct gnet_stats_rate_est64 - rate estimator
++ * @bps: current byte rate
++ * @pps: current packet rate
++ */
++struct gnet_stats_rate_est64 {
++	__u64	bps;
++	__u64	pps;
++};
++
++/**
++ * struct gnet_stats_queue - queuing statistics
++ * @qlen: queue length
++ * @backlog: backlog size of queue
++ * @drops: number of dropped packets
++ * @requeues: number of requeues
++ * @overlimits: number of enqueues over the limit
++ */
++struct gnet_stats_queue {
++	__u32	qlen;
++	__u32	backlog;
++	__u32	drops;
++	__u32	requeues;
++	__u32	overlimits;
++};
++
++/**
++ * struct gnet_estimator - rate estimator configuration
++ * @interval: sampling period
++ * @ewma_log: the log of measurement window weight
++ */
++struct gnet_estimator {
++	signed char	interval;
++	unsigned char	ewma_log;
++};
++
++
++#endif /* __LINUX_GEN_STATS_H */
+diff --git a/include/uapi/linux/genetlink.h b/include/uapi/linux/genetlink.h
+new file mode 100644
+index 0000000..08239d8
+--- /dev/null
++++ b/include/uapi/linux/genetlink.h
+@@ -0,0 +1,88 @@
++#ifndef __LINUX_GENERIC_NETLINK_H
++#define __LINUX_GENERIC_NETLINK_H
++
++#include <linux/types.h>
++#include <linux/netlink.h>
++
++#define GENL_NAMSIZ	16	/* length of family name */
++
++#define GENL_MIN_ID	NLMSG_MIN_TYPE
++#define GENL_MAX_ID	1023
++
++struct genlmsghdr {
++	__u8	cmd;
++	__u8	version;
++	__u16	reserved;
++};
++
++#define GENL_HDRLEN	NLMSG_ALIGN(sizeof(struct genlmsghdr))
++
++#define GENL_ADMIN_PERM		0x01
++#define GENL_CMD_CAP_DO		0x02
++#define GENL_CMD_CAP_DUMP	0x04
++#define GENL_CMD_CAP_HASPOL	0x08
++#define GENL_UNS_ADMIN_PERM	0x10
++
++/*
++ * List of reserved static generic netlink identifiers:
++ */
++#define GENL_ID_CTRL		NLMSG_MIN_TYPE
++#define GENL_ID_VFS_DQUOT	(NLMSG_MIN_TYPE + 1)
++#define GENL_ID_PMCRAID		(NLMSG_MIN_TYPE + 2)
++/* must be last reserved + 1 */
++#define GENL_START_ALLOC	(NLMSG_MIN_TYPE + 3)
++
++/**************************************************************************
++ * Controller
++ **************************************************************************/
++
++enum {
++	CTRL_CMD_UNSPEC,
++	CTRL_CMD_NEWFAMILY,
++	CTRL_CMD_DELFAMILY,
++	CTRL_CMD_GETFAMILY,
++	CTRL_CMD_NEWOPS,
++	CTRL_CMD_DELOPS,
++	CTRL_CMD_GETOPS,
++	CTRL_CMD_NEWMCAST_GRP,
++	CTRL_CMD_DELMCAST_GRP,
++	CTRL_CMD_GETMCAST_GRP, /* unused */
++	__CTRL_CMD_MAX,
++};
++
++#define CTRL_CMD_MAX (__CTRL_CMD_MAX - 1)
++
++enum {
++	CTRL_ATTR_UNSPEC,
++	CTRL_ATTR_FAMILY_ID,
++	CTRL_ATTR_FAMILY_NAME,
++	CTRL_ATTR_VERSION,
++	CTRL_ATTR_HDRSIZE,
++	CTRL_ATTR_MAXATTR,
++	CTRL_ATTR_OPS,
++	CTRL_ATTR_MCAST_GROUPS,
++	__CTRL_ATTR_MAX,
++};
++
++#define CTRL_ATTR_MAX (__CTRL_ATTR_MAX - 1)
++
++enum {
++	CTRL_ATTR_OP_UNSPEC,
++	CTRL_ATTR_OP_ID,
++	CTRL_ATTR_OP_FLAGS,
++	__CTRL_ATTR_OP_MAX,
++};
++
++#define CTRL_ATTR_OP_MAX (__CTRL_ATTR_OP_MAX - 1)
++
++enum {
++	CTRL_ATTR_MCAST_GRP_UNSPEC,
++	CTRL_ATTR_MCAST_GRP_NAME,
++	CTRL_ATTR_MCAST_GRP_ID,
++	__CTRL_ATTR_MCAST_GRP_MAX,
++};
++
++#define CTRL_ATTR_MCAST_GRP_MAX (__CTRL_ATTR_MCAST_GRP_MAX - 1)
++
++
++#endif /* __LINUX_GENERIC_NETLINK_H */
+diff --git a/include/uapi/linux/hdlc/ioctl.h b/include/uapi/linux/hdlc/ioctl.h
+new file mode 100644
+index 0000000..04bc027
+--- /dev/null
++++ b/include/uapi/linux/hdlc/ioctl.h
+@@ -0,0 +1,84 @@
++#ifndef __HDLC_IOCTL_H__
++#define __HDLC_IOCTL_H__
++
++
++#define GENERIC_HDLC_VERSION 4	/* For synchronization with sethdlc utility */
++
++#define CLOCK_DEFAULT   0	/* Default setting */
++#define CLOCK_EXT	1	/* External TX and RX clock - DTE */
++#define CLOCK_INT	2	/* Internal TX and RX clock - DCE */
++#define CLOCK_TXINT	3	/* Internal TX and external RX clock */
++#define CLOCK_TXFROMRX	4	/* TX clock derived from external RX clock */
++
++
++#define ENCODING_DEFAULT	0 /* Default setting */
++#define ENCODING_NRZ		1
++#define ENCODING_NRZI		2
++#define ENCODING_FM_MARK	3
++#define ENCODING_FM_SPACE	4
++#define ENCODING_MANCHESTER	5
++
++
++#define PARITY_DEFAULT		0 /* Default setting */
++#define PARITY_NONE		1 /* No parity */
++#define PARITY_CRC16_PR0	2 /* CRC16, initial value 0x0000 */
++#define PARITY_CRC16_PR1	3 /* CRC16, initial value 0xFFFF */
++#define PARITY_CRC16_PR0_CCITT	4 /* CRC16, initial 0x0000, ITU-T version */
++#define PARITY_CRC16_PR1_CCITT	5 /* CRC16, initial 0xFFFF, ITU-T version */
++#define PARITY_CRC32_PR0_CCITT	6 /* CRC32, initial value 0x00000000 */
++#define PARITY_CRC32_PR1_CCITT	7 /* CRC32, initial value 0xFFFFFFFF */
++
++#define LMI_DEFAULT		0 /* Default setting */
++#define LMI_NONE		1 /* No LMI, all PVCs are static */
++#define LMI_ANSI		2 /* ANSI Annex D */
++#define LMI_CCITT		3 /* ITU-T Annex A */
++#define LMI_CISCO		4 /* The "original" LMI, aka Gang of Four */
++
++#ifndef __ASSEMBLY__
++
++typedef struct {
++	unsigned int clock_rate; /* bits per second */
++	unsigned int clock_type; /* internal, external, TX-internal etc. */
++	unsigned short loopback;
++} sync_serial_settings;          /* V.35, V.24, X.21 */
++
++typedef struct {
++	unsigned int clock_rate; /* bits per second */
++	unsigned int clock_type; /* internal, external, TX-internal etc. */
++	unsigned short loopback;
++	unsigned int slot_map;
++} te1_settings;                  /* T1, E1 */
++
++typedef struct {
++	unsigned short encoding;
++	unsigned short parity;
++} raw_hdlc_proto;
++
++typedef struct {
++	unsigned int t391;
++	unsigned int t392;
++	unsigned int n391;
++	unsigned int n392;
++	unsigned int n393;
++	unsigned short lmi;
++	unsigned short dce; /* 1 for DCE (network side) operation */
++} fr_proto;
++
++typedef struct {
++	unsigned int dlci;
++} fr_proto_pvc;          /* for creating/deleting FR PVCs */
++
++typedef struct {
++	unsigned int dlci;
++	char master[IFNAMSIZ];	/* Name of master FRAD device */
++}fr_proto_pvc_info;		/* for returning PVC information only */
++
++typedef struct {
++    unsigned int interval;
++    unsigned int timeout;
++} cisco_proto;
++
++/* PPP doesn't need any info now - supply length = 0 to ioctl */
++
++#endif /* __ASSEMBLY__ */
++#endif /* __HDLC_IOCTL_H__ */
+diff --git a/include/uapi/linux/icmpv6.h b/include/uapi/linux/icmpv6.h
+new file mode 100644
+index 0000000..a2e839e
+--- /dev/null
++++ b/include/uapi/linux/icmpv6.h
+@@ -0,0 +1,166 @@
++#ifndef _LINUX_ICMPV6_H
++#define _LINUX_ICMPV6_H
++
++#include <linux/types.h>
++#include <asm/byteorder.h>
++
++struct icmp6hdr {
++
++	__u8		icmp6_type;
++	__u8		icmp6_code;
++	__sum16		icmp6_cksum;
++
++
++	union {
++		__be32			un_data32[1];
++		__be16			un_data16[2];
++		__u8			un_data8[4];
++
++		struct icmpv6_echo {
++			__be16		identifier;
++			__be16		sequence;
++		} u_echo;
++
++                struct icmpv6_nd_advt {
++#if defined(__LITTLE_ENDIAN_BITFIELD)
++                        __u32		reserved:5,
++                        		override:1,
++                        		solicited:1,
++                        		router:1,
++					reserved2:24;
++#elif defined(__BIG_ENDIAN_BITFIELD)
++                        __u32		router:1,
++					solicited:1,
++                        		override:1,
++                        		reserved:29;
++#else
++#error	"Please fix <asm/byteorder.h>"
++#endif						
++                } u_nd_advt;
++
++                struct icmpv6_nd_ra {
++			__u8		hop_limit;
++#if defined(__LITTLE_ENDIAN_BITFIELD)
++			__u8		reserved:3,
++					router_pref:2,
++					home_agent:1,
++					other:1,
++					managed:1;
++
++#elif defined(__BIG_ENDIAN_BITFIELD)
++			__u8		managed:1,
++					other:1,
++					home_agent:1,
++					router_pref:2,
++					reserved:3;
++#else
++#error	"Please fix <asm/byteorder.h>"
++#endif
++			__be16		rt_lifetime;
++                } u_nd_ra;
++
++	} icmp6_dataun;
++
++#define icmp6_identifier	icmp6_dataun.u_echo.identifier
++#define icmp6_sequence		icmp6_dataun.u_echo.sequence
++#define icmp6_pointer		icmp6_dataun.un_data32[0]
++#define icmp6_mtu		icmp6_dataun.un_data32[0]
++#define icmp6_unused		icmp6_dataun.un_data32[0]
++#define icmp6_maxdelay		icmp6_dataun.un_data16[0]
++#define icmp6_router		icmp6_dataun.u_nd_advt.router
++#define icmp6_solicited		icmp6_dataun.u_nd_advt.solicited
++#define icmp6_override		icmp6_dataun.u_nd_advt.override
++#define icmp6_ndiscreserved	icmp6_dataun.u_nd_advt.reserved
++#define icmp6_hop_limit		icmp6_dataun.u_nd_ra.hop_limit
++#define icmp6_addrconf_managed	icmp6_dataun.u_nd_ra.managed
++#define icmp6_addrconf_other	icmp6_dataun.u_nd_ra.other
++#define icmp6_rt_lifetime	icmp6_dataun.u_nd_ra.rt_lifetime
++#define icmp6_router_pref	icmp6_dataun.u_nd_ra.router_pref
++};
++
++
++#define ICMPV6_ROUTER_PREF_LOW		0x3
++#define ICMPV6_ROUTER_PREF_MEDIUM	0x0
++#define ICMPV6_ROUTER_PREF_HIGH		0x1
++#define ICMPV6_ROUTER_PREF_INVALID	0x2
++
++#define ICMPV6_DEST_UNREACH		1
++#define ICMPV6_PKT_TOOBIG		2
++#define ICMPV6_TIME_EXCEED		3
++#define ICMPV6_PARAMPROB		4
++
++#define ICMPV6_INFOMSG_MASK		0x80
++
++#define ICMPV6_ECHO_REQUEST		128
++#define ICMPV6_ECHO_REPLY		129
++#define ICMPV6_MGM_QUERY		130
++#define ICMPV6_MGM_REPORT       	131
++#define ICMPV6_MGM_REDUCTION    	132
++
++#define ICMPV6_NI_QUERY			139
++#define ICMPV6_NI_REPLY			140
++
++#define ICMPV6_MLD2_REPORT		143
++
++#define ICMPV6_DHAAD_REQUEST		144
++#define ICMPV6_DHAAD_REPLY		145
++#define ICMPV6_MOBILE_PREFIX_SOL	146
++#define ICMPV6_MOBILE_PREFIX_ADV	147
++
++/*
++ *	Codes for Destination Unreachable
++ */
++#define ICMPV6_NOROUTE			0
++#define ICMPV6_ADM_PROHIBITED		1
++#define ICMPV6_NOT_NEIGHBOUR		2
++#define ICMPV6_ADDR_UNREACH		3
++#define ICMPV6_PORT_UNREACH		4
++#define ICMPV6_POLICY_FAIL		5
++#define ICMPV6_REJECT_ROUTE		6
++
++/*
++ *	Codes for Time Exceeded
++ */
++#define ICMPV6_EXC_HOPLIMIT		0
++#define ICMPV6_EXC_FRAGTIME		1
++
++/*
++ *	Codes for Parameter Problem
++ */
++#define ICMPV6_HDR_FIELD		0
++#define ICMPV6_UNK_NEXTHDR		1
++#define ICMPV6_UNK_OPTION		2
++
++/*
++ *	constants for (set|get)sockopt
++ */
++
++#define ICMPV6_FILTER			1
++
++/*
++ *	ICMPV6 filter
++ */
++
++#define ICMPV6_FILTER_BLOCK		1
++#define ICMPV6_FILTER_PASS		2
++#define ICMPV6_FILTER_BLOCKOTHERS	3
++#define ICMPV6_FILTER_PASSONLY		4
++
++struct icmp6_filter {
++	__u32		data[8];
++};
++
++/*
++ *	Definitions for MLDv2
++ */
++#define MLD2_MODE_IS_INCLUDE	1
++#define MLD2_MODE_IS_EXCLUDE	2
++#define MLD2_CHANGE_TO_INCLUDE	3
++#define MLD2_CHANGE_TO_EXCLUDE	4
++#define MLD2_ALLOW_NEW_SOURCES	5
++#define MLD2_BLOCK_OLD_SOURCES	6
++
++#define MLD2_ALL_MCR_INIT { { { 0xff,0x02,0,0,0,0,0,0,0,0,0,0,0,0,0,0x16 } } }
++
++
++#endif /* _LINUX_ICMPV6_H */
+diff --git a/include/uapi/linux/if.h b/include/uapi/linux/if.h
+new file mode 100644
+index 0000000..b4ba020
+--- /dev/null
++++ b/include/uapi/linux/if.h
+@@ -0,0 +1,292 @@
++/*
++ * INET		An implementation of the TCP/IP protocol suite for the LINUX
++ *		operating system.  INET is implemented using the  BSD Socket
++ *		interface as the means of communication with the user level.
++ *
++ *		Global definitions for the INET interface module.
++ *
++ * Version:	@(#)if.h	1.0.2	04/18/93
++ *
++ * Authors:	Original taken from Berkeley UNIX 4.3, (c) UCB 1982-1988
++ *		Ross Biro
++ *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
++ *
++ *		This program is free software; you can redistribute it and/or
++ *		modify it under the terms of the GNU General Public License
++ *		as published by the Free Software Foundation; either version
++ *		2 of the License, or (at your option) any later version.
++ */
++#ifndef _LINUX_IF_H
++#define _LINUX_IF_H
++
++#include <linux/libc-compat.h>          /* for compatibility with glibc */
++#include <linux/types.h>		/* for "__kernel_caddr_t" et al	*/
++#include <linux/socket.h>		/* for "struct sockaddr" et al	*/
++		/* for "__user" et al           */
++
++#include <sys/socket.h>			/* for struct sockaddr.		*/
++
++#if __UAPI_DEF_IF_IFNAMSIZ
++#define	IFNAMSIZ	16
++#endif /* __UAPI_DEF_IF_IFNAMSIZ */
++#define	IFALIASZ	256
++#include <linux/hdlc/ioctl.h>
++
++/* For glibc compatibility. An empty enum does not compile. */
++#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 || \
++    __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0
++/**
++ * enum net_device_flags - &struct net_device flags
++ *
++ * These are the &struct net_device flags, they can be set by drivers, the
++ * kernel and some can be triggered by userspace. Userspace can query and
++ * set these flags using userspace utilities but there is also a sysfs
++ * entry available for all dev flags which can be queried and set. These flags
++ * are shared for all types of net_devices. The sysfs entries are available
++ * via /sys/class/net/<dev>/flags. Flags which can be toggled through sysfs
++ * are annotated below, note that only a few flags can be toggled and some
++ * other flags are always preserved from the original net_device flags
++ * even if you try to set them via sysfs. Flags which are always preserved
++ * are kept under the flag grouping @IFF_VOLATILE. Flags which are __volatile__
++ * are annotated below as such.
++ *
++ * You should have a pretty good reason to be extending these flags.
++ *
++ * @IFF_UP: interface is up. Can be toggled through sysfs.
++ * @IFF_BROADCAST: broadcast address valid. Volatile.
++ * @IFF_DEBUG: turn on debugging. Can be toggled through sysfs.
++ * @IFF_LOOPBACK: is a loopback net. Volatile.
++ * @IFF_POINTOPOINT: interface is has p-p link. Volatile.
++ * @IFF_NOTRAILERS: avoid use of trailers. Can be toggled through sysfs.
++ *	Volatile.
++ * @IFF_RUNNING: interface RFC2863 OPER_UP. Volatile.
++ * @IFF_NOARP: no ARP protocol. Can be toggled through sysfs. Volatile.
++ * @IFF_PROMISC: receive all packets. Can be toggled through sysfs.
++ * @IFF_ALLMULTI: receive all multicast packets. Can be toggled through
++ *	sysfs.
++ * @IFF_MASTER: master of a load balancer. Volatile.
++ * @IFF_SLAVE: slave of a load balancer. Volatile.
++ * @IFF_MULTICAST: Supports multicast. Can be toggled through sysfs.
++ * @IFF_PORTSEL: can set media type. Can be toggled through sysfs.
++ * @IFF_AUTOMEDIA: auto media select active. Can be toggled through sysfs.
++ * @IFF_DYNAMIC: dialup device with changing addresses. Can be toggled
++ *	through sysfs.
++ * @IFF_LOWER_UP: driver signals L1 up. Volatile.
++ * @IFF_DORMANT: driver signals dormant. Volatile.
++ * @IFF_ECHO: echo sent packets. Volatile.
++ */
++enum net_device_flags {
++/* for compatibility with glibc net/if.h */
++#if __UAPI_DEF_IF_NET_DEVICE_FLAGS
++	IFF_UP				= 1<<0,  /* sysfs */
++	IFF_BROADCAST			= 1<<1,  /* __volatile__ */
++	IFF_DEBUG			= 1<<2,  /* sysfs */
++	IFF_LOOPBACK			= 1<<3,  /* __volatile__ */
++	IFF_POINTOPOINT			= 1<<4,  /* __volatile__ */
++	IFF_NOTRAILERS			= 1<<5,  /* sysfs */
++	IFF_RUNNING			= 1<<6,  /* __volatile__ */
++	IFF_NOARP			= 1<<7,  /* sysfs */
++	IFF_PROMISC			= 1<<8,  /* sysfs */
++	IFF_ALLMULTI			= 1<<9,  /* sysfs */
++	IFF_MASTER			= 1<<10, /* __volatile__ */
++	IFF_SLAVE			= 1<<11, /* __volatile__ */
++	IFF_MULTICAST			= 1<<12, /* sysfs */
++	IFF_PORTSEL			= 1<<13, /* sysfs */
++	IFF_AUTOMEDIA			= 1<<14, /* sysfs */
++	IFF_DYNAMIC			= 1<<15, /* sysfs */
++#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS */
++#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO
++	IFF_LOWER_UP			= 1<<16, /* __volatile__ */
++	IFF_DORMANT			= 1<<17, /* __volatile__ */
++	IFF_ECHO			= 1<<18, /* __volatile__ */
++#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */
++};
++#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 || __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0 */
++
++/* for compatibility with glibc net/if.h */
++#if __UAPI_DEF_IF_NET_DEVICE_FLAGS
++#define IFF_UP				IFF_UP
++#define IFF_BROADCAST			IFF_BROADCAST
++#define IFF_DEBUG			IFF_DEBUG
++#define IFF_LOOPBACK			IFF_LOOPBACK
++#define IFF_POINTOPOINT			IFF_POINTOPOINT
++#define IFF_NOTRAILERS			IFF_NOTRAILERS
++#define IFF_RUNNING			IFF_RUNNING
++#define IFF_NOARP			IFF_NOARP
++#define IFF_PROMISC			IFF_PROMISC
++#define IFF_ALLMULTI			IFF_ALLMULTI
++#define IFF_MASTER			IFF_MASTER
++#define IFF_SLAVE			IFF_SLAVE
++#define IFF_MULTICAST			IFF_MULTICAST
++#define IFF_PORTSEL			IFF_PORTSEL
++#define IFF_AUTOMEDIA			IFF_AUTOMEDIA
++#define IFF_DYNAMIC			IFF_DYNAMIC
++#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS */
++
++#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO
++#define IFF_LOWER_UP			IFF_LOWER_UP
++#define IFF_DORMANT			IFF_DORMANT
++#define IFF_ECHO			IFF_ECHO
++#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */
++
++#define IFF_VOLATILE	(IFF_LOOPBACK|IFF_POINTOPOINT|IFF_BROADCAST|IFF_ECHO|\
++		IFF_MASTER|IFF_SLAVE|IFF_RUNNING|IFF_LOWER_UP|IFF_DORMANT)
++
++#define IF_GET_IFACE	0x0001		/* for querying only */
++#define IF_GET_PROTO	0x0002
++
++/* For definitions see hdlc.h */
++#define IF_IFACE_V35	0x1000		/* V.35 serial interface	*/
++#define IF_IFACE_V24	0x1001		/* V.24 serial interface	*/
++#define IF_IFACE_X21	0x1002		/* X.21 serial interface	*/
++#define IF_IFACE_T1	0x1003		/* T1 telco serial interface	*/
++#define IF_IFACE_E1	0x1004		/* E1 telco serial interface	*/
++#define IF_IFACE_SYNC_SERIAL 0x1005	/* can't be set by software	*/
++#define IF_IFACE_X21D   0x1006          /* X.21 Dual Clocking (FarSite) */
++
++/* For definitions see hdlc.h */
++#define IF_PROTO_HDLC	0x2000		/* raw HDLC protocol		*/
++#define IF_PROTO_PPP	0x2001		/* PPP protocol			*/
++#define IF_PROTO_CISCO	0x2002		/* Cisco HDLC protocol		*/
++#define IF_PROTO_FR	0x2003		/* Frame Relay protocol		*/
++#define IF_PROTO_FR_ADD_PVC 0x2004	/*    Create FR PVC		*/
++#define IF_PROTO_FR_DEL_PVC 0x2005	/*    Delete FR PVC		*/
++#define IF_PROTO_X25	0x2006		/* X.25				*/
++#define IF_PROTO_HDLC_ETH 0x2007	/* raw HDLC, Ethernet emulation	*/
++#define IF_PROTO_FR_ADD_ETH_PVC 0x2008	/*  Create FR Ethernet-bridged PVC */
++#define IF_PROTO_FR_DEL_ETH_PVC 0x2009	/*  Delete FR Ethernet-bridged PVC */
++#define IF_PROTO_FR_PVC	0x200A		/* for reading PVC status	*/
++#define IF_PROTO_FR_ETH_PVC 0x200B
++#define IF_PROTO_RAW    0x200C          /* RAW Socket                   */
++
++/* RFC 2863 operational status */
++enum {
++	IF_OPER_UNKNOWN,
++	IF_OPER_NOTPRESENT,
++	IF_OPER_DOWN,
++	IF_OPER_LOWERLAYERDOWN,
++	IF_OPER_TESTING,
++	IF_OPER_DORMANT,
++	IF_OPER_UP,
++};
++
++/* link modes */
++enum {
++	IF_LINK_MODE_DEFAULT,
++	IF_LINK_MODE_DORMANT,	/* limit upward transition to dormant */
++};
++
++/*
++ *	Device mapping structure. I'd just gone off and designed a 
++ *	beautiful scheme using only loadable modules with arguments
++ *	for driver options and along come the PCMCIA people 8)
++ *
++ *	Ah well. The get() side of this is good for WDSETUP, and it'll
++ *	be handy for debugging things. The set side is fine for now and
++ *	being very small might be worth keeping for clean configuration.
++ */
++
++/* for compatibility with glibc net/if.h */
++#if __UAPI_DEF_IF_IFMAP
++struct ifmap {
++	unsigned long mem_start;
++	unsigned long mem_end;
++	unsigned short base_addr; 
++	unsigned char irq;
++	unsigned char dma;
++	unsigned char port;
++	/* 3 bytes spare */
++};
++#endif /* __UAPI_DEF_IF_IFMAP */
++
++struct if_settings {
++	unsigned int type;	/* Type of physical device or protocol */
++	unsigned int size;	/* Size of the data allocated by the caller */
++	union {
++		/* {atm/eth/dsl}_settings anyone ? */
++		raw_hdlc_proto		*raw_hdlc;
++		cisco_proto		*cisco;
++		fr_proto		*fr;
++		fr_proto_pvc		*fr_pvc;
++		fr_proto_pvc_info	*fr_pvc_info;
++
++		/* interface settings */
++		sync_serial_settings	*sync;
++		te1_settings		*te1;
++	} ifs_ifsu;
++};
++
++/*
++ * Interface request structure used for socket
++ * ioctl's.  All interface ioctl's must have parameter
++ * definitions which begin with ifr_name.  The
++ * remainder may be interface specific.
++ */
++
++/* for compatibility with glibc net/if.h */
++#if __UAPI_DEF_IF_IFREQ
++struct ifreq {
++#define IFHWADDRLEN	6
++	union
++	{
++		char	ifrn_name[IFNAMSIZ];		/* if name, e.g. "en0" */
++	} ifr_ifrn;
++	
++	union {
++		struct	sockaddr ifru_addr;
++		struct	sockaddr ifru_dstaddr;
++		struct	sockaddr ifru_broadaddr;
++		struct	sockaddr ifru_netmask;
++		struct  sockaddr ifru_hwaddr;
++		short	ifru_flags;
++		int	ifru_ivalue;
++		int	ifru_mtu;
++		struct  ifmap ifru_map;
++		char	ifru_slave[IFNAMSIZ];	/* Just fits the size */
++		char	ifru_newname[IFNAMSIZ];
++		void *	ifru_data;
++		struct	if_settings ifru_settings;
++	} ifr_ifru;
++};
++#endif /* __UAPI_DEF_IF_IFREQ */
++
++#define ifr_name	ifr_ifrn.ifrn_name	/* interface name 	*/
++#define ifr_hwaddr	ifr_ifru.ifru_hwaddr	/* MAC address 		*/
++#define	ifr_addr	ifr_ifru.ifru_addr	/* address		*/
++#define	ifr_dstaddr	ifr_ifru.ifru_dstaddr	/* other end of p-p lnk	*/
++#define	ifr_broadaddr	ifr_ifru.ifru_broadaddr	/* broadcast address	*/
++#define	ifr_netmask	ifr_ifru.ifru_netmask	/* interface net mask	*/
++#define	ifr_flags	ifr_ifru.ifru_flags	/* flags		*/
++#define	ifr_metric	ifr_ifru.ifru_ivalue	/* metric		*/
++#define	ifr_mtu		ifr_ifru.ifru_mtu	/* mtu			*/
++#define ifr_map		ifr_ifru.ifru_map	/* device map		*/
++#define ifr_slave	ifr_ifru.ifru_slave	/* slave device		*/
++#define	ifr_data	ifr_ifru.ifru_data	/* for use by interface	*/
++#define ifr_ifindex	ifr_ifru.ifru_ivalue	/* interface index	*/
++#define ifr_bandwidth	ifr_ifru.ifru_ivalue    /* link bandwidth	*/
++#define ifr_qlen	ifr_ifru.ifru_ivalue	/* Queue length 	*/
++#define ifr_newname	ifr_ifru.ifru_newname	/* New name		*/
++#define ifr_settings	ifr_ifru.ifru_settings	/* Device/proto settings*/
++
++/*
++ * Structure used in SIOCGIFCONF request.
++ * Used to retrieve interface configuration
++ * for machine (useful for programs which
++ * must know all networks accessible).
++ */
++
++/* for compatibility with glibc net/if.h */
++#if __UAPI_DEF_IF_IFCONF
++struct ifconf  {
++	int	ifc_len;			/* size of buffer	*/
++	union {
++		char *ifcu_buf;
++		struct ifreq *ifcu_req;
++	} ifc_ifcu;
++};
++#endif /* __UAPI_DEF_IF_IFCONF */
++
++#define	ifc_buf	ifc_ifcu.ifcu_buf		/* buffer address	*/
++#define	ifc_req	ifc_ifcu.ifcu_req		/* array of structures	*/
++
++#endif /* _LINUX_IF_H */
+diff --git a/include/uapi/linux/if_addr.h b/include/uapi/linux/if_addr.h
+new file mode 100644
+index 0000000..26f0ecf
+--- /dev/null
++++ b/include/uapi/linux/if_addr.h
+@@ -0,0 +1,67 @@
++#ifndef __LINUX_IF_ADDR_H
++#define __LINUX_IF_ADDR_H
++
++#include <linux/types.h>
++#include <linux/netlink.h>
++
++struct ifaddrmsg {
++	__u8		ifa_family;
++	__u8		ifa_prefixlen;	/* The prefix length		*/
++	__u8		ifa_flags;	/* Flags			*/
++	__u8		ifa_scope;	/* Address scope		*/
++	__u32		ifa_index;	/* Link index			*/
++};
++
++/*
++ * Important comment:
++ * IFA_ADDRESS is prefix address, rather than local interface address.
++ * It makes no difference for normally configured broadcast interfaces,
++ * but for point-to-point IFA_ADDRESS is DESTINATION address,
++ * local address is supplied in IFA_LOCAL attribute.
++ *
++ * IFA_FLAGS is a u32 attribute that extends the u8 field ifa_flags.
++ * If present, the value from struct ifaddrmsg will be ignored.
++ */
++enum {
++	IFA_UNSPEC,
++	IFA_ADDRESS,
++	IFA_LOCAL,
++	IFA_LABEL,
++	IFA_BROADCAST,
++	IFA_ANYCAST,
++	IFA_CACHEINFO,
++	IFA_MULTICAST,
++	IFA_FLAGS,
++	__IFA_MAX,
++};
++
++#define IFA_MAX (__IFA_MAX - 1)
++
++/* ifa_flags */
++#define IFA_F_SECONDARY		0x01
++#define IFA_F_TEMPORARY		IFA_F_SECONDARY
++
++#define	IFA_F_NODAD		0x02
++#define IFA_F_OPTIMISTIC	0x04
++#define IFA_F_DADFAILED		0x08
++#define	IFA_F_HOMEADDRESS	0x10
++#define IFA_F_DEPRECATED	0x20
++#define IFA_F_TENTATIVE		0x40
++#define IFA_F_PERMANENT		0x80
++#define IFA_F_MANAGETEMPADDR	0x100
++#define IFA_F_NOPREFIXROUTE	0x200
++#define IFA_F_MCAUTOJOIN	0x400
++#define IFA_F_STABLE_PRIVACY	0x800
++
++struct ifa_cacheinfo {
++	__u32	ifa_prefered;
++	__u32	ifa_valid;
++	__u32	cstamp; /* created timestamp, hundredths of seconds */
++	__u32	tstamp; /* updated timestamp, hundredths of seconds */
++};
++
++/* backwards compatibility for userspace */
++#define IFA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg))))
++#define IFA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifaddrmsg))
++
++#endif
+diff --git a/include/uapi/linux/if_addrlabel.h b/include/uapi/linux/if_addrlabel.h
+new file mode 100644
+index 0000000..54580c2
+--- /dev/null
++++ b/include/uapi/linux/if_addrlabel.h
+@@ -0,0 +1,32 @@
++/*
++ * if_addrlabel.h - netlink interface for address labels
++ *
++ * Copyright (C)2007 USAGI/WIDE Project,  All Rights Reserved.
++ *
++ * Authors:
++ *	YOSHIFUJI Hideaki @ USAGI/WIDE <yoshfuji@linux-ipv6.org>
++ */
++
++#ifndef __LINUX_IF_ADDRLABEL_H
++#define __LINUX_IF_ADDRLABEL_H
++
++#include <linux/types.h>
++
++struct ifaddrlblmsg {
++	__u8		ifal_family;		/* Address family */
++	__u8		__ifal_reserved;	/* Reserved */
++	__u8		ifal_prefixlen;		/* Prefix length */
++	__u8		ifal_flags;		/* Flags */
++	__u32		ifal_index;		/* Link index */
++	__u32		ifal_seq;		/* sequence number */
++};
++
++enum {
++	IFAL_ADDRESS = 1,
++	IFAL_LABEL = 2,
++	__IFAL_MAX
++};
++
++#define IFAL_MAX	(__IFAL_MAX - 1)
++
++#endif
+diff --git a/include/uapi/linux/if_alg.h b/include/uapi/linux/if_alg.h
+new file mode 100644
+index 0000000..f2acd2f
+--- /dev/null
++++ b/include/uapi/linux/if_alg.h
+@@ -0,0 +1,42 @@
++/*
++ * if_alg: User-space algorithm interface
++ *
++ * Copyright (c) 2010 Herbert Xu <herbert@gondor.apana.org.au>
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the Free
++ * Software Foundation; either version 2 of the License, or (at your option)
++ * any later version.
++ *
++ */
++
++#ifndef _LINUX_IF_ALG_H
++#define _LINUX_IF_ALG_H
++
++#include <linux/types.h>
++
++struct sockaddr_alg {
++	__u16	salg_family;
++	__u8	salg_type[14];
++	__u32	salg_feat;
++	__u32	salg_mask;
++	__u8	salg_name[64];
++};
++
++struct af_alg_iv {
++	__u32	ivlen;
++	__u8	iv[0];
++};
++
++/* Socket options */
++#define ALG_SET_KEY			1
++#define ALG_SET_IV			2
++#define ALG_SET_OP			3
++#define ALG_SET_AEAD_ASSOCLEN		4
++#define ALG_SET_AEAD_AUTHSIZE		5
++
++/* Operations */
++#define ALG_OP_DECRYPT			0
++#define ALG_OP_ENCRYPT			1
++
++#endif	/* _LINUX_IF_ALG_H */
+diff --git a/include/uapi/linux/if_arp.h b/include/uapi/linux/if_arp.h
+new file mode 100644
+index 0000000..199f253
+--- /dev/null
++++ b/include/uapi/linux/if_arp.h
+@@ -0,0 +1,163 @@
++/*
++ * INET		An implementation of the TCP/IP protocol suite for the LINUX
++ *		operating system.  INET is implemented using the  BSD Socket
++ *		interface as the means of communication with the user level.
++ *
++ *		Global definitions for the ARP (RFC 826) protocol.
++ *
++ * Version:	@(#)if_arp.h	1.0.1	04/16/93
++ *
++ * Authors:	Original taken from Berkeley UNIX 4.3, (c) UCB 1986-1988
++ *		Portions taken from the KA9Q/NOS (v2.00m PA0GRI) source.
++ *		Ross Biro
++ *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
++ *		Florian La Roche,
++ *		Jonathan Layes <layes@loran.com>
++ *		Arnaldo Carvalho de Melo <acme@conectiva.com.br> ARPHRD_HWX25
++ *
++ *		This program is free software; you can redistribute it and/or
++ *		modify it under the terms of the GNU General Public License
++ *		as published by the Free Software Foundation; either version
++ *		2 of the License, or (at your option) any later version.
++ */
++#ifndef _LINUX_IF_ARP_H
++#define _LINUX_IF_ARP_H
++
++#include <linux/netdevice.h>
++
++/* ARP protocol HARDWARE identifiers. */
++#define ARPHRD_NETROM	0		/* from KA9Q: NET/ROM pseudo	*/
++#define ARPHRD_ETHER 	1		/* Ethernet 10Mbps		*/
++#define	ARPHRD_EETHER	2		/* Experimental Ethernet	*/
++#define	ARPHRD_AX25	3		/* AX.25 Level 2		*/
++#define	ARPHRD_PRONET	4		/* PROnet token ring		*/
++#define	ARPHRD_CHAOS	5		/* Chaosnet			*/
++#define	ARPHRD_IEEE802	6		/* IEEE 802.2 Ethernet/TR/TB	*/
++#define	ARPHRD_ARCNET	7		/* ARCnet			*/
++#define	ARPHRD_APPLETLK	8		/* APPLEtalk			*/
++#define ARPHRD_DLCI	15		/* Frame Relay DLCI		*/
++#define ARPHRD_ATM	19		/* ATM 				*/
++#define ARPHRD_METRICOM	23		/* Metricom STRIP (new IANA id)	*/
++#define	ARPHRD_IEEE1394	24		/* IEEE 1394 IPv4 - RFC 2734	*/
++#define ARPHRD_EUI64	27		/* EUI-64                       */
++#define ARPHRD_INFINIBAND 32		/* InfiniBand			*/
++
++/* Dummy types for non ARP hardware */
++#define ARPHRD_SLIP	256
++#define ARPHRD_CSLIP	257
++#define ARPHRD_SLIP6	258
++#define ARPHRD_CSLIP6	259
++#define ARPHRD_RSRVD	260		/* Notional KISS type 		*/
++#define ARPHRD_ADAPT	264
++#define ARPHRD_ROSE	270
++#define ARPHRD_X25	271		/* CCITT X.25			*/
++#define ARPHRD_HWX25	272		/* Boards with X.25 in firmware	*/
++#define ARPHRD_CAN	280		/* Controller Area Network      */
++#define ARPHRD_PPP	512
++#define ARPHRD_CISCO	513		/* Cisco HDLC	 		*/
++#define ARPHRD_HDLC	ARPHRD_CISCO
++#define ARPHRD_LAPB	516		/* LAPB				*/
++#define ARPHRD_DDCMP    517		/* Digital's DDCMP protocol     */
++#define ARPHRD_RAWHDLC	518		/* Raw HDLC			*/
++#define ARPHRD_RAWIP    519		/* Raw IP                       */
++
++#define ARPHRD_TUNNEL	768		/* IPIP tunnel			*/
++#define ARPHRD_TUNNEL6	769		/* IP6IP6 tunnel       		*/
++#define ARPHRD_FRAD	770             /* Frame Relay Access Device    */
++#define ARPHRD_SKIP	771		/* SKIP vif			*/
++#define ARPHRD_LOOPBACK	772		/* Loopback device		*/
++#define ARPHRD_LOCALTLK 773		/* Localtalk device		*/
++#define ARPHRD_FDDI	774		/* Fiber Distributed Data Interface */
++#define ARPHRD_BIF      775             /* AP1000 BIF                   */
++#define ARPHRD_SIT	776		/* sit0 device - IPv6-in-IPv4	*/
++#define ARPHRD_IPDDP	777		/* IP over DDP tunneller	*/
++#define ARPHRD_IPGRE	778		/* GRE over IP			*/
++#define ARPHRD_PIMREG	779		/* PIMSM register interface	*/
++#define ARPHRD_HIPPI	780		/* High Performance Parallel Interface */
++#define ARPHRD_ASH	781		/* Nexus 64Mbps Ash		*/
++#define ARPHRD_ECONET	782		/* Acorn Econet			*/
++#define ARPHRD_IRDA 	783		/* Linux-IrDA			*/
++/* ARP works differently on different FC media .. so  */
++#define ARPHRD_FCPP	784		/* Point to point fibrechannel	*/
++#define ARPHRD_FCAL	785		/* Fibrechannel arbitrated loop */
++#define ARPHRD_FCPL	786		/* Fibrechannel public loop	*/
++#define ARPHRD_FCFABRIC	787		/* Fibrechannel fabric		*/
++	/* 787->799 reserved for fibrechannel media types */
++#define ARPHRD_IEEE802_TR 800		/* Magic type ident for TR	*/
++#define ARPHRD_IEEE80211 801		/* IEEE 802.11			*/
++#define ARPHRD_IEEE80211_PRISM 802	/* IEEE 802.11 + Prism2 header  */
++#define ARPHRD_IEEE80211_RADIOTAP 803	/* IEEE 802.11 + radiotap header */
++#define ARPHRD_IEEE802154	  804
++#define ARPHRD_IEEE802154_MONITOR 805	/* IEEE 802.15.4 network monitor */
++
++#define ARPHRD_PHONET	820		/* PhoNet media type		*/
++#define ARPHRD_PHONET_PIPE 821		/* PhoNet pipe header		*/
++#define ARPHRD_CAIF	822		/* CAIF media type		*/
++#define ARPHRD_IP6GRE	823		/* GRE over IPv6		*/
++#define ARPHRD_NETLINK	824		/* Netlink header		*/
++#define ARPHRD_6LOWPAN	825		/* IPv6 over LoWPAN             */
++#define ARPHRD_VSOCKMON	826		/* Vsock monitor header		*/
++
++#define ARPHRD_VOID	  0xFFFF	/* Void type, nothing is known */
++#define ARPHRD_NONE	  0xFFFE	/* zero header length */
++
++/* ARP protocol opcodes. */
++#define	ARPOP_REQUEST	1		/* ARP request			*/
++#define	ARPOP_REPLY	2		/* ARP reply			*/
++#define	ARPOP_RREQUEST	3		/* RARP request			*/
++#define	ARPOP_RREPLY	4		/* RARP reply			*/
++#define	ARPOP_InREQUEST	8		/* InARP request		*/
++#define	ARPOP_InREPLY	9		/* InARP reply			*/
++#define	ARPOP_NAK	10		/* (ATM)ARP NAK			*/
++
++
++/* ARP ioctl request. */
++struct arpreq {
++  struct sockaddr	arp_pa;		/* protocol address		*/
++  struct sockaddr	arp_ha;		/* hardware address		*/
++  int			arp_flags;	/* flags			*/
++  struct sockaddr       arp_netmask;    /* netmask (only for proxy arps) */
++  char			arp_dev[16];
++};
++
++struct arpreq_old {
++  struct sockaddr	arp_pa;		/* protocol address		*/
++  struct sockaddr	arp_ha;		/* hardware address		*/
++  int			arp_flags;	/* flags			*/
++  struct sockaddr       arp_netmask;    /* netmask (only for proxy arps) */
++};
++
++/* ARP Flag values. */
++#define ATF_COM		0x02		/* completed entry (ha valid)	*/
++#define	ATF_PERM	0x04		/* permanent entry		*/
++#define	ATF_PUBL	0x08		/* publish entry		*/
++#define	ATF_USETRAILERS	0x10		/* has requested trailers	*/
++#define ATF_NETMASK     0x20            /* want to use a netmask (only
++					   for proxy entries) */
++#define ATF_DONTPUB	0x40		/* don't answer this addresses	*/
++
++/*
++ *	This structure defines an ethernet arp header.
++ */
++
++struct arphdr {
++	__be16		ar_hrd;		/* format of hardware address	*/
++	__be16		ar_pro;		/* format of protocol address	*/
++	unsigned char	ar_hln;		/* length of hardware address	*/
++	unsigned char	ar_pln;		/* length of protocol address	*/
++	__be16		ar_op;		/* ARP opcode (command)		*/
++
++#if 0
++	 /*
++	  *	 Ethernet looks like this : This bit is variable sized however...
++	  */
++	unsigned char		ar_sha[ETH_ALEN];	/* sender hardware address	*/
++	unsigned char		ar_sip[4];		/* sender IP address		*/
++	unsigned char		ar_tha[ETH_ALEN];	/* target hardware address	*/
++	unsigned char		ar_tip[4];		/* target IP address		*/
++#endif
++
++};
++
++
++#endif /* _LINUX_IF_ARP_H */
+diff --git a/include/uapi/linux/if_bonding.h b/include/uapi/linux/if_bonding.h
+new file mode 100644
+index 0000000..9635a62
+--- /dev/null
++++ b/include/uapi/linux/if_bonding.h
+@@ -0,0 +1,130 @@
++/*
++ * Bond several ethernet interfaces into a Cisco, running 'Etherchannel'.
++ *
++ *
++ * Portions are (c) Copyright 1995 Simon "Guru Aleph-Null" Janes
++ * NCM: Network and Communications Management, Inc.
++ *
++ * BUT, I'm the one who modified it for ethernet, so:
++ * (c) Copyright 1999, Thomas Davis, tadavis@lbl.gov
++ *
++ *	This software may be used and distributed according to the terms
++ *	of the GNU Public License, incorporated herein by reference.
++ *
++ * 2003/03/18 - Amir Noam <amir.noam at intel dot com>
++ *	- Added support for getting slave's speed and duplex via ethtool.
++ *	  Needed for 802.3ad and other future modes.
++ *
++ * 2003/03/18 - Tsippy Mendelson <tsippy.mendelson at intel dot com> and
++ *		Shmulik Hen <shmulik.hen at intel dot com>
++ *	- Enable support of modes that need to use the unique mac address of
++ *	  each slave.
++ *
++ * 2003/03/18 - Tsippy Mendelson <tsippy.mendelson at intel dot com> and
++ *		Amir Noam <amir.noam at intel dot com>
++ *	- Moved driver's private data types to bonding.h
++ *
++ * 2003/03/18 - Amir Noam <amir.noam at intel dot com>,
++ *		Tsippy Mendelson <tsippy.mendelson at intel dot com> and
++ *		Shmulik Hen <shmulik.hen at intel dot com>
++ *	- Added support for IEEE 802.3ad Dynamic link aggregation mode.
++ *
++ * 2003/05/01 - Amir Noam <amir.noam at intel dot com>
++ *	- Added ABI version control to restore compatibility between
++ *	  new/old ifenslave and new/old bonding.
++ *
++ * 2003/12/01 - Shmulik Hen <shmulik.hen at intel dot com>
++ *	- Code cleanup and style changes
++ *
++ * 2005/05/05 - Jason Gabler <jygabler at lbl dot gov>
++ *      - added definitions for various XOR hashing policies
++ */
++
++#ifndef _LINUX_IF_BONDING_H
++#define _LINUX_IF_BONDING_H
++
++#include <linux/if.h>
++#include <linux/types.h>
++#include <linux/if_ether.h>
++
++/* userland - kernel ABI version (2003/05/08) */
++#define BOND_ABI_VERSION 2
++
++/*
++ * We can remove these ioctl definitions in 2.5.  People should use the
++ * SIOC*** versions of them instead
++ */
++#define BOND_ENSLAVE_OLD		(SIOCDEVPRIVATE)
++#define BOND_RELEASE_OLD		(SIOCDEVPRIVATE + 1)
++#define BOND_SETHWADDR_OLD		(SIOCDEVPRIVATE + 2)
++#define BOND_SLAVE_INFO_QUERY_OLD	(SIOCDEVPRIVATE + 11)
++#define BOND_INFO_QUERY_OLD		(SIOCDEVPRIVATE + 12)
++#define BOND_CHANGE_ACTIVE_OLD		(SIOCDEVPRIVATE + 13)
++
++#define BOND_CHECK_MII_STATUS	(SIOCGMIIPHY)
++
++#define BOND_MODE_ROUNDROBIN	0
++#define BOND_MODE_ACTIVEBACKUP	1
++#define BOND_MODE_XOR		2
++#define BOND_MODE_BROADCAST	3
++#define BOND_MODE_8023AD        4
++#define BOND_MODE_TLB           5
++#define BOND_MODE_ALB		6 /* TLB + RLB (receive load balancing) */
++
++/* each slave's link has 4 states */
++#define BOND_LINK_UP    0           /* link is up and running */
++#define BOND_LINK_FAIL  1           /* link has just gone down */
++#define BOND_LINK_DOWN  2           /* link has been down for too long time */
++#define BOND_LINK_BACK  3           /* link is going back */
++
++/* each slave has several states */
++#define BOND_STATE_ACTIVE       0   /* link is active */
++#define BOND_STATE_BACKUP       1   /* link is backup */
++
++#define BOND_DEFAULT_MAX_BONDS  1   /* Default maximum number of devices to support */
++
++#define BOND_DEFAULT_TX_QUEUES 16   /* Default number of tx queues per device */
++
++#define BOND_DEFAULT_RESEND_IGMP	1 /* Default number of IGMP membership reports */
++
++/* hashing types */
++#define BOND_XMIT_POLICY_LAYER2		0 /* layer 2 (MAC only), default */
++#define BOND_XMIT_POLICY_LAYER34	1 /* layer 3+4 (IP ^ (TCP || UDP)) */
++#define BOND_XMIT_POLICY_LAYER23	2 /* layer 2+3 (IP ^ MAC) */
++#define BOND_XMIT_POLICY_ENCAP23	3 /* encapsulated layer 2+3 */
++#define BOND_XMIT_POLICY_ENCAP34	4 /* encapsulated layer 3+4 */
++
++typedef struct ifbond {
++	__s32 bond_mode;
++	__s32 num_slaves;
++	__s32 miimon;
++} ifbond;
++
++typedef struct ifslave {
++	__s32 slave_id; /* Used as an IN param to the BOND_SLAVE_INFO_QUERY ioctl */
++	char slave_name[IFNAMSIZ];
++	__s8 link;
++	__s8 state;
++	__u32  link_failure_count;
++} ifslave;
++
++struct ad_info {
++	__u16 aggregator_id;
++	__u16 ports;
++	__u16 actor_key;
++	__u16 partner_key;
++	__u8 partner_system[ETH_ALEN];
++};
++
++#endif /* _LINUX_IF_BONDING_H */
++
++/*
++ * Local variables:
++ *  version-control: t
++ *  kept-new-versions: 5
++ *  c-indent-level: 8
++ *  c-basic-offset: 8
++ *  tab-width: 8
++ * End:
++ */
++
+diff --git a/include/uapi/linux/if_bridge.h b/include/uapi/linux/if_bridge.h
+new file mode 100644
+index 0000000..156f443
+--- /dev/null
++++ b/include/uapi/linux/if_bridge.h
+@@ -0,0 +1,294 @@
++/*
++ *	Linux ethernet bridge
++ *
++ *	Authors:
++ *	Lennert Buytenhek		<buytenh@gnu.org>
++ *
++ *	This program is free software; you can redistribute it and/or
++ *	modify it under the terms of the GNU General Public License
++ *	as published by the Free Software Foundation; either version
++ *	2 of the License, or (at your option) any later version.
++ */
++
++#ifndef _LINUX_IF_BRIDGE_H
++#define _LINUX_IF_BRIDGE_H
++
++#include <linux/types.h>
++#include <linux/if_ether.h>
++#include <linux/in6.h>
++
++#define SYSFS_BRIDGE_ATTR	"bridge"
++#define SYSFS_BRIDGE_FDB	"brforward"
++#define SYSFS_BRIDGE_PORT_SUBDIR "brif"
++#define SYSFS_BRIDGE_PORT_ATTR	"brport"
++#define SYSFS_BRIDGE_PORT_LINK	"bridge"
++
++#define BRCTL_VERSION 1
++
++#define BRCTL_GET_VERSION 0
++#define BRCTL_GET_BRIDGES 1
++#define BRCTL_ADD_BRIDGE 2
++#define BRCTL_DEL_BRIDGE 3
++#define BRCTL_ADD_IF 4
++#define BRCTL_DEL_IF 5
++#define BRCTL_GET_BRIDGE_INFO 6
++#define BRCTL_GET_PORT_LIST 7
++#define BRCTL_SET_BRIDGE_FORWARD_DELAY 8
++#define BRCTL_SET_BRIDGE_HELLO_TIME 9
++#define BRCTL_SET_BRIDGE_MAX_AGE 10
++#define BRCTL_SET_AGEING_TIME 11
++#define BRCTL_SET_GC_INTERVAL 12
++#define BRCTL_GET_PORT_INFO 13
++#define BRCTL_SET_BRIDGE_STP_STATE 14
++#define BRCTL_SET_BRIDGE_PRIORITY 15
++#define BRCTL_SET_PORT_PRIORITY 16
++#define BRCTL_SET_PATH_COST 17
++#define BRCTL_GET_FDB_ENTRIES 18
++
++#define BR_STATE_DISABLED 0
++#define BR_STATE_LISTENING 1
++#define BR_STATE_LEARNING 2
++#define BR_STATE_FORWARDING 3
++#define BR_STATE_BLOCKING 4
++
++struct __bridge_info {
++	__u64 designated_root;
++	__u64 bridge_id;
++	__u32 root_path_cost;
++	__u32 max_age;
++	__u32 hello_time;
++	__u32 forward_delay;
++	__u32 bridge_max_age;
++	__u32 bridge_hello_time;
++	__u32 bridge_forward_delay;
++	__u8 topology_change;
++	__u8 topology_change_detected;
++	__u8 root_port;
++	__u8 stp_enabled;
++	__u32 ageing_time;
++	__u32 gc_interval;
++	__u32 hello_timer_value;
++	__u32 tcn_timer_value;
++	__u32 topology_change_timer_value;
++	__u32 gc_timer_value;
++};
++
++struct __port_info {
++	__u64 designated_root;
++	__u64 designated_bridge;
++	__u16 port_id;
++	__u16 designated_port;
++	__u32 path_cost;
++	__u32 designated_cost;
++	__u8 state;
++	__u8 top_change_ack;
++	__u8 config_pending;
++	__u8 unused0;
++	__u32 message_age_timer_value;
++	__u32 forward_delay_timer_value;
++	__u32 hold_timer_value;
++};
++
++struct __fdb_entry {
++	__u8 mac_addr[ETH_ALEN];
++	__u8 port_no;
++	__u8 is_local;
++	__u32 ageing_timer_value;
++	__u8 port_hi;
++	__u8 pad0;
++	__u16 unused;
++};
++
++/* Bridge Flags */
++#define BRIDGE_FLAGS_MASTER	1	/* Bridge command to/from master */
++#define BRIDGE_FLAGS_SELF	2	/* Bridge command to/from lowerdev */
++
++#define BRIDGE_MODE_VEB		0	/* Default loopback mode */
++#define BRIDGE_MODE_VEPA	1	/* 802.1Qbg defined VEPA mode */
++#define BRIDGE_MODE_UNDEF	0xFFFF  /* mode undefined */
++
++/* Bridge management nested attributes
++ * [IFLA_AF_SPEC] = {
++ *     [IFLA_BRIDGE_FLAGS]
++ *     [IFLA_BRIDGE_MODE]
++ *     [IFLA_BRIDGE_VLAN_INFO]
++ * }
++ */
++enum {
++	IFLA_BRIDGE_FLAGS,
++	IFLA_BRIDGE_MODE,
++	IFLA_BRIDGE_VLAN_INFO,
++	IFLA_BRIDGE_VLAN_TUNNEL_INFO,
++	__IFLA_BRIDGE_MAX,
++};
++#define IFLA_BRIDGE_MAX (__IFLA_BRIDGE_MAX - 1)
++
++#define BRIDGE_VLAN_INFO_MASTER	(1<<0)	/* Operate on Bridge device as well */
++#define BRIDGE_VLAN_INFO_PVID	(1<<1)	/* VLAN is PVID, ingress untagged */
++#define BRIDGE_VLAN_INFO_UNTAGGED	(1<<2)	/* VLAN egresses untagged */
++#define BRIDGE_VLAN_INFO_RANGE_BEGIN	(1<<3) /* VLAN is start of vlan range */
++#define BRIDGE_VLAN_INFO_RANGE_END	(1<<4) /* VLAN is end of vlan range */
++#define BRIDGE_VLAN_INFO_BRENTRY	(1<<5) /* Global bridge VLAN entry */
++
++struct bridge_vlan_info {
++	__u16 flags;
++	__u16 vid;
++};
++
++enum {
++	IFLA_BRIDGE_VLAN_TUNNEL_UNSPEC,
++	IFLA_BRIDGE_VLAN_TUNNEL_ID,
++	IFLA_BRIDGE_VLAN_TUNNEL_VID,
++	IFLA_BRIDGE_VLAN_TUNNEL_FLAGS,
++	__IFLA_BRIDGE_VLAN_TUNNEL_MAX,
++};
++
++#define IFLA_BRIDGE_VLAN_TUNNEL_MAX (__IFLA_BRIDGE_VLAN_TUNNEL_MAX - 1)
++
++struct bridge_vlan_xstats {
++	__u64 rx_bytes;
++	__u64 rx_packets;
++	__u64 tx_bytes;
++	__u64 tx_packets;
++	__u16 vid;
++	__u16 flags;
++	__u32 pad2;
++};
++
++/* Bridge multicast database attributes
++ * [MDBA_MDB] = {
++ *     [MDBA_MDB_ENTRY] = {
++ *         [MDBA_MDB_ENTRY_INFO] {
++ *		struct br_mdb_entry
++ *		[MDBA_MDB_EATTR attributes]
++ *         }
++ *     }
++ * }
++ * [MDBA_ROUTER] = {
++ *    [MDBA_ROUTER_PORT] = {
++ *        u32 ifindex
++ *        [MDBA_ROUTER_PATTR attributes]
++ *    }
++ * }
++ */
++enum {
++	MDBA_UNSPEC,
++	MDBA_MDB,
++	MDBA_ROUTER,
++	__MDBA_MAX,
++};
++#define MDBA_MAX (__MDBA_MAX - 1)
++
++enum {
++	MDBA_MDB_UNSPEC,
++	MDBA_MDB_ENTRY,
++	__MDBA_MDB_MAX,
++};
++#define MDBA_MDB_MAX (__MDBA_MDB_MAX - 1)
++
++enum {
++	MDBA_MDB_ENTRY_UNSPEC,
++	MDBA_MDB_ENTRY_INFO,
++	__MDBA_MDB_ENTRY_MAX,
++};
++#define MDBA_MDB_ENTRY_MAX (__MDBA_MDB_ENTRY_MAX - 1)
++
++/* per mdb entry additional attributes */
++enum {
++	MDBA_MDB_EATTR_UNSPEC,
++	MDBA_MDB_EATTR_TIMER,
++	__MDBA_MDB_EATTR_MAX
++};
++#define MDBA_MDB_EATTR_MAX (__MDBA_MDB_EATTR_MAX - 1)
++
++/* multicast router types */
++enum {
++	MDB_RTR_TYPE_DISABLED,
++	MDB_RTR_TYPE_TEMP_QUERY,
++	MDB_RTR_TYPE_PERM,
++	MDB_RTR_TYPE_TEMP
++};
++
++enum {
++	MDBA_ROUTER_UNSPEC,
++	MDBA_ROUTER_PORT,
++	__MDBA_ROUTER_MAX,
++};
++#define MDBA_ROUTER_MAX (__MDBA_ROUTER_MAX - 1)
++
++/* router port attributes */
++enum {
++	MDBA_ROUTER_PATTR_UNSPEC,
++	MDBA_ROUTER_PATTR_TIMER,
++	MDBA_ROUTER_PATTR_TYPE,
++	__MDBA_ROUTER_PATTR_MAX
++};
++#define MDBA_ROUTER_PATTR_MAX (__MDBA_ROUTER_PATTR_MAX - 1)
++
++struct br_port_msg {
++	__u8  family;
++	__u32 ifindex;
++};
++
++struct br_mdb_entry {
++	__u32 ifindex;
++#define MDB_TEMPORARY 0
++#define MDB_PERMANENT 1
++	__u8 state;
++#define MDB_FLAGS_OFFLOAD	(1 << 0)
++	__u8 flags;
++	__u16 vid;
++	struct {
++		union {
++			__be32	ip4;
++			struct in6_addr ip6;
++		} u;
++		__be16		proto;
++	} addr;
++};
++
++enum {
++	MDBA_SET_ENTRY_UNSPEC,
++	MDBA_SET_ENTRY,
++	__MDBA_SET_ENTRY_MAX,
++};
++#define MDBA_SET_ENTRY_MAX (__MDBA_SET_ENTRY_MAX - 1)
++
++/* Embedded inside LINK_XSTATS_TYPE_BRIDGE */
++enum {
++	BRIDGE_XSTATS_UNSPEC,
++	BRIDGE_XSTATS_VLAN,
++	BRIDGE_XSTATS_MCAST,
++	BRIDGE_XSTATS_PAD,
++	__BRIDGE_XSTATS_MAX
++};
++#define BRIDGE_XSTATS_MAX (__BRIDGE_XSTATS_MAX - 1)
++
++enum {
++	BR_MCAST_DIR_RX,
++	BR_MCAST_DIR_TX,
++	BR_MCAST_DIR_SIZE
++};
++
++/* IGMP/MLD statistics */
++struct br_mcast_stats {
++	__u64 igmp_v1queries[BR_MCAST_DIR_SIZE];
++	__u64 igmp_v2queries[BR_MCAST_DIR_SIZE];
++	__u64 igmp_v3queries[BR_MCAST_DIR_SIZE];
++	__u64 igmp_leaves[BR_MCAST_DIR_SIZE];
++	__u64 igmp_v1reports[BR_MCAST_DIR_SIZE];
++	__u64 igmp_v2reports[BR_MCAST_DIR_SIZE];
++	__u64 igmp_v3reports[BR_MCAST_DIR_SIZE];
++	__u64 igmp_parse_errors;
++
++	__u64 mld_v1queries[BR_MCAST_DIR_SIZE];
++	__u64 mld_v2queries[BR_MCAST_DIR_SIZE];
++	__u64 mld_leaves[BR_MCAST_DIR_SIZE];
++	__u64 mld_v1reports[BR_MCAST_DIR_SIZE];
++	__u64 mld_v2reports[BR_MCAST_DIR_SIZE];
++	__u64 mld_parse_errors;
++
++	__u64 mcast_bytes[BR_MCAST_DIR_SIZE];
++	__u64 mcast_packets[BR_MCAST_DIR_SIZE];
++};
++#endif /* _LINUX_IF_BRIDGE_H */
+diff --git a/include/uapi/linux/if_ether.h b/include/uapi/linux/if_ether.h
+new file mode 100644
+index 0000000..7dde037
+--- /dev/null
++++ b/include/uapi/linux/if_ether.h
+@@ -0,0 +1,158 @@
++/*
++ * INET		An implementation of the TCP/IP protocol suite for the LINUX
++ *		operating system.  INET is implemented using the  BSD Socket
++ *		interface as the means of communication with the user level.
++ *
++ *		Global definitions for the Ethernet IEEE 802.3 interface.
++ *
++ * Version:	@(#)if_ether.h	1.0.1a	02/08/94
++ *
++ * Author:	Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
++ *		Donald Becker, <becker@super.org>
++ *		Alan Cox, <alan@lxorguk.ukuu.org.uk>
++ *		Steve Whitehouse, <gw7rrm@eeshack3.swan.ac.uk>
++ *
++ *		This program is free software; you can redistribute it and/or
++ *		modify it under the terms of the GNU General Public License
++ *		as published by the Free Software Foundation; either version
++ *		2 of the License, or (at your option) any later version.
++ */
++
++#ifndef _LINUX_IF_ETHER_H
++#define _LINUX_IF_ETHER_H
++
++#include <linux/types.h>
++
++/*
++ *	IEEE 802.3 Ethernet magic constants.  The frame sizes omit the preamble
++ *	and FCS/CRC (frame check sequence).
++ */
++
++#define ETH_ALEN	6		/* Octets in one ethernet addr	 */
++#define ETH_HLEN	14		/* Total octets in header.	 */
++#define ETH_ZLEN	60		/* Min. octets in frame sans FCS */
++#define ETH_DATA_LEN	1500		/* Max. octets in payload	 */
++#define ETH_FRAME_LEN	1514		/* Max. octets in frame sans FCS */
++#define ETH_FCS_LEN	4		/* Octets in the FCS		 */
++
++#define ETH_MIN_MTU	68		/* Min IPv4 MTU per RFC791	*/
++#define ETH_MAX_MTU	0xFFFFU		/* 65535, same as IP_MAX_MTU	*/
++
++/*
++ *	These are the defined Ethernet Protocol ID's.
++ */
++
++#define ETH_P_LOOP	0x0060		/* Ethernet Loopback packet	*/
++#define ETH_P_PUP	0x0200		/* Xerox PUP packet		*/
++#define ETH_P_PUPAT	0x0201		/* Xerox PUP Addr Trans packet	*/
++#define ETH_P_TSN	0x22F0		/* TSN (IEEE 1722) packet	*/
++#define ETH_P_IP	0x0800		/* Internet Protocol packet	*/
++#define ETH_P_X25	0x0805		/* CCITT X.25			*/
++#define ETH_P_ARP	0x0806		/* Address Resolution packet	*/
++#define	ETH_P_BPQ	0x08FF		/* G8BPQ AX.25 Ethernet Packet	[ NOT AN OFFICIALLY REGISTERED ID ] */
++#define ETH_P_IEEEPUP	0x0a00		/* Xerox IEEE802.3 PUP packet */
++#define ETH_P_IEEEPUPAT	0x0a01		/* Xerox IEEE802.3 PUP Addr Trans packet */
++#define ETH_P_BATMAN	0x4305		/* B.A.T.M.A.N.-Advanced packet [ NOT AN OFFICIALLY REGISTERED ID ] */
++#define ETH_P_DEC       0x6000          /* DEC Assigned proto           */
++#define ETH_P_DNA_DL    0x6001          /* DEC DNA Dump/Load            */
++#define ETH_P_DNA_RC    0x6002          /* DEC DNA Remote Console       */
++#define ETH_P_DNA_RT    0x6003          /* DEC DNA Routing              */
++#define ETH_P_LAT       0x6004          /* DEC LAT                      */
++#define ETH_P_DIAG      0x6005          /* DEC Diagnostics              */
++#define ETH_P_CUST      0x6006          /* DEC Customer use             */
++#define ETH_P_SCA       0x6007          /* DEC Systems Comms Arch       */
++#define ETH_P_TEB	0x6558		/* Trans Ether Bridging		*/
++#define ETH_P_RARP      0x8035		/* Reverse Addr Res packet	*/
++#define ETH_P_ATALK	0x809B		/* Appletalk DDP		*/
++#define ETH_P_AARP	0x80F3		/* Appletalk AARP		*/
++#define ETH_P_8021Q	0x8100          /* 802.1Q VLAN Extended Header  */
++#define ETH_P_ERSPAN	0x88BE		/* ERSPAN type II		*/
++#define ETH_P_IPX	0x8137		/* IPX over DIX			*/
++#define ETH_P_IPV6	0x86DD		/* IPv6 over bluebook		*/
++#define ETH_P_PAUSE	0x8808		/* IEEE Pause frames. See 802.3 31B */
++#define ETH_P_SLOW	0x8809		/* Slow Protocol. See 802.3ad 43B */
++#define ETH_P_WCCP	0x883E		/* Web-cache coordination protocol
++					 * defined in draft-wilson-wrec-wccp-v2-00.txt */
++#define ETH_P_MPLS_UC	0x8847		/* MPLS Unicast traffic		*/
++#define ETH_P_MPLS_MC	0x8848		/* MPLS Multicast traffic	*/
++#define ETH_P_ATMMPOA	0x884c		/* MultiProtocol Over ATM	*/
++#define ETH_P_PPP_DISC	0x8863		/* PPPoE discovery messages     */
++#define ETH_P_PPP_SES	0x8864		/* PPPoE session messages	*/
++#define ETH_P_LINK_CTL	0x886c		/* HPNA, wlan link local tunnel */
++#define ETH_P_ATMFATE	0x8884		/* Frame-based ATM Transport
++					 * over Ethernet
++					 */
++#define ETH_P_PAE	0x888E		/* Port Access Entity (IEEE 802.1X) */
++#define ETH_P_AOE	0x88A2		/* ATA over Ethernet		*/
++#define ETH_P_8021AD	0x88A8          /* 802.1ad Service VLAN		*/
++#define ETH_P_802_EX1	0x88B5		/* 802.1 Local Experimental 1.  */
++#define ETH_P_TIPC	0x88CA		/* TIPC 			*/
++#define ETH_P_MACSEC	0x88E5		/* 802.1ae MACsec */
++#define ETH_P_8021AH	0x88E7          /* 802.1ah Backbone Service Tag */
++#define ETH_P_MVRP	0x88F5          /* 802.1Q MVRP                  */
++#define ETH_P_1588	0x88F7		/* IEEE 1588 Timesync */
++#define ETH_P_NCSI	0x88F8		/* NCSI protocol		*/
++#define ETH_P_PRP	0x88FB		/* IEC 62439-3 PRP/HSRv0	*/
++#define ETH_P_FCOE	0x8906		/* Fibre Channel over Ethernet  */
++#define ETH_P_IBOE	0x8915		/* Infiniband over Ethernet	*/
++#define ETH_P_TDLS	0x890D          /* TDLS */
++#define ETH_P_FIP	0x8914		/* FCoE Initialization Protocol */
++#define ETH_P_80221	0x8917		/* IEEE 802.21 Media Independent Handover Protocol */
++#define ETH_P_HSR	0x892F		/* IEC 62439-3 HSRv1	*/
++#define ETH_P_NSH	0x894F		/* Network Service Header */
++#define ETH_P_LOOPBACK	0x9000		/* Ethernet loopback packet, per IEEE 802.3 */
++#define ETH_P_QINQ1	0x9100		/* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */
++#define ETH_P_QINQ2	0x9200		/* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */
++#define ETH_P_QINQ3	0x9300		/* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */
++#define ETH_P_EDSA	0xDADA		/* Ethertype DSA [ NOT AN OFFICIALLY REGISTERED ID ] */
++#define ETH_P_IFE	0xED3E		/* ForCES inter-FE LFB type */
++#define ETH_P_AF_IUCV   0xFBFB		/* IBM af_iucv [ NOT AN OFFICIALLY REGISTERED ID ] */
++
++#define ETH_P_802_3_MIN	0x0600		/* If the value in the ethernet type is less than this value
++					 * then the frame is Ethernet II. Else it is 802.3 */
++
++/*
++ *	Non DIX types. Won't clash for 1500 types.
++ */
++
++#define ETH_P_802_3	0x0001		/* Dummy type for 802.3 frames  */
++#define ETH_P_AX25	0x0002		/* Dummy protocol id for AX.25  */
++#define ETH_P_ALL	0x0003		/* Every packet (be careful!!!) */
++#define ETH_P_802_2	0x0004		/* 802.2 frames 		*/
++#define ETH_P_SNAP	0x0005		/* Internal only		*/
++#define ETH_P_DDCMP     0x0006          /* DEC DDCMP: Internal only     */
++#define ETH_P_WAN_PPP   0x0007          /* Dummy type for WAN PPP frames*/
++#define ETH_P_PPP_MP    0x0008          /* Dummy type for PPP MP frames */
++#define ETH_P_LOCALTALK 0x0009		/* Localtalk pseudo type 	*/
++#define ETH_P_CAN	0x000C		/* CAN: Controller Area Network */
++#define ETH_P_CANFD	0x000D		/* CANFD: CAN flexible data rate*/
++#define ETH_P_PPPTALK	0x0010		/* Dummy type for Atalk over PPP*/
++#define ETH_P_TR_802_2	0x0011		/* 802.2 frames 		*/
++#define ETH_P_MOBITEX	0x0015		/* Mobitex (kaz@cafe.net)	*/
++#define ETH_P_CONTROL	0x0016		/* Card specific control frames */
++#define ETH_P_IRDA	0x0017		/* Linux-IrDA			*/
++#define ETH_P_ECONET	0x0018		/* Acorn Econet			*/
++#define ETH_P_HDLC	0x0019		/* HDLC frames			*/
++#define ETH_P_ARCNET	0x001A		/* 1A for ArcNet :-)            */
++#define ETH_P_DSA	0x001B		/* Distributed Switch Arch.	*/
++#define ETH_P_TRAILER	0x001C		/* Trailer switch tagging	*/
++#define ETH_P_PHONET	0x00F5		/* Nokia Phonet frames          */
++#define ETH_P_IEEE802154 0x00F6		/* IEEE802.15.4 frame		*/
++#define ETH_P_CAIF	0x00F7		/* ST-Ericsson CAIF protocol	*/
++#define ETH_P_XDSA	0x00F8		/* Multiplexed DSA protocol	*/
++#define ETH_P_MAP	0x00F9		/* Qualcomm multiplexing and
++					 * aggregation protocol
++					 */
++
++/*
++ *	This is an Ethernet frame header.
++ */
++
++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 /* _LINUX_IF_ETHER_H */
+diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h
+new file mode 100644
+index 0000000..1f97d05
+--- /dev/null
++++ b/include/uapi/linux/if_link.h
+@@ -0,0 +1,928 @@
++#ifndef _LINUX_IF_LINK_H
++#define _LINUX_IF_LINK_H
++
++#include <linux/types.h>
++#include <linux/netlink.h>
++
++/* This struct should be in sync with struct rtnl_link_stats64 */
++struct rtnl_link_stats {
++	__u32	rx_packets;		/* total packets received	*/
++	__u32	tx_packets;		/* total packets transmitted	*/
++	__u32	rx_bytes;		/* total bytes received 	*/
++	__u32	tx_bytes;		/* total bytes transmitted	*/
++	__u32	rx_errors;		/* bad packets received		*/
++	__u32	tx_errors;		/* packet transmit problems	*/
++	__u32	rx_dropped;		/* no space in linux buffers	*/
++	__u32	tx_dropped;		/* no space available in linux	*/
++	__u32	multicast;		/* multicast packets received	*/
++	__u32	collisions;
++
++	/* detailed rx_errors: */
++	__u32	rx_length_errors;
++	__u32	rx_over_errors;		/* receiver ring buff overflow	*/
++	__u32	rx_crc_errors;		/* recved pkt with crc error	*/
++	__u32	rx_frame_errors;	/* recv'd frame alignment error */
++	__u32	rx_fifo_errors;		/* recv'r fifo overrun		*/
++	__u32	rx_missed_errors;	/* receiver missed packet	*/
++
++	/* detailed tx_errors */
++	__u32	tx_aborted_errors;
++	__u32	tx_carrier_errors;
++	__u32	tx_fifo_errors;
++	__u32	tx_heartbeat_errors;
++	__u32	tx_window_errors;
++
++	/* for cslip etc */
++	__u32	rx_compressed;
++	__u32	tx_compressed;
++
++	__u32	rx_nohandler;		/* dropped, no handler found	*/
++};
++
++/* The main device statistics structure */
++struct rtnl_link_stats64 {
++	__u64	rx_packets;		/* total packets received	*/
++	__u64	tx_packets;		/* total packets transmitted	*/
++	__u64	rx_bytes;		/* total bytes received 	*/
++	__u64	tx_bytes;		/* total bytes transmitted	*/
++	__u64	rx_errors;		/* bad packets received		*/
++	__u64	tx_errors;		/* packet transmit problems	*/
++	__u64	rx_dropped;		/* no space in linux buffers	*/
++	__u64	tx_dropped;		/* no space available in linux	*/
++	__u64	multicast;		/* multicast packets received	*/
++	__u64	collisions;
++
++	/* detailed rx_errors: */
++	__u64	rx_length_errors;
++	__u64	rx_over_errors;		/* receiver ring buff overflow	*/
++	__u64	rx_crc_errors;		/* recved pkt with crc error	*/
++	__u64	rx_frame_errors;	/* recv'd frame alignment error */
++	__u64	rx_fifo_errors;		/* recv'r fifo overrun		*/
++	__u64	rx_missed_errors;	/* receiver missed packet	*/
++
++	/* detailed tx_errors */
++	__u64	tx_aborted_errors;
++	__u64	tx_carrier_errors;
++	__u64	tx_fifo_errors;
++	__u64	tx_heartbeat_errors;
++	__u64	tx_window_errors;
++
++	/* for cslip etc */
++	__u64	rx_compressed;
++	__u64	tx_compressed;
++
++	__u64	rx_nohandler;		/* dropped, no handler found	*/
++};
++
++/* The struct should be in sync with struct ifmap */
++struct rtnl_link_ifmap {
++	__u64	mem_start;
++	__u64	mem_end;
++	__u64	base_addr;
++	__u16	irq;
++	__u8	dma;
++	__u8	port;
++};
++
++/*
++ * IFLA_AF_SPEC
++ *   Contains nested attributes for address family specific attributes.
++ *   Each address family may create a attribute with the address family
++ *   number as type and create its own attribute structure in it.
++ *
++ *   Example:
++ *   [IFLA_AF_SPEC] = {
++ *       [AF_INET] = {
++ *           [IFLA_INET_CONF] = ...,
++ *       },
++ *       [AF_INET6] = {
++ *           [IFLA_INET6_FLAGS] = ...,
++ *           [IFLA_INET6_CONF] = ...,
++ *       }
++ *   }
++ */
++
++enum {
++	IFLA_UNSPEC,
++	IFLA_ADDRESS,
++	IFLA_BROADCAST,
++	IFLA_IFNAME,
++	IFLA_MTU,
++	IFLA_LINK,
++	IFLA_QDISC,
++	IFLA_STATS,
++	IFLA_COST,
++#define IFLA_COST IFLA_COST
++	IFLA_PRIORITY,
++#define IFLA_PRIORITY IFLA_PRIORITY
++	IFLA_MASTER,
++#define IFLA_MASTER IFLA_MASTER
++	IFLA_WIRELESS,		/* Wireless Extension event - see wireless.h */
++#define IFLA_WIRELESS IFLA_WIRELESS
++	IFLA_PROTINFO,		/* Protocol specific information for a link */
++#define IFLA_PROTINFO IFLA_PROTINFO
++	IFLA_TXQLEN,
++#define IFLA_TXQLEN IFLA_TXQLEN
++	IFLA_MAP,
++#define IFLA_MAP IFLA_MAP
++	IFLA_WEIGHT,
++#define IFLA_WEIGHT IFLA_WEIGHT
++	IFLA_OPERSTATE,
++	IFLA_LINKMODE,
++	IFLA_LINKINFO,
++#define IFLA_LINKINFO IFLA_LINKINFO
++	IFLA_NET_NS_PID,
++	IFLA_IFALIAS,
++	IFLA_NUM_VF,		/* Number of VFs if device is SR-IOV PF */
++	IFLA_VFINFO_LIST,
++	IFLA_STATS64,
++	IFLA_VF_PORTS,
++	IFLA_PORT_SELF,
++	IFLA_AF_SPEC,
++	IFLA_GROUP,		/* Group the device belongs to */
++	IFLA_NET_NS_FD,
++	IFLA_EXT_MASK,		/* Extended info mask, VFs, etc */
++	IFLA_PROMISCUITY,	/* Promiscuity count: > 0 means acts PROMISC */
++#define IFLA_PROMISCUITY IFLA_PROMISCUITY
++	IFLA_NUM_TX_QUEUES,
++	IFLA_NUM_RX_QUEUES,
++	IFLA_CARRIER,
++	IFLA_PHYS_PORT_ID,
++	IFLA_CARRIER_CHANGES,
++	IFLA_PHYS_SWITCH_ID,
++	IFLA_LINK_NETNSID,
++	IFLA_PHYS_PORT_NAME,
++	IFLA_PROTO_DOWN,
++	IFLA_GSO_MAX_SEGS,
++	IFLA_GSO_MAX_SIZE,
++	IFLA_PAD,
++	IFLA_XDP,
++	IFLA_EVENT,
++	__IFLA_MAX
++};
++
++
++#define IFLA_MAX (__IFLA_MAX - 1)
++
++/* backwards compatibility for userspace */
++#define IFLA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg))))
++#define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg))
++
++enum {
++	IFLA_INET_UNSPEC,
++	IFLA_INET_CONF,
++	__IFLA_INET_MAX,
++};
++
++#define IFLA_INET_MAX (__IFLA_INET_MAX - 1)
++
++/* ifi_flags.
++
++   IFF_* flags.
++
++   The only change is:
++   IFF_LOOPBACK, IFF_BROADCAST and IFF_POINTOPOINT are
++   more not changeable by user. They describe link media
++   characteristics and set by device driver.
++
++   Comments:
++   - Combination IFF_BROADCAST|IFF_POINTOPOINT is invalid
++   - If neither of these three flags are set;
++     the interface is NBMA.
++
++   - IFF_MULTICAST does not mean anything special:
++   multicasts can be used on all not-NBMA links.
++   IFF_MULTICAST means that this media uses special encapsulation
++   for multicast frames. Apparently, all IFF_POINTOPOINT and
++   IFF_BROADCAST devices are able to use multicasts too.
++ */
++
++/* IFLA_LINK.
++   For usual devices it is equal ifi_index.
++   If it is a "virtual interface" (f.e. tunnel), ifi_link
++   can point to real physical interface (f.e. for bandwidth calculations),
++   or maybe 0, what means, that real media is unknown (usual
++   for IPIP tunnels, when route to endpoint is allowed to change)
++ */
++
++/* Subtype attributes for IFLA_PROTINFO */
++enum {
++	IFLA_INET6_UNSPEC,
++	IFLA_INET6_FLAGS,	/* link flags			*/
++	IFLA_INET6_CONF,	/* sysctl parameters		*/
++	IFLA_INET6_STATS,	/* statistics			*/
++	IFLA_INET6_MCAST,	/* MC things. What of them?	*/
++	IFLA_INET6_CACHEINFO,	/* time values and max reasm size */
++	IFLA_INET6_ICMP6STATS,	/* statistics (icmpv6)		*/
++	IFLA_INET6_TOKEN,	/* device token			*/
++	IFLA_INET6_ADDR_GEN_MODE, /* implicit address generator mode */
++	__IFLA_INET6_MAX
++};
++
++#define IFLA_INET6_MAX	(__IFLA_INET6_MAX - 1)
++
++enum in6_addr_gen_mode {
++	IN6_ADDR_GEN_MODE_EUI64,
++	IN6_ADDR_GEN_MODE_NONE,
++	IN6_ADDR_GEN_MODE_STABLE_PRIVACY,
++	IN6_ADDR_GEN_MODE_RANDOM,
++};
++
++/* Bridge section */
++
++enum {
++	IFLA_BR_UNSPEC,
++	IFLA_BR_FORWARD_DELAY,
++	IFLA_BR_HELLO_TIME,
++	IFLA_BR_MAX_AGE,
++	IFLA_BR_AGEING_TIME,
++	IFLA_BR_STP_STATE,
++	IFLA_BR_PRIORITY,
++	IFLA_BR_VLAN_FILTERING,
++	IFLA_BR_VLAN_PROTOCOL,
++	IFLA_BR_GROUP_FWD_MASK,
++	IFLA_BR_ROOT_ID,
++	IFLA_BR_BRIDGE_ID,
++	IFLA_BR_ROOT_PORT,
++	IFLA_BR_ROOT_PATH_COST,
++	IFLA_BR_TOPOLOGY_CHANGE,
++	IFLA_BR_TOPOLOGY_CHANGE_DETECTED,
++	IFLA_BR_HELLO_TIMER,
++	IFLA_BR_TCN_TIMER,
++	IFLA_BR_TOPOLOGY_CHANGE_TIMER,
++	IFLA_BR_GC_TIMER,
++	IFLA_BR_GROUP_ADDR,
++	IFLA_BR_FDB_FLUSH,
++	IFLA_BR_MCAST_ROUTER,
++	IFLA_BR_MCAST_SNOOPING,
++	IFLA_BR_MCAST_QUERY_USE_IFADDR,
++	IFLA_BR_MCAST_QUERIER,
++	IFLA_BR_MCAST_HASH_ELASTICITY,
++	IFLA_BR_MCAST_HASH_MAX,
++	IFLA_BR_MCAST_LAST_MEMBER_CNT,
++	IFLA_BR_MCAST_STARTUP_QUERY_CNT,
++	IFLA_BR_MCAST_LAST_MEMBER_INTVL,
++	IFLA_BR_MCAST_MEMBERSHIP_INTVL,
++	IFLA_BR_MCAST_QUERIER_INTVL,
++	IFLA_BR_MCAST_QUERY_INTVL,
++	IFLA_BR_MCAST_QUERY_RESPONSE_INTVL,
++	IFLA_BR_MCAST_STARTUP_QUERY_INTVL,
++	IFLA_BR_NF_CALL_IPTABLES,
++	IFLA_BR_NF_CALL_IP6TABLES,
++	IFLA_BR_NF_CALL_ARPTABLES,
++	IFLA_BR_VLAN_DEFAULT_PVID,
++	IFLA_BR_PAD,
++	IFLA_BR_VLAN_STATS_ENABLED,
++	IFLA_BR_MCAST_STATS_ENABLED,
++	IFLA_BR_MCAST_IGMP_VERSION,
++	IFLA_BR_MCAST_MLD_VERSION,
++	__IFLA_BR_MAX,
++};
++
++#define IFLA_BR_MAX	(__IFLA_BR_MAX - 1)
++
++struct ifla_bridge_id {
++	__u8	prio[2];
++	__u8	addr[6]; /* ETH_ALEN */
++};
++
++enum {
++	BRIDGE_MODE_UNSPEC,
++	BRIDGE_MODE_HAIRPIN,
++};
++
++enum {
++	IFLA_BRPORT_UNSPEC,
++	IFLA_BRPORT_STATE,	/* Spanning tree state     */
++	IFLA_BRPORT_PRIORITY,	/* "             priority  */
++	IFLA_BRPORT_COST,	/* "             cost      */
++	IFLA_BRPORT_MODE,	/* mode (hairpin)          */
++	IFLA_BRPORT_GUARD,	/* bpdu guard              */
++	IFLA_BRPORT_PROTECT,	/* root port protection    */
++	IFLA_BRPORT_FAST_LEAVE,	/* multicast fast leave    */
++	IFLA_BRPORT_LEARNING,	/* mac learning */
++	IFLA_BRPORT_UNICAST_FLOOD, /* flood unicast traffic */
++	IFLA_BRPORT_PROXYARP,	/* proxy ARP */
++	IFLA_BRPORT_LEARNING_SYNC, /* mac learning sync from device */
++	IFLA_BRPORT_PROXYARP_WIFI, /* proxy ARP for Wi-Fi */
++	IFLA_BRPORT_ROOT_ID,	/* designated root */
++	IFLA_BRPORT_BRIDGE_ID,	/* designated bridge */
++	IFLA_BRPORT_DESIGNATED_PORT,
++	IFLA_BRPORT_DESIGNATED_COST,
++	IFLA_BRPORT_ID,
++	IFLA_BRPORT_NO,
++	IFLA_BRPORT_TOPOLOGY_CHANGE_ACK,
++	IFLA_BRPORT_CONFIG_PENDING,
++	IFLA_BRPORT_MESSAGE_AGE_TIMER,
++	IFLA_BRPORT_FORWARD_DELAY_TIMER,
++	IFLA_BRPORT_HOLD_TIMER,
++	IFLA_BRPORT_FLUSH,
++	IFLA_BRPORT_MULTICAST_ROUTER,
++	IFLA_BRPORT_PAD,
++	IFLA_BRPORT_MCAST_FLOOD,
++	IFLA_BRPORT_MCAST_TO_UCAST,
++	IFLA_BRPORT_VLAN_TUNNEL,
++	IFLA_BRPORT_BCAST_FLOOD,
++	__IFLA_BRPORT_MAX
++};
++#define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1)
++
++struct ifla_cacheinfo {
++	__u32	max_reasm_len;
++	__u32	tstamp;		/* ipv6InterfaceTable updated timestamp */
++	__u32	reachable_time;
++	__u32	retrans_time;
++};
++
++enum {
++	IFLA_INFO_UNSPEC,
++	IFLA_INFO_KIND,
++	IFLA_INFO_DATA,
++	IFLA_INFO_XSTATS,
++	IFLA_INFO_SLAVE_KIND,
++	IFLA_INFO_SLAVE_DATA,
++	__IFLA_INFO_MAX,
++};
++
++#define IFLA_INFO_MAX	(__IFLA_INFO_MAX - 1)
++
++/* VLAN section */
++
++enum {
++	IFLA_VLAN_UNSPEC,
++	IFLA_VLAN_ID,
++	IFLA_VLAN_FLAGS,
++	IFLA_VLAN_EGRESS_QOS,
++	IFLA_VLAN_INGRESS_QOS,
++	IFLA_VLAN_PROTOCOL,
++	__IFLA_VLAN_MAX,
++};
++
++#define IFLA_VLAN_MAX	(__IFLA_VLAN_MAX - 1)
++
++struct ifla_vlan_flags {
++	__u32	flags;
++	__u32	mask;
++};
++
++enum {
++	IFLA_VLAN_QOS_UNSPEC,
++	IFLA_VLAN_QOS_MAPPING,
++	__IFLA_VLAN_QOS_MAX
++};
++
++#define IFLA_VLAN_QOS_MAX	(__IFLA_VLAN_QOS_MAX - 1)
++
++struct ifla_vlan_qos_mapping {
++	__u32 from;
++	__u32 to;
++};
++
++/* MACVLAN section */
++enum {
++	IFLA_MACVLAN_UNSPEC,
++	IFLA_MACVLAN_MODE,
++	IFLA_MACVLAN_FLAGS,
++	IFLA_MACVLAN_MACADDR_MODE,
++	IFLA_MACVLAN_MACADDR,
++	IFLA_MACVLAN_MACADDR_DATA,
++	IFLA_MACVLAN_MACADDR_COUNT,
++	__IFLA_MACVLAN_MAX,
++};
++
++#define IFLA_MACVLAN_MAX (__IFLA_MACVLAN_MAX - 1)
++
++enum macvlan_mode {
++	MACVLAN_MODE_PRIVATE = 1, /* don't talk to other macvlans */
++	MACVLAN_MODE_VEPA    = 2, /* talk to other ports through ext bridge */
++	MACVLAN_MODE_BRIDGE  = 4, /* talk to bridge ports directly */
++	MACVLAN_MODE_PASSTHRU = 8,/* take over the underlying device */
++	MACVLAN_MODE_SOURCE  = 16,/* use source MAC address list to assign */
++};
++
++enum macvlan_macaddr_mode {
++	MACVLAN_MACADDR_ADD,
++	MACVLAN_MACADDR_DEL,
++	MACVLAN_MACADDR_FLUSH,
++	MACVLAN_MACADDR_SET,
++};
++
++#define MACVLAN_FLAG_NOPROMISC	1
++
++/* VRF section */
++enum {
++	IFLA_VRF_UNSPEC,
++	IFLA_VRF_TABLE,
++	__IFLA_VRF_MAX
++};
++
++#define IFLA_VRF_MAX (__IFLA_VRF_MAX - 1)
++
++enum {
++	IFLA_VRF_PORT_UNSPEC,
++	IFLA_VRF_PORT_TABLE,
++	__IFLA_VRF_PORT_MAX
++};
++
++#define IFLA_VRF_PORT_MAX (__IFLA_VRF_PORT_MAX - 1)
++
++/* MACSEC section */
++enum {
++	IFLA_MACSEC_UNSPEC,
++	IFLA_MACSEC_SCI,
++	IFLA_MACSEC_PORT,
++	IFLA_MACSEC_ICV_LEN,
++	IFLA_MACSEC_CIPHER_SUITE,
++	IFLA_MACSEC_WINDOW,
++	IFLA_MACSEC_ENCODING_SA,
++	IFLA_MACSEC_ENCRYPT,
++	IFLA_MACSEC_PROTECT,
++	IFLA_MACSEC_INC_SCI,
++	IFLA_MACSEC_ES,
++	IFLA_MACSEC_SCB,
++	IFLA_MACSEC_REPLAY_PROTECT,
++	IFLA_MACSEC_VALIDATION,
++	IFLA_MACSEC_PAD,
++	__IFLA_MACSEC_MAX,
++};
++
++#define IFLA_MACSEC_MAX (__IFLA_MACSEC_MAX - 1)
++
++enum macsec_validation_type {
++	MACSEC_VALIDATE_DISABLED = 0,
++	MACSEC_VALIDATE_CHECK = 1,
++	MACSEC_VALIDATE_STRICT = 2,
++	__MACSEC_VALIDATE_END,
++	MACSEC_VALIDATE_MAX = __MACSEC_VALIDATE_END - 1,
++};
++
++/* IPVLAN section */
++enum {
++	IFLA_IPVLAN_UNSPEC,
++	IFLA_IPVLAN_MODE,
++	__IFLA_IPVLAN_MAX
++};
++
++#define IFLA_IPVLAN_MAX (__IFLA_IPVLAN_MAX - 1)
++
++enum ipvlan_mode {
++	IPVLAN_MODE_L2 = 0,
++	IPVLAN_MODE_L3,
++	IPVLAN_MODE_L3S,
++	IPVLAN_MODE_MAX
++};
++
++/* VXLAN section */
++enum {
++	IFLA_VXLAN_UNSPEC,
++	IFLA_VXLAN_ID,
++	IFLA_VXLAN_GROUP,	/* group or remote address */
++	IFLA_VXLAN_LINK,
++	IFLA_VXLAN_LOCAL,
++	IFLA_VXLAN_TTL,
++	IFLA_VXLAN_TOS,
++	IFLA_VXLAN_LEARNING,
++	IFLA_VXLAN_AGEING,
++	IFLA_VXLAN_LIMIT,
++	IFLA_VXLAN_PORT_RANGE,	/* source port */
++	IFLA_VXLAN_PROXY,
++	IFLA_VXLAN_RSC,
++	IFLA_VXLAN_L2MISS,
++	IFLA_VXLAN_L3MISS,
++	IFLA_VXLAN_PORT,	/* destination port */
++	IFLA_VXLAN_GROUP6,
++	IFLA_VXLAN_LOCAL6,
++	IFLA_VXLAN_UDP_CSUM,
++	IFLA_VXLAN_UDP_ZERO_CSUM6_TX,
++	IFLA_VXLAN_UDP_ZERO_CSUM6_RX,
++	IFLA_VXLAN_REMCSUM_TX,
++	IFLA_VXLAN_REMCSUM_RX,
++	IFLA_VXLAN_GBP,
++	IFLA_VXLAN_REMCSUM_NOPARTIAL,
++	IFLA_VXLAN_COLLECT_METADATA,
++	IFLA_VXLAN_LABEL,
++	IFLA_VXLAN_GPE,
++	__IFLA_VXLAN_MAX
++};
++#define IFLA_VXLAN_MAX	(__IFLA_VXLAN_MAX - 1)
++
++struct ifla_vxlan_port_range {
++	__be16	low;
++	__be16	high;
++};
++
++/* GENEVE section */
++enum {
++	IFLA_GENEVE_UNSPEC,
++	IFLA_GENEVE_ID,
++	IFLA_GENEVE_REMOTE,
++	IFLA_GENEVE_TTL,
++	IFLA_GENEVE_TOS,
++	IFLA_GENEVE_PORT,	/* destination port */
++	IFLA_GENEVE_COLLECT_METADATA,
++	IFLA_GENEVE_REMOTE6,
++	IFLA_GENEVE_UDP_CSUM,
++	IFLA_GENEVE_UDP_ZERO_CSUM6_TX,
++	IFLA_GENEVE_UDP_ZERO_CSUM6_RX,
++	IFLA_GENEVE_LABEL,
++	__IFLA_GENEVE_MAX
++};
++#define IFLA_GENEVE_MAX	(__IFLA_GENEVE_MAX - 1)
++
++/* PPP section */
++enum {
++	IFLA_PPP_UNSPEC,
++	IFLA_PPP_DEV_FD,
++	__IFLA_PPP_MAX
++};
++#define IFLA_PPP_MAX (__IFLA_PPP_MAX - 1)
++
++/* GTP section */
++
++enum ifla_gtp_role {
++	GTP_ROLE_GGSN = 0,
++	GTP_ROLE_SGSN,
++};
++
++enum {
++	IFLA_GTP_UNSPEC,
++	IFLA_GTP_FD0,
++	IFLA_GTP_FD1,
++	IFLA_GTP_PDP_HASHSIZE,
++	IFLA_GTP_ROLE,
++	__IFLA_GTP_MAX,
++};
++#define IFLA_GTP_MAX (__IFLA_GTP_MAX - 1)
++
++/* Bonding section */
++
++enum {
++	IFLA_BOND_UNSPEC,
++	IFLA_BOND_MODE,
++	IFLA_BOND_ACTIVE_SLAVE,
++	IFLA_BOND_MIIMON,
++	IFLA_BOND_UPDELAY,
++	IFLA_BOND_DOWNDELAY,
++	IFLA_BOND_USE_CARRIER,
++	IFLA_BOND_ARP_INTERVAL,
++	IFLA_BOND_ARP_IP_TARGET,
++	IFLA_BOND_ARP_VALIDATE,
++	IFLA_BOND_ARP_ALL_TARGETS,
++	IFLA_BOND_PRIMARY,
++	IFLA_BOND_PRIMARY_RESELECT,
++	IFLA_BOND_FAIL_OVER_MAC,
++	IFLA_BOND_XMIT_HASH_POLICY,
++	IFLA_BOND_RESEND_IGMP,
++	IFLA_BOND_NUM_PEER_NOTIF,
++	IFLA_BOND_ALL_SLAVES_ACTIVE,
++	IFLA_BOND_MIN_LINKS,
++	IFLA_BOND_LP_INTERVAL,
++	IFLA_BOND_PACKETS_PER_SLAVE,
++	IFLA_BOND_AD_LACP_RATE,
++	IFLA_BOND_AD_SELECT,
++	IFLA_BOND_AD_INFO,
++	IFLA_BOND_AD_ACTOR_SYS_PRIO,
++	IFLA_BOND_AD_USER_PORT_KEY,
++	IFLA_BOND_AD_ACTOR_SYSTEM,
++	IFLA_BOND_TLB_DYNAMIC_LB,
++	__IFLA_BOND_MAX,
++};
++
++#define IFLA_BOND_MAX	(__IFLA_BOND_MAX - 1)
++
++enum {
++	IFLA_BOND_AD_INFO_UNSPEC,
++	IFLA_BOND_AD_INFO_AGGREGATOR,
++	IFLA_BOND_AD_INFO_NUM_PORTS,
++	IFLA_BOND_AD_INFO_ACTOR_KEY,
++	IFLA_BOND_AD_INFO_PARTNER_KEY,
++	IFLA_BOND_AD_INFO_PARTNER_MAC,
++	__IFLA_BOND_AD_INFO_MAX,
++};
++
++#define IFLA_BOND_AD_INFO_MAX	(__IFLA_BOND_AD_INFO_MAX - 1)
++
++enum {
++	IFLA_BOND_SLAVE_UNSPEC,
++	IFLA_BOND_SLAVE_STATE,
++	IFLA_BOND_SLAVE_MII_STATUS,
++	IFLA_BOND_SLAVE_LINK_FAILURE_COUNT,
++	IFLA_BOND_SLAVE_PERM_HWADDR,
++	IFLA_BOND_SLAVE_QUEUE_ID,
++	IFLA_BOND_SLAVE_AD_AGGREGATOR_ID,
++	IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE,
++	IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE,
++	__IFLA_BOND_SLAVE_MAX,
++};
++
++#define IFLA_BOND_SLAVE_MAX	(__IFLA_BOND_SLAVE_MAX - 1)
++
++/* SR-IOV virtual function management section */
++
++enum {
++	IFLA_VF_INFO_UNSPEC,
++	IFLA_VF_INFO,
++	__IFLA_VF_INFO_MAX,
++};
++
++#define IFLA_VF_INFO_MAX (__IFLA_VF_INFO_MAX - 1)
++
++enum {
++	IFLA_VF_UNSPEC,
++	IFLA_VF_MAC,		/* Hardware queue specific attributes */
++	IFLA_VF_VLAN,		/* VLAN ID and QoS */
++	IFLA_VF_TX_RATE,	/* Max TX Bandwidth Allocation */
++	IFLA_VF_SPOOFCHK,	/* Spoof Checking on/off switch */
++	IFLA_VF_LINK_STATE,	/* link state enable/disable/auto switch */
++	IFLA_VF_RATE,		/* Min and Max TX Bandwidth Allocation */
++	IFLA_VF_RSS_QUERY_EN,	/* RSS Redirection Table and Hash Key query
++				 * on/off switch
++				 */
++	IFLA_VF_STATS,		/* network device statistics */
++	IFLA_VF_TRUST,		/* Trust VF */
++	IFLA_VF_IB_NODE_GUID,	/* VF Infiniband node GUID */
++	IFLA_VF_IB_PORT_GUID,	/* VF Infiniband port GUID */
++	IFLA_VF_VLAN_LIST,	/* nested list of vlans, option for QinQ */
++	__IFLA_VF_MAX,
++};
++
++#define IFLA_VF_MAX (__IFLA_VF_MAX - 1)
++
++struct ifla_vf_mac {
++	__u32 vf;
++	__u8 mac[32]; /* MAX_ADDR_LEN */
++};
++
++struct ifla_vf_vlan {
++	__u32 vf;
++	__u32 vlan; /* 0 - 4095, 0 disables VLAN filter */
++	__u32 qos;
++};
++
++enum {
++	IFLA_VF_VLAN_INFO_UNSPEC,
++	IFLA_VF_VLAN_INFO,	/* VLAN ID, QoS and VLAN protocol */
++	__IFLA_VF_VLAN_INFO_MAX,
++};
++
++#define IFLA_VF_VLAN_INFO_MAX (__IFLA_VF_VLAN_INFO_MAX - 1)
++#define MAX_VLAN_LIST_LEN 1
++
++struct ifla_vf_vlan_info {
++	__u32 vf;
++	__u32 vlan; /* 0 - 4095, 0 disables VLAN filter */
++	__u32 qos;
++	__be16 vlan_proto; /* VLAN protocol either 802.1Q or 802.1ad */
++};
++
++struct ifla_vf_tx_rate {
++	__u32 vf;
++	__u32 rate; /* Max TX bandwidth in Mbps, 0 disables throttling */
++};
++
++struct ifla_vf_rate {
++	__u32 vf;
++	__u32 min_tx_rate; /* Min Bandwidth in Mbps */
++	__u32 max_tx_rate; /* Max Bandwidth in Mbps */
++};
++
++struct ifla_vf_spoofchk {
++	__u32 vf;
++	__u32 setting;
++};
++
++struct ifla_vf_guid {
++	__u32 vf;
++	__u64 guid;
++};
++
++enum {
++	IFLA_VF_LINK_STATE_AUTO,	/* link state of the uplink */
++	IFLA_VF_LINK_STATE_ENABLE,	/* link always up */
++	IFLA_VF_LINK_STATE_DISABLE,	/* link always down */
++	__IFLA_VF_LINK_STATE_MAX,
++};
++
++struct ifla_vf_link_state {
++	__u32 vf;
++	__u32 link_state;
++};
++
++struct ifla_vf_rss_query_en {
++	__u32 vf;
++	__u32 setting;
++};
++
++enum {
++	IFLA_VF_STATS_RX_PACKETS,
++	IFLA_VF_STATS_TX_PACKETS,
++	IFLA_VF_STATS_RX_BYTES,
++	IFLA_VF_STATS_TX_BYTES,
++	IFLA_VF_STATS_BROADCAST,
++	IFLA_VF_STATS_MULTICAST,
++	IFLA_VF_STATS_PAD,
++	__IFLA_VF_STATS_MAX,
++};
++
++#define IFLA_VF_STATS_MAX (__IFLA_VF_STATS_MAX - 1)
++
++struct ifla_vf_trust {
++	__u32 vf;
++	__u32 setting;
++};
++
++/* VF ports management section
++ *
++ *	Nested layout of set/get msg is:
++ *
++ *		[IFLA_NUM_VF]
++ *		[IFLA_VF_PORTS]
++ *			[IFLA_VF_PORT]
++ *				[IFLA_PORT_*], ...
++ *			[IFLA_VF_PORT]
++ *				[IFLA_PORT_*], ...
++ *			...
++ *		[IFLA_PORT_SELF]
++ *			[IFLA_PORT_*], ...
++ */
++
++enum {
++	IFLA_VF_PORT_UNSPEC,
++	IFLA_VF_PORT,			/* nest */
++	__IFLA_VF_PORT_MAX,
++};
++
++#define IFLA_VF_PORT_MAX (__IFLA_VF_PORT_MAX - 1)
++
++enum {
++	IFLA_PORT_UNSPEC,
++	IFLA_PORT_VF,			/* __u32 */
++	IFLA_PORT_PROFILE,		/* string */
++	IFLA_PORT_VSI_TYPE,		/* 802.1Qbg (pre-)standard VDP */
++	IFLA_PORT_INSTANCE_UUID,	/* binary UUID */
++	IFLA_PORT_HOST_UUID,		/* binary UUID */
++	IFLA_PORT_REQUEST,		/* __u8 */
++	IFLA_PORT_RESPONSE,		/* __u16, output only */
++	__IFLA_PORT_MAX,
++};
++
++#define IFLA_PORT_MAX (__IFLA_PORT_MAX - 1)
++
++#define PORT_PROFILE_MAX	40
++#define PORT_UUID_MAX		16
++#define PORT_SELF_VF		-1
++
++enum {
++	PORT_REQUEST_PREASSOCIATE = 0,
++	PORT_REQUEST_PREASSOCIATE_RR,
++	PORT_REQUEST_ASSOCIATE,
++	PORT_REQUEST_DISASSOCIATE,
++};
++
++enum {
++	PORT_VDP_RESPONSE_SUCCESS = 0,
++	PORT_VDP_RESPONSE_INVALID_FORMAT,
++	PORT_VDP_RESPONSE_INSUFFICIENT_RESOURCES,
++	PORT_VDP_RESPONSE_UNUSED_VTID,
++	PORT_VDP_RESPONSE_VTID_VIOLATION,
++	PORT_VDP_RESPONSE_VTID_VERSION_VIOALTION,
++	PORT_VDP_RESPONSE_OUT_OF_SYNC,
++	/* 0x08-0xFF reserved for future VDP use */
++	PORT_PROFILE_RESPONSE_SUCCESS = 0x100,
++	PORT_PROFILE_RESPONSE_INPROGRESS,
++	PORT_PROFILE_RESPONSE_INVALID,
++	PORT_PROFILE_RESPONSE_BADSTATE,
++	PORT_PROFILE_RESPONSE_INSUFFICIENT_RESOURCES,
++	PORT_PROFILE_RESPONSE_ERROR,
++};
++
++struct ifla_port_vsi {
++	__u8 vsi_mgr_id;
++	__u8 vsi_type_id[3];
++	__u8 vsi_type_version;
++	__u8 pad[3];
++};
++
++
++/* IPoIB section */
++
++enum {
++	IFLA_IPOIB_UNSPEC,
++	IFLA_IPOIB_PKEY,
++	IFLA_IPOIB_MODE,
++	IFLA_IPOIB_UMCAST,
++	__IFLA_IPOIB_MAX
++};
++
++enum {
++	IPOIB_MODE_DATAGRAM  = 0, /* using unreliable datagram QPs */
++	IPOIB_MODE_CONNECTED = 1, /* using connected QPs */
++};
++
++#define IFLA_IPOIB_MAX (__IFLA_IPOIB_MAX - 1)
++
++
++/* HSR section */
++
++enum {
++	IFLA_HSR_UNSPEC,
++	IFLA_HSR_SLAVE1,
++	IFLA_HSR_SLAVE2,
++	IFLA_HSR_MULTICAST_SPEC,	/* Last byte of supervision addr */
++	IFLA_HSR_SUPERVISION_ADDR,	/* Supervision frame multicast addr */
++	IFLA_HSR_SEQ_NR,
++	IFLA_HSR_VERSION,		/* HSR version */
++	__IFLA_HSR_MAX,
++};
++
++#define IFLA_HSR_MAX (__IFLA_HSR_MAX - 1)
++
++/* STATS section */
++
++struct if_stats_msg {
++	__u8  family;
++	__u8  pad1;
++	__u16 pad2;
++	__u32 ifindex;
++	__u32 filter_mask;
++};
++
++/* A stats attribute can be netdev specific or a global stat.
++ * For netdev stats, lets use the prefix IFLA_STATS_LINK_*
++ */
++enum {
++	IFLA_STATS_UNSPEC, /* also used as 64bit pad attribute */
++	IFLA_STATS_LINK_64,
++	IFLA_STATS_LINK_XSTATS,
++	IFLA_STATS_LINK_XSTATS_SLAVE,
++	IFLA_STATS_LINK_OFFLOAD_XSTATS,
++	IFLA_STATS_AF_SPEC,
++	__IFLA_STATS_MAX,
++};
++
++#define IFLA_STATS_MAX (__IFLA_STATS_MAX - 1)
++
++#define IFLA_STATS_FILTER_BIT(ATTR)	(1 << (ATTR - 1))
++
++/* These are embedded into IFLA_STATS_LINK_XSTATS:
++ * [IFLA_STATS_LINK_XSTATS]
++ * -> [LINK_XSTATS_TYPE_xxx]
++ *    -> [rtnl link type specific attributes]
++ */
++enum {
++	LINK_XSTATS_TYPE_UNSPEC,
++	LINK_XSTATS_TYPE_BRIDGE,
++	__LINK_XSTATS_TYPE_MAX
++};
++#define LINK_XSTATS_TYPE_MAX (__LINK_XSTATS_TYPE_MAX - 1)
++
++/* These are stats embedded into IFLA_STATS_LINK_OFFLOAD_XSTATS */
++enum {
++	IFLA_OFFLOAD_XSTATS_UNSPEC,
++	IFLA_OFFLOAD_XSTATS_CPU_HIT, /* struct rtnl_link_stats64 */
++	__IFLA_OFFLOAD_XSTATS_MAX
++};
++#define IFLA_OFFLOAD_XSTATS_MAX (__IFLA_OFFLOAD_XSTATS_MAX - 1)
++
++/* XDP section */
++
++#define XDP_FLAGS_UPDATE_IF_NOEXIST	(1U << 0)
++#define XDP_FLAGS_SKB_MODE		(1U << 1)
++#define XDP_FLAGS_DRV_MODE		(1U << 2)
++#define XDP_FLAGS_HW_MODE		(1U << 3)
++#define XDP_FLAGS_MODES			(XDP_FLAGS_SKB_MODE | \
++					 XDP_FLAGS_DRV_MODE | \
++					 XDP_FLAGS_HW_MODE)
++#define XDP_FLAGS_MASK			(XDP_FLAGS_UPDATE_IF_NOEXIST | \
++					 XDP_FLAGS_MODES)
++
++/* These are stored into IFLA_XDP_ATTACHED on dump. */
++enum {
++	XDP_ATTACHED_NONE = 0,
++	XDP_ATTACHED_DRV,
++	XDP_ATTACHED_SKB,
++	XDP_ATTACHED_HW,
++};
++
++enum {
++	IFLA_XDP_UNSPEC,
++	IFLA_XDP_FD,
++	IFLA_XDP_ATTACHED,
++	IFLA_XDP_FLAGS,
++	IFLA_XDP_PROG_ID,
++	__IFLA_XDP_MAX,
++};
++
++#define IFLA_XDP_MAX (__IFLA_XDP_MAX - 1)
++
++enum {
++	IFLA_EVENT_NONE,
++	IFLA_EVENT_REBOOT,		/* internal reset / reboot */
++	IFLA_EVENT_FEATURES,		/* change in offload features */
++	IFLA_EVENT_BONDING_FAILOVER,	/* change in active slave */
++	IFLA_EVENT_NOTIFY_PEERS,	/* re-sent grat. arp/ndisc */
++	IFLA_EVENT_IGMP_RESEND,		/* re-sent IGMP JOIN */
++	IFLA_EVENT_BONDING_OPTIONS,	/* change in bonding options */
++};
++
++#endif /* _LINUX_IF_LINK_H */
+diff --git a/include/uapi/linux/if_macsec.h b/include/uapi/linux/if_macsec.h
+new file mode 100644
+index 0000000..22939a3
+--- /dev/null
++++ b/include/uapi/linux/if_macsec.h
+@@ -0,0 +1,171 @@
++/*
++ * include/uapi/linux/if_macsec.h - MACsec device
++ *
++ * Copyright (c) 2015 Sabrina Dubroca <sd@queasysnail.net>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ */
++
++#ifndef _MACSEC_H
++#define _MACSEC_H
++
++#include <linux/types.h>
++
++#define MACSEC_GENL_NAME "macsec"
++#define MACSEC_GENL_VERSION 1
++
++#define MACSEC_MAX_KEY_LEN 128
++
++#define MACSEC_KEYID_LEN 16
++
++#define MACSEC_DEFAULT_CIPHER_ID   0x0080020001000001ULL
++#define MACSEC_DEFAULT_CIPHER_ALT  0x0080C20001000001ULL
++
++#define MACSEC_MIN_ICV_LEN 8
++#define MACSEC_MAX_ICV_LEN 32
++/* upper limit for ICV length as recommended by IEEE802.1AE-2006 */
++#define MACSEC_STD_ICV_LEN 16
++
++enum macsec_attrs {
++	MACSEC_ATTR_UNSPEC,
++	MACSEC_ATTR_IFINDEX,     /* u32, ifindex of the MACsec netdevice */
++	MACSEC_ATTR_RXSC_CONFIG, /* config, nested macsec_rxsc_attrs */
++	MACSEC_ATTR_SA_CONFIG,   /* config, nested macsec_sa_attrs */
++	MACSEC_ATTR_SECY,        /* dump, nested macsec_secy_attrs */
++	MACSEC_ATTR_TXSA_LIST,   /* dump, nested, macsec_sa_attrs for each TXSA */
++	MACSEC_ATTR_RXSC_LIST,   /* dump, nested, macsec_rxsc_attrs for each RXSC */
++	MACSEC_ATTR_TXSC_STATS,  /* dump, nested, macsec_txsc_stats_attr */
++	MACSEC_ATTR_SECY_STATS,  /* dump, nested, macsec_secy_stats_attr */
++	__MACSEC_ATTR_END,
++	NUM_MACSEC_ATTR = __MACSEC_ATTR_END,
++	MACSEC_ATTR_MAX = __MACSEC_ATTR_END - 1,
++};
++
++enum macsec_secy_attrs {
++	MACSEC_SECY_ATTR_UNSPEC,
++	MACSEC_SECY_ATTR_SCI,
++	MACSEC_SECY_ATTR_ENCODING_SA,
++	MACSEC_SECY_ATTR_WINDOW,
++	MACSEC_SECY_ATTR_CIPHER_SUITE,
++	MACSEC_SECY_ATTR_ICV_LEN,
++	MACSEC_SECY_ATTR_PROTECT,
++	MACSEC_SECY_ATTR_REPLAY,
++	MACSEC_SECY_ATTR_OPER,
++	MACSEC_SECY_ATTR_VALIDATE,
++	MACSEC_SECY_ATTR_ENCRYPT,
++	MACSEC_SECY_ATTR_INC_SCI,
++	MACSEC_SECY_ATTR_ES,
++	MACSEC_SECY_ATTR_SCB,
++	MACSEC_SECY_ATTR_PAD,
++	__MACSEC_SECY_ATTR_END,
++	NUM_MACSEC_SECY_ATTR = __MACSEC_SECY_ATTR_END,
++	MACSEC_SECY_ATTR_MAX = __MACSEC_SECY_ATTR_END - 1,
++};
++
++enum macsec_rxsc_attrs {
++	MACSEC_RXSC_ATTR_UNSPEC,
++	MACSEC_RXSC_ATTR_SCI,     /* config/dump, u64 */
++	MACSEC_RXSC_ATTR_ACTIVE,  /* config/dump, u8 0..1 */
++	MACSEC_RXSC_ATTR_SA_LIST, /* dump, nested */
++	MACSEC_RXSC_ATTR_STATS,   /* dump, nested, macsec_rxsc_stats_attr */
++	MACSEC_RXSC_ATTR_PAD,
++	__MACSEC_RXSC_ATTR_END,
++	NUM_MACSEC_RXSC_ATTR = __MACSEC_RXSC_ATTR_END,
++	MACSEC_RXSC_ATTR_MAX = __MACSEC_RXSC_ATTR_END - 1,
++};
++
++enum macsec_sa_attrs {
++	MACSEC_SA_ATTR_UNSPEC,
++	MACSEC_SA_ATTR_AN,     /* config/dump, u8 0..3 */
++	MACSEC_SA_ATTR_ACTIVE, /* config/dump, u8 0..1 */
++	MACSEC_SA_ATTR_PN,     /* config/dump, u32 */
++	MACSEC_SA_ATTR_KEY,    /* config, data */
++	MACSEC_SA_ATTR_KEYID,  /* config/dump, 128-bit */
++	MACSEC_SA_ATTR_STATS,  /* dump, nested, macsec_sa_stats_attr */
++	MACSEC_SA_ATTR_PAD,
++	__MACSEC_SA_ATTR_END,
++	NUM_MACSEC_SA_ATTR = __MACSEC_SA_ATTR_END,
++	MACSEC_SA_ATTR_MAX = __MACSEC_SA_ATTR_END - 1,
++};
++
++enum macsec_nl_commands {
++	MACSEC_CMD_GET_TXSC,
++	MACSEC_CMD_ADD_RXSC,
++	MACSEC_CMD_DEL_RXSC,
++	MACSEC_CMD_UPD_RXSC,
++	MACSEC_CMD_ADD_TXSA,
++	MACSEC_CMD_DEL_TXSA,
++	MACSEC_CMD_UPD_TXSA,
++	MACSEC_CMD_ADD_RXSA,
++	MACSEC_CMD_DEL_RXSA,
++	MACSEC_CMD_UPD_RXSA,
++};
++
++/* u64 per-RXSC stats */
++enum macsec_rxsc_stats_attr {
++	MACSEC_RXSC_STATS_ATTR_UNSPEC,
++	MACSEC_RXSC_STATS_ATTR_IN_OCTETS_VALIDATED,
++	MACSEC_RXSC_STATS_ATTR_IN_OCTETS_DECRYPTED,
++	MACSEC_RXSC_STATS_ATTR_IN_PKTS_UNCHECKED,
++	MACSEC_RXSC_STATS_ATTR_IN_PKTS_DELAYED,
++	MACSEC_RXSC_STATS_ATTR_IN_PKTS_OK,
++	MACSEC_RXSC_STATS_ATTR_IN_PKTS_INVALID,
++	MACSEC_RXSC_STATS_ATTR_IN_PKTS_LATE,
++	MACSEC_RXSC_STATS_ATTR_IN_PKTS_NOT_VALID,
++	MACSEC_RXSC_STATS_ATTR_IN_PKTS_NOT_USING_SA,
++	MACSEC_RXSC_STATS_ATTR_IN_PKTS_UNUSED_SA,
++	MACSEC_RXSC_STATS_ATTR_PAD,
++	__MACSEC_RXSC_STATS_ATTR_END,
++	NUM_MACSEC_RXSC_STATS_ATTR = __MACSEC_RXSC_STATS_ATTR_END,
++	MACSEC_RXSC_STATS_ATTR_MAX = __MACSEC_RXSC_STATS_ATTR_END - 1,
++};
++
++/* u32 per-{RX,TX}SA stats */
++enum macsec_sa_stats_attr {
++	MACSEC_SA_STATS_ATTR_UNSPEC,
++	MACSEC_SA_STATS_ATTR_IN_PKTS_OK,
++	MACSEC_SA_STATS_ATTR_IN_PKTS_INVALID,
++	MACSEC_SA_STATS_ATTR_IN_PKTS_NOT_VALID,
++	MACSEC_SA_STATS_ATTR_IN_PKTS_NOT_USING_SA,
++	MACSEC_SA_STATS_ATTR_IN_PKTS_UNUSED_SA,
++	MACSEC_SA_STATS_ATTR_OUT_PKTS_PROTECTED,
++	MACSEC_SA_STATS_ATTR_OUT_PKTS_ENCRYPTED,
++	__MACSEC_SA_STATS_ATTR_END,
++	NUM_MACSEC_SA_STATS_ATTR = __MACSEC_SA_STATS_ATTR_END,
++	MACSEC_SA_STATS_ATTR_MAX = __MACSEC_SA_STATS_ATTR_END - 1,
++};
++
++/* u64 per-TXSC stats */
++enum macsec_txsc_stats_attr {
++	MACSEC_TXSC_STATS_ATTR_UNSPEC,
++	MACSEC_TXSC_STATS_ATTR_OUT_PKTS_PROTECTED,
++	MACSEC_TXSC_STATS_ATTR_OUT_PKTS_ENCRYPTED,
++	MACSEC_TXSC_STATS_ATTR_OUT_OCTETS_PROTECTED,
++	MACSEC_TXSC_STATS_ATTR_OUT_OCTETS_ENCRYPTED,
++	MACSEC_TXSC_STATS_ATTR_PAD,
++	__MACSEC_TXSC_STATS_ATTR_END,
++	NUM_MACSEC_TXSC_STATS_ATTR = __MACSEC_TXSC_STATS_ATTR_END,
++	MACSEC_TXSC_STATS_ATTR_MAX = __MACSEC_TXSC_STATS_ATTR_END - 1,
++};
++
++/* u64 per-SecY stats */
++enum macsec_secy_stats_attr {
++	MACSEC_SECY_STATS_ATTR_UNSPEC,
++	MACSEC_SECY_STATS_ATTR_OUT_PKTS_UNTAGGED,
++	MACSEC_SECY_STATS_ATTR_IN_PKTS_UNTAGGED,
++	MACSEC_SECY_STATS_ATTR_OUT_PKTS_TOO_LONG,
++	MACSEC_SECY_STATS_ATTR_IN_PKTS_NO_TAG,
++	MACSEC_SECY_STATS_ATTR_IN_PKTS_BAD_TAG,
++	MACSEC_SECY_STATS_ATTR_IN_PKTS_UNKNOWN_SCI,
++	MACSEC_SECY_STATS_ATTR_IN_PKTS_NO_SCI,
++	MACSEC_SECY_STATS_ATTR_IN_PKTS_OVERRUN,
++	MACSEC_SECY_STATS_ATTR_PAD,
++	__MACSEC_SECY_STATS_ATTR_END,
++	NUM_MACSEC_SECY_STATS_ATTR = __MACSEC_SECY_STATS_ATTR_END,
++	MACSEC_SECY_STATS_ATTR_MAX = __MACSEC_SECY_STATS_ATTR_END - 1,
++};
++
++#endif /* _MACSEC_H */
+diff --git a/include/uapi/linux/if_packet.h b/include/uapi/linux/if_packet.h
+new file mode 100644
+index 0000000..4df96a7
+--- /dev/null
++++ b/include/uapi/linux/if_packet.h
+@@ -0,0 +1,302 @@
++#ifndef __LINUX_IF_PACKET_H
++#define __LINUX_IF_PACKET_H
++
++#include <linux/types.h>
++
++struct sockaddr_pkt {
++	unsigned short spkt_family;
++	unsigned char spkt_device[14];
++	__be16 spkt_protocol;
++};
++
++struct sockaddr_ll {
++	unsigned short	sll_family;
++	__be16		sll_protocol;
++	int		sll_ifindex;
++	unsigned short	sll_hatype;
++	unsigned char	sll_pkttype;
++	unsigned char	sll_halen;
++	unsigned char	sll_addr[8];
++};
++
++/* Packet types */
++
++#define PACKET_HOST		0		/* To us		*/
++#define PACKET_BROADCAST	1		/* To all		*/
++#define PACKET_MULTICAST	2		/* To group		*/
++#define PACKET_OTHERHOST	3		/* To someone else 	*/
++#define PACKET_OUTGOING		4		/* Outgoing of any type */
++#define PACKET_LOOPBACK		5		/* MC/BRD frame looped back */
++#define PACKET_USER		6		/* To user space	*/
++#define PACKET_KERNEL		7		/* To kernel space	*/
++/* Unused, PACKET_FASTROUTE and PACKET_LOOPBACK are invisible to user space */
++#define PACKET_FASTROUTE	6		/* Fastrouted frame	*/
++
++/* Packet socket options */
++
++#define PACKET_ADD_MEMBERSHIP		1
++#define PACKET_DROP_MEMBERSHIP		2
++#define PACKET_RECV_OUTPUT		3
++/* Value 4 is still used by obsolete turbo-packet. */
++#define PACKET_RX_RING			5
++#define PACKET_STATISTICS		6
++#define PACKET_COPY_THRESH		7
++#define PACKET_AUXDATA			8
++#define PACKET_ORIGDEV			9
++#define PACKET_VERSION			10
++#define PACKET_HDRLEN			11
++#define PACKET_RESERVE			12
++#define PACKET_TX_RING			13
++#define PACKET_LOSS			14
++#define PACKET_VNET_HDR			15
++#define PACKET_TX_TIMESTAMP		16
++#define PACKET_TIMESTAMP		17
++#define PACKET_FANOUT			18
++#define PACKET_TX_HAS_OFF		19
++#define PACKET_QDISC_BYPASS		20
++#define PACKET_ROLLOVER_STATS		21
++#define PACKET_FANOUT_DATA		22
++
++#define PACKET_FANOUT_HASH		0
++#define PACKET_FANOUT_LB		1
++#define PACKET_FANOUT_CPU		2
++#define PACKET_FANOUT_ROLLOVER		3
++#define PACKET_FANOUT_RND		4
++#define PACKET_FANOUT_QM		5
++#define PACKET_FANOUT_CBPF		6
++#define PACKET_FANOUT_EBPF		7
++#define PACKET_FANOUT_FLAG_ROLLOVER	0x1000
++#define PACKET_FANOUT_FLAG_UNIQUEID	0x2000
++#define PACKET_FANOUT_FLAG_DEFRAG	0x8000
++
++struct tpacket_stats {
++	unsigned int	tp_packets;
++	unsigned int	tp_drops;
++};
++
++struct tpacket_stats_v3 {
++	unsigned int	tp_packets;
++	unsigned int	tp_drops;
++	unsigned int	tp_freeze_q_cnt;
++};
++
++struct tpacket_rollover_stats {
++	__aligned_u64	tp_all;
++	__aligned_u64	tp_huge;
++	__aligned_u64	tp_failed;
++};
++
++union tpacket_stats_u {
++	struct tpacket_stats stats1;
++	struct tpacket_stats_v3 stats3;
++};
++
++struct tpacket_auxdata {
++	__u32		tp_status;
++	__u32		tp_len;
++	__u32		tp_snaplen;
++	__u16		tp_mac;
++	__u16		tp_net;
++	__u16		tp_vlan_tci;
++	__u16		tp_vlan_tpid;
++};
++
++/* Rx ring - header status */
++#define TP_STATUS_KERNEL		      0
++#define TP_STATUS_USER			(1 << 0)
++#define TP_STATUS_COPY			(1 << 1)
++#define TP_STATUS_LOSING		(1 << 2)
++#define TP_STATUS_CSUMNOTREADY		(1 << 3)
++#define TP_STATUS_VLAN_VALID		(1 << 4) /* auxdata has valid tp_vlan_tci */
++#define TP_STATUS_BLK_TMO		(1 << 5)
++#define TP_STATUS_VLAN_TPID_VALID	(1 << 6) /* auxdata has valid tp_vlan_tpid */
++#define TP_STATUS_CSUM_VALID		(1 << 7)
++
++/* Tx ring - header status */
++#define TP_STATUS_AVAILABLE	      0
++#define TP_STATUS_SEND_REQUEST	(1 << 0)
++#define TP_STATUS_SENDING	(1 << 1)
++#define TP_STATUS_WRONG_FORMAT	(1 << 2)
++
++/* Rx and Tx ring - header status */
++#define TP_STATUS_TS_SOFTWARE		(1 << 29)
++#define TP_STATUS_TS_SYS_HARDWARE	(1 << 30) /* deprecated, never set */
++#define TP_STATUS_TS_RAW_HARDWARE	(1 << 31)
++
++/* Rx ring - feature request bits */
++#define TP_FT_REQ_FILL_RXHASH	0x1
++
++struct tpacket_hdr {
++	unsigned long	tp_status;
++	unsigned int	tp_len;
++	unsigned int	tp_snaplen;
++	unsigned short	tp_mac;
++	unsigned short	tp_net;
++	unsigned int	tp_sec;
++	unsigned int	tp_usec;
++};
++
++#define TPACKET_ALIGNMENT	16
++#define TPACKET_ALIGN(x)	(((x)+TPACKET_ALIGNMENT-1)&~(TPACKET_ALIGNMENT-1))
++#define TPACKET_HDRLEN		(TPACKET_ALIGN(sizeof(struct tpacket_hdr)) + sizeof(struct sockaddr_ll))
++
++struct tpacket2_hdr {
++	__u32		tp_status;
++	__u32		tp_len;
++	__u32		tp_snaplen;
++	__u16		tp_mac;
++	__u16		tp_net;
++	__u32		tp_sec;
++	__u32		tp_nsec;
++	__u16		tp_vlan_tci;
++	__u16		tp_vlan_tpid;
++	__u8		tp_padding[4];
++};
++
++struct tpacket_hdr_variant1 {
++	__u32	tp_rxhash;
++	__u32	tp_vlan_tci;
++	__u16	tp_vlan_tpid;
++	__u16	tp_padding;
++};
++
++struct tpacket3_hdr {
++	__u32		tp_next_offset;
++	__u32		tp_sec;
++	__u32		tp_nsec;
++	__u32		tp_snaplen;
++	__u32		tp_len;
++	__u32		tp_status;
++	__u16		tp_mac;
++	__u16		tp_net;
++	/* pkt_hdr variants */
++	union {
++		struct tpacket_hdr_variant1 hv1;
++	};
++	__u8		tp_padding[8];
++};
++
++struct tpacket_bd_ts {
++	unsigned int ts_sec;
++	union {
++		unsigned int ts_usec;
++		unsigned int ts_nsec;
++	};
++};
++
++struct tpacket_hdr_v1 {
++	__u32	block_status;
++	__u32	num_pkts;
++	__u32	offset_to_first_pkt;
++
++	/* Number of valid bytes (including padding)
++	 * blk_len <= tp_block_size
++	 */
++	__u32	blk_len;
++
++	/*
++	 * Quite a few uses of sequence number:
++	 * 1. Make sure cache flush etc worked.
++	 *    Well, one can argue - why not use the increasing ts below?
++	 *    But look at 2. below first.
++	 * 2. When you pass around blocks to other user space decoders,
++	 *    you can see which blk[s] is[are] outstanding etc.
++	 * 3. Validate kernel code.
++	 */
++	__aligned_u64	seq_num;
++
++	/*
++	 * ts_last_pkt:
++	 *
++	 * Case 1.	Block has 'N'(N >=1) packets and TMO'd(timed out)
++	 *		ts_last_pkt == 'time-stamp of last packet' and NOT the
++	 *		time when the timer fired and the block was closed.
++	 *		By providing the ts of the last packet we can absolutely
++	 *		guarantee that time-stamp wise, the first packet in the
++	 *		next block will never precede the last packet of the
++	 *		previous block.
++	 * Case 2.	Block has zero packets and TMO'd
++	 *		ts_last_pkt = time when the timer fired and the block
++	 *		was closed.
++	 * Case 3.	Block has 'N' packets and NO TMO.
++	 *		ts_last_pkt = time-stamp of the last pkt in the block.
++	 *
++	 * ts_first_pkt:
++	 *		Is always the time-stamp when the block was opened.
++	 *		Case a)	ZERO packets
++	 *			No packets to deal with but atleast you know the
++	 *			time-interval of this block.
++	 *		Case b) Non-zero packets
++	 *			Use the ts of the first packet in the block.
++	 *
++	 */
++	struct tpacket_bd_ts	ts_first_pkt, ts_last_pkt;
++};
++
++union tpacket_bd_header_u {
++	struct tpacket_hdr_v1 bh1;
++};
++
++struct tpacket_block_desc {
++	__u32 version;
++	__u32 offset_to_priv;
++	union tpacket_bd_header_u hdr;
++};
++
++#define TPACKET2_HDRLEN		(TPACKET_ALIGN(sizeof(struct tpacket2_hdr)) + sizeof(struct sockaddr_ll))
++#define TPACKET3_HDRLEN		(TPACKET_ALIGN(sizeof(struct tpacket3_hdr)) + sizeof(struct sockaddr_ll))
++
++enum tpacket_versions {
++	TPACKET_V1,
++	TPACKET_V2,
++	TPACKET_V3
++};
++
++/*
++   Frame structure:
++
++   - Start. Frame must be aligned to TPACKET_ALIGNMENT=16
++   - struct tpacket_hdr
++   - pad to TPACKET_ALIGNMENT=16
++   - struct sockaddr_ll
++   - Gap, chosen so that packet data (Start+tp_net) alignes to TPACKET_ALIGNMENT=16
++   - Start+tp_mac: [ Optional MAC header ]
++   - Start+tp_net: Packet data, aligned to TPACKET_ALIGNMENT=16.
++   - Pad to align to TPACKET_ALIGNMENT=16
++ */
++
++struct tpacket_req {
++	unsigned int	tp_block_size;	/* Minimal size of contiguous block */
++	unsigned int	tp_block_nr;	/* Number of blocks */
++	unsigned int	tp_frame_size;	/* Size of frame */
++	unsigned int	tp_frame_nr;	/* Total number of frames */
++};
++
++struct tpacket_req3 {
++	unsigned int	tp_block_size;	/* Minimal size of contiguous block */
++	unsigned int	tp_block_nr;	/* Number of blocks */
++	unsigned int	tp_frame_size;	/* Size of frame */
++	unsigned int	tp_frame_nr;	/* Total number of frames */
++	unsigned int	tp_retire_blk_tov; /* timeout in msecs */
++	unsigned int	tp_sizeof_priv; /* offset to private data area */
++	unsigned int	tp_feature_req_word;
++};
++
++union tpacket_req_u {
++	struct tpacket_req	req;
++	struct tpacket_req3	req3;
++};
++
++struct packet_mreq {
++	int		mr_ifindex;
++	unsigned short	mr_type;
++	unsigned short	mr_alen;
++	unsigned char	mr_address[8];
++};
++
++#define PACKET_MR_MULTICAST	0
++#define PACKET_MR_PROMISC	1
++#define PACKET_MR_ALLMULTI	2
++#define PACKET_MR_UNICAST	3
++
++#endif
+diff --git a/include/uapi/linux/if_tun.h b/include/uapi/linux/if_tun.h
+new file mode 100644
+index 0000000..d5ecb42
+--- /dev/null
++++ b/include/uapi/linux/if_tun.h
+@@ -0,0 +1,107 @@
++/*
++ *  Universal TUN/TAP device driver.
++ *  Copyright (C) 1999-2000 Maxim Krasnyansky <max_mk@yahoo.com>
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ *  GNU General Public License for more details.
++ */
++
++#ifndef __IF_TUN_H
++#define __IF_TUN_H
++
++#include <linux/types.h>
++#include <linux/if_ether.h>
++#include <linux/filter.h>
++
++/* Read queue size */
++#define TUN_READQ_SIZE	500
++/* TUN device type flags: deprecated. Use IFF_TUN/IFF_TAP instead. */
++#define TUN_TUN_DEV 	IFF_TUN
++#define TUN_TAP_DEV	IFF_TAP
++#define TUN_TYPE_MASK   0x000f
++
++/* Ioctl defines */
++#define TUNSETNOCSUM  _IOW('T', 200, int) 
++#define TUNSETDEBUG   _IOW('T', 201, int) 
++#define TUNSETIFF     _IOW('T', 202, int) 
++#define TUNSETPERSIST _IOW('T', 203, int) 
++#define TUNSETOWNER   _IOW('T', 204, int)
++#define TUNSETLINK    _IOW('T', 205, int)
++#define TUNSETGROUP   _IOW('T', 206, int)
++#define TUNGETFEATURES _IOR('T', 207, unsigned int)
++#define TUNSETOFFLOAD  _IOW('T', 208, unsigned int)
++#define TUNSETTXFILTER _IOW('T', 209, unsigned int)
++#define TUNGETIFF      _IOR('T', 210, unsigned int)
++#define TUNGETSNDBUF   _IOR('T', 211, int)
++#define TUNSETSNDBUF   _IOW('T', 212, int)
++#define TUNATTACHFILTER _IOW('T', 213, struct sock_fprog)
++#define TUNDETACHFILTER _IOW('T', 214, struct sock_fprog)
++#define TUNGETVNETHDRSZ _IOR('T', 215, int)
++#define TUNSETVNETHDRSZ _IOW('T', 216, int)
++#define TUNSETQUEUE  _IOW('T', 217, int)
++#define TUNSETIFINDEX	_IOW('T', 218, unsigned int)
++#define TUNGETFILTER _IOR('T', 219, struct sock_fprog)
++#define TUNSETVNETLE _IOW('T', 220, int)
++#define TUNGETVNETLE _IOR('T', 221, int)
++/* The TUNSETVNETBE and TUNGETVNETBE ioctls are for cross-endian support on
++ * little-endian hosts. Not all kernel configurations support them, but all
++ * configurations that support SET also support GET.
++ */
++#define TUNSETVNETBE _IOW('T', 222, int)
++#define TUNGETVNETBE _IOR('T', 223, int)
++
++/* TUNSETIFF ifr flags */
++#define IFF_TUN		0x0001
++#define IFF_TAP		0x0002
++#define IFF_NO_PI	0x1000
++/* This flag has no real effect */
++#define IFF_ONE_QUEUE	0x2000
++#define IFF_VNET_HDR	0x4000
++#define IFF_TUN_EXCL	0x8000
++#define IFF_MULTI_QUEUE 0x0100
++#define IFF_ATTACH_QUEUE 0x0200
++#define IFF_DETACH_QUEUE 0x0400
++/* read-only flag */
++#define IFF_PERSIST	0x0800
++#define IFF_NOFILTER	0x1000
++
++/* Socket options */
++#define TUN_TX_TIMESTAMP 1
++
++/* Features for GSO (TUNSETOFFLOAD). */
++#define TUN_F_CSUM	0x01	/* You can hand me unchecksummed packets. */
++#define TUN_F_TSO4	0x02	/* I can handle TSO for IPv4 packets */
++#define TUN_F_TSO6	0x04	/* I can handle TSO for IPv6 packets */
++#define TUN_F_TSO_ECN	0x08	/* I can handle TSO with ECN bits. */
++#define TUN_F_UFO	0x10	/* I can handle UFO packets */
++
++/* Protocol info prepended to the packets (when IFF_NO_PI is not set) */
++#define TUN_PKT_STRIP	0x0001
++struct tun_pi {
++	__u16  flags;
++	__be16 proto;
++};
++
++/*
++ * Filter spec (used for SETXXFILTER ioctls)
++ * This stuff is applicable only to the TAP (Ethernet) devices.
++ * If the count is zero the filter is disabled and the driver accepts
++ * all packets (promisc mode).
++ * If the filter is enabled in order to accept broadcast packets
++ * broadcast addr must be explicitly included in the addr list.
++ */
++#define TUN_FLT_ALLMULTI 0x0001 /* Accept all multicast packets */
++struct tun_filter {
++	__u16  flags; /* TUN_FLT_ flags see above */
++	__u16  count; /* Number of addresses */
++	__u8   addr[0][ETH_ALEN];
++};
++
++#endif /* __IF_TUN_H */
+diff --git a/include/uapi/linux/if_tunnel.h b/include/uapi/linux/if_tunnel.h
+new file mode 100644
+index 0000000..21834ca
+--- /dev/null
++++ b/include/uapi/linux/if_tunnel.h
+@@ -0,0 +1,158 @@
++#ifndef _IF_TUNNEL_H_
++#define _IF_TUNNEL_H_
++
++#include <linux/types.h>
++#include <linux/if.h>
++#include <linux/ip.h>
++#include <linux/in6.h>
++#include <asm/byteorder.h>
++
++
++#define SIOCGETTUNNEL   (SIOCDEVPRIVATE + 0)
++#define SIOCADDTUNNEL   (SIOCDEVPRIVATE + 1)
++#define SIOCDELTUNNEL   (SIOCDEVPRIVATE + 2)
++#define SIOCCHGTUNNEL   (SIOCDEVPRIVATE + 3)
++#define SIOCGETPRL      (SIOCDEVPRIVATE + 4)
++#define SIOCADDPRL      (SIOCDEVPRIVATE + 5)
++#define SIOCDELPRL      (SIOCDEVPRIVATE + 6)
++#define SIOCCHGPRL      (SIOCDEVPRIVATE + 7)
++#define SIOCGET6RD      (SIOCDEVPRIVATE + 8)
++#define SIOCADD6RD      (SIOCDEVPRIVATE + 9)
++#define SIOCDEL6RD      (SIOCDEVPRIVATE + 10)
++#define SIOCCHG6RD      (SIOCDEVPRIVATE + 11)
++
++#define GRE_CSUM	__cpu_to_be16(0x8000)
++#define GRE_ROUTING	__cpu_to_be16(0x4000)
++#define GRE_KEY		__cpu_to_be16(0x2000)
++#define GRE_SEQ		__cpu_to_be16(0x1000)
++#define GRE_STRICT	__cpu_to_be16(0x0800)
++#define GRE_REC		__cpu_to_be16(0x0700)
++#define GRE_ACK		__cpu_to_be16(0x0080)
++#define GRE_FLAGS	__cpu_to_be16(0x0078)
++#define GRE_VERSION	__cpu_to_be16(0x0007)
++
++#define GRE_IS_CSUM(f)		((f) & GRE_CSUM)
++#define GRE_IS_ROUTING(f)	((f) & GRE_ROUTING)
++#define GRE_IS_KEY(f)		((f) & GRE_KEY)
++#define GRE_IS_SEQ(f)		((f) & GRE_SEQ)
++#define GRE_IS_STRICT(f)	((f) & GRE_STRICT)
++#define GRE_IS_REC(f)		((f) & GRE_REC)
++#define GRE_IS_ACK(f)		((f) & GRE_ACK)
++
++#define GRE_VERSION_0		__cpu_to_be16(0x0000)
++#define GRE_VERSION_1		__cpu_to_be16(0x0001)
++#define GRE_PROTO_PPP		__cpu_to_be16(0x880b)
++#define GRE_PPTP_KEY_MASK	__cpu_to_be32(0xffff)
++
++struct ip_tunnel_parm {
++	char			name[IFNAMSIZ];
++	int			link;
++	__be16			i_flags;
++	__be16			o_flags;
++	__be32			i_key;
++	__be32			o_key;
++	struct iphdr		iph;
++};
++
++enum {
++	IFLA_IPTUN_UNSPEC,
++	IFLA_IPTUN_LINK,
++	IFLA_IPTUN_LOCAL,
++	IFLA_IPTUN_REMOTE,
++	IFLA_IPTUN_TTL,
++	IFLA_IPTUN_TOS,
++	IFLA_IPTUN_ENCAP_LIMIT,
++	IFLA_IPTUN_FLOWINFO,
++	IFLA_IPTUN_FLAGS,
++	IFLA_IPTUN_PROTO,
++	IFLA_IPTUN_PMTUDISC,
++	IFLA_IPTUN_6RD_PREFIX,
++	IFLA_IPTUN_6RD_RELAY_PREFIX,
++	IFLA_IPTUN_6RD_PREFIXLEN,
++	IFLA_IPTUN_6RD_RELAY_PREFIXLEN,
++	IFLA_IPTUN_ENCAP_TYPE,
++	IFLA_IPTUN_ENCAP_FLAGS,
++	IFLA_IPTUN_ENCAP_SPORT,
++	IFLA_IPTUN_ENCAP_DPORT,
++	IFLA_IPTUN_COLLECT_METADATA,
++	IFLA_IPTUN_FWMARK,
++	__IFLA_IPTUN_MAX,
++};
++#define IFLA_IPTUN_MAX	(__IFLA_IPTUN_MAX - 1)
++
++enum tunnel_encap_types {
++	TUNNEL_ENCAP_NONE,
++	TUNNEL_ENCAP_FOU,
++	TUNNEL_ENCAP_GUE,
++};
++
++#define TUNNEL_ENCAP_FLAG_CSUM		(1<<0)
++#define TUNNEL_ENCAP_FLAG_CSUM6		(1<<1)
++#define TUNNEL_ENCAP_FLAG_REMCSUM	(1<<2)
++
++/* SIT-mode i_flags */
++#define	SIT_ISATAP	0x0001
++
++struct ip_tunnel_prl {
++	__be32			addr;
++	__u16			flags;
++	__u16			__reserved;
++	__u32			datalen;
++	__u32			__reserved2;
++	/* data follows */
++};
++
++/* PRL flags */
++#define	PRL_DEFAULT		0x0001
++
++struct ip_tunnel_6rd {
++	struct in6_addr		prefix;
++	__be32			relay_prefix;
++	__u16			prefixlen;
++	__u16			relay_prefixlen;
++};
++
++enum {
++	IFLA_GRE_UNSPEC,
++	IFLA_GRE_LINK,
++	IFLA_GRE_IFLAGS,
++	IFLA_GRE_OFLAGS,
++	IFLA_GRE_IKEY,
++	IFLA_GRE_OKEY,
++	IFLA_GRE_LOCAL,
++	IFLA_GRE_REMOTE,
++	IFLA_GRE_TTL,
++	IFLA_GRE_TOS,
++	IFLA_GRE_PMTUDISC,
++	IFLA_GRE_ENCAP_LIMIT,
++	IFLA_GRE_FLOWINFO,
++	IFLA_GRE_FLAGS,
++	IFLA_GRE_ENCAP_TYPE,
++	IFLA_GRE_ENCAP_FLAGS,
++	IFLA_GRE_ENCAP_SPORT,
++	IFLA_GRE_ENCAP_DPORT,
++	IFLA_GRE_COLLECT_METADATA,
++	IFLA_GRE_IGNORE_DF,
++	IFLA_GRE_FWMARK,
++	IFLA_GRE_ERSPAN_INDEX,
++	__IFLA_GRE_MAX,
++};
++
++#define IFLA_GRE_MAX	(__IFLA_GRE_MAX - 1)
++
++/* VTI-mode i_flags */
++#define VTI_ISVTI ((__be16)0x0001)
++
++enum {
++	IFLA_VTI_UNSPEC,
++	IFLA_VTI_LINK,
++	IFLA_VTI_IKEY,
++	IFLA_VTI_OKEY,
++	IFLA_VTI_LOCAL,
++	IFLA_VTI_REMOTE,
++	IFLA_VTI_FWMARK,
++	__IFLA_VTI_MAX,
++};
++
++#define IFLA_VTI_MAX	(__IFLA_VTI_MAX - 1)
++#endif /* _IF_TUNNEL_H_ */
+diff --git a/include/uapi/linux/if_vlan.h b/include/uapi/linux/if_vlan.h
+new file mode 100644
+index 0000000..24ae007
+--- /dev/null
++++ b/include/uapi/linux/if_vlan.h
+@@ -0,0 +1,64 @@
++/*
++ * VLAN		An implementation of 802.1Q VLAN tagging.
++ *
++ * Authors:	Ben Greear <greearb@candelatech.com>
++ *
++ *		This program is free software; you can redistribute it and/or
++ *		modify it under the terms of the GNU General Public License
++ *		as published by the Free Software Foundation; either version
++ *		2 of the License, or (at your option) any later version.
++ *
++ */
++
++#ifndef _LINUX_IF_VLAN_H_
++#define _LINUX_IF_VLAN_H_
++
++
++/* VLAN IOCTLs are found in sockios.h */
++
++/* Passed in vlan_ioctl_args structure to determine behaviour. */
++enum vlan_ioctl_cmds {
++	ADD_VLAN_CMD,
++	DEL_VLAN_CMD,
++	SET_VLAN_INGRESS_PRIORITY_CMD,
++	SET_VLAN_EGRESS_PRIORITY_CMD,
++	GET_VLAN_INGRESS_PRIORITY_CMD,
++	GET_VLAN_EGRESS_PRIORITY_CMD,
++	SET_VLAN_NAME_TYPE_CMD,
++	SET_VLAN_FLAG_CMD,
++	GET_VLAN_REALDEV_NAME_CMD, /* If this works, you know it's a VLAN device, btw */
++	GET_VLAN_VID_CMD /* Get the VID of this VLAN (specified by name) */
++};
++
++enum vlan_flags {
++	VLAN_FLAG_REORDER_HDR	= 0x1,
++	VLAN_FLAG_GVRP		= 0x2,
++	VLAN_FLAG_LOOSE_BINDING	= 0x4,
++	VLAN_FLAG_MVRP		= 0x8,
++};
++
++enum vlan_name_types {
++	VLAN_NAME_TYPE_PLUS_VID, /* Name will look like:  vlan0005 */
++	VLAN_NAME_TYPE_RAW_PLUS_VID, /* name will look like:  eth1.0005 */
++	VLAN_NAME_TYPE_PLUS_VID_NO_PAD, /* Name will look like:  vlan5 */
++	VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD, /* Name will look like:  eth0.5 */
++	VLAN_NAME_TYPE_HIGHEST
++};
++
++struct vlan_ioctl_args {
++	int cmd; /* Should be one of the vlan_ioctl_cmds enum above. */
++	char device1[24];
++
++        union {
++		char device2[24];
++		int VID;
++		unsigned int skb_priority;
++		unsigned int name_type;
++		unsigned int bind_type;
++		unsigned int flag; /* Matches vlan_dev_priv flags */
++        } u;
++
++	short vlan_qos;   
++};
++
++#endif /* _LINUX_IF_VLAN_H_ */
+diff --git a/include/uapi/linux/ife.h b/include/uapi/linux/ife.h
+new file mode 100644
+index 0000000..2954da3
+--- /dev/null
++++ b/include/uapi/linux/ife.h
+@@ -0,0 +1,18 @@
++#ifndef __UAPI_IFE_H
++#define __UAPI_IFE_H
++
++#define IFE_METAHDRLEN 2
++
++enum {
++	IFE_META_SKBMARK = 1,
++	IFE_META_HASHID,
++	IFE_META_PRIO,
++	IFE_META_QMAP,
++	IFE_META_TCINDEX,
++	__IFE_META_MAX
++};
++
++/*Can be overridden at runtime by module option*/
++#define IFE_META_MAX (__IFE_META_MAX - 1)
++
++#endif
+diff --git a/include/uapi/linux/ila.h b/include/uapi/linux/ila.h
+new file mode 100644
+index 0000000..7e328d7
+--- /dev/null
++++ b/include/uapi/linux/ila.h
+@@ -0,0 +1,45 @@
++/* ila.h - ILA Interface */
++
++#ifndef _LINUX_ILA_H
++#define _LINUX_ILA_H
++
++/* NETLINK_GENERIC related info */
++#define ILA_GENL_NAME		"ila"
++#define ILA_GENL_VERSION	0x1
++
++enum {
++	ILA_ATTR_UNSPEC,
++	ILA_ATTR_LOCATOR,			/* u64 */
++	ILA_ATTR_IDENTIFIER,			/* u64 */
++	ILA_ATTR_LOCATOR_MATCH,			/* u64 */
++	ILA_ATTR_IFINDEX,			/* s32 */
++	ILA_ATTR_DIR,				/* u32 */
++	ILA_ATTR_PAD,
++	ILA_ATTR_CSUM_MODE,			/* u8 */
++
++	__ILA_ATTR_MAX,
++};
++
++#define ILA_ATTR_MAX		(__ILA_ATTR_MAX - 1)
++
++enum {
++	ILA_CMD_UNSPEC,
++	ILA_CMD_ADD,
++	ILA_CMD_DEL,
++	ILA_CMD_GET,
++
++	__ILA_CMD_MAX,
++};
++
++#define ILA_CMD_MAX	(__ILA_CMD_MAX - 1)
++
++#define ILA_DIR_IN	(1 << 0)
++#define ILA_DIR_OUT	(1 << 1)
++
++enum {
++	ILA_CSUM_ADJUST_TRANSPORT,
++	ILA_CSUM_NEUTRAL_MAP,
++	ILA_CSUM_NO_ACTION,
++};
++
++#endif /* _LINUX_ILA_H */
+diff --git a/include/uapi/linux/in.h b/include/uapi/linux/in.h
+new file mode 100644
+index 0000000..9439efa
+--- /dev/null
++++ b/include/uapi/linux/in.h
+@@ -0,0 +1,300 @@
++/*
++ * INET		An implementation of the TCP/IP protocol suite for the LINUX
++ *		operating system.  INET is implemented using the  BSD Socket
++ *		interface as the means of communication with the user level.
++ *
++ *		Definitions of the Internet Protocol.
++ *
++ * Version:	@(#)in.h	1.0.1	04/21/93
++ *
++ * Authors:	Original taken from the GNU Project <netinet/in.h> file.
++ *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
++ *
++ *		This program is free software; you can redistribute it and/or
++ *		modify it under the terms of the GNU General Public License
++ *		as published by the Free Software Foundation; either version
++ *		2 of the License, or (at your option) any later version.
++ */
++#ifndef _LINUX_IN_H
++#define _LINUX_IN_H
++
++#include <linux/types.h>
++#include <linux/libc-compat.h>
++#include <linux/socket.h>
++
++#if __UAPI_DEF_IN_IPPROTO
++/* Standard well-defined IP protocols.  */
++enum {
++  IPPROTO_IP = 0,		/* Dummy protocol for TCP		*/
++#define IPPROTO_IP		IPPROTO_IP
++  IPPROTO_ICMP = 1,		/* Internet Control Message Protocol	*/
++#define IPPROTO_ICMP		IPPROTO_ICMP
++  IPPROTO_IGMP = 2,		/* Internet Group Management Protocol	*/
++#define IPPROTO_IGMP		IPPROTO_IGMP
++  IPPROTO_IPIP = 4,		/* IPIP tunnels (older KA9Q tunnels use 94) */
++#define IPPROTO_IPIP		IPPROTO_IPIP
++  IPPROTO_TCP = 6,		/* Transmission Control Protocol	*/
++#define IPPROTO_TCP		IPPROTO_TCP
++  IPPROTO_EGP = 8,		/* Exterior Gateway Protocol		*/
++#define IPPROTO_EGP		IPPROTO_EGP
++  IPPROTO_PUP = 12,		/* PUP protocol				*/
++#define IPPROTO_PUP		IPPROTO_PUP
++  IPPROTO_UDP = 17,		/* User Datagram Protocol		*/
++#define IPPROTO_UDP		IPPROTO_UDP
++  IPPROTO_IDP = 22,		/* XNS IDP protocol			*/
++#define IPPROTO_IDP		IPPROTO_IDP
++  IPPROTO_TP = 29,		/* SO Transport Protocol Class 4	*/
++#define IPPROTO_TP		IPPROTO_TP
++  IPPROTO_DCCP = 33,		/* Datagram Congestion Control Protocol */
++#define IPPROTO_DCCP		IPPROTO_DCCP
++  IPPROTO_IPV6 = 41,		/* IPv6-in-IPv4 tunnelling		*/
++#define IPPROTO_IPV6		IPPROTO_IPV6
++  IPPROTO_RSVP = 46,		/* RSVP Protocol			*/
++#define IPPROTO_RSVP		IPPROTO_RSVP
++  IPPROTO_GRE = 47,		/* Cisco GRE tunnels (rfc 1701,1702)	*/
++#define IPPROTO_GRE		IPPROTO_GRE
++  IPPROTO_ESP = 50,		/* Encapsulation Security Payload protocol */
++#define IPPROTO_ESP		IPPROTO_ESP
++  IPPROTO_AH = 51,		/* Authentication Header protocol	*/
++#define IPPROTO_AH		IPPROTO_AH
++  IPPROTO_MTP = 92,		/* Multicast Transport Protocol		*/
++#define IPPROTO_MTP		IPPROTO_MTP
++  IPPROTO_BEETPH = 94,		/* IP option pseudo header for BEET	*/
++#define IPPROTO_BEETPH		IPPROTO_BEETPH
++  IPPROTO_ENCAP = 98,		/* Encapsulation Header			*/
++#define IPPROTO_ENCAP		IPPROTO_ENCAP
++  IPPROTO_PIM = 103,		/* Protocol Independent Multicast	*/
++#define IPPROTO_PIM		IPPROTO_PIM
++  IPPROTO_COMP = 108,		/* Compression Header Protocol		*/
++#define IPPROTO_COMP		IPPROTO_COMP
++  IPPROTO_SCTP = 132,		/* Stream Control Transport Protocol	*/
++#define IPPROTO_SCTP		IPPROTO_SCTP
++  IPPROTO_UDPLITE = 136,	/* UDP-Lite (RFC 3828)			*/
++#define IPPROTO_UDPLITE		IPPROTO_UDPLITE
++  IPPROTO_MPLS = 137,		/* MPLS in IP (RFC 4023)		*/
++#define IPPROTO_MPLS		IPPROTO_MPLS
++  IPPROTO_RAW = 255,		/* Raw IP packets			*/
++#define IPPROTO_RAW		IPPROTO_RAW
++  IPPROTO_MAX
++};
++#endif
++
++#if __UAPI_DEF_IN_ADDR
++/* Internet address. */
++struct in_addr {
++	__be32	s_addr;
++};
++#endif
++
++#define IP_TOS		1
++#define IP_TTL		2
++#define IP_HDRINCL	3
++#define IP_OPTIONS	4
++#define IP_ROUTER_ALERT	5
++#define IP_RECVOPTS	6
++#define IP_RETOPTS	7
++#define IP_PKTINFO	8
++#define IP_PKTOPTIONS	9
++#define IP_MTU_DISCOVER	10
++#define IP_RECVERR	11
++#define IP_RECVTTL	12
++#define	IP_RECVTOS	13
++#define IP_MTU		14
++#define IP_FREEBIND	15
++#define IP_IPSEC_POLICY	16
++#define IP_XFRM_POLICY	17
++#define IP_PASSSEC	18
++#define IP_TRANSPARENT	19
++
++/* BSD compatibility */
++#define IP_RECVRETOPTS	IP_RETOPTS
++
++/* TProxy original addresses */
++#define IP_ORIGDSTADDR       20
++#define IP_RECVORIGDSTADDR   IP_ORIGDSTADDR
++
++#define IP_MINTTL       21
++#define IP_NODEFRAG     22
++#define IP_CHECKSUM	23
++#define IP_BIND_ADDRESS_NO_PORT	24
++#define IP_RECVFRAGSIZE	25
++
++/* IP_MTU_DISCOVER values */
++#define IP_PMTUDISC_DONT		0	/* Never send DF frames */
++#define IP_PMTUDISC_WANT		1	/* Use per route hints	*/
++#define IP_PMTUDISC_DO			2	/* Always DF		*/
++#define IP_PMTUDISC_PROBE		3       /* Ignore dst pmtu      */
++/* Always use interface mtu (ignores dst pmtu) but don't set DF flag.
++ * Also incoming ICMP frag_needed notifications will be ignored on
++ * this socket to prevent accepting spoofed ones.
++ */
++#define IP_PMTUDISC_INTERFACE		4
++/* weaker version of IP_PMTUDISC_INTERFACE, which allos packets to get
++ * fragmented if they exeed the interface mtu
++ */
++#define IP_PMTUDISC_OMIT		5
++
++#define IP_MULTICAST_IF			32
++#define IP_MULTICAST_TTL 		33
++#define IP_MULTICAST_LOOP 		34
++#define IP_ADD_MEMBERSHIP		35
++#define IP_DROP_MEMBERSHIP		36
++#define IP_UNBLOCK_SOURCE		37
++#define IP_BLOCK_SOURCE			38
++#define IP_ADD_SOURCE_MEMBERSHIP	39
++#define IP_DROP_SOURCE_MEMBERSHIP	40
++#define IP_MSFILTER			41
++#define MCAST_JOIN_GROUP		42
++#define MCAST_BLOCK_SOURCE		43
++#define MCAST_UNBLOCK_SOURCE		44
++#define MCAST_LEAVE_GROUP		45
++#define MCAST_JOIN_SOURCE_GROUP		46
++#define MCAST_LEAVE_SOURCE_GROUP	47
++#define MCAST_MSFILTER			48
++#define IP_MULTICAST_ALL		49
++#define IP_UNICAST_IF			50
++
++#define MCAST_EXCLUDE	0
++#define MCAST_INCLUDE	1
++
++/* These need to appear somewhere around here */
++#define IP_DEFAULT_MULTICAST_TTL        1
++#define IP_DEFAULT_MULTICAST_LOOP       1
++
++/* Request struct for multicast socket ops */
++
++#if __UAPI_DEF_IP_MREQ
++struct ip_mreq  {
++	struct in_addr imr_multiaddr;	/* IP multicast address of group */
++	struct in_addr imr_interface;	/* local IP address of interface */
++};
++
++struct ip_mreqn {
++	struct in_addr	imr_multiaddr;		/* IP multicast address of group */
++	struct in_addr	imr_address;		/* local IP address of interface */
++	int		imr_ifindex;		/* Interface index */
++};
++
++struct ip_mreq_source {
++	__be32		imr_multiaddr;
++	__be32		imr_interface;
++	__be32		imr_sourceaddr;
++};
++
++struct ip_msfilter {
++	__be32		imsf_multiaddr;
++	__be32		imsf_interface;
++	__u32		imsf_fmode;
++	__u32		imsf_numsrc;
++	__be32		imsf_slist[1];
++};
++
++#define IP_MSFILTER_SIZE(numsrc) \
++	(sizeof(struct ip_msfilter) - sizeof(__u32) \
++	+ (numsrc) * sizeof(__u32))
++
++struct group_req {
++	__u32				 gr_interface;	/* interface index */
++	struct __kernel_sockaddr_storage gr_group;	/* group address */
++};
++
++struct group_source_req {
++	__u32				 gsr_interface;	/* interface index */
++	struct __kernel_sockaddr_storage gsr_group;	/* group address */
++	struct __kernel_sockaddr_storage gsr_source;	/* source address */
++};
++
++struct group_filter {
++	__u32				 gf_interface;	/* interface index */
++	struct __kernel_sockaddr_storage gf_group;	/* multicast address */
++	__u32				 gf_fmode;	/* filter mode */
++	__u32				 gf_numsrc;	/* number of sources */
++	struct __kernel_sockaddr_storage gf_slist[1];	/* interface index */
++};
++
++#define GROUP_FILTER_SIZE(numsrc) \
++	(sizeof(struct group_filter) - sizeof(struct __kernel_sockaddr_storage) \
++	+ (numsrc) * sizeof(struct __kernel_sockaddr_storage))
++#endif
++
++#if __UAPI_DEF_IN_PKTINFO
++struct in_pktinfo {
++	int		ipi_ifindex;
++	struct in_addr	ipi_spec_dst;
++	struct in_addr	ipi_addr;
++};
++#endif
++
++/* Structure describing an Internet (IP) socket address. */
++#if  __UAPI_DEF_SOCKADDR_IN
++#define __SOCK_SIZE__	16		/* sizeof(struct sockaddr)	*/
++struct sockaddr_in {
++  __kernel_sa_family_t	sin_family;	/* Address family		*/
++  __be16		sin_port;	/* Port number			*/
++  struct in_addr	sin_addr;	/* Internet address		*/
++
++  /* Pad to size of `struct sockaddr'. */
++  unsigned char		__pad[__SOCK_SIZE__ - sizeof(short int) -
++			sizeof(unsigned short int) - sizeof(struct in_addr)];
++};
++#define sin_zero	__pad		/* for BSD UNIX comp. -FvK	*/
++#endif
++
++#if __UAPI_DEF_IN_CLASS
++/*
++ * Definitions of the bits in an Internet address integer.
++ * On subnets, host and network parts are found according
++ * to the subnet mask, not these masks.
++ */
++#define	IN_CLASSA(a)		((((long int) (a)) & 0x80000000) == 0)
++#define	IN_CLASSA_NET		0xff000000
++#define	IN_CLASSA_NSHIFT	24
++#define	IN_CLASSA_HOST		(0xffffffff & ~IN_CLASSA_NET)
++#define	IN_CLASSA_MAX		128
++
++#define	IN_CLASSB(a)		((((long int) (a)) & 0xc0000000) == 0x80000000)
++#define	IN_CLASSB_NET		0xffff0000
++#define	IN_CLASSB_NSHIFT	16
++#define	IN_CLASSB_HOST		(0xffffffff & ~IN_CLASSB_NET)
++#define	IN_CLASSB_MAX		65536
++
++#define	IN_CLASSC(a)		((((long int) (a)) & 0xe0000000) == 0xc0000000)
++#define	IN_CLASSC_NET		0xffffff00
++#define	IN_CLASSC_NSHIFT	8
++#define	IN_CLASSC_HOST		(0xffffffff & ~IN_CLASSC_NET)
++
++#define	IN_CLASSD(a)		((((long int) (a)) & 0xf0000000) == 0xe0000000)
++#define	IN_MULTICAST(a)		IN_CLASSD(a)
++#define IN_MULTICAST_NET	0xF0000000
++
++#define	IN_EXPERIMENTAL(a)	((((long int) (a)) & 0xf0000000) == 0xf0000000)
++#define	IN_BADCLASS(a)		IN_EXPERIMENTAL((a))
++
++/* Address to accept any incoming messages. */
++#define	INADDR_ANY		((unsigned long int) 0x00000000)
++
++/* Address to send to all hosts. */
++#define	INADDR_BROADCAST	((unsigned long int) 0xffffffff)
++
++/* Address indicating an error return. */
++#define	INADDR_NONE		((unsigned long int) 0xffffffff)
++
++/* Network number for local host loopback. */
++#define	IN_LOOPBACKNET		127
++
++/* Address to loopback in software to local host.  */
++#define	INADDR_LOOPBACK		0x7f000001	/* 127.0.0.1   */
++#define	IN_LOOPBACK(a)		((((long int) (a)) & 0xff000000) == 0x7f000000)
++
++/* Defines for Multicast INADDR */
++#define INADDR_UNSPEC_GROUP   	0xe0000000U	/* 224.0.0.0   */
++#define INADDR_ALLHOSTS_GROUP 	0xe0000001U	/* 224.0.0.1   */
++#define INADDR_ALLRTRS_GROUP    0xe0000002U	/* 224.0.0.2 */
++#define INADDR_MAX_LOCAL_GROUP  0xe00000ffU	/* 224.0.0.255 */
++#endif
++
++/* <asm/byteorder.h> contains the htonl type stuff.. */
++#include <asm/byteorder.h> 
++
++
++#endif /* _LINUX_IN_H */
+diff --git a/include/uapi/linux/in6.h b/include/uapi/linux/in6.h
+new file mode 100644
+index 0000000..6f3bdee
+--- /dev/null
++++ b/include/uapi/linux/in6.h
+@@ -0,0 +1,296 @@
++/*
++ *	Types and definitions for AF_INET6 
++ *	Linux INET6 implementation 
++ *
++ *	Authors:
++ *	Pedro Roque		<roque@di.fc.ul.pt>	
++ *
++ *	Sources:
++ *	IPv6 Program Interfaces for BSD Systems
++ *      <draft-ietf-ipngwg-bsd-api-05.txt>
++ *
++ *	Advanced Sockets API for IPv6
++ *	<draft-stevens-advanced-api-00.txt>
++ *
++ *	This program is free software; you can redistribute it and/or
++ *      modify it under the terms of the GNU General Public License
++ *      as published by the Free Software Foundation; either version
++ *      2 of the License, or (at your option) any later version.
++ */
++
++#ifndef _LINUX_IN6_H
++#define _LINUX_IN6_H
++
++#include <linux/types.h>
++#include <linux/libc-compat.h>
++
++/*
++ *	IPv6 address structure
++ */
++
++#if __UAPI_DEF_IN6_ADDR
++struct in6_addr {
++	union {
++		__u8		u6_addr8[16];
++#if __UAPI_DEF_IN6_ADDR_ALT
++		__be16		u6_addr16[8];
++		__be32		u6_addr32[4];
++#endif
++	} in6_u;
++#define s6_addr			in6_u.u6_addr8
++#if __UAPI_DEF_IN6_ADDR_ALT
++#define s6_addr16		in6_u.u6_addr16
++#define s6_addr32		in6_u.u6_addr32
++#endif
++};
++#endif /* __UAPI_DEF_IN6_ADDR */
++
++#if __UAPI_DEF_SOCKADDR_IN6
++struct sockaddr_in6 {
++	unsigned short int	sin6_family;    /* AF_INET6 */
++	__be16			sin6_port;      /* Transport layer port # */
++	__be32			sin6_flowinfo;  /* IPv6 flow information */
++	struct in6_addr		sin6_addr;      /* IPv6 address */
++	__u32			sin6_scope_id;  /* scope id (new in RFC2553) */
++};
++#endif /* __UAPI_DEF_SOCKADDR_IN6 */
++
++#if __UAPI_DEF_IPV6_MREQ
++struct ipv6_mreq {
++	/* IPv6 multicast address of group */
++	struct in6_addr ipv6mr_multiaddr;
++
++	/* local IPv6 address of interface */
++	int		ipv6mr_ifindex;
++};
++#endif /* __UAPI_DEF_IVP6_MREQ */
++
++#define ipv6mr_acaddr	ipv6mr_multiaddr
++
++struct in6_flowlabel_req {
++	struct in6_addr	flr_dst;
++	__be32	flr_label;
++	__u8	flr_action;
++	__u8	flr_share;
++	__u16	flr_flags;
++	__u16 	flr_expires;
++	__u16	flr_linger;
++	__u32	__flr_pad;
++	/* Options in format of IPV6_PKTOPTIONS */
++};
++
++#define IPV6_FL_A_GET	0
++#define IPV6_FL_A_PUT	1
++#define IPV6_FL_A_RENEW	2
++
++#define IPV6_FL_F_CREATE	1
++#define IPV6_FL_F_EXCL		2
++#define IPV6_FL_F_REFLECT	4
++#define IPV6_FL_F_REMOTE	8
++
++#define IPV6_FL_S_NONE		0
++#define IPV6_FL_S_EXCL		1
++#define IPV6_FL_S_PROCESS	2
++#define IPV6_FL_S_USER		3
++#define IPV6_FL_S_ANY		255
++
++
++/*
++ *	Bitmask constant declarations to help applications select out the 
++ *	flow label and priority fields.
++ *
++ *	Note that this are in host byte order while the flowinfo field of
++ *	sockaddr_in6 is in network byte order.
++ */
++
++#define IPV6_FLOWINFO_FLOWLABEL		0x000fffff
++#define IPV6_FLOWINFO_PRIORITY		0x0ff00000
++
++/* These definitions are obsolete */
++#define IPV6_PRIORITY_UNCHARACTERIZED	0x0000
++#define IPV6_PRIORITY_FILLER		0x0100
++#define IPV6_PRIORITY_UNATTENDED	0x0200
++#define IPV6_PRIORITY_RESERVED1		0x0300
++#define IPV6_PRIORITY_BULK		0x0400
++#define IPV6_PRIORITY_RESERVED2		0x0500
++#define IPV6_PRIORITY_INTERACTIVE	0x0600
++#define IPV6_PRIORITY_CONTROL		0x0700
++#define IPV6_PRIORITY_8			0x0800
++#define IPV6_PRIORITY_9			0x0900
++#define IPV6_PRIORITY_10		0x0a00
++#define IPV6_PRIORITY_11		0x0b00
++#define IPV6_PRIORITY_12		0x0c00
++#define IPV6_PRIORITY_13		0x0d00
++#define IPV6_PRIORITY_14		0x0e00
++#define IPV6_PRIORITY_15		0x0f00
++
++/*
++ *	IPV6 extension headers
++ */
++#if __UAPI_DEF_IPPROTO_V6
++#define IPPROTO_HOPOPTS		0	/* IPv6 hop-by-hop options	*/
++#define IPPROTO_ROUTING		43	/* IPv6 routing header		*/
++#define IPPROTO_FRAGMENT	44	/* IPv6 fragmentation header	*/
++#define IPPROTO_ICMPV6		58	/* ICMPv6			*/
++#define IPPROTO_NONE		59	/* IPv6 no next header		*/
++#define IPPROTO_DSTOPTS		60	/* IPv6 destination options	*/
++#define IPPROTO_MH		135	/* IPv6 mobility header		*/
++#endif /* __UAPI_DEF_IPPROTO_V6 */
++
++/*
++ *	IPv6 TLV options.
++ */
++#define IPV6_TLV_PAD1		0
++#define IPV6_TLV_PADN		1
++#define IPV6_TLV_ROUTERALERT	5
++#define IPV6_TLV_CALIPSO	7	/* RFC 5570 */
++#define IPV6_TLV_JUMBO		194
++#define IPV6_TLV_HAO		201	/* home address option */
++
++/*
++ *	IPV6 socket options
++ */
++#if __UAPI_DEF_IPV6_OPTIONS
++#define IPV6_ADDRFORM		1
++#define IPV6_2292PKTINFO	2
++#define IPV6_2292HOPOPTS	3
++#define IPV6_2292DSTOPTS	4
++#define IPV6_2292RTHDR		5
++#define IPV6_2292PKTOPTIONS	6
++#define IPV6_CHECKSUM		7
++#define IPV6_2292HOPLIMIT	8
++#define IPV6_NEXTHOP		9
++#define IPV6_AUTHHDR		10	/* obsolete */
++#define IPV6_FLOWINFO		11
++
++#define IPV6_UNICAST_HOPS	16
++#define IPV6_MULTICAST_IF	17
++#define IPV6_MULTICAST_HOPS	18
++#define IPV6_MULTICAST_LOOP	19
++#define IPV6_ADD_MEMBERSHIP	20
++#define IPV6_DROP_MEMBERSHIP	21
++#define IPV6_ROUTER_ALERT	22
++#define IPV6_MTU_DISCOVER	23
++#define IPV6_MTU		24
++#define IPV6_RECVERR		25
++#define IPV6_V6ONLY		26
++#define IPV6_JOIN_ANYCAST	27
++#define IPV6_LEAVE_ANYCAST	28
++
++/* IPV6_MTU_DISCOVER values */
++#define IPV6_PMTUDISC_DONT		0
++#define IPV6_PMTUDISC_WANT		1
++#define IPV6_PMTUDISC_DO		2
++#define IPV6_PMTUDISC_PROBE		3
++/* same as IPV6_PMTUDISC_PROBE, provided for symetry with IPv4
++ * also see comments on IP_PMTUDISC_INTERFACE
++ */
++#define IPV6_PMTUDISC_INTERFACE		4
++/* weaker version of IPV6_PMTUDISC_INTERFACE, which allows packets to
++ * get fragmented if they exceed the interface mtu
++ */
++#define IPV6_PMTUDISC_OMIT		5
++
++/* Flowlabel */
++#define IPV6_FLOWLABEL_MGR	32
++#define IPV6_FLOWINFO_SEND	33
++
++#define IPV6_IPSEC_POLICY	34
++#define IPV6_XFRM_POLICY	35
++#define IPV6_HDRINCL		36
++#endif
++
++/*
++ * Multicast:
++ * Following socket options are shared between IPv4 and IPv6.
++ *
++ * MCAST_JOIN_GROUP		42
++ * MCAST_BLOCK_SOURCE		43
++ * MCAST_UNBLOCK_SOURCE		44
++ * MCAST_LEAVE_GROUP		45
++ * MCAST_JOIN_SOURCE_GROUP	46
++ * MCAST_LEAVE_SOURCE_GROUP	47
++ * MCAST_MSFILTER		48
++ */
++
++/*
++ * Advanced API (RFC3542) (1)
++ *
++ * Note: IPV6_RECVRTHDRDSTOPTS does not exist. see net/ipv6/datagram.c.
++ */
++
++#define IPV6_RECVPKTINFO	49
++#define IPV6_PKTINFO		50
++#define IPV6_RECVHOPLIMIT	51
++#define IPV6_HOPLIMIT		52
++#define IPV6_RECVHOPOPTS	53
++#define IPV6_HOPOPTS		54
++#define IPV6_RTHDRDSTOPTS	55
++#define IPV6_RECVRTHDR		56
++#define IPV6_RTHDR		57
++#define IPV6_RECVDSTOPTS	58
++#define IPV6_DSTOPTS		59
++#define IPV6_RECVPATHMTU	60
++#define IPV6_PATHMTU		61
++#define IPV6_DONTFRAG		62
++#if 0	/* not yet */
++#define IPV6_USE_MIN_MTU	63
++#endif
++
++/*
++ * Netfilter (1)
++ *
++ * Following socket options are used in ip6_tables;
++ * see include/linux/netfilter_ipv6/ip6_tables.h.
++ *
++ * IP6T_SO_SET_REPLACE / IP6T_SO_GET_INFO		64
++ * IP6T_SO_SET_ADD_COUNTERS / IP6T_SO_GET_ENTRIES	65
++ */
++
++/*
++ * Advanced API (RFC3542) (2)
++ */
++#define IPV6_RECVTCLASS		66
++#define IPV6_TCLASS		67
++
++/*
++ * Netfilter (2)
++ *
++ * Following socket options are used in ip6_tables;
++ * see include/linux/netfilter_ipv6/ip6_tables.h.
++ *
++ * IP6T_SO_GET_REVISION_MATCH	68
++ * IP6T_SO_GET_REVISION_TARGET	69
++ * IP6T_SO_ORIGINAL_DST		80
++ */
++
++#define IPV6_AUTOFLOWLABEL	70
++/* RFC5014: Source address selection */
++#define IPV6_ADDR_PREFERENCES	72
++
++#define IPV6_PREFER_SRC_TMP		0x0001
++#define IPV6_PREFER_SRC_PUBLIC		0x0002
++#define IPV6_PREFER_SRC_PUBTMP_DEFAULT	0x0100
++#define IPV6_PREFER_SRC_COA		0x0004
++#define IPV6_PREFER_SRC_HOME		0x0400
++#define IPV6_PREFER_SRC_CGA		0x0008
++#define IPV6_PREFER_SRC_NONCGA		0x0800
++
++/* RFC5082: Generalized Ttl Security Mechanism */
++#define IPV6_MINHOPCOUNT		73
++
++#define IPV6_ORIGDSTADDR        74
++#define IPV6_RECVORIGDSTADDR    IPV6_ORIGDSTADDR
++#define IPV6_TRANSPARENT        75
++#define IPV6_UNICAST_IF         76
++#define IPV6_RECVFRAGSIZE	77
++
++/*
++ * Multicast Routing:
++ * see include/uapi/linux/mroute6.h.
++ *
++ * MRT6_BASE			200
++ * ...
++ * MRT6_MAX
++ */
++#endif /* _LINUX_IN6_H */
+diff --git a/include/uapi/linux/in_route.h b/include/uapi/linux/in_route.h
+new file mode 100644
+index 0000000..b261b8c
+--- /dev/null
++++ b/include/uapi/linux/in_route.h
+@@ -0,0 +1,32 @@
++#ifndef _LINUX_IN_ROUTE_H
++#define _LINUX_IN_ROUTE_H
++
++/* IPv4 routing cache flags */
++
++#define RTCF_DEAD	RTNH_F_DEAD
++#define RTCF_ONLINK	RTNH_F_ONLINK
++
++/* Obsolete flag. About to be deleted */
++#define RTCF_NOPMTUDISC RTM_F_NOPMTUDISC
++
++#define RTCF_NOTIFY	0x00010000
++#define RTCF_DIRECTDST	0x00020000 /* unused */
++#define RTCF_REDIRECTED	0x00040000
++#define RTCF_TPROXY	0x00080000 /* unused */
++
++#define RTCF_FAST	0x00200000 /* unused */
++#define RTCF_MASQ	0x00400000 /* unused */
++#define RTCF_SNAT	0x00800000 /* unused */
++#define RTCF_DOREDIRECT 0x01000000
++#define RTCF_DIRECTSRC	0x04000000
++#define RTCF_DNAT	0x08000000
++#define RTCF_BROADCAST	0x10000000
++#define RTCF_MULTICAST	0x20000000
++#define RTCF_REJECT	0x40000000 /* unused */
++#define RTCF_LOCAL	0x80000000
++
++#define RTCF_NAT	(RTCF_DNAT|RTCF_SNAT)
++
++#define RT_TOS(tos)	((tos)&IPTOS_TOS_MASK)
++
++#endif /* _LINUX_IN_ROUTE_H */
+diff --git a/include/uapi/linux/inet_diag.h b/include/uapi/linux/inet_diag.h
+new file mode 100644
+index 0000000..bada4d7
+--- /dev/null
++++ b/include/uapi/linux/inet_diag.h
+@@ -0,0 +1,196 @@
++#ifndef _INET_DIAG_H_
++#define _INET_DIAG_H_
++
++#include <linux/types.h>
++
++/* Just some random number */
++#define TCPDIAG_GETSOCK 18
++#define DCCPDIAG_GETSOCK 19
++
++#define INET_DIAG_GETSOCK_MAX 24
++
++/* Socket identity */
++struct inet_diag_sockid {
++	__be16	idiag_sport;
++	__be16	idiag_dport;
++	__be32	idiag_src[4];
++	__be32	idiag_dst[4];
++	__u32	idiag_if;
++	__u32	idiag_cookie[2];
++#define INET_DIAG_NOCOOKIE (~0U)
++};
++
++/* Request structure */
++
++struct inet_diag_req {
++	__u8	idiag_family;		/* Family of addresses. */
++	__u8	idiag_src_len;
++	__u8	idiag_dst_len;
++	__u8	idiag_ext;		/* Query extended information */
++
++	struct inet_diag_sockid id;
++
++	__u32	idiag_states;		/* States to dump */
++	__u32	idiag_dbs;		/* Tables to dump (NI) */
++};
++
++struct inet_diag_req_v2 {
++	__u8	sdiag_family;
++	__u8	sdiag_protocol;
++	__u8	idiag_ext;
++	__u8	pad;
++	__u32	idiag_states;
++	struct inet_diag_sockid id;
++};
++
++/*
++ * SOCK_RAW sockets require the underlied protocol to be
++ * additionally specified so we can use @pad member for
++ * this, but we can't rename it because userspace programs
++ * still may depend on this name. Instead lets use another
++ * structure definition as an alias for struct
++ * @inet_diag_req_v2.
++ */
++struct inet_diag_req_raw {
++	__u8	sdiag_family;
++	__u8	sdiag_protocol;
++	__u8	idiag_ext;
++	__u8	sdiag_raw_protocol;
++	__u32	idiag_states;
++	struct inet_diag_sockid id;
++};
++
++enum {
++	INET_DIAG_REQ_NONE,
++	INET_DIAG_REQ_BYTECODE,
++};
++
++#define INET_DIAG_REQ_MAX INET_DIAG_REQ_BYTECODE
++
++/* Bytecode is sequence of 4 byte commands followed by variable arguments.
++ * All the commands identified by "code" are conditional jumps forward:
++ * to offset cc+"yes" or to offset cc+"no". "yes" is supposed to be
++ * length of the command and its arguments.
++ */
++ 
++struct inet_diag_bc_op {
++	unsigned char	code;
++	unsigned char	yes;
++	unsigned short	no;
++};
++
++enum {
++	INET_DIAG_BC_NOP,
++	INET_DIAG_BC_JMP,
++	INET_DIAG_BC_S_GE,
++	INET_DIAG_BC_S_LE,
++	INET_DIAG_BC_D_GE,
++	INET_DIAG_BC_D_LE,
++	INET_DIAG_BC_AUTO,
++	INET_DIAG_BC_S_COND,
++	INET_DIAG_BC_D_COND,
++	INET_DIAG_BC_DEV_COND,   /* u32 ifindex */
++	INET_DIAG_BC_MARK_COND,
++};
++
++struct inet_diag_hostcond {
++	__u8	family;
++	__u8	prefix_len;
++	int	port;
++	__be32	addr[0];
++};
++
++struct inet_diag_markcond {
++	__u32 mark;
++	__u32 mask;
++};
++
++/* Base info structure. It contains socket identity (addrs/ports/cookie)
++ * and, alas, the information shown by netstat. */
++struct inet_diag_msg {
++	__u8	idiag_family;
++	__u8	idiag_state;
++	__u8	idiag_timer;
++	__u8	idiag_retrans;
++
++	struct inet_diag_sockid id;
++
++	__u32	idiag_expires;
++	__u32	idiag_rqueue;
++	__u32	idiag_wqueue;
++	__u32	idiag_uid;
++	__u32	idiag_inode;
++};
++
++/* Extensions */
++
++enum {
++	INET_DIAG_NONE,
++	INET_DIAG_MEMINFO,
++	INET_DIAG_INFO,
++	INET_DIAG_VEGASINFO,
++	INET_DIAG_CONG,
++	INET_DIAG_TOS,
++	INET_DIAG_TCLASS,
++	INET_DIAG_SKMEMINFO,
++	INET_DIAG_SHUTDOWN,
++	INET_DIAG_DCTCPINFO,
++	INET_DIAG_PROTOCOL,  /* response attribute only */
++	INET_DIAG_SKV6ONLY,
++	INET_DIAG_LOCALS,
++	INET_DIAG_PEERS,
++	INET_DIAG_PAD,
++	INET_DIAG_MARK,
++	INET_DIAG_BBRINFO,
++	INET_DIAG_CLASS_ID,
++	INET_DIAG_MD5SIG,
++	__INET_DIAG_MAX,
++};
++
++#define INET_DIAG_MAX (__INET_DIAG_MAX - 1)
++
++/* INET_DIAG_MEM */
++
++struct inet_diag_meminfo {
++	__u32	idiag_rmem;
++	__u32	idiag_wmem;
++	__u32	idiag_fmem;
++	__u32	idiag_tmem;
++};
++
++/* INET_DIAG_VEGASINFO */
++
++struct tcpvegas_info {
++	__u32	tcpv_enabled;
++	__u32	tcpv_rttcnt;
++	__u32	tcpv_rtt;
++	__u32	tcpv_minrtt;
++};
++
++/* INET_DIAG_DCTCPINFO */
++
++struct tcp_dctcp_info {
++	__u16	dctcp_enabled;
++	__u16	dctcp_ce_state;
++	__u32	dctcp_alpha;
++	__u32	dctcp_ab_ecn;
++	__u32	dctcp_ab_tot;
++};
++
++/* INET_DIAG_BBRINFO */
++
++struct tcp_bbr_info {
++	/* u64 bw: max-filtered BW (app throughput) estimate in Byte per sec: */
++	__u32	bbr_bw_lo;		/* lower 32 bits of bw */
++	__u32	bbr_bw_hi;		/* upper 32 bits of bw */
++	__u32	bbr_min_rtt;		/* min-filtered RTT in uSec */
++	__u32	bbr_pacing_gain;	/* pacing gain shifted left 8 bits */
++	__u32	bbr_cwnd_gain;		/* cwnd gain shifted left 8 bits */
++};
++
++union tcp_cc_info {
++	struct tcpvegas_info	vegas;
++	struct tcp_dctcp_info	dctcp;
++	struct tcp_bbr_info	bbr;
++};
++#endif /* _INET_DIAG_H_ */
+diff --git a/include/uapi/linux/ip.h b/include/uapi/linux/ip.h
+new file mode 100644
+index 0000000..1907284
+--- /dev/null
++++ b/include/uapi/linux/ip.h
+@@ -0,0 +1,175 @@
++/*
++ * INET		An implementation of the TCP/IP protocol suite for the LINUX
++ *		operating system.  INET is implemented using the  BSD Socket
++ *		interface as the means of communication with the user level.
++ *
++ *		Definitions for the IP protocol.
++ *
++ * Version:	@(#)ip.h	1.0.2	04/28/93
++ *
++ * Authors:	Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
++ *
++ *		This program is free software; you can redistribute it and/or
++ *		modify it under the terms of the GNU General Public License
++ *		as published by the Free Software Foundation; either version
++ *		2 of the License, or (at your option) any later version.
++ */
++#ifndef _LINUX_IP_H
++#define _LINUX_IP_H
++#include <linux/types.h>
++#include <asm/byteorder.h>
++
++#define IPTOS_TOS_MASK		0x1E
++#define IPTOS_TOS(tos)		((tos)&IPTOS_TOS_MASK)
++#define	IPTOS_LOWDELAY		0x10
++#define	IPTOS_THROUGHPUT	0x08
++#define	IPTOS_RELIABILITY	0x04
++#define	IPTOS_MINCOST		0x02
++
++#define IPTOS_PREC_MASK		0xE0
++#define IPTOS_PREC(tos)		((tos)&IPTOS_PREC_MASK)
++#define IPTOS_PREC_NETCONTROL           0xe0
++#define IPTOS_PREC_INTERNETCONTROL      0xc0
++#define IPTOS_PREC_CRITIC_ECP           0xa0
++#define IPTOS_PREC_FLASHOVERRIDE        0x80
++#define IPTOS_PREC_FLASH                0x60
++#define IPTOS_PREC_IMMEDIATE            0x40
++#define IPTOS_PREC_PRIORITY             0x20
++#define IPTOS_PREC_ROUTINE              0x00
++
++
++/* IP options */
++#define IPOPT_COPY		0x80
++#define IPOPT_CLASS_MASK	0x60
++#define IPOPT_NUMBER_MASK	0x1f
++
++#define	IPOPT_COPIED(o)		((o)&IPOPT_COPY)
++#define	IPOPT_CLASS(o)		((o)&IPOPT_CLASS_MASK)
++#define	IPOPT_NUMBER(o)		((o)&IPOPT_NUMBER_MASK)
++
++#define	IPOPT_CONTROL		0x00
++#define	IPOPT_RESERVED1		0x20
++#define	IPOPT_MEASUREMENT	0x40
++#define	IPOPT_RESERVED2		0x60
++
++#define IPOPT_END	(0 |IPOPT_CONTROL)
++#define IPOPT_NOOP	(1 |IPOPT_CONTROL)
++#define IPOPT_SEC	(2 |IPOPT_CONTROL|IPOPT_COPY)
++#define IPOPT_LSRR	(3 |IPOPT_CONTROL|IPOPT_COPY)
++#define IPOPT_TIMESTAMP	(4 |IPOPT_MEASUREMENT)
++#define IPOPT_CIPSO	(6 |IPOPT_CONTROL|IPOPT_COPY)
++#define IPOPT_RR	(7 |IPOPT_CONTROL)
++#define IPOPT_SID	(8 |IPOPT_CONTROL|IPOPT_COPY)
++#define IPOPT_SSRR	(9 |IPOPT_CONTROL|IPOPT_COPY)
++#define IPOPT_RA	(20|IPOPT_CONTROL|IPOPT_COPY)
++
++#define IPVERSION	4
++#define MAXTTL		255
++#define IPDEFTTL	64
++
++#define IPOPT_OPTVAL 0
++#define IPOPT_OLEN   1
++#define IPOPT_OFFSET 2
++#define IPOPT_MINOFF 4
++#define MAX_IPOPTLEN 40
++#define IPOPT_NOP IPOPT_NOOP
++#define IPOPT_EOL IPOPT_END
++#define IPOPT_TS  IPOPT_TIMESTAMP
++
++#define	IPOPT_TS_TSONLY		0		/* timestamps only */
++#define	IPOPT_TS_TSANDADDR	1		/* timestamps and addresses */
++#define	IPOPT_TS_PRESPEC	3		/* specified modules only */
++
++#define IPV4_BEET_PHMAXLEN 8
++
++struct iphdr {
++#if defined(__LITTLE_ENDIAN_BITFIELD)
++	__u8	ihl:4,
++		version:4;
++#elif defined (__BIG_ENDIAN_BITFIELD)
++	__u8	version:4,
++  		ihl:4;
++#else
++#error	"Please fix <asm/byteorder.h>"
++#endif
++	__u8	tos;
++	__be16	tot_len;
++	__be16	id;
++	__be16	frag_off;
++	__u8	ttl;
++	__u8	protocol;
++	__sum16	check;
++	__be32	saddr;
++	__be32	daddr;
++	/*The options start here. */
++};
++
++
++struct ip_auth_hdr {
++	__u8  nexthdr;
++	__u8  hdrlen;		/* This one is measured in 32 bit units! */
++	__be16 reserved;
++	__be32 spi;
++	__be32 seq_no;		/* Sequence number */
++	__u8  auth_data[0];	/* Variable len but >=4. Mind the 64 bit alignment! */
++};
++
++struct ip_esp_hdr {
++	__be32 spi;
++	__be32 seq_no;		/* Sequence number */
++	__u8  enc_data[0];	/* Variable len but >=8. Mind the 64 bit alignment! */
++};
++
++struct ip_comp_hdr {
++	__u8 nexthdr;
++	__u8 flags;
++	__be16 cpi;
++};
++
++struct ip_beet_phdr {
++	__u8 nexthdr;
++	__u8 hdrlen;
++	__u8 padlen;
++	__u8 reserved;
++};
++
++/* index values for the variables in ipv4_devconf */
++enum
++{
++	IPV4_DEVCONF_FORWARDING=1,
++	IPV4_DEVCONF_MC_FORWARDING,
++	IPV4_DEVCONF_PROXY_ARP,
++	IPV4_DEVCONF_ACCEPT_REDIRECTS,
++	IPV4_DEVCONF_SECURE_REDIRECTS,
++	IPV4_DEVCONF_SEND_REDIRECTS,
++	IPV4_DEVCONF_SHARED_MEDIA,
++	IPV4_DEVCONF_RP_FILTER,
++	IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE,
++	IPV4_DEVCONF_BOOTP_RELAY,
++	IPV4_DEVCONF_LOG_MARTIANS,
++	IPV4_DEVCONF_TAG,
++	IPV4_DEVCONF_ARPFILTER,
++	IPV4_DEVCONF_MEDIUM_ID,
++	IPV4_DEVCONF_NOXFRM,
++	IPV4_DEVCONF_NOPOLICY,
++	IPV4_DEVCONF_FORCE_IGMP_VERSION,
++	IPV4_DEVCONF_ARP_ANNOUNCE,
++	IPV4_DEVCONF_ARP_IGNORE,
++	IPV4_DEVCONF_PROMOTE_SECONDARIES,
++	IPV4_DEVCONF_ARP_ACCEPT,
++	IPV4_DEVCONF_ARP_NOTIFY,
++	IPV4_DEVCONF_ACCEPT_LOCAL,
++	IPV4_DEVCONF_SRC_VMARK,
++	IPV4_DEVCONF_PROXY_ARP_PVLAN,
++	IPV4_DEVCONF_ROUTE_LOCALNET,
++	IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL,
++	IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL,
++	IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN,
++	IPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST,
++	IPV4_DEVCONF_DROP_GRATUITOUS_ARP,
++	__IPV4_DEVCONF_MAX
++};
++
++#define IPV4_DEVCONF_MAX (__IPV4_DEVCONF_MAX - 1)
++
++#endif /* _LINUX_IP_H */
+diff --git a/include/uapi/linux/ip6_tunnel.h b/include/uapi/linux/ip6_tunnel.h
+new file mode 100644
+index 0000000..425926c
+--- /dev/null
++++ b/include/uapi/linux/ip6_tunnel.h
+@@ -0,0 +1,53 @@
++#ifndef _IP6_TUNNEL_H
++#define _IP6_TUNNEL_H
++
++#include <linux/types.h>
++#include <linux/if.h>		/* For IFNAMSIZ. */
++#include <linux/in6.h>		/* For struct in6_addr. */
++
++#define IPV6_TLV_TNL_ENCAP_LIMIT 4
++#define IPV6_DEFAULT_TNL_ENCAP_LIMIT 4
++
++/* don't add encapsulation limit if one isn't present in inner packet */
++#define IP6_TNL_F_IGN_ENCAP_LIMIT 0x1
++/* copy the traffic class field from the inner packet */
++#define IP6_TNL_F_USE_ORIG_TCLASS 0x2
++/* copy the flowlabel from the inner packet */
++#define IP6_TNL_F_USE_ORIG_FLOWLABEL 0x4
++/* being used for Mobile IPv6 */
++#define IP6_TNL_F_MIP6_DEV 0x8
++/* copy DSCP from the outer packet */
++#define IP6_TNL_F_RCV_DSCP_COPY 0x10
++/* copy fwmark from inner packet */
++#define IP6_TNL_F_USE_ORIG_FWMARK 0x20
++
++struct ip6_tnl_parm {
++	char name[IFNAMSIZ];	/* name of tunnel device */
++	int link;		/* ifindex of underlying L2 interface */
++	__u8 proto;		/* tunnel protocol */
++	__u8 encap_limit;	/* encapsulation limit for tunnel */
++	__u8 hop_limit;		/* hop limit for tunnel */
++	__be32 flowinfo;	/* traffic class and flowlabel for tunnel */
++	__u32 flags;		/* tunnel flags */
++	struct in6_addr laddr;	/* local tunnel end-point address */
++	struct in6_addr raddr;	/* remote tunnel end-point address */
++};
++
++struct ip6_tnl_parm2 {
++	char name[IFNAMSIZ];	/* name of tunnel device */
++	int link;		/* ifindex of underlying L2 interface */
++	__u8 proto;		/* tunnel protocol */
++	__u8 encap_limit;	/* encapsulation limit for tunnel */
++	__u8 hop_limit;		/* hop limit for tunnel */
++	__be32 flowinfo;	/* traffic class and flowlabel for tunnel */
++	__u32 flags;		/* tunnel flags */
++	struct in6_addr laddr;	/* local tunnel end-point address */
++	struct in6_addr raddr;	/* remote tunnel end-point address */
++
++	__be16			i_flags;
++	__be16			o_flags;
++	__be32			i_key;
++	__be32			o_key;
++};
++
++#endif
+diff --git a/include/uapi/linux/ipsec.h b/include/uapi/linux/ipsec.h
+new file mode 100644
+index 0000000..d17a630
+--- /dev/null
++++ b/include/uapi/linux/ipsec.h
+@@ -0,0 +1,47 @@
++#ifndef _LINUX_IPSEC_H
++#define _LINUX_IPSEC_H
++
++/* The definitions, required to talk to KAME racoon IKE. */
++
++#include <linux/pfkeyv2.h>
++
++#define IPSEC_PORT_ANY		0
++#define IPSEC_ULPROTO_ANY	255
++#define IPSEC_PROTO_ANY		255
++
++enum {
++	IPSEC_MODE_ANY		= 0,	/* We do not support this for SA */
++	IPSEC_MODE_TRANSPORT	= 1,
++	IPSEC_MODE_TUNNEL	= 2,
++	IPSEC_MODE_BEET         = 3
++};
++
++enum {
++	IPSEC_DIR_ANY		= 0,
++	IPSEC_DIR_INBOUND	= 1,
++	IPSEC_DIR_OUTBOUND	= 2,
++	IPSEC_DIR_FWD		= 3,	/* It is our own */
++	IPSEC_DIR_MAX		= 4,
++	IPSEC_DIR_INVALID	= 5
++};
++
++enum {
++	IPSEC_POLICY_DISCARD	= 0,
++	IPSEC_POLICY_NONE	= 1,
++	IPSEC_POLICY_IPSEC	= 2,
++	IPSEC_POLICY_ENTRUST	= 3,
++	IPSEC_POLICY_BYPASS	= 4
++};
++
++enum {
++	IPSEC_LEVEL_DEFAULT	= 0,
++	IPSEC_LEVEL_USE		= 1,
++	IPSEC_LEVEL_REQUIRE	= 2,
++	IPSEC_LEVEL_UNIQUE	= 3
++};
++
++#define IPSEC_MANUAL_REQID_MAX	0x3fff
++
++#define IPSEC_REPLAYWSIZE  32
++
++#endif	/* _LINUX_IPSEC_H */
+diff --git a/include/uapi/linux/kernel.h b/include/uapi/linux/kernel.h
+new file mode 100644
+index 0000000..527549f
+--- /dev/null
++++ b/include/uapi/linux/kernel.h
+@@ -0,0 +1,14 @@
++#ifndef _LINUX_KERNEL_H
++#define _LINUX_KERNEL_H
++
++#include <linux/sysinfo.h>
++
++/*
++ * 'kernel.h' contains some often-used function prototypes etc
++ */
++#define __ALIGN_KERNEL(x, a)		__ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1)
++#define __ALIGN_KERNEL_MASK(x, mask)	(((x) + (mask)) & ~(mask))
++
++#define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
++
++#endif /* _LINUX_KERNEL_H */
+diff --git a/include/uapi/linux/l2tp.h b/include/uapi/linux/l2tp.h
+new file mode 100644
+index 0000000..8a80007
+--- /dev/null
++++ b/include/uapi/linux/l2tp.h
+@@ -0,0 +1,199 @@
++/*
++ * L2TP-over-IP socket for L2TPv3.
++ *
++ * Author: James Chapman <jchapman@katalix.com>
++ */
++
++#ifndef _LINUX_L2TP_H_
++#define _LINUX_L2TP_H_
++
++#include <linux/types.h>
++#include <linux/socket.h>
++#include <linux/in.h>
++#include <linux/in6.h>
++
++#define IPPROTO_L2TP		115
++
++/**
++ * struct sockaddr_l2tpip - the sockaddr structure for L2TP-over-IP sockets
++ * @l2tp_family:  address family number AF_L2TPIP.
++ * @l2tp_addr:    protocol specific address information
++ * @l2tp_conn_id: connection id of tunnel
++ */
++#define __SOCK_SIZE__	16		/* sizeof(struct sockaddr)	*/
++struct sockaddr_l2tpip {
++	/* The first fields must match struct sockaddr_in */
++	__kernel_sa_family_t l2tp_family; /* AF_INET */
++	__be16		l2tp_unused;	/* INET port number (unused) */
++	struct in_addr	l2tp_addr;	/* Internet address */
++
++	__u32		l2tp_conn_id;	/* Connection ID of tunnel */
++
++	/* Pad to size of `struct sockaddr'. */
++	unsigned char	__pad[__SOCK_SIZE__ -
++			      sizeof(__kernel_sa_family_t) -
++			      sizeof(__be16) - sizeof(struct in_addr) -
++			      sizeof(__u32)];
++};
++
++/**
++ * struct sockaddr_l2tpip6 - the sockaddr structure for L2TP-over-IPv6 sockets
++ * @l2tp_family:  address family number AF_L2TPIP.
++ * @l2tp_addr:    protocol specific address information
++ * @l2tp_conn_id: connection id of tunnel
++ */
++struct sockaddr_l2tpip6 {
++	/* The first fields must match struct sockaddr_in6 */
++	__kernel_sa_family_t l2tp_family; /* AF_INET6 */
++	__be16		l2tp_unused;	/* INET port number (unused) */
++	__be32		l2tp_flowinfo;	/* IPv6 flow information */
++	struct in6_addr	l2tp_addr;	/* IPv6 address */
++	__u32		l2tp_scope_id;	/* scope id (new in RFC2553) */
++	__u32		l2tp_conn_id;	/* Connection ID of tunnel */
++};
++
++/*****************************************************************************
++ *  NETLINK_GENERIC netlink family.
++ *****************************************************************************/
++
++/*
++ * Commands.
++ * Valid TLVs of each command are:-
++ * TUNNEL_CREATE	- CONN_ID, pw_type, netns, ifname, ipinfo, udpinfo, udpcsum, vlanid
++ * TUNNEL_DELETE	- CONN_ID
++ * TUNNEL_MODIFY	- CONN_ID, udpcsum
++ * TUNNEL_GETSTATS	- CONN_ID, (stats)
++ * TUNNEL_GET		- CONN_ID, (...)
++ * SESSION_CREATE	- SESSION_ID, PW_TYPE, offset, data_seq, cookie, peer_cookie, offset, l2spec
++ * SESSION_DELETE	- SESSION_ID
++ * SESSION_MODIFY	- SESSION_ID, data_seq
++ * SESSION_GET		- SESSION_ID, (...)
++ * SESSION_GETSTATS	- SESSION_ID, (stats)
++ *
++ */
++enum {
++	L2TP_CMD_NOOP,
++	L2TP_CMD_TUNNEL_CREATE,
++	L2TP_CMD_TUNNEL_DELETE,
++	L2TP_CMD_TUNNEL_MODIFY,
++	L2TP_CMD_TUNNEL_GET,
++	L2TP_CMD_SESSION_CREATE,
++	L2TP_CMD_SESSION_DELETE,
++	L2TP_CMD_SESSION_MODIFY,
++	L2TP_CMD_SESSION_GET,
++	__L2TP_CMD_MAX,
++};
++
++#define L2TP_CMD_MAX			(__L2TP_CMD_MAX - 1)
++
++/*
++ * ATTR types defined for L2TP
++ */
++enum {
++	L2TP_ATTR_NONE,			/* no data */
++	L2TP_ATTR_PW_TYPE,		/* u16, enum l2tp_pwtype */
++	L2TP_ATTR_ENCAP_TYPE,		/* u16, enum l2tp_encap_type */
++	L2TP_ATTR_OFFSET,		/* u16 */
++	L2TP_ATTR_DATA_SEQ,		/* u16 */
++	L2TP_ATTR_L2SPEC_TYPE,		/* u8, enum l2tp_l2spec_type */
++	L2TP_ATTR_L2SPEC_LEN,		/* u8, enum l2tp_l2spec_type */
++	L2TP_ATTR_PROTO_VERSION,	/* u8 */
++	L2TP_ATTR_IFNAME,		/* string */
++	L2TP_ATTR_CONN_ID,		/* u32 */
++	L2TP_ATTR_PEER_CONN_ID,		/* u32 */
++	L2TP_ATTR_SESSION_ID,		/* u32 */
++	L2TP_ATTR_PEER_SESSION_ID,	/* u32 */
++	L2TP_ATTR_UDP_CSUM,		/* u8 */
++	L2TP_ATTR_VLAN_ID,		/* u16 */
++	L2TP_ATTR_COOKIE,		/* 0, 4 or 8 bytes */
++	L2TP_ATTR_PEER_COOKIE,		/* 0, 4 or 8 bytes */
++	L2TP_ATTR_DEBUG,		/* u32, enum l2tp_debug_flags */
++	L2TP_ATTR_RECV_SEQ,		/* u8 */
++	L2TP_ATTR_SEND_SEQ,		/* u8 */
++	L2TP_ATTR_LNS_MODE,		/* u8 */
++	L2TP_ATTR_USING_IPSEC,		/* u8 */
++	L2TP_ATTR_RECV_TIMEOUT,		/* msec */
++	L2TP_ATTR_FD,			/* int */
++	L2TP_ATTR_IP_SADDR,		/* u32 */
++	L2TP_ATTR_IP_DADDR,		/* u32 */
++	L2TP_ATTR_UDP_SPORT,		/* u16 */
++	L2TP_ATTR_UDP_DPORT,		/* u16 */
++	L2TP_ATTR_MTU,			/* u16 */
++	L2TP_ATTR_MRU,			/* u16 */
++	L2TP_ATTR_STATS,		/* nested */
++	L2TP_ATTR_IP6_SADDR,		/* struct in6_addr */
++	L2TP_ATTR_IP6_DADDR,		/* struct in6_addr */
++	L2TP_ATTR_UDP_ZERO_CSUM6_TX,	/* flag */
++	L2TP_ATTR_UDP_ZERO_CSUM6_RX,	/* flag */
++	L2TP_ATTR_PAD,
++	__L2TP_ATTR_MAX,
++};
++
++#define L2TP_ATTR_MAX			(__L2TP_ATTR_MAX - 1)
++
++/* Nested in L2TP_ATTR_STATS */
++enum {
++	L2TP_ATTR_STATS_NONE,		/* no data */
++	L2TP_ATTR_TX_PACKETS,		/* u64 */
++	L2TP_ATTR_TX_BYTES,		/* u64 */
++	L2TP_ATTR_TX_ERRORS,		/* u64 */
++	L2TP_ATTR_RX_PACKETS,		/* u64 */
++	L2TP_ATTR_RX_BYTES,		/* u64 */
++	L2TP_ATTR_RX_SEQ_DISCARDS,	/* u64 */
++	L2TP_ATTR_RX_OOS_PACKETS,	/* u64 */
++	L2TP_ATTR_RX_ERRORS,		/* u64 */
++	L2TP_ATTR_STATS_PAD,
++	__L2TP_ATTR_STATS_MAX,
++};
++
++#define L2TP_ATTR_STATS_MAX		(__L2TP_ATTR_STATS_MAX - 1)
++
++enum l2tp_pwtype {
++	L2TP_PWTYPE_NONE = 0x0000,
++	L2TP_PWTYPE_ETH_VLAN = 0x0004,
++	L2TP_PWTYPE_ETH = 0x0005,
++	L2TP_PWTYPE_PPP = 0x0007,
++	L2TP_PWTYPE_PPP_AC = 0x0008,
++	L2TP_PWTYPE_IP = 0x000b,
++	__L2TP_PWTYPE_MAX
++};
++
++enum l2tp_l2spec_type {
++	L2TP_L2SPECTYPE_NONE,
++	L2TP_L2SPECTYPE_DEFAULT,
++};
++
++enum l2tp_encap_type {
++	L2TP_ENCAPTYPE_UDP,
++	L2TP_ENCAPTYPE_IP,
++};
++
++enum l2tp_seqmode {
++	L2TP_SEQ_NONE = 0,
++	L2TP_SEQ_IP = 1,
++	L2TP_SEQ_ALL = 2,
++};
++
++/**
++ * enum l2tp_debug_flags - debug message categories for L2TP tunnels/sessions
++ *
++ * @L2TP_MSG_DEBUG: verbose debug (if compiled in)
++ * @L2TP_MSG_CONTROL: userspace - kernel interface
++ * @L2TP_MSG_SEQ: sequence numbers
++ * @L2TP_MSG_DATA: data packets
++ */
++enum l2tp_debug_flags {
++	L2TP_MSG_DEBUG		= (1 << 0),
++	L2TP_MSG_CONTROL	= (1 << 1),
++	L2TP_MSG_SEQ		= (1 << 2),
++	L2TP_MSG_DATA		= (1 << 3),
++};
++
++/*
++ * NETLINK_GENERIC related info
++ */
++#define L2TP_GENL_NAME		"l2tp"
++#define L2TP_GENL_VERSION	0x1
++#define L2TP_GENL_MCGROUP       "l2tp"
++
++#endif /* _LINUX_L2TP_H_ */
+diff --git a/include/uapi/linux/libc-compat.h b/include/uapi/linux/libc-compat.h
+new file mode 100644
+index 0000000..f38571d
+--- /dev/null
++++ b/include/uapi/linux/libc-compat.h
+@@ -0,0 +1,213 @@
++/*
++ * Compatibility interface for userspace libc header coordination:
++ *
++ * Define compatibility macros that are used to control the inclusion or
++ * exclusion of UAPI structures and definitions in coordination with another
++ * userspace C library.
++ *
++ * This header is intended to solve the problem of UAPI definitions that
++ * conflict with userspace definitions. If a UAPI header has such conflicting
++ * definitions then the solution is as follows:
++ *
++ * * Synchronize the UAPI header and the libc headers so either one can be
++ *   used and such that the ABI is preserved. If this is not possible then
++ *   no simple compatibility interface exists (you need to write translating
++ *   wrappers and rename things) and you can't use this interface.
++ *
++ * Then follow this process:
++ *
++ * (a) Include libc-compat.h in the UAPI header.
++ *      e.g. #include <linux/libc-compat.h>
++ *     This include must be as early as possible.
++ *
++ * (b) In libc-compat.h add enough code to detect that the comflicting
++ *     userspace libc header has been included first.
++ *
++ * (c) If the userspace libc header has been included first define a set of
++ *     guard macros of the form __UAPI_DEF_FOO and set their values to 1, else
++ *     set their values to 0.
++ *
++ * (d) Back in the UAPI header with the conflicting definitions, guard the
++ *     definitions with:
++ *     #if __UAPI_DEF_FOO
++ *       ...
++ *     #endif
++ *
++ * This fixes the situation where the linux headers are included *after* the
++ * libc headers. To fix the problem with the inclusion in the other order the
++ * userspace libc headers must be fixed like this:
++ *
++ * * For all definitions that conflict with kernel definitions wrap those
++ *   defines in the following:
++ *   #if !__UAPI_DEF_FOO
++ *     ...
++ *   #endif
++ *
++ * This prevents the redefinition of a construct already defined by the kernel.
++ */
++#ifndef _LIBC_COMPAT_H
++#define _LIBC_COMPAT_H
++
++/* We have included glibc headers... */
++#if defined(__GLIBC__)
++
++/* Coordinate with glibc net/if.h header. */
++#if defined(_NET_IF_H) && defined(__USE_MISC)
++
++/* GLIBC headers included first so don't define anything
++ * that would already be defined. */
++
++#define __UAPI_DEF_IF_IFCONF 0
++#define __UAPI_DEF_IF_IFMAP 0
++#define __UAPI_DEF_IF_IFNAMSIZ 0
++#define __UAPI_DEF_IF_IFREQ 0
++/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */
++#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 0
++/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */
++#ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO
++#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1
++#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */
++
++#else /* _NET_IF_H */
++
++/* Linux headers included first, and we must define everything
++ * we need. The expectation is that glibc will check the
++ * __UAPI_DEF_* defines and adjust appropriately. */
++
++#define __UAPI_DEF_IF_IFCONF 1
++#define __UAPI_DEF_IF_IFMAP 1
++#define __UAPI_DEF_IF_IFNAMSIZ 1
++#define __UAPI_DEF_IF_IFREQ 1
++/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */
++#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1
++/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */
++#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1
++
++#endif /* _NET_IF_H */
++
++/* Coordinate with glibc netinet/in.h header. */
++#if defined(_NETINET_IN_H)
++
++/* GLIBC headers included first so don't define anything
++ * that would already be defined. */
++#define __UAPI_DEF_IN_ADDR		0
++#define __UAPI_DEF_IN_IPPROTO		0
++#define __UAPI_DEF_IN_PKTINFO		0
++#define __UAPI_DEF_IP_MREQ		0
++#define __UAPI_DEF_SOCKADDR_IN		0
++#define __UAPI_DEF_IN_CLASS		0
++
++#define __UAPI_DEF_IN6_ADDR		0
++/* The exception is the in6_addr macros which must be defined
++ * if the glibc code didn't define them. This guard matches
++ * the guard in glibc/inet/netinet/in.h which defines the
++ * additional in6_addr macros e.g. s6_addr16, and s6_addr32. */
++#if defined(__USE_MISC) || defined (__USE_GNU)
++#define __UAPI_DEF_IN6_ADDR_ALT		0
++#else
++#define __UAPI_DEF_IN6_ADDR_ALT		1
++#endif
++#define __UAPI_DEF_SOCKADDR_IN6		0
++#define __UAPI_DEF_IPV6_MREQ		0
++#define __UAPI_DEF_IPPROTO_V6		0
++#define __UAPI_DEF_IPV6_OPTIONS		0
++#define __UAPI_DEF_IN6_PKTINFO		0
++#define __UAPI_DEF_IP6_MTUINFO		0
++
++#else
++
++/* Linux headers included first, and we must define everything
++ * we need. The expectation is that glibc will check the
++ * __UAPI_DEF_* defines and adjust appropriately. */
++#define __UAPI_DEF_IN_ADDR		1
++#define __UAPI_DEF_IN_IPPROTO		1
++#define __UAPI_DEF_IN_PKTINFO		1
++#define __UAPI_DEF_IP_MREQ		1
++#define __UAPI_DEF_SOCKADDR_IN		1
++#define __UAPI_DEF_IN_CLASS		1
++
++#define __UAPI_DEF_IN6_ADDR		1
++/* We unconditionally define the in6_addr macros and glibc must
++ * coordinate. */
++#define __UAPI_DEF_IN6_ADDR_ALT		1
++#define __UAPI_DEF_SOCKADDR_IN6		1
++#define __UAPI_DEF_IPV6_MREQ		1
++#define __UAPI_DEF_IPPROTO_V6		1
++#define __UAPI_DEF_IPV6_OPTIONS		1
++#define __UAPI_DEF_IN6_PKTINFO		1
++#define __UAPI_DEF_IP6_MTUINFO		1
++
++#endif /* _NETINET_IN_H */
++
++/* Coordinate with glibc netipx/ipx.h header. */
++#if defined(__NETIPX_IPX_H)
++
++#define __UAPI_DEF_SOCKADDR_IPX			0
++#define __UAPI_DEF_IPX_ROUTE_DEFINITION		0
++#define __UAPI_DEF_IPX_INTERFACE_DEFINITION	0
++#define __UAPI_DEF_IPX_CONFIG_DATA		0
++#define __UAPI_DEF_IPX_ROUTE_DEF		0
++
++#else /* defined(__NETIPX_IPX_H) */
++
++#define __UAPI_DEF_SOCKADDR_IPX			1
++#define __UAPI_DEF_IPX_ROUTE_DEFINITION		1
++#define __UAPI_DEF_IPX_INTERFACE_DEFINITION	1
++#define __UAPI_DEF_IPX_CONFIG_DATA		1
++#define __UAPI_DEF_IPX_ROUTE_DEF		1
++
++#endif /* defined(__NETIPX_IPX_H) */
++
++/* Definitions for xattr.h */
++#if defined(_SYS_XATTR_H)
++#define __UAPI_DEF_XATTR		0
++#else
++#define __UAPI_DEF_XATTR		1
++#endif
++
++/* If we did not see any headers from any supported C libraries,
++ * or we are being included in the kernel, then define everything
++ * that we need. */
++#else /* !defined(__GLIBC__) */
++
++/* Definitions for if.h */
++#define __UAPI_DEF_IF_IFCONF 1
++#define __UAPI_DEF_IF_IFMAP 1
++#define __UAPI_DEF_IF_IFNAMSIZ 1
++#define __UAPI_DEF_IF_IFREQ 1
++/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */
++#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1
++/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */
++#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1
++
++/* Definitions for in.h */
++#define __UAPI_DEF_IN_ADDR		1
++#define __UAPI_DEF_IN_IPPROTO		1
++#define __UAPI_DEF_IN_PKTINFO		1
++#define __UAPI_DEF_IP_MREQ		1
++#define __UAPI_DEF_SOCKADDR_IN		1
++#define __UAPI_DEF_IN_CLASS		1
++
++/* Definitions for in6.h */
++#define __UAPI_DEF_IN6_ADDR		1
++#define __UAPI_DEF_IN6_ADDR_ALT		1
++#define __UAPI_DEF_SOCKADDR_IN6		1
++#define __UAPI_DEF_IPV6_MREQ		1
++#define __UAPI_DEF_IPPROTO_V6		1
++#define __UAPI_DEF_IPV6_OPTIONS		1
++#define __UAPI_DEF_IN6_PKTINFO		1
++#define __UAPI_DEF_IP6_MTUINFO		1
++
++/* Definitions for ipx.h */
++#define __UAPI_DEF_SOCKADDR_IPX			1
++#define __UAPI_DEF_IPX_ROUTE_DEFINITION		1
++#define __UAPI_DEF_IPX_INTERFACE_DEFINITION	1
++#define __UAPI_DEF_IPX_CONFIG_DATA		1
++#define __UAPI_DEF_IPX_ROUTE_DEF		1
++
++/* Definitions for xattr.h */
++#define __UAPI_DEF_XATTR		1
++
++#endif /* __GLIBC__ */
++
++#endif /* _LIBC_COMPAT_H */
+diff --git a/include/uapi/linux/limits.h b/include/uapi/linux/limits.h
+new file mode 100644
+index 0000000..2d0f941
+--- /dev/null
++++ b/include/uapi/linux/limits.h
+@@ -0,0 +1,20 @@
++#ifndef _LINUX_LIMITS_H
++#define _LINUX_LIMITS_H
++
++#define NR_OPEN	        1024
++
++#define NGROUPS_MAX    65536	/* supplemental group IDs are available */
++#define ARG_MAX       131072	/* # bytes of args + environ for exec() */
++#define LINK_MAX         127	/* # links a file may have */
++#define MAX_CANON        255	/* size of the canonical input queue */
++#define MAX_INPUT        255	/* size of the type-ahead buffer */
++#define NAME_MAX         255	/* # chars in a file name */
++#define PATH_MAX        4096	/* # chars in a path name including nul */
++#define PIPE_BUF        4096	/* # bytes in atomic write to a pipe */
++#define XATTR_NAME_MAX   255	/* # chars in an extended attribute name */
++#define XATTR_SIZE_MAX 65536	/* size of an extended attribute value (64k) */
++#define XATTR_LIST_MAX 65536	/* size of extended attribute namelist (64k) */
++
++#define RTSIG_MAX	  32
++
++#endif
+diff --git a/include/uapi/linux/lwtunnel.h b/include/uapi/linux/lwtunnel.h
+new file mode 100644
+index 0000000..3298426
+--- /dev/null
++++ b/include/uapi/linux/lwtunnel.h
+@@ -0,0 +1,70 @@
++#ifndef _LWTUNNEL_H_
++#define _LWTUNNEL_H_
++
++#include <linux/types.h>
++
++enum lwtunnel_encap_types {
++	LWTUNNEL_ENCAP_NONE,
++	LWTUNNEL_ENCAP_MPLS,
++	LWTUNNEL_ENCAP_IP,
++	LWTUNNEL_ENCAP_ILA,
++	LWTUNNEL_ENCAP_IP6,
++	LWTUNNEL_ENCAP_SEG6,
++	LWTUNNEL_ENCAP_BPF,
++	LWTUNNEL_ENCAP_SEG6_LOCAL,
++	__LWTUNNEL_ENCAP_MAX,
++};
++
++#define LWTUNNEL_ENCAP_MAX (__LWTUNNEL_ENCAP_MAX - 1)
++
++enum lwtunnel_ip_t {
++	LWTUNNEL_IP_UNSPEC,
++	LWTUNNEL_IP_ID,
++	LWTUNNEL_IP_DST,
++	LWTUNNEL_IP_SRC,
++	LWTUNNEL_IP_TTL,
++	LWTUNNEL_IP_TOS,
++	LWTUNNEL_IP_FLAGS,
++	LWTUNNEL_IP_PAD,
++	__LWTUNNEL_IP_MAX,
++};
++
++#define LWTUNNEL_IP_MAX (__LWTUNNEL_IP_MAX - 1)
++
++enum lwtunnel_ip6_t {
++	LWTUNNEL_IP6_UNSPEC,
++	LWTUNNEL_IP6_ID,
++	LWTUNNEL_IP6_DST,
++	LWTUNNEL_IP6_SRC,
++	LWTUNNEL_IP6_HOPLIMIT,
++	LWTUNNEL_IP6_TC,
++	LWTUNNEL_IP6_FLAGS,
++	LWTUNNEL_IP6_PAD,
++	__LWTUNNEL_IP6_MAX,
++};
++
++#define LWTUNNEL_IP6_MAX (__LWTUNNEL_IP6_MAX - 1)
++
++enum {
++	LWT_BPF_PROG_UNSPEC,
++	LWT_BPF_PROG_FD,
++	LWT_BPF_PROG_NAME,
++	__LWT_BPF_PROG_MAX,
++};
++
++#define LWT_BPF_PROG_MAX (__LWT_BPF_PROG_MAX - 1)
++
++enum {
++	LWT_BPF_UNSPEC,
++	LWT_BPF_IN,
++	LWT_BPF_OUT,
++	LWT_BPF_XMIT,
++	LWT_BPF_XMIT_HEADROOM,
++	__LWT_BPF_MAX,
++};
++
++#define LWT_BPF_MAX (__LWT_BPF_MAX - 1)
++
++#define LWT_BPF_MAX_HEADROOM 256
++
++#endif /* _LWTUNNEL_H_ */
+diff --git a/include/uapi/linux/magic.h b/include/uapi/linux/magic.h
+new file mode 100644
+index 0000000..e439565
+--- /dev/null
++++ b/include/uapi/linux/magic.h
+@@ -0,0 +1,91 @@
++#ifndef __LINUX_MAGIC_H__
++#define __LINUX_MAGIC_H__
++
++#define ADFS_SUPER_MAGIC	0xadf5
++#define AFFS_SUPER_MAGIC	0xadff
++#define AFS_SUPER_MAGIC                0x5346414F
++#define AUTOFS_SUPER_MAGIC	0x0187
++#define CODA_SUPER_MAGIC	0x73757245
++#define CRAMFS_MAGIC		0x28cd3d45	/* some random number */
++#define CRAMFS_MAGIC_WEND	0x453dcd28	/* magic number with the wrong endianess */
++#define DEBUGFS_MAGIC          0x64626720
++#define SECURITYFS_MAGIC	0x73636673
++#define SELINUX_MAGIC		0xf97cff8c
++#define SMACK_MAGIC		0x43415d53	/* "SMAC" */
++#define RAMFS_MAGIC		0x858458f6	/* some random number */
++#define TMPFS_MAGIC		0x01021994
++#define HUGETLBFS_MAGIC 	0x958458f6	/* some random number */
++#define SQUASHFS_MAGIC		0x73717368
++#define ECRYPTFS_SUPER_MAGIC	0xf15f
++#define EFS_SUPER_MAGIC		0x414A53
++#define EXT2_SUPER_MAGIC	0xEF53
++#define EXT3_SUPER_MAGIC	0xEF53
++#define XENFS_SUPER_MAGIC	0xabba1974
++#define EXT4_SUPER_MAGIC	0xEF53
++#define BTRFS_SUPER_MAGIC	0x9123683E
++#define NILFS_SUPER_MAGIC	0x3434
++#define F2FS_SUPER_MAGIC	0xF2F52010
++#define HPFS_SUPER_MAGIC	0xf995e849
++#define ISOFS_SUPER_MAGIC	0x9660
++#define JFFS2_SUPER_MAGIC	0x72b6
++#define PSTOREFS_MAGIC		0x6165676C
++#define EFIVARFS_MAGIC		0xde5e81e4
++#define HOSTFS_SUPER_MAGIC	0x00c0ffee
++#define OVERLAYFS_SUPER_MAGIC	0x794c7630
++
++#define MINIX_SUPER_MAGIC	0x137F		/* minix v1 fs, 14 char names */
++#define MINIX_SUPER_MAGIC2	0x138F		/* minix v1 fs, 30 char names */
++#define MINIX2_SUPER_MAGIC	0x2468		/* minix v2 fs, 14 char names */
++#define MINIX2_SUPER_MAGIC2	0x2478		/* minix v2 fs, 30 char names */
++#define MINIX3_SUPER_MAGIC	0x4d5a		/* minix v3 fs, 60 char names */
++
++#define MSDOS_SUPER_MAGIC	0x4d44		/* MD */
++#define NCP_SUPER_MAGIC		0x564c		/* Guess, what 0x564c is :-) */
++#define NFS_SUPER_MAGIC		0x6969
++#define OCFS2_SUPER_MAGIC	0x7461636f
++#define OPENPROM_SUPER_MAGIC	0x9fa1
++#define QNX4_SUPER_MAGIC	0x002f		/* qnx4 fs detection */
++#define QNX6_SUPER_MAGIC	0x68191122	/* qnx6 fs detection */
++
++#define REISERFS_SUPER_MAGIC	0x52654973	/* used by gcc */
++					/* used by file system utilities that
++	                                   look at the superblock, etc.  */
++#define REISERFS_SUPER_MAGIC_STRING	"ReIsErFs"
++#define REISER2FS_SUPER_MAGIC_STRING	"ReIsEr2Fs"
++#define REISER2FS_JR_SUPER_MAGIC_STRING	"ReIsEr3Fs"
++
++#define SMB_SUPER_MAGIC		0x517B
++#define CGROUP_SUPER_MAGIC	0x27e0eb
++#define CGROUP2_SUPER_MAGIC	0x63677270
++
++#define RDTGROUP_SUPER_MAGIC	0x7655821
++
++#define STACK_END_MAGIC		0x57AC6E9D
++
++#define TRACEFS_MAGIC          0x74726163
++
++#define V9FS_MAGIC		0x01021997
++
++#define BDEVFS_MAGIC            0x62646576
++#define DAXFS_MAGIC             0x64646178
++#define BINFMTFS_MAGIC          0x42494e4d
++#define DEVPTS_SUPER_MAGIC	0x1cd1
++#define FUTEXFS_SUPER_MAGIC	0xBAD1DEA
++#define PIPEFS_MAGIC            0x50495045
++#define PROC_SUPER_MAGIC	0x9fa0
++#define SOCKFS_MAGIC		0x534F434B
++#define SYSFS_MAGIC		0x62656572
++#define USBDEVICE_SUPER_MAGIC	0x9fa2
++#define MTD_INODE_FS_MAGIC      0x11307854
++#define ANON_INODE_FS_MAGIC	0x09041934
++#define BTRFS_TEST_MAGIC	0x73727279
++#define NSFS_MAGIC		0x6e736673
++#define BPF_FS_MAGIC		0xcafe4a11
++#define AAFS_MAGIC		0x5a3c69f0
++
++/* Since UDF 2.01 is ISO 13346 based... */
++#define UDF_SUPER_MAGIC		0x15013346
++#define BALLOON_KVM_MAGIC	0x13661366
++#define ZSMALLOC_MAGIC		0x58295829
++
++#endif /* __LINUX_MAGIC_H__ */
+diff --git a/include/uapi/linux/mpls.h b/include/uapi/linux/mpls.h
+new file mode 100644
+index 0000000..bf5b625
+--- /dev/null
++++ b/include/uapi/linux/mpls.h
+@@ -0,0 +1,76 @@
++#ifndef _MPLS_H
++#define _MPLS_H
++
++#include <linux/types.h>
++#include <asm/byteorder.h>
++
++/* Reference: RFC 5462, RFC 3032
++ *
++ *  0                   1                   2                   3
++ *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
++ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++ * |                Label                  | TC  |S|       TTL     |
++ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++ *
++ *	Label:  Label Value, 20 bits
++ *	TC:     Traffic Class field, 3 bits
++ *	S:      Bottom of Stack, 1 bit
++ *	TTL:    Time to Live, 8 bits
++ */
++
++struct mpls_label {
++	__be32 entry;
++};
++
++#define MPLS_LS_LABEL_MASK      0xFFFFF000
++#define MPLS_LS_LABEL_SHIFT     12
++#define MPLS_LS_TC_MASK         0x00000E00
++#define MPLS_LS_TC_SHIFT        9
++#define MPLS_LS_S_MASK          0x00000100
++#define MPLS_LS_S_SHIFT         8
++#define MPLS_LS_TTL_MASK        0x000000FF
++#define MPLS_LS_TTL_SHIFT       0
++
++/* Reserved labels */
++#define MPLS_LABEL_IPV4NULL		0 /* RFC3032 */
++#define MPLS_LABEL_RTALERT		1 /* RFC3032 */
++#define MPLS_LABEL_IPV6NULL		2 /* RFC3032 */
++#define MPLS_LABEL_IMPLNULL		3 /* RFC3032 */
++#define MPLS_LABEL_ENTROPY		7 /* RFC6790 */
++#define MPLS_LABEL_GAL			13 /* RFC5586 */
++#define MPLS_LABEL_OAMALERT		14 /* RFC3429 */
++#define MPLS_LABEL_EXTENSION		15 /* RFC7274 */
++
++#define MPLS_LABEL_FIRST_UNRESERVED	16 /* RFC3032 */
++
++/* These are embedded into IFLA_STATS_AF_SPEC:
++ * [IFLA_STATS_AF_SPEC]
++ * -> [AF_MPLS]
++ *    -> [MPLS_STATS_xxx]
++ *
++ * Attributes:
++ * [MPLS_STATS_LINK] = {
++ *     struct mpls_link_stats
++ * }
++ */
++enum {
++	MPLS_STATS_UNSPEC, /* also used as 64bit pad attribute */
++	MPLS_STATS_LINK,
++	__MPLS_STATS_MAX,
++};
++
++#define MPLS_STATS_MAX (__MPLS_STATS_MAX - 1)
++
++struct mpls_link_stats {
++	__u64	rx_packets;		/* total packets received	*/
++	__u64	tx_packets;		/* total packets transmitted	*/
++	__u64	rx_bytes;		/* total bytes received		*/
++	__u64	tx_bytes;		/* total bytes transmitted	*/
++	__u64	rx_errors;		/* bad packets received		*/
++	__u64	tx_errors;		/* packet transmit problems	*/
++	__u64	rx_dropped;		/* packet dropped on receive	*/
++	__u64	tx_dropped;		/* packet dropped on transmit	*/
++	__u64	rx_noroute;		/* no route for packet dest	*/
++};
++
++#endif /* _MPLS_H */
+diff --git a/include/uapi/linux/mpls_iptunnel.h b/include/uapi/linux/mpls_iptunnel.h
+new file mode 100644
+index 0000000..1a0e57b
+--- /dev/null
++++ b/include/uapi/linux/mpls_iptunnel.h
+@@ -0,0 +1,30 @@
++/*
++ *	mpls tunnel api
++ *
++ *	Authors:
++ *		Roopa Prabhu <roopa@cumulusnetworks.com>
++ *
++ *	This program is free software; you can redistribute it and/or
++ *	modify it under the terms of the GNU General Public License
++ *	as published by the Free Software Foundation; either version
++ *	2 of the License, or (at your option) any later version.
++ */
++
++#ifndef _LINUX_MPLS_IPTUNNEL_H
++#define _LINUX_MPLS_IPTUNNEL_H
++
++/* MPLS tunnel attributes
++ * [RTA_ENCAP] = {
++ *     [MPLS_IPTUNNEL_DST]
++ *     [MPLS_IPTUNNEL_TTL]
++ * }
++ */
++enum {
++	MPLS_IPTUNNEL_UNSPEC,
++	MPLS_IPTUNNEL_DST,
++	MPLS_IPTUNNEL_TTL,
++	__MPLS_IPTUNNEL_MAX,
++};
++#define MPLS_IPTUNNEL_MAX (__MPLS_IPTUNNEL_MAX - 1)
++
++#endif /* _LINUX_MPLS_IPTUNNEL_H */
+diff --git a/include/uapi/linux/neighbour.h b/include/uapi/linux/neighbour.h
+new file mode 100644
+index 0000000..3199d28
+--- /dev/null
++++ b/include/uapi/linux/neighbour.h
+@@ -0,0 +1,171 @@
++#ifndef __LINUX_NEIGHBOUR_H
++#define __LINUX_NEIGHBOUR_H
++
++#include <linux/types.h>
++#include <linux/netlink.h>
++
++struct ndmsg {
++	__u8		ndm_family;
++	__u8		ndm_pad1;
++	__u16		ndm_pad2;
++	__s32		ndm_ifindex;
++	__u16		ndm_state;
++	__u8		ndm_flags;
++	__u8		ndm_type;
++};
++
++enum {
++	NDA_UNSPEC,
++	NDA_DST,
++	NDA_LLADDR,
++	NDA_CACHEINFO,
++	NDA_PROBES,
++	NDA_VLAN,
++	NDA_PORT,
++	NDA_VNI,
++	NDA_IFINDEX,
++	NDA_MASTER,
++	NDA_LINK_NETNSID,
++	NDA_SRC_VNI,
++	__NDA_MAX
++};
++
++#define NDA_MAX (__NDA_MAX - 1)
++
++/*
++ *	Neighbor Cache Entry Flags
++ */
++
++#define NTF_USE		0x01
++#define NTF_SELF	0x02
++#define NTF_MASTER	0x04
++#define NTF_PROXY	0x08	/* == ATF_PUBL */
++#define NTF_EXT_LEARNED	0x10
++#define NTF_OFFLOADED   0x20
++#define NTF_ROUTER	0x80
++
++/*
++ *	Neighbor Cache Entry States.
++ */
++
++#define NUD_INCOMPLETE	0x01
++#define NUD_REACHABLE	0x02
++#define NUD_STALE	0x04
++#define NUD_DELAY	0x08
++#define NUD_PROBE	0x10
++#define NUD_FAILED	0x20
++
++/* Dummy states */
++#define NUD_NOARP	0x40
++#define NUD_PERMANENT	0x80
++#define NUD_NONE	0x00
++
++/* NUD_NOARP & NUD_PERMANENT are pseudostates, they never change
++   and make no address resolution or NUD.
++   NUD_PERMANENT also cannot be deleted by garbage collectors.
++ */
++
++struct nda_cacheinfo {
++	__u32		ndm_confirmed;
++	__u32		ndm_used;
++	__u32		ndm_updated;
++	__u32		ndm_refcnt;
++};
++
++/*****************************************************************
++ *		Neighbour tables specific messages.
++ *
++ * To retrieve the neighbour tables send RTM_GETNEIGHTBL with the
++ * NLM_F_DUMP flag set. Every neighbour table configuration is
++ * spread over multiple messages to avoid running into message
++ * size limits on systems with many interfaces. The first message
++ * in the sequence transports all not device specific data such as
++ * statistics, configuration, and the default parameter set.
++ * This message is followed by 0..n messages carrying device
++ * specific parameter sets.
++ * Although the ordering should be sufficient, NDTA_NAME can be
++ * used to identify sequences. The initial message can be identified
++ * by checking for NDTA_CONFIG. The device specific messages do
++ * not contain this TLV but have NDTPA_IFINDEX set to the
++ * corresponding interface index.
++ *
++ * To change neighbour table attributes, send RTM_SETNEIGHTBL
++ * with NDTA_NAME set. Changeable attribute include NDTA_THRESH[1-3],
++ * NDTA_GC_INTERVAL, and all TLVs in NDTA_PARMS unless marked
++ * otherwise. Device specific parameter sets can be changed by
++ * setting NDTPA_IFINDEX to the interface index of the corresponding
++ * device.
++ ****/
++
++struct ndt_stats {
++	__u64		ndts_allocs;
++	__u64		ndts_destroys;
++	__u64		ndts_hash_grows;
++	__u64		ndts_res_failed;
++	__u64		ndts_lookups;
++	__u64		ndts_hits;
++	__u64		ndts_rcv_probes_mcast;
++	__u64		ndts_rcv_probes_ucast;
++	__u64		ndts_periodic_gc_runs;
++	__u64		ndts_forced_gc_runs;
++	__u64		ndts_table_fulls;
++};
++
++enum {
++	NDTPA_UNSPEC,
++	NDTPA_IFINDEX,			/* u32, unchangeable */
++	NDTPA_REFCNT,			/* u32, read-only */
++	NDTPA_REACHABLE_TIME,		/* u64, read-only, msecs */
++	NDTPA_BASE_REACHABLE_TIME,	/* u64, msecs */
++	NDTPA_RETRANS_TIME,		/* u64, msecs */
++	NDTPA_GC_STALETIME,		/* u64, msecs */
++	NDTPA_DELAY_PROBE_TIME,		/* u64, msecs */
++	NDTPA_QUEUE_LEN,		/* u32 */
++	NDTPA_APP_PROBES,		/* u32 */
++	NDTPA_UCAST_PROBES,		/* u32 */
++	NDTPA_MCAST_PROBES,		/* u32 */
++	NDTPA_ANYCAST_DELAY,		/* u64, msecs */
++	NDTPA_PROXY_DELAY,		/* u64, msecs */
++	NDTPA_PROXY_QLEN,		/* u32 */
++	NDTPA_LOCKTIME,			/* u64, msecs */
++	NDTPA_QUEUE_LENBYTES,		/* u32 */
++	NDTPA_MCAST_REPROBES,		/* u32 */
++	NDTPA_PAD,
++	__NDTPA_MAX
++};
++#define NDTPA_MAX (__NDTPA_MAX - 1)
++
++struct ndtmsg {
++	__u8		ndtm_family;
++	__u8		ndtm_pad1;
++	__u16		ndtm_pad2;
++};
++
++struct ndt_config {
++	__u16		ndtc_key_len;
++	__u16		ndtc_entry_size;
++	__u32		ndtc_entries;
++	__u32		ndtc_last_flush;	/* delta to now in msecs */
++	__u32		ndtc_last_rand;		/* delta to now in msecs */
++	__u32		ndtc_hash_rnd;
++	__u32		ndtc_hash_mask;
++	__u32		ndtc_hash_chain_gc;
++	__u32		ndtc_proxy_qlen;
++};
++
++enum {
++	NDTA_UNSPEC,
++	NDTA_NAME,			/* char *, unchangeable */
++	NDTA_THRESH1,			/* u32 */
++	NDTA_THRESH2,			/* u32 */
++	NDTA_THRESH3,			/* u32 */
++	NDTA_CONFIG,			/* struct ndt_config, read-only */
++	NDTA_PARMS,			/* nested TLV NDTPA_* */
++	NDTA_STATS,			/* struct ndt_stats, read-only */
++	NDTA_GC_INTERVAL,		/* u64, msecs */
++	NDTA_PAD,
++	__NDTA_MAX
++};
++#define NDTA_MAX (__NDTA_MAX - 1)
++
++#endif
+diff --git a/include/uapi/linux/net_namespace.h b/include/uapi/linux/net_namespace.h
+new file mode 100644
+index 0000000..9a92b7e
+--- /dev/null
++++ b/include/uapi/linux/net_namespace.h
+@@ -0,0 +1,23 @@
++/* Copyright (c) 2015 6WIND S.A.
++ * Author: Nicolas Dichtel <nicolas.dichtel@6wind.com>
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ */
++#ifndef _LINUX_NET_NAMESPACE_H_
++#define _LINUX_NET_NAMESPACE_H_
++
++/* Attributes of RTM_NEWNSID/RTM_GETNSID messages */
++enum {
++	NETNSA_NONE,
++#define NETNSA_NSID_NOT_ASSIGNED -1
++	NETNSA_NSID,
++	NETNSA_PID,
++	NETNSA_FD,
++	__NETNSA_MAX,
++};
++
++#define NETNSA_MAX		(__NETNSA_MAX - 1)
++
++#endif /* _LINUX_NET_NAMESPACE_H_ */
+diff --git a/include/uapi/linux/netconf.h b/include/uapi/linux/netconf.h
+new file mode 100644
+index 0000000..4afbd7d
+--- /dev/null
++++ b/include/uapi/linux/netconf.h
+@@ -0,0 +1,28 @@
++#ifndef _LINUX_NETCONF_H_
++#define _LINUX_NETCONF_H_
++
++#include <linux/types.h>
++#include <linux/netlink.h>
++
++struct netconfmsg {
++	__u8	ncm_family;
++};
++
++enum {
++	NETCONFA_UNSPEC,
++	NETCONFA_IFINDEX,
++	NETCONFA_FORWARDING,
++	NETCONFA_RP_FILTER,
++	NETCONFA_MC_FORWARDING,
++	NETCONFA_PROXY_NEIGH,
++	NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN,
++	NETCONFA_INPUT,
++	__NETCONFA_MAX
++};
++#define NETCONFA_MAX	(__NETCONFA_MAX - 1)
++#define NETCONFA_ALL	-1
++
++#define NETCONFA_IFINDEX_ALL		-1
++#define NETCONFA_IFINDEX_DEFAULT	-2
++
++#endif /* _LINUX_NETCONF_H_ */
+diff --git a/include/uapi/linux/netdevice.h b/include/uapi/linux/netdevice.h
+new file mode 100644
+index 0000000..66fceb4
+--- /dev/null
++++ b/include/uapi/linux/netdevice.h
+@@ -0,0 +1,65 @@
++/*
++ * INET		An implementation of the TCP/IP protocol suite for the LINUX
++ *		operating system.  INET is implemented using the  BSD Socket
++ *		interface as the means of communication with the user level.
++ *
++ *		Definitions for the Interfaces handler.
++ *
++ * Version:	@(#)dev.h	1.0.10	08/12/93
++ *
++ * Authors:	Ross Biro
++ *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
++ *		Corey Minyard <wf-rch!minyard@relay.EU.net>
++ *		Donald J. Becker, <becker@cesdis.gsfc.nasa.gov>
++ *		Alan Cox, <alan@lxorguk.ukuu.org.uk>
++ *		Bjorn Ekwall. <bj0rn@blox.se>
++ *              Pekka Riikonen <priikone@poseidon.pspt.fi>
++ *
++ *		This program is free software; you can redistribute it and/or
++ *		modify it under the terms of the GNU General Public License
++ *		as published by the Free Software Foundation; either version
++ *		2 of the License, or (at your option) any later version.
++ *
++ *		Moved to /usr/include/linux for NET3
++ */
++#ifndef _LINUX_NETDEVICE_H
++#define _LINUX_NETDEVICE_H
++
++#include <linux/if.h>
++#include <linux/if_ether.h>
++#include <linux/if_packet.h>
++#include <linux/if_link.h>
++
++
++#define MAX_ADDR_LEN	32		/* Largest hardware address length */
++
++/* Initial net device group. All devices belong to group 0 by default. */
++#define INIT_NETDEV_GROUP	0
++
++
++/* interface name assignment types (sysfs name_assign_type attribute) */
++#define NET_NAME_UNKNOWN	0	/* unknown origin (not exposed to userspace) */
++#define NET_NAME_ENUM		1	/* enumerated by kernel */
++#define NET_NAME_PREDICTABLE	2	/* predictably named by the kernel */
++#define NET_NAME_USER		3	/* provided by user-space */
++#define NET_NAME_RENAMED	4	/* renamed by user-space */
++
++/* Media selection options. */
++enum {
++        IF_PORT_UNKNOWN = 0,
++        IF_PORT_10BASE2,
++        IF_PORT_10BASET,
++        IF_PORT_AUI,
++        IF_PORT_100BASET,
++        IF_PORT_100BASETX,
++        IF_PORT_100BASEFX
++};
++
++/* hardware address assignment types */
++#define NET_ADDR_PERM		0	/* address is permanent (default) */
++#define NET_ADDR_RANDOM		1	/* address is generated randomly */
++#define NET_ADDR_STOLEN		2	/* address is stolen from other device */
++#define NET_ADDR_SET		3	/* address is set using
++					 * dev_set_mac_address() */
++
++#endif /* _LINUX_NETDEVICE_H */
+diff --git a/include/uapi/linux/netfilter.h b/include/uapi/linux/netfilter.h
+new file mode 100644
+index 0000000..ff4a4a5
+--- /dev/null
++++ b/include/uapi/linux/netfilter.h
+@@ -0,0 +1,77 @@
++#ifndef __LINUX_NETFILTER_H
++#define __LINUX_NETFILTER_H
++
++#include <linux/types.h>
++
++#include <linux/in.h>
++#include <linux/in6.h>
++
++/* Responses from hook functions. */
++#define NF_DROP 0
++#define NF_ACCEPT 1
++#define NF_STOLEN 2
++#define NF_QUEUE 3
++#define NF_REPEAT 4
++#define NF_STOP 5	/* Deprecated, for userspace nf_queue compatibility. */
++#define NF_MAX_VERDICT NF_STOP
++
++/* we overload the higher bits for encoding auxiliary data such as the queue
++ * number or errno values. Not nice, but better than additional function
++ * arguments. */
++#define NF_VERDICT_MASK 0x000000ff
++
++/* extra verdict flags have mask 0x0000ff00 */
++#define NF_VERDICT_FLAG_QUEUE_BYPASS	0x00008000
++
++/* queue number (NF_QUEUE) or errno (NF_DROP) */
++#define NF_VERDICT_QMASK 0xffff0000
++#define NF_VERDICT_QBITS 16
++
++#define NF_QUEUE_NR(x) ((((x) << 16) & NF_VERDICT_QMASK) | NF_QUEUE)
++
++#define NF_DROP_ERR(x) (((-x) << 16) | NF_DROP)
++
++/* only for userspace compatibility */
++/* Generic cache responses from hook functions.
++   <= 0x2000 is used for protocol-flags. */
++#define NFC_UNKNOWN 0x4000
++#define NFC_ALTERED 0x8000
++
++/* NF_VERDICT_BITS should be 8 now, but userspace might break if this changes */
++#define NF_VERDICT_BITS 16
++
++enum nf_inet_hooks {
++	NF_INET_PRE_ROUTING,
++	NF_INET_LOCAL_IN,
++	NF_INET_FORWARD,
++	NF_INET_LOCAL_OUT,
++	NF_INET_POST_ROUTING,
++	NF_INET_NUMHOOKS
++};
++
++enum nf_dev_hooks {
++	NF_NETDEV_INGRESS,
++	NF_NETDEV_NUMHOOKS
++};
++
++enum {
++	NFPROTO_UNSPEC =  0,
++	NFPROTO_INET   =  1,
++	NFPROTO_IPV4   =  2,
++	NFPROTO_ARP    =  3,
++	NFPROTO_NETDEV =  5,
++	NFPROTO_BRIDGE =  7,
++	NFPROTO_IPV6   = 10,
++	NFPROTO_DECNET = 12,
++	NFPROTO_NUMPROTO,
++};
++
++union nf_inet_addr {
++	__u32		all[4];
++	__be32		ip;
++	__be32		ip6[4];
++	struct in_addr	in;
++	struct in6_addr	in6;
++};
++
++#endif /* __LINUX_NETFILTER_H */
+diff --git a/include/uapi/linux/netfilter/ipset/ip_set.h b/include/uapi/linux/netfilter/ipset/ip_set.h
+new file mode 100644
+index 0000000..a6c96b0
+--- /dev/null
++++ b/include/uapi/linux/netfilter/ipset/ip_set.h
+@@ -0,0 +1,304 @@
++/* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu>
++ *                         Patrick Schaaf <bof@bof.de>
++ *                         Martin Josefsson <gandalf@wlug.westbo.se>
++ * Copyright (C) 2003-2011 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ */
++#ifndef _IP_SET_H
++#define _IP_SET_H
++
++#include <linux/types.h>
++
++/* The protocol version */
++#define IPSET_PROTOCOL		6
++
++/* The max length of strings including NUL: set and type identifiers */
++#define IPSET_MAXNAMELEN	32
++
++/* The maximum permissible comment length we will accept over netlink */
++#define IPSET_MAX_COMMENT_SIZE	255
++
++/* Message types and commands */
++enum ipset_cmd {
++	IPSET_CMD_NONE,
++	IPSET_CMD_PROTOCOL,	/* 1: Return protocol version */
++	IPSET_CMD_CREATE,	/* 2: Create a new (empty) set */
++	IPSET_CMD_DESTROY,	/* 3: Destroy a (empty) set */
++	IPSET_CMD_FLUSH,	/* 4: Remove all elements from a set */
++	IPSET_CMD_RENAME,	/* 5: Rename a set */
++	IPSET_CMD_SWAP,		/* 6: Swap two sets */
++	IPSET_CMD_LIST,		/* 7: List sets */
++	IPSET_CMD_SAVE,		/* 8: Save sets */
++	IPSET_CMD_ADD,		/* 9: Add an element to a set */
++	IPSET_CMD_DEL,		/* 10: Delete an element from a set */
++	IPSET_CMD_TEST,		/* 11: Test an element in a set */
++	IPSET_CMD_HEADER,	/* 12: Get set header data only */
++	IPSET_CMD_TYPE,		/* 13: Get set type */
++	IPSET_MSG_MAX,		/* Netlink message commands */
++
++	/* Commands in userspace: */
++	IPSET_CMD_RESTORE = IPSET_MSG_MAX, /* 14: Enter restore mode */
++	IPSET_CMD_HELP,		/* 15: Get help */
++	IPSET_CMD_VERSION,	/* 16: Get program version */
++	IPSET_CMD_QUIT,		/* 17: Quit from interactive mode */
++
++	IPSET_CMD_MAX,
++
++	IPSET_CMD_COMMIT = IPSET_CMD_MAX, /* 18: Commit buffered commands */
++};
++
++/* Attributes at command level */
++enum {
++	IPSET_ATTR_UNSPEC,
++	IPSET_ATTR_PROTOCOL,	/* 1: Protocol version */
++	IPSET_ATTR_SETNAME,	/* 2: Name of the set */
++	IPSET_ATTR_TYPENAME,	/* 3: Typename */
++	IPSET_ATTR_SETNAME2 = IPSET_ATTR_TYPENAME, /* Setname at rename/swap */
++	IPSET_ATTR_REVISION,	/* 4: Settype revision */
++	IPSET_ATTR_FAMILY,	/* 5: Settype family */
++	IPSET_ATTR_FLAGS,	/* 6: Flags at command level */
++	IPSET_ATTR_DATA,	/* 7: Nested attributes */
++	IPSET_ATTR_ADT,		/* 8: Multiple data containers */
++	IPSET_ATTR_LINENO,	/* 9: Restore lineno */
++	IPSET_ATTR_PROTOCOL_MIN, /* 10: Minimal supported version number */
++	IPSET_ATTR_REVISION_MIN	= IPSET_ATTR_PROTOCOL_MIN, /* type rev min */
++	__IPSET_ATTR_CMD_MAX,
++};
++#define IPSET_ATTR_CMD_MAX	(__IPSET_ATTR_CMD_MAX - 1)
++
++/* CADT specific attributes */
++enum {
++	IPSET_ATTR_IP = IPSET_ATTR_UNSPEC + 1,
++	IPSET_ATTR_IP_FROM = IPSET_ATTR_IP,
++	IPSET_ATTR_IP_TO,	/* 2 */
++	IPSET_ATTR_CIDR,	/* 3 */
++	IPSET_ATTR_PORT,	/* 4 */
++	IPSET_ATTR_PORT_FROM = IPSET_ATTR_PORT,
++	IPSET_ATTR_PORT_TO,	/* 5 */
++	IPSET_ATTR_TIMEOUT,	/* 6 */
++	IPSET_ATTR_PROTO,	/* 7 */
++	IPSET_ATTR_CADT_FLAGS,	/* 8 */
++	IPSET_ATTR_CADT_LINENO = IPSET_ATTR_LINENO,	/* 9 */
++	IPSET_ATTR_MARK,	/* 10 */
++	IPSET_ATTR_MARKMASK,	/* 11 */
++	/* Reserve empty slots */
++	IPSET_ATTR_CADT_MAX = 16,
++	/* Create-only specific attributes */
++	IPSET_ATTR_GC,
++	IPSET_ATTR_HASHSIZE,
++	IPSET_ATTR_MAXELEM,
++	IPSET_ATTR_NETMASK,
++	IPSET_ATTR_PROBES,
++	IPSET_ATTR_RESIZE,
++	IPSET_ATTR_SIZE,
++	/* Kernel-only */
++	IPSET_ATTR_ELEMENTS,
++	IPSET_ATTR_REFERENCES,
++	IPSET_ATTR_MEMSIZE,
++
++	__IPSET_ATTR_CREATE_MAX,
++};
++#define IPSET_ATTR_CREATE_MAX	(__IPSET_ATTR_CREATE_MAX - 1)
++
++/* ADT specific attributes */
++enum {
++	IPSET_ATTR_ETHER = IPSET_ATTR_CADT_MAX + 1,
++	IPSET_ATTR_NAME,
++	IPSET_ATTR_NAMEREF,
++	IPSET_ATTR_IP2,
++	IPSET_ATTR_CIDR2,
++	IPSET_ATTR_IP2_TO,
++	IPSET_ATTR_IFACE,
++	IPSET_ATTR_BYTES,
++	IPSET_ATTR_PACKETS,
++	IPSET_ATTR_COMMENT,
++	IPSET_ATTR_SKBMARK,
++	IPSET_ATTR_SKBPRIO,
++	IPSET_ATTR_SKBQUEUE,
++	IPSET_ATTR_PAD,
++	__IPSET_ATTR_ADT_MAX,
++};
++#define IPSET_ATTR_ADT_MAX	(__IPSET_ATTR_ADT_MAX - 1)
++
++/* IP specific attributes */
++enum {
++	IPSET_ATTR_IPADDR_IPV4 = IPSET_ATTR_UNSPEC + 1,
++	IPSET_ATTR_IPADDR_IPV6,
++	__IPSET_ATTR_IPADDR_MAX,
++};
++#define IPSET_ATTR_IPADDR_MAX	(__IPSET_ATTR_IPADDR_MAX - 1)
++
++/* Error codes */
++enum ipset_errno {
++	IPSET_ERR_PRIVATE = 4096,
++	IPSET_ERR_PROTOCOL,
++	IPSET_ERR_FIND_TYPE,
++	IPSET_ERR_MAX_SETS,
++	IPSET_ERR_BUSY,
++	IPSET_ERR_EXIST_SETNAME2,
++	IPSET_ERR_TYPE_MISMATCH,
++	IPSET_ERR_EXIST,
++	IPSET_ERR_INVALID_CIDR,
++	IPSET_ERR_INVALID_NETMASK,
++	IPSET_ERR_INVALID_FAMILY,
++	IPSET_ERR_TIMEOUT,
++	IPSET_ERR_REFERENCED,
++	IPSET_ERR_IPADDR_IPV4,
++	IPSET_ERR_IPADDR_IPV6,
++	IPSET_ERR_COUNTER,
++	IPSET_ERR_COMMENT,
++	IPSET_ERR_INVALID_MARKMASK,
++	IPSET_ERR_SKBINFO,
++
++	/* Type specific error codes */
++	IPSET_ERR_TYPE_SPECIFIC = 4352,
++};
++
++/* Flags at command level or match/target flags, lower half of cmdattrs*/
++enum ipset_cmd_flags {
++	IPSET_FLAG_BIT_EXIST	= 0,
++	IPSET_FLAG_EXIST	= (1 << IPSET_FLAG_BIT_EXIST),
++	IPSET_FLAG_BIT_LIST_SETNAME = 1,
++	IPSET_FLAG_LIST_SETNAME	= (1 << IPSET_FLAG_BIT_LIST_SETNAME),
++	IPSET_FLAG_BIT_LIST_HEADER = 2,
++	IPSET_FLAG_LIST_HEADER	= (1 << IPSET_FLAG_BIT_LIST_HEADER),
++	IPSET_FLAG_BIT_SKIP_COUNTER_UPDATE = 3,
++	IPSET_FLAG_SKIP_COUNTER_UPDATE =
++		(1 << IPSET_FLAG_BIT_SKIP_COUNTER_UPDATE),
++	IPSET_FLAG_BIT_SKIP_SUBCOUNTER_UPDATE = 4,
++	IPSET_FLAG_SKIP_SUBCOUNTER_UPDATE =
++		(1 << IPSET_FLAG_BIT_SKIP_SUBCOUNTER_UPDATE),
++	IPSET_FLAG_BIT_MATCH_COUNTERS = 5,
++	IPSET_FLAG_MATCH_COUNTERS = (1 << IPSET_FLAG_BIT_MATCH_COUNTERS),
++	IPSET_FLAG_BIT_RETURN_NOMATCH = 7,
++	IPSET_FLAG_RETURN_NOMATCH = (1 << IPSET_FLAG_BIT_RETURN_NOMATCH),
++	IPSET_FLAG_BIT_MAP_SKBMARK = 8,
++	IPSET_FLAG_MAP_SKBMARK = (1 << IPSET_FLAG_BIT_MAP_SKBMARK),
++	IPSET_FLAG_BIT_MAP_SKBPRIO = 9,
++	IPSET_FLAG_MAP_SKBPRIO = (1 << IPSET_FLAG_BIT_MAP_SKBPRIO),
++	IPSET_FLAG_BIT_MAP_SKBQUEUE = 10,
++	IPSET_FLAG_MAP_SKBQUEUE = (1 << IPSET_FLAG_BIT_MAP_SKBQUEUE),
++	IPSET_FLAG_CMD_MAX = 15,
++};
++
++/* Flags at CADT attribute level, upper half of cmdattrs */
++enum ipset_cadt_flags {
++	IPSET_FLAG_BIT_BEFORE	= 0,
++	IPSET_FLAG_BEFORE	= (1 << IPSET_FLAG_BIT_BEFORE),
++	IPSET_FLAG_BIT_PHYSDEV	= 1,
++	IPSET_FLAG_PHYSDEV	= (1 << IPSET_FLAG_BIT_PHYSDEV),
++	IPSET_FLAG_BIT_NOMATCH	= 2,
++	IPSET_FLAG_NOMATCH	= (1 << IPSET_FLAG_BIT_NOMATCH),
++	IPSET_FLAG_BIT_WITH_COUNTERS = 3,
++	IPSET_FLAG_WITH_COUNTERS = (1 << IPSET_FLAG_BIT_WITH_COUNTERS),
++	IPSET_FLAG_BIT_WITH_COMMENT = 4,
++	IPSET_FLAG_WITH_COMMENT = (1 << IPSET_FLAG_BIT_WITH_COMMENT),
++	IPSET_FLAG_BIT_WITH_FORCEADD = 5,
++	IPSET_FLAG_WITH_FORCEADD = (1 << IPSET_FLAG_BIT_WITH_FORCEADD),
++	IPSET_FLAG_BIT_WITH_SKBINFO = 6,
++	IPSET_FLAG_WITH_SKBINFO = (1 << IPSET_FLAG_BIT_WITH_SKBINFO),
++	IPSET_FLAG_CADT_MAX	= 15,
++};
++
++/* The flag bits which correspond to the non-extension create flags */
++enum ipset_create_flags {
++	IPSET_CREATE_FLAG_BIT_FORCEADD = 0,
++	IPSET_CREATE_FLAG_FORCEADD = (1 << IPSET_CREATE_FLAG_BIT_FORCEADD),
++	IPSET_CREATE_FLAG_BIT_MAX = 7,
++};
++
++/* Commands with settype-specific attributes */
++enum ipset_adt {
++	IPSET_ADD,
++	IPSET_DEL,
++	IPSET_TEST,
++	IPSET_ADT_MAX,
++	IPSET_CREATE = IPSET_ADT_MAX,
++	IPSET_CADT_MAX,
++};
++
++/* Sets are identified by an index in kernel space. Tweak with ip_set_id_t
++ * and IPSET_INVALID_ID if you want to increase the max number of sets.
++ */
++typedef __u16 ip_set_id_t;
++
++#define IPSET_INVALID_ID		65535
++
++enum ip_set_dim {
++	IPSET_DIM_ZERO = 0,
++	IPSET_DIM_ONE,
++	IPSET_DIM_TWO,
++	IPSET_DIM_THREE,
++	/* Max dimension in elements.
++	 * If changed, new revision of iptables match/target is required.
++	 */
++	IPSET_DIM_MAX = 6,
++	/* Backward compatibility: set match revision 2 */
++	IPSET_BIT_RETURN_NOMATCH = 7,
++};
++
++/* Option flags for kernel operations */
++enum ip_set_kopt {
++	IPSET_INV_MATCH = (1 << IPSET_DIM_ZERO),
++	IPSET_DIM_ONE_SRC = (1 << IPSET_DIM_ONE),
++	IPSET_DIM_TWO_SRC = (1 << IPSET_DIM_TWO),
++	IPSET_DIM_THREE_SRC = (1 << IPSET_DIM_THREE),
++	IPSET_RETURN_NOMATCH = (1 << IPSET_BIT_RETURN_NOMATCH),
++};
++
++enum {
++	IPSET_COUNTER_NONE = 0,
++	IPSET_COUNTER_EQ,
++	IPSET_COUNTER_NE,
++	IPSET_COUNTER_LT,
++	IPSET_COUNTER_GT,
++};
++
++/* Backward compatibility for set match v3 */
++struct ip_set_counter_match0 {
++	__u8 op;
++	__u64 value;
++};
++
++struct ip_set_counter_match {
++	__aligned_u64 value;
++	__u8 op;
++};
++
++/* Interface to iptables/ip6tables */
++
++#define SO_IP_SET		83
++
++union ip_set_name_index {
++	char name[IPSET_MAXNAMELEN];
++	ip_set_id_t index;
++};
++
++#define IP_SET_OP_GET_BYNAME	0x00000006	/* Get set index by name */
++struct ip_set_req_get_set {
++	unsigned int op;
++	unsigned int version;
++	union ip_set_name_index set;
++};
++
++#define IP_SET_OP_GET_BYINDEX	0x00000007	/* Get set name by index */
++/* Uses ip_set_req_get_set */
++
++#define IP_SET_OP_GET_FNAME	0x00000008	/* Get set index and family */
++struct ip_set_req_get_set_family {
++	unsigned int op;
++	unsigned int version;
++	unsigned int family;
++	union ip_set_name_index set;
++};
++
++#define IP_SET_OP_VERSION	0x00000100	/* Ask kernel version */
++struct ip_set_req_version {
++	unsigned int op;
++	unsigned int version;
++};
++
++#endif /* _IP_SET_H */
+diff --git a/include/uapi/linux/netfilter/x_tables.h b/include/uapi/linux/netfilter/x_tables.h
+new file mode 100644
+index 0000000..4120970
+--- /dev/null
++++ b/include/uapi/linux/netfilter/x_tables.h
+@@ -0,0 +1,185 @@
++#ifndef _X_TABLES_H
++#define _X_TABLES_H
++#include <linux/kernel.h>
++#include <linux/types.h>
++
++#define XT_FUNCTION_MAXNAMELEN 30
++#define XT_EXTENSION_MAXNAMELEN 29
++#define XT_TABLE_MAXNAMELEN 32
++
++struct xt_entry_match {
++	union {
++		struct {
++			__u16 match_size;
++
++			/* Used by userspace */
++			char name[XT_EXTENSION_MAXNAMELEN];
++			__u8 revision;
++		} user;
++		struct {
++			__u16 match_size;
++
++			/* Used inside the kernel */
++			struct xt_match *match;
++		} kernel;
++
++		/* Total length */
++		__u16 match_size;
++	} u;
++
++	unsigned char data[0];
++};
++
++struct xt_entry_target {
++	union {
++		struct {
++			__u16 target_size;
++
++			/* Used by userspace */
++			char name[XT_EXTENSION_MAXNAMELEN];
++			__u8 revision;
++		} user;
++		struct {
++			__u16 target_size;
++
++			/* Used inside the kernel */
++			struct xt_target *target;
++		} kernel;
++
++		/* Total length */
++		__u16 target_size;
++	} u;
++
++	unsigned char data[0];
++};
++
++#define XT_TARGET_INIT(__name, __size)					       \
++{									       \
++	.target.u.user = {						       \
++		.target_size	= XT_ALIGN(__size),			       \
++		.name		= __name,				       \
++	},								       \
++}
++
++struct xt_standard_target {
++	struct xt_entry_target target;
++	int verdict;
++};
++
++struct xt_error_target {
++	struct xt_entry_target target;
++	char errorname[XT_FUNCTION_MAXNAMELEN];
++};
++
++/* The argument to IPT_SO_GET_REVISION_*.  Returns highest revision
++ * kernel supports, if >= revision. */
++struct xt_get_revision {
++	char name[XT_EXTENSION_MAXNAMELEN];
++	__u8 revision;
++};
++
++/* CONTINUE verdict for targets */
++#define XT_CONTINUE 0xFFFFFFFF
++
++/* For standard target */
++#define XT_RETURN (-NF_REPEAT - 1)
++
++/* this is a dummy structure to find out the alignment requirement for a struct
++ * containing all the fundamental data types that are used in ipt_entry,
++ * ip6t_entry and arpt_entry.  This sucks, and it is a hack.  It will be my
++ * personal pleasure to remove it -HW
++ */
++struct _xt_align {
++	__u8 u8;
++	__u16 u16;
++	__u32 u32;
++	__u64 u64;
++};
++
++#define XT_ALIGN(s) __ALIGN_KERNEL((s), __alignof__(struct _xt_align))
++
++/* Standard return verdict, or do jump. */
++#define XT_STANDARD_TARGET ""
++/* Error verdict. */
++#define XT_ERROR_TARGET "ERROR"
++
++#define SET_COUNTER(c,b,p) do { (c).bcnt = (b); (c).pcnt = (p); } while(0)
++#define ADD_COUNTER(c,b,p) do { (c).bcnt += (b); (c).pcnt += (p); } while(0)
++
++struct xt_counters {
++	__u64 pcnt, bcnt;			/* Packet and byte counters */
++};
++
++/* The argument to IPT_SO_ADD_COUNTERS. */
++struct xt_counters_info {
++	/* Which table. */
++	char name[XT_TABLE_MAXNAMELEN];
++
++	unsigned int num_counters;
++
++	/* The counters (actually `number' of these). */
++	struct xt_counters counters[0];
++};
++
++#define XT_INV_PROTO		0x40	/* Invert the sense of PROTO. */
++
++/* fn returns 0 to continue iteration */
++#define XT_MATCH_ITERATE(type, e, fn, args...)			\
++({								\
++	unsigned int __i;					\
++	int __ret = 0;						\
++	struct xt_entry_match *__m;				\
++								\
++	for (__i = sizeof(type);				\
++	     __i < (e)->target_offset;				\
++	     __i += __m->u.match_size) {			\
++		__m = (void *)e + __i;				\
++								\
++		__ret = fn(__m , ## args);			\
++		if (__ret != 0)					\
++			break;					\
++	}							\
++	__ret;							\
++})
++
++/* fn returns 0 to continue iteration */
++#define XT_ENTRY_ITERATE_CONTINUE(type, entries, size, n, fn, args...) \
++({								\
++	unsigned int __i, __n;					\
++	int __ret = 0;						\
++	type *__entry;						\
++								\
++	for (__i = 0, __n = 0; __i < (size);			\
++	     __i += __entry->next_offset, __n++) { 		\
++		__entry = (void *)(entries) + __i;		\
++		if (__n < n)					\
++			continue;				\
++								\
++		__ret = fn(__entry , ## args);			\
++		if (__ret != 0)					\
++			break;					\
++	}							\
++	__ret;							\
++})
++
++/* fn returns 0 to continue iteration */
++#define XT_ENTRY_ITERATE(type, entries, size, fn, args...) \
++	XT_ENTRY_ITERATE_CONTINUE(type, entries, size, 0, fn, args)
++
++
++/* pos is normally a struct ipt_entry/ip6t_entry/etc. */
++#define xt_entry_foreach(pos, ehead, esize) \
++	for ((pos) = (typeof(pos))(ehead); \
++	     (pos) < (typeof(pos))((char *)(ehead) + (esize)); \
++	     (pos) = (typeof(pos))((char *)(pos) + (pos)->next_offset))
++
++/* can only be xt_entry_match, so no use of typeof here */
++#define xt_ematch_foreach(pos, entry) \
++	for ((pos) = (struct xt_entry_match *)entry->elems; \
++	     (pos) < (struct xt_entry_match *)((char *)(entry) + \
++	             (entry)->target_offset); \
++	     (pos) = (struct xt_entry_match *)((char *)(pos) + \
++	             (pos)->u.match_size))
++
++
++#endif /* _X_TABLES_H */
+diff --git a/include/uapi/linux/netfilter/xt_set.h b/include/uapi/linux/netfilter/xt_set.h
+new file mode 100644
+index 0000000..d4e0234
+--- /dev/null
++++ b/include/uapi/linux/netfilter/xt_set.h
+@@ -0,0 +1,93 @@
++#ifndef _XT_SET_H
++#define _XT_SET_H
++
++#include <linux/types.h>
++#include <linux/netfilter/ipset/ip_set.h>
++
++/* Revision 0 interface: backward compatible with netfilter/iptables */
++
++/*
++ * Option flags for kernel operations (xt_set_info_v0)
++ */
++#define IPSET_SRC		0x01	/* Source match/add */
++#define IPSET_DST		0x02	/* Destination match/add */
++#define IPSET_MATCH_INV		0x04	/* Inverse matching */
++
++struct xt_set_info_v0 {
++	ip_set_id_t index;
++	union {
++		__u32 flags[IPSET_DIM_MAX + 1];
++		struct {
++			__u32 __flags[IPSET_DIM_MAX];
++			__u8 dim;
++			__u8 flags;
++		} compat;
++	} u;
++};
++
++/* match and target infos */
++struct xt_set_info_match_v0 {
++	struct xt_set_info_v0 match_set;
++};
++
++struct xt_set_info_target_v0 {
++	struct xt_set_info_v0 add_set;
++	struct xt_set_info_v0 del_set;
++};
++
++/* Revision 1  match and target */
++
++struct xt_set_info {
++	ip_set_id_t index;
++	__u8 dim;
++	__u8 flags;
++};
++
++/* match and target infos */
++struct xt_set_info_match_v1 {
++	struct xt_set_info match_set;
++};
++
++struct xt_set_info_target_v1 {
++	struct xt_set_info add_set;
++	struct xt_set_info del_set;
++};
++
++/* Revision 2 target */
++
++struct xt_set_info_target_v2 {
++	struct xt_set_info add_set;
++	struct xt_set_info del_set;
++	__u32 flags;
++	__u32 timeout;
++};
++
++/* Revision 3 match */
++
++struct xt_set_info_match_v3 {
++	struct xt_set_info match_set;
++	struct ip_set_counter_match0 packets;
++	struct ip_set_counter_match0 bytes;
++	__u32 flags;
++};
++
++/* Revision 3 target */
++
++struct xt_set_info_target_v3 {
++	struct xt_set_info add_set;
++	struct xt_set_info del_set;
++	struct xt_set_info map_set;
++	__u32 flags;
++	__u32 timeout;
++};
++
++/* Revision 4 match */
++
++struct xt_set_info_match_v4 {
++	struct xt_set_info match_set;
++	struct ip_set_counter_match packets;
++	struct ip_set_counter_match bytes;
++	__u32 flags;
++};
++
++#endif /*_XT_SET_H*/
+diff --git a/include/uapi/linux/netfilter/xt_tcpudp.h b/include/uapi/linux/netfilter/xt_tcpudp.h
+new file mode 100644
+index 0000000..38aa7b3
+--- /dev/null
++++ b/include/uapi/linux/netfilter/xt_tcpudp.h
+@@ -0,0 +1,36 @@
++#ifndef _XT_TCPUDP_H
++#define _XT_TCPUDP_H
++
++#include <linux/types.h>
++
++/* TCP matching stuff */
++struct xt_tcp {
++	__u16 spts[2];			/* Source port range. */
++	__u16 dpts[2];			/* Destination port range. */
++	__u8 option;			/* TCP Option iff non-zero*/
++	__u8 flg_mask;			/* TCP flags mask byte */
++	__u8 flg_cmp;			/* TCP flags compare byte */
++	__u8 invflags;			/* Inverse flags */
++};
++
++/* Values for "inv" field in struct ipt_tcp. */
++#define XT_TCP_INV_SRCPT	0x01	/* Invert the sense of source ports. */
++#define XT_TCP_INV_DSTPT	0x02	/* Invert the sense of dest ports. */
++#define XT_TCP_INV_FLAGS	0x04	/* Invert the sense of TCP flags. */
++#define XT_TCP_INV_OPTION	0x08	/* Invert the sense of option test. */
++#define XT_TCP_INV_MASK		0x0F	/* All possible flags. */
++
++/* UDP matching stuff */
++struct xt_udp {
++	__u16 spts[2];			/* Source port range. */
++	__u16 dpts[2];			/* Destination port range. */
++	__u8 invflags;			/* Inverse flags */
++};
++
++/* Values for "invflags" field in struct ipt_udp. */
++#define XT_UDP_INV_SRCPT	0x01	/* Invert the sense of source ports. */
++#define XT_UDP_INV_DSTPT	0x02	/* Invert the sense of dest ports. */
++#define XT_UDP_INV_MASK	0x03	/* All possible flags. */
++
++
++#endif
+diff --git a/include/uapi/linux/netfilter_ipv4.h b/include/uapi/linux/netfilter_ipv4.h
+new file mode 100644
+index 0000000..a5f4dc7
+--- /dev/null
++++ b/include/uapi/linux/netfilter_ipv4.h
+@@ -0,0 +1,79 @@
++/* IPv4-specific defines for netfilter. 
++ * (C)1998 Rusty Russell -- This code is GPL.
++ */
++#ifndef __LINUX_IP_NETFILTER_H
++#define __LINUX_IP_NETFILTER_H
++
++
++#include <linux/netfilter.h>
++
++/* only for userspace compatibility */
++
++#include <limits.h> /* for INT_MIN, INT_MAX */
++
++/* IP Cache bits. */
++/* Src IP address. */
++#define NFC_IP_SRC		0x0001
++/* Dest IP address. */
++#define NFC_IP_DST		0x0002
++/* Input device. */
++#define NFC_IP_IF_IN		0x0004
++/* Output device. */
++#define NFC_IP_IF_OUT		0x0008
++/* TOS. */
++#define NFC_IP_TOS		0x0010
++/* Protocol. */
++#define NFC_IP_PROTO		0x0020
++/* IP options. */
++#define NFC_IP_OPTIONS		0x0040
++/* Frag & flags. */
++#define NFC_IP_FRAG		0x0080
++
++/* Per-protocol information: only matters if proto match. */
++/* TCP flags. */
++#define NFC_IP_TCPFLAGS		0x0100
++/* Source port. */
++#define NFC_IP_SRC_PT		0x0200
++/* Dest port. */
++#define NFC_IP_DST_PT		0x0400
++/* Something else about the proto */
++#define NFC_IP_PROTO_UNKNOWN	0x2000
++
++/* IP Hooks */
++/* After promisc drops, checksum checks. */
++#define NF_IP_PRE_ROUTING	0
++/* If the packet is destined for this box. */
++#define NF_IP_LOCAL_IN		1
++/* If the packet is destined for another interface. */
++#define NF_IP_FORWARD		2
++/* Packets coming from a local process. */
++#define NF_IP_LOCAL_OUT		3
++/* Packets about to hit the wire. */
++#define NF_IP_POST_ROUTING	4
++#define NF_IP_NUMHOOKS		5
++
++enum nf_ip_hook_priorities {
++	NF_IP_PRI_FIRST = INT_MIN,
++	NF_IP_PRI_CONNTRACK_DEFRAG = -400,
++	NF_IP_PRI_RAW = -300,
++	NF_IP_PRI_SELINUX_FIRST = -225,
++	NF_IP_PRI_CONNTRACK = -200,
++	NF_IP_PRI_MANGLE = -150,
++	NF_IP_PRI_NAT_DST = -100,
++	NF_IP_PRI_FILTER = 0,
++	NF_IP_PRI_SECURITY = 50,
++	NF_IP_PRI_NAT_SRC = 100,
++	NF_IP_PRI_SELINUX_LAST = 225,
++	NF_IP_PRI_CONNTRACK_HELPER = 300,
++	NF_IP_PRI_CONNTRACK_CONFIRM = INT_MAX,
++	NF_IP_PRI_LAST = INT_MAX,
++};
++
++/* Arguments for setsockopt SOL_IP: */
++/* 2.0 firewalling went from 64 through 71 (and +256, +512, etc). */
++/* 2.2 firewalling (+ masq) went from 64 through 76 */
++/* 2.4 firewalling went 64 through 67. */
++#define SO_ORIGINAL_DST 80
++
++
++#endif /* __LINUX_IP_NETFILTER_H */
+diff --git a/include/uapi/linux/netfilter_ipv4/ip_tables.h b/include/uapi/linux/netfilter_ipv4/ip_tables.h
+new file mode 100644
+index 0000000..456fb86
+--- /dev/null
++++ b/include/uapi/linux/netfilter_ipv4/ip_tables.h
+@@ -0,0 +1,228 @@
++/*
++ * 25-Jul-1998 Major changes to allow for ip chain table
++ *
++ * 3-Jan-2000 Named tables to allow packet selection for different uses.
++ */
++
++/*
++ * 	Format of an IP firewall descriptor
++ *
++ * 	src, dst, src_mask, dst_mask are always stored in network byte order.
++ * 	flags are stored in host byte order (of course).
++ * 	Port numbers are stored in HOST byte order.
++ */
++
++#ifndef _IPTABLES_H
++#define _IPTABLES_H
++
++#include <linux/types.h>
++
++#include <linux/if.h>
++#include <linux/netfilter_ipv4.h>
++
++#include <linux/netfilter/x_tables.h>
++
++#define IPT_FUNCTION_MAXNAMELEN XT_FUNCTION_MAXNAMELEN
++#define IPT_TABLE_MAXNAMELEN XT_TABLE_MAXNAMELEN
++#define ipt_match xt_match
++#define ipt_target xt_target
++#define ipt_table xt_table
++#define ipt_get_revision xt_get_revision
++#define ipt_entry_match xt_entry_match
++#define ipt_entry_target xt_entry_target
++#define ipt_standard_target xt_standard_target
++#define ipt_error_target xt_error_target
++#define ipt_counters xt_counters
++#define IPT_CONTINUE XT_CONTINUE
++#define IPT_RETURN XT_RETURN
++
++/* This group is older than old (iptables < v1.4.0-rc1~89) */
++#include <linux/netfilter/xt_tcpudp.h>
++#define ipt_udp xt_udp
++#define ipt_tcp xt_tcp
++#define IPT_TCP_INV_SRCPT	XT_TCP_INV_SRCPT
++#define IPT_TCP_INV_DSTPT	XT_TCP_INV_DSTPT
++#define IPT_TCP_INV_FLAGS	XT_TCP_INV_FLAGS
++#define IPT_TCP_INV_OPTION	XT_TCP_INV_OPTION
++#define IPT_TCP_INV_MASK	XT_TCP_INV_MASK
++#define IPT_UDP_INV_SRCPT	XT_UDP_INV_SRCPT
++#define IPT_UDP_INV_DSTPT	XT_UDP_INV_DSTPT
++#define IPT_UDP_INV_MASK	XT_UDP_INV_MASK
++
++/* The argument to IPT_SO_ADD_COUNTERS. */
++#define ipt_counters_info xt_counters_info
++/* Standard return verdict, or do jump. */
++#define IPT_STANDARD_TARGET XT_STANDARD_TARGET
++/* Error verdict. */
++#define IPT_ERROR_TARGET XT_ERROR_TARGET
++
++/* fn returns 0 to continue iteration */
++#define IPT_MATCH_ITERATE(e, fn, args...) \
++	XT_MATCH_ITERATE(struct ipt_entry, e, fn, ## args)
++
++/* fn returns 0 to continue iteration */
++#define IPT_ENTRY_ITERATE(entries, size, fn, args...) \
++	XT_ENTRY_ITERATE(struct ipt_entry, entries, size, fn, ## args)
++
++/* Yes, Virginia, you have to zero the padding. */
++struct ipt_ip {
++	/* Source and destination IP addr */
++	struct in_addr src, dst;
++	/* Mask for src and dest IP addr */
++	struct in_addr smsk, dmsk;
++	char iniface[IFNAMSIZ], outiface[IFNAMSIZ];
++	unsigned char iniface_mask[IFNAMSIZ], outiface_mask[IFNAMSIZ];
++
++	/* Protocol, 0 = ANY */
++	__u16 proto;
++
++	/* Flags word */
++	__u8 flags;
++	/* Inverse flags */
++	__u8 invflags;
++};
++
++/* Values for "flag" field in struct ipt_ip (general ip structure). */
++#define IPT_F_FRAG		0x01	/* Set if rule is a fragment rule */
++#define IPT_F_GOTO		0x02	/* Set if jump is a goto */
++#define IPT_F_MASK		0x03	/* All possible flag bits mask. */
++
++/* Values for "inv" field in struct ipt_ip. */
++#define IPT_INV_VIA_IN		0x01	/* Invert the sense of IN IFACE. */
++#define IPT_INV_VIA_OUT		0x02	/* Invert the sense of OUT IFACE */
++#define IPT_INV_TOS		0x04	/* Invert the sense of TOS. */
++#define IPT_INV_SRCIP		0x08	/* Invert the sense of SRC IP. */
++#define IPT_INV_DSTIP		0x10	/* Invert the sense of DST OP. */
++#define IPT_INV_FRAG		0x20	/* Invert the sense of FRAG. */
++#define IPT_INV_PROTO		XT_INV_PROTO
++#define IPT_INV_MASK		0x7F	/* All possible flag bits mask. */
++
++/* This structure defines each of the firewall rules.  Consists of 3
++   parts which are 1) general IP header stuff 2) match specific
++   stuff 3) the target to perform if the rule matches */
++struct ipt_entry {
++	struct ipt_ip ip;
++
++	/* Mark with fields that we care about. */
++	unsigned int nfcache;
++
++	/* Size of ipt_entry + matches */
++	__u16 target_offset;
++	/* Size of ipt_entry + matches + target */
++	__u16 next_offset;
++
++	/* Back pointer */
++	unsigned int comefrom;
++
++	/* Packet and byte counters. */
++	struct xt_counters counters;
++
++	/* The matches (if any), then the target. */
++	unsigned char elems[0];
++};
++
++/*
++ * New IP firewall options for [gs]etsockopt at the RAW IP level.
++ * Unlike BSD Linux inherits IP options so you don't have to use a raw
++ * socket for this. Instead we check rights in the calls.
++ *
++ * ATTENTION: check linux/in.h before adding new number here.
++ */
++#define IPT_BASE_CTL		64
++
++#define IPT_SO_SET_REPLACE	(IPT_BASE_CTL)
++#define IPT_SO_SET_ADD_COUNTERS	(IPT_BASE_CTL + 1)
++#define IPT_SO_SET_MAX		IPT_SO_SET_ADD_COUNTERS
++
++#define IPT_SO_GET_INFO			(IPT_BASE_CTL)
++#define IPT_SO_GET_ENTRIES		(IPT_BASE_CTL + 1)
++#define IPT_SO_GET_REVISION_MATCH	(IPT_BASE_CTL + 2)
++#define IPT_SO_GET_REVISION_TARGET	(IPT_BASE_CTL + 3)
++#define IPT_SO_GET_MAX			IPT_SO_GET_REVISION_TARGET
++
++/* ICMP matching stuff */
++struct ipt_icmp {
++	__u8 type;				/* type to match */
++	__u8 code[2];				/* range of code */
++	__u8 invflags;				/* Inverse flags */
++};
++
++/* Values for "inv" field for struct ipt_icmp. */
++#define IPT_ICMP_INV	0x01	/* Invert the sense of type/code test */
++
++/* The argument to IPT_SO_GET_INFO */
++struct ipt_getinfo {
++	/* Which table: caller fills this in. */
++	char name[XT_TABLE_MAXNAMELEN];
++
++	/* Kernel fills these in. */
++	/* Which hook entry points are valid: bitmask */
++	unsigned int valid_hooks;
++
++	/* Hook entry points: one per netfilter hook. */
++	unsigned int hook_entry[NF_INET_NUMHOOKS];
++
++	/* Underflow points. */
++	unsigned int underflow[NF_INET_NUMHOOKS];
++
++	/* Number of entries */
++	unsigned int num_entries;
++
++	/* Size of entries. */
++	unsigned int size;
++};
++
++/* The argument to IPT_SO_SET_REPLACE. */
++struct ipt_replace {
++	/* Which table. */
++	char name[XT_TABLE_MAXNAMELEN];
++
++	/* Which hook entry points are valid: bitmask.  You can't
++           change this. */
++	unsigned int valid_hooks;
++
++	/* Number of entries */
++	unsigned int num_entries;
++
++	/* Total size of new entries */
++	unsigned int size;
++
++	/* Hook entry points. */
++	unsigned int hook_entry[NF_INET_NUMHOOKS];
++
++	/* Underflow points. */
++	unsigned int underflow[NF_INET_NUMHOOKS];
++
++	/* Information about old entries: */
++	/* Number of counters (must be equal to current number of entries). */
++	unsigned int num_counters;
++	/* The old entries' counters. */
++	struct xt_counters *counters;
++
++	/* The entries (hang off end: not really an array). */
++	struct ipt_entry entries[0];
++};
++
++/* The argument to IPT_SO_GET_ENTRIES. */
++struct ipt_get_entries {
++	/* Which table: user fills this in. */
++	char name[XT_TABLE_MAXNAMELEN];
++
++	/* User fills this in: total entry size. */
++	unsigned int size;
++
++	/* The entries. */
++	struct ipt_entry entrytable[0];
++};
++
++/* Helper functions */
++static __inline__ struct xt_entry_target *
++ipt_get_target(struct ipt_entry *e)
++{
++	return (void *)e + e->target_offset;
++}
++
++/*
++ *	Main firewall chains definitions and global var's definitions.
++ */
++#endif /* _IPTABLES_H */
+diff --git a/include/uapi/linux/netfilter_ipv6.h b/include/uapi/linux/netfilter_ipv6.h
+new file mode 100644
+index 0000000..8483d1d
+--- /dev/null
++++ b/include/uapi/linux/netfilter_ipv6.h
+@@ -0,0 +1,77 @@
++/* IPv6-specific defines for netfilter. 
++ * (C)1998 Rusty Russell -- This code is GPL.
++ * (C)1999 David Jeffery
++ *   this header was blatantly ripped from netfilter_ipv4.h 
++ *   it's amazing what adding a bunch of 6s can do =8^)
++ */
++#ifndef __LINUX_IP6_NETFILTER_H
++#define __LINUX_IP6_NETFILTER_H
++
++
++#include <linux/netfilter.h>
++
++/* only for userspace compatibility */
++
++#include <limits.h> /* for INT_MIN, INT_MAX */
++
++/* IP Cache bits. */
++/* Src IP address. */
++#define NFC_IP6_SRC              0x0001
++/* Dest IP address. */
++#define NFC_IP6_DST              0x0002
++/* Input device. */
++#define NFC_IP6_IF_IN            0x0004
++/* Output device. */
++#define NFC_IP6_IF_OUT           0x0008
++/* TOS. */
++#define NFC_IP6_TOS              0x0010
++/* Protocol. */
++#define NFC_IP6_PROTO            0x0020
++/* IP options. */
++#define NFC_IP6_OPTIONS          0x0040
++/* Frag & flags. */
++#define NFC_IP6_FRAG             0x0080
++
++
++/* Per-protocol information: only matters if proto match. */
++/* TCP flags. */
++#define NFC_IP6_TCPFLAGS         0x0100
++/* Source port. */
++#define NFC_IP6_SRC_PT           0x0200
++/* Dest port. */
++#define NFC_IP6_DST_PT           0x0400
++/* Something else about the proto */
++#define NFC_IP6_PROTO_UNKNOWN    0x2000
++
++/* IP6 Hooks */
++/* After promisc drops, checksum checks. */
++#define NF_IP6_PRE_ROUTING	0
++/* If the packet is destined for this box. */
++#define NF_IP6_LOCAL_IN		1
++/* If the packet is destined for another interface. */
++#define NF_IP6_FORWARD		2
++/* Packets coming from a local process. */
++#define NF_IP6_LOCAL_OUT		3
++/* Packets about to hit the wire. */
++#define NF_IP6_POST_ROUTING	4
++#define NF_IP6_NUMHOOKS		5
++
++
++enum nf_ip6_hook_priorities {
++	NF_IP6_PRI_FIRST = INT_MIN,
++	NF_IP6_PRI_CONNTRACK_DEFRAG = -400,
++	NF_IP6_PRI_RAW = -300,
++	NF_IP6_PRI_SELINUX_FIRST = -225,
++	NF_IP6_PRI_CONNTRACK = -200,
++	NF_IP6_PRI_MANGLE = -150,
++	NF_IP6_PRI_NAT_DST = -100,
++	NF_IP6_PRI_FILTER = 0,
++	NF_IP6_PRI_SECURITY = 50,
++	NF_IP6_PRI_NAT_SRC = 100,
++	NF_IP6_PRI_SELINUX_LAST = 225,
++	NF_IP6_PRI_CONNTRACK_HELPER = 300,
++	NF_IP6_PRI_LAST = INT_MAX,
++};
++
++
++#endif /* __LINUX_IP6_NETFILTER_H */
+diff --git a/include/uapi/linux/netfilter_ipv6/ip6_tables.h b/include/uapi/linux/netfilter_ipv6/ip6_tables.h
+new file mode 100644
+index 0000000..fcc8cca
+--- /dev/null
++++ b/include/uapi/linux/netfilter_ipv6/ip6_tables.h
+@@ -0,0 +1,269 @@
++/*
++ * 25-Jul-1998 Major changes to allow for ip chain table
++ *
++ * 3-Jan-2000 Named tables to allow packet selection for different uses.
++ */
++
++/*
++ * 	Format of an IP6 firewall descriptor
++ *
++ * 	src, dst, src_mask, dst_mask are always stored in network byte order.
++ * 	flags are stored in host byte order (of course).
++ * 	Port numbers are stored in HOST byte order.
++ */
++
++#ifndef _IP6_TABLES_H
++#define _IP6_TABLES_H
++
++#include <linux/types.h>
++
++#include <linux/if.h>
++#include <linux/netfilter_ipv6.h>
++
++#include <linux/netfilter/x_tables.h>
++
++#define IP6T_FUNCTION_MAXNAMELEN XT_FUNCTION_MAXNAMELEN
++#define IP6T_TABLE_MAXNAMELEN XT_TABLE_MAXNAMELEN
++#define ip6t_match xt_match
++#define ip6t_target xt_target
++#define ip6t_table xt_table
++#define ip6t_get_revision xt_get_revision
++#define ip6t_entry_match xt_entry_match
++#define ip6t_entry_target xt_entry_target
++#define ip6t_standard_target xt_standard_target
++#define ip6t_error_target xt_error_target
++#define ip6t_counters xt_counters
++#define IP6T_CONTINUE XT_CONTINUE
++#define IP6T_RETURN XT_RETURN
++
++/* Pre-iptables-1.4.0 */
++#include <linux/netfilter/xt_tcpudp.h>
++#define ip6t_tcp xt_tcp
++#define ip6t_udp xt_udp
++#define IP6T_TCP_INV_SRCPT	XT_TCP_INV_SRCPT
++#define IP6T_TCP_INV_DSTPT	XT_TCP_INV_DSTPT
++#define IP6T_TCP_INV_FLAGS	XT_TCP_INV_FLAGS
++#define IP6T_TCP_INV_OPTION	XT_TCP_INV_OPTION
++#define IP6T_TCP_INV_MASK	XT_TCP_INV_MASK
++#define IP6T_UDP_INV_SRCPT	XT_UDP_INV_SRCPT
++#define IP6T_UDP_INV_DSTPT	XT_UDP_INV_DSTPT
++#define IP6T_UDP_INV_MASK	XT_UDP_INV_MASK
++
++#define ip6t_counters_info xt_counters_info
++#define IP6T_STANDARD_TARGET XT_STANDARD_TARGET
++#define IP6T_ERROR_TARGET XT_ERROR_TARGET
++#define IP6T_MATCH_ITERATE(e, fn, args...) \
++	XT_MATCH_ITERATE(struct ip6t_entry, e, fn, ## args)
++#define IP6T_ENTRY_ITERATE(entries, size, fn, args...) \
++	XT_ENTRY_ITERATE(struct ip6t_entry, entries, size, fn, ## args)
++
++/* Yes, Virginia, you have to zero the padding. */
++struct ip6t_ip6 {
++	/* Source and destination IP6 addr */
++	struct in6_addr src, dst;		
++	/* Mask for src and dest IP6 addr */
++	struct in6_addr smsk, dmsk;
++	char iniface[IFNAMSIZ], outiface[IFNAMSIZ];
++	unsigned char iniface_mask[IFNAMSIZ], outiface_mask[IFNAMSIZ];
++
++	/* Upper protocol number
++	 * - The allowed value is 0 (any) or protocol number of last parsable
++	 *   header, which is 50 (ESP), 59 (No Next Header), 135 (MH), or
++	 *   the non IPv6 extension headers.
++	 * - The protocol numbers of IPv6 extension headers except of ESP and
++	 *   MH do not match any packets.
++	 * - You also need to set IP6T_FLAGS_PROTO to "flags" to check protocol.
++	 */
++	__u16 proto;
++	/* TOS to match iff flags & IP6T_F_TOS */
++	__u8 tos;
++
++	/* Flags word */
++	__u8 flags;
++	/* Inverse flags */
++	__u8 invflags;
++};
++
++/* Values for "flag" field in struct ip6t_ip6 (general ip6 structure). */
++#define IP6T_F_PROTO		0x01	/* Set if rule cares about upper 
++					   protocols */
++#define IP6T_F_TOS		0x02	/* Match the TOS. */
++#define IP6T_F_GOTO		0x04	/* Set if jump is a goto */
++#define IP6T_F_MASK		0x07	/* All possible flag bits mask. */
++
++/* Values for "inv" field in struct ip6t_ip6. */
++#define IP6T_INV_VIA_IN		0x01	/* Invert the sense of IN IFACE. */
++#define IP6T_INV_VIA_OUT		0x02	/* Invert the sense of OUT IFACE */
++#define IP6T_INV_TOS		0x04	/* Invert the sense of TOS. */
++#define IP6T_INV_SRCIP		0x08	/* Invert the sense of SRC IP. */
++#define IP6T_INV_DSTIP		0x10	/* Invert the sense of DST OP. */
++#define IP6T_INV_FRAG		0x20	/* Invert the sense of FRAG. */
++#define IP6T_INV_PROTO		XT_INV_PROTO
++#define IP6T_INV_MASK		0x7F	/* All possible flag bits mask. */
++
++/* This structure defines each of the firewall rules.  Consists of 3
++   parts which are 1) general IP header stuff 2) match specific
++   stuff 3) the target to perform if the rule matches */
++struct ip6t_entry {
++	struct ip6t_ip6 ipv6;
++
++	/* Mark with fields that we care about. */
++	unsigned int nfcache;
++
++	/* Size of ipt_entry + matches */
++	__u16 target_offset;
++	/* Size of ipt_entry + matches + target */
++	__u16 next_offset;
++
++	/* Back pointer */
++	unsigned int comefrom;
++
++	/* Packet and byte counters. */
++	struct xt_counters counters;
++
++	/* The matches (if any), then the target. */
++	unsigned char elems[0];
++};
++
++/* Standard entry */
++struct ip6t_standard {
++	struct ip6t_entry entry;
++	struct xt_standard_target target;
++};
++
++struct ip6t_error {
++	struct ip6t_entry entry;
++	struct xt_error_target target;
++};
++
++#define IP6T_ENTRY_INIT(__size)						       \
++{									       \
++	.target_offset	= sizeof(struct ip6t_entry),			       \
++	.next_offset	= (__size),					       \
++}
++
++#define IP6T_STANDARD_INIT(__verdict)					       \
++{									       \
++	.entry		= IP6T_ENTRY_INIT(sizeof(struct ip6t_standard)),       \
++	.target		= XT_TARGET_INIT(XT_STANDARD_TARGET,		       \
++					 sizeof(struct xt_standard_target)),   \
++	.target.verdict	= -(__verdict) - 1,				       \
++}
++
++#define IP6T_ERROR_INIT							       \
++{									       \
++	.entry		= IP6T_ENTRY_INIT(sizeof(struct ip6t_error)),	       \
++	.target		= XT_TARGET_INIT(XT_ERROR_TARGET,		       \
++					 sizeof(struct xt_error_target)),      \
++	.target.errorname = "ERROR",					       \
++}
++
++/*
++ * New IP firewall options for [gs]etsockopt at the RAW IP level.
++ * Unlike BSD Linux inherits IP options so you don't have to use
++ * a raw socket for this. Instead we check rights in the calls.
++ *
++ * ATTENTION: check linux/in6.h before adding new number here.
++ */
++#define IP6T_BASE_CTL			64
++
++#define IP6T_SO_SET_REPLACE		(IP6T_BASE_CTL)
++#define IP6T_SO_SET_ADD_COUNTERS	(IP6T_BASE_CTL + 1)
++#define IP6T_SO_SET_MAX			IP6T_SO_SET_ADD_COUNTERS
++
++#define IP6T_SO_GET_INFO		(IP6T_BASE_CTL)
++#define IP6T_SO_GET_ENTRIES		(IP6T_BASE_CTL + 1)
++#define IP6T_SO_GET_REVISION_MATCH	(IP6T_BASE_CTL + 4)
++#define IP6T_SO_GET_REVISION_TARGET	(IP6T_BASE_CTL + 5)
++#define IP6T_SO_GET_MAX			IP6T_SO_GET_REVISION_TARGET
++
++/* obtain original address if REDIRECT'd connection */
++#define IP6T_SO_ORIGINAL_DST            80
++
++/* ICMP matching stuff */
++struct ip6t_icmp {
++	__u8 type;				/* type to match */
++	__u8 code[2];				/* range of code */
++	__u8 invflags;				/* Inverse flags */
++};
++
++/* Values for "inv" field for struct ipt_icmp. */
++#define IP6T_ICMP_INV	0x01	/* Invert the sense of type/code test */
++
++/* The argument to IP6T_SO_GET_INFO */
++struct ip6t_getinfo {
++	/* Which table: caller fills this in. */
++	char name[XT_TABLE_MAXNAMELEN];
++
++	/* Kernel fills these in. */
++	/* Which hook entry points are valid: bitmask */
++	unsigned int valid_hooks;
++
++	/* Hook entry points: one per netfilter hook. */
++	unsigned int hook_entry[NF_INET_NUMHOOKS];
++
++	/* Underflow points. */
++	unsigned int underflow[NF_INET_NUMHOOKS];
++
++	/* Number of entries */
++	unsigned int num_entries;
++
++	/* Size of entries. */
++	unsigned int size;
++};
++
++/* The argument to IP6T_SO_SET_REPLACE. */
++struct ip6t_replace {
++	/* Which table. */
++	char name[XT_TABLE_MAXNAMELEN];
++
++	/* Which hook entry points are valid: bitmask.  You can't
++           change this. */
++	unsigned int valid_hooks;
++
++	/* Number of entries */
++	unsigned int num_entries;
++
++	/* Total size of new entries */
++	unsigned int size;
++
++	/* Hook entry points. */
++	unsigned int hook_entry[NF_INET_NUMHOOKS];
++
++	/* Underflow points. */
++	unsigned int underflow[NF_INET_NUMHOOKS];
++
++	/* Information about old entries: */
++	/* Number of counters (must be equal to current number of entries). */
++	unsigned int num_counters;
++	/* The old entries' counters. */
++	struct xt_counters *counters;
++
++	/* The entries (hang off end: not really an array). */
++	struct ip6t_entry entries[0];
++};
++
++/* The argument to IP6T_SO_GET_ENTRIES. */
++struct ip6t_get_entries {
++	/* Which table: user fills this in. */
++	char name[XT_TABLE_MAXNAMELEN];
++
++	/* User fills this in: total entry size. */
++	unsigned int size;
++
++	/* The entries. */
++	struct ip6t_entry entrytable[0];
++};
++
++/* Helper functions */
++static __inline__ struct xt_entry_target *
++ip6t_get_target(struct ip6t_entry *e)
++{
++	return (void *)e + e->target_offset;
++}
++
++/*
++ *	Main firewall chains definitions and global var's definitions.
++ */
++
++#endif /* _IP6_TABLES_H */
+diff --git a/include/uapi/linux/netlink.h b/include/uapi/linux/netlink.h
+new file mode 100644
+index 0000000..ec0690b
+--- /dev/null
++++ b/include/uapi/linux/netlink.h
+@@ -0,0 +1,246 @@
++#ifndef __LINUX_NETLINK_H
++#define __LINUX_NETLINK_H
++
++#include <linux/kernel.h>
++#include <linux/socket.h> /* for __kernel_sa_family_t */
++#include <linux/types.h>
++
++#define NETLINK_ROUTE		0	/* Routing/device hook				*/
++#define NETLINK_UNUSED		1	/* Unused number				*/
++#define NETLINK_USERSOCK	2	/* Reserved for user mode socket protocols 	*/
++#define NETLINK_FIREWALL	3	/* Unused number, formerly ip_queue		*/
++#define NETLINK_SOCK_DIAG	4	/* socket monitoring				*/
++#define NETLINK_NFLOG		5	/* netfilter/iptables ULOG */
++#define NETLINK_XFRM		6	/* ipsec */
++#define NETLINK_SELINUX		7	/* SELinux event notifications */
++#define NETLINK_ISCSI		8	/* Open-iSCSI */
++#define NETLINK_AUDIT		9	/* auditing */
++#define NETLINK_FIB_LOOKUP	10	
++#define NETLINK_CONNECTOR	11
++#define NETLINK_NETFILTER	12	/* netfilter subsystem */
++#define NETLINK_IP6_FW		13
++#define NETLINK_DNRTMSG		14	/* DECnet routing messages */
++#define NETLINK_KOBJECT_UEVENT	15	/* Kernel messages to userspace */
++#define NETLINK_GENERIC		16
++/* leave room for NETLINK_DM (DM Events) */
++#define NETLINK_SCSITRANSPORT	18	/* SCSI Transports */
++#define NETLINK_ECRYPTFS	19
++#define NETLINK_RDMA		20
++#define NETLINK_CRYPTO		21	/* Crypto layer */
++#define NETLINK_SMC		22	/* SMC monitoring */
++
++#define NETLINK_INET_DIAG	NETLINK_SOCK_DIAG
++
++#define MAX_LINKS 32		
++
++struct sockaddr_nl {
++	__kernel_sa_family_t	nl_family;	/* AF_NETLINK	*/
++	unsigned short	nl_pad;		/* zero		*/
++	__u32		nl_pid;		/* port ID	*/
++       	__u32		nl_groups;	/* multicast groups mask */
++};
++
++struct nlmsghdr {
++	__u32		nlmsg_len;	/* Length of message including header */
++	__u16		nlmsg_type;	/* Message content */
++	__u16		nlmsg_flags;	/* Additional flags */
++	__u32		nlmsg_seq;	/* Sequence number */
++	__u32		nlmsg_pid;	/* Sending process port ID */
++};
++
++/* Flags values */
++
++#define NLM_F_REQUEST		0x01	/* It is request message. 	*/
++#define NLM_F_MULTI		0x02	/* Multipart message, terminated by NLMSG_DONE */
++#define NLM_F_ACK		0x04	/* Reply with ack, with zero or error code */
++#define NLM_F_ECHO		0x08	/* Echo this request 		*/
++#define NLM_F_DUMP_INTR		0x10	/* Dump was inconsistent due to sequence change */
++#define NLM_F_DUMP_FILTERED	0x20	/* Dump was filtered as requested */
++
++/* Modifiers to GET request */
++#define NLM_F_ROOT	0x100	/* specify tree	root	*/
++#define NLM_F_MATCH	0x200	/* return all matching	*/
++#define NLM_F_ATOMIC	0x400	/* atomic GET		*/
++#define NLM_F_DUMP	(NLM_F_ROOT|NLM_F_MATCH)
++
++/* Modifiers to NEW request */
++#define NLM_F_REPLACE	0x100	/* Override existing		*/
++#define NLM_F_EXCL	0x200	/* Do not touch, if it exists	*/
++#define NLM_F_CREATE	0x400	/* Create, if it does not exist	*/
++#define NLM_F_APPEND	0x800	/* Add to end of list		*/
++
++/* Modifiers to DELETE request */
++#define NLM_F_NONREC	0x100	/* Do not delete recursively	*/
++
++/* Flags for ACK message */
++#define NLM_F_CAPPED	0x100	/* request was capped */
++#define NLM_F_ACK_TLVS	0x200	/* extended ACK TVLs were included */
++
++/*
++   4.4BSD ADD		NLM_F_CREATE|NLM_F_EXCL
++   4.4BSD CHANGE	NLM_F_REPLACE
++
++   True CHANGE		NLM_F_CREATE|NLM_F_REPLACE
++   Append		NLM_F_CREATE
++   Check		NLM_F_EXCL
++ */
++
++#define NLMSG_ALIGNTO	4U
++#define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) )
++#define NLMSG_HDRLEN	 ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr)))
++#define NLMSG_LENGTH(len) ((len) + NLMSG_HDRLEN)
++#define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len))
++#define NLMSG_DATA(nlh)  ((void*)(((char*)nlh) + NLMSG_LENGTH(0)))
++#define NLMSG_NEXT(nlh,len)	 ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \
++				  (struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len)))
++#define NLMSG_OK(nlh,len) ((len) >= (int)sizeof(struct nlmsghdr) && \
++			   (nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \
++			   (nlh)->nlmsg_len <= (len))
++#define NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len)))
++
++#define NLMSG_NOOP		0x1	/* Nothing.		*/
++#define NLMSG_ERROR		0x2	/* Error		*/
++#define NLMSG_DONE		0x3	/* End of a dump	*/
++#define NLMSG_OVERRUN		0x4	/* Data lost		*/
++
++#define NLMSG_MIN_TYPE		0x10	/* < 0x10: reserved control messages */
++
++struct nlmsgerr {
++	int		error;
++	struct nlmsghdr msg;
++	/*
++	 * followed by the message contents unless NETLINK_CAP_ACK was set
++	 * or the ACK indicates success (error == 0)
++	 * message length is aligned with NLMSG_ALIGN()
++	 */
++	/*
++	 * followed by TLVs defined in enum nlmsgerr_attrs
++	 * if NETLINK_EXT_ACK was set
++	 */
++};
++
++/**
++ * enum nlmsgerr_attrs - nlmsgerr attributes
++ * @NLMSGERR_ATTR_UNUSED: unused
++ * @NLMSGERR_ATTR_MSG: error message string (string)
++ * @NLMSGERR_ATTR_OFFS: offset of the invalid attribute in the original
++ *	 message, counting from the beginning of the header (u32)
++ * @NLMSGERR_ATTR_COOKIE: arbitrary subsystem specific cookie to
++ *	be used - in the success case - to identify a created
++ *	object or operation or similar (binary)
++ * @__NLMSGERR_ATTR_MAX: number of attributes
++ * @NLMSGERR_ATTR_MAX: highest attribute number
++ */
++enum nlmsgerr_attrs {
++	NLMSGERR_ATTR_UNUSED,
++	NLMSGERR_ATTR_MSG,
++	NLMSGERR_ATTR_OFFS,
++	NLMSGERR_ATTR_COOKIE,
++
++	__NLMSGERR_ATTR_MAX,
++	NLMSGERR_ATTR_MAX = __NLMSGERR_ATTR_MAX - 1
++};
++
++#define NETLINK_ADD_MEMBERSHIP		1
++#define NETLINK_DROP_MEMBERSHIP		2
++#define NETLINK_PKTINFO			3
++#define NETLINK_BROADCAST_ERROR		4
++#define NETLINK_NO_ENOBUFS		5
++#define NETLINK_RX_RING			6
++#define NETLINK_TX_RING			7
++#define NETLINK_LISTEN_ALL_NSID		8
++#define NETLINK_LIST_MEMBERSHIPS	9
++#define NETLINK_CAP_ACK			10
++#define NETLINK_EXT_ACK			11
++
++struct nl_pktinfo {
++	__u32	group;
++};
++
++struct nl_mmap_req {
++	unsigned int	nm_block_size;
++	unsigned int	nm_block_nr;
++	unsigned int	nm_frame_size;
++	unsigned int	nm_frame_nr;
++};
++
++struct nl_mmap_hdr {
++	unsigned int	nm_status;
++	unsigned int	nm_len;
++	__u32		nm_group;
++	/* credentials */
++	__u32		nm_pid;
++	__u32		nm_uid;
++	__u32		nm_gid;
++};
++
++enum nl_mmap_status {
++	NL_MMAP_STATUS_UNUSED,
++	NL_MMAP_STATUS_RESERVED,
++	NL_MMAP_STATUS_VALID,
++	NL_MMAP_STATUS_COPY,
++	NL_MMAP_STATUS_SKIP,
++};
++
++#define NL_MMAP_MSG_ALIGNMENT		NLMSG_ALIGNTO
++#define NL_MMAP_MSG_ALIGN(sz)		__ALIGN_KERNEL(sz, NL_MMAP_MSG_ALIGNMENT)
++#define NL_MMAP_HDRLEN			NL_MMAP_MSG_ALIGN(sizeof(struct nl_mmap_hdr))
++
++#define NET_MAJOR 36		/* Major 36 is reserved for networking 						*/
++
++enum {
++	NETLINK_UNCONNECTED = 0,
++	NETLINK_CONNECTED,
++};
++
++/*
++ *  <------- NLA_HDRLEN ------> <-- NLA_ALIGN(payload)-->
++ * +---------------------+- - -+- - - - - - - - - -+- - -+
++ * |        Header       | Pad |     Payload       | Pad |
++ * |   (struct nlattr)   | ing |                   | ing |
++ * +---------------------+- - -+- - - - - - - - - -+- - -+
++ *  <-------------- nlattr->nla_len -------------->
++ */
++
++struct nlattr {
++	__u16           nla_len;
++	__u16           nla_type;
++};
++
++/*
++ * nla_type (16 bits)
++ * +---+---+-------------------------------+
++ * | N | O | Attribute Type                |
++ * +---+---+-------------------------------+
++ * N := Carries nested attributes
++ * O := Payload stored in network byte order
++ *
++ * Note: The N and O flag are mutually exclusive.
++ */
++#define NLA_F_NESTED		(1 << 15)
++#define NLA_F_NET_BYTEORDER	(1 << 14)
++#define NLA_TYPE_MASK		~(NLA_F_NESTED | NLA_F_NET_BYTEORDER)
++
++#define NLA_ALIGNTO		4
++#define NLA_ALIGN(len)		(((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1))
++#define NLA_HDRLEN		((int) NLA_ALIGN(sizeof(struct nlattr)))
++
++/* Generic 32 bitflags attribute content sent to the kernel.
++ *
++ * The value is a bitmap that defines the values being set
++ * The selector is a bitmask that defines which value is legit
++ *
++ * Examples:
++ *  value = 0x0, and selector = 0x1
++ *  implies we are selecting bit 1 and we want to set its value to 0.
++ *
++ *  value = 0x2, and selector = 0x2
++ *  implies we are selecting bit 2 and we want to set its value to 1.
++ *
++ */
++struct nla_bitfield32 {
++	__u32 value;
++	__u32 selector;
++};
++
++#endif /* __LINUX_NETLINK_H */
+diff --git a/include/uapi/linux/netlink_diag.h b/include/uapi/linux/netlink_diag.h
+new file mode 100644
+index 0000000..c8c8c7d
+--- /dev/null
++++ b/include/uapi/linux/netlink_diag.h
+@@ -0,0 +1,64 @@
++#ifndef __NETLINK_DIAG_H__
++#define __NETLINK_DIAG_H__
++
++#include <linux/types.h>
++
++struct netlink_diag_req {
++	__u8	sdiag_family;
++	__u8	sdiag_protocol;
++	__u16	pad;
++	__u32	ndiag_ino;
++	__u32	ndiag_show;
++	__u32	ndiag_cookie[2];
++};
++
++struct netlink_diag_msg {
++	__u8	ndiag_family;
++	__u8	ndiag_type;
++	__u8	ndiag_protocol;
++	__u8	ndiag_state;
++
++	__u32	ndiag_portid;
++	__u32	ndiag_dst_portid;
++	__u32	ndiag_dst_group;
++	__u32	ndiag_ino;
++	__u32	ndiag_cookie[2];
++};
++
++struct netlink_diag_ring {
++	__u32	ndr_block_size;
++	__u32	ndr_block_nr;
++	__u32	ndr_frame_size;
++	__u32	ndr_frame_nr;
++};
++
++enum {
++	/* NETLINK_DIAG_NONE, standard nl API requires this attribute!  */
++	NETLINK_DIAG_MEMINFO,
++	NETLINK_DIAG_GROUPS,
++	NETLINK_DIAG_RX_RING,
++	NETLINK_DIAG_TX_RING,
++	NETLINK_DIAG_FLAGS,
++
++	__NETLINK_DIAG_MAX,
++};
++
++#define NETLINK_DIAG_MAX (__NETLINK_DIAG_MAX - 1)
++
++#define NDIAG_PROTO_ALL		((__u8) ~0)
++
++#define NDIAG_SHOW_MEMINFO	0x00000001 /* show memory info of a socket */
++#define NDIAG_SHOW_GROUPS	0x00000002 /* show groups of a netlink socket */
++/* deprecated since 4.6 */
++#define NDIAG_SHOW_RING_CFG	0x00000004 /* show ring configuration */
++#define NDIAG_SHOW_FLAGS	0x00000008 /* show flags of a netlink socket */
++
++/* flags */
++#define NDIAG_FLAG_CB_RUNNING		0x00000001
++#define NDIAG_FLAG_PKTINFO		0x00000002
++#define NDIAG_FLAG_BROADCAST_ERROR	0x00000004
++#define NDIAG_FLAG_NO_ENOBUFS		0x00000008
++#define NDIAG_FLAG_LISTEN_ALL_NSID	0x00000010
++#define NDIAG_FLAG_CAP_ACK		0x00000020
++
++#endif
+diff --git a/include/uapi/linux/packet_diag.h b/include/uapi/linux/packet_diag.h
+new file mode 100644
+index 0000000..0c5d5dd
+--- /dev/null
++++ b/include/uapi/linux/packet_diag.h
+@@ -0,0 +1,80 @@
++#ifndef __PACKET_DIAG_H__
++#define __PACKET_DIAG_H__
++
++#include <linux/types.h>
++
++struct packet_diag_req {
++	__u8	sdiag_family;
++	__u8	sdiag_protocol;
++	__u16	pad;
++	__u32	pdiag_ino;
++	__u32	pdiag_show;
++	__u32	pdiag_cookie[2];
++};
++
++#define PACKET_SHOW_INFO	0x00000001 /* Basic packet_sk information */
++#define PACKET_SHOW_MCLIST	0x00000002 /* A set of packet_diag_mclist-s */
++#define PACKET_SHOW_RING_CFG	0x00000004 /* Rings configuration parameters */
++#define PACKET_SHOW_FANOUT	0x00000008
++#define PACKET_SHOW_MEMINFO	0x00000010
++#define PACKET_SHOW_FILTER	0x00000020
++
++struct packet_diag_msg {
++	__u8	pdiag_family;
++	__u8	pdiag_type;
++	__u16	pdiag_num;
++
++	__u32	pdiag_ino;
++	__u32	pdiag_cookie[2];
++};
++
++enum {
++	/* PACKET_DIAG_NONE, standard nl API requires this attribute!  */
++	PACKET_DIAG_INFO,
++	PACKET_DIAG_MCLIST,
++	PACKET_DIAG_RX_RING,
++	PACKET_DIAG_TX_RING,
++	PACKET_DIAG_FANOUT,
++	PACKET_DIAG_UID,
++	PACKET_DIAG_MEMINFO,
++	PACKET_DIAG_FILTER,
++
++	__PACKET_DIAG_MAX,
++};
++
++#define PACKET_DIAG_MAX (__PACKET_DIAG_MAX - 1)
++
++struct packet_diag_info {
++	__u32	pdi_index;
++	__u32	pdi_version;
++	__u32	pdi_reserve;
++	__u32	pdi_copy_thresh;
++	__u32	pdi_tstamp;
++	__u32	pdi_flags;
++
++#define PDI_RUNNING	0x1
++#define PDI_AUXDATA	0x2
++#define PDI_ORIGDEV	0x4
++#define PDI_VNETHDR	0x8
++#define PDI_LOSS	0x10
++};
++
++struct packet_diag_mclist {
++	__u32	pdmc_index;
++	__u32	pdmc_count;
++	__u16	pdmc_type;
++	__u16	pdmc_alen;
++	__u8	pdmc_addr[32]; /* MAX_ADDR_LEN */
++};
++
++struct packet_diag_ring {
++	__u32	pdr_block_size;
++	__u32	pdr_block_nr;
++	__u32	pdr_frame_size;
++	__u32	pdr_frame_nr;
++	__u32	pdr_retire_tmo;
++	__u32	pdr_sizeof_priv;
++	__u32	pdr_features;
++};
++
++#endif
+diff --git a/include/uapi/linux/param.h b/include/uapi/linux/param.h
+new file mode 100644
+index 0000000..092e92f
+--- /dev/null
++++ b/include/uapi/linux/param.h
+@@ -0,0 +1,6 @@
++#ifndef _LINUX_PARAM_H
++#define _LINUX_PARAM_H
++
++#include <asm/param.h>
++
++#endif
+diff --git a/include/uapi/linux/pfkeyv2.h b/include/uapi/linux/pfkeyv2.h
+new file mode 100644
+index 0000000..ada7f01
+--- /dev/null
++++ b/include/uapi/linux/pfkeyv2.h
+@@ -0,0 +1,383 @@
++/* PF_KEY user interface, this is defined by rfc2367 so
++ * do not make arbitrary modifications or else this header
++ * file will not be compliant.
++ */
++
++#ifndef _LINUX_PFKEY2_H
++#define _LINUX_PFKEY2_H
++
++#include <linux/types.h>
++
++#define PF_KEY_V2		2
++#define PFKEYV2_REVISION	199806L
++
++struct sadb_msg {
++	__u8		sadb_msg_version;
++	__u8		sadb_msg_type;
++	__u8		sadb_msg_errno;
++	__u8		sadb_msg_satype;
++	__u16	sadb_msg_len;
++	__u16	sadb_msg_reserved;
++	__u32	sadb_msg_seq;
++	__u32	sadb_msg_pid;
++} __attribute__((packed));
++/* sizeof(struct sadb_msg) == 16 */
++
++struct sadb_ext {
++	__u16	sadb_ext_len;
++	__u16	sadb_ext_type;
++} __attribute__((packed));
++/* sizeof(struct sadb_ext) == 4 */
++
++struct sadb_sa {
++	__u16	sadb_sa_len;
++	__u16	sadb_sa_exttype;
++	__be32		sadb_sa_spi;
++	__u8		sadb_sa_replay;
++	__u8		sadb_sa_state;
++	__u8		sadb_sa_auth;
++	__u8		sadb_sa_encrypt;
++	__u32	sadb_sa_flags;
++} __attribute__((packed));
++/* sizeof(struct sadb_sa) == 16 */
++
++struct sadb_lifetime {
++	__u16	sadb_lifetime_len;
++	__u16	sadb_lifetime_exttype;
++	__u32	sadb_lifetime_allocations;
++	__u64	sadb_lifetime_bytes;
++	__u64	sadb_lifetime_addtime;
++	__u64	sadb_lifetime_usetime;
++} __attribute__((packed));
++/* sizeof(struct sadb_lifetime) == 32 */
++
++struct sadb_address {
++	__u16	sadb_address_len;
++	__u16	sadb_address_exttype;
++	__u8		sadb_address_proto;
++	__u8		sadb_address_prefixlen;
++	__u16	sadb_address_reserved;
++} __attribute__((packed));
++/* sizeof(struct sadb_address) == 8 */
++
++struct sadb_key {
++	__u16	sadb_key_len;
++	__u16	sadb_key_exttype;
++	__u16	sadb_key_bits;
++	__u16	sadb_key_reserved;
++} __attribute__((packed));
++/* sizeof(struct sadb_key) == 8 */
++
++struct sadb_ident {
++	__u16	sadb_ident_len;
++	__u16	sadb_ident_exttype;
++	__u16	sadb_ident_type;
++	__u16	sadb_ident_reserved;
++	__u64	sadb_ident_id;
++} __attribute__((packed));
++/* sizeof(struct sadb_ident) == 16 */
++
++struct sadb_sens {
++	__u16	sadb_sens_len;
++	__u16	sadb_sens_exttype;
++	__u32	sadb_sens_dpd;
++	__u8		sadb_sens_sens_level;
++	__u8		sadb_sens_sens_len;
++	__u8		sadb_sens_integ_level;
++	__u8		sadb_sens_integ_len;
++	__u32	sadb_sens_reserved;
++} __attribute__((packed));
++/* sizeof(struct sadb_sens) == 16 */
++
++/* followed by:
++	__u64	sadb_sens_bitmap[sens_len];
++	__u64	sadb_integ_bitmap[integ_len];  */
++
++struct sadb_prop {
++	__u16	sadb_prop_len;
++	__u16	sadb_prop_exttype;
++	__u8		sadb_prop_replay;
++	__u8		sadb_prop_reserved[3];
++} __attribute__((packed));
++/* sizeof(struct sadb_prop) == 8 */
++
++/* followed by:
++	struct sadb_comb sadb_combs[(sadb_prop_len +
++		sizeof(__u64) - sizeof(struct sadb_prop)) /
++		sizeof(struct sadb_comb)]; */
++
++struct sadb_comb {
++	__u8		sadb_comb_auth;
++	__u8		sadb_comb_encrypt;
++	__u16	sadb_comb_flags;
++	__u16	sadb_comb_auth_minbits;
++	__u16	sadb_comb_auth_maxbits;
++	__u16	sadb_comb_encrypt_minbits;
++	__u16	sadb_comb_encrypt_maxbits;
++	__u32	sadb_comb_reserved;
++	__u32	sadb_comb_soft_allocations;
++	__u32	sadb_comb_hard_allocations;
++	__u64	sadb_comb_soft_bytes;
++	__u64	sadb_comb_hard_bytes;
++	__u64	sadb_comb_soft_addtime;
++	__u64	sadb_comb_hard_addtime;
++	__u64	sadb_comb_soft_usetime;
++	__u64	sadb_comb_hard_usetime;
++} __attribute__((packed));
++/* sizeof(struct sadb_comb) == 72 */
++
++struct sadb_supported {
++	__u16	sadb_supported_len;
++	__u16	sadb_supported_exttype;
++	__u32	sadb_supported_reserved;
++} __attribute__((packed));
++/* sizeof(struct sadb_supported) == 8 */
++
++/* followed by:
++	struct sadb_alg sadb_algs[(sadb_supported_len +
++		sizeof(__u64) - sizeof(struct sadb_supported)) /
++		sizeof(struct sadb_alg)]; */
++
++struct sadb_alg {
++	__u8		sadb_alg_id;
++	__u8		sadb_alg_ivlen;
++	__u16	sadb_alg_minbits;
++	__u16	sadb_alg_maxbits;
++	__u16	sadb_alg_reserved;
++} __attribute__((packed));
++/* sizeof(struct sadb_alg) == 8 */
++
++struct sadb_spirange {
++	__u16	sadb_spirange_len;
++	__u16	sadb_spirange_exttype;
++	__u32	sadb_spirange_min;
++	__u32	sadb_spirange_max;
++	__u32	sadb_spirange_reserved;
++} __attribute__((packed));
++/* sizeof(struct sadb_spirange) == 16 */
++
++struct sadb_x_kmprivate {
++	__u16	sadb_x_kmprivate_len;
++	__u16	sadb_x_kmprivate_exttype;
++	__u32	sadb_x_kmprivate_reserved;
++} __attribute__((packed));
++/* sizeof(struct sadb_x_kmprivate) == 8 */
++
++struct sadb_x_sa2 {
++	__u16	sadb_x_sa2_len;
++	__u16	sadb_x_sa2_exttype;
++	__u8		sadb_x_sa2_mode;
++	__u8		sadb_x_sa2_reserved1;
++	__u16	sadb_x_sa2_reserved2;
++	__u32	sadb_x_sa2_sequence;
++	__u32	sadb_x_sa2_reqid;
++} __attribute__((packed));
++/* sizeof(struct sadb_x_sa2) == 16 */
++
++struct sadb_x_policy {
++	__u16	sadb_x_policy_len;
++	__u16	sadb_x_policy_exttype;
++	__u16	sadb_x_policy_type;
++	__u8		sadb_x_policy_dir;
++	__u8		sadb_x_policy_reserved;
++	__u32	sadb_x_policy_id;
++	__u32	sadb_x_policy_priority;
++} __attribute__((packed));
++/* sizeof(struct sadb_x_policy) == 16 */
++
++struct sadb_x_ipsecrequest {
++	__u16	sadb_x_ipsecrequest_len;
++	__u16	sadb_x_ipsecrequest_proto;
++	__u8		sadb_x_ipsecrequest_mode;
++	__u8		sadb_x_ipsecrequest_level;
++	__u16	sadb_x_ipsecrequest_reserved1;
++	__u32	sadb_x_ipsecrequest_reqid;
++	__u32	sadb_x_ipsecrequest_reserved2;
++} __attribute__((packed));
++/* sizeof(struct sadb_x_ipsecrequest) == 16 */
++
++/* This defines the TYPE of Nat Traversal in use.  Currently only one
++ * type of NAT-T is supported, draft-ietf-ipsec-udp-encaps-06
++ */
++struct sadb_x_nat_t_type {
++	__u16	sadb_x_nat_t_type_len;
++	__u16	sadb_x_nat_t_type_exttype;
++	__u8		sadb_x_nat_t_type_type;
++	__u8		sadb_x_nat_t_type_reserved[3];
++} __attribute__((packed));
++/* sizeof(struct sadb_x_nat_t_type) == 8 */
++
++/* Pass a NAT Traversal port (Source or Dest port) */
++struct sadb_x_nat_t_port {
++	__u16	sadb_x_nat_t_port_len;
++	__u16	sadb_x_nat_t_port_exttype;
++	__be16		sadb_x_nat_t_port_port;
++	__u16	sadb_x_nat_t_port_reserved;
++} __attribute__((packed));
++/* sizeof(struct sadb_x_nat_t_port) == 8 */
++
++/* Generic LSM security context */
++struct sadb_x_sec_ctx {
++	__u16	sadb_x_sec_len;
++	__u16	sadb_x_sec_exttype;
++	__u8		sadb_x_ctx_alg;  /* LSMs: e.g., selinux == 1 */
++	__u8		sadb_x_ctx_doi;
++	__u16	sadb_x_ctx_len;
++} __attribute__((packed));
++/* sizeof(struct sadb_sec_ctx) = 8 */
++
++/* Used by MIGRATE to pass addresses IKE will use to perform
++ * negotiation with the peer */
++struct sadb_x_kmaddress {
++	__u16	sadb_x_kmaddress_len;
++	__u16	sadb_x_kmaddress_exttype;
++	__u32	sadb_x_kmaddress_reserved;
++} __attribute__((packed));
++/* sizeof(struct sadb_x_kmaddress) == 8 */
++
++/* To specify the SA dump filter */
++struct sadb_x_filter {
++	__u16	sadb_x_filter_len;
++	__u16	sadb_x_filter_exttype;
++	__u32	sadb_x_filter_saddr[4];
++	__u32	sadb_x_filter_daddr[4];
++	__u16	sadb_x_filter_family;
++	__u8	sadb_x_filter_splen;
++	__u8	sadb_x_filter_dplen;
++} __attribute__((packed));
++/* sizeof(struct sadb_x_filter) == 40 */
++
++/* Message types */
++#define SADB_RESERVED		0
++#define SADB_GETSPI		1
++#define SADB_UPDATE		2
++#define SADB_ADD		3
++#define SADB_DELETE		4
++#define SADB_GET		5
++#define SADB_ACQUIRE		6
++#define SADB_REGISTER		7
++#define SADB_EXPIRE		8
++#define SADB_FLUSH		9
++#define SADB_DUMP		10
++#define SADB_X_PROMISC		11
++#define SADB_X_PCHANGE		12
++#define SADB_X_SPDUPDATE	13
++#define SADB_X_SPDADD		14
++#define SADB_X_SPDDELETE	15
++#define SADB_X_SPDGET		16
++#define SADB_X_SPDACQUIRE	17
++#define SADB_X_SPDDUMP		18
++#define SADB_X_SPDFLUSH		19
++#define SADB_X_SPDSETIDX	20
++#define SADB_X_SPDEXPIRE	21
++#define SADB_X_SPDDELETE2	22
++#define SADB_X_NAT_T_NEW_MAPPING	23
++#define SADB_X_MIGRATE		24
++#define SADB_MAX		24
++
++/* Security Association flags */
++#define SADB_SAFLAGS_PFS	1
++#define SADB_SAFLAGS_NOPMTUDISC	0x20000000
++#define SADB_SAFLAGS_DECAP_DSCP	0x40000000
++#define SADB_SAFLAGS_NOECN	0x80000000
++
++/* Security Association states */
++#define SADB_SASTATE_LARVAL	0
++#define SADB_SASTATE_MATURE	1
++#define SADB_SASTATE_DYING	2
++#define SADB_SASTATE_DEAD	3
++#define SADB_SASTATE_MAX	3
++
++/* Security Association types */
++#define SADB_SATYPE_UNSPEC	0
++#define SADB_SATYPE_AH		2
++#define SADB_SATYPE_ESP		3
++#define SADB_SATYPE_RSVP	5
++#define SADB_SATYPE_OSPFV2	6
++#define SADB_SATYPE_RIPV2	7
++#define SADB_SATYPE_MIP		8
++#define SADB_X_SATYPE_IPCOMP	9
++#define SADB_SATYPE_MAX		9
++
++/* Authentication algorithms */
++#define SADB_AALG_NONE			0
++#define SADB_AALG_MD5HMAC		2
++#define SADB_AALG_SHA1HMAC		3
++#define SADB_X_AALG_SHA2_256HMAC	5
++#define SADB_X_AALG_SHA2_384HMAC	6
++#define SADB_X_AALG_SHA2_512HMAC	7
++#define SADB_X_AALG_RIPEMD160HMAC	8
++#define SADB_X_AALG_AES_XCBC_MAC	9
++#define SADB_X_AALG_NULL		251	/* kame */
++#define SADB_AALG_MAX			251
++
++/* Encryption algorithms */
++#define SADB_EALG_NONE			0
++#define SADB_EALG_DESCBC		2
++#define SADB_EALG_3DESCBC		3
++#define SADB_X_EALG_CASTCBC		6
++#define SADB_X_EALG_BLOWFISHCBC		7
++#define SADB_EALG_NULL			11
++#define SADB_X_EALG_AESCBC		12
++#define SADB_X_EALG_AESCTR		13
++#define SADB_X_EALG_AES_CCM_ICV8	14
++#define SADB_X_EALG_AES_CCM_ICV12	15
++#define SADB_X_EALG_AES_CCM_ICV16	16
++#define SADB_X_EALG_AES_GCM_ICV8	18
++#define SADB_X_EALG_AES_GCM_ICV12	19
++#define SADB_X_EALG_AES_GCM_ICV16	20
++#define SADB_X_EALG_CAMELLIACBC		22
++#define SADB_X_EALG_NULL_AES_GMAC	23
++#define SADB_EALG_MAX                   253 /* last EALG */
++/* private allocations should use 249-255 (RFC2407) */
++#define SADB_X_EALG_SERPENTCBC  252     /* draft-ietf-ipsec-ciph-aes-cbc-00 */
++#define SADB_X_EALG_TWOFISHCBC  253     /* draft-ietf-ipsec-ciph-aes-cbc-00 */
++
++/* Compression algorithms */
++#define SADB_X_CALG_NONE		0
++#define SADB_X_CALG_OUI			1
++#define SADB_X_CALG_DEFLATE		2
++#define SADB_X_CALG_LZS			3
++#define SADB_X_CALG_LZJH		4
++#define SADB_X_CALG_MAX			4
++
++/* Extension Header values */
++#define SADB_EXT_RESERVED		0
++#define SADB_EXT_SA			1
++#define SADB_EXT_LIFETIME_CURRENT	2
++#define SADB_EXT_LIFETIME_HARD		3
++#define SADB_EXT_LIFETIME_SOFT		4
++#define SADB_EXT_ADDRESS_SRC		5
++#define SADB_EXT_ADDRESS_DST		6
++#define SADB_EXT_ADDRESS_PROXY		7
++#define SADB_EXT_KEY_AUTH		8
++#define SADB_EXT_KEY_ENCRYPT		9
++#define SADB_EXT_IDENTITY_SRC		10
++#define SADB_EXT_IDENTITY_DST		11
++#define SADB_EXT_SENSITIVITY		12
++#define SADB_EXT_PROPOSAL		13
++#define SADB_EXT_SUPPORTED_AUTH		14
++#define SADB_EXT_SUPPORTED_ENCRYPT	15
++#define SADB_EXT_SPIRANGE		16
++#define SADB_X_EXT_KMPRIVATE		17
++#define SADB_X_EXT_POLICY		18
++#define SADB_X_EXT_SA2			19
++/* The next four entries are for setting up NAT Traversal */
++#define SADB_X_EXT_NAT_T_TYPE		20
++#define SADB_X_EXT_NAT_T_SPORT		21
++#define SADB_X_EXT_NAT_T_DPORT		22
++#define SADB_X_EXT_NAT_T_OA		23
++#define SADB_X_EXT_SEC_CTX		24
++/* Used with MIGRATE to pass @ to IKE for negotiation */
++#define SADB_X_EXT_KMADDRESS		25
++#define SADB_X_EXT_FILTER		26
++#define SADB_EXT_MAX			26
++
++/* Identity Extension values */
++#define SADB_IDENTTYPE_RESERVED	0
++#define SADB_IDENTTYPE_PREFIX	1
++#define SADB_IDENTTYPE_FQDN	2
++#define SADB_IDENTTYPE_USERFQDN	3
++#define SADB_IDENTTYPE_MAX	3
++
++#endif /* !(_LINUX_PFKEY2_H) */
+diff --git a/include/uapi/linux/pkt_cls.h b/include/uapi/linux/pkt_cls.h
+new file mode 100644
+index 0000000..d5e2bf6
+--- /dev/null
++++ b/include/uapi/linux/pkt_cls.h
+@@ -0,0 +1,569 @@
++#ifndef __LINUX_PKT_CLS_H
++#define __LINUX_PKT_CLS_H
++
++#include <linux/types.h>
++#include <linux/pkt_sched.h>
++
++#define TC_COOKIE_MAX_SIZE 16
++
++/* Action attributes */
++enum {
++	TCA_ACT_UNSPEC,
++	TCA_ACT_KIND,
++	TCA_ACT_OPTIONS,
++	TCA_ACT_INDEX,
++	TCA_ACT_STATS,
++	TCA_ACT_PAD,
++	TCA_ACT_COOKIE,
++	__TCA_ACT_MAX
++};
++
++#define TCA_ACT_MAX __TCA_ACT_MAX
++#define TCA_OLD_COMPAT (TCA_ACT_MAX+1)
++#define TCA_ACT_MAX_PRIO 32
++#define TCA_ACT_BIND	1
++#define TCA_ACT_NOBIND	0
++#define TCA_ACT_UNBIND	1
++#define TCA_ACT_NOUNBIND	0
++#define TCA_ACT_REPLACE		1
++#define TCA_ACT_NOREPLACE	0
++
++#define TC_ACT_UNSPEC	(-1)
++#define TC_ACT_OK		0
++#define TC_ACT_RECLASSIFY	1
++#define TC_ACT_SHOT		2
++#define TC_ACT_PIPE		3
++#define TC_ACT_STOLEN		4
++#define TC_ACT_QUEUED		5
++#define TC_ACT_REPEAT		6
++#define TC_ACT_REDIRECT		7
++#define TC_ACT_TRAP		8 /* For hw path, this means "trap to cpu"
++				   * and don't further process the frame
++				   * in hardware. For sw path, this is
++				   * equivalent of TC_ACT_STOLEN - drop
++				   * the skb and act like everything
++				   * is alright.
++				   */
++
++/* There is a special kind of actions called "extended actions",
++ * which need a value parameter. These have a local opcode located in
++ * the highest nibble, starting from 1. The rest of the bits
++ * are used to carry the value. These two parts together make
++ * a combined opcode.
++ */
++#define __TC_ACT_EXT_SHIFT 28
++#define __TC_ACT_EXT(local) ((local) << __TC_ACT_EXT_SHIFT)
++#define TC_ACT_EXT_VAL_MASK ((1 << __TC_ACT_EXT_SHIFT) - 1)
++#define TC_ACT_EXT_CMP(combined, opcode) \
++	(((combined) & (~TC_ACT_EXT_VAL_MASK)) == opcode)
++
++#define TC_ACT_JUMP __TC_ACT_EXT(1)
++#define TC_ACT_GOTO_CHAIN __TC_ACT_EXT(2)
++
++/* Action type identifiers*/
++enum {
++	TCA_ID_UNSPEC=0,
++	TCA_ID_POLICE=1,
++	/* other actions go here */
++	__TCA_ID_MAX=255
++};
++
++#define TCA_ID_MAX __TCA_ID_MAX
++
++struct tc_police {
++	__u32			index;
++	int			action;
++#define TC_POLICE_UNSPEC	TC_ACT_UNSPEC
++#define TC_POLICE_OK		TC_ACT_OK
++#define TC_POLICE_RECLASSIFY	TC_ACT_RECLASSIFY
++#define TC_POLICE_SHOT		TC_ACT_SHOT
++#define TC_POLICE_PIPE		TC_ACT_PIPE
++
++	__u32			limit;
++	__u32			burst;
++	__u32			mtu;
++	struct tc_ratespec	rate;
++	struct tc_ratespec	peakrate;
++	int			refcnt;
++	int			bindcnt;
++	__u32			capab;
++};
++
++struct tcf_t {
++	__u64   install;
++	__u64   lastuse;
++	__u64   expires;
++	__u64   firstuse;
++};
++
++struct tc_cnt {
++	int                   refcnt;
++	int                   bindcnt;
++};
++
++#define tc_gen \
++	__u32                 index; \
++	__u32                 capab; \
++	int                   action; \
++	int                   refcnt; \
++	int                   bindcnt
++
++enum {
++	TCA_POLICE_UNSPEC,
++	TCA_POLICE_TBF,
++	TCA_POLICE_RATE,
++	TCA_POLICE_PEAKRATE,
++	TCA_POLICE_AVRATE,
++	TCA_POLICE_RESULT,
++	TCA_POLICE_TM,
++	TCA_POLICE_PAD,
++	__TCA_POLICE_MAX
++#define TCA_POLICE_RESULT TCA_POLICE_RESULT
++};
++
++#define TCA_POLICE_MAX (__TCA_POLICE_MAX - 1)
++
++/* tca flags definitions */
++#define TCA_CLS_FLAGS_SKIP_HW	(1 << 0) /* don't offload filter to HW */
++#define TCA_CLS_FLAGS_SKIP_SW	(1 << 1) /* don't use filter in SW */
++#define TCA_CLS_FLAGS_IN_HW	(1 << 2) /* filter is offloaded to HW */
++#define TCA_CLS_FLAGS_NOT_IN_HW (1 << 3) /* filter isn't offloaded to HW */
++
++/* U32 filters */
++
++#define TC_U32_HTID(h) ((h)&0xFFF00000)
++#define TC_U32_USERHTID(h) (TC_U32_HTID(h)>>20)
++#define TC_U32_HASH(h) (((h)>>12)&0xFF)
++#define TC_U32_NODE(h) ((h)&0xFFF)
++#define TC_U32_KEY(h) ((h)&0xFFFFF)
++#define TC_U32_UNSPEC	0
++#define TC_U32_ROOT	(0xFFF00000)
++
++enum {
++	TCA_U32_UNSPEC,
++	TCA_U32_CLASSID,
++	TCA_U32_HASH,
++	TCA_U32_LINK,
++	TCA_U32_DIVISOR,
++	TCA_U32_SEL,
++	TCA_U32_POLICE,
++	TCA_U32_ACT,
++	TCA_U32_INDEV,
++	TCA_U32_PCNT,
++	TCA_U32_MARK,
++	TCA_U32_FLAGS,
++	TCA_U32_PAD,
++	__TCA_U32_MAX
++};
++
++#define TCA_U32_MAX (__TCA_U32_MAX - 1)
++
++struct tc_u32_key {
++	__be32		mask;
++	__be32		val;
++	int		off;
++	int		offmask;
++};
++
++struct tc_u32_sel {
++	unsigned char		flags;
++	unsigned char		offshift;
++	unsigned char		nkeys;
++
++	__be16			offmask;
++	__u16			off;
++	short			offoff;
++
++	short			hoff;
++	__be32			hmask;
++	struct tc_u32_key	keys[0];
++};
++
++struct tc_u32_mark {
++	__u32		val;
++	__u32		mask;
++	__u32		success;
++};
++
++struct tc_u32_pcnt {
++	__u64 rcnt;
++	__u64 rhit;
++	__u64 kcnts[0];
++};
++
++/* Flags */
++
++#define TC_U32_TERMINAL		1
++#define TC_U32_OFFSET		2
++#define TC_U32_VAROFFSET	4
++#define TC_U32_EAT		8
++
++#define TC_U32_MAXDEPTH 8
++
++
++/* RSVP filter */
++
++enum {
++	TCA_RSVP_UNSPEC,
++	TCA_RSVP_CLASSID,
++	TCA_RSVP_DST,
++	TCA_RSVP_SRC,
++	TCA_RSVP_PINFO,
++	TCA_RSVP_POLICE,
++	TCA_RSVP_ACT,
++	__TCA_RSVP_MAX
++};
++
++#define TCA_RSVP_MAX (__TCA_RSVP_MAX - 1 )
++
++struct tc_rsvp_gpi {
++	__u32	key;
++	__u32	mask;
++	int	offset;
++};
++
++struct tc_rsvp_pinfo {
++	struct tc_rsvp_gpi dpi;
++	struct tc_rsvp_gpi spi;
++	__u8	protocol;
++	__u8	tunnelid;
++	__u8	tunnelhdr;
++	__u8	pad;
++};
++
++/* ROUTE filter */
++
++enum {
++	TCA_ROUTE4_UNSPEC,
++	TCA_ROUTE4_CLASSID,
++	TCA_ROUTE4_TO,
++	TCA_ROUTE4_FROM,
++	TCA_ROUTE4_IIF,
++	TCA_ROUTE4_POLICE,
++	TCA_ROUTE4_ACT,
++	__TCA_ROUTE4_MAX
++};
++
++#define TCA_ROUTE4_MAX (__TCA_ROUTE4_MAX - 1)
++
++
++/* FW filter */
++
++enum {
++	TCA_FW_UNSPEC,
++	TCA_FW_CLASSID,
++	TCA_FW_POLICE,
++	TCA_FW_INDEV, /*  used by CONFIG_NET_CLS_IND */
++	TCA_FW_ACT, /* used by CONFIG_NET_CLS_ACT */
++	TCA_FW_MASK,
++	__TCA_FW_MAX
++};
++
++#define TCA_FW_MAX (__TCA_FW_MAX - 1)
++
++/* TC index filter */
++
++enum {
++	TCA_TCINDEX_UNSPEC,
++	TCA_TCINDEX_HASH,
++	TCA_TCINDEX_MASK,
++	TCA_TCINDEX_SHIFT,
++	TCA_TCINDEX_FALL_THROUGH,
++	TCA_TCINDEX_CLASSID,
++	TCA_TCINDEX_POLICE,
++	TCA_TCINDEX_ACT,
++	__TCA_TCINDEX_MAX
++};
++
++#define TCA_TCINDEX_MAX     (__TCA_TCINDEX_MAX - 1)
++
++/* Flow filter */
++
++enum {
++	FLOW_KEY_SRC,
++	FLOW_KEY_DST,
++	FLOW_KEY_PROTO,
++	FLOW_KEY_PROTO_SRC,
++	FLOW_KEY_PROTO_DST,
++	FLOW_KEY_IIF,
++	FLOW_KEY_PRIORITY,
++	FLOW_KEY_MARK,
++	FLOW_KEY_NFCT,
++	FLOW_KEY_NFCT_SRC,
++	FLOW_KEY_NFCT_DST,
++	FLOW_KEY_NFCT_PROTO_SRC,
++	FLOW_KEY_NFCT_PROTO_DST,
++	FLOW_KEY_RTCLASSID,
++	FLOW_KEY_SKUID,
++	FLOW_KEY_SKGID,
++	FLOW_KEY_VLAN_TAG,
++	FLOW_KEY_RXHASH,
++	__FLOW_KEY_MAX,
++};
++
++#define FLOW_KEY_MAX	(__FLOW_KEY_MAX - 1)
++
++enum {
++	FLOW_MODE_MAP,
++	FLOW_MODE_HASH,
++};
++
++enum {
++	TCA_FLOW_UNSPEC,
++	TCA_FLOW_KEYS,
++	TCA_FLOW_MODE,
++	TCA_FLOW_BASECLASS,
++	TCA_FLOW_RSHIFT,
++	TCA_FLOW_ADDEND,
++	TCA_FLOW_MASK,
++	TCA_FLOW_XOR,
++	TCA_FLOW_DIVISOR,
++	TCA_FLOW_ACT,
++	TCA_FLOW_POLICE,
++	TCA_FLOW_EMATCHES,
++	TCA_FLOW_PERTURB,
++	__TCA_FLOW_MAX
++};
++
++#define TCA_FLOW_MAX	(__TCA_FLOW_MAX - 1)
++
++/* Basic filter */
++
++enum {
++	TCA_BASIC_UNSPEC,
++	TCA_BASIC_CLASSID,
++	TCA_BASIC_EMATCHES,
++	TCA_BASIC_ACT,
++	TCA_BASIC_POLICE,
++	__TCA_BASIC_MAX
++};
++
++#define TCA_BASIC_MAX (__TCA_BASIC_MAX - 1)
++
++
++/* Cgroup classifier */
++
++enum {
++	TCA_CGROUP_UNSPEC,
++	TCA_CGROUP_ACT,
++	TCA_CGROUP_POLICE,
++	TCA_CGROUP_EMATCHES,
++	__TCA_CGROUP_MAX,
++};
++
++#define TCA_CGROUP_MAX (__TCA_CGROUP_MAX - 1)
++
++/* BPF classifier */
++
++#define TCA_BPF_FLAG_ACT_DIRECT		(1 << 0)
++
++enum {
++	TCA_BPF_UNSPEC,
++	TCA_BPF_ACT,
++	TCA_BPF_POLICE,
++	TCA_BPF_CLASSID,
++	TCA_BPF_OPS_LEN,
++	TCA_BPF_OPS,
++	TCA_BPF_FD,
++	TCA_BPF_NAME,
++	TCA_BPF_FLAGS,
++	TCA_BPF_FLAGS_GEN,
++	TCA_BPF_TAG,
++	TCA_BPF_ID,
++	__TCA_BPF_MAX,
++};
++
++#define TCA_BPF_MAX (__TCA_BPF_MAX - 1)
++
++/* Flower classifier */
++
++enum {
++	TCA_FLOWER_UNSPEC,
++	TCA_FLOWER_CLASSID,
++	TCA_FLOWER_INDEV,
++	TCA_FLOWER_ACT,
++	TCA_FLOWER_KEY_ETH_DST,		/* ETH_ALEN */
++	TCA_FLOWER_KEY_ETH_DST_MASK,	/* ETH_ALEN */
++	TCA_FLOWER_KEY_ETH_SRC,		/* ETH_ALEN */
++	TCA_FLOWER_KEY_ETH_SRC_MASK,	/* ETH_ALEN */
++	TCA_FLOWER_KEY_ETH_TYPE,	/* be16 */
++	TCA_FLOWER_KEY_IP_PROTO,	/* u8 */
++	TCA_FLOWER_KEY_IPV4_SRC,	/* be32 */
++	TCA_FLOWER_KEY_IPV4_SRC_MASK,	/* be32 */
++	TCA_FLOWER_KEY_IPV4_DST,	/* be32 */
++	TCA_FLOWER_KEY_IPV4_DST_MASK,	/* be32 */
++	TCA_FLOWER_KEY_IPV6_SRC,	/* struct in6_addr */
++	TCA_FLOWER_KEY_IPV6_SRC_MASK,	/* struct in6_addr */
++	TCA_FLOWER_KEY_IPV6_DST,	/* struct in6_addr */
++	TCA_FLOWER_KEY_IPV6_DST_MASK,	/* struct in6_addr */
++	TCA_FLOWER_KEY_TCP_SRC,		/* be16 */
++	TCA_FLOWER_KEY_TCP_DST,		/* be16 */
++	TCA_FLOWER_KEY_UDP_SRC,		/* be16 */
++	TCA_FLOWER_KEY_UDP_DST,		/* be16 */
++
++	TCA_FLOWER_FLAGS,
++	TCA_FLOWER_KEY_VLAN_ID,		/* be16 */
++	TCA_FLOWER_KEY_VLAN_PRIO,	/* u8   */
++	TCA_FLOWER_KEY_VLAN_ETH_TYPE,	/* be16 */
++
++	TCA_FLOWER_KEY_ENC_KEY_ID,	/* be32 */
++	TCA_FLOWER_KEY_ENC_IPV4_SRC,	/* be32 */
++	TCA_FLOWER_KEY_ENC_IPV4_SRC_MASK,/* be32 */
++	TCA_FLOWER_KEY_ENC_IPV4_DST,	/* be32 */
++	TCA_FLOWER_KEY_ENC_IPV4_DST_MASK,/* be32 */
++	TCA_FLOWER_KEY_ENC_IPV6_SRC,	/* struct in6_addr */
++	TCA_FLOWER_KEY_ENC_IPV6_SRC_MASK,/* struct in6_addr */
++	TCA_FLOWER_KEY_ENC_IPV6_DST,	/* struct in6_addr */
++	TCA_FLOWER_KEY_ENC_IPV6_DST_MASK,/* struct in6_addr */
++
++	TCA_FLOWER_KEY_TCP_SRC_MASK,	/* be16 */
++	TCA_FLOWER_KEY_TCP_DST_MASK,	/* be16 */
++	TCA_FLOWER_KEY_UDP_SRC_MASK,	/* be16 */
++	TCA_FLOWER_KEY_UDP_DST_MASK,	/* be16 */
++	TCA_FLOWER_KEY_SCTP_SRC_MASK,	/* be16 */
++	TCA_FLOWER_KEY_SCTP_DST_MASK,	/* be16 */
++
++	TCA_FLOWER_KEY_SCTP_SRC,	/* be16 */
++	TCA_FLOWER_KEY_SCTP_DST,	/* be16 */
++
++	TCA_FLOWER_KEY_ENC_UDP_SRC_PORT,	/* be16 */
++	TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK,	/* be16 */
++	TCA_FLOWER_KEY_ENC_UDP_DST_PORT,	/* be16 */
++	TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK,	/* be16 */
++
++	TCA_FLOWER_KEY_FLAGS,		/* be32 */
++	TCA_FLOWER_KEY_FLAGS_MASK,	/* be32 */
++
++	TCA_FLOWER_KEY_ICMPV4_CODE,	/* u8 */
++	TCA_FLOWER_KEY_ICMPV4_CODE_MASK,/* u8 */
++	TCA_FLOWER_KEY_ICMPV4_TYPE,	/* u8 */
++	TCA_FLOWER_KEY_ICMPV4_TYPE_MASK,/* u8 */
++	TCA_FLOWER_KEY_ICMPV6_CODE,	/* u8 */
++	TCA_FLOWER_KEY_ICMPV6_CODE_MASK,/* u8 */
++	TCA_FLOWER_KEY_ICMPV6_TYPE,	/* u8 */
++	TCA_FLOWER_KEY_ICMPV6_TYPE_MASK,/* u8 */
++
++	TCA_FLOWER_KEY_ARP_SIP,		/* be32 */
++	TCA_FLOWER_KEY_ARP_SIP_MASK,	/* be32 */
++	TCA_FLOWER_KEY_ARP_TIP,		/* be32 */
++	TCA_FLOWER_KEY_ARP_TIP_MASK,	/* be32 */
++	TCA_FLOWER_KEY_ARP_OP,		/* u8 */
++	TCA_FLOWER_KEY_ARP_OP_MASK,	/* u8 */
++	TCA_FLOWER_KEY_ARP_SHA,		/* ETH_ALEN */
++	TCA_FLOWER_KEY_ARP_SHA_MASK,	/* ETH_ALEN */
++	TCA_FLOWER_KEY_ARP_THA,		/* ETH_ALEN */
++	TCA_FLOWER_KEY_ARP_THA_MASK,	/* ETH_ALEN */
++
++	TCA_FLOWER_KEY_MPLS_TTL,	/* u8 - 8 bits */
++	TCA_FLOWER_KEY_MPLS_BOS,	/* u8 - 1 bit */
++	TCA_FLOWER_KEY_MPLS_TC,		/* u8 - 3 bits */
++	TCA_FLOWER_KEY_MPLS_LABEL,	/* be32 - 20 bits */
++
++	TCA_FLOWER_KEY_TCP_FLAGS,	/* be16 */
++	TCA_FLOWER_KEY_TCP_FLAGS_MASK,	/* be16 */
++
++	TCA_FLOWER_KEY_IP_TOS,		/* u8 */
++	TCA_FLOWER_KEY_IP_TOS_MASK,	/* u8 */
++	TCA_FLOWER_KEY_IP_TTL,		/* u8 */
++	TCA_FLOWER_KEY_IP_TTL_MASK,	/* u8 */
++
++	__TCA_FLOWER_MAX,
++};
++
++#define TCA_FLOWER_MAX (__TCA_FLOWER_MAX - 1)
++
++enum {
++	TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT = (1 << 0),
++};
++
++/* Match-all classifier */
++
++enum {
++	TCA_MATCHALL_UNSPEC,
++	TCA_MATCHALL_CLASSID,
++	TCA_MATCHALL_ACT,
++	TCA_MATCHALL_FLAGS,
++	__TCA_MATCHALL_MAX,
++};
++
++#define TCA_MATCHALL_MAX (__TCA_MATCHALL_MAX - 1)
++
++/* Extended Matches */
++
++struct tcf_ematch_tree_hdr {
++	__u16		nmatches;
++	__u16		progid;
++};
++
++enum {
++	TCA_EMATCH_TREE_UNSPEC,
++	TCA_EMATCH_TREE_HDR,
++	TCA_EMATCH_TREE_LIST,
++	__TCA_EMATCH_TREE_MAX
++};
++#define TCA_EMATCH_TREE_MAX (__TCA_EMATCH_TREE_MAX - 1)
++
++struct tcf_ematch_hdr {
++	__u16		matchid;
++	__u16		kind;
++	__u16		flags;
++	__u16		pad; /* currently unused */
++};
++
++/*  0                   1
++ *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 
++ * +-----------------------+-+-+---+
++ * |         Unused        |S|I| R |
++ * +-----------------------+-+-+---+
++ *
++ * R(2) ::= relation to next ematch
++ *          where: 0 0 END (last ematch)
++ *                 0 1 AND
++ *                 1 0 OR
++ *                 1 1 Unused (invalid)
++ * I(1) ::= invert result
++ * S(1) ::= simple payload
++ */
++#define TCF_EM_REL_END	0
++#define TCF_EM_REL_AND	(1<<0)
++#define TCF_EM_REL_OR	(1<<1)
++#define TCF_EM_INVERT	(1<<2)
++#define TCF_EM_SIMPLE	(1<<3)
++
++#define TCF_EM_REL_MASK	3
++#define TCF_EM_REL_VALID(v) (((v) & TCF_EM_REL_MASK) != TCF_EM_REL_MASK)
++
++enum {
++	TCF_LAYER_LINK,
++	TCF_LAYER_NETWORK,
++	TCF_LAYER_TRANSPORT,
++	__TCF_LAYER_MAX
++};
++#define TCF_LAYER_MAX (__TCF_LAYER_MAX - 1)
++
++/* Ematch type assignments
++ *   1..32767		Reserved for ematches inside kernel tree
++ *   32768..65535	Free to use, not reliable
++ */
++#define	TCF_EM_CONTAINER	0
++#define	TCF_EM_CMP		1
++#define	TCF_EM_NBYTE		2
++#define	TCF_EM_U32		3
++#define	TCF_EM_META		4
++#define	TCF_EM_TEXT		5
++#define	TCF_EM_VLAN		6
++#define	TCF_EM_CANID		7
++#define	TCF_EM_IPSET		8
++#define	TCF_EM_MAX		8
++
++enum {
++	TCF_EM_PROG_TC
++};
++
++enum {
++	TCF_EM_OPND_EQ,
++	TCF_EM_OPND_GT,
++	TCF_EM_OPND_LT
++};
++
++#endif
+diff --git a/include/uapi/linux/pkt_sched.h b/include/uapi/linux/pkt_sched.h
+new file mode 100644
+index 0000000..099bf55
+--- /dev/null
++++ b/include/uapi/linux/pkt_sched.h
+@@ -0,0 +1,874 @@
++#ifndef __LINUX_PKT_SCHED_H
++#define __LINUX_PKT_SCHED_H
++
++#include <linux/types.h>
++
++/* Logical priority bands not depending on specific packet scheduler.
++   Every scheduler will map them to real traffic classes, if it has
++   no more precise mechanism to classify packets.
++
++   These numbers have no special meaning, though their coincidence
++   with obsolete IPv6 values is not occasional :-). New IPv6 drafts
++   preferred full anarchy inspired by diffserv group.
++
++   Note: TC_PRIO_BESTEFFORT does not mean that it is the most unhappy
++   class, actually, as rule it will be handled with more care than
++   filler or even bulk.
++ */
++
++#define TC_PRIO_BESTEFFORT		0
++#define TC_PRIO_FILLER			1
++#define TC_PRIO_BULK			2
++#define TC_PRIO_INTERACTIVE_BULK	4
++#define TC_PRIO_INTERACTIVE		6
++#define TC_PRIO_CONTROL			7
++
++#define TC_PRIO_MAX			15
++
++/* Generic queue statistics, available for all the elements.
++   Particular schedulers may have also their private records.
++ */
++
++struct tc_stats {
++	__u64	bytes;			/* Number of enqueued bytes */
++	__u32	packets;		/* Number of enqueued packets	*/
++	__u32	drops;			/* Packets dropped because of lack of resources */
++	__u32	overlimits;		/* Number of throttle events when this
++					 * flow goes out of allocated bandwidth */
++	__u32	bps;			/* Current flow byte rate */
++	__u32	pps;			/* Current flow packet rate */
++	__u32	qlen;
++	__u32	backlog;
++};
++
++struct tc_estimator {
++	signed char	interval;
++	unsigned char	ewma_log;
++};
++
++/* "Handles"
++   ---------
++
++    All the traffic control objects have 32bit identifiers, or "handles".
++
++    They can be considered as opaque numbers from user API viewpoint,
++    but actually they always consist of two fields: major and
++    minor numbers, which are interpreted by kernel specially,
++    that may be used by applications, though not recommended.
++
++    F.e. qdisc handles always have minor number equal to zero,
++    classes (or flows) have major equal to parent qdisc major, and
++    minor uniquely identifying class inside qdisc.
++
++    Macros to manipulate handles:
++ */
++
++#define TC_H_MAJ_MASK (0xFFFF0000U)
++#define TC_H_MIN_MASK (0x0000FFFFU)
++#define TC_H_MAJ(h) ((h)&TC_H_MAJ_MASK)
++#define TC_H_MIN(h) ((h)&TC_H_MIN_MASK)
++#define TC_H_MAKE(maj,min) (((maj)&TC_H_MAJ_MASK)|((min)&TC_H_MIN_MASK))
++
++#define TC_H_UNSPEC	(0U)
++#define TC_H_ROOT	(0xFFFFFFFFU)
++#define TC_H_INGRESS    (0xFFFFFFF1U)
++#define TC_H_CLSACT	TC_H_INGRESS
++
++#define TC_H_MIN_INGRESS	0xFFF2U
++#define TC_H_MIN_EGRESS		0xFFF3U
++
++/* Need to corrospond to iproute2 tc/tc_core.h "enum link_layer" */
++enum tc_link_layer {
++	TC_LINKLAYER_UNAWARE, /* Indicate unaware old iproute2 util */
++	TC_LINKLAYER_ETHERNET,
++	TC_LINKLAYER_ATM,
++};
++#define TC_LINKLAYER_MASK 0x0F /* limit use to lower 4 bits */
++
++struct tc_ratespec {
++	unsigned char	cell_log;
++	__u8		linklayer; /* lower 4 bits */
++	unsigned short	overhead;
++	short		cell_align;
++	unsigned short	mpu;
++	__u32		rate;
++};
++
++#define TC_RTAB_SIZE	1024
++
++struct tc_sizespec {
++	unsigned char	cell_log;
++	unsigned char	size_log;
++	short		cell_align;
++	int		overhead;
++	unsigned int	linklayer;
++	unsigned int	mpu;
++	unsigned int	mtu;
++	unsigned int	tsize;
++};
++
++enum {
++	TCA_STAB_UNSPEC,
++	TCA_STAB_BASE,
++	TCA_STAB_DATA,
++	__TCA_STAB_MAX
++};
++
++#define TCA_STAB_MAX (__TCA_STAB_MAX - 1)
++
++/* FIFO section */
++
++struct tc_fifo_qopt {
++	__u32	limit;	/* Queue length: bytes for bfifo, packets for pfifo */
++};
++
++/* PRIO section */
++
++#define TCQ_PRIO_BANDS	16
++#define TCQ_MIN_PRIO_BANDS 2
++
++struct tc_prio_qopt {
++	int	bands;			/* Number of bands */
++	__u8	priomap[TC_PRIO_MAX+1];	/* Map: logical priority -> PRIO band */
++};
++
++/* MULTIQ section */
++
++struct tc_multiq_qopt {
++	__u16	bands;			/* Number of bands */
++	__u16	max_bands;		/* Maximum number of queues */
++};
++
++/* PLUG section */
++
++#define TCQ_PLUG_BUFFER                0
++#define TCQ_PLUG_RELEASE_ONE           1
++#define TCQ_PLUG_RELEASE_INDEFINITE    2
++#define TCQ_PLUG_LIMIT                 3
++
++struct tc_plug_qopt {
++	/* TCQ_PLUG_BUFFER: Inset a plug into the queue and
++	 *  buffer any incoming packets
++	 * TCQ_PLUG_RELEASE_ONE: Dequeue packets from queue head
++	 *   to beginning of the next plug.
++	 * TCQ_PLUG_RELEASE_INDEFINITE: Dequeue all packets from queue.
++	 *   Stop buffering packets until the next TCQ_PLUG_BUFFER
++	 *   command is received (just act as a pass-thru queue).
++	 * TCQ_PLUG_LIMIT: Increase/decrease queue size
++	 */
++	int             action;
++	__u32           limit;
++};
++
++/* TBF section */
++
++struct tc_tbf_qopt {
++	struct tc_ratespec rate;
++	struct tc_ratespec peakrate;
++	__u32		limit;
++	__u32		buffer;
++	__u32		mtu;
++};
++
++enum {
++	TCA_TBF_UNSPEC,
++	TCA_TBF_PARMS,
++	TCA_TBF_RTAB,
++	TCA_TBF_PTAB,
++	TCA_TBF_RATE64,
++	TCA_TBF_PRATE64,
++	TCA_TBF_BURST,
++	TCA_TBF_PBURST,
++	TCA_TBF_PAD,
++	__TCA_TBF_MAX,
++};
++
++#define TCA_TBF_MAX (__TCA_TBF_MAX - 1)
++
++
++/* TEQL section */
++
++/* TEQL does not require any parameters */
++
++/* SFQ section */
++
++struct tc_sfq_qopt {
++	unsigned	quantum;	/* Bytes per round allocated to flow */
++	int		perturb_period;	/* Period of hash perturbation */
++	__u32		limit;		/* Maximal packets in queue */
++	unsigned	divisor;	/* Hash divisor  */
++	unsigned	flows;		/* Maximal number of flows  */
++};
++
++struct tc_sfqred_stats {
++	__u32           prob_drop;      /* Early drops, below max threshold */
++	__u32           forced_drop;	/* Early drops, after max threshold */
++	__u32           prob_mark;      /* Marked packets, below max threshold */
++	__u32           forced_mark;    /* Marked packets, after max threshold */
++	__u32           prob_mark_head; /* Marked packets, below max threshold */
++	__u32           forced_mark_head;/* Marked packets, after max threshold */
++};
++
++struct tc_sfq_qopt_v1 {
++	struct tc_sfq_qopt v0;
++	unsigned int	depth;		/* max number of packets per flow */
++	unsigned int	headdrop;
++/* SFQRED parameters */
++	__u32		limit;		/* HARD maximal flow queue length (bytes) */
++	__u32		qth_min;	/* Min average length threshold (bytes) */
++	__u32		qth_max;	/* Max average length threshold (bytes) */
++	unsigned char   Wlog;		/* log(W)		*/
++	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
++	unsigned char   Scell_log;	/* cell size for idle damping */
++	unsigned char	flags;
++	__u32		max_P;		/* probability, high resolution */
++/* SFQRED stats */
++	struct tc_sfqred_stats stats;
++};
++
++
++struct tc_sfq_xstats {
++	__s32		allot;
++};
++
++/* RED section */
++
++enum {
++	TCA_RED_UNSPEC,
++	TCA_RED_PARMS,
++	TCA_RED_STAB,
++	TCA_RED_MAX_P,
++	__TCA_RED_MAX,
++};
++
++#define TCA_RED_MAX (__TCA_RED_MAX - 1)
++
++struct tc_red_qopt {
++	__u32		limit;		/* HARD maximal queue length (bytes)	*/
++	__u32		qth_min;	/* Min average length threshold (bytes) */
++	__u32		qth_max;	/* Max average length threshold (bytes) */
++	unsigned char   Wlog;		/* log(W)		*/
++	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
++	unsigned char   Scell_log;	/* cell size for idle damping */
++	unsigned char	flags;
++#define TC_RED_ECN		1
++#define TC_RED_HARDDROP		2
++#define TC_RED_ADAPTATIVE	4
++};
++
++struct tc_red_xstats {
++	__u32           early;          /* Early drops */
++	__u32           pdrop;          /* Drops due to queue limits */
++	__u32           other;          /* Drops due to drop() calls */
++	__u32           marked;         /* Marked packets */
++};
++
++/* GRED section */
++
++#define MAX_DPs 16
++
++enum {
++       TCA_GRED_UNSPEC,
++       TCA_GRED_PARMS,
++       TCA_GRED_STAB,
++       TCA_GRED_DPS,
++       TCA_GRED_MAX_P,
++       TCA_GRED_LIMIT,
++       __TCA_GRED_MAX,
++};
++
++#define TCA_GRED_MAX (__TCA_GRED_MAX - 1)
++
++struct tc_gred_qopt {
++	__u32		limit;        /* HARD maximal queue length (bytes)    */
++	__u32		qth_min;      /* Min average length threshold (bytes) */
++	__u32		qth_max;      /* Max average length threshold (bytes) */
++	__u32		DP;           /* up to 2^32 DPs */
++	__u32		backlog;
++	__u32		qave;
++	__u32		forced;
++	__u32		early;
++	__u32		other;
++	__u32		pdrop;
++	__u8		Wlog;         /* log(W)               */
++	__u8		Plog;         /* log(P_max/(qth_max-qth_min)) */
++	__u8		Scell_log;    /* cell size for idle damping */
++	__u8		prio;         /* prio of this VQ */
++	__u32		packets;
++	__u32		bytesin;
++};
++
++/* gred setup */
++struct tc_gred_sopt {
++	__u32		DPs;
++	__u32		def_DP;
++	__u8		grio;
++	__u8		flags;
++	__u16		pad1;
++};
++
++/* CHOKe section */
++
++enum {
++	TCA_CHOKE_UNSPEC,
++	TCA_CHOKE_PARMS,
++	TCA_CHOKE_STAB,
++	TCA_CHOKE_MAX_P,
++	__TCA_CHOKE_MAX,
++};
++
++#define TCA_CHOKE_MAX (__TCA_CHOKE_MAX - 1)
++
++struct tc_choke_qopt {
++	__u32		limit;		/* Hard queue length (packets)	*/
++	__u32		qth_min;	/* Min average threshold (packets) */
++	__u32		qth_max;	/* Max average threshold (packets) */
++	unsigned char   Wlog;		/* log(W)		*/
++	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
++	unsigned char   Scell_log;	/* cell size for idle damping */
++	unsigned char	flags;		/* see RED flags */
++};
++
++struct tc_choke_xstats {
++	__u32		early;          /* Early drops */
++	__u32		pdrop;          /* Drops due to queue limits */
++	__u32		other;          /* Drops due to drop() calls */
++	__u32		marked;         /* Marked packets */
++	__u32		matched;	/* Drops due to flow match */
++};
++
++/* HTB section */
++#define TC_HTB_NUMPRIO		8
++#define TC_HTB_MAXDEPTH		8
++#define TC_HTB_PROTOVER		3 /* the same as HTB and TC's major */
++
++struct tc_htb_opt {
++	struct tc_ratespec 	rate;
++	struct tc_ratespec 	ceil;
++	__u32	buffer;
++	__u32	cbuffer;
++	__u32	quantum;
++	__u32	level;		/* out only */
++	__u32	prio;
++};
++struct tc_htb_glob {
++	__u32 version;		/* to match HTB/TC */
++    	__u32 rate2quantum;	/* bps->quantum divisor */
++    	__u32 defcls;		/* default class number */
++	__u32 debug;		/* debug flags */
++
++	/* stats */
++	__u32 direct_pkts; /* count of non shaped packets */
++};
++enum {
++	TCA_HTB_UNSPEC,
++	TCA_HTB_PARMS,
++	TCA_HTB_INIT,
++	TCA_HTB_CTAB,
++	TCA_HTB_RTAB,
++	TCA_HTB_DIRECT_QLEN,
++	TCA_HTB_RATE64,
++	TCA_HTB_CEIL64,
++	TCA_HTB_PAD,
++	__TCA_HTB_MAX,
++};
++
++#define TCA_HTB_MAX (__TCA_HTB_MAX - 1)
++
++struct tc_htb_xstats {
++	__u32 lends;
++	__u32 borrows;
++	__u32 giants;	/* too big packets (rate will not be accurate) */
++	__u32 tokens;
++	__u32 ctokens;
++};
++
++/* HFSC section */
++
++struct tc_hfsc_qopt {
++	__u16	defcls;		/* default class */
++};
++
++struct tc_service_curve {
++	__u32	m1;		/* slope of the first segment in bps */
++	__u32	d;		/* x-projection of the first segment in us */
++	__u32	m2;		/* slope of the second segment in bps */
++};
++
++struct tc_hfsc_stats {
++	__u64	work;		/* total work done */
++	__u64	rtwork;		/* work done by real-time criteria */
++	__u32	period;		/* current period */
++	__u32	level;		/* class level in hierarchy */
++};
++
++enum {
++	TCA_HFSC_UNSPEC,
++	TCA_HFSC_RSC,
++	TCA_HFSC_FSC,
++	TCA_HFSC_USC,
++	__TCA_HFSC_MAX,
++};
++
++#define TCA_HFSC_MAX (__TCA_HFSC_MAX - 1)
++
++
++/* CBQ section */
++
++#define TC_CBQ_MAXPRIO		8
++#define TC_CBQ_MAXLEVEL		8
++#define TC_CBQ_DEF_EWMA		5
++
++struct tc_cbq_lssopt {
++	unsigned char	change;
++	unsigned char	flags;
++#define TCF_CBQ_LSS_BOUNDED	1
++#define TCF_CBQ_LSS_ISOLATED	2
++	unsigned char  	ewma_log;
++	unsigned char  	level;
++#define TCF_CBQ_LSS_FLAGS	1
++#define TCF_CBQ_LSS_EWMA	2
++#define TCF_CBQ_LSS_MAXIDLE	4
++#define TCF_CBQ_LSS_MINIDLE	8
++#define TCF_CBQ_LSS_OFFTIME	0x10
++#define TCF_CBQ_LSS_AVPKT	0x20
++	__u32		maxidle;
++	__u32		minidle;
++	__u32		offtime;
++	__u32		avpkt;
++};
++
++struct tc_cbq_wrropt {
++	unsigned char	flags;
++	unsigned char	priority;
++	unsigned char	cpriority;
++	unsigned char	__reserved;
++	__u32		allot;
++	__u32		weight;
++};
++
++struct tc_cbq_ovl {
++	unsigned char	strategy;
++#define	TC_CBQ_OVL_CLASSIC	0
++#define	TC_CBQ_OVL_DELAY	1
++#define	TC_CBQ_OVL_LOWPRIO	2
++#define	TC_CBQ_OVL_DROP		3
++#define	TC_CBQ_OVL_RCLASSIC	4
++	unsigned char	priority2;
++	__u16		pad;
++	__u32		penalty;
++};
++
++struct tc_cbq_police {
++	unsigned char	police;
++	unsigned char	__res1;
++	unsigned short	__res2;
++};
++
++struct tc_cbq_fopt {
++	__u32		split;
++	__u32		defmap;
++	__u32		defchange;
++};
++
++struct tc_cbq_xstats {
++	__u32		borrows;
++	__u32		overactions;
++	__s32		avgidle;
++	__s32		undertime;
++};
++
++enum {
++	TCA_CBQ_UNSPEC,
++	TCA_CBQ_LSSOPT,
++	TCA_CBQ_WRROPT,
++	TCA_CBQ_FOPT,
++	TCA_CBQ_OVL_STRATEGY,
++	TCA_CBQ_RATE,
++	TCA_CBQ_RTAB,
++	TCA_CBQ_POLICE,
++	__TCA_CBQ_MAX,
++};
++
++#define TCA_CBQ_MAX	(__TCA_CBQ_MAX - 1)
++
++/* dsmark section */
++
++enum {
++	TCA_DSMARK_UNSPEC,
++	TCA_DSMARK_INDICES,
++	TCA_DSMARK_DEFAULT_INDEX,
++	TCA_DSMARK_SET_TC_INDEX,
++	TCA_DSMARK_MASK,
++	TCA_DSMARK_VALUE,
++	__TCA_DSMARK_MAX,
++};
++
++#define TCA_DSMARK_MAX (__TCA_DSMARK_MAX - 1)
++
++/* ATM  section */
++
++enum {
++	TCA_ATM_UNSPEC,
++	TCA_ATM_FD,		/* file/socket descriptor */
++	TCA_ATM_PTR,		/* pointer to descriptor - later */
++	TCA_ATM_HDR,		/* LL header */
++	TCA_ATM_EXCESS,		/* excess traffic class (0 for CLP)  */
++	TCA_ATM_ADDR,		/* PVC address (for output only) */
++	TCA_ATM_STATE,		/* VC state (ATM_VS_*; for output only) */
++	__TCA_ATM_MAX,
++};
++
++#define TCA_ATM_MAX	(__TCA_ATM_MAX - 1)
++
++/* Network emulator */
++
++enum {
++	TCA_NETEM_UNSPEC,
++	TCA_NETEM_CORR,
++	TCA_NETEM_DELAY_DIST,
++	TCA_NETEM_REORDER,
++	TCA_NETEM_CORRUPT,
++	TCA_NETEM_LOSS,
++	TCA_NETEM_RATE,
++	TCA_NETEM_ECN,
++	TCA_NETEM_RATE64,
++	TCA_NETEM_PAD,
++	__TCA_NETEM_MAX,
++};
++
++#define TCA_NETEM_MAX (__TCA_NETEM_MAX - 1)
++
++struct tc_netem_qopt {
++	__u32	latency;	/* added delay (us) */
++	__u32   limit;		/* fifo limit (packets) */
++	__u32	loss;		/* random packet loss (0=none ~0=100%) */
++	__u32	gap;		/* re-ordering gap (0 for none) */
++	__u32   duplicate;	/* random packet dup  (0=none ~0=100%) */
++	__u32	jitter;		/* random jitter in latency (us) */
++};
++
++struct tc_netem_corr {
++	__u32	delay_corr;	/* delay correlation */
++	__u32	loss_corr;	/* packet loss correlation */
++	__u32	dup_corr;	/* duplicate correlation  */
++};
++
++struct tc_netem_reorder {
++	__u32	probability;
++	__u32	correlation;
++};
++
++struct tc_netem_corrupt {
++	__u32	probability;
++	__u32	correlation;
++};
++
++struct tc_netem_rate {
++	__u32	rate;	/* byte/s */
++	__s32	packet_overhead;
++	__u32	cell_size;
++	__s32	cell_overhead;
++};
++
++enum {
++	NETEM_LOSS_UNSPEC,
++	NETEM_LOSS_GI,		/* General Intuitive - 4 state model */
++	NETEM_LOSS_GE,		/* Gilbert Elliot models */
++	__NETEM_LOSS_MAX
++};
++#define NETEM_LOSS_MAX (__NETEM_LOSS_MAX - 1)
++
++/* State transition probabilities for 4 state model */
++struct tc_netem_gimodel {
++	__u32	p13;
++	__u32	p31;
++	__u32	p32;
++	__u32	p14;
++	__u32	p23;
++};
++
++/* Gilbert-Elliot models */
++struct tc_netem_gemodel {
++	__u32 p;
++	__u32 r;
++	__u32 h;
++	__u32 k1;
++};
++
++#define NETEM_DIST_SCALE	8192
++#define NETEM_DIST_MAX		16384
++
++/* DRR */
++
++enum {
++	TCA_DRR_UNSPEC,
++	TCA_DRR_QUANTUM,
++	__TCA_DRR_MAX
++};
++
++#define TCA_DRR_MAX	(__TCA_DRR_MAX - 1)
++
++struct tc_drr_stats {
++	__u32	deficit;
++};
++
++/* MQPRIO */
++#define TC_QOPT_BITMASK 15
++#define TC_QOPT_MAX_QUEUE 16
++
++enum {
++	TC_MQPRIO_HW_OFFLOAD_NONE,	/* no offload requested */
++	TC_MQPRIO_HW_OFFLOAD_TCS,	/* offload TCs, no queue counts */
++	__TC_MQPRIO_HW_OFFLOAD_MAX
++};
++
++#define TC_MQPRIO_HW_OFFLOAD_MAX (__TC_MQPRIO_HW_OFFLOAD_MAX - 1)
++
++struct tc_mqprio_qopt {
++	__u8	num_tc;
++	__u8	prio_tc_map[TC_QOPT_BITMASK + 1];
++	__u8	hw;
++	__u16	count[TC_QOPT_MAX_QUEUE];
++	__u16	offset[TC_QOPT_MAX_QUEUE];
++};
++
++/* SFB */
++
++enum {
++	TCA_SFB_UNSPEC,
++	TCA_SFB_PARMS,
++	__TCA_SFB_MAX,
++};
++
++#define TCA_SFB_MAX (__TCA_SFB_MAX - 1)
++
++/*
++ * Note: increment, decrement are Q0.16 fixed-point values.
++ */
++struct tc_sfb_qopt {
++	__u32 rehash_interval;	/* delay between hash move, in ms */
++	__u32 warmup_time;	/* double buffering warmup time in ms (warmup_time < rehash_interval) */
++	__u32 max;		/* max len of qlen_min */
++	__u32 bin_size;		/* maximum queue length per bin */
++	__u32 increment;	/* probability increment, (d1 in Blue) */
++	__u32 decrement;	/* probability decrement, (d2 in Blue) */
++	__u32 limit;		/* max SFB queue length */
++	__u32 penalty_rate;	/* inelastic flows are rate limited to 'rate' pps */
++	__u32 penalty_burst;
++};
++
++struct tc_sfb_xstats {
++	__u32 earlydrop;
++	__u32 penaltydrop;
++	__u32 bucketdrop;
++	__u32 queuedrop;
++	__u32 childdrop; /* drops in child qdisc */
++	__u32 marked;
++	__u32 maxqlen;
++	__u32 maxprob;
++	__u32 avgprob;
++};
++
++#define SFB_MAX_PROB 0xFFFF
++
++/* QFQ */
++enum {
++	TCA_QFQ_UNSPEC,
++	TCA_QFQ_WEIGHT,
++	TCA_QFQ_LMAX,
++	__TCA_QFQ_MAX
++};
++
++#define TCA_QFQ_MAX	(__TCA_QFQ_MAX - 1)
++
++struct tc_qfq_stats {
++	__u32 weight;
++	__u32 lmax;
++};
++
++/* CODEL */
++
++enum {
++	TCA_CODEL_UNSPEC,
++	TCA_CODEL_TARGET,
++	TCA_CODEL_LIMIT,
++	TCA_CODEL_INTERVAL,
++	TCA_CODEL_ECN,
++	TCA_CODEL_CE_THRESHOLD,
++	__TCA_CODEL_MAX
++};
++
++#define TCA_CODEL_MAX	(__TCA_CODEL_MAX - 1)
++
++struct tc_codel_xstats {
++	__u32	maxpacket; /* largest packet we've seen so far */
++	__u32	count;	   /* how many drops we've done since the last time we
++			    * entered dropping state
++			    */
++	__u32	lastcount; /* count at entry to dropping state */
++	__u32	ldelay;    /* in-queue delay seen by most recently dequeued packet */
++	__s32	drop_next; /* time to drop next packet */
++	__u32	drop_overlimit; /* number of time max qdisc packet limit was hit */
++	__u32	ecn_mark;  /* number of packets we ECN marked instead of dropped */
++	__u32	dropping;  /* are we in dropping state ? */
++	__u32	ce_mark;   /* number of CE marked packets because of ce_threshold */
++};
++
++/* FQ_CODEL */
++
++enum {
++	TCA_FQ_CODEL_UNSPEC,
++	TCA_FQ_CODEL_TARGET,
++	TCA_FQ_CODEL_LIMIT,
++	TCA_FQ_CODEL_INTERVAL,
++	TCA_FQ_CODEL_ECN,
++	TCA_FQ_CODEL_FLOWS,
++	TCA_FQ_CODEL_QUANTUM,
++	TCA_FQ_CODEL_CE_THRESHOLD,
++	TCA_FQ_CODEL_DROP_BATCH_SIZE,
++	TCA_FQ_CODEL_MEMORY_LIMIT,
++	__TCA_FQ_CODEL_MAX
++};
++
++#define TCA_FQ_CODEL_MAX	(__TCA_FQ_CODEL_MAX - 1)
++
++enum {
++	TCA_FQ_CODEL_XSTATS_QDISC,
++	TCA_FQ_CODEL_XSTATS_CLASS,
++};
++
++struct tc_fq_codel_qd_stats {
++	__u32	maxpacket;	/* largest packet we've seen so far */
++	__u32	drop_overlimit; /* number of time max qdisc
++				 * packet limit was hit
++				 */
++	__u32	ecn_mark;	/* number of packets we ECN marked
++				 * instead of being dropped
++				 */
++	__u32	new_flow_count; /* number of time packets
++				 * created a 'new flow'
++				 */
++	__u32	new_flows_len;	/* count of flows in new list */
++	__u32	old_flows_len;	/* count of flows in old list */
++	__u32	ce_mark;	/* packets above ce_threshold */
++	__u32	memory_usage;	/* in bytes */
++	__u32	drop_overmemory;
++};
++
++struct tc_fq_codel_cl_stats {
++	__s32	deficit;
++	__u32	ldelay;		/* in-queue delay seen by most recently
++				 * dequeued packet
++				 */
++	__u32	count;
++	__u32	lastcount;
++	__u32	dropping;
++	__s32	drop_next;
++};
++
++struct tc_fq_codel_xstats {
++	__u32	type;
++	union {
++		struct tc_fq_codel_qd_stats qdisc_stats;
++		struct tc_fq_codel_cl_stats class_stats;
++	};
++};
++
++/* FQ */
++
++enum {
++	TCA_FQ_UNSPEC,
++
++	TCA_FQ_PLIMIT,		/* limit of total number of packets in queue */
++
++	TCA_FQ_FLOW_PLIMIT,	/* limit of packets per flow */
++
++	TCA_FQ_QUANTUM,		/* RR quantum */
++
++	TCA_FQ_INITIAL_QUANTUM,		/* RR quantum for new flow */
++
++	TCA_FQ_RATE_ENABLE,	/* enable/disable rate limiting */
++
++	TCA_FQ_FLOW_DEFAULT_RATE,/* obsolete, do not use */
++
++	TCA_FQ_FLOW_MAX_RATE,	/* per flow max rate */
++
++	TCA_FQ_BUCKETS_LOG,	/* log2(number of buckets) */
++
++	TCA_FQ_FLOW_REFILL_DELAY,	/* flow credit refill delay in usec */
++
++	TCA_FQ_ORPHAN_MASK,	/* mask applied to orphaned skb hashes */
++
++	TCA_FQ_LOW_RATE_THRESHOLD, /* per packet delay under this rate */
++
++	__TCA_FQ_MAX
++};
++
++#define TCA_FQ_MAX	(__TCA_FQ_MAX - 1)
++
++struct tc_fq_qd_stats {
++	__u64	gc_flows;
++	__u64	highprio_packets;
++	__u64	tcp_retrans;
++	__u64	throttled;
++	__u64	flows_plimit;
++	__u64	pkts_too_long;
++	__u64	allocation_errors;
++	__s64	time_next_delayed_flow;
++	__u32	flows;
++	__u32	inactive_flows;
++	__u32	throttled_flows;
++	__u32	unthrottle_latency_ns;
++};
++
++/* Heavy-Hitter Filter */
++
++enum {
++	TCA_HHF_UNSPEC,
++	TCA_HHF_BACKLOG_LIMIT,
++	TCA_HHF_QUANTUM,
++	TCA_HHF_HH_FLOWS_LIMIT,
++	TCA_HHF_RESET_TIMEOUT,
++	TCA_HHF_ADMIT_BYTES,
++	TCA_HHF_EVICT_TIMEOUT,
++	TCA_HHF_NON_HH_WEIGHT,
++	__TCA_HHF_MAX
++};
++
++#define TCA_HHF_MAX	(__TCA_HHF_MAX - 1)
++
++struct tc_hhf_xstats {
++	__u32	drop_overlimit; /* number of times max qdisc packet limit
++				 * was hit
++				 */
++	__u32	hh_overlimit;   /* number of times max heavy-hitters was hit */
++	__u32	hh_tot_count;   /* number of captured heavy-hitters so far */
++	__u32	hh_cur_count;   /* number of current heavy-hitters */
++};
++
++/* PIE */
++enum {
++	TCA_PIE_UNSPEC,
++	TCA_PIE_TARGET,
++	TCA_PIE_LIMIT,
++	TCA_PIE_TUPDATE,
++	TCA_PIE_ALPHA,
++	TCA_PIE_BETA,
++	TCA_PIE_ECN,
++	TCA_PIE_BYTEMODE,
++	__TCA_PIE_MAX
++};
++#define TCA_PIE_MAX   (__TCA_PIE_MAX - 1)
++
++struct tc_pie_xstats {
++	__u32 prob;             /* current probability */
++	__u32 delay;            /* current delay in ms */
++	__u32 avg_dq_rate;      /* current average dq_rate in bits/pie_time */
++	__u32 packets_in;       /* total number of packets enqueued */
++	__u32 dropped;          /* packets dropped due to pie_action */
++	__u32 overlimit;        /* dropped due to lack of space in queue */
++	__u32 maxq;             /* maximum queue size */
++	__u32 ecn_mark;         /* packets marked with ecn*/
++};
++#endif
+diff --git a/include/uapi/linux/posix_types.h b/include/uapi/linux/posix_types.h
+new file mode 100644
+index 0000000..988f76e
+--- /dev/null
++++ b/include/uapi/linux/posix_types.h
+@@ -0,0 +1,37 @@
++#ifndef _LINUX_POSIX_TYPES_H
++#define _LINUX_POSIX_TYPES_H
++
++#include <linux/stddef.h>
++
++/*
++ * This allows for 1024 file descriptors: if NR_OPEN is ever grown
++ * beyond that you'll have to change this too. But 1024 fd's seem to be
++ * enough even for such "real" unices like OSF/1, so hopefully this is
++ * one limit that doesn't have to be changed [again].
++ *
++ * Note that POSIX wants the FD_CLEAR(fd,fdsetp) defines to be in
++ * <sys/time.h> (and thus <linux/time.h>) - but this is a more logical
++ * place for them. Solved by having dummy defines in <sys/time.h>.
++ */
++
++/*
++ * This macro may have been defined in <gnu/types.h>. But we always
++ * use the one here.
++ */
++#undef __FD_SETSIZE
++#define __FD_SETSIZE	1024
++
++typedef struct {
++	unsigned long fds_bits[__FD_SETSIZE / (8 * sizeof(long))];
++} __kernel_fd_set;
++
++/* Type of a signal handler.  */
++typedef void (*__kernel_sighandler_t)(int);
++
++/* Type of a SYSV IPC key.  */
++typedef int __kernel_key_t;
++typedef int __kernel_mqd_t;
++
++#include <asm/posix_types.h>
++
++#endif /* _LINUX_POSIX_TYPES_H */
+diff --git a/include/uapi/linux/rtnetlink.h b/include/uapi/linux/rtnetlink.h
+new file mode 100644
+index 0000000..813e9e0
+--- /dev/null
++++ b/include/uapi/linux/rtnetlink.h
+@@ -0,0 +1,718 @@
++#ifndef __LINUX_RTNETLINK_H
++#define __LINUX_RTNETLINK_H
++
++#include <linux/types.h>
++#include <linux/netlink.h>
++#include <linux/if_link.h>
++#include <linux/if_addr.h>
++#include <linux/neighbour.h>
++
++/* rtnetlink families. Values up to 127 are reserved for real address
++ * families, values above 128 may be used arbitrarily.
++ */
++#define RTNL_FAMILY_IPMR		128
++#define RTNL_FAMILY_IP6MR		129
++#define RTNL_FAMILY_MAX			129
++
++/****
++ *		Routing/neighbour discovery messages.
++ ****/
++
++/* Types of messages */
++
++enum {
++	RTM_BASE	= 16,
++#define RTM_BASE	RTM_BASE
++
++	RTM_NEWLINK	= 16,
++#define RTM_NEWLINK	RTM_NEWLINK
++	RTM_DELLINK,
++#define RTM_DELLINK	RTM_DELLINK
++	RTM_GETLINK,
++#define RTM_GETLINK	RTM_GETLINK
++	RTM_SETLINK,
++#define RTM_SETLINK	RTM_SETLINK
++
++	RTM_NEWADDR	= 20,
++#define RTM_NEWADDR	RTM_NEWADDR
++	RTM_DELADDR,
++#define RTM_DELADDR	RTM_DELADDR
++	RTM_GETADDR,
++#define RTM_GETADDR	RTM_GETADDR
++
++	RTM_NEWROUTE	= 24,
++#define RTM_NEWROUTE	RTM_NEWROUTE
++	RTM_DELROUTE,
++#define RTM_DELROUTE	RTM_DELROUTE
++	RTM_GETROUTE,
++#define RTM_GETROUTE	RTM_GETROUTE
++
++	RTM_NEWNEIGH	= 28,
++#define RTM_NEWNEIGH	RTM_NEWNEIGH
++	RTM_DELNEIGH,
++#define RTM_DELNEIGH	RTM_DELNEIGH
++	RTM_GETNEIGH,
++#define RTM_GETNEIGH	RTM_GETNEIGH
++
++	RTM_NEWRULE	= 32,
++#define RTM_NEWRULE	RTM_NEWRULE
++	RTM_DELRULE,
++#define RTM_DELRULE	RTM_DELRULE
++	RTM_GETRULE,
++#define RTM_GETRULE	RTM_GETRULE
++
++	RTM_NEWQDISC	= 36,
++#define RTM_NEWQDISC	RTM_NEWQDISC
++	RTM_DELQDISC,
++#define RTM_DELQDISC	RTM_DELQDISC
++	RTM_GETQDISC,
++#define RTM_GETQDISC	RTM_GETQDISC
++
++	RTM_NEWTCLASS	= 40,
++#define RTM_NEWTCLASS	RTM_NEWTCLASS
++	RTM_DELTCLASS,
++#define RTM_DELTCLASS	RTM_DELTCLASS
++	RTM_GETTCLASS,
++#define RTM_GETTCLASS	RTM_GETTCLASS
++
++	RTM_NEWTFILTER	= 44,
++#define RTM_NEWTFILTER	RTM_NEWTFILTER
++	RTM_DELTFILTER,
++#define RTM_DELTFILTER	RTM_DELTFILTER
++	RTM_GETTFILTER,
++#define RTM_GETTFILTER	RTM_GETTFILTER
++
++	RTM_NEWACTION	= 48,
++#define RTM_NEWACTION   RTM_NEWACTION
++	RTM_DELACTION,
++#define RTM_DELACTION   RTM_DELACTION
++	RTM_GETACTION,
++#define RTM_GETACTION   RTM_GETACTION
++
++	RTM_NEWPREFIX	= 52,
++#define RTM_NEWPREFIX	RTM_NEWPREFIX
++
++	RTM_GETMULTICAST = 58,
++#define RTM_GETMULTICAST RTM_GETMULTICAST
++
++	RTM_GETANYCAST	= 62,
++#define RTM_GETANYCAST	RTM_GETANYCAST
++
++	RTM_NEWNEIGHTBL	= 64,
++#define RTM_NEWNEIGHTBL	RTM_NEWNEIGHTBL
++	RTM_GETNEIGHTBL	= 66,
++#define RTM_GETNEIGHTBL	RTM_GETNEIGHTBL
++	RTM_SETNEIGHTBL,
++#define RTM_SETNEIGHTBL	RTM_SETNEIGHTBL
++
++	RTM_NEWNDUSEROPT = 68,
++#define RTM_NEWNDUSEROPT RTM_NEWNDUSEROPT
++
++	RTM_NEWADDRLABEL = 72,
++#define RTM_NEWADDRLABEL RTM_NEWADDRLABEL
++	RTM_DELADDRLABEL,
++#define RTM_DELADDRLABEL RTM_DELADDRLABEL
++	RTM_GETADDRLABEL,
++#define RTM_GETADDRLABEL RTM_GETADDRLABEL
++
++	RTM_GETDCB = 78,
++#define RTM_GETDCB RTM_GETDCB
++	RTM_SETDCB,
++#define RTM_SETDCB RTM_SETDCB
++
++	RTM_NEWNETCONF = 80,
++#define RTM_NEWNETCONF RTM_NEWNETCONF
++	RTM_DELNETCONF,
++#define RTM_DELNETCONF RTM_DELNETCONF
++	RTM_GETNETCONF = 82,
++#define RTM_GETNETCONF RTM_GETNETCONF
++
++	RTM_NEWMDB = 84,
++#define RTM_NEWMDB RTM_NEWMDB
++	RTM_DELMDB = 85,
++#define RTM_DELMDB RTM_DELMDB
++	RTM_GETMDB = 86,
++#define RTM_GETMDB RTM_GETMDB
++
++	RTM_NEWNSID = 88,
++#define RTM_NEWNSID RTM_NEWNSID
++	RTM_DELNSID = 89,
++#define RTM_DELNSID RTM_DELNSID
++	RTM_GETNSID = 90,
++#define RTM_GETNSID RTM_GETNSID
++
++	RTM_NEWSTATS = 92,
++#define RTM_NEWSTATS RTM_NEWSTATS
++	RTM_GETSTATS = 94,
++#define RTM_GETSTATS RTM_GETSTATS
++
++	RTM_NEWCACHEREPORT = 96,
++#define RTM_NEWCACHEREPORT RTM_NEWCACHEREPORT
++
++	__RTM_MAX,
++#define RTM_MAX		(((__RTM_MAX + 3) & ~3) - 1)
++};
++
++#define RTM_NR_MSGTYPES	(RTM_MAX + 1 - RTM_BASE)
++#define RTM_NR_FAMILIES	(RTM_NR_MSGTYPES >> 2)
++#define RTM_FAM(cmd)	(((cmd) - RTM_BASE) >> 2)
++
++/* 
++   Generic structure for encapsulation of optional route information.
++   It is reminiscent of sockaddr, but with sa_family replaced
++   with attribute type.
++ */
++
++struct rtattr {
++	unsigned short	rta_len;
++	unsigned short	rta_type;
++};
++
++/* Macros to handle rtattributes */
++
++#define RTA_ALIGNTO	4U
++#define RTA_ALIGN(len) ( ((len)+RTA_ALIGNTO-1) & ~(RTA_ALIGNTO-1) )
++#define RTA_OK(rta,len) ((len) >= (int)sizeof(struct rtattr) && \
++			 (rta)->rta_len >= sizeof(struct rtattr) && \
++			 (rta)->rta_len <= (len))
++#define RTA_NEXT(rta,attrlen)	((attrlen) -= RTA_ALIGN((rta)->rta_len), \
++				 (struct rtattr*)(((char*)(rta)) + RTA_ALIGN((rta)->rta_len)))
++#define RTA_LENGTH(len)	(RTA_ALIGN(sizeof(struct rtattr)) + (len))
++#define RTA_SPACE(len)	RTA_ALIGN(RTA_LENGTH(len))
++#define RTA_DATA(rta)   ((void*)(((char*)(rta)) + RTA_LENGTH(0)))
++#define RTA_PAYLOAD(rta) ((int)((rta)->rta_len) - RTA_LENGTH(0))
++
++
++
++
++/******************************************************************************
++ *		Definitions used in routing table administration.
++ ****/
++
++struct rtmsg {
++	unsigned char		rtm_family;
++	unsigned char		rtm_dst_len;
++	unsigned char		rtm_src_len;
++	unsigned char		rtm_tos;
++
++	unsigned char		rtm_table;	/* Routing table id */
++	unsigned char		rtm_protocol;	/* Routing protocol; see below	*/
++	unsigned char		rtm_scope;	/* See below */	
++	unsigned char		rtm_type;	/* See below	*/
++
++	unsigned		rtm_flags;
++};
++
++/* rtm_type */
++
++enum {
++	RTN_UNSPEC,
++	RTN_UNICAST,		/* Gateway or direct route	*/
++	RTN_LOCAL,		/* Accept locally		*/
++	RTN_BROADCAST,		/* Accept locally as broadcast,
++				   send as broadcast */
++	RTN_ANYCAST,		/* Accept locally as broadcast,
++				   but send as unicast */
++	RTN_MULTICAST,		/* Multicast route		*/
++	RTN_BLACKHOLE,		/* Drop				*/
++	RTN_UNREACHABLE,	/* Destination is unreachable   */
++	RTN_PROHIBIT,		/* Administratively prohibited	*/
++	RTN_THROW,		/* Not in this table		*/
++	RTN_NAT,		/* Translate this address	*/
++	RTN_XRESOLVE,		/* Use external resolver	*/
++	__RTN_MAX
++};
++
++#define RTN_MAX (__RTN_MAX - 1)
++
++
++/* rtm_protocol */
++
++#define RTPROT_UNSPEC	0
++#define RTPROT_REDIRECT	1	/* Route installed by ICMP redirects;
++				   not used by current IPv4 */
++#define RTPROT_KERNEL	2	/* Route installed by kernel		*/
++#define RTPROT_BOOT	3	/* Route installed during boot		*/
++#define RTPROT_STATIC	4	/* Route installed by administrator	*/
++
++/* Values of protocol >= RTPROT_STATIC are not interpreted by kernel;
++   they are just passed from user and back as is.
++   It will be used by hypothetical multiple routing daemons.
++   Note that protocol values should be standardized in order to
++   avoid conflicts.
++ */
++
++#define RTPROT_GATED	8	/* Apparently, GateD */
++#define RTPROT_RA	9	/* RDISC/ND router advertisements */
++#define RTPROT_MRT	10	/* Merit MRT */
++#define RTPROT_ZEBRA	11	/* Zebra */
++#define RTPROT_BIRD	12	/* BIRD */
++#define RTPROT_DNROUTED	13	/* DECnet routing daemon */
++#define RTPROT_XORP	14	/* XORP */
++#define RTPROT_NTK	15	/* Netsukuku */
++#define RTPROT_DHCP	16      /* DHCP client */
++#define RTPROT_MROUTED	17      /* Multicast daemon */
++#define RTPROT_BABEL	42      /* Babel daemon */
++
++/* rtm_scope
++
++   Really it is not scope, but sort of distance to the destination.
++   NOWHERE are reserved for not existing destinations, HOST is our
++   local addresses, LINK are destinations, located on directly attached
++   link and UNIVERSE is everywhere in the Universe.
++
++   Intermediate values are also possible f.e. interior routes
++   could be assigned a value between UNIVERSE and LINK.
++*/
++
++enum rt_scope_t {
++	RT_SCOPE_UNIVERSE=0,
++/* User defined values  */
++	RT_SCOPE_SITE=200,
++	RT_SCOPE_LINK=253,
++	RT_SCOPE_HOST=254,
++	RT_SCOPE_NOWHERE=255
++};
++
++/* rtm_flags */
++
++#define RTM_F_NOTIFY		0x100	/* Notify user of route change	*/
++#define RTM_F_CLONED		0x200	/* This route is cloned		*/
++#define RTM_F_EQUALIZE		0x400	/* Multipath equalizer: NI	*/
++#define RTM_F_PREFIX		0x800	/* Prefix addresses		*/
++#define RTM_F_LOOKUP_TABLE	0x1000	/* set rtm_table to FIB lookup result */
++#define RTM_F_FIB_MATCH	        0x2000	/* return full fib lookup match */
++
++/* Reserved table identifiers */
++
++enum rt_class_t {
++	RT_TABLE_UNSPEC=0,
++/* User defined values */
++	RT_TABLE_COMPAT=252,
++	RT_TABLE_DEFAULT=253,
++	RT_TABLE_MAIN=254,
++	RT_TABLE_LOCAL=255,
++	RT_TABLE_MAX=0xFFFFFFFF
++};
++
++
++/* Routing message attributes */
++
++enum rtattr_type_t {
++	RTA_UNSPEC,
++	RTA_DST,
++	RTA_SRC,
++	RTA_IIF,
++	RTA_OIF,
++	RTA_GATEWAY,
++	RTA_PRIORITY,
++	RTA_PREFSRC,
++	RTA_METRICS,
++	RTA_MULTIPATH,
++	RTA_PROTOINFO, /* no longer used */
++	RTA_FLOW,
++	RTA_CACHEINFO,
++	RTA_SESSION, /* no longer used */
++	RTA_MP_ALGO, /* no longer used */
++	RTA_TABLE,
++	RTA_MARK,
++	RTA_MFC_STATS,
++	RTA_VIA,
++	RTA_NEWDST,
++	RTA_PREF,
++	RTA_ENCAP_TYPE,
++	RTA_ENCAP,
++	RTA_EXPIRES,
++	RTA_PAD,
++	RTA_UID,
++	RTA_TTL_PROPAGATE,
++	__RTA_MAX
++};
++
++#define RTA_MAX (__RTA_MAX - 1)
++
++#define RTM_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct rtmsg))))
++#define RTM_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct rtmsg))
++
++/* RTM_MULTIPATH --- array of struct rtnexthop.
++ *
++ * "struct rtnexthop" describes all necessary nexthop information,
++ * i.e. parameters of path to a destination via this nexthop.
++ *
++ * At the moment it is impossible to set different prefsrc, mtu, window
++ * and rtt for different paths from multipath.
++ */
++
++struct rtnexthop {
++	unsigned short		rtnh_len;
++	unsigned char		rtnh_flags;
++	unsigned char		rtnh_hops;
++	int			rtnh_ifindex;
++};
++
++/* rtnh_flags */
++
++#define RTNH_F_DEAD		1	/* Nexthop is dead (used by multipath)	*/
++#define RTNH_F_PERVASIVE	2	/* Do recursive gateway lookup	*/
++#define RTNH_F_ONLINK		4	/* Gateway is forced on link	*/
++#define RTNH_F_OFFLOAD		8	/* offloaded route */
++#define RTNH_F_LINKDOWN		16	/* carrier-down on nexthop */
++#define RTNH_F_UNRESOLVED	32	/* The entry is unresolved (ipmr) */
++
++#define RTNH_COMPARE_MASK	(RTNH_F_DEAD | RTNH_F_LINKDOWN | RTNH_F_OFFLOAD)
++
++/* Macros to handle hexthops */
++
++#define RTNH_ALIGNTO	4
++#define RTNH_ALIGN(len) ( ((len)+RTNH_ALIGNTO-1) & ~(RTNH_ALIGNTO-1) )
++#define RTNH_OK(rtnh,len) ((rtnh)->rtnh_len >= sizeof(struct rtnexthop) && \
++			   ((int)(rtnh)->rtnh_len) <= (len))
++#define RTNH_NEXT(rtnh)	((struct rtnexthop*)(((char*)(rtnh)) + RTNH_ALIGN((rtnh)->rtnh_len)))
++#define RTNH_LENGTH(len) (RTNH_ALIGN(sizeof(struct rtnexthop)) + (len))
++#define RTNH_SPACE(len)	RTNH_ALIGN(RTNH_LENGTH(len))
++#define RTNH_DATA(rtnh)   ((struct rtattr*)(((char*)(rtnh)) + RTNH_LENGTH(0)))
++
++/* RTA_VIA */
++struct rtvia {
++	__kernel_sa_family_t	rtvia_family;
++	__u8			rtvia_addr[0];
++};
++
++/* RTM_CACHEINFO */
++
++struct rta_cacheinfo {
++	__u32	rta_clntref;
++	__u32	rta_lastuse;
++	__s32	rta_expires;
++	__u32	rta_error;
++	__u32	rta_used;
++
++#define RTNETLINK_HAVE_PEERINFO 1
++	__u32	rta_id;
++	__u32	rta_ts;
++	__u32	rta_tsage;
++};
++
++/* RTM_METRICS --- array of struct rtattr with types of RTAX_* */
++
++enum {
++	RTAX_UNSPEC,
++#define RTAX_UNSPEC RTAX_UNSPEC
++	RTAX_LOCK,
++#define RTAX_LOCK RTAX_LOCK
++	RTAX_MTU,
++#define RTAX_MTU RTAX_MTU
++	RTAX_WINDOW,
++#define RTAX_WINDOW RTAX_WINDOW
++	RTAX_RTT,
++#define RTAX_RTT RTAX_RTT
++	RTAX_RTTVAR,
++#define RTAX_RTTVAR RTAX_RTTVAR
++	RTAX_SSTHRESH,
++#define RTAX_SSTHRESH RTAX_SSTHRESH
++	RTAX_CWND,
++#define RTAX_CWND RTAX_CWND
++	RTAX_ADVMSS,
++#define RTAX_ADVMSS RTAX_ADVMSS
++	RTAX_REORDERING,
++#define RTAX_REORDERING RTAX_REORDERING
++	RTAX_HOPLIMIT,
++#define RTAX_HOPLIMIT RTAX_HOPLIMIT
++	RTAX_INITCWND,
++#define RTAX_INITCWND RTAX_INITCWND
++	RTAX_FEATURES,
++#define RTAX_FEATURES RTAX_FEATURES
++	RTAX_RTO_MIN,
++#define RTAX_RTO_MIN RTAX_RTO_MIN
++	RTAX_INITRWND,
++#define RTAX_INITRWND RTAX_INITRWND
++	RTAX_QUICKACK,
++#define RTAX_QUICKACK RTAX_QUICKACK
++	RTAX_CC_ALGO,
++#define RTAX_CC_ALGO RTAX_CC_ALGO
++	__RTAX_MAX
++};
++
++#define RTAX_MAX (__RTAX_MAX - 1)
++
++#define RTAX_FEATURE_ECN	(1 << 0)
++#define RTAX_FEATURE_SACK	(1 << 1)
++#define RTAX_FEATURE_TIMESTAMP	(1 << 2)
++#define RTAX_FEATURE_ALLFRAG	(1 << 3)
++
++#define RTAX_FEATURE_MASK	(RTAX_FEATURE_ECN | RTAX_FEATURE_SACK | \
++				 RTAX_FEATURE_TIMESTAMP | RTAX_FEATURE_ALLFRAG)
++
++struct rta_session {
++	__u8	proto;
++	__u8	pad1;
++	__u16	pad2;
++
++	union {
++		struct {
++			__u16	sport;
++			__u16	dport;
++		} ports;
++
++		struct {
++			__u8	type;
++			__u8	code;
++			__u16	ident;
++		} icmpt;
++
++		__u32		spi;
++	} u;
++};
++
++struct rta_mfc_stats {
++	__u64	mfcs_packets;
++	__u64	mfcs_bytes;
++	__u64	mfcs_wrong_if;
++};
++
++/****
++ *		General form of address family dependent message.
++ ****/
++
++struct rtgenmsg {
++	unsigned char		rtgen_family;
++};
++
++/*****************************************************************
++ *		Link layer specific messages.
++ ****/
++
++/* struct ifinfomsg
++ * passes link level specific information, not dependent
++ * on network protocol.
++ */
++
++struct ifinfomsg {
++	unsigned char	ifi_family;
++	unsigned char	__ifi_pad;
++	unsigned short	ifi_type;		/* ARPHRD_* */
++	int		ifi_index;		/* Link index	*/
++	unsigned	ifi_flags;		/* IFF_* flags	*/
++	unsigned	ifi_change;		/* IFF_* change mask */
++};
++
++/********************************************************************
++ *		prefix information 
++ ****/
++
++struct prefixmsg {
++	unsigned char	prefix_family;
++	unsigned char	prefix_pad1;
++	unsigned short	prefix_pad2;
++	int		prefix_ifindex;
++	unsigned char	prefix_type;
++	unsigned char	prefix_len;
++	unsigned char	prefix_flags;
++	unsigned char	prefix_pad3;
++};
++
++enum 
++{
++	PREFIX_UNSPEC,
++	PREFIX_ADDRESS,
++	PREFIX_CACHEINFO,
++	__PREFIX_MAX
++};
++
++#define PREFIX_MAX	(__PREFIX_MAX - 1)
++
++struct prefix_cacheinfo {
++	__u32	preferred_time;
++	__u32	valid_time;
++};
++
++
++/*****************************************************************
++ *		Traffic control messages.
++ ****/
++
++struct tcmsg {
++	unsigned char	tcm_family;
++	unsigned char	tcm__pad1;
++	unsigned short	tcm__pad2;
++	int		tcm_ifindex;
++	__u32		tcm_handle;
++	__u32		tcm_parent;
++	__u32		tcm_info;
++};
++
++enum {
++	TCA_UNSPEC,
++	TCA_KIND,
++	TCA_OPTIONS,
++	TCA_STATS,
++	TCA_XSTATS,
++	TCA_RATE,
++	TCA_FCNT,
++	TCA_STATS2,
++	TCA_STAB,
++	TCA_PAD,
++	TCA_DUMP_INVISIBLE,
++	TCA_CHAIN,
++	__TCA_MAX
++};
++
++#define TCA_MAX (__TCA_MAX - 1)
++
++#define TCA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcmsg))))
++#define TCA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcmsg))
++
++/********************************************************************
++ *		Neighbor Discovery userland options
++ ****/
++
++struct nduseroptmsg {
++	unsigned char	nduseropt_family;
++	unsigned char	nduseropt_pad1;
++	unsigned short	nduseropt_opts_len;	/* Total length of options */
++	int		nduseropt_ifindex;
++	__u8		nduseropt_icmp_type;
++	__u8		nduseropt_icmp_code;
++	unsigned short	nduseropt_pad2;
++	unsigned int	nduseropt_pad3;
++	/* Followed by one or more ND options */
++};
++
++enum {
++	NDUSEROPT_UNSPEC,
++	NDUSEROPT_SRCADDR,
++	__NDUSEROPT_MAX
++};
++
++#define NDUSEROPT_MAX	(__NDUSEROPT_MAX - 1)
++
++/* RTnetlink multicast groups - backwards compatibility for userspace */
++#define RTMGRP_LINK		1
++#define RTMGRP_NOTIFY		2
++#define RTMGRP_NEIGH		4
++#define RTMGRP_TC		8
++
++#define RTMGRP_IPV4_IFADDR	0x10
++#define RTMGRP_IPV4_MROUTE	0x20
++#define RTMGRP_IPV4_ROUTE	0x40
++#define RTMGRP_IPV4_RULE	0x80
++
++#define RTMGRP_IPV6_IFADDR	0x100
++#define RTMGRP_IPV6_MROUTE	0x200
++#define RTMGRP_IPV6_ROUTE	0x400
++#define RTMGRP_IPV6_IFINFO	0x800
++
++#define RTMGRP_DECnet_IFADDR    0x1000
++#define RTMGRP_DECnet_ROUTE     0x4000
++
++#define RTMGRP_IPV6_PREFIX	0x20000
++
++/* RTnetlink multicast groups */
++enum rtnetlink_groups {
++	RTNLGRP_NONE,
++#define RTNLGRP_NONE		RTNLGRP_NONE
++	RTNLGRP_LINK,
++#define RTNLGRP_LINK		RTNLGRP_LINK
++	RTNLGRP_NOTIFY,
++#define RTNLGRP_NOTIFY		RTNLGRP_NOTIFY
++	RTNLGRP_NEIGH,
++#define RTNLGRP_NEIGH		RTNLGRP_NEIGH
++	RTNLGRP_TC,
++#define RTNLGRP_TC		RTNLGRP_TC
++	RTNLGRP_IPV4_IFADDR,
++#define RTNLGRP_IPV4_IFADDR	RTNLGRP_IPV4_IFADDR
++	RTNLGRP_IPV4_MROUTE,
++#define	RTNLGRP_IPV4_MROUTE	RTNLGRP_IPV4_MROUTE
++	RTNLGRP_IPV4_ROUTE,
++#define RTNLGRP_IPV4_ROUTE	RTNLGRP_IPV4_ROUTE
++	RTNLGRP_IPV4_RULE,
++#define RTNLGRP_IPV4_RULE	RTNLGRP_IPV4_RULE
++	RTNLGRP_IPV6_IFADDR,
++#define RTNLGRP_IPV6_IFADDR	RTNLGRP_IPV6_IFADDR
++	RTNLGRP_IPV6_MROUTE,
++#define RTNLGRP_IPV6_MROUTE	RTNLGRP_IPV6_MROUTE
++	RTNLGRP_IPV6_ROUTE,
++#define RTNLGRP_IPV6_ROUTE	RTNLGRP_IPV6_ROUTE
++	RTNLGRP_IPV6_IFINFO,
++#define RTNLGRP_IPV6_IFINFO	RTNLGRP_IPV6_IFINFO
++	RTNLGRP_DECnet_IFADDR,
++#define RTNLGRP_DECnet_IFADDR	RTNLGRP_DECnet_IFADDR
++	RTNLGRP_NOP2,
++	RTNLGRP_DECnet_ROUTE,
++#define RTNLGRP_DECnet_ROUTE	RTNLGRP_DECnet_ROUTE
++	RTNLGRP_DECnet_RULE,
++#define RTNLGRP_DECnet_RULE	RTNLGRP_DECnet_RULE
++	RTNLGRP_NOP4,
++	RTNLGRP_IPV6_PREFIX,
++#define RTNLGRP_IPV6_PREFIX	RTNLGRP_IPV6_PREFIX
++	RTNLGRP_IPV6_RULE,
++#define RTNLGRP_IPV6_RULE	RTNLGRP_IPV6_RULE
++	RTNLGRP_ND_USEROPT,
++#define RTNLGRP_ND_USEROPT	RTNLGRP_ND_USEROPT
++	RTNLGRP_PHONET_IFADDR,
++#define RTNLGRP_PHONET_IFADDR	RTNLGRP_PHONET_IFADDR
++	RTNLGRP_PHONET_ROUTE,
++#define RTNLGRP_PHONET_ROUTE	RTNLGRP_PHONET_ROUTE
++	RTNLGRP_DCB,
++#define RTNLGRP_DCB		RTNLGRP_DCB
++	RTNLGRP_IPV4_NETCONF,
++#define RTNLGRP_IPV4_NETCONF	RTNLGRP_IPV4_NETCONF
++	RTNLGRP_IPV6_NETCONF,
++#define RTNLGRP_IPV6_NETCONF	RTNLGRP_IPV6_NETCONF
++	RTNLGRP_MDB,
++#define RTNLGRP_MDB		RTNLGRP_MDB
++	RTNLGRP_MPLS_ROUTE,
++#define RTNLGRP_MPLS_ROUTE	RTNLGRP_MPLS_ROUTE
++	RTNLGRP_NSID,
++#define RTNLGRP_NSID		RTNLGRP_NSID
++	RTNLGRP_MPLS_NETCONF,
++#define RTNLGRP_MPLS_NETCONF	RTNLGRP_MPLS_NETCONF
++	RTNLGRP_IPV4_MROUTE_R,
++#define RTNLGRP_IPV4_MROUTE_R	RTNLGRP_IPV4_MROUTE_R
++	RTNLGRP_IPV6_MROUTE_R,
++#define RTNLGRP_IPV6_MROUTE_R	RTNLGRP_IPV6_MROUTE_R
++	__RTNLGRP_MAX
++};
++#define RTNLGRP_MAX	(__RTNLGRP_MAX - 1)
++
++/* TC action piece */
++struct tcamsg {
++	unsigned char	tca_family;
++	unsigned char	tca__pad1;
++	unsigned short	tca__pad2;
++};
++
++enum {
++	TCA_ROOT_UNSPEC,
++	TCA_ROOT_TAB,
++#define TCA_ACT_TAB TCA_ROOT_TAB
++#define TCAA_MAX TCA_ROOT_TAB
++	TCA_ROOT_FLAGS,
++	TCA_ROOT_COUNT,
++	TCA_ROOT_TIME_DELTA, /* in msecs */
++	__TCA_ROOT_MAX,
++#define	TCA_ROOT_MAX (__TCA_ROOT_MAX - 1)
++};
++
++#define TA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcamsg))))
++#define TA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcamsg))
++/* tcamsg flags stored in attribute TCA_ROOT_FLAGS
++ *
++ * TCA_FLAG_LARGE_DUMP_ON user->kernel to request for larger than TCA_ACT_MAX_PRIO
++ * actions in a dump. All dump responses will contain the number of actions
++ * being dumped stored in for user app's consumption in TCA_ROOT_COUNT
++ *
++ */
++#define TCA_FLAG_LARGE_DUMP_ON		(1 << 0)
++
++/* New extended info filters for IFLA_EXT_MASK */
++#define RTEXT_FILTER_VF		(1 << 0)
++#define RTEXT_FILTER_BRVLAN	(1 << 1)
++#define RTEXT_FILTER_BRVLAN_COMPRESSED	(1 << 2)
++#define	RTEXT_FILTER_SKIP_STATS	(1 << 3)
++
++/* End of information exported to user level */
++
++
++
++#endif /* __LINUX_RTNETLINK_H */
+diff --git a/include/uapi/linux/sctp.h b/include/uapi/linux/sctp.h
+new file mode 100644
+index 0000000..fec24c4
+--- /dev/null
++++ b/include/uapi/linux/sctp.h
+@@ -0,0 +1,1085 @@
++/* SCTP kernel implementation
++ * (C) Copyright IBM Corp. 2001, 2004
++ * Copyright (c) 1999-2000 Cisco, Inc.
++ * Copyright (c) 1999-2001 Motorola, Inc.
++ * Copyright (c) 2002 Intel Corp.
++ *
++ * This file is part of the SCTP kernel implementation
++ *
++ * This header represents the structures and constants needed to support
++ * the SCTP Extension to the Sockets API.
++ *
++ * This SCTP implementation is free software;
++ * you can redistribute it and/or modify it under the terms of
++ * the GNU General Public License as published by
++ * the Free Software Foundation; either version 2, or (at your option)
++ * any later version.
++ *
++ * This SCTP implementation is distributed in the hope that it
++ * will be useful, but WITHOUT ANY WARRANTY; without even the implied
++ *                 ************************
++ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
++ * See the GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with GNU CC; see the file COPYING.  If not, see
++ * <http://www.gnu.org/licenses/>.
++ *
++ * Please send any bug reports or fixes you make to the
++ * email address(es):
++ *    lksctp developers <linux-sctp@vger.kernel.org>
++ *
++ * Or submit a bug report through the following website:
++ *    http://www.sf.net/projects/lksctp
++ *
++ * Written or modified by:
++ *    La Monte H.P. Yarroll    <piggy@acm.org>
++ *    R. Stewart               <randall@sctp.chicago.il.us>
++ *    K. Morneau               <kmorneau@cisco.com>
++ *    Q. Xie                   <qxie1@email.mot.com>
++ *    Karl Knutson             <karl@athena.chicago.il.us>
++ *    Jon Grimm                <jgrimm@us.ibm.com>
++ *    Daisy Chang              <daisyc@us.ibm.com>
++ *    Ryan Layer               <rmlayer@us.ibm.com>
++ *    Ardelle Fan              <ardelle.fan@intel.com>
++ *    Sridhar Samudrala        <sri@us.ibm.com>
++ *    Inaky Perez-Gonzalez     <inaky.gonzalez@intel.com>
++ *    Vlad Yasevich            <vladislav.yasevich@hp.com>
++ *
++ * Any bugs reported given to us we will try to fix... any fixes shared will
++ * be incorporated into the next SCTP release.
++ */
++
++#ifndef _SCTP_H
++#define _SCTP_H
++
++#include <linux/types.h>
++#include <linux/socket.h>
++
++typedef __s32 sctp_assoc_t;
++
++/* The following symbols come from the Sockets API Extensions for
++ * SCTP <draft-ietf-tsvwg-sctpsocket-07.txt>.
++ */
++#define SCTP_RTOINFO	0
++#define SCTP_ASSOCINFO  1
++#define SCTP_INITMSG	2
++#define SCTP_NODELAY	3		/* Get/set nodelay option. */
++#define SCTP_AUTOCLOSE	4
++#define SCTP_SET_PEER_PRIMARY_ADDR 5
++#define SCTP_PRIMARY_ADDR	6
++#define SCTP_ADAPTATION_LAYER	7
++#define SCTP_DISABLE_FRAGMENTS	8
++#define SCTP_PEER_ADDR_PARAMS	9
++#define SCTP_DEFAULT_SEND_PARAM	10
++#define SCTP_EVENTS	11
++#define SCTP_I_WANT_MAPPED_V4_ADDR 12	/* Turn on/off mapped v4 addresses  */
++#define SCTP_MAXSEG	13		/* Get/set maximum fragment. */
++#define SCTP_STATUS	14
++#define SCTP_GET_PEER_ADDR_INFO	15
++#define SCTP_DELAYED_ACK_TIME	16
++#define SCTP_DELAYED_ACK SCTP_DELAYED_ACK_TIME
++#define SCTP_DELAYED_SACK SCTP_DELAYED_ACK_TIME
++#define SCTP_CONTEXT	17
++#define SCTP_FRAGMENT_INTERLEAVE	18
++#define SCTP_PARTIAL_DELIVERY_POINT	19 /* Set/Get partial delivery point */
++#define SCTP_MAX_BURST	20		/* Set/Get max burst */
++#define SCTP_AUTH_CHUNK	21	/* Set only: add a chunk type to authenticate */
++#define SCTP_HMAC_IDENT	22
++#define SCTP_AUTH_KEY	23
++#define SCTP_AUTH_ACTIVE_KEY	24
++#define SCTP_AUTH_DELETE_KEY	25
++#define SCTP_PEER_AUTH_CHUNKS	26	/* Read only */
++#define SCTP_LOCAL_AUTH_CHUNKS	27	/* Read only */
++#define SCTP_GET_ASSOC_NUMBER	28	/* Read only */
++#define SCTP_GET_ASSOC_ID_LIST	29	/* Read only */
++#define SCTP_AUTO_ASCONF       30
++#define SCTP_PEER_ADDR_THLDS	31
++#define SCTP_RECVRCVINFO	32
++#define SCTP_RECVNXTINFO	33
++#define SCTP_DEFAULT_SNDINFO	34
++
++/* Internal Socket Options. Some of the sctp library functions are
++ * implemented using these socket options.
++ */
++#define SCTP_SOCKOPT_BINDX_ADD	100	/* BINDX requests for adding addrs */
++#define SCTP_SOCKOPT_BINDX_REM	101	/* BINDX requests for removing addrs. */
++#define SCTP_SOCKOPT_PEELOFF	102	/* peel off association. */
++/* Options 104-106 are deprecated and removed. Do not use this space */
++#define SCTP_SOCKOPT_CONNECTX_OLD	107	/* CONNECTX old requests. */
++#define SCTP_GET_PEER_ADDRS	108		/* Get all peer address. */
++#define SCTP_GET_LOCAL_ADDRS	109		/* Get all local address. */
++#define SCTP_SOCKOPT_CONNECTX	110		/* CONNECTX requests. */
++#define SCTP_SOCKOPT_CONNECTX3	111	/* CONNECTX requests (updated) */
++#define SCTP_GET_ASSOC_STATS	112	/* Read only */
++#define SCTP_PR_SUPPORTED	113
++#define SCTP_DEFAULT_PRINFO	114
++#define SCTP_PR_ASSOC_STATUS	115
++#define SCTP_PR_STREAM_STATUS	116
++#define SCTP_RECONFIG_SUPPORTED	117
++#define SCTP_ENABLE_STREAM_RESET	118
++#define SCTP_RESET_STREAMS	119
++#define SCTP_RESET_ASSOC	120
++#define SCTP_ADD_STREAMS	121
++#define SCTP_SOCKOPT_PEELOFF_FLAGS 122
++
++/* PR-SCTP policies */
++#define SCTP_PR_SCTP_NONE	0x0000
++#define SCTP_PR_SCTP_TTL	0x0010
++#define SCTP_PR_SCTP_RTX	0x0020
++#define SCTP_PR_SCTP_PRIO	0x0030
++#define SCTP_PR_SCTP_MAX	SCTP_PR_SCTP_PRIO
++#define SCTP_PR_SCTP_MASK	0x0030
++
++#define __SCTP_PR_INDEX(x)	((x >> 4) - 1)
++#define SCTP_PR_INDEX(x)	__SCTP_PR_INDEX(SCTP_PR_SCTP_ ## x)
++
++#define SCTP_PR_POLICY(x)	((x) & SCTP_PR_SCTP_MASK)
++#define SCTP_PR_SET_POLICY(flags, x)	\
++	do {				\
++		flags &= ~SCTP_PR_SCTP_MASK;	\
++		flags |= x;		\
++	} while (0)
++
++#define SCTP_PR_TTL_ENABLED(x)	(SCTP_PR_POLICY(x) == SCTP_PR_SCTP_TTL)
++#define SCTP_PR_RTX_ENABLED(x)	(SCTP_PR_POLICY(x) == SCTP_PR_SCTP_RTX)
++#define SCTP_PR_PRIO_ENABLED(x)	(SCTP_PR_POLICY(x) == SCTP_PR_SCTP_PRIO)
++
++/* For enable stream reset */
++#define SCTP_ENABLE_RESET_STREAM_REQ	0x01
++#define SCTP_ENABLE_RESET_ASSOC_REQ	0x02
++#define SCTP_ENABLE_CHANGE_ASSOC_REQ	0x04
++#define SCTP_ENABLE_STRRESET_MASK	0x07
++
++#define SCTP_STREAM_RESET_INCOMING	0x01
++#define SCTP_STREAM_RESET_OUTGOING	0x02
++
++/* These are bit fields for msghdr->msg_flags.  See section 5.1.  */
++/* On user space Linux, these live in <bits/socket.h> as an enum.  */
++enum sctp_msg_flags {
++	MSG_NOTIFICATION = 0x8000,
++#define MSG_NOTIFICATION MSG_NOTIFICATION
++};
++
++/* 5.3.1 SCTP Initiation Structure (SCTP_INIT)
++ *
++ *   This cmsghdr structure provides information for initializing new
++ *   SCTP associations with sendmsg().  The SCTP_INITMSG socket option
++ *   uses this same data structure.  This structure is not used for
++ *   recvmsg().
++ *
++ *   cmsg_level    cmsg_type      cmsg_data[]
++ *   ------------  ------------   ----------------------
++ *   IPPROTO_SCTP  SCTP_INIT      struct sctp_initmsg
++ */
++struct sctp_initmsg {
++	__u16 sinit_num_ostreams;
++	__u16 sinit_max_instreams;
++	__u16 sinit_max_attempts;
++	__u16 sinit_max_init_timeo;
++};
++
++/* 5.3.2 SCTP Header Information Structure (SCTP_SNDRCV)
++ *
++ *   This cmsghdr structure specifies SCTP options for sendmsg() and
++ *   describes SCTP header information about a received message through
++ *   recvmsg().
++ *
++ *   cmsg_level    cmsg_type      cmsg_data[]
++ *   ------------  ------------   ----------------------
++ *   IPPROTO_SCTP  SCTP_SNDRCV    struct sctp_sndrcvinfo
++ */
++struct sctp_sndrcvinfo {
++	__u16 sinfo_stream;
++	__u16 sinfo_ssn;
++	__u16 sinfo_flags;
++	__u32 sinfo_ppid;
++	__u32 sinfo_context;
++	__u32 sinfo_timetolive;
++	__u32 sinfo_tsn;
++	__u32 sinfo_cumtsn;
++	sctp_assoc_t sinfo_assoc_id;
++};
++
++/* 5.3.4 SCTP Send Information Structure (SCTP_SNDINFO)
++ *
++ *   This cmsghdr structure specifies SCTP options for sendmsg().
++ *
++ *   cmsg_level    cmsg_type      cmsg_data[]
++ *   ------------  ------------   -------------------
++ *   IPPROTO_SCTP  SCTP_SNDINFO   struct sctp_sndinfo
++ */
++struct sctp_sndinfo {
++	__u16 snd_sid;
++	__u16 snd_flags;
++	__u32 snd_ppid;
++	__u32 snd_context;
++	sctp_assoc_t snd_assoc_id;
++};
++
++/* 5.3.5 SCTP Receive Information Structure (SCTP_RCVINFO)
++ *
++ *   This cmsghdr structure describes SCTP receive information
++ *   about a received message through recvmsg().
++ *
++ *   cmsg_level    cmsg_type      cmsg_data[]
++ *   ------------  ------------   -------------------
++ *   IPPROTO_SCTP  SCTP_RCVINFO   struct sctp_rcvinfo
++ */
++struct sctp_rcvinfo {
++	__u16 rcv_sid;
++	__u16 rcv_ssn;
++	__u16 rcv_flags;
++	__u32 rcv_ppid;
++	__u32 rcv_tsn;
++	__u32 rcv_cumtsn;
++	__u32 rcv_context;
++	sctp_assoc_t rcv_assoc_id;
++};
++
++/* 5.3.6 SCTP Next Receive Information Structure (SCTP_NXTINFO)
++ *
++ *   This cmsghdr structure describes SCTP receive information
++ *   of the next message that will be delivered through recvmsg()
++ *   if this information is already available when delivering
++ *   the current message.
++ *
++ *   cmsg_level    cmsg_type      cmsg_data[]
++ *   ------------  ------------   -------------------
++ *   IPPROTO_SCTP  SCTP_NXTINFO   struct sctp_nxtinfo
++ */
++struct sctp_nxtinfo {
++	__u16 nxt_sid;
++	__u16 nxt_flags;
++	__u32 nxt_ppid;
++	__u32 nxt_length;
++	sctp_assoc_t nxt_assoc_id;
++};
++
++/*
++ *  sinfo_flags: 16 bits (unsigned integer)
++ *
++ *   This field may contain any of the following flags and is composed of
++ *   a bitwise OR of these values.
++ */
++enum sctp_sinfo_flags {
++	SCTP_UNORDERED		= (1 << 0), /* Send/receive message unordered. */
++	SCTP_ADDR_OVER		= (1 << 1), /* Override the primary destination. */
++	SCTP_ABORT		= (1 << 2), /* Send an ABORT message to the peer. */
++	SCTP_SACK_IMMEDIATELY	= (1 << 3), /* SACK should be sent without delay. */
++	SCTP_NOTIFICATION	= MSG_NOTIFICATION, /* Next message is not user msg but notification. */
++	SCTP_EOF		= MSG_FIN,  /* Initiate graceful shutdown process. */
++};
++
++typedef union {
++	__u8   			raw;
++	struct sctp_initmsg	init;
++	struct sctp_sndrcvinfo	sndrcv;
++} sctp_cmsg_data_t;
++
++/* These are cmsg_types.  */
++typedef enum sctp_cmsg_type {
++	SCTP_INIT,		/* 5.2.1 SCTP Initiation Structure */
++#define SCTP_INIT	SCTP_INIT
++	SCTP_SNDRCV,		/* 5.2.2 SCTP Header Information Structure */
++#define SCTP_SNDRCV	SCTP_SNDRCV
++	SCTP_SNDINFO,		/* 5.3.4 SCTP Send Information Structure */
++#define SCTP_SNDINFO	SCTP_SNDINFO
++	SCTP_RCVINFO,		/* 5.3.5 SCTP Receive Information Structure */
++#define SCTP_RCVINFO	SCTP_RCVINFO
++	SCTP_NXTINFO,		/* 5.3.6 SCTP Next Receive Information Structure */
++#define SCTP_NXTINFO	SCTP_NXTINFO
++} sctp_cmsg_t;
++
++/*
++ * 5.3.1.1 SCTP_ASSOC_CHANGE
++ *
++ *   Communication notifications inform the ULP that an SCTP association
++ *   has either begun or ended. The identifier for a new association is
++ *   provided by this notificaion. The notification information has the
++ *   following format:
++ *
++ */
++struct sctp_assoc_change {
++	__u16 sac_type;
++	__u16 sac_flags;
++	__u32 sac_length;
++	__u16 sac_state;
++	__u16 sac_error;
++	__u16 sac_outbound_streams;
++	__u16 sac_inbound_streams;
++	sctp_assoc_t sac_assoc_id;
++	__u8 sac_info[0];
++};
++
++/*
++ *   sac_state: 32 bits (signed integer)
++ *
++ *   This field holds one of a number of values that communicate the
++ *   event that happened to the association.  They include:
++ *
++ *   Note:  The following state names deviate from the API draft as
++ *   the names clash too easily with other kernel symbols.
++ */
++enum sctp_sac_state {
++	SCTP_COMM_UP,
++	SCTP_COMM_LOST,
++	SCTP_RESTART,
++	SCTP_SHUTDOWN_COMP,
++	SCTP_CANT_STR_ASSOC,
++};
++
++/*
++ * 5.3.1.2 SCTP_PEER_ADDR_CHANGE
++ *
++ *   When a destination address on a multi-homed peer encounters a change
++ *   an interface details event is sent.  The information has the
++ *   following structure:
++ */
++struct sctp_paddr_change {
++	__u16 spc_type;
++	__u16 spc_flags;
++	__u32 spc_length;
++	struct sockaddr_storage spc_aaddr;
++	int spc_state;
++	int spc_error;
++	sctp_assoc_t spc_assoc_id;
++} __attribute__((packed, aligned(4)));
++
++/*
++ *    spc_state:  32 bits (signed integer)
++ *
++ *   This field holds one of a number of values that communicate the
++ *   event that happened to the address.  They include:
++ */
++enum sctp_spc_state {
++	SCTP_ADDR_AVAILABLE,
++	SCTP_ADDR_UNREACHABLE,
++	SCTP_ADDR_REMOVED,
++	SCTP_ADDR_ADDED,
++	SCTP_ADDR_MADE_PRIM,
++	SCTP_ADDR_CONFIRMED,
++};
++
++
++/*
++ * 5.3.1.3 SCTP_REMOTE_ERROR
++ *
++ *   A remote peer may send an Operational Error message to its peer.
++ *   This message indicates a variety of error conditions on an
++ *   association. The entire error TLV as it appears on the wire is
++ *   included in a SCTP_REMOTE_ERROR event.  Please refer to the SCTP
++ *   specification [SCTP] and any extensions for a list of possible
++ *   error formats. SCTP error TLVs have the format:
++ */
++struct sctp_remote_error {
++	__u16 sre_type;
++	__u16 sre_flags;
++	__u32 sre_length;
++	__u16 sre_error;
++	sctp_assoc_t sre_assoc_id;
++	__u8 sre_data[0];
++};
++
++
++/*
++ * 5.3.1.4 SCTP_SEND_FAILED
++ *
++ *   If SCTP cannot deliver a message it may return the message as a
++ *   notification.
++ */
++struct sctp_send_failed {
++	__u16 ssf_type;
++	__u16 ssf_flags;
++	__u32 ssf_length;
++	__u32 ssf_error;
++	struct sctp_sndrcvinfo ssf_info;
++	sctp_assoc_t ssf_assoc_id;
++	__u8 ssf_data[0];
++};
++
++/*
++ *   ssf_flags: 16 bits (unsigned integer)
++ *
++ *   The flag value will take one of the following values
++ *
++ *   SCTP_DATA_UNSENT  - Indicates that the data was never put on
++ *                       the wire.
++ *
++ *   SCTP_DATA_SENT    - Indicates that the data was put on the wire.
++ *                       Note that this does not necessarily mean that the
++ *                       data was (or was not) successfully delivered.
++ */
++enum sctp_ssf_flags {
++	SCTP_DATA_UNSENT,
++	SCTP_DATA_SENT,
++};
++
++/*
++ * 5.3.1.5 SCTP_SHUTDOWN_EVENT
++ *
++ *   When a peer sends a SHUTDOWN, SCTP delivers this notification to
++ *   inform the application that it should cease sending data.
++ */
++struct sctp_shutdown_event {
++	__u16 sse_type;
++	__u16 sse_flags;
++	__u32 sse_length;
++	sctp_assoc_t sse_assoc_id;
++};
++
++/*
++ * 5.3.1.6 SCTP_ADAPTATION_INDICATION
++ *
++ *   When a peer sends a Adaptation Layer Indication parameter , SCTP
++ *   delivers this notification to inform the application
++ *   that of the peers requested adaptation layer.
++ */
++struct sctp_adaptation_event {
++	__u16 sai_type;
++	__u16 sai_flags;
++	__u32 sai_length;
++	__u32 sai_adaptation_ind;
++	sctp_assoc_t sai_assoc_id;
++};
++
++/*
++ * 5.3.1.7 SCTP_PARTIAL_DELIVERY_EVENT
++ *
++ *   When a receiver is engaged in a partial delivery of a
++ *   message this notification will be used to indicate
++ *   various events.
++ */
++struct sctp_pdapi_event {
++	__u16 pdapi_type;
++	__u16 pdapi_flags;
++	__u32 pdapi_length;
++	__u32 pdapi_indication;
++	sctp_assoc_t pdapi_assoc_id;
++};
++
++enum { SCTP_PARTIAL_DELIVERY_ABORTED=0, };
++
++/*
++ * 5.3.1.8.  SCTP_AUTHENTICATION_EVENT
++ *
++ *  When a receiver is using authentication this message will provide
++ *  notifications regarding new keys being made active as well as errors.
++ */
++struct sctp_authkey_event {
++	__u16 auth_type;
++	__u16 auth_flags;
++	__u32 auth_length;
++	__u16 auth_keynumber;
++	__u16 auth_altkeynumber;
++	__u32 auth_indication;
++	sctp_assoc_t auth_assoc_id;
++};
++
++enum { SCTP_AUTH_NEWKEY = 0, };
++
++/*
++ * 6.1.9. SCTP_SENDER_DRY_EVENT
++ *
++ * When the SCTP stack has no more user data to send or retransmit, this
++ * notification is given to the user. Also, at the time when a user app
++ * subscribes to this event, if there is no data to be sent or
++ * retransmit, the stack will immediately send up this notification.
++ */
++struct sctp_sender_dry_event {
++	__u16 sender_dry_type;
++	__u16 sender_dry_flags;
++	__u32 sender_dry_length;
++	sctp_assoc_t sender_dry_assoc_id;
++};
++
++#define SCTP_STREAM_RESET_INCOMING_SSN	0x0001
++#define SCTP_STREAM_RESET_OUTGOING_SSN	0x0002
++#define SCTP_STREAM_RESET_DENIED	0x0004
++#define SCTP_STREAM_RESET_FAILED	0x0008
++struct sctp_stream_reset_event {
++	__u16 strreset_type;
++	__u16 strreset_flags;
++	__u32 strreset_length;
++	sctp_assoc_t strreset_assoc_id;
++	__u16 strreset_stream_list[];
++};
++
++#define SCTP_ASSOC_RESET_DENIED		0x0004
++#define SCTP_ASSOC_RESET_FAILED		0x0008
++struct sctp_assoc_reset_event {
++	__u16 assocreset_type;
++	__u16 assocreset_flags;
++	__u32 assocreset_length;
++	sctp_assoc_t assocreset_assoc_id;
++	__u32 assocreset_local_tsn;
++	__u32 assocreset_remote_tsn;
++};
++
++#define SCTP_ASSOC_CHANGE_DENIED	0x0004
++#define SCTP_ASSOC_CHANGE_FAILED	0x0008
++struct sctp_stream_change_event {
++	__u16 strchange_type;
++	__u16 strchange_flags;
++	__u32 strchange_length;
++	sctp_assoc_t strchange_assoc_id;
++	__u16 strchange_instrms;
++	__u16 strchange_outstrms;
++};
++
++/*
++ * Described in Section 7.3
++ *   Ancillary Data and Notification Interest Options
++ */
++struct sctp_event_subscribe {
++	__u8 sctp_data_io_event;
++	__u8 sctp_association_event;
++	__u8 sctp_address_event;
++	__u8 sctp_send_failure_event;
++	__u8 sctp_peer_error_event;
++	__u8 sctp_shutdown_event;
++	__u8 sctp_partial_delivery_event;
++	__u8 sctp_adaptation_layer_event;
++	__u8 sctp_authentication_event;
++	__u8 sctp_sender_dry_event;
++	__u8 sctp_stream_reset_event;
++	__u8 sctp_assoc_reset_event;
++	__u8 sctp_stream_change_event;
++};
++
++/*
++ * 5.3.1 SCTP Notification Structure
++ *
++ *   The notification structure is defined as the union of all
++ *   notification types.
++ *
++ */
++union sctp_notification {
++	struct {
++		__u16 sn_type;             /* Notification type. */
++		__u16 sn_flags;
++		__u32 sn_length;
++	} sn_header;
++	struct sctp_assoc_change sn_assoc_change;
++	struct sctp_paddr_change sn_paddr_change;
++	struct sctp_remote_error sn_remote_error;
++	struct sctp_send_failed sn_send_failed;
++	struct sctp_shutdown_event sn_shutdown_event;
++	struct sctp_adaptation_event sn_adaptation_event;
++	struct sctp_pdapi_event sn_pdapi_event;
++	struct sctp_authkey_event sn_authkey_event;
++	struct sctp_sender_dry_event sn_sender_dry_event;
++	struct sctp_stream_reset_event sn_strreset_event;
++	struct sctp_assoc_reset_event sn_assocreset_event;
++	struct sctp_stream_change_event sn_strchange_event;
++};
++
++/* Section 5.3.1
++ * All standard values for sn_type flags are greater than 2^15.
++ * Values from 2^15 and down are reserved.
++ */
++
++enum sctp_sn_type {
++	SCTP_SN_TYPE_BASE     = (1<<15),
++	SCTP_ASSOC_CHANGE,
++#define SCTP_ASSOC_CHANGE		SCTP_ASSOC_CHANGE
++	SCTP_PEER_ADDR_CHANGE,
++#define SCTP_PEER_ADDR_CHANGE		SCTP_PEER_ADDR_CHANGE
++	SCTP_SEND_FAILED,
++#define SCTP_SEND_FAILED		SCTP_SEND_FAILED
++	SCTP_REMOTE_ERROR,
++#define SCTP_REMOTE_ERROR		SCTP_REMOTE_ERROR
++	SCTP_SHUTDOWN_EVENT,
++#define SCTP_SHUTDOWN_EVENT		SCTP_SHUTDOWN_EVENT
++	SCTP_PARTIAL_DELIVERY_EVENT,
++#define SCTP_PARTIAL_DELIVERY_EVENT	SCTP_PARTIAL_DELIVERY_EVENT
++	SCTP_ADAPTATION_INDICATION,
++#define SCTP_ADAPTATION_INDICATION	SCTP_ADAPTATION_INDICATION
++	SCTP_AUTHENTICATION_EVENT,
++#define SCTP_AUTHENTICATION_INDICATION	SCTP_AUTHENTICATION_EVENT
++	SCTP_SENDER_DRY_EVENT,
++#define SCTP_SENDER_DRY_EVENT		SCTP_SENDER_DRY_EVENT
++	SCTP_STREAM_RESET_EVENT,
++#define SCTP_STREAM_RESET_EVENT		SCTP_STREAM_RESET_EVENT
++	SCTP_ASSOC_RESET_EVENT,
++#define SCTP_ASSOC_RESET_EVENT		SCTP_ASSOC_RESET_EVENT
++	SCTP_STREAM_CHANGE_EVENT,
++#define SCTP_STREAM_CHANGE_EVENT	SCTP_STREAM_CHANGE_EVENT
++};
++
++/* Notification error codes used to fill up the error fields in some
++ * notifications.
++ * SCTP_PEER_ADDRESS_CHAGE 	: spc_error
++ * SCTP_ASSOC_CHANGE		: sac_error
++ * These names should be potentially included in the draft 04 of the SCTP
++ * sockets API specification.
++ */
++typedef enum sctp_sn_error {
++	SCTP_FAILED_THRESHOLD,
++	SCTP_RECEIVED_SACK,
++	SCTP_HEARTBEAT_SUCCESS,
++	SCTP_RESPONSE_TO_USER_REQ,
++	SCTP_INTERNAL_ERROR,
++	SCTP_SHUTDOWN_GUARD_EXPIRES,
++	SCTP_PEER_FAULTY,
++} sctp_sn_error_t;
++
++/*
++ * 7.1.1 Retransmission Timeout Parameters (SCTP_RTOINFO)
++ *
++ *   The protocol parameters used to initialize and bound retransmission
++ *   timeout (RTO) are tunable.  See [SCTP] for more information on how
++ *   these parameters are used in RTO calculation.
++ */
++struct sctp_rtoinfo {
++	sctp_assoc_t	srto_assoc_id;
++	__u32		srto_initial;
++	__u32		srto_max;
++	__u32		srto_min;
++};
++
++/*
++ * 7.1.2 Association Parameters (SCTP_ASSOCINFO)
++ *
++ *   This option is used to both examine and set various association and
++ *   endpoint parameters.
++ */
++struct sctp_assocparams {
++	sctp_assoc_t	sasoc_assoc_id;
++	__u16		sasoc_asocmaxrxt;
++	__u16		sasoc_number_peer_destinations;
++	__u32		sasoc_peer_rwnd;
++	__u32		sasoc_local_rwnd;
++	__u32		sasoc_cookie_life;
++};
++
++/*
++ * 7.1.9 Set Peer Primary Address (SCTP_SET_PEER_PRIMARY_ADDR)
++ *
++ *  Requests that the peer mark the enclosed address as the association
++ *  primary. The enclosed address must be one of the association's
++ *  locally bound addresses. The following structure is used to make a
++ *   set primary request:
++ */
++struct sctp_setpeerprim {
++	sctp_assoc_t            sspp_assoc_id;
++	struct sockaddr_storage sspp_addr;
++} __attribute__((packed, aligned(4)));
++
++/*
++ * 7.1.10 Set Primary Address (SCTP_PRIMARY_ADDR)
++ *
++ *  Requests that the local SCTP stack use the enclosed peer address as
++ *  the association primary. The enclosed address must be one of the
++ *  association peer's addresses. The following structure is used to
++ *  make a set peer primary request:
++ */
++struct sctp_prim {
++	sctp_assoc_t            ssp_assoc_id;
++	struct sockaddr_storage ssp_addr;
++} __attribute__((packed, aligned(4)));
++
++/* For backward compatibility use, define the old name too */
++#define sctp_setprim	sctp_prim
++
++/*
++ * 7.1.11 Set Adaptation Layer Indicator (SCTP_ADAPTATION_LAYER)
++ *
++ * Requests that the local endpoint set the specified Adaptation Layer
++ * Indication parameter for all future INIT and INIT-ACK exchanges.
++ */
++struct sctp_setadaptation {
++	__u32	ssb_adaptation_ind;
++};
++
++/*
++ * 7.1.13 Peer Address Parameters  (SCTP_PEER_ADDR_PARAMS)
++ *
++ *   Applications can enable or disable heartbeats for any peer address
++ *   of an association, modify an address's heartbeat interval, force a
++ *   heartbeat to be sent immediately, and adjust the address's maximum
++ *   number of retransmissions sent before an address is considered
++ *   unreachable. The following structure is used to access and modify an
++ *   address's parameters:
++ */
++enum  sctp_spp_flags {
++	SPP_HB_ENABLE = 1<<0,		/*Enable heartbeats*/
++	SPP_HB_DISABLE = 1<<1,		/*Disable heartbeats*/
++	SPP_HB = SPP_HB_ENABLE | SPP_HB_DISABLE,
++	SPP_HB_DEMAND = 1<<2,		/*Send heartbeat immediately*/
++	SPP_PMTUD_ENABLE = 1<<3,	/*Enable PMTU discovery*/
++	SPP_PMTUD_DISABLE = 1<<4,	/*Disable PMTU discovery*/
++	SPP_PMTUD = SPP_PMTUD_ENABLE | SPP_PMTUD_DISABLE,
++	SPP_SACKDELAY_ENABLE = 1<<5,	/*Enable SACK*/
++	SPP_SACKDELAY_DISABLE = 1<<6,	/*Disable SACK*/
++	SPP_SACKDELAY = SPP_SACKDELAY_ENABLE | SPP_SACKDELAY_DISABLE,
++	SPP_HB_TIME_IS_ZERO = 1<<7,	/* Set HB delay to 0 */
++};
++
++struct sctp_paddrparams {
++	sctp_assoc_t		spp_assoc_id;
++	struct sockaddr_storage	spp_address;
++	__u32			spp_hbinterval;
++	__u16			spp_pathmaxrxt;
++	__u32			spp_pathmtu;
++	__u32			spp_sackdelay;
++	__u32			spp_flags;
++} __attribute__((packed, aligned(4)));
++
++/*
++ * 7.1.18.  Add a chunk that must be authenticated (SCTP_AUTH_CHUNK)
++ *
++ * This set option adds a chunk type that the user is requesting to be
++ * received only in an authenticated way.  Changes to the list of chunks
++ * will only effect future associations on the socket.
++ */
++struct sctp_authchunk {
++	__u8		sauth_chunk;
++};
++
++/*
++ * 7.1.19.  Get or set the list of supported HMAC Identifiers (SCTP_HMAC_IDENT)
++ *
++ * This option gets or sets the list of HMAC algorithms that the local
++ * endpoint requires the peer to use.
++ */
++/* This here is only used by user space as is. It might not be a good idea
++ * to export/reveal the whole structure with reserved fields etc.
++ */
++enum {
++	SCTP_AUTH_HMAC_ID_SHA1 = 1,
++	SCTP_AUTH_HMAC_ID_SHA256 = 3,
++};
++
++struct sctp_hmacalgo {
++	__u32		shmac_num_idents;
++	__u16		shmac_idents[];
++};
++
++/* Sadly, user and kernel space have different names for
++ * this structure member, so this is to not break anything.
++ */
++#define shmac_number_of_idents	shmac_num_idents
++
++/*
++ * 7.1.20.  Set a shared key (SCTP_AUTH_KEY)
++ *
++ * This option will set a shared secret key which is used to build an
++ * association shared key.
++ */
++struct sctp_authkey {
++	sctp_assoc_t	sca_assoc_id;
++	__u16		sca_keynumber;
++	__u16		sca_keylength;
++	__u8		sca_key[];
++};
++
++/*
++ * 7.1.21.  Get or set the active shared key (SCTP_AUTH_ACTIVE_KEY)
++ *
++ * This option will get or set the active shared key to be used to build
++ * the association shared key.
++ */
++
++struct sctp_authkeyid {
++	sctp_assoc_t	scact_assoc_id;
++	__u16		scact_keynumber;
++};
++
++
++/*
++ * 7.1.23.  Get or set delayed ack timer (SCTP_DELAYED_SACK)
++ *
++ * This option will effect the way delayed acks are performed.  This
++ * option allows you to get or set the delayed ack time, in
++ * milliseconds.  It also allows changing the delayed ack frequency.
++ * Changing the frequency to 1 disables the delayed sack algorithm.  If
++ * the assoc_id is 0, then this sets or gets the endpoints default
++ * values.  If the assoc_id field is non-zero, then the set or get
++ * effects the specified association for the one to many model (the
++ * assoc_id field is ignored by the one to one model).  Note that if
++ * sack_delay or sack_freq are 0 when setting this option, then the
++ * current values will remain unchanged.
++ */
++struct sctp_sack_info {
++	sctp_assoc_t	sack_assoc_id;
++	uint32_t	sack_delay;
++	uint32_t	sack_freq;
++};
++
++struct sctp_assoc_value {
++    sctp_assoc_t            assoc_id;
++    uint32_t                assoc_value;
++};
++
++/*
++ * 7.2.2 Peer Address Information
++ *
++ *   Applications can retrieve information about a specific peer address
++ *   of an association, including its reachability state, congestion
++ *   window, and retransmission timer values.  This information is
++ *   read-only. The following structure is used to access this
++ *   information:
++ */
++struct sctp_paddrinfo {
++	sctp_assoc_t		spinfo_assoc_id;
++	struct sockaddr_storage	spinfo_address;
++	__s32			spinfo_state;
++	__u32			spinfo_cwnd;
++	__u32			spinfo_srtt;
++	__u32			spinfo_rto;
++	__u32			spinfo_mtu;
++} __attribute__((packed, aligned(4)));
++
++/* Peer addresses's state. */
++/* UNKNOWN: Peer address passed by the upper layer in sendmsg or connect[x]
++ * calls.
++ * UNCONFIRMED: Peer address received in INIT/INIT-ACK address parameters.
++ *              Not yet confirmed by a heartbeat and not available for data
++ *		transfers.
++ * ACTIVE : Peer address confirmed, active and available for data transfers.
++ * INACTIVE: Peer address inactive and not available for data transfers.
++ */
++enum sctp_spinfo_state {
++	SCTP_INACTIVE,
++	SCTP_PF,
++	SCTP_ACTIVE,
++	SCTP_UNCONFIRMED,
++	SCTP_UNKNOWN = 0xffff  /* Value used for transport state unknown */
++};
++
++/*
++ * 7.2.1 Association Status (SCTP_STATUS)
++ *
++ *   Applications can retrieve current status information about an
++ *   association, including association state, peer receiver window size,
++ *   number of unacked data chunks, and number of data chunks pending
++ *   receipt.  This information is read-only.  The following structure is
++ *   used to access this information:
++ */
++struct sctp_status {
++	sctp_assoc_t		sstat_assoc_id;
++	__s32			sstat_state;
++	__u32			sstat_rwnd;
++	__u16			sstat_unackdata;
++	__u16			sstat_penddata;
++	__u16			sstat_instrms;
++	__u16			sstat_outstrms;
++	__u32			sstat_fragmentation_point;
++	struct sctp_paddrinfo	sstat_primary;
++};
++
++/*
++ * 7.2.3.  Get the list of chunks the peer requires to be authenticated
++ *         (SCTP_PEER_AUTH_CHUNKS)
++ *
++ * This option gets a list of chunks for a specified association that
++ * the peer requires to be received authenticated only.
++ */
++struct sctp_authchunks {
++	sctp_assoc_t	gauth_assoc_id;
++	__u32		gauth_number_of_chunks;
++	uint8_t		gauth_chunks[];
++};
++
++/* The broken spelling has been released already in lksctp-tools header,
++ * so don't break anyone, now that it's fixed.
++ */
++#define guth_number_of_chunks	gauth_number_of_chunks
++
++/* Association states.  */
++enum sctp_sstat_state {
++	SCTP_EMPTY                = 0,
++	SCTP_CLOSED               = 1,
++	SCTP_COOKIE_WAIT          = 2,
++	SCTP_COOKIE_ECHOED        = 3,
++	SCTP_ESTABLISHED          = 4,
++	SCTP_SHUTDOWN_PENDING     = 5,
++	SCTP_SHUTDOWN_SENT        = 6,
++	SCTP_SHUTDOWN_RECEIVED    = 7,
++	SCTP_SHUTDOWN_ACK_SENT    = 8,
++};
++
++/*
++ * 8.2.6. Get the Current Identifiers of Associations
++ *        (SCTP_GET_ASSOC_ID_LIST)
++ *
++ * This option gets the current list of SCTP association identifiers of
++ * the SCTP associations handled by a one-to-many style socket.
++ */
++struct sctp_assoc_ids {
++	__u32		gaids_number_of_ids;
++	sctp_assoc_t	gaids_assoc_id[];
++};
++
++/*
++ * 8.3, 8.5 get all peer/local addresses in an association.
++ * This parameter struct is used by SCTP_GET_PEER_ADDRS and
++ * SCTP_GET_LOCAL_ADDRS socket options used internally to implement
++ * sctp_getpaddrs() and sctp_getladdrs() API.
++ */
++struct sctp_getaddrs_old {
++	sctp_assoc_t            assoc_id;
++	int			addr_num;
++	struct sockaddr		*addrs;
++};
++
++struct sctp_getaddrs {
++	sctp_assoc_t		assoc_id; /*input*/
++	__u32			addr_num; /*output*/
++	__u8			addrs[0]; /*output, variable size*/
++};
++
++/* A socket user request obtained via SCTP_GET_ASSOC_STATS that retrieves
++ * association stats. All stats are counts except sas_maxrto and
++ * sas_obs_rto_ipaddr. maxrto is the max observed rto + transport since
++ * the last call. Will return 0 when RTO was not update since last call
++ */
++struct sctp_assoc_stats {
++	sctp_assoc_t	sas_assoc_id;    /* Input */
++					 /* Transport of observed max RTO */
++	struct sockaddr_storage sas_obs_rto_ipaddr;
++	__u64		sas_maxrto;      /* Maximum Observed RTO for period */
++	__u64		sas_isacks;	 /* SACKs received */
++	__u64		sas_osacks;	 /* SACKs sent */
++	__u64		sas_opackets;	 /* Packets sent */
++	__u64		sas_ipackets;	 /* Packets received */
++	__u64		sas_rtxchunks;   /* Retransmitted Chunks */
++	__u64		sas_outofseqtsns;/* TSN received > next expected */
++	__u64		sas_idupchunks;  /* Dups received (ordered+unordered) */
++	__u64		sas_gapcnt;      /* Gap Acknowledgements Received */
++	__u64		sas_ouodchunks;  /* Unordered data chunks sent */
++	__u64		sas_iuodchunks;  /* Unordered data chunks received */
++	__u64		sas_oodchunks;	 /* Ordered data chunks sent */
++	__u64		sas_iodchunks;	 /* Ordered data chunks received */
++	__u64		sas_octrlchunks; /* Control chunks sent */
++	__u64		sas_ictrlchunks; /* Control chunks received */
++};
++
++/*
++ * 8.1 sctp_bindx()
++ *
++ * The flags parameter is formed from the bitwise OR of zero or more of the
++ * following currently defined flags:
++ */
++#define SCTP_BINDX_ADD_ADDR 0x01
++#define SCTP_BINDX_REM_ADDR 0x02
++
++/* This is the structure that is passed as an argument(optval) to
++ * getsockopt(SCTP_SOCKOPT_PEELOFF).
++ */
++typedef struct {
++	sctp_assoc_t associd;
++	int sd;
++} sctp_peeloff_arg_t;
++
++typedef struct {
++	sctp_peeloff_arg_t p_arg;
++	unsigned flags;
++} sctp_peeloff_flags_arg_t;
++
++/*
++ *  Peer Address Thresholds socket option
++ */
++struct sctp_paddrthlds {
++	sctp_assoc_t spt_assoc_id;
++	struct sockaddr_storage spt_address;
++	__u16 spt_pathmaxrxt;
++	__u16 spt_pathpfthld;
++};
++
++/*
++ * Socket Option for Getting the Association/Stream-Specific PR-SCTP Status
++ */
++struct sctp_prstatus {
++	sctp_assoc_t sprstat_assoc_id;
++	__u16 sprstat_sid;
++	__u16 sprstat_policy;
++	__u64 sprstat_abandoned_unsent;
++	__u64 sprstat_abandoned_sent;
++};
++
++struct sctp_default_prinfo {
++	sctp_assoc_t pr_assoc_id;
++	__u32 pr_value;
++	__u16 pr_policy;
++};
++
++struct sctp_info {
++	__u32	sctpi_tag;
++	__u32	sctpi_state;
++	__u32	sctpi_rwnd;
++	__u16	sctpi_unackdata;
++	__u16	sctpi_penddata;
++	__u16	sctpi_instrms;
++	__u16	sctpi_outstrms;
++	__u32	sctpi_fragmentation_point;
++	__u32	sctpi_inqueue;
++	__u32	sctpi_outqueue;
++	__u32	sctpi_overall_error;
++	__u32	sctpi_max_burst;
++	__u32	sctpi_maxseg;
++	__u32	sctpi_peer_rwnd;
++	__u32	sctpi_peer_tag;
++	__u8	sctpi_peer_capable;
++	__u8	sctpi_peer_sack;
++	__u16	__reserved1;
++
++	/* assoc status info */
++	__u64	sctpi_isacks;
++	__u64	sctpi_osacks;
++	__u64	sctpi_opackets;
++	__u64	sctpi_ipackets;
++	__u64	sctpi_rtxchunks;
++	__u64	sctpi_outofseqtsns;
++	__u64	sctpi_idupchunks;
++	__u64	sctpi_gapcnt;
++	__u64	sctpi_ouodchunks;
++	__u64	sctpi_iuodchunks;
++	__u64	sctpi_oodchunks;
++	__u64	sctpi_iodchunks;
++	__u64	sctpi_octrlchunks;
++	__u64	sctpi_ictrlchunks;
++
++	/* primary transport info */
++	struct sockaddr_storage	sctpi_p_address;
++	__s32	sctpi_p_state;
++	__u32	sctpi_p_cwnd;
++	__u32	sctpi_p_srtt;
++	__u32	sctpi_p_rto;
++	__u32	sctpi_p_hbinterval;
++	__u32	sctpi_p_pathmaxrxt;
++	__u32	sctpi_p_sackdelay;
++	__u32	sctpi_p_sackfreq;
++	__u32	sctpi_p_ssthresh;
++	__u32	sctpi_p_partial_bytes_acked;
++	__u32	sctpi_p_flight_size;
++	__u16	sctpi_p_error;
++	__u16	__reserved2;
++
++	/* sctp sock info */
++	__u32	sctpi_s_autoclose;
++	__u32	sctpi_s_adaptation_ind;
++	__u32	sctpi_s_pd_point;
++	__u8	sctpi_s_nodelay;
++	__u8	sctpi_s_disable_fragments;
++	__u8	sctpi_s_v4mapped;
++	__u8	sctpi_s_frag_interleave;
++	__u32	sctpi_s_type;
++	__u32	__reserved3;
++};
++
++struct sctp_reset_streams {
++	sctp_assoc_t srs_assoc_id;
++	uint16_t srs_flags;
++	uint16_t srs_number_streams;	/* 0 == ALL */
++	uint16_t srs_stream_list[];	/* list if srs_num_streams is not 0 */
++};
++
++struct sctp_add_streams {
++	sctp_assoc_t sas_assoc_id;
++	uint16_t sas_instrms;
++	uint16_t sas_outstrms;
++};
++
++#endif /* _SCTP_H */
+diff --git a/include/uapi/linux/seg6.h b/include/uapi/linux/seg6.h
+new file mode 100644
+index 0000000..0715279
+--- /dev/null
++++ b/include/uapi/linux/seg6.h
+@@ -0,0 +1,54 @@
++/*
++ *  SR-IPv6 implementation
++ *
++ *  Author:
++ *  David Lebrun <david.lebrun@uclouvain.be>
++ *
++ *
++ *  This program is free software; you can redistribute it and/or
++ *      modify it under the terms of the GNU General Public License
++ *      as published by the Free Software Foundation; either version
++ *      2 of the License, or (at your option) any later version.
++ */
++
++#ifndef _LINUX_SEG6_H
++#define _LINUX_SEG6_H
++
++#include <linux/types.h>
++#include <linux/in6.h>		/* For struct in6_addr. */
++
++/*
++ * SRH
++ */
++struct ipv6_sr_hdr {
++	__u8	nexthdr;
++	__u8	hdrlen;
++	__u8	type;
++	__u8	segments_left;
++	__u8	first_segment;
++	__u8	flags;
++	__u16	reserved;
++
++	struct in6_addr segments[0];
++};
++
++#define SR6_FLAG1_PROTECTED	(1 << 6)
++#define SR6_FLAG1_OAM		(1 << 5)
++#define SR6_FLAG1_ALERT		(1 << 4)
++#define SR6_FLAG1_HMAC		(1 << 3)
++
++#define SR6_TLV_INGRESS		1
++#define SR6_TLV_EGRESS		2
++#define SR6_TLV_OPAQUE		3
++#define SR6_TLV_PADDING		4
++#define SR6_TLV_HMAC		5
++
++#define sr_has_hmac(srh) ((srh)->flags & SR6_FLAG1_HMAC)
++
++struct sr6_tlv {
++	__u8 type;
++	__u8 len;
++	__u8 data[0];
++};
++
++#endif
+diff --git a/include/uapi/linux/seg6_genl.h b/include/uapi/linux/seg6_genl.h
+new file mode 100644
+index 0000000..99382f9
+--- /dev/null
++++ b/include/uapi/linux/seg6_genl.h
+@@ -0,0 +1,32 @@
++#ifndef _LINUX_SEG6_GENL_H
++#define _LINUX_SEG6_GENL_H
++
++#define SEG6_GENL_NAME		"SEG6"
++#define SEG6_GENL_VERSION	0x1
++
++enum {
++	SEG6_ATTR_UNSPEC,
++	SEG6_ATTR_DST,
++	SEG6_ATTR_DSTLEN,
++	SEG6_ATTR_HMACKEYID,
++	SEG6_ATTR_SECRET,
++	SEG6_ATTR_SECRETLEN,
++	SEG6_ATTR_ALGID,
++	SEG6_ATTR_HMACINFO,
++	__SEG6_ATTR_MAX,
++};
++
++#define SEG6_ATTR_MAX (__SEG6_ATTR_MAX - 1)
++
++enum {
++	SEG6_CMD_UNSPEC,
++	SEG6_CMD_SETHMAC,
++	SEG6_CMD_DUMPHMAC,
++	SEG6_CMD_SET_TUNSRC,
++	SEG6_CMD_GET_TUNSRC,
++	__SEG6_CMD_MAX,
++};
++
++#define SEG6_CMD_MAX (__SEG6_CMD_MAX - 1)
++
++#endif
+diff --git a/include/uapi/linux/seg6_hmac.h b/include/uapi/linux/seg6_hmac.h
+new file mode 100644
+index 0000000..704f93e
+--- /dev/null
++++ b/include/uapi/linux/seg6_hmac.h
+@@ -0,0 +1,22 @@
++#ifndef _LINUX_SEG6_HMAC_H
++#define _LINUX_SEG6_HMAC_H
++
++#include <linux/types.h>
++#include <linux/seg6.h>
++
++#define SEG6_HMAC_SECRET_LEN	64
++#define SEG6_HMAC_FIELD_LEN	32
++
++struct sr6_tlv_hmac {
++	struct sr6_tlv tlvhdr;
++	__u16 reserved;
++	__be32 hmackeyid;
++	__u8 hmac[SEG6_HMAC_FIELD_LEN];
++};
++
++enum {
++	SEG6_HMAC_ALGO_SHA1 = 1,
++	SEG6_HMAC_ALGO_SHA256 = 2,
++};
++
++#endif
+diff --git a/include/uapi/linux/seg6_iptunnel.h b/include/uapi/linux/seg6_iptunnel.h
+new file mode 100644
+index 0000000..a5dc05a
+--- /dev/null
++++ b/include/uapi/linux/seg6_iptunnel.h
+@@ -0,0 +1,40 @@
++/*
++ *  SR-IPv6 implementation
++ *
++ *  Author:
++ *  David Lebrun <david.lebrun@uclouvain.be>
++ *
++ *
++ *  This program is free software; you can redistribute it and/or
++ *      modify it under the terms of the GNU General Public License
++ *      as published by the Free Software Foundation; either version
++ *      2 of the License, or (at your option) any later version.
++ */
++
++#ifndef _LINUX_SEG6_IPTUNNEL_H
++#define _LINUX_SEG6_IPTUNNEL_H
++
++#include <linux/seg6.h>		/* For struct ipv6_sr_hdr. */
++
++enum {
++	SEG6_IPTUNNEL_UNSPEC,
++	SEG6_IPTUNNEL_SRH,
++	__SEG6_IPTUNNEL_MAX,
++};
++#define SEG6_IPTUNNEL_MAX (__SEG6_IPTUNNEL_MAX - 1)
++
++struct seg6_iptunnel_encap {
++	int mode;
++	struct ipv6_sr_hdr srh[0];
++};
++
++#define SEG6_IPTUN_ENCAP_SIZE(x) ((sizeof(*x)) + (((x)->srh->hdrlen + 1) << 3))
++
++enum {
++	SEG6_IPTUN_MODE_INLINE,
++	SEG6_IPTUN_MODE_ENCAP,
++	SEG6_IPTUN_MODE_L2ENCAP,
++};
++
++
++#endif
+diff --git a/include/uapi/linux/seg6_local.h b/include/uapi/linux/seg6_local.h
+new file mode 100644
+index 0000000..76b90d6
+--- /dev/null
++++ b/include/uapi/linux/seg6_local.h
+@@ -0,0 +1,68 @@
++/*
++ *  SR-IPv6 implementation
++ *
++ *  Author:
++ *  David Lebrun <david.lebrun@uclouvain.be>
++ *
++ *
++ *  This program is free software; you can redistribute it and/or
++ *      modify it under the terms of the GNU General Public License
++ *      as published by the Free Software Foundation; either version
++ *      2 of the License, or (at your option) any later version.
++ */
++
++#ifndef _LINUX_SEG6_LOCAL_H
++#define _LINUX_SEG6_LOCAL_H
++
++#include <linux/seg6.h>
++
++enum {
++	SEG6_LOCAL_UNSPEC,
++	SEG6_LOCAL_ACTION,
++	SEG6_LOCAL_SRH,
++	SEG6_LOCAL_TABLE,
++	SEG6_LOCAL_NH4,
++	SEG6_LOCAL_NH6,
++	SEG6_LOCAL_IIF,
++	SEG6_LOCAL_OIF,
++	__SEG6_LOCAL_MAX,
++};
++#define SEG6_LOCAL_MAX (__SEG6_LOCAL_MAX - 1)
++
++enum {
++	SEG6_LOCAL_ACTION_UNSPEC	= 0,
++	/* node segment */
++	SEG6_LOCAL_ACTION_END		= 1,
++	/* adjacency segment (IPv6 cross-connect) */
++	SEG6_LOCAL_ACTION_END_X		= 2,
++	/* lookup of next seg NH in table */
++	SEG6_LOCAL_ACTION_END_T		= 3,
++	/* decap and L2 cross-connect */
++	SEG6_LOCAL_ACTION_END_DX2	= 4,
++	/* decap and IPv6 cross-connect */
++	SEG6_LOCAL_ACTION_END_DX6	= 5,
++	/* decap and IPv4 cross-connect */
++	SEG6_LOCAL_ACTION_END_DX4	= 6,
++	/* decap and lookup of DA in v6 table */
++	SEG6_LOCAL_ACTION_END_DT6	= 7,
++	/* decap and lookup of DA in v4 table */
++	SEG6_LOCAL_ACTION_END_DT4	= 8,
++	/* binding segment with insertion */
++	SEG6_LOCAL_ACTION_END_B6	= 9,
++	/* binding segment with encapsulation */
++	SEG6_LOCAL_ACTION_END_B6_ENCAP	= 10,
++	/* binding segment with MPLS encap */
++	SEG6_LOCAL_ACTION_END_BM	= 11,
++	/* lookup last seg in table */
++	SEG6_LOCAL_ACTION_END_S		= 12,
++	/* forward to SR-unaware VNF with static proxy */
++	SEG6_LOCAL_ACTION_END_AS	= 13,
++	/* forward to SR-unaware VNF with masquerading */
++	SEG6_LOCAL_ACTION_END_AM	= 14,
++
++	__SEG6_LOCAL_ACTION_MAX,
++};
++
++#define SEG6_LOCAL_ACTION_MAX (__SEG6_LOCAL_ACTION_MAX - 1)
++
++#endif
+diff --git a/include/uapi/linux/sock_diag.h b/include/uapi/linux/sock_diag.h
+new file mode 100644
+index 0000000..901231e
+--- /dev/null
++++ b/include/uapi/linux/sock_diag.h
+@@ -0,0 +1,38 @@
++#ifndef __SOCK_DIAG_H__
++#define __SOCK_DIAG_H__
++
++#include <linux/types.h>
++
++#define SOCK_DIAG_BY_FAMILY 20
++#define SOCK_DESTROY 21
++
++struct sock_diag_req {
++	__u8	sdiag_family;
++	__u8	sdiag_protocol;
++};
++
++enum {
++	SK_MEMINFO_RMEM_ALLOC,
++	SK_MEMINFO_RCVBUF,
++	SK_MEMINFO_WMEM_ALLOC,
++	SK_MEMINFO_SNDBUF,
++	SK_MEMINFO_FWD_ALLOC,
++	SK_MEMINFO_WMEM_QUEUED,
++	SK_MEMINFO_OPTMEM,
++	SK_MEMINFO_BACKLOG,
++	SK_MEMINFO_DROPS,
++
++	SK_MEMINFO_VARS,
++};
++
++enum sknetlink_groups {
++	SKNLGRP_NONE,
++	SKNLGRP_INET_TCP_DESTROY,
++	SKNLGRP_INET_UDP_DESTROY,
++	SKNLGRP_INET6_TCP_DESTROY,
++	SKNLGRP_INET6_UDP_DESTROY,
++	__SKNLGRP_MAX,
++};
++#define SKNLGRP_MAX	(__SKNLGRP_MAX - 1)
++
++#endif /* __SOCK_DIAG_H__ */
+diff --git a/include/uapi/linux/socket.h b/include/uapi/linux/socket.h
+new file mode 100644
+index 0000000..8c1e501
+--- /dev/null
++++ b/include/uapi/linux/socket.h
+@@ -0,0 +1,21 @@
++#ifndef _LINUX_SOCKET_H
++#define _LINUX_SOCKET_H
++
++/*
++ * Desired design of maximum size and alignment (see RFC2553)
++ */
++#define _K_SS_MAXSIZE	128	/* Implementation specific max size */
++#define _K_SS_ALIGNSIZE	(__alignof__ (struct sockaddr *))
++				/* Implementation specific desired alignment */
++
++typedef unsigned short __kernel_sa_family_t;
++
++struct __kernel_sockaddr_storage {
++	__kernel_sa_family_t	ss_family;		/* address family */
++	/* Following field(s) are implementation specific */
++	char		__data[_K_SS_MAXSIZE - sizeof(unsigned short)];
++				/* space to achieve desired size, */
++				/* _SS_MAXSIZE value minus size of ss_family */
++} __attribute__ ((aligned(_K_SS_ALIGNSIZE)));	/* force desired alignment */
++
++#endif /* _LINUX_SOCKET_H */
+diff --git a/include/uapi/linux/sockios.h b/include/uapi/linux/sockios.h
+new file mode 100644
+index 0000000..79d029d
+--- /dev/null
++++ b/include/uapi/linux/sockios.h
+@@ -0,0 +1,152 @@
++/*
++ * INET		An implementation of the TCP/IP protocol suite for the LINUX
++ *		operating system.  INET is implemented using the  BSD Socket
++ *		interface as the means of communication with the user level.
++ *
++ *		Definitions of the socket-level I/O control calls.
++ *
++ * Version:	@(#)sockios.h	1.0.2	03/09/93
++ *
++ * Authors:	Ross Biro
++ *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
++ *
++ *		This program is free software; you can redistribute it and/or
++ *		modify it under the terms of the GNU General Public License
++ *		as published by the Free Software Foundation; either version
++ *		2 of the License, or (at your option) any later version.
++ */
++#ifndef _LINUX_SOCKIOS_H
++#define _LINUX_SOCKIOS_H
++
++#include <asm/sockios.h>
++
++/* Linux-specific socket ioctls */
++#define SIOCINQ		FIONREAD
++#define SIOCOUTQ	TIOCOUTQ        /* output queue size (not sent + not acked) */
++
++#define SOCK_IOC_TYPE	0x89
++
++/* Routing table calls. */
++#define SIOCADDRT	0x890B		/* add routing table entry	*/
++#define SIOCDELRT	0x890C		/* delete routing table entry	*/
++#define SIOCRTMSG	0x890D		/* unused			*/
++
++/* Socket configuration controls. */
++#define SIOCGIFNAME	0x8910		/* get iface name		*/
++#define SIOCSIFLINK	0x8911		/* set iface channel		*/
++#define SIOCGIFCONF	0x8912		/* get iface list		*/
++#define SIOCGIFFLAGS	0x8913		/* get flags			*/
++#define SIOCSIFFLAGS	0x8914		/* set flags			*/
++#define SIOCGIFADDR	0x8915		/* get PA address		*/
++#define SIOCSIFADDR	0x8916		/* set PA address		*/
++#define SIOCGIFDSTADDR	0x8917		/* get remote PA address	*/
++#define SIOCSIFDSTADDR	0x8918		/* set remote PA address	*/
++#define SIOCGIFBRDADDR	0x8919		/* get broadcast PA address	*/
++#define SIOCSIFBRDADDR	0x891a		/* set broadcast PA address	*/
++#define SIOCGIFNETMASK	0x891b		/* get network PA mask		*/
++#define SIOCSIFNETMASK	0x891c		/* set network PA mask		*/
++#define SIOCGIFMETRIC	0x891d		/* get metric			*/
++#define SIOCSIFMETRIC	0x891e		/* set metric			*/
++#define SIOCGIFMEM	0x891f		/* get memory address (BSD)	*/
++#define SIOCSIFMEM	0x8920		/* set memory address (BSD)	*/
++#define SIOCGIFMTU	0x8921		/* get MTU size			*/
++#define SIOCSIFMTU	0x8922		/* set MTU size			*/
++#define SIOCSIFNAME	0x8923		/* set interface name */
++#define	SIOCSIFHWADDR	0x8924		/* set hardware address 	*/
++#define SIOCGIFENCAP	0x8925		/* get/set encapsulations       */
++#define SIOCSIFENCAP	0x8926		
++#define SIOCGIFHWADDR	0x8927		/* Get hardware address		*/
++#define SIOCGIFSLAVE	0x8929		/* Driver slaving support	*/
++#define SIOCSIFSLAVE	0x8930
++#define SIOCADDMULTI	0x8931		/* Multicast address lists	*/
++#define SIOCDELMULTI	0x8932
++#define SIOCGIFINDEX	0x8933		/* name -> if_index mapping	*/
++#define SIOGIFINDEX	SIOCGIFINDEX	/* misprint compatibility :-)	*/
++#define SIOCSIFPFLAGS	0x8934		/* set/get extended flags set	*/
++#define SIOCGIFPFLAGS	0x8935
++#define SIOCDIFADDR	0x8936		/* delete PA address		*/
++#define	SIOCSIFHWBROADCAST	0x8937	/* set hardware broadcast addr	*/
++#define SIOCGIFCOUNT	0x8938		/* get number of devices */
++
++#define SIOCGIFBR	0x8940		/* Bridging support		*/
++#define SIOCSIFBR	0x8941		/* Set bridging options 	*/
++
++#define SIOCGIFTXQLEN	0x8942		/* Get the tx queue length	*/
++#define SIOCSIFTXQLEN	0x8943		/* Set the tx queue length 	*/
++
++/* SIOCGIFDIVERT was:	0x8944		Frame diversion support */
++/* SIOCSIFDIVERT was:	0x8945		Set frame diversion options */
++
++#define SIOCETHTOOL	0x8946		/* Ethtool interface		*/
++
++#define SIOCGMIIPHY	0x8947		/* Get address of MII PHY in use. */
++#define SIOCGMIIREG	0x8948		/* Read MII PHY register.	*/
++#define SIOCSMIIREG	0x8949		/* Write MII PHY register.	*/
++
++#define SIOCWANDEV	0x894A		/* get/set netdev parameters	*/
++
++#define SIOCOUTQNSD	0x894B		/* output queue size (not sent only) */
++#define SIOCGSKNS	0x894C		/* get socket network namespace */
++
++/* ARP cache control calls. */
++		    /*  0x8950 - 0x8952  * obsolete calls, don't re-use */
++#define SIOCDARP	0x8953		/* delete ARP table entry	*/
++#define SIOCGARP	0x8954		/* get ARP table entry		*/
++#define SIOCSARP	0x8955		/* set ARP table entry		*/
++
++/* RARP cache control calls. */
++#define SIOCDRARP	0x8960		/* delete RARP table entry	*/
++#define SIOCGRARP	0x8961		/* get RARP table entry		*/
++#define SIOCSRARP	0x8962		/* set RARP table entry		*/
++
++/* Driver configuration calls */
++
++#define SIOCGIFMAP	0x8970		/* Get device parameters	*/
++#define SIOCSIFMAP	0x8971		/* Set device parameters	*/
++
++/* DLCI configuration calls */
++
++#define SIOCADDDLCI	0x8980		/* Create new DLCI device	*/
++#define SIOCDELDLCI	0x8981		/* Delete DLCI device		*/
++
++#define SIOCGIFVLAN	0x8982		/* 802.1Q VLAN support		*/
++#define SIOCSIFVLAN	0x8983		/* Set 802.1Q VLAN options 	*/
++
++/* bonding calls */
++
++#define SIOCBONDENSLAVE	0x8990		/* enslave a device to the bond */
++#define SIOCBONDRELEASE 0x8991		/* release a slave from the bond*/
++#define SIOCBONDSETHWADDR      0x8992	/* set the hw addr of the bond  */
++#define SIOCBONDSLAVEINFOQUERY 0x8993   /* rtn info about slave state   */
++#define SIOCBONDINFOQUERY      0x8994	/* rtn info about bond state    */
++#define SIOCBONDCHANGEACTIVE   0x8995   /* update to a new active slave */
++			
++/* bridge calls */
++#define SIOCBRADDBR     0x89a0		/* create new bridge device     */
++#define SIOCBRDELBR     0x89a1		/* remove bridge device         */
++#define SIOCBRADDIF	0x89a2		/* add interface to bridge      */
++#define SIOCBRDELIF	0x89a3		/* remove interface from bridge */
++
++/* hardware time stamping: parameters in linux/net_tstamp.h */
++#define SIOCSHWTSTAMP	0x89b0		/* set and get config		*/
++#define SIOCGHWTSTAMP	0x89b1		/* get config			*/
++
++/* Device private ioctl calls */
++
++/*
++ *	These 16 ioctls are available to devices via the do_ioctl() device
++ *	vector. Each device should include this file and redefine these names
++ *	as their own. Because these are device dependent it is a good idea
++ *	_NOT_ to issue them to random objects and hope.
++ *
++ *	THESE IOCTLS ARE _DEPRECATED_ AND WILL DISAPPEAR IN 2.5.X -DaveM
++ */
++ 
++#define SIOCDEVPRIVATE	0x89F0	/* to 89FF */
++
++/*
++ *	These 16 ioctl calls are protocol private
++ */
++ 
++#define SIOCPROTOPRIVATE 0x89E0 /* to 89EF */
++#endif	/* _LINUX_SOCKIOS_H */
+diff --git a/include/uapi/linux/stddef.h b/include/uapi/linux/stddef.h
+new file mode 100644
+index 0000000..4bb69de
+--- /dev/null
++++ b/include/uapi/linux/stddef.h
+@@ -0,0 +1,5 @@
++
++
++#ifndef __always_inline
++#define __always_inline __inline__
++#endif
+diff --git a/include/uapi/linux/sysinfo.h b/include/uapi/linux/sysinfo.h
+new file mode 100644
+index 0000000..934335a
+--- /dev/null
++++ b/include/uapi/linux/sysinfo.h
+@@ -0,0 +1,24 @@
++#ifndef _LINUX_SYSINFO_H
++#define _LINUX_SYSINFO_H
++
++#include <linux/types.h>
++
++#define SI_LOAD_SHIFT	16
++struct sysinfo {
++	__kernel_long_t uptime;		/* Seconds since boot */
++	__kernel_ulong_t loads[3];	/* 1, 5, and 15 minute load averages */
++	__kernel_ulong_t totalram;	/* Total usable main memory size */
++	__kernel_ulong_t freeram;	/* Available memory size */
++	__kernel_ulong_t sharedram;	/* Amount of shared memory */
++	__kernel_ulong_t bufferram;	/* Memory used by buffers */
++	__kernel_ulong_t totalswap;	/* Total swap space size */
++	__kernel_ulong_t freeswap;	/* swap space still available */
++	__u16 procs;		   	/* Number of current processes */
++	__u16 pad;		   	/* Explicit padding for m68k */
++	__kernel_ulong_t totalhigh;	/* Total high memory size */
++	__kernel_ulong_t freehigh;	/* Available high memory size */
++	__u32 mem_unit;			/* Memory unit size in bytes */
++	char _f[20-2*sizeof(__kernel_ulong_t)-sizeof(__u32)];	/* Padding: libc5 uses this.. */
++};
++
++#endif /* _LINUX_SYSINFO_H */
+diff --git a/include/uapi/linux/tc_act/tc_bpf.h b/include/uapi/linux/tc_act/tc_bpf.h
+new file mode 100644
+index 0000000..8dc2ac0
+--- /dev/null
++++ b/include/uapi/linux/tc_act/tc_bpf.h
+@@ -0,0 +1,36 @@
++/*
++ * Copyright (c) 2015 Jiri Pirko <jiri@resnulli.us>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ */
++
++#ifndef __LINUX_TC_BPF_H
++#define __LINUX_TC_BPF_H
++
++#include <linux/pkt_cls.h>
++
++#define TCA_ACT_BPF 13
++
++struct tc_act_bpf {
++	tc_gen;
++};
++
++enum {
++	TCA_ACT_BPF_UNSPEC,
++	TCA_ACT_BPF_TM,
++	TCA_ACT_BPF_PARMS,
++	TCA_ACT_BPF_OPS_LEN,
++	TCA_ACT_BPF_OPS,
++	TCA_ACT_BPF_FD,
++	TCA_ACT_BPF_NAME,
++	TCA_ACT_BPF_PAD,
++	TCA_ACT_BPF_TAG,
++	TCA_ACT_BPF_ID,
++	__TCA_ACT_BPF_MAX,
++};
++#define TCA_ACT_BPF_MAX (__TCA_ACT_BPF_MAX - 1)
++
++#endif
+diff --git a/include/uapi/linux/tc_act/tc_connmark.h b/include/uapi/linux/tc_act/tc_connmark.h
+new file mode 100644
+index 0000000..62a5e94
+--- /dev/null
++++ b/include/uapi/linux/tc_act/tc_connmark.h
+@@ -0,0 +1,23 @@
++#ifndef __UAPI_TC_CONNMARK_H
++#define __UAPI_TC_CONNMARK_H
++
++#include <linux/types.h>
++#include <linux/pkt_cls.h>
++
++#define TCA_ACT_CONNMARK 14
++
++struct tc_connmark {
++	tc_gen;
++	__u16 zone;
++};
++
++enum {
++	TCA_CONNMARK_UNSPEC,
++	TCA_CONNMARK_PARMS,
++	TCA_CONNMARK_TM,
++	TCA_CONNMARK_PAD,
++	__TCA_CONNMARK_MAX
++};
++#define TCA_CONNMARK_MAX (__TCA_CONNMARK_MAX - 1)
++
++#endif
+diff --git a/include/uapi/linux/tc_act/tc_csum.h b/include/uapi/linux/tc_act/tc_csum.h
+new file mode 100644
+index 0000000..a11bb35
+--- /dev/null
++++ b/include/uapi/linux/tc_act/tc_csum.h
+@@ -0,0 +1,34 @@
++#ifndef __LINUX_TC_CSUM_H
++#define __LINUX_TC_CSUM_H
++
++#include <linux/types.h>
++#include <linux/pkt_cls.h>
++
++#define TCA_ACT_CSUM 16
++
++enum {
++	TCA_CSUM_UNSPEC,
++	TCA_CSUM_PARMS,
++	TCA_CSUM_TM,
++	TCA_CSUM_PAD,
++	__TCA_CSUM_MAX
++};
++#define TCA_CSUM_MAX (__TCA_CSUM_MAX - 1)
++
++enum {
++	TCA_CSUM_UPDATE_FLAG_IPV4HDR = 1,
++	TCA_CSUM_UPDATE_FLAG_ICMP    = 2,
++	TCA_CSUM_UPDATE_FLAG_IGMP    = 4,
++	TCA_CSUM_UPDATE_FLAG_TCP     = 8,
++	TCA_CSUM_UPDATE_FLAG_UDP     = 16,
++	TCA_CSUM_UPDATE_FLAG_UDPLITE = 32,
++	TCA_CSUM_UPDATE_FLAG_SCTP    = 64,
++};
++
++struct tc_csum {
++	tc_gen;
++
++	__u32 update_flags;
++};
++
++#endif /* __LINUX_TC_CSUM_H */
+diff --git a/include/uapi/linux/tc_act/tc_defact.h b/include/uapi/linux/tc_act/tc_defact.h
+new file mode 100644
+index 0000000..d2a3abb
+--- /dev/null
++++ b/include/uapi/linux/tc_act/tc_defact.h
+@@ -0,0 +1,20 @@
++#ifndef __LINUX_TC_DEF_H
++#define __LINUX_TC_DEF_H
++
++#include <linux/pkt_cls.h>
++
++struct tc_defact {
++	tc_gen;
++};
++
++enum {
++	TCA_DEF_UNSPEC,
++	TCA_DEF_TM,
++	TCA_DEF_PARMS,
++	TCA_DEF_DATA,
++	TCA_DEF_PAD,
++	__TCA_DEF_MAX
++};
++#define TCA_DEF_MAX (__TCA_DEF_MAX - 1)
++
++#endif
+diff --git a/include/uapi/linux/tc_act/tc_gact.h b/include/uapi/linux/tc_act/tc_gact.h
+new file mode 100644
+index 0000000..70b536a
+--- /dev/null
++++ b/include/uapi/linux/tc_act/tc_gact.h
+@@ -0,0 +1,33 @@
++#ifndef __LINUX_TC_GACT_H
++#define __LINUX_TC_GACT_H
++
++#include <linux/types.h>
++#include <linux/pkt_cls.h>
++
++#define TCA_ACT_GACT 5
++struct tc_gact {
++	tc_gen;
++
++};
++
++struct tc_gact_p {
++#define PGACT_NONE              0
++#define PGACT_NETRAND           1
++#define PGACT_DETERM            2
++#define MAX_RAND                (PGACT_DETERM + 1 )
++	__u16                 ptype;
++	__u16                 pval;
++	int                   paction;
++};
++ 
++enum {
++	TCA_GACT_UNSPEC,
++	TCA_GACT_TM,
++	TCA_GACT_PARMS,
++	TCA_GACT_PROB,
++	TCA_GACT_PAD,
++	__TCA_GACT_MAX
++};
++#define TCA_GACT_MAX (__TCA_GACT_MAX - 1)
++ 
++#endif
+diff --git a/include/uapi/linux/tc_act/tc_ife.h b/include/uapi/linux/tc_act/tc_ife.h
+new file mode 100644
+index 0000000..7c28178
+--- /dev/null
++++ b/include/uapi/linux/tc_act/tc_ife.h
+@@ -0,0 +1,32 @@
++#ifndef __UAPI_TC_IFE_H
++#define __UAPI_TC_IFE_H
++
++#include <linux/types.h>
++#include <linux/pkt_cls.h>
++#include <linux/ife.h>
++
++#define TCA_ACT_IFE 25
++/* Flag bits for now just encoding/decoding; mutually exclusive */
++#define IFE_ENCODE 1
++#define IFE_DECODE 0
++
++struct tc_ife {
++	tc_gen;
++	__u16 flags;
++};
++
++/*XXX: We need to encode the total number of bytes consumed */
++enum {
++	TCA_IFE_UNSPEC,
++	TCA_IFE_PARMS,
++	TCA_IFE_TM,
++	TCA_IFE_DMAC,
++	TCA_IFE_SMAC,
++	TCA_IFE_TYPE,
++	TCA_IFE_METALST,
++	TCA_IFE_PAD,
++	__TCA_IFE_MAX
++};
++#define TCA_IFE_MAX (__TCA_IFE_MAX - 1)
++
++#endif
+diff --git a/include/uapi/linux/tc_act/tc_ipt.h b/include/uapi/linux/tc_act/tc_ipt.h
+new file mode 100644
+index 0000000..7c6e155
+--- /dev/null
++++ b/include/uapi/linux/tc_act/tc_ipt.h
+@@ -0,0 +1,22 @@
++#ifndef __LINUX_TC_IPT_H
++#define __LINUX_TC_IPT_H
++
++#include <linux/pkt_cls.h>
++
++#define TCA_ACT_IPT 6
++#define TCA_ACT_XT 10
++
++enum {
++	TCA_IPT_UNSPEC,
++	TCA_IPT_TABLE,
++	TCA_IPT_HOOK,
++	TCA_IPT_INDEX,
++	TCA_IPT_CNT,
++	TCA_IPT_TM,
++	TCA_IPT_TARG,
++	TCA_IPT_PAD,
++	__TCA_IPT_MAX
++};
++#define TCA_IPT_MAX (__TCA_IPT_MAX - 1)
++                                                                                
++#endif
+diff --git a/include/uapi/linux/tc_act/tc_mirred.h b/include/uapi/linux/tc_act/tc_mirred.h
+new file mode 100644
+index 0000000..3d7a2b3
+--- /dev/null
++++ b/include/uapi/linux/tc_act/tc_mirred.h
+@@ -0,0 +1,28 @@
++#ifndef __LINUX_TC_MIR_H
++#define __LINUX_TC_MIR_H
++
++#include <linux/types.h>
++#include <linux/pkt_cls.h>
++
++#define TCA_ACT_MIRRED 8
++#define TCA_EGRESS_REDIR 1  /* packet redirect to EGRESS*/
++#define TCA_EGRESS_MIRROR 2 /* mirror packet to EGRESS */
++#define TCA_INGRESS_REDIR 3  /* packet redirect to INGRESS*/
++#define TCA_INGRESS_MIRROR 4 /* mirror packet to INGRESS */
++                                                                                
++struct tc_mirred {
++	tc_gen;
++	int                     eaction;   /* one of IN/EGRESS_MIRROR/REDIR */
++	__u32                   ifindex;  /* ifindex of egress port */
++};
++                                                                                
++enum {
++	TCA_MIRRED_UNSPEC,
++	TCA_MIRRED_TM,
++	TCA_MIRRED_PARMS,
++	TCA_MIRRED_PAD,
++	__TCA_MIRRED_MAX
++};
++#define TCA_MIRRED_MAX (__TCA_MIRRED_MAX - 1)
++                                                                                
++#endif
+diff --git a/include/uapi/linux/tc_act/tc_nat.h b/include/uapi/linux/tc_act/tc_nat.h
+new file mode 100644
+index 0000000..923457c
+--- /dev/null
++++ b/include/uapi/linux/tc_act/tc_nat.h
+@@ -0,0 +1,28 @@
++#ifndef __LINUX_TC_NAT_H
++#define __LINUX_TC_NAT_H
++
++#include <linux/pkt_cls.h>
++#include <linux/types.h>
++
++#define TCA_ACT_NAT 9
++
++enum {
++	TCA_NAT_UNSPEC,
++	TCA_NAT_PARMS,
++	TCA_NAT_TM,
++	TCA_NAT_PAD,
++	__TCA_NAT_MAX
++};
++#define TCA_NAT_MAX (__TCA_NAT_MAX - 1)
++
++#define TCA_NAT_FLAG_EGRESS 1
++
++struct tc_nat {
++	tc_gen;
++	__be32 old_addr;
++	__be32 new_addr;
++	__be32 mask;
++	__u32 flags;
++};
++
++#endif
+diff --git a/include/uapi/linux/tc_act/tc_pedit.h b/include/uapi/linux/tc_act/tc_pedit.h
+new file mode 100644
+index 0000000..143d2b3
+--- /dev/null
++++ b/include/uapi/linux/tc_act/tc_pedit.h
+@@ -0,0 +1,66 @@
++#ifndef __LINUX_TC_PED_H
++#define __LINUX_TC_PED_H
++
++#include <linux/types.h>
++#include <linux/pkt_cls.h>
++
++#define TCA_ACT_PEDIT 7
++
++enum {
++	TCA_PEDIT_UNSPEC,
++	TCA_PEDIT_TM,
++	TCA_PEDIT_PARMS,
++	TCA_PEDIT_PAD,
++	TCA_PEDIT_PARMS_EX,
++	TCA_PEDIT_KEYS_EX,
++	TCA_PEDIT_KEY_EX,
++	__TCA_PEDIT_MAX
++};
++#define TCA_PEDIT_MAX (__TCA_PEDIT_MAX - 1)
++                                                                                
++enum {
++	TCA_PEDIT_KEY_EX_HTYPE = 1,
++	TCA_PEDIT_KEY_EX_CMD = 2,
++	__TCA_PEDIT_KEY_EX_MAX
++};
++#define TCA_PEDIT_KEY_EX_MAX (__TCA_PEDIT_KEY_EX_MAX - 1)
++
++ /* TCA_PEDIT_KEY_EX_HDR_TYPE_NETWROK is a special case for legacy users. It
++  * means no specific header type - offset is relative to the network layer
++  */
++enum pedit_header_type {
++	TCA_PEDIT_KEY_EX_HDR_TYPE_NETWORK = 0,
++	TCA_PEDIT_KEY_EX_HDR_TYPE_ETH = 1,
++	TCA_PEDIT_KEY_EX_HDR_TYPE_IP4 = 2,
++	TCA_PEDIT_KEY_EX_HDR_TYPE_IP6 = 3,
++	TCA_PEDIT_KEY_EX_HDR_TYPE_TCP = 4,
++	TCA_PEDIT_KEY_EX_HDR_TYPE_UDP = 5,
++	__PEDIT_HDR_TYPE_MAX,
++};
++#define TCA_PEDIT_HDR_TYPE_MAX (__PEDIT_HDR_TYPE_MAX - 1)
++
++enum pedit_cmd {
++	TCA_PEDIT_KEY_EX_CMD_SET = 0,
++	TCA_PEDIT_KEY_EX_CMD_ADD = 1,
++	__PEDIT_CMD_MAX,
++};
++#define TCA_PEDIT_CMD_MAX (__PEDIT_CMD_MAX - 1)
++
++struct tc_pedit_key {
++	__u32           mask;  /* AND */
++	__u32           val;   /*XOR */
++	__u32           off;  /*offset */
++	__u32           at;
++	__u32           offmask;
++	__u32           shift;
++};
++                                                                                
++struct tc_pedit_sel {
++	tc_gen;
++	unsigned char           nkeys;
++	unsigned char           flags;
++	struct tc_pedit_key     keys[0];
++};
++#define tc_pedit tc_pedit_sel
++
++#endif
+diff --git a/include/uapi/linux/tc_act/tc_sample.h b/include/uapi/linux/tc_act/tc_sample.h
+new file mode 100644
+index 0000000..edc9058
+--- /dev/null
++++ b/include/uapi/linux/tc_act/tc_sample.h
+@@ -0,0 +1,26 @@
++#ifndef __LINUX_TC_SAMPLE_H
++#define __LINUX_TC_SAMPLE_H
++
++#include <linux/types.h>
++#include <linux/pkt_cls.h>
++#include <linux/if_ether.h>
++
++#define TCA_ACT_SAMPLE 26
++
++struct tc_sample {
++	tc_gen;
++};
++
++enum {
++	TCA_SAMPLE_UNSPEC,
++	TCA_SAMPLE_TM,
++	TCA_SAMPLE_PARMS,
++	TCA_SAMPLE_RATE,
++	TCA_SAMPLE_TRUNC_SIZE,
++	TCA_SAMPLE_PSAMPLE_GROUP,
++	TCA_SAMPLE_PAD,
++	__TCA_SAMPLE_MAX
++};
++#define TCA_SAMPLE_MAX (__TCA_SAMPLE_MAX - 1)
++
++#endif
+diff --git a/include/uapi/linux/tc_act/tc_skbedit.h b/include/uapi/linux/tc_act/tc_skbedit.h
+new file mode 100644
+index 0000000..2884425
+--- /dev/null
++++ b/include/uapi/linux/tc_act/tc_skbedit.h
+@@ -0,0 +1,51 @@
++/*
++ * Copyright (c) 2008, Intel Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
++ * more details.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
++ * Place - Suite 330, Boston, MA 02111-1307 USA.
++ *
++ * Author: Alexander Duyck <alexander.h.duyck@intel.com>
++ */
++
++#ifndef __LINUX_TC_SKBEDIT_H
++#define __LINUX_TC_SKBEDIT_H
++
++#include <linux/pkt_cls.h>
++
++#define TCA_ACT_SKBEDIT 11
++
++#define SKBEDIT_F_PRIORITY		0x1
++#define SKBEDIT_F_QUEUE_MAPPING		0x2
++#define SKBEDIT_F_MARK			0x4
++#define SKBEDIT_F_PTYPE			0x8
++#define SKBEDIT_F_MASK			0x10
++
++struct tc_skbedit {
++	tc_gen;
++};
++
++enum {
++	TCA_SKBEDIT_UNSPEC,
++	TCA_SKBEDIT_TM,
++	TCA_SKBEDIT_PARMS,
++	TCA_SKBEDIT_PRIORITY,
++	TCA_SKBEDIT_QUEUE_MAPPING,
++	TCA_SKBEDIT_MARK,
++	TCA_SKBEDIT_PAD,
++	TCA_SKBEDIT_PTYPE,
++	TCA_SKBEDIT_MASK,
++	__TCA_SKBEDIT_MAX
++};
++#define TCA_SKBEDIT_MAX (__TCA_SKBEDIT_MAX - 1)
++
++#endif
+diff --git a/include/uapi/linux/tc_act/tc_skbmod.h b/include/uapi/linux/tc_act/tc_skbmod.h
+new file mode 100644
+index 0000000..10fc07d
+--- /dev/null
++++ b/include/uapi/linux/tc_act/tc_skbmod.h
+@@ -0,0 +1,39 @@
++/*
++ * Copyright (c) 2016, Jamal Hadi Salim
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++*/
++
++#ifndef __LINUX_TC_SKBMOD_H
++#define __LINUX_TC_SKBMOD_H
++
++#include <linux/pkt_cls.h>
++
++#define TCA_ACT_SKBMOD 15
++
++#define SKBMOD_F_DMAC	0x1
++#define SKBMOD_F_SMAC	0x2
++#define SKBMOD_F_ETYPE	0x4
++#define SKBMOD_F_SWAPMAC 0x8
++
++struct tc_skbmod {
++	tc_gen;
++	__u64 flags;
++};
++
++enum {
++	TCA_SKBMOD_UNSPEC,
++	TCA_SKBMOD_TM,
++	TCA_SKBMOD_PARMS,
++	TCA_SKBMOD_DMAC,
++	TCA_SKBMOD_SMAC,
++	TCA_SKBMOD_ETYPE,
++	TCA_SKBMOD_PAD,
++	__TCA_SKBMOD_MAX
++};
++#define TCA_SKBMOD_MAX (__TCA_SKBMOD_MAX - 1)
++
++#endif
+diff --git a/include/uapi/linux/tc_act/tc_tunnel_key.h b/include/uapi/linux/tc_act/tc_tunnel_key.h
+new file mode 100644
+index 0000000..afcd4be
+--- /dev/null
++++ b/include/uapi/linux/tc_act/tc_tunnel_key.h
+@@ -0,0 +1,43 @@
++/*
++ * Copyright (c) 2016, Amir Vadai <amir@vadai.me>
++ * Copyright (c) 2016, Mellanox Technologies. All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ */
++
++#ifndef __LINUX_TC_TUNNEL_KEY_H
++#define __LINUX_TC_TUNNEL_KEY_H
++
++#include <linux/pkt_cls.h>
++
++#define TCA_ACT_TUNNEL_KEY 17
++
++#define TCA_TUNNEL_KEY_ACT_SET	    1
++#define TCA_TUNNEL_KEY_ACT_RELEASE  2
++
++struct tc_tunnel_key {
++	tc_gen;
++	int t_action;
++};
++
++enum {
++	TCA_TUNNEL_KEY_UNSPEC,
++	TCA_TUNNEL_KEY_TM,
++	TCA_TUNNEL_KEY_PARMS,
++	TCA_TUNNEL_KEY_ENC_IPV4_SRC,	/* be32 */
++	TCA_TUNNEL_KEY_ENC_IPV4_DST,	/* be32 */
++	TCA_TUNNEL_KEY_ENC_IPV6_SRC,	/* struct in6_addr */
++	TCA_TUNNEL_KEY_ENC_IPV6_DST,	/* struct in6_addr */
++	TCA_TUNNEL_KEY_ENC_KEY_ID,	/* be64 */
++	TCA_TUNNEL_KEY_PAD,
++	TCA_TUNNEL_KEY_ENC_DST_PORT,	/* be16 */
++	TCA_TUNNEL_KEY_NO_CSUM,		/* u8 */
++	__TCA_TUNNEL_KEY_MAX,
++};
++
++#define TCA_TUNNEL_KEY_MAX (__TCA_TUNNEL_KEY_MAX - 1)
++
++#endif
+diff --git a/include/uapi/linux/tc_act/tc_vlan.h b/include/uapi/linux/tc_act/tc_vlan.h
+new file mode 100644
+index 0000000..bddb272
+--- /dev/null
++++ b/include/uapi/linux/tc_act/tc_vlan.h
+@@ -0,0 +1,38 @@
++/*
++ * Copyright (c) 2014 Jiri Pirko <jiri@resnulli.us>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ */
++
++#ifndef __LINUX_TC_VLAN_H
++#define __LINUX_TC_VLAN_H
++
++#include <linux/pkt_cls.h>
++
++#define TCA_ACT_VLAN 12
++
++#define TCA_VLAN_ACT_POP	1
++#define TCA_VLAN_ACT_PUSH	2
++#define TCA_VLAN_ACT_MODIFY	3
++
++struct tc_vlan {
++	tc_gen;
++	int v_action;
++};
++
++enum {
++	TCA_VLAN_UNSPEC,
++	TCA_VLAN_TM,
++	TCA_VLAN_PARMS,
++	TCA_VLAN_PUSH_VLAN_ID,
++	TCA_VLAN_PUSH_VLAN_PROTOCOL,
++	TCA_VLAN_PAD,
++	TCA_VLAN_PUSH_VLAN_PRIORITY,
++	__TCA_VLAN_MAX,
++};
++#define TCA_VLAN_MAX (__TCA_VLAN_MAX - 1)
++
++#endif
+diff --git a/include/uapi/linux/tc_ematch/tc_em_cmp.h b/include/uapi/linux/tc_ematch/tc_em_cmp.h
+new file mode 100644
+index 0000000..f34bb1b
+--- /dev/null
++++ b/include/uapi/linux/tc_ematch/tc_em_cmp.h
+@@ -0,0 +1,25 @@
++#ifndef __LINUX_TC_EM_CMP_H
++#define __LINUX_TC_EM_CMP_H
++
++#include <linux/types.h>
++#include <linux/pkt_cls.h>
++
++struct tcf_em_cmp {
++	__u32		val;
++	__u32		mask;
++	__u16		off;
++	__u8		align:4;
++	__u8		flags:4;
++	__u8		layer:4;
++	__u8		opnd:4;
++};
++
++enum {
++	TCF_EM_ALIGN_U8  = 1,
++	TCF_EM_ALIGN_U16 = 2,
++	TCF_EM_ALIGN_U32 = 4
++};
++
++#define TCF_EM_CMP_TRANS	1
++
++#endif
+diff --git a/include/uapi/linux/tc_ematch/tc_em_meta.h b/include/uapi/linux/tc_ematch/tc_em_meta.h
+new file mode 100644
+index 0000000..b11f8ce
+--- /dev/null
++++ b/include/uapi/linux/tc_ematch/tc_em_meta.h
+@@ -0,0 +1,92 @@
++#ifndef __LINUX_TC_EM_META_H
++#define __LINUX_TC_EM_META_H
++
++#include <linux/types.h>
++#include <linux/pkt_cls.h>
++
++enum {
++	TCA_EM_META_UNSPEC,
++	TCA_EM_META_HDR,
++	TCA_EM_META_LVALUE,
++	TCA_EM_META_RVALUE,
++	__TCA_EM_META_MAX
++};
++#define TCA_EM_META_MAX (__TCA_EM_META_MAX - 1)
++
++struct tcf_meta_val {
++	__u16			kind;
++	__u8			shift;
++	__u8			op;
++};
++
++#define TCF_META_TYPE_MASK	(0xf << 12)
++#define TCF_META_TYPE(kind)	(((kind) & TCF_META_TYPE_MASK) >> 12)
++#define TCF_META_ID_MASK	0x7ff
++#define TCF_META_ID(kind)	((kind) & TCF_META_ID_MASK)
++
++enum {
++	TCF_META_TYPE_VAR,
++	TCF_META_TYPE_INT,
++	__TCF_META_TYPE_MAX
++};
++#define TCF_META_TYPE_MAX (__TCF_META_TYPE_MAX - 1)
++
++enum {
++	TCF_META_ID_VALUE,
++	TCF_META_ID_RANDOM,
++	TCF_META_ID_LOADAVG_0,
++	TCF_META_ID_LOADAVG_1,
++	TCF_META_ID_LOADAVG_2,
++	TCF_META_ID_DEV,
++	TCF_META_ID_PRIORITY,
++	TCF_META_ID_PROTOCOL,
++	TCF_META_ID_PKTTYPE,
++	TCF_META_ID_PKTLEN,
++	TCF_META_ID_DATALEN,
++	TCF_META_ID_MACLEN,
++	TCF_META_ID_NFMARK,
++	TCF_META_ID_TCINDEX,
++	TCF_META_ID_RTCLASSID,
++	TCF_META_ID_RTIIF,
++	TCF_META_ID_SK_FAMILY,
++	TCF_META_ID_SK_STATE,
++	TCF_META_ID_SK_REUSE,
++	TCF_META_ID_SK_BOUND_IF,
++	TCF_META_ID_SK_REFCNT,
++	TCF_META_ID_SK_SHUTDOWN,
++	TCF_META_ID_SK_PROTO,
++	TCF_META_ID_SK_TYPE,
++	TCF_META_ID_SK_RCVBUF,
++	TCF_META_ID_SK_RMEM_ALLOC,
++	TCF_META_ID_SK_WMEM_ALLOC,
++	TCF_META_ID_SK_OMEM_ALLOC,
++	TCF_META_ID_SK_WMEM_QUEUED,
++	TCF_META_ID_SK_RCV_QLEN,
++	TCF_META_ID_SK_SND_QLEN,
++ 	TCF_META_ID_SK_ERR_QLEN,
++	TCF_META_ID_SK_FORWARD_ALLOCS,
++	TCF_META_ID_SK_SNDBUF,
++ 	TCF_META_ID_SK_ALLOCS,
++	__TCF_META_ID_SK_ROUTE_CAPS,	/* unimplemented but in ABI already */
++ 	TCF_META_ID_SK_HASH,
++ 	TCF_META_ID_SK_LINGERTIME,
++ 	TCF_META_ID_SK_ACK_BACKLOG,
++ 	TCF_META_ID_SK_MAX_ACK_BACKLOG,
++ 	TCF_META_ID_SK_PRIO,
++ 	TCF_META_ID_SK_RCVLOWAT,
++ 	TCF_META_ID_SK_RCVTIMEO,
++ 	TCF_META_ID_SK_SNDTIMEO,
++ 	TCF_META_ID_SK_SENDMSG_OFF,
++ 	TCF_META_ID_SK_WRITE_PENDING,
++	TCF_META_ID_VLAN_TAG,
++	TCF_META_ID_RXHASH,
++	__TCF_META_ID_MAX
++};
++#define TCF_META_ID_MAX (__TCF_META_ID_MAX - 1)
++
++struct tcf_meta_hdr {
++	struct tcf_meta_val	left;
++	struct tcf_meta_val	right;
++};
++
++#endif
+diff --git a/include/uapi/linux/tc_ematch/tc_em_nbyte.h b/include/uapi/linux/tc_ematch/tc_em_nbyte.h
+new file mode 100644
+index 0000000..7172cfb
+--- /dev/null
++++ b/include/uapi/linux/tc_ematch/tc_em_nbyte.h
+@@ -0,0 +1,13 @@
++#ifndef __LINUX_TC_EM_NBYTE_H
++#define __LINUX_TC_EM_NBYTE_H
++
++#include <linux/types.h>
++#include <linux/pkt_cls.h>
++
++struct tcf_em_nbyte {
++	__u16		off;
++	__u16		len:12;
++	__u8		layer:4;
++};
++
++#endif
+diff --git a/include/uapi/linux/tcp.h b/include/uapi/linux/tcp.h
+new file mode 100644
+index 0000000..8edad3f
+--- /dev/null
++++ b/include/uapi/linux/tcp.h
+@@ -0,0 +1,268 @@
++/*
++ * INET		An implementation of the TCP/IP protocol suite for the LINUX
++ *		operating system.  INET is implemented using the  BSD Socket
++ *		interface as the means of communication with the user level.
++ *
++ *		Definitions for the TCP protocol.
++ *
++ * Version:	@(#)tcp.h	1.0.2	04/28/93
++ *
++ * Author:	Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
++ *
++ *		This program is free software; you can redistribute it and/or
++ *		modify it under the terms of the GNU General Public License
++ *		as published by the Free Software Foundation; either version
++ *		2 of the License, or (at your option) any later version.
++ */
++#ifndef _LINUX_TCP_H
++#define _LINUX_TCP_H
++
++#include <linux/types.h>
++#include <asm/byteorder.h>
++#include <linux/socket.h>
++
++struct tcphdr {
++	__be16	source;
++	__be16	dest;
++	__be32	seq;
++	__be32	ack_seq;
++#if defined(__LITTLE_ENDIAN_BITFIELD)
++	__u16	res1:4,
++		doff:4,
++		fin:1,
++		syn:1,
++		rst:1,
++		psh:1,
++		ack:1,
++		urg:1,
++		ece:1,
++		cwr:1;
++#elif defined(__BIG_ENDIAN_BITFIELD)
++	__u16	doff:4,
++		res1:4,
++		cwr:1,
++		ece:1,
++		urg:1,
++		ack:1,
++		psh:1,
++		rst:1,
++		syn:1,
++		fin:1;
++#else
++#error	"Adjust your <asm/byteorder.h> defines"
++#endif	
++	__be16	window;
++	__sum16	check;
++	__be16	urg_ptr;
++};
++
++/*
++ *	The union cast uses a gcc extension to avoid aliasing problems
++ *  (union is compatible to any of its members)
++ *  This means this part of the code is -fstrict-aliasing safe now.
++ */
++union tcp_word_hdr { 
++	struct tcphdr hdr;
++	__be32 		  words[5];
++}; 
++
++#define tcp_flag_word(tp) ( ((union tcp_word_hdr *)(tp))->words [3]) 
++
++enum { 
++	TCP_FLAG_CWR = __constant_cpu_to_be32(0x00800000),
++	TCP_FLAG_ECE = __constant_cpu_to_be32(0x00400000),
++	TCP_FLAG_URG = __constant_cpu_to_be32(0x00200000),
++	TCP_FLAG_ACK = __constant_cpu_to_be32(0x00100000),
++	TCP_FLAG_PSH = __constant_cpu_to_be32(0x00080000),
++	TCP_FLAG_RST = __constant_cpu_to_be32(0x00040000),
++	TCP_FLAG_SYN = __constant_cpu_to_be32(0x00020000),
++	TCP_FLAG_FIN = __constant_cpu_to_be32(0x00010000),
++	TCP_RESERVED_BITS = __constant_cpu_to_be32(0x0F000000),
++	TCP_DATA_OFFSET = __constant_cpu_to_be32(0xF0000000)
++}; 
++
++/*
++ * TCP general constants
++ */
++#define TCP_MSS_DEFAULT		 536U	/* IPv4 (RFC1122, RFC2581) */
++#define TCP_MSS_DESIRED		1220U	/* IPv6 (tunneled), EDNS0 (RFC3226) */
++
++/* TCP socket options */
++#define TCP_NODELAY		1	/* Turn off Nagle's algorithm. */
++#define TCP_MAXSEG		2	/* Limit MSS */
++#define TCP_CORK		3	/* Never send partially complete segments */
++#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	/* Block/reenable quick acks */
++#define TCP_CONGESTION		13	/* Congestion control algorithm */
++#define TCP_MD5SIG		14	/* TCP MD5 Signature (RFC2385) */
++#define TCP_THIN_LINEAR_TIMEOUTS 16      /* Use linear timeouts for thin streams*/
++#define TCP_THIN_DUPACK         17      /* Fast retrans. after 1 dupack */
++#define TCP_USER_TIMEOUT	18	/* How long for loss retry before timeout */
++#define TCP_REPAIR		19	/* TCP sock is under repair right now */
++#define TCP_REPAIR_QUEUE	20
++#define TCP_QUEUE_SEQ		21
++#define TCP_REPAIR_OPTIONS	22
++#define TCP_FASTOPEN		23	/* Enable FastOpen on listeners */
++#define TCP_TIMESTAMP		24
++#define TCP_NOTSENT_LOWAT	25	/* limit number of unsent bytes in write queue */
++#define TCP_CC_INFO		26	/* Get Congestion Control (optional) info */
++#define TCP_SAVE_SYN		27	/* Record SYN headers for new connections */
++#define TCP_SAVED_SYN		28	/* Get SYN headers recorded for connection */
++#define TCP_REPAIR_WINDOW	29	/* Get/set window parameters */
++#define TCP_FASTOPEN_CONNECT	30	/* Attempt FastOpen with connect */
++#define TCP_ULP			31	/* Attach a ULP to a TCP connection */
++#define TCP_MD5SIG_EXT		32	/* TCP MD5 Signature with extensions */
++
++struct tcp_repair_opt {
++	__u32	opt_code;
++	__u32	opt_val;
++};
++
++struct tcp_repair_window {
++	__u32	snd_wl1;
++	__u32	snd_wnd;
++	__u32	max_window;
++
++	__u32	rcv_wnd;
++	__u32	rcv_wup;
++};
++
++enum {
++	TCP_NO_QUEUE,
++	TCP_RECV_QUEUE,
++	TCP_SEND_QUEUE,
++	TCP_QUEUES_NR,
++};
++
++/* for TCP_INFO socket option */
++#define TCPI_OPT_TIMESTAMPS	1
++#define TCPI_OPT_SACK		2
++#define TCPI_OPT_WSCALE		4
++#define TCPI_OPT_ECN		8 /* ECN was negociated at TCP session init */
++#define TCPI_OPT_ECN_SEEN	16 /* we received at least one packet with ECT */
++#define TCPI_OPT_SYN_DATA	32 /* SYN-ACK acked data in SYN sent or rcvd */
++
++enum tcp_ca_state {
++	TCP_CA_Open = 0,
++#define TCPF_CA_Open	(1<<TCP_CA_Open)
++	TCP_CA_Disorder = 1,
++#define TCPF_CA_Disorder (1<<TCP_CA_Disorder)
++	TCP_CA_CWR = 2,
++#define TCPF_CA_CWR	(1<<TCP_CA_CWR)
++	TCP_CA_Recovery = 3,
++#define TCPF_CA_Recovery (1<<TCP_CA_Recovery)
++	TCP_CA_Loss = 4
++#define TCPF_CA_Loss	(1<<TCP_CA_Loss)
++};
++
++struct tcp_info {
++	__u8	tcpi_state;
++	__u8	tcpi_ca_state;
++	__u8	tcpi_retransmits;
++	__u8	tcpi_probes;
++	__u8	tcpi_backoff;
++	__u8	tcpi_options;
++	__u8	tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;
++	__u8	tcpi_delivery_rate_app_limited:1;
++
++	__u32	tcpi_rto;
++	__u32	tcpi_ato;
++	__u32	tcpi_snd_mss;
++	__u32	tcpi_rcv_mss;
++
++	__u32	tcpi_unacked;
++	__u32	tcpi_sacked;
++	__u32	tcpi_lost;
++	__u32	tcpi_retrans;
++	__u32	tcpi_fackets;
++
++	/* Times. */
++	__u32	tcpi_last_data_sent;
++	__u32	tcpi_last_ack_sent;     /* Not remembered, sorry. */
++	__u32	tcpi_last_data_recv;
++	__u32	tcpi_last_ack_recv;
++
++	/* Metrics. */
++	__u32	tcpi_pmtu;
++	__u32	tcpi_rcv_ssthresh;
++	__u32	tcpi_rtt;
++	__u32	tcpi_rttvar;
++	__u32	tcpi_snd_ssthresh;
++	__u32	tcpi_snd_cwnd;
++	__u32	tcpi_advmss;
++	__u32	tcpi_reordering;
++
++	__u32	tcpi_rcv_rtt;
++	__u32	tcpi_rcv_space;
++
++	__u32	tcpi_total_retrans;
++
++	__u64	tcpi_pacing_rate;
++	__u64	tcpi_max_pacing_rate;
++	__u64	tcpi_bytes_acked;    /* RFC4898 tcpEStatsAppHCThruOctetsAcked */
++	__u64	tcpi_bytes_received; /* RFC4898 tcpEStatsAppHCThruOctetsReceived */
++	__u32	tcpi_segs_out;	     /* RFC4898 tcpEStatsPerfSegsOut */
++	__u32	tcpi_segs_in;	     /* RFC4898 tcpEStatsPerfSegsIn */
++
++	__u32	tcpi_notsent_bytes;
++	__u32	tcpi_min_rtt;
++	__u32	tcpi_data_segs_in;	/* RFC4898 tcpEStatsDataSegsIn */
++	__u32	tcpi_data_segs_out;	/* RFC4898 tcpEStatsDataSegsOut */
++
++	__u64   tcpi_delivery_rate;
++
++	__u64	tcpi_busy_time;      /* Time (usec) busy sending data */
++	__u64	tcpi_rwnd_limited;   /* Time (usec) limited by receive window */
++	__u64	tcpi_sndbuf_limited; /* Time (usec) limited by send buffer */
++};
++
++/* netlink attributes types for SCM_TIMESTAMPING_OPT_STATS */
++enum {
++	TCP_NLA_PAD,
++	TCP_NLA_BUSY,		/* Time (usec) busy sending data */
++	TCP_NLA_RWND_LIMITED,	/* Time (usec) limited by receive window */
++	TCP_NLA_SNDBUF_LIMITED,	/* Time (usec) limited by send buffer */
++	TCP_NLA_DATA_SEGS_OUT,	/* Data pkts sent including retransmission */
++	TCP_NLA_TOTAL_RETRANS,	/* Data pkts retransmitted */
++	TCP_NLA_PACING_RATE,    /* Pacing rate in bytes per second */
++	TCP_NLA_DELIVERY_RATE,  /* Delivery rate in bytes per second */
++	TCP_NLA_SND_CWND,       /* Sending congestion window */
++	TCP_NLA_REORDERING,     /* Reordering metric */
++	TCP_NLA_MIN_RTT,        /* minimum RTT */
++	TCP_NLA_RECUR_RETRANS,  /* Recurring retransmits for the current pkt */
++	TCP_NLA_DELIVERY_RATE_APP_LMT, /* delivery rate application limited ? */
++
++};
++
++/* for TCP_MD5SIG socket option */
++#define TCP_MD5SIG_MAXKEYLEN	80
++
++/* tcp_md5sig extension flags for TCP_MD5SIG_EXT */
++#define TCP_MD5SIG_FLAG_PREFIX		1	/* address prefix length */
++
++struct tcp_md5sig {
++	struct __kernel_sockaddr_storage tcpm_addr;	/* address associated */
++	__u8	tcpm_flags;				/* extension flags */
++	__u8	tcpm_prefixlen;				/* address prefix */
++	__u16	tcpm_keylen;				/* key length */
++	__u32	__tcpm_pad;				/* zero */
++	__u8	tcpm_key[TCP_MD5SIG_MAXKEYLEN];		/* key (binary) */
++};
++
++/* INET_DIAG_MD5SIG */
++struct tcp_diag_md5sig {
++	__u8	tcpm_family;
++	__u8	tcpm_prefixlen;
++	__u16	tcpm_keylen;
++	__be32	tcpm_addr[4];
++	__u8	tcpm_key[TCP_MD5SIG_MAXKEYLEN];
++};
++
++#endif /* _LINUX_TCP_H */
+diff --git a/include/uapi/linux/tcp_metrics.h b/include/uapi/linux/tcp_metrics.h
+new file mode 100644
+index 0000000..80ad90d
+--- /dev/null
++++ b/include/uapi/linux/tcp_metrics.h
+@@ -0,0 +1,60 @@
++/* tcp_metrics.h - TCP Metrics Interface */
++
++#ifndef _LINUX_TCP_METRICS_H
++#define _LINUX_TCP_METRICS_H
++
++#include <linux/types.h>
++
++/* NETLINK_GENERIC related info
++ */
++#define TCP_METRICS_GENL_NAME		"tcp_metrics"
++#define TCP_METRICS_GENL_VERSION	0x1
++
++enum tcp_metric_index {
++	TCP_METRIC_RTT,		/* in ms units */
++	TCP_METRIC_RTTVAR,	/* in ms units */
++	TCP_METRIC_SSTHRESH,
++	TCP_METRIC_CWND,
++	TCP_METRIC_REORDERING,
++
++	TCP_METRIC_RTT_US,	/* in usec units */
++	TCP_METRIC_RTTVAR_US,	/* in usec units */
++
++	/* Always last.  */
++	__TCP_METRIC_MAX,
++};
++
++#define TCP_METRIC_MAX	(__TCP_METRIC_MAX - 1)
++
++enum {
++	TCP_METRICS_ATTR_UNSPEC,
++	TCP_METRICS_ATTR_ADDR_IPV4,		/* u32 */
++	TCP_METRICS_ATTR_ADDR_IPV6,		/* binary */
++	TCP_METRICS_ATTR_AGE,			/* msecs */
++	TCP_METRICS_ATTR_TW_TSVAL,		/* u32, raw, rcv tsval */
++	TCP_METRICS_ATTR_TW_TS_STAMP,		/* s32, sec age */
++	TCP_METRICS_ATTR_VALS,			/* nested +1, u32 */
++	TCP_METRICS_ATTR_FOPEN_MSS,		/* u16 */
++	TCP_METRICS_ATTR_FOPEN_SYN_DROPS,	/* u16, count of drops */
++	TCP_METRICS_ATTR_FOPEN_SYN_DROP_TS,	/* msecs age */
++	TCP_METRICS_ATTR_FOPEN_COOKIE,		/* binary */
++	TCP_METRICS_ATTR_SADDR_IPV4,		/* u32 */
++	TCP_METRICS_ATTR_SADDR_IPV6,		/* binary */
++	TCP_METRICS_ATTR_PAD,
++
++	__TCP_METRICS_ATTR_MAX,
++};
++
++#define TCP_METRICS_ATTR_MAX	(__TCP_METRICS_ATTR_MAX - 1)
++
++enum {
++	TCP_METRICS_CMD_UNSPEC,
++	TCP_METRICS_CMD_GET,
++	TCP_METRICS_CMD_DEL,
++
++	__TCP_METRICS_CMD_MAX,
++};
++
++#define TCP_METRICS_CMD_MAX	(__TCP_METRICS_CMD_MAX - 1)
++
++#endif /* _LINUX_TCP_METRICS_H */
+diff --git a/include/uapi/linux/tipc.h b/include/uapi/linux/tipc.h
+new file mode 100644
+index 0000000..924fb5c
+--- /dev/null
++++ b/include/uapi/linux/tipc.h
+@@ -0,0 +1,256 @@
++/*
++ * include/uapi/linux/tipc.h: Header for TIPC socket interface
++ *
++ * Copyright (c) 2003-2006, 2015-2016 Ericsson AB
++ * Copyright (c) 2005, 2010-2011, Wind River Systems
++ * 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.
++ * 3. Neither the names of the copyright holders nor the names of its
++ *    contributors may be used to endorse or promote products derived from
++ *    this software without specific prior written permission.
++ *
++ * Alternatively, this software may be distributed under the terms of the
++ * GNU General Public License ("GPL") version 2 as published by the Free
++ * Software Foundation.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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.
++ */
++
++#ifndef _LINUX_TIPC_H_
++#define _LINUX_TIPC_H_
++
++#include <linux/types.h>
++#include <linux/sockios.h>
++
++/*
++ * TIPC addressing primitives
++ */
++
++struct tipc_portid {
++	__u32 ref;
++	__u32 node;
++};
++
++struct tipc_name {
++	__u32 type;
++	__u32 instance;
++};
++
++struct tipc_name_seq {
++	__u32 type;
++	__u32 lower;
++	__u32 upper;
++};
++
++/* TIPC Address Size, Offset, Mask specification for Z.C.N
++ */
++#define TIPC_NODE_BITS          12
++#define TIPC_CLUSTER_BITS       12
++#define TIPC_ZONE_BITS          8
++
++#define TIPC_NODE_OFFSET        0
++#define TIPC_CLUSTER_OFFSET     TIPC_NODE_BITS
++#define TIPC_ZONE_OFFSET        (TIPC_CLUSTER_OFFSET + TIPC_CLUSTER_BITS)
++
++#define TIPC_NODE_SIZE          ((1UL << TIPC_NODE_BITS) - 1)
++#define TIPC_CLUSTER_SIZE       ((1UL << TIPC_CLUSTER_BITS) - 1)
++#define TIPC_ZONE_SIZE          ((1UL << TIPC_ZONE_BITS) - 1)
++
++#define TIPC_NODE_MASK		(TIPC_NODE_SIZE << TIPC_NODE_OFFSET)
++#define TIPC_CLUSTER_MASK	(TIPC_CLUSTER_SIZE << TIPC_CLUSTER_OFFSET)
++#define TIPC_ZONE_MASK		(TIPC_ZONE_SIZE << TIPC_ZONE_OFFSET)
++
++#define TIPC_ZONE_CLUSTER_MASK (TIPC_ZONE_MASK | TIPC_CLUSTER_MASK)
++
++static __inline__ __u32 tipc_addr(unsigned int zone,
++			      unsigned int cluster,
++			      unsigned int node)
++{
++	return (zone << TIPC_ZONE_OFFSET) |
++		(cluster << TIPC_CLUSTER_OFFSET) |
++		node;
++}
++
++static __inline__ unsigned int tipc_zone(__u32 addr)
++{
++	return addr >> TIPC_ZONE_OFFSET;
++}
++
++static __inline__ unsigned int tipc_cluster(__u32 addr)
++{
++	return (addr & TIPC_CLUSTER_MASK) >> TIPC_CLUSTER_OFFSET;
++}
++
++static __inline__ unsigned int tipc_node(__u32 addr)
++{
++	return addr & TIPC_NODE_MASK;
++}
++
++/*
++ * Application-accessible port name types
++ */
++
++#define TIPC_CFG_SRV		0	/* configuration service name type */
++#define TIPC_TOP_SRV		1	/* topology service name type */
++#define TIPC_LINK_STATE		2	/* link state name type */
++#define TIPC_RESERVED_TYPES	64	/* lowest user-publishable name type */
++
++/*
++ * Publication scopes when binding port names and port name sequences
++ */
++
++#define TIPC_ZONE_SCOPE		1
++#define TIPC_CLUSTER_SCOPE	2
++#define TIPC_NODE_SCOPE		3
++
++/*
++ * Limiting values for messages
++ */
++
++#define TIPC_MAX_USER_MSG_SIZE	66000U
++
++/*
++ * Message importance levels
++ */
++
++#define TIPC_LOW_IMPORTANCE		0
++#define TIPC_MEDIUM_IMPORTANCE		1
++#define TIPC_HIGH_IMPORTANCE		2
++#define TIPC_CRITICAL_IMPORTANCE	3
++
++/*
++ * Msg rejection/connection shutdown reasons
++ */
++
++#define TIPC_OK			0
++#define TIPC_ERR_NO_NAME	1
++#define TIPC_ERR_NO_PORT	2
++#define TIPC_ERR_NO_NODE	3
++#define TIPC_ERR_OVERLOAD	4
++#define TIPC_CONN_SHUTDOWN	5
++
++/*
++ * TIPC topology subscription service definitions
++ */
++
++#define TIPC_SUB_PORTS		0x01	/* filter for port availability */
++#define TIPC_SUB_SERVICE	0x02	/* filter for service availability */
++#define TIPC_SUB_CANCEL		0x04	/* cancel a subscription */
++
++#define TIPC_WAIT_FOREVER	(~0)	/* timeout for permanent subscription */
++
++struct tipc_subscr {
++	struct tipc_name_seq seq;	/* name sequence of interest */
++	__u32 timeout;			/* subscription duration (in ms) */
++	__u32 filter;			/* bitmask of filter options */
++	char usr_handle[8];		/* available for subscriber use */
++};
++
++#define TIPC_PUBLISHED		1	/* publication event */
++#define TIPC_WITHDRAWN		2	/* withdraw event */
++#define TIPC_SUBSCR_TIMEOUT	3	/* subscription timeout event */
++
++struct tipc_event {
++	__u32 event;			/* event type */
++	__u32 found_lower;		/* matching name seq instances */
++	__u32 found_upper;		/*    "      "    "     "      */
++	struct tipc_portid port;	/* associated port */
++	struct tipc_subscr s;		/* associated subscription */
++};
++
++/*
++ * Socket API
++ */
++
++#ifndef AF_TIPC
++#define AF_TIPC		30
++#endif
++
++#ifndef PF_TIPC
++#define PF_TIPC		AF_TIPC
++#endif
++
++#ifndef SOL_TIPC
++#define SOL_TIPC	271
++#endif
++
++#define TIPC_ADDR_NAMESEQ	1
++#define TIPC_ADDR_MCAST		1
++#define TIPC_ADDR_NAME		2
++#define TIPC_ADDR_ID		3
++
++struct sockaddr_tipc {
++	unsigned short family;
++	unsigned char  addrtype;
++	signed   char  scope;
++	union {
++		struct tipc_portid id;
++		struct tipc_name_seq nameseq;
++		struct {
++			struct tipc_name name;
++			__u32 domain;
++		} name;
++	} addr;
++};
++
++/*
++ * Ancillary data objects supported by recvmsg()
++ */
++
++#define TIPC_ERRINFO	1	/* error info */
++#define TIPC_RETDATA	2	/* returned data */
++#define TIPC_DESTNAME	3	/* destination name */
++
++/*
++ * TIPC-specific socket option names
++ */
++
++#define TIPC_IMPORTANCE		127	/* Default: TIPC_LOW_IMPORTANCE */
++#define TIPC_SRC_DROPPABLE	128	/* Default: based on socket type */
++#define TIPC_DEST_DROPPABLE	129	/* Default: based on socket type */
++#define TIPC_CONN_TIMEOUT	130	/* Default: 8000 (ms)  */
++#define TIPC_NODE_RECVQ_DEPTH	131	/* Default: none (read only) */
++#define TIPC_SOCK_RECVQ_DEPTH	132	/* Default: none (read only) */
++#define TIPC_MCAST_BROADCAST    133     /* Default: TIPC selects. No arg */
++#define TIPC_MCAST_REPLICAST    134     /* Default: TIPC selects. No arg */
++
++/*
++ * Maximum sizes of TIPC bearer-related names (including terminating NULL)
++ * The string formatting for each name element is:
++ * media: media
++ * interface: media:interface name
++ * link: Z.C.N:interface-Z.C.N:interface
++ *
++ */
++
++#define TIPC_MAX_MEDIA_NAME	16
++#define TIPC_MAX_IF_NAME	16
++#define TIPC_MAX_BEARER_NAME	32
++#define TIPC_MAX_LINK_NAME	60
++
++#define SIOCGETLINKNAME		SIOCPROTOPRIVATE
++
++struct tipc_sioc_ln_req {
++	__u32 peer;
++	__u32 bearer_id;
++	char linkname[TIPC_MAX_LINK_NAME];
++};
++#endif
+diff --git a/include/uapi/linux/tipc_netlink.h b/include/uapi/linux/tipc_netlink.h
+new file mode 100644
+index 0000000..f9edd20
+--- /dev/null
++++ b/include/uapi/linux/tipc_netlink.h
+@@ -0,0 +1,294 @@
++/*
++ * Copyright (c) 2014, Ericsson AB
++ * 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.
++ * 3. Neither the names of the copyright holders nor the names of its
++ *    contributors may be used to endorse or promote products derived from
++ *    this software without specific prior written permission.
++ *
++ * Alternatively, this software may be distributed under the terms of the
++ * GNU General Public License ("GPL") version 2 as published by the Free
++ * Software Foundation.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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.
++ */
++
++#ifndef _LINUX_TIPC_NETLINK_H_
++#define _LINUX_TIPC_NETLINK_H_
++
++#define TIPC_GENL_V2_NAME      "TIPCv2"
++#define TIPC_GENL_V2_VERSION   0x1
++
++/* Netlink commands */
++enum {
++	TIPC_NL_UNSPEC,
++	TIPC_NL_LEGACY,
++	TIPC_NL_BEARER_DISABLE,
++	TIPC_NL_BEARER_ENABLE,
++	TIPC_NL_BEARER_GET,
++	TIPC_NL_BEARER_SET,
++	TIPC_NL_SOCK_GET,
++	TIPC_NL_PUBL_GET,
++	TIPC_NL_LINK_GET,
++	TIPC_NL_LINK_SET,
++	TIPC_NL_LINK_RESET_STATS,
++	TIPC_NL_MEDIA_GET,
++	TIPC_NL_MEDIA_SET,
++	TIPC_NL_NODE_GET,
++	TIPC_NL_NET_GET,
++	TIPC_NL_NET_SET,
++	TIPC_NL_NAME_TABLE_GET,
++	TIPC_NL_MON_SET,
++	TIPC_NL_MON_GET,
++	TIPC_NL_MON_PEER_GET,
++	TIPC_NL_PEER_REMOVE,
++	TIPC_NL_BEARER_ADD,
++	TIPC_NL_UDP_GET_REMOTEIP,
++
++	__TIPC_NL_CMD_MAX,
++	TIPC_NL_CMD_MAX = __TIPC_NL_CMD_MAX - 1
++};
++
++/* Top level netlink attributes */
++enum {
++	TIPC_NLA_UNSPEC,
++	TIPC_NLA_BEARER,		/* nest */
++	TIPC_NLA_SOCK,			/* nest */
++	TIPC_NLA_PUBL,			/* nest */
++	TIPC_NLA_LINK,			/* nest */
++	TIPC_NLA_MEDIA,			/* nest */
++	TIPC_NLA_NODE,			/* nest */
++	TIPC_NLA_NET,			/* nest */
++	TIPC_NLA_NAME_TABLE,		/* nest */
++	TIPC_NLA_MON,			/* nest */
++	TIPC_NLA_MON_PEER,		/* nest */
++
++	__TIPC_NLA_MAX,
++	TIPC_NLA_MAX = __TIPC_NLA_MAX - 1
++};
++
++/* Bearer info */
++enum {
++	TIPC_NLA_BEARER_UNSPEC,
++	TIPC_NLA_BEARER_NAME,		/* string */
++	TIPC_NLA_BEARER_PROP,		/* nest */
++	TIPC_NLA_BEARER_DOMAIN,		/* u32 */
++	TIPC_NLA_BEARER_UDP_OPTS,	/* nest */
++
++	__TIPC_NLA_BEARER_MAX,
++	TIPC_NLA_BEARER_MAX = __TIPC_NLA_BEARER_MAX - 1
++};
++
++enum {
++	TIPC_NLA_UDP_UNSPEC,
++	TIPC_NLA_UDP_LOCAL,		/* sockaddr_storage */
++	TIPC_NLA_UDP_REMOTE,		/* sockaddr_storage */
++	TIPC_NLA_UDP_MULTI_REMOTEIP,	/* flag */
++
++	__TIPC_NLA_UDP_MAX,
++	TIPC_NLA_UDP_MAX = __TIPC_NLA_UDP_MAX - 1
++};
++/* Socket info */
++enum {
++	TIPC_NLA_SOCK_UNSPEC,
++	TIPC_NLA_SOCK_ADDR,		/* u32 */
++	TIPC_NLA_SOCK_REF,		/* u32 */
++	TIPC_NLA_SOCK_CON,		/* nest */
++	TIPC_NLA_SOCK_HAS_PUBL,		/* flag */
++
++	__TIPC_NLA_SOCK_MAX,
++	TIPC_NLA_SOCK_MAX = __TIPC_NLA_SOCK_MAX - 1
++};
++
++/* Link info */
++enum {
++	TIPC_NLA_LINK_UNSPEC,
++	TIPC_NLA_LINK_NAME,		/* string */
++	TIPC_NLA_LINK_DEST,		/* u32 */
++	TIPC_NLA_LINK_MTU,		/* u32 */
++	TIPC_NLA_LINK_BROADCAST,	/* flag */
++	TIPC_NLA_LINK_UP,		/* flag */
++	TIPC_NLA_LINK_ACTIVE,		/* flag */
++	TIPC_NLA_LINK_PROP,		/* nest */
++	TIPC_NLA_LINK_STATS,		/* nest */
++	TIPC_NLA_LINK_RX,		/* u32 */
++	TIPC_NLA_LINK_TX,		/* u32 */
++
++	__TIPC_NLA_LINK_MAX,
++	TIPC_NLA_LINK_MAX = __TIPC_NLA_LINK_MAX - 1
++};
++
++/* Media info */
++enum {
++	TIPC_NLA_MEDIA_UNSPEC,
++	TIPC_NLA_MEDIA_NAME,		/* string */
++	TIPC_NLA_MEDIA_PROP,		/* nest */
++
++	__TIPC_NLA_MEDIA_MAX,
++	TIPC_NLA_MEDIA_MAX = __TIPC_NLA_MEDIA_MAX - 1
++};
++
++/* Node info */
++enum {
++	TIPC_NLA_NODE_UNSPEC,
++	TIPC_NLA_NODE_ADDR,		/* u32 */
++	TIPC_NLA_NODE_UP,		/* flag */
++
++	__TIPC_NLA_NODE_MAX,
++	TIPC_NLA_NODE_MAX = __TIPC_NLA_NODE_MAX - 1
++};
++
++/* Net info */
++enum {
++	TIPC_NLA_NET_UNSPEC,
++	TIPC_NLA_NET_ID,		/* u32 */
++	TIPC_NLA_NET_ADDR,		/* u32 */
++
++	__TIPC_NLA_NET_MAX,
++	TIPC_NLA_NET_MAX = __TIPC_NLA_NET_MAX - 1
++};
++
++/* Name table info */
++enum {
++	TIPC_NLA_NAME_TABLE_UNSPEC,
++	TIPC_NLA_NAME_TABLE_PUBL,	/* nest */
++
++	__TIPC_NLA_NAME_TABLE_MAX,
++	TIPC_NLA_NAME_TABLE_MAX = __TIPC_NLA_NAME_TABLE_MAX - 1
++};
++
++/* Monitor info */
++enum {
++	TIPC_NLA_MON_UNSPEC,
++	TIPC_NLA_MON_ACTIVATION_THRESHOLD,	/* u32 */
++	TIPC_NLA_MON_REF,			/* u32 */
++	TIPC_NLA_MON_ACTIVE,			/* flag */
++	TIPC_NLA_MON_BEARER_NAME,		/* string */
++	TIPC_NLA_MON_PEERCNT,			/* u32 */
++	TIPC_NLA_MON_LISTGEN,			/* u32 */
++
++	__TIPC_NLA_MON_MAX,
++	TIPC_NLA_MON_MAX = __TIPC_NLA_MON_MAX - 1
++};
++
++/* Publication info */
++enum {
++	TIPC_NLA_PUBL_UNSPEC,
++
++	TIPC_NLA_PUBL_TYPE,		/* u32 */
++	TIPC_NLA_PUBL_LOWER,		/* u32 */
++	TIPC_NLA_PUBL_UPPER,		/* u32 */
++	TIPC_NLA_PUBL_SCOPE,		/* u32 */
++	TIPC_NLA_PUBL_NODE,		/* u32 */
++	TIPC_NLA_PUBL_REF,		/* u32 */
++	TIPC_NLA_PUBL_KEY,		/* u32 */
++
++	__TIPC_NLA_PUBL_MAX,
++	TIPC_NLA_PUBL_MAX = __TIPC_NLA_PUBL_MAX - 1
++};
++
++/* Monitor peer info */
++enum {
++	TIPC_NLA_MON_PEER_UNSPEC,
++
++	TIPC_NLA_MON_PEER_ADDR,			/* u32 */
++	TIPC_NLA_MON_PEER_DOMGEN,		/* u32 */
++	TIPC_NLA_MON_PEER_APPLIED,		/* u32 */
++	TIPC_NLA_MON_PEER_UPMAP,		/* u64 */
++	TIPC_NLA_MON_PEER_MEMBERS,		/* tlv */
++	TIPC_NLA_MON_PEER_UP,			/* flag */
++	TIPC_NLA_MON_PEER_HEAD,			/* flag */
++	TIPC_NLA_MON_PEER_LOCAL,		/* flag */
++	TIPC_NLA_MON_PEER_PAD,			/* flag */
++
++	__TIPC_NLA_MON_PEER_MAX,
++	TIPC_NLA_MON_PEER_MAX = __TIPC_NLA_MON_PEER_MAX - 1
++};
++
++/* Nest, connection info */
++enum {
++	TIPC_NLA_CON_UNSPEC,
++
++	TIPC_NLA_CON_FLAG,		/* flag */
++	TIPC_NLA_CON_NODE,		/* u32 */
++	TIPC_NLA_CON_SOCK,		/* u32 */
++	TIPC_NLA_CON_TYPE,		/* u32 */
++	TIPC_NLA_CON_INST,		/* u32 */
++
++	__TIPC_NLA_CON_MAX,
++	TIPC_NLA_CON_MAX = __TIPC_NLA_CON_MAX - 1
++};
++
++/* Nest, link propreties. Valid for link, media and bearer */
++enum {
++	TIPC_NLA_PROP_UNSPEC,
++
++	TIPC_NLA_PROP_PRIO,		/* u32 */
++	TIPC_NLA_PROP_TOL,		/* u32 */
++	TIPC_NLA_PROP_WIN,		/* u32 */
++
++	__TIPC_NLA_PROP_MAX,
++	TIPC_NLA_PROP_MAX = __TIPC_NLA_PROP_MAX - 1
++};
++
++/* Nest, statistics info */
++enum {
++	TIPC_NLA_STATS_UNSPEC,
++
++	TIPC_NLA_STATS_RX_INFO,		/* u32 */
++	TIPC_NLA_STATS_RX_FRAGMENTS,	/* u32 */
++	TIPC_NLA_STATS_RX_FRAGMENTED,	/* u32 */
++	TIPC_NLA_STATS_RX_BUNDLES,	/* u32 */
++	TIPC_NLA_STATS_RX_BUNDLED,	/* u32 */
++	TIPC_NLA_STATS_TX_INFO,		/* u32 */
++	TIPC_NLA_STATS_TX_FRAGMENTS,	/* u32 */
++	TIPC_NLA_STATS_TX_FRAGMENTED,	/* u32 */
++	TIPC_NLA_STATS_TX_BUNDLES,	/* u32 */
++	TIPC_NLA_STATS_TX_BUNDLED,	/* u32 */
++	TIPC_NLA_STATS_MSG_PROF_TOT,	/* u32 */
++	TIPC_NLA_STATS_MSG_LEN_CNT,	/* u32 */
++	TIPC_NLA_STATS_MSG_LEN_TOT,	/* u32 */
++	TIPC_NLA_STATS_MSG_LEN_P0,	/* u32 */
++	TIPC_NLA_STATS_MSG_LEN_P1,	/* u32 */
++	TIPC_NLA_STATS_MSG_LEN_P2,	/* u32 */
++	TIPC_NLA_STATS_MSG_LEN_P3,	/* u32 */
++	TIPC_NLA_STATS_MSG_LEN_P4,	/* u32 */
++	TIPC_NLA_STATS_MSG_LEN_P5,	/* u32 */
++	TIPC_NLA_STATS_MSG_LEN_P6,	/* u32 */
++	TIPC_NLA_STATS_RX_STATES,	/* u32 */
++	TIPC_NLA_STATS_RX_PROBES,	/* u32 */
++	TIPC_NLA_STATS_RX_NACKS,	/* u32 */
++	TIPC_NLA_STATS_RX_DEFERRED,	/* u32 */
++	TIPC_NLA_STATS_TX_STATES,	/* u32 */
++	TIPC_NLA_STATS_TX_PROBES,	/* u32 */
++	TIPC_NLA_STATS_TX_NACKS,	/* u32 */
++	TIPC_NLA_STATS_TX_ACKS,		/* u32 */
++	TIPC_NLA_STATS_RETRANSMITTED,	/* u32 */
++	TIPC_NLA_STATS_DUPLICATES,	/* u32 */
++	TIPC_NLA_STATS_LINK_CONGS,	/* u32 */
++	TIPC_NLA_STATS_MAX_QUEUE,	/* u32 */
++	TIPC_NLA_STATS_AVG_QUEUE,	/* u32 */
++
++	__TIPC_NLA_STATS_MAX,
++	TIPC_NLA_STATS_MAX = __TIPC_NLA_STATS_MAX - 1
++};
++
++#endif
+diff --git a/include/uapi/linux/types.h b/include/uapi/linux/types.h
+new file mode 100644
+index 0000000..c640657
+--- /dev/null
++++ b/include/uapi/linux/types.h
+@@ -0,0 +1,47 @@
++#ifndef _LINUX_TYPES_H
++#define _LINUX_TYPES_H
++
++#include <asm/types.h>
++
++#ifndef __ASSEMBLY__
++
++#include <linux/posix_types.h>
++
++
++/*
++ * Below are truly Linux-specific types that should never collide with
++ * any application/library that wants linux/types.h.
++ */
++
++#ifdef __CHECKER__
++#define __bitwise__ __attribute__((bitwise))
++#else
++#define __bitwise__
++#endif
++#define __bitwise __bitwise__
++
++typedef __u16 __bitwise __le16;
++typedef __u16 __bitwise __be16;
++typedef __u32 __bitwise __le32;
++typedef __u32 __bitwise __be32;
++typedef __u64 __bitwise __le64;
++typedef __u64 __bitwise __be64;
++
++typedef __u16 __bitwise __sum16;
++typedef __u32 __bitwise __wsum;
++
++/*
++ * aligned_u64 should be used in defining kernel<->userspace ABIs to avoid
++ * common 32/64-bit compat problems.
++ * 64-bit values align to 4-byte boundaries on x86_32 (and possibly other
++ * architectures) and to 8-byte boundaries on 64-bit architectures.  The new
++ * aligned_64 type enforces 8-byte alignment so that structs containing
++ * aligned_64 values have the same alignment on 32-bit and 64-bit architectures.
++ * No conversions are necessary between 32-bit user-space and a 64-bit kernel.
++ */
++#define __aligned_u64 __u64 __attribute__((aligned(8)))
++#define __aligned_be64 __be64 __attribute__((aligned(8)))
++#define __aligned_le64 __le64 __attribute__((aligned(8)))
++
++#endif /*  __ASSEMBLY__ */
++#endif /* _LINUX_TYPES_H */
+diff --git a/include/uapi/linux/unix_diag.h b/include/uapi/linux/unix_diag.h
+new file mode 100644
+index 0000000..1eb0b8d
+--- /dev/null
++++ b/include/uapi/linux/unix_diag.h
+@@ -0,0 +1,58 @@
++#ifndef __UNIX_DIAG_H__
++#define __UNIX_DIAG_H__
++
++#include <linux/types.h>
++
++struct unix_diag_req {
++	__u8	sdiag_family;
++	__u8	sdiag_protocol;
++	__u16	pad;
++	__u32	udiag_states;
++	__u32	udiag_ino;
++	__u32	udiag_show;
++	__u32	udiag_cookie[2];
++};
++
++#define UDIAG_SHOW_NAME		0x00000001	/* show name (not path) */
++#define UDIAG_SHOW_VFS		0x00000002	/* show VFS inode info */
++#define UDIAG_SHOW_PEER		0x00000004	/* show peer socket info */
++#define UDIAG_SHOW_ICONS	0x00000008	/* show pending connections */
++#define UDIAG_SHOW_RQLEN	0x00000010	/* show skb receive queue len */
++#define UDIAG_SHOW_MEMINFO	0x00000020	/* show memory info of a socket */
++
++struct unix_diag_msg {
++	__u8	udiag_family;
++	__u8	udiag_type;
++	__u8	udiag_state;
++	__u8	pad;
++
++	__u32	udiag_ino;
++	__u32	udiag_cookie[2];
++};
++
++enum {
++	/* UNIX_DIAG_NONE, standard nl API requires this attribute!  */
++	UNIX_DIAG_NAME,
++	UNIX_DIAG_VFS,
++	UNIX_DIAG_PEER,
++	UNIX_DIAG_ICONS,
++	UNIX_DIAG_RQLEN,
++	UNIX_DIAG_MEMINFO,
++	UNIX_DIAG_SHUTDOWN,
++
++	__UNIX_DIAG_MAX,
++};
++
++#define UNIX_DIAG_MAX (__UNIX_DIAG_MAX - 1)
++
++struct unix_diag_vfs {
++	__u32	udiag_vfs_ino;
++	__u32	udiag_vfs_dev;
++};
++
++struct unix_diag_rqlen {
++	__u32	udiag_rqueue;
++	__u32	udiag_wqueue;
++};
++
++#endif
+diff --git a/include/uapi/linux/veth.h b/include/uapi/linux/veth.h
+new file mode 100644
+index 0000000..3354c1e
+--- /dev/null
++++ b/include/uapi/linux/veth.h
+@@ -0,0 +1,12 @@
++#ifndef __NET_VETH_H_
++#define __NET_VETH_H_
++
++enum {
++	VETH_INFO_UNSPEC,
++	VETH_INFO_PEER,
++
++	__VETH_INFO_MAX
++#define VETH_INFO_MAX	(__VETH_INFO_MAX - 1)
++};
++
++#endif
+diff --git a/include/uapi/linux/xfrm.h b/include/uapi/linux/xfrm.h
+new file mode 100644
+index 0000000..5790293
+--- /dev/null
++++ b/include/uapi/linux/xfrm.h
+@@ -0,0 +1,536 @@
++#ifndef _LINUX_XFRM_H
++#define _LINUX_XFRM_H
++
++#include <linux/in6.h>
++#include <linux/types.h>
++
++/* All of the structures in this file may not change size as they are
++ * passed into the kernel from userspace via netlink sockets.
++ */
++
++/* Structure to encapsulate addresses. I do not want to use
++ * "standard" structure. My apologies.
++ */
++typedef union {
++	__be32		a4;
++	__be32		a6[4];
++	struct in6_addr	in6;
++} xfrm_address_t;
++
++/* Ident of a specific xfrm_state. It is used on input to lookup
++ * the state by (spi,daddr,ah/esp) or to store information about
++ * spi, protocol and tunnel address on output.
++ */
++struct xfrm_id {
++	xfrm_address_t	daddr;
++	__be32		spi;
++	__u8		proto;
++};
++
++struct xfrm_sec_ctx {
++	__u8	ctx_doi;
++	__u8	ctx_alg;
++	__u16	ctx_len;
++	__u32	ctx_sid;
++	char	ctx_str[0];
++};
++
++/* Security Context Domains of Interpretation */
++#define XFRM_SC_DOI_RESERVED 0
++#define XFRM_SC_DOI_LSM 1
++
++/* Security Context Algorithms */
++#define XFRM_SC_ALG_RESERVED 0
++#define XFRM_SC_ALG_SELINUX 1
++
++/* Selector, used as selector both on policy rules (SPD) and SAs. */
++
++struct xfrm_selector {
++	xfrm_address_t	daddr;
++	xfrm_address_t	saddr;
++	__be16	dport;
++	__be16	dport_mask;
++	__be16	sport;
++	__be16	sport_mask;
++	__u16	family;
++	__u8	prefixlen_d;
++	__u8	prefixlen_s;
++	__u8	proto;
++	int	ifindex;
++	__kernel_uid32_t	user;
++};
++
++#define XFRM_INF (~(__u64)0)
++
++struct xfrm_lifetime_cfg {
++	__u64	soft_byte_limit;
++	__u64	hard_byte_limit;
++	__u64	soft_packet_limit;
++	__u64	hard_packet_limit;
++	__u64	soft_add_expires_seconds;
++	__u64	hard_add_expires_seconds;
++	__u64	soft_use_expires_seconds;
++	__u64	hard_use_expires_seconds;
++};
++
++struct xfrm_lifetime_cur {
++	__u64	bytes;
++	__u64	packets;
++	__u64	add_time;
++	__u64	use_time;
++};
++
++struct xfrm_replay_state {
++	__u32	oseq;
++	__u32	seq;
++	__u32	bitmap;
++};
++
++#define XFRMA_REPLAY_ESN_MAX	4096
++
++struct xfrm_replay_state_esn {
++	unsigned int	bmp_len;
++	__u32		oseq;
++	__u32		seq;
++	__u32		oseq_hi;
++	__u32		seq_hi;
++	__u32		replay_window;
++	__u32		bmp[0];
++};
++
++struct xfrm_algo {
++	char		alg_name[64];
++	unsigned int	alg_key_len;    /* in bits */
++	char		alg_key[0];
++};
++
++struct xfrm_algo_auth {
++	char		alg_name[64];
++	unsigned int	alg_key_len;    /* in bits */
++	unsigned int	alg_trunc_len;  /* in bits */
++	char		alg_key[0];
++};
++
++struct xfrm_algo_aead {
++	char		alg_name[64];
++	unsigned int	alg_key_len;	/* in bits */
++	unsigned int	alg_icv_len;	/* in bits */
++	char		alg_key[0];
++};
++
++struct xfrm_stats {
++	__u32	replay_window;
++	__u32	replay;
++	__u32	integrity_failed;
++};
++
++enum {
++	XFRM_POLICY_TYPE_MAIN	= 0,
++	XFRM_POLICY_TYPE_SUB	= 1,
++	XFRM_POLICY_TYPE_MAX	= 2,
++	XFRM_POLICY_TYPE_ANY	= 255
++};
++
++enum {
++	XFRM_POLICY_IN	= 0,
++	XFRM_POLICY_OUT	= 1,
++	XFRM_POLICY_FWD	= 2,
++	XFRM_POLICY_MASK = 3,
++	XFRM_POLICY_MAX	= 3
++};
++
++enum {
++	XFRM_SHARE_ANY,		/* No limitations */
++	XFRM_SHARE_SESSION,	/* For this session only */
++	XFRM_SHARE_USER,	/* For this user only */
++	XFRM_SHARE_UNIQUE	/* Use once */
++};
++
++#define XFRM_MODE_TRANSPORT 0
++#define XFRM_MODE_TUNNEL 1
++#define XFRM_MODE_ROUTEOPTIMIZATION 2
++#define XFRM_MODE_IN_TRIGGER 3
++#define XFRM_MODE_BEET 4
++#define XFRM_MODE_MAX 5
++
++/* Netlink configuration messages.  */
++enum {
++	XFRM_MSG_BASE = 0x10,
++
++	XFRM_MSG_NEWSA = 0x10,
++#define XFRM_MSG_NEWSA XFRM_MSG_NEWSA
++	XFRM_MSG_DELSA,
++#define XFRM_MSG_DELSA XFRM_MSG_DELSA
++	XFRM_MSG_GETSA,
++#define XFRM_MSG_GETSA XFRM_MSG_GETSA
++
++	XFRM_MSG_NEWPOLICY,
++#define XFRM_MSG_NEWPOLICY XFRM_MSG_NEWPOLICY
++	XFRM_MSG_DELPOLICY,
++#define XFRM_MSG_DELPOLICY XFRM_MSG_DELPOLICY
++	XFRM_MSG_GETPOLICY,
++#define XFRM_MSG_GETPOLICY XFRM_MSG_GETPOLICY
++
++	XFRM_MSG_ALLOCSPI,
++#define XFRM_MSG_ALLOCSPI XFRM_MSG_ALLOCSPI
++	XFRM_MSG_ACQUIRE,
++#define XFRM_MSG_ACQUIRE XFRM_MSG_ACQUIRE
++	XFRM_MSG_EXPIRE,
++#define XFRM_MSG_EXPIRE XFRM_MSG_EXPIRE
++
++	XFRM_MSG_UPDPOLICY,
++#define XFRM_MSG_UPDPOLICY XFRM_MSG_UPDPOLICY
++	XFRM_MSG_UPDSA,
++#define XFRM_MSG_UPDSA XFRM_MSG_UPDSA
++
++	XFRM_MSG_POLEXPIRE,
++#define XFRM_MSG_POLEXPIRE XFRM_MSG_POLEXPIRE
++
++	XFRM_MSG_FLUSHSA,
++#define XFRM_MSG_FLUSHSA XFRM_MSG_FLUSHSA
++	XFRM_MSG_FLUSHPOLICY,
++#define XFRM_MSG_FLUSHPOLICY XFRM_MSG_FLUSHPOLICY
++
++	XFRM_MSG_NEWAE,
++#define XFRM_MSG_NEWAE XFRM_MSG_NEWAE
++	XFRM_MSG_GETAE,
++#define XFRM_MSG_GETAE XFRM_MSG_GETAE
++
++	XFRM_MSG_REPORT,
++#define XFRM_MSG_REPORT XFRM_MSG_REPORT
++
++	XFRM_MSG_MIGRATE,
++#define XFRM_MSG_MIGRATE XFRM_MSG_MIGRATE
++
++	XFRM_MSG_NEWSADINFO,
++#define XFRM_MSG_NEWSADINFO XFRM_MSG_NEWSADINFO
++	XFRM_MSG_GETSADINFO,
++#define XFRM_MSG_GETSADINFO XFRM_MSG_GETSADINFO
++
++	XFRM_MSG_NEWSPDINFO,
++#define XFRM_MSG_NEWSPDINFO XFRM_MSG_NEWSPDINFO
++	XFRM_MSG_GETSPDINFO,
++#define XFRM_MSG_GETSPDINFO XFRM_MSG_GETSPDINFO
++
++	XFRM_MSG_MAPPING,
++#define XFRM_MSG_MAPPING XFRM_MSG_MAPPING
++	__XFRM_MSG_MAX
++};
++#define XFRM_MSG_MAX (__XFRM_MSG_MAX - 1)
++
++#define XFRM_NR_MSGTYPES (XFRM_MSG_MAX + 1 - XFRM_MSG_BASE)
++
++/*
++ * Generic LSM security context for comunicating to user space
++ * NOTE: Same format as sadb_x_sec_ctx
++ */
++struct xfrm_user_sec_ctx {
++	__u16			len;
++	__u16			exttype;
++	__u8			ctx_alg;  /* LSMs: e.g., selinux == 1 */
++	__u8			ctx_doi;
++	__u16			ctx_len;
++};
++
++struct xfrm_user_tmpl {
++	struct xfrm_id		id;
++	__u16			family;
++	xfrm_address_t		saddr;
++	__u32			reqid;
++	__u8			mode;
++	__u8			share;
++	__u8			optional;
++	__u32			aalgos;
++	__u32			ealgos;
++	__u32			calgos;
++};
++
++struct xfrm_encap_tmpl {
++	__u16		encap_type;
++	__be16		encap_sport;
++	__be16		encap_dport;
++	xfrm_address_t	encap_oa;
++};
++
++/* AEVENT flags  */
++enum xfrm_ae_ftype_t {
++	XFRM_AE_UNSPEC,
++	XFRM_AE_RTHR=1,	/* replay threshold*/
++	XFRM_AE_RVAL=2, /* replay value */
++	XFRM_AE_LVAL=4, /* lifetime value */
++	XFRM_AE_ETHR=8, /* expiry timer threshold */
++	XFRM_AE_CR=16, /* Event cause is replay update */
++	XFRM_AE_CE=32, /* Event cause is timer expiry */
++	XFRM_AE_CU=64, /* Event cause is policy update */
++	__XFRM_AE_MAX
++
++#define XFRM_AE_MAX (__XFRM_AE_MAX - 1)
++};
++
++struct xfrm_userpolicy_type {
++	__u8		type;
++	__u16		reserved1;
++	__u8		reserved2;
++};
++
++/* Netlink message attributes.  */
++enum xfrm_attr_type_t {
++	XFRMA_UNSPEC,
++	XFRMA_ALG_AUTH,		/* struct xfrm_algo */
++	XFRMA_ALG_CRYPT,	/* struct xfrm_algo */
++	XFRMA_ALG_COMP,		/* struct xfrm_algo */
++	XFRMA_ENCAP,		/* struct xfrm_algo + struct xfrm_encap_tmpl */
++	XFRMA_TMPL,		/* 1 or more struct xfrm_user_tmpl */
++	XFRMA_SA,		/* struct xfrm_usersa_info  */
++	XFRMA_POLICY,		/*struct xfrm_userpolicy_info */
++	XFRMA_SEC_CTX,		/* struct xfrm_sec_ctx */
++	XFRMA_LTIME_VAL,
++	XFRMA_REPLAY_VAL,
++	XFRMA_REPLAY_THRESH,
++	XFRMA_ETIMER_THRESH,
++	XFRMA_SRCADDR,		/* xfrm_address_t */
++	XFRMA_COADDR,		/* xfrm_address_t */
++	XFRMA_LASTUSED,		/* unsigned long  */
++	XFRMA_POLICY_TYPE,	/* struct xfrm_userpolicy_type */
++	XFRMA_MIGRATE,
++	XFRMA_ALG_AEAD,		/* struct xfrm_algo_aead */
++	XFRMA_KMADDRESS,        /* struct xfrm_user_kmaddress */
++	XFRMA_ALG_AUTH_TRUNC,	/* struct xfrm_algo_auth */
++	XFRMA_MARK,		/* struct xfrm_mark */
++	XFRMA_TFCPAD,		/* __u32 */
++	XFRMA_REPLAY_ESN_VAL,	/* struct xfrm_replay_state_esn */
++	XFRMA_SA_EXTRA_FLAGS,	/* __u32 */
++	XFRMA_PROTO,		/* __u8 */
++	XFRMA_ADDRESS_FILTER,	/* struct xfrm_address_filter */
++	XFRMA_PAD,
++	XFRMA_OFFLOAD_DEV,	/* struct xfrm_state_offload */
++	XFRMA_OUTPUT_MARK,	/* __u32 */
++	__XFRMA_MAX
++
++#define XFRMA_MAX (__XFRMA_MAX - 1)
++};
++
++struct xfrm_mark {
++	__u32           v; /* value */
++	__u32           m; /* mask */
++};
++
++enum xfrm_sadattr_type_t {
++	XFRMA_SAD_UNSPEC,
++	XFRMA_SAD_CNT,
++	XFRMA_SAD_HINFO,
++	__XFRMA_SAD_MAX
++
++#define XFRMA_SAD_MAX (__XFRMA_SAD_MAX - 1)
++};
++
++struct xfrmu_sadhinfo {
++	__u32 sadhcnt; /* current hash bkts */
++	__u32 sadhmcnt; /* max allowed hash bkts */
++};
++
++enum xfrm_spdattr_type_t {
++	XFRMA_SPD_UNSPEC,
++	XFRMA_SPD_INFO,
++	XFRMA_SPD_HINFO,
++	XFRMA_SPD_IPV4_HTHRESH,
++	XFRMA_SPD_IPV6_HTHRESH,
++	__XFRMA_SPD_MAX
++
++#define XFRMA_SPD_MAX (__XFRMA_SPD_MAX - 1)
++};
++
++struct xfrmu_spdinfo {
++	__u32 incnt;
++	__u32 outcnt;
++	__u32 fwdcnt;
++	__u32 inscnt;
++	__u32 outscnt;
++	__u32 fwdscnt;
++};
++
++struct xfrmu_spdhinfo {
++	__u32 spdhcnt;
++	__u32 spdhmcnt;
++};
++
++struct xfrmu_spdhthresh {
++	__u8 lbits;
++	__u8 rbits;
++};
++
++struct xfrm_usersa_info {
++	struct xfrm_selector		sel;
++	struct xfrm_id			id;
++	xfrm_address_t			saddr;
++	struct xfrm_lifetime_cfg	lft;
++	struct xfrm_lifetime_cur	curlft;
++	struct xfrm_stats		stats;
++	__u32				seq;
++	__u32				reqid;
++	__u16				family;
++	__u8				mode;		/* XFRM_MODE_xxx */
++	__u8				replay_window;
++	__u8				flags;
++#define XFRM_STATE_NOECN	1
++#define XFRM_STATE_DECAP_DSCP	2
++#define XFRM_STATE_NOPMTUDISC	4
++#define XFRM_STATE_WILDRECV	8
++#define XFRM_STATE_ICMP		16
++#define XFRM_STATE_AF_UNSPEC	32
++#define XFRM_STATE_ALIGN4	64
++#define XFRM_STATE_ESN		128
++};
++
++#define XFRM_SA_XFLAG_DONT_ENCAP_DSCP	1
++
++struct xfrm_usersa_id {
++	xfrm_address_t			daddr;
++	__be32				spi;
++	__u16				family;
++	__u8				proto;
++};
++
++struct xfrm_aevent_id {
++	struct xfrm_usersa_id		sa_id;
++	xfrm_address_t			saddr;
++	__u32				flags;
++	__u32				reqid;
++};
++
++struct xfrm_userspi_info {
++	struct xfrm_usersa_info		info;
++	__u32				min;
++	__u32				max;
++};
++
++struct xfrm_userpolicy_info {
++	struct xfrm_selector		sel;
++	struct xfrm_lifetime_cfg	lft;
++	struct xfrm_lifetime_cur	curlft;
++	__u32				priority;
++	__u32				index;
++	__u8				dir;
++	__u8				action;
++#define XFRM_POLICY_ALLOW	0
++#define XFRM_POLICY_BLOCK	1
++	__u8				flags;
++#define XFRM_POLICY_LOCALOK	1	/* Allow user to override global policy */
++	/* Automatically expand selector to include matching ICMP payloads. */
++#define XFRM_POLICY_ICMP	2
++	__u8				share;
++};
++
++struct xfrm_userpolicy_id {
++	struct xfrm_selector		sel;
++	__u32				index;
++	__u8				dir;
++};
++
++struct xfrm_user_acquire {
++	struct xfrm_id			id;
++	xfrm_address_t			saddr;
++	struct xfrm_selector		sel;
++	struct xfrm_userpolicy_info	policy;
++	__u32				aalgos;
++	__u32				ealgos;
++	__u32				calgos;
++	__u32				seq;
++};
++
++struct xfrm_user_expire {
++	struct xfrm_usersa_info		state;
++	__u8				hard;
++};
++
++struct xfrm_user_polexpire {
++	struct xfrm_userpolicy_info	pol;
++	__u8				hard;
++};
++
++struct xfrm_usersa_flush {
++	__u8				proto;
++};
++
++struct xfrm_user_report {
++	__u8				proto;
++	struct xfrm_selector		sel;
++};
++
++/* Used by MIGRATE to pass addresses IKE should use to perform
++ * SA negotiation with the peer */
++struct xfrm_user_kmaddress {
++	xfrm_address_t                  local;
++	xfrm_address_t                  remote;
++	__u32				reserved;
++	__u16				family;
++};
++
++struct xfrm_user_migrate {
++	xfrm_address_t			old_daddr;
++	xfrm_address_t			old_saddr;
++	xfrm_address_t			new_daddr;
++	xfrm_address_t			new_saddr;
++	__u8				proto;
++	__u8				mode;
++	__u16				reserved;
++	__u32				reqid;
++	__u16				old_family;
++	__u16				new_family;
++};
++
++struct xfrm_user_mapping {
++	struct xfrm_usersa_id		id;
++	__u32				reqid;
++	xfrm_address_t			old_saddr;
++	xfrm_address_t			new_saddr;
++	__be16				old_sport;
++	__be16				new_sport;
++};
++
++struct xfrm_address_filter {
++	xfrm_address_t			saddr;
++	xfrm_address_t			daddr;
++	__u16				family;
++	__u8				splen;
++	__u8				dplen;
++};
++
++struct xfrm_user_offload {
++	int				ifindex;
++	__u8				flags;
++};
++#define XFRM_OFFLOAD_IPV6	1
++#define XFRM_OFFLOAD_INBOUND	2
++
++/* backwards compatibility for userspace */
++#define XFRMGRP_ACQUIRE		1
++#define XFRMGRP_EXPIRE		2
++#define XFRMGRP_SA		4
++#define XFRMGRP_POLICY		8
++#define XFRMGRP_REPORT		0x20
++
++enum xfrm_nlgroups {
++	XFRMNLGRP_NONE,
++#define XFRMNLGRP_NONE		XFRMNLGRP_NONE
++	XFRMNLGRP_ACQUIRE,
++#define XFRMNLGRP_ACQUIRE	XFRMNLGRP_ACQUIRE
++	XFRMNLGRP_EXPIRE,
++#define XFRMNLGRP_EXPIRE	XFRMNLGRP_EXPIRE
++	XFRMNLGRP_SA,
++#define XFRMNLGRP_SA		XFRMNLGRP_SA
++	XFRMNLGRP_POLICY,
++#define XFRMNLGRP_POLICY	XFRMNLGRP_POLICY
++	XFRMNLGRP_AEVENTS,
++#define XFRMNLGRP_AEVENTS	XFRMNLGRP_AEVENTS
++	XFRMNLGRP_REPORT,
++#define XFRMNLGRP_REPORT	XFRMNLGRP_REPORT
++	XFRMNLGRP_MIGRATE,
++#define XFRMNLGRP_MIGRATE	XFRMNLGRP_MIGRATE
++	XFRMNLGRP_MAPPING,
++#define XFRMNLGRP_MAPPING	XFRMNLGRP_MAPPING
++	__XFRMNLGRP_MAX
++};
++#define XFRMNLGRP_MAX	(__XFRMNLGRP_MAX - 1)
++
++#endif /* _LINUX_XFRM_H */
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0037-uapi-add-include-linux-vm_sockets_diag.h.patch b/SOURCES/0037-uapi-add-include-linux-vm_sockets_diag.h.patch
new file mode 100644
index 0000000..46d589f
--- /dev/null
+++ b/SOURCES/0037-uapi-add-include-linux-vm_sockets_diag.h.patch
@@ -0,0 +1,64 @@
+From 74e00895532b878a902f9b0477e1b00d1be9df59 Mon Sep 17 00:00:00 2001
+From: Stefano Brivio <sbrivio@redhat.com>
+Date: Sun, 22 Oct 2017 21:44:25 +0200
+Subject: [PATCH] uapi: add include linux/vm_sockets_diag.h
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1472759
+Upstream Status: iproute2.git commit e9b0d82dfac2
+
+commit e9b0d82dfac25912cf757945d9caf6fe2371f526
+Author: Stephen Hemminger <stephen@networkplumber.org>
+Date:   Wed Oct 11 10:49:25 2017 -0700
+
+    uapi: add include linux/vm_sockets_diag.h
+
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+
+Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
+---
+ include/uapi/linux/vm_sockets_diag.h | 33 +++++++++++++++++++++++++++++++++
+ 1 file changed, 33 insertions(+)
+ create mode 100644 include/uapi/linux/vm_sockets_diag.h
+
+diff --git a/include/uapi/linux/vm_sockets_diag.h b/include/uapi/linux/vm_sockets_diag.h
+new file mode 100644
+index 0000000..a732a6f
+--- /dev/null
++++ b/include/uapi/linux/vm_sockets_diag.h
+@@ -0,0 +1,33 @@
++/* AF_VSOCK sock_diag(7) interface for querying open sockets */
++
++#ifndef __VM_SOCKETS_DIAG_H__
++#define __VM_SOCKETS_DIAG_H__
++
++#include <linux/types.h>
++
++/* Request */
++struct vsock_diag_req {
++	__u8	sdiag_family;	/* must be AF_VSOCK */
++	__u8	sdiag_protocol;	/* must be 0 */
++	__u16	pad;		/* must be 0 */
++	__u32	vdiag_states;	/* query bitmap (e.g. 1 << TCP_LISTEN) */
++	__u32	vdiag_ino;	/* must be 0 (reserved) */
++	__u32	vdiag_show;	/* must be 0 (reserved) */
++	__u32	vdiag_cookie[2];
++};
++
++/* Response */
++struct vsock_diag_msg {
++	__u8	vdiag_family;	/* AF_VSOCK */
++	__u8	vdiag_type;	/* SOCK_STREAM or SOCK_DGRAM */
++	__u8	vdiag_state;	/* sk_state (e.g. TCP_LISTEN) */
++	__u8	vdiag_shutdown; /* local RCV_SHUTDOWN | SEND_SHUTDOWN */
++	__u32   vdiag_src_cid;
++	__u32   vdiag_src_port;
++	__u32   vdiag_dst_cid;
++	__u32   vdiag_dst_port;
++	__u32	vdiag_ino;
++	__u32	vdiag_cookie[2];
++};
++
++#endif /* __VM_SOCKETS_DIAG_H__ */
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0038-ss-allow-AF_FAMILY-constants-32.patch b/SOURCES/0038-ss-allow-AF_FAMILY-constants-32.patch
new file mode 100644
index 0000000..2c0fbfd
--- /dev/null
+++ b/SOURCES/0038-ss-allow-AF_FAMILY-constants-32.patch
@@ -0,0 +1,213 @@
+From f59533eb3cb188a23456444aeb19ac3634eddd8c Mon Sep 17 00:00:00 2001
+From: Stefano Brivio <sbrivio@redhat.com>
+Date: Sun, 22 Oct 2017 21:44:26 +0200
+Subject: [PATCH] ss: allow AF_FAMILY constants >32
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1472759
+Upstream Status: iproute2.git commit b338a3e7e7d9
+
+commit b338a3e7e7d95c9d46de9748604da06287664033
+Author: Stefan Hajnoczi <stefanha@redhat.com>
+Date:   Fri Oct 6 11:48:39 2017 -0400
+
+    ss: allow AF_FAMILY constants >32
+
+    Linux has more than 32 address families defined in <bits/socket.h>.  Use
+    a 64-bit type so all of them can be represented in the filter->families
+    bitmask.
+
+    It's easy to introduce bugs when using (1 << AF_FAMILY) because the
+    value is 32-bit.  This can produce incorrect results from bitmask
+    operations so introduce the FAMILY_MASK() macro to eliminate these bugs.
+
+    Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
+
+Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
+---
+ misc/ss.c | 54 ++++++++++++++++++++++++++++--------------------------
+ 1 file changed, 28 insertions(+), 26 deletions(-)
+
+diff --git a/misc/ss.c b/misc/ss.c
+index d3fb9a7..0d64527 100644
+--- a/misc/ss.c
++++ b/misc/ss.c
+@@ -170,55 +170,57 @@ enum {
+ struct filter {
+ 	int dbs;
+ 	int states;
+-	int families;
++	uint64_t families;
+ 	struct ssfilter *f;
+ 	bool kill;
+ };
+ 
++#define FAMILY_MASK(family) ((uint64_t)1 << (family))
++
+ static const struct filter default_dbs[MAX_DB] = {
+ 	[TCP_DB] = {
+ 		.states   = SS_CONN,
+-		.families = (1 << AF_INET) | (1 << AF_INET6),
++		.families = FAMILY_MASK(AF_INET) | FAMILY_MASK(AF_INET6),
+ 	},
+ 	[DCCP_DB] = {
+ 		.states   = SS_CONN,
+-		.families = (1 << AF_INET) | (1 << AF_INET6),
++		.families = FAMILY_MASK(AF_INET) | FAMILY_MASK(AF_INET6),
+ 	},
+ 	[UDP_DB] = {
+ 		.states   = (1 << SS_ESTABLISHED),
+-		.families = (1 << AF_INET) | (1 << AF_INET6),
++		.families = FAMILY_MASK(AF_INET) | FAMILY_MASK(AF_INET6),
+ 	},
+ 	[RAW_DB] = {
+ 		.states   = (1 << SS_ESTABLISHED),
+-		.families = (1 << AF_INET) | (1 << AF_INET6),
++		.families = FAMILY_MASK(AF_INET) | FAMILY_MASK(AF_INET6),
+ 	},
+ 	[UNIX_DG_DB] = {
+ 		.states   = (1 << SS_CLOSE),
+-		.families = (1 << AF_UNIX),
++		.families = FAMILY_MASK(AF_UNIX),
+ 	},
+ 	[UNIX_ST_DB] = {
+ 		.states   = SS_CONN,
+-		.families = (1 << AF_UNIX),
++		.families = FAMILY_MASK(AF_UNIX),
+ 	},
+ 	[UNIX_SQ_DB] = {
+ 		.states   = SS_CONN,
+-		.families = (1 << AF_UNIX),
++		.families = FAMILY_MASK(AF_UNIX),
+ 	},
+ 	[PACKET_DG_DB] = {
+ 		.states   = (1 << SS_CLOSE),
+-		.families = (1 << AF_PACKET),
++		.families = FAMILY_MASK(AF_PACKET),
+ 	},
+ 	[PACKET_R_DB] = {
+ 		.states   = (1 << SS_CLOSE),
+-		.families = (1 << AF_PACKET),
++		.families = FAMILY_MASK(AF_PACKET),
+ 	},
+ 	[NETLINK_DB] = {
+ 		.states   = (1 << SS_CLOSE),
+-		.families = (1 << AF_NETLINK),
++		.families = FAMILY_MASK(AF_NETLINK),
+ 	},
+ 	[SCTP_DB] = {
+ 		.states   = SS_CONN,
+-		.families = (1 << AF_INET) | (1 << AF_INET6),
++		.families = FAMILY_MASK(AF_INET) | FAMILY_MASK(AF_INET6),
+ 	},
+ };
+ 
+@@ -258,14 +260,14 @@ static void filter_db_set(struct filter *f, int db)
+ static void filter_af_set(struct filter *f, int af)
+ {
+ 	f->states	   |= default_afs[af].states;
+-	f->families	   |= 1 << af;
++	f->families	   |= FAMILY_MASK(af);
+ 	do_default	    = 0;
+ 	preferred_family    = af;
+ }
+ 
+ static int filter_af_get(struct filter *f, int af)
+ {
+-	return f->families & (1 << af);
++	return !!(f->families & FAMILY_MASK(af));
+ }
+ 
+ static void filter_default_dbs(struct filter *f)
+@@ -302,7 +304,7 @@ static void filter_merge_defaults(struct filter *f)
+ 			f->families |= default_dbs[db].families;
+ 	}
+ 	for (af = 0; af < AF_MAX; af++) {
+-		if (!(f->families & (1 << af)))
++		if (!(f->families & FAMILY_MASK(af)))
+ 			continue;
+ 
+ 		if (!(default_afs[af].dbs & f->dbs))
+@@ -2599,7 +2601,7 @@ static int show_one_inet_sock(const struct sockaddr_nl *addr,
+ 	struct inet_diag_msg *r = NLMSG_DATA(h);
+ 	struct sockstat s = {};
+ 
+-	if (!(diag_arg->f->families & (1 << r->idiag_family)))
++	if (!(diag_arg->f->families & FAMILY_MASK(r->idiag_family)))
+ 		return 0;
+ 
+ 	parse_diag_msg(h, &s);
+@@ -2785,7 +2787,7 @@ static int tcp_show(struct filter *f)
+ 		return -1;
+ 	}
+ 
+-	if (f->families & (1<<AF_INET)) {
++	if (f->families & FAMILY_MASK(AF_INET)) {
+ 		if ((fp = net_tcp_open()) == NULL)
+ 			goto outerr;
+ 
+@@ -2795,7 +2797,7 @@ static int tcp_show(struct filter *f)
+ 		fclose(fp);
+ 	}
+ 
+-	if ((f->families & (1<<AF_INET6)) &&
++	if ((f->families & FAMILY_MASK(AF_INET6)) &&
+ 	    (fp = net_tcp6_open()) != NULL) {
+ 		setbuffer(fp, buf, bufsize);
+ 		if (generic_record_read(fp, tcp_show_line, f, AF_INET6))
+@@ -2894,7 +2896,7 @@ static int udp_show(struct filter *f)
+ 	    && inet_show_netlink(f, NULL, IPPROTO_UDP) == 0)
+ 		return 0;
+ 
+-	if (f->families&(1<<AF_INET)) {
++	if (f->families&FAMILY_MASK(AF_INET)) {
+ 		if ((fp = net_udp_open()) == NULL)
+ 			goto outerr;
+ 		if (generic_record_read(fp, dgram_show_line, f, AF_INET))
+@@ -2902,7 +2904,7 @@ static int udp_show(struct filter *f)
+ 		fclose(fp);
+ 	}
+ 
+-	if ((f->families&(1<<AF_INET6)) &&
++	if ((f->families&FAMILY_MASK(AF_INET6)) &&
+ 	    (fp = net_udp6_open()) != NULL) {
+ 		if (generic_record_read(fp, dgram_show_line, f, AF_INET6))
+ 			goto outerr;
+@@ -2934,7 +2936,7 @@ static int raw_show(struct filter *f)
+ 	    inet_show_netlink(f, NULL, IPPROTO_RAW) == 0)
+ 		return 0;
+ 
+-	if (f->families&(1<<AF_INET)) {
++	if (f->families&FAMILY_MASK(AF_INET)) {
+ 		if ((fp = net_raw_open()) == NULL)
+ 			goto outerr;
+ 		if (generic_record_read(fp, dgram_show_line, f, AF_INET))
+@@ -2942,7 +2944,7 @@ static int raw_show(struct filter *f)
+ 		fclose(fp);
+ 	}
+ 
+-	if ((f->families&(1<<AF_INET6)) &&
++	if ((f->families&FAMILY_MASK(AF_INET6)) &&
+ 	    (fp = net_raw6_open()) != NULL) {
+ 		if (generic_record_read(fp, dgram_show_line, f, AF_INET6))
+ 			goto outerr;
+@@ -3682,13 +3684,13 @@ static int handle_follow_request(struct filter *f)
+ 	int groups = 0;
+ 	struct rtnl_handle rth;
+ 
+-	if (f->families & (1 << AF_INET) && f->dbs & (1 << TCP_DB))
++	if (f->families & FAMILY_MASK(AF_INET) && f->dbs & (1 << TCP_DB))
+ 		groups |= 1 << (SKNLGRP_INET_TCP_DESTROY - 1);
+-	if (f->families & (1 << AF_INET) && f->dbs & (1 << UDP_DB))
++	if (f->families & FAMILY_MASK(AF_INET) && f->dbs & (1 << UDP_DB))
+ 		groups |= 1 << (SKNLGRP_INET_UDP_DESTROY - 1);
+-	if (f->families & (1 << AF_INET6) && f->dbs & (1 << TCP_DB))
++	if (f->families & FAMILY_MASK(AF_INET6) && f->dbs & (1 << TCP_DB))
+ 		groups |= 1 << (SKNLGRP_INET6_TCP_DESTROY - 1);
+-	if (f->families & (1 << AF_INET6) && f->dbs & (1 << UDP_DB))
++	if (f->families & FAMILY_MASK(AF_INET6) && f->dbs & (1 << UDP_DB))
+ 		groups |= 1 << (SKNLGRP_INET6_UDP_DESTROY - 1);
+ 
+ 	if (groups == 0)
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0039-ss-add-AF_VSOCK-support.patch b/SOURCES/0039-ss-add-AF_VSOCK-support.patch
new file mode 100644
index 0000000..ce5b7fb
--- /dev/null
+++ b/SOURCES/0039-ss-add-AF_VSOCK-support.patch
@@ -0,0 +1,398 @@
+From fe898bd10be2bc527f81421f06afff77e8ba42eb Mon Sep 17 00:00:00 2001
+From: Stefano Brivio <sbrivio@redhat.com>
+Date: Sun, 22 Oct 2017 21:44:27 +0200
+Subject: [PATCH] ss: add AF_VSOCK support
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1472759
+Upstream Status: iproute2.git commit c759116a0b2b
+
+commit c759116a0b2b6da8df9687b0a40ac69050132c77
+Author: Stefan Hajnoczi <stefanha@redhat.com>
+Date:   Fri Oct 6 11:48:41 2017 -0400
+
+    ss: add AF_VSOCK support
+
+    The AF_VSOCK address family is a host<->guest communications channel
+    supported by VMware, KVM, and Hyper-V.  Initial VMware support was
+    released in Linux 3.9 in 2013 and transports for other hypervisors were
+    added later.
+
+    AF_VSOCK addresses are <u32 cid, u32 port> tuples.  The 32-bit cid
+    integer is comparable to an IP address.  AF_VSOCK ports work like
+    TCP/UDP ports.
+
+    Both SOCK_STREAM and SOCK_DGRAM socket types are available.
+
+    This patch adds AF_VSOCK support to ss(8) so that sockets can be
+    observed.
+
+    Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
+
+Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
+---
+ man/man8/ss.8 |   8 ++-
+ misc/ss.c     | 184 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 188 insertions(+), 4 deletions(-)
+
+diff --git a/man/man8/ss.8 b/man/man8/ss.8
+index 81de69d..4323eee 100644
+--- a/man/man8/ss.8
++++ b/man/man8/ss.8
+@@ -125,14 +125,18 @@ Display Unix domain sockets (alias for -f unix).
+ .B \-S, \-\-sctp
+ Display SCTP sockets.
+ .TP
++.B \-\-vsock
++Display vsock sockets (alias for -f vsock).
++.TP
+ .B \-f FAMILY, \-\-family=FAMILY
+ Display sockets of type FAMILY.
+-Currently the following families are supported: unix, inet, inet6, link, netlink.
++Currently the following families are supported: unix, inet, inet6, link, netlink, vsock.
+ .TP
+ .B \-A QUERY, \-\-query=QUERY, \-\-socket=QUERY
+ List of socket tables to dump, separated by commas. The following identifiers
+ are understood: all, inet, tcp, udp, raw, unix, packet, netlink, unix_dgram,
+-unix_stream, unix_seqpacket, packet_raw, packet_dgram, dccp, sctp.
++unix_stream, unix_seqpacket, packet_raw, packet_dgram, dccp, sctp,
++vsock_stream, vsock_dgram.
+ .TP
+ .B \-D FILE, \-\-diag=FILE
+ Do not display anything, just dump raw information about TCP sockets to FILE after applying filters. If FILE is - stdout is used.
+diff --git a/misc/ss.c b/misc/ss.c
+index 0d64527..e922665 100644
+--- a/misc/ss.c
++++ b/misc/ss.c
+@@ -44,6 +44,7 @@
+ #include <linux/packet_diag.h>
+ #include <linux/netlink_diag.h>
+ #include <linux/sctp.h>
++#include <linux/vm_sockets_diag.h>
+ 
+ #define MAGIC_SEQ 123456
+ 
+@@ -126,6 +127,8 @@ enum {
+ 	PACKET_R_DB,
+ 	NETLINK_DB,
+ 	SCTP_DB,
++	VSOCK_ST_DB,
++	VSOCK_DG_DB,
+ 	MAX_DB
+ };
+ 
+@@ -134,6 +137,7 @@ enum {
+ #define ALL_DB ((1<<MAX_DB)-1)
+ #define INET_L4_DBM ((1<<TCP_DB)|(1<<UDP_DB)|(1<<DCCP_DB)|(1<<SCTP_DB))
+ #define INET_DBM (INET_L4_DBM | (1<<RAW_DB))
++#define VSOCK_DBM ((1<<VSOCK_ST_DB)|(1<<VSOCK_DG_DB))
+ 
+ enum {
+ 	SS_UNKNOWN,
+@@ -222,6 +226,14 @@ static const struct filter default_dbs[MAX_DB] = {
+ 		.states   = SS_CONN,
+ 		.families = FAMILY_MASK(AF_INET) | FAMILY_MASK(AF_INET6),
+ 	},
++	[VSOCK_ST_DB] = {
++		.states   = SS_CONN,
++		.families = FAMILY_MASK(AF_VSOCK),
++	},
++	[VSOCK_DG_DB] = {
++		.states   = SS_CONN,
++		.families = FAMILY_MASK(AF_VSOCK),
++	},
+ };
+ 
+ static const struct filter default_afs[AF_MAX] = {
+@@ -245,6 +257,10 @@ static const struct filter default_afs[AF_MAX] = {
+ 		.dbs    = (1 << NETLINK_DB),
+ 		.states = (1 << SS_CLOSE),
+ 	},
++	[AF_VSOCK] = {
++		.dbs    = VSOCK_DBM,
++		.states = SS_CONN,
++	},
+ };
+ 
+ static int do_default = 1;
+@@ -283,6 +299,8 @@ static void filter_default_dbs(struct filter *f)
+ 	filter_db_set(f, PACKET_DG_DB);
+ 	filter_db_set(f, NETLINK_DB);
+ 	filter_db_set(f, SCTP_DB);
++	filter_db_set(f, VSOCK_ST_DB);
++	filter_db_set(f, VSOCK_DG_DB);
+ }
+ 
+ static void filter_states_set(struct filter *f, int states)
+@@ -792,6 +810,18 @@ static const char *proto_name(int protocol)
+ 	return "???";
+ }
+ 
++static const char *vsock_netid_name(int type)
++{
++	switch (type) {
++	case SOCK_STREAM:
++		return "v_str";
++	case SOCK_DGRAM:
++		return "v_dgr";
++	default:
++		return "???";
++	}
++}
++
+ static void sock_state_print(struct sockstat *s)
+ {
+ 	const char *sock_name;
+@@ -824,6 +854,9 @@ static void sock_state_print(struct sockstat *s)
+ 	case AF_NETLINK:
+ 		sock_name = "nl";
+ 		break;
++	case AF_VSOCK:
++		sock_name = vsock_netid_name(s->type);
++		break;
+ 	default:
+ 		sock_name = "unknown";
+ 	}
+@@ -1139,6 +1172,8 @@ static int run_ssfilter(struct ssfilter *f, struct sockstat *s)
+ 			return s->lport == 0 && s->local.data[0] == 0;
+ 		if (s->local.family == AF_NETLINK)
+ 			return s->lport < 0;
++		if (s->local.family == AF_VSOCK)
++			return s->lport > 1023;
+ 
+ 		return is_ephemeral(s->lport);
+ 	}
+@@ -1515,6 +1550,15 @@ void *parse_devcond(char *name)
+ 	return res;
+ }
+ 
++static void vsock_set_inet_prefix(inet_prefix *a, __u32 cid)
++{
++	*a = (inet_prefix){
++		.bytelen = sizeof(cid),
++		.family = AF_VSOCK,
++	};
++	memcpy(a->data, &cid, sizeof(cid));
++}
++
+ void *parse_hostcond(char *addr, bool is_port)
+ {
+ 	char *port = NULL;
+@@ -1589,6 +1633,37 @@ void *parse_hostcond(char *addr, bool is_port)
+ 		goto out;
+ 	}
+ 
++	if (fam == AF_VSOCK || strncmp(addr, "vsock:", 6) == 0) {
++		__u32 cid = ~(__u32)0;
++
++		a.addr.family = AF_VSOCK;
++		if (strncmp(addr, "vsock:", 6) == 0)
++			addr += 6;
++
++		if (is_port)
++			port = addr;
++		else {
++			port = strchr(addr, ':');
++			if (port) {
++				*port = '\0';
++				port++;
++			}
++		}
++
++		if (port && strcmp(port, "*") &&
++		    get_u32((__u32 *)&a.port, port, 0))
++			return NULL;
++
++		if (addr[0] && strcmp(addr, "*")) {
++			a.addr.bitlen = 32;
++			if (get_u32(&cid, addr, 0))
++				return NULL;
++		}
++		vsock_set_inet_prefix(&a.addr, cid);
++		fam = AF_VSOCK;
++		goto out;
++	}
++
+ 	if (fam == AF_INET || !strncmp(addr, "inet:", 5)) {
+ 		fam = AF_INET;
+ 		if (!strncmp(addr, "inet:", 5))
+@@ -3653,6 +3728,88 @@ static int netlink_show(struct filter *f)
+ 	return 0;
+ }
+ 
++static bool vsock_type_skip(struct sockstat *s, struct filter *f)
++{
++	if (s->type == SOCK_STREAM && !(f->dbs & (1 << VSOCK_ST_DB)))
++		return true;
++	if (s->type == SOCK_DGRAM && !(f->dbs & (1 << VSOCK_DG_DB)))
++		return true;
++	return false;
++}
++
++static void vsock_addr_print(inet_prefix *a, __u32 port)
++{
++	char cid_str[sizeof("4294967295")];
++	char port_str[sizeof("4294967295")];
++	__u32 cid;
++
++	memcpy(&cid, a->data, sizeof(cid));
++
++	if (cid == ~(__u32)0)
++		snprintf(cid_str, sizeof(cid_str), "*");
++	else
++		snprintf(cid_str, sizeof(cid_str), "%u", cid);
++
++	if (port == ~(__u32)0)
++		snprintf(port_str, sizeof(port_str), "*");
++	else
++		snprintf(port_str, sizeof(port_str), "%u", port);
++
++	sock_addr_print(cid_str, ":", port_str, NULL);
++}
++
++static void vsock_stats_print(struct sockstat *s, struct filter *f)
++{
++	sock_state_print(s);
++
++	vsock_addr_print(&s->local, s->lport);
++	vsock_addr_print(&s->remote, s->rport);
++
++	proc_ctx_print(s);
++
++	printf("\n");
++}
++
++static int vsock_show_sock(const struct sockaddr_nl *addr,
++			   struct nlmsghdr *nlh, void *arg)
++{
++	struct filter *f = (struct filter *)arg;
++	struct vsock_diag_msg *r = NLMSG_DATA(nlh);
++	struct sockstat stat = {
++		.type = r->vdiag_type,
++		.lport = r->vdiag_src_port,
++		.rport = r->vdiag_dst_port,
++		.state = r->vdiag_state,
++		.ino = r->vdiag_ino,
++	};
++
++	vsock_set_inet_prefix(&stat.local, r->vdiag_src_cid);
++	vsock_set_inet_prefix(&stat.remote, r->vdiag_dst_cid);
++
++	if (vsock_type_skip(&stat, f))
++		return 0;
++
++	if (f->f && run_ssfilter(f->f, &stat) == 0)
++		return 0;
++
++	vsock_stats_print(&stat, f);
++
++	return 0;
++}
++
++static int vsock_show(struct filter *f)
++{
++	DIAG_REQUEST(req, struct vsock_diag_req r);
++
++	if (!filter_af_get(f, AF_VSOCK))
++		return 0;
++
++	req.r.sdiag_family = AF_VSOCK;
++	req.r.vdiag_states = f->states;
++
++	return handle_netlink_request(f, &req.nlh, sizeof(req), vsock_show_sock);
++}
++
+ struct sock_diag_msg {
+ 	__u8 sdiag_family;
+ };
+@@ -3673,6 +3830,8 @@ static int generic_show_sock(const struct sockaddr_nl *addr,
+ 		return packet_show_sock(addr, nlh, arg);
+ 	case AF_NETLINK:
+ 		return netlink_show_sock(addr, nlh, arg);
++	case AF_VSOCK:
++		return vsock_show_sock(addr, nlh, arg);
+ 	default:
+ 		return -1;
+ 	}
+@@ -3900,14 +4059,15 @@ static void _usage(FILE *dest)
+ "   -d, --dccp          display only DCCP sockets\n"
+ "   -w, --raw           display only RAW sockets\n"
+ "   -x, --unix          display only Unix domain sockets\n"
++"       --vsock         display only vsock sockets\n"
+ "   -f, --family=FAMILY display sockets of type FAMILY\n"
+-"       FAMILY := {inet|inet6|link|unix|netlink|help}\n"
++"       FAMILY := {inet|inet6|link|unix|netlink|vsock|help}\n"
+ "\n"
+ "   -K, --kill          forcibly close sockets, display what was closed\n"
+ "   -H, --no-header     Suppress header line\n"
+ "\n"
+ "   -A, --query=QUERY, --socket=QUERY\n"
+-"       QUERY := {all|inet|tcp|udp|raw|unix|unix_dgram|unix_stream|unix_seqpacket|packet|netlink}[,QUERY]\n"
++"       QUERY := {all|inet|tcp|udp|raw|unix|unix_dgram|unix_stream|unix_seqpacket|packet|netlink|vsock_stream|vsock_dgram}[,QUERY]\n"
+ "\n"
+ "   -D, --diag=FILE     Dump raw information about TCP sockets to FILE\n"
+ "   -F, --filter=FILE   read filter information from FILE\n"
+@@ -3980,6 +4140,9 @@ static int scan_state(const char *state)
+ 	exit(-1);
+ }
+ 
++/* Values 'v' and 'V' are already used so a non-character is used */
++#define OPT_VSOCK 256
++
+ static const struct option long_opts[] = {
+ 	{ "numeric", 0, 0, 'n' },
+ 	{ "resolve", 0, 0, 'r' },
+@@ -3996,6 +4159,7 @@ static const struct option long_opts[] = {
+ 	{ "udp", 0, 0, 'u' },
+ 	{ "raw", 0, 0, 'w' },
+ 	{ "unix", 0, 0, 'x' },
++	{ "vsock", 0, 0, OPT_VSOCK },
+ 	{ "all", 0, 0, 'a' },
+ 	{ "listening", 0, 0, 'l' },
+ 	{ "ipv4", 0, 0, '4' },
+@@ -4081,6 +4245,9 @@ int main(int argc, char *argv[])
+ 		case 'x':
+ 			filter_af_set(&current_filter, AF_UNIX);
+ 			break;
++		case OPT_VSOCK:
++			filter_af_set(&current_filter, AF_VSOCK);
++			break;
+ 		case 'a':
+ 			state_filter = SS_ALL;
+ 			break;
+@@ -4107,6 +4274,8 @@ int main(int argc, char *argv[])
+ 				filter_af_set(&current_filter, AF_UNIX);
+ 			else if (strcmp(optarg, "netlink") == 0)
+ 				filter_af_set(&current_filter, AF_NETLINK);
++			else if (strcmp(optarg, "vsock") == 0)
++				filter_af_set(&current_filter, AF_VSOCK);
+ 			else if (strcmp(optarg, "help") == 0)
+ 				help();
+ 			else {
+@@ -4172,6 +4341,15 @@ int main(int argc, char *argv[])
+ 					filter_db_set(&current_filter, PACKET_DG_DB);
+ 				} else if (strcmp(p, "netlink") == 0) {
+ 					filter_db_set(&current_filter, NETLINK_DB);
++				} else if (strcmp(p, "vsock") == 0) {
++					filter_db_set(&current_filter, VSOCK_ST_DB);
++					filter_db_set(&current_filter, VSOCK_DG_DB);
++				} else if (strcmp(p, "vsock_stream") == 0 ||
++					   strcmp(p, "v_str") == 0) {
++					filter_db_set(&current_filter, VSOCK_ST_DB);
++				} else if (strcmp(p, "vsock_dgram") == 0 ||
++					   strcmp(p, "v_dgr") == 0) {
++					filter_db_set(&current_filter, VSOCK_DG_DB);
+ 				} else {
+ 					fprintf(stderr, "ss: \"%s\" is illegal socket table id\n", p);
+ 					usage();
+@@ -4387,6 +4565,8 @@ int main(int argc, char *argv[])
+ 		dccp_show(&current_filter);
+ 	if (current_filter.dbs & (1<<SCTP_DB))
+ 		sctp_show(&current_filter);
++	if (current_filter.dbs & VSOCK_DBM)
++		vsock_show(&current_filter);
+ 
+ 	if (show_users || show_proc_ctx || show_sock_ctx)
+ 		user_ent_destroy();
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0040-link_gre6-Detect-invalid-encaplimit-values.patch b/SOURCES/0040-link_gre6-Detect-invalid-encaplimit-values.patch
new file mode 100644
index 0000000..17ed549
--- /dev/null
+++ b/SOURCES/0040-link_gre6-Detect-invalid-encaplimit-values.patch
@@ -0,0 +1,39 @@
+From 90a1430fca8d5165e1909de9f009aa9f4d6430ef Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Wed, 29 Nov 2017 18:36:17 +0100
+Subject: [PATCH] link_gre6: Detect invalid encaplimit values
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1459600
+Upstream Status: iproute2.git commit 56708ae7c9535
+
+commit 56708ae7c9535859223c5b68097b35bf0fae677c
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Tue Nov 28 16:49:58 2017 +0100
+
+    link_gre6: Detect invalid encaplimit values
+
+    Looks like a typo: get_u8() returns 0 on success and -1 on error, so the
+    error checking here was ineffective.
+
+    Fixes: a11b7b71a6eba ("link_gre6: really support encaplimit option")
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ ip/link_gre6.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/ip/link_gre6.c b/ip/link_gre6.c
+index 932f9ee..a9d18ee 100644
+--- a/ip/link_gre6.c
++++ b/ip/link_gre6.c
+@@ -351,7 +351,7 @@ get_failed:
+ 			} else {
+ 				__u8 uval;
+ 
+-				if (get_u8(&uval, *argv, 0) < -1)
++				if (get_u8(&uval, *argv, 0))
+ 					invarg("invalid ELIM", *argv);
+ 				encap_limit = uval;
+ 				flags &= ~IP6_TNL_F_IGN_ENCAP_LIMIT;
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0041-man-tc-csum.8-Fix-inconsistency-in-example-descripti.patch b/SOURCES/0041-man-tc-csum.8-Fix-inconsistency-in-example-descripti.patch
new file mode 100644
index 0000000..ddd8d95
--- /dev/null
+++ b/SOURCES/0041-man-tc-csum.8-Fix-inconsistency-in-example-descripti.patch
@@ -0,0 +1,42 @@
+From f08752c12351c79145e3a6caf346e3d971370a9c Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Wed, 6 Dec 2017 13:21:16 +0100
+Subject: [PATCH] man: tc-csum.8: Fix inconsistency in example description
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1417162
+Upstream Status: iproute2.git commit 6bf156415a588
+
+commit 6bf156415a588fa1c975be9a18a1579f63a936a2
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Wed Nov 29 18:34:09 2017 +0100
+
+    man: tc-csum.8: Fix inconsistency in example description
+
+    Commit 6bbe5e6290db5 ("man: tc-csum.8: Fix example") changed both source
+    and destination IP addresses in example code but missed to update the
+    example's description accordingly.
+
+    Fixes: 6bbe5e6290db5 ("man: tc-csum.8: Fix example")
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ man/man8/tc-csum.8 | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/man/man8/tc-csum.8 b/man/man8/tc-csum.8
+index 409ab71..65724b8 100644
+--- a/man/man8/tc-csum.8
++++ b/man/man8/tc-csum.8
+@@ -53,8 +53,8 @@ SCTP header
+ .B SWEETS
+ These are merely syntactic sugar and ignored internally.
+ .SH EXAMPLES
+-The following performs stateless NAT for incoming packets from 192.168.1.100 to
+-new destination 18.52.86.120 (0x12345678 in hex). Assuming these are UDP
++The following performs stateless NAT for incoming packets from 192.0.2.100 to
++new destination 198.51.100.1. Assuming these are UDP
+ packets, both IP and UDP checksums have to be recalculated:
+ 
+ .RS
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0042-tc-fix-command-tc-actions-del-hang-issue.patch b/SOURCES/0042-tc-fix-command-tc-actions-del-hang-issue.patch
new file mode 100644
index 0000000..54d524e
--- /dev/null
+++ b/SOURCES/0042-tc-fix-command-tc-actions-del-hang-issue.patch
@@ -0,0 +1,42 @@
+From dbc597c9d1e0e65cc9d989d8057f9a083c2f5779 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Fri, 15 Dec 2017 16:13:46 +0100
+Subject: [PATCH] tc: fix command "tc actions del" hang issue
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1526394
+Upstream Status: iproute2.git commit 83cf5bc73b858
+
+commit 83cf5bc73b858608d59c3c6126a9f37e793e15dd
+Author: Chris Mi <chrism@mellanox.com>
+Date:   Thu Dec 14 18:09:00 2017 +0900
+
+    tc: fix command "tc actions del" hang issue
+
+    If command is RTM_DELACTION, a non-NULL pointer is passed to rtnl_talk().
+    Then flag NLM_F_ACK is not set on n->nlmsg_flags and netlink_ack() will
+    not be called. Command tc will wait for the reply for ever.
+
+    Fixes: 86bf43c7c2fd ("lib/libnetlink: update rtnl_talk to support malloc buff at run time")
+    Reviewed-by: Jiri Pirko <jiri@mellanox.com>
+    Signed-off-by: Chris Mi <chrism@mellanox.com>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ tc/m_action.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tc/m_action.c b/tc/m_action.c
+index 90b2a11..7cfd9e0 100644
+--- a/tc/m_action.c
++++ b/tc/m_action.c
+@@ -507,7 +507,7 @@ static int tc_action_gd(int cmd, unsigned int flags, int *argc_p, char ***argv_p
+ 
+ 	req.n.nlmsg_seq = rth.dump = ++rth.seq;
+ 
+-	if (rtnl_talk(&rth, &req.n, &ans) < 0) {
++	if (rtnl_talk(&rth, &req.n, cmd == RTM_DELACTION ? NULL : &ans) < 0) {
+ 		fprintf(stderr, "We have an error talking to the kernel\n");
+ 		return 1;
+ 	}
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0043-ip-link-Fix-use-after-free-in-nl_get_ll_addr_len.patch b/SOURCES/0043-ip-link-Fix-use-after-free-in-nl_get_ll_addr_len.patch
new file mode 100644
index 0000000..2eda52a
--- /dev/null
+++ b/SOURCES/0043-ip-link-Fix-use-after-free-in-nl_get_ll_addr_len.patch
@@ -0,0 +1,43 @@
+From dcafeb49b2538cc7118cb64f62c685980c106b48 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Tue, 6 Mar 2018 11:35:28 +0100
+Subject: [PATCH] ip-link: Fix use after free in nl_get_ll_addr_len()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1550097
+Upstream Status: iproute2.git commit 06867c3719587
+
+commit 06867c371958773e39b4ccac07cfe3e2fff2ea55
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Mar 1 10:35:12 2018 +0100
+
+    ip-link: Fix use after free in nl_get_ll_addr_len()
+
+    Immediately after freeing the buffer returned from rtnl_talk(), it is
+    accessed again via pointer in struct rtattr array. This leads to some
+    builds not allowing to set an interface's MAC address because the
+    expected length value is garbage.
+
+    Fixes: 86bf43c7c2fdc ("lib/libnetlink: update rtnl_talk to support malloc buff at run time")
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ ip/iplink.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/ip/iplink.c b/ip/iplink.c
+index 193997c..db5b2c9 100644
+--- a/ip/iplink.c
++++ b/ip/iplink.c
+@@ -268,8 +268,9 @@ static int nl_get_ll_addr_len(unsigned int dev_index)
+ 		return -1;
+ 	}
+ 
++	len = RTA_PAYLOAD(tb[IFLA_ADDRESS]);
+ 	free(answer);
+-	return RTA_PAYLOAD(tb[IFLA_ADDRESS]);
++	return len;
+ }
+ 
+ static void iplink_parse_vf_vlan_info(int vf, int *argcp, char ***argvp,
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0044-tc-m_tunnel_key-reformat-the-usage-text.patch b/SOURCES/0044-tc-m_tunnel_key-reformat-the-usage-text.patch
new file mode 100644
index 0000000..5530aaf
--- /dev/null
+++ b/SOURCES/0044-tc-m_tunnel_key-reformat-the-usage-text.patch
@@ -0,0 +1,44 @@
+From 04ecd76fa66c7745529b3b007ad04a307d2b7518 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Wed, 6 Feb 2019 14:31:10 +0100
+Subject: [PATCH] tc: m_tunnel_key: reformat the usage text
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1658506
+Upstream Status: iproute2.git commit 50907a8245ea3
+
+commit 50907a8245ea37875fb877d6f21f51a1f247b167
+Author: Jiri Benc <jbenc@redhat.com>
+Date:   Wed Jun 14 21:29:49 2017 +0200
+
+    tc: m_tunnel_key: reformat the usage text
+
+    Adding new tunnel key fields would cause the usage line overflow 80 chars.
+    Make the usage text similar to other commands.
+
+    Signed-off-by: Jiri Benc <jbenc@redhat.com>
+---
+ tc/m_tunnel_key.c | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+diff --git a/tc/m_tunnel_key.c b/tc/m_tunnel_key.c
+index 3ceec1c..5222c25 100644
+--- a/tc/m_tunnel_key.c
++++ b/tc/m_tunnel_key.c
+@@ -22,7 +22,13 @@
+ static void explain(void)
+ {
+ 	fprintf(stderr, "Usage: tunnel_key unset\n");
+-	fprintf(stderr, "       tunnel_key set id TUNNELID src_ip IP dst_ip IP dst_port UDP_PORT\n");
++	fprintf(stderr, "       tunnel_key set <TUNNEL_KEY>\n");
++	fprintf(stderr,
++		"Where TUNNEL_KEY is a combination of:\n"
++		"id <TUNNELID> (mandatory)\n"
++		"src_ip <IP> (mandatory)\n"
++		"dst_ip <IP> (mandatory)\n"
++		"dst_port <UDP_PORT>\n");
+ }
+ 
+ static void usage(void)
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0045-tc-m_tunnel_key-Allow-key-less-tunnels.patch b/SOURCES/0045-tc-m_tunnel_key-Allow-key-less-tunnels.patch
new file mode 100644
index 0000000..76c2a4f
--- /dev/null
+++ b/SOURCES/0045-tc-m_tunnel_key-Allow-key-less-tunnels.patch
@@ -0,0 +1,88 @@
+From f43f500151a6261e24d89674b0a44f2d84c9e207 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Wed, 6 Feb 2019 14:21:09 +0100
+Subject: [PATCH] tc: m_tunnel_key: Allow key-less tunnels
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1658506
+Upstream Status: iproute2.git commit dc0332b1e8e4a
+Conflicts: Context change due to missing commit 59eb271d1d259
+           ("tc: m_tunnel_key: add csum/nocsum option").
+
+commit dc0332b1e8e4ab8771562128993d512986f856e2
+Author: Adi Nissim <adin@mellanox.com>
+Date:   Thu Jan 10 15:03:50 2019 +0200
+
+    tc: m_tunnel_key: Allow key-less tunnels
+
+    Change the id parameter of the tunnel_key set action from mandatory to
+    optional.
+
+    Some tunneling protocols (e.g. GRE) specify the id as an optional field.
+
+    Signed-off-by: Adi Nissim <adin@mellanox.com>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ man/man8/tc-tunnel_key.8 | 4 ++--
+ tc/m_tunnel_key.c        | 6 ++----
+ 2 files changed, 4 insertions(+), 6 deletions(-)
+
+diff --git a/man/man8/tc-tunnel_key.8 b/man/man8/tc-tunnel_key.8
+index 2e56973..52fa585 100644
+--- a/man/man8/tc-tunnel_key.8
++++ b/man/man8/tc-tunnel_key.8
+@@ -56,12 +56,12 @@ above).
+ .TP
+ .B set
+ Set tunnel metadata to be used by the IP tunnel device. Requires
+-.B id
+-,
+ .B src_ip
+ and
+ .B dst_ip
+ options.
++.B id
++,
+ .B dst_port
+ is optional.
+ .RS
+diff --git a/tc/m_tunnel_key.c b/tc/m_tunnel_key.c
+index 5222c25..acbcfc1 100644
+--- a/tc/m_tunnel_key.c
++++ b/tc/m_tunnel_key.c
+@@ -25,7 +25,7 @@ static void explain(void)
+ 	fprintf(stderr, "       tunnel_key set <TUNNEL_KEY>\n");
+ 	fprintf(stderr,
+ 		"Where TUNNEL_KEY is a combination of:\n"
+-		"id <TUNNELID> (mandatory)\n"
++		"id <TUNNELID>\n"
+ 		"src_ip <IP> (mandatory)\n"
+ 		"dst_ip <IP> (mandatory)\n"
+ 		"dst_port <UDP_PORT>\n");
+@@ -91,7 +91,6 @@ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p,
+ 	int ret;
+ 	int has_src_ip = 0;
+ 	int has_dst_ip = 0;
+-	int has_key_id = 0;
+ 
+ 	if (matches(*argv, "tunnel_key") != 0)
+ 		return -1;
+@@ -147,7 +146,6 @@ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p,
+ 				fprintf(stderr, "Illegal \"id\"\n");
+ 				return -1;
+ 			}
+-			has_key_id = 1;
+ 		} else if (matches(*argv, "dst_port") == 0) {
+ 			NEXT_ARG();
+ 			ret = tunnel_key_parse_dst_port(*argv,
+@@ -180,7 +178,7 @@ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p,
+ 	}
+ 
+ 	if (action == TCA_TUNNEL_KEY_ACT_SET &&
+-	    (!has_src_ip || !has_dst_ip || !has_key_id)) {
++	    (!has_src_ip || !has_dst_ip)) {
+ 		fprintf(stderr, "set needs tunnel_key parameters\n");
+ 		explain();
+ 		return -1;
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0046-tc-include-stdint.h-explicitly-for-UINT16_MAX.patch b/SOURCES/0046-tc-include-stdint.h-explicitly-for-UINT16_MAX.patch
new file mode 100644
index 0000000..ed0d248
--- /dev/null
+++ b/SOURCES/0046-tc-include-stdint.h-explicitly-for-UINT16_MAX.patch
@@ -0,0 +1,39 @@
+From 7a77e4df94a48c35f9a4bf1fc3f8e9d1f72a77b7 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Wed, 6 Feb 2019 14:50:24 +0100
+Subject: [PATCH] tc: include stdint.h explicitly for UINT16_MAX
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1641909
+Upstream Status: iproute2.git commit ae717baf15fb4
+
+commit ae717baf15fb4d30749ada3948d9445892bac239
+Author: Khem Raj <raj.khem@gmail.com>
+Date:   Sat May 20 14:28:46 2017 -0700
+
+    tc: include stdint.h explicitly for UINT16_MAX
+
+    Fixes
+    | tc_core.c:190:29: error: 'UINT16_MAX' undeclared (first use in this function); did you mean '__INT16_MAX__'?
+    |    if ((sz >> s->size_log) > UINT16_MAX) {
+    |                              ^~~~~~~~~~
+
+    Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ tc/tc_core.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/tc/tc_core.c b/tc/tc_core.c
+index 7bbe0d7..821b741 100644
+--- a/tc/tc_core.c
++++ b/tc/tc_core.c
+@@ -12,6 +12,7 @@
+ 
+ #include <stdio.h>
+ #include <stdlib.h>
++#include <stdint.h>
+ #include <unistd.h>
+ #include <syslog.h>
+ #include <fcntl.h>
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0047-Update-kernel-headers.patch b/SOURCES/0047-Update-kernel-headers.patch
new file mode 100644
index 0000000..916d932
--- /dev/null
+++ b/SOURCES/0047-Update-kernel-headers.patch
@@ -0,0 +1,5651 @@
+From 007c76937f34c11c4c827373f081a9c4eebf1fc3 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Wed, 6 Feb 2019 14:50:24 +0100
+Subject: [PATCH] Update kernel headers
+
+This updates kernel headers to upstream commit
+761ec9e29ff867452057f59dc6ca430688b409ea. Update was done via:
+
+| git checkout 761ec9e29ff867452057f59dc6ca430688b409ea -- include/uapi
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1641909
+Upstream Status: RHEL-only
+---
+ include/uapi/linux/atm.h                       |    1 +
+ include/uapi/linux/atmapi.h                    |    1 +
+ include/uapi/linux/atmarp.h                    |    1 +
+ include/uapi/linux/atmdev.h                    |    1 +
+ include/uapi/linux/atmioc.h                    |    1 +
+ include/uapi/linux/atmsap.h                    |    1 +
+ include/uapi/linux/bpf.h                       | 2481 ++++++++++++++++++++----
+ include/uapi/linux/bpf_common.h                |    8 +-
+ include/uapi/linux/btf.h                       |  113 ++
+ include/uapi/linux/can.h                       |    1 +
+ include/uapi/linux/can/netlink.h               |    2 +
+ include/uapi/linux/can/vxcan.h                 |    1 +
+ include/uapi/linux/devlink.h                   |   82 +
+ include/uapi/linux/elf-em.h                    |    1 +
+ include/uapi/linux/fib_rules.h                 |   12 +-
+ include/uapi/linux/filter.h                    |    1 +
+ include/uapi/linux/fou.h                       |    1 +
+ include/uapi/linux/gen_stats.h                 |    1 +
+ include/uapi/linux/genetlink.h                 |    1 +
+ include/uapi/linux/hdlc/ioctl.h                |    1 +
+ include/uapi/linux/icmpv6.h                    |    1 +
+ include/uapi/linux/if.h                        |    1 +
+ include/uapi/linux/if_addr.h                   |    2 +
+ include/uapi/linux/if_addrlabel.h              |    1 +
+ include/uapi/linux/if_alg.h                    |    1 +
+ include/uapi/linux/if_arp.h                    |    1 +
+ include/uapi/linux/if_bonding.h                |    1 +
+ include/uapi/linux/if_bridge.h                 |    1 +
+ include/uapi/linux/if_ether.h                  |   11 +
+ include/uapi/linux/if_link.h                   |   59 +
+ include/uapi/linux/if_macsec.h                 |   10 +-
+ include/uapi/linux/if_packet.h                 |    1 +
+ include/uapi/linux/if_tun.h                    |    5 +
+ include/uapi/linux/if_tunnel.h                 |    5 +
+ include/uapi/linux/if_vlan.h                   |    1 +
+ include/uapi/linux/ife.h                       |    1 +
+ include/uapi/linux/ila.h                       |   23 +
+ include/uapi/linux/in.h                        |    1 +
+ include/uapi/linux/in6.h                       |    2 +
+ include/uapi/linux/in_route.h                  |    1 +
+ include/uapi/linux/inet_diag.h                 |    3 +
+ include/uapi/linux/ip.h                        |    1 +
+ include/uapi/linux/ip6_tunnel.h                |    3 +
+ include/uapi/linux/ipsec.h                     |    1 +
+ include/uapi/linux/kernel.h                    |    1 +
+ include/uapi/linux/l2tp.h                      |    7 +-
+ include/uapi/linux/libc-compat.h               |   56 +-
+ include/uapi/linux/limits.h                    |    1 +
+ include/uapi/linux/lwtunnel.h                  |    1 +
+ include/uapi/linux/magic.h                     |    2 +
+ include/uapi/linux/mpls.h                      |    1 +
+ include/uapi/linux/mpls_iptunnel.h             |    1 +
+ include/uapi/linux/neighbour.h                 |    1 +
+ include/uapi/linux/net_namespace.h             |    1 +
+ include/uapi/linux/netconf.h                   |    1 +
+ include/uapi/linux/netdevice.h                 |    1 +
+ include/uapi/linux/netfilter.h                 |    1 +
+ include/uapi/linux/netfilter/ipset/ip_set.h    |    1 +
+ include/uapi/linux/netfilter/x_tables.h        |    1 +
+ include/uapi/linux/netfilter/xt_set.h          |    1 +
+ include/uapi/linux/netfilter/xt_tcpudp.h       |    1 +
+ include/uapi/linux/netfilter_ipv4.h            |    2 +
+ include/uapi/linux/netfilter_ipv4/ip_tables.h  |    1 +
+ include/uapi/linux/netfilter_ipv6.h            |    2 +
+ include/uapi/linux/netfilter_ipv6/ip6_tables.h |    1 +
+ include/uapi/linux/netlink.h                   |    1 +
+ include/uapi/linux/netlink_diag.h              |    1 +
+ include/uapi/linux/packet_diag.h               |    1 +
+ include/uapi/linux/param.h                     |    1 +
+ include/uapi/linux/pfkeyv2.h                   |    1 +
+ include/uapi/linux/pkt_cls.h                   |   15 +-
+ include/uapi/linux/pkt_sched.h                 |  198 ++
+ include/uapi/linux/posix_types.h               |    1 +
+ include/uapi/linux/rtnetlink.h                 |   24 +
+ include/uapi/linux/sctp.h                      |   71 +-
+ include/uapi/linux/seg6.h                      |    5 +-
+ include/uapi/linux/seg6_genl.h                 |    1 +
+ include/uapi/linux/seg6_hmac.h                 |    1 +
+ include/uapi/linux/seg6_iptunnel.h             |    1 +
+ include/uapi/linux/seg6_local.h                |   12 +
+ include/uapi/linux/sock_diag.h                 |    1 +
+ include/uapi/linux/socket.h                    |    1 +
+ include/uapi/linux/sockios.h                   |    1 +
+ include/uapi/linux/stddef.h                    |    1 +
+ include/uapi/linux/sysinfo.h                   |    1 +
+ include/uapi/linux/tc_act/tc_bpf.h             |    1 +
+ include/uapi/linux/tc_act/tc_connmark.h        |    1 +
+ include/uapi/linux/tc_act/tc_csum.h            |    1 +
+ include/uapi/linux/tc_act/tc_defact.h          |    1 +
+ include/uapi/linux/tc_act/tc_gact.h            |    1 +
+ include/uapi/linux/tc_act/tc_ife.h             |    1 +
+ include/uapi/linux/tc_act/tc_ipt.h             |    1 +
+ include/uapi/linux/tc_act/tc_mirred.h          |    7 +-
+ include/uapi/linux/tc_act/tc_nat.h             |    1 +
+ include/uapi/linux/tc_act/tc_pedit.h           |   10 +-
+ include/uapi/linux/tc_act/tc_sample.h          |    1 +
+ include/uapi/linux/tc_act/tc_skbedit.h         |    3 +
+ include/uapi/linux/tc_act/tc_skbmod.h          |    1 +
+ include/uapi/linux/tc_act/tc_tunnel_key.h      |   29 +
+ include/uapi/linux/tc_act/tc_vlan.h            |    1 +
+ include/uapi/linux/tc_ematch/tc_em_cmp.h       |    1 +
+ include/uapi/linux/tc_ematch/tc_em_ipt.h       |   20 +
+ include/uapi/linux/tc_ematch/tc_em_meta.h      |    1 +
+ include/uapi/linux/tc_ematch/tc_em_nbyte.h     |    1 +
+ include/uapi/linux/tcp.h                       |   22 +
+ include/uapi/linux/tcp_metrics.h               |    1 +
+ include/uapi/linux/tipc.h                      |  188 +-
+ include/uapi/linux/tipc_netlink.h              |   37 +
+ include/uapi/linux/tipc_sockets_diag.h         |   17 +
+ include/uapi/linux/types.h                     |    3 +
+ include/uapi/linux/unix_diag.h                 |    1 +
+ include/uapi/linux/veth.h                      |    1 +
+ include/uapi/linux/vm_sockets_diag.h           |    1 +
+ include/uapi/linux/xfrm.h                      |    1 +
+ 114 files changed, 3201 insertions(+), 427 deletions(-)
+ create mode 100644 include/uapi/linux/btf.h
+ create mode 100644 include/uapi/linux/tc_ematch/tc_em_ipt.h
+ create mode 100644 include/uapi/linux/tipc_sockets_diag.h
+
+diff --git a/include/uapi/linux/atm.h b/include/uapi/linux/atm.h
+index 08e27be..e33ff6b 100644
+--- a/include/uapi/linux/atm.h
++++ b/include/uapi/linux/atm.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /* atm.h - general ATM declarations */
+  
+ /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
+diff --git a/include/uapi/linux/atmapi.h b/include/uapi/linux/atmapi.h
+index 8fe54d9..c9bf5c2 100644
+--- a/include/uapi/linux/atmapi.h
++++ b/include/uapi/linux/atmapi.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /* atmapi.h - ATM API user space/kernel compatibility */
+  
+ /* Written 1999,2000 by Werner Almesberger, EPFL ICA */
+diff --git a/include/uapi/linux/atmarp.h b/include/uapi/linux/atmarp.h
+index 231f4bd..8e44d12 100644
+--- a/include/uapi/linux/atmarp.h
++++ b/include/uapi/linux/atmarp.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /* atmarp.h - ATM ARP protocol and kernel-demon interface definitions */
+  
+ /* Written 1995-1999 by Werner Almesberger, EPFL LRC/ICA */
+diff --git a/include/uapi/linux/atmdev.h b/include/uapi/linux/atmdev.h
+index 8faa8b9..9bdb96a 100644
+--- a/include/uapi/linux/atmdev.h
++++ b/include/uapi/linux/atmdev.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /* atmdev.h - ATM device driver declarations and various related items */
+  
+ /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
+diff --git a/include/uapi/linux/atmioc.h b/include/uapi/linux/atmioc.h
+index 37f67aa..cd7655e 100644
+--- a/include/uapi/linux/atmioc.h
++++ b/include/uapi/linux/atmioc.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /* atmioc.h - ranges for ATM-related ioctl numbers */
+  
+ /* Written 1995-1999 by Werner Almesberger, EPFL LRC/ICA */
+diff --git a/include/uapi/linux/atmsap.h b/include/uapi/linux/atmsap.h
+index 799b104..fc05248 100644
+--- a/include/uapi/linux/atmsap.h
++++ b/include/uapi/linux/atmsap.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /* atmsap.h - ATM Service Access Point addressing definitions */
+ 
+ /* Written 1995-1999 by Werner Almesberger, EPFL LRC/ICA */
+diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
+index 0895a52..b9a6367 100644
+--- a/include/uapi/linux/bpf.h
++++ b/include/uapi/linux/bpf.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /* Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com
+  *
+  * This program is free software; you can redistribute it and/or
+@@ -16,7 +17,7 @@
+ #define BPF_ALU64	0x07	/* alu mode in double word width */
+ 
+ /* ld/ldx fields */
+-#define BPF_DW		0x18	/* double word */
++#define BPF_DW		0x18	/* double word (64-bit) */
+ #define BPF_XADD	0xc0	/* exclusive add */
+ 
+ /* alu/jmp fields */
+@@ -92,6 +93,11 @@ enum bpf_cmd {
+ 	BPF_PROG_GET_FD_BY_ID,
+ 	BPF_MAP_GET_FD_BY_ID,
+ 	BPF_OBJ_GET_INFO_BY_FD,
++	BPF_PROG_QUERY,
++	BPF_RAW_TRACEPOINT_OPEN,
++	BPF_BTF_LOAD,
++	BPF_BTF_GET_FD_BY_ID,
++	BPF_TASK_FD_QUERY,
+ };
+ 
+ enum bpf_map_type {
+@@ -111,6 +117,9 @@ enum bpf_map_type {
+ 	BPF_MAP_TYPE_HASH_OF_MAPS,
+ 	BPF_MAP_TYPE_DEVMAP,
+ 	BPF_MAP_TYPE_SOCKMAP,
++	BPF_MAP_TYPE_CPUMAP,
++	BPF_MAP_TYPE_XSKMAP,
++	BPF_MAP_TYPE_SOCKHASH,
+ };
+ 
+ enum bpf_prog_type {
+@@ -129,6 +138,12 @@ enum bpf_prog_type {
+ 	BPF_PROG_TYPE_LWT_XMIT,
+ 	BPF_PROG_TYPE_SOCK_OPS,
+ 	BPF_PROG_TYPE_SK_SKB,
++	BPF_PROG_TYPE_CGROUP_DEVICE,
++	BPF_PROG_TYPE_SK_MSG,
++	BPF_PROG_TYPE_RAW_TRACEPOINT,
++	BPF_PROG_TYPE_CGROUP_SOCK_ADDR,
++	BPF_PROG_TYPE_LWT_SEG6LOCAL,
++	BPF_PROG_TYPE_LIRC_MODE2,
+ };
+ 
+ enum bpf_attach_type {
+@@ -138,16 +153,63 @@ enum bpf_attach_type {
+ 	BPF_CGROUP_SOCK_OPS,
+ 	BPF_SK_SKB_STREAM_PARSER,
+ 	BPF_SK_SKB_STREAM_VERDICT,
++	BPF_CGROUP_DEVICE,
++	BPF_SK_MSG_VERDICT,
++	BPF_CGROUP_INET4_BIND,
++	BPF_CGROUP_INET6_BIND,
++	BPF_CGROUP_INET4_CONNECT,
++	BPF_CGROUP_INET6_CONNECT,
++	BPF_CGROUP_INET4_POST_BIND,
++	BPF_CGROUP_INET6_POST_BIND,
++	BPF_CGROUP_UDP4_SENDMSG,
++	BPF_CGROUP_UDP6_SENDMSG,
++	BPF_LIRC_MODE2,
+ 	__MAX_BPF_ATTACH_TYPE
+ };
+ 
+ #define MAX_BPF_ATTACH_TYPE __MAX_BPF_ATTACH_TYPE
+ 
+-/* If BPF_F_ALLOW_OVERRIDE flag is used in BPF_PROG_ATTACH command
+- * to the given target_fd cgroup the descendent cgroup will be able to
+- * override effective bpf program that was inherited from this cgroup
++/* cgroup-bpf attach flags used in BPF_PROG_ATTACH command
++ *
++ * NONE(default): No further bpf programs allowed in the subtree.
++ *
++ * BPF_F_ALLOW_OVERRIDE: If a sub-cgroup installs some bpf program,
++ * the program in this cgroup yields to sub-cgroup program.
++ *
++ * BPF_F_ALLOW_MULTI: If a sub-cgroup installs some bpf program,
++ * that cgroup program gets run in addition to the program in this cgroup.
++ *
++ * Only one program is allowed to be attached to a cgroup with
++ * NONE or BPF_F_ALLOW_OVERRIDE flag.
++ * Attaching another program on top of NONE or BPF_F_ALLOW_OVERRIDE will
++ * release old program and attach the new one. Attach flags has to match.
++ *
++ * Multiple programs are allowed to be attached to a cgroup with
++ * BPF_F_ALLOW_MULTI flag. They are executed in FIFO order
++ * (those that were attached first, run first)
++ * The programs of sub-cgroup are executed first, then programs of
++ * this cgroup and then programs of parent cgroup.
++ * When children program makes decision (like picking TCP CA or sock bind)
++ * parent program has a chance to override it.
++ *
++ * A cgroup with MULTI or OVERRIDE flag allows any attach flags in sub-cgroups.
++ * A cgroup with NONE doesn't allow any programs in sub-cgroups.
++ * Ex1:
++ * cgrp1 (MULTI progs A, B) ->
++ *    cgrp2 (OVERRIDE prog C) ->
++ *      cgrp3 (MULTI prog D) ->
++ *        cgrp4 (OVERRIDE prog E) ->
++ *          cgrp5 (NONE prog F)
++ * the event in cgrp5 triggers execution of F,D,A,B in that order.
++ * if prog F is detached, the execution is E,D,A,B
++ * if prog F and D are detached, the execution is E,A,B
++ * if prog F, E and D are detached, the execution is C,A,B
++ *
++ * All eligible programs are executed regardless of return code from
++ * earlier programs.
+  */
+ #define BPF_F_ALLOW_OVERRIDE	(1U << 0)
++#define BPF_F_ALLOW_MULTI	(1U << 1)
+ 
+ /* If BPF_F_STRICT_ALIGNMENT is used in BPF_PROG_LOAD command, the
+  * verifier will perform strict alignment checking as if the kernel
+@@ -156,8 +218,14 @@ enum bpf_attach_type {
+  */
+ #define BPF_F_STRICT_ALIGNMENT	(1U << 0)
+ 
++/* when bpf_ldimm64->src_reg == BPF_PSEUDO_MAP_FD, bpf_ldimm64->imm == fd */
+ #define BPF_PSEUDO_MAP_FD	1
+ 
++/* when bpf_call->src_reg == BPF_PSEUDO_CALL, bpf_call->imm == pc-relative
++ * offset to another bpf function
++ */
++#define BPF_PSEUDO_CALL		1
++
+ /* flags for BPF_MAP_UPDATE_ELEM command */
+ #define BPF_ANY		0 /* create new element or update existing */
+ #define BPF_NOEXIST	1 /* create new element if it didn't exist */
+@@ -175,6 +243,37 @@ enum bpf_attach_type {
+ /* Specify numa node during map creation */
+ #define BPF_F_NUMA_NODE		(1U << 2)
+ 
++/* flags for BPF_PROG_QUERY */
++#define BPF_F_QUERY_EFFECTIVE	(1U << 0)
++
++#define BPF_OBJ_NAME_LEN 16U
++
++/* Flags for accessing BPF object */
++#define BPF_F_RDONLY		(1U << 3)
++#define BPF_F_WRONLY		(1U << 4)
++
++/* Flag for stack_map, store build_id+offset instead of pointer */
++#define BPF_F_STACK_BUILD_ID	(1U << 5)
++
++enum bpf_stack_build_id_status {
++	/* user space need an empty entry to identify end of a trace */
++	BPF_STACK_BUILD_ID_EMPTY = 0,
++	/* with valid build_id and offset */
++	BPF_STACK_BUILD_ID_VALID = 1,
++	/* couldn't get build_id, fallback to ip */
++	BPF_STACK_BUILD_ID_IP = 2,
++};
++
++#define BPF_BUILD_ID_SIZE 20
++struct bpf_stack_build_id {
++	__s32		status;
++	unsigned char	build_id[BPF_BUILD_ID_SIZE];
++	union {
++		__u64	offset;
++		__u64	ip;
++	};
++};
++
+ union bpf_attr {
+ 	struct { /* anonymous struct used by BPF_MAP_CREATE command */
+ 		__u32	map_type;	/* one of enum bpf_map_type */
+@@ -188,6 +287,11 @@ union bpf_attr {
+ 		__u32	numa_node;	/* numa node (effective only if
+ 					 * BPF_F_NUMA_NODE is set).
+ 					 */
++		char	map_name[BPF_OBJ_NAME_LEN];
++		__u32	map_ifindex;	/* ifindex of netdev to create on */
++		__u32	btf_fd;		/* fd pointing to a BTF type data */
++		__u32	btf_key_type_id;	/* BTF type_id of the key */
++		__u32	btf_value_type_id;	/* BTF type_id of the value */
+ 	};
+ 
+ 	struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */
+@@ -210,11 +314,19 @@ union bpf_attr {
+ 		__aligned_u64	log_buf;	/* user supplied buffer */
+ 		__u32		kern_version;	/* checked when prog_type=kprobe */
+ 		__u32		prog_flags;
++		char		prog_name[BPF_OBJ_NAME_LEN];
++		__u32		prog_ifindex;	/* ifindex of netdev to prep for */
++		/* For some prog types expected attach type must be known at
++		 * load time to verify attach type specific parts of prog
++		 * (context accesses, allowed helpers, etc).
++		 */
++		__u32		expected_attach_type;
+ 	};
+ 
+ 	struct { /* anonymous struct used by BPF_OBJ_* commands */
+ 		__aligned_u64	pathname;
+ 		__u32		bpf_fd;
++		__u32		file_flags;
+ 	};
+ 
+ 	struct { /* anonymous struct used by BPF_PROG_ATTACH/DETACH commands */
+@@ -240,8 +352,10 @@ union bpf_attr {
+ 			__u32		start_id;
+ 			__u32		prog_id;
+ 			__u32		map_id;
++			__u32		btf_id;
+ 		};
+ 		__u32		next_id;
++		__u32		open_flags;
+ 	};
+ 
+ 	struct { /* anonymous struct used by BPF_OBJ_GET_INFO_BY_FD */
+@@ -249,339 +363,1718 @@ union bpf_attr {
+ 		__u32		info_len;
+ 		__aligned_u64	info;
+ 	} info;
++
++	struct { /* anonymous struct used by BPF_PROG_QUERY command */
++		__u32		target_fd;	/* container object to query */
++		__u32		attach_type;
++		__u32		query_flags;
++		__u32		attach_flags;
++		__aligned_u64	prog_ids;
++		__u32		prog_cnt;
++	} query;
++
++	struct {
++		__u64 name;
++		__u32 prog_fd;
++	} raw_tracepoint;
++
++	struct { /* anonymous struct for BPF_BTF_LOAD */
++		__aligned_u64	btf;
++		__aligned_u64	btf_log_buf;
++		__u32		btf_size;
++		__u32		btf_log_size;
++		__u32		btf_log_level;
++	};
++
++	struct {
++		__u32		pid;		/* input: pid */
++		__u32		fd;		/* input: fd */
++		__u32		flags;		/* input: flags */
++		__u32		buf_len;	/* input/output: buf len */
++		__aligned_u64	buf;		/* input/output:
++						 *   tp_name for tracepoint
++						 *   symbol for kprobe
++						 *   filename for uprobe
++						 */
++		__u32		prog_id;	/* output: prod_id */
++		__u32		fd_type;	/* output: BPF_FD_TYPE_* */
++		__u64		probe_offset;	/* output: probe_offset */
++		__u64		probe_addr;	/* output: probe_addr */
++	} task_fd_query;
+ } __attribute__((aligned(8)));
+ 
+-/* BPF helper function descriptions:
++/* The description below is an attempt at providing documentation to eBPF
++ * developers about the multiple available eBPF helper functions. It can be
++ * parsed and used to produce a manual page. The workflow is the following,
++ * and requires the rst2man utility:
++ *
++ *     $ ./scripts/bpf_helpers_doc.py \
++ *             --filename include/uapi/linux/bpf.h > /tmp/bpf-helpers.rst
++ *     $ rst2man /tmp/bpf-helpers.rst > /tmp/bpf-helpers.7
++ *     $ man /tmp/bpf-helpers.7
++ *
++ * Note that in order to produce this external documentation, some RST
++ * formatting is used in the descriptions to get "bold" and "italics" in
++ * manual pages. Also note that the few trailing white spaces are
++ * intentional, removing them would break paragraphs for rst2man.
++ *
++ * Start of BPF helper function descriptions:
++ *
++ * void *bpf_map_lookup_elem(struct bpf_map *map, const void *key)
++ * 	Description
++ * 		Perform a lookup in *map* for an entry associated to *key*.
++ * 	Return
++ * 		Map value associated to *key*, or **NULL** if no entry was
++ * 		found.
+  *
+- * void *bpf_map_lookup_elem(&map, &key)
+- *     Return: Map value or NULL
++ * int bpf_map_update_elem(struct bpf_map *map, const void *key, const void *value, u64 flags)
++ * 	Description
++ * 		Add or update the value of the entry associated to *key* in
++ * 		*map* with *value*. *flags* is one of:
+  *
+- * int bpf_map_update_elem(&map, &key, &value, flags)
+- *     Return: 0 on success or negative error
++ * 		**BPF_NOEXIST**
++ * 			The entry for *key* must not exist in the map.
++ * 		**BPF_EXIST**
++ * 			The entry for *key* must already exist in the map.
++ * 		**BPF_ANY**
++ * 			No condition on the existence of the entry for *key*.
+  *
+- * int bpf_map_delete_elem(&map, &key)
+- *     Return: 0 on success or negative error
++ * 		Flag value **BPF_NOEXIST** cannot be used for maps of types
++ * 		**BPF_MAP_TYPE_ARRAY** or **BPF_MAP_TYPE_PERCPU_ARRAY**  (all
++ * 		elements always exist), the helper would return an error.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
+  *
+- * int bpf_probe_read(void *dst, int size, void *src)
+- *     Return: 0 on success or negative error
++ * int bpf_map_delete_elem(struct bpf_map *map, const void *key)
++ * 	Description
++ * 		Delete entry with *key* from *map*.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_probe_read(void *dst, u32 size, const void *src)
++ * 	Description
++ * 		For tracing programs, safely attempt to read *size* bytes from
++ * 		address *src* and store the data in *dst*.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
+  *
+  * u64 bpf_ktime_get_ns(void)
+- *     Return: current ktime
+- *
+- * int bpf_trace_printk(const char *fmt, int fmt_size, ...)
+- *     Return: length of buffer written or negative error
+- *
+- * u32 bpf_prandom_u32(void)
+- *     Return: random value
+- *
+- * u32 bpf_raw_smp_processor_id(void)
+- *     Return: SMP processor ID
+- *
+- * int bpf_skb_store_bytes(skb, offset, from, len, flags)
+- *     store bytes into packet
+- *     @skb: pointer to skb
+- *     @offset: offset within packet from skb->mac_header
+- *     @from: pointer where to copy bytes from
+- *     @len: number of bytes to store into packet
+- *     @flags: bit 0 - if true, recompute skb->csum
+- *             other bits - reserved
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_l3_csum_replace(skb, offset, from, to, flags)
+- *     recompute IP checksum
+- *     @skb: pointer to skb
+- *     @offset: offset within packet where IP checksum is located
+- *     @from: old value of header field
+- *     @to: new value of header field
+- *     @flags: bits 0-3 - size of header field
+- *             other bits - reserved
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_l4_csum_replace(skb, offset, from, to, flags)
+- *     recompute TCP/UDP checksum
+- *     @skb: pointer to skb
+- *     @offset: offset within packet where TCP/UDP checksum is located
+- *     @from: old value of header field
+- *     @to: new value of header field
+- *     @flags: bits 0-3 - size of header field
+- *             bit 4 - is pseudo header
+- *             other bits - reserved
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_tail_call(ctx, prog_array_map, index)
+- *     jump into another BPF program
+- *     @ctx: context pointer passed to next program
+- *     @prog_array_map: pointer to map which type is BPF_MAP_TYPE_PROG_ARRAY
+- *     @index: index inside array that selects specific program to run
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_clone_redirect(skb, ifindex, flags)
+- *     redirect to another netdev
+- *     @skb: pointer to skb
+- *     @ifindex: ifindex of the net device
+- *     @flags: bit 0 - if set, redirect to ingress instead of egress
+- *             other bits - reserved
+- *     Return: 0 on success or negative error
++ * 	Description
++ * 		Return the time elapsed since system boot, in nanoseconds.
++ * 	Return
++ * 		Current *ktime*.
++ *
++ * int bpf_trace_printk(const char *fmt, u32 fmt_size, ...)
++ * 	Description
++ * 		This helper is a "printk()-like" facility for debugging. It
++ * 		prints a message defined by format *fmt* (of size *fmt_size*)
++ * 		to file *\/sys/kernel/debug/tracing/trace* from DebugFS, if
++ * 		available. It can take up to three additional **u64**
++ * 		arguments (as an eBPF helpers, the total number of arguments is
++ * 		limited to five).
++ *
++ * 		Each time the helper is called, it appends a line to the trace.
++ * 		The format of the trace is customizable, and the exact output
++ * 		one will get depends on the options set in
++ * 		*\/sys/kernel/debug/tracing/trace_options* (see also the
++ * 		*README* file under the same directory). However, it usually
++ * 		defaults to something like:
++ *
++ * 		::
++ *
++ * 			telnet-470   [001] .N.. 419421.045894: 0x00000001: <formatted msg>
++ *
++ * 		In the above:
++ *
++ * 			* ``telnet`` is the name of the current task.
++ * 			* ``470`` is the PID of the current task.
++ * 			* ``001`` is the CPU number on which the task is
++ * 			  running.
++ * 			* In ``.N..``, each character refers to a set of
++ * 			  options (whether irqs are enabled, scheduling
++ * 			  options, whether hard/softirqs are running, level of
++ * 			  preempt_disabled respectively). **N** means that
++ * 			  **TIF_NEED_RESCHED** and **PREEMPT_NEED_RESCHED**
++ * 			  are set.
++ * 			* ``419421.045894`` is a timestamp.
++ * 			* ``0x00000001`` is a fake value used by BPF for the
++ * 			  instruction pointer register.
++ * 			* ``<formatted msg>`` is the message formatted with
++ * 			  *fmt*.
++ *
++ * 		The conversion specifiers supported by *fmt* are similar, but
++ * 		more limited than for printk(). They are **%d**, **%i**,
++ * 		**%u**, **%x**, **%ld**, **%li**, **%lu**, **%lx**, **%lld**,
++ * 		**%lli**, **%llu**, **%llx**, **%p**, **%s**. No modifier (size
++ * 		of field, padding with zeroes, etc.) is available, and the
++ * 		helper will return **-EINVAL** (but print nothing) if it
++ * 		encounters an unknown specifier.
++ *
++ * 		Also, note that **bpf_trace_printk**\ () is slow, and should
++ * 		only be used for debugging purposes. For this reason, a notice
++ * 		bloc (spanning several lines) is printed to kernel logs and
++ * 		states that the helper should not be used "for production use"
++ * 		the first time this helper is used (or more precisely, when
++ * 		**trace_printk**\ () buffers are allocated). For passing values
++ * 		to user space, perf events should be preferred.
++ * 	Return
++ * 		The number of bytes written to the buffer, or a negative error
++ * 		in case of failure.
++ *
++ * u32 bpf_get_prandom_u32(void)
++ * 	Description
++ * 		Get a pseudo-random number.
++ *
++ * 		From a security point of view, this helper uses its own
++ * 		pseudo-random internal state, and cannot be used to infer the
++ * 		seed of other random functions in the kernel. However, it is
++ * 		essential to note that the generator used by the helper is not
++ * 		cryptographically secure.
++ * 	Return
++ * 		A random 32-bit unsigned value.
++ *
++ * u32 bpf_get_smp_processor_id(void)
++ * 	Description
++ * 		Get the SMP (symmetric multiprocessing) processor id. Note that
++ * 		all programs run with preemption disabled, which means that the
++ * 		SMP processor id is stable during all the execution of the
++ * 		program.
++ * 	Return
++ * 		The SMP id of the processor running the program.
++ *
++ * int bpf_skb_store_bytes(struct sk_buff *skb, u32 offset, const void *from, u32 len, u64 flags)
++ * 	Description
++ * 		Store *len* bytes from address *from* into the packet
++ * 		associated to *skb*, at *offset*. *flags* are a combination of
++ * 		**BPF_F_RECOMPUTE_CSUM** (automatically recompute the
++ * 		checksum for the packet after storing the bytes) and
++ * 		**BPF_F_INVALIDATE_HASH** (set *skb*\ **->hash**, *skb*\
++ * 		**->swhash** and *skb*\ **->l4hash** to 0).
++ *
++ * 		A call to this helper is susceptible to change the underlaying
++ * 		packet buffer. Therefore, at load time, all checks on pointers
++ * 		previously done by the verifier are invalidated and must be
++ * 		performed again, if the helper is used in combination with
++ * 		direct packet access.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_l3_csum_replace(struct sk_buff *skb, u32 offset, u64 from, u64 to, u64 size)
++ * 	Description
++ * 		Recompute the layer 3 (e.g. IP) checksum for the packet
++ * 		associated to *skb*. Computation is incremental, so the helper
++ * 		must know the former value of the header field that was
++ * 		modified (*from*), the new value of this field (*to*), and the
++ * 		number of bytes (2 or 4) for this field, stored in *size*.
++ * 		Alternatively, it is possible to store the difference between
++ * 		the previous and the new values of the header field in *to*, by
++ * 		setting *from* and *size* to 0. For both methods, *offset*
++ * 		indicates the location of the IP checksum within the packet.
++ *
++ * 		This helper works in combination with **bpf_csum_diff**\ (),
++ * 		which does not update the checksum in-place, but offers more
++ * 		flexibility and can handle sizes larger than 2 or 4 for the
++ * 		checksum to update.
++ *
++ * 		A call to this helper is susceptible to change the underlaying
++ * 		packet buffer. Therefore, at load time, all checks on pointers
++ * 		previously done by the verifier are invalidated and must be
++ * 		performed again, if the helper is used in combination with
++ * 		direct packet access.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_l4_csum_replace(struct sk_buff *skb, u32 offset, u64 from, u64 to, u64 flags)
++ * 	Description
++ * 		Recompute the layer 4 (e.g. TCP, UDP or ICMP) checksum for the
++ * 		packet associated to *skb*. Computation is incremental, so the
++ * 		helper must know the former value of the header field that was
++ * 		modified (*from*), the new value of this field (*to*), and the
++ * 		number of bytes (2 or 4) for this field, stored on the lowest
++ * 		four bits of *flags*. Alternatively, it is possible to store
++ * 		the difference between the previous and the new values of the
++ * 		header field in *to*, by setting *from* and the four lowest
++ * 		bits of *flags* to 0. For both methods, *offset* indicates the
++ * 		location of the IP checksum within the packet. In addition to
++ * 		the size of the field, *flags* can be added (bitwise OR) actual
++ * 		flags. With **BPF_F_MARK_MANGLED_0**, a null checksum is left
++ * 		untouched (unless **BPF_F_MARK_ENFORCE** is added as well), and
++ * 		for updates resulting in a null checksum the value is set to
++ * 		**CSUM_MANGLED_0** instead. Flag **BPF_F_PSEUDO_HDR** indicates
++ * 		the checksum is to be computed against a pseudo-header.
++ *
++ * 		This helper works in combination with **bpf_csum_diff**\ (),
++ * 		which does not update the checksum in-place, but offers more
++ * 		flexibility and can handle sizes larger than 2 or 4 for the
++ * 		checksum to update.
++ *
++ * 		A call to this helper is susceptible to change the underlaying
++ * 		packet buffer. Therefore, at load time, all checks on pointers
++ * 		previously done by the verifier are invalidated and must be
++ * 		performed again, if the helper is used in combination with
++ * 		direct packet access.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_tail_call(void *ctx, struct bpf_map *prog_array_map, u32 index)
++ * 	Description
++ * 		This special helper is used to trigger a "tail call", or in
++ * 		other words, to jump into another eBPF program. The same stack
++ * 		frame is used (but values on stack and in registers for the
++ * 		caller are not accessible to the callee). This mechanism allows
++ * 		for program chaining, either for raising the maximum number of
++ * 		available eBPF instructions, or to execute given programs in
++ * 		conditional blocks. For security reasons, there is an upper
++ * 		limit to the number of successive tail calls that can be
++ * 		performed.
++ *
++ * 		Upon call of this helper, the program attempts to jump into a
++ * 		program referenced at index *index* in *prog_array_map*, a
++ * 		special map of type **BPF_MAP_TYPE_PROG_ARRAY**, and passes
++ * 		*ctx*, a pointer to the context.
++ *
++ * 		If the call succeeds, the kernel immediately runs the first
++ * 		instruction of the new program. This is not a function call,
++ * 		and it never returns to the previous program. If the call
++ * 		fails, then the helper has no effect, and the caller continues
++ * 		to run its subsequent instructions. A call can fail if the
++ * 		destination program for the jump does not exist (i.e. *index*
++ * 		is superior to the number of entries in *prog_array_map*), or
++ * 		if the maximum number of tail calls has been reached for this
++ * 		chain of programs. This limit is defined in the kernel by the
++ * 		macro **MAX_TAIL_CALL_CNT** (not accessible to user space),
++ * 		which is currently set to 32.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_clone_redirect(struct sk_buff *skb, u32 ifindex, u64 flags)
++ * 	Description
++ * 		Clone and redirect the packet associated to *skb* to another
++ * 		net device of index *ifindex*. Both ingress and egress
++ * 		interfaces can be used for redirection. The **BPF_F_INGRESS**
++ * 		value in *flags* is used to make the distinction (ingress path
++ * 		is selected if the flag is present, egress path otherwise).
++ * 		This is the only flag supported for now.
++ *
++ * 		In comparison with **bpf_redirect**\ () helper,
++ * 		**bpf_clone_redirect**\ () has the associated cost of
++ * 		duplicating the packet buffer, but this can be executed out of
++ * 		the eBPF program. Conversely, **bpf_redirect**\ () is more
++ * 		efficient, but it is handled through an action code where the
++ * 		redirection happens only after the eBPF program has returned.
++ *
++ * 		A call to this helper is susceptible to change the underlaying
++ * 		packet buffer. Therefore, at load time, all checks on pointers
++ * 		previously done by the verifier are invalidated and must be
++ * 		performed again, if the helper is used in combination with
++ * 		direct packet access.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
+  *
+  * u64 bpf_get_current_pid_tgid(void)
+- *     Return: current->tgid << 32 | current->pid
++ * 	Return
++ * 		A 64-bit integer containing the current tgid and pid, and
++ * 		created as such:
++ * 		*current_task*\ **->tgid << 32 \|**
++ * 		*current_task*\ **->pid**.
+  *
+  * u64 bpf_get_current_uid_gid(void)
+- *     Return: current_gid << 32 | current_uid
+- *
+- * int bpf_get_current_comm(char *buf, int size_of_buf)
+- *     stores current->comm into buf
+- *     Return: 0 on success or negative error
+- *
+- * u32 bpf_get_cgroup_classid(skb)
+- *     retrieve a proc's classid
+- *     @skb: pointer to skb
+- *     Return: classid if != 0
+- *
+- * int bpf_skb_vlan_push(skb, vlan_proto, vlan_tci)
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_skb_vlan_pop(skb)
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_skb_get_tunnel_key(skb, key, size, flags)
+- * int bpf_skb_set_tunnel_key(skb, key, size, flags)
+- *     retrieve or populate tunnel metadata
+- *     @skb: pointer to skb
+- *     @key: pointer to 'struct bpf_tunnel_key'
+- *     @size: size of 'struct bpf_tunnel_key'
+- *     @flags: room for future extensions
+- *     Return: 0 on success or negative error
+- *
+- * u64 bpf_perf_event_read(map, flags)
+- *     read perf event counter value
+- *     @map: pointer to perf_event_array map
+- *     @flags: index of event in the map or bitmask flags
+- *     Return: value of perf event counter read or error code
+- *
+- * int bpf_redirect(ifindex, flags)
+- *     redirect to another netdev
+- *     @ifindex: ifindex of the net device
+- *     @flags:
+- *	  cls_bpf:
+- *          bit 0 - if set, redirect to ingress instead of egress
+- *          other bits - reserved
+- *	  xdp_bpf:
+- *	    all bits - reserved
+- *     Return: cls_bpf: TC_ACT_REDIRECT on success or TC_ACT_SHOT on error
+- *	       xdp_bfp: XDP_REDIRECT on success or XDP_ABORT on error
+- * int bpf_redirect_map(map, key, flags)
+- *     redirect to endpoint in map
+- *     @map: pointer to dev map
+- *     @key: index in map to lookup
+- *     @flags: --
+- *     Return: XDP_REDIRECT on success or XDP_ABORT on error
+- *
+- * u32 bpf_get_route_realm(skb)
+- *     retrieve a dst's tclassid
+- *     @skb: pointer to skb
+- *     Return: realm if != 0
+- *
+- * int bpf_perf_event_output(ctx, map, flags, data, size)
+- *     output perf raw sample
+- *     @ctx: struct pt_regs*
+- *     @map: pointer to perf_event_array map
+- *     @flags: index of event in the map or bitmask flags
+- *     @data: data on stack to be output as raw data
+- *     @size: size of data
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_get_stackid(ctx, map, flags)
+- *     walk user or kernel stack and return id
+- *     @ctx: struct pt_regs*
+- *     @map: pointer to stack_trace map
+- *     @flags: bits 0-7 - numer of stack frames to skip
+- *             bit 8 - collect user stack instead of kernel
+- *             bit 9 - compare stacks by hash only
+- *             bit 10 - if two different stacks hash into the same stackid
+- *                      discard old
+- *             other bits - reserved
+- *     Return: >= 0 stackid on success or negative error
+- *
+- * s64 bpf_csum_diff(from, from_size, to, to_size, seed)
+- *     calculate csum diff
+- *     @from: raw from buffer
+- *     @from_size: length of from buffer
+- *     @to: raw to buffer
+- *     @to_size: length of to buffer
+- *     @seed: optional seed
+- *     Return: csum result or negative error code
+- *
+- * int bpf_skb_get_tunnel_opt(skb, opt, size)
+- *     retrieve tunnel options metadata
+- *     @skb: pointer to skb
+- *     @opt: pointer to raw tunnel option data
+- *     @size: size of @opt
+- *     Return: option size
+- *
+- * int bpf_skb_set_tunnel_opt(skb, opt, size)
+- *     populate tunnel options metadata
+- *     @skb: pointer to skb
+- *     @opt: pointer to raw tunnel option data
+- *     @size: size of @opt
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_skb_change_proto(skb, proto, flags)
+- *     Change protocol of the skb. Currently supported is v4 -> v6,
+- *     v6 -> v4 transitions. The helper will also resize the skb. eBPF
+- *     program is expected to fill the new headers via skb_store_bytes
+- *     and lX_csum_replace.
+- *     @skb: pointer to skb
+- *     @proto: new skb->protocol type
+- *     @flags: reserved
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_skb_change_type(skb, type)
+- *     Change packet type of skb.
+- *     @skb: pointer to skb
+- *     @type: new skb->pkt_type type
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_skb_under_cgroup(skb, map, index)
+- *     Check cgroup2 membership of skb
+- *     @skb: pointer to skb
+- *     @map: pointer to bpf_map in BPF_MAP_TYPE_CGROUP_ARRAY type
+- *     @index: index of the cgroup in the bpf_map
+- *     Return:
+- *       == 0 skb failed the cgroup2 descendant test
+- *       == 1 skb succeeded the cgroup2 descendant test
+- *        < 0 error
+- *
+- * u32 bpf_get_hash_recalc(skb)
+- *     Retrieve and possibly recalculate skb->hash.
+- *     @skb: pointer to skb
+- *     Return: hash
++ * 	Return
++ * 		A 64-bit integer containing the current GID and UID, and
++ * 		created as such: *current_gid* **<< 32 \|** *current_uid*.
++ *
++ * int bpf_get_current_comm(char *buf, u32 size_of_buf)
++ * 	Description
++ * 		Copy the **comm** attribute of the current task into *buf* of
++ * 		*size_of_buf*. The **comm** attribute contains the name of
++ * 		the executable (excluding the path) for the current task. The
++ * 		*size_of_buf* must be strictly positive. On success, the
++ * 		helper makes sure that the *buf* is NUL-terminated. On failure,
++ * 		it is filled with zeroes.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * u32 bpf_get_cgroup_classid(struct sk_buff *skb)
++ * 	Description
++ * 		Retrieve the classid for the current task, i.e. for the net_cls
++ * 		cgroup to which *skb* belongs.
++ *
++ * 		This helper can be used on TC egress path, but not on ingress.
++ *
++ * 		The net_cls cgroup provides an interface to tag network packets
++ * 		based on a user-provided identifier for all traffic coming from
++ * 		the tasks belonging to the related cgroup. See also the related
++ * 		kernel documentation, available from the Linux sources in file
++ * 		*Documentation/cgroup-v1/net_cls.txt*.
++ *
++ * 		The Linux kernel has two versions for cgroups: there are
++ * 		cgroups v1 and cgroups v2. Both are available to users, who can
++ * 		use a mixture of them, but note that the net_cls cgroup is for
++ * 		cgroup v1 only. This makes it incompatible with BPF programs
++ * 		run on cgroups, which is a cgroup-v2-only feature (a socket can
++ * 		only hold data for one version of cgroups at a time).
++ *
++ * 		This helper is only available is the kernel was compiled with
++ * 		the **CONFIG_CGROUP_NET_CLASSID** configuration option set to
++ * 		"**y**" or to "**m**".
++ * 	Return
++ * 		The classid, or 0 for the default unconfigured classid.
++ *
++ * int bpf_skb_vlan_push(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci)
++ * 	Description
++ * 		Push a *vlan_tci* (VLAN tag control information) of protocol
++ * 		*vlan_proto* to the packet associated to *skb*, then update
++ * 		the checksum. Note that if *vlan_proto* is different from
++ * 		**ETH_P_8021Q** and **ETH_P_8021AD**, it is considered to
++ * 		be **ETH_P_8021Q**.
++ *
++ * 		A call to this helper is susceptible to change the underlaying
++ * 		packet buffer. Therefore, at load time, all checks on pointers
++ * 		previously done by the verifier are invalidated and must be
++ * 		performed again, if the helper is used in combination with
++ * 		direct packet access.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_skb_vlan_pop(struct sk_buff *skb)
++ * 	Description
++ * 		Pop a VLAN header from the packet associated to *skb*.
++ *
++ * 		A call to this helper is susceptible to change the underlaying
++ * 		packet buffer. Therefore, at load time, all checks on pointers
++ * 		previously done by the verifier are invalidated and must be
++ * 		performed again, if the helper is used in combination with
++ * 		direct packet access.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_skb_get_tunnel_key(struct sk_buff *skb, struct bpf_tunnel_key *key, u32 size, u64 flags)
++ * 	Description
++ * 		Get tunnel metadata. This helper takes a pointer *key* to an
++ * 		empty **struct bpf_tunnel_key** of **size**, that will be
++ * 		filled with tunnel metadata for the packet associated to *skb*.
++ * 		The *flags* can be set to **BPF_F_TUNINFO_IPV6**, which
++ * 		indicates that the tunnel is based on IPv6 protocol instead of
++ * 		IPv4.
++ *
++ * 		The **struct bpf_tunnel_key** is an object that generalizes the
++ * 		principal parameters used by various tunneling protocols into a
++ * 		single struct. This way, it can be used to easily make a
++ * 		decision based on the contents of the encapsulation header,
++ * 		"summarized" in this struct. In particular, it holds the IP
++ * 		address of the remote end (IPv4 or IPv6, depending on the case)
++ * 		in *key*\ **->remote_ipv4** or *key*\ **->remote_ipv6**. Also,
++ * 		this struct exposes the *key*\ **->tunnel_id**, which is
++ * 		generally mapped to a VNI (Virtual Network Identifier), making
++ * 		it programmable together with the **bpf_skb_set_tunnel_key**\
++ * 		() helper.
++ *
++ * 		Let's imagine that the following code is part of a program
++ * 		attached to the TC ingress interface, on one end of a GRE
++ * 		tunnel, and is supposed to filter out all messages coming from
++ * 		remote ends with IPv4 address other than 10.0.0.1:
++ *
++ * 		::
++ *
++ * 			int ret;
++ * 			struct bpf_tunnel_key key = {};
++ * 			
++ * 			ret = bpf_skb_get_tunnel_key(skb, &key, sizeof(key), 0);
++ * 			if (ret < 0)
++ * 				return TC_ACT_SHOT;	// drop packet
++ * 			
++ * 			if (key.remote_ipv4 != 0x0a000001)
++ * 				return TC_ACT_SHOT;	// drop packet
++ * 			
++ * 			return TC_ACT_OK;		// accept packet
++ *
++ * 		This interface can also be used with all encapsulation devices
++ * 		that can operate in "collect metadata" mode: instead of having
++ * 		one network device per specific configuration, the "collect
++ * 		metadata" mode only requires a single device where the
++ * 		configuration can be extracted from this helper.
++ *
++ * 		This can be used together with various tunnels such as VXLan,
++ * 		Geneve, GRE or IP in IP (IPIP).
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_skb_set_tunnel_key(struct sk_buff *skb, struct bpf_tunnel_key *key, u32 size, u64 flags)
++ * 	Description
++ * 		Populate tunnel metadata for packet associated to *skb.* The
++ * 		tunnel metadata is set to the contents of *key*, of *size*. The
++ * 		*flags* can be set to a combination of the following values:
++ *
++ * 		**BPF_F_TUNINFO_IPV6**
++ * 			Indicate that the tunnel is based on IPv6 protocol
++ * 			instead of IPv4.
++ * 		**BPF_F_ZERO_CSUM_TX**
++ * 			For IPv4 packets, add a flag to tunnel metadata
++ * 			indicating that checksum computation should be skipped
++ * 			and checksum set to zeroes.
++ * 		**BPF_F_DONT_FRAGMENT**
++ * 			Add a flag to tunnel metadata indicating that the
++ * 			packet should not be fragmented.
++ * 		**BPF_F_SEQ_NUMBER**
++ * 			Add a flag to tunnel metadata indicating that a
++ * 			sequence number should be added to tunnel header before
++ * 			sending the packet. This flag was added for GRE
++ * 			encapsulation, but might be used with other protocols
++ * 			as well in the future.
++ *
++ * 		Here is a typical usage on the transmit path:
++ *
++ * 		::
++ *
++ * 			struct bpf_tunnel_key key;
++ * 			     populate key ...
++ * 			bpf_skb_set_tunnel_key(skb, &key, sizeof(key), 0);
++ * 			bpf_clone_redirect(skb, vxlan_dev_ifindex, 0);
++ *
++ * 		See also the description of the **bpf_skb_get_tunnel_key**\ ()
++ * 		helper for additional information.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * u64 bpf_perf_event_read(struct bpf_map *map, u64 flags)
++ * 	Description
++ * 		Read the value of a perf event counter. This helper relies on a
++ * 		*map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. The nature of
++ * 		the perf event counter is selected when *map* is updated with
++ * 		perf event file descriptors. The *map* is an array whose size
++ * 		is the number of available CPUs, and each cell contains a value
++ * 		relative to one CPU. The value to retrieve is indicated by
++ * 		*flags*, that contains the index of the CPU to look up, masked
++ * 		with **BPF_F_INDEX_MASK**. Alternatively, *flags* can be set to
++ * 		**BPF_F_CURRENT_CPU** to indicate that the value for the
++ * 		current CPU should be retrieved.
++ *
++ * 		Note that before Linux 4.13, only hardware perf event can be
++ * 		retrieved.
++ *
++ * 		Also, be aware that the newer helper
++ * 		**bpf_perf_event_read_value**\ () is recommended over
++ * 		**bpf_perf_event_read**\ () in general. The latter has some ABI
++ * 		quirks where error and counter value are used as a return code
++ * 		(which is wrong to do since ranges may overlap). This issue is
++ * 		fixed with **bpf_perf_event_read_value**\ (), which at the same
++ * 		time provides more features over the **bpf_perf_event_read**\
++ * 		() interface. Please refer to the description of
++ * 		**bpf_perf_event_read_value**\ () for details.
++ * 	Return
++ * 		The value of the perf event counter read from the map, or a
++ * 		negative error code in case of failure.
++ *
++ * int bpf_redirect(u32 ifindex, u64 flags)
++ * 	Description
++ * 		Redirect the packet to another net device of index *ifindex*.
++ * 		This helper is somewhat similar to **bpf_clone_redirect**\
++ * 		(), except that the packet is not cloned, which provides
++ * 		increased performance.
++ *
++ * 		Except for XDP, both ingress and egress interfaces can be used
++ * 		for redirection. The **BPF_F_INGRESS** value in *flags* is used
++ * 		to make the distinction (ingress path is selected if the flag
++ * 		is present, egress path otherwise). Currently, XDP only
++ * 		supports redirection to the egress interface, and accepts no
++ * 		flag at all.
++ *
++ * 		The same effect can be attained with the more generic
++ * 		**bpf_redirect_map**\ (), which requires specific maps to be
++ * 		used but offers better performance.
++ * 	Return
++ * 		For XDP, the helper returns **XDP_REDIRECT** on success or
++ * 		**XDP_ABORTED** on error. For other program types, the values
++ * 		are **TC_ACT_REDIRECT** on success or **TC_ACT_SHOT** on
++ * 		error.
++ *
++ * u32 bpf_get_route_realm(struct sk_buff *skb)
++ * 	Description
++ * 		Retrieve the realm or the route, that is to say the
++ * 		**tclassid** field of the destination for the *skb*. The
++ * 		indentifier retrieved is a user-provided tag, similar to the
++ * 		one used with the net_cls cgroup (see description for
++ * 		**bpf_get_cgroup_classid**\ () helper), but here this tag is
++ * 		held by a route (a destination entry), not by a task.
++ *
++ * 		Retrieving this identifier works with the clsact TC egress hook
++ * 		(see also **tc-bpf(8)**), or alternatively on conventional
++ * 		classful egress qdiscs, but not on TC ingress path. In case of
++ * 		clsact TC egress hook, this has the advantage that, internally,
++ * 		the destination entry has not been dropped yet in the transmit
++ * 		path. Therefore, the destination entry does not need to be
++ * 		artificially held via **netif_keep_dst**\ () for a classful
++ * 		qdisc until the *skb* is freed.
++ *
++ * 		This helper is available only if the kernel was compiled with
++ * 		**CONFIG_IP_ROUTE_CLASSID** configuration option.
++ * 	Return
++ * 		The realm of the route for the packet associated to *skb*, or 0
++ * 		if none was found.
++ *
++ * int bpf_perf_event_output(struct pt_reg *ctx, struct bpf_map *map, u64 flags, void *data, u64 size)
++ * 	Description
++ * 		Write raw *data* blob into a special BPF perf event held by
++ * 		*map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf
++ * 		event must have the following attributes: **PERF_SAMPLE_RAW**
++ * 		as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and
++ * 		**PERF_COUNT_SW_BPF_OUTPUT** as **config**.
++ *
++ * 		The *flags* are used to indicate the index in *map* for which
++ * 		the value must be put, masked with **BPF_F_INDEX_MASK**.
++ * 		Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU**
++ * 		to indicate that the index of the current CPU core should be
++ * 		used.
++ *
++ * 		The value to write, of *size*, is passed through eBPF stack and
++ * 		pointed by *data*.
++ *
++ * 		The context of the program *ctx* needs also be passed to the
++ * 		helper.
++ *
++ * 		On user space, a program willing to read the values needs to
++ * 		call **perf_event_open**\ () on the perf event (either for
++ * 		one or for all CPUs) and to store the file descriptor into the
++ * 		*map*. This must be done before the eBPF program can send data
++ * 		into it. An example is available in file
++ * 		*samples/bpf/trace_output_user.c* in the Linux kernel source
++ * 		tree (the eBPF program counterpart is in
++ * 		*samples/bpf/trace_output_kern.c*).
++ *
++ * 		**bpf_perf_event_output**\ () achieves better performance
++ * 		than **bpf_trace_printk**\ () for sharing data with user
++ * 		space, and is much better suitable for streaming data from eBPF
++ * 		programs.
++ *
++ * 		Note that this helper is not restricted to tracing use cases
++ * 		and can be used with programs attached to TC or XDP as well,
++ * 		where it allows for passing data to user space listeners. Data
++ * 		can be:
++ *
++ * 		* Only custom structs,
++ * 		* Only the packet payload, or
++ * 		* A combination of both.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_skb_load_bytes(const struct sk_buff *skb, u32 offset, void *to, u32 len)
++ * 	Description
++ * 		This helper was provided as an easy way to load data from a
++ * 		packet. It can be used to load *len* bytes from *offset* from
++ * 		the packet associated to *skb*, into the buffer pointed by
++ * 		*to*.
++ *
++ * 		Since Linux 4.7, usage of this helper has mostly been replaced
++ * 		by "direct packet access", enabling packet data to be
++ * 		manipulated with *skb*\ **->data** and *skb*\ **->data_end**
++ * 		pointing respectively to the first byte of packet data and to
++ * 		the byte after the last byte of packet data. However, it
++ * 		remains useful if one wishes to read large quantities of data
++ * 		at once from a packet into the eBPF stack.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_get_stackid(struct pt_reg *ctx, struct bpf_map *map, u64 flags)
++ * 	Description
++ * 		Walk a user or a kernel stack and return its id. To achieve
++ * 		this, the helper needs *ctx*, which is a pointer to the context
++ * 		on which the tracing program is executed, and a pointer to a
++ * 		*map* of type **BPF_MAP_TYPE_STACK_TRACE**.
++ *
++ * 		The last argument, *flags*, holds the number of stack frames to
++ * 		skip (from 0 to 255), masked with
++ * 		**BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set
++ * 		a combination of the following flags:
++ *
++ * 		**BPF_F_USER_STACK**
++ * 			Collect a user space stack instead of a kernel stack.
++ * 		**BPF_F_FAST_STACK_CMP**
++ * 			Compare stacks by hash only.
++ * 		**BPF_F_REUSE_STACKID**
++ * 			If two different stacks hash into the same *stackid*,
++ * 			discard the old one.
++ *
++ * 		The stack id retrieved is a 32 bit long integer handle which
++ * 		can be further combined with other data (including other stack
++ * 		ids) and used as a key into maps. This can be useful for
++ * 		generating a variety of graphs (such as flame graphs or off-cpu
++ * 		graphs).
++ *
++ * 		For walking a stack, this helper is an improvement over
++ * 		**bpf_probe_read**\ (), which can be used with unrolled loops
++ * 		but is not efficient and consumes a lot of eBPF instructions.
++ * 		Instead, **bpf_get_stackid**\ () can collect up to
++ * 		**PERF_MAX_STACK_DEPTH** both kernel and user frames. Note that
++ * 		this limit can be controlled with the **sysctl** program, and
++ * 		that it should be manually increased in order to profile long
++ * 		user stacks (such as stacks for Java programs). To do so, use:
++ *
++ * 		::
++ *
++ * 			# sysctl kernel.perf_event_max_stack=<new value>
++ * 	Return
++ * 		The positive or null stack id on success, or a negative error
++ * 		in case of failure.
++ *
++ * s64 bpf_csum_diff(__be32 *from, u32 from_size, __be32 *to, u32 to_size, __wsum seed)
++ * 	Description
++ * 		Compute a checksum difference, from the raw buffer pointed by
++ * 		*from*, of length *from_size* (that must be a multiple of 4),
++ * 		towards the raw buffer pointed by *to*, of size *to_size*
++ * 		(same remark). An optional *seed* can be added to the value
++ * 		(this can be cascaded, the seed may come from a previous call
++ * 		to the helper).
++ *
++ * 		This is flexible enough to be used in several ways:
++ *
++ * 		* With *from_size* == 0, *to_size* > 0 and *seed* set to
++ * 		  checksum, it can be used when pushing new data.
++ * 		* With *from_size* > 0, *to_size* == 0 and *seed* set to
++ * 		  checksum, it can be used when removing data from a packet.
++ * 		* With *from_size* > 0, *to_size* > 0 and *seed* set to 0, it
++ * 		  can be used to compute a diff. Note that *from_size* and
++ * 		  *to_size* do not need to be equal.
++ *
++ * 		This helper can be used in combination with
++ * 		**bpf_l3_csum_replace**\ () and **bpf_l4_csum_replace**\ (), to
++ * 		which one can feed in the difference computed with
++ * 		**bpf_csum_diff**\ ().
++ * 	Return
++ * 		The checksum result, or a negative error code in case of
++ * 		failure.
++ *
++ * int bpf_skb_get_tunnel_opt(struct sk_buff *skb, u8 *opt, u32 size)
++ * 	Description
++ * 		Retrieve tunnel options metadata for the packet associated to
++ * 		*skb*, and store the raw tunnel option data to the buffer *opt*
++ * 		of *size*.
++ *
++ * 		This helper can be used with encapsulation devices that can
++ * 		operate in "collect metadata" mode (please refer to the related
++ * 		note in the description of **bpf_skb_get_tunnel_key**\ () for
++ * 		more details). A particular example where this can be used is
++ * 		in combination with the Geneve encapsulation protocol, where it
++ * 		allows for pushing (with **bpf_skb_get_tunnel_opt**\ () helper)
++ * 		and retrieving arbitrary TLVs (Type-Length-Value headers) from
++ * 		the eBPF program. This allows for full customization of these
++ * 		headers.
++ * 	Return
++ * 		The size of the option data retrieved.
++ *
++ * int bpf_skb_set_tunnel_opt(struct sk_buff *skb, u8 *opt, u32 size)
++ * 	Description
++ * 		Set tunnel options metadata for the packet associated to *skb*
++ * 		to the option data contained in the raw buffer *opt* of *size*.
++ *
++ * 		See also the description of the **bpf_skb_get_tunnel_opt**\ ()
++ * 		helper for additional information.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_skb_change_proto(struct sk_buff *skb, __be16 proto, u64 flags)
++ * 	Description
++ * 		Change the protocol of the *skb* to *proto*. Currently
++ * 		supported are transition from IPv4 to IPv6, and from IPv6 to
++ * 		IPv4. The helper takes care of the groundwork for the
++ * 		transition, including resizing the socket buffer. The eBPF
++ * 		program is expected to fill the new headers, if any, via
++ * 		**skb_store_bytes**\ () and to recompute the checksums with
++ * 		**bpf_l3_csum_replace**\ () and **bpf_l4_csum_replace**\
++ * 		(). The main case for this helper is to perform NAT64
++ * 		operations out of an eBPF program.
++ *
++ * 		Internally, the GSO type is marked as dodgy so that headers are
++ * 		checked and segments are recalculated by the GSO/GRO engine.
++ * 		The size for GSO target is adapted as well.
++ *
++ * 		All values for *flags* are reserved for future usage, and must
++ * 		be left at zero.
++ *
++ * 		A call to this helper is susceptible to change the underlaying
++ * 		packet buffer. Therefore, at load time, all checks on pointers
++ * 		previously done by the verifier are invalidated and must be
++ * 		performed again, if the helper is used in combination with
++ * 		direct packet access.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_skb_change_type(struct sk_buff *skb, u32 type)
++ * 	Description
++ * 		Change the packet type for the packet associated to *skb*. This
++ * 		comes down to setting *skb*\ **->pkt_type** to *type*, except
++ * 		the eBPF program does not have a write access to *skb*\
++ * 		**->pkt_type** beside this helper. Using a helper here allows
++ * 		for graceful handling of errors.
++ *
++ * 		The major use case is to change incoming *skb*s to
++ * 		**PACKET_HOST** in a programmatic way instead of having to
++ * 		recirculate via **redirect**\ (..., **BPF_F_INGRESS**), for
++ * 		example.
++ *
++ * 		Note that *type* only allows certain values. At this time, they
++ * 		are:
++ *
++ * 		**PACKET_HOST**
++ * 			Packet is for us.
++ * 		**PACKET_BROADCAST**
++ * 			Send packet to all.
++ * 		**PACKET_MULTICAST**
++ * 			Send packet to group.
++ * 		**PACKET_OTHERHOST**
++ * 			Send packet to someone else.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_skb_under_cgroup(struct sk_buff *skb, struct bpf_map *map, u32 index)
++ * 	Description
++ * 		Check whether *skb* is a descendant of the cgroup2 held by
++ * 		*map* of type **BPF_MAP_TYPE_CGROUP_ARRAY**, at *index*.
++ * 	Return
++ * 		The return value depends on the result of the test, and can be:
++ *
++ * 		* 0, if the *skb* failed the cgroup2 descendant test.
++ * 		* 1, if the *skb* succeeded the cgroup2 descendant test.
++ * 		* A negative error code, if an error occurred.
++ *
++ * u32 bpf_get_hash_recalc(struct sk_buff *skb)
++ * 	Description
++ * 		Retrieve the hash of the packet, *skb*\ **->hash**. If it is
++ * 		not set, in particular if the hash was cleared due to mangling,
++ * 		recompute this hash. Later accesses to the hash can be done
++ * 		directly with *skb*\ **->hash**.
++ *
++ * 		Calling **bpf_set_hash_invalid**\ (), changing a packet
++ * 		prototype with **bpf_skb_change_proto**\ (), or calling
++ * 		**bpf_skb_store_bytes**\ () with the
++ * 		**BPF_F_INVALIDATE_HASH** are actions susceptible to clear
++ * 		the hash and to trigger a new computation for the next call to
++ * 		**bpf_get_hash_recalc**\ ().
++ * 	Return
++ * 		The 32-bit hash.
+  *
+  * u64 bpf_get_current_task(void)
+- *     Returns current task_struct
+- *     Return: current
+- *
+- * int bpf_probe_write_user(void *dst, void *src, int len)
+- *     safely attempt to write to a location
+- *     @dst: destination address in userspace
+- *     @src: source address on stack
+- *     @len: number of bytes to copy
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_current_task_under_cgroup(map, index)
+- *     Check cgroup2 membership of current task
+- *     @map: pointer to bpf_map in BPF_MAP_TYPE_CGROUP_ARRAY type
+- *     @index: index of the cgroup in the bpf_map
+- *     Return:
+- *       == 0 current failed the cgroup2 descendant test
+- *       == 1 current succeeded the cgroup2 descendant test
+- *        < 0 error
+- *
+- * int bpf_skb_change_tail(skb, len, flags)
+- *     The helper will resize the skb to the given new size, to be used f.e.
+- *     with control messages.
+- *     @skb: pointer to skb
+- *     @len: new skb length
+- *     @flags: reserved
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_skb_pull_data(skb, len)
+- *     The helper will pull in non-linear data in case the skb is non-linear
+- *     and not all of len are part of the linear section. Only needed for
+- *     read/write with direct packet access.
+- *     @skb: pointer to skb
+- *     @len: len to make read/writeable
+- *     Return: 0 on success or negative error
+- *
+- * s64 bpf_csum_update(skb, csum)
+- *     Adds csum into skb->csum in case of CHECKSUM_COMPLETE.
+- *     @skb: pointer to skb
+- *     @csum: csum to add
+- *     Return: csum on success or negative error
+- *
+- * void bpf_set_hash_invalid(skb)
+- *     Invalidate current skb->hash.
+- *     @skb: pointer to skb
+- *
+- * int bpf_get_numa_node_id()
+- *     Return: Id of current NUMA node.
+- *
+- * int bpf_skb_change_head()
+- *     Grows headroom of skb and adjusts MAC header offset accordingly.
+- *     Will extends/reallocae as required automatically.
+- *     May change skb data pointer and will thus invalidate any check
+- *     performed for direct packet access.
+- *     @skb: pointer to skb
+- *     @len: length of header to be pushed in front
+- *     @flags: Flags (unused for now)
+- *     Return: 0 on success or negative error
+- *
+- * int bpf_xdp_adjust_head(xdp_md, delta)
+- *     Adjust the xdp_md.data by delta
+- *     @xdp_md: pointer to xdp_md
+- *     @delta: An positive/negative integer to be added to xdp_md.data
+- *     Return: 0 on success or negative on error
++ * 	Return
++ * 		A pointer to the current task struct.
++ *
++ * int bpf_probe_write_user(void *dst, const void *src, u32 len)
++ * 	Description
++ * 		Attempt in a safe way to write *len* bytes from the buffer
++ * 		*src* to *dst* in memory. It only works for threads that are in
++ * 		user context, and *dst* must be a valid user space address.
++ *
++ * 		This helper should not be used to implement any kind of
++ * 		security mechanism because of TOC-TOU attacks, but rather to
++ * 		debug, divert, and manipulate execution of semi-cooperative
++ * 		processes.
++ *
++ * 		Keep in mind that this feature is meant for experiments, and it
++ * 		has a risk of crashing the system and running programs.
++ * 		Therefore, when an eBPF program using this helper is attached,
++ * 		a warning including PID and process name is printed to kernel
++ * 		logs.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_current_task_under_cgroup(struct bpf_map *map, u32 index)
++ * 	Description
++ * 		Check whether the probe is being run is the context of a given
++ * 		subset of the cgroup2 hierarchy. The cgroup2 to test is held by
++ * 		*map* of type **BPF_MAP_TYPE_CGROUP_ARRAY**, at *index*.
++ * 	Return
++ * 		The return value depends on the result of the test, and can be:
++ *
++ * 		* 0, if the *skb* task belongs to the cgroup2.
++ * 		* 1, if the *skb* task does not belong to the cgroup2.
++ * 		* A negative error code, if an error occurred.
++ *
++ * int bpf_skb_change_tail(struct sk_buff *skb, u32 len, u64 flags)
++ * 	Description
++ * 		Resize (trim or grow) the packet associated to *skb* to the
++ * 		new *len*. The *flags* are reserved for future usage, and must
++ * 		be left at zero.
++ *
++ * 		The basic idea is that the helper performs the needed work to
++ * 		change the size of the packet, then the eBPF program rewrites
++ * 		the rest via helpers like **bpf_skb_store_bytes**\ (),
++ * 		**bpf_l3_csum_replace**\ (), **bpf_l3_csum_replace**\ ()
++ * 		and others. This helper is a slow path utility intended for
++ * 		replies with control messages. And because it is targeted for
++ * 		slow path, the helper itself can afford to be slow: it
++ * 		implicitly linearizes, unclones and drops offloads from the
++ * 		*skb*.
++ *
++ * 		A call to this helper is susceptible to change the underlaying
++ * 		packet buffer. Therefore, at load time, all checks on pointers
++ * 		previously done by the verifier are invalidated and must be
++ * 		performed again, if the helper is used in combination with
++ * 		direct packet access.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_skb_pull_data(struct sk_buff *skb, u32 len)
++ * 	Description
++ * 		Pull in non-linear data in case the *skb* is non-linear and not
++ * 		all of *len* are part of the linear section. Make *len* bytes
++ * 		from *skb* readable and writable. If a zero value is passed for
++ * 		*len*, then the whole length of the *skb* is pulled.
++ *
++ * 		This helper is only needed for reading and writing with direct
++ * 		packet access.
++ *
++ * 		For direct packet access, testing that offsets to access
++ * 		are within packet boundaries (test on *skb*\ **->data_end**) is
++ * 		susceptible to fail if offsets are invalid, or if the requested
++ * 		data is in non-linear parts of the *skb*. On failure the
++ * 		program can just bail out, or in the case of a non-linear
++ * 		buffer, use a helper to make the data available. The
++ * 		**bpf_skb_load_bytes**\ () helper is a first solution to access
++ * 		the data. Another one consists in using **bpf_skb_pull_data**
++ * 		to pull in once the non-linear parts, then retesting and
++ * 		eventually access the data.
++ *
++ * 		At the same time, this also makes sure the *skb* is uncloned,
++ * 		which is a necessary condition for direct write. As this needs
++ * 		to be an invariant for the write part only, the verifier
++ * 		detects writes and adds a prologue that is calling
++ * 		**bpf_skb_pull_data()** to effectively unclone the *skb* from
++ * 		the very beginning in case it is indeed cloned.
++ *
++ * 		A call to this helper is susceptible to change the underlaying
++ * 		packet buffer. Therefore, at load time, all checks on pointers
++ * 		previously done by the verifier are invalidated and must be
++ * 		performed again, if the helper is used in combination with
++ * 		direct packet access.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * s64 bpf_csum_update(struct sk_buff *skb, __wsum csum)
++ * 	Description
++ * 		Add the checksum *csum* into *skb*\ **->csum** in case the
++ * 		driver has supplied a checksum for the entire packet into that
++ * 		field. Return an error otherwise. This helper is intended to be
++ * 		used in combination with **bpf_csum_diff**\ (), in particular
++ * 		when the checksum needs to be updated after data has been
++ * 		written into the packet through direct packet access.
++ * 	Return
++ * 		The checksum on success, or a negative error code in case of
++ * 		failure.
++ *
++ * void bpf_set_hash_invalid(struct sk_buff *skb)
++ * 	Description
++ * 		Invalidate the current *skb*\ **->hash**. It can be used after
++ * 		mangling on headers through direct packet access, in order to
++ * 		indicate that the hash is outdated and to trigger a
++ * 		recalculation the next time the kernel tries to access this
++ * 		hash or when the **bpf_get_hash_recalc**\ () helper is called.
++ *
++ * int bpf_get_numa_node_id(void)
++ * 	Description
++ * 		Return the id of the current NUMA node. The primary use case
++ * 		for this helper is the selection of sockets for the local NUMA
++ * 		node, when the program is attached to sockets using the
++ * 		**SO_ATTACH_REUSEPORT_EBPF** option (see also **socket(7)**),
++ * 		but the helper is also available to other eBPF program types,
++ * 		similarly to **bpf_get_smp_processor_id**\ ().
++ * 	Return
++ * 		The id of current NUMA node.
++ *
++ * int bpf_skb_change_head(struct sk_buff *skb, u32 len, u64 flags)
++ * 	Description
++ * 		Grows headroom of packet associated to *skb* and adjusts the
++ * 		offset of the MAC header accordingly, adding *len* bytes of
++ * 		space. It automatically extends and reallocates memory as
++ * 		required.
++ *
++ * 		This helper can be used on a layer 3 *skb* to push a MAC header
++ * 		for redirection into a layer 2 device.
++ *
++ * 		All values for *flags* are reserved for future usage, and must
++ * 		be left at zero.
++ *
++ * 		A call to this helper is susceptible to change the underlaying
++ * 		packet buffer. Therefore, at load time, all checks on pointers
++ * 		previously done by the verifier are invalidated and must be
++ * 		performed again, if the helper is used in combination with
++ * 		direct packet access.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_xdp_adjust_head(struct xdp_buff *xdp_md, int delta)
++ * 	Description
++ * 		Adjust (move) *xdp_md*\ **->data** by *delta* bytes. Note that
++ * 		it is possible to use a negative value for *delta*. This helper
++ * 		can be used to prepare the packet for pushing or popping
++ * 		headers.
++ *
++ * 		A call to this helper is susceptible to change the underlaying
++ * 		packet buffer. Therefore, at load time, all checks on pointers
++ * 		previously done by the verifier are invalidated and must be
++ * 		performed again, if the helper is used in combination with
++ * 		direct packet access.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
+  *
+  * int bpf_probe_read_str(void *dst, int size, const void *unsafe_ptr)
+- *     Copy a NUL terminated string from unsafe address. In case the string
+- *     length is smaller than size, the target is not padded with further NUL
+- *     bytes. In case the string length is larger than size, just count-1
+- *     bytes are copied and the last byte is set to NUL.
+- *     @dst: destination address
+- *     @size: maximum number of bytes to copy, including the trailing NUL
+- *     @unsafe_ptr: unsafe address
+- *     Return:
+- *       > 0 length of the string including the trailing NUL on success
+- *       < 0 error
+- *
+- * u64 bpf_get_socket_cookie(skb)
+- *     Get the cookie for the socket stored inside sk_buff.
+- *     @skb: pointer to skb
+- *     Return: 8 Bytes non-decreasing number on success or 0 if the socket
+- *     field is missing inside sk_buff
+- *
+- * u32 bpf_get_socket_uid(skb)
+- *     Get the owner uid of the socket stored inside sk_buff.
+- *     @skb: pointer to skb
+- *     Return: uid of the socket owner on success or overflowuid if failed.
+- *
+- * u32 bpf_set_hash(skb, hash)
+- *     Set full skb->hash.
+- *     @skb: pointer to skb
+- *     @hash: hash to set
+- *
+- * int bpf_setsockopt(bpf_socket, level, optname, optval, optlen)
+- *     Calls setsockopt. Not all opts are available, only those with
+- *     integer optvals plus TCP_CONGESTION.
+- *     Supported levels: SOL_SOCKET and IPROTO_TCP
+- *     @bpf_socket: pointer to bpf_socket
+- *     @level: SOL_SOCKET or IPROTO_TCP
+- *     @optname: option name
+- *     @optval: pointer to option value
+- *     @optlen: length of optval in byes
+- *     Return: 0 or negative error
+- *
+- * int bpf_skb_adjust_room(skb, len_diff, mode, flags)
+- *     Grow or shrink room in sk_buff.
+- *     @skb: pointer to skb
+- *     @len_diff: (signed) amount of room to grow/shrink
+- *     @mode: operation mode (enum bpf_adj_room_mode)
+- *     @flags: reserved for future use
+- *     Return: 0 on success or negative error code
+- *
+- * int bpf_sk_redirect_map(map, key, flags)
+- *     Redirect skb to a sock in map using key as a lookup key for the
+- *     sock in map.
+- *     @map: pointer to sockmap
+- *     @key: key to lookup sock in map
+- *     @flags: reserved for future use
+- *     Return: SK_REDIRECT
+- *
+- * int bpf_sock_map_update(skops, map, key, flags)
+- *	@skops: pointer to bpf_sock_ops
+- *	@map: pointer to sockmap to update
+- *	@key: key to insert/update sock in map
+- *	@flags: same flags as map update elem
++ * 	Description
++ * 		Copy a NUL terminated string from an unsafe address
++ * 		*unsafe_ptr* to *dst*. The *size* should include the
++ * 		terminating NUL byte. In case the string length is smaller than
++ * 		*size*, the target is not padded with further NUL bytes. If the
++ * 		string length is larger than *size*, just *size*-1 bytes are
++ * 		copied and the last byte is set to NUL.
++ *
++ * 		On success, the length of the copied string is returned. This
++ * 		makes this helper useful in tracing programs for reading
++ * 		strings, and more importantly to get its length at runtime. See
++ * 		the following snippet:
++ *
++ * 		::
++ *
++ * 			SEC("kprobe/sys_open")
++ * 			void bpf_sys_open(struct pt_regs *ctx)
++ * 			{
++ * 			        char buf[PATHLEN]; // PATHLEN is defined to 256
++ * 			        int res = bpf_probe_read_str(buf, sizeof(buf),
++ * 				                             ctx->di);
++ *
++ * 				// Consume buf, for example push it to
++ * 				// userspace via bpf_perf_event_output(); we
++ * 				// can use res (the string length) as event
++ * 				// size, after checking its boundaries.
++ * 			}
++ *
++ * 		In comparison, using **bpf_probe_read()** helper here instead
++ * 		to read the string would require to estimate the length at
++ * 		compile time, and would often result in copying more memory
++ * 		than necessary.
++ *
++ * 		Another useful use case is when parsing individual process
++ * 		arguments or individual environment variables navigating
++ * 		*current*\ **->mm->arg_start** and *current*\
++ * 		**->mm->env_start**: using this helper and the return value,
++ * 		one can quickly iterate at the right offset of the memory area.
++ * 	Return
++ * 		On success, the strictly positive length of the string,
++ * 		including the trailing NUL character. On error, a negative
++ * 		value.
++ *
++ * u64 bpf_get_socket_cookie(struct sk_buff *skb)
++ * 	Description
++ * 		If the **struct sk_buff** pointed by *skb* has a known socket,
++ * 		retrieve the cookie (generated by the kernel) of this socket.
++ * 		If no cookie has been set yet, generate a new cookie. Once
++ * 		generated, the socket cookie remains stable for the life of the
++ * 		socket. This helper can be useful for monitoring per socket
++ * 		networking traffic statistics as it provides a unique socket
++ * 		identifier per namespace.
++ * 	Return
++ * 		A 8-byte long non-decreasing number on success, or 0 if the
++ * 		socket field is missing inside *skb*.
++ *
++ * u32 bpf_get_socket_uid(struct sk_buff *skb)
++ * 	Return
++ * 		The owner UID of the socket associated to *skb*. If the socket
++ * 		is **NULL**, or if it is not a full socket (i.e. if it is a
++ * 		time-wait or a request socket instead), **overflowuid** value
++ * 		is returned (note that **overflowuid** might also be the actual
++ * 		UID value for the socket).
++ *
++ * u32 bpf_set_hash(struct sk_buff *skb, u32 hash)
++ * 	Description
++ * 		Set the full hash for *skb* (set the field *skb*\ **->hash**)
++ * 		to value *hash*.
++ * 	Return
++ * 		0
++ *
++ * int bpf_setsockopt(struct bpf_sock_ops *bpf_socket, int level, int optname, char *optval, int optlen)
++ * 	Description
++ * 		Emulate a call to **setsockopt()** on the socket associated to
++ * 		*bpf_socket*, which must be a full socket. The *level* at
++ * 		which the option resides and the name *optname* of the option
++ * 		must be specified, see **setsockopt(2)** for more information.
++ * 		The option value of length *optlen* is pointed by *optval*.
++ *
++ * 		This helper actually implements a subset of **setsockopt()**.
++ * 		It supports the following *level*\ s:
++ *
++ * 		* **SOL_SOCKET**, which supports the following *optname*\ s:
++ * 		  **SO_RCVBUF**, **SO_SNDBUF**, **SO_MAX_PACING_RATE**,
++ * 		  **SO_PRIORITY**, **SO_RCVLOWAT**, **SO_MARK**.
++ * 		* **IPPROTO_TCP**, which supports the following *optname*\ s:
++ * 		  **TCP_CONGESTION**, **TCP_BPF_IW**,
++ * 		  **TCP_BPF_SNDCWND_CLAMP**.
++ * 		* **IPPROTO_IP**, which supports *optname* **IP_TOS**.
++ * 		* **IPPROTO_IPV6**, which supports *optname* **IPV6_TCLASS**.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_skb_adjust_room(struct sk_buff *skb, u32 len_diff, u32 mode, u64 flags)
++ * 	Description
++ * 		Grow or shrink the room for data in the packet associated to
++ * 		*skb* by *len_diff*, and according to the selected *mode*.
++ *
++ * 		There is a single supported mode at this time:
++ *
++ * 		* **BPF_ADJ_ROOM_NET**: Adjust room at the network layer
++ * 		  (room space is added or removed below the layer 3 header).
++ *
++ * 		All values for *flags* are reserved for future usage, and must
++ * 		be left at zero.
++ *
++ * 		A call to this helper is susceptible to change the underlaying
++ * 		packet buffer. Therefore, at load time, all checks on pointers
++ * 		previously done by the verifier are invalidated and must be
++ * 		performed again, if the helper is used in combination with
++ * 		direct packet access.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_redirect_map(struct bpf_map *map, u32 key, u64 flags)
++ * 	Description
++ * 		Redirect the packet to the endpoint referenced by *map* at
++ * 		index *key*. Depending on its type, this *map* can contain
++ * 		references to net devices (for forwarding packets through other
++ * 		ports), or to CPUs (for redirecting XDP frames to another CPU;
++ * 		but this is only implemented for native XDP (with driver
++ * 		support) as of this writing).
++ *
++ * 		All values for *flags* are reserved for future usage, and must
++ * 		be left at zero.
++ *
++ * 		When used to redirect packets to net devices, this helper
++ * 		provides a high performance increase over **bpf_redirect**\ ().
++ * 		This is due to various implementation details of the underlying
++ * 		mechanisms, one of which is the fact that **bpf_redirect_map**\
++ * 		() tries to send packet as a "bulk" to the device.
++ * 	Return
++ * 		**XDP_REDIRECT** on success, or **XDP_ABORTED** on error.
++ *
++ * int bpf_sk_redirect_map(struct bpf_map *map, u32 key, u64 flags)
++ * 	Description
++ * 		Redirect the packet to the socket referenced by *map* (of type
++ * 		**BPF_MAP_TYPE_SOCKMAP**) at index *key*. Both ingress and
++ * 		egress interfaces can be used for redirection. The
++ * 		**BPF_F_INGRESS** value in *flags* is used to make the
++ * 		distinction (ingress path is selected if the flag is present,
++ * 		egress path otherwise). This is the only flag supported for now.
++ * 	Return
++ * 		**SK_PASS** on success, or **SK_DROP** on error.
++ *
++ * int bpf_sock_map_update(struct bpf_sock_ops *skops, struct bpf_map *map, void *key, u64 flags)
++ * 	Description
++ * 		Add an entry to, or update a *map* referencing sockets. The
++ * 		*skops* is used as a new value for the entry associated to
++ * 		*key*. *flags* is one of:
++ *
++ * 		**BPF_NOEXIST**
++ * 			The entry for *key* must not exist in the map.
++ * 		**BPF_EXIST**
++ * 			The entry for *key* must already exist in the map.
++ * 		**BPF_ANY**
++ * 			No condition on the existence of the entry for *key*.
++ *
++ * 		If the *map* has eBPF programs (parser and verdict), those will
++ * 		be inherited by the socket being added. If the socket is
++ * 		already attached to eBPF programs, this results in an error.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_xdp_adjust_meta(struct xdp_buff *xdp_md, int delta)
++ * 	Description
++ * 		Adjust the address pointed by *xdp_md*\ **->data_meta** by
++ * 		*delta* (which can be positive or negative). Note that this
++ * 		operation modifies the address stored in *xdp_md*\ **->data**,
++ * 		so the latter must be loaded only after the helper has been
++ * 		called.
++ *
++ * 		The use of *xdp_md*\ **->data_meta** is optional and programs
++ * 		are not required to use it. The rationale is that when the
++ * 		packet is processed with XDP (e.g. as DoS filter), it is
++ * 		possible to push further meta data along with it before passing
++ * 		to the stack, and to give the guarantee that an ingress eBPF
++ * 		program attached as a TC classifier on the same device can pick
++ * 		this up for further post-processing. Since TC works with socket
++ * 		buffers, it remains possible to set from XDP the **mark** or
++ * 		**priority** pointers, or other pointers for the socket buffer.
++ * 		Having this scratch space generic and programmable allows for
++ * 		more flexibility as the user is free to store whatever meta
++ * 		data they need.
++ *
++ * 		A call to this helper is susceptible to change the underlaying
++ * 		packet buffer. Therefore, at load time, all checks on pointers
++ * 		previously done by the verifier are invalidated and must be
++ * 		performed again, if the helper is used in combination with
++ * 		direct packet access.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_perf_event_read_value(struct bpf_map *map, u64 flags, struct bpf_perf_event_value *buf, u32 buf_size)
++ * 	Description
++ * 		Read the value of a perf event counter, and store it into *buf*
++ * 		of size *buf_size*. This helper relies on a *map* of type
++ * 		**BPF_MAP_TYPE_PERF_EVENT_ARRAY**. The nature of the perf event
++ * 		counter is selected when *map* is updated with perf event file
++ * 		descriptors. The *map* is an array whose size is the number of
++ * 		available CPUs, and each cell contains a value relative to one
++ * 		CPU. The value to retrieve is indicated by *flags*, that
++ * 		contains the index of the CPU to look up, masked with
++ * 		**BPF_F_INDEX_MASK**. Alternatively, *flags* can be set to
++ * 		**BPF_F_CURRENT_CPU** to indicate that the value for the
++ * 		current CPU should be retrieved.
++ *
++ * 		This helper behaves in a way close to
++ * 		**bpf_perf_event_read**\ () helper, save that instead of
++ * 		just returning the value observed, it fills the *buf*
++ * 		structure. This allows for additional data to be retrieved: in
++ * 		particular, the enabled and running times (in *buf*\
++ * 		**->enabled** and *buf*\ **->running**, respectively) are
++ * 		copied. In general, **bpf_perf_event_read_value**\ () is
++ * 		recommended over **bpf_perf_event_read**\ (), which has some
++ * 		ABI issues and provides fewer functionalities.
++ *
++ * 		These values are interesting, because hardware PMU (Performance
++ * 		Monitoring Unit) counters are limited resources. When there are
++ * 		more PMU based perf events opened than available counters,
++ * 		kernel will multiplex these events so each event gets certain
++ * 		percentage (but not all) of the PMU time. In case that
++ * 		multiplexing happens, the number of samples or counter value
++ * 		will not reflect the case compared to when no multiplexing
++ * 		occurs. This makes comparison between different runs difficult.
++ * 		Typically, the counter value should be normalized before
++ * 		comparing to other experiments. The usual normalization is done
++ * 		as follows.
++ *
++ * 		::
++ *
++ * 			normalized_counter = counter * t_enabled / t_running
++ *
++ * 		Where t_enabled is the time enabled for event and t_running is
++ * 		the time running for event since last normalization. The
++ * 		enabled and running times are accumulated since the perf event
++ * 		open. To achieve scaling factor between two invocations of an
++ * 		eBPF program, users can can use CPU id as the key (which is
++ * 		typical for perf array usage model) to remember the previous
++ * 		value and do the calculation inside the eBPF program.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_perf_prog_read_value(struct bpf_perf_event_data *ctx, struct bpf_perf_event_value *buf, u32 buf_size)
++ * 	Description
++ * 		For en eBPF program attached to a perf event, retrieve the
++ * 		value of the event counter associated to *ctx* and store it in
++ * 		the structure pointed by *buf* and of size *buf_size*. Enabled
++ * 		and running times are also stored in the structure (see
++ * 		description of helper **bpf_perf_event_read_value**\ () for
++ * 		more details).
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_getsockopt(struct bpf_sock_ops *bpf_socket, int level, int optname, char *optval, int optlen)
++ * 	Description
++ * 		Emulate a call to **getsockopt()** on the socket associated to
++ * 		*bpf_socket*, which must be a full socket. The *level* at
++ * 		which the option resides and the name *optname* of the option
++ * 		must be specified, see **getsockopt(2)** for more information.
++ * 		The retrieved value is stored in the structure pointed by
++ * 		*opval* and of length *optlen*.
++ *
++ * 		This helper actually implements a subset of **getsockopt()**.
++ * 		It supports the following *level*\ s:
++ *
++ * 		* **IPPROTO_TCP**, which supports *optname*
++ * 		  **TCP_CONGESTION**.
++ * 		* **IPPROTO_IP**, which supports *optname* **IP_TOS**.
++ * 		* **IPPROTO_IPV6**, which supports *optname* **IPV6_TCLASS**.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_override_return(struct pt_reg *regs, u64 rc)
++ * 	Description
++ * 		Used for error injection, this helper uses kprobes to override
++ * 		the return value of the probed function, and to set it to *rc*.
++ * 		The first argument is the context *regs* on which the kprobe
++ * 		works.
++ *
++ * 		This helper works by setting setting the PC (program counter)
++ * 		to an override function which is run in place of the original
++ * 		probed function. This means the probed function is not run at
++ * 		all. The replacement function just returns with the required
++ * 		value.
++ *
++ * 		This helper has security implications, and thus is subject to
++ * 		restrictions. It is only available if the kernel was compiled
++ * 		with the **CONFIG_BPF_KPROBE_OVERRIDE** configuration
++ * 		option, and in this case it only works on functions tagged with
++ * 		**ALLOW_ERROR_INJECTION** in the kernel code.
++ *
++ * 		Also, the helper is only available for the architectures having
++ * 		the CONFIG_FUNCTION_ERROR_INJECTION option. As of this writing,
++ * 		x86 architecture is the only one to support this feature.
++ * 	Return
++ * 		0
++ *
++ * int bpf_sock_ops_cb_flags_set(struct bpf_sock_ops *bpf_sock, int argval)
++ * 	Description
++ * 		Attempt to set the value of the **bpf_sock_ops_cb_flags** field
++ * 		for the full TCP socket associated to *bpf_sock_ops* to
++ * 		*argval*.
++ *
++ * 		The primary use of this field is to determine if there should
++ * 		be calls to eBPF programs of type
++ * 		**BPF_PROG_TYPE_SOCK_OPS** at various points in the TCP
++ * 		code. A program of the same type can change its value, per
++ * 		connection and as necessary, when the connection is
++ * 		established. This field is directly accessible for reading, but
++ * 		this helper must be used for updates in order to return an
++ * 		error if an eBPF program tries to set a callback that is not
++ * 		supported in the current kernel.
++ *
++ * 		The supported callback values that *argval* can combine are:
++ *
++ * 		* **BPF_SOCK_OPS_RTO_CB_FLAG** (retransmission time out)
++ * 		* **BPF_SOCK_OPS_RETRANS_CB_FLAG** (retransmission)
++ * 		* **BPF_SOCK_OPS_STATE_CB_FLAG** (TCP state change)
++ *
++ * 		Here are some examples of where one could call such eBPF
++ * 		program:
++ *
++ * 		* When RTO fires.
++ * 		* When a packet is retransmitted.
++ * 		* When the connection terminates.
++ * 		* When a packet is sent.
++ * 		* When a packet is received.
++ * 	Return
++ * 		Code **-EINVAL** if the socket is not a full TCP socket;
++ * 		otherwise, a positive number containing the bits that could not
++ * 		be set is returned (which comes down to 0 if all bits were set
++ * 		as required).
++ *
++ * int bpf_msg_redirect_map(struct sk_msg_buff *msg, struct bpf_map *map, u32 key, u64 flags)
++ * 	Description
++ * 		This helper is used in programs implementing policies at the
++ * 		socket level. If the message *msg* is allowed to pass (i.e. if
++ * 		the verdict eBPF program returns **SK_PASS**), redirect it to
++ * 		the socket referenced by *map* (of type
++ * 		**BPF_MAP_TYPE_SOCKMAP**) at index *key*. Both ingress and
++ * 		egress interfaces can be used for redirection. The
++ * 		**BPF_F_INGRESS** value in *flags* is used to make the
++ * 		distinction (ingress path is selected if the flag is present,
++ * 		egress path otherwise). This is the only flag supported for now.
++ * 	Return
++ * 		**SK_PASS** on success, or **SK_DROP** on error.
++ *
++ * int bpf_msg_apply_bytes(struct sk_msg_buff *msg, u32 bytes)
++ * 	Description
++ * 		For socket policies, apply the verdict of the eBPF program to
++ * 		the next *bytes* (number of bytes) of message *msg*.
++ *
++ * 		For example, this helper can be used in the following cases:
++ *
++ * 		* A single **sendmsg**\ () or **sendfile**\ () system call
++ * 		  contains multiple logical messages that the eBPF program is
++ * 		  supposed to read and for which it should apply a verdict.
++ * 		* An eBPF program only cares to read the first *bytes* of a
++ * 		  *msg*. If the message has a large payload, then setting up
++ * 		  and calling the eBPF program repeatedly for all bytes, even
++ * 		  though the verdict is already known, would create unnecessary
++ * 		  overhead.
++ *
++ * 		When called from within an eBPF program, the helper sets a
++ * 		counter internal to the BPF infrastructure, that is used to
++ * 		apply the last verdict to the next *bytes*. If *bytes* is
++ * 		smaller than the current data being processed from a
++ * 		**sendmsg**\ () or **sendfile**\ () system call, the first
++ * 		*bytes* will be sent and the eBPF program will be re-run with
++ * 		the pointer for start of data pointing to byte number *bytes*
++ * 		**+ 1**. If *bytes* is larger than the current data being
++ * 		processed, then the eBPF verdict will be applied to multiple
++ * 		**sendmsg**\ () or **sendfile**\ () calls until *bytes* are
++ * 		consumed.
++ *
++ * 		Note that if a socket closes with the internal counter holding
++ * 		a non-zero value, this is not a problem because data is not
++ * 		being buffered for *bytes* and is sent as it is received.
++ * 	Return
++ * 		0
++ *
++ * int bpf_msg_cork_bytes(struct sk_msg_buff *msg, u32 bytes)
++ * 	Description
++ * 		For socket policies, prevent the execution of the verdict eBPF
++ * 		program for message *msg* until *bytes* (byte number) have been
++ * 		accumulated.
++ *
++ * 		This can be used when one needs a specific number of bytes
++ * 		before a verdict can be assigned, even if the data spans
++ * 		multiple **sendmsg**\ () or **sendfile**\ () calls. The extreme
++ * 		case would be a user calling **sendmsg**\ () repeatedly with
++ * 		1-byte long message segments. Obviously, this is bad for
++ * 		performance, but it is still valid. If the eBPF program needs
++ * 		*bytes* bytes to validate a header, this helper can be used to
++ * 		prevent the eBPF program to be called again until *bytes* have
++ * 		been accumulated.
++ * 	Return
++ * 		0
++ *
++ * int bpf_msg_pull_data(struct sk_msg_buff *msg, u32 start, u32 end, u64 flags)
++ * 	Description
++ * 		For socket policies, pull in non-linear data from user space
++ * 		for *msg* and set pointers *msg*\ **->data** and *msg*\
++ * 		**->data_end** to *start* and *end* bytes offsets into *msg*,
++ * 		respectively.
++ *
++ * 		If a program of type **BPF_PROG_TYPE_SK_MSG** is run on a
++ * 		*msg* it can only parse data that the (**data**, **data_end**)
++ * 		pointers have already consumed. For **sendmsg**\ () hooks this
++ * 		is likely the first scatterlist element. But for calls relying
++ * 		on the **sendpage** handler (e.g. **sendfile**\ ()) this will
++ * 		be the range (**0**, **0**) because the data is shared with
++ * 		user space and by default the objective is to avoid allowing
++ * 		user space to modify data while (or after) eBPF verdict is
++ * 		being decided. This helper can be used to pull in data and to
++ * 		set the start and end pointer to given values. Data will be
++ * 		copied if necessary (i.e. if data was not linear and if start
++ * 		and end pointers do not point to the same chunk).
++ *
++ * 		A call to this helper is susceptible to change the underlaying
++ * 		packet buffer. Therefore, at load time, all checks on pointers
++ * 		previously done by the verifier are invalidated and must be
++ * 		performed again, if the helper is used in combination with
++ * 		direct packet access.
++ *
++ * 		All values for *flags* are reserved for future usage, and must
++ * 		be left at zero.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_bind(struct bpf_sock_addr *ctx, struct sockaddr *addr, int addr_len)
++ * 	Description
++ * 		Bind the socket associated to *ctx* to the address pointed by
++ * 		*addr*, of length *addr_len*. This allows for making outgoing
++ * 		connection from the desired IP address, which can be useful for
++ * 		example when all processes inside a cgroup should use one
++ * 		single IP address on a host that has multiple IP configured.
++ *
++ * 		This helper works for IPv4 and IPv6, TCP and UDP sockets. The
++ * 		domain (*addr*\ **->sa_family**) must be **AF_INET** (or
++ * 		**AF_INET6**). Looking for a free port to bind to can be
++ * 		expensive, therefore binding to port is not permitted by the
++ * 		helper: *addr*\ **->sin_port** (or **sin6_port**, respectively)
++ * 		must be set to zero.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_xdp_adjust_tail(struct xdp_buff *xdp_md, int delta)
++ * 	Description
++ * 		Adjust (move) *xdp_md*\ **->data_end** by *delta* bytes. It is
++ * 		only possible to shrink the packet as of this writing,
++ * 		therefore *delta* must be a negative integer.
++ *
++ * 		A call to this helper is susceptible to change the underlaying
++ * 		packet buffer. Therefore, at load time, all checks on pointers
++ * 		previously done by the verifier are invalidated and must be
++ * 		performed again, if the helper is used in combination with
++ * 		direct packet access.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_skb_get_xfrm_state(struct sk_buff *skb, u32 index, struct bpf_xfrm_state *xfrm_state, u32 size, u64 flags)
++ * 	Description
++ * 		Retrieve the XFRM state (IP transform framework, see also
++ * 		**ip-xfrm(8)**) at *index* in XFRM "security path" for *skb*.
++ *
++ * 		The retrieved value is stored in the **struct bpf_xfrm_state**
++ * 		pointed by *xfrm_state* and of length *size*.
++ *
++ * 		All values for *flags* are reserved for future usage, and must
++ * 		be left at zero.
++ *
++ * 		This helper is available only if the kernel was compiled with
++ * 		**CONFIG_XFRM** configuration option.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_get_stack(struct pt_regs *regs, void *buf, u32 size, u64 flags)
++ * 	Description
++ * 		Return a user or a kernel stack in bpf program provided buffer.
++ * 		To achieve this, the helper needs *ctx*, which is a pointer
++ * 		to the context on which the tracing program is executed.
++ * 		To store the stacktrace, the bpf program provides *buf* with
++ * 		a nonnegative *size*.
++ *
++ * 		The last argument, *flags*, holds the number of stack frames to
++ * 		skip (from 0 to 255), masked with
++ * 		**BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set
++ * 		the following flags:
++ *
++ * 		**BPF_F_USER_STACK**
++ * 			Collect a user space stack instead of a kernel stack.
++ * 		**BPF_F_USER_BUILD_ID**
++ * 			Collect buildid+offset instead of ips for user stack,
++ * 			only valid if **BPF_F_USER_STACK** is also specified.
++ *
++ * 		**bpf_get_stack**\ () can collect up to
++ * 		**PERF_MAX_STACK_DEPTH** both kernel and user frames, subject
++ * 		to sufficient large buffer size. Note that
++ * 		this limit can be controlled with the **sysctl** program, and
++ * 		that it should be manually increased in order to profile long
++ * 		user stacks (such as stacks for Java programs). To do so, use:
++ *
++ * 		::
++ *
++ * 			# sysctl kernel.perf_event_max_stack=<new value>
++ * 	Return
++ * 		A non-negative value equal to or less than *size* on success,
++ * 		or a negative error in case of failure.
++ *
++ * int bpf_skb_load_bytes_relative(const struct sk_buff *skb, u32 offset, void *to, u32 len, u32 start_header)
++ * 	Description
++ * 		This helper is similar to **bpf_skb_load_bytes**\ () in that
++ * 		it provides an easy way to load *len* bytes from *offset*
++ * 		from the packet associated to *skb*, into the buffer pointed
++ * 		by *to*. The difference to **bpf_skb_load_bytes**\ () is that
++ * 		a fifth argument *start_header* exists in order to select a
++ * 		base offset to start from. *start_header* can be one of:
++ *
++ * 		**BPF_HDR_START_MAC**
++ * 			Base offset to load data from is *skb*'s mac header.
++ * 		**BPF_HDR_START_NET**
++ * 			Base offset to load data from is *skb*'s network header.
++ *
++ * 		In general, "direct packet access" is the preferred method to
++ * 		access packet data, however, this helper is in particular useful
++ * 		in socket filters where *skb*\ **->data** does not always point
++ * 		to the start of the mac header and where "direct packet access"
++ * 		is not available.
++ * 	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_fib_lookup(void *ctx, struct bpf_fib_lookup *params, int plen, u32 flags)
++ *	Description
++ *		Do FIB lookup in kernel tables using parameters in *params*.
++ *		If lookup is successful and result shows packet is to be
++ *		forwarded, the neighbor tables are searched for the nexthop.
++ *		If successful (ie., FIB lookup shows forwarding and nexthop
++ *		is resolved), the nexthop address is returned in ipv4_dst
++ *		or ipv6_dst based on family, smac is set to mac address of
++ *		egress device, dmac is set to nexthop mac address, rt_metric
++ *		is set to metric from route (IPv4/IPv6 only), and ifindex
++ *		is set to the device index of the nexthop from the FIB lookup.
++ *
++ *             *plen* argument is the size of the passed in struct.
++ *             *flags* argument can be a combination of one or more of the
++ *             following values:
++ *
++ *		**BPF_FIB_LOOKUP_DIRECT**
++ *			Do a direct table lookup vs full lookup using FIB
++ *			rules.
++ *		**BPF_FIB_LOOKUP_OUTPUT**
++ *			Perform lookup from an egress perspective (default is
++ *			ingress).
++ *
++ *             *ctx* is either **struct xdp_md** for XDP programs or
++ *             **struct sk_buff** tc cls_act programs.
++ *     Return
++ *		* < 0 if any input argument is invalid
++ *		*   0 on success (packet is forwarded, nexthop neighbor exists)
++ *		* > 0 one of **BPF_FIB_LKUP_RET_** codes explaining why the
++ *		  packet is not forwarded or needs assist from full stack
++ *
++ * int bpf_sock_hash_update(struct bpf_sock_ops_kern *skops, struct bpf_map *map, void *key, u64 flags)
++ *	Description
++ *		Add an entry to, or update a sockhash *map* referencing sockets.
++ *		The *skops* is used as a new value for the entry associated to
++ *		*key*. *flags* is one of:
++ *
++ *		**BPF_NOEXIST**
++ *			The entry for *key* must not exist in the map.
++ *		**BPF_EXIST**
++ *			The entry for *key* must already exist in the map.
++ *		**BPF_ANY**
++ *			No condition on the existence of the entry for *key*.
++ *
++ *		If the *map* has eBPF programs (parser and verdict), those will
++ *		be inherited by the socket being added. If the socket is
++ *		already attached to eBPF programs, this results in an error.
++ *	Return
++ *		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_msg_redirect_hash(struct sk_msg_buff *msg, struct bpf_map *map, void *key, u64 flags)
++ *	Description
++ *		This helper is used in programs implementing policies at the
++ *		socket level. If the message *msg* is allowed to pass (i.e. if
++ *		the verdict eBPF program returns **SK_PASS**), redirect it to
++ *		the socket referenced by *map* (of type
++ *		**BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and
++ *		egress interfaces can be used for redirection. The
++ *		**BPF_F_INGRESS** value in *flags* is used to make the
++ *		distinction (ingress path is selected if the flag is present,
++ *		egress path otherwise). This is the only flag supported for now.
++ *	Return
++ *		**SK_PASS** on success, or **SK_DROP** on error.
++ *
++ * int bpf_sk_redirect_hash(struct sk_buff *skb, struct bpf_map *map, void *key, u64 flags)
++ *	Description
++ *		This helper is used in programs implementing policies at the
++ *		skb socket level. If the sk_buff *skb* is allowed to pass (i.e.
++ *		if the verdeict eBPF program returns **SK_PASS**), redirect it
++ *		to the socket referenced by *map* (of type
++ *		**BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and
++ *		egress interfaces can be used for redirection. The
++ *		**BPF_F_INGRESS** value in *flags* is used to make the
++ *		distinction (ingress path is selected if the flag is present,
++ *		egress otherwise). This is the only flag supported for now.
++ *	Return
++ *		**SK_PASS** on success, or **SK_DROP** on error.
++ *
++ * int bpf_lwt_push_encap(struct sk_buff *skb, u32 type, void *hdr, u32 len)
++ *	Description
++ *		Encapsulate the packet associated to *skb* within a Layer 3
++ *		protocol header. This header is provided in the buffer at
++ *		address *hdr*, with *len* its size in bytes. *type* indicates
++ *		the protocol of the header and can be one of:
++ *
++ *		**BPF_LWT_ENCAP_SEG6**
++ *			IPv6 encapsulation with Segment Routing Header
++ *			(**struct ipv6_sr_hdr**). *hdr* only contains the SRH,
++ *			the IPv6 header is computed by the kernel.
++ *		**BPF_LWT_ENCAP_SEG6_INLINE**
++ *			Only works if *skb* contains an IPv6 packet. Insert a
++ *			Segment Routing Header (**struct ipv6_sr_hdr**) inside
++ *			the IPv6 header.
++ *
++ * 		A call to this helper is susceptible to change the underlaying
++ * 		packet buffer. Therefore, at load time, all checks on pointers
++ * 		previously done by the verifier are invalidated and must be
++ * 		performed again, if the helper is used in combination with
++ * 		direct packet access.
++ *	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_lwt_seg6_store_bytes(struct sk_buff *skb, u32 offset, const void *from, u32 len)
++ *	Description
++ *		Store *len* bytes from address *from* into the packet
++ *		associated to *skb*, at *offset*. Only the flags, tag and TLVs
++ *		inside the outermost IPv6 Segment Routing Header can be
++ *		modified through this helper.
++ *
++ * 		A call to this helper is susceptible to change the underlaying
++ * 		packet buffer. Therefore, at load time, all checks on pointers
++ * 		previously done by the verifier are invalidated and must be
++ * 		performed again, if the helper is used in combination with
++ * 		direct packet access.
++ *	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_lwt_seg6_adjust_srh(struct sk_buff *skb, u32 offset, s32 delta)
++ *	Description
++ *		Adjust the size allocated to TLVs in the outermost IPv6
++ *		Segment Routing Header contained in the packet associated to
++ *		*skb*, at position *offset* by *delta* bytes. Only offsets
++ *		after the segments are accepted. *delta* can be as well
++ *		positive (growing) as negative (shrinking).
++ *
++ * 		A call to this helper is susceptible to change the underlaying
++ * 		packet buffer. Therefore, at load time, all checks on pointers
++ * 		previously done by the verifier are invalidated and must be
++ * 		performed again, if the helper is used in combination with
++ * 		direct packet access.
++ *	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_lwt_seg6_action(struct sk_buff *skb, u32 action, void *param, u32 param_len)
++ *	Description
++ *		Apply an IPv6 Segment Routing action of type *action* to the
++ *		packet associated to *skb*. Each action takes a parameter
++ *		contained at address *param*, and of length *param_len* bytes.
++ *		*action* can be one of:
++ *
++ *		**SEG6_LOCAL_ACTION_END_X**
++ *			End.X action: Endpoint with Layer-3 cross-connect.
++ *			Type of *param*: **struct in6_addr**.
++ *		**SEG6_LOCAL_ACTION_END_T**
++ *			End.T action: Endpoint with specific IPv6 table lookup.
++ *			Type of *param*: **int**.
++ *		**SEG6_LOCAL_ACTION_END_B6**
++ *			End.B6 action: Endpoint bound to an SRv6 policy.
++ *			Type of param: **struct ipv6_sr_hdr**.
++ *		**SEG6_LOCAL_ACTION_END_B6_ENCAP**
++ *			End.B6.Encap action: Endpoint bound to an SRv6
++ *			encapsulation policy.
++ *			Type of param: **struct ipv6_sr_hdr**.
++ *
++ * 		A call to this helper is susceptible to change the underlaying
++ * 		packet buffer. Therefore, at load time, all checks on pointers
++ * 		previously done by the verifier are invalidated and must be
++ * 		performed again, if the helper is used in combination with
++ * 		direct packet access.
++ *	Return
++ * 		0 on success, or a negative error in case of failure.
++ *
++ * int bpf_rc_keydown(void *ctx, u32 protocol, u64 scancode, u32 toggle)
++ *	Description
++ *		This helper is used in programs implementing IR decoding, to
++ *		report a successfully decoded key press with *scancode*,
++ *		*toggle* value in the given *protocol*. The scancode will be
++ *		translated to a keycode using the rc keymap, and reported as
++ *		an input key down event. After a period a key up event is
++ *		generated. This period can be extended by calling either
++ *		**bpf_rc_keydown** () again with the same values, or calling
++ *		**bpf_rc_repeat** ().
++ *
++ *		Some protocols include a toggle bit, in case the button	was
++ *		released and pressed again between consecutive scancodes.
++ *
++ *		The *ctx* should point to the lirc sample as passed into
++ *		the program.
++ *
++ *		The *protocol* is the decoded protocol number (see
++ *		**enum rc_proto** for some predefined values).
++ *
++ *		This helper is only available is the kernel was compiled with
++ *		the **CONFIG_BPF_LIRC_MODE2** configuration option set to
++ *		"**y**".
++ *	Return
++ *		0
++ *
++ * int bpf_rc_repeat(void *ctx)
++ *	Description
++ *		This helper is used in programs implementing IR decoding, to
++ *		report a successfully decoded repeat key message. This delays
++ *		the generation of a key up event for previously generated
++ *		key down event.
++ *
++ *		Some IR protocols like NEC have a special IR message for
++ *		repeating last button, for when a button is held down.
++ *
++ *		The *ctx* should point to the lirc sample as passed into
++ *		the program.
++ *
++ *		This helper is only available is the kernel was compiled with
++ *		the **CONFIG_BPF_LIRC_MODE2** configuration option set to
++ *		"**y**".
++ *	Return
++ *		0
++ *
++ * uint64_t bpf_skb_cgroup_id(struct sk_buff *skb)
++ * 	Description
++ * 		Return the cgroup v2 id of the socket associated with the *skb*.
++ * 		This is roughly similar to the **bpf_get_cgroup_classid**\ ()
++ * 		helper for cgroup v1 by providing a tag resp. identifier that
++ * 		can be matched on or used for map lookups e.g. to implement
++ * 		policy. The cgroup v2 id of a given path in the hierarchy is
++ * 		exposed in user space through the f_handle API in order to get
++ * 		to the same 64-bit id.
++ *
++ * 		This helper can be used on TC egress path, but not on ingress,
++ * 		and is available only if the kernel was compiled with the
++ * 		**CONFIG_SOCK_CGROUP_DATA** configuration option.
++ * 	Return
++ * 		The id is returned or 0 in case the id could not be retrieved.
++ *
++ * u64 bpf_get_current_cgroup_id(void)
++ * 	Return
++ * 		A 64-bit integer containing the current cgroup id based
++ * 		on the cgroup within which the current task is running.
+  */
+ #define __BPF_FUNC_MAPPER(FN)		\
+ 	FN(unspec),			\
+@@ -638,6 +2131,33 @@ union bpf_attr {
+ 	FN(redirect_map),		\
+ 	FN(sk_redirect_map),		\
+ 	FN(sock_map_update),		\
++	FN(xdp_adjust_meta),		\
++	FN(perf_event_read_value),	\
++	FN(perf_prog_read_value),	\
++	FN(getsockopt),			\
++	FN(override_return),		\
++	FN(sock_ops_cb_flags_set),	\
++	FN(msg_redirect_map),		\
++	FN(msg_apply_bytes),		\
++	FN(msg_cork_bytes),		\
++	FN(msg_pull_data),		\
++	FN(bind),			\
++	FN(xdp_adjust_tail),		\
++	FN(skb_get_xfrm_state),		\
++	FN(get_stack),			\
++	FN(skb_load_bytes_relative),	\
++	FN(fib_lookup),			\
++	FN(sock_hash_update),		\
++	FN(msg_redirect_hash),		\
++	FN(sk_redirect_hash),		\
++	FN(lwt_push_encap),		\
++	FN(lwt_seg6_store_bytes),	\
++	FN(lwt_seg6_adjust_srh),	\
++	FN(lwt_seg6_action),		\
++	FN(rc_repeat),			\
++	FN(rc_keydown),			\
++	FN(skb_cgroup_id),		\
++	FN(get_current_cgroup_id),
+ 
+ /* integer value in 'imm' field of BPF_CALL instruction selects which helper
+  * function eBPF program intends to call
+@@ -671,17 +2191,23 @@ enum bpf_func_id {
+ /* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */
+ #define BPF_F_TUNINFO_IPV6		(1ULL << 0)
+ 
+-/* BPF_FUNC_get_stackid flags. */
++/* flags for both BPF_FUNC_get_stackid and BPF_FUNC_get_stack. */
+ #define BPF_F_SKIP_FIELD_MASK		0xffULL
+ #define BPF_F_USER_STACK		(1ULL << 8)
++/* flags used by BPF_FUNC_get_stackid only. */
+ #define BPF_F_FAST_STACK_CMP		(1ULL << 9)
+ #define BPF_F_REUSE_STACKID		(1ULL << 10)
++/* flags used by BPF_FUNC_get_stack only. */
++#define BPF_F_USER_BUILD_ID		(1ULL << 11)
+ 
+ /* BPF_FUNC_skb_set_tunnel_key flags. */
+ #define BPF_F_ZERO_CSUM_TX		(1ULL << 1)
+ #define BPF_F_DONT_FRAGMENT		(1ULL << 2)
++#define BPF_F_SEQ_NUMBER		(1ULL << 3)
+ 
+-/* BPF_FUNC_perf_event_output and BPF_FUNC_perf_event_read flags. */
++/* BPF_FUNC_perf_event_output, BPF_FUNC_perf_event_read and
++ * BPF_FUNC_perf_event_read_value flags.
++ */
+ #define BPF_F_INDEX_MASK		0xffffffffULL
+ #define BPF_F_CURRENT_CPU		BPF_F_INDEX_MASK
+ /* BPF_FUNC_perf_event_output for sk_buff input context. */
+@@ -692,6 +2218,18 @@ enum bpf_adj_room_mode {
+ 	BPF_ADJ_ROOM_NET,
+ };
+ 
++/* Mode for BPF_FUNC_skb_load_bytes_relative helper. */
++enum bpf_hdr_start_off {
++	BPF_HDR_START_MAC,
++	BPF_HDR_START_NET,
++};
++
++/* Encapsulation type for BPF_FUNC_lwt_push_encap helper. */
++enum bpf_lwt_encap_mode {
++	BPF_LWT_ENCAP_SEG6,
++	BPF_LWT_ENCAP_SEG6_INLINE
++};
++
+ /* user accessible mirror of in-kernel sk_buff.
+  * new fields can only be added to the end of this structure
+  */
+@@ -715,7 +2253,7 @@ struct __sk_buff {
+ 	__u32 data_end;
+ 	__u32 napi_id;
+ 
+-	/* accessed by BPF_PROG_TYPE_sk_skb types */
++	/* Accessed by BPF_PROG_TYPE_sk_skb types from here to ... */
+ 	__u32 family;
+ 	__u32 remote_ip4;	/* Stored in network byte order */
+ 	__u32 local_ip4;	/* Stored in network byte order */
+@@ -723,6 +2261,9 @@ struct __sk_buff {
+ 	__u32 local_ip6[4];	/* Stored in network byte order */
+ 	__u32 remote_port;	/* Stored in network byte order */
+ 	__u32 local_port;	/* stored in host byte order */
++	/* ... here. */
++
++	__u32 data_meta;
+ };
+ 
+ struct bpf_tunnel_key {
+@@ -733,10 +2274,24 @@ struct bpf_tunnel_key {
+ 	};
+ 	__u8 tunnel_tos;
+ 	__u8 tunnel_ttl;
+-	__u16 tunnel_ext;
++	__u16 tunnel_ext;	/* Padding, future use. */
+ 	__u32 tunnel_label;
+ };
+ 
++/* user accessible mirror of in-kernel xfrm_state.
++ * new fields can only be added to the end of this structure
++ */
++struct bpf_xfrm_state {
++	__u32 reqid;
++	__u32 spi;	/* Stored in network byte order */
++	__u16 family;
++	__u16 ext;	/* Padding, future use. */
++	union {
++		__u32 remote_ipv4;	/* Stored in network byte order */
++		__u32 remote_ipv6[4];	/* Stored in network byte order */
++	};
++};
++
+ /* Generic BPF return codes which all BPF program types may support.
+  * The values are binary compatible with their TC_ACT_* counter-part to
+  * provide backwards compatibility with existing SCHED_CLS and SCHED_ACT
+@@ -760,6 +2315,15 @@ struct bpf_sock {
+ 	__u32 protocol;
+ 	__u32 mark;
+ 	__u32 priority;
++	__u32 src_ip4;		/* Allows 1,2,4-byte read.
++				 * Stored in network byte order.
++				 */
++	__u32 src_ip6[4];	/* Allows 1,2,4-byte read.
++				 * Stored in network byte order.
++				 */
++	__u32 src_port;		/* Allows 4-byte read.
++				 * Stored in host byte order
++				 */
+ };
+ 
+ #define XDP_PACKET_HEADROOM 256
+@@ -783,12 +2347,31 @@ enum xdp_action {
+ struct xdp_md {
+ 	__u32 data;
+ 	__u32 data_end;
++	__u32 data_meta;
++	/* Below access go through struct xdp_rxq_info */
++	__u32 ingress_ifindex; /* rxq->dev->ifindex */
++	__u32 rx_queue_index;  /* rxq->queue_index  */
+ };
+ 
+ enum sk_action {
+-	SK_ABORTED = 0,
+-	SK_DROP,
+-	SK_REDIRECT,
++	SK_DROP = 0,
++	SK_PASS,
++};
++
++/* user accessible metadata for SK_MSG packet hook, new fields must
++ * be added to the end of this structure
++ */
++struct sk_msg_md {
++	void *data;
++	void *data_end;
++
++	__u32 family;
++	__u32 remote_ip4;	/* Stored in network byte order */
++	__u32 local_ip4;	/* Stored in network byte order */
++	__u32 remote_ip6[4];	/* Stored in network byte order */
++	__u32 local_ip6[4];	/* Stored in network byte order */
++	__u32 remote_port;	/* Stored in network byte order */
++	__u32 local_port;	/* stored in host byte order */
+ };
+ 
+ #define BPF_TAG_SIZE	8
+@@ -801,6 +2384,19 @@ struct bpf_prog_info {
+ 	__u32 xlated_prog_len;
+ 	__aligned_u64 jited_prog_insns;
+ 	__aligned_u64 xlated_prog_insns;
++	__u64 load_time;	/* ns since boottime */
++	__u32 created_by_uid;
++	__u32 nr_map_ids;
++	__aligned_u64 map_ids;
++	char name[BPF_OBJ_NAME_LEN];
++	__u32 ifindex;
++	__u32 gpl_compatible:1;
++	__u64 netns_dev;
++	__u64 netns_ino;
++	__u32 nr_jited_ksyms;
++	__u32 nr_jited_func_lens;
++	__aligned_u64 jited_ksyms;
++	__aligned_u64 jited_func_lens;
+ } __attribute__((aligned(8)));
+ 
+ struct bpf_map_info {
+@@ -810,8 +2406,48 @@ struct bpf_map_info {
+ 	__u32 value_size;
+ 	__u32 max_entries;
+ 	__u32 map_flags;
++	char  name[BPF_OBJ_NAME_LEN];
++	__u32 ifindex;
++	__u32 :32;
++	__u64 netns_dev;
++	__u64 netns_ino;
++	__u32 btf_id;
++	__u32 btf_key_type_id;
++	__u32 btf_value_type_id;
++} __attribute__((aligned(8)));
++
++struct bpf_btf_info {
++	__aligned_u64 btf;
++	__u32 btf_size;
++	__u32 id;
+ } __attribute__((aligned(8)));
+ 
++/* User bpf_sock_addr struct to access socket fields and sockaddr struct passed
++ * by user and intended to be used by socket (e.g. to bind to, depends on
++ * attach attach type).
++ */
++struct bpf_sock_addr {
++	__u32 user_family;	/* Allows 4-byte read, but no write. */
++	__u32 user_ip4;		/* Allows 1,2,4-byte read and 4-byte write.
++				 * Stored in network byte order.
++				 */
++	__u32 user_ip6[4];	/* Allows 1,2,4-byte read an 4-byte write.
++				 * Stored in network byte order.
++				 */
++	__u32 user_port;	/* Allows 4-byte read and write.
++				 * Stored in network byte order
++				 */
++	__u32 family;		/* Allows 4-byte read, but no write */
++	__u32 type;		/* Allows 4-byte read, but no write */
++	__u32 protocol;		/* Allows 4-byte read, but no write */
++	__u32 msg_src_ip4;	/* Allows 1,2,4-byte read an 4-byte write.
++				 * Stored in network byte order.
++				 */
++	__u32 msg_src_ip6[4];	/* Allows 1,2,4-byte read an 4-byte write.
++				 * Stored in network byte order.
++				 */
++};
++
+ /* User bpf_sock_ops struct to access socket values and specify request ops
+  * and their replies.
+  * Some of this fields are in network (bigendian) byte order and may need
+@@ -821,8 +2457,9 @@ struct bpf_map_info {
+ struct bpf_sock_ops {
+ 	__u32 op;
+ 	union {
+-		__u32 reply;
+-		__u32 replylong[4];
++		__u32 args[4];		/* Optionally passed to bpf program */
++		__u32 reply;		/* Returned by bpf program	    */
++		__u32 replylong[4];	/* Optionally returned by bpf prog  */
+ 	};
+ 	__u32 family;
+ 	__u32 remote_ip4;	/* Stored in network byte order */
+@@ -831,8 +2468,45 @@ struct bpf_sock_ops {
+ 	__u32 local_ip6[4];	/* Stored in network byte order */
+ 	__u32 remote_port;	/* Stored in network byte order */
+ 	__u32 local_port;	/* stored in host byte order */
++	__u32 is_fullsock;	/* Some TCP fields are only valid if
++				 * there is a full socket. If not, the
++				 * fields read as zero.
++				 */
++	__u32 snd_cwnd;
++	__u32 srtt_us;		/* Averaged RTT << 3 in usecs */
++	__u32 bpf_sock_ops_cb_flags; /* flags defined in uapi/linux/tcp.h */
++	__u32 state;
++	__u32 rtt_min;
++	__u32 snd_ssthresh;
++	__u32 rcv_nxt;
++	__u32 snd_nxt;
++	__u32 snd_una;
++	__u32 mss_cache;
++	__u32 ecn_flags;
++	__u32 rate_delivered;
++	__u32 rate_interval_us;
++	__u32 packets_out;
++	__u32 retrans_out;
++	__u32 total_retrans;
++	__u32 segs_in;
++	__u32 data_segs_in;
++	__u32 segs_out;
++	__u32 data_segs_out;
++	__u32 lost_out;
++	__u32 sacked_out;
++	__u32 sk_txhash;
++	__u64 bytes_received;
++	__u64 bytes_acked;
+ };
+ 
++/* Definitions for bpf_sock_ops_cb_flags */
++#define BPF_SOCK_OPS_RTO_CB_FLAG	(1<<0)
++#define BPF_SOCK_OPS_RETRANS_CB_FLAG	(1<<1)
++#define BPF_SOCK_OPS_STATE_CB_FLAG	(1<<2)
++#define BPF_SOCK_OPS_ALL_CB_FLAGS       0x7		/* Mask of all currently
++							 * supported cb flags
++							 */
++
+ /* List of known BPF sock_ops operators.
+  * New entries can only be added at the end
+  */
+@@ -859,9 +2533,156 @@ enum {
+ 	BPF_SOCK_OPS_NEEDS_ECN,		/* If connection's congestion control
+ 					 * needs ECN
+ 					 */
++	BPF_SOCK_OPS_BASE_RTT,		/* Get base RTT. The correct value is
++					 * based on the path and may be
++					 * dependent on the congestion control
++					 * algorithm. In general it indicates
++					 * a congestion threshold. RTTs above
++					 * this indicate congestion
++					 */
++	BPF_SOCK_OPS_RTO_CB,		/* Called when an RTO has triggered.
++					 * Arg1: value of icsk_retransmits
++					 * Arg2: value of icsk_rto
++					 * Arg3: whether RTO has expired
++					 */
++	BPF_SOCK_OPS_RETRANS_CB,	/* Called when skb is retransmitted.
++					 * Arg1: sequence number of 1st byte
++					 * Arg2: # segments
++					 * Arg3: return value of
++					 *       tcp_transmit_skb (0 => success)
++					 */
++	BPF_SOCK_OPS_STATE_CB,		/* Called when TCP changes state.
++					 * Arg1: old_state
++					 * Arg2: new_state
++					 */
++	BPF_SOCK_OPS_TCP_LISTEN_CB,	/* Called on listen(2), right after
++					 * socket transition to LISTEN state.
++					 */
++};
++
++/* List of TCP states. There is a build check in net/ipv4/tcp.c to detect
++ * changes between the TCP and BPF versions. Ideally this should never happen.
++ * If it does, we need to add code to convert them before calling
++ * the BPF sock_ops function.
++ */
++enum {
++	BPF_TCP_ESTABLISHED = 1,
++	BPF_TCP_SYN_SENT,
++	BPF_TCP_SYN_RECV,
++	BPF_TCP_FIN_WAIT1,
++	BPF_TCP_FIN_WAIT2,
++	BPF_TCP_TIME_WAIT,
++	BPF_TCP_CLOSE,
++	BPF_TCP_CLOSE_WAIT,
++	BPF_TCP_LAST_ACK,
++	BPF_TCP_LISTEN,
++	BPF_TCP_CLOSING,	/* Now a valid state */
++	BPF_TCP_NEW_SYN_RECV,
++
++	BPF_TCP_MAX_STATES	/* Leave at the end! */
+ };
+ 
+ #define TCP_BPF_IW		1001	/* Set TCP initial congestion window */
+ #define TCP_BPF_SNDCWND_CLAMP	1002	/* Set sndcwnd_clamp */
+ 
++struct bpf_perf_event_value {
++	__u64 counter;
++	__u64 enabled;
++	__u64 running;
++};
++
++#define BPF_DEVCG_ACC_MKNOD	(1ULL << 0)
++#define BPF_DEVCG_ACC_READ	(1ULL << 1)
++#define BPF_DEVCG_ACC_WRITE	(1ULL << 2)
++
++#define BPF_DEVCG_DEV_BLOCK	(1ULL << 0)
++#define BPF_DEVCG_DEV_CHAR	(1ULL << 1)
++
++struct bpf_cgroup_dev_ctx {
++	/* access_type encoded as (BPF_DEVCG_ACC_* << 16) | BPF_DEVCG_DEV_* */
++	__u32 access_type;
++	__u32 major;
++	__u32 minor;
++};
++
++struct bpf_raw_tracepoint_args {
++	__u64 args[0];
++};
++
++/* DIRECT:  Skip the FIB rules and go to FIB table associated with device
++ * OUTPUT:  Do lookup from egress perspective; default is ingress
++ */
++#define BPF_FIB_LOOKUP_DIRECT  BIT(0)
++#define BPF_FIB_LOOKUP_OUTPUT  BIT(1)
++
++enum {
++	BPF_FIB_LKUP_RET_SUCCESS,      /* lookup successful */
++	BPF_FIB_LKUP_RET_BLACKHOLE,    /* dest is blackholed; can be dropped */
++	BPF_FIB_LKUP_RET_UNREACHABLE,  /* dest is unreachable; can be dropped */
++	BPF_FIB_LKUP_RET_PROHIBIT,     /* dest not allowed; can be dropped */
++	BPF_FIB_LKUP_RET_NOT_FWDED,    /* packet is not forwarded */
++	BPF_FIB_LKUP_RET_FWD_DISABLED, /* fwding is not enabled on ingress */
++	BPF_FIB_LKUP_RET_UNSUPP_LWT,   /* fwd requires encapsulation */
++	BPF_FIB_LKUP_RET_NO_NEIGH,     /* no neighbor entry for nh */
++	BPF_FIB_LKUP_RET_FRAG_NEEDED,  /* fragmentation required to fwd */
++};
++
++struct bpf_fib_lookup {
++	/* input:  network family for lookup (AF_INET, AF_INET6)
++	 * output: network family of egress nexthop
++	 */
++	__u8	family;
++
++	/* set if lookup is to consider L4 data - e.g., FIB rules */
++	__u8	l4_protocol;
++	__be16	sport;
++	__be16	dport;
++
++	/* total length of packet from network header - used for MTU check */
++	__u16	tot_len;
++
++	/* input: L3 device index for lookup
++	 * output: device index from FIB lookup
++	 */
++	__u32	ifindex;
++
++	union {
++		/* inputs to lookup */
++		__u8	tos;		/* AF_INET  */
++		__be32	flowinfo;	/* AF_INET6, flow_label + priority */
++
++		/* output: metric of fib result (IPv4/IPv6 only) */
++		__u32	rt_metric;
++	};
++
++	union {
++		__be32		ipv4_src;
++		__u32		ipv6_src[4];  /* in6_addr; network order */
++	};
++
++	/* input to bpf_fib_lookup, ipv{4,6}_dst is destination address in
++	 * network header. output: bpf_fib_lookup sets to gateway address
++	 * if FIB lookup returns gateway route
++	 */
++	union {
++		__be32		ipv4_dst;
++		__u32		ipv6_dst[4];  /* in6_addr; network order */
++	};
++
++	/* output */
++	__be16	h_vlan_proto;
++	__be16	h_vlan_TCI;
++	__u8	smac[6];     /* ETH_ALEN */
++	__u8	dmac[6];     /* ETH_ALEN */
++};
++
++enum bpf_task_fd_type {
++	BPF_FD_TYPE_RAW_TRACEPOINT,	/* tp name */
++	BPF_FD_TYPE_TRACEPOINT,		/* tp name */
++	BPF_FD_TYPE_KPROBE,		/* (symbol + offset) or addr */
++	BPF_FD_TYPE_KRETPROBE,		/* (symbol + offset) or addr */
++	BPF_FD_TYPE_UPROBE,		/* filename + offset */
++	BPF_FD_TYPE_URETPROBE,		/* filename + offset */
++};
++
+ #endif /* __LINUX_BPF_H__ */
+diff --git a/include/uapi/linux/bpf_common.h b/include/uapi/linux/bpf_common.h
+index afe7433..f0fe139 100644
+--- a/include/uapi/linux/bpf_common.h
++++ b/include/uapi/linux/bpf_common.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_BPF_COMMON_H__
+ #define __LINUX_BPF_COMMON_H__
+ 
+@@ -14,9 +15,10 @@
+ 
+ /* ld/ldx fields */
+ #define BPF_SIZE(code)  ((code) & 0x18)
+-#define		BPF_W		0x00
+-#define		BPF_H		0x08
+-#define		BPF_B		0x10
++#define		BPF_W		0x00 /* 32-bit */
++#define		BPF_H		0x08 /* 16-bit */
++#define		BPF_B		0x10 /*  8-bit */
++/* eBPF		BPF_DW		0x18    64-bit */
+ #define BPF_MODE(code)  ((code) & 0xe0)
+ #define		BPF_IMM		0x00
+ #define		BPF_ABS		0x20
+diff --git a/include/uapi/linux/btf.h b/include/uapi/linux/btf.h
+new file mode 100644
+index 0000000..5dd580a
+--- /dev/null
++++ b/include/uapi/linux/btf.h
+@@ -0,0 +1,113 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
++/* Copyright (c) 2018 Facebook */
++#ifndef __LINUX_BTF_H__
++#define __LINUX_BTF_H__
++
++#include <linux/types.h>
++
++#define BTF_MAGIC	0xeB9F
++#define BTF_VERSION	1
++
++struct btf_header {
++	__u16	magic;
++	__u8	version;
++	__u8	flags;
++	__u32	hdr_len;
++
++	/* All offsets are in bytes relative to the end of this header */
++	__u32	type_off;	/* offset of type section	*/
++	__u32	type_len;	/* length of type section	*/
++	__u32	str_off;	/* offset of string section	*/
++	__u32	str_len;	/* length of string section	*/
++};
++
++/* Max # of type identifier */
++#define BTF_MAX_TYPE	0x0000ffff
++/* Max offset into the string section */
++#define BTF_MAX_NAME_OFFSET	0x0000ffff
++/* Max # of struct/union/enum members or func args */
++#define BTF_MAX_VLEN	0xffff
++
++struct btf_type {
++	__u32 name_off;
++	/* "info" bits arrangement
++	 * bits  0-15: vlen (e.g. # of struct's members)
++	 * bits 16-23: unused
++	 * bits 24-27: kind (e.g. int, ptr, array...etc)
++	 * bits 28-31: unused
++	 */
++	__u32 info;
++	/* "size" is used by INT, ENUM, STRUCT and UNION.
++	 * "size" tells the size of the type it is describing.
++	 *
++	 * "type" is used by PTR, TYPEDEF, VOLATILE, CONST and RESTRICT.
++	 * "type" is a type_id referring to another type.
++	 */
++	union {
++		__u32 size;
++		__u32 type;
++	};
++};
++
++#define BTF_INFO_KIND(info)	(((info) >> 24) & 0x0f)
++#define BTF_INFO_VLEN(info)	((info) & 0xffff)
++
++#define BTF_KIND_UNKN		0	/* Unknown	*/
++#define BTF_KIND_INT		1	/* Integer	*/
++#define BTF_KIND_PTR		2	/* Pointer	*/
++#define BTF_KIND_ARRAY		3	/* Array	*/
++#define BTF_KIND_STRUCT		4	/* Struct	*/
++#define BTF_KIND_UNION		5	/* Union	*/
++#define BTF_KIND_ENUM		6	/* Enumeration	*/
++#define BTF_KIND_FWD		7	/* Forward	*/
++#define BTF_KIND_TYPEDEF	8	/* Typedef	*/
++#define BTF_KIND_VOLATILE	9	/* Volatile	*/
++#define BTF_KIND_CONST		10	/* Const	*/
++#define BTF_KIND_RESTRICT	11	/* Restrict	*/
++#define BTF_KIND_MAX		11
++#define NR_BTF_KINDS		12
++
++/* For some specific BTF_KIND, "struct btf_type" is immediately
++ * followed by extra data.
++ */
++
++/* BTF_KIND_INT is followed by a u32 and the following
++ * is the 32 bits arrangement:
++ */
++#define BTF_INT_ENCODING(VAL)	(((VAL) & 0x0f000000) >> 24)
++#define BTF_INT_OFFSET(VAL)	(((VAL  & 0x00ff0000)) >> 16)
++#define BTF_INT_BITS(VAL)	((VAL)  & 0x0000ffff)
++
++/* Attributes stored in the BTF_INT_ENCODING */
++#define BTF_INT_SIGNED	(1 << 0)
++#define BTF_INT_CHAR	(1 << 1)
++#define BTF_INT_BOOL	(1 << 2)
++
++/* BTF_KIND_ENUM is followed by multiple "struct btf_enum".
++ * The exact number of btf_enum is stored in the vlen (of the
++ * info in "struct btf_type").
++ */
++struct btf_enum {
++	__u32	name_off;
++	__s32	val;
++};
++
++/* BTF_KIND_ARRAY is followed by one "struct btf_array" */
++struct btf_array {
++	__u32	type;
++	__u32	index_type;
++	__u32	nelems;
++};
++
++/* BTF_KIND_STRUCT and BTF_KIND_UNION are followed
++ * by multiple "struct btf_member".  The exact number
++ * of btf_member is stored in the vlen (of the info in
++ * "struct btf_type").
++ */
++struct btf_member {
++	__u32	name_off;
++	__u32	type;
++	__u32	offset;	/* offset in bits */
++};
++
++#endif /* __LINUX_BTF_H__ */
+diff --git a/include/uapi/linux/can.h b/include/uapi/linux/can.h
+index f7a810d..4d1ab8e 100644
+--- a/include/uapi/linux/can.h
++++ b/include/uapi/linux/can.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */
+ /*
+  * linux/can.h
+  *
+diff --git a/include/uapi/linux/can/netlink.h b/include/uapi/linux/can/netlink.h
+index b9214bd..f0c5e58 100644
+--- a/include/uapi/linux/can/netlink.h
++++ b/include/uapi/linux/can/netlink.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /*
+  * linux/can/netlink.h
+  *
+@@ -131,6 +132,7 @@ enum {
+ 	IFLA_CAN_TERMINATION_CONST,
+ 	IFLA_CAN_BITRATE_CONST,
+ 	IFLA_CAN_DATA_BITRATE_CONST,
++	IFLA_CAN_BITRATE_MAX,
+ 	__IFLA_CAN_MAX
+ };
+ 
+diff --git a/include/uapi/linux/can/vxcan.h b/include/uapi/linux/can/vxcan.h
+index 5b29e8a..b364d77 100644
+--- a/include/uapi/linux/can/vxcan.h
++++ b/include/uapi/linux/can/vxcan.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _CAN_VXCAN_H
+ #define _CAN_VXCAN_H
+ 
+diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h
+index a62695e..5ee0e73 100644
+--- a/include/uapi/linux/devlink.h
++++ b/include/uapi/linux/devlink.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+ /*
+  * include/uapi/linux/devlink.h - Network physical device Netlink interface
+  * Copyright (c) 2016 Mellanox Technologies. All rights reserved.
+@@ -69,6 +70,24 @@ enum devlink_command {
+ 	DEVLINK_CMD_DPIPE_ENTRIES_GET,
+ 	DEVLINK_CMD_DPIPE_HEADERS_GET,
+ 	DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET,
++	DEVLINK_CMD_RESOURCE_SET,
++	DEVLINK_CMD_RESOURCE_DUMP,
++
++	/* Hot driver reload, makes configuration changes take place. The
++	 * devlink instance is not released during the process.
++	 */
++	DEVLINK_CMD_RELOAD,
++
++	DEVLINK_CMD_PARAM_GET,		/* can dump */
++	DEVLINK_CMD_PARAM_SET,
++	DEVLINK_CMD_PARAM_NEW,
++	DEVLINK_CMD_PARAM_DEL,
++
++	DEVLINK_CMD_REGION_GET,
++	DEVLINK_CMD_REGION_SET,
++	DEVLINK_CMD_REGION_NEW,
++	DEVLINK_CMD_REGION_DEL,
++	DEVLINK_CMD_REGION_READ,
+ 
+ 	/* add new commands above here */
+ 	__DEVLINK_CMD_MAX,
+@@ -124,6 +143,26 @@ enum devlink_eswitch_encap_mode {
+ 	DEVLINK_ESWITCH_ENCAP_MODE_BASIC,
+ };
+ 
++enum devlink_port_flavour {
++	DEVLINK_PORT_FLAVOUR_PHYSICAL, /* Any kind of a port physically
++					* facing the user.
++					*/
++	DEVLINK_PORT_FLAVOUR_CPU, /* CPU port */
++	DEVLINK_PORT_FLAVOUR_DSA, /* Distributed switch architecture
++				   * interconnect port.
++				   */
++};
++
++enum devlink_param_cmode {
++	DEVLINK_PARAM_CMODE_RUNTIME,
++	DEVLINK_PARAM_CMODE_DRIVERINIT,
++	DEVLINK_PARAM_CMODE_PERMANENT,
++
++	/* Add new configuration modes above */
++	__DEVLINK_PARAM_CMODE_MAX,
++	DEVLINK_PARAM_CMODE_MAX = __DEVLINK_PARAM_CMODE_MAX - 1
++};
++
+ enum devlink_attr {
+ 	/* don't change the order or add anything between, this is ABI! */
+ 	DEVLINK_ATTR_UNSPEC,
+@@ -201,6 +240,45 @@ enum devlink_attr {
+ 	DEVLINK_ATTR_PAD,
+ 
+ 	DEVLINK_ATTR_ESWITCH_ENCAP_MODE,	/* u8 */
++	DEVLINK_ATTR_RESOURCE_LIST,		/* nested */
++	DEVLINK_ATTR_RESOURCE,			/* nested */
++	DEVLINK_ATTR_RESOURCE_NAME,		/* string */
++	DEVLINK_ATTR_RESOURCE_ID,		/* u64 */
++	DEVLINK_ATTR_RESOURCE_SIZE,		/* u64 */
++	DEVLINK_ATTR_RESOURCE_SIZE_NEW,		/* u64 */
++	DEVLINK_ATTR_RESOURCE_SIZE_VALID,	/* u8 */
++	DEVLINK_ATTR_RESOURCE_SIZE_MIN,		/* u64 */
++	DEVLINK_ATTR_RESOURCE_SIZE_MAX,		/* u64 */
++	DEVLINK_ATTR_RESOURCE_SIZE_GRAN,        /* u64 */
++	DEVLINK_ATTR_RESOURCE_UNIT,		/* u8 */
++	DEVLINK_ATTR_RESOURCE_OCC,		/* u64 */
++	DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID,	/* u64 */
++	DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS,/* u64 */
++
++	DEVLINK_ATTR_PORT_FLAVOUR,		/* u16 */
++	DEVLINK_ATTR_PORT_NUMBER,		/* u32 */
++	DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER,	/* u32 */
++
++	DEVLINK_ATTR_PARAM,			/* nested */
++	DEVLINK_ATTR_PARAM_NAME,		/* string */
++	DEVLINK_ATTR_PARAM_GENERIC,		/* flag */
++	DEVLINK_ATTR_PARAM_TYPE,		/* u8 */
++	DEVLINK_ATTR_PARAM_VALUES_LIST,		/* nested */
++	DEVLINK_ATTR_PARAM_VALUE,		/* nested */
++	DEVLINK_ATTR_PARAM_VALUE_DATA,		/* dynamic */
++	DEVLINK_ATTR_PARAM_VALUE_CMODE,		/* u8 */
++
++	DEVLINK_ATTR_REGION_NAME,               /* string */
++	DEVLINK_ATTR_REGION_SIZE,               /* u64 */
++	DEVLINK_ATTR_REGION_SNAPSHOTS,          /* nested */
++	DEVLINK_ATTR_REGION_SNAPSHOT,           /* nested */
++	DEVLINK_ATTR_REGION_SNAPSHOT_ID,        /* u32 */
++
++	DEVLINK_ATTR_REGION_CHUNKS,             /* nested */
++	DEVLINK_ATTR_REGION_CHUNK,              /* nested */
++	DEVLINK_ATTR_REGION_CHUNK_DATA,         /* binary */
++	DEVLINK_ATTR_REGION_CHUNK_ADDR,         /* u64 */
++	DEVLINK_ATTR_REGION_CHUNK_LEN,          /* u64 */
+ 
+ 	/* add new attributes above here, update the policy in devlink.c */
+ 
+@@ -244,4 +322,8 @@ enum devlink_dpipe_header_id {
+ 	DEVLINK_DPIPE_HEADER_IPV6,
+ };
+ 
++enum devlink_resource_unit {
++	DEVLINK_RESOURCE_UNIT_ENTRY,
++};
++
+ #endif /* _LINUX_DEVLINK_H_ */
+diff --git a/include/uapi/linux/elf-em.h b/include/uapi/linux/elf-em.h
+index 9cd1de9..31aa101 100644
+--- a/include/uapi/linux/elf-em.h
++++ b/include/uapi/linux/elf-em.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _LINUX_ELF_EM_H
+ #define _LINUX_ELF_EM_H
+ 
+diff --git a/include/uapi/linux/fib_rules.h b/include/uapi/linux/fib_rules.h
+index bbf02a6..232df14 100644
+--- a/include/uapi/linux/fib_rules.h
++++ b/include/uapi/linux/fib_rules.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_FIB_RULES_H
+ #define __LINUX_FIB_RULES_H
+ 
+@@ -22,7 +23,7 @@ struct fib_rule_hdr {
+ 	__u8		tos;
+ 
+ 	__u8		table;
+-	__u8		res1;	/* reserved */
++	__u8		res1;   /* reserved */
+ 	__u8		res2;	/* reserved */
+ 	__u8		action;
+ 
+@@ -34,6 +35,11 @@ struct fib_rule_uid_range {
+ 	__u32		end;
+ };
+ 
++struct fib_rule_port_range {
++	__u16		start;
++	__u16		end;
++};
++
+ enum {
+ 	FRA_UNSPEC,
+ 	FRA_DST,	/* destination address */
+@@ -57,6 +63,10 @@ enum {
+ 	FRA_PAD,
+ 	FRA_L3MDEV,	/* iif or oif is l3mdev goto its table */
+ 	FRA_UID_RANGE,	/* UID range */
++	FRA_PROTOCOL,   /* Originator of the rule */
++	FRA_IP_PROTO,	/* ip proto */
++	FRA_SPORT_RANGE, /* sport */
++	FRA_DPORT_RANGE, /* dport */
+ 	__FRA_MAX
+ };
+ 
+diff --git a/include/uapi/linux/filter.h b/include/uapi/linux/filter.h
+index e4f2f74..eaef459 100644
+--- a/include/uapi/linux/filter.h
++++ b/include/uapi/linux/filter.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /*
+  * Linux Socket Filter Data Structures
+  */
+diff --git a/include/uapi/linux/fou.h b/include/uapi/linux/fou.h
+index 744c323..bf022c6 100644
+--- a/include/uapi/linux/fou.h
++++ b/include/uapi/linux/fou.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /* fou.h - FOU Interface */
+ 
+ #ifndef _LINUX_FOU_H
+diff --git a/include/uapi/linux/gen_stats.h b/include/uapi/linux/gen_stats.h
+index 52deccc..24a861c 100644
+--- a/include/uapi/linux/gen_stats.h
++++ b/include/uapi/linux/gen_stats.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_GEN_STATS_H
+ #define __LINUX_GEN_STATS_H
+ 
+diff --git a/include/uapi/linux/genetlink.h b/include/uapi/linux/genetlink.h
+index 08239d8..1317119 100644
+--- a/include/uapi/linux/genetlink.h
++++ b/include/uapi/linux/genetlink.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_GENERIC_NETLINK_H
+ #define __LINUX_GENERIC_NETLINK_H
+ 
+diff --git a/include/uapi/linux/hdlc/ioctl.h b/include/uapi/linux/hdlc/ioctl.h
+index 04bc027..0fe4238 100644
+--- a/include/uapi/linux/hdlc/ioctl.h
++++ b/include/uapi/linux/hdlc/ioctl.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __HDLC_IOCTL_H__
+ #define __HDLC_IOCTL_H__
+ 
+diff --git a/include/uapi/linux/icmpv6.h b/include/uapi/linux/icmpv6.h
+index a2e839e..cb247a5 100644
+--- a/include/uapi/linux/icmpv6.h
++++ b/include/uapi/linux/icmpv6.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _LINUX_ICMPV6_H
+ #define _LINUX_ICMPV6_H
+ 
+diff --git a/include/uapi/linux/if.h b/include/uapi/linux/if.h
+index b4ba020..495cdd2 100644
+--- a/include/uapi/linux/if.h
++++ b/include/uapi/linux/if.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+ /*
+  * INET		An implementation of the TCP/IP protocol suite for the LINUX
+  *		operating system.  INET is implemented using the  BSD Socket
+diff --git a/include/uapi/linux/if_addr.h b/include/uapi/linux/if_addr.h
+index 26f0ecf..a924606 100644
+--- a/include/uapi/linux/if_addr.h
++++ b/include/uapi/linux/if_addr.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_IF_ADDR_H
+ #define __LINUX_IF_ADDR_H
+ 
+@@ -32,6 +33,7 @@ enum {
+ 	IFA_CACHEINFO,
+ 	IFA_MULTICAST,
+ 	IFA_FLAGS,
++	IFA_RT_PRIORITY,  /* u32, priority/metric for prefix route */
+ 	__IFA_MAX,
+ };
+ 
+diff --git a/include/uapi/linux/if_addrlabel.h b/include/uapi/linux/if_addrlabel.h
+index 54580c2..d1f5974 100644
+--- a/include/uapi/linux/if_addrlabel.h
++++ b/include/uapi/linux/if_addrlabel.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /*
+  * if_addrlabel.h - netlink interface for address labels
+  *
+diff --git a/include/uapi/linux/if_alg.h b/include/uapi/linux/if_alg.h
+index f2acd2f..bc2bcde 100644
+--- a/include/uapi/linux/if_alg.h
++++ b/include/uapi/linux/if_alg.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+ /*
+  * if_alg: User-space algorithm interface
+  *
+diff --git a/include/uapi/linux/if_arp.h b/include/uapi/linux/if_arp.h
+index 199f253..cd136a6 100644
+--- a/include/uapi/linux/if_arp.h
++++ b/include/uapi/linux/if_arp.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+ /*
+  * INET		An implementation of the TCP/IP protocol suite for the LINUX
+  *		operating system.  INET is implemented using the  BSD Socket
+diff --git a/include/uapi/linux/if_bonding.h b/include/uapi/linux/if_bonding.h
+index 9635a62..61a1bf6 100644
+--- a/include/uapi/linux/if_bonding.h
++++ b/include/uapi/linux/if_bonding.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-1.0+ WITH Linux-syscall-note */
+ /*
+  * Bond several ethernet interfaces into a Cisco, running 'Etherchannel'.
+  *
+diff --git a/include/uapi/linux/if_bridge.h b/include/uapi/linux/if_bridge.h
+index 156f443..bdfecf9 100644
+--- a/include/uapi/linux/if_bridge.h
++++ b/include/uapi/linux/if_bridge.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+ /*
+  *	Linux ethernet bridge
+  *
+diff --git a/include/uapi/linux/if_ether.h b/include/uapi/linux/if_ether.h
+index 7dde037..8c36f63 100644
+--- a/include/uapi/linux/if_ether.h
++++ b/include/uapi/linux/if_ether.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+ /*
+  * INET		An implementation of the TCP/IP protocol suite for the LINUX
+  *		operating system.  INET is implemented using the  BSD Socket
+@@ -29,6 +30,7 @@
+  */
+ 
+ #define ETH_ALEN	6		/* Octets in one ethernet addr	 */
++#define ETH_TLEN	2		/* Octets in ethernet type field */
+ #define ETH_HLEN	14		/* Total octets in header.	 */
+ #define ETH_ZLEN	60		/* Min. octets in frame sans FCS */
+ #define ETH_DATA_LEN	1500		/* Max. octets in payload	 */
+@@ -46,6 +48,7 @@
+ #define ETH_P_PUP	0x0200		/* Xerox PUP packet		*/
+ #define ETH_P_PUPAT	0x0201		/* Xerox PUP Addr Trans packet	*/
+ #define ETH_P_TSN	0x22F0		/* TSN (IEEE 1722) packet	*/
++#define ETH_P_ERSPAN2	0x22EB		/* ERSPAN version 2 (type III)	*/
+ #define ETH_P_IP	0x0800		/* Internet Protocol packet	*/
+ #define ETH_P_X25	0x0805		/* CCITT X.25			*/
+ #define ETH_P_ARP	0x0806		/* Address Resolution packet	*/
+@@ -86,6 +89,7 @@
+ #define ETH_P_AOE	0x88A2		/* ATA over Ethernet		*/
+ #define ETH_P_8021AD	0x88A8          /* 802.1ad Service VLAN		*/
+ #define ETH_P_802_EX1	0x88B5		/* 802.1 Local Experimental 1.  */
++#define ETH_P_PREAUTH	0x88C7		/* 802.11 Preauthentication */
+ #define ETH_P_TIPC	0x88CA		/* TIPC 			*/
+ #define ETH_P_MACSEC	0x88E5		/* 802.1ae MACsec */
+ #define ETH_P_8021AH	0x88E7          /* 802.1ah Backbone Service Tag */
+@@ -148,11 +152,18 @@
+  *	This is an Ethernet frame header.
+  */
+ 
++/* allow libcs like musl to deactivate this, glibc does not implement this. */
++#ifndef __UAPI_DEF_ETHHDR
++#define __UAPI_DEF_ETHHDR		1
++#endif
++
++#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 */
+diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h
+index 1f97d05..1c64ed4 100644
+--- a/include/uapi/linux/if_link.h
++++ b/include/uapi/linux/if_link.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _LINUX_IF_LINK_H
+ #define _LINUX_IF_LINK_H
+ 
+@@ -158,6 +159,11 @@ enum {
+ 	IFLA_PAD,
+ 	IFLA_XDP,
+ 	IFLA_EVENT,
++	IFLA_NEW_NETNSID,
++	IFLA_IF_NETNSID,
++	IFLA_CARRIER_UP_COUNT,
++	IFLA_CARRIER_DOWN_COUNT,
++	IFLA_NEW_IFINDEX,
+ 	__IFLA_MAX
+ };
+ 
+@@ -323,6 +329,9 @@ enum {
+ 	IFLA_BRPORT_MCAST_TO_UCAST,
+ 	IFLA_BRPORT_VLAN_TUNNEL,
+ 	IFLA_BRPORT_BCAST_FLOOD,
++	IFLA_BRPORT_GROUP_FWD_MASK,
++	IFLA_BRPORT_NEIGH_SUPPRESS,
++	IFLA_BRPORT_ISOLATED,
+ 	__IFLA_BRPORT_MAX
+ };
+ #define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1)
+@@ -460,6 +469,7 @@ enum macsec_validation_type {
+ enum {
+ 	IFLA_IPVLAN_UNSPEC,
+ 	IFLA_IPVLAN_MODE,
++	IFLA_IPVLAN_FLAGS,
+ 	__IFLA_IPVLAN_MAX
+ };
+ 
+@@ -472,6 +482,9 @@ enum ipvlan_mode {
+ 	IPVLAN_MODE_MAX
+ };
+ 
++#define IPVLAN_F_PRIVATE	0x01
++#define IPVLAN_F_VEPA		0x02
++
+ /* VXLAN section */
+ enum {
+ 	IFLA_VXLAN_UNSPEC,
+@@ -502,6 +515,7 @@ enum {
+ 	IFLA_VXLAN_COLLECT_METADATA,
+ 	IFLA_VXLAN_LABEL,
+ 	IFLA_VXLAN_GPE,
++	IFLA_VXLAN_TTL_INHERIT,
+ 	__IFLA_VXLAN_MAX
+ };
+ #define IFLA_VXLAN_MAX	(__IFLA_VXLAN_MAX - 1)
+@@ -721,6 +735,8 @@ enum {
+ 	IFLA_VF_STATS_BROADCAST,
+ 	IFLA_VF_STATS_MULTICAST,
+ 	IFLA_VF_STATS_PAD,
++	IFLA_VF_STATS_RX_DROPPED,
++	IFLA_VF_STATS_TX_DROPPED,
+ 	__IFLA_VF_STATS_MAX,
+ };
+ 
+@@ -902,6 +918,7 @@ enum {
+ 	XDP_ATTACHED_DRV,
+ 	XDP_ATTACHED_SKB,
+ 	XDP_ATTACHED_HW,
++	XDP_ATTACHED_MULTI,
+ };
+ 
+ enum {
+@@ -910,6 +927,9 @@ enum {
+ 	IFLA_XDP_ATTACHED,
+ 	IFLA_XDP_FLAGS,
+ 	IFLA_XDP_PROG_ID,
++	IFLA_XDP_DRV_PROG_ID,
++	IFLA_XDP_SKB_PROG_ID,
++	IFLA_XDP_HW_PROG_ID,
+ 	__IFLA_XDP_MAX,
+ };
+ 
+@@ -925,4 +945,43 @@ enum {
+ 	IFLA_EVENT_BONDING_OPTIONS,	/* change in bonding options */
+ };
+ 
++/* tun section */
++
++enum {
++	IFLA_TUN_UNSPEC,
++	IFLA_TUN_OWNER,
++	IFLA_TUN_GROUP,
++	IFLA_TUN_TYPE,
++	IFLA_TUN_PI,
++	IFLA_TUN_VNET_HDR,
++	IFLA_TUN_PERSIST,
++	IFLA_TUN_MULTI_QUEUE,
++	IFLA_TUN_NUM_QUEUES,
++	IFLA_TUN_NUM_DISABLED_QUEUES,
++	__IFLA_TUN_MAX,
++};
++
++#define IFLA_TUN_MAX (__IFLA_TUN_MAX - 1)
++
++/* rmnet section */
++
++#define RMNET_FLAGS_INGRESS_DEAGGREGATION         (1U << 0)
++#define RMNET_FLAGS_INGRESS_MAP_COMMANDS          (1U << 1)
++#define RMNET_FLAGS_INGRESS_MAP_CKSUMV4           (1U << 2)
++#define RMNET_FLAGS_EGRESS_MAP_CKSUMV4            (1U << 3)
++
++enum {
++	IFLA_RMNET_UNSPEC,
++	IFLA_RMNET_MUX_ID,
++	IFLA_RMNET_FLAGS,
++	__IFLA_RMNET_MAX,
++};
++
++#define IFLA_RMNET_MAX	(__IFLA_RMNET_MAX - 1)
++
++struct ifla_rmnet_flags {
++	__u32	flags;
++	__u32	mask;
++};
++
+ #endif /* _LINUX_IF_LINK_H */
+diff --git a/include/uapi/linux/if_macsec.h b/include/uapi/linux/if_macsec.h
+index 22939a3..7743993 100644
+--- a/include/uapi/linux/if_macsec.h
++++ b/include/uapi/linux/if_macsec.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+ /*
+  * include/uapi/linux/if_macsec.h - MACsec device
+  *
+@@ -21,8 +22,13 @@
+ 
+ #define MACSEC_KEYID_LEN 16
+ 
+-#define MACSEC_DEFAULT_CIPHER_ID   0x0080020001000001ULL
+-#define MACSEC_DEFAULT_CIPHER_ALT  0x0080C20001000001ULL
++/* cipher IDs as per IEEE802.1AEbn-2011 */
++#define MACSEC_CIPHER_ID_GCM_AES_128 0x0080C20001000001ULL
++#define MACSEC_CIPHER_ID_GCM_AES_256 0x0080C20001000002ULL
++
++/* deprecated cipher ID for GCM-AES-128 */
++#define MACSEC_DEFAULT_CIPHER_ID     0x0080020001000001ULL
++#define MACSEC_DEFAULT_CIPHER_ALT    MACSEC_CIPHER_ID_GCM_AES_128
+ 
+ #define MACSEC_MIN_ICV_LEN 8
+ #define MACSEC_MAX_ICV_LEN 32
+diff --git a/include/uapi/linux/if_packet.h b/include/uapi/linux/if_packet.h
+index 4df96a7..67b61d9 100644
+--- a/include/uapi/linux/if_packet.h
++++ b/include/uapi/linux/if_packet.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_IF_PACKET_H
+ #define __LINUX_IF_PACKET_H
+ 
+diff --git a/include/uapi/linux/if_tun.h b/include/uapi/linux/if_tun.h
+index d5ecb42..be9b744 100644
+--- a/include/uapi/linux/if_tun.h
++++ b/include/uapi/linux/if_tun.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+ /*
+  *  Universal TUN/TAP device driver.
+  *  Copyright (C) 1999-2000 Maxim Krasnyansky <max_mk@yahoo.com>
+@@ -56,10 +57,14 @@
+  */
+ #define TUNSETVNETBE _IOW('T', 222, int)
+ #define TUNGETVNETBE _IOR('T', 223, int)
++#define TUNSETSTEERINGEBPF _IOR('T', 224, int)
++#define TUNSETFILTEREBPF _IOR('T', 225, int)
+ 
+ /* TUNSETIFF ifr flags */
+ #define IFF_TUN		0x0001
+ #define IFF_TAP		0x0002
++#define IFF_NAPI	0x0010
++#define IFF_NAPI_FRAGS	0x0020
+ #define IFF_NO_PI	0x1000
+ /* This flag has no real effect */
+ #define IFF_ONE_QUEUE	0x2000
+diff --git a/include/uapi/linux/if_tunnel.h b/include/uapi/linux/if_tunnel.h
+index 21834ca..ecdc766 100644
+--- a/include/uapi/linux/if_tunnel.h
++++ b/include/uapi/linux/if_tunnel.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _IF_TUNNEL_H_
+ #define _IF_TUNNEL_H_
+ 
+@@ -84,6 +85,7 @@ enum tunnel_encap_types {
+ 	TUNNEL_ENCAP_NONE,
+ 	TUNNEL_ENCAP_FOU,
+ 	TUNNEL_ENCAP_GUE,
++	TUNNEL_ENCAP_MPLS,
+ };
+ 
+ #define TUNNEL_ENCAP_FLAG_CSUM		(1<<0)
+@@ -135,6 +137,9 @@ enum {
+ 	IFLA_GRE_IGNORE_DF,
+ 	IFLA_GRE_FWMARK,
+ 	IFLA_GRE_ERSPAN_INDEX,
++	IFLA_GRE_ERSPAN_VER,
++	IFLA_GRE_ERSPAN_DIR,
++	IFLA_GRE_ERSPAN_HWID,
+ 	__IFLA_GRE_MAX,
+ };
+ 
+diff --git a/include/uapi/linux/if_vlan.h b/include/uapi/linux/if_vlan.h
+index 24ae007..18a15da 100644
+--- a/include/uapi/linux/if_vlan.h
++++ b/include/uapi/linux/if_vlan.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+ /*
+  * VLAN		An implementation of 802.1Q VLAN tagging.
+  *
+diff --git a/include/uapi/linux/ife.h b/include/uapi/linux/ife.h
+index 2954da3..bdd953c 100644
+--- a/include/uapi/linux/ife.h
++++ b/include/uapi/linux/ife.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __UAPI_IFE_H
+ #define __UAPI_IFE_H
+ 
+diff --git a/include/uapi/linux/ila.h b/include/uapi/linux/ila.h
+index 7e328d7..6a6c97c 100644
+--- a/include/uapi/linux/ila.h
++++ b/include/uapi/linux/ila.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /* ila.h - ILA Interface */
+ 
+ #ifndef _LINUX_ILA_H
+@@ -16,6 +17,8 @@ enum {
+ 	ILA_ATTR_DIR,				/* u32 */
+ 	ILA_ATTR_PAD,
+ 	ILA_ATTR_CSUM_MODE,			/* u8 */
++	ILA_ATTR_IDENT_TYPE,			/* u8 */
++	ILA_ATTR_HOOK_TYPE,			/* u8 */
+ 
+ 	__ILA_ATTR_MAX,
+ };
+@@ -27,6 +30,7 @@ enum {
+ 	ILA_CMD_ADD,
+ 	ILA_CMD_DEL,
+ 	ILA_CMD_GET,
++	ILA_CMD_FLUSH,
+ 
+ 	__ILA_CMD_MAX,
+ };
+@@ -40,6 +44,25 @@ enum {
+ 	ILA_CSUM_ADJUST_TRANSPORT,
+ 	ILA_CSUM_NEUTRAL_MAP,
+ 	ILA_CSUM_NO_ACTION,
++	ILA_CSUM_NEUTRAL_MAP_AUTO,
++};
++
++enum {
++	ILA_ATYPE_IID = 0,
++	ILA_ATYPE_LUID,
++	ILA_ATYPE_VIRT_V4,
++	ILA_ATYPE_VIRT_UNI_V6,
++	ILA_ATYPE_VIRT_MULTI_V6,
++	ILA_ATYPE_NONLOCAL_ADDR,
++	ILA_ATYPE_RSVD_1,
++	ILA_ATYPE_RSVD_2,
++
++	ILA_ATYPE_USE_FORMAT = 32, /* Get type from type field in identifier */
++};
++
++enum {
++	ILA_HOOK_ROUTE_OUTPUT,
++	ILA_HOOK_ROUTE_INPUT,
+ };
+ 
+ #endif /* _LINUX_ILA_H */
+diff --git a/include/uapi/linux/in.h b/include/uapi/linux/in.h
+index 9439efa..a4f143b 100644
+--- a/include/uapi/linux/in.h
++++ b/include/uapi/linux/in.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+ /*
+  * INET		An implementation of the TCP/IP protocol suite for the LINUX
+  *		operating system.  INET is implemented using the  BSD Socket
+diff --git a/include/uapi/linux/in6.h b/include/uapi/linux/in6.h
+index 6f3bdee..409bb3f 100644
+--- a/include/uapi/linux/in6.h
++++ b/include/uapi/linux/in6.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+ /*
+  *	Types and definitions for AF_INET6 
+  *	Linux INET6 implementation 
+@@ -284,6 +285,7 @@ struct in6_flowlabel_req {
+ #define IPV6_TRANSPARENT        75
+ #define IPV6_UNICAST_IF         76
+ #define IPV6_RECVFRAGSIZE	77
++#define IPV6_FREEBIND		78
+ 
+ /*
+  * Multicast Routing:
+diff --git a/include/uapi/linux/in_route.h b/include/uapi/linux/in_route.h
+index b261b8c..0cc2c23 100644
+--- a/include/uapi/linux/in_route.h
++++ b/include/uapi/linux/in_route.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _LINUX_IN_ROUTE_H
+ #define _LINUX_IN_ROUTE_H
+ 
+diff --git a/include/uapi/linux/inet_diag.h b/include/uapi/linux/inet_diag.h
+index bada4d7..f98d82d 100644
+--- a/include/uapi/linux/inet_diag.h
++++ b/include/uapi/linux/inet_diag.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _INET_DIAG_H_
+ #define _INET_DIAG_H_
+ 
+@@ -91,6 +92,8 @@ enum {
+ 	INET_DIAG_BC_D_COND,
+ 	INET_DIAG_BC_DEV_COND,   /* u32 ifindex */
+ 	INET_DIAG_BC_MARK_COND,
++	INET_DIAG_BC_S_EQ,
++	INET_DIAG_BC_D_EQ,
+ };
+ 
+ struct inet_diag_hostcond {
+diff --git a/include/uapi/linux/ip.h b/include/uapi/linux/ip.h
+index 1907284..883fd33 100644
+--- a/include/uapi/linux/ip.h
++++ b/include/uapi/linux/ip.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+ /*
+  * INET		An implementation of the TCP/IP protocol suite for the LINUX
+  *		operating system.  INET is implemented using the  BSD Socket
+diff --git a/include/uapi/linux/ip6_tunnel.h b/include/uapi/linux/ip6_tunnel.h
+index 425926c..0245269 100644
+--- a/include/uapi/linux/ip6_tunnel.h
++++ b/include/uapi/linux/ip6_tunnel.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _IP6_TUNNEL_H
+ #define _IP6_TUNNEL_H
+ 
+@@ -20,6 +21,8 @@
+ #define IP6_TNL_F_RCV_DSCP_COPY 0x10
+ /* copy fwmark from inner packet */
+ #define IP6_TNL_F_USE_ORIG_FWMARK 0x20
++/* allow remote endpoint on the local node */
++#define IP6_TNL_F_ALLOW_LOCAL_REMOTE 0x40
+ 
+ struct ip6_tnl_parm {
+ 	char name[IFNAMSIZ];	/* name of tunnel device */
+diff --git a/include/uapi/linux/ipsec.h b/include/uapi/linux/ipsec.h
+index d17a630..50d8ee1 100644
+--- a/include/uapi/linux/ipsec.h
++++ b/include/uapi/linux/ipsec.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _LINUX_IPSEC_H
+ #define _LINUX_IPSEC_H
+ 
+diff --git a/include/uapi/linux/kernel.h b/include/uapi/linux/kernel.h
+index 527549f..d99ffa1 100644
+--- a/include/uapi/linux/kernel.h
++++ b/include/uapi/linux/kernel.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _LINUX_KERNEL_H
+ #define _LINUX_KERNEL_H
+ 
+diff --git a/include/uapi/linux/l2tp.h b/include/uapi/linux/l2tp.h
+index 8a80007..1fe52a7 100644
+--- a/include/uapi/linux/l2tp.h
++++ b/include/uapi/linux/l2tp.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /*
+  * L2TP-over-IP socket for L2TPv3.
+  *
+@@ -64,7 +65,7 @@ struct sockaddr_l2tpip6 {
+  * TUNNEL_MODIFY	- CONN_ID, udpcsum
+  * TUNNEL_GETSTATS	- CONN_ID, (stats)
+  * TUNNEL_GET		- CONN_ID, (...)
+- * SESSION_CREATE	- SESSION_ID, PW_TYPE, offset, data_seq, cookie, peer_cookie, offset, l2spec
++ * SESSION_CREATE	- SESSION_ID, PW_TYPE, data_seq, cookie, peer_cookie, l2spec
+  * SESSION_DELETE	- SESSION_ID
+  * SESSION_MODIFY	- SESSION_ID, data_seq
+  * SESSION_GET		- SESSION_ID, (...)
+@@ -93,10 +94,10 @@ enum {
+ 	L2TP_ATTR_NONE,			/* no data */
+ 	L2TP_ATTR_PW_TYPE,		/* u16, enum l2tp_pwtype */
+ 	L2TP_ATTR_ENCAP_TYPE,		/* u16, enum l2tp_encap_type */
+-	L2TP_ATTR_OFFSET,		/* u16 */
++	L2TP_ATTR_OFFSET,		/* u16 (not used) */
+ 	L2TP_ATTR_DATA_SEQ,		/* u16 */
+ 	L2TP_ATTR_L2SPEC_TYPE,		/* u8, enum l2tp_l2spec_type */
+-	L2TP_ATTR_L2SPEC_LEN,		/* u8, enum l2tp_l2spec_type */
++	L2TP_ATTR_L2SPEC_LEN,		/* u8 (not used) */
+ 	L2TP_ATTR_PROTO_VERSION,	/* u8 */
+ 	L2TP_ATTR_IFNAME,		/* string */
+ 	L2TP_ATTR_CONN_ID,		/* u32 */
+diff --git a/include/uapi/linux/libc-compat.h b/include/uapi/linux/libc-compat.h
+index f38571d..a159991 100644
+--- a/include/uapi/linux/libc-compat.h
++++ b/include/uapi/linux/libc-compat.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /*
+  * Compatibility interface for userspace libc header coordination:
+  *
+@@ -167,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/include/uapi/linux/limits.h b/include/uapi/linux/limits.h
+index 2d0f941..c3547f0 100644
+--- a/include/uapi/linux/limits.h
++++ b/include/uapi/linux/limits.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _LINUX_LIMITS_H
+ #define _LINUX_LIMITS_H
+ 
+diff --git a/include/uapi/linux/lwtunnel.h b/include/uapi/linux/lwtunnel.h
+index 3298426..3f3fe6f 100644
+--- a/include/uapi/linux/lwtunnel.h
++++ b/include/uapi/linux/lwtunnel.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _LWTUNNEL_H_
+ #define _LWTUNNEL_H_
+ 
+diff --git a/include/uapi/linux/magic.h b/include/uapi/linux/magic.h
+index e439565..1a6fee9 100644
+--- a/include/uapi/linux/magic.h
++++ b/include/uapi/linux/magic.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_MAGIC_H__
+ #define __LINUX_MAGIC_H__
+ 
+@@ -46,6 +47,7 @@
+ #define OPENPROM_SUPER_MAGIC	0x9fa1
+ #define QNX4_SUPER_MAGIC	0x002f		/* qnx4 fs detection */
+ #define QNX6_SUPER_MAGIC	0x68191122	/* qnx6 fs detection */
++#define AFS_FS_MAGIC		0x6B414653
+ 
+ #define REISERFS_SUPER_MAGIC	0x52654973	/* used by gcc */
+ 					/* used by file system utilities that
+diff --git a/include/uapi/linux/mpls.h b/include/uapi/linux/mpls.h
+index bf5b625..9effbf9 100644
+--- a/include/uapi/linux/mpls.h
++++ b/include/uapi/linux/mpls.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _MPLS_H
+ #define _MPLS_H
+ 
+diff --git a/include/uapi/linux/mpls_iptunnel.h b/include/uapi/linux/mpls_iptunnel.h
+index 1a0e57b..2c69b7d 100644
+--- a/include/uapi/linux/mpls_iptunnel.h
++++ b/include/uapi/linux/mpls_iptunnel.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+ /*
+  *	mpls tunnel api
+  *
+diff --git a/include/uapi/linux/neighbour.h b/include/uapi/linux/neighbour.h
+index 3199d28..904db61 100644
+--- a/include/uapi/linux/neighbour.h
++++ b/include/uapi/linux/neighbour.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_NEIGHBOUR_H
+ #define __LINUX_NEIGHBOUR_H
+ 
+diff --git a/include/uapi/linux/net_namespace.h b/include/uapi/linux/net_namespace.h
+index 9a92b7e..6d64d07 100644
+--- a/include/uapi/linux/net_namespace.h
++++ b/include/uapi/linux/net_namespace.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /* Copyright (c) 2015 6WIND S.A.
+  * Author: Nicolas Dichtel <nicolas.dichtel@6wind.com>
+  *
+diff --git a/include/uapi/linux/netconf.h b/include/uapi/linux/netconf.h
+index 4afbd7d..86ac1eb 100644
+--- a/include/uapi/linux/netconf.h
++++ b/include/uapi/linux/netconf.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _LINUX_NETCONF_H_
+ #define _LINUX_NETCONF_H_
+ 
+diff --git a/include/uapi/linux/netdevice.h b/include/uapi/linux/netdevice.h
+index 66fceb4..86d961c 100644
+--- a/include/uapi/linux/netdevice.h
++++ b/include/uapi/linux/netdevice.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+ /*
+  * INET		An implementation of the TCP/IP protocol suite for the LINUX
+  *		operating system.  INET is implemented using the  BSD Socket
+diff --git a/include/uapi/linux/netfilter.h b/include/uapi/linux/netfilter.h
+index ff4a4a5..36378a0 100644
+--- a/include/uapi/linux/netfilter.h
++++ b/include/uapi/linux/netfilter.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_NETFILTER_H
+ #define __LINUX_NETFILTER_H
+ 
+diff --git a/include/uapi/linux/netfilter/ipset/ip_set.h b/include/uapi/linux/netfilter/ipset/ip_set.h
+index a6c96b0..13eeada 100644
+--- a/include/uapi/linux/netfilter/ipset/ip_set.h
++++ b/include/uapi/linux/netfilter/ipset/ip_set.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu>
+  *                         Patrick Schaaf <bof@bof.de>
+  *                         Martin Josefsson <gandalf@wlug.westbo.se>
+diff --git a/include/uapi/linux/netfilter/x_tables.h b/include/uapi/linux/netfilter/x_tables.h
+index 4120970..ae2fd12 100644
+--- a/include/uapi/linux/netfilter/x_tables.h
++++ b/include/uapi/linux/netfilter/x_tables.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _X_TABLES_H
+ #define _X_TABLES_H
+ #include <linux/kernel.h>
+diff --git a/include/uapi/linux/netfilter/xt_set.h b/include/uapi/linux/netfilter/xt_set.h
+index d4e0234..8c1ca66 100644
+--- a/include/uapi/linux/netfilter/xt_set.h
++++ b/include/uapi/linux/netfilter/xt_set.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _XT_SET_H
+ #define _XT_SET_H
+ 
+diff --git a/include/uapi/linux/netfilter/xt_tcpudp.h b/include/uapi/linux/netfilter/xt_tcpudp.h
+index 38aa7b3..658c169 100644
+--- a/include/uapi/linux/netfilter/xt_tcpudp.h
++++ b/include/uapi/linux/netfilter/xt_tcpudp.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _XT_TCPUDP_H
+ #define _XT_TCPUDP_H
+ 
+diff --git a/include/uapi/linux/netfilter_ipv4.h b/include/uapi/linux/netfilter_ipv4.h
+index a5f4dc7..074e2c8 100644
+--- a/include/uapi/linux/netfilter_ipv4.h
++++ b/include/uapi/linux/netfilter_ipv4.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /* IPv4-specific defines for netfilter. 
+  * (C)1998 Rusty Russell -- This code is GPL.
+  */
+@@ -54,6 +55,7 @@
+ 
+ enum nf_ip_hook_priorities {
+ 	NF_IP_PRI_FIRST = INT_MIN,
++	NF_IP_PRI_RAW_BEFORE_DEFRAG = -450,
+ 	NF_IP_PRI_CONNTRACK_DEFRAG = -400,
+ 	NF_IP_PRI_RAW = -300,
+ 	NF_IP_PRI_SELINUX_FIRST = -225,
+diff --git a/include/uapi/linux/netfilter_ipv4/ip_tables.h b/include/uapi/linux/netfilter_ipv4/ip_tables.h
+index 456fb86..409cff7 100644
+--- a/include/uapi/linux/netfilter_ipv4/ip_tables.h
++++ b/include/uapi/linux/netfilter_ipv4/ip_tables.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /*
+  * 25-Jul-1998 Major changes to allow for ip chain table
+  *
+diff --git a/include/uapi/linux/netfilter_ipv6.h b/include/uapi/linux/netfilter_ipv6.h
+index 8483d1d..92701fe 100644
+--- a/include/uapi/linux/netfilter_ipv6.h
++++ b/include/uapi/linux/netfilter_ipv6.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /* IPv6-specific defines for netfilter. 
+  * (C)1998 Rusty Russell -- This code is GPL.
+  * (C)1999 David Jeffery
+@@ -59,6 +60,7 @@
+ 
+ enum nf_ip6_hook_priorities {
+ 	NF_IP6_PRI_FIRST = INT_MIN,
++	NF_IP6_PRI_RAW_BEFORE_DEFRAG = -450,
+ 	NF_IP6_PRI_CONNTRACK_DEFRAG = -400,
+ 	NF_IP6_PRI_RAW = -300,
+ 	NF_IP6_PRI_SELINUX_FIRST = -225,
+diff --git a/include/uapi/linux/netfilter_ipv6/ip6_tables.h b/include/uapi/linux/netfilter_ipv6/ip6_tables.h
+index fcc8cca..7ae314b 100644
+--- a/include/uapi/linux/netfilter_ipv6/ip6_tables.h
++++ b/include/uapi/linux/netfilter_ipv6/ip6_tables.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /*
+  * 25-Jul-1998 Major changes to allow for ip chain table
+  *
+diff --git a/include/uapi/linux/netlink.h b/include/uapi/linux/netlink.h
+index ec0690b..0b2c29b 100644
+--- a/include/uapi/linux/netlink.h
++++ b/include/uapi/linux/netlink.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_NETLINK_H
+ #define __LINUX_NETLINK_H
+ 
+diff --git a/include/uapi/linux/netlink_diag.h b/include/uapi/linux/netlink_diag.h
+index c8c8c7d..4cd0657 100644
+--- a/include/uapi/linux/netlink_diag.h
++++ b/include/uapi/linux/netlink_diag.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __NETLINK_DIAG_H__
+ #define __NETLINK_DIAG_H__
+ 
+diff --git a/include/uapi/linux/packet_diag.h b/include/uapi/linux/packet_diag.h
+index 0c5d5dd..349ddf0 100644
+--- a/include/uapi/linux/packet_diag.h
++++ b/include/uapi/linux/packet_diag.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __PACKET_DIAG_H__
+ #define __PACKET_DIAG_H__
+ 
+diff --git a/include/uapi/linux/param.h b/include/uapi/linux/param.h
+index 092e92f..94e0c57 100644
+--- a/include/uapi/linux/param.h
++++ b/include/uapi/linux/param.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _LINUX_PARAM_H
+ #define _LINUX_PARAM_H
+ 
+diff --git a/include/uapi/linux/pfkeyv2.h b/include/uapi/linux/pfkeyv2.h
+index ada7f01..d65b117 100644
+--- a/include/uapi/linux/pfkeyv2.h
++++ b/include/uapi/linux/pfkeyv2.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /* PF_KEY user interface, this is defined by rfc2367 so
+  * do not make arbitrary modifications or else this header
+  * file will not be compliant.
+diff --git a/include/uapi/linux/pkt_cls.h b/include/uapi/linux/pkt_cls.h
+index d5e2bf6..b451225 100644
+--- a/include/uapi/linux/pkt_cls.h
++++ b/include/uapi/linux/pkt_cls.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_PKT_CLS_H
+ #define __LINUX_PKT_CLS_H
+ 
+@@ -128,6 +129,7 @@ enum {
+ #define TCA_CLS_FLAGS_SKIP_SW	(1 << 1) /* don't use filter in SW */
+ #define TCA_CLS_FLAGS_IN_HW	(1 << 2) /* filter is offloaded to HW */
+ #define TCA_CLS_FLAGS_NOT_IN_HW (1 << 3) /* filter isn't offloaded to HW */
++#define TCA_CLS_FLAGS_VERBOSE	(1 << 4) /* verbose logging */
+ 
+ /* U32 filters */
+ 
+@@ -467,6 +469,15 @@ enum {
+ 	TCA_FLOWER_KEY_IP_TTL,		/* u8 */
+ 	TCA_FLOWER_KEY_IP_TTL_MASK,	/* u8 */
+ 
++	TCA_FLOWER_KEY_CVLAN_ID,	/* be16 */
++	TCA_FLOWER_KEY_CVLAN_PRIO,	/* u8   */
++	TCA_FLOWER_KEY_CVLAN_ETH_TYPE,	/* be16 */
++
++	TCA_FLOWER_KEY_ENC_IP_TOS,	/* u8 */
++	TCA_FLOWER_KEY_ENC_IP_TOS_MASK,	/* u8 */
++	TCA_FLOWER_KEY_ENC_IP_TTL,	/* u8 */
++	TCA_FLOWER_KEY_ENC_IP_TTL_MASK,	/* u8 */
++
+ 	__TCA_FLOWER_MAX,
+ };
+ 
+@@ -474,6 +485,7 @@ enum {
+ 
+ enum {
+ 	TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT = (1 << 0),
++	TCA_FLOWER_KEY_FLAGS_FRAG_IS_FIRST = (1 << 1),
+ };
+ 
+ /* Match-all classifier */
+@@ -554,7 +566,8 @@ enum {
+ #define	TCF_EM_VLAN		6
+ #define	TCF_EM_CANID		7
+ #define	TCF_EM_IPSET		8
+-#define	TCF_EM_MAX		8
++#define	TCF_EM_IPT		9
++#define	TCF_EM_MAX		9
+ 
+ enum {
+ 	TCF_EM_PROG_TC
+diff --git a/include/uapi/linux/pkt_sched.h b/include/uapi/linux/pkt_sched.h
+index 099bf55..d9cc9dc 100644
+--- a/include/uapi/linux/pkt_sched.h
++++ b/include/uapi/linux/pkt_sched.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_PKT_SCHED_H
+ #define __LINUX_PKT_SCHED_H
+ 
+@@ -74,6 +75,7 @@ struct tc_estimator {
+ #define TC_H_INGRESS    (0xFFFFFFF1U)
+ #define TC_H_CLSACT	TC_H_INGRESS
+ 
++#define TC_H_MIN_PRIORITY	0xFFE0U
+ #define TC_H_MIN_INGRESS	0xFFF2U
+ #define TC_H_MIN_EGRESS		0xFFF3U
+ 
+@@ -534,6 +536,10 @@ enum {
+ 	TCA_NETEM_ECN,
+ 	TCA_NETEM_RATE64,
+ 	TCA_NETEM_PAD,
++	TCA_NETEM_LATENCY64,
++	TCA_NETEM_JITTER64,
++	TCA_NETEM_SLOT,
++	TCA_NETEM_SLOT_DIST,
+ 	__TCA_NETEM_MAX,
+ };
+ 
+@@ -571,6 +577,15 @@ struct tc_netem_rate {
+ 	__s32	cell_overhead;
+ };
+ 
++struct tc_netem_slot {
++	__s64   min_delay; /* nsec */
++	__s64   max_delay;
++	__s32   max_packets;
++	__s32   max_bytes;
++	__s64	dist_delay; /* nsec */
++	__s64	dist_jitter; /* nsec */
++};
++
+ enum {
+ 	NETEM_LOSS_UNSPEC,
+ 	NETEM_LOSS_GI,		/* General Intuitive - 4 state model */
+@@ -625,6 +640,22 @@ enum {
+ 
+ #define TC_MQPRIO_HW_OFFLOAD_MAX (__TC_MQPRIO_HW_OFFLOAD_MAX - 1)
+ 
++enum {
++	TC_MQPRIO_MODE_DCB,
++	TC_MQPRIO_MODE_CHANNEL,
++	__TC_MQPRIO_MODE_MAX
++};
++
++#define __TC_MQPRIO_MODE_MAX (__TC_MQPRIO_MODE_MAX - 1)
++
++enum {
++	TC_MQPRIO_SHAPER_DCB,
++	TC_MQPRIO_SHAPER_BW_RATE,	/* Add new shapers below */
++	__TC_MQPRIO_SHAPER_MAX
++};
++
++#define __TC_MQPRIO_SHAPER_MAX (__TC_MQPRIO_SHAPER_MAX - 1)
++
+ struct tc_mqprio_qopt {
+ 	__u8	num_tc;
+ 	__u8	prio_tc_map[TC_QOPT_BITMASK + 1];
+@@ -633,6 +664,22 @@ struct tc_mqprio_qopt {
+ 	__u16	offset[TC_QOPT_MAX_QUEUE];
+ };
+ 
++#define TC_MQPRIO_F_MODE		0x1
++#define TC_MQPRIO_F_SHAPER		0x2
++#define TC_MQPRIO_F_MIN_RATE		0x4
++#define TC_MQPRIO_F_MAX_RATE		0x8
++
++enum {
++	TCA_MQPRIO_UNSPEC,
++	TCA_MQPRIO_MODE,
++	TCA_MQPRIO_SHAPER,
++	TCA_MQPRIO_MIN_RATE64,
++	TCA_MQPRIO_MAX_RATE64,
++	__TCA_MQPRIO_MAX,
++};
++
++#define TCA_MQPRIO_MAX (__TCA_MQPRIO_MAX - 1)
++
+ /* SFB */
+ 
+ enum {
+@@ -871,4 +918,155 @@ struct tc_pie_xstats {
+ 	__u32 maxq;             /* maximum queue size */
+ 	__u32 ecn_mark;         /* packets marked with ecn*/
+ };
++
++/* CBS */
++struct tc_cbs_qopt {
++	__u8 offload;
++	__u8 _pad[3];
++	__s32 hicredit;
++	__s32 locredit;
++	__s32 idleslope;
++	__s32 sendslope;
++};
++
++enum {
++	TCA_CBS_UNSPEC,
++	TCA_CBS_PARMS,
++	__TCA_CBS_MAX,
++};
++
++#define TCA_CBS_MAX (__TCA_CBS_MAX - 1)
++
++
++/* ETF */
++struct tc_etf_qopt {
++	__s32 delta;
++	__s32 clockid;
++	__u32 flags;
++#define TC_ETF_DEADLINE_MODE_ON	BIT(0)
++#define TC_ETF_OFFLOAD_ON	BIT(1)
++};
++
++enum {
++	TCA_ETF_UNSPEC,
++	TCA_ETF_PARMS,
++	__TCA_ETF_MAX,
++};
++
++#define TCA_ETF_MAX (__TCA_ETF_MAX - 1)
++
++
++/* CAKE */
++enum {
++	TCA_CAKE_UNSPEC,
++	TCA_CAKE_PAD,
++	TCA_CAKE_BASE_RATE64,
++	TCA_CAKE_DIFFSERV_MODE,
++	TCA_CAKE_ATM,
++	TCA_CAKE_FLOW_MODE,
++	TCA_CAKE_OVERHEAD,
++	TCA_CAKE_RTT,
++	TCA_CAKE_TARGET,
++	TCA_CAKE_AUTORATE,
++	TCA_CAKE_MEMORY,
++	TCA_CAKE_NAT,
++	TCA_CAKE_RAW,
++	TCA_CAKE_WASH,
++	TCA_CAKE_MPU,
++	TCA_CAKE_INGRESS,
++	TCA_CAKE_ACK_FILTER,
++	TCA_CAKE_SPLIT_GSO,
++	__TCA_CAKE_MAX
++};
++#define TCA_CAKE_MAX	(__TCA_CAKE_MAX - 1)
++
++enum {
++	__TCA_CAKE_STATS_INVALID,
++	TCA_CAKE_STATS_PAD,
++	TCA_CAKE_STATS_CAPACITY_ESTIMATE64,
++	TCA_CAKE_STATS_MEMORY_LIMIT,
++	TCA_CAKE_STATS_MEMORY_USED,
++	TCA_CAKE_STATS_AVG_NETOFF,
++	TCA_CAKE_STATS_MIN_NETLEN,
++	TCA_CAKE_STATS_MAX_NETLEN,
++	TCA_CAKE_STATS_MIN_ADJLEN,
++	TCA_CAKE_STATS_MAX_ADJLEN,
++	TCA_CAKE_STATS_TIN_STATS,
++	TCA_CAKE_STATS_DEFICIT,
++	TCA_CAKE_STATS_COBALT_COUNT,
++	TCA_CAKE_STATS_DROPPING,
++	TCA_CAKE_STATS_DROP_NEXT_US,
++	TCA_CAKE_STATS_P_DROP,
++	TCA_CAKE_STATS_BLUE_TIMER_US,
++	__TCA_CAKE_STATS_MAX
++};
++#define TCA_CAKE_STATS_MAX (__TCA_CAKE_STATS_MAX - 1)
++
++enum {
++	__TCA_CAKE_TIN_STATS_INVALID,
++	TCA_CAKE_TIN_STATS_PAD,
++	TCA_CAKE_TIN_STATS_SENT_PACKETS,
++	TCA_CAKE_TIN_STATS_SENT_BYTES64,
++	TCA_CAKE_TIN_STATS_DROPPED_PACKETS,
++	TCA_CAKE_TIN_STATS_DROPPED_BYTES64,
++	TCA_CAKE_TIN_STATS_ACKS_DROPPED_PACKETS,
++	TCA_CAKE_TIN_STATS_ACKS_DROPPED_BYTES64,
++	TCA_CAKE_TIN_STATS_ECN_MARKED_PACKETS,
++	TCA_CAKE_TIN_STATS_ECN_MARKED_BYTES64,
++	TCA_CAKE_TIN_STATS_BACKLOG_PACKETS,
++	TCA_CAKE_TIN_STATS_BACKLOG_BYTES,
++	TCA_CAKE_TIN_STATS_THRESHOLD_RATE64,
++	TCA_CAKE_TIN_STATS_TARGET_US,
++	TCA_CAKE_TIN_STATS_INTERVAL_US,
++	TCA_CAKE_TIN_STATS_WAY_INDIRECT_HITS,
++	TCA_CAKE_TIN_STATS_WAY_MISSES,
++	TCA_CAKE_TIN_STATS_WAY_COLLISIONS,
++	TCA_CAKE_TIN_STATS_PEAK_DELAY_US,
++	TCA_CAKE_TIN_STATS_AVG_DELAY_US,
++	TCA_CAKE_TIN_STATS_BASE_DELAY_US,
++	TCA_CAKE_TIN_STATS_SPARSE_FLOWS,
++	TCA_CAKE_TIN_STATS_BULK_FLOWS,
++	TCA_CAKE_TIN_STATS_UNRESPONSIVE_FLOWS,
++	TCA_CAKE_TIN_STATS_MAX_SKBLEN,
++	TCA_CAKE_TIN_STATS_FLOW_QUANTUM,
++	__TCA_CAKE_TIN_STATS_MAX
++};
++#define TCA_CAKE_TIN_STATS_MAX (__TCA_CAKE_TIN_STATS_MAX - 1)
++#define TC_CAKE_MAX_TINS (8)
++
++enum {
++	CAKE_FLOW_NONE = 0,
++	CAKE_FLOW_SRC_IP,
++	CAKE_FLOW_DST_IP,
++	CAKE_FLOW_HOSTS,    /* = CAKE_FLOW_SRC_IP | CAKE_FLOW_DST_IP */
++	CAKE_FLOW_FLOWS,
++	CAKE_FLOW_DUAL_SRC, /* = CAKE_FLOW_SRC_IP | CAKE_FLOW_FLOWS */
++	CAKE_FLOW_DUAL_DST, /* = CAKE_FLOW_DST_IP | CAKE_FLOW_FLOWS */
++	CAKE_FLOW_TRIPLE,   /* = CAKE_FLOW_HOSTS  | CAKE_FLOW_FLOWS */
++	CAKE_FLOW_MAX,
++};
++
++enum {
++	CAKE_DIFFSERV_DIFFSERV3 = 0,
++	CAKE_DIFFSERV_DIFFSERV4,
++	CAKE_DIFFSERV_DIFFSERV8,
++	CAKE_DIFFSERV_BESTEFFORT,
++	CAKE_DIFFSERV_PRECEDENCE,
++	CAKE_DIFFSERV_MAX
++};
++
++enum {
++	CAKE_ACK_NONE = 0,
++	CAKE_ACK_FILTER,
++	CAKE_ACK_AGGRESSIVE,
++	CAKE_ACK_MAX
++};
++
++enum {
++	CAKE_ATM_NONE = 0,
++	CAKE_ATM_ATM,
++	CAKE_ATM_PTM,
++	CAKE_ATM_MAX
++};
++
+ #endif
+diff --git a/include/uapi/linux/posix_types.h b/include/uapi/linux/posix_types.h
+index 988f76e..9a7a740 100644
+--- a/include/uapi/linux/posix_types.h
++++ b/include/uapi/linux/posix_types.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _LINUX_POSIX_TYPES_H
+ #define _LINUX_POSIX_TYPES_H
+ 
+diff --git a/include/uapi/linux/rtnetlink.h b/include/uapi/linux/rtnetlink.h
+index 813e9e0..c3a7d8e 100644
+--- a/include/uapi/linux/rtnetlink.h
++++ b/include/uapi/linux/rtnetlink.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_RTNETLINK_H
+ #define __LINUX_RTNETLINK_H
+ 
+@@ -253,6 +254,11 @@ enum {
+ #define RTPROT_DHCP	16      /* DHCP client */
+ #define RTPROT_MROUTED	17      /* Multicast daemon */
+ #define RTPROT_BABEL	42      /* Babel daemon */
++#define RTPROT_BGP	186     /* BGP Routes */
++#define RTPROT_ISIS	187     /* ISIS Routes */
++#define RTPROT_OSPF	188     /* OSPF Routes */
++#define RTPROT_RIP	189     /* RIP Routes */
++#define RTPROT_EIGRP	192     /* EIGRP Routes */
+ 
+ /* rtm_scope
+ 
+@@ -326,6 +332,9 @@ enum rtattr_type_t {
+ 	RTA_PAD,
+ 	RTA_UID,
+ 	RTA_TTL_PROPAGATE,
++	RTA_IP_PROTO,
++	RTA_SPORT,
++	RTA_DPORT,
+ 	__RTA_MAX
+ };
+ 
+@@ -430,6 +439,8 @@ enum {
+ #define RTAX_QUICKACK RTAX_QUICKACK
+ 	RTAX_CC_ALGO,
+ #define RTAX_CC_ALGO RTAX_CC_ALGO
++	RTAX_FASTOPEN_NO_COOKIE,
++#define RTAX_FASTOPEN_NO_COOKIE RTAX_FASTOPEN_NO_COOKIE
+ 	__RTAX_MAX
+ };
+ 
+@@ -538,9 +549,19 @@ struct tcmsg {
+ 	int		tcm_ifindex;
+ 	__u32		tcm_handle;
+ 	__u32		tcm_parent;
++/* tcm_block_index is used instead of tcm_parent
++ * in case tcm_ifindex == TCM_IFINDEX_MAGIC_BLOCK
++ */
++#define tcm_block_index tcm_parent
+ 	__u32		tcm_info;
+ };
+ 
++/* For manipulation of filters in shared block, tcm_ifindex is set to
++ * TCM_IFINDEX_MAGIC_BLOCK, and tcm_parent is aliased to tcm_block_index
++ * which is the block index.
++ */
++#define TCM_IFINDEX_MAGIC_BLOCK (0xFFFFFFFFU)
++
+ enum {
+ 	TCA_UNSPEC,
+ 	TCA_KIND,
+@@ -554,6 +575,9 @@ enum {
+ 	TCA_PAD,
+ 	TCA_DUMP_INVISIBLE,
+ 	TCA_CHAIN,
++	TCA_HW_OFFLOAD,
++	TCA_INGRESS_BLOCK,
++	TCA_EGRESS_BLOCK,
+ 	__TCA_MAX
+ };
+ 
+diff --git a/include/uapi/linux/sctp.h b/include/uapi/linux/sctp.h
+index fec24c4..dd164d7 100644
+--- a/include/uapi/linux/sctp.h
++++ b/include/uapi/linux/sctp.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+ /* SCTP kernel implementation
+  * (C) Copyright IBM Corp. 2001, 2004
+  * Copyright (c) 1999-2000 Cisco, Inc.
+@@ -98,6 +99,8 @@ typedef __s32 sctp_assoc_t;
+ #define SCTP_RECVRCVINFO	32
+ #define SCTP_RECVNXTINFO	33
+ #define SCTP_DEFAULT_SNDINFO	34
++#define SCTP_AUTH_DEACTIVATE_KEY	35
++#define SCTP_REUSE_PORT		36
+ 
+ /* Internal Socket Options. Some of the sctp library functions are
+  * implemented using these socket options.
+@@ -122,6 +125,10 @@ typedef __s32 sctp_assoc_t;
+ #define SCTP_RESET_ASSOC	120
+ #define SCTP_ADD_STREAMS	121
+ #define SCTP_SOCKOPT_PEELOFF_FLAGS 122
++#define SCTP_STREAM_SCHEDULER	123
++#define SCTP_STREAM_SCHEDULER_VALUE	124
++#define SCTP_INTERLEAVING_SUPPORTED	125
++#define SCTP_SENDMSG_CONNECT	126
+ 
+ /* PR-SCTP policies */
+ #define SCTP_PR_SCTP_NONE	0x0000
+@@ -256,6 +263,31 @@ struct sctp_nxtinfo {
+ 	sctp_assoc_t nxt_assoc_id;
+ };
+ 
++/* 5.3.7 SCTP PR-SCTP Information Structure (SCTP_PRINFO)
++ *
++ *   This cmsghdr structure specifies SCTP options for sendmsg().
++ *
++ *   cmsg_level    cmsg_type      cmsg_data[]
++ *   ------------  ------------   -------------------
++ *   IPPROTO_SCTP  SCTP_PRINFO    struct sctp_prinfo
++ */
++struct sctp_prinfo {
++	__u16 pr_policy;
++	__u32 pr_value;
++};
++
++/* 5.3.8 SCTP AUTH Information Structure (SCTP_AUTHINFO)
++ *
++ *   This cmsghdr structure specifies SCTP options for sendmsg().
++ *
++ *   cmsg_level    cmsg_type      cmsg_data[]
++ *   ------------  ------------   -------------------
++ *   IPPROTO_SCTP  SCTP_AUTHINFO  struct sctp_authinfo
++ */
++struct sctp_authinfo {
++	__u16 auth_keynumber;
++};
++
+ /*
+  *  sinfo_flags: 16 bits (unsigned integer)
+  *
+@@ -267,6 +299,8 @@ enum sctp_sinfo_flags {
+ 	SCTP_ADDR_OVER		= (1 << 1), /* Override the primary destination. */
+ 	SCTP_ABORT		= (1 << 2), /* Send an ABORT message to the peer. */
+ 	SCTP_SACK_IMMEDIATELY	= (1 << 3), /* SACK should be sent without delay. */
++	/* 2 bits here have been used by SCTP_PR_SCTP_MASK */
++	SCTP_SENDALL		= (1 << 6),
+ 	SCTP_NOTIFICATION	= MSG_NOTIFICATION, /* Next message is not user msg but notification. */
+ 	SCTP_EOF		= MSG_FIN,  /* Initiate graceful shutdown process. */
+ };
+@@ -289,6 +323,14 @@ typedef enum sctp_cmsg_type {
+ #define SCTP_RCVINFO	SCTP_RCVINFO
+ 	SCTP_NXTINFO,		/* 5.3.6 SCTP Next Receive Information Structure */
+ #define SCTP_NXTINFO	SCTP_NXTINFO
++	SCTP_PRINFO,		/* 5.3.7 SCTP PR-SCTP Information Structure */
++#define SCTP_PRINFO	SCTP_PRINFO
++	SCTP_AUTHINFO,		/* 5.3.8 SCTP AUTH Information Structure */
++#define SCTP_AUTHINFO	SCTP_AUTHINFO
++	SCTP_DSTADDRV4,		/* 5.3.9 SCTP Destination IPv4 Address Structure */
++#define SCTP_DSTADDRV4	SCTP_DSTADDRV4
++	SCTP_DSTADDRV6,		/* 5.3.10 SCTP Destination IPv6 Address Structure */
++#define SCTP_DSTADDRV6	SCTP_DSTADDRV6
+ } sctp_cmsg_t;
+ 
+ /*
+@@ -376,7 +418,7 @@ struct sctp_remote_error {
+ 	__u16 sre_type;
+ 	__u16 sre_flags;
+ 	__u32 sre_length;
+-	__u16 sre_error;
++	__be16 sre_error;
+ 	sctp_assoc_t sre_assoc_id;
+ 	__u8 sre_data[0];
+ };
+@@ -456,6 +498,8 @@ struct sctp_pdapi_event {
+ 	__u32 pdapi_length;
+ 	__u32 pdapi_indication;
+ 	sctp_assoc_t pdapi_assoc_id;
++	__u32 pdapi_stream;
++	__u32 pdapi_seq;
+ };
+ 
+ enum { SCTP_PARTIAL_DELIVERY_ABORTED=0, };
+@@ -476,7 +520,12 @@ struct sctp_authkey_event {
+ 	sctp_assoc_t auth_assoc_id;
+ };
+ 
+-enum { SCTP_AUTH_NEWKEY = 0, };
++enum {
++	SCTP_AUTH_NEW_KEY,
++#define	SCTP_AUTH_NEWKEY	SCTP_AUTH_NEW_KEY /* compatible with before */
++	SCTP_AUTH_FREE_KEY,
++	SCTP_AUTH_NO_AUTH,
++};
+ 
+ /*
+  * 6.1.9. SCTP_SENDER_DRY_EVENT
+@@ -714,6 +763,8 @@ enum  sctp_spp_flags {
+ 	SPP_SACKDELAY_DISABLE = 1<<6,	/*Disable SACK*/
+ 	SPP_SACKDELAY = SPP_SACKDELAY_ENABLE | SPP_SACKDELAY_DISABLE,
+ 	SPP_HB_TIME_IS_ZERO = 1<<7,	/* Set HB delay to 0 */
++	SPP_IPV6_FLOWLABEL = 1<<8,
++	SPP_DSCP = 1<<9,
+ };
+ 
+ struct sctp_paddrparams {
+@@ -724,6 +775,8 @@ struct sctp_paddrparams {
+ 	__u32			spp_pathmtu;
+ 	__u32			spp_sackdelay;
+ 	__u32			spp_flags;
++	__u32			spp_ipv6_flowlabel;
++	__u8			spp_dscp;
+ } __attribute__((packed, aligned(4)));
+ 
+ /*
+@@ -812,6 +865,12 @@ struct sctp_assoc_value {
+     uint32_t                assoc_value;
+ };
+ 
++struct sctp_stream_value {
++	sctp_assoc_t assoc_id;
++	uint16_t stream_id;
++	uint16_t stream_value;
++};
++
+ /*
+  * 7.2.2 Peer Address Information
+  *
+@@ -1082,4 +1141,12 @@ struct sctp_add_streams {
+ 	uint16_t sas_outstrms;
+ };
+ 
++/* SCTP Stream schedulers */
++enum sctp_sched_type {
++	SCTP_SS_FCFS,
++	SCTP_SS_PRIO,
++	SCTP_SS_RR,
++	SCTP_SS_MAX = SCTP_SS_RR
++};
++
+ #endif /* _SCTP_H */
+diff --git a/include/uapi/linux/seg6.h b/include/uapi/linux/seg6.h
+index 0715279..329163e 100644
+--- a/include/uapi/linux/seg6.h
++++ b/include/uapi/linux/seg6.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+ /*
+  *  SR-IPv6 implementation
+  *
+@@ -25,9 +26,9 @@ struct ipv6_sr_hdr {
+ 	__u8	hdrlen;
+ 	__u8	type;
+ 	__u8	segments_left;
+-	__u8	first_segment;
++	__u8	first_segment; /* Represents the last_entry field of SRH */
+ 	__u8	flags;
+-	__u16	reserved;
++	__u16	tag;
+ 
+ 	struct in6_addr segments[0];
+ };
+diff --git a/include/uapi/linux/seg6_genl.h b/include/uapi/linux/seg6_genl.h
+index 99382f9..0c23052 100644
+--- a/include/uapi/linux/seg6_genl.h
++++ b/include/uapi/linux/seg6_genl.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _LINUX_SEG6_GENL_H
+ #define _LINUX_SEG6_GENL_H
+ 
+diff --git a/include/uapi/linux/seg6_hmac.h b/include/uapi/linux/seg6_hmac.h
+index 704f93e..3fb3412 100644
+--- a/include/uapi/linux/seg6_hmac.h
++++ b/include/uapi/linux/seg6_hmac.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _LINUX_SEG6_HMAC_H
+ #define _LINUX_SEG6_HMAC_H
+ 
+diff --git a/include/uapi/linux/seg6_iptunnel.h b/include/uapi/linux/seg6_iptunnel.h
+index a5dc05a..3004e98 100644
+--- a/include/uapi/linux/seg6_iptunnel.h
++++ b/include/uapi/linux/seg6_iptunnel.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+ /*
+  *  SR-IPv6 implementation
+  *
+diff --git a/include/uapi/linux/seg6_local.h b/include/uapi/linux/seg6_local.h
+index 76b90d6..5312de8 100644
+--- a/include/uapi/linux/seg6_local.h
++++ b/include/uapi/linux/seg6_local.h
+@@ -25,6 +25,7 @@ enum {
+ 	SEG6_LOCAL_NH6,
+ 	SEG6_LOCAL_IIF,
+ 	SEG6_LOCAL_OIF,
++	SEG6_LOCAL_BPF,
+ 	__SEG6_LOCAL_MAX,
+ };
+ #define SEG6_LOCAL_MAX (__SEG6_LOCAL_MAX - 1)
+@@ -59,10 +60,21 @@ enum {
+ 	SEG6_LOCAL_ACTION_END_AS	= 13,
+ 	/* forward to SR-unaware VNF with masquerading */
+ 	SEG6_LOCAL_ACTION_END_AM	= 14,
++	/* custom BPF action */
++	SEG6_LOCAL_ACTION_END_BPF	= 15,
+ 
+ 	__SEG6_LOCAL_ACTION_MAX,
+ };
+ 
+ #define SEG6_LOCAL_ACTION_MAX (__SEG6_LOCAL_ACTION_MAX - 1)
+ 
++enum {
++	SEG6_LOCAL_BPF_PROG_UNSPEC,
++	SEG6_LOCAL_BPF_PROG,
++	SEG6_LOCAL_BPF_PROG_NAME,
++	__SEG6_LOCAL_BPF_PROG_MAX,
++};
++
++#define SEG6_LOCAL_BPF_PROG_MAX (__SEG6_LOCAL_BPF_PROG_MAX - 1)
++
+ #endif
+diff --git a/include/uapi/linux/sock_diag.h b/include/uapi/linux/sock_diag.h
+index 901231e..a69cf20 100644
+--- a/include/uapi/linux/sock_diag.h
++++ b/include/uapi/linux/sock_diag.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __SOCK_DIAG_H__
+ #define __SOCK_DIAG_H__
+ 
+diff --git a/include/uapi/linux/socket.h b/include/uapi/linux/socket.h
+index 8c1e501..268b948 100644
+--- a/include/uapi/linux/socket.h
++++ b/include/uapi/linux/socket.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _LINUX_SOCKET_H
+ #define _LINUX_SOCKET_H
+ 
+diff --git a/include/uapi/linux/sockios.h b/include/uapi/linux/sockios.h
+index 79d029d..d393e9e 100644
+--- a/include/uapi/linux/sockios.h
++++ b/include/uapi/linux/sockios.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+ /*
+  * INET		An implementation of the TCP/IP protocol suite for the LINUX
+  *		operating system.  INET is implemented using the  BSD Socket
+diff --git a/include/uapi/linux/stddef.h b/include/uapi/linux/stddef.h
+index 4bb69de..23e025f 100644
+--- a/include/uapi/linux/stddef.h
++++ b/include/uapi/linux/stddef.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ 
+ 
+ #ifndef __always_inline
+diff --git a/include/uapi/linux/sysinfo.h b/include/uapi/linux/sysinfo.h
+index 934335a..435d5c2 100644
+--- a/include/uapi/linux/sysinfo.h
++++ b/include/uapi/linux/sysinfo.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _LINUX_SYSINFO_H
+ #define _LINUX_SYSINFO_H
+ 
+diff --git a/include/uapi/linux/tc_act/tc_bpf.h b/include/uapi/linux/tc_act/tc_bpf.h
+index 8dc2ac0..6e89a5d 100644
+--- a/include/uapi/linux/tc_act/tc_bpf.h
++++ b/include/uapi/linux/tc_act/tc_bpf.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+ /*
+  * Copyright (c) 2015 Jiri Pirko <jiri@resnulli.us>
+  *
+diff --git a/include/uapi/linux/tc_act/tc_connmark.h b/include/uapi/linux/tc_act/tc_connmark.h
+index 62a5e94..80caa47 100644
+--- a/include/uapi/linux/tc_act/tc_connmark.h
++++ b/include/uapi/linux/tc_act/tc_connmark.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __UAPI_TC_CONNMARK_H
+ #define __UAPI_TC_CONNMARK_H
+ 
+diff --git a/include/uapi/linux/tc_act/tc_csum.h b/include/uapi/linux/tc_act/tc_csum.h
+index a11bb35..0ecf4d2 100644
+--- a/include/uapi/linux/tc_act/tc_csum.h
++++ b/include/uapi/linux/tc_act/tc_csum.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_TC_CSUM_H
+ #define __LINUX_TC_CSUM_H
+ 
+diff --git a/include/uapi/linux/tc_act/tc_defact.h b/include/uapi/linux/tc_act/tc_defact.h
+index d2a3abb..e3ecd8b 100644
+--- a/include/uapi/linux/tc_act/tc_defact.h
++++ b/include/uapi/linux/tc_act/tc_defact.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_TC_DEF_H
+ #define __LINUX_TC_DEF_H
+ 
+diff --git a/include/uapi/linux/tc_act/tc_gact.h b/include/uapi/linux/tc_act/tc_gact.h
+index 70b536a..94273c3 100644
+--- a/include/uapi/linux/tc_act/tc_gact.h
++++ b/include/uapi/linux/tc_act/tc_gact.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_TC_GACT_H
+ #define __LINUX_TC_GACT_H
+ 
+diff --git a/include/uapi/linux/tc_act/tc_ife.h b/include/uapi/linux/tc_act/tc_ife.h
+index 7c28178..2f48490 100644
+--- a/include/uapi/linux/tc_act/tc_ife.h
++++ b/include/uapi/linux/tc_act/tc_ife.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __UAPI_TC_IFE_H
+ #define __UAPI_TC_IFE_H
+ 
+diff --git a/include/uapi/linux/tc_act/tc_ipt.h b/include/uapi/linux/tc_act/tc_ipt.h
+index 7c6e155..b743c8b 100644
+--- a/include/uapi/linux/tc_act/tc_ipt.h
++++ b/include/uapi/linux/tc_act/tc_ipt.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_TC_IPT_H
+ #define __LINUX_TC_IPT_H
+ 
+diff --git a/include/uapi/linux/tc_act/tc_mirred.h b/include/uapi/linux/tc_act/tc_mirred.h
+index 3d7a2b3..5dd671c 100644
+--- a/include/uapi/linux/tc_act/tc_mirred.h
++++ b/include/uapi/linux/tc_act/tc_mirred.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_TC_MIR_H
+ #define __LINUX_TC_MIR_H
+ 
+@@ -9,13 +10,13 @@
+ #define TCA_EGRESS_MIRROR 2 /* mirror packet to EGRESS */
+ #define TCA_INGRESS_REDIR 3  /* packet redirect to INGRESS*/
+ #define TCA_INGRESS_MIRROR 4 /* mirror packet to INGRESS */
+-                                                                                
++
+ struct tc_mirred {
+ 	tc_gen;
+ 	int                     eaction;   /* one of IN/EGRESS_MIRROR/REDIR */
+ 	__u32                   ifindex;  /* ifindex of egress port */
+ };
+-                                                                                
++
+ enum {
+ 	TCA_MIRRED_UNSPEC,
+ 	TCA_MIRRED_TM,
+@@ -24,5 +25,5 @@ enum {
+ 	__TCA_MIRRED_MAX
+ };
+ #define TCA_MIRRED_MAX (__TCA_MIRRED_MAX - 1)
+-                                                                                
++
+ #endif
+diff --git a/include/uapi/linux/tc_act/tc_nat.h b/include/uapi/linux/tc_act/tc_nat.h
+index 923457c..086be84 100644
+--- a/include/uapi/linux/tc_act/tc_nat.h
++++ b/include/uapi/linux/tc_act/tc_nat.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_TC_NAT_H
+ #define __LINUX_TC_NAT_H
+ 
+diff --git a/include/uapi/linux/tc_act/tc_pedit.h b/include/uapi/linux/tc_act/tc_pedit.h
+index 143d2b3..24ec792 100644
+--- a/include/uapi/linux/tc_act/tc_pedit.h
++++ b/include/uapi/linux/tc_act/tc_pedit.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_TC_PED_H
+ #define __LINUX_TC_PED_H
+ 
+@@ -16,13 +17,15 @@ enum {
+ 	TCA_PEDIT_KEY_EX,
+ 	__TCA_PEDIT_MAX
+ };
++
+ #define TCA_PEDIT_MAX (__TCA_PEDIT_MAX - 1)
+-                                                                                
++
+ enum {
+ 	TCA_PEDIT_KEY_EX_HTYPE = 1,
+ 	TCA_PEDIT_KEY_EX_CMD = 2,
+ 	__TCA_PEDIT_KEY_EX_MAX
+ };
++
+ #define TCA_PEDIT_KEY_EX_MAX (__TCA_PEDIT_KEY_EX_MAX - 1)
+ 
+  /* TCA_PEDIT_KEY_EX_HDR_TYPE_NETWROK is a special case for legacy users. It
+@@ -37,6 +40,7 @@ enum pedit_header_type {
+ 	TCA_PEDIT_KEY_EX_HDR_TYPE_UDP = 5,
+ 	__PEDIT_HDR_TYPE_MAX,
+ };
++
+ #define TCA_PEDIT_HDR_TYPE_MAX (__PEDIT_HDR_TYPE_MAX - 1)
+ 
+ enum pedit_cmd {
+@@ -44,6 +48,7 @@ enum pedit_cmd {
+ 	TCA_PEDIT_KEY_EX_CMD_ADD = 1,
+ 	__PEDIT_CMD_MAX,
+ };
++
+ #define TCA_PEDIT_CMD_MAX (__PEDIT_CMD_MAX - 1)
+ 
+ struct tc_pedit_key {
+@@ -54,13 +59,14 @@ struct tc_pedit_key {
+ 	__u32           offmask;
+ 	__u32           shift;
+ };
+-                                                                                
++
+ struct tc_pedit_sel {
+ 	tc_gen;
+ 	unsigned char           nkeys;
+ 	unsigned char           flags;
+ 	struct tc_pedit_key     keys[0];
+ };
++
+ #define tc_pedit tc_pedit_sel
+ 
+ #endif
+diff --git a/include/uapi/linux/tc_act/tc_sample.h b/include/uapi/linux/tc_act/tc_sample.h
+index edc9058..bd7e9f0 100644
+--- a/include/uapi/linux/tc_act/tc_sample.h
++++ b/include/uapi/linux/tc_act/tc_sample.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_TC_SAMPLE_H
+ #define __LINUX_TC_SAMPLE_H
+ 
+diff --git a/include/uapi/linux/tc_act/tc_skbedit.h b/include/uapi/linux/tc_act/tc_skbedit.h
+index 2884425..6de6071 100644
+--- a/include/uapi/linux/tc_act/tc_skbedit.h
++++ b/include/uapi/linux/tc_act/tc_skbedit.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /*
+  * Copyright (c) 2008, Intel Corporation.
+  *
+@@ -29,6 +30,7 @@
+ #define SKBEDIT_F_MARK			0x4
+ #define SKBEDIT_F_PTYPE			0x8
+ #define SKBEDIT_F_MASK			0x10
++#define SKBEDIT_F_INHERITDSFIELD	0x20
+ 
+ struct tc_skbedit {
+ 	tc_gen;
+@@ -44,6 +46,7 @@ enum {
+ 	TCA_SKBEDIT_PAD,
+ 	TCA_SKBEDIT_PTYPE,
+ 	TCA_SKBEDIT_MASK,
++	TCA_SKBEDIT_FLAGS,
+ 	__TCA_SKBEDIT_MAX
+ };
+ #define TCA_SKBEDIT_MAX (__TCA_SKBEDIT_MAX - 1)
+diff --git a/include/uapi/linux/tc_act/tc_skbmod.h b/include/uapi/linux/tc_act/tc_skbmod.h
+index 10fc07d..38c072f 100644
+--- a/include/uapi/linux/tc_act/tc_skbmod.h
++++ b/include/uapi/linux/tc_act/tc_skbmod.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+ /*
+  * Copyright (c) 2016, Jamal Hadi Salim
+  *
+diff --git a/include/uapi/linux/tc_act/tc_tunnel_key.h b/include/uapi/linux/tc_act/tc_tunnel_key.h
+index afcd4be..be384d6 100644
+--- a/include/uapi/linux/tc_act/tc_tunnel_key.h
++++ b/include/uapi/linux/tc_act/tc_tunnel_key.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+ /*
+  * Copyright (c) 2016, Amir Vadai <amir@vadai.me>
+  * Copyright (c) 2016, Mellanox Technologies. All rights reserved.
+@@ -35,9 +36,37 @@ enum {
+ 	TCA_TUNNEL_KEY_PAD,
+ 	TCA_TUNNEL_KEY_ENC_DST_PORT,	/* be16 */
+ 	TCA_TUNNEL_KEY_NO_CSUM,		/* u8 */
++	TCA_TUNNEL_KEY_ENC_OPTS,	/* Nested TCA_TUNNEL_KEY_ENC_OPTS_
++					 * attributes
++					 */
++	TCA_TUNNEL_KEY_ENC_TOS,		/* u8 */
++	TCA_TUNNEL_KEY_ENC_TTL,		/* u8 */
+ 	__TCA_TUNNEL_KEY_MAX,
+ };
+ 
+ #define TCA_TUNNEL_KEY_MAX (__TCA_TUNNEL_KEY_MAX - 1)
+ 
++enum {
++	TCA_TUNNEL_KEY_ENC_OPTS_UNSPEC,
++	TCA_TUNNEL_KEY_ENC_OPTS_GENEVE,		/* Nested
++						 * TCA_TUNNEL_KEY_ENC_OPTS_
++						 * attributes
++						 */
++	__TCA_TUNNEL_KEY_ENC_OPTS_MAX,
++};
++
++#define TCA_TUNNEL_KEY_ENC_OPTS_MAX (__TCA_TUNNEL_KEY_ENC_OPTS_MAX - 1)
++
++enum {
++	TCA_TUNNEL_KEY_ENC_OPT_GENEVE_UNSPEC,
++	TCA_TUNNEL_KEY_ENC_OPT_GENEVE_CLASS,		/* be16 */
++	TCA_TUNNEL_KEY_ENC_OPT_GENEVE_TYPE,		/* u8 */
++	TCA_TUNNEL_KEY_ENC_OPT_GENEVE_DATA,		/* 4 to 128 bytes */
++
++	__TCA_TUNNEL_KEY_ENC_OPT_GENEVE_MAX,
++};
++
++#define TCA_TUNNEL_KEY_ENC_OPT_GENEVE_MAX \
++	(__TCA_TUNNEL_KEY_ENC_OPT_GENEVE_MAX - 1)
++
+ #endif
+diff --git a/include/uapi/linux/tc_act/tc_vlan.h b/include/uapi/linux/tc_act/tc_vlan.h
+index bddb272..0d7b5fd 100644
+--- a/include/uapi/linux/tc_act/tc_vlan.h
++++ b/include/uapi/linux/tc_act/tc_vlan.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+ /*
+  * Copyright (c) 2014 Jiri Pirko <jiri@resnulli.us>
+  *
+diff --git a/include/uapi/linux/tc_ematch/tc_em_cmp.h b/include/uapi/linux/tc_ematch/tc_em_cmp.h
+index f34bb1b..2549d9d 100644
+--- a/include/uapi/linux/tc_ematch/tc_em_cmp.h
++++ b/include/uapi/linux/tc_ematch/tc_em_cmp.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_TC_EM_CMP_H
+ #define __LINUX_TC_EM_CMP_H
+ 
+diff --git a/include/uapi/linux/tc_ematch/tc_em_ipt.h b/include/uapi/linux/tc_ematch/tc_em_ipt.h
+new file mode 100644
+index 0000000..49a6553
+--- /dev/null
++++ b/include/uapi/linux/tc_ematch/tc_em_ipt.h
+@@ -0,0 +1,20 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
++#ifndef __LINUX_TC_EM_IPT_H
++#define __LINUX_TC_EM_IPT_H
++
++#include <linux/types.h>
++#include <linux/pkt_cls.h>
++
++enum {
++	TCA_EM_IPT_UNSPEC,
++	TCA_EM_IPT_HOOK,
++	TCA_EM_IPT_MATCH_NAME,
++	TCA_EM_IPT_MATCH_REVISION,
++	TCA_EM_IPT_NFPROTO,
++	TCA_EM_IPT_MATCH_DATA,
++	__TCA_EM_IPT_MAX
++};
++
++#define TCA_EM_IPT_MAX (__TCA_EM_IPT_MAX - 1)
++
++#endif
+diff --git a/include/uapi/linux/tc_ematch/tc_em_meta.h b/include/uapi/linux/tc_ematch/tc_em_meta.h
+index b11f8ce..cf30b5b 100644
+--- a/include/uapi/linux/tc_ematch/tc_em_meta.h
++++ b/include/uapi/linux/tc_ematch/tc_em_meta.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_TC_EM_META_H
+ #define __LINUX_TC_EM_META_H
+ 
+diff --git a/include/uapi/linux/tc_ematch/tc_em_nbyte.h b/include/uapi/linux/tc_ematch/tc_em_nbyte.h
+index 7172cfb..c76333f 100644
+--- a/include/uapi/linux/tc_ematch/tc_em_nbyte.h
++++ b/include/uapi/linux/tc_ematch/tc_em_nbyte.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __LINUX_TC_EM_NBYTE_H
+ #define __LINUX_TC_EM_NBYTE_H
+ 
+diff --git a/include/uapi/linux/tcp.h b/include/uapi/linux/tcp.h
+index 8edad3f..2e766cf 100644
+--- a/include/uapi/linux/tcp.h
++++ b/include/uapi/linux/tcp.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+ /*
+  * INET		An implementation of the TCP/IP protocol suite for the LINUX
+  *		operating system.  INET is implemented using the  BSD Socket
+@@ -119,6 +120,12 @@ enum {
+ #define TCP_FASTOPEN_CONNECT	30	/* Attempt FastOpen with connect */
+ #define TCP_ULP			31	/* Attach a ULP to a TCP connection */
+ #define TCP_MD5SIG_EXT		32	/* TCP MD5 Signature with extensions */
++#define TCP_FASTOPEN_KEY	33	/* Set the key for Fast Open (cookie) */
++#define TCP_FASTOPEN_NO_COOKIE	34	/* Enable TFO without a TFO cookie */
++#define TCP_ZEROCOPY_RECEIVE	35
++#define TCP_INQ			36	/* Notify bytes available to read as a cmsg on read */
++
++#define TCP_CM_INQ		TCP_INQ
+ 
+ struct tcp_repair_opt {
+ 	__u32	opt_code;
+@@ -221,6 +228,9 @@ struct tcp_info {
+ 	__u64	tcpi_busy_time;      /* Time (usec) busy sending data */
+ 	__u64	tcpi_rwnd_limited;   /* Time (usec) limited by receive window */
+ 	__u64	tcpi_sndbuf_limited; /* Time (usec) limited by send buffer */
++
++	__u32	tcpi_delivered;
++	__u32	tcpi_delivered_ce;
+ };
+ 
+ /* netlink attributes types for SCM_TIMESTAMPING_OPT_STATS */
+@@ -238,6 +248,11 @@ enum {
+ 	TCP_NLA_MIN_RTT,        /* minimum RTT */
+ 	TCP_NLA_RECUR_RETRANS,  /* Recurring retransmits for the current pkt */
+ 	TCP_NLA_DELIVERY_RATE_APP_LMT, /* delivery rate application limited ? */
++	TCP_NLA_SNDQ_SIZE,	/* Data (bytes) pending in send queue */
++	TCP_NLA_CA_STATE,	/* ca_state of socket */
++	TCP_NLA_SND_SSTHRESH,	/* Slow start size threshold */
++	TCP_NLA_DELIVERED,	/* Data pkts delivered incl. out-of-order */
++	TCP_NLA_DELIVERED_CE,	/* Like above but only ones w/ CE marks */
+ 
+ };
+ 
+@@ -265,4 +280,11 @@ struct tcp_diag_md5sig {
+ 	__u8	tcpm_key[TCP_MD5SIG_MAXKEYLEN];
+ };
+ 
++/* setsockopt(fd, IPPROTO_TCP, TCP_ZEROCOPY_RECEIVE, ...) */
++
++struct tcp_zerocopy_receive {
++	__u64 address;		/* in: address of mapping */
++	__u32 length;		/* in/out: number of bytes to map/mapped */
++	__u32 recv_skip_hint;	/* out: amount of bytes to skip */
++};
+ #endif /* _LINUX_TCP_H */
+diff --git a/include/uapi/linux/tcp_metrics.h b/include/uapi/linux/tcp_metrics.h
+index 80ad90d..7cb4a17 100644
+--- a/include/uapi/linux/tcp_metrics.h
++++ b/include/uapi/linux/tcp_metrics.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /* tcp_metrics.h - TCP Metrics Interface */
+ 
+ #ifndef _LINUX_TCP_METRICS_H
+diff --git a/include/uapi/linux/tipc.h b/include/uapi/linux/tipc.h
+index 924fb5c..7a166a0 100644
+--- a/include/uapi/linux/tipc.h
++++ b/include/uapi/linux/tipc.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */
+ /*
+  * include/uapi/linux/tipc.h: Header for TIPC socket interface
+  *
+@@ -44,82 +45,38 @@
+  * TIPC addressing primitives
+  */
+ 
+-struct tipc_portid {
++struct tipc_socket_addr {
+ 	__u32 ref;
+ 	__u32 node;
+ };
+ 
+-struct tipc_name {
++struct tipc_service_addr {
+ 	__u32 type;
+ 	__u32 instance;
+ };
+ 
+-struct tipc_name_seq {
++struct tipc_service_range {
+ 	__u32 type;
+ 	__u32 lower;
+ 	__u32 upper;
+ };
+ 
+-/* TIPC Address Size, Offset, Mask specification for Z.C.N
+- */
+-#define TIPC_NODE_BITS          12
+-#define TIPC_CLUSTER_BITS       12
+-#define TIPC_ZONE_BITS          8
+-
+-#define TIPC_NODE_OFFSET        0
+-#define TIPC_CLUSTER_OFFSET     TIPC_NODE_BITS
+-#define TIPC_ZONE_OFFSET        (TIPC_CLUSTER_OFFSET + TIPC_CLUSTER_BITS)
+-
+-#define TIPC_NODE_SIZE          ((1UL << TIPC_NODE_BITS) - 1)
+-#define TIPC_CLUSTER_SIZE       ((1UL << TIPC_CLUSTER_BITS) - 1)
+-#define TIPC_ZONE_SIZE          ((1UL << TIPC_ZONE_BITS) - 1)
+-
+-#define TIPC_NODE_MASK		(TIPC_NODE_SIZE << TIPC_NODE_OFFSET)
+-#define TIPC_CLUSTER_MASK	(TIPC_CLUSTER_SIZE << TIPC_CLUSTER_OFFSET)
+-#define TIPC_ZONE_MASK		(TIPC_ZONE_SIZE << TIPC_ZONE_OFFSET)
+-
+-#define TIPC_ZONE_CLUSTER_MASK (TIPC_ZONE_MASK | TIPC_CLUSTER_MASK)
+-
+-static __inline__ __u32 tipc_addr(unsigned int zone,
+-			      unsigned int cluster,
+-			      unsigned int node)
+-{
+-	return (zone << TIPC_ZONE_OFFSET) |
+-		(cluster << TIPC_CLUSTER_OFFSET) |
+-		node;
+-}
+-
+-static __inline__ unsigned int tipc_zone(__u32 addr)
+-{
+-	return addr >> TIPC_ZONE_OFFSET;
+-}
+-
+-static __inline__ unsigned int tipc_cluster(__u32 addr)
+-{
+-	return (addr & TIPC_CLUSTER_MASK) >> TIPC_CLUSTER_OFFSET;
+-}
+-
+-static __inline__ unsigned int tipc_node(__u32 addr)
+-{
+-	return addr & TIPC_NODE_MASK;
+-}
+-
+ /*
+- * Application-accessible port name types
++ * Application-accessible service types
+  */
+ 
+-#define TIPC_CFG_SRV		0	/* configuration service name type */
+-#define TIPC_TOP_SRV		1	/* topology service name type */
+-#define TIPC_LINK_STATE		2	/* link state name type */
+-#define TIPC_RESERVED_TYPES	64	/* lowest user-publishable name type */
++#define TIPC_NODE_STATE		0	/* node state service type */
++#define TIPC_TOP_SRV		1	/* topology server service type */
++#define TIPC_LINK_STATE		2	/* link state service type */
++#define TIPC_RESERVED_TYPES	64	/* lowest user-allowed service type */
+ 
+ /*
+- * Publication scopes when binding port names and port name sequences
++ * Publication scopes when binding service / service range
+  */
+-
+-#define TIPC_ZONE_SCOPE		1
+-#define TIPC_CLUSTER_SCOPE	2
+-#define TIPC_NODE_SCOPE		3
++enum tipc_scope {
++	TIPC_CLUSTER_SCOPE = 2, /* 0 can also be used */
++	TIPC_NODE_SCOPE    = 3
++};
+ 
+ /*
+  * Limiting values for messages
+@@ -151,28 +108,28 @@ static __inline__ unsigned int tipc_node(__u32 addr)
+  * TIPC topology subscription service definitions
+  */
+ 
+-#define TIPC_SUB_PORTS		0x01	/* filter for port availability */
+-#define TIPC_SUB_SERVICE	0x02	/* filter for service availability */
+-#define TIPC_SUB_CANCEL		0x04	/* cancel a subscription */
++#define TIPC_SUB_PORTS          0x01    /* filter: evt at each match */
++#define TIPC_SUB_SERVICE        0x02    /* filter: evt at first up/last down */
++#define TIPC_SUB_CANCEL         0x04    /* filter: cancel a subscription */
+ 
+ #define TIPC_WAIT_FOREVER	(~0)	/* timeout for permanent subscription */
+ 
+ struct tipc_subscr {
+-	struct tipc_name_seq seq;	/* name sequence of interest */
++	struct tipc_service_range seq;	/* range of interest */
+ 	__u32 timeout;			/* subscription duration (in ms) */
+ 	__u32 filter;			/* bitmask of filter options */
+ 	char usr_handle[8];		/* available for subscriber use */
+ };
+ 
+ #define TIPC_PUBLISHED		1	/* publication event */
+-#define TIPC_WITHDRAWN		2	/* withdraw event */
++#define TIPC_WITHDRAWN		2	/* withdrawal event */
+ #define TIPC_SUBSCR_TIMEOUT	3	/* subscription timeout event */
+ 
+ struct tipc_event {
+ 	__u32 event;			/* event type */
+-	__u32 found_lower;		/* matching name seq instances */
+-	__u32 found_upper;		/*    "      "    "     "      */
+-	struct tipc_portid port;	/* associated port */
++	__u32 found_lower;		/* matching range */
++	__u32 found_upper;		/*    "      "    */
++	struct tipc_socket_addr port;	/* associated socket */
+ 	struct tipc_subscr s;		/* associated subscription */
+ };
+ 
+@@ -192,20 +149,20 @@ struct tipc_event {
+ #define SOL_TIPC	271
+ #endif
+ 
+-#define TIPC_ADDR_NAMESEQ	1
+-#define TIPC_ADDR_MCAST		1
+-#define TIPC_ADDR_NAME		2
+-#define TIPC_ADDR_ID		3
++#define TIPC_ADDR_MCAST         1
++#define TIPC_SERVICE_RANGE      1
++#define TIPC_SERVICE_ADDR       2
++#define TIPC_SOCKET_ADDR        3
+ 
+ struct sockaddr_tipc {
+ 	unsigned short family;
+ 	unsigned char  addrtype;
+ 	signed   char  scope;
+ 	union {
+-		struct tipc_portid id;
+-		struct tipc_name_seq nameseq;
++		struct tipc_socket_addr id;
++		struct tipc_service_range nameseq;
+ 		struct {
+-			struct tipc_name name;
++			struct tipc_service_addr name;
+ 			__u32 domain;
+ 		} name;
+ 	} addr;
+@@ -231,26 +188,103 @@ struct sockaddr_tipc {
+ #define TIPC_SOCK_RECVQ_DEPTH	132	/* Default: none (read only) */
+ #define TIPC_MCAST_BROADCAST    133     /* Default: TIPC selects. No arg */
+ #define TIPC_MCAST_REPLICAST    134     /* Default: TIPC selects. No arg */
++#define TIPC_GROUP_JOIN         135     /* Takes struct tipc_group_req* */
++#define TIPC_GROUP_LEAVE        136     /* No argument */
++
++/*
++ * Flag values
++ */
++#define TIPC_GROUP_LOOPBACK     0x1  /* Receive copy of sent msg when match */
++#define TIPC_GROUP_MEMBER_EVTS  0x2  /* Receive membership events in socket */
++
++struct tipc_group_req {
++	__u32 type;      /* group id */
++	__u32 instance;  /* member id */
++	__u32 scope;     /* cluster/node */
++	__u32 flags;
++};
+ 
+ /*
+  * Maximum sizes of TIPC bearer-related names (including terminating NULL)
+  * The string formatting for each name element is:
+  * media: media
+  * interface: media:interface name
+- * link: Z.C.N:interface-Z.C.N:interface
+- *
++ * link: node:interface-node:interface
+  */
+-
++#define TIPC_NODEID_LEN         16
+ #define TIPC_MAX_MEDIA_NAME	16
+ #define TIPC_MAX_IF_NAME	16
+ #define TIPC_MAX_BEARER_NAME	32
+-#define TIPC_MAX_LINK_NAME	60
++#define TIPC_MAX_LINK_NAME	68
+ 
+-#define SIOCGETLINKNAME		SIOCPROTOPRIVATE
++#define SIOCGETLINKNAME        SIOCPROTOPRIVATE
++#define SIOCGETNODEID          (SIOCPROTOPRIVATE + 1)
+ 
+ struct tipc_sioc_ln_req {
+ 	__u32 peer;
+ 	__u32 bearer_id;
+ 	char linkname[TIPC_MAX_LINK_NAME];
+ };
++
++struct tipc_sioc_nodeid_req {
++	__u32 peer;
++	char node_id[TIPC_NODEID_LEN];
++};
++
++/* The macros and functions below are deprecated:
++ */
++
++#define TIPC_CFG_SRV		0
++#define TIPC_ZONE_SCOPE         1
++
++#define TIPC_ADDR_NAMESEQ	1
++#define TIPC_ADDR_NAME		2
++#define TIPC_ADDR_ID		3
++
++#define TIPC_NODE_BITS          12
++#define TIPC_CLUSTER_BITS       12
++#define TIPC_ZONE_BITS          8
++
++#define TIPC_NODE_OFFSET        0
++#define TIPC_CLUSTER_OFFSET     TIPC_NODE_BITS
++#define TIPC_ZONE_OFFSET        (TIPC_CLUSTER_OFFSET + TIPC_CLUSTER_BITS)
++
++#define TIPC_NODE_SIZE          ((1UL << TIPC_NODE_BITS) - 1)
++#define TIPC_CLUSTER_SIZE       ((1UL << TIPC_CLUSTER_BITS) - 1)
++#define TIPC_ZONE_SIZE          ((1UL << TIPC_ZONE_BITS) - 1)
++
++#define TIPC_NODE_MASK		(TIPC_NODE_SIZE << TIPC_NODE_OFFSET)
++#define TIPC_CLUSTER_MASK	(TIPC_CLUSTER_SIZE << TIPC_CLUSTER_OFFSET)
++#define TIPC_ZONE_MASK		(TIPC_ZONE_SIZE << TIPC_ZONE_OFFSET)
++
++#define TIPC_ZONE_CLUSTER_MASK (TIPC_ZONE_MASK | TIPC_CLUSTER_MASK)
++
++#define tipc_portid tipc_socket_addr
++#define tipc_name tipc_service_addr
++#define tipc_name_seq tipc_service_range
++
++static __inline__ __u32 tipc_addr(unsigned int zone,
++			      unsigned int cluster,
++			      unsigned int node)
++{
++	return (zone << TIPC_ZONE_OFFSET) |
++		(cluster << TIPC_CLUSTER_OFFSET) |
++		node;
++}
++
++static __inline__ unsigned int tipc_zone(__u32 addr)
++{
++	return addr >> TIPC_ZONE_OFFSET;
++}
++
++static __inline__ unsigned int tipc_cluster(__u32 addr)
++{
++	return (addr & TIPC_CLUSTER_MASK) >> TIPC_CLUSTER_OFFSET;
++}
++
++static __inline__ unsigned int tipc_node(__u32 addr)
++{
++	return addr & TIPC_NODE_MASK;
++}
++
+ #endif
+diff --git a/include/uapi/linux/tipc_netlink.h b/include/uapi/linux/tipc_netlink.h
+index f9edd20..0ebe02e 100644
+--- a/include/uapi/linux/tipc_netlink.h
++++ b/include/uapi/linux/tipc_netlink.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */
+ /*
+  * Copyright (c) 2014, Ericsson AB
+  * All rights reserved.
+@@ -113,6 +114,14 @@ enum {
+ 	TIPC_NLA_SOCK_REF,		/* u32 */
+ 	TIPC_NLA_SOCK_CON,		/* nest */
+ 	TIPC_NLA_SOCK_HAS_PUBL,		/* flag */
++	TIPC_NLA_SOCK_STAT,		/* nest */
++	TIPC_NLA_SOCK_TYPE,		/* u32 */
++	TIPC_NLA_SOCK_INO,		/* u32 */
++	TIPC_NLA_SOCK_UID,		/* u32 */
++	TIPC_NLA_SOCK_TIPC_STATE,	/* u32 */
++	TIPC_NLA_SOCK_COOKIE,		/* u64 */
++	TIPC_NLA_SOCK_PAD,		/* flag */
++	TIPC_NLA_SOCK_GROUP,		/* nest */
+ 
+ 	__TIPC_NLA_SOCK_MAX,
+ 	TIPC_NLA_SOCK_MAX = __TIPC_NLA_SOCK_MAX - 1
+@@ -161,6 +170,8 @@ enum {
+ 	TIPC_NLA_NET_UNSPEC,
+ 	TIPC_NLA_NET_ID,		/* u32 */
+ 	TIPC_NLA_NET_ADDR,		/* u32 */
++	TIPC_NLA_NET_NODEID,		/* u64 */
++	TIPC_NLA_NET_NODEID_W1,		/* u64 */
+ 
+ 	__TIPC_NLA_NET_MAX,
+ 	TIPC_NLA_NET_MAX = __TIPC_NLA_NET_MAX - 1
+@@ -223,6 +234,19 @@ enum {
+ 	TIPC_NLA_MON_PEER_MAX = __TIPC_NLA_MON_PEER_MAX - 1
+ };
+ 
++/* Nest, socket group info */
++enum {
++	TIPC_NLA_SOCK_GROUP_ID,			/* u32 */
++	TIPC_NLA_SOCK_GROUP_OPEN,		/* flag */
++	TIPC_NLA_SOCK_GROUP_NODE_SCOPE,		/* flag */
++	TIPC_NLA_SOCK_GROUP_CLUSTER_SCOPE,	/* flag */
++	TIPC_NLA_SOCK_GROUP_INSTANCE,		/* u32 */
++	TIPC_NLA_SOCK_GROUP_BC_SEND_NEXT,	/* u32 */
++
++	__TIPC_NLA_SOCK_GROUP_MAX,
++	TIPC_NLA_SOCK_GROUP_MAX = __TIPC_NLA_SOCK_GROUP_MAX - 1
++};
++
+ /* Nest, connection info */
+ enum {
+ 	TIPC_NLA_CON_UNSPEC,
+@@ -237,6 +261,18 @@ enum {
+ 	TIPC_NLA_CON_MAX = __TIPC_NLA_CON_MAX - 1
+ };
+ 
++/* Nest, socket statistics info */
++enum {
++	TIPC_NLA_SOCK_STAT_RCVQ,	/* u32 */
++	TIPC_NLA_SOCK_STAT_SENDQ,	/* u32 */
++	TIPC_NLA_SOCK_STAT_LINK_CONG,	/* flag */
++	TIPC_NLA_SOCK_STAT_CONN_CONG,	/* flag */
++	TIPC_NLA_SOCK_STAT_DROP,	/* u32 */
++
++	__TIPC_NLA_SOCK_STAT_MAX,
++	TIPC_NLA_SOCK_STAT_MAX = __TIPC_NLA_SOCK_STAT_MAX - 1
++};
++
+ /* Nest, link propreties. Valid for link, media and bearer */
+ enum {
+ 	TIPC_NLA_PROP_UNSPEC,
+@@ -244,6 +280,7 @@ enum {
+ 	TIPC_NLA_PROP_PRIO,		/* u32 */
+ 	TIPC_NLA_PROP_TOL,		/* u32 */
+ 	TIPC_NLA_PROP_WIN,		/* u32 */
++	TIPC_NLA_PROP_MTU,		/* u32 */
+ 
+ 	__TIPC_NLA_PROP_MAX,
+ 	TIPC_NLA_PROP_MAX = __TIPC_NLA_PROP_MAX - 1
+diff --git a/include/uapi/linux/tipc_sockets_diag.h b/include/uapi/linux/tipc_sockets_diag.h
+new file mode 100644
+index 0000000..21b766e
+--- /dev/null
++++ b/include/uapi/linux/tipc_sockets_diag.h
+@@ -0,0 +1,17 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
++/* AF_TIPC sock_diag interface for querying open sockets */
++
++#ifndef __TIPC_SOCKETS_DIAG_H__
++#define __TIPC_SOCKETS_DIAG_H__
++
++#include <linux/types.h>
++#include <linux/sock_diag.h>
++
++/* Request */
++struct tipc_sock_diag_req {
++	__u8	sdiag_family;	/* must be AF_TIPC */
++	__u8	sdiag_protocol;	/* must be 0 */
++	__u16	pad;		/* must be 0 */
++	__u32	tidiag_states;	/* query*/
++};
++#endif /* __TIPC_SOCKETS_DIAG_H__ */
+diff --git a/include/uapi/linux/types.h b/include/uapi/linux/types.h
+index c640657..999cb0f 100644
+--- a/include/uapi/linux/types.h
++++ b/include/uapi/linux/types.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _LINUX_TYPES_H
+ #define _LINUX_TYPES_H
+ 
+@@ -43,5 +44,7 @@ typedef __u32 __bitwise __wsum;
+ #define __aligned_be64 __be64 __attribute__((aligned(8)))
+ #define __aligned_le64 __le64 __attribute__((aligned(8)))
+ 
++typedef unsigned __bitwise __poll_t;
++
+ #endif /*  __ASSEMBLY__ */
+ #endif /* _LINUX_TYPES_H */
+diff --git a/include/uapi/linux/unix_diag.h b/include/uapi/linux/unix_diag.h
+index 1eb0b8d..5c502fd 100644
+--- a/include/uapi/linux/unix_diag.h
++++ b/include/uapi/linux/unix_diag.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __UNIX_DIAG_H__
+ #define __UNIX_DIAG_H__
+ 
+diff --git a/include/uapi/linux/veth.h b/include/uapi/linux/veth.h
+index 3354c1e..52b58e5 100644
+--- a/include/uapi/linux/veth.h
++++ b/include/uapi/linux/veth.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef __NET_VETH_H_
+ #define __NET_VETH_H_
+ 
+diff --git a/include/uapi/linux/vm_sockets_diag.h b/include/uapi/linux/vm_sockets_diag.h
+index a732a6f..6da42f9 100644
+--- a/include/uapi/linux/vm_sockets_diag.h
++++ b/include/uapi/linux/vm_sockets_diag.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ /* AF_VSOCK sock_diag(7) interface for querying open sockets */
+ 
+ #ifndef __VM_SOCKETS_DIAG_H__
+diff --git a/include/uapi/linux/xfrm.h b/include/uapi/linux/xfrm.h
+index 5790293..93fb192 100644
+--- a/include/uapi/linux/xfrm.h
++++ b/include/uapi/linux/xfrm.h
+@@ -1,3 +1,4 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+ #ifndef _LINUX_XFRM_H
+ #define _LINUX_XFRM_H
+ 
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0048-tc-flower-Add-match-on-encapsulating-tos-ttl.patch b/SOURCES/0048-tc-flower-Add-match-on-encapsulating-tos-ttl.patch
new file mode 100644
index 0000000..7c608ff
--- /dev/null
+++ b/SOURCES/0048-tc-flower-Add-match-on-encapsulating-tos-ttl.patch
@@ -0,0 +1,129 @@
+From 738c49477eb843b37cb799115e5b562303bfcd9e Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Wed, 6 Feb 2019 14:51:12 +0100
+Subject: [PATCH] tc/flower: Add match on encapsulating tos/ttl
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1641909
+Upstream Status: iproute2.git commit 761ec9e29ff86
+Conflicts: Adjusted code to missing commit e28b88a464c49
+           ("tc: jsonify flower filter").
+
+commit 761ec9e29ff867452057f59dc6ca430688b409ea
+Author: Or Gerlitz <ogerlitz@mellanox.com>
+Date:   Thu Jul 19 14:02:15 2018 +0300
+
+    tc/flower: Add match on encapsulating tos/ttl
+
+    Add matching on tos/ttl of the IP tunnel headers.
+
+    For example, here's decap rule that matches on the tunnel tos:
+
+    tc filter add dev vxlan_sys_4789 protocol ip parent ffff: prio 10 flower \
+       enc_src_ip 192.168.10.2 enc_dst_ip 192.168.10.1 enc_key_id 100 enc_dst_port 4789 enc_tos 0x30 \
+       src_mac e4:11:22:33:44:70 dst_mac e4:11:22:33:44:50  \
+       action tunnel_key unset \
+       action mirred egress redirect dev eth0_0
+
+    Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
+    Reviewed-by: Roi Dayan <roid@mellanox.com>
+    Acked-by: Jiri Pirko <jiri@mellanox.com>
+    Signed-off-by: David Ahern <dsahern@gmail.com>
+---
+ man/man8/tc-flower.8 | 14 +++++++++++++-
+ tc/f_flower.c        | 27 +++++++++++++++++++++++++++
+ 2 files changed, 40 insertions(+), 1 deletion(-)
+
+diff --git a/man/man8/tc-flower.8 b/man/man8/tc-flower.8
+index be46f02..af19708 100644
+--- a/man/man8/tc-flower.8
++++ b/man/man8/tc-flower.8
+@@ -57,6 +57,10 @@ flower \- flow based traffic control filter
+ .IR ipv4_address " | " ipv6_address " } | "
+ .B enc_dst_port
+ .IR port_number " | "
++.B enc_tos
++.IR TOS " | "
++.B enc_ttl
++.IR TTL " | "
+ .BR ip_flags
+ .IR IP_FLAGS
+ .SH DESCRIPTION
+@@ -207,6 +211,10 @@ bits is assumed.
+ .BI enc_src_ip " PREFIX"
+ .TQ
+ .BI enc_dst_port " NUMBER"
++.TQ
++.BI enc_tos " NUMBER"
++.TQ
++.BI enc_ttl " NUMBER"
+ Match on IP tunnel metadata. Key id
+ .I NUMBER
+ is a 32 bit tunnel key id (e.g. VNI for VXLAN tunnel).
+@@ -215,7 +223,11 @@ must be a valid IPv4 or IPv6 address optionally followed by a slash and the
+ prefix length. If the prefix is missing, \fBtc\fR assumes a full-length
+ host match.  Dst port
+ .I NUMBER
+-is a 16 bit UDP dst port.
++is a 16 bit UDP dst port. Tos
++.I NUMBER
++is an 8 bit tos (dscp+ecn) value, ttl
++.I NUMBER
++is an 8 bit time-to-live value.
+ .TP
+ .BI ip_flags " IP_FLAGS"
+ .I IP_FLAGS
+diff --git a/tc/f_flower.c b/tc/f_flower.c
+index 5be693a..5f5236c 100644
+--- a/tc/f_flower.c
++++ b/tc/f_flower.c
+@@ -70,6 +70,8 @@ static void explain(void)
+ 		"                       enc_dst_ip [ IPV4-ADDR | IPV6-ADDR ] |\n"
+ 		"                       enc_src_ip [ IPV4-ADDR | IPV6-ADDR ] |\n"
+ 		"                       enc_key_id [ KEY-ID ] |\n"
++		"                       enc_tos MASKED-IP_TOS |\n"
++		"                       enc_ttl MASKED-IP_TTL |\n"
+ 		"                       ip_flags IP-FLAGS | \n"
+ 		"                       enc_dst_port [ port_number ] }\n"
+ 		"       FILTERID := X:Y:Z\n"
+@@ -883,6 +885,26 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
+ 				fprintf(stderr, "Illegal \"enc_dst_port\"\n");
+ 				return -1;
+ 			}
++		} else if (matches(*argv, "enc_tos") == 0) {
++			NEXT_ARG();
++			ret = flower_parse_ip_tos_ttl(*argv,
++						      TCA_FLOWER_KEY_ENC_IP_TOS,
++						      TCA_FLOWER_KEY_ENC_IP_TOS_MASK,
++						      n);
++			if (ret < 0) {
++				fprintf(stderr, "Illegal \"enc_tos\"\n");
++				return -1;
++			}
++		} else if (matches(*argv, "enc_ttl") == 0) {
++			NEXT_ARG();
++			ret = flower_parse_ip_tos_ttl(*argv,
++						      TCA_FLOWER_KEY_ENC_IP_TTL,
++						      TCA_FLOWER_KEY_ENC_IP_TTL_MASK,
++						      n);
++			if (ret < 0) {
++				fprintf(stderr, "Illegal \"enc_ttl\"\n");
++				return -1;
++			}
+ 		} else if (matches(*argv, "action") == 0) {
+ 			NEXT_ARG();
+ 			ret = parse_action(&argc, &argv, TCA_FLOWER_ACT, n);
+@@ -1296,6 +1318,11 @@ static int flower_print_opt(struct filter_util *qu, FILE *f,
+ 	flower_print_port(f, "enc_dst_port",
+ 			  tb[TCA_FLOWER_KEY_ENC_UDP_DST_PORT]);
+ 
++	flower_print_ip_attr(f, "enc_tos", tb[TCA_FLOWER_KEY_ENC_IP_TOS],
++			    tb[TCA_FLOWER_KEY_ENC_IP_TOS_MASK]);
++	flower_print_ip_attr(f, "enc_ttl", tb[TCA_FLOWER_KEY_ENC_IP_TTL],
++			    tb[TCA_FLOWER_KEY_ENC_IP_TTL_MASK]);
++
+ 	flower_print_matching_flags(f, "ip_flags",
+ 				    FLOWER_IP_FLAGS,
+ 				    tb[TCA_FLOWER_KEY_FLAGS],
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0049-tc-act_tunnel_key-Enable-setup-of-tos-and-ttl.patch b/SOURCES/0049-tc-act_tunnel_key-Enable-setup-of-tos-and-ttl.patch
new file mode 100644
index 0000000..c3a3eca
--- /dev/null
+++ b/SOURCES/0049-tc-act_tunnel_key-Enable-setup-of-tos-and-ttl.patch
@@ -0,0 +1,148 @@
+From 7521695ca299ceb723dc6b17f304b91300b3b16c Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Wed, 6 Feb 2019 14:51:57 +0100
+Subject: [PATCH] tc/act_tunnel_key: Enable setup of tos and ttl
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1641909
+Upstream Status: iproute2.git commit 9f89b0cc0eda2
+Conflicts:
+* Context change due to missing commits
+  59eb271d1d259 ("tc: m_tunnel_key: add csum/nocsum option") and
+  6217917a38268 ("tc: m_tunnel_key: Add tunnel option support to act_tunnel_key").
+* Adjusted tunnel_key_print_tos_ttl() to missing commit 8feb516bfcdd9
+  ("tc: jsonify tunnel_key action").
+
+commit 9f89b0cc0eda2ef52d8850b0610f3e2e09fd7c1c
+Author: Or Gerlitz <ogerlitz@mellanox.com>
+Date:   Thu Jul 19 14:02:14 2018 +0300
+
+    tc/act_tunnel_key: Enable setup of tos and ttl
+
+    Allow to set tos and ttl for the tunnel.
+
+    For example, here's encap rule that sets tos to the tunnel:
+
+    tc filter add dev eth0_0 protocol ip parent ffff: prio 10 flower \
+       src_mac e4:11:22:33:44:50 dst_mac e4:11:22:33:44:70 \
+       action tunnel_key set src_ip 192.168.10.1 dst_ip 192.168.10.2 id 100 dst_port 4789 tos 0x30 \
+       action mirred egress redirect dev vxlan_sys_4789
+
+    Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
+    Reviewed-by: Roi Dayan <roid@mellanox.com>
+    Acked-by: Jiri Pirko <jiri@mellanox.com>
+    Signed-off-by: David Ahern <dsahern@gmail.com>
+---
+ man/man8/tc-tunnel_key.8 |  8 ++++++++
+ tc/m_tunnel_key.c        | 49 ++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 57 insertions(+)
+
+diff --git a/man/man8/tc-tunnel_key.8 b/man/man8/tc-tunnel_key.8
+index 52fa585..5e93c59 100644
+--- a/man/man8/tc-tunnel_key.8
++++ b/man/man8/tc-tunnel_key.8
+@@ -16,6 +16,8 @@ tunnel_key - Tunnel metadata manipulation
+ .IR ADDRESS
+ .BI id " KEY_ID"
+ .BI dst_port " UDP_PORT"
++.BI tos " TOS"
++.BI ttl " TTL"
+ 
+ .SH DESCRIPTION
+ The
+@@ -77,6 +79,12 @@ Outer header destination IP address (IPv4 or IPv6)
+ .TP
+ .B dst_port
+ Outer header destination UDP port
++.TP
++.B tos
++Outer header TOS
++.TP
++.B ttl
++Outer header TTL
+ .RE
+ .SH EXAMPLES
+ The following example encapsulates incoming ICMP packets on eth0 into a vxlan
+diff --git a/tc/m_tunnel_key.c b/tc/m_tunnel_key.c
+index acbcfc1..60fd1c4 100644
+--- a/tc/m_tunnel_key.c
++++ b/tc/m_tunnel_key.c
+@@ -80,6 +80,22 @@ static int tunnel_key_parse_dst_port(char *str, int type, struct nlmsghdr *n)
+ 	return 0;
+ }
+ 
++static int tunnel_key_parse_tos_ttl(char *str, int type, struct nlmsghdr *n)
++{
++	int ret;
++	__u8 val;
++
++	ret = get_u8(&val, str, 10);
++	if (ret)
++		ret = get_u8(&val, str, 16);
++	if (ret)
++		return -1;
++
++	addattr8(n, MAX_MSG, type, val);
++
++	return 0;
++}
++
+ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p,
+ 			    int tca_id, struct nlmsghdr *n)
+ {
+@@ -154,6 +170,22 @@ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p,
+ 				fprintf(stderr, "Illegal \"dst port\"\n");
+ 				return -1;
+ 			}
++		} else if (matches(*argv, "tos") == 0) {
++			NEXT_ARG();
++			ret = tunnel_key_parse_tos_ttl(*argv,
++							TCA_TUNNEL_KEY_ENC_TOS, n);
++			if (ret < 0) {
++				fprintf(stderr, "Illegal \"tos\"\n");
++				return -1;
++			}
++		} else if (matches(*argv, "ttl") == 0) {
++			NEXT_ARG();
++			ret = tunnel_key_parse_tos_ttl(*argv,
++							TCA_TUNNEL_KEY_ENC_TTL, n);
++			if (ret < 0) {
++				fprintf(stderr, "Illegal \"ttl\"\n");
++				return -1;
++			}
+ 		} else if (matches(*argv, "help") == 0) {
+ 			usage();
+ 		} else {
+@@ -231,6 +263,19 @@ static void tunnel_key_print_dst_port(FILE *f, char *name,
+ 	fprintf(f, "\n\t%s %d", name, rta_getattr_be16(attr));
+ }
+ 
++static void tunnel_key_print_tos_ttl(FILE *f, char *name,
++				     struct rtattr *attr)
++{
++	if (!attr)
++		return;
++
++	if (matches(name, "tos") == 0 && rta_getattr_u8(attr) != 0) {
++		fprintf(f, "\n\t%s 0x%x", name, rta_getattr_u8(attr));
++	} else if (matches(name, "ttl") == 0 && rta_getattr_u8(attr) != 0) {
++		fprintf(f, "\n\t%s %u", name, rta_getattr_u8(attr));
++	}
++}
++
+ static int print_tunnel_key(struct action_util *au, FILE *f, struct rtattr *arg)
+ {
+ 	struct rtattr *tb[TCA_TUNNEL_KEY_MAX + 1];
+@@ -267,6 +312,10 @@ static int print_tunnel_key(struct action_util *au, FILE *f, struct rtattr *arg)
+ 					tb[TCA_TUNNEL_KEY_ENC_KEY_ID]);
+ 		tunnel_key_print_dst_port(f, "dst_port",
+ 					  tb[TCA_TUNNEL_KEY_ENC_DST_PORT]);
++		tunnel_key_print_tos_ttl(f, "tos",
++					  tb[TCA_TUNNEL_KEY_ENC_TOS]);
++		tunnel_key_print_tos_ttl(f, "ttl",
++					  tb[TCA_TUNNEL_KEY_ENC_TTL]);
+ 		break;
+ 	}
+ 	fprintf(f, " %s", action_n2a(parm->action));
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0050-iproute-Abort-if-nexthop-cannot-be-parsed.patch b/SOURCES/0050-iproute-Abort-if-nexthop-cannot-be-parsed.patch
new file mode 100644
index 0000000..14774b6
--- /dev/null
+++ b/SOURCES/0050-iproute-Abort-if-nexthop-cannot-be-parsed.patch
@@ -0,0 +1,52 @@
+From d80837df37cb8897769f87f7a2034a9653168221 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 21 Feb 2019 14:38:57 +0100
+Subject: [PATCH] iproute: Abort if nexthop cannot be parsed
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1624656
+Upstream Status: iproute2.git commit ee53b42fd8b0b
+
+commit ee53b42fd8b0b0cdb857d0f5bf7467e22a3457d9
+Author: Jakub Sitnicki <jkbs@redhat.com>
+Date:   Wed Apr 11 11:43:11 2018 +0200
+
+    iproute: Abort if nexthop cannot be parsed
+
+    Attempt to add a multipath route where a nexthop definition refers to a
+    non-existent device causes 'ip' to crash and burn due to stack buffer
+    overflow:
+
+      # ip -6 route add fd00::1/64 nexthop dev fake1
+      Cannot find device "fake1"
+      Cannot find device "fake1"
+      Cannot find device "fake1"
+      ...
+      Segmentation fault (core dumped)
+
+    Don't ignore errors from the helper routine that parses the nexthop
+    definition, and abort immediately if parsing fails.
+
+    Signed-off-by: Jakub Sitnicki <jkbs@redhat.com>
+---
+ ip/iproute.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/ip/iproute.c b/ip/iproute.c
+index 35fdce8..759032d 100644
+--- a/ip/iproute.c
++++ b/ip/iproute.c
+@@ -817,7 +817,10 @@ static int parse_nexthops(struct nlmsghdr *n, struct rtmsg *r,
+ 		memset(rtnh, 0, sizeof(*rtnh));
+ 		rtnh->rtnh_len = sizeof(*rtnh);
+ 		rta->rta_len += rtnh->rtnh_len;
+-		parse_one_nh(n, r, rta, rtnh, &argc, &argv);
++		if (parse_one_nh(n, r, rta, rtnh, &argc, &argv)) {
++			fprintf(stderr, "Error: cannot parse nexthop\n");
++			exit(-1);
++		}
+ 		rtnh = RTNH_NEXT(rtnh);
+ 	}
+ 
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0051-ip-route-Fix-segfault-with-many-nexthops.patch b/SOURCES/0051-ip-route-Fix-segfault-with-many-nexthops.patch
new file mode 100644
index 0000000..07109f0
--- /dev/null
+++ b/SOURCES/0051-ip-route-Fix-segfault-with-many-nexthops.patch
@@ -0,0 +1,388 @@
+From 5845a145808162560293cf4f7c55bbb5afc8dce7 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 21 Feb 2019 14:38:57 +0100
+Subject: [PATCH] ip-route: Fix segfault with many nexthops
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1624656
+Upstream Status: iproute2.git commit bd59e5b1517b0
+Conflicts: Context changes due to missing other commits.
+
+commit bd59e5b1517b09b6f26d59f38fe6077d953c2396
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Sep 6 15:31:51 2018 +0200
+
+    ip-route: Fix segfault with many nexthops
+
+    It was possible to crash ip-route by adding an IPv6 route with 37
+    nexthop statements. A simple reproducer is:
+
+    | for i in `seq 37`; do
+    |       nhs="nexthop via 1111::$i "$nhs
+    | done
+    | ip -6 route add 3333::/64 $nhs
+
+    The related code was broken in multiple ways:
+
+    * parse_one_nh() assumed that rta points to 4kB of storage but caller
+      provided just 1kB. Fixed by passing 'len' parameter with the correct
+      value.
+
+    * Error checking of rta_addattr*() calls in parse_one_nh() and called
+      functions was completely absent, so with above fix in place output
+      flood would occur due to parser looping forever.
+
+    While being at it, increase message buffer sizes to 4k. This allows for
+    at most 144 nexthops.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ ip/iproute.c          | 43 +++++++++++++++++++++--------------
+ ip/iproute_lwtunnel.c | 63 ++++++++++++++++++++++++++++++++-------------------
+ 2 files changed, 66 insertions(+), 40 deletions(-)
+
+diff --git a/ip/iproute.c b/ip/iproute.c
+index 759032d..d4db035 100644
+--- a/ip/iproute.c
++++ b/ip/iproute.c
+@@ -721,7 +721,7 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
+ }
+ 
+ static int parse_one_nh(struct nlmsghdr *n, struct rtmsg *r,
+-			struct rtattr *rta, struct rtnexthop *rtnh,
++			struct rtattr *rta, size_t len, struct rtnexthop *rtnh,
+ 			int *argcp, char ***argvp)
+ {
+ 	int argc = *argcp;
+@@ -742,11 +742,16 @@ static int parse_one_nh(struct nlmsghdr *n, struct rtmsg *r,
+ 			if (r->rtm_family == AF_UNSPEC)
+ 				r->rtm_family = addr.family;
+ 			if (addr.family == r->rtm_family) {
+-				rta_addattr_l(rta, 4096, RTA_GATEWAY, &addr.data, addr.bytelen);
+-				rtnh->rtnh_len += sizeof(struct rtattr) + addr.bytelen;
++				if (rta_addattr_l(rta, len, RTA_GATEWAY,
++						  &addr.data, addr.bytelen))
++					return -1;
++				rtnh->rtnh_len += sizeof(struct rtattr)
++						  + addr.bytelen;
+ 			} else {
+-				rta_addattr_l(rta, 4096, RTA_VIA, &addr.family, addr.bytelen+2);
+-				rtnh->rtnh_len += RTA_SPACE(addr.bytelen+2);
++				if (rta_addattr_l(rta, len, RTA_VIA,
++						  &addr.family, addr.bytelen + 2))
++					return -1;
++				rtnh->rtnh_len += RTA_SPACE(addr.bytelen + 2);
+ 			}
+ 		} else if (strcmp(*argv, "dev") == 0) {
+ 			NEXT_ARG();
+@@ -769,13 +774,15 @@ static int parse_one_nh(struct nlmsghdr *n, struct rtmsg *r,
+ 			NEXT_ARG();
+ 			if (get_rt_realms_or_raw(&realm, *argv))
+ 				invarg("\"realm\" value is invalid\n", *argv);
+-			rta_addattr32(rta, 4096, RTA_FLOW, realm);
++			if (rta_addattr32(rta, len, RTA_FLOW, realm))
++				return -1;
+ 			rtnh->rtnh_len += sizeof(struct rtattr) + 4;
+ 		} else if (strcmp(*argv, "encap") == 0) {
+-			int len = rta->rta_len;
++			int old_len = rta->rta_len;
+ 
+-			lwt_parse_encap(rta, 4096, &argc, &argv);
+-			rtnh->rtnh_len += rta->rta_len - len;
++			if (lwt_parse_encap(rta, len, &argc, &argv))
++				return -1;
++			rtnh->rtnh_len += rta->rta_len - old_len;
+ 		} else if (strcmp(*argv, "as") == 0) {
+ 			inet_prefix addr;
+ 
+@@ -783,8 +790,9 @@ static int parse_one_nh(struct nlmsghdr *n, struct rtmsg *r,
+ 			if (strcmp(*argv, "to") == 0)
+ 				NEXT_ARG();
+ 			get_addr(&addr, *argv, r->rtm_family);
+-			rta_addattr_l(rta, 4096, RTA_NEWDST, &addr.data,
+-				      addr.bytelen);
++			if (rta_addattr_l(rta, len, RTA_NEWDST,
++					  &addr.data, addr.bytelen))
++				return -1;
+ 			rtnh->rtnh_len += sizeof(struct rtattr) + addr.bytelen;
+ 		} else
+ 			break;
+@@ -797,7 +805,7 @@ static int parse_one_nh(struct nlmsghdr *n, struct rtmsg *r,
+ static int parse_nexthops(struct nlmsghdr *n, struct rtmsg *r,
+ 			  int argc, char **argv)
+ {
+-	char buf[1024];
++	char buf[4096];
+ 	struct rtattr *rta = (void *)buf;
+ 	struct rtnexthop *rtnh;
+ 
+@@ -817,7 +825,7 @@ static int parse_nexthops(struct nlmsghdr *n, struct rtmsg *r,
+ 		memset(rtnh, 0, sizeof(*rtnh));
+ 		rtnh->rtnh_len = sizeof(*rtnh);
+ 		rta->rta_len += rtnh->rtnh_len;
+-		if (parse_one_nh(n, r, rta, rtnh, &argc, &argv)) {
++		if (parse_one_nh(n, r, rta, 4096, rtnh, &argc, &argv)) {
+ 			fprintf(stderr, "Error: cannot parse nexthop\n");
+ 			exit(-1);
+ 		}
+@@ -825,7 +833,8 @@ static int parse_nexthops(struct nlmsghdr *n, struct rtmsg *r,
+ 	}
+ 
+ 	if (rta->rta_len > RTA_LENGTH(0))
+-		addattr_l(n, 1024, RTA_MULTIPATH, RTA_DATA(rta), RTA_PAYLOAD(rta));
++		return addattr_l(n, 4096, RTA_MULTIPATH,
++				 RTA_DATA(rta), RTA_PAYLOAD(rta));
+ 	return 0;
+ }
+ 
+@@ -834,7 +843,7 @@ static int iproute_modify(int cmd, unsigned int flags, int argc, char **argv)
+ 	struct {
+ 		struct nlmsghdr	n;
+ 		struct rtmsg		r;
+-		char			buf[1024];
++		char			buf[4096];
+ 	} req = {
+ 		.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)),
+ 		.n.nlmsg_flags = NLM_F_REQUEST | flags,
+@@ -1238,8 +1247,8 @@ static int iproute_modify(int cmd, unsigned int flags, int argc, char **argv)
+ 		addattr_l(&req.n, sizeof(req), RTA_METRICS, RTA_DATA(mxrta), RTA_PAYLOAD(mxrta));
+ 	}
+ 
+-	if (nhs_ok)
+-		parse_nexthops(&req.n, &req.r, argc, argv);
++	if (nhs_ok && parse_nexthops(&req.n, &req.r, argc, argv))
++		return -1;
+ 
+ 	if (req.r.rtm_family == AF_UNSPEC)
+ 		req.r.rtm_family = AF_INET;
+diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c
+index 0fa1cab..1a68912 100644
+--- a/ip/iproute_lwtunnel.c
++++ b/ip/iproute_lwtunnel.c
+@@ -255,8 +255,9 @@ static int parse_encap_mpls(struct rtattr *rta, size_t len,
+ 		exit(1);
+ 	}
+ 
+-	rta_addattr_l(rta, len, MPLS_IPTUNNEL_DST, &addr.data,
+-		      addr.bytelen);
++	if (rta_addattr_l(rta, len, MPLS_IPTUNNEL_DST,
++			  &addr.data, addr.bytelen))
++		return -1;
+ 
+ 	*argcp = argc;
+ 	*argvp = argv;
+@@ -270,6 +271,7 @@ static int parse_encap_ip(struct rtattr *rta, size_t len,
+ 	int id_ok = 0, dst_ok = 0, tos_ok = 0, ttl_ok = 0;
+ 	char **argv = *argvp;
+ 	int argc = *argcp;
++	int ret = 0;
+ 
+ 	while (argc > 0) {
+ 		if (strcmp(*argv, "id") == 0) {
+@@ -280,7 +282,7 @@ static int parse_encap_ip(struct rtattr *rta, size_t len,
+ 				duparg2("id", *argv);
+ 			if (get_be64(&id, *argv, 0))
+ 				invarg("\"id\" value is invalid\n", *argv);
+-			rta_addattr64(rta, len, LWTUNNEL_IP_ID, id);
++			ret = rta_addattr64(rta, len, LWTUNNEL_IP_ID, id);
+ 		} else if (strcmp(*argv, "dst") == 0) {
+ 			inet_prefix addr;
+ 
+@@ -288,8 +290,8 @@ static int parse_encap_ip(struct rtattr *rta, size_t len,
+ 			if (dst_ok++)
+ 				duparg2("dst", *argv);
+ 			get_addr(&addr, *argv, AF_INET);
+-			rta_addattr_l(rta, len, LWTUNNEL_IP_DST,
+-				      &addr.data, addr.bytelen);
++			ret = rta_addattr_l(rta, len, LWTUNNEL_IP_DST,
++					    &addr.data, addr.bytelen);
+ 		} else if (strcmp(*argv, "tos") == 0) {
+ 			__u32 tos;
+ 
+@@ -298,7 +300,7 @@ static int parse_encap_ip(struct rtattr *rta, size_t len,
+ 				duparg2("tos", *argv);
+ 			if (rtnl_dsfield_a2n(&tos, *argv))
+ 				invarg("\"tos\" value is invalid\n", *argv);
+-			rta_addattr8(rta, len, LWTUNNEL_IP_TOS, tos);
++			ret = rta_addattr8(rta, len, LWTUNNEL_IP_TOS, tos);
+ 		} else if (strcmp(*argv, "ttl") == 0) {
+ 			__u8 ttl;
+ 
+@@ -307,10 +309,12 @@ static int parse_encap_ip(struct rtattr *rta, size_t len,
+ 				duparg2("ttl", *argv);
+ 			if (get_u8(&ttl, *argv, 0))
+ 				invarg("\"ttl\" value is invalid\n", *argv);
+-			rta_addattr8(rta, len, LWTUNNEL_IP_TTL, ttl);
++			ret = rta_addattr8(rta, len, LWTUNNEL_IP_TTL, ttl);
+ 		} else {
+ 			break;
+ 		}
++		if (ret)
++			break;
+ 		argc--; argv++;
+ 	}
+ 
+@@ -321,7 +325,7 @@ static int parse_encap_ip(struct rtattr *rta, size_t len,
+ 	*argcp = argc + 1;
+ 	*argvp = argv - 1;
+ 
+-	return 0;
++	return ret;
+ }
+ 
+ static int parse_encap_ila(struct rtattr *rta, size_t len,
+@@ -330,6 +334,7 @@ static int parse_encap_ila(struct rtattr *rta, size_t len,
+ 	__u64 locator;
+ 	int argc = *argcp;
+ 	char **argv = *argvp;
++	int ret = 0;
+ 
+ 	if (get_addr64(&locator, *argv) < 0) {
+ 		fprintf(stderr, "Bad locator: %s\n", *argv);
+@@ -338,7 +343,8 @@ static int parse_encap_ila(struct rtattr *rta, size_t len,
+ 
+ 	argc--; argv++;
+ 
+-	rta_addattr64(rta, 1024, ILA_ATTR_LOCATOR, locator);
++	if (rta_addattr64(rta, 1024, ILA_ATTR_LOCATOR, locator))
++		return -1;
+ 
+ 	while (argc > 0) {
+ 		if (strcmp(*argv, "csum-mode") == 0) {
+@@ -351,12 +357,15 @@ static int parse_encap_ila(struct rtattr *rta, size_t len,
+ 				invarg("\"csum-mode\" value is invalid\n",
+ 				       *argv);
+ 
+-			rta_addattr8(rta, 1024, ILA_ATTR_CSUM_MODE, csum_mode);
++			ret = rta_addattr8(rta, 1024, ILA_ATTR_CSUM_MODE,
++					   (__u8)csum_mode);
+ 
+ 			argc--; argv++;
+ 		} else {
+ 			break;
+ 		}
++		if (ret)
++			break;
+ 	}
+ 
+ 	/* argv is currently the first unparsed argument,
+@@ -366,7 +375,7 @@ static int parse_encap_ila(struct rtattr *rta, size_t len,
+ 	*argcp = argc + 1;
+ 	*argvp = argv - 1;
+ 
+-	return 0;
++	return ret;
+ }
+ 
+ static int parse_encap_ip6(struct rtattr *rta, size_t len,
+@@ -375,6 +384,7 @@ static int parse_encap_ip6(struct rtattr *rta, size_t len,
+ 	int id_ok = 0, dst_ok = 0, tos_ok = 0, ttl_ok = 0;
+ 	char **argv = *argvp;
+ 	int argc = *argcp;
++	int ret = 0;
+ 
+ 	while (argc > 0) {
+ 		if (strcmp(*argv, "id") == 0) {
+@@ -385,7 +395,7 @@ static int parse_encap_ip6(struct rtattr *rta, size_t len,
+ 				duparg2("id", *argv);
+ 			if (get_be64(&id, *argv, 0))
+ 				invarg("\"id\" value is invalid\n", *argv);
+-			rta_addattr64(rta, len, LWTUNNEL_IP6_ID, id);
++			ret = rta_addattr64(rta, len, LWTUNNEL_IP6_ID, id);
+ 		} else if (strcmp(*argv, "dst") == 0) {
+ 			inet_prefix addr;
+ 
+@@ -393,8 +403,8 @@ static int parse_encap_ip6(struct rtattr *rta, size_t len,
+ 			if (dst_ok++)
+ 				duparg2("dst", *argv);
+ 			get_addr(&addr, *argv, AF_INET6);
+-			rta_addattr_l(rta, len, LWTUNNEL_IP6_DST,
+-				      &addr.data, addr.bytelen);
++			ret = rta_addattr_l(rta, len, LWTUNNEL_IP6_DST,
++					    &addr.data, addr.bytelen);
+ 		} else if (strcmp(*argv, "tc") == 0) {
+ 			__u32 tc;
+ 
+@@ -403,7 +413,7 @@ static int parse_encap_ip6(struct rtattr *rta, size_t len,
+ 				duparg2("tc", *argv);
+ 			if (rtnl_dsfield_a2n(&tc, *argv))
+ 				invarg("\"tc\" value is invalid\n", *argv);
+-			rta_addattr8(rta, len, LWTUNNEL_IP6_TC, tc);
++			ret = rta_addattr8(rta, len, LWTUNNEL_IP6_TC, tc);
+ 		} else if (strcmp(*argv, "hoplimit") == 0) {
+ 			__u8 hoplimit;
+ 
+@@ -413,10 +423,13 @@ static int parse_encap_ip6(struct rtattr *rta, size_t len,
+ 			if (get_u8(&hoplimit, *argv, 0))
+ 				invarg("\"hoplimit\" value is invalid\n",
+ 				       *argv);
+-			rta_addattr8(rta, len, LWTUNNEL_IP6_HOPLIMIT, hoplimit);
++			ret = rta_addattr8(rta, len, LWTUNNEL_IP6_HOPLIMIT,
++					   hoplimit);
+ 		} else {
+ 			break;
+ 		}
++		if (ret)
++			break;
+ 		argc--; argv++;
+ 	}
+ 
+@@ -427,7 +440,7 @@ static int parse_encap_ip6(struct rtattr *rta, size_t len,
+ 	*argcp = argc + 1;
+ 	*argvp = argv - 1;
+ 
+-	return 0;
++	return ret;
+ }
+ 
+ struct lwt_x {
+@@ -542,6 +555,7 @@ int lwt_parse_encap(struct rtattr *rta, size_t len, int *argcp, char ***argvp)
+ 	int argc = *argcp;
+ 	char **argv = *argvp;
+ 	__u16 type;
++	int ret = 0;
+ 
+ 	NEXT_ARG();
+ 	type = read_encap_type(*argv);
+@@ -558,16 +572,16 @@ int lwt_parse_encap(struct rtattr *rta, size_t len, int *argcp, char ***argvp)
+ 	nest = rta_nest(rta, 1024, RTA_ENCAP);
+ 	switch (type) {
+ 	case LWTUNNEL_ENCAP_MPLS:
+-		parse_encap_mpls(rta, len, &argc, &argv);
++		ret = parse_encap_mpls(rta, len, &argc, &argv);
+ 		break;
+ 	case LWTUNNEL_ENCAP_IP:
+-		parse_encap_ip(rta, len, &argc, &argv);
++		ret = parse_encap_ip(rta, len, &argc, &argv);
+ 		break;
+ 	case LWTUNNEL_ENCAP_ILA:
+-		parse_encap_ila(rta, len, &argc, &argv);
++		ret = parse_encap_ila(rta, len, &argc, &argv);
+ 		break;
+ 	case LWTUNNEL_ENCAP_IP6:
+-		parse_encap_ip6(rta, len, &argc, &argv);
++		ret = parse_encap_ip6(rta, len, &argc, &argv);
+ 		break;
+ 	case LWTUNNEL_ENCAP_BPF:
+ 		if (parse_encap_bpf(rta, len, &argc, &argv) < 0)
+@@ -577,12 +591,15 @@ int lwt_parse_encap(struct rtattr *rta, size_t len, int *argcp, char ***argvp)
+ 		fprintf(stderr, "Error: unsupported encap type\n");
+ 		break;
+ 	}
++	if (ret)
++		return ret;
++
+ 	rta_nest_end(rta, nest);
+ 
+-	rta_addattr16(rta, 1024, RTA_ENCAP_TYPE, type);
++	ret = rta_addattr16(rta, 1024, RTA_ENCAP_TYPE, type);
+ 
+ 	*argcp = argc;
+ 	*argvp = argv;
+ 
+-	return 0;
++	return ret;
+ }
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0052-man-ip-route.8-Document-nexthop-limit.patch b/SOURCES/0052-man-ip-route.8-Document-nexthop-limit.patch
new file mode 100644
index 0000000..cc483b9
--- /dev/null
+++ b/SOURCES/0052-man-ip-route.8-Document-nexthop-limit.patch
@@ -0,0 +1,46 @@
+From d511d7e60866060e260ec3f96b51a61c98c2c06f Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 21 Feb 2019 14:39:46 +0100
+Subject: [PATCH] man: ip-route.8: Document nexthop limit
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1624656
+Upstream Status: iproute2.git commit 6cd959bb125c5
+
+commit 6cd959bb125c50a04ab6671645fa38c5b07426f4
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Tue Nov 13 16:55:13 2018 +0100
+
+    man: ip-route.8: Document nexthop limit
+
+    Add a note to 'nexthop' description stating the maximum number of
+    nexthops per command and pointing at 'append' command as a workaround.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ man/man8/ip-route.8.in | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/man/man8/ip-route.8.in b/man/man8/ip-route.8.in
+index d6e0664..d9a5477 100644
+--- a/man/man8/ip-route.8.in
++++ b/man/man8/ip-route.8.in
+@@ -548,6 +548,15 @@ argument lists:
+ route reflecting its relative bandwidth or quality.
+ .in -8
+ 
++The internal buffer used in iproute2 limits the maximum number of nexthops that
++may be specified in one go. If only
++.I ADDRESS
++is given, the current buffer size allows for 144 IPv6 nexthops and 253 IPv4
++ones. For IPv4, this effectively limits the number of nexthops possible per
++route. With IPv6, further nexthops may be appended to the same route via
++.B "ip route append"
++command.
++
+ .TP
+ .BI scope " SCOPE_VAL"
+ the scope of the destinations covered by the route prefix.
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0053-ip-route-Fix-nexthop-encap-parsing.patch b/SOURCES/0053-ip-route-Fix-nexthop-encap-parsing.patch
new file mode 100644
index 0000000..ff535eb
--- /dev/null
+++ b/SOURCES/0053-ip-route-Fix-nexthop-encap-parsing.patch
@@ -0,0 +1,85 @@
+From b83b0767eccfb386406ccb24130b975f1c2b0ee4 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 21 Feb 2019 14:39:47 +0100
+Subject: [PATCH] ip-route: Fix nexthop encap parsing
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1624656
+Upstream Status: iproute2.git commit 05d978e0850a6
+Conflicts: Some chunks dropped due to missing support for
+           ident-type and hook-type.
+
+commit 05d978e0850a6a3bae1e6c5392d82f7b1496f86a
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Tue Nov 13 13:39:04 2018 +0100
+
+    ip-route: Fix nexthop encap parsing
+
+    When parsing nexthop parameters, a buffer of 4k bytes is provided. Yet,
+    in lwt_parse_encap() and some functions called by it, buffer size was
+    assumed to be 1k despite the actual size was provided. This led to
+    spurious buffer size errors if the buffer was filled by previous nexthop
+    parameters to exceed that 1k boundary.
+
+    Fixes: 1e5293056a02c ("lwtunnel: Add encapsulation support to ip route")
+    Fixes: 5866bddd9aa9e ("ila: Add support for ILA lwtunnels")
+    Fixes: ed67f83806538 ("ila: Support for checksum neutral translation")
+    Fixes: 86905c8f057c0 ("ila: support for configuring identifier and hook types")
+    Fixes: b15f440e78373 ("lwt: BPF support for LWT")
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ ip/iproute_lwtunnel.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c
+index 1a68912..b6f08f0 100644
+--- a/ip/iproute_lwtunnel.c
++++ b/ip/iproute_lwtunnel.c
+@@ -343,7 +343,7 @@ static int parse_encap_ila(struct rtattr *rta, size_t len,
+ 
+ 	argc--; argv++;
+ 
+-	if (rta_addattr64(rta, 1024, ILA_ATTR_LOCATOR, locator))
++	if (rta_addattr64(rta, len, ILA_ATTR_LOCATOR, locator))
+ 		return -1;
+ 
+ 	while (argc > 0) {
+@@ -357,7 +357,7 @@ static int parse_encap_ila(struct rtattr *rta, size_t len,
+ 				invarg("\"csum-mode\" value is invalid\n",
+ 				       *argv);
+ 
+-			ret = rta_addattr8(rta, 1024, ILA_ATTR_CSUM_MODE,
++			ret = rta_addattr8(rta, len, ILA_ATTR_CSUM_MODE,
+ 					   (__u8)csum_mode);
+ 
+ 			argc--; argv++;
+@@ -528,7 +528,7 @@ static int parse_encap_bpf(struct rtattr *rta, size_t len, int *argcp,
+ 			if (get_unsigned(&headroom, *argv, 0) || headroom == 0)
+ 				invarg("headroom is invalid\n", *argv);
+ 			if (!headroom_set)
+-				rta_addattr32(rta, 1024, LWT_BPF_XMIT_HEADROOM,
++				rta_addattr32(rta, len, LWT_BPF_XMIT_HEADROOM,
+ 					      headroom);
+ 			headroom_set = 1;
+ 		} else if (strcmp(*argv, "help") == 0) {
+@@ -569,7 +569,7 @@ int lwt_parse_encap(struct rtattr *rta, size_t len, int *argcp, char ***argvp)
+ 		exit(-1);
+ 	}
+ 
+-	nest = rta_nest(rta, 1024, RTA_ENCAP);
++	nest = rta_nest(rta, len, RTA_ENCAP);
+ 	switch (type) {
+ 	case LWTUNNEL_ENCAP_MPLS:
+ 		ret = parse_encap_mpls(rta, len, &argc, &argv);
+@@ -596,7 +596,7 @@ int lwt_parse_encap(struct rtattr *rta, size_t len, int *argcp, char ***argvp)
+ 
+ 	rta_nest_end(rta, nest);
+ 
+-	ret = rta_addattr16(rta, 1024, RTA_ENCAP_TYPE, type);
++	ret = rta_addattr16(rta, len, RTA_ENCAP_TYPE, type);
+ 
+ 	*argcp = argc;
+ 	*argvp = argv;
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0054-ip-link-Fix-listing-of-alias-interfaces.patch b/SOURCES/0054-ip-link-Fix-listing-of-alias-interfaces.patch
new file mode 100644
index 0000000..534b391
--- /dev/null
+++ b/SOURCES/0054-ip-link-Fix-listing-of-alias-interfaces.patch
@@ -0,0 +1,57 @@
+From eb3be709aece2325f7eafc113120cf5ef8f077de Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Mon, 11 Mar 2019 16:28:41 +0100
+Subject: [PATCH] ip-link: Fix listing of alias interfaces
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1673226
+Upstream Status: RHEL-only
+Conflicts: Context change due to missing commit 260137e24d3b7
+           ("iplink: Remove flags argument from iplink_get")
+
+Upstream rejected this patch as the alias notation is neither required
+nor wanted by iproute2[1]. With iproute rebase in RHEL7.5 though, we
+changed existing behaviour by accident. Therefore we will carry this
+patch for RHEL7 lifetime.
+
+[1] https://marc.info/?l=linux-netdev&m=154964861913609&w=2
+
+commit a1259acb3c2037f464e31fad1f21556f8bf58c91
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Feb 7 10:18:16 2019 +0100
+
+    ip-link: Fix listing of alias interfaces
+
+    Commit 50b9950dd9011 ("link dump filter") accidentally broke listing of
+    links in the old alias interface notation:
+
+    | % ip link show eth0:1
+    | RTNETLINK answers: No such device
+    | Cannot send link get request: No such device
+
+    Prior to the above commit, link lookup was performed via ifindex
+    returned by if_nametoindex(). The latter uses SIOCGIFINDEX ioctl call
+    which on kernel side causes the colon-suffix to be dropped before doing
+    the interface lookup. Netlink API though doesn't care about that at all.
+    To keep things backward compatible, mimick ioctl API behaviour and drop
+    the colon-suffix prior to sending the RTM_GETLINK request.
+
+    Fixes: 50b9950dd9011 ("link dump filter")
+---
+ ip/ipaddress.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/ip/ipaddress.c b/ip/ipaddress.c
+index 7492075..14e9e22 100644
+--- a/ip/ipaddress.c
++++ b/ip/ipaddress.c
+@@ -1707,6 +1707,7 @@ static int ipaddr_list_flush_or_save(int argc, char **argv, int action)
+ 	 * the link device
+ 	 */
+ 	if (filter_dev && filter.group == -1 && do_link == 1) {
++		*strchrnul(filter_dev, ':') = '\0';
+ 		if (iplink_get(0, filter_dev, RTEXT_FILTER_VF) < 0) {
+ 			perror("Cannot send link get request");
+ 			exit(1);
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0055-ip-Add-violation-counters-to-VF-statisctics.patch b/SOURCES/0055-ip-Add-violation-counters-to-VF-statisctics.patch
new file mode 100644
index 0000000..72fd54f
--- /dev/null
+++ b/SOURCES/0055-ip-Add-violation-counters-to-VF-statisctics.patch
@@ -0,0 +1,78 @@
+From 1e22b512374d25b547212bdbe1530ac8de1defdf Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 18 Mar 2019 11:23:40 +0100
+Subject: [PATCH] ip: Add violation counters to VF statisctics
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1471680
+Upstream Status: unknown commit 8c7acf3a
+Conflicts: manually applied due to JSON support
+
+commit 8c7acf3a7ac265badc287f064614d60119a8072d
+Author: Eran Ben Elisha <eranbe@mellanox.com>
+Date:   Sun Jul 22 13:31:12 2018 +0300
+
+    ip: Add violation counters to VF statisctics
+
+    Extend VFs statistics by receive and transmit violation counters.
+
+    Example: "ip -s link show dev enp5s0f0"
+
+    6: enp5s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
+        link/ether 24:8a:07:a5:28:f0 brd ff:ff:ff:ff:ff:ff
+        RX: bytes  packets  errors  dropped overrun mcast
+        0          0        0       0       0       2
+        TX: bytes  packets  errors  dropped carrier collsns
+        1406       17       0       0       0       0
+        vf 0 MAC 00:00:ca:fe:ca:fe, vlan 5, spoof checking off, link-state auto, trust off, query_rss off
+        RX: bytes  packets  mcast   bcast   dropped
+        1666       29       14         32      0
+        TX: bytes  packets   dropped
+        2880       44       2412
+
+    Signed-off-by: Eran Ben Elisha <eranbe@mellanox.com>
+    Signed-off-by: David Ahern <dsahern@gmail.com>
+---
+ ip/ipaddress.c | 14 ++++++++++++--
+ 1 file changed, 12 insertions(+), 2 deletions(-)
+
+diff --git a/ip/ipaddress.c b/ip/ipaddress.c
+index 14e9e22..44111a2 100644
+--- a/ip/ipaddress.c
++++ b/ip/ipaddress.c
+@@ -471,21 +471,31 @@ static void print_vf_stats64(FILE *fp, struct rtattr *vfstats)
+ 
+ 	/* RX stats */
+ 	fprintf(fp, "%s", _SL_);
+-	fprintf(fp, "    RX: bytes  packets  mcast   bcast %s", _SL_);
++	fprintf(fp, "    RX: bytes  packets  mcast   bcast ");
++	if (vf[IFLA_VF_STATS_RX_DROPPED])
++		fprintf(fp, "  dropped ");
++	fprintf(fp, "%s", _SL_);
+ 	fprintf(fp, "    ");
+ 
+ 	print_num(fp, 10,  rta_getattr_u64(vf[IFLA_VF_STATS_RX_BYTES]));
+ 	print_num(fp, 8, rta_getattr_u64(vf[IFLA_VF_STATS_RX_PACKETS]));
+ 	print_num(fp, 7, rta_getattr_u64(vf[IFLA_VF_STATS_MULTICAST]));
+ 	print_num(fp, 7, rta_getattr_u64(vf[IFLA_VF_STATS_BROADCAST]));
++	if (vf[IFLA_VF_STATS_RX_DROPPED])
++		print_num(fp, 8, rta_getattr_u64(vf[IFLA_VF_STATS_RX_DROPPED]));
+ 
+ 	/* TX stats */
+ 	fprintf(fp, "%s", _SL_);
+-	fprintf(fp, "    TX: bytes  packets %s", _SL_);
++	fprintf(fp, "    TX: bytes  packets ");
++	if (vf[IFLA_VF_STATS_TX_DROPPED])
++		fprintf(fp, "  dropped ");
++	fprintf(fp, "%s", _SL_);
+ 	fprintf(fp, "    ");
+ 
+ 	print_num(fp, 10, rta_getattr_u64(vf[IFLA_VF_STATS_TX_BYTES]));
+ 	print_num(fp, 8, rta_getattr_u64(vf[IFLA_VF_STATS_TX_PACKETS]));
++	if (vf[IFLA_VF_STATS_TX_DROPPED])
++		print_num(fp, 8, rta_getattr_u64(vf[IFLA_VF_STATS_TX_DROPPED]));
+ }
+ 
+ static void print_link_stats64(FILE *fp, const struct rtnl_link_stats64 *s,
+-- 
+2.20.1
+
diff --git a/SOURCES/0056-devlink-Add-support-for-devlink-resource-abstraction.patch b/SOURCES/0056-devlink-Add-support-for-devlink-resource-abstraction.patch
new file mode 100644
index 0000000..7f3c3c4
--- /dev/null
+++ b/SOURCES/0056-devlink-Add-support-for-devlink-resource-abstraction.patch
@@ -0,0 +1,633 @@
+From 5190aa430d198420679e53163604f7b6860bcd0f Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 25 Mar 2019 11:40:10 +0100
+Subject: [PATCH] devlink: Add support for devlink resource abstraction
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1644731
+Upstream Status: iproute2.git commit 8cd644095842a
+Conflicts: adjusted help printout due to missing commit
+           3e897912cbff9 ("devlink: add batch command support")
+
+commit 8cd644095842af3107320e86eeb01be6af6c77bb
+Author: Arkadi Sharshevsky <arkadis@mellanox.com>
+Date:   Wed Feb 14 10:55:18 2018 +0200
+
+    devlink: Add support for devlink resource abstraction
+
+    Add support for devlink resource abstraction. The resources are
+    represented by a tree based structure and are identified by a name and
+    a size. Some resources can present their real time occupancy.
+
+    First the resources exposed by the driver can be observed, for example:
+
+    $devlink resource show pci/0000:03:00.0
+    pci/0000:03:00.0:
+      name kvd size 245760 unit entry
+        resources:
+          name linear size 98304 occ 0 unit entry size_min 0 size_max 147456 size_gran 128
+          name hash_double size 60416 unit entry size_min 32768 size_max 180224 size_gran 128
+          name hash_single size 87040 unit entry size_min 65536 size_max 212992 size_gran 128
+
+    Some resource's size can be changed. Examples:
+
+    $devlink resource set pci/0000:03:00.0 path /kvd/hash_single size 73088
+    $devlink resource set pci/0000:03:00.0 path /kvd/hash_double size 74368
+
+    The changes do not apply immediately, this can be validate by the 'size_new'
+    attribute, which represents the pending changed size. For example
+
+    $devlink resource show pci/0000:03:00.0
+    pci/0000:03:00.0:
+      name kvd size 245760 unit entry size_valid false
+      resources:
+        name linear size 98304 size_new 147456 occ 0 unit entry size_min 0 size_max 147456 size_gran 128
+        name hash_double size 60416 unit entry size_min 32768 size_max 180224 size_gran 128
+        name hash_single size 87040 unit entry size_min 65536 size_max 212992 size_gran 128
+
+    In case of a pending change the nested resources present an indication
+    for a valid configuration of its children (sum of its children sizes
+    doesn't exceed the parent's size).
+
+    In order for the changes to take place hot reload is needed. The hot
+    reload through devlink will be introduced in the following patch.
+
+    Signed-off-by: Arkadi Sharshevsky <arkadis@mellanox.com>
+    Acked-by: Jiri Pirko <jiri@mellanox.com>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ devlink/devlink.c | 490 +++++++++++++++++++++++++++++++++++++++++++++-
+ include/list.h    |   5 +
+ 2 files changed, 494 insertions(+), 1 deletion(-)
+
+diff --git a/devlink/devlink.c b/devlink/devlink.c
+index f9bc16c350c40..7f47b79450094 100644
+--- a/devlink/devlink.c
++++ b/devlink/devlink.c
+@@ -177,6 +177,8 @@ static void ifname_map_free(struct ifname_map *ifname_map)
+ #define DL_OPT_DPIPE_TABLE_NAME	BIT(13)
+ #define DL_OPT_DPIPE_TABLE_COUNTERS	BIT(14)
+ #define DL_OPT_ESWITCH_ENCAP_MODE	BIT(15)
++#define DL_OPT_RESOURCE_PATH	BIT(16)
++#define DL_OPT_RESOURCE_SIZE	BIT(17)
+ 
+ struct dl_opts {
+ 	uint32_t present; /* flags of present items */
+@@ -197,6 +199,10 @@ struct dl_opts {
+ 	const char *dpipe_table_name;
+ 	bool dpipe_counters_enable;
+ 	bool eswitch_encap_mode;
++	const char *resource_path;
++	uint32_t resource_size;
++	uint32_t resource_id;
++	bool resource_id_valid;
+ };
+ 
+ struct dl {
+@@ -937,6 +943,20 @@ static int dl_argv_parse(struct dl *dl, uint32_t o_required,
+ 			if (err)
+ 				return err;
+ 			o_found |= DL_OPT_ESWITCH_ENCAP_MODE;
++		} else if (dl_argv_match(dl, "path") &&
++			   (o_all & DL_OPT_RESOURCE_PATH)) {
++			dl_arg_inc(dl);
++			err = dl_argv_str(dl, &opts->resource_path);
++			if (err)
++				return err;
++			o_found |= DL_OPT_RESOURCE_PATH;
++		} else if (dl_argv_match(dl, "size") &&
++			   (o_all & DL_OPT_RESOURCE_SIZE)) {
++			dl_arg_inc(dl);
++			err = dl_argv_uint32_t(dl, &opts->resource_size);
++			if (err)
++				return err;
++			o_found |= DL_OPT_RESOURCE_SIZE;
+ 		} else {
+ 			pr_err("Unknown option \"%s\"\n", dl_argv(dl));
+ 			return -EINVAL;
+@@ -1079,6 +1099,12 @@ static void dl_opts_put(struct nlmsghdr *nlh, struct dl *dl)
+ 	if (opts->present & DL_OPT_ESWITCH_ENCAP_MODE)
+ 		mnl_attr_put_u8(nlh, DEVLINK_ATTR_ESWITCH_ENCAP_MODE,
+ 				opts->eswitch_encap_mode);
++	if ((opts->present & DL_OPT_RESOURCE_PATH) && opts->resource_id_valid)
++		mnl_attr_put_u64(nlh, DEVLINK_ATTR_RESOURCE_ID,
++				 opts->resource_id);
++	if (opts->present & DL_OPT_RESOURCE_SIZE)
++		mnl_attr_put_u64(nlh, DEVLINK_ATTR_RESOURCE_SIZE,
++				 opts->resource_size);
+ }
+ 
+ static int dl_argv_parse_put(struct nlmsghdr *nlh, struct dl *dl,
+@@ -2666,6 +2692,91 @@ struct dpipe_header {
+ 	unsigned int fields_count;
+ };
+ 
++struct resource {
++	char *name;
++	uint64_t size;
++	uint64_t size_new;
++	uint64_t size_min;
++	uint64_t size_max;
++	uint64_t size_gran;
++	enum devlink_resource_unit unit;
++	bool size_valid;
++	uint64_t size_occ;
++	bool occ_valid;
++	uint64_t id;
++	struct list_head list;
++	struct list_head resource_list;
++	struct resource *parent;
++};
++
++struct resources {
++	struct list_head resource_list;
++};
++
++struct resource_ctx {
++	struct dl *dl;
++	int err;
++	struct resources *resources;
++	bool print_resources;
++	bool pending_change;
++};
++
++static struct resource *resource_alloc(void)
++{
++	struct resource *resource;
++
++	resource = calloc(1, sizeof(struct resource));
++	if (!resource)
++		return NULL;
++	INIT_LIST_HEAD(&resource->resource_list);
++	return resource;
++}
++
++static void resource_free(struct resource *resource)
++{
++	struct resource *child_resource, *tmp;
++
++	list_for_each_entry_safe(child_resource, tmp, &resource->resource_list,
++				 list) {
++		free(child_resource->name);
++		resource_free(child_resource);
++	}
++	free(resource);
++}
++
++static struct resources *resources_alloc(void)
++{
++	struct resources *resources;
++
++	resources = calloc(1, sizeof(struct resources));
++	if (!resources)
++		return NULL;
++	INIT_LIST_HEAD(&resources->resource_list);
++	return resources;
++}
++
++static void resources_free(struct resources *resources)
++{
++	struct resource *resource, *tmp;
++
++	list_for_each_entry_safe(resource, tmp, &resources->resource_list, list)
++		resource_free(resource);
++}
++
++static int resource_ctx_init(struct resource_ctx *ctx, struct dl *dl)
++{
++	ctx->resources = resources_alloc();
++	if (!ctx->resources)
++		return -ENOMEM;
++	ctx->dl = dl;
++	return 0;
++}
++
++static void resource_ctx_fini(struct resource_ctx *ctx)
++{
++	resources_free(ctx->resources);
++}
++
+ struct dpipe_ctx {
+ 	struct dl *dl;
+ 	int err;
+@@ -3203,6 +3314,66 @@ err_match_show:
+ 	return -EINVAL;
+ }
+ 
++static struct resource *
++resource_find(struct resources *resources, struct resource *resource,
++	      uint64_t resource_id)
++{
++	struct list_head *list_head;
++
++	if (!resource)
++		list_head = &resources->resource_list;
++	else
++		list_head = &resource->resource_list;
++
++	list_for_each_entry(resource, list_head, list) {
++		struct resource *child_resource;
++
++		if (resource->id == resource_id)
++			return resource;
++
++		child_resource = resource_find(resources, resource,
++					       resource_id);
++		if (child_resource)
++			return child_resource;
++	}
++	return NULL;
++}
++
++static void
++resource_path_print(struct dl *dl, struct resources *resources,
++		    uint64_t resource_id)
++{
++	struct resource *resource, *parent_resource;
++	const char del[] = "/";
++	int path_len = 0;
++	char *path;
++
++	resource = resource_find(resources, NULL, resource_id);
++	if (!resource)
++		return;
++
++	for (parent_resource = resource; parent_resource;
++	     parent_resource = parent_resource->parent)
++		path_len += strlen(parent_resource->name) + 1;
++
++	path_len++;
++	path = calloc(1, path_len);
++	if (!path)
++		return;
++
++	path += path_len - 1;
++	for (parent_resource = resource; parent_resource;
++		parent_resource = parent_resource->parent) {
++		path -= strlen(parent_resource->name);
++		memcpy(path, parent_resource->name,
++		       strlen(parent_resource->name));
++		path -= strlen(del);
++		memcpy(path, del, strlen(del));
++	}
++	pr_out_str(dl, "resource_path", path);
++	free(path);
++}
++
+ static int dpipe_table_show(struct dpipe_ctx *ctx, struct nlattr *nl)
+ {
+ 	struct nlattr *nla_table[DEVLINK_ATTR_MAX + 1] = {};
+@@ -3617,10 +3788,324 @@ static int cmd_dpipe(struct dl *dl)
+ 	return -ENOENT;
+ }
+ 
++static int
++resource_parse(struct resource_ctx *ctx, struct resource *resource,
++	       struct nlattr **nla_resource)
++{
++	if (!nla_resource[DEVLINK_ATTR_RESOURCE_NAME] ||
++	    !nla_resource[DEVLINK_ATTR_RESOURCE_SIZE] ||
++	    !nla_resource[DEVLINK_ATTR_RESOURCE_ID] ||
++	    !nla_resource[DEVLINK_ATTR_RESOURCE_UNIT] ||
++	    !nla_resource[DEVLINK_ATTR_RESOURCE_SIZE_MIN] ||
++	    !nla_resource[DEVLINK_ATTR_RESOURCE_SIZE_MAX] ||
++	    !nla_resource[DEVLINK_ATTR_RESOURCE_SIZE_GRAN]) {
++		return -EINVAL;
++	}
++
++	resource->name = strdup(mnl_attr_get_str(nla_resource[DEVLINK_ATTR_RESOURCE_NAME]));
++	resource->size = mnl_attr_get_u64(nla_resource[DEVLINK_ATTR_RESOURCE_SIZE]);
++	resource->id = mnl_attr_get_u64(nla_resource[DEVLINK_ATTR_RESOURCE_ID]);
++	resource->unit = mnl_attr_get_u8(nla_resource[DEVLINK_ATTR_RESOURCE_UNIT]);
++	resource->size_min = mnl_attr_get_u64(nla_resource[DEVLINK_ATTR_RESOURCE_SIZE_MIN]);
++	resource->size_max = mnl_attr_get_u64(nla_resource[DEVLINK_ATTR_RESOURCE_SIZE_MAX]);
++	resource->size_gran = mnl_attr_get_u64(nla_resource[DEVLINK_ATTR_RESOURCE_SIZE_GRAN]);
++
++	if (nla_resource[DEVLINK_ATTR_RESOURCE_SIZE_NEW])
++		resource->size_new = mnl_attr_get_u64(nla_resource[DEVLINK_ATTR_RESOURCE_SIZE_NEW]);
++	else
++		resource->size_new = resource->size;
++
++	if (nla_resource[DEVLINK_ATTR_RESOURCE_OCC]) {
++		resource->size_occ = mnl_attr_get_u64(nla_resource[DEVLINK_ATTR_RESOURCE_OCC]);
++		resource->occ_valid = true;
++	}
++
++	if (resource->size_new != resource->size)
++		ctx->pending_change = true;
++
++	return 0;
++}
++
++static int
++resource_get(struct resource_ctx *ctx, struct resource *resource,
++	     struct resource *parent_resource, struct nlattr *nl)
++{
++	struct nlattr *nla_resource[DEVLINK_ATTR_MAX + 1] = {};
++	struct nlattr *nla_child_resource;
++	struct nlattr *nla_resources;
++	bool top = false;
++	int err;
++
++	if (!resource) {
++		nla_resources = nl;
++		top = true;
++		goto out;
++	}
++
++	err = mnl_attr_parse_nested(nl, attr_cb, nla_resource);
++	if (err != MNL_CB_OK)
++		return -EINVAL;
++
++	err = resource_parse(ctx, resource, nla_resource);
++	if (err)
++		return err;
++
++	resource->parent = parent_resource;
++	if (!nla_resource[DEVLINK_ATTR_RESOURCE_LIST])
++		return 0;
++
++	resource->size_valid = !!mnl_attr_get_u8(nla_resource[DEVLINK_ATTR_RESOURCE_SIZE_VALID]);
++	nla_resources = nla_resource[DEVLINK_ATTR_RESOURCE_LIST];
++out:
++	mnl_attr_for_each_nested(nla_child_resource, nla_resources) {
++		struct resource *child_resource;
++		struct list_head *list;
++
++		child_resource = resource_alloc();
++		if (!child_resource)
++			return -ENOMEM;
++
++		if (top)
++			list = &ctx->resources->resource_list;
++		else
++			list = &resource->resource_list;
++
++		list_add_tail(&child_resource->list, list);
++		err = resource_get(ctx, child_resource, resource,
++				   nla_child_resource);
++		if (err)
++			return err;
++	}
++
++	return 0;
++}
++
++static const char *resource_unit_str_get(enum devlink_resource_unit unit)
++{
++	switch (unit) {
++	case DEVLINK_RESOURCE_UNIT_ENTRY: return "entry";
++	default: return "<unknown unit>";
++	}
++}
++
++static void resource_show(struct resource *resource,
++			  struct resource_ctx *ctx)
++{
++	struct resource *child_resource;
++	struct dl *dl = ctx->dl;
++
++	pr_out_str(dl, "name", resource->name);
++	if (dl->verbose)
++		resource_path_print(dl, ctx->resources, resource->id);
++	pr_out_uint(dl, "size", resource->size);
++	if (resource->size != resource->size_new)
++		pr_out_uint(dl, "size_new", resource->size_new);
++	if (resource->occ_valid)
++		pr_out_uint(dl, "occ", resource->size_occ);
++	pr_out_str(dl, "unit", resource_unit_str_get(resource->unit));
++
++	if (resource->size_min != resource->size_max) {
++		pr_out_uint(dl, "size_min", resource->size_min);
++		pr_out_uint(dl, "size_max", resource->size_max);
++		pr_out_uint(dl, "size_gran", resource->size_gran);
++	}
++
++	if (list_empty(&resource->resource_list))
++		return;
++
++	if (ctx->pending_change)
++		pr_out_str(dl, "size_valid", resource->size_valid ?
++			   "true" : "false");
++	pr_out_array_start(dl, "resources");
++	list_for_each_entry(child_resource, &resource->resource_list, list) {
++		pr_out_entry_start(dl);
++		resource_show(child_resource, ctx);
++		pr_out_entry_end(dl);
++	}
++	pr_out_array_end(dl);
++}
++
++static void
++resources_show(struct resource_ctx *ctx, struct nlattr **tb)
++{
++	struct resources *resources = ctx->resources;
++	struct resource *resource;
++
++	list_for_each_entry(resource, &resources->resource_list, list) {
++		pr_out_handle_start_arr(ctx->dl, tb);
++		resource_show(resource, ctx);
++		pr_out_handle_end(ctx->dl);
++	}
++}
++
++static int resources_get(struct resource_ctx *ctx, struct nlattr **tb)
++{
++	return resource_get(ctx, NULL, NULL, tb[DEVLINK_ATTR_RESOURCE_LIST]);
++}
++
++static int cmd_resource_dump_cb(const struct nlmsghdr *nlh, void *data)
++{
++	struct resource_ctx *ctx = data;
++	struct nlattr *tb[DEVLINK_ATTR_MAX + 1] = {};
++	struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
++	int err;
++
++	mnl_attr_parse(nlh, sizeof(*genl), attr_cb, tb);
++	if (!tb[DEVLINK_ATTR_BUS_NAME] || !tb[DEVLINK_ATTR_DEV_NAME] ||
++	    !tb[DEVLINK_ATTR_RESOURCE_LIST])
++		return MNL_CB_ERROR;
++
++	err = resources_get(ctx, tb);
++	if (err) {
++		ctx->err = err;
++		return MNL_CB_ERROR;
++	}
++
++	if (ctx->print_resources)
++		resources_show(ctx, tb);
++
++	return MNL_CB_OK;
++}
++
++static int cmd_resource_show(struct dl *dl)
++{
++	struct nlmsghdr *nlh;
++	struct resource_ctx ctx = {};
++	int err;
++
++	nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_RESOURCE_DUMP,
++			       NLM_F_REQUEST | NLM_F_ACK);
++
++	err = dl_argv_parse_put(nlh, dl, DL_OPT_HANDLE, 0);
++	if (err)
++		return err;
++
++	err = resource_ctx_init(&ctx, dl);
++	if (err)
++		return err;
++
++	ctx.print_resources = true;
++	pr_out_section_start(dl, "resources");
++	err = _mnlg_socket_sndrcv(dl->nlg, nlh, cmd_resource_dump_cb, &ctx);
++	pr_out_section_end(dl);
++	resource_ctx_fini(&ctx);
++	return err;
++}
++
++static void cmd_resource_help(void)
++{
++	pr_err("Usage: devlink resource show DEV\n"
++	       "       devlink resource set DEV path PATH size SIZE\n");
++}
++
++static struct resource *
++resource_find_by_name(struct list_head *list, char *name)
++{
++	struct resource *resource;
++
++	list_for_each_entry(resource, list, list) {
++		if (!strcmp(resource->name, name))
++			return resource;
++	}
++	return NULL;
++}
++
++static int
++resource_path_parse(struct resource_ctx *ctx, const char *resource_path,
++		    uint32_t *p_resource_id, bool *p_resource_valid)
++{
++	struct resource *resource;
++	uint32_t resource_id = 0;
++	char *resource_path_dup;
++	struct list_head *list;
++	const char del[] = "/";
++	char *resource_name;
++
++	resource_path_dup = strdup(resource_path);
++	list = &ctx->resources->resource_list;
++	resource_name = strtok(resource_path_dup, del);
++	while (resource_name != NULL) {
++		resource = resource_find_by_name(list, resource_name);
++		if (!resource)
++			goto err_resource_lookup;
++
++		list = &resource->resource_list;
++		resource_name = strtok(NULL, del);
++		resource_id = resource->id;
++	}
++	free(resource_path_dup);
++	*p_resource_valid = true;
++	*p_resource_id = resource_id;
++	return 0;
++
++err_resource_lookup:
++	free(resource_path_dup);
++	return -EINVAL;
++}
++
++static int cmd_resource_set(struct dl *dl)
++{
++	struct nlmsghdr *nlh;
++	struct resource_ctx ctx = {};
++	int err;
++
++	err = resource_ctx_init(&ctx, dl);
++	if (err)
++		return err;
++
++	ctx.print_resources = false;
++	err = dl_argv_parse(dl, DL_OPT_HANDLE | DL_OPT_RESOURCE_PATH |
++			    DL_OPT_RESOURCE_SIZE, 0);
++	if (err)
++		goto out;
++
++	nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_RESOURCE_DUMP,
++			       NLM_F_REQUEST);
++	dl_opts_put(nlh, dl);
++	err = _mnlg_socket_sndrcv(dl->nlg, nlh, cmd_resource_dump_cb, &ctx);
++	if (err) {
++		pr_err("error getting resources %s\n", strerror(ctx.err));
++		goto out;
++	}
++
++	err = resource_path_parse(&ctx, dl->opts.resource_path,
++				  &dl->opts.resource_id,
++				  &dl->opts.resource_id_valid);
++	if (err) {
++		pr_err("error parsing resource path %s\n", strerror(err));
++		goto out;
++	}
++
++	nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_RESOURCE_SET,
++			       NLM_F_REQUEST | NLM_F_ACK);
++
++	dl_opts_put(nlh, dl);
++	err = _mnlg_socket_sndrcv(dl->nlg, nlh, NULL, NULL);
++out:
++	resource_ctx_fini(&ctx);
++	return err;
++}
++
++static int cmd_resource(struct dl *dl)
++{
++	if (dl_argv_match(dl, "help") || dl_no_arg(dl)) {
++		cmd_resource_help();
++		return 0;
++	} else if (dl_argv_match(dl, "show")) {
++		dl_arg_inc(dl);
++		return cmd_resource_show(dl);
++	} else if (dl_argv_match(dl, "set")) {
++		dl_arg_inc(dl);
++		return cmd_resource_set(dl);
++	}
++	pr_err("Command \"%s\" not found\n", dl_argv(dl));
++	return -ENOENT;
++}
++
+ static void help(void)
+ {
+ 	pr_err("Usage: devlink [ OPTIONS ] OBJECT { COMMAND | help }\n"
+-	       "where  OBJECT := { dev | port | sb | monitor | dpipe }\n"
++	       "where  OBJECT := { dev | port | sb | monitor | dpipe | resource }\n"
+ 	       "       OPTIONS := { -V[ersion] | -n[no-nice-names] | -j[json] | -p[pretty] | -v[verbose] }\n");
+ }
+ 
+@@ -3644,6 +4129,9 @@ static int dl_cmd(struct dl *dl)
+ 	} else if (dl_argv_match(dl, "dpipe")) {
+ 		dl_arg_inc(dl);
+ 		return cmd_dpipe(dl);
++	} else if (dl_argv_match(dl, "resource")) {
++		dl_arg_inc(dl);
++		return cmd_resource(dl);
+ 	}
+ 	pr_err("Object \"%s\" not found\n", dl_argv(dl));
+ 	return -ENOENT;
+diff --git a/include/list.h b/include/list.h
+index 5b529dc6e5211..b2adf55578449 100644
+--- a/include/list.h
++++ b/include/list.h
+@@ -107,6 +107,11 @@ static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
+ 	n->pprev = &h->first;
+ }
+ 
++static inline int list_empty(const struct list_head *head)
++{
++	return head->next == head;
++}
++
+ #define hlist_for_each(pos, head) \
+ 	for (pos = (head)->first; pos ; pos = pos->next)
+ 
+-- 
+2.20.1
+
diff --git a/SOURCES/0057-devlink-Add-support-for-hot-reload.patch b/SOURCES/0057-devlink-Add-support-for-hot-reload.patch
new file mode 100644
index 0000000..9c804b6
--- /dev/null
+++ b/SOURCES/0057-devlink-Add-support-for-hot-reload.patch
@@ -0,0 +1,81 @@
+From ceaa3a5ecffe0c558c990be6c4ba682be5ce85e8 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 25 Mar 2019 11:40:57 +0100
+Subject: [PATCH] devlink: Add support for hot reload
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1644731
+Upstream Status: iproute2.git commit 06dd94f952e50
+
+commit 06dd94f952e50edeffe5ea8b7b95b5cd562b9365
+Author: Arkadi Sharshevsky <arkadis@mellanox.com>
+Date:   Wed Feb 14 10:55:19 2018 +0200
+
+    devlink: Add support for hot reload
+
+    Add support for hot reload. It should be used in order for resource
+    updates to take place.
+
+    Signed-off-by: Arkadi Sharshevsky <arkadis@mellanox.com>
+    Acked-by: Jiri Pirko <jiri@mellanox.com>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ devlink/devlink.c | 29 +++++++++++++++++++++++++++++
+ 1 file changed, 29 insertions(+)
+
+diff --git a/devlink/devlink.c b/devlink/devlink.c
+index 7f47b79450094..fc3939e564bc8 100644
+--- a/devlink/devlink.c
++++ b/devlink/devlink.c
+@@ -1163,6 +1163,7 @@ static void cmd_dev_help(void)
+ 	pr_err("                               [ inline-mode { none | link | network | transport } ]\n");
+ 	pr_err("                               [ encap { disable | enable } ]\n");
+ 	pr_err("       devlink dev eswitch show DEV\n");
++	pr_err("       devlink dev reload DEV\n");
+ }
+ 
+ static bool cmp_arr_last_handle(struct dl *dl, const char *bus_name,
+@@ -1602,6 +1603,31 @@ static int cmd_dev_show(struct dl *dl)
+ 	return err;
+ }
+ 
++static void cmd_dev_reload_help(void)
++{
++	pr_err("Usage: devlink dev reload [ DEV ]\n");
++}
++
++static int cmd_dev_reload(struct dl *dl)
++{
++	struct nlmsghdr *nlh;
++	int err;
++
++	if (dl_argv_match(dl, "help") || dl_no_arg(dl)) {
++		cmd_dev_reload_help();
++		return 0;
++	}
++
++	nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_RELOAD,
++			       NLM_F_REQUEST | NLM_F_ACK);
++
++	err = dl_argv_parse_put(nlh, dl, DL_OPT_HANDLE, 0);
++	if (err)
++		return err;
++
++	return _mnlg_socket_sndrcv(dl->nlg, nlh, NULL, NULL);
++}
++
+ static int cmd_dev(struct dl *dl)
+ {
+ 	if (dl_argv_match(dl, "help")) {
+@@ -1614,6 +1640,9 @@ static int cmd_dev(struct dl *dl)
+ 	} else if (dl_argv_match(dl, "eswitch")) {
+ 		dl_arg_inc(dl);
+ 		return cmd_dev_eswitch(dl);
++	} else if (dl_argv_match(dl, "reload")) {
++		dl_arg_inc(dl);
++		return cmd_dev_reload(dl);
+ 	}
+ 	pr_err("Command \"%s\" not found\n", dl_argv(dl));
+ 	return -ENOENT;
+-- 
+2.20.1
+
diff --git a/SOURCES/0058-devlink-Update-man-pages-and-add-resource-man.patch b/SOURCES/0058-devlink-Update-man-pages-and-add-resource-man.patch
new file mode 100644
index 0000000..4fe2d73
--- /dev/null
+++ b/SOURCES/0058-devlink-Update-man-pages-and-add-resource-man.patch
@@ -0,0 +1,165 @@
+From edf1a3765c440bdd6a15ca7dd4d52a2264a67f69 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 25 Mar 2019 11:40:57 +0100
+Subject: [PATCH] devlink: Update man pages and add resource man
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1644731
+Upstream Status: iproute2.git commit 58b48c5d75e29
+
+commit 58b48c5d75e2960dfcd947975911a170ae765975
+Author: Arkadi Sharshevsky <arkadis@mellanox.com>
+Date:   Wed Feb 14 10:55:22 2018 +0200
+
+    devlink: Update man pages and add resource man
+
+    Add resource man, and update dev manual for reload command.
+
+    Signed-off-by: Arkadi Sharshevsky <arkadis@mellanox.com>
+    Acked-by: Jiri Pirko <jiri@mellanox.com>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ man/man8/devlink-dev.8      | 15 +++++++
+ man/man8/devlink-resource.8 | 78 +++++++++++++++++++++++++++++++++++++
+ man/man8/devlink.8          |  1 +
+ 3 files changed, 94 insertions(+)
+ create mode 100644 man/man8/devlink-resource.8
+
+diff --git a/man/man8/devlink-dev.8 b/man/man8/devlink-dev.8
+index b074d57a19369..7c749ddabaeeb 100644
+--- a/man/man8/devlink-dev.8
++++ b/man/man8/devlink-dev.8
+@@ -42,6 +42,10 @@ devlink-dev \- devlink device configuration
+ .BR "devlink dev eswitch show"
+ .IR DEV
+ 
++.ti -8
++.BR "devlink dev reload"
++.IR DEV
++
+ .SH "DESCRIPTION"
+ .SS devlink dev show - display devlink device attributes
+ 
+@@ -94,6 +98,12 @@ Set eswitch encapsulation support
+ .I enable
+ - Enable encapsulation support
+ 
++.SS devlink dev reload - perform hot reload of the driver.
++
++.PP
++.I "DEV"
++- Specifies the devlink device to reload.
++
+ .SH "EXAMPLES"
+ .PP
+ devlink dev show
+@@ -114,6 +124,11 @@ Shows the eswitch mode of specified devlink device.
+ devlink dev eswitch set pci/0000:01:00.0 mode switchdev
+ .RS 4
+ Sets the eswitch mode of specified devlink device to switchdev.
++.RE
++.PP
++devlink dev reload pci/0000:01:00.0
++.RS 4
++Performs hot reload of specified devlink device.
+ 
+ .SH SEE ALSO
+ .BR devlink (8),
+diff --git a/man/man8/devlink-resource.8 b/man/man8/devlink-resource.8
+new file mode 100644
+index 0000000000000..b8f788060427b
+--- /dev/null
++++ b/man/man8/devlink-resource.8
+@@ -0,0 +1,78 @@
++.TH DEVLINK\-RESOURCE 8 "11 Feb 2018" "iproute2" "Linux"
++.SH NAME
++devlink-resource \- devlink device resource configuration
++.SH SYNOPSIS
++.sp
++.ad l
++.in +8
++.ti -8
++.B devlink
++.RI "[ " OPTIONS " ]"
++.B resource
++.RI  " { " COMMAND " | "
++.BR help " }"
++.sp
++
++.ti -8
++.IR OPTIONS " := { "
++\fB\-v\fR[\fIerbose\fR] }
++
++.ti -8
++.B devlink resource show
++.IR DEV
++
++.ti -8
++.B devlink resource help
++
++.ti -8
++.BR "devlink resource set"
++.IR DEV
++.BI path " RESOURCE_PATH"
++.BI size " RESOURCE_SIZE"
++
++.SH "DESCRIPTION"
++.SS devlink resource show - display devlink device's resosources
++
++.PP
++.I "DEV"
++- specifies the devlink device to show.
++
++.in +4
++Format is:
++.in +2
++BUS_NAME/BUS_ADDRESS
++
++.SS devlink resource set - sets resource size of specific resource
++
++.PP
++.I "DEV"
++- specifies the devlink device.
++
++.TP
++.BI path " RESOURCE_PATH"
++Resource's path.
++
++.TP
++.BI size " RESOURCE_SIZE"
++The new resource's size.
++
++.SH "EXAMPLES"
++.PP
++devlink resource show pci/0000:01:00.0
++.RS 4
++Shows the resources of the specified devlink device.
++.RE
++.PP
++devlink resource set pci/0000:01:00.0 /kvd/linear 98304
++.RS 4
++Sets the size of the specified resource for the specified devlink device.
++
++.SH SEE ALSO
++.BR devlink (8),
++.BR devlink-port (8),
++.BR devlink-sb (8),
++.BR devlink-monitor (8),
++.br
++
++.SH AUTHOR
++Arkadi Sharshevsky <arkadis@mellanox.com>
+diff --git a/man/man8/devlink.8 b/man/man8/devlink.8
+index a480766cbbdbe..6bf398274a612 100644
+--- a/man/man8/devlink.8
++++ b/man/man8/devlink.8
+@@ -87,6 +87,7 @@ Exit status is 0 if command was successful or a positive integer upon failure.
+ .BR devlink-port (8),
+ .BR devlink-monitor (8),
+ .BR devlink-sb (8),
++.BR devlink-resource (8),
+ .br
+ 
+ .SH REPORTING BUGS
+-- 
+2.20.1
+
diff --git a/SOURCES/0059-devlink-Add-param-command-support.patch b/SOURCES/0059-devlink-Add-param-command-support.patch
new file mode 100644
index 0000000..e9a174d
--- /dev/null
+++ b/SOURCES/0059-devlink-Add-param-command-support.patch
@@ -0,0 +1,704 @@
+From 8bd31b6df5fd1da612accbb4d131b3c3bcded079 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 25 Mar 2019 11:40:58 +0100
+Subject: [PATCH] devlink: Add param command support
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1644731
+Upstream Status: iproute2.git commit 13925ae9eb38b
+Conflicts: context change due to missing commit 844646a52837f
+           ("devlink: Change empty line indication with indentations")
+
+commit 13925ae9eb38b99107be1d3fe21a1b73cf40bd97
+Author: Moshe Shemesh <moshe@mellanox.com>
+Date:   Wed Jul 4 17:12:06 2018 +0300
+
+    devlink: Add param command support
+
+    Add support for configuration parameters set and show.
+    Each parameter can be either generic or driver-specific.
+    The user can retrieve data on these configuration parameters by devlink
+    param show command and can set new value to a configuration parameter
+    by devlink param set command.
+    The configuration parameters can be set in different configuration
+    modes:
+      runtime - set while driver is running, no reset required.
+      driverinit - applied while driver initializes, requires restart
+                   driver by devlink reload command.
+      permanent - written to device's non-volatile memory, hard reset
+                  required to apply.
+
+    New commands added:
+      devlink dev param show [DEV name PARAMETER]
+      devlink dev param set DEV name PARAMETER value VALUE
+                                cmode { permanent | driverinit | runtime }
+
+    Signed-off-by: Moshe Shemesh <moshe@mellanox.com>
+    Signed-off-by: Jiri Pirko <jiri@mellanox.com>
+    Signed-off-by: David Ahern <dsahern@gmail.com>
+---
+ devlink/devlink.c      | 454 +++++++++++++++++++++++++++++++++++++++++
+ man/man8/devlink-dev.8 |  57 ++++++
+ 2 files changed, 511 insertions(+)
+
+diff --git a/devlink/devlink.c b/devlink/devlink.c
+index fc3939e564bc8..92e78c9c8d9f6 100644
+--- a/devlink/devlink.c
++++ b/devlink/devlink.c
+@@ -33,6 +33,10 @@
+ #define ESWITCH_INLINE_MODE_NETWORK "network"
+ #define ESWITCH_INLINE_MODE_TRANSPORT "transport"
+ 
++#define PARAM_CMODE_RUNTIME_STR "runtime"
++#define PARAM_CMODE_DRIVERINIT_STR "driverinit"
++#define PARAM_CMODE_PERMANENT_STR "permanent"
++
+ #define pr_err(args...) fprintf(stderr, ##args)
+ #define pr_out(args...)						\
+ 	do {							\
+@@ -179,6 +183,9 @@ static void ifname_map_free(struct ifname_map *ifname_map)
+ #define DL_OPT_ESWITCH_ENCAP_MODE	BIT(15)
+ #define DL_OPT_RESOURCE_PATH	BIT(16)
+ #define DL_OPT_RESOURCE_SIZE	BIT(17)
++#define DL_OPT_PARAM_NAME	BIT(18)
++#define DL_OPT_PARAM_VALUE	BIT(19)
++#define DL_OPT_PARAM_CMODE	BIT(20)
+ 
+ struct dl_opts {
+ 	uint32_t present; /* flags of present items */
+@@ -203,6 +210,9 @@ struct dl_opts {
+ 	uint32_t resource_size;
+ 	uint32_t resource_id;
+ 	bool resource_id_valid;
++	const char *param_name;
++	const char *param_value;
++	enum devlink_param_cmode cmode;
+ };
+ 
+ struct dl {
+@@ -340,6 +350,12 @@ static const enum mnl_attr_data_type devlink_policy[DEVLINK_ATTR_MAX + 1] = {
+ 	[DEVLINK_ATTR_DPIPE_FIELD_ID] = MNL_TYPE_U32,
+ 	[DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH] = MNL_TYPE_U32,
+ 	[DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE] = MNL_TYPE_U32,
++	[DEVLINK_ATTR_PARAM] = MNL_TYPE_NESTED,
++	[DEVLINK_ATTR_PARAM_NAME] = MNL_TYPE_STRING,
++	[DEVLINK_ATTR_PARAM_TYPE] = MNL_TYPE_U8,
++	[DEVLINK_ATTR_PARAM_VALUES_LIST] = MNL_TYPE_NESTED,
++	[DEVLINK_ATTR_PARAM_VALUE] = MNL_TYPE_NESTED,
++	[DEVLINK_ATTR_PARAM_VALUE_CMODE] = MNL_TYPE_U8,
+ };
+ 
+ static int attr_cb(const struct nlattr *attr, void *data)
+@@ -506,6 +522,34 @@ static int strtouint16_t(const char *str, uint16_t *p_val)
+ 	return 0;
+ }
+ 
++static int strtouint8_t(const char *str, uint8_t *p_val)
++{
++	char *endptr;
++	unsigned long int val;
++
++	val = strtoul(str, &endptr, 10);
++	if (endptr == str || *endptr != '\0')
++		return -EINVAL;
++	if (val > UCHAR_MAX)
++		return -ERANGE;
++	*p_val = val;
++	return 0;
++}
++
++static int strtobool(const char *str, bool *p_val)
++{
++	bool val;
++
++	if (!strcmp(str, "true") || !strcmp(str, "1"))
++		val = true;
++	else if (!strcmp(str, "false") || !strcmp(str, "0"))
++		val = false;
++	else
++		return -EINVAL;
++	*p_val = val;
++	return 0;
++}
++
+ static int __dl_argv_handle(char *str, char **p_bus_name, char **p_dev_name)
+ {
+ 	strslashrsplit(str, p_bus_name, p_dev_name);
+@@ -776,6 +820,22 @@ static int eswitch_encap_mode_get(const char *typestr, bool *p_mode)
+ 	return 0;
+ }
+ 
++static int param_cmode_get(const char *cmodestr,
++			   enum devlink_param_cmode *cmode)
++{
++	if (strcmp(cmodestr, PARAM_CMODE_RUNTIME_STR) == 0) {
++		*cmode = DEVLINK_PARAM_CMODE_RUNTIME;
++	} else if (strcmp(cmodestr, PARAM_CMODE_DRIVERINIT_STR) == 0) {
++		*cmode = DEVLINK_PARAM_CMODE_DRIVERINIT;
++	} else if (strcmp(cmodestr, PARAM_CMODE_PERMANENT_STR) == 0) {
++		*cmode = DEVLINK_PARAM_CMODE_PERMANENT;
++	} else {
++		pr_err("Unknown configuration mode \"%s\"\n", cmodestr);
++		return -EINVAL;
++	}
++	return 0;
++}
++
+ static int dl_argv_parse(struct dl *dl, uint32_t o_required,
+ 			 uint32_t o_optional)
+ {
+@@ -957,6 +1017,32 @@ static int dl_argv_parse(struct dl *dl, uint32_t o_required,
+ 			if (err)
+ 				return err;
+ 			o_found |= DL_OPT_RESOURCE_SIZE;
++		} else if (dl_argv_match(dl, "name") &&
++			   (o_all & DL_OPT_PARAM_NAME)) {
++			dl_arg_inc(dl);
++			err = dl_argv_str(dl, &opts->param_name);
++			if (err)
++				return err;
++			o_found |= DL_OPT_PARAM_NAME;
++		} else if (dl_argv_match(dl, "value") &&
++			   (o_all & DL_OPT_PARAM_VALUE)) {
++			dl_arg_inc(dl);
++			err = dl_argv_str(dl, &opts->param_value);
++			if (err)
++				return err;
++			o_found |= DL_OPT_PARAM_VALUE;
++		} else if (dl_argv_match(dl, "cmode") &&
++			   (o_all & DL_OPT_PARAM_CMODE)) {
++			const char *cmodestr;
++
++			dl_arg_inc(dl);
++			err = dl_argv_str(dl, &cmodestr);
++			if (err)
++				return err;
++			err = param_cmode_get(cmodestr, &opts->cmode);
++			if (err)
++				return err;
++			o_found |= DL_OPT_PARAM_CMODE;
+ 		} else {
+ 			pr_err("Unknown option \"%s\"\n", dl_argv(dl));
+ 			return -EINVAL;
+@@ -1041,6 +1127,24 @@ static int dl_argv_parse(struct dl *dl, uint32_t o_required,
+ 		return -EINVAL;
+ 	}
+ 
++	if ((o_required & DL_OPT_PARAM_NAME) &&
++	    !(o_found & DL_OPT_PARAM_NAME)) {
++		pr_err("Parameter name expected.\n");
++		return -EINVAL;
++	}
++
++	if ((o_required & DL_OPT_PARAM_VALUE) &&
++	    !(o_found & DL_OPT_PARAM_VALUE)) {
++		pr_err("Value to set expected.\n");
++		return -EINVAL;
++	}
++
++	if ((o_required & DL_OPT_PARAM_CMODE) &&
++	    !(o_found & DL_OPT_PARAM_CMODE)) {
++		pr_err("Configuration mode expected.\n");
++		return -EINVAL;
++	}
++
+ 	return 0;
+ }
+ 
+@@ -1105,6 +1209,12 @@ static void dl_opts_put(struct nlmsghdr *nlh, struct dl *dl)
+ 	if (opts->present & DL_OPT_RESOURCE_SIZE)
+ 		mnl_attr_put_u64(nlh, DEVLINK_ATTR_RESOURCE_SIZE,
+ 				 opts->resource_size);
++	if (opts->present & DL_OPT_PARAM_NAME)
++		mnl_attr_put_strz(nlh, DEVLINK_ATTR_PARAM_NAME,
++				  opts->param_name);
++	if (opts->present & DL_OPT_PARAM_CMODE)
++		mnl_attr_put_u8(nlh, DEVLINK_ATTR_PARAM_VALUE_CMODE,
++				opts->cmode);
+ }
+ 
+ static int dl_argv_parse_put(struct nlmsghdr *nlh, struct dl *dl,
+@@ -1163,6 +1273,8 @@ static void cmd_dev_help(void)
+ 	pr_err("                               [ inline-mode { none | link | network | transport } ]\n");
+ 	pr_err("                               [ encap { disable | enable } ]\n");
+ 	pr_err("       devlink dev eswitch show DEV\n");
++	pr_err("       devlink dev param set DEV name PARAMETER value VALUE cmode { permanent | driverinit | runtime }\n");
++	pr_err("       devlink dev param show [DEV name PARAMETER]\n");
+ 	pr_err("       devlink dev reload DEV\n");
+ }
+ 
+@@ -1377,6 +1489,14 @@ static void pr_out_str(struct dl *dl, const char *name, const char *val)
+ 	}
+ }
+ 
++static void pr_out_bool(struct dl *dl, const char *name, bool val)
++{
++	if (val)
++		pr_out_str(dl, name, "true");
++	else
++		pr_out_str(dl, name, "false");
++}
++
+ static void pr_out_uint(struct dl *dl, const char *name, unsigned int val)
+ {
+ 	if (dl->json_output) {
+@@ -1449,6 +1569,19 @@ static void pr_out_entry_end(struct dl *dl)
+ 		__pr_out_newline();
+ }
+ 
++static const char *param_cmode_name(uint8_t cmode)
++{
++	switch (cmode) {
++	case DEVLINK_PARAM_CMODE_RUNTIME:
++		return PARAM_CMODE_RUNTIME_STR;
++	case DEVLINK_PARAM_CMODE_DRIVERINIT:
++		return PARAM_CMODE_DRIVERINIT_STR;
++	case DEVLINK_PARAM_CMODE_PERMANENT:
++		return PARAM_CMODE_PERMANENT_STR;
++	default: return "<unknown type>";
++	}
++}
++
+ static const char *eswitch_mode_name(uint32_t mode)
+ {
+ 	switch (mode) {
+@@ -1567,6 +1700,304 @@ static int cmd_dev_eswitch(struct dl *dl)
+ 	return -ENOENT;
+ }
+ 
++static void pr_out_param_value(struct dl *dl, int nla_type, struct nlattr *nl)
++{
++	struct nlattr *nla_value[DEVLINK_ATTR_MAX + 1] = {};
++	struct nlattr *val_attr;
++	int err;
++
++	err = mnl_attr_parse_nested(nl, attr_cb, nla_value);
++	if (err != MNL_CB_OK)
++		return;
++
++	if (!nla_value[DEVLINK_ATTR_PARAM_VALUE_CMODE] ||
++	    (nla_type != MNL_TYPE_FLAG &&
++	     !nla_value[DEVLINK_ATTR_PARAM_VALUE_DATA]))
++		return;
++
++	pr_out_str(dl, "cmode",
++		   param_cmode_name(mnl_attr_get_u8(nla_value[DEVLINK_ATTR_PARAM_VALUE_CMODE])));
++	val_attr = nla_value[DEVLINK_ATTR_PARAM_VALUE_DATA];
++
++	switch (nla_type) {
++	case MNL_TYPE_U8:
++		pr_out_uint(dl, "value", mnl_attr_get_u8(val_attr));
++		break;
++	case MNL_TYPE_U16:
++		pr_out_uint(dl, "value", mnl_attr_get_u16(val_attr));
++		break;
++	case MNL_TYPE_U32:
++		pr_out_uint(dl, "value", mnl_attr_get_u32(val_attr));
++		break;
++	case MNL_TYPE_STRING:
++		pr_out_str(dl, "value", mnl_attr_get_str(val_attr));
++		break;
++	case MNL_TYPE_FLAG:
++		pr_out_bool(dl, "value", val_attr ? true : false);
++		break;
++	}
++}
++
++static void pr_out_param(struct dl *dl, struct nlattr **tb, bool array)
++{
++	struct nlattr *nla_param[DEVLINK_ATTR_MAX + 1] = {};
++	struct nlattr *param_value_attr;
++	int nla_type;
++	int err;
++
++	err = mnl_attr_parse_nested(tb[DEVLINK_ATTR_PARAM], attr_cb, nla_param);
++	if (err != MNL_CB_OK)
++		return;
++	if (!nla_param[DEVLINK_ATTR_PARAM_NAME] ||
++	    !nla_param[DEVLINK_ATTR_PARAM_TYPE] ||
++	    !nla_param[DEVLINK_ATTR_PARAM_VALUES_LIST])
++		return;
++
++	if (array)
++		pr_out_handle_start_arr(dl, tb);
++	else
++		__pr_out_handle_start(dl, tb, true, false);
++
++	nla_type = mnl_attr_get_u8(nla_param[DEVLINK_ATTR_PARAM_TYPE]);
++
++	pr_out_str(dl, "name",
++		   mnl_attr_get_str(nla_param[DEVLINK_ATTR_PARAM_NAME]));
++
++	if (!nla_param[DEVLINK_ATTR_PARAM_GENERIC])
++		pr_out_str(dl, "type", "driver-specific");
++	else
++		pr_out_str(dl, "type", "generic");
++
++	pr_out_array_start(dl, "values");
++	mnl_attr_for_each_nested(param_value_attr,
++				 nla_param[DEVLINK_ATTR_PARAM_VALUES_LIST]) {
++		pr_out_entry_start(dl);
++		pr_out_param_value(dl, nla_type, param_value_attr);
++		pr_out_entry_end(dl);
++	}
++	pr_out_array_end(dl);
++	pr_out_handle_end(dl);
++}
++
++static int cmd_dev_param_show_cb(const struct nlmsghdr *nlh, void *data)
++{
++	struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
++	struct nlattr *tb[DEVLINK_ATTR_MAX + 1] = {};
++	struct dl *dl = data;
++
++	mnl_attr_parse(nlh, sizeof(*genl), attr_cb, tb);
++	if (!tb[DEVLINK_ATTR_BUS_NAME] || !tb[DEVLINK_ATTR_DEV_NAME] ||
++	    !tb[DEVLINK_ATTR_PARAM])
++		return MNL_CB_ERROR;
++	pr_out_param(dl, tb, true);
++	return MNL_CB_OK;
++}
++
++struct param_ctx {
++	struct dl *dl;
++	int nla_type;
++	union {
++		uint8_t vu8;
++		uint16_t vu16;
++		uint32_t vu32;
++		const char *vstr;
++		bool vbool;
++	} value;
++};
++
++static int cmd_dev_param_set_cb(const struct nlmsghdr *nlh, void *data)
++{
++	struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
++	struct nlattr *nla_param[DEVLINK_ATTR_MAX + 1] = {};
++	struct nlattr *tb[DEVLINK_ATTR_MAX + 1] = {};
++	struct nlattr *param_value_attr;
++	enum devlink_param_cmode cmode;
++	struct param_ctx *ctx = data;
++	struct dl *dl = ctx->dl;
++	int nla_type;
++	int err;
++
++	mnl_attr_parse(nlh, sizeof(*genl), attr_cb, tb);
++	if (!tb[DEVLINK_ATTR_BUS_NAME] || !tb[DEVLINK_ATTR_DEV_NAME] ||
++	    !tb[DEVLINK_ATTR_PARAM])
++		return MNL_CB_ERROR;
++
++	err = mnl_attr_parse_nested(tb[DEVLINK_ATTR_PARAM], attr_cb, nla_param);
++	if (err != MNL_CB_OK)
++		return MNL_CB_ERROR;
++
++	if (!nla_param[DEVLINK_ATTR_PARAM_TYPE] ||
++	    !nla_param[DEVLINK_ATTR_PARAM_VALUES_LIST])
++		return MNL_CB_ERROR;
++
++	nla_type = mnl_attr_get_u8(nla_param[DEVLINK_ATTR_PARAM_TYPE]);
++	mnl_attr_for_each_nested(param_value_attr,
++				 nla_param[DEVLINK_ATTR_PARAM_VALUES_LIST]) {
++		struct nlattr *nla_value[DEVLINK_ATTR_MAX + 1] = {};
++		struct nlattr *val_attr;
++
++		err = mnl_attr_parse_nested(param_value_attr,
++					    attr_cb, nla_value);
++		if (err != MNL_CB_OK)
++			return MNL_CB_ERROR;
++
++		if (!nla_value[DEVLINK_ATTR_PARAM_VALUE_CMODE] ||
++		    (nla_type != MNL_TYPE_FLAG &&
++		     !nla_value[DEVLINK_ATTR_PARAM_VALUE_DATA]))
++			return MNL_CB_ERROR;
++
++		cmode = mnl_attr_get_u8(nla_value[DEVLINK_ATTR_PARAM_VALUE_CMODE]);
++		if (cmode == dl->opts.cmode) {
++			val_attr = nla_value[DEVLINK_ATTR_PARAM_VALUE_DATA];
++			switch (nla_type) {
++			case MNL_TYPE_U8:
++				ctx->value.vu8 = mnl_attr_get_u8(val_attr);
++				break;
++			case MNL_TYPE_U16:
++				ctx->value.vu16 = mnl_attr_get_u16(val_attr);
++				break;
++			case MNL_TYPE_U32:
++				ctx->value.vu32 = mnl_attr_get_u32(val_attr);
++				break;
++			case MNL_TYPE_STRING:
++				ctx->value.vstr = mnl_attr_get_str(val_attr);
++				break;
++			case MNL_TYPE_FLAG:
++				ctx->value.vbool = val_attr ? true : false;
++				break;
++			}
++			break;
++		}
++	}
++	ctx->nla_type = nla_type;
++	return MNL_CB_OK;
++}
++
++static int cmd_dev_param_set(struct dl *dl)
++{
++	struct param_ctx ctx = {};
++	struct nlmsghdr *nlh;
++	uint32_t val_u32;
++	uint16_t val_u16;
++	uint8_t val_u8;
++	bool val_bool;
++	int err;
++
++	err = dl_argv_parse(dl, DL_OPT_HANDLE |
++			    DL_OPT_PARAM_NAME |
++			    DL_OPT_PARAM_VALUE |
++			    DL_OPT_PARAM_CMODE, 0);
++	if (err)
++		return err;
++
++	/* Get value type */
++	nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_PARAM_GET,
++			       NLM_F_REQUEST | NLM_F_ACK);
++	dl_opts_put(nlh, dl);
++
++	ctx.dl = dl;
++	err = _mnlg_socket_sndrcv(dl->nlg, nlh, cmd_dev_param_set_cb, &ctx);
++	if (err)
++		return err;
++
++	nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_PARAM_SET,
++			       NLM_F_REQUEST | NLM_F_ACK);
++	dl_opts_put(nlh, dl);
++
++	mnl_attr_put_u8(nlh, DEVLINK_ATTR_PARAM_TYPE, ctx.nla_type);
++	switch (ctx.nla_type) {
++	case MNL_TYPE_U8:
++		err = strtouint8_t(dl->opts.param_value, &val_u8);
++		if (err)
++			goto err_param_value_parse;
++		if (val_u8 == ctx.value.vu8)
++			return 0;
++		mnl_attr_put_u8(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, val_u8);
++		break;
++	case MNL_TYPE_U16:
++		err = strtouint16_t(dl->opts.param_value, &val_u16);
++		if (err)
++			goto err_param_value_parse;
++		if (val_u16 == ctx.value.vu16)
++			return 0;
++		mnl_attr_put_u16(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, val_u16);
++		break;
++	case MNL_TYPE_U32:
++		err = strtouint32_t(dl->opts.param_value, &val_u32);
++		if (err)
++			goto err_param_value_parse;
++		if (val_u32 == ctx.value.vu32)
++			return 0;
++		mnl_attr_put_u32(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, val_u32);
++		break;
++	case MNL_TYPE_FLAG:
++		err = strtobool(dl->opts.param_value, &val_bool);
++		if (err)
++			goto err_param_value_parse;
++		if (val_bool == ctx.value.vbool)
++			return 0;
++		if (val_bool)
++			mnl_attr_put(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA,
++				     0, NULL);
++		break;
++	case MNL_TYPE_STRING:
++		mnl_attr_put_strz(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA,
++				  dl->opts.param_value);
++		if (!strcmp(dl->opts.param_value, ctx.value.vstr))
++			return 0;
++		break;
++	default:
++		printf("Value type not supported\n");
++		return -ENOTSUP;
++	}
++	return _mnlg_socket_sndrcv(dl->nlg, nlh, NULL, NULL);
++
++err_param_value_parse:
++	pr_err("Value \"%s\" is not a number or not within range\n",
++	       dl->opts.param_value);
++	return err;
++}
++
++static int cmd_dev_param_show(struct dl *dl)
++{
++	uint16_t flags = NLM_F_REQUEST | NLM_F_ACK;
++	struct nlmsghdr *nlh;
++	int err;
++
++	if (dl_argc(dl) == 0)
++		flags |= NLM_F_DUMP;
++
++	nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_PARAM_GET, flags);
++
++	if (dl_argc(dl) > 0) {
++		err = dl_argv_parse_put(nlh, dl, DL_OPT_HANDLE |
++					DL_OPT_PARAM_NAME, 0);
++		if (err)
++			return err;
++	}
++
++	pr_out_section_start(dl, "param");
++	err = _mnlg_socket_sndrcv(dl->nlg, nlh, cmd_dev_param_show_cb, dl);
++	pr_out_section_end(dl);
++	return err;
++}
++
++static int cmd_dev_param(struct dl *dl)
++{
++	if (dl_argv_match(dl, "help")) {
++		cmd_dev_help();
++		return 0;
++	} else if (dl_argv_match(dl, "show") ||
++		   dl_argv_match(dl, "list") || dl_no_arg(dl)) {
++		dl_arg_inc(dl);
++		return cmd_dev_param_show(dl);
++	} else if (dl_argv_match(dl, "set")) {
++		dl_arg_inc(dl);
++		return cmd_dev_param_set(dl);
++	}
++	pr_err("Command \"%s\" not found\n", dl_argv(dl));
++	return -ENOENT;
++}
+ static int cmd_dev_show_cb(const struct nlmsghdr *nlh, void *data)
+ {
+ 	struct dl *dl = data;
+@@ -1643,6 +2074,9 @@ static int cmd_dev(struct dl *dl)
+ 	} else if (dl_argv_match(dl, "reload")) {
+ 		dl_arg_inc(dl);
+ 		return cmd_dev_reload(dl);
++	} else if (dl_argv_match(dl, "param")) {
++		dl_arg_inc(dl);
++		return cmd_dev_param(dl);
+ 	}
+ 	pr_err("Command \"%s\" not found\n", dl_argv(dl));
+ 	return -ENOENT;
+@@ -2586,6 +3020,10 @@ static const char *cmd_name(uint8_t cmd)
+ 	case DEVLINK_CMD_PORT_SET: return "set";
+ 	case DEVLINK_CMD_PORT_NEW: return "net";
+ 	case DEVLINK_CMD_PORT_DEL: return "del";
++	case DEVLINK_CMD_PARAM_GET: return "get";
++	case DEVLINK_CMD_PARAM_SET: return "set";
++	case DEVLINK_CMD_PARAM_NEW: return "new";
++	case DEVLINK_CMD_PARAM_DEL: return "del";
+ 	default: return "<unknown cmd>";
+ 	}
+ }
+@@ -2604,6 +3042,11 @@ static const char *cmd_obj(uint8_t cmd)
+ 	case DEVLINK_CMD_PORT_NEW:
+ 	case DEVLINK_CMD_PORT_DEL:
+ 		return "port";
++	case DEVLINK_CMD_PARAM_GET:
++	case DEVLINK_CMD_PARAM_SET:
++	case DEVLINK_CMD_PARAM_NEW:
++	case DEVLINK_CMD_PARAM_DEL:
++		return "param";
+ 	default: return "<unknown obj>";
+ 	}
+ }
+@@ -2660,6 +3103,17 @@ static int cmd_mon_show_cb(const struct nlmsghdr *nlh, void *data)
+ 		pr_out_mon_header(genl->cmd);
+ 		pr_out_port(dl, tb);
+ 		break;
++	case DEVLINK_CMD_PARAM_GET: /* fall through */
++	case DEVLINK_CMD_PARAM_SET: /* fall through */
++	case DEVLINK_CMD_PARAM_NEW: /* fall through */
++	case DEVLINK_CMD_PARAM_DEL:
++		mnl_attr_parse(nlh, sizeof(*genl), attr_cb, tb);
++		if (!tb[DEVLINK_ATTR_BUS_NAME] || !tb[DEVLINK_ATTR_DEV_NAME] ||
++		    !tb[DEVLINK_ATTR_PARAM])
++			return MNL_CB_ERROR;
++		pr_out_mon_header(genl->cmd);
++		pr_out_param(dl, tb, false);
++		break;
+ 	}
+ 	return MNL_CB_OK;
+ }
+diff --git a/man/man8/devlink-dev.8 b/man/man8/devlink-dev.8
+index 7c749ddabaeeb..d985da172aa05 100644
+--- a/man/man8/devlink-dev.8
++++ b/man/man8/devlink-dev.8
+@@ -42,6 +42,23 @@ devlink-dev \- devlink device configuration
+ .BR "devlink dev eswitch show"
+ .IR DEV
+ 
++.ti -8
++.BR "devlink dev param set"
++.IR DEV
++.BR name
++.IR PARAMETER
++.BR value
++.IR VALUE
++.BR cmode " { " runtime " | " driverinit " | " permanent " } "
++
++.ti -8
++.BR "devlink dev param show"
++.RI "[ "
++.IR DEV
++.BR name
++.IR PARAMETER
++.RI "]"
++
+ .ti -8
+ .BR "devlink dev reload"
+ .IR DEV
+@@ -98,6 +115,36 @@ Set eswitch encapsulation support
+ .I enable
+ - Enable encapsulation support
+ 
++.SS devlink dev param set  - set new value to devlink device configuration parameter
++
++.TP
++.BI name " PARAMETER"
++Specify parameter name to set.
++
++.TP
++.BI value " VALUE"
++New value to set.
++
++.TP
++.BR cmode " { " runtime " | " driverinit " | " permanent " } "
++Configuration mode in which the new value is set.
++
++.I runtime
++- Set new value while driver is running. This configuration mode doesn't require any reset to apply the new value.
++
++.I driverinit
++- Set new value which will be applied during driver initialization. This configuration mode requires restart driver by devlink reload command to apply the new value.
++
++.I permanent
++- New value is written to device's non-volatile memory. This configuration mode requires hard reset to apply the new value.
++
++.SS devlink dev param show - display devlink device supported configuration parameters attributes
++
++.BR name
++.IR PARAMETER
++Specify parameter name to show.
++If this argument is omitted all parameters supported by devlink devices are listed.
++
+ .SS devlink dev reload - perform hot reload of the driver.
+ 
+ .PP
+@@ -126,6 +173,16 @@ devlink dev eswitch set pci/0000:01:00.0 mode switchdev
+ Sets the eswitch mode of specified devlink device to switchdev.
+ .RE
+ .PP
++devlink dev param show pci/0000:01:00.0 name max_macs
++.RS 4
++Shows the parameter max_macs attributes.
++.RE
++.PP
++devlink dev param set pci/0000:01:00.0 name internal_error_reset value true cmode runtime
++.RS 4
++Sets the parameter internal_error_reset of specified devlink device to true.
++.RE
++.PP
+ devlink dev reload pci/0000:01:00.0
+ .RS 4
+ Performs hot reload of specified devlink device.
+-- 
+2.20.1
+
diff --git a/SOURCES/0060-man-ip-route.8-ssthresh-parameter-is-NUMBER.patch b/SOURCES/0060-man-ip-route.8-ssthresh-parameter-is-NUMBER.patch
new file mode 100644
index 0000000..e1bbaf3
--- /dev/null
+++ b/SOURCES/0060-man-ip-route.8-ssthresh-parameter-is-NUMBER.patch
@@ -0,0 +1,38 @@
+From b6de96b49af2751003d67ed4edbf91fd25cee19c Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 25 Mar 2019 11:52:31 +0100
+Subject: [PATCH] man: ip-route.8: ssthresh parameter is NUMBER
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1593628
+Upstream Status: iproute2.git commit 79f49f58aaefe
+
+commit 79f49f58aaefe11f677c8e072557b834a19f47f3
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Mar 22 15:00:38 2018 +0100
+
+    man: ip-route.8: ssthresh parameter is NUMBER
+
+    Synopsis section was inconsistent with regards to help text and later
+    description of ssthresh parameter.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ man/man8/ip-route.8.in | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/man/man8/ip-route.8.in b/man/man8/ip-route.8.in
+index d9a547748c017..0616cf01740f3 100644
+--- a/man/man8/ip-route.8.in
++++ b/man/man8/ip-route.8.in
+@@ -120,7 +120,7 @@ replace " } "
+ .B  cwnd
+ .IR NUMBER " ] [ "
+ .B  ssthresh
+-.IR REALM " ] [ "
++.IR NUMBER " ] [ "
+ .B  realms
+ .IR REALM " ] [ "
+ .B  rto_min
+-- 
+2.20.1
+
diff --git a/SOURCES/0061-man-tc-vlan.8-Fix-for-incorrect-example.patch b/SOURCES/0061-man-tc-vlan.8-Fix-for-incorrect-example.patch
new file mode 100644
index 0000000..b299549
--- /dev/null
+++ b/SOURCES/0061-man-tc-vlan.8-Fix-for-incorrect-example.patch
@@ -0,0 +1,39 @@
+From 58fe50b2e23c1b77ed93d242545d0f274f819681 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 25 Mar 2019 11:57:41 +0100
+Subject: [PATCH] man: tc-vlan.8: Fix for incorrect example
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1593630
+Upstream Status: iproute2.git commit 8ee38d833ccb1
+
+commit 8ee38d833ccb1863f06634e12c5236b0ef7c2d76
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Fri Mar 23 21:18:56 2018 +0100
+
+    man: tc-vlan.8: Fix for incorrect example
+
+    This has to be a second match statement to the same u32 filter, not a
+    second one (which tc-filter doesn't support at all).
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ man/man8/tc-vlan.8 | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/man/man8/tc-vlan.8 b/man/man8/tc-vlan.8
+index af3de1c54e343..a526f66b60b4c 100644
+--- a/man/man8/tc-vlan.8
++++ b/man/man8/tc-vlan.8
+@@ -103,7 +103,7 @@ into VLAN ID 123:
+ #tc qdisc add dev eth0 handle ffff: ingress
+ #tc filter add dev eth0 parent ffff: pref 11 protocol ip \\
+ 	u32 match ip protocol 1 0xff flowid 1:1 \\
+-	u32 match ip src 10.0.0.2 flowid 1:1 \\
++	    match ip src 10.0.0.2 flowid 1:1 \\
+ 	action vlan push id 123
+ .EE
+ .RE
+-- 
+2.20.1
+
diff --git a/SOURCES/0062-tc-flower-Add-support-for-QinQ.patch b/SOURCES/0062-tc-flower-Add-support-for-QinQ.patch
new file mode 100644
index 0000000..f17a40b
--- /dev/null
+++ b/SOURCES/0062-tc-flower-Add-support-for-QinQ.patch
@@ -0,0 +1,271 @@
+From dfbec1b67fc02a5af0d5cc30328b918902f20717 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 25 Mar 2019 12:19:05 +0100
+Subject: [PATCH] tc: flower: Add support for QinQ
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1642347
+Upstream Status: iproute2.git commit 1f0a5dfd388cd
+Conflicts: context change due to missing commits
+           7638ee13c1586 ("tc: flower: support for matching MPLS labels")
+           e28b88a464c49 ("tc: jsonify flower filter")
+           also adjust code to use fprintf instead of print_string due to
+           missing commit d0e720111aad2 ("ip: ipaddress.c: add support for json output")
+
+commit 1f0a5dfd388cd5c25f6a24247667e04b2346e568
+Author: Jianbo Liu <jianbol@mellanox.com>
+Date:   Sat Jun 30 10:01:33 2018 +0000
+
+    tc: flower: Add support for QinQ
+
+    To support matching on both outer and inner vlan headers,
+    we add new cvlan_id/cvlan_prio/cvlan_ethtype for inner vlan header.
+
+    Example:
+    # tc filter add dev eth0 protocol 802.1ad parent ffff: \
+        flower vlan_id 1000 vlan_ethtype 802.1q \
+            cvlan_id 100 cvlan_ethtype ipv4 \
+        action vlan pop \
+        action vlan pop \
+        action mirred egress redirect dev eth1
+
+    # tc filter show dev eth0 ingress
+    filter protocol 802.1ad pref 1 flower chain 0
+    filter protocol 802.1ad pref 1 flower chain 0 handle 0x1
+      vlan_id 1000
+      vlan_ethtype 802.1Q
+      cvlan_id 100
+      cvlan_ethtype ip
+      eth_type ipv4
+      in_hw
+
+    Signed-off-by: Jianbo Liu <jianbol@mellanox.com>
+    Acked-by: Jiri Pirko <jiri@mellanox.com>
+    Signed-off-by: David Ahern <dsahern@gmail.com>
+---
+ man/man8/tc-flower.8 | 23 ++++++++++
+ tc/f_flower.c        | 99 ++++++++++++++++++++++++++++++++++++++------
+ 2 files changed, 110 insertions(+), 12 deletions(-)
+
+diff --git a/man/man8/tc-flower.8 b/man/man8/tc-flower.8
+index af19708d9649e..387f73f5cd2e9 100644
+--- a/man/man8/tc-flower.8
++++ b/man/man8/tc-flower.8
+@@ -29,6 +29,12 @@ flower \- flow based traffic control filter
+ .IR PRIORITY " | "
+ .BR vlan_ethtype " { " ipv4 " | " ipv6 " | "
+ .IR ETH_TYPE " } | "
++.B cvlan_id
++.IR VID " | "
++.B cvlan_prio
++.IR PRIORITY " | "
++.BR cvlan_ethtype " { " ipv4 " | " ipv6 " | "
++.IR ETH_TYPE " } | "
+ .BR ip_proto " { " tcp " | " udp " | " sctp " | " icmp " | " icmpv6 " | "
+ .IR IP_PROTO " } | "
+ .B ip_tos
+@@ -121,6 +127,23 @@ Match on layer three protocol.
+ .I VLAN_ETH_TYPE
+ may be either
+ .BR ipv4 ", " ipv6
++or an unsigned 16bit value in hexadecimal format. To match on QinQ packet, it must be 802.1Q or 802.1AD.
++.TP
++.BI cvlan_id " VID"
++Match on QinQ inner vlan tag id.
++.I VID
++is an unsigned 12bit value in decimal format.
++.TP
++.BI cvlan_prio " PRIORITY"
++Match on QinQ inner vlan tag priority.
++.I PRIORITY
++is an unsigned 3bit value in decimal format.
++.TP
++.BI cvlan_ethtype " VLAN_ETH_TYPE"
++Match on QinQ layer three protocol.
++.I VLAN_ETH_TYPE
++may be either
++.BR ipv4 ", " ipv6
+ or an unsigned 16bit value in hexadecimal format.
+ .TP
+ .BI ip_proto " IP_PROTO"
+diff --git a/tc/f_flower.c b/tc/f_flower.c
+index 5f5236ca523f8..40dcfbd687a20 100644
+--- a/tc/f_flower.c
++++ b/tc/f_flower.c
+@@ -50,6 +50,9 @@ static void explain(void)
+ 		"                       vlan_id VID |\n"
+ 		"                       vlan_prio PRIORITY |\n"
+ 		"                       vlan_ethtype [ ipv4 | ipv6 | ETH-TYPE ] |\n"
++		"                       cvlan_id VID |\n"
++		"                       cvlan_prio PRIORITY |\n"
++		"                       cvlan_ethtype [ ipv4 | ipv6 | ETH-TYPE ] |\n"
+ 		"                       dst_mac MASKED-LLADDR |\n"
+ 		"                       src_mac MASKED-LLADDR |\n"
+ 		"                       ip_proto [tcp | udp | sctp | icmp | icmpv6 | IP-PROTO ] |\n"
+@@ -126,15 +129,21 @@ err:
+ 	return err;
+ }
+ 
++static bool eth_type_vlan(__be16 ethertype)
++{
++	return ethertype == htons(ETH_P_8021Q) ||
++	       ethertype == htons(ETH_P_8021AD);
++}
++
+ static int flower_parse_vlan_eth_type(char *str, __be16 eth_type, int type,
+ 				      __be16 *p_vlan_eth_type,
+ 				      struct nlmsghdr *n)
+ {
+ 	__be16 vlan_eth_type;
+ 
+-	if (eth_type != htons(ETH_P_8021Q)) {
+-		fprintf(stderr,
+-			"Can't set \"vlan_ethtype\" if ethertype isn't 802.1Q\n");
++	if (!eth_type_vlan(eth_type)) {
++		fprintf(stderr, "Can't set \"%s\" if ethertype isn't 802.1Q or 802.1AD\n",
++			type == TCA_FLOWER_KEY_VLAN_ETH_TYPE ? "vlan_ethtype" : "cvlan_ethtype");
+ 		return -1;
+ 	}
+ 
+@@ -583,6 +592,7 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
+ 	struct rtattr *tail;
+ 	__be16 eth_type = TC_H_MIN(t->tcm_info);
+ 	__be16 vlan_ethtype = 0;
++	__be16 cvlan_ethtype = 0;
+ 	__u8 ip_proto = 0xff;
+ 	__u32 flags = 0;
+ 	__u32 mtf = 0;
+@@ -640,9 +650,8 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
+ 			__u16 vid;
+ 
+ 			NEXT_ARG();
+-			if (eth_type != htons(ETH_P_8021Q)) {
+-				fprintf(stderr,
+-					"Can't set \"vlan_id\" if ethertype isn't 802.1Q\n");
++			if (!eth_type_vlan(eth_type)) {
++				fprintf(stderr, "Can't set \"vlan_id\" if ethertype isn't 802.1Q or 802.1AD\n");
+ 				return -1;
+ 			}
+ 			ret = get_u16(&vid, *argv, 10);
+@@ -655,9 +664,8 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
+ 			__u8 vlan_prio;
+ 
+ 			NEXT_ARG();
+-			if (eth_type != htons(ETH_P_8021Q)) {
+-				fprintf(stderr,
+-					"Can't set \"vlan_prio\" if ethertype isn't 802.1Q\n");
++			if (!eth_type_vlan(eth_type)) {
++				fprintf(stderr, "Can't set \"vlan_prio\" if ethertype isn't 802.1Q or 802.1AD\n");
+ 				return -1;
+ 			}
+ 			ret = get_u8(&vlan_prio, *argv, 10);
+@@ -674,6 +682,42 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
+ 						 &vlan_ethtype, n);
+ 			if (ret < 0)
+ 				return -1;
++		} else if (matches(*argv, "cvlan_id") == 0) {
++			__u16 vid;
++
++			NEXT_ARG();
++			if (!eth_type_vlan(vlan_ethtype)) {
++				fprintf(stderr, "Can't set \"cvlan_id\" if inner vlan ethertype isn't 802.1Q or 802.1AD\n");
++				return -1;
++			}
++			ret = get_u16(&vid, *argv, 10);
++			if (ret < 0 || vid & ~0xfff) {
++				fprintf(stderr, "Illegal \"cvlan_id\"\n");
++				return -1;
++			}
++			addattr16(n, MAX_MSG, TCA_FLOWER_KEY_CVLAN_ID, vid);
++		} else if (matches(*argv, "cvlan_prio") == 0) {
++			__u8 cvlan_prio;
++
++			NEXT_ARG();
++			if (!eth_type_vlan(vlan_ethtype)) {
++				fprintf(stderr, "Can't set \"cvlan_prio\" if inner vlan ethertype isn't 802.1Q or 802.1AD\n");
++				return -1;
++			}
++			ret = get_u8(&cvlan_prio, *argv, 10);
++			if (ret < 0 || cvlan_prio & ~0x7) {
++				fprintf(stderr, "Illegal \"cvlan_prio\"\n");
++				return -1;
++			}
++			addattr8(n, MAX_MSG,
++				 TCA_FLOWER_KEY_CVLAN_PRIO, cvlan_prio);
++		} else if (matches(*argv, "cvlan_ethtype") == 0) {
++			NEXT_ARG();
++			ret = flower_parse_vlan_eth_type(*argv, vlan_ethtype,
++						 TCA_FLOWER_KEY_CVLAN_ETH_TYPE,
++						 &cvlan_ethtype, n);
++			if (ret < 0)
++				return -1;
+ 		} else if (matches(*argv, "dst_mac") == 0) {
+ 			NEXT_ARG();
+ 			ret = flower_parse_eth_addr(*argv,
+@@ -696,7 +740,8 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
+ 			}
+ 		} else if (matches(*argv, "ip_proto") == 0) {
+ 			NEXT_ARG();
+-			ret = flower_parse_ip_proto(*argv, vlan_ethtype ?
++			ret = flower_parse_ip_proto(*argv, cvlan_ethtype ?
++						    cvlan_ethtype : vlan_ethtype ?
+ 						    vlan_ethtype : eth_type,
+ 						    TCA_FLOWER_KEY_IP_PROTO,
+ 						    &ip_proto, n);
+@@ -726,7 +771,8 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
+ 			}
+ 		} else if (matches(*argv, "dst_ip") == 0) {
+ 			NEXT_ARG();
+-			ret = flower_parse_ip_addr(*argv, vlan_ethtype ?
++			ret = flower_parse_ip_addr(*argv, cvlan_ethtype ?
++						   cvlan_ethtype : vlan_ethtype ?
+ 						   vlan_ethtype : eth_type,
+ 						   TCA_FLOWER_KEY_IPV4_DST,
+ 						   TCA_FLOWER_KEY_IPV4_DST_MASK,
+@@ -739,7 +785,8 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
+ 			}
+ 		} else if (matches(*argv, "src_ip") == 0) {
+ 			NEXT_ARG();
+-			ret = flower_parse_ip_addr(*argv, vlan_ethtype ?
++			ret = flower_parse_ip_addr(*argv, cvlan_ethtype ?
++						   cvlan_ethtype : vlan_ethtype ?
+ 						   vlan_ethtype : eth_type,
+ 						   TCA_FLOWER_KEY_IPV4_SRC,
+ 						   TCA_FLOWER_KEY_IPV4_SRC_MASK,
+@@ -1234,6 +1281,34 @@ static int flower_print_opt(struct filter_util *qu, FILE *f,
+ 		fprintf(f, "\n  vlan_prio %d", rta_getattr_u8(attr));
+ 	}
+ 
++	if (tb[TCA_FLOWER_KEY_VLAN_ETH_TYPE]) {
++		SPRINT_BUF(buf);
++		struct rtattr *attr = tb[TCA_FLOWER_KEY_VLAN_ETH_TYPE];
++
++		fprintf(f, "\n  vlan_ethtype %s",
++                        ll_proto_n2a(rta_getattr_u16(attr), buf, sizeof(buf)));
++	}
++
++	if (tb[TCA_FLOWER_KEY_CVLAN_ID]) {
++		struct rtattr *attr = tb[TCA_FLOWER_KEY_CVLAN_ID];
++
++		fprintf(f, "\n  cvlan_id %u", rta_getattr_u16(attr));
++	}
++
++	if (tb[TCA_FLOWER_KEY_CVLAN_PRIO]) {
++		struct rtattr *attr = tb[TCA_FLOWER_KEY_CVLAN_PRIO];
++
++		fprintf(f, "\n  cvlan_prio %d", rta_getattr_u8(attr));
++	}
++
++	if (tb[TCA_FLOWER_KEY_CVLAN_ETH_TYPE]) {
++		SPRINT_BUF(buf);
++		struct rtattr *attr = tb[TCA_FLOWER_KEY_CVLAN_ETH_TYPE];
++
++		fprintf(f, "\n  cvlan_ethtype %s",
++                        ll_proto_n2a(rta_getattr_u16(attr), buf, sizeof(buf)));
++	}
++
+ 	flower_print_eth_addr(f, "dst_mac", tb[TCA_FLOWER_KEY_ETH_DST],
+ 			      tb[TCA_FLOWER_KEY_ETH_DST_MASK]);
+ 	flower_print_eth_addr(f, "src_mac", tb[TCA_FLOWER_KEY_ETH_SRC],
+-- 
+2.20.1
+
diff --git a/SOURCES/0063-utils-Move-BIT-macro-to-common-header.patch b/SOURCES/0063-utils-Move-BIT-macro-to-common-header.patch
new file mode 100644
index 0000000..6bfee1c
--- /dev/null
+++ b/SOURCES/0063-utils-Move-BIT-macro-to-common-header.patch
@@ -0,0 +1,61 @@
+From 42a457a97118379936cdeb20eef1d116e858d4c1 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 25 Mar 2019 13:30:09 +0100
+Subject: [PATCH] utils: Move BIT macro to common header
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1642479
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1641914
+Upstream Status: iproute2.git commit afdc119410efe
+
+commit afdc119410efe2a5e826c660446b1e4e1a72793d
+Author: Leon Romanovsky <leonro@mellanox.com>
+Date:   Sun Aug 20 12:58:21 2017 +0300
+
+    utils: Move BIT macro to common header
+
+    BIT() macro was implemented and used by devlink for now, but following
+    patches of rdmatool will reuse the same macro, so put it in common
+    header file.
+
+    Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
+---
+ devlink/devlink.c | 2 +-
+ include/utils.h   | 2 ++
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/devlink/devlink.c b/devlink/devlink.c
+index 92e78c9c8d9f6..2000db81aabb0 100644
+--- a/devlink/devlink.c
++++ b/devlink/devlink.c
+@@ -25,6 +25,7 @@
+ #include "list.h"
+ #include "mnlg.h"
+ #include "json_writer.h"
++#include "utils.h"
+ 
+ #define ESWITCH_MODE_LEGACY "legacy"
+ #define ESWITCH_MODE_SWITCHDEV "switchdev"
+@@ -164,7 +165,6 @@ static void ifname_map_free(struct ifname_map *ifname_map)
+ 	free(ifname_map);
+ }
+ 
+-#define BIT(nr)                 (1UL << (nr))
+ #define DL_OPT_HANDLE		BIT(0)
+ #define DL_OPT_HANDLEP		BIT(1)
+ #define DL_OPT_PORT_TYPE	BIT(2)
+diff --git a/include/utils.h b/include/utils.h
+index 8c12e1e2a60c2..d707a9dacdb85 100644
+--- a/include/utils.h
++++ b/include/utils.h
+@@ -208,6 +208,8 @@ static inline void __jiffies_to_tv(struct timeval *tv, unsigned long jiffies)
+ int print_timestamp(FILE *fp);
+ void print_nlmsg_timestamp(FILE *fp, const struct nlmsghdr *n);
+ 
++#define BIT(nr)                 (1UL << (nr))
++
+ #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+ 
+ #define BUILD_BUG_ON(cond) ((void)sizeof(char[1 - 2 * !!(cond)]))
+-- 
+2.20.1
+
diff --git a/SOURCES/0064-lib-make-resolve_hosts-variable-common.patch b/SOURCES/0064-lib-make-resolve_hosts-variable-common.patch
new file mode 100644
index 0000000..529ffcb
--- /dev/null
+++ b/SOURCES/0064-lib-make-resolve_hosts-variable-common.patch
@@ -0,0 +1,137 @@
+From c74a0bcb2e9c88b2ee166afc08574141a6a288b8 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 25 Mar 2019 13:30:43 +0100
+Subject: [PATCH] lib: make resolve_hosts variable common
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1642479
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1641914
+Upstream Status: iproute2.git commit 6648853975332
+
+commit 6648853975332e5f34d03a1e2a6e09f5e1742099
+Author: Ivan Vecera <ivecera@redhat.com>
+Date:   Fri Nov 10 07:20:13 2017 +0100
+
+    lib: make resolve_hosts variable common
+
+    Any iproute utility that uses any function from lib/utils.c needs
+    to declare its own resolve_hosts variable instance although it does
+    not need/use hostname resolving functionality (currently only 'ip'
+    and 'ss' commands uses this).
+    The patch declares single common instance of resolve_hosts directly
+    in utils.c so the existing ones can be removed (the same approach
+    that is used for timestamp_short).
+
+    Cc: Jiri Pirko <jiri@mellanox.com>
+    Cc: Arkadi Sharshevsky <arkadis@mellanox.com>
+    Signed-off-by: Ivan Vecera <ivecera@redhat.com>
+---
+ bridge/bridge.c | 1 -
+ genl/genl.c     | 1 -
+ ip/ip.c         | 1 -
+ ip/rtmon.c      | 1 -
+ lib/utils.c     | 1 +
+ misc/arpd.c     | 2 --
+ misc/ss.c       | 1 -
+ tc/tc.c         | 1 -
+ 8 files changed, 1 insertion(+), 8 deletions(-)
+
+diff --git a/bridge/bridge.c b/bridge/bridge.c
+index 5ff038d672ad2..6658cb8fd801d 100644
+--- a/bridge/bridge.c
++++ b/bridge/bridge.c
+@@ -18,7 +18,6 @@
+ 
+ struct rtnl_handle rth = { .fd = -1 };
+ int preferred_family = AF_UNSPEC;
+-int resolve_hosts;
+ int oneline;
+ int show_stats;
+ int show_details;
+diff --git a/genl/genl.c b/genl/genl.c
+index 747074b029a7b..7e4a208d449f2 100644
+--- a/genl/genl.c
++++ b/genl/genl.c
+@@ -30,7 +30,6 @@
+ int show_stats = 0;
+ int show_details = 0;
+ int show_raw = 0;
+-int resolve_hosts = 0;
+ 
+ static void *BODY;
+ static struct genl_util * genl_list;
+diff --git a/ip/ip.c b/ip/ip.c
+index 07050b07592ac..0c0ad1bde7cb6 100644
+--- a/ip/ip.c
++++ b/ip/ip.c
+@@ -30,7 +30,6 @@ int human_readable;
+ int use_iec;
+ int show_stats;
+ int show_details;
+-int resolve_hosts;
+ int oneline;
+ int brief;
+ int timestamp;
+diff --git a/ip/rtmon.c b/ip/rtmon.c
+index 1c2981f79d3d1..94baa38e3b7cb 100644
+--- a/ip/rtmon.c
++++ b/ip/rtmon.c
+@@ -25,7 +25,6 @@
+ #include "utils.h"
+ #include "libnetlink.h"
+ 
+-int resolve_hosts;
+ static int init_phase = 1;
+ 
+ static void write_stamp(FILE *fp)
+diff --git a/lib/utils.c b/lib/utils.c
+index 9f55391d3c1ea..fc9c575ba0c7d 100644
+--- a/lib/utils.c
++++ b/lib/utils.c
+@@ -35,6 +35,7 @@
+ #include "utils.h"
+ #include "namespace.h"
+ 
++int resolve_hosts;
+ int timestamp_short;
+ 
+ int get_hex(char c)
+diff --git a/misc/arpd.c b/misc/arpd.c
+index bfab44544ee1d..c9d86475e5995 100644
+--- a/misc/arpd.c
++++ b/misc/arpd.c
+@@ -38,8 +38,6 @@
+ #include "utils.h"
+ #include "rt_names.h"
+ 
+-int resolve_hosts;
+-
+ DB	*dbase;
+ char	*dbname = "/var/lib/arpd/arpd.db";
+ 
+diff --git a/misc/ss.c b/misc/ss.c
+index e92266539e6b5..c0cb33e96d9ec 100644
+--- a/misc/ss.c
++++ b/misc/ss.c
+@@ -89,7 +89,6 @@ static int security_get_initial_context(char *name,  char **context)
+ }
+ #endif
+ 
+-int resolve_hosts;
+ int resolve_services = 1;
+ int preferred_family = AF_UNSPEC;
+ int show_options;
+diff --git a/tc/tc.c b/tc/tc.c
+index 360c9f11c235b..11a364fabbbea 100644
+--- a/tc/tc.c
++++ b/tc/tc.c
+@@ -39,7 +39,6 @@ int show_graph;
+ int timestamp;
+ 
+ int batch_mode;
+-int resolve_hosts;
+ int use_iec;
+ int force;
+ int ok;
+-- 
+2.20.1
+
diff --git a/SOURCES/0065-json_writer-add-new-json-handlers-null-float-with-fo.patch b/SOURCES/0065-json_writer-add-new-json-handlers-null-float-with-fo.patch
new file mode 100644
index 0000000..cb5f307
--- /dev/null
+++ b/SOURCES/0065-json_writer-add-new-json-handlers-null-float-with-fo.patch
@@ -0,0 +1,161 @@
+From b4b11394d071810d694b66962e8d48cb866af473 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 25 Mar 2019 13:30:53 +0100
+Subject: [PATCH] json_writer: add new json handlers (null, float with format,
+ lluint, hu)
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1642479
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1641914
+Upstream Status: iproute2.git commit 7252f16b2d191
+
+commit 7252f16b2d1919b31f0a2ec094dd3516b1e33a55
+Author: Julien Fortin <julien@cumulusnetworks.com>
+Date:   Thu Aug 17 10:35:50 2017 -0700
+
+    json_writer: add new json handlers (null, float with format, lluint, hu)
+
+    Signed-off-by: Julien Fortin <julien@cumulusnetworks.com>
+---
+ include/json_writer.h |  9 +++++++++
+ lib/json_writer.c     | 44 +++++++++++++++++++++++++++++++++++++++----
+ 2 files changed, 49 insertions(+), 4 deletions(-)
+
+diff --git a/include/json_writer.h b/include/json_writer.h
+index ab9a008a67994..1516aafba59df 100644
+--- a/include/json_writer.h
++++ b/include/json_writer.h
+@@ -33,20 +33,29 @@ void jsonw_pretty(json_writer_t *self, bool on);
+ void jsonw_name(json_writer_t *self, const char *name);
+ 
+ /* Add value  */
++void jsonw_printf(json_writer_t *self, const char *fmt, ...);
+ void jsonw_string(json_writer_t *self, const char *value);
+ void jsonw_bool(json_writer_t *self, bool value);
+ void jsonw_float(json_writer_t *self, double number);
++void jsonw_float_fmt(json_writer_t *self, const char *fmt, double num);
+ void jsonw_uint(json_writer_t *self, uint64_t number);
++void jsonw_hu(json_writer_t *self, unsigned short number);
+ void jsonw_int(json_writer_t *self, int64_t number);
+ void jsonw_null(json_writer_t *self);
++void jsonw_lluint(json_writer_t *self, unsigned long long int num);
+ 
+ /* Useful Combinations of name and value */
+ void jsonw_string_field(json_writer_t *self, const char *prop, const char *val);
+ void jsonw_bool_field(json_writer_t *self, const char *prop, bool value);
+ void jsonw_float_field(json_writer_t *self, const char *prop, double num);
+ void jsonw_uint_field(json_writer_t *self, const char *prop, uint64_t num);
++void jsonw_hu_field(json_writer_t *self, const char *prop, unsigned short num);
+ void jsonw_int_field(json_writer_t *self, const char *prop, int64_t num);
+ void jsonw_null_field(json_writer_t *self, const char *prop);
++void jsonw_lluint_field(json_writer_t *self, const char *prop,
++			unsigned long long int num);
++void jsonw_float_field_fmt(json_writer_t *self, const char *prop,
++			   const char *fmt, double val);
+ 
+ /* Collections */
+ void jsonw_start_object(json_writer_t *self);
+diff --git a/lib/json_writer.c b/lib/json_writer.c
+index 9fc05e96b605f..6b77d288cce2b 100644
+--- a/lib/json_writer.c
++++ b/lib/json_writer.c
+@@ -156,7 +156,7 @@ void jsonw_name(json_writer_t *self, const char *name)
+ 		putc(' ', self->out);
+ }
+ 
+-static void jsonw_printf(json_writer_t *self, const char *fmt, ...)
++void jsonw_printf(json_writer_t *self, const char *fmt, ...)
+ {
+ 	va_list ap;
+ 
+@@ -199,23 +199,38 @@ void jsonw_bool(json_writer_t *self, bool val)
+ 	jsonw_printf(self, "%s", val ? "true" : "false");
+ }
+ 
+-#ifdef notused
+ void jsonw_null(json_writer_t *self)
+ {
+ 	jsonw_printf(self, "null");
+ }
+ 
++void jsonw_float_fmt(json_writer_t *self, const char *fmt, double num)
++{
++	jsonw_printf(self, fmt, num);
++}
++
++#ifdef notused
+ void jsonw_float(json_writer_t *self, double num)
+ {
+ 	jsonw_printf(self, "%g", num);
+ }
+ #endif
+ 
++void jsonw_hu(json_writer_t *self, unsigned short num)
++{
++	jsonw_printf(self, "%hu", num);
++}
++
+ void jsonw_uint(json_writer_t *self, uint64_t num)
+ {
+ 	jsonw_printf(self, "%"PRIu64, num);
+ }
+ 
++void jsonw_lluint(json_writer_t *self, unsigned long long int num)
++{
++	jsonw_printf(self, "%llu", num);
++}
++
+ void jsonw_int(json_writer_t *self, int64_t num)
+ {
+ 	jsonw_printf(self, "%"PRId64, num);
+@@ -242,25 +257,46 @@ void jsonw_float_field(json_writer_t *self, const char *prop, double val)
+ }
+ #endif
+ 
++void jsonw_float_field_fmt(json_writer_t *self,
++			   const char *prop,
++			   const char *fmt,
++			   double val)
++{
++	jsonw_name(self, prop);
++	jsonw_float_fmt(self, fmt, val);
++}
++
+ void jsonw_uint_field(json_writer_t *self, const char *prop, uint64_t num)
+ {
+ 	jsonw_name(self, prop);
+ 	jsonw_uint(self, num);
+ }
+ 
++void jsonw_hu_field(json_writer_t *self, const char *prop, unsigned short num)
++{
++	jsonw_name(self, prop);
++	jsonw_hu(self, num);
++}
++
++void jsonw_lluint_field(json_writer_t *self,
++			const char *prop,
++			unsigned long long int num)
++{
++	jsonw_name(self, prop);
++	jsonw_lluint(self, num);
++}
++
+ void jsonw_int_field(json_writer_t *self, const char *prop, int64_t num)
+ {
+ 	jsonw_name(self, prop);
+ 	jsonw_int(self, num);
+ }
+ 
+-#ifdef notused
+ void jsonw_null_field(json_writer_t *self, const char *prop)
+ {
+ 	jsonw_name(self, prop);
+ 	jsonw_null(self);
+ }
+-#endif
+ 
+ #ifdef TEST
+ int main(int argc, char **argv)
+-- 
+2.20.1
+
diff --git a/SOURCES/0066-rdma-Add-MR-resource-tracking-information.patch b/SOURCES/0066-rdma-Add-MR-resource-tracking-information.patch
new file mode 100644
index 0000000..76c39d0
--- /dev/null
+++ b/SOURCES/0066-rdma-Add-MR-resource-tracking-information.patch
@@ -0,0 +1,90 @@
+From a7f1b85b6838bdab705aef188bb0c86626bc3391 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 25 Mar 2019 13:31:02 +0100
+Subject: [PATCH] rdma: Add MR resource tracking information
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1642479
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1641914
+Upstream Status: iproute2.git commit 8958a15c040e0
+Conflicts: remove rdma chunks due to missing files
+
+commit 8958a15c040e05f4f2c6f3946322202fdb875348
+Author: Steve Wise <swise@opengridcomputing.com>
+Date:   Thu Mar 29 09:10:41 2018 -0700
+
+    rdma: Add MR resource tracking information
+
+    Sample output:
+
+    Without CAP_NET_ADMIN:
+
+    $ rdma resource show mr mrlen 65536
+    dev mlx4_0 mrlen 65536 pid 0 comm [nvme_rdma]
+    dev cxgb4_0 mrlen 65536 pid 0 comm [nvme_rdma]
+
+    With CAP_NET_ADMIN:
+
+    # rdma resource show mr mrlen 65536
+    dev mlx4_0 rkey 0x12702 lkey 0x12702 iova 0x85724a000 mrlen 65536 pid 0 comm [nvme_rdma]
+    dev cxgb4_0 rkey 0x68fe4e9 lkey 0x68fe4e9 iova 0x835b91000 mrlen 65536 pid 0 comm [nvme_rdma]
+
+    Signed-off-by: Steve Wise <swise@opengridcomputing.com>
+    Reviewed-by: Leon Romanovsky <leonro@mellanox.com>
+    Signed-off-by: David Ahern <dsahern@gmail.com>
+---
+ include/json_writer.h |  2 ++
+ lib/json_writer.c     | 11 +++++++++++
+ 2 files changed, 13 insertions(+)
+
+diff --git a/include/json_writer.h b/include/json_writer.h
+index 1516aafba59df..34f2ccc2f5423 100644
+--- a/include/json_writer.h
++++ b/include/json_writer.h
+@@ -39,6 +39,7 @@ void jsonw_bool(json_writer_t *self, bool value);
+ void jsonw_float(json_writer_t *self, double number);
+ void jsonw_float_fmt(json_writer_t *self, const char *fmt, double num);
+ void jsonw_uint(json_writer_t *self, uint64_t number);
++void jsonw_xint(json_writer_t *self, uint64_t number);
+ void jsonw_hu(json_writer_t *self, unsigned short number);
+ void jsonw_int(json_writer_t *self, int64_t number);
+ void jsonw_null(json_writer_t *self);
+@@ -49,6 +50,7 @@ void jsonw_string_field(json_writer_t *self, const char *prop, const char *val);
+ void jsonw_bool_field(json_writer_t *self, const char *prop, bool value);
+ void jsonw_float_field(json_writer_t *self, const char *prop, double num);
+ void jsonw_uint_field(json_writer_t *self, const char *prop, uint64_t num);
++void jsonw_xint_field(json_writer_t *self, const char *prop, uint64_t num);
+ void jsonw_hu_field(json_writer_t *self, const char *prop, unsigned short num);
+ void jsonw_int_field(json_writer_t *self, const char *prop, int64_t num);
+ void jsonw_null_field(json_writer_t *self, const char *prop);
+diff --git a/lib/json_writer.c b/lib/json_writer.c
+index 6b77d288cce2b..6aaa6b4170711 100644
+--- a/lib/json_writer.c
++++ b/lib/json_writer.c
+@@ -226,6 +226,11 @@ void jsonw_uint(json_writer_t *self, uint64_t num)
+ 	jsonw_printf(self, "%"PRIu64, num);
+ }
+ 
++void jsonw_xint(json_writer_t *self, uint64_t num)
++{
++	jsonw_printf(self, "%"PRIx64, num);
++}
++
+ void jsonw_lluint(json_writer_t *self, unsigned long long int num)
+ {
+ 	jsonw_printf(self, "%llu", num);
+@@ -272,6 +277,12 @@ void jsonw_uint_field(json_writer_t *self, const char *prop, uint64_t num)
+ 	jsonw_uint(self, num);
+ }
+ 
++void jsonw_xint_field(json_writer_t *self, const char *prop, uint64_t num)
++{
++	jsonw_name(self, prop);
++	jsonw_xint(self, num);
++}
++
+ void jsonw_hu_field(json_writer_t *self, const char *prop, unsigned short num)
+ {
+ 	jsonw_name(self, prop);
+-- 
+2.20.1
+
diff --git a/SOURCES/0067-rdma-add-infrastructure-for-RDMA-tool.patch b/SOURCES/0067-rdma-add-infrastructure-for-RDMA-tool.patch
new file mode 100644
index 0000000..e30744c
--- /dev/null
+++ b/SOURCES/0067-rdma-add-infrastructure-for-RDMA-tool.patch
@@ -0,0 +1,5287 @@
+From 6ca04b58fcbaeaa5c8848e77ae0cfcf8b5f4c9ab Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 25 Mar 2019 13:31:34 +0100
+Subject: [PATCH] rdma: add infrastructure for RDMA tool
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1642479
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1641914
+Upstream Status: RHEL-only
+
+commit de87313c8cd0399fd803fcaa8dfaa4aa27912f79
+Author: Andrea Claudi <aclaudi@redhat.com>
+Date:   Thu Mar 21 17:24:12 2019 +0100
+
+    rdma: add infrastructure for RDMA tool
+
+    Checkout to the v5.0.0 upstream tag.
+
+    Conflicts:
+      - add rdma on base Makefile
+      - fix config path and libmnl cflags and libs on rdma/Makefile
+
+    Signed-off-by: Andrea Claudi <aclaudi@redhat.com>
+---
+ Makefile                               |    2 +-
+ rdma/.gitignore                        |    1 +
+ rdma/Makefile                          |   27 +
+ rdma/dev.c                             |  312 ++++++
+ rdma/include/uapi/rdma/ib_user_sa.h    |   77 ++
+ rdma/include/uapi/rdma/ib_user_verbs.h | 1302 ++++++++++++++++++++++++
+ rdma/include/uapi/rdma/rdma_netlink.h  |  438 ++++++++
+ rdma/include/uapi/rdma/rdma_user_cm.h  |  324 ++++++
+ rdma/link.c                            |  355 +++++++
+ rdma/rdma.c                            |  203 ++++
+ rdma/rdma.h                            |  131 +++
+ rdma/res.c                             | 1111 ++++++++++++++++++++
+ rdma/utils.c                           |  868 ++++++++++++++++
+ 13 files changed, 5150 insertions(+), 1 deletion(-)
+ create mode 100644 rdma/.gitignore
+ create mode 100644 rdma/Makefile
+ create mode 100644 rdma/dev.c
+ create mode 100644 rdma/include/uapi/rdma/ib_user_sa.h
+ create mode 100644 rdma/include/uapi/rdma/ib_user_verbs.h
+ create mode 100644 rdma/include/uapi/rdma/rdma_netlink.h
+ create mode 100644 rdma/include/uapi/rdma/rdma_user_cm.h
+ create mode 100644 rdma/link.c
+ create mode 100644 rdma/rdma.c
+ create mode 100644 rdma/rdma.h
+ create mode 100644 rdma/res.c
+ create mode 100644 rdma/utils.c
+
+diff --git a/Makefile b/Makefile
+index df2fa33630e65..aea12423166cd 100644
+--- a/Makefile
++++ b/Makefile
+@@ -52,7 +52,7 @@ WFLAGS += -Wmissing-declarations -Wold-style-definition -Wformat=2
+ CFLAGS := $(WFLAGS) $(CCOPTS) -I../include -I../include/uapi $(DEFINES) $(CFLAGS)
+ YACCFLAGS = -d -t -v
+ 
+-SUBDIRS=lib ip tc bridge misc netem genl tipc devlink man
++SUBDIRS=lib ip tc bridge misc netem genl tipc devlink rdma man
+ 
+ LIBNETLINK=../lib/libnetlink.a ../lib/libutil.a
+ LDLIBS += $(LIBNETLINK)
+diff --git a/rdma/.gitignore b/rdma/.gitignore
+new file mode 100644
+index 0000000000000..51fb172baa216
+--- /dev/null
++++ b/rdma/.gitignore
+@@ -0,0 +1 @@
++rdma
+diff --git a/rdma/Makefile b/rdma/Makefile
+new file mode 100644
+index 0000000000000..0830c82f77edb
+--- /dev/null
++++ b/rdma/Makefile
+@@ -0,0 +1,27 @@
++# SPDX-License-Identifier: GPL-2.0
++include ../Config
++
++TARGETS :=
++
++ifeq ($(HAVE_MNL),y)
++CFLAGS += -I./include/uapi/
++CFLAGS += $(shell $(PKG_CONFIG) libmnl --cflags)
++LDLIBS += $(shell $(PKG_CONFIG) libmnl --libs)
++
++RDMA_OBJ = rdma.o utils.o dev.o link.o res.o
++
++TARGETS += rdma
++endif
++
++all:	$(TARGETS) $(LIBS)
++
++rdma:	$(RDMA_OBJ) $(LIBS)
++	$(QUIET_LINK)$(CC) $^ $(LDFLAGS) $(LDLIBS) -o $@
++
++install: all
++	for i in $(TARGETS); \
++	do install -m 0755 $$i $(DESTDIR)$(SBINDIR); \
++	done
++
++clean:
++	rm -f $(RDMA_OBJ) $(TARGETS)
+diff --git a/rdma/dev.c b/rdma/dev.c
+new file mode 100644
+index 0000000000000..60ff4b31e3204
+--- /dev/null
++++ b/rdma/dev.c
+@@ -0,0 +1,312 @@
++/*
++ * dev.c	RDMA tool
++ *
++ *              This program is free software; you can redistribute it and/or
++ *              modify it under the terms of the GNU General Public License
++ *              as published by the Free Software Foundation; either version
++ *              2 of the License, or (at your option) any later version.
++ *
++ * Authors:     Leon Romanovsky <leonro@mellanox.com>
++ */
++
++#include "rdma.h"
++
++static int dev_help(struct rd *rd)
++{
++	pr_out("Usage: %s dev show [DEV]\n", rd->filename);
++	pr_out("       %s dev set [DEV] name DEVNAME\n", rd->filename);
++	return 0;
++}
++
++static const char *dev_caps_to_str(uint32_t idx)
++{
++#define RDMA_DEV_FLAGS_LOW(x) \
++	x(RESIZE_MAX_WR, 0) \
++	x(BAD_PKEY_CNTR, 1) \
++	x(BAD_QKEY_CNTR, 2) \
++	x(RAW_MULTI, 3) \
++	x(AUTO_PATH_MIG, 4) \
++	x(CHANGE_PHY_PORT, 5) \
++	x(UD_AV_PORT_ENFORCE_PORT_ENFORCE, 6) \
++	x(CURR_QP_STATE_MOD, 7) \
++	x(SHUTDOWN_PORT, 8) \
++	x(INIT_TYPE, 9) \
++	x(PORT_ACTIVE_EVENT, 10) \
++	x(SYS_IMAGE_GUID, 11) \
++	x(RC_RNR_NAK_GEN, 12) \
++	x(SRQ_RESIZE, 13) \
++	x(N_NOTIFY_CQ, 14) \
++	x(LOCAL_DMA_LKEY, 15) \
++	x(MEM_WINDOW, 17) \
++	x(UD_IP_CSUM, 18) \
++	x(UD_TSO, 19) \
++	x(XRC, 20) \
++	x(MEM_MGT_EXTENSIONS, 21) \
++	x(BLOCK_MULTICAST_LOOPBACK, 22) \
++	x(MEM_WINDOW_TYPE_2A, 23) \
++	x(MEM_WINDOW_TYPE_2B, 24) \
++	x(RC_IP_CSUM, 25) \
++	x(RAW_IP_CSUM, 26) \
++	x(CROSS_CHANNEL, 27) \
++	x(MANAGED_FLOW_STEERING, 29) \
++	x(SIGNATURE_HANDOVER, 30) \
++	x(ON_DEMAND_PAGING, 31)
++
++#define RDMA_DEV_FLAGS_HIGH(x) \
++	x(SG_GAPS_REG, 0) \
++	x(VIRTUAL_FUNCTION, 1) \
++	x(RAW_SCATTER_FCS, 2) \
++	x(RDMA_NETDEV_OPA_VNIC, 3) \
++	x(PCI_WRITE_END_PADDING, 4)
++
++	/*
++	 * Separation below is needed to allow compilation of rdmatool
++	 * on 32bits systems. On such systems, C-enum is limited to be
++	 * int and can't hold more than 32 bits.
++	 */
++	enum { RDMA_DEV_FLAGS_LOW(RDMA_BITMAP_ENUM) };
++	enum { RDMA_DEV_FLAGS_HIGH(RDMA_BITMAP_ENUM) };
++
++	static const char * const
++		rdma_dev_names_low[] = { RDMA_DEV_FLAGS_LOW(RDMA_BITMAP_NAMES) };
++	static const char * const
++		rdma_dev_names_high[] = { RDMA_DEV_FLAGS_HIGH(RDMA_BITMAP_NAMES) };
++	uint32_t high_idx;
++	#undef RDMA_DEV_FLAGS_LOW
++	#undef RDMA_DEV_FLAGS_HIGH
++
++	if (idx < ARRAY_SIZE(rdma_dev_names_low) && rdma_dev_names_low[idx])
++		return rdma_dev_names_low[idx];
++
++	high_idx = idx - ARRAY_SIZE(rdma_dev_names_low);
++	if (high_idx <  ARRAY_SIZE(rdma_dev_names_high) &&
++	    rdma_dev_names_high[high_idx])
++		return rdma_dev_names_high[high_idx];
++
++	return "UNKNOWN";
++}
++
++static void dev_print_caps(struct rd *rd, struct nlattr **tb)
++{
++	uint64_t caps;
++	uint32_t idx;
++
++	if (!tb[RDMA_NLDEV_ATTR_CAP_FLAGS])
++		return;
++
++	caps = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_CAP_FLAGS]);
++
++	if (rd->json_output) {
++		jsonw_name(rd->jw, "caps");
++		jsonw_start_array(rd->jw);
++	} else {
++		pr_out("\n    caps: <");
++	}
++	for (idx = 0; caps; idx++) {
++		if (caps & 0x1) {
++			if (rd->json_output) {
++				jsonw_string(rd->jw, dev_caps_to_str(idx));
++			} else {
++				pr_out("%s", dev_caps_to_str(idx));
++				if (caps >> 0x1)
++					pr_out(", ");
++			}
++		}
++		caps >>= 0x1;
++	}
++
++	if (rd->json_output)
++		jsonw_end_array(rd->jw);
++	else
++		pr_out(">");
++}
++
++static void dev_print_fw(struct rd *rd, struct nlattr **tb)
++{
++	const char *str;
++	if (!tb[RDMA_NLDEV_ATTR_FW_VERSION])
++		return;
++
++	str = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_FW_VERSION]);
++	if (rd->json_output)
++		jsonw_string_field(rd->jw, "fw", str);
++	else
++		pr_out("fw %s ", str);
++}
++
++static void dev_print_node_guid(struct rd *rd, struct nlattr **tb)
++{
++	uint64_t node_guid;
++	uint16_t vp[4];
++	char str[32];
++
++	if (!tb[RDMA_NLDEV_ATTR_NODE_GUID])
++		return;
++
++	node_guid = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_NODE_GUID]);
++	memcpy(vp, &node_guid, sizeof(uint64_t));
++	snprintf(str, 32, "%04x:%04x:%04x:%04x", vp[3], vp[2], vp[1], vp[0]);
++	if (rd->json_output)
++		jsonw_string_field(rd->jw, "node_guid", str);
++	else
++		pr_out("node_guid %s ", str);
++}
++
++static void dev_print_sys_image_guid(struct rd *rd, struct nlattr **tb)
++{
++	uint64_t sys_image_guid;
++	uint16_t vp[4];
++	char str[32];
++
++	if (!tb[RDMA_NLDEV_ATTR_SYS_IMAGE_GUID])
++		return;
++
++	sys_image_guid = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_SYS_IMAGE_GUID]);
++	memcpy(vp, &sys_image_guid, sizeof(uint64_t));
++	snprintf(str, 32, "%04x:%04x:%04x:%04x", vp[3], vp[2], vp[1], vp[0]);
++	if (rd->json_output)
++		jsonw_string_field(rd->jw, "sys_image_guid", str);
++	else
++		pr_out("sys_image_guid %s ", str);
++}
++
++static const char *node_type_to_str(uint8_t node_type)
++{
++	static const char * const node_type_str[] = { "unknown", "ca",
++						      "switch", "router",
++						      "rnic", "usnic",
++						      "usnic_dp" };
++	if (node_type < ARRAY_SIZE(node_type_str))
++		return node_type_str[node_type];
++	return "unknown";
++}
++
++static void dev_print_node_type(struct rd *rd, struct nlattr **tb)
++{
++	const char *node_str;
++	uint8_t node_type;
++
++	if (!tb[RDMA_NLDEV_ATTR_DEV_NODE_TYPE])
++		return;
++
++	node_type = mnl_attr_get_u8(tb[RDMA_NLDEV_ATTR_DEV_NODE_TYPE]);
++	node_str = node_type_to_str(node_type);
++	if (rd->json_output)
++		jsonw_string_field(rd->jw, "node_type", node_str);
++	else
++		pr_out("node_type %s ", node_str);
++}
++
++static int dev_parse_cb(const struct nlmsghdr *nlh, void *data)
++{
++	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
++	struct rd *rd = data;
++	const char *name;
++	uint32_t idx;
++
++	mnl_attr_parse(nlh, 0, rd_attr_cb, tb);
++	if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME])
++		return MNL_CB_ERROR;
++
++	idx =  mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
++	name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]);
++	if (rd->json_output) {
++		jsonw_uint_field(rd->jw, "ifindex", idx);
++		jsonw_string_field(rd->jw, "ifname", name);
++	} else {
++		pr_out("%u: %s: ", idx, name);
++	}
++
++	dev_print_node_type(rd, tb);
++	dev_print_fw(rd, tb);
++	dev_print_node_guid(rd, tb);
++	dev_print_sys_image_guid(rd, tb);
++	if (rd->show_details)
++		dev_print_caps(rd, tb);
++
++	if (!rd->json_output)
++		pr_out("\n");
++	return MNL_CB_OK;
++}
++
++static int dev_no_args(struct rd *rd)
++{
++	uint32_t seq;
++	int ret;
++
++	rd_prepare_msg(rd, RDMA_NLDEV_CMD_GET,
++		       &seq, (NLM_F_REQUEST | NLM_F_ACK));
++	mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx);
++	ret = rd_send_msg(rd);
++	if (ret)
++		return ret;
++
++	if (rd->json_output)
++		jsonw_start_object(rd->jw);
++	ret = rd_recv_msg(rd, dev_parse_cb, rd, seq);
++	if (rd->json_output)
++		jsonw_end_object(rd->jw);
++	return ret;
++}
++
++static int dev_one_show(struct rd *rd)
++{
++	const struct rd_cmd cmds[] = {
++		{ NULL,		dev_no_args},
++		{ 0 }
++	};
++
++	return rd_exec_cmd(rd, cmds, "parameter");
++}
++
++static int dev_set_name(struct rd *rd)
++{
++	uint32_t seq;
++
++	if (rd_no_arg(rd)) {
++		pr_err("Please provide device new name.\n");
++		return -EINVAL;
++	}
++
++	rd_prepare_msg(rd, RDMA_NLDEV_CMD_SET,
++		       &seq, (NLM_F_REQUEST | NLM_F_ACK));
++	mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx);
++	mnl_attr_put_strz(rd->nlh, RDMA_NLDEV_ATTR_DEV_NAME, rd_argv(rd));
++
++	return rd_send_msg(rd);
++}
++
++static int dev_one_set(struct rd *rd)
++{
++	const struct rd_cmd cmds[] = {
++		{ NULL,		dev_help},
++		{ "name",	dev_set_name},
++		{ 0 }
++	};
++
++	return rd_exec_cmd(rd, cmds, "parameter");
++}
++
++static int dev_show(struct rd *rd)
++{
++	return rd_exec_dev(rd, dev_one_show);
++}
++
++static int dev_set(struct rd *rd)
++{
++	return rd_exec_require_dev(rd, dev_one_set);
++}
++
++int cmd_dev(struct rd *rd)
++{
++	const struct rd_cmd cmds[] = {
++		{ NULL,		dev_show },
++		{ "show",	dev_show },
++		{ "list",	dev_show },
++		{ "set",	dev_set },
++		{ "help",	dev_help },
++		{ 0 }
++	};
++
++	return rd_exec_cmd(rd, cmds, "dev command");
++}
+diff --git a/rdma/include/uapi/rdma/ib_user_sa.h b/rdma/include/uapi/rdma/ib_user_sa.h
+new file mode 100644
+index 0000000000000..435155d6e1c6a
+--- /dev/null
++++ b/rdma/include/uapi/rdma/ib_user_sa.h
+@@ -0,0 +1,77 @@
++/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR Linux-OpenIB) */
++/*
++ * Copyright (c) 2005 Intel Corporation.  All rights reserved.
++ *
++ * This software is available to you under a choice of one of two
++ * licenses.  You may choose to be licensed under the terms of the GNU
++ * General Public License (GPL) Version 2, available from the file
++ * COPYING in the main directory of this source tree, or the
++ * OpenIB.org BSD license below:
++ *
++ *     Redistribution and use in source and binary forms, with or
++ *     without modification, are permitted provided that the following
++ *     conditions are met:
++ *
++ *      - Redistributions of source code must retain the above
++ *        copyright notice, this list of conditions and the following
++ *        disclaimer.
++ *
++ *      - 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.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
++ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
++ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
++ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
++ * SOFTWARE.
++ */
++
++#ifndef IB_USER_SA_H
++#define IB_USER_SA_H
++
++#include <linux/types.h>
++
++enum {
++	IB_PATH_GMP		= 1,
++	IB_PATH_PRIMARY		= (1<<1),
++	IB_PATH_ALTERNATE	= (1<<2),
++	IB_PATH_OUTBOUND	= (1<<3),
++	IB_PATH_INBOUND		= (1<<4),
++	IB_PATH_INBOUND_REVERSE = (1<<5),
++	IB_PATH_BIDIRECTIONAL	= IB_PATH_OUTBOUND | IB_PATH_INBOUND_REVERSE
++};
++
++struct ib_path_rec_data {
++	__u32	flags;
++	__u32	reserved;
++	__u32	path_rec[16];
++};
++
++struct ib_user_path_rec {
++	__u8	dgid[16];
++	__u8	sgid[16];
++	__be16	dlid;
++	__be16	slid;
++	__u32	raw_traffic;
++	__be32	flow_label;
++	__u32	reversible;
++	__u32	mtu;
++	__be16	pkey;
++	__u8	hop_limit;
++	__u8	traffic_class;
++	__u8	numb_path;
++	__u8	sl;
++	__u8	mtu_selector;
++	__u8	rate_selector;
++	__u8	rate;
++	__u8	packet_life_time_selector;
++	__u8	packet_life_time;
++	__u8	preference;
++};
++
++#endif /* IB_USER_SA_H */
+diff --git a/rdma/include/uapi/rdma/ib_user_verbs.h b/rdma/include/uapi/rdma/ib_user_verbs.h
+new file mode 100644
+index 0000000000000..480d9a60b68e4
+--- /dev/null
++++ b/rdma/include/uapi/rdma/ib_user_verbs.h
+@@ -0,0 +1,1302 @@
++/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR Linux-OpenIB) */
++/*
++ * Copyright (c) 2005 Topspin Communications.  All rights reserved.
++ * Copyright (c) 2005, 2006 Cisco Systems.  All rights reserved.
++ * Copyright (c) 2005 PathScale, Inc.  All rights reserved.
++ * Copyright (c) 2006 Mellanox Technologies.  All rights reserved.
++ *
++ * This software is available to you under a choice of one of two
++ * licenses.  You may choose to be licensed under the terms of the GNU
++ * General Public License (GPL) Version 2, available from the file
++ * COPYING in the main directory of this source tree, or the
++ * OpenIB.org BSD license below:
++ *
++ *     Redistribution and use in source and binary forms, with or
++ *     without modification, are permitted provided that the following
++ *     conditions are met:
++ *
++ *      - Redistributions of source code must retain the above
++ *        copyright notice, this list of conditions and the following
++ *        disclaimer.
++ *
++ *      - 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.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
++ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
++ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
++ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
++ * SOFTWARE.
++ */
++
++#ifndef IB_USER_VERBS_H
++#define IB_USER_VERBS_H
++
++#include <linux/types.h>
++
++/*
++ * Increment this value if any changes that break userspace ABI
++ * compatibility are made.
++ */
++#define IB_USER_VERBS_ABI_VERSION	6
++#define IB_USER_VERBS_CMD_THRESHOLD    50
++
++enum ib_uverbs_write_cmds {
++	IB_USER_VERBS_CMD_GET_CONTEXT,
++	IB_USER_VERBS_CMD_QUERY_DEVICE,
++	IB_USER_VERBS_CMD_QUERY_PORT,
++	IB_USER_VERBS_CMD_ALLOC_PD,
++	IB_USER_VERBS_CMD_DEALLOC_PD,
++	IB_USER_VERBS_CMD_CREATE_AH,
++	IB_USER_VERBS_CMD_MODIFY_AH,
++	IB_USER_VERBS_CMD_QUERY_AH,
++	IB_USER_VERBS_CMD_DESTROY_AH,
++	IB_USER_VERBS_CMD_REG_MR,
++	IB_USER_VERBS_CMD_REG_SMR,
++	IB_USER_VERBS_CMD_REREG_MR,
++	IB_USER_VERBS_CMD_QUERY_MR,
++	IB_USER_VERBS_CMD_DEREG_MR,
++	IB_USER_VERBS_CMD_ALLOC_MW,
++	IB_USER_VERBS_CMD_BIND_MW,
++	IB_USER_VERBS_CMD_DEALLOC_MW,
++	IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL,
++	IB_USER_VERBS_CMD_CREATE_CQ,
++	IB_USER_VERBS_CMD_RESIZE_CQ,
++	IB_USER_VERBS_CMD_DESTROY_CQ,
++	IB_USER_VERBS_CMD_POLL_CQ,
++	IB_USER_VERBS_CMD_PEEK_CQ,
++	IB_USER_VERBS_CMD_REQ_NOTIFY_CQ,
++	IB_USER_VERBS_CMD_CREATE_QP,
++	IB_USER_VERBS_CMD_QUERY_QP,
++	IB_USER_VERBS_CMD_MODIFY_QP,
++	IB_USER_VERBS_CMD_DESTROY_QP,
++	IB_USER_VERBS_CMD_POST_SEND,
++	IB_USER_VERBS_CMD_POST_RECV,
++	IB_USER_VERBS_CMD_ATTACH_MCAST,
++	IB_USER_VERBS_CMD_DETACH_MCAST,
++	IB_USER_VERBS_CMD_CREATE_SRQ,
++	IB_USER_VERBS_CMD_MODIFY_SRQ,
++	IB_USER_VERBS_CMD_QUERY_SRQ,
++	IB_USER_VERBS_CMD_DESTROY_SRQ,
++	IB_USER_VERBS_CMD_POST_SRQ_RECV,
++	IB_USER_VERBS_CMD_OPEN_XRCD,
++	IB_USER_VERBS_CMD_CLOSE_XRCD,
++	IB_USER_VERBS_CMD_CREATE_XSRQ,
++	IB_USER_VERBS_CMD_OPEN_QP,
++};
++
++enum {
++	IB_USER_VERBS_EX_CMD_QUERY_DEVICE = IB_USER_VERBS_CMD_QUERY_DEVICE,
++	IB_USER_VERBS_EX_CMD_CREATE_CQ = IB_USER_VERBS_CMD_CREATE_CQ,
++	IB_USER_VERBS_EX_CMD_CREATE_QP = IB_USER_VERBS_CMD_CREATE_QP,
++	IB_USER_VERBS_EX_CMD_MODIFY_QP = IB_USER_VERBS_CMD_MODIFY_QP,
++	IB_USER_VERBS_EX_CMD_CREATE_FLOW = IB_USER_VERBS_CMD_THRESHOLD,
++	IB_USER_VERBS_EX_CMD_DESTROY_FLOW,
++	IB_USER_VERBS_EX_CMD_CREATE_WQ,
++	IB_USER_VERBS_EX_CMD_MODIFY_WQ,
++	IB_USER_VERBS_EX_CMD_DESTROY_WQ,
++	IB_USER_VERBS_EX_CMD_CREATE_RWQ_IND_TBL,
++	IB_USER_VERBS_EX_CMD_DESTROY_RWQ_IND_TBL,
++	IB_USER_VERBS_EX_CMD_MODIFY_CQ
++};
++
++/*
++ * Make sure that all structs defined in this file remain laid out so
++ * that they pack the same way on 32-bit and 64-bit architectures (to
++ * avoid incompatibility between 32-bit userspace and 64-bit kernels).
++ * Specifically:
++ *  - Do not use pointer types -- pass pointers in __u64 instead.
++ *  - Make sure that any structure larger than 4 bytes is padded to a
++ *    multiple of 8 bytes.  Otherwise the structure size will be
++ *    different between 32-bit and 64-bit architectures.
++ */
++
++struct ib_uverbs_async_event_desc {
++	__aligned_u64 element;
++	__u32 event_type;	/* enum ib_event_type */
++	__u32 reserved;
++};
++
++struct ib_uverbs_comp_event_desc {
++	__aligned_u64 cq_handle;
++};
++
++struct ib_uverbs_cq_moderation_caps {
++	__u16     max_cq_moderation_count;
++	__u16     max_cq_moderation_period;
++	__u32     reserved;
++};
++
++/*
++ * All commands from userspace should start with a __u32 command field
++ * followed by __u16 in_words and out_words fields (which give the
++ * length of the command block and response buffer if any in 32-bit
++ * words).  The kernel driver will read these fields first and read
++ * the rest of the command struct based on these value.
++ */
++
++#define IB_USER_VERBS_CMD_COMMAND_MASK 0xff
++#define IB_USER_VERBS_CMD_FLAG_EXTENDED 0x80000000u
++
++struct ib_uverbs_cmd_hdr {
++	__u32 command;
++	__u16 in_words;
++	__u16 out_words;
++};
++
++struct ib_uverbs_ex_cmd_hdr {
++	__aligned_u64 response;
++	__u16 provider_in_words;
++	__u16 provider_out_words;
++	__u32 cmd_hdr_reserved;
++};
++
++struct ib_uverbs_get_context {
++	__aligned_u64 response;
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_get_context_resp {
++	__u32 async_fd;
++	__u32 num_comp_vectors;
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_query_device {
++	__aligned_u64 response;
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_query_device_resp {
++	__aligned_u64 fw_ver;
++	__be64 node_guid;
++	__be64 sys_image_guid;
++	__aligned_u64 max_mr_size;
++	__aligned_u64 page_size_cap;
++	__u32 vendor_id;
++	__u32 vendor_part_id;
++	__u32 hw_ver;
++	__u32 max_qp;
++	__u32 max_qp_wr;
++	__u32 device_cap_flags;
++	__u32 max_sge;
++	__u32 max_sge_rd;
++	__u32 max_cq;
++	__u32 max_cqe;
++	__u32 max_mr;
++	__u32 max_pd;
++	__u32 max_qp_rd_atom;
++	__u32 max_ee_rd_atom;
++	__u32 max_res_rd_atom;
++	__u32 max_qp_init_rd_atom;
++	__u32 max_ee_init_rd_atom;
++	__u32 atomic_cap;
++	__u32 max_ee;
++	__u32 max_rdd;
++	__u32 max_mw;
++	__u32 max_raw_ipv6_qp;
++	__u32 max_raw_ethy_qp;
++	__u32 max_mcast_grp;
++	__u32 max_mcast_qp_attach;
++	__u32 max_total_mcast_qp_attach;
++	__u32 max_ah;
++	__u32 max_fmr;
++	__u32 max_map_per_fmr;
++	__u32 max_srq;
++	__u32 max_srq_wr;
++	__u32 max_srq_sge;
++	__u16 max_pkeys;
++	__u8  local_ca_ack_delay;
++	__u8  phys_port_cnt;
++	__u8  reserved[4];
++};
++
++struct ib_uverbs_ex_query_device {
++	__u32 comp_mask;
++	__u32 reserved;
++};
++
++struct ib_uverbs_odp_caps {
++	__aligned_u64 general_caps;
++	struct {
++		__u32 rc_odp_caps;
++		__u32 uc_odp_caps;
++		__u32 ud_odp_caps;
++	} per_transport_caps;
++	__u32 reserved;
++};
++
++struct ib_uverbs_rss_caps {
++	/* Corresponding bit will be set if qp type from
++	 * 'enum ib_qp_type' is supported, e.g.
++	 * supported_qpts |= 1 << IB_QPT_UD
++	 */
++	__u32 supported_qpts;
++	__u32 max_rwq_indirection_tables;
++	__u32 max_rwq_indirection_table_size;
++	__u32 reserved;
++};
++
++struct ib_uverbs_tm_caps {
++	/* Max size of rendezvous request message */
++	__u32 max_rndv_hdr_size;
++	/* Max number of entries in tag matching list */
++	__u32 max_num_tags;
++	/* TM flags */
++	__u32 flags;
++	/* Max number of outstanding list operations */
++	__u32 max_ops;
++	/* Max number of SGE in tag matching entry */
++	__u32 max_sge;
++	__u32 reserved;
++};
++
++struct ib_uverbs_ex_query_device_resp {
++	struct ib_uverbs_query_device_resp base;
++	__u32 comp_mask;
++	__u32 response_length;
++	struct ib_uverbs_odp_caps odp_caps;
++	__aligned_u64 timestamp_mask;
++	__aligned_u64 hca_core_clock; /* in KHZ */
++	__aligned_u64 device_cap_flags_ex;
++	struct ib_uverbs_rss_caps rss_caps;
++	__u32  max_wq_type_rq;
++	__u32 raw_packet_caps;
++	struct ib_uverbs_tm_caps tm_caps;
++	struct ib_uverbs_cq_moderation_caps cq_moderation_caps;
++	__aligned_u64 max_dm_size;
++};
++
++struct ib_uverbs_query_port {
++	__aligned_u64 response;
++	__u8  port_num;
++	__u8  reserved[7];
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_query_port_resp {
++	__u32 port_cap_flags;		/* see ib_uverbs_query_port_cap_flags */
++	__u32 max_msg_sz;
++	__u32 bad_pkey_cntr;
++	__u32 qkey_viol_cntr;
++	__u32 gid_tbl_len;
++	__u16 pkey_tbl_len;
++	__u16 lid;
++	__u16 sm_lid;
++	__u8  state;
++	__u8  max_mtu;
++	__u8  active_mtu;
++	__u8  lmc;
++	__u8  max_vl_num;
++	__u8  sm_sl;
++	__u8  subnet_timeout;
++	__u8  init_type_reply;
++	__u8  active_width;
++	__u8  active_speed;
++	__u8  phys_state;
++	__u8  link_layer;
++	__u8  flags;			/* see ib_uverbs_query_port_flags */
++	__u8  reserved;
++};
++
++struct ib_uverbs_alloc_pd {
++	__aligned_u64 response;
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_alloc_pd_resp {
++	__u32 pd_handle;
++	__u32 driver_data[0];
++};
++
++struct ib_uverbs_dealloc_pd {
++	__u32 pd_handle;
++};
++
++struct ib_uverbs_open_xrcd {
++	__aligned_u64 response;
++	__u32 fd;
++	__u32 oflags;
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_open_xrcd_resp {
++	__u32 xrcd_handle;
++	__u32 driver_data[0];
++};
++
++struct ib_uverbs_close_xrcd {
++	__u32 xrcd_handle;
++};
++
++struct ib_uverbs_reg_mr {
++	__aligned_u64 response;
++	__aligned_u64 start;
++	__aligned_u64 length;
++	__aligned_u64 hca_va;
++	__u32 pd_handle;
++	__u32 access_flags;
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_reg_mr_resp {
++	__u32 mr_handle;
++	__u32 lkey;
++	__u32 rkey;
++	__u32 driver_data[0];
++};
++
++struct ib_uverbs_rereg_mr {
++	__aligned_u64 response;
++	__u32 mr_handle;
++	__u32 flags;
++	__aligned_u64 start;
++	__aligned_u64 length;
++	__aligned_u64 hca_va;
++	__u32 pd_handle;
++	__u32 access_flags;
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_rereg_mr_resp {
++	__u32 lkey;
++	__u32 rkey;
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_dereg_mr {
++	__u32 mr_handle;
++};
++
++struct ib_uverbs_alloc_mw {
++	__aligned_u64 response;
++	__u32 pd_handle;
++	__u8  mw_type;
++	__u8  reserved[3];
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_alloc_mw_resp {
++	__u32 mw_handle;
++	__u32 rkey;
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_dealloc_mw {
++	__u32 mw_handle;
++};
++
++struct ib_uverbs_create_comp_channel {
++	__aligned_u64 response;
++};
++
++struct ib_uverbs_create_comp_channel_resp {
++	__u32 fd;
++};
++
++struct ib_uverbs_create_cq {
++	__aligned_u64 response;
++	__aligned_u64 user_handle;
++	__u32 cqe;
++	__u32 comp_vector;
++	__s32 comp_channel;
++	__u32 reserved;
++	__aligned_u64 driver_data[0];
++};
++
++enum ib_uverbs_ex_create_cq_flags {
++	IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION = 1 << 0,
++	IB_UVERBS_CQ_FLAGS_IGNORE_OVERRUN = 1 << 1,
++};
++
++struct ib_uverbs_ex_create_cq {
++	__aligned_u64 user_handle;
++	__u32 cqe;
++	__u32 comp_vector;
++	__s32 comp_channel;
++	__u32 comp_mask;
++	__u32 flags;  /* bitmask of ib_uverbs_ex_create_cq_flags */
++	__u32 reserved;
++};
++
++struct ib_uverbs_create_cq_resp {
++	__u32 cq_handle;
++	__u32 cqe;
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_ex_create_cq_resp {
++	struct ib_uverbs_create_cq_resp base;
++	__u32 comp_mask;
++	__u32 response_length;
++};
++
++struct ib_uverbs_resize_cq {
++	__aligned_u64 response;
++	__u32 cq_handle;
++	__u32 cqe;
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_resize_cq_resp {
++	__u32 cqe;
++	__u32 reserved;
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_poll_cq {
++	__aligned_u64 response;
++	__u32 cq_handle;
++	__u32 ne;
++};
++
++struct ib_uverbs_wc {
++	__aligned_u64 wr_id;
++	__u32 status;
++	__u32 opcode;
++	__u32 vendor_err;
++	__u32 byte_len;
++	union {
++		__be32 imm_data;
++		__u32 invalidate_rkey;
++	} ex;
++	__u32 qp_num;
++	__u32 src_qp;
++	__u32 wc_flags;
++	__u16 pkey_index;
++	__u16 slid;
++	__u8 sl;
++	__u8 dlid_path_bits;
++	__u8 port_num;
++	__u8 reserved;
++};
++
++struct ib_uverbs_poll_cq_resp {
++	__u32 count;
++	__u32 reserved;
++	struct ib_uverbs_wc wc[0];
++};
++
++struct ib_uverbs_req_notify_cq {
++	__u32 cq_handle;
++	__u32 solicited_only;
++};
++
++struct ib_uverbs_destroy_cq {
++	__aligned_u64 response;
++	__u32 cq_handle;
++	__u32 reserved;
++};
++
++struct ib_uverbs_destroy_cq_resp {
++	__u32 comp_events_reported;
++	__u32 async_events_reported;
++};
++
++struct ib_uverbs_global_route {
++	__u8  dgid[16];
++	__u32 flow_label;
++	__u8  sgid_index;
++	__u8  hop_limit;
++	__u8  traffic_class;
++	__u8  reserved;
++};
++
++struct ib_uverbs_ah_attr {
++	struct ib_uverbs_global_route grh;
++	__u16 dlid;
++	__u8  sl;
++	__u8  src_path_bits;
++	__u8  static_rate;
++	__u8  is_global;
++	__u8  port_num;
++	__u8  reserved;
++};
++
++struct ib_uverbs_qp_attr {
++	__u32	qp_attr_mask;
++	__u32	qp_state;
++	__u32	cur_qp_state;
++	__u32	path_mtu;
++	__u32	path_mig_state;
++	__u32	qkey;
++	__u32	rq_psn;
++	__u32	sq_psn;
++	__u32	dest_qp_num;
++	__u32	qp_access_flags;
++
++	struct ib_uverbs_ah_attr ah_attr;
++	struct ib_uverbs_ah_attr alt_ah_attr;
++
++	/* ib_qp_cap */
++	__u32	max_send_wr;
++	__u32	max_recv_wr;
++	__u32	max_send_sge;
++	__u32	max_recv_sge;
++	__u32	max_inline_data;
++
++	__u16	pkey_index;
++	__u16	alt_pkey_index;
++	__u8	en_sqd_async_notify;
++	__u8	sq_draining;
++	__u8	max_rd_atomic;
++	__u8	max_dest_rd_atomic;
++	__u8	min_rnr_timer;
++	__u8	port_num;
++	__u8	timeout;
++	__u8	retry_cnt;
++	__u8	rnr_retry;
++	__u8	alt_port_num;
++	__u8	alt_timeout;
++	__u8	reserved[5];
++};
++
++struct ib_uverbs_create_qp {
++	__aligned_u64 response;
++	__aligned_u64 user_handle;
++	__u32 pd_handle;
++	__u32 send_cq_handle;
++	__u32 recv_cq_handle;
++	__u32 srq_handle;
++	__u32 max_send_wr;
++	__u32 max_recv_wr;
++	__u32 max_send_sge;
++	__u32 max_recv_sge;
++	__u32 max_inline_data;
++	__u8  sq_sig_all;
++	__u8  qp_type;
++	__u8  is_srq;
++	__u8  reserved;
++	__aligned_u64 driver_data[0];
++};
++
++enum ib_uverbs_create_qp_mask {
++	IB_UVERBS_CREATE_QP_MASK_IND_TABLE = 1UL << 0,
++};
++
++enum {
++	IB_UVERBS_CREATE_QP_SUP_COMP_MASK = IB_UVERBS_CREATE_QP_MASK_IND_TABLE,
++};
++
++enum {
++	/*
++	 * This value is equal to IB_QP_DEST_QPN.
++	 */
++	IB_USER_LEGACY_LAST_QP_ATTR_MASK = 1ULL << 20,
++};
++
++enum {
++	/*
++	 * This value is equal to IB_QP_RATE_LIMIT.
++	 */
++	IB_USER_LAST_QP_ATTR_MASK = 1ULL << 25,
++};
++
++struct ib_uverbs_ex_create_qp {
++	__aligned_u64 user_handle;
++	__u32 pd_handle;
++	__u32 send_cq_handle;
++	__u32 recv_cq_handle;
++	__u32 srq_handle;
++	__u32 max_send_wr;
++	__u32 max_recv_wr;
++	__u32 max_send_sge;
++	__u32 max_recv_sge;
++	__u32 max_inline_data;
++	__u8  sq_sig_all;
++	__u8  qp_type;
++	__u8  is_srq;
++	__u8 reserved;
++	__u32 comp_mask;
++	__u32 create_flags;
++	__u32 rwq_ind_tbl_handle;
++	__u32  source_qpn;
++};
++
++struct ib_uverbs_open_qp {
++	__aligned_u64 response;
++	__aligned_u64 user_handle;
++	__u32 pd_handle;
++	__u32 qpn;
++	__u8  qp_type;
++	__u8  reserved[7];
++	__aligned_u64 driver_data[0];
++};
++
++/* also used for open response */
++struct ib_uverbs_create_qp_resp {
++	__u32 qp_handle;
++	__u32 qpn;
++	__u32 max_send_wr;
++	__u32 max_recv_wr;
++	__u32 max_send_sge;
++	__u32 max_recv_sge;
++	__u32 max_inline_data;
++	__u32 reserved;
++	__u32 driver_data[0];
++};
++
++struct ib_uverbs_ex_create_qp_resp {
++	struct ib_uverbs_create_qp_resp base;
++	__u32 comp_mask;
++	__u32 response_length;
++};
++
++/*
++ * This struct needs to remain a multiple of 8 bytes to keep the
++ * alignment of the modify QP parameters.
++ */
++struct ib_uverbs_qp_dest {
++	__u8  dgid[16];
++	__u32 flow_label;
++	__u16 dlid;
++	__u16 reserved;
++	__u8  sgid_index;
++	__u8  hop_limit;
++	__u8  traffic_class;
++	__u8  sl;
++	__u8  src_path_bits;
++	__u8  static_rate;
++	__u8  is_global;
++	__u8  port_num;
++};
++
++struct ib_uverbs_query_qp {
++	__aligned_u64 response;
++	__u32 qp_handle;
++	__u32 attr_mask;
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_query_qp_resp {
++	struct ib_uverbs_qp_dest dest;
++	struct ib_uverbs_qp_dest alt_dest;
++	__u32 max_send_wr;
++	__u32 max_recv_wr;
++	__u32 max_send_sge;
++	__u32 max_recv_sge;
++	__u32 max_inline_data;
++	__u32 qkey;
++	__u32 rq_psn;
++	__u32 sq_psn;
++	__u32 dest_qp_num;
++	__u32 qp_access_flags;
++	__u16 pkey_index;
++	__u16 alt_pkey_index;
++	__u8  qp_state;
++	__u8  cur_qp_state;
++	__u8  path_mtu;
++	__u8  path_mig_state;
++	__u8  sq_draining;
++	__u8  max_rd_atomic;
++	__u8  max_dest_rd_atomic;
++	__u8  min_rnr_timer;
++	__u8  port_num;
++	__u8  timeout;
++	__u8  retry_cnt;
++	__u8  rnr_retry;
++	__u8  alt_port_num;
++	__u8  alt_timeout;
++	__u8  sq_sig_all;
++	__u8  reserved[5];
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_modify_qp {
++	struct ib_uverbs_qp_dest dest;
++	struct ib_uverbs_qp_dest alt_dest;
++	__u32 qp_handle;
++	__u32 attr_mask;
++	__u32 qkey;
++	__u32 rq_psn;
++	__u32 sq_psn;
++	__u32 dest_qp_num;
++	__u32 qp_access_flags;
++	__u16 pkey_index;
++	__u16 alt_pkey_index;
++	__u8  qp_state;
++	__u8  cur_qp_state;
++	__u8  path_mtu;
++	__u8  path_mig_state;
++	__u8  en_sqd_async_notify;
++	__u8  max_rd_atomic;
++	__u8  max_dest_rd_atomic;
++	__u8  min_rnr_timer;
++	__u8  port_num;
++	__u8  timeout;
++	__u8  retry_cnt;
++	__u8  rnr_retry;
++	__u8  alt_port_num;
++	__u8  alt_timeout;
++	__u8  reserved[2];
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_ex_modify_qp {
++	struct ib_uverbs_modify_qp base;
++	__u32	rate_limit;
++	__u32	reserved;
++};
++
++struct ib_uverbs_ex_modify_qp_resp {
++	__u32  comp_mask;
++	__u32  response_length;
++};
++
++struct ib_uverbs_destroy_qp {
++	__aligned_u64 response;
++	__u32 qp_handle;
++	__u32 reserved;
++};
++
++struct ib_uverbs_destroy_qp_resp {
++	__u32 events_reported;
++};
++
++/*
++ * The ib_uverbs_sge structure isn't used anywhere, since we assume
++ * the ib_sge structure is packed the same way on 32-bit and 64-bit
++ * architectures in both kernel and user space.  It's just here to
++ * document the ABI.
++ */
++struct ib_uverbs_sge {
++	__aligned_u64 addr;
++	__u32 length;
++	__u32 lkey;
++};
++
++enum ib_uverbs_wr_opcode {
++	IB_UVERBS_WR_RDMA_WRITE = 0,
++	IB_UVERBS_WR_RDMA_WRITE_WITH_IMM = 1,
++	IB_UVERBS_WR_SEND = 2,
++	IB_UVERBS_WR_SEND_WITH_IMM = 3,
++	IB_UVERBS_WR_RDMA_READ = 4,
++	IB_UVERBS_WR_ATOMIC_CMP_AND_SWP = 5,
++	IB_UVERBS_WR_ATOMIC_FETCH_AND_ADD = 6,
++	IB_UVERBS_WR_LOCAL_INV = 7,
++	IB_UVERBS_WR_BIND_MW = 8,
++	IB_UVERBS_WR_SEND_WITH_INV = 9,
++	IB_UVERBS_WR_TSO = 10,
++	IB_UVERBS_WR_RDMA_READ_WITH_INV = 11,
++	IB_UVERBS_WR_MASKED_ATOMIC_CMP_AND_SWP = 12,
++	IB_UVERBS_WR_MASKED_ATOMIC_FETCH_AND_ADD = 13,
++	/* Review enum ib_wr_opcode before modifying this */
++};
++
++struct ib_uverbs_send_wr {
++	__aligned_u64 wr_id;
++	__u32 num_sge;
++	__u32 opcode;		/* see enum ib_uverbs_wr_opcode */
++	__u32 send_flags;
++	union {
++		__be32 imm_data;
++		__u32 invalidate_rkey;
++	} ex;
++	union {
++		struct {
++			__aligned_u64 remote_addr;
++			__u32 rkey;
++			__u32 reserved;
++		} rdma;
++		struct {
++			__aligned_u64 remote_addr;
++			__aligned_u64 compare_add;
++			__aligned_u64 swap;
++			__u32 rkey;
++			__u32 reserved;
++		} atomic;
++		struct {
++			__u32 ah;
++			__u32 remote_qpn;
++			__u32 remote_qkey;
++			__u32 reserved;
++		} ud;
++	} wr;
++};
++
++struct ib_uverbs_post_send {
++	__aligned_u64 response;
++	__u32 qp_handle;
++	__u32 wr_count;
++	__u32 sge_count;
++	__u32 wqe_size;
++	struct ib_uverbs_send_wr send_wr[0];
++};
++
++struct ib_uverbs_post_send_resp {
++	__u32 bad_wr;
++};
++
++struct ib_uverbs_recv_wr {
++	__aligned_u64 wr_id;
++	__u32 num_sge;
++	__u32 reserved;
++};
++
++struct ib_uverbs_post_recv {
++	__aligned_u64 response;
++	__u32 qp_handle;
++	__u32 wr_count;
++	__u32 sge_count;
++	__u32 wqe_size;
++	struct ib_uverbs_recv_wr recv_wr[0];
++};
++
++struct ib_uverbs_post_recv_resp {
++	__u32 bad_wr;
++};
++
++struct ib_uverbs_post_srq_recv {
++	__aligned_u64 response;
++	__u32 srq_handle;
++	__u32 wr_count;
++	__u32 sge_count;
++	__u32 wqe_size;
++	struct ib_uverbs_recv_wr recv[0];
++};
++
++struct ib_uverbs_post_srq_recv_resp {
++	__u32 bad_wr;
++};
++
++struct ib_uverbs_create_ah {
++	__aligned_u64 response;
++	__aligned_u64 user_handle;
++	__u32 pd_handle;
++	__u32 reserved;
++	struct ib_uverbs_ah_attr attr;
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_create_ah_resp {
++	__u32 ah_handle;
++	__u32 driver_data[0];
++};
++
++struct ib_uverbs_destroy_ah {
++	__u32 ah_handle;
++};
++
++struct ib_uverbs_attach_mcast {
++	__u8  gid[16];
++	__u32 qp_handle;
++	__u16 mlid;
++	__u16 reserved;
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_detach_mcast {
++	__u8  gid[16];
++	__u32 qp_handle;
++	__u16 mlid;
++	__u16 reserved;
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_flow_spec_hdr {
++	__u32 type;
++	__u16 size;
++	__u16 reserved;
++	/* followed by flow_spec */
++	__aligned_u64 flow_spec_data[0];
++};
++
++struct ib_uverbs_flow_eth_filter {
++	__u8  dst_mac[6];
++	__u8  src_mac[6];
++	__be16 ether_type;
++	__be16 vlan_tag;
++};
++
++struct ib_uverbs_flow_spec_eth {
++	union {
++		struct ib_uverbs_flow_spec_hdr hdr;
++		struct {
++			__u32 type;
++			__u16 size;
++			__u16 reserved;
++		};
++	};
++	struct ib_uverbs_flow_eth_filter val;
++	struct ib_uverbs_flow_eth_filter mask;
++};
++
++struct ib_uverbs_flow_ipv4_filter {
++	__be32 src_ip;
++	__be32 dst_ip;
++	__u8	proto;
++	__u8	tos;
++	__u8	ttl;
++	__u8	flags;
++};
++
++struct ib_uverbs_flow_spec_ipv4 {
++	union {
++		struct ib_uverbs_flow_spec_hdr hdr;
++		struct {
++			__u32 type;
++			__u16 size;
++			__u16 reserved;
++		};
++	};
++	struct ib_uverbs_flow_ipv4_filter val;
++	struct ib_uverbs_flow_ipv4_filter mask;
++};
++
++struct ib_uverbs_flow_tcp_udp_filter {
++	__be16 dst_port;
++	__be16 src_port;
++};
++
++struct ib_uverbs_flow_spec_tcp_udp {
++	union {
++		struct ib_uverbs_flow_spec_hdr hdr;
++		struct {
++			__u32 type;
++			__u16 size;
++			__u16 reserved;
++		};
++	};
++	struct ib_uverbs_flow_tcp_udp_filter val;
++	struct ib_uverbs_flow_tcp_udp_filter mask;
++};
++
++struct ib_uverbs_flow_ipv6_filter {
++	__u8    src_ip[16];
++	__u8    dst_ip[16];
++	__be32	flow_label;
++	__u8	next_hdr;
++	__u8	traffic_class;
++	__u8	hop_limit;
++	__u8	reserved;
++};
++
++struct ib_uverbs_flow_spec_ipv6 {
++	union {
++		struct ib_uverbs_flow_spec_hdr hdr;
++		struct {
++			__u32 type;
++			__u16 size;
++			__u16 reserved;
++		};
++	};
++	struct ib_uverbs_flow_ipv6_filter val;
++	struct ib_uverbs_flow_ipv6_filter mask;
++};
++
++struct ib_uverbs_flow_spec_action_tag {
++	union {
++		struct ib_uverbs_flow_spec_hdr hdr;
++		struct {
++			__u32 type;
++			__u16 size;
++			__u16 reserved;
++		};
++	};
++	__u32			      tag_id;
++	__u32			      reserved1;
++};
++
++struct ib_uverbs_flow_spec_action_drop {
++	union {
++		struct ib_uverbs_flow_spec_hdr hdr;
++		struct {
++			__u32 type;
++			__u16 size;
++			__u16 reserved;
++		};
++	};
++};
++
++struct ib_uverbs_flow_spec_action_handle {
++	union {
++		struct ib_uverbs_flow_spec_hdr hdr;
++		struct {
++			__u32 type;
++			__u16 size;
++			__u16 reserved;
++		};
++	};
++	__u32			      handle;
++	__u32			      reserved1;
++};
++
++struct ib_uverbs_flow_spec_action_count {
++	union {
++		struct ib_uverbs_flow_spec_hdr hdr;
++		struct {
++			__u32 type;
++			__u16 size;
++			__u16 reserved;
++		};
++	};
++	__u32			      handle;
++	__u32			      reserved1;
++};
++
++struct ib_uverbs_flow_tunnel_filter {
++	__be32 tunnel_id;
++};
++
++struct ib_uverbs_flow_spec_tunnel {
++	union {
++		struct ib_uverbs_flow_spec_hdr hdr;
++		struct {
++			__u32 type;
++			__u16 size;
++			__u16 reserved;
++		};
++	};
++	struct ib_uverbs_flow_tunnel_filter val;
++	struct ib_uverbs_flow_tunnel_filter mask;
++};
++
++struct ib_uverbs_flow_spec_esp_filter {
++	__u32 spi;
++	__u32 seq;
++};
++
++struct ib_uverbs_flow_spec_esp {
++	union {
++		struct ib_uverbs_flow_spec_hdr hdr;
++		struct {
++			__u32 type;
++			__u16 size;
++			__u16 reserved;
++		};
++	};
++	struct ib_uverbs_flow_spec_esp_filter val;
++	struct ib_uverbs_flow_spec_esp_filter mask;
++};
++
++struct ib_uverbs_flow_gre_filter {
++	/* c_ks_res0_ver field is bits 0-15 in offset 0 of a standard GRE header:
++	 * bit 0 - C - checksum bit.
++	 * bit 1 - reserved. set to 0.
++	 * bit 2 - key bit.
++	 * bit 3 - sequence number bit.
++	 * bits 4:12 - reserved. set to 0.
++	 * bits 13:15 - GRE version.
++	 */
++	__be16 c_ks_res0_ver;
++	__be16 protocol;
++	__be32 key;
++};
++
++struct ib_uverbs_flow_spec_gre {
++	union {
++		struct ib_uverbs_flow_spec_hdr hdr;
++		struct {
++			__u32 type;
++			__u16 size;
++			__u16 reserved;
++		};
++	};
++	struct ib_uverbs_flow_gre_filter     val;
++	struct ib_uverbs_flow_gre_filter     mask;
++};
++
++struct ib_uverbs_flow_mpls_filter {
++	/* The field includes the entire MPLS label:
++	 * bits 0:19 - label field.
++	 * bits 20:22 - traffic class field.
++	 * bits 23 - bottom of stack bit.
++	 * bits 24:31 - ttl field.
++	 */
++	__be32 label;
++};
++
++struct ib_uverbs_flow_spec_mpls {
++	union {
++		struct ib_uverbs_flow_spec_hdr hdr;
++		struct {
++			__u32 type;
++			__u16 size;
++			__u16 reserved;
++		};
++	};
++	struct ib_uverbs_flow_mpls_filter     val;
++	struct ib_uverbs_flow_mpls_filter     mask;
++};
++
++struct ib_uverbs_flow_attr {
++	__u32 type;
++	__u16 size;
++	__u16 priority;
++	__u8  num_of_specs;
++	__u8  reserved[2];
++	__u8  port;
++	__u32 flags;
++	/* Following are the optional layers according to user request
++	 * struct ib_flow_spec_xxx
++	 * struct ib_flow_spec_yyy
++	 */
++	struct ib_uverbs_flow_spec_hdr flow_specs[0];
++};
++
++struct ib_uverbs_create_flow  {
++	__u32 comp_mask;
++	__u32 qp_handle;
++	struct ib_uverbs_flow_attr flow_attr;
++};
++
++struct ib_uverbs_create_flow_resp {
++	__u32 comp_mask;
++	__u32 flow_handle;
++};
++
++struct ib_uverbs_destroy_flow  {
++	__u32 comp_mask;
++	__u32 flow_handle;
++};
++
++struct ib_uverbs_create_srq {
++	__aligned_u64 response;
++	__aligned_u64 user_handle;
++	__u32 pd_handle;
++	__u32 max_wr;
++	__u32 max_sge;
++	__u32 srq_limit;
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_create_xsrq {
++	__aligned_u64 response;
++	__aligned_u64 user_handle;
++	__u32 srq_type;
++	__u32 pd_handle;
++	__u32 max_wr;
++	__u32 max_sge;
++	__u32 srq_limit;
++	__u32 max_num_tags;
++	__u32 xrcd_handle;
++	__u32 cq_handle;
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_create_srq_resp {
++	__u32 srq_handle;
++	__u32 max_wr;
++	__u32 max_sge;
++	__u32 srqn;
++	__u32 driver_data[0];
++};
++
++struct ib_uverbs_modify_srq {
++	__u32 srq_handle;
++	__u32 attr_mask;
++	__u32 max_wr;
++	__u32 srq_limit;
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_query_srq {
++	__aligned_u64 response;
++	__u32 srq_handle;
++	__u32 reserved;
++	__aligned_u64 driver_data[0];
++};
++
++struct ib_uverbs_query_srq_resp {
++	__u32 max_wr;
++	__u32 max_sge;
++	__u32 srq_limit;
++	__u32 reserved;
++};
++
++struct ib_uverbs_destroy_srq {
++	__aligned_u64 response;
++	__u32 srq_handle;
++	__u32 reserved;
++};
++
++struct ib_uverbs_destroy_srq_resp {
++	__u32 events_reported;
++};
++
++struct ib_uverbs_ex_create_wq  {
++	__u32 comp_mask;
++	__u32 wq_type;
++	__aligned_u64 user_handle;
++	__u32 pd_handle;
++	__u32 cq_handle;
++	__u32 max_wr;
++	__u32 max_sge;
++	__u32 create_flags; /* Use enum ib_wq_flags */
++	__u32 reserved;
++};
++
++struct ib_uverbs_ex_create_wq_resp {
++	__u32 comp_mask;
++	__u32 response_length;
++	__u32 wq_handle;
++	__u32 max_wr;
++	__u32 max_sge;
++	__u32 wqn;
++};
++
++struct ib_uverbs_ex_destroy_wq  {
++	__u32 comp_mask;
++	__u32 wq_handle;
++};
++
++struct ib_uverbs_ex_destroy_wq_resp {
++	__u32 comp_mask;
++	__u32 response_length;
++	__u32 events_reported;
++	__u32 reserved;
++};
++
++struct ib_uverbs_ex_modify_wq  {
++	__u32 attr_mask;
++	__u32 wq_handle;
++	__u32 wq_state;
++	__u32 curr_wq_state;
++	__u32 flags; /* Use enum ib_wq_flags */
++	__u32 flags_mask; /* Use enum ib_wq_flags */
++};
++
++/* Prevent memory allocation rather than max expected size */
++#define IB_USER_VERBS_MAX_LOG_IND_TBL_SIZE 0x0d
++struct ib_uverbs_ex_create_rwq_ind_table  {
++	__u32 comp_mask;
++	__u32 log_ind_tbl_size;
++	/* Following are the wq handles according to log_ind_tbl_size
++	 * wq_handle1
++	 * wq_handle2
++	 */
++	__u32 wq_handles[0];
++};
++
++struct ib_uverbs_ex_create_rwq_ind_table_resp {
++	__u32 comp_mask;
++	__u32 response_length;
++	__u32 ind_tbl_handle;
++	__u32 ind_tbl_num;
++};
++
++struct ib_uverbs_ex_destroy_rwq_ind_table  {
++	__u32 comp_mask;
++	__u32 ind_tbl_handle;
++};
++
++struct ib_uverbs_cq_moderation {
++	__u16 cq_count;
++	__u16 cq_period;
++};
++
++struct ib_uverbs_ex_modify_cq {
++	__u32 cq_handle;
++	__u32 attr_mask;
++	struct ib_uverbs_cq_moderation attr;
++	__u32 reserved;
++};
++
++#define IB_DEVICE_NAME_MAX 64
++
++#endif /* IB_USER_VERBS_H */
+diff --git a/rdma/include/uapi/rdma/rdma_netlink.h b/rdma/include/uapi/rdma/rdma_netlink.h
+new file mode 100644
+index 0000000000000..04c80cebef49f
+--- /dev/null
++++ b/rdma/include/uapi/rdma/rdma_netlink.h
+@@ -0,0 +1,438 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
++#ifndef _RDMA_NETLINK_H
++#define _RDMA_NETLINK_H
++
++#include <linux/types.h>
++
++enum {
++	RDMA_NL_RDMA_CM = 1,
++	RDMA_NL_IWCM,
++	RDMA_NL_RSVD,
++	RDMA_NL_LS,	/* RDMA Local Services */
++	RDMA_NL_NLDEV,	/* RDMA device interface */
++	RDMA_NL_NUM_CLIENTS
++};
++
++enum {
++	RDMA_NL_GROUP_CM = 1,
++	RDMA_NL_GROUP_IWPM,
++	RDMA_NL_GROUP_LS,
++	RDMA_NL_NUM_GROUPS
++};
++
++#define RDMA_NL_GET_CLIENT(type) ((type & (((1 << 6) - 1) << 10)) >> 10)
++#define RDMA_NL_GET_OP(type) (type & ((1 << 10) - 1))
++#define RDMA_NL_GET_TYPE(client, op) ((client << 10) + op)
++
++enum {
++	RDMA_NL_RDMA_CM_ID_STATS = 0,
++	RDMA_NL_RDMA_CM_NUM_OPS
++};
++
++enum {
++	RDMA_NL_RDMA_CM_ATTR_SRC_ADDR = 1,
++	RDMA_NL_RDMA_CM_ATTR_DST_ADDR,
++	RDMA_NL_RDMA_CM_NUM_ATTR,
++};
++
++/* iwarp port mapper op-codes */
++enum {
++	RDMA_NL_IWPM_REG_PID = 0,
++	RDMA_NL_IWPM_ADD_MAPPING,
++	RDMA_NL_IWPM_QUERY_MAPPING,
++	RDMA_NL_IWPM_REMOVE_MAPPING,
++	RDMA_NL_IWPM_REMOTE_INFO,
++	RDMA_NL_IWPM_HANDLE_ERR,
++	RDMA_NL_IWPM_MAPINFO,
++	RDMA_NL_IWPM_MAPINFO_NUM,
++	RDMA_NL_IWPM_NUM_OPS
++};
++
++struct rdma_cm_id_stats {
++	__u32	qp_num;
++	__u32	bound_dev_if;
++	__u32	port_space;
++	__s32	pid;
++	__u8	cm_state;
++	__u8	node_type;
++	__u8	port_num;
++	__u8	qp_type;
++};
++
++enum {
++	IWPM_NLA_REG_PID_UNSPEC = 0,
++	IWPM_NLA_REG_PID_SEQ,
++	IWPM_NLA_REG_IF_NAME,
++	IWPM_NLA_REG_IBDEV_NAME,
++	IWPM_NLA_REG_ULIB_NAME,
++	IWPM_NLA_REG_PID_MAX
++};
++
++enum {
++	IWPM_NLA_RREG_PID_UNSPEC = 0,
++	IWPM_NLA_RREG_PID_SEQ,
++	IWPM_NLA_RREG_IBDEV_NAME,
++	IWPM_NLA_RREG_ULIB_NAME,
++	IWPM_NLA_RREG_ULIB_VER,
++	IWPM_NLA_RREG_PID_ERR,
++	IWPM_NLA_RREG_PID_MAX
++
++};
++
++enum {
++	IWPM_NLA_MANAGE_MAPPING_UNSPEC = 0,
++	IWPM_NLA_MANAGE_MAPPING_SEQ,
++	IWPM_NLA_MANAGE_ADDR,
++	IWPM_NLA_MANAGE_MAPPED_LOC_ADDR,
++	IWPM_NLA_RMANAGE_MAPPING_ERR,
++	IWPM_NLA_RMANAGE_MAPPING_MAX
++};
++
++#define IWPM_NLA_MANAGE_MAPPING_MAX 3
++#define IWPM_NLA_QUERY_MAPPING_MAX  4
++#define IWPM_NLA_MAPINFO_SEND_MAX   3
++
++enum {
++	IWPM_NLA_QUERY_MAPPING_UNSPEC = 0,
++	IWPM_NLA_QUERY_MAPPING_SEQ,
++	IWPM_NLA_QUERY_LOCAL_ADDR,
++	IWPM_NLA_QUERY_REMOTE_ADDR,
++	IWPM_NLA_RQUERY_MAPPED_LOC_ADDR,
++	IWPM_NLA_RQUERY_MAPPED_REM_ADDR,
++	IWPM_NLA_RQUERY_MAPPING_ERR,
++	IWPM_NLA_RQUERY_MAPPING_MAX
++};
++
++enum {
++	IWPM_NLA_MAPINFO_REQ_UNSPEC = 0,
++	IWPM_NLA_MAPINFO_ULIB_NAME,
++	IWPM_NLA_MAPINFO_ULIB_VER,
++	IWPM_NLA_MAPINFO_REQ_MAX
++};
++
++enum {
++	IWPM_NLA_MAPINFO_UNSPEC = 0,
++	IWPM_NLA_MAPINFO_LOCAL_ADDR,
++	IWPM_NLA_MAPINFO_MAPPED_ADDR,
++	IWPM_NLA_MAPINFO_MAX
++};
++
++enum {
++	IWPM_NLA_MAPINFO_NUM_UNSPEC = 0,
++	IWPM_NLA_MAPINFO_SEQ,
++	IWPM_NLA_MAPINFO_SEND_NUM,
++	IWPM_NLA_MAPINFO_ACK_NUM,
++	IWPM_NLA_MAPINFO_NUM_MAX
++};
++
++enum {
++	IWPM_NLA_ERR_UNSPEC = 0,
++	IWPM_NLA_ERR_SEQ,
++	IWPM_NLA_ERR_CODE,
++	IWPM_NLA_ERR_MAX
++};
++
++/*
++ * Local service operations:
++ *   RESOLVE - The client requests the local service to resolve a path.
++ *   SET_TIMEOUT - The local service requests the client to set the timeout.
++ *   IP_RESOLVE - The client requests the local service to resolve an IP to GID.
++ */
++enum {
++	RDMA_NL_LS_OP_RESOLVE = 0,
++	RDMA_NL_LS_OP_SET_TIMEOUT,
++	RDMA_NL_LS_OP_IP_RESOLVE,
++	RDMA_NL_LS_NUM_OPS
++};
++
++/* Local service netlink message flags */
++#define RDMA_NL_LS_F_ERR	0x0100	/* Failed response */
++
++/*
++ * Local service resolve operation family header.
++ * The layout for the resolve operation:
++ *    nlmsg header
++ *    family header
++ *    attributes
++ */
++
++/*
++ * Local service path use:
++ * Specify how the path(s) will be used.
++ *   ALL - For connected CM operation (6 pathrecords)
++ *   UNIDIRECTIONAL - For unidirectional UD (1 pathrecord)
++ *   GMP - For miscellaneous GMP like operation (at least 1 reversible
++ *         pathrecord)
++ */
++enum {
++	LS_RESOLVE_PATH_USE_ALL = 0,
++	LS_RESOLVE_PATH_USE_UNIDIRECTIONAL,
++	LS_RESOLVE_PATH_USE_GMP,
++	LS_RESOLVE_PATH_USE_MAX
++};
++
++#define LS_DEVICE_NAME_MAX 64
++
++struct rdma_ls_resolve_header {
++	__u8 device_name[LS_DEVICE_NAME_MAX];
++	__u8 port_num;
++	__u8 path_use;
++};
++
++struct rdma_ls_ip_resolve_header {
++	__u32 ifindex;
++};
++
++/* Local service attribute type */
++#define RDMA_NLA_F_MANDATORY	(1 << 13)
++#define RDMA_NLA_TYPE_MASK	(~(NLA_F_NESTED | NLA_F_NET_BYTEORDER | \
++				  RDMA_NLA_F_MANDATORY))
++
++/*
++ * Local service attributes:
++ *   Attr Name       Size                       Byte order
++ *   -----------------------------------------------------
++ *   PATH_RECORD     struct ib_path_rec_data
++ *   TIMEOUT         u32                        cpu
++ *   SERVICE_ID      u64                        cpu
++ *   DGID            u8[16]                     BE
++ *   SGID            u8[16]                     BE
++ *   TCLASS          u8
++ *   PKEY            u16                        cpu
++ *   QOS_CLASS       u16                        cpu
++ *   IPV4            u32                        BE
++ *   IPV6            u8[16]                     BE
++ */
++enum {
++	LS_NLA_TYPE_UNSPEC = 0,
++	LS_NLA_TYPE_PATH_RECORD,
++	LS_NLA_TYPE_TIMEOUT,
++	LS_NLA_TYPE_SERVICE_ID,
++	LS_NLA_TYPE_DGID,
++	LS_NLA_TYPE_SGID,
++	LS_NLA_TYPE_TCLASS,
++	LS_NLA_TYPE_PKEY,
++	LS_NLA_TYPE_QOS_CLASS,
++	LS_NLA_TYPE_IPV4,
++	LS_NLA_TYPE_IPV6,
++	LS_NLA_TYPE_MAX
++};
++
++/* Local service DGID/SGID attribute: big endian */
++struct rdma_nla_ls_gid {
++	__u8		gid[16];
++};
++
++enum rdma_nldev_command {
++	RDMA_NLDEV_CMD_UNSPEC,
++
++	RDMA_NLDEV_CMD_GET, /* can dump */
++	RDMA_NLDEV_CMD_SET,
++
++	/* 3 - 4 are free to use */
++
++	RDMA_NLDEV_CMD_PORT_GET = 5, /* can dump */
++
++	/* 6 - 8 are free to use */
++
++	RDMA_NLDEV_CMD_RES_GET = 9, /* can dump */
++
++	RDMA_NLDEV_CMD_RES_QP_GET, /* can dump */
++
++	RDMA_NLDEV_CMD_RES_CM_ID_GET, /* can dump */
++
++	RDMA_NLDEV_CMD_RES_CQ_GET, /* can dump */
++
++	RDMA_NLDEV_CMD_RES_MR_GET, /* can dump */
++
++	RDMA_NLDEV_CMD_RES_PD_GET, /* can dump */
++
++	RDMA_NLDEV_NUM_OPS
++};
++
++enum {
++	RDMA_NLDEV_ATTR_ENTRY_STRLEN = 16,
++};
++
++enum rdma_nldev_print_type {
++	RDMA_NLDEV_PRINT_TYPE_UNSPEC,
++	RDMA_NLDEV_PRINT_TYPE_HEX,
++};
++
++enum rdma_nldev_attr {
++	/* don't change the order or add anything between, this is ABI! */
++	RDMA_NLDEV_ATTR_UNSPEC,
++
++	/* Pad attribute for 64b alignment */
++	RDMA_NLDEV_ATTR_PAD = RDMA_NLDEV_ATTR_UNSPEC,
++
++	/* Identifier for ib_device */
++	RDMA_NLDEV_ATTR_DEV_INDEX,		/* u32 */
++
++	RDMA_NLDEV_ATTR_DEV_NAME,		/* string */
++	/*
++	 * Device index together with port index are identifiers
++	 * for port/link properties.
++	 *
++	 * For RDMA_NLDEV_CMD_GET commamnd, port index will return number
++	 * of available ports in ib_device, while for port specific operations,
++	 * it will be real port index as it appears in sysfs. Port index follows
++	 * sysfs notation and starts from 1 for the first port.
++	 */
++	RDMA_NLDEV_ATTR_PORT_INDEX,		/* u32 */
++
++	/*
++	 * Device and port capabilities
++	 *
++	 * When used for port info, first 32-bits are CapabilityMask followed by
++	 * 16-bit CapabilityMask2.
++	 */
++	RDMA_NLDEV_ATTR_CAP_FLAGS,		/* u64 */
++
++	/*
++	 * FW version
++	 */
++	RDMA_NLDEV_ATTR_FW_VERSION,		/* string */
++
++	/*
++	 * Node GUID (in host byte order) associated with the RDMA device.
++	 */
++	RDMA_NLDEV_ATTR_NODE_GUID,			/* u64 */
++
++	/*
++	 * System image GUID (in host byte order) associated with
++	 * this RDMA device and other devices which are part of a
++	 * single system.
++	 */
++	RDMA_NLDEV_ATTR_SYS_IMAGE_GUID,		/* u64 */
++
++	/*
++	 * Subnet prefix (in host byte order)
++	 */
++	RDMA_NLDEV_ATTR_SUBNET_PREFIX,		/* u64 */
++
++	/*
++	 * Local Identifier (LID),
++	 * According to IB specification, It is 16-bit address assigned
++	 * by the Subnet Manager. Extended to be 32-bit for OmniPath users.
++	 */
++	RDMA_NLDEV_ATTR_LID,			/* u32 */
++	RDMA_NLDEV_ATTR_SM_LID,			/* u32 */
++
++	/*
++	 * LID mask control (LMC)
++	 */
++	RDMA_NLDEV_ATTR_LMC,			/* u8 */
++
++	RDMA_NLDEV_ATTR_PORT_STATE,		/* u8 */
++	RDMA_NLDEV_ATTR_PORT_PHYS_STATE,	/* u8 */
++
++	RDMA_NLDEV_ATTR_DEV_NODE_TYPE,		/* u8 */
++
++	RDMA_NLDEV_ATTR_RES_SUMMARY,		/* nested table */
++	RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY,	/* nested table */
++	RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_NAME,	/* string */
++	RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR,	/* u64 */
++
++	RDMA_NLDEV_ATTR_RES_QP,			/* nested table */
++	RDMA_NLDEV_ATTR_RES_QP_ENTRY,		/* nested table */
++	/*
++	 * Local QPN
++	 */
++	RDMA_NLDEV_ATTR_RES_LQPN,		/* u32 */
++	/*
++	 * Remote QPN,
++	 * Applicable for RC and UC only IBTA 11.2.5.3 QUERY QUEUE PAIR
++	 */
++	RDMA_NLDEV_ATTR_RES_RQPN,		/* u32 */
++	/*
++	 * Receive Queue PSN,
++	 * Applicable for RC and UC only 11.2.5.3 QUERY QUEUE PAIR
++	 */
++	RDMA_NLDEV_ATTR_RES_RQ_PSN,		/* u32 */
++	/*
++	 * Send Queue PSN
++	 */
++	RDMA_NLDEV_ATTR_RES_SQ_PSN,		/* u32 */
++	RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE,	/* u8 */
++	/*
++	 * QP types as visible to RDMA/core, the reserved QPT
++	 * are not exported through this interface.
++	 */
++	RDMA_NLDEV_ATTR_RES_TYPE,		/* u8 */
++	RDMA_NLDEV_ATTR_RES_STATE,		/* u8 */
++	/*
++	 * Process ID which created object,
++	 * in case of kernel origin, PID won't exist.
++	 */
++	RDMA_NLDEV_ATTR_RES_PID,		/* u32 */
++	/*
++	 * The name of process created following resource.
++	 * It will exist only for kernel objects.
++	 * For user created objects, the user is supposed
++	 * to read /proc/PID/comm file.
++	 */
++	RDMA_NLDEV_ATTR_RES_KERN_NAME,		/* string */
++
++	RDMA_NLDEV_ATTR_RES_CM_ID,		/* nested table */
++	RDMA_NLDEV_ATTR_RES_CM_ID_ENTRY,	/* nested table */
++	/*
++	 * rdma_cm_id port space.
++	 */
++	RDMA_NLDEV_ATTR_RES_PS,			/* u32 */
++	/*
++	 * Source and destination socket addresses
++	 */
++	RDMA_NLDEV_ATTR_RES_SRC_ADDR,		/* __kernel_sockaddr_storage */
++	RDMA_NLDEV_ATTR_RES_DST_ADDR,		/* __kernel_sockaddr_storage */
++
++	RDMA_NLDEV_ATTR_RES_CQ,			/* nested table */
++	RDMA_NLDEV_ATTR_RES_CQ_ENTRY,		/* nested table */
++	RDMA_NLDEV_ATTR_RES_CQE,		/* u32 */
++	RDMA_NLDEV_ATTR_RES_USECNT,		/* u64 */
++	RDMA_NLDEV_ATTR_RES_POLL_CTX,		/* u8 */
++
++	RDMA_NLDEV_ATTR_RES_MR,			/* nested table */
++	RDMA_NLDEV_ATTR_RES_MR_ENTRY,		/* nested table */
++	RDMA_NLDEV_ATTR_RES_RKEY,		/* u32 */
++	RDMA_NLDEV_ATTR_RES_LKEY,		/* u32 */
++	RDMA_NLDEV_ATTR_RES_IOVA,		/* u64 */
++	RDMA_NLDEV_ATTR_RES_MRLEN,		/* u64 */
++
++	RDMA_NLDEV_ATTR_RES_PD,			/* nested table */
++	RDMA_NLDEV_ATTR_RES_PD_ENTRY,		/* nested table */
++	RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY,	/* u32 */
++	RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY,	/* u32 */
++	/*
++	 * Provides logical name and index of netdevice which is
++	 * connected to physical port. This information is relevant
++	 * for RoCE and iWARP.
++	 *
++	 * The netdevices which are associated with containers are
++	 * supposed to be exported together with GID table once it
++	 * will be exposed through the netlink. Because the
++	 * associated netdevices are properties of GIDs.
++	 */
++	RDMA_NLDEV_ATTR_NDEV_INDEX,		/* u32 */
++	RDMA_NLDEV_ATTR_NDEV_NAME,		/* string */
++	/*
++	 * driver-specific attributes.
++	 */
++	RDMA_NLDEV_ATTR_DRIVER,			/* nested table */
++	RDMA_NLDEV_ATTR_DRIVER_ENTRY,		/* nested table */
++	RDMA_NLDEV_ATTR_DRIVER_STRING,		/* string */
++	/*
++	 * u8 values from enum rdma_nldev_print_type
++	 */
++	RDMA_NLDEV_ATTR_DRIVER_PRINT_TYPE,	/* u8 */
++	RDMA_NLDEV_ATTR_DRIVER_S32,		/* s32 */
++	RDMA_NLDEV_ATTR_DRIVER_U32,		/* u32 */
++	RDMA_NLDEV_ATTR_DRIVER_S64,		/* s64 */
++	RDMA_NLDEV_ATTR_DRIVER_U64,		/* u64 */
++
++	/*
++	 * Always the end
++	 */
++	RDMA_NLDEV_ATTR_MAX
++};
++#endif /* _RDMA_NETLINK_H */
+diff --git a/rdma/include/uapi/rdma/rdma_user_cm.h b/rdma/include/uapi/rdma/rdma_user_cm.h
+new file mode 100644
+index 0000000000000..0d1e78ebad051
+--- /dev/null
++++ b/rdma/include/uapi/rdma/rdma_user_cm.h
+@@ -0,0 +1,324 @@
++/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR Linux-OpenIB) */
++/*
++ * Copyright (c) 2005-2006 Intel Corporation.  All rights reserved.
++ *
++ * This software is available to you under a choice of one of two
++ * licenses.  You may choose to be licensed under the terms of the GNU
++ * General Public License (GPL) Version 2, available from the file
++ * COPYING in the main directory of this source tree, or the
++ * OpenIB.org BSD license below:
++ *
++ *     Redistribution and use in source and binary forms, with or
++ *     without modification, are permitted provided that the following
++ *     conditions are met:
++ *
++ *      - Redistributions of source code must retain the above
++ *        copyright notice, this list of conditions and the following
++ *        disclaimer.
++ *
++ *      - 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.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
++ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
++ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
++ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
++ * SOFTWARE.
++ */
++
++#ifndef RDMA_USER_CM_H
++#define RDMA_USER_CM_H
++
++#include <linux/types.h>
++#include <linux/socket.h>
++#include <linux/in6.h>
++#include <rdma/ib_user_verbs.h>
++#include <rdma/ib_user_sa.h>
++
++#define RDMA_USER_CM_ABI_VERSION	4
++
++#define RDMA_MAX_PRIVATE_DATA		256
++
++enum {
++	RDMA_USER_CM_CMD_CREATE_ID,
++	RDMA_USER_CM_CMD_DESTROY_ID,
++	RDMA_USER_CM_CMD_BIND_IP,
++	RDMA_USER_CM_CMD_RESOLVE_IP,
++	RDMA_USER_CM_CMD_RESOLVE_ROUTE,
++	RDMA_USER_CM_CMD_QUERY_ROUTE,
++	RDMA_USER_CM_CMD_CONNECT,
++	RDMA_USER_CM_CMD_LISTEN,
++	RDMA_USER_CM_CMD_ACCEPT,
++	RDMA_USER_CM_CMD_REJECT,
++	RDMA_USER_CM_CMD_DISCONNECT,
++	RDMA_USER_CM_CMD_INIT_QP_ATTR,
++	RDMA_USER_CM_CMD_GET_EVENT,
++	RDMA_USER_CM_CMD_GET_OPTION,
++	RDMA_USER_CM_CMD_SET_OPTION,
++	RDMA_USER_CM_CMD_NOTIFY,
++	RDMA_USER_CM_CMD_JOIN_IP_MCAST,
++	RDMA_USER_CM_CMD_LEAVE_MCAST,
++	RDMA_USER_CM_CMD_MIGRATE_ID,
++	RDMA_USER_CM_CMD_QUERY,
++	RDMA_USER_CM_CMD_BIND,
++	RDMA_USER_CM_CMD_RESOLVE_ADDR,
++	RDMA_USER_CM_CMD_JOIN_MCAST
++};
++
++/* See IBTA Annex A11, servies ID bytes 4 & 5 */
++enum rdma_ucm_port_space {
++	RDMA_PS_IPOIB = 0x0002,
++	RDMA_PS_IB    = 0x013F,
++	RDMA_PS_TCP   = 0x0106,
++	RDMA_PS_UDP   = 0x0111,
++};
++
++/*
++ * command ABI structures.
++ */
++struct rdma_ucm_cmd_hdr {
++	__u32 cmd;
++	__u16 in;
++	__u16 out;
++};
++
++struct rdma_ucm_create_id {
++	__aligned_u64 uid;
++	__aligned_u64 response;
++	__u16 ps;                  /* use enum rdma_ucm_port_space */
++	__u8  qp_type;
++	__u8  reserved[5];
++};
++
++struct rdma_ucm_create_id_resp {
++	__u32 id;
++};
++
++struct rdma_ucm_destroy_id {
++	__aligned_u64 response;
++	__u32 id;
++	__u32 reserved;
++};
++
++struct rdma_ucm_destroy_id_resp {
++	__u32 events_reported;
++};
++
++struct rdma_ucm_bind_ip {
++	__aligned_u64 response;
++	struct sockaddr_in6 addr;
++	__u32 id;
++};
++
++struct rdma_ucm_bind {
++	__u32 id;
++	__u16 addr_size;
++	__u16 reserved;
++	struct __kernel_sockaddr_storage addr;
++};
++
++struct rdma_ucm_resolve_ip {
++	struct sockaddr_in6 src_addr;
++	struct sockaddr_in6 dst_addr;
++	__u32 id;
++	__u32 timeout_ms;
++};
++
++struct rdma_ucm_resolve_addr {
++	__u32 id;
++	__u32 timeout_ms;
++	__u16 src_size;
++	__u16 dst_size;
++	__u32 reserved;
++	struct __kernel_sockaddr_storage src_addr;
++	struct __kernel_sockaddr_storage dst_addr;
++};
++
++struct rdma_ucm_resolve_route {
++	__u32 id;
++	__u32 timeout_ms;
++};
++
++enum {
++	RDMA_USER_CM_QUERY_ADDR,
++	RDMA_USER_CM_QUERY_PATH,
++	RDMA_USER_CM_QUERY_GID
++};
++
++struct rdma_ucm_query {
++	__aligned_u64 response;
++	__u32 id;
++	__u32 option;
++};
++
++struct rdma_ucm_query_route_resp {
++	__aligned_u64 node_guid;
++	struct ib_user_path_rec ib_route[2];
++	struct sockaddr_in6 src_addr;
++	struct sockaddr_in6 dst_addr;
++	__u32 num_paths;
++	__u8 port_num;
++	__u8 reserved[3];
++};
++
++struct rdma_ucm_query_addr_resp {
++	__aligned_u64 node_guid;
++	__u8  port_num;
++	__u8  reserved;
++	__u16 pkey;
++	__u16 src_size;
++	__u16 dst_size;
++	struct __kernel_sockaddr_storage src_addr;
++	struct __kernel_sockaddr_storage dst_addr;
++};
++
++struct rdma_ucm_query_path_resp {
++	__u32 num_paths;
++	__u32 reserved;
++	struct ib_path_rec_data path_data[0];
++};
++
++struct rdma_ucm_conn_param {
++	__u32 qp_num;
++	__u32 qkey;
++	__u8  private_data[RDMA_MAX_PRIVATE_DATA];
++	__u8  private_data_len;
++	__u8  srq;
++	__u8  responder_resources;
++	__u8  initiator_depth;
++	__u8  flow_control;
++	__u8  retry_count;
++	__u8  rnr_retry_count;
++	__u8  valid;
++};
++
++struct rdma_ucm_ud_param {
++	__u32 qp_num;
++	__u32 qkey;
++	struct ib_uverbs_ah_attr ah_attr;
++	__u8  private_data[RDMA_MAX_PRIVATE_DATA];
++	__u8  private_data_len;
++	__u8  reserved[7];
++};
++
++struct rdma_ucm_connect {
++	struct rdma_ucm_conn_param conn_param;
++	__u32 id;
++	__u32 reserved;
++};
++
++struct rdma_ucm_listen {
++	__u32 id;
++	__u32 backlog;
++};
++
++struct rdma_ucm_accept {
++	__aligned_u64 uid;
++	struct rdma_ucm_conn_param conn_param;
++	__u32 id;
++	__u32 reserved;
++};
++
++struct rdma_ucm_reject {
++	__u32 id;
++	__u8  private_data_len;
++	__u8  reserved[3];
++	__u8  private_data[RDMA_MAX_PRIVATE_DATA];
++};
++
++struct rdma_ucm_disconnect {
++	__u32 id;
++};
++
++struct rdma_ucm_init_qp_attr {
++	__aligned_u64 response;
++	__u32 id;
++	__u32 qp_state;
++};
++
++struct rdma_ucm_notify {
++	__u32 id;
++	__u32 event;
++};
++
++struct rdma_ucm_join_ip_mcast {
++	__aligned_u64 response;		/* rdma_ucm_create_id_resp */
++	__aligned_u64 uid;
++	struct sockaddr_in6 addr;
++	__u32 id;
++};
++
++/* Multicast join flags */
++enum {
++	RDMA_MC_JOIN_FLAG_FULLMEMBER,
++	RDMA_MC_JOIN_FLAG_SENDONLY_FULLMEMBER,
++	RDMA_MC_JOIN_FLAG_RESERVED,
++};
++
++struct rdma_ucm_join_mcast {
++	__aligned_u64 response;		/* rdma_ucma_create_id_resp */
++	__aligned_u64 uid;
++	__u32 id;
++	__u16 addr_size;
++	__u16 join_flags;
++	struct __kernel_sockaddr_storage addr;
++};
++
++struct rdma_ucm_get_event {
++	__aligned_u64 response;
++};
++
++struct rdma_ucm_event_resp {
++	__aligned_u64 uid;
++	__u32 id;
++	__u32 event;
++	__u32 status;
++	/*
++	 * NOTE: This union is not aligned to 8 bytes so none of the union
++	 * members may contain a u64 or anything with higher alignment than 4.
++	 */
++	union {
++		struct rdma_ucm_conn_param conn;
++		struct rdma_ucm_ud_param   ud;
++	} param;
++	__u32 reserved;
++};
++
++/* Option levels */
++enum {
++	RDMA_OPTION_ID		= 0,
++	RDMA_OPTION_IB		= 1
++};
++
++/* Option details */
++enum {
++	RDMA_OPTION_ID_TOS	 = 0,
++	RDMA_OPTION_ID_REUSEADDR = 1,
++	RDMA_OPTION_ID_AFONLY	 = 2,
++	RDMA_OPTION_IB_PATH	 = 1
++};
++
++struct rdma_ucm_set_option {
++	__aligned_u64 optval;
++	__u32 id;
++	__u32 level;
++	__u32 optname;
++	__u32 optlen;
++};
++
++struct rdma_ucm_migrate_id {
++	__aligned_u64 response;
++	__u32 id;
++	__u32 fd;
++};
++
++struct rdma_ucm_migrate_resp {
++	__u32 events_reported;
++};
++
++#endif /* RDMA_USER_CM_H */
+diff --git a/rdma/link.c b/rdma/link.c
+new file mode 100644
+index 0000000000000..c064be627be2c
+--- /dev/null
++++ b/rdma/link.c
+@@ -0,0 +1,355 @@
++/*
++ * link.c	RDMA tool
++ *
++ *              This program is free software; you can redistribute it and/or
++ *              modify it under the terms of the GNU General Public License
++ *              as published by the Free Software Foundation; either version
++ *              2 of the License, or (at your option) any later version.
++ *
++ * Authors:     Leon Romanovsky <leonro@mellanox.com>
++ */
++
++#include "rdma.h"
++
++static int link_help(struct rd *rd)
++{
++	pr_out("Usage: %s link show [DEV/PORT_INDEX]\n", rd->filename);
++	return 0;
++}
++
++static const char *caps_to_str(uint32_t idx)
++{
++#define RDMA_PORT_FLAGS_LOW(x) \
++	x(RESERVED, 0) \
++	x(SM, 1) \
++	x(NOTICE, 2) \
++	x(TRAP, 3) \
++	x(OPT_IPD, 4) \
++	x(AUTO_MIGR, 5) \
++	x(SL_MAP, 6) \
++	x(MKEY_NVRAM, 7) \
++	x(PKEY_NVRAM, 8) \
++	x(LED_INFO, 9) \
++	x(SM_DISABLED, 10) \
++	x(SYS_IMAGE_GUID, 11) \
++	x(PKEY_SW_EXT_PORT_TRAP, 12) \
++	x(CABLE_INFO, 13) \
++	x(EXTENDED_SPEEDS, 14) \
++	x(CAP_MASK2, 15) \
++	x(CM, 16) \
++	x(SNMP_TUNNEL, 17) \
++	x(REINIT, 18) \
++	x(DEVICE_MGMT, 19) \
++	x(VENDOR_CLASS, 20) \
++	x(DR_NOTICE, 21) \
++	x(CAP_MASK_NOTICE, 22) \
++	x(BOOT_MGMT, 23) \
++	x(LINK_LATENCY, 24) \
++	x(CLIENT_REG, 25) \
++	x(OTHER_LOCAL_CHANGES, 26) \
++	x(LINK_SPPED_WIDTH, 27) \
++	x(VENDOR_SPECIFIC_MADS, 28) \
++	x(MULT_PKER_TRAP, 29) \
++	x(MULT_FDB, 30) \
++	x(HIERARCHY_INFO, 31)
++
++#define RDMA_PORT_FLAGS_HIGH(x) \
++	x(SET_NODE_DESC, 0) \
++	x(EXT_INFO, 1) \
++	x(VIRT, 2) \
++	x(SWITCH_POR_STATE_TABLE, 3) \
++	x(LINK_WIDTH_2X, 4) \
++	x(LINK_SPEED_HDR, 5)
++
++	/*
++	 * Separation below is needed to allow compilation of rdmatool
++	 * on 32bits systems. On such systems, C-enum is limited to be
++	 * int and can't hold more than 32 bits.
++	 */
++	enum { RDMA_PORT_FLAGS_LOW(RDMA_BITMAP_ENUM) };
++	enum { RDMA_PORT_FLAGS_HIGH(RDMA_BITMAP_ENUM) };
++
++	static const char * const
++		rdma_port_names_low[] = { RDMA_PORT_FLAGS_LOW(RDMA_BITMAP_NAMES) };
++	static const char * const
++		rdma_port_names_high[] = { RDMA_PORT_FLAGS_HIGH(RDMA_BITMAP_NAMES) };
++	uint32_t high_idx;
++	#undef RDMA_PORT_FLAGS_LOW
++	#undef RDMA_PORT_FLAGS_HIGH
++
++	if (idx < ARRAY_SIZE(rdma_port_names_low) && rdma_port_names_low[idx])
++		return rdma_port_names_low[idx];
++
++	high_idx = idx - ARRAY_SIZE(rdma_port_names_low);
++	if (high_idx < ARRAY_SIZE(rdma_port_names_high) &&
++	    rdma_port_names_high[high_idx])
++		return rdma_port_names_high[high_idx];
++
++	return "UNKNOWN";
++}
++
++static void link_print_caps(struct rd *rd, struct nlattr **tb)
++{
++	uint64_t caps;
++	uint32_t idx;
++
++	if (!tb[RDMA_NLDEV_ATTR_CAP_FLAGS])
++		return;
++
++	caps = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_CAP_FLAGS]);
++
++	if (rd->json_output) {
++		jsonw_name(rd->jw, "caps");
++		jsonw_start_array(rd->jw);
++	} else {
++		pr_out("\n    caps: <");
++	}
++	for (idx = 0; caps; idx++) {
++		if (caps & 0x1) {
++			if (rd->json_output) {
++				jsonw_string(rd->jw, caps_to_str(idx));
++			} else {
++				pr_out("%s", caps_to_str(idx));
++				if (caps >> 0x1)
++					pr_out(", ");
++			}
++		}
++		caps >>= 0x1;
++	}
++
++	if (rd->json_output)
++		jsonw_end_array(rd->jw);
++	else
++		pr_out(">");
++}
++
++static void link_print_subnet_prefix(struct rd *rd, struct nlattr **tb)
++{
++	uint64_t subnet_prefix;
++	uint16_t vp[4];
++	char str[32];
++
++	if (!tb[RDMA_NLDEV_ATTR_SUBNET_PREFIX])
++		return;
++
++	subnet_prefix = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_SUBNET_PREFIX]);
++	memcpy(vp, &subnet_prefix, sizeof(uint64_t));
++	snprintf(str, 32, "%04x:%04x:%04x:%04x", vp[3], vp[2], vp[1], vp[0]);
++	if (rd->json_output)
++		jsonw_string_field(rd->jw, "subnet_prefix", str);
++	else
++		pr_out("subnet_prefix %s ", str);
++}
++
++static void link_print_lid(struct rd *rd, struct nlattr **tb)
++{
++	uint32_t lid;
++
++	if (!tb[RDMA_NLDEV_ATTR_LID])
++		return;
++
++	lid = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_LID]);
++	if (rd->json_output)
++		jsonw_uint_field(rd->jw, "lid", lid);
++	else
++		pr_out("lid %u ", lid);
++}
++
++static void link_print_sm_lid(struct rd *rd, struct nlattr **tb)
++{
++	uint32_t sm_lid;
++
++	if (!tb[RDMA_NLDEV_ATTR_SM_LID])
++		return;
++
++	sm_lid = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_SM_LID]);
++	if (rd->json_output)
++		jsonw_uint_field(rd->jw, "sm_lid", sm_lid);
++	else
++		pr_out("sm_lid %u ", sm_lid);
++}
++
++static void link_print_lmc(struct rd *rd, struct nlattr **tb)
++{
++	uint8_t lmc;
++
++	if (!tb[RDMA_NLDEV_ATTR_LMC])
++		return;
++
++	lmc = mnl_attr_get_u8(tb[RDMA_NLDEV_ATTR_LMC]);
++	if (rd->json_output)
++		jsonw_uint_field(rd->jw, "lmc", lmc);
++	else
++		pr_out("lmc %u ", lmc);
++}
++
++static const char *link_state_to_str(uint8_t link_state)
++{
++	static const char * const link_state_str[] = { "NOP", "DOWN",
++						       "INIT", "ARMED",
++						       "ACTIVE",
++						       "ACTIVE_DEFER" };
++	if (link_state < ARRAY_SIZE(link_state_str))
++		return link_state_str[link_state];
++	return "UNKNOWN";
++}
++
++static void link_print_state(struct rd *rd, struct nlattr **tb)
++{
++	uint8_t state;
++
++	if (!tb[RDMA_NLDEV_ATTR_PORT_STATE])
++		return;
++
++	state = mnl_attr_get_u8(tb[RDMA_NLDEV_ATTR_PORT_STATE]);
++	if (rd->json_output)
++		jsonw_string_field(rd->jw, "state", link_state_to_str(state));
++	else
++		pr_out("state %s ", link_state_to_str(state));
++}
++
++static const char *phys_state_to_str(uint8_t phys_state)
++{
++	static const char * const phys_state_str[] = { "NOP", "SLEEP",
++						       "POLLING", "DISABLED",
++						       "ARMED", "LINK_UP",
++						       "LINK_ERROR_RECOVER",
++						       "PHY_TEST", "UNKNOWN",
++						       "OPA_OFFLINE",
++						       "UNKNOWN", "OPA_TEST" };
++	if (phys_state < ARRAY_SIZE(phys_state_str))
++		return phys_state_str[phys_state];
++	return "UNKNOWN";
++};
++
++static void link_print_phys_state(struct rd *rd, struct nlattr **tb)
++{
++	uint8_t phys_state;
++
++	if (!tb[RDMA_NLDEV_ATTR_PORT_PHYS_STATE])
++		return;
++
++	phys_state = mnl_attr_get_u8(tb[RDMA_NLDEV_ATTR_PORT_PHYS_STATE]);
++	if (rd->json_output)
++		jsonw_string_field(rd->jw, "physical_state",
++				   phys_state_to_str(phys_state));
++	else
++		pr_out("physical_state %s ", phys_state_to_str(phys_state));
++}
++
++static void link_print_netdev(struct rd *rd, struct nlattr **tb)
++{
++	const char *netdev_name;
++	uint32_t idx;
++
++	if (!tb[RDMA_NLDEV_ATTR_NDEV_NAME] || !tb[RDMA_NLDEV_ATTR_NDEV_INDEX])
++		return;
++
++	netdev_name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_NDEV_NAME]);
++	idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_NDEV_INDEX]);
++	if (rd->json_output) {
++		jsonw_string_field(rd->jw, "netdev", netdev_name);
++		jsonw_uint_field(rd->jw, "netdev_index", idx);
++	} else {
++		pr_out("netdev %s ", netdev_name);
++		if (rd->show_details)
++			pr_out("netdev_index %u ", idx);
++	}
++}
++
++static int link_parse_cb(const struct nlmsghdr *nlh, void *data)
++{
++	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
++	struct rd *rd = data;
++	uint32_t port, idx;
++	char name[32];
++
++	mnl_attr_parse(nlh, 0, rd_attr_cb, tb);
++	if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME])
++		return MNL_CB_ERROR;
++
++	if (!tb[RDMA_NLDEV_ATTR_PORT_INDEX]) {
++		pr_err("This tool doesn't support switches yet\n");
++		return MNL_CB_ERROR;
++	}
++
++	idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
++	port = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]);
++	snprintf(name, 32, "%s/%u",
++		 mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]), port);
++
++	if (rd->json_output) {
++		jsonw_uint_field(rd->jw, "ifindex", idx);
++		jsonw_uint_field(rd->jw, "port", port);
++		jsonw_string_field(rd->jw, "ifname", name);
++
++	} else {
++		pr_out("%u/%u: %s: ", idx, port, name);
++	}
++
++	link_print_subnet_prefix(rd, tb);
++	link_print_lid(rd, tb);
++	link_print_sm_lid(rd, tb);
++	link_print_lmc(rd, tb);
++	link_print_state(rd, tb);
++	link_print_phys_state(rd, tb);
++	link_print_netdev(rd, tb);
++	if (rd->show_details)
++		link_print_caps(rd, tb);
++
++	if (!rd->json_output)
++		pr_out("\n");
++	return MNL_CB_OK;
++}
++
++static int link_no_args(struct rd *rd)
++{
++	uint32_t seq;
++	int ret;
++
++	rd_prepare_msg(rd, RDMA_NLDEV_CMD_PORT_GET, &seq,
++		       (NLM_F_REQUEST | NLM_F_ACK));
++	mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx);
++	mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_PORT_INDEX, rd->port_idx);
++	ret = rd_send_msg(rd);
++	if (ret)
++		return ret;
++
++	if (rd->json_output)
++		jsonw_start_object(rd->jw);
++	ret = rd_recv_msg(rd, link_parse_cb, rd, seq);
++	if (rd->json_output)
++		jsonw_end_object(rd->jw);
++	return ret;
++}
++
++static int link_one_show(struct rd *rd)
++{
++	const struct rd_cmd cmds[] = {
++		{ NULL,		link_no_args},
++		{ 0 }
++	};
++
++	if (!rd->port_idx)
++		return 0;
++
++	return rd_exec_cmd(rd, cmds, "parameter");
++}
++
++static int link_show(struct rd *rd)
++{
++	return rd_exec_link(rd, link_one_show, true);
++}
++
++int cmd_link(struct rd *rd)
++{
++	const struct rd_cmd cmds[] = {
++		{ NULL,		link_show },
++		{ "show",	link_show },
++		{ "list",	link_show },
++		{ "help",	link_help },
++		{ 0 }
++	};
++
++	return rd_exec_cmd(rd, cmds, "link command");
++}
+diff --git a/rdma/rdma.c b/rdma/rdma.c
+new file mode 100644
+index 0000000000000..010e98371ef09
+--- /dev/null
++++ b/rdma/rdma.c
+@@ -0,0 +1,203 @@
++/*
++ * rdma.c	RDMA tool
++ *
++ *              This program is free software; you can redistribute it and/or
++ *              modify it under the terms of the GNU General Public License
++ *              as published by the Free Software Foundation; either version
++ *              2 of the License, or (at your option) any later version.
++ *
++ * Authors:     Leon Romanovsky <leonro@mellanox.com>
++ */
++
++#include "rdma.h"
++#include "SNAPSHOT.h"
++
++static void help(char *name)
++{
++	pr_out("Usage: %s [ OPTIONS ] OBJECT { COMMAND | help }\n"
++	       "       %s [ -f[orce] ] -b[atch] filename\n"
++	       "where  OBJECT := { dev | link | resource | help }\n"
++	       "       OPTIONS := { -V[ersion] | -d[etails] | -j[son] | -p[retty]}\n", name, name);
++}
++
++static int cmd_help(struct rd *rd)
++{
++	help(rd->filename);
++	return 0;
++}
++
++static int rd_cmd(struct rd *rd, int argc, char **argv)
++{
++	const struct rd_cmd cmds[] = {
++		{ NULL,		cmd_help },
++		{ "help",	cmd_help },
++		{ "dev",	cmd_dev },
++		{ "link",	cmd_link },
++		{ "resource",	cmd_res },
++		{ 0 }
++	};
++
++	rd->argc = argc;
++	rd->argv = argv;
++
++	return rd_exec_cmd(rd, cmds, "object");
++}
++
++static int rd_batch(struct rd *rd, const char *name, bool force)
++{
++	char *line = NULL;
++	size_t len = 0;
++	int ret = 0;
++
++	if (name && strcmp(name, "-") != 0) {
++		if (!freopen(name, "r", stdin)) {
++			pr_err("Cannot open file \"%s\" for reading: %s\n",
++			       name, strerror(errno));
++			return errno;
++		}
++	}
++
++	cmdlineno = 0;
++	while (getcmdline(&line, &len, stdin) != -1) {
++		char *largv[512];
++		int largc;
++
++		largc = makeargs(line, largv, ARRAY_SIZE(largv));
++		if (!largc)
++			continue;	/* blank line */
++
++		ret = rd_cmd(rd, largc, largv);
++		if (ret) {
++			pr_err("Command failed %s:%d\n", name, cmdlineno);
++			if (!force)
++				break;
++		}
++	}
++
++	free(line);
++
++	return ret;
++}
++
++static int rd_init(struct rd *rd, char *filename)
++{
++	uint32_t seq;
++	int ret;
++
++	rd->filename = filename;
++	INIT_LIST_HEAD(&rd->dev_map_list);
++	INIT_LIST_HEAD(&rd->filter_list);
++
++	if (rd->json_output) {
++		rd->jw = jsonw_new(stdout);
++		if (!rd->jw) {
++			pr_err("Failed to create JSON writer\n");
++			return -ENOMEM;
++		}
++		jsonw_pretty(rd->jw, rd->pretty_output);
++	}
++
++	rd->buff = malloc(MNL_SOCKET_BUFFER_SIZE);
++	if (!rd->buff)
++		return -ENOMEM;
++
++	rd_prepare_msg(rd, RDMA_NLDEV_CMD_GET,
++		       &seq, (NLM_F_REQUEST | NLM_F_ACK | NLM_F_DUMP));
++	ret = rd_send_msg(rd);
++	if (ret)
++		return ret;
++
++	return rd_recv_msg(rd, rd_dev_init_cb, rd, seq);
++}
++
++static void rd_cleanup(struct rd *rd)
++{
++	if (rd->json_output)
++		jsonw_destroy(&rd->jw);
++	rd_free(rd);
++}
++
++int main(int argc, char **argv)
++{
++	static const struct option long_options[] = {
++		{ "version",		no_argument,		NULL, 'V' },
++		{ "help",		no_argument,		NULL, 'h' },
++		{ "json",		no_argument,		NULL, 'j' },
++		{ "pretty",		no_argument,		NULL, 'p' },
++		{ "details",		no_argument,		NULL, 'd' },
++		{ "force",		no_argument,		NULL, 'f' },
++		{ "batch",		required_argument,	NULL, 'b' },
++		{ NULL, 0, NULL, 0 }
++	};
++	bool show_driver_details = false;
++	const char *batch_file = NULL;
++	bool pretty_output = false;
++	bool show_details = false;
++	bool json_output = false;
++	bool force = false;
++	struct rd rd = {};
++	char *filename;
++	int opt;
++	int err;
++
++	filename = basename(argv[0]);
++
++	while ((opt = getopt_long(argc, argv, ":Vhdpjfb:",
++				  long_options, NULL)) >= 0) {
++		switch (opt) {
++		case 'V':
++			printf("%s utility, iproute2-ss%s\n",
++			       filename, SNAPSHOT);
++			return EXIT_SUCCESS;
++		case 'p':
++			pretty_output = true;
++			break;
++		case 'd':
++			if (show_details)
++				show_driver_details = true;
++			else
++				show_details = true;
++			break;
++		case 'j':
++			json_output = true;
++			break;
++		case 'f':
++			force = true;
++			break;
++		case 'b':
++			batch_file = optarg;
++			break;
++		case 'h':
++			help(filename);
++			return EXIT_SUCCESS;
++		case ':':
++			pr_err("-%c option requires an argument\n", optopt);
++			return EXIT_FAILURE;
++		default:
++			pr_err("Unknown option.\n");
++			help(filename);
++			return EXIT_FAILURE;
++		}
++	}
++
++	argc -= optind;
++	argv += optind;
++
++	rd.show_details = show_details;
++	rd.show_driver_details = show_driver_details;
++	rd.json_output = json_output;
++	rd.pretty_output = pretty_output;
++
++	err = rd_init(&rd, filename);
++	if (err)
++		goto out;
++
++	if (batch_file)
++		err = rd_batch(&rd, batch_file, force);
++	else
++		err = rd_cmd(&rd, argc, argv);
++out:
++	/* Always cleanup */
++	rd_cleanup(&rd);
++	return err ? EXIT_FAILURE : EXIT_SUCCESS;
++}
+diff --git a/rdma/rdma.h b/rdma/rdma.h
+new file mode 100644
+index 0000000000000..547bb5749a39f
+--- /dev/null
++++ b/rdma/rdma.h
+@@ -0,0 +1,131 @@
++/*
++ * rdma.c	RDMA tool
++ *
++ *              This program is free software; you can redistribute it and/or
++ *              modify it under the terms of the GNU General Public License
++ *              as published by the Free Software Foundation; either version
++ *              2 of the License, or (at your option) any later version.
++ *
++ * Authors:     Leon Romanovsky <leonro@mellanox.com>
++ */
++#ifndef _RDMA_TOOL_H_
++#define _RDMA_TOOL_H_
++
++#include <stdlib.h>
++#include <string.h>
++#include <errno.h>
++#include <getopt.h>
++#include <netinet/in.h>
++#include <libmnl/libmnl.h>
++#include <rdma/rdma_netlink.h>
++#include <rdma/rdma_user_cm.h>
++#include <time.h>
++#include <net/if_arp.h>
++
++#include "list.h"
++#include "utils.h"
++#include "json_writer.h"
++
++#define pr_err(args...) fprintf(stderr, ##args)
++#define pr_out(args...) fprintf(stdout, ##args)
++
++#define RDMA_BITMAP_ENUM(name, bit_no) RDMA_BITMAP_##name = BIT(bit_no),
++#define RDMA_BITMAP_NAMES(name, bit_no) [bit_no] = #name,
++
++#define MAX_NUMBER_OF_FILTERS 64
++struct filters {
++	const char *name;
++	bool is_number;
++};
++
++struct filter_entry {
++	struct list_head list;
++	char *key;
++	char *value;
++};
++
++struct dev_map {
++	struct list_head list;
++	char *dev_name;
++	uint32_t num_ports;
++	uint32_t idx;
++};
++
++struct rd {
++	int argc;
++	char **argv;
++	char *filename;
++	bool show_details;
++	bool show_driver_details;
++	struct list_head dev_map_list;
++	uint32_t dev_idx;
++	uint32_t port_idx;
++	struct mnl_socket *nl;
++	struct nlmsghdr *nlh;
++	char *buff;
++	json_writer_t *jw;
++	bool json_output;
++	bool pretty_output;
++	struct list_head filter_list;
++};
++
++struct rd_cmd {
++	const char *cmd;
++	int (*func)(struct rd *rd);
++};
++
++/*
++ * Parser interface
++ */
++bool rd_no_arg(struct rd *rd);
++void rd_arg_inc(struct rd *rd);
++
++char *rd_argv(struct rd *rd);
++
++/*
++ * Commands interface
++ */
++int cmd_dev(struct rd *rd);
++int cmd_link(struct rd *rd);
++int cmd_res(struct rd *rd);
++int rd_exec_cmd(struct rd *rd, const struct rd_cmd *c, const char *str);
++int rd_exec_dev(struct rd *rd, int (*cb)(struct rd *rd));
++int rd_exec_require_dev(struct rd *rd, int (*cb)(struct rd *rd));
++int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd), bool strict_port);
++void rd_free(struct rd *rd);
++int rd_set_arg_to_devname(struct rd *rd);
++int rd_argc(struct rd *rd);
++
++int strcmpx(const char *str1, const char *str2);
++
++/*
++ * Device manipulation
++ */
++struct dev_map *dev_map_lookup(struct rd *rd, bool allow_port_index);
++
++/*
++ * Filter manipulation
++ */
++int rd_build_filter(struct rd *rd, const struct filters valid_filters[]);
++bool rd_check_is_filtered(struct rd *rd, const char *key, uint32_t val);
++bool rd_check_is_string_filtered(struct rd *rd, const char *key, const char *val);
++bool rd_check_is_key_exist(struct rd *rd, const char *key);
++/*
++ * Netlink
++ */
++int rd_send_msg(struct rd *rd);
++int rd_recv_msg(struct rd *rd, mnl_cb_t callback, void *data, uint32_t seq);
++void rd_prepare_msg(struct rd *rd, uint32_t cmd, uint32_t *seq, uint16_t flags);
++int rd_dev_init_cb(const struct nlmsghdr *nlh, void *data);
++int rd_attr_cb(const struct nlattr *attr, void *data);
++int rd_attr_check(const struct nlattr *attr, int *typep);
++
++/*
++ * Print helpers
++ */
++void print_driver_table(struct rd *rd, struct nlattr *tb);
++void newline(struct rd *rd);
++void newline_indent(struct rd *rd);
++#define MAX_LINE_LENGTH 80
++
++#endif /* _RDMA_TOOL_H_ */
+diff --git a/rdma/res.c b/rdma/res.c
+new file mode 100644
+index 0000000000000..cbb2efe6c7235
+--- /dev/null
++++ b/rdma/res.c
+@@ -0,0 +1,1111 @@
++/*
++ * res.c	RDMA tool
++ *
++ *              This program is free software; you can redistribute it and/or
++ *              modify it under the terms of the GNU General Public License
++ *              as published by the Free Software Foundation; either version
++ *              2 of the License, or (at your option) any later version.
++ *
++ * Authors:     Leon Romanovsky <leonro@mellanox.com>
++ */
++
++#include "rdma.h"
++#include <inttypes.h>
++
++static int res_help(struct rd *rd)
++{
++	pr_out("Usage: %s resource\n", rd->filename);
++	pr_out("          resource show [DEV]\n");
++	pr_out("          resource show [qp|cm_id|pd|mr|cq]\n");
++	pr_out("          resource show qp link [DEV/PORT]\n");
++	pr_out("          resource show qp link [DEV/PORT] [FILTER-NAME FILTER-VALUE]\n");
++	pr_out("          resource show cm_id link [DEV/PORT]\n");
++	pr_out("          resource show cm_id link [DEV/PORT] [FILTER-NAME FILTER-VALUE]\n");
++	pr_out("          resource show cq link [DEV/PORT]\n");
++	pr_out("          resource show cq link [DEV/PORT] [FILTER-NAME FILTER-VALUE]\n");
++	pr_out("          resource show pd dev [DEV]\n");
++	pr_out("          resource show pd dev [DEV] [FILTER-NAME FILTER-VALUE]\n");
++	pr_out("          resource show mr dev [DEV]\n");
++	pr_out("          resource show mr dev [DEV] [FILTER-NAME FILTER-VALUE]\n");
++	return 0;
++}
++
++static int res_print_summary(struct rd *rd, struct nlattr **tb)
++{
++	struct nlattr *nla_table = tb[RDMA_NLDEV_ATTR_RES_SUMMARY];
++	struct nlattr *nla_entry;
++	const char *name;
++	uint64_t curr;
++	int err;
++
++	mnl_attr_for_each_nested(nla_entry, nla_table) {
++		struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
++		char json_name[32];
++
++		err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line);
++		if (err != MNL_CB_OK)
++			return -EINVAL;
++
++		if (!nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_NAME] ||
++		    !nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR]) {
++			return -EINVAL;
++		}
++
++		name = mnl_attr_get_str(nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_NAME]);
++		curr = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR]);
++		if (rd->json_output) {
++			snprintf(json_name, 32, "%s", name);
++			jsonw_lluint_field(rd->jw, json_name, curr);
++		} else {
++			pr_out("%s %"PRId64 " ", name, curr);
++		}
++	}
++	return 0;
++}
++
++static int res_no_args_parse_cb(const struct nlmsghdr *nlh, void *data)
++{
++	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
++	struct rd *rd = data;
++	const char *name;
++	uint32_t idx;
++
++	mnl_attr_parse(nlh, 0, rd_attr_cb, tb);
++	if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] ||
++	    !tb[RDMA_NLDEV_ATTR_DEV_NAME] ||
++	    !tb[RDMA_NLDEV_ATTR_RES_SUMMARY])
++		return MNL_CB_ERROR;
++
++	idx =  mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
++	name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]);
++	if (rd->json_output) {
++		jsonw_uint_field(rd->jw, "ifindex", idx);
++		jsonw_string_field(rd->jw, "ifname", name);
++	} else {
++		pr_out("%u: %s: ", idx, name);
++	}
++
++	res_print_summary(rd, tb);
++
++	if (!rd->json_output)
++		pr_out("\n");
++	return MNL_CB_OK;
++}
++
++static int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback)
++{
++	uint32_t flags = NLM_F_REQUEST | NLM_F_ACK;
++	uint32_t seq;
++	int ret;
++
++	if (command != RDMA_NLDEV_CMD_RES_GET)
++		flags |= NLM_F_DUMP;
++
++	rd_prepare_msg(rd, command, &seq, flags);
++	mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx);
++	if (rd->port_idx)
++		mnl_attr_put_u32(rd->nlh,
++				 RDMA_NLDEV_ATTR_PORT_INDEX, rd->port_idx);
++
++	ret = rd_send_msg(rd);
++	if (ret)
++		return ret;
++
++	if (rd->json_output)
++		jsonw_start_object(rd->jw);
++	ret = rd_recv_msg(rd, callback, rd, seq);
++	if (rd->json_output)
++		jsonw_end_object(rd->jw);
++	return ret;
++}
++
++#define RES_FUNC(name, command, valid_filters, strict_port) \
++	static int _##name(struct rd *rd)\
++	{ \
++		return _res_send_msg(rd, command, name##_parse_cb); \
++	} \
++	static int name(struct rd *rd) \
++	{\
++		int ret = rd_build_filter(rd, valid_filters); \
++		if (ret) \
++			return ret; \
++		if ((uintptr_t)valid_filters != (uintptr_t)NULL) { \
++			ret = rd_set_arg_to_devname(rd); \
++			if (ret) \
++				return ret;\
++		} \
++		if (strict_port) \
++			return rd_exec_dev(rd, _##name); \
++		else \
++			return rd_exec_link(rd, _##name, strict_port); \
++	}
++
++static const char *path_mig_to_str(uint8_t idx)
++{
++	static const char * const path_mig_str[] = { "MIGRATED",
++						     "REARM", "ARMED" };
++
++	if (idx < ARRAY_SIZE(path_mig_str))
++		return path_mig_str[idx];
++	return "UNKNOWN";
++}
++
++static const char *qp_states_to_str(uint8_t idx)
++{
++	static const char * const qp_states_str[] = { "RESET", "INIT",
++						      "RTR", "RTS", "SQD",
++						      "SQE", "ERR" };
++
++	if (idx < ARRAY_SIZE(qp_states_str))
++		return qp_states_str[idx];
++	return "UNKNOWN";
++}
++
++static const char *qp_types_to_str(uint8_t idx)
++{
++	static const char * const qp_types_str[] = { "SMI", "GSI", "RC",
++						     "UC", "UD", "RAW_IPV6",
++						     "RAW_ETHERTYPE",
++						     "UNKNOWN", "RAW_PACKET",
++						     "XRC_INI", "XRC_TGT" };
++
++	if (idx < ARRAY_SIZE(qp_types_str))
++		return qp_types_str[idx];
++	return "UNKNOWN";
++}
++
++static void print_lqpn(struct rd *rd, uint32_t val)
++{
++	if (rd->json_output)
++		jsonw_uint_field(rd->jw, "lqpn", val);
++	else
++		pr_out("lqpn %u ", val);
++}
++
++static void print_rqpn(struct rd *rd, uint32_t val, struct nlattr **nla_line)
++{
++	if (!nla_line[RDMA_NLDEV_ATTR_RES_RQPN])
++		return;
++
++	if (rd->json_output)
++		jsonw_uint_field(rd->jw, "rqpn", val);
++	else
++		pr_out("rqpn %u ", val);
++}
++
++static void print_type(struct rd *rd, uint32_t val)
++{
++	if (rd->json_output)
++		jsonw_string_field(rd->jw, "type",
++				   qp_types_to_str(val));
++	else
++		pr_out("type %s ", qp_types_to_str(val));
++}
++
++static void print_state(struct rd *rd, uint32_t val)
++{
++	if (rd->json_output)
++		jsonw_string_field(rd->jw, "state",
++				   qp_states_to_str(val));
++	else
++		pr_out("state %s ", qp_states_to_str(val));
++}
++
++static void print_rqpsn(struct rd *rd, uint32_t val, struct nlattr **nla_line)
++{
++	if (!nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN])
++		return;
++
++	if (rd->json_output)
++		jsonw_uint_field(rd->jw, "rq-psn", val);
++	else
++		pr_out("rq-psn %u ", val);
++}
++
++static void print_sqpsn(struct rd *rd, uint32_t val)
++{
++	if (rd->json_output)
++		jsonw_uint_field(rd->jw, "sq-psn", val);
++	else
++		pr_out("sq-psn %u ", val);
++}
++
++static void print_pathmig(struct rd *rd, uint32_t val,
++			  struct nlattr **nla_line)
++{
++	if (!nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE])
++		return;
++
++	if (rd->json_output)
++		jsonw_string_field(rd->jw,
++				   "path-mig-state",
++				   path_mig_to_str(val));
++	else
++		pr_out("path-mig-state %s ", path_mig_to_str(val));
++}
++
++static void print_pid(struct rd *rd, uint32_t val)
++{
++	if (rd->json_output)
++		jsonw_uint_field(rd->jw, "pid", val);
++	else
++		pr_out("pid %u ", val);
++}
++
++static void print_comm(struct rd *rd, const char *str,
++		       struct nlattr **nla_line)
++{
++	char tmp[18];
++
++	if (rd->json_output) {
++		/* Don't beatify output in JSON format */
++		jsonw_string_field(rd->jw, "comm", str);
++		return;
++	}
++
++	if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
++		snprintf(tmp, sizeof(tmp), "%s", str);
++	else
++		snprintf(tmp, sizeof(tmp), "[%s]", str);
++
++	pr_out("comm %s ", tmp);
++}
++
++static void print_dev(struct rd *rd, uint32_t idx, const char *name)
++{
++	if (rd->json_output) {
++		jsonw_uint_field(rd->jw, "ifindex", idx);
++		jsonw_string_field(rd->jw, "ifname", name);
++	} else {
++		pr_out("dev %s ", name);
++	}
++}
++
++static void print_link(struct rd *rd, uint32_t idx, const char *name,
++		       uint32_t port, struct nlattr **nla_line)
++{
++	if (rd->json_output) {
++		jsonw_uint_field(rd->jw, "ifindex", idx);
++
++		if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX])
++			jsonw_uint_field(rd->jw, "port", port);
++
++		jsonw_string_field(rd->jw, "ifname", name);
++	} else {
++		if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX])
++			pr_out("link %s/%u ", name, port);
++		else
++			pr_out("link %s/- ", name);
++	}
++}
++
++static char *get_task_name(uint32_t pid)
++{
++	char *comm;
++	FILE *f;
++
++	if (asprintf(&comm, "/proc/%d/comm", pid) < 0)
++		return NULL;
++
++	f = fopen(comm, "r");
++	free(comm);
++	if (!f)
++		return NULL;
++
++	if (fscanf(f, "%ms\n", &comm) != 1)
++		comm = NULL;
++
++	fclose(f);
++
++	return comm;
++}
++
++static int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data)
++{
++	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
++	struct nlattr *nla_table, *nla_entry;
++	struct rd *rd = data;
++	const char *name;
++	uint32_t idx;
++
++	mnl_attr_parse(nlh, 0, rd_attr_cb, tb);
++	if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] ||
++	    !tb[RDMA_NLDEV_ATTR_DEV_NAME] ||
++	    !tb[RDMA_NLDEV_ATTR_RES_QP])
++		return MNL_CB_ERROR;
++
++	name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]);
++	idx =  mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
++	nla_table = tb[RDMA_NLDEV_ATTR_RES_QP];
++
++	mnl_attr_for_each_nested(nla_entry, nla_table) {
++		struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
++		uint32_t lqpn, rqpn = 0, rq_psn = 0, sq_psn;
++		uint8_t type, state, path_mig_state = 0;
++		uint32_t port = 0, pid = 0;
++		char *comm = NULL;
++		int err;
++
++		err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line);
++		if (err != MNL_CB_OK)
++			return MNL_CB_ERROR;
++
++		if (!nla_line[RDMA_NLDEV_ATTR_RES_LQPN] ||
++		    !nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN] ||
++		    !nla_line[RDMA_NLDEV_ATTR_RES_TYPE] ||
++		    !nla_line[RDMA_NLDEV_ATTR_RES_STATE] ||
++		    (!nla_line[RDMA_NLDEV_ATTR_RES_PID] &&
++		     !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) {
++			return MNL_CB_ERROR;
++		}
++
++		if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX])
++			port = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]);
++
++		if (port != rd->port_idx)
++			continue;
++
++		lqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_LQPN]);
++		if (rd_check_is_filtered(rd, "lqpn", lqpn))
++			continue;
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_RQPN]) {
++			rqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_RQPN]);
++			if (rd_check_is_filtered(rd, "rqpn", rqpn))
++				continue;
++		} else {
++			if (rd_check_is_key_exist(rd, "rqpn"))
++				continue;
++		}
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]) {
++			rq_psn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]);
++			if (rd_check_is_filtered(rd, "rq-psn", rq_psn))
++				continue;
++		} else {
++			if (rd_check_is_key_exist(rd, "rq-psn"))
++				continue;
++		}
++
++		sq_psn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN]);
++		if (rd_check_is_filtered(rd, "sq-psn", sq_psn))
++			continue;
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]) {
++			path_mig_state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]);
++			if (rd_check_is_string_filtered(rd, "path-mig-state", path_mig_to_str(path_mig_state)))
++				continue;
++		} else {
++			if (rd_check_is_key_exist(rd, "path-mig-state"))
++				continue;
++		}
++
++		type = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_TYPE]);
++		if (rd_check_is_string_filtered(rd, "type", qp_types_to_str(type)))
++			continue;
++
++		state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]);
++		if (rd_check_is_string_filtered(rd, "state", qp_states_to_str(state)))
++			continue;
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) {
++			pid = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PID]);
++			comm = get_task_name(pid);
++		}
++
++		if (rd_check_is_filtered(rd, "pid", pid)) {
++			free(comm);
++			continue;
++		}
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])
++			/* discard const from mnl_attr_get_str */
++			comm = (char *)mnl_attr_get_str(nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]);
++
++		if (rd->json_output)
++			jsonw_start_array(rd->jw);
++
++		print_link(rd, idx, name, port, nla_line);
++
++		print_lqpn(rd, lqpn);
++		print_rqpn(rd, rqpn, nla_line);
++
++		print_type(rd, type);
++		print_state(rd, state);
++
++		print_rqpsn(rd, rq_psn, nla_line);
++		print_sqpsn(rd, sq_psn);
++
++		print_pathmig(rd, path_mig_state, nla_line);
++		print_pid(rd, pid);
++		print_comm(rd, comm, nla_line);
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
++			free(comm);
++
++		print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
++		newline(rd);
++	}
++	return MNL_CB_OK;
++}
++
++static void print_qp_type(struct rd *rd, uint32_t val)
++{
++	if (rd->json_output)
++		jsonw_string_field(rd->jw, "qp-type",
++				   qp_types_to_str(val));
++	else
++		pr_out("qp-type %s ", qp_types_to_str(val));
++}
++
++static const char *cm_id_state_to_str(uint8_t idx)
++{
++	static const char * const cm_id_states_str[] = {
++		"IDLE", "ADDR_QUERY", "ADDR_RESOLVED", "ROUTE_QUERY",
++		"ROUTE_RESOLVED", "CONNECT", "DISCONNECT", "ADDR_BOUND",
++		"LISTEN", "DEVICE_REMOVAL", "DESTROYING" };
++
++	if (idx < ARRAY_SIZE(cm_id_states_str))
++		return cm_id_states_str[idx];
++	return "UNKNOWN";
++}
++
++static const char *cm_id_ps_to_str(uint32_t ps)
++{
++	switch (ps) {
++	case RDMA_PS_IPOIB:
++		return "IPoIB";
++	case RDMA_PS_IB:
++		return "IPoIB";
++	case RDMA_PS_TCP:
++		return "TCP";
++	case RDMA_PS_UDP:
++		return "UDP";
++	default:
++		return "---";
++	}
++}
++
++static void print_cm_id_state(struct rd *rd, uint8_t state)
++{
++	if (rd->json_output) {
++		jsonw_string_field(rd->jw, "state", cm_id_state_to_str(state));
++		return;
++	}
++	pr_out("state %s ", cm_id_state_to_str(state));
++}
++
++static void print_ps(struct rd *rd, uint32_t ps)
++{
++	if (rd->json_output) {
++		jsonw_string_field(rd->jw, "ps", cm_id_ps_to_str(ps));
++		return;
++	}
++	pr_out("ps %s ", cm_id_ps_to_str(ps));
++}
++
++static void print_ipaddr(struct rd *rd, const char *key, char *addrstr,
++			 uint16_t port)
++{
++	if (rd->json_output) {
++		int name_size = INET6_ADDRSTRLEN+strlen(":65535");
++		char json_name[name_size];
++
++		snprintf(json_name, name_size, "%s:%u", addrstr, port);
++		jsonw_string_field(rd->jw, key, json_name);
++		return;
++	}
++	pr_out("%s %s:%u ", key, addrstr, port);
++}
++
++static int ss_ntop(struct nlattr *nla_line, char *addr_str, uint16_t *port)
++{
++	struct __kernel_sockaddr_storage *addr;
++
++	addr = (struct __kernel_sockaddr_storage *)
++						mnl_attr_get_payload(nla_line);
++	switch (addr->ss_family) {
++	case AF_INET: {
++		struct sockaddr_in *sin = (struct sockaddr_in *)addr;
++
++		if (!inet_ntop(AF_INET, (const void *)&sin->sin_addr, addr_str,
++			       INET6_ADDRSTRLEN))
++			return -EINVAL;
++		*port = ntohs(sin->sin_port);
++		break;
++	}
++	case AF_INET6: {
++		struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)addr;
++
++		if (!inet_ntop(AF_INET6, (const void *)&sin6->sin6_addr,
++			       addr_str, INET6_ADDRSTRLEN))
++			return -EINVAL;
++		*port = ntohs(sin6->sin6_port);
++		break;
++	}
++	default:
++		return -EINVAL;
++	}
++	return 0;
++}
++
++static int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data)
++{
++	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
++	struct nlattr *nla_table, *nla_entry;
++	struct rd *rd = data;
++	const char *name;
++	int idx;
++
++	mnl_attr_parse(nlh, 0, rd_attr_cb, tb);
++	if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] ||
++	    !tb[RDMA_NLDEV_ATTR_DEV_NAME] ||
++	    !tb[RDMA_NLDEV_ATTR_RES_CM_ID])
++		return MNL_CB_ERROR;
++
++	name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]);
++	idx =  mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
++	nla_table = tb[RDMA_NLDEV_ATTR_RES_CM_ID];
++	mnl_attr_for_each_nested(nla_entry, nla_table) {
++		struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
++		char src_addr_str[INET6_ADDRSTRLEN];
++		char dst_addr_str[INET6_ADDRSTRLEN];
++		uint16_t src_port, dst_port;
++		uint32_t port = 0, pid = 0;
++		uint8_t type = 0, state;
++		uint32_t lqpn = 0, ps;
++		char *comm = NULL;
++		int err;
++
++		err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line);
++		if (err != MNL_CB_OK)
++			return -EINVAL;
++
++		if (!nla_line[RDMA_NLDEV_ATTR_RES_STATE] ||
++		    !nla_line[RDMA_NLDEV_ATTR_RES_PS] ||
++		    (!nla_line[RDMA_NLDEV_ATTR_RES_PID] &&
++		     !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) {
++			return MNL_CB_ERROR;
++		}
++
++		if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX])
++			port = mnl_attr_get_u32(
++					nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]);
++
++		if (port && port != rd->port_idx)
++			continue;
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN]) {
++			lqpn = mnl_attr_get_u32(
++					nla_line[RDMA_NLDEV_ATTR_RES_LQPN]);
++			if (rd_check_is_filtered(rd, "lqpn", lqpn))
++				continue;
++		}
++		if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE]) {
++			type = mnl_attr_get_u8(
++					nla_line[RDMA_NLDEV_ATTR_RES_TYPE]);
++			if (rd_check_is_string_filtered(rd, "qp-type",
++							qp_types_to_str(type)))
++				continue;
++		}
++
++		ps = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PS]);
++		if (rd_check_is_string_filtered(rd, "ps", cm_id_ps_to_str(ps)))
++			continue;
++
++		state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]);
++		if (rd_check_is_string_filtered(rd, "state",
++						cm_id_state_to_str(state)))
++			continue;
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR]) {
++			if (ss_ntop(nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR],
++				    src_addr_str, &src_port))
++				continue;
++			if (rd_check_is_string_filtered(rd, "src-addr",
++							src_addr_str))
++				continue;
++			if (rd_check_is_filtered(rd, "src-port", src_port))
++				continue;
++		}
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR]) {
++			if (ss_ntop(nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR],
++				    dst_addr_str, &dst_port))
++				continue;
++			if (rd_check_is_string_filtered(rd, "dst-addr",
++							dst_addr_str))
++				continue;
++			if (rd_check_is_filtered(rd, "dst-port", dst_port))
++				continue;
++		}
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) {
++			pid = mnl_attr_get_u32(
++					nla_line[RDMA_NLDEV_ATTR_RES_PID]);
++			comm = get_task_name(pid);
++		}
++
++		if (rd_check_is_filtered(rd, "pid", pid)) {
++			free(comm);
++			continue;
++		}
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) {
++			/* discard const from mnl_attr_get_str */
++			comm = (char *)mnl_attr_get_str(
++				nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]);
++		}
++
++		if (rd->json_output)
++			jsonw_start_array(rd->jw);
++
++		print_link(rd, idx, name, port, nla_line);
++		if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN])
++			print_lqpn(rd, lqpn);
++		if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE])
++			print_qp_type(rd, type);
++		print_cm_id_state(rd, state);
++		print_ps(rd, ps);
++		print_pid(rd, pid);
++		print_comm(rd, comm, nla_line);
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR])
++			print_ipaddr(rd, "src-addr", src_addr_str, src_port);
++		if (nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR])
++			print_ipaddr(rd, "dst-addr", dst_addr_str, dst_port);
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
++			free(comm);
++
++		print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
++		newline(rd);
++	}
++	return MNL_CB_OK;
++}
++
++static void print_cqe(struct rd *rd, uint32_t val)
++{
++	if (rd->json_output)
++		jsonw_uint_field(rd->jw, "cqe", val);
++	else
++		pr_out("cqe %u ", val);
++}
++
++static void print_users(struct rd *rd, uint64_t val)
++{
++	if (rd->json_output)
++		jsonw_uint_field(rd->jw, "users", val);
++	else
++		pr_out("users %" PRIu64 " ", val);
++}
++
++static const char *poll_ctx_to_str(uint8_t idx)
++{
++	static const char * const cm_id_states_str[] = {
++		"DIRECT", "SOFTIRQ", "WORKQUEUE"};
++
++	if (idx < ARRAY_SIZE(cm_id_states_str))
++		return cm_id_states_str[idx];
++	return "UNKNOWN";
++}
++
++static void print_poll_ctx(struct rd *rd, uint8_t poll_ctx)
++{
++	if (rd->json_output) {
++		jsonw_string_field(rd->jw, "poll-ctx",
++				   poll_ctx_to_str(poll_ctx));
++		return;
++	}
++	pr_out("poll-ctx %s ", poll_ctx_to_str(poll_ctx));
++}
++
++static int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data)
++{
++	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
++	struct nlattr *nla_table, *nla_entry;
++	struct rd *rd = data;
++	const char *name;
++	uint32_t idx;
++
++	mnl_attr_parse(nlh, 0, rd_attr_cb, tb);
++	if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] ||
++	    !tb[RDMA_NLDEV_ATTR_DEV_NAME] ||
++	    !tb[RDMA_NLDEV_ATTR_RES_CQ])
++		return MNL_CB_ERROR;
++
++	name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]);
++	idx =  mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
++	nla_table = tb[RDMA_NLDEV_ATTR_RES_CQ];
++
++	mnl_attr_for_each_nested(nla_entry, nla_table) {
++		struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
++		char *comm = NULL;
++		uint32_t pid = 0;
++		uint8_t poll_ctx = 0;
++		uint64_t users;
++		uint32_t cqe;
++		int err;
++
++		err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line);
++		if (err != MNL_CB_OK)
++			return MNL_CB_ERROR;
++
++		if (!nla_line[RDMA_NLDEV_ATTR_RES_CQE] ||
++		    !nla_line[RDMA_NLDEV_ATTR_RES_USECNT] ||
++		    (!nla_line[RDMA_NLDEV_ATTR_RES_PID] &&
++		     !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) {
++			return MNL_CB_ERROR;
++		}
++
++		cqe = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CQE]);
++
++		users = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_USECNT]);
++		if (rd_check_is_filtered(rd, "users", users))
++			continue;
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]) {
++			poll_ctx = mnl_attr_get_u8(
++					nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]);
++			if (rd_check_is_string_filtered(rd, "poll-ctx",
++						poll_ctx_to_str(poll_ctx)))
++				continue;
++		}
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) {
++			pid = mnl_attr_get_u32(
++					nla_line[RDMA_NLDEV_ATTR_RES_PID]);
++			comm = get_task_name(pid);
++		}
++
++		if (rd_check_is_filtered(rd, "pid", pid)) {
++			free(comm);
++			continue;
++		}
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])
++			/* discard const from mnl_attr_get_str */
++			comm = (char *)mnl_attr_get_str(
++				nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]);
++
++		if (rd->json_output)
++			jsonw_start_array(rd->jw);
++
++		print_dev(rd, idx, name);
++		print_cqe(rd, cqe);
++		print_users(rd, users);
++		if (nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX])
++			print_poll_ctx(rd, poll_ctx);
++		print_pid(rd, pid);
++		print_comm(rd, comm, nla_line);
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
++			free(comm);
++
++		print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
++		newline(rd);
++	}
++	return MNL_CB_OK;
++}
++
++static void print_key(struct rd *rd, const char *name, uint32_t val)
++{
++	if (rd->json_output)
++		jsonw_xint_field(rd->jw, name, val);
++	else
++		pr_out("%s 0x%x ", name, val);
++}
++
++static void print_iova(struct rd *rd, uint64_t val)
++{
++	if (rd->json_output)
++		jsonw_xint_field(rd->jw, "iova", val);
++	else
++		pr_out("iova 0x%" PRIx64 " ", val);
++}
++
++static void print_mrlen(struct rd *rd, uint64_t val)
++{
++	if (rd->json_output)
++		jsonw_uint_field(rd->jw, "mrlen", val);
++	else
++		pr_out("mrlen %" PRIu64 " ", val);
++}
++
++static int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data)
++{
++	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
++	struct nlattr *nla_table, *nla_entry;
++	struct rd *rd = data;
++	const char *name;
++	uint32_t idx;
++
++	mnl_attr_parse(nlh, 0, rd_attr_cb, tb);
++	if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] ||
++	    !tb[RDMA_NLDEV_ATTR_DEV_NAME] ||
++	    !tb[RDMA_NLDEV_ATTR_RES_MR])
++		return MNL_CB_ERROR;
++
++	name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]);
++	idx =  mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
++	nla_table = tb[RDMA_NLDEV_ATTR_RES_MR];
++
++	mnl_attr_for_each_nested(nla_entry, nla_table) {
++		struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
++		uint32_t rkey = 0, lkey = 0;
++		uint64_t iova = 0, mrlen;
++		char *comm = NULL;
++		uint32_t pid = 0;
++		int err;
++
++		err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line);
++		if (err != MNL_CB_OK)
++			return MNL_CB_ERROR;
++
++		if (!nla_line[RDMA_NLDEV_ATTR_RES_MRLEN] ||
++		    (!nla_line[RDMA_NLDEV_ATTR_RES_PID] &&
++		     !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) {
++			return MNL_CB_ERROR;
++		}
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_RKEY])
++			rkey = mnl_attr_get_u32(
++					nla_line[RDMA_NLDEV_ATTR_RES_RKEY]);
++		if (nla_line[RDMA_NLDEV_ATTR_RES_LKEY])
++			lkey = mnl_attr_get_u32(
++					nla_line[RDMA_NLDEV_ATTR_RES_LKEY]);
++		if (nla_line[RDMA_NLDEV_ATTR_RES_IOVA])
++			iova = mnl_attr_get_u64(
++					nla_line[RDMA_NLDEV_ATTR_RES_IOVA]);
++
++		mrlen = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_MRLEN]);
++		if (rd_check_is_filtered(rd, "mrlen", mrlen))
++			continue;
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) {
++			pid = mnl_attr_get_u32(
++					nla_line[RDMA_NLDEV_ATTR_RES_PID]);
++			comm = get_task_name(pid);
++		}
++
++		if (rd_check_is_filtered(rd, "pid", pid)) {
++			free(comm);
++			continue;
++		}
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])
++			/* discard const from mnl_attr_get_str */
++			comm = (char *)mnl_attr_get_str(
++				nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]);
++
++		if (rd->json_output)
++			jsonw_start_array(rd->jw);
++
++		print_dev(rd, idx, name);
++		if (nla_line[RDMA_NLDEV_ATTR_RES_RKEY])
++			print_key(rd, "rkey", rkey);
++		if (nla_line[RDMA_NLDEV_ATTR_RES_LKEY])
++			print_key(rd, "lkey", lkey);
++		if (nla_line[RDMA_NLDEV_ATTR_RES_IOVA])
++			print_iova(rd, iova);
++		print_mrlen(rd, mrlen);
++		print_pid(rd, pid);
++		print_comm(rd, comm, nla_line);
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
++			free(comm);
++
++		print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
++		newline(rd);
++	}
++	return MNL_CB_OK;
++}
++
++static int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data)
++{
++	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
++	struct nlattr *nla_table, *nla_entry;
++	struct rd *rd = data;
++	const char *name;
++	uint32_t idx;
++
++	mnl_attr_parse(nlh, 0, rd_attr_cb, tb);
++	if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] ||
++	    !tb[RDMA_NLDEV_ATTR_DEV_NAME] ||
++	    !tb[RDMA_NLDEV_ATTR_RES_PD])
++		return MNL_CB_ERROR;
++
++	name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]);
++	idx =  mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
++	nla_table = tb[RDMA_NLDEV_ATTR_RES_PD];
++
++	mnl_attr_for_each_nested(nla_entry, nla_table) {
++		uint32_t local_dma_lkey = 0, unsafe_global_rkey = 0;
++		struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
++		char *comm = NULL;
++		uint32_t pid = 0;
++		uint64_t users;
++		int err;
++
++		err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line);
++		if (err != MNL_CB_OK)
++			return MNL_CB_ERROR;
++
++		if (!nla_line[RDMA_NLDEV_ATTR_RES_USECNT] ||
++		    (!nla_line[RDMA_NLDEV_ATTR_RES_PID] &&
++		     !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) {
++			return MNL_CB_ERROR;
++		}
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY])
++			local_dma_lkey = mnl_attr_get_u32(
++				nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]);
++
++		users = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_USECNT]);
++		if (rd_check_is_filtered(rd, "users", users))
++			continue;
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY])
++			unsafe_global_rkey = mnl_attr_get_u32(
++			      nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]);
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) {
++			pid = mnl_attr_get_u32(
++				nla_line[RDMA_NLDEV_ATTR_RES_PID]);
++			comm = get_task_name(pid);
++		}
++
++		if (rd_check_is_filtered(rd, "pid", pid))
++			continue;
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])
++			/* discard const from mnl_attr_get_str */
++			comm = (char *)mnl_attr_get_str(
++				nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]);
++
++		if (rd->json_output)
++			jsonw_start_array(rd->jw);
++
++		print_dev(rd, idx, name);
++		if (nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY])
++			print_key(rd, "local_dma_lkey", local_dma_lkey);
++		print_users(rd, users);
++		if (nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY])
++			print_key(rd, "unsafe_global_rkey", unsafe_global_rkey);
++		print_pid(rd, pid);
++		print_comm(rd, comm, nla_line);
++
++		if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
++			free(comm);
++
++		print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
++		newline(rd);
++	}
++	return MNL_CB_OK;
++}
++
++RES_FUNC(res_no_args,	RDMA_NLDEV_CMD_RES_GET,	NULL, true);
++
++static const struct
++filters qp_valid_filters[MAX_NUMBER_OF_FILTERS] = {{ .name = "link",
++						   .is_number = false },
++						   { .name = "lqpn",
++						   .is_number = true },
++						   { .name = "rqpn",
++						   .is_number = true },
++						   { .name = "pid",
++						   .is_number = true },
++						   { .name = "sq-psn",
++						   .is_number = true },
++						   { .name = "rq-psn",
++						   .is_number = true },
++						   { .name = "type",
++						   .is_number = false },
++						   { .name = "path-mig-state",
++						   .is_number = false },
++						   { .name = "state",
++						   .is_number = false } };
++
++RES_FUNC(res_qp,	RDMA_NLDEV_CMD_RES_QP_GET, qp_valid_filters, false);
++
++static const
++struct filters cm_id_valid_filters[MAX_NUMBER_OF_FILTERS] = {
++	{ .name = "link", .is_number = false },
++	{ .name = "lqpn", .is_number = true },
++	{ .name = "qp-type", .is_number = false },
++	{ .name = "state", .is_number = false },
++	{ .name = "ps", .is_number = false },
++	{ .name = "dev-type", .is_number = false },
++	{ .name = "transport-type", .is_number = false },
++	{ .name = "pid", .is_number = true },
++	{ .name = "src-addr", .is_number = false },
++	{ .name = "src-port", .is_number = true },
++	{ .name = "dst-addr", .is_number = false },
++	{ .name = "dst-port", .is_number = true }
++};
++
++RES_FUNC(res_cm_id, RDMA_NLDEV_CMD_RES_CM_ID_GET, cm_id_valid_filters, false);
++
++static const
++struct filters cq_valid_filters[MAX_NUMBER_OF_FILTERS] = {
++	{ .name = "dev", .is_number = false },
++	{ .name = "users", .is_number = true },
++	{ .name = "poll-ctx", .is_number = false },
++	{ .name = "pid", .is_number = true }
++};
++
++RES_FUNC(res_cq, RDMA_NLDEV_CMD_RES_CQ_GET, cq_valid_filters, true);
++
++static const
++struct filters mr_valid_filters[MAX_NUMBER_OF_FILTERS] = {
++	{ .name = "dev", .is_number = false },
++	{ .name = "rkey", .is_number = true },
++	{ .name = "lkey", .is_number = true },
++	{ .name = "mrlen", .is_number = true },
++	{ .name = "pid", .is_number = true }
++};
++
++RES_FUNC(res_mr, RDMA_NLDEV_CMD_RES_MR_GET, mr_valid_filters, true);
++
++static const
++struct filters pd_valid_filters[MAX_NUMBER_OF_FILTERS] = {
++	{ .name = "dev", .is_number = false },
++	{ .name = "users", .is_number = true },
++	{ .name = "pid", .is_number = true }
++};
++
++RES_FUNC(res_pd, RDMA_NLDEV_CMD_RES_PD_GET, pd_valid_filters, true);
++
++static int res_show(struct rd *rd)
++{
++	const struct rd_cmd cmds[] = {
++		{ NULL,		res_no_args	},
++		{ "qp",		res_qp		},
++		{ "cm_id",	res_cm_id	},
++		{ "cq",		res_cq		},
++		{ "mr",		res_mr		},
++		{ "pd",		res_pd		},
++		{ 0 }
++	};
++
++	/*
++	 * Special case to support "rdma res show DEV_NAME"
++	 */
++	if (rd_argc(rd) == 1 && dev_map_lookup(rd, false))
++		return rd_exec_dev(rd, _res_no_args);
++
++	return rd_exec_cmd(rd, cmds, "parameter");
++}
++
++int cmd_res(struct rd *rd)
++{
++	const struct rd_cmd cmds[] = {
++		{ NULL,		res_show },
++		{ "show",	res_show },
++		{ "list",	res_show },
++		{ "help",	res_help },
++		{ 0 }
++	};
++
++	return rd_exec_cmd(rd, cmds, "resource command");
++}
+diff --git a/rdma/utils.c b/rdma/utils.c
+new file mode 100644
+index 0000000000000..069d44fece101
+--- /dev/null
++++ b/rdma/utils.c
+@@ -0,0 +1,868 @@
++/*
++ * utils.c	RDMA tool
++ *
++ *              This program is free software; you can redistribute it and/or
++ *              modify it under the terms of the GNU General Public License
++ *              as published by the Free Software Foundation; either version
++ *              2 of the License, or (at your option) any later version.
++ *
++ * Authors:     Leon Romanovsky <leonro@mellanox.com>
++ */
++
++#include "rdma.h"
++#include <ctype.h>
++#include <inttypes.h>
++
++int rd_argc(struct rd *rd)
++{
++	return rd->argc;
++}
++
++char *rd_argv(struct rd *rd)
++{
++	if (!rd_argc(rd))
++		return NULL;
++	return *rd->argv;
++}
++
++int strcmpx(const char *str1, const char *str2)
++{
++	if (strlen(str1) > strlen(str2))
++		return -1;
++	return strncmp(str1, str2, strlen(str1));
++}
++
++static bool rd_argv_match(struct rd *rd, const char *pattern)
++{
++	if (!rd_argc(rd))
++		return false;
++	return strcmpx(rd_argv(rd), pattern) == 0;
++}
++
++void rd_arg_inc(struct rd *rd)
++{
++	if (!rd_argc(rd))
++		return;
++	rd->argc--;
++	rd->argv++;
++}
++
++bool rd_no_arg(struct rd *rd)
++{
++	return rd_argc(rd) == 0;
++}
++
++/*
++ * Possible input:output
++ * dev/port    | first port | is_dump_all
++ * mlx5_1      | 0          | true
++ * mlx5_1/     | 0          | true
++ * mlx5_1/0    | 0          | false
++ * mlx5_1/1    | 1          | false
++ * mlx5_1/-    | 0          | false
++ *
++ * In strict mode, /- will return error.
++ */
++static int get_port_from_argv(struct rd *rd, uint32_t *port,
++			      bool *is_dump_all, bool strict_port)
++{
++	char *slash;
++
++	*port = 0;
++	*is_dump_all = true;
++
++	slash = strchr(rd_argv(rd), '/');
++	/* if no port found, return 0 */
++	if (slash++) {
++		if (*slash == '-') {
++			if (strict_port)
++				return -EINVAL;
++			*is_dump_all = false;
++			return 0;
++		}
++
++		if (isdigit(*slash)) {
++			*is_dump_all = false;
++			*port = atoi(slash);
++		}
++		if (!*port && strlen(slash))
++			return -EINVAL;
++	}
++	return 0;
++}
++
++static struct dev_map *dev_map_alloc(const char *dev_name)
++{
++	struct dev_map *dev_map;
++
++	dev_map = calloc(1, sizeof(*dev_map));
++	if (!dev_map)
++		return NULL;
++	dev_map->dev_name = strdup(dev_name);
++	if (!dev_map->dev_name) {
++		free(dev_map);
++		return NULL;
++	}
++
++	return dev_map;
++}
++
++static void dev_map_cleanup(struct rd *rd)
++{
++	struct dev_map *dev_map, *tmp;
++
++	list_for_each_entry_safe(dev_map, tmp,
++				 &rd->dev_map_list, list) {
++		list_del(&dev_map->list);
++		free(dev_map->dev_name);
++		free(dev_map);
++	}
++}
++
++static int add_filter(struct rd *rd, char *key, char *value,
++		      const struct filters valid_filters[])
++{
++	char cset[] = "1234567890,-";
++	struct filter_entry *fe;
++	bool key_found = false;
++	int idx = 0;
++	int ret;
++
++	fe = calloc(1, sizeof(*fe));
++	if (!fe)
++		return -ENOMEM;
++
++	while (idx < MAX_NUMBER_OF_FILTERS && valid_filters[idx].name) {
++		if (!strcmpx(key, valid_filters[idx].name)) {
++			key_found = true;
++			break;
++		}
++		idx++;
++	}
++	if (!key_found) {
++		pr_err("Unsupported filter option: %s\n", key);
++		ret = -EINVAL;
++		goto err;
++	}
++
++	/*
++	 * Check the filter validity, not optimal, but works
++	 *
++	 * Actually, there are three types of filters
++	 *  numeric - for example PID or QPN
++	 *  string  - for example states
++	 *  link    - user requested to filter on specific link
++	 *            e.g. mlx5_1/1, mlx5_1/-, mlx5_1 ...
++	 */
++	if (valid_filters[idx].is_number &&
++	    strspn(value, cset) != strlen(value)) {
++		pr_err("%s filter accepts \"%s\" characters only\n", key, cset);
++		ret = -EINVAL;
++		goto err;
++	}
++
++	fe->key = strdup(key);
++	fe->value = strdup(value);
++	if (!fe->key || !fe->value) {
++		ret = -ENOMEM;
++		goto err_alloc;
++	}
++
++	for (idx = 0; idx < strlen(fe->value); idx++)
++		fe->value[idx] = tolower(fe->value[idx]);
++
++	list_add_tail(&fe->list, &rd->filter_list);
++	return 0;
++
++err_alloc:
++	free(fe->value);
++	free(fe->key);
++err:
++	free(fe);
++	return ret;
++}
++
++int rd_build_filter(struct rd *rd, const struct filters valid_filters[])
++{
++	int ret = 0;
++	int idx = 0;
++
++	if (!valid_filters || !rd_argc(rd))
++		goto out;
++
++	if (rd_argc(rd) == 1) {
++		pr_err("No filter data was supplied to filter option %s\n", rd_argv(rd));
++		ret = -EINVAL;
++		goto out;
++	}
++
++	if (rd_argc(rd) % 2) {
++		pr_err("There is filter option without data\n");
++		ret = -EINVAL;
++		goto out;
++	}
++
++	while (idx != rd_argc(rd)) {
++		/*
++		 * We can do micro-optimization and skip "dev"
++		 * and "link" filters, but it is not worth of it.
++		 */
++		ret = add_filter(rd, *(rd->argv + idx),
++				 *(rd->argv + idx + 1), valid_filters);
++		if (ret)
++			goto out;
++		idx += 2;
++	}
++
++out:
++	return ret;
++}
++
++bool rd_check_is_key_exist(struct rd *rd, const char *key)
++{
++	struct filter_entry *fe;
++
++	list_for_each_entry(fe, &rd->filter_list, list) {
++		if (!strcmpx(fe->key, key))
++			return true;
++	}
++
++	return false;
++}
++
++/*
++ * Check if string entry is filtered:
++ *  * key doesn't exist -> user didn't request -> not filtered
++ */
++bool rd_check_is_string_filtered(struct rd *rd,
++				 const char *key, const char *val)
++{
++	bool key_is_filtered = false;
++	struct filter_entry *fe;
++	char *p = NULL;
++	char *str;
++
++	list_for_each_entry(fe, &rd->filter_list, list) {
++		if (!strcmpx(fe->key, key)) {
++			/* We found the key */
++			p = strdup(fe->value);
++			key_is_filtered = true;
++			if (!p) {
++				/*
++				 * Something extremely wrong if we fail
++				 * to allocate small amount of bytes.
++				 */
++				pr_err("Found key, but failed to allocate memory to store value\n");
++				return key_is_filtered;
++			}
++
++			/*
++			 * Need to check if value in range
++			 * It can come in the following formats
++			 * and their permutations:
++			 * str
++			 * str1,str2
++			 */
++			str = strtok(p, ",");
++			while (str) {
++				if (strlen(str) == strlen(val) &&
++				    !strcasecmp(str, val)) {
++					key_is_filtered = false;
++					goto out;
++				}
++				str = strtok(NULL, ",");
++			}
++			goto out;
++		}
++	}
++
++out:
++	free(p);
++	return key_is_filtered;
++}
++
++/*
++ * Check if key is filtered:
++ * key doesn't exist -> user didn't request -> not filtered
++ */
++bool rd_check_is_filtered(struct rd *rd, const char *key, uint32_t val)
++{
++	bool key_is_filtered = false;
++	struct filter_entry *fe;
++
++	list_for_each_entry(fe, &rd->filter_list, list) {
++		uint32_t left_val = 0, fe_value = 0;
++		bool range_check = false;
++		char *p = fe->value;
++
++		if (!strcmpx(fe->key, key)) {
++			/* We found the key */
++			key_is_filtered = true;
++			/*
++			 * Need to check if value in range
++			 * It can come in the following formats
++			 * (and their permutations):
++			 * numb
++			 * numb1,numb2
++			 * ,numb1,numb2
++			 * numb1-numb2
++			 * numb1,numb2-numb3,numb4-numb5
++			 */
++			while (*p) {
++				if (isdigit(*p)) {
++					fe_value = strtol(p, &p, 10);
++					if (fe_value == val ||
++					    (range_check && left_val < val &&
++					     val < fe_value)) {
++						key_is_filtered = false;
++						goto out;
++					}
++					range_check = false;
++				} else {
++					if (*p == '-') {
++						left_val = fe_value;
++						range_check = true;
++					}
++					p++;
++				}
++			}
++			goto out;
++		}
++	}
++
++out:
++	return key_is_filtered;
++}
++
++static void filters_cleanup(struct rd *rd)
++{
++	struct filter_entry *fe, *tmp;
++
++	list_for_each_entry_safe(fe, tmp,
++				 &rd->filter_list, list) {
++		list_del(&fe->list);
++		free(fe->key);
++		free(fe->value);
++		free(fe);
++	}
++}
++
++static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
++	[RDMA_NLDEV_ATTR_DEV_INDEX] = MNL_TYPE_U32,
++	[RDMA_NLDEV_ATTR_DEV_NAME] = MNL_TYPE_NUL_STRING,
++	[RDMA_NLDEV_ATTR_PORT_INDEX] = MNL_TYPE_U32,
++	[RDMA_NLDEV_ATTR_CAP_FLAGS] = MNL_TYPE_U64,
++	[RDMA_NLDEV_ATTR_FW_VERSION] = MNL_TYPE_NUL_STRING,
++	[RDMA_NLDEV_ATTR_NODE_GUID] = MNL_TYPE_U64,
++	[RDMA_NLDEV_ATTR_SYS_IMAGE_GUID] = MNL_TYPE_U64,
++	[RDMA_NLDEV_ATTR_LID] = MNL_TYPE_U32,
++	[RDMA_NLDEV_ATTR_SM_LID] = MNL_TYPE_U32,
++	[RDMA_NLDEV_ATTR_LMC] = MNL_TYPE_U8,
++	[RDMA_NLDEV_ATTR_PORT_STATE] = MNL_TYPE_U8,
++	[RDMA_NLDEV_ATTR_PORT_PHYS_STATE] = MNL_TYPE_U8,
++	[RDMA_NLDEV_ATTR_DEV_NODE_TYPE] = MNL_TYPE_U8,
++	[RDMA_NLDEV_ATTR_RES_SUMMARY]	= MNL_TYPE_NESTED,
++	[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY]	= MNL_TYPE_NESTED,
++	[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_NAME] = MNL_TYPE_NUL_STRING,
++	[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR] = MNL_TYPE_U64,
++	[RDMA_NLDEV_ATTR_RES_QP]		= MNL_TYPE_NESTED,
++	[RDMA_NLDEV_ATTR_RES_QP_ENTRY]		= MNL_TYPE_NESTED,
++	[RDMA_NLDEV_ATTR_RES_LQPN]	= MNL_TYPE_U32,
++	[RDMA_NLDEV_ATTR_RES_RQPN]	= MNL_TYPE_U32,
++	[RDMA_NLDEV_ATTR_RES_RQ_PSN]		= MNL_TYPE_U32,
++	[RDMA_NLDEV_ATTR_RES_SQ_PSN]		= MNL_TYPE_U32,
++	[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]	= MNL_TYPE_U8,
++	[RDMA_NLDEV_ATTR_RES_TYPE]		= MNL_TYPE_U8,
++	[RDMA_NLDEV_ATTR_RES_STATE]		= MNL_TYPE_U8,
++	[RDMA_NLDEV_ATTR_RES_PID]		= MNL_TYPE_U32,
++	[RDMA_NLDEV_ATTR_RES_KERN_NAME]	= MNL_TYPE_NUL_STRING,
++	[RDMA_NLDEV_ATTR_RES_CM_ID]		= MNL_TYPE_NESTED,
++	[RDMA_NLDEV_ATTR_RES_CM_ID_ENTRY]	= MNL_TYPE_NESTED,
++	[RDMA_NLDEV_ATTR_RES_PS]		= MNL_TYPE_U32,
++	[RDMA_NLDEV_ATTR_RES_SRC_ADDR]		= MNL_TYPE_UNSPEC,
++	[RDMA_NLDEV_ATTR_RES_DST_ADDR]		= MNL_TYPE_UNSPEC,
++	[RDMA_NLDEV_ATTR_RES_CQ] = MNL_TYPE_NESTED,
++	[RDMA_NLDEV_ATTR_RES_CQ_ENTRY] = MNL_TYPE_NESTED,
++	[RDMA_NLDEV_ATTR_RES_CQE] = MNL_TYPE_U32,
++	[RDMA_NLDEV_ATTR_RES_USECNT] = MNL_TYPE_U64,
++	[RDMA_NLDEV_ATTR_RES_POLL_CTX] = MNL_TYPE_U8,
++	[RDMA_NLDEV_ATTR_RES_MR] = MNL_TYPE_NESTED,
++	[RDMA_NLDEV_ATTR_RES_MR_ENTRY] = MNL_TYPE_NESTED,
++	[RDMA_NLDEV_ATTR_RES_RKEY] = MNL_TYPE_U32,
++	[RDMA_NLDEV_ATTR_RES_LKEY] = MNL_TYPE_U32,
++	[RDMA_NLDEV_ATTR_RES_IOVA] = MNL_TYPE_U64,
++	[RDMA_NLDEV_ATTR_RES_MRLEN] = MNL_TYPE_U64,
++	[RDMA_NLDEV_ATTR_NDEV_INDEX]		= MNL_TYPE_U32,
++	[RDMA_NLDEV_ATTR_NDEV_NAME]		= MNL_TYPE_NUL_STRING,
++	[RDMA_NLDEV_ATTR_DRIVER] = MNL_TYPE_NESTED,
++	[RDMA_NLDEV_ATTR_DRIVER_ENTRY] = MNL_TYPE_NESTED,
++	[RDMA_NLDEV_ATTR_DRIVER_STRING] = MNL_TYPE_NUL_STRING,
++	[RDMA_NLDEV_ATTR_DRIVER_PRINT_TYPE] = MNL_TYPE_U8,
++	[RDMA_NLDEV_ATTR_DRIVER_S32] = MNL_TYPE_U32,
++	[RDMA_NLDEV_ATTR_DRIVER_U32] = MNL_TYPE_U32,
++	[RDMA_NLDEV_ATTR_DRIVER_S64] = MNL_TYPE_U64,
++	[RDMA_NLDEV_ATTR_DRIVER_U64] = MNL_TYPE_U64,
++};
++
++int rd_attr_check(const struct nlattr *attr, int *typep)
++{
++	int type;
++
++	if (mnl_attr_type_valid(attr, RDMA_NLDEV_ATTR_MAX) < 0)
++		return MNL_CB_ERROR;
++
++	type = mnl_attr_get_type(attr);
++
++	if (mnl_attr_validate(attr, nldev_policy[type]) < 0)
++		return MNL_CB_ERROR;
++
++	*typep = nldev_policy[type];
++	return MNL_CB_OK;
++}
++
++int rd_attr_cb(const struct nlattr *attr, void *data)
++{
++	const struct nlattr **tb = data;
++	int type;
++
++	if (mnl_attr_type_valid(attr, RDMA_NLDEV_ATTR_MAX - 1) < 0)
++		/* We received unknown attribute */
++		return MNL_CB_OK;
++
++	type = mnl_attr_get_type(attr);
++
++	if (mnl_attr_validate(attr, nldev_policy[type]) < 0)
++		return MNL_CB_ERROR;
++
++	tb[type] = attr;
++	return MNL_CB_OK;
++}
++
++int rd_dev_init_cb(const struct nlmsghdr *nlh, void *data)
++{
++	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
++	struct dev_map *dev_map;
++	struct rd *rd = data;
++	const char *dev_name;
++
++	mnl_attr_parse(nlh, 0, rd_attr_cb, tb);
++	if (!tb[RDMA_NLDEV_ATTR_DEV_NAME] || !tb[RDMA_NLDEV_ATTR_DEV_INDEX])
++		return MNL_CB_ERROR;
++	if (!tb[RDMA_NLDEV_ATTR_PORT_INDEX]) {
++		pr_err("This tool doesn't support switches yet\n");
++		return MNL_CB_ERROR;
++	}
++
++	dev_name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]);
++
++	dev_map = dev_map_alloc(dev_name);
++	if (!dev_map)
++		/* The main function will cleanup the allocations */
++		return MNL_CB_ERROR;
++	list_add_tail(&dev_map->list, &rd->dev_map_list);
++
++	dev_map->num_ports = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]);
++	dev_map->idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
++	return MNL_CB_OK;
++}
++
++void rd_free(struct rd *rd)
++{
++	if (!rd)
++		return;
++	free(rd->buff);
++	dev_map_cleanup(rd);
++	filters_cleanup(rd);
++}
++
++int rd_set_arg_to_devname(struct rd *rd)
++{
++	int ret = 0;
++
++	while (!rd_no_arg(rd)) {
++		if (rd_argv_match(rd, "dev") || rd_argv_match(rd, "link")) {
++			rd_arg_inc(rd);
++			if (rd_no_arg(rd)) {
++				pr_err("No device name was supplied\n");
++				ret = -EINVAL;
++			}
++			goto out;
++		}
++		rd_arg_inc(rd);
++	}
++out:
++	return ret;
++}
++
++int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd), bool strict_port)
++{
++	struct dev_map *dev_map;
++	uint32_t port;
++	int ret = 0;
++
++	if (rd->json_output)
++		jsonw_start_array(rd->jw);
++	if (rd_no_arg(rd)) {
++		list_for_each_entry(dev_map, &rd->dev_map_list, list) {
++			rd->dev_idx = dev_map->idx;
++			port = (strict_port) ? 1 : 0;
++			for (; port < dev_map->num_ports + 1; port++) {
++				rd->port_idx = port;
++				ret = cb(rd);
++				if (ret)
++					goto out;
++			}
++		}
++
++	} else {
++		bool is_dump_all;
++
++		dev_map = dev_map_lookup(rd, true);
++		ret = get_port_from_argv(rd, &port, &is_dump_all, strict_port);
++		if (!dev_map || port > dev_map->num_ports || (!port && ret)) {
++			pr_err("Wrong device name\n");
++			ret = -ENOENT;
++			goto out;
++		}
++		rd_arg_inc(rd);
++		rd->dev_idx = dev_map->idx;
++		rd->port_idx = port;
++		for (; rd->port_idx < dev_map->num_ports + 1; rd->port_idx++) {
++			ret = cb(rd);
++			if (ret)
++				goto out;
++			if (!is_dump_all)
++				/*
++				 * We got request to show link for devname
++				 * with port index.
++				 */
++				break;
++		}
++	}
++
++out:
++	if (rd->json_output)
++		jsonw_end_array(rd->jw);
++	return ret;
++}
++
++int rd_exec_dev(struct rd *rd, int (*cb)(struct rd *rd))
++{
++	struct dev_map *dev_map;
++	int ret = 0;
++
++	if (rd->json_output)
++		jsonw_start_array(rd->jw);
++	if (rd_no_arg(rd)) {
++		list_for_each_entry(dev_map, &rd->dev_map_list, list) {
++			rd->dev_idx = dev_map->idx;
++			ret = cb(rd);
++			if (ret)
++				goto out;
++		}
++	} else {
++		dev_map = dev_map_lookup(rd, false);
++		if (!dev_map) {
++			pr_err("Wrong device name - %s\n", rd_argv(rd));
++			ret = -ENOENT;
++			goto out;
++		}
++		rd_arg_inc(rd);
++		rd->dev_idx = dev_map->idx;
++		ret = cb(rd);
++	}
++out:
++	if (rd->json_output)
++		jsonw_end_array(rd->jw);
++	return ret;
++}
++
++int rd_exec_require_dev(struct rd *rd, int (*cb)(struct rd *rd))
++{
++	if (rd_no_arg(rd)) {
++		pr_err("Please provide device name.\n");
++		return -EINVAL;
++	}
++
++	return rd_exec_dev(rd, cb);
++}
++
++int rd_exec_cmd(struct rd *rd, const struct rd_cmd *cmds, const char *str)
++{
++	const struct rd_cmd *c;
++
++	/* First argument in objs table is default variant */
++	if (rd_no_arg(rd))
++		return cmds->func(rd);
++
++	for (c = cmds + 1; c->cmd; ++c) {
++		if (rd_argv_match(rd, c->cmd)) {
++			/* Move to next argument */
++			rd_arg_inc(rd);
++			return c->func(rd);
++		}
++	}
++
++	pr_err("Unknown %s '%s'.\n", str, rd_argv(rd));
++	return 0;
++}
++
++void rd_prepare_msg(struct rd *rd, uint32_t cmd, uint32_t *seq, uint16_t flags)
++{
++	*seq = time(NULL);
++
++	rd->nlh = mnl_nlmsg_put_header(rd->buff);
++	rd->nlh->nlmsg_type = RDMA_NL_GET_TYPE(RDMA_NL_NLDEV, cmd);
++	rd->nlh->nlmsg_seq = *seq;
++	rd->nlh->nlmsg_flags = flags;
++}
++
++int rd_send_msg(struct rd *rd)
++{
++	int ret;
++
++	rd->nl = mnl_socket_open(NETLINK_RDMA);
++	if (!rd->nl) {
++		pr_err("Failed to open NETLINK_RDMA socket\n");
++		return -ENODEV;
++	}
++
++	ret = mnl_socket_bind(rd->nl, 0, MNL_SOCKET_AUTOPID);
++	if (ret < 0) {
++		pr_err("Failed to bind socket with err %d\n", ret);
++		goto err;
++	}
++
++	ret = mnl_socket_sendto(rd->nl, rd->nlh, rd->nlh->nlmsg_len);
++	if (ret < 0) {
++		pr_err("Failed to send to socket with err %d\n", ret);
++		goto err;
++	}
++	return 0;
++
++err:
++	mnl_socket_close(rd->nl);
++	return ret;
++}
++
++int rd_recv_msg(struct rd *rd, mnl_cb_t callback, void *data, unsigned int seq)
++{
++	int ret;
++	unsigned int portid;
++	char buf[MNL_SOCKET_BUFFER_SIZE];
++
++	portid = mnl_socket_get_portid(rd->nl);
++	do {
++		ret = mnl_socket_recvfrom(rd->nl, buf, sizeof(buf));
++		if (ret <= 0)
++			break;
++
++		ret = mnl_cb_run(buf, ret, seq, portid, callback, data);
++	} while (ret > 0);
++
++	mnl_socket_close(rd->nl);
++	return ret;
++}
++
++static struct dev_map *_dev_map_lookup(struct rd *rd, const char *dev_name)
++{
++	struct dev_map *dev_map;
++
++	list_for_each_entry(dev_map, &rd->dev_map_list, list)
++		if (strcmp(dev_name, dev_map->dev_name) == 0)
++			return dev_map;
++
++	return NULL;
++}
++
++struct dev_map *dev_map_lookup(struct rd *rd, bool allow_port_index)
++{
++	struct dev_map *dev_map;
++	char *dev_name;
++	char *slash;
++
++	if (rd_no_arg(rd))
++		return NULL;
++
++	dev_name = strdup(rd_argv(rd));
++	if (allow_port_index) {
++		slash = strrchr(dev_name, '/');
++		if (slash)
++			*slash = '\0';
++	}
++
++	dev_map = _dev_map_lookup(rd, dev_name);
++	free(dev_name);
++	return dev_map;
++}
++
++#define nla_type(attr) ((attr)->nla_type & NLA_TYPE_MASK)
++
++void newline(struct rd *rd)
++{
++	if (rd->json_output)
++		jsonw_end_array(rd->jw);
++	else
++		pr_out("\n");
++}
++
++void newline_indent(struct rd *rd)
++{
++	newline(rd);
++	if (!rd->json_output)
++		pr_out("    ");
++}
++
++static int print_driver_string(struct rd *rd, const char *key_str,
++				 const char *val_str)
++{
++	if (rd->json_output) {
++		jsonw_string_field(rd->jw, key_str, val_str);
++		return 0;
++	} else {
++		return pr_out("%s %s ", key_str, val_str);
++	}
++}
++
++static int print_driver_s32(struct rd *rd, const char *key_str, int32_t val,
++			      enum rdma_nldev_print_type print_type)
++{
++	if (rd->json_output) {
++		jsonw_int_field(rd->jw, key_str, val);
++		return 0;
++	}
++	switch (print_type) {
++	case RDMA_NLDEV_PRINT_TYPE_UNSPEC:
++		return pr_out("%s %d ", key_str, val);
++	case RDMA_NLDEV_PRINT_TYPE_HEX:
++		return pr_out("%s 0x%x ", key_str, val);
++	default:
++		return -EINVAL;
++	}
++}
++
++static int print_driver_u32(struct rd *rd, const char *key_str, uint32_t val,
++			      enum rdma_nldev_print_type print_type)
++{
++	if (rd->json_output) {
++		jsonw_int_field(rd->jw, key_str, val);
++		return 0;
++	}
++	switch (print_type) {
++	case RDMA_NLDEV_PRINT_TYPE_UNSPEC:
++		return pr_out("%s %u ", key_str, val);
++	case RDMA_NLDEV_PRINT_TYPE_HEX:
++		return pr_out("%s 0x%x ", key_str, val);
++	default:
++		return -EINVAL;
++	}
++}
++
++static int print_driver_s64(struct rd *rd, const char *key_str, int64_t val,
++			      enum rdma_nldev_print_type print_type)
++{
++	if (rd->json_output) {
++		jsonw_int_field(rd->jw, key_str, val);
++		return 0;
++	}
++	switch (print_type) {
++	case RDMA_NLDEV_PRINT_TYPE_UNSPEC:
++		return pr_out("%s %" PRId64 " ", key_str, val);
++	case RDMA_NLDEV_PRINT_TYPE_HEX:
++		return pr_out("%s 0x%" PRIx64 " ", key_str, val);
++	default:
++		return -EINVAL;
++	}
++}
++
++static int print_driver_u64(struct rd *rd, const char *key_str, uint64_t val,
++			      enum rdma_nldev_print_type print_type)
++{
++	if (rd->json_output) {
++		jsonw_int_field(rd->jw, key_str, val);
++		return 0;
++	}
++	switch (print_type) {
++	case RDMA_NLDEV_PRINT_TYPE_UNSPEC:
++		return pr_out("%s %" PRIu64 " ", key_str, val);
++	case RDMA_NLDEV_PRINT_TYPE_HEX:
++		return pr_out("%s 0x%" PRIx64 " ", key_str, val);
++	default:
++		return -EINVAL;
++	}
++}
++
++static int print_driver_entry(struct rd *rd, struct nlattr *key_attr,
++				struct nlattr *val_attr,
++				enum rdma_nldev_print_type print_type)
++{
++	const char *key_str = mnl_attr_get_str(key_attr);
++	int attr_type = nla_type(val_attr);
++
++	switch (attr_type) {
++	case RDMA_NLDEV_ATTR_DRIVER_STRING:
++		return print_driver_string(rd, key_str,
++				mnl_attr_get_str(val_attr));
++	case RDMA_NLDEV_ATTR_DRIVER_S32:
++		return print_driver_s32(rd, key_str,
++				mnl_attr_get_u32(val_attr), print_type);
++	case RDMA_NLDEV_ATTR_DRIVER_U32:
++		return print_driver_u32(rd, key_str,
++				mnl_attr_get_u32(val_attr), print_type);
++	case RDMA_NLDEV_ATTR_DRIVER_S64:
++		return print_driver_s64(rd, key_str,
++				mnl_attr_get_u64(val_attr), print_type);
++	case RDMA_NLDEV_ATTR_DRIVER_U64:
++		return print_driver_u64(rd, key_str,
++				mnl_attr_get_u64(val_attr), print_type);
++	}
++	return -EINVAL;
++}
++
++void print_driver_table(struct rd *rd, struct nlattr *tb)
++{
++	int print_type = RDMA_NLDEV_PRINT_TYPE_UNSPEC;
++	struct nlattr *tb_entry, *key = NULL, *val;
++	int type, cc = 0;
++	int ret;
++
++	if (!rd->show_driver_details || !tb)
++		return;
++
++	if (rd->pretty_output)
++		newline_indent(rd);
++
++	/*
++	 * Driver attrs are tuples of {key, [print-type], value}.
++	 * The key must be a string.  If print-type is present, it
++	 * defines an alternate printf format type vs the native format
++	 * for the attribute.  And the value can be any available
++	 * driver type.
++	 */
++	mnl_attr_for_each_nested(tb_entry, tb) {
++
++		if (cc > MAX_LINE_LENGTH) {
++			if (rd->pretty_output)
++				newline_indent(rd);
++			cc = 0;
++		}
++		if (rd_attr_check(tb_entry, &type) != MNL_CB_OK)
++			return;
++		if (!key) {
++			if (type != MNL_TYPE_NUL_STRING)
++				return;
++			key = tb_entry;
++		} else if (type == MNL_TYPE_U8) {
++			print_type = mnl_attr_get_u8(tb_entry);
++		} else {
++			val = tb_entry;
++			ret = print_driver_entry(rd, key, val, print_type);
++			if (ret < 0)
++				return;
++			cc += ret;
++			print_type = RDMA_NLDEV_PRINT_TYPE_UNSPEC;
++			key = NULL;
++		}
++	}
++	return;
++}
+-- 
+2.20.1
+
diff --git a/SOURCES/0068-rdma-add-man-pages-for-RDMA-tool.patch b/SOURCES/0068-rdma-add-man-pages-for-RDMA-tool.patch
new file mode 100644
index 0000000..ec21dae
--- /dev/null
+++ b/SOURCES/0068-rdma-add-man-pages-for-RDMA-tool.patch
@@ -0,0 +1,422 @@
+From 4bee4617fa17405a52e11ed47e21feb20a277cc2 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Thu, 28 Mar 2019 15:00:33 +0100
+Subject: [PATCH] rdma: add man pages for RDMA tool
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1642479
+Upstream Status: RHEL-only
+
+commit 379afb6274462dee196d5909f6988b1ce5466c0b
+Author: Andrea Claudi <aclaudi@redhat.com>
+Date:   Thu Mar 28 13:02:20 2019 +0100
+
+    rdma: add man pages for RDMA tool
+
+    Checkout to the v5.0.0 upstream tag and update man8 Makefile
+
+    Signed-off-by: Andrea Claudi <aclaudi@redhat.com>
+---
+ man/man8/Makefile        |   2 +-
+ man/man8/rdma-dev.8      |  69 +++++++++++++++++++++++
+ man/man8/rdma-link.8     |  56 ++++++++++++++++++
+ man/man8/rdma-resource.8 | 109 +++++++++++++++++++++++++++++++++++
+ man/man8/rdma.8          | 119 +++++++++++++++++++++++++++++++++++++++
+ 5 files changed, 354 insertions(+), 1 deletion(-)
+ create mode 100644 man/man8/rdma-dev.8
+ create mode 100644 man/man8/rdma-link.8
+ create mode 100644 man/man8/rdma-resource.8
+ create mode 100644 man/man8/rdma.8
+
+diff --git a/man/man8/Makefile b/man/man8/Makefile
+index f33186446819e..416443f3f5361 100644
+--- a/man/man8/Makefile
++++ b/man/man8/Makefile
+@@ -19,7 +19,7 @@ MAN8PAGES = $(TARGETS) ip.8 arpd.8 lnstat.8 routel.8 rtacct.8 rtmon.8 rtpr.8 ss.
+ 	tc-simple.8 tc-skbedit.8 tc-vlan.8 tc-xt.8 tc-skbmod.8 tc-ife.8 \
+ 	tc-tunnel_key.8 tc-sample.8 \
+ 	devlink.8 devlink-dev.8 devlink-monitor.8 devlink-port.8 devlink-sb.8 \
+-	ifstat.8
++	ifstat.8 rdma.8 rdma-dev.8 rdma-link.8 rdma-resource.8
+ 
+ all: $(TARGETS)
+ 
+diff --git a/man/man8/rdma-dev.8 b/man/man8/rdma-dev.8
+new file mode 100644
+index 0000000000000..069f471791904
+--- /dev/null
++++ b/man/man8/rdma-dev.8
+@@ -0,0 +1,69 @@
++.TH RDMA\-DEV 8 "06 Jul 2017" "iproute2" "Linux"
++.SH NAME
++rdma-dev \- RDMA device configuration
++.SH SYNOPSIS
++.sp
++.ad l
++.in +8
++.ti -8
++.B rdma
++.RI "[ " OPTIONS " ]"
++.B dev
++.RI  " { " COMMAND " | "
++.BR help " }"
++.sp
++
++.ti -8
++.IR OPTIONS " := { "
++\fB\-V\fR[\fIersion\fR] |
++\fB\-d\fR[\fIetails\fR] }
++
++.ti -8
++.B rdma dev show
++.RI "[ " DEV " ]"
++
++.ti -8
++.B rdma dev set
++.RI "[ " DEV " ]"
++.BR name
++.BR NEWNAME
++
++.ti -8
++.B rdma dev help
++
++.SH "DESCRIPTION"
++.SS rdma dev set - rename rdma device
++
++.SS rdma dev show - display rdma device attributes
++
++.PP
++.I "DEV"
++- specifies the RDMA device to show.
++If this argument is omitted all devices are listed.
++
++.SH "EXAMPLES"
++.PP
++rdma dev
++.RS 4
++Shows the state of all RDMA devices on the system.
++.RE
++.PP
++rdma dev show mlx5_3
++.RS 4
++Shows the state of specified RDMA device.
++.RE
++.PP
++rdma dev set mlx5_3 name rdma_0
++.RS 4
++Renames the mlx5_3 device to rdma_0.
++.RE
++.PP
++
++.SH SEE ALSO
++.BR rdma (8),
++.BR rdma-link (8),
++.BR rdma-resource (8),
++.br
++
++.SH AUTHOR
++Leon Romanovsky <leonro@mellanox.com>
+diff --git a/man/man8/rdma-link.8 b/man/man8/rdma-link.8
+new file mode 100644
+index 0000000000000..bddf34746e8b2
+--- /dev/null
++++ b/man/man8/rdma-link.8
+@@ -0,0 +1,56 @@
++.TH RDMA\-LINK 8 "06 Jul 2017" "iproute2" "Linux"
++.SH NAME
++rdma-link \- rdma link configuration
++.SH SYNOPSIS
++.sp
++.ad l
++.in +8
++.ti -8
++.B devlink
++.RI "[ " OPTIONS " ]"
++.B link
++.RI  " { " COMMAND " | "
++.BR help " }"
++.sp
++
++.ti -8
++.IR OPTIONS " := { "
++\fB\-V\fR[\fIersion\fR] |
++\fB\-d\fR[\fIetails\fR] }
++
++.ti -8
++.B rdma link show
++.RI "[ " DEV/PORT_INDEX " ]"
++
++.ti -8
++.B rdma link help
++
++.SH "DESCRIPTION"
++.SS rdma link show - display rdma link attributes
++
++.PP
++.I "DEV/PORT_INDEX"
++- specifies the RDMA link to show.
++If this argument is omitted all links are listed.
++
++.SH "EXAMPLES"
++.PP
++rdma link show
++.RS 4
++Shows the state of all rdma links on the system.
++.RE
++.PP
++rdma link show mlx5_2/1
++.RS 4
++Shows the state of specified rdma link.
++.RE
++.PP
++
++.SH SEE ALSO
++.BR rdma (8),
++.BR rdma-dev (8),
++.BR rdma-resource (8),
++.br
++
++.SH AUTHOR
++Leon Romanovsky <leonro@mellanox.com>
+diff --git a/man/man8/rdma-resource.8 b/man/man8/rdma-resource.8
+new file mode 100644
+index 0000000000000..40b073dbfcf24
+--- /dev/null
++++ b/man/man8/rdma-resource.8
+@@ -0,0 +1,109 @@
++.TH RDMA\-RESOURCE 8 "26 Dec 2017" "iproute2" "Linux"
++.SH NAME
++rdma-resource \- rdma resource configuration
++.SH SYNOPSIS
++.sp
++.ad l
++.in +8
++.ti -8
++.B rdma
++.RI "[ " OPTIONS " ] " RESOURCE " { " COMMAND " | "
++.BR help " }"
++.sp
++
++.ti -8
++.IR RESOURCE " := { "
++.BR cm_id " | " cq " | " mr " | " pd " | " qp " }"
++.sp
++
++.ti -8
++.IR OPTIONS " := { "
++\fB\-j\fR[\fIson\fR] |
++\fB\-d\fR[\fIetails\fR] }
++
++.ti -8
++.B rdma resource show
++.RI "[ " DEV/PORT_INDEX " ]"
++
++.ti -8
++.B rdma resource help
++
++.SH "DESCRIPTION"
++.SS rdma resource show - display rdma resource tracking information
++
++.PP
++.I "DEV/PORT_INDEX"
++- specifies the RDMA link to show.
++If this argument is omitted all links are listed.
++
++.SH "EXAMPLES"
++.PP
++rdma resource show
++.RS 4
++Shows summary for all devices on the system.
++.RE
++.PP
++rdma resource show mlx5_2
++.RS 4
++Shows the state of specified rdma device.
++.RE
++.PP
++rdma res show qp link mlx5_4
++.RS 4
++Get all QPs for the specific device.
++.RE
++.PP
++rdma res show qp link mlx5_4/1
++.RS 4
++Get QPs of specific port.
++.RE
++.PP
++rdma res show qp link mlx5_4/0
++.RS 4
++Provide illegal port number (0 is illegal).
++.RE
++.PP
++rdma res show qp link mlx5_4/-
++.RS 4
++Get QPs which have not assigned port yet.
++.RE
++.PP
++rdma res show qp link mlx5_4/- -d
++.RS 4
++Detailed view.
++.RE
++.PP
++rdma res show qp link mlx5_4/- -dd
++.RS 4
++Detailed view including driver-specific details.
++.RE
++.PP
++rdma res show qp link mlx5_4/1 lqpn 0-6
++.RS 4
++Limit to specific Local QPNs.
++.RE
++.PP
++rdma resource show cm_id dst-port 7174
++.RS 4
++Show CM_IDs with destination ip port of 7174.
++.RE
++.PP
++rdma resource show cm_id src-addr 172.16.0.100
++.RS 4
++Show CM_IDs bound to local ip address 172.16.0.100
++.RE
++.PP
++rdma resource show cq pid 30489
++.RS 4
++Show CQs belonging to pid 30489
++.RE
++.PP
++
++.SH SEE ALSO
++.BR rdma (8),
++.BR rdma-dev (8),
++.BR rdma-link (8),
++.br
++
++.SH AUTHOR
++Leon Romanovsky <leonro@mellanox.com>
+diff --git a/man/man8/rdma.8 b/man/man8/rdma.8
+new file mode 100644
+index 0000000000000..b2b5aef866ab0
+--- /dev/null
++++ b/man/man8/rdma.8
+@@ -0,0 +1,119 @@
++.TH RDMA 8 "28 Mar 2017" "iproute2" "Linux"
++.SH NAME
++rdma \- RDMA tool
++.SH SYNOPSIS
++.sp
++.ad l
++.in +8
++.ti -8
++.B rdma
++.RI "[ " OPTIONS " ] " OBJECT " { " COMMAND " | "
++.BR help " }"
++.sp
++
++.ti -8
++.B rdma
++.RB "[ " -force " ] "
++.BI "-batch " filename
++.sp
++
++.ti -8
++.IR OBJECT " := { "
++.BR dev " | " link " }"
++.sp
++
++.ti -8
++.IR OPTIONS " := { "
++\fB\-V\fR[\fIersion\fR] |
++\fB\-d\fR[\fIetails\fR] }
++\fB\-j\fR[\fIson\fR] }
++\fB\-p\fR[\fIretty\fR] }
++
++.SH OPTIONS
++
++.TP
++.BR "\-V" , " -Version"
++Print the version of the
++.B rdma
++tool and exit.
++
++.TP
++.BR "\-b", " \-batch " <FILENAME>
++Read commands from provided file or standard input and invoke them.
++First failure will cause termination of rdma.
++
++.TP
++.BR "\-force"
++Don't terminate rdma on errors in batch mode.
++If there were any errors during execution of the commands, the application return code will be non zero.
++
++.TP
++.BR "\-d" , " --details"
++Output detailed information.  Adding a second \-d includes driver-specific details.
++
++.TP
++.BR "\-p" , " --pretty"
++When combined with -j generate a pretty JSON output.
++
++.TP
++.BR "\-j" , " --json"
++Generate JSON output.
++
++.SS
++.I OBJECT
++
++.TP
++.B dev
++- RDMA device.
++
++.TP
++.B link
++- RDMA port related.
++
++.PP
++The names of all objects may be written in full or
++abbreviated form, for example
++.B stats
++can be abbreviated as
++.B stat
++or just
++.B s.
++
++.SS
++.I COMMAND
++
++Specifies the action to perform on the object.
++The set of possible actions depends on the object type.
++As a rule, it is possible to
++.B show
++(or
++.B list
++) objects, but some objects do not allow all of these operations
++or have some additional commands. The
++.B help
++command is available for all objects. It prints
++out a list of available commands and argument syntax conventions.
++.sp
++If no command is given, some default command is assumed.
++Usually it is
++.B list
++or, if the objects of this class cannot be listed,
++.BR "help" .
++
++.SH EXIT STATUS
++Exit status is 0 if command was successful or a positive integer upon failure.
++
++.SH SEE ALSO
++.BR rdma-dev (8),
++.BR rdma-link (8),
++.BR rdma-resource (8),
++.br
++
++.SH REPORTING BUGS
++Report any bugs to the Linux RDMA mailing list
++.B <linux-rdma@vger.kernel.org>
++where the development and maintenance is primarily done.
++You do not have to be subscribed to the list to send a message there.
++
++.SH AUTHOR
++Leon Romanovsky <leonro@mellanox.com>
+-- 
+2.20.1
+
diff --git a/SOURCES/0069-tc-f_flower-Add-support-for-matching-first-frag-pack.patch b/SOURCES/0069-tc-f_flower-Add-support-for-matching-first-frag-pack.patch
new file mode 100644
index 0000000..5c83a04
--- /dev/null
+++ b/SOURCES/0069-tc-f_flower-Add-support-for-matching-first-frag-pack.patch
@@ -0,0 +1,72 @@
+From 69685a7aa7fb408cce256e469430e10e99a43e2d Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 25 Mar 2019 16:54:31 +0100
+Subject: [PATCH] tc: f_flower: Add support for matching first frag packets
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1559814
+Upstream Status: iproute2.git commit fb4e6abfca2c4
+
+commit fb4e6abfca2c48380210d48c1e7f3685f8bb58fd
+Author: Pieter Jansen van Vuuren <pieter.jansenvanvuuren@netronome.com>
+Date:   Fri Mar 9 11:07:22 2018 +0100
+
+    tc: f_flower: Add support for matching first frag packets
+
+    Add matching support for distinguishing between first and later fragmented
+    packets.
+
+     # tc filter add dev eth0 protocol ip parent ffff: \
+         flower indev eth0 \
+            ip_flags firstfrag \
+            ip_proto udp \
+        action mirred egress redirect dev eth1
+
+     # tc filter add dev eth0 protocol ip parent ffff: \
+         flower indev eth0 \
+            ip_flags nofirstfrag \
+            ip_proto udp \
+        action mirred egress redirect dev eth1
+
+    Signed-off-by: Pieter Jansen van Vuuren <pieter.jansenvanvuuren@netronome.com>
+    Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>
+    Signed-off-by: Simon Horman <simon.horman@netronome.com>
+    Signed-off-by: David Ahern <dsahern@gmail.com>
+---
+ man/man8/tc-flower.8 | 8 ++++++--
+ tc/f_flower.c        | 1 +
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/man/man8/tc-flower.8 b/man/man8/tc-flower.8
+index 387f73f5cd2e9..661f42200bdfb 100644
+--- a/man/man8/tc-flower.8
++++ b/man/man8/tc-flower.8
+@@ -255,8 +255,12 @@ is an 8 bit time-to-live value.
+ .BI ip_flags " IP_FLAGS"
+ .I IP_FLAGS
+ may be either
+-.BR frag " or " nofrag
+-to match on fragmented packets or not respectively.
++.BR frag ", " nofrag ", " firstfrag " or " nofirstfrag
++where frag and nofrag could be used to match on fragmented packets or not,
++respectively. firstfrag and nofirstfrag can be used to further distinguish
++fragmented packet. firstfrag can be used to indicate the first fragmented
++packet. nofirstfrag can be used to indicates subsequent fragmented packets
++or non-fragmented packets.
+ .SH NOTES
+ As stated above where applicable, matches of a certain layer implicitly depend
+ on the matches of the next lower layer. Precisely, layer one and two matches
+diff --git a/tc/f_flower.c b/tc/f_flower.c
+index 40dcfbd687a20..e2c7daa0b8e03 100644
+--- a/tc/f_flower.c
++++ b/tc/f_flower.c
+@@ -162,6 +162,7 @@ struct flag_to_string {
+ 
+ static struct flag_to_string flags_str[] = {
+ 	{ TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT, FLOWER_IP_FLAGS, "frag" },
++	{ TCA_FLOWER_KEY_FLAGS_FRAG_IS_FIRST, FLOWER_IP_FLAGS, "firstfrag" },
+ };
+ 
+ static int flower_parse_matching_flags(char *str,
+-- 
+2.20.1
+
diff --git a/SOURCES/0070-ss-enclose-IPv6-address-in-brackets.patch b/SOURCES/0070-ss-enclose-IPv6-address-in-brackets.patch
new file mode 100644
index 0000000..6c82bd1
--- /dev/null
+++ b/SOURCES/0070-ss-enclose-IPv6-address-in-brackets.patch
@@ -0,0 +1,62 @@
+From 765baea7751f7140571dfb0285b1fca974b3450b Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 18:03:01 +0200
+Subject: [PATCH] ss: enclose IPv6 address in brackets
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1588122
+Upstream Status: iproute2.git commit aba9c23a6e1cb
+
+commit aba9c23a6e1cb134840c998df14888dca469a485
+Author: Stephen Hemminger <stephen@networkplumber.org>
+Date:   Fri Aug 4 12:02:41 2017 -0700
+
+    ss: enclose IPv6 address in brackets
+
+    Based on patch by Lehner Florian <dev@der-flo.net>
+
+    Adds support for RFC2732 IPv6 address format with brackets.
+
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ misc/ss.c | 25 +++++++++++++++++++------
+ 1 file changed, 19 insertions(+), 6 deletions(-)
+
+diff --git a/misc/ss.c b/misc/ss.c
+index c0cb33e96d9ec..86defc71fabc4 100644
+--- a/misc/ss.c
++++ b/misc/ss.c
+@@ -1093,12 +1093,25 @@ static void inet_addr_print(const inet_prefix *a, int port, unsigned int ifindex
+ 			ap = format_host(AF_INET, 4, a->data);
+ 		}
+ 	} else {
+-		ap = format_host(a->family, 16, a->data);
+-		est_len = strlen(ap);
+-		if (est_len <= addr_width)
+-			est_len = addr_width;
+-		else
+-			est_len = addr_width + ((est_len-addr_width+3)/4)*4;
++		if (!memcmp(a->data, &in6addr_any, sizeof(in6addr_any))) {
++			buf[0] = '*';
++			buf[1] = 0;
++		} else {
++			ap = format_host(a->family, 16, a->data);
++
++			/* Numeric IPv6 addresses should be bracketed */
++			if (strchr(ap, ':')) {
++				snprintf(buf, sizeof(buf),
++					 "[%s]", ap);
++				ap = buf;
++			}
++
++			est_len = strlen(ap);
++			if (est_len <= addr_width)
++				est_len = addr_width;
++			else
++				est_len = addr_width + ((est_len-addr_width+3)/4)*4;
++		}
+ 	}
+ 
+ 	if (ifindex) {
+-- 
+2.20.1
+
diff --git a/SOURCES/0071-ip-address-Use-correct-max-attribute-value-in-print_.patch b/SOURCES/0071-ip-address-Use-correct-max-attribute-value-in-print_.patch
new file mode 100644
index 0000000..111178e
--- /dev/null
+++ b/SOURCES/0071-ip-address-Use-correct-max-attribute-value-in-print_.patch
@@ -0,0 +1,40 @@
+From 861fe3293afa0907f9883df005e7a09a5f4b710b Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 18:14:04 +0200
+Subject: [PATCH] ip-address: Use correct max attribute value in
+ print_vf_stats64()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1679749
+Upstream Status: iproute2.git commit d7cf2416fc3a0
+
+commit d7cf2416fc3a08b411beffb93a9e118f6593892d
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Feb 21 19:37:51 2019 +0100
+
+    ip-address: Use correct max attribute value in print_vf_stats64()
+
+    IFLA_VF_MAX is larger than the highest valid index in vf array.
+
+    Fixes: a1b99717c7cd7 ("Add displaying VF traffic statistics")
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ ip/ipaddress.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/ip/ipaddress.c b/ip/ipaddress.c
+index 44111a27501a9..bed2d3801809b 100644
+--- a/ip/ipaddress.c
++++ b/ip/ipaddress.c
+@@ -467,7 +467,7 @@ static void print_vf_stats64(FILE *fp, struct rtattr *vfstats)
+ 		return;
+ 	}
+ 
+-	parse_rtattr_nested(vf, IFLA_VF_MAX, vfstats);
++	parse_rtattr_nested(vf, IFLA_VF_STATS_MAX, vfstats);
+ 
+ 	/* RX stats */
+ 	fprintf(fp, "%s", _SL_);
+-- 
+2.20.1
+
diff --git a/SOURCES/0072-examples-Some-shell-fixes-to-cbq.init.patch b/SOURCES/0072-examples-Some-shell-fixes-to-cbq.init.patch
new file mode 100644
index 0000000..116adf8
--- /dev/null
+++ b/SOURCES/0072-examples-Some-shell-fixes-to-cbq.init.patch
@@ -0,0 +1,131 @@
+From c1aa1bc599f0ced53b5e9d21d01a03d78ae2b37f Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:05:37 +0200
+Subject: [PATCH] examples: Some shell fixes to cbq.init
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 2313b6bfe4f5e
+
+commit 2313b6bfe4f5e6b60fcdfaaeaa1eabcfd3f550f4
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 17 19:09:31 2017 +0200
+
+    examples: Some shell fixes to cbq.init
+
+    This addresses the following issues:
+
+    - $@ is an array, so don't use it in quoted strings - use $* instead.
+
+    - Add missing quotes to components of [ ] expressions. These are not
+      strictly necessary since the output of 'wc -l' should be a single word
+      only, but in case of errors, bash prints "integer expression expected"
+      instead of "too many arguments".
+
+    - Use -print0/-0 when piping from find to xargs to allow for filenames
+      which contain whitespace.
+
+    - Quote arguments to 'eval' to prevent word-splitting.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ examples/cbq.init-v0.7.3 | 24 ++++++++++++------------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
+
+diff --git a/examples/cbq.init-v0.7.3 b/examples/cbq.init-v0.7.3
+index 1bc0d446f8983..66448d88f0053 100644
+--- a/examples/cbq.init-v0.7.3
++++ b/examples/cbq.init-v0.7.3
+@@ -532,7 +532,7 @@ cbq_off () {
+ 
+ ### Prefixed message
+ cbq_message () {
+-	echo -e "**CBQ: $@"
++	echo -e "**CBQ: $*"
+ } # cbq_message
+ 
+ ### Failure message
+@@ -560,15 +560,15 @@ cbq_time2abs () {
+ ### Display CBQ setup
+ cbq_show () {
+ 	for dev in `cbq_device_list`; do
+-		[ `tc qdisc show dev $dev| wc -l` -eq 0 ] && continue
++		[ "`tc qdisc show dev $dev| wc -l`" -eq 0 ] && continue
+ 		echo -e "### $dev: queueing disciplines\n"
+ 		tc $1 qdisc show dev $dev; echo
+ 
+-		[ `tc class show dev $dev| wc -l` -eq 0 ] && continue
++		[ "`tc class show dev $dev| wc -l`" -eq 0 ] && continue
+ 		echo -e "### $dev: traffic classes\n"
+ 		tc $1 class show dev $dev; echo
+ 
+-		[ `tc filter show dev $dev| wc -l` -eq 0 ] && continue
++		[ "`tc filter show dev $dev| wc -l`" -eq 0 ] && continue
+ 		echo -e "### $dev: filtering rules\n"
+ 		tc $1 filter show dev $dev; echo
+ 	done
+@@ -585,7 +585,7 @@ cbq_init () {
+ 
+ 	### Gather all DEVICE fields from $1/cbq-*
+ 	DEVFIELDS=`find $1 -maxdepth 1 \( -type f -or -type l \) -name 'cbq-*' \
+-		  -not -name '*~' | xargs sed -n 's/#.*//; \
++		  -not -name '*~' -print0 | xargs -0 sed -n 's/#.*//; \
+ 		  s/[[:space:]]//g; /^DEVICE=[^,]*,[^,]*\(,[^,]*\)\?/ \
+ 		  { s/.*=//; p; }'| sort -u`
+ 	[ -z "$DEVFIELDS" ] &&
+@@ -593,7 +593,7 @@ cbq_init () {
+ 
+ 	### Check for different DEVICE fields for the same device
+ 	DEVICES=`echo "$DEVFIELDS"| sed 's/,.*//'| sort -u`
+-	[ `echo "$DEVICES"| wc -l` -ne `echo "$DEVFIELDS"| wc -l` ] &&
++	[ "`echo "$DEVICES"| wc -l`" -ne "`echo "$DEVFIELDS"| wc -l`" ] &&
+ 		cbq_failure "different DEVICE fields for single device!\n$DEVFIELDS"
+ } # cbq_init
+ 
+@@ -618,7 +618,7 @@ cbq_load_class () {
+ 	PRIO_MARK=$PRIO_MARK_DEFAULT
+ 	PRIO_REALM=$PRIO_REALM_DEFAULT
+ 
+-	eval `echo "$CFILE"| grep -E "^($CBQ_WORDS)="`
++	eval "`echo "$CFILE"| grep -E "^($CBQ_WORDS)="`"
+ 
+ 	### Require RATE/WEIGHT
+ 	[ -z "$RATE" -o -z "$WEIGHT" ] &&
+@@ -661,7 +661,7 @@ if [ "$1" = "compile" ]; then
+ 
+ 	### echo-only version of "tc" command
+ 	tc () {
+-		echo "$TC $@"
++		echo "$TC $*"
+ 	} # tc
+ 
+ elif [ -n "$CBQ_DEBUG" ]; then
+@@ -669,13 +669,13 @@ elif [ -n "$CBQ_DEBUG" ]; then
+ 
+ 	### Logging version of "ip" command
+ 	ip () {
+-		echo -e "\n# ip $@" >> $CBQ_DEBUG
++		echo -e "\n# ip $*" >> $CBQ_DEBUG
+ 		$IP "$@" 2>&1 | tee -a $CBQ_DEBUG
+ 	} # ip
+ 
+ 	### Logging version of "tc" command
+ 	tc () {
+-		echo -e "\n# tc $@" >> $CBQ_DEBUG
++		echo -e "\n# tc $*" >> $CBQ_DEBUG
+ 		$TC "$@" 2>&1 | tee -a $CBQ_DEBUG
+ 	} # tc
+ else
+@@ -711,8 +711,8 @@ if [ "$1" != "compile" -a "$2" != "nocache" -a -z "$CBQ_DEBUG" ]; then
+ 	### validate the cache
+ 	[ "$2" = "invalidate" -o ! -f $CBQ_CACHE ] && VALID=0
+ 	if [ $VALID -eq 1 ]; then
+-		[ `find $CBQ_PATH -maxdepth 1 -newer $CBQ_CACHE| \
+-		  wc -l` -gt 0 ] && VALID=0
++		[ "`find $CBQ_PATH -maxdepth 1 -newer $CBQ_CACHE| \
++		  wc -l`" -gt 0 ] && VALID=0
+ 	fi
+ 
+ 	### compile the config if the cache is invalid
+-- 
+2.20.1
+
diff --git a/SOURCES/0073-ifcfg-Quote-left-hand-side-of-expression.patch b/SOURCES/0073-ifcfg-Quote-left-hand-side-of-expression.patch
new file mode 100644
index 0000000..14be257
--- /dev/null
+++ b/SOURCES/0073-ifcfg-Quote-left-hand-side-of-expression.patch
@@ -0,0 +1,38 @@
+From 955ce06f1f4be5a8733e5829e3c8cadf9fc68c40 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:05:37 +0200
+Subject: [PATCH] ifcfg: Quote left-hand side of [ ] expression
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 1e3197e0fdbf2
+
+commit 1e3197e0fdbf299fe24cdba7c0d613317ed82063
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 17 19:09:32 2017 +0200
+
+    ifcfg: Quote left-hand side of [ ] expression
+
+    This prevents word-splitting and therefore leads to more accurate error
+    message in case 'grep -c' prints something other than a number.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ ip/ifcfg | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/ip/ifcfg b/ip/ifcfg
+index 083d9df36742f..30a2dc49816cd 100644
+--- a/ip/ifcfg
++++ b/ip/ifcfg
+@@ -131,7 +131,7 @@ noarp=$?
+ 
+ ip route add unreachable 224.0.0.0/24 >& /dev/null
+ ip route add unreachable 255.255.255.255 >& /dev/null
+-if [ `ip link ls $dev | grep -c MULTICAST` -ge 1 ]; then
++if [ "`ip link ls $dev | grep -c MULTICAST`" -ge 1 ]; then
+   ip route add 224.0.0.0/4 dev $dev scope global >& /dev/null
+ fi
+ 
+-- 
+2.20.1
+
diff --git a/SOURCES/0074-tipc-node-Fix-socket-fd-check-in-cmd_node_get_addr.patch b/SOURCES/0074-tipc-node-Fix-socket-fd-check-in-cmd_node_get_addr.patch
new file mode 100644
index 0000000..e7192ee
--- /dev/null
+++ b/SOURCES/0074-tipc-node-Fix-socket-fd-check-in-cmd_node_get_addr.patch
@@ -0,0 +1,38 @@
+From 8743a7a8978270195693441f370cea552f100cae Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:05:38 +0200
+Subject: [PATCH] tipc/node: Fix socket fd check in cmd_node_get_addr()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 436270a45dea2
+
+commit 436270a45dea2fe5dbc4680f9c8e31f07d167f20
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 17 19:09:32 2017 +0200
+
+    tipc/node: Fix socket fd check in cmd_node_get_addr()
+
+    socket() returns -1 on error, not 0.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ tipc/node.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/tipc/node.c b/tipc/node.c
+index 201fe1a4df3bd..fe085aec9b4ac 100644
+--- a/tipc/node.c
++++ b/tipc/node.c
+@@ -109,7 +109,8 @@ static int cmd_node_get_addr(struct nlmsghdr *nlh, const struct cmd *cmd,
+ 	socklen_t sz = sizeof(struct sockaddr_tipc);
+ 	struct sockaddr_tipc addr;
+ 
+-	if (!(sk = socket(AF_TIPC, SOCK_RDM, 0))) {
++	sk = socket(AF_TIPC, SOCK_RDM, 0);
++	if (sk < 0) {
+ 		fprintf(stderr, "opening TIPC socket: %s\n", strerror(errno));
+ 		return -1;
+ 	}
+-- 
+2.20.1
+
diff --git a/SOURCES/0075-iproute_lwtunnel-Argument-to-strerror-must-be-positi.patch b/SOURCES/0075-iproute_lwtunnel-Argument-to-strerror-must-be-positi.patch
new file mode 100644
index 0000000..97c715e
--- /dev/null
+++ b/SOURCES/0075-iproute_lwtunnel-Argument-to-strerror-must-be-positi.patch
@@ -0,0 +1,35 @@
+From 4e55e568493084c458ef96f10a2a3dab93e8464a Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:05:38 +0200
+Subject: [PATCH] iproute_lwtunnel: Argument to strerror must be positive
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 58a15e6c7e7cb
+
+commit 58a15e6c7e7cb4c0d25e6bb3762ac2b1c94ff523
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 17 19:09:31 2017 +0200
+
+    iproute_lwtunnel: Argument to strerror must be positive
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ ip/iproute_lwtunnel.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c
+index b6f08f073ef02..92ea2c87787ec 100644
+--- a/ip/iproute_lwtunnel.c
++++ b/ip/iproute_lwtunnel.c
+@@ -480,7 +480,7 @@ static int lwt_parse_bpf(struct rtattr *rta, size_t len,
+ 	err = bpf_parse_common(bpf_type, &cfg, &bpf_cb_ops, &x);
+ 	if (err < 0) {
+ 		fprintf(stderr, "Failed to parse eBPF program: %s\n",
+-			strerror(err));
++			strerror(-err));
+ 		return -1;
+ 	}
+ 	rta_nest_end(rta, nest);
+-- 
+2.20.1
+
diff --git a/SOURCES/0076-iproute_lwtunnel-csum_mode-value-checking-was-ineffe.patch b/SOURCES/0076-iproute_lwtunnel-csum_mode-value-checking-was-ineffe.patch
new file mode 100644
index 0000000..df39404
--- /dev/null
+++ b/SOURCES/0076-iproute_lwtunnel-csum_mode-value-checking-was-ineffe.patch
@@ -0,0 +1,61 @@
+From db11067fb37cc3a77cc70fb9233a454102c4854c Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:05:38 +0200
+Subject: [PATCH] iproute_lwtunnel: csum_mode value checking was ineffective
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 08806fb0191e9
+Conflicts: adjust rta_addattr8() call to handle return value
+
+commit 08806fb0191e9ee8769507dc93b722fd021feb34
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 17 19:09:30 2017 +0200
+
+    iproute_lwtunnel: csum_mode value checking was ineffective
+
+    ila_csum_name2mode() returning -1 on error but being declared as
+    returning __u8 doesn't make much sense. Change the code to correctly
+    detect this issue. Checking for __u8 overruns shouldn't be necessary
+    though since ila_csum_name2mode() return values are well-defined.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ ip/iproute_lwtunnel.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c
+index 92ea2c87787ec..5da3a1b488cbd 100644
+--- a/ip/iproute_lwtunnel.c
++++ b/ip/iproute_lwtunnel.c
+@@ -125,7 +125,7 @@ static char *ila_csum_mode2name(__u8 csum_mode)
+ 	}
+ }
+ 
+-static __u8 ila_csum_name2mode(char *name)
++static int ila_csum_name2mode(char *name)
+ {
+ 	if (strcmp(name, "adj-transport") == 0)
+ 		return ILA_CSUM_ADJUST_TRANSPORT;
+@@ -348,7 +348,7 @@ static int parse_encap_ila(struct rtattr *rta, size_t len,
+ 
+ 	while (argc > 0) {
+ 		if (strcmp(*argv, "csum-mode") == 0) {
+-			__u8 csum_mode;
++			int csum_mode;
+ 
+ 			NEXT_ARG();
+ 
+@@ -357,8 +357,8 @@ static int parse_encap_ila(struct rtattr *rta, size_t len,
+ 				invarg("\"csum-mode\" value is invalid\n",
+ 				       *argv);
+ 
+-			ret = rta_addattr8(rta, len, ILA_ATTR_CSUM_MODE,
+-					   (__u8)csum_mode);
++			ret = rta_addattr8(rta, 1024, ILA_ATTR_CSUM_MODE,
++				     (__u8)csum_mode);
+ 
+ 			argc--; argv++;
+ 		} else {
+-- 
+2.20.1
+
diff --git a/SOURCES/0077-ss-Don-t-leak-fd-in-tcp_show_netlink_file.patch b/SOURCES/0077-ss-Don-t-leak-fd-in-tcp_show_netlink_file.patch
new file mode 100644
index 0000000..3ae8c4b
--- /dev/null
+++ b/SOURCES/0077-ss-Don-t-leak-fd-in-tcp_show_netlink_file.patch
@@ -0,0 +1,107 @@
+From fa8b9f8fa8a6762bb0151e65a11eca9dca7aca83 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:07:22 +0200
+Subject: [PATCH] ss: Don't leak fd in tcp_show_netlink_file()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 4b45ae221e949
+
+commit 4b45ae221e949b604d968a10d5d996c7c7cec1a6
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 17 19:09:30 2017 +0200
+
+    ss: Don't leak fd in tcp_show_netlink_file()
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ misc/ss.c | 32 ++++++++++++++++++++------------
+ 1 file changed, 20 insertions(+), 12 deletions(-)
+
+diff --git a/misc/ss.c b/misc/ss.c
+index 86defc71fabc4..eb46e0c4b95fb 100644
+--- a/misc/ss.c
++++ b/misc/ss.c
+@@ -2764,41 +2764,44 @@ static int tcp_show_netlink_file(struct filter *f)
+ {
+ 	FILE	*fp;
+ 	char	buf[16384];
++	int	err = -1;
+ 
+ 	if ((fp = fopen(getenv("TCPDIAG_FILE"), "r")) == NULL) {
+ 		perror("fopen($TCPDIAG_FILE)");
+-		return -1;
++		return err;
+ 	}
+ 
+ 	while (1) {
+-		int status, err;
++		int status, err2;
+ 		struct nlmsghdr *h = (struct nlmsghdr *)buf;
+ 		struct sockstat s = {};
+ 
+ 		status = fread(buf, 1, sizeof(*h), fp);
+ 		if (status < 0) {
+ 			perror("Reading header from $TCPDIAG_FILE");
+-			return -1;
++			break;
+ 		}
+ 		if (status != sizeof(*h)) {
+ 			perror("Unexpected EOF reading $TCPDIAG_FILE");
+-			return -1;
++			break;
+ 		}
+ 
+ 		status = fread(h+1, 1, NLMSG_ALIGN(h->nlmsg_len-sizeof(*h)), fp);
+ 
+ 		if (status < 0) {
+ 			perror("Reading $TCPDIAG_FILE");
+-			return -1;
++			break;
+ 		}
+ 		if (status + sizeof(*h) < h->nlmsg_len) {
+ 			perror("Unexpected EOF reading $TCPDIAG_FILE");
+-			return -1;
++			break;
+ 		}
+ 
+ 		/* The only legal exit point */
+-		if (h->nlmsg_type == NLMSG_DONE)
+-			return 0;
++		if (h->nlmsg_type == NLMSG_DONE) {
++			err = 0;
++			break;
++		}
+ 
+ 		if (h->nlmsg_type == NLMSG_ERROR) {
+ 			struct nlmsgerr *err = (struct nlmsgerr *)NLMSG_DATA(h);
+@@ -2809,7 +2812,7 @@ static int tcp_show_netlink_file(struct filter *f)
+ 				errno = -err->error;
+ 				perror("TCPDIAG answered");
+ 			}
+-			return -1;
++			break;
+ 		}
+ 
+ 		parse_diag_msg(h, &s);
+@@ -2818,10 +2821,15 @@ static int tcp_show_netlink_file(struct filter *f)
+ 		if (f && f->f && run_ssfilter(f->f, &s) == 0)
+ 			continue;
+ 
+-		err = inet_show_sock(h, &s);
+-		if (err < 0)
+-			return err;
++		err2 = inet_show_sock(h, &s);
++		if (err2 < 0) {
++			err = err2;
++			break;
++		}
+ 	}
++
++	fclose(fp);
++	return err;
+ }
+ 
+ static int tcp_show(struct filter *f)
+-- 
+2.20.1
+
diff --git a/SOURCES/0078-tc-em_ipset-Don-t-leak-sockfd-on-error-path.patch b/SOURCES/0078-tc-em_ipset-Don-t-leak-sockfd-on-error-path.patch
new file mode 100644
index 0000000..30c146e
--- /dev/null
+++ b/SOURCES/0078-tc-em_ipset-Don-t-leak-sockfd-on-error-path.patch
@@ -0,0 +1,34 @@
+From d28ee4b622ad9fa10a81d88bb6b5ded02c085acd Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:07:22 +0200
+Subject: [PATCH] tc/em_ipset: Don't leak sockfd on error path
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 3e587d9f43891
+
+commit 3e587d9f438910df6c1751c45fd898cec1477ae6
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 17 19:09:31 2017 +0200
+
+    tc/em_ipset: Don't leak sockfd on error path
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ tc/em_ipset.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/tc/em_ipset.c b/tc/em_ipset.c
+index fab975f5ea563..b59756515d239 100644
+--- a/tc/em_ipset.c
++++ b/tc/em_ipset.c
+@@ -84,6 +84,7 @@ static int get_version(unsigned int *version)
+ 	res = getsockopt(sockfd, SOL_IP, SO_IP_SET, &req_version, &size);
+ 	if (res != 0) {
+ 		perror("xt_set getsockopt");
++		close(sockfd);
+ 		return -1;
+ 	}
+ 
+-- 
+2.20.1
+
diff --git a/SOURCES/0079-ipvrf-Fix-error-path-of-vrf_switch.patch b/SOURCES/0079-ipvrf-Fix-error-path-of-vrf_switch.patch
new file mode 100644
index 0000000..ebf3bbc
--- /dev/null
+++ b/SOURCES/0079-ipvrf-Fix-error-path-of-vrf_switch.patch
@@ -0,0 +1,60 @@
+From 7ea6dbec34ae5166dd93fd4dbfcab35512e86e94 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:07:22 +0200
+Subject: [PATCH] ipvrf: Fix error path of vrf_switch()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 6ac5943bdd5ac
+
+commit 6ac5943bdd5ac5bb8c22b99f5a1d5907ebbcae2b
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 17 19:09:27 2017 +0200
+
+    ipvrf: Fix error path of vrf_switch()
+
+    Apart from trying to close(-1), this also leaked memory.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ ip/ipvrf.c | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/ip/ipvrf.c b/ip/ipvrf.c
+index 0f611b44b78ab..ae3b48fa81996 100644
+--- a/ip/ipvrf.c
++++ b/ip/ipvrf.c
+@@ -369,12 +369,12 @@ static int vrf_switch(const char *name)
+ 
+ 	/* -1 on length to add '/' to the end */
+ 	if (ipvrf_get_netns(netns, sizeof(netns) - 1) < 0)
+-		return -1;
++		goto out;
+ 
+ 	if (vrf_path(vpath, sizeof(vpath)) < 0) {
+ 		fprintf(stderr, "Failed to get base cgroup path: %s\n",
+ 			strerror(errno));
+-		return -1;
++		goto out;
+ 	}
+ 
+ 	/* if path already ends in netns then don't add it again */
+@@ -425,13 +425,14 @@ static int vrf_switch(const char *name)
+ 	snprintf(pid, sizeof(pid), "%d", getpid());
+ 	if (write(fd, pid, strlen(pid)) < 0) {
+ 		fprintf(stderr, "Failed to join cgroup\n");
+-		goto out;
++		goto out2;
+ 	}
+ 
+ 	rc = 0;
++out2:
++	close(fd);
+ out:
+ 	free(mnt);
+-	close(fd);
+ 
+ 	return rc;
+ }
+-- 
+2.20.1
+
diff --git a/SOURCES/0080-ifstat-Fix-memleak-in-error-case.patch b/SOURCES/0080-ifstat-Fix-memleak-in-error-case.patch
new file mode 100644
index 0000000..aac3573
--- /dev/null
+++ b/SOURCES/0080-ifstat-Fix-memleak-in-error-case.patch
@@ -0,0 +1,38 @@
+From 78ff1fa1a2ff22e6fb7dc0a689e5a4861826431e Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:07:22 +0200
+Subject: [PATCH] ifstat: Fix memleak in error case
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 35f6adefb8f9d
+
+commit 35f6adefb8f9d56437f5455ac8c0c3cc329e3317
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 17 19:09:28 2017 +0200
+
+    ifstat: Fix memleak in error case
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ misc/ifstat.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/misc/ifstat.c b/misc/ifstat.c
+index a853ee6d7e3b3..8fa354265a9a1 100644
+--- a/misc/ifstat.c
++++ b/misc/ifstat.c
+@@ -143,8 +143,10 @@ static int get_nlmsg_extended(const struct sockaddr_nl *who,
+ 		struct rtattr *attr;
+ 
+ 		attr = parse_rtattr_one_nested(sub_type, tb[filter_type]);
+-		if (attr == NULL)
++		if (attr == NULL) {
++			free(n);
+ 			return 0;
++		}
+ 		memcpy(&n->val, RTA_DATA(attr), sizeof(n->val));
+ 	}
+ 	memset(&n->rate, 0, sizeof(n->rate));
+-- 
+2.20.1
+
diff --git a/SOURCES/0081-ifstat-Fix-memleak-in-dump_kern_db-for-json-output.patch b/SOURCES/0081-ifstat-Fix-memleak-in-dump_kern_db-for-json-output.patch
new file mode 100644
index 0000000..520bac0
--- /dev/null
+++ b/SOURCES/0081-ifstat-Fix-memleak-in-dump_kern_db-for-json-output.patch
@@ -0,0 +1,45 @@
+From 3f74fdcd943982101775db3b4240a6f953d1198d Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:07:22 +0200
+Subject: [PATCH] ifstat: Fix memleak in dump_kern_db() for json output
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit b530cef0e3bbd
+
+commit b530cef0e3bbd27510e19f5f720a7ec94f3fa723
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 17 19:09:29 2017 +0200
+
+    ifstat: Fix memleak in dump_kern_db() for json output
+
+    Looks like this was forgotten when converting to common json output
+    formatter.
+
+    Fixes: fcc16c2287bf8 ("provide common json output formatter")
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ misc/ifstat.c | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/misc/ifstat.c b/misc/ifstat.c
+index 8fa354265a9a1..1be21703bf14c 100644
+--- a/misc/ifstat.c
++++ b/misc/ifstat.c
+@@ -535,8 +535,12 @@ static void dump_kern_db(FILE *fp)
+ 		else
+ 			print_one_if(fp, n, n->val);
+ 	}
+-	if (json_output)
+-		fprintf(fp, "\n} }\n");
++	if (jw) {
++		jsonw_end_object(jw);
++
++		jsonw_end_object(jw);
++		jsonw_destroy(&jw);
++	}
+ }
+ 
+ static void dump_incr_db(FILE *fp)
+-- 
+2.20.1
+
diff --git a/SOURCES/0082-ss-Fix-potential-memleak-in-unix_stats_print.patch b/SOURCES/0082-ss-Fix-potential-memleak-in-unix_stats_print.patch
new file mode 100644
index 0000000..57bec49
--- /dev/null
+++ b/SOURCES/0082-ss-Fix-potential-memleak-in-unix_stats_print.patch
@@ -0,0 +1,39 @@
+From 125c0e845acd690c9dce5702413294304a328fd1 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:07:22 +0200
+Subject: [PATCH] ss: Fix potential memleak in unix_stats_print()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 46131577cf1ba
+
+commit 46131577cf1ba37198c82e1ce89c9bbca2153ef4
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 17 19:09:30 2017 +0200
+
+    ss: Fix potential memleak in unix_stats_print()
+
+    Fixes: 2d0e538f3e1cd ("ss: Drop list traversal from unix_stats_print()")
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ misc/ss.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/misc/ss.c b/misc/ss.c
+index eb46e0c4b95fb..c97f05a4c7033 100644
+--- a/misc/ss.c
++++ b/misc/ss.c
+@@ -3258,8 +3258,10 @@ static int unix_show(struct filter *f)
+ 
+ 		if (name[0]) {
+ 			u->name = strdup(name);
+-			if (!u->name)
++			if (!u->name) {
++				free(u);
+ 				break;
++			}
+ 		}
+ 
+ 		if (u->rport) {
+-- 
+2.20.1
+
diff --git a/SOURCES/0083-tipc-bearer-Fix-resource-leak-in-error-path.patch b/SOURCES/0083-tipc-bearer-Fix-resource-leak-in-error-path.patch
new file mode 100644
index 0000000..db1fd9d
--- /dev/null
+++ b/SOURCES/0083-tipc-bearer-Fix-resource-leak-in-error-path.patch
@@ -0,0 +1,43 @@
+From b6bf156c4d4abab8176112e48a595c3e7bb7f825 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:07:22 +0200
+Subject: [PATCH] tipc/bearer: Fix resource leak in error path
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit be55416addf76
+
+commit be55416addf76e76836af6a4dd94b19c4186e1b2
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 17 19:09:31 2017 +0200
+
+    tipc/bearer: Fix resource leak in error path
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ tipc/bearer.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/tipc/bearer.c b/tipc/bearer.c
+index 810344f672af1..c3d4491f8f6ef 100644
+--- a/tipc/bearer.c
++++ b/tipc/bearer.c
+@@ -163,6 +163,7 @@ static int nl_add_udp_enable_opts(struct nlmsghdr *nlh, struct opt *opts,
+ 	if (!remip) {
+ 		if (generate_multicast(loc->ai_family, buf, sizeof(buf))) {
+ 			fprintf(stderr, "Failed to generate multicast address\n");
++			freeaddrinfo(loc);
+ 			return -EINVAL;
+ 		}
+ 		remip = buf;
+@@ -177,6 +178,8 @@ static int nl_add_udp_enable_opts(struct nlmsghdr *nlh, struct opt *opts,
+ 
+ 	if (rem->ai_family != loc->ai_family) {
+ 		fprintf(stderr, "UDP local and remote AF mismatch\n");
++		freeaddrinfo(rem);
++		freeaddrinfo(loc);
+ 		return -EINVAL;
+ 	}
+ 
+-- 
+2.20.1
+
diff --git a/SOURCES/0084-devlink-No-need-for-this-self-assignment.patch b/SOURCES/0084-devlink-No-need-for-this-self-assignment.patch
new file mode 100644
index 0000000..7809ca6
--- /dev/null
+++ b/SOURCES/0084-devlink-No-need-for-this-self-assignment.patch
@@ -0,0 +1,39 @@
+From 1fe740ceabb0b965224678a69a02255e20d5a47a Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:07:22 +0200
+Subject: [PATCH] devlink: No need for this self-assignment
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 8579a398c5ab0
+
+commit 8579a398c5ab0d26bce0ed9b4b6b6e5d62fcc89d
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 17 19:09:25 2017 +0200
+
+    devlink: No need for this self-assignment
+
+    dl_argv_handle_both() will either assign to handle_bit or error out in
+    which case the variable is not used by the caller.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Acked-by: Jiri Pirko <jiri@mellanox.com>
+---
+ devlink/devlink.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/devlink/devlink.c b/devlink/devlink.c
+index 2000db81aabb0..ae295b5632e8c 100644
+--- a/devlink/devlink.c
++++ b/devlink/devlink.c
+@@ -845,7 +845,7 @@ static int dl_argv_parse(struct dl *dl, uint32_t o_required,
+ 	int err;
+ 
+ 	if (o_required & DL_OPT_HANDLE && o_required & DL_OPT_HANDLEP) {
+-		uint32_t handle_bit = handle_bit;
++		uint32_t handle_bit;
+ 
+ 		err = dl_argv_handle_both(dl, &opts->bus_name, &opts->dev_name,
+ 					  &opts->port_index, &handle_bit);
+-- 
+2.20.1
+
diff --git a/SOURCES/0085-ipntable-No-need-to-check-and-assign-to-parms_rta.patch b/SOURCES/0085-ipntable-No-need-to-check-and-assign-to-parms_rta.patch
new file mode 100644
index 0000000..5d26732
--- /dev/null
+++ b/SOURCES/0085-ipntable-No-need-to-check-and-assign-to-parms_rta.patch
@@ -0,0 +1,38 @@
+From d62d2ffc71194068af509ec3285ecd6823d883fb Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:07:22 +0200
+Subject: [PATCH] ipntable: No need to check and assign to parms_rta
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 2869262144271
+
+commit 28692621442710f4a67fe33742f56efc582ee33a
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 17 19:09:26 2017 +0200
+
+    ipntable: No need to check and assign to parms_rta
+
+    This variable is initialized at declaration and nowhere else does any
+    assignment to it happen, so just drop the check.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ ip/ipntable.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/ip/ipntable.c b/ip/ipntable.c
+index 65063321c85f8..ae8c74ead2cb8 100644
+--- a/ip/ipntable.c
++++ b/ip/ipntable.c
+@@ -202,8 +202,6 @@ static int ipntable_modify(int cmd, int flags, int argc, char **argv)
+ 			if (get_u32(&queue, *argv, 0))
+ 				invarg("\"queue\" value is invalid", *argv);
+ 
+-			if (!parms_rta)
+-				parms_rta = (struct rtattr *)&parms_buf;
+ 			rta_addattr32(parms_rta, sizeof(parms_buf),
+ 				      NDTPA_QUEUE_LEN, queue);
+ 			parms_change = 1;
+-- 
+2.20.1
+
diff --git a/SOURCES/0086-iproute-Fix-for-missing-Oifs-display.patch b/SOURCES/0086-iproute-Fix-for-missing-Oifs-display.patch
new file mode 100644
index 0000000..32254db
--- /dev/null
+++ b/SOURCES/0086-iproute-Fix-for-missing-Oifs-display.patch
@@ -0,0 +1,55 @@
+From 2cb971cefe001a66677c2d1d23b1596cbffb3989 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:07:22 +0200
+Subject: [PATCH] iproute: Fix for missing 'Oifs:' display
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 2a866256197f8
+
+commit 2a866256197f8b86e61fa1afc99b11d7056d5686
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 17 19:09:27 2017 +0200
+
+    iproute: Fix for missing 'Oifs:' display
+
+    Covscan complained about dead code but after reading it, I assume the
+    author's intention was to prefix the interface list with 'Oifs: '.
+    Initializing first to 1 and setting it to 0 after above prefix was
+    printed should fix it.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ ip/iproute.c | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/ip/iproute.c b/ip/iproute.c
+index d4db035fc7b24..6ebc6214c45ee 100644
+--- a/ip/iproute.c
++++ b/ip/iproute.c
+@@ -618,7 +618,7 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
+ 	}
+ 	if (tb[RTA_MULTIPATH]) {
+ 		struct rtnexthop *nh = RTA_DATA(tb[RTA_MULTIPATH]);
+-		int first = 0;
++		int first = 1;
+ 
+ 		len = RTA_PAYLOAD(tb[RTA_MULTIPATH]);
+ 
+@@ -628,10 +628,12 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
+ 			if (nh->rtnh_len > len)
+ 				break;
+ 			if (r->rtm_flags&RTM_F_CLONED && r->rtm_type == RTN_MULTICAST) {
+-				if (first)
++				if (first) {
+ 					fprintf(fp, "Oifs: ");
+-				else
++					first = 0;
++				} else {
+ 					fprintf(fp, " ");
++				}
+ 			} else
+ 				fprintf(fp, "%s\tnexthop ", _SL_);
+ 			if (nh->rtnh_len > sizeof(*nh)) {
+-- 
+2.20.1
+
diff --git a/SOURCES/0087-lib-rt_names-Drop-dead-code-in-rtnl_rttable_n2a.patch b/SOURCES/0087-lib-rt_names-Drop-dead-code-in-rtnl_rttable_n2a.patch
new file mode 100644
index 0000000..4f32b28
--- /dev/null
+++ b/SOURCES/0087-lib-rt_names-Drop-dead-code-in-rtnl_rttable_n2a.patch
@@ -0,0 +1,40 @@
+From cd4f6a9976a969d4981b3b3d09b60ed311f3e9a5 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:07:22 +0200
+Subject: [PATCH] lib/rt_names: Drop dead code in rtnl_rttable_n2a()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit b3c5f84493d33
+
+commit b3c5f84493d3399a546566475203207aa5b64d54
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 17 19:09:28 2017 +0200
+
+    lib/rt_names: Drop dead code in rtnl_rttable_n2a()
+
+    Since 'id' is 32bit unsigned, it can never exceed RT_TABLE_MAX (which is
+    defined to 0xFFFFFFFF). Therefore drop that never matching conditional.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ lib/rt_names.c | 4 ----
+ 1 file changed, 4 deletions(-)
+
+diff --git a/lib/rt_names.c b/lib/rt_names.c
+index 04c15ff5b15f8..e5efd78e6f810 100644
+--- a/lib/rt_names.c
++++ b/lib/rt_names.c
+@@ -410,10 +410,6 @@ const char *rtnl_rttable_n2a(__u32 id, char *buf, int len)
+ {
+ 	struct rtnl_hash_entry *entry;
+ 
+-	if (id > RT_TABLE_MAX) {
+-		snprintf(buf, len, "%u", id);
+-		return buf;
+-	}
+ 	if (!rtnl_rttable_init)
+ 		rtnl_rttable_initialize();
+ 	entry = rtnl_rttable_hash[id & 255];
+-- 
+2.20.1
+
diff --git a/SOURCES/0088-ss-Skip-useless-check-in-parse_hostcond.patch b/SOURCES/0088-ss-Skip-useless-check-in-parse_hostcond.patch
new file mode 100644
index 0000000..ce300e1
--- /dev/null
+++ b/SOURCES/0088-ss-Skip-useless-check-in-parse_hostcond.patch
@@ -0,0 +1,39 @@
+From 4b2f0a5a479f2714b8b44932ba961ba8cf07e18e Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:07:22 +0200
+Subject: [PATCH] ss: Skip useless check in parse_hostcond()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 44448a90eab34
+
+commit 44448a90eab34713af019356926828720c67a268
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 17 19:09:29 2017 +0200
+
+    ss: Skip useless check in parse_hostcond()
+
+    The passed 'addr' parameter is dereferenced by caller before and in
+    parse_hostcond() multiple times before this check, so assume it is
+    always true.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ misc/ss.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/misc/ss.c b/misc/ss.c
+index c97f05a4c7033..38f4017e4a8c8 100644
+--- a/misc/ss.c
++++ b/misc/ss.c
+@@ -1747,7 +1747,7 @@ void *parse_hostcond(char *addr, bool is_port)
+ 			}
+ 		}
+ 	}
+-	if (!is_port && addr && *addr && *addr != '*') {
++	if (!is_port && *addr && *addr != '*') {
+ 		if (get_prefix_1(&a.addr, addr, fam)) {
+ 			if (get_dns_host(&a, addr, fam)) {
+ 				fprintf(stderr, "Error: an inet prefix is expected rather than \"%s\".\n", addr);
+-- 
+2.20.1
+
diff --git a/SOURCES/0089-ss-Drop-useless-assignment.patch b/SOURCES/0089-ss-Drop-useless-assignment.patch
new file mode 100644
index 0000000..c406ed9
--- /dev/null
+++ b/SOURCES/0089-ss-Drop-useless-assignment.patch
@@ -0,0 +1,36 @@
+From 23e13f60728a68b2c4a5b3656a1ce79affaafc6d Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:07:22 +0200
+Subject: [PATCH] ss: Drop useless assignment
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit e469523e8e8d1
+
+commit e469523e8e8d1d31c3b35251105e2a843216d687
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 17 19:09:30 2017 +0200
+
+    ss: Drop useless assignment
+
+    After '*b = *a', 'b->next' already has the same value as 'a->next'.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ misc/ss.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/misc/ss.c b/misc/ss.c
+index 38f4017e4a8c8..cc38fc499c210 100644
+--- a/misc/ss.c
++++ b/misc/ss.c
+@@ -1476,7 +1476,6 @@ static int remember_he(struct aafilter *a, struct hostent *he)
+ 			if ((b = malloc(sizeof(*b))) == NULL)
+ 				return cnt;
+ 			*b = *a;
+-			b->next = a->next;
+ 			a->next = b;
+ 		}
+ 		memcpy(b->addr.data, *ptr, len);
+-- 
+2.20.1
+
diff --git a/SOURCES/0090-tc-m_gact-Drop-dead-code.patch b/SOURCES/0090-tc-m_gact-Drop-dead-code.patch
new file mode 100644
index 0000000..b3702ee
--- /dev/null
+++ b/SOURCES/0090-tc-m_gact-Drop-dead-code.patch
@@ -0,0 +1,90 @@
+From c6e0fc7a5ec0b890c35a3b5d4cc5e1f7794cc47f Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:07:22 +0200
+Subject: [PATCH] tc/m_gact: Drop dead code
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 73aa988868e7e
+Conflicts: context change due to missing commits:
+* e67aba5595811 ("tc: actions: add helpers to parse and print control actions")
+* 18f05d06016d9 ("tc: gact: fix control action parsing")
+
+commit 73aa988868e7e068b4fc0daaca7cfdb3e07fe744
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 17 19:09:31 2017 +0200
+
+    tc/m_gact: Drop dead code
+
+    The use of 'ok' variable in parse_gact() is ineffective: The second
+    conditional increments it either if *argv is 'gact' or if
+    parse_action_control() doesn't fail (in which case exit() is called).
+    So this is effectively an unconditional increment and since no decrement
+    happens anywhere, all remaining checks for 'ok != 0' can be dropped.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ tc/m_gact.c | 18 +++++-------------
+ 1 file changed, 5 insertions(+), 13 deletions(-)
+
+diff --git a/tc/m_gact.c b/tc/m_gact.c
+index 755a3bee2c2f2..0cb5222fd3817 100644
+--- a/tc/m_gact.c
++++ b/tc/m_gact.c
+@@ -86,7 +86,6 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p,
+ {
+ 	int argc = *argc_p;
+ 	char **argv = *argv_p;
+-	int ok = 0;
+ 	int action = TC_POLICE_RECLASSIFY;
+ 	struct tc_gact p = { .action = TC_POLICE_RECLASSIFY };
+ #ifdef CONFIG_GACT_PROB
+@@ -100,25 +99,22 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p,
+ 
+ 
+ 	if (matches(*argv, "gact") == 0) {
+-		ok++;
++		argc--;
++		argv++;
+ 	} else {
+ 		action = get_act(&argv);
+ 		if (action != -10) {
+ 			p.action = action;
+-			ok++;
++			argc--;
++			argv++;
+ 		} else {
+ 			explain();
+ 			return action;
+ 		}
+ 	}
+ 
+-	if (ok) {
+-		argc--;
+-		argv++;
+-	}
+-
+ #ifdef CONFIG_GACT_PROB
+-	if (ok && argc > 0) {
++	if (argc > 0) {
+ 		if (matches(*argv, "random") == 0) {
+ 			rd = 1;
+ 			NEXT_ARG();
+@@ -167,15 +163,11 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p,
+ 			}
+ 			argc--;
+ 			argv++;
+-			ok++;
+ 		} else if (matches(*argv, "help") == 0) {
+ 				usage();
+ 		}
+ 	}
+ 
+-	if (!ok)
+-		return -1;
+-
+ 	tail = NLMSG_TAIL(n);
+ 	addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+ 	addattr_l(n, MAX_MSG, TCA_GACT_PARMS, &p, sizeof(p));
+-- 
+2.20.1
+
diff --git a/SOURCES/0091-ipaddress-Avoid-accessing-uninitialized-variable-lcl.patch b/SOURCES/0091-ipaddress-Avoid-accessing-uninitialized-variable-lcl.patch
new file mode 100644
index 0000000..fcf2770
--- /dev/null
+++ b/SOURCES/0091-ipaddress-Avoid-accessing-uninitialized-variable-lcl.patch
@@ -0,0 +1,38 @@
+From a7150dc1d46b73f65bfedd728aeca1dcf5ec20eb Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:07 +0200
+Subject: [PATCH] ipaddress: Avoid accessing uninitialized variable lcl
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit d044ea3e784d1
+
+commit d044ea3e784d1a4f0a61f306b86ce95c9a26b0b5
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Mon Aug 21 11:26:59 2017 +0200
+
+    ipaddress: Avoid accessing uninitialized variable lcl
+
+    If no address was given, ipaddr_modify() accesses uninitialized data
+    when assigning to req.ifa.ifa_prefixlen.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ ip/ipaddress.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/ip/ipaddress.c b/ip/ipaddress.c
+index bed2d3801809b..2c27da3a1f079 100644
+--- a/ip/ipaddress.c
++++ b/ip/ipaddress.c
+@@ -1887,7 +1887,7 @@ static int ipaddr_modify(int cmd, int flags, int argc, char **argv)
+ 	char  *lcl_arg = NULL;
+ 	char  *valid_lftp = NULL;
+ 	char  *preferred_lftp = NULL;
+-	inet_prefix lcl;
++	inet_prefix lcl = {};
+ 	inet_prefix peer;
+ 	int local_len = 0;
+ 	int peer_len = 0;
+-- 
+2.20.1
+
diff --git a/SOURCES/0092-iplink_can-Prevent-overstepping-array-bounds.patch b/SOURCES/0092-iplink_can-Prevent-overstepping-array-bounds.patch
new file mode 100644
index 0000000..0804c5b
--- /dev/null
+++ b/SOURCES/0092-iplink_can-Prevent-overstepping-array-bounds.patch
@@ -0,0 +1,49 @@
+From 4c775c035e2751b1aec52dcc2ca0e4fc99bac793 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:07 +0200
+Subject: [PATCH] iplink_can: Prevent overstepping array bounds
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 258b7c0fa70c2
+
+commit 258b7c0fa70c2d6b5f9776cc35c38c80b4ee5752
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Mon Aug 21 11:27:00 2017 +0200
+
+    iplink_can: Prevent overstepping array bounds
+
+    can_state_names array contains at most CAN_STATE_MAX fields, so allowing
+    an index to it to be equal to that number is wrong. While here, also
+    make sure the array is indeed that big so nothing bad happens if
+    CAN_STATE_MAX ever increases.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ ip/iplink_can.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/ip/iplink_can.c b/ip/iplink_can.c
+index 20d4d37d0d087..4133a658a059e 100644
+--- a/ip/iplink_can.c
++++ b/ip/iplink_can.c
+@@ -241,7 +241,7 @@ static int can_parse_opt(struct link_util *lu, int argc, char **argv,
+ 	return 0;
+ }
+ 
+-static const char *can_state_names[] = {
++static const char *can_state_names[CAN_STATE_MAX] = {
+ 	[CAN_STATE_ERROR_ACTIVE] = "ERROR-ACTIVE",
+ 	[CAN_STATE_ERROR_WARNING] = "ERROR-WARNING",
+ 	[CAN_STATE_ERROR_PASSIVE] = "ERROR-PASSIVE",
+@@ -265,7 +265,7 @@ static void can_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
+ 	if (tb[IFLA_CAN_STATE]) {
+ 		uint32_t state = rta_getattr_u32(tb[IFLA_CAN_STATE]);
+ 
+-		fprintf(f, "state %s ", state <= CAN_STATE_MAX ?
++		fprintf(f, "state %s ", state < CAN_STATE_MAX ?
+ 			can_state_names[state] : "UNKNOWN");
+ 	}
+ 
+-- 
+2.20.1
+
diff --git a/SOURCES/0093-ipmaddr-Avoid-accessing-uninitialized-data.patch b/SOURCES/0093-ipmaddr-Avoid-accessing-uninitialized-data.patch
new file mode 100644
index 0000000..03b06ec
--- /dev/null
+++ b/SOURCES/0093-ipmaddr-Avoid-accessing-uninitialized-data.patch
@@ -0,0 +1,38 @@
+From e5d32611010d4694562980b790ed7849342f594b Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:07 +0200
+Subject: [PATCH] ipmaddr: Avoid accessing uninitialized data
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit b48a1161f5f9b
+
+commit b48a1161f5f9b6a0cda399a224bbbf72eba4a5c6
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Mon Aug 21 11:27:01 2017 +0200
+
+    ipmaddr: Avoid accessing uninitialized data
+
+    Looks like this can only happen if /proc/net/igmp is malformed, but
+    better be sure.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ ip/ipmaddr.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/ip/ipmaddr.c b/ip/ipmaddr.c
+index 4f726fdd976f1..85a69e779563d 100644
+--- a/ip/ipmaddr.c
++++ b/ip/ipmaddr.c
+@@ -136,7 +136,7 @@ static void read_igmp(struct ma_info **result_p)
+ 
+ 	while (fgets(buf, sizeof(buf), fp)) {
+ 		struct ma_info *ma;
+-		size_t len;
++		size_t len = 0;
+ 
+ 		if (buf[0] != '\t') {
+ 			sscanf(buf, "%d%s", &m.index, m.name);
+-- 
+2.20.1
+
diff --git a/SOURCES/0094-ss-Use-C99-initializer-in-netlink_show_one.patch b/SOURCES/0094-ss-Use-C99-initializer-in-netlink_show_one.patch
new file mode 100644
index 0000000..4914cd9
--- /dev/null
+++ b/SOURCES/0094-ss-Use-C99-initializer-in-netlink_show_one.patch
@@ -0,0 +1,54 @@
+From 60a5c300c8cd0fbd4c378900d298eb2444c0343d Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:07 +0200
+Subject: [PATCH] ss: Use C99 initializer in netlink_show_one()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 301826beb3baa
+
+commit 301826beb3baa902e2057d81912d1586459f605f
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Mon Aug 21 11:27:02 2017 +0200
+
+    ss: Use C99 initializer in netlink_show_one()
+
+    This has the additional benefit of initializing st.ino to zero which is
+    used later in is_sctp_assoc() function.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ misc/ss.c | 13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
+
+diff --git a/misc/ss.c b/misc/ss.c
+index cc38fc499c210..7a38e9d830e8d 100644
+--- a/misc/ss.c
++++ b/misc/ss.c
+@@ -3567,17 +3567,18 @@ static int netlink_show_one(struct filter *f,
+ 				int rq, int wq,
+ 				unsigned long long sk, unsigned long long cb)
+ {
+-	struct sockstat st;
++	struct sockstat st = {
++		.state		= SS_CLOSE,
++		.rq		= rq,
++		.wq		= wq,
++		.local.family	= AF_NETLINK,
++		.remote.family	= AF_NETLINK,
++	};
+ 
+ 	SPRINT_BUF(prot_buf) = {};
+ 	const char *prot_name;
+ 	char procname[64] = {};
+ 
+-	st.state = SS_CLOSE;
+-	st.rq	 = rq;
+-	st.wq	 = wq;
+-	st.local.family = st.remote.family = AF_NETLINK;
+-
+ 	if (f->f) {
+ 		st.rport = -1;
+ 		st.lport = pid;
+-- 
+2.20.1
+
diff --git a/SOURCES/0095-netem-maketable-Check-return-value-of-fstat.patch b/SOURCES/0095-netem-maketable-Check-return-value-of-fstat.patch
new file mode 100644
index 0000000..37c71a3
--- /dev/null
+++ b/SOURCES/0095-netem-maketable-Check-return-value-of-fstat.patch
@@ -0,0 +1,39 @@
+From 56c1a9e6c4d7d54ee27472428bcb33be471b3346 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:07 +0200
+Subject: [PATCH] netem/maketable: Check return value of fstat()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit d304b05c12b3a
+
+commit d304b05c12b3a0247b627ebc8e4477520bb4b969
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Mon Aug 21 11:27:03 2017 +0200
+
+    netem/maketable: Check return value of fstat()
+
+    Otherwise info.st_size may contain garbage.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ netem/maketable.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/netem/maketable.c b/netem/maketable.c
+index 6aff927be7040..ad660e7d457f0 100644
+--- a/netem/maketable.c
++++ b/netem/maketable.c
+@@ -24,8 +24,8 @@ readdoubles(FILE *fp, int *number)
+ 	int limit;
+ 	int n=0, i;
+ 
+-	fstat(fileno(fp), &info);
+-	if (info.st_size > 0) {
++	if (!fstat(fileno(fp), &info) &&
++	    info.st_size > 0) {
+ 		limit = 2*info.st_size/sizeof(double);	/* @@ approximate */
+ 	} else {
+ 		limit = 10000;
+-- 
+2.20.1
+
diff --git a/SOURCES/0096-tc-q_multiq-Don-t-pass-garbage-in-TCA_OPTIONS.patch b/SOURCES/0096-tc-q_multiq-Don-t-pass-garbage-in-TCA_OPTIONS.patch
new file mode 100644
index 0000000..eb63ef2
--- /dev/null
+++ b/SOURCES/0096-tc-q_multiq-Don-t-pass-garbage-in-TCA_OPTIONS.patch
@@ -0,0 +1,38 @@
+From 8a115584261b32308d604063b56f25330ce8adaf Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:07 +0200
+Subject: [PATCH] tc/q_multiq: Don't pass garbage in TCA_OPTIONS
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 82ed9ffa2bb86
+
+commit 82ed9ffa2bb86eea653f68a0ade945b7708818c9
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Mon Aug 21 11:27:04 2017 +0200
+
+    tc/q_multiq: Don't pass garbage in TCA_OPTIONS
+
+    multiq_parse_opt() doesn't change 'opt' at all. So at least make sure
+    it doesn't fill TCA_OPTIONS attribute with garbage from stack.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ tc/q_multiq.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tc/q_multiq.c b/tc/q_multiq.c
+index 7823931494563..9c09c9a7748f6 100644
+--- a/tc/q_multiq.c
++++ b/tc/q_multiq.c
+@@ -43,7 +43,7 @@ static void explain(void)
+ static int multiq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
+ 			    struct nlmsghdr *n)
+ {
+-	struct tc_multiq_qopt opt;
++	struct tc_multiq_qopt opt = {};
+ 
+ 	if (argc) {
+ 		if (strcmp(*argv, "help") == 0) {
+-- 
+2.20.1
+
diff --git a/SOURCES/0097-iproute-Check-mark-value-input.patch b/SOURCES/0097-iproute-Check-mark-value-input.patch
new file mode 100644
index 0000000..73c7ae8
--- /dev/null
+++ b/SOURCES/0097-iproute-Check-mark-value-input.patch
@@ -0,0 +1,46 @@
+From ce3460e0a39948054139e5bcf72130e82bf2da8d Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:07 +0200
+Subject: [PATCH] iproute: Check mark value input
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 7c66d89828a6e
+
+commit 7c66d89828a6ee4c5a4e3f48ef4a4cb07b50013d
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Mon Aug 21 18:36:50 2017 +0200
+
+    iproute: Check mark value input
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ ip/iproute.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/ip/iproute.c b/ip/iproute.c
+index 6ebc6214c45ee..1d92530fd3421 100644
+--- a/ip/iproute.c
++++ b/ip/iproute.c
+@@ -1481,7 +1481,8 @@ static int iproute_list_flush_or_save(int argc, char **argv, int action)
+ 			id = *argv;
+ 		} else if (strcmp(*argv, "mark") == 0) {
+ 			NEXT_ARG();
+-			get_unsigned(&mark, *argv, 0);
++			if (get_unsigned(&mark, *argv, 0))
++				invarg("invalid mark value", *argv);
+ 			filter.markmask = -1;
+ 		} else if (strcmp(*argv, "via") == 0) {
+ 			int family;
+@@ -1698,7 +1699,8 @@ static int iproute_get(int argc, char **argv)
+ 			idev = *argv;
+ 		} else if (matches(*argv, "mark") == 0) {
+ 			NEXT_ARG();
+-			get_unsigned(&mark, *argv, 0);
++			if (get_unsigned(&mark, *argv, 0))
++				invarg("invalid mark value", *argv);
+ 		} else if (matches(*argv, "oif") == 0 ||
+ 			   strcmp(*argv, "dev") == 0) {
+ 			NEXT_ARG();
+-- 
+2.20.1
+
diff --git a/SOURCES/0098-iplink_vrf-Complain-if-main-table-is-not-found.patch b/SOURCES/0098-iplink_vrf-Complain-if-main-table-is-not-found.patch
new file mode 100644
index 0000000..e42872e
--- /dev/null
+++ b/SOURCES/0098-iplink_vrf-Complain-if-main-table-is-not-found.patch
@@ -0,0 +1,38 @@
+From b9d228a8c22f1d9069fa0c8f98e6bd94011c5714 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:07 +0200
+Subject: [PATCH] iplink_vrf: Complain if main table is not found
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 84b6a3f4b5720
+
+commit 84b6a3f4b5720aaf673c2eaad2cf60f786de077b
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Mon Aug 21 18:36:51 2017 +0200
+
+    iplink_vrf: Complain if main table is not found
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Acked-by: David Ahern <dsahern@gmail.com>
+---
+ ip/iplink_vrf.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/ip/iplink_vrf.c b/ip/iplink_vrf.c
+index 370bb86815a80..9c2de2732a88e 100644
+--- a/ip/iplink_vrf.c
++++ b/ip/iplink_vrf.c
+@@ -127,7 +127,9 @@ __u32 ipvrf_get_table(const char *name)
+ 	if (rtnl_talk_suppress_rtnl_errmsg(&rth, &req.n, &answer) < 0) {
+ 		/* special case "default" vrf to be the main table */
+ 		if (errno == ENODEV && !strcmp(name, "default"))
+-			rtnl_rttable_a2n(&tb_id, "main");
++			if (rtnl_rttable_a2n(&tb_id, "main"))
++				fprintf(stderr,
++					"BUG: RTTable \"main\" not found.\n");
+ 
+ 		return tb_id;
+ 	}
+-- 
+2.20.1
+
diff --git a/SOURCES/0099-devlink-Check-return-code-of-strslashrsplit.patch b/SOURCES/0099-devlink-Check-return-code-of-strslashrsplit.patch
new file mode 100644
index 0000000..4aa717f
--- /dev/null
+++ b/SOURCES/0099-devlink-Check-return-code-of-strslashrsplit.patch
@@ -0,0 +1,62 @@
+From ea11b95042171f254fe0127ea0f1f2786d81dc83 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:07 +0200
+Subject: [PATCH] devlink: Check return code of strslashrsplit()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 6e33f7b0f6e04
+
+commit 6e33f7b0f6e04dd46bea24c3ab28d61e54625dd7
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Mon Aug 21 18:36:52 2017 +0200
+
+    devlink: Check return code of strslashrsplit()
+
+    This function shouldn't fail because all callers of
+    __dl_argv_handle_port() make sure the passed string contains enough
+    slashes already, but better make sure if this changes in future the
+    function won't access uninitialized data.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ devlink/devlink.c | 16 ++++++++++++----
+ 1 file changed, 12 insertions(+), 4 deletions(-)
+
+diff --git a/devlink/devlink.c b/devlink/devlink.c
+index ae295b5632e8c..082eeafa1146a 100644
+--- a/devlink/devlink.c
++++ b/devlink/devlink.c
+@@ -576,18 +576,26 @@ static int __dl_argv_handle_port(char *str,
+ 				 char **p_bus_name, char **p_dev_name,
+ 				 uint32_t *p_port_index)
+ {
+-	char *handlestr = handlestr;
+-	char *portstr = portstr;
++	char *handlestr;
++	char *portstr;
+ 	int err;
+ 
+-	strslashrsplit(str, &handlestr, &portstr);
++	err = strslashrsplit(str, &handlestr, &portstr);
++	if (err) {
++		pr_err("Port identification \"%s\" is invalid\n", str);
++		return err;
++	}
+ 	err = strtouint32_t(portstr, p_port_index);
+ 	if (err) {
+ 		pr_err("Port index \"%s\" is not a number or not within range\n",
+ 		       portstr);
+ 		return err;
+ 	}
+-	strslashrsplit(handlestr, p_bus_name, p_dev_name);
++	err = strslashrsplit(handlestr, p_bus_name, p_dev_name);
++	if (err) {
++		pr_err("Port identification \"%s\" is invalid\n", str);
++		return err;
++	}
+ 	return 0;
+ }
+ 
+-- 
+2.20.1
+
diff --git a/SOURCES/0100-lib-bpf-Don-t-leak-fp-in-bpf_find_mntpt.patch b/SOURCES/0100-lib-bpf-Don-t-leak-fp-in-bpf_find_mntpt.patch
new file mode 100644
index 0000000..2e22047
--- /dev/null
+++ b/SOURCES/0100-lib-bpf-Don-t-leak-fp-in-bpf_find_mntpt.patch
@@ -0,0 +1,43 @@
+From bafabe7a067e647f97ae0df277bded8b9349db50 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:07 +0200
+Subject: [PATCH] lib/bpf: Don't leak fp in bpf_find_mntpt()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit c3724e4bc3a6c
+
+commit c3724e4bc3a6c40dc846f0c3b02934d711bf81fb
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Mon Aug 21 16:46:51 2017 +0200
+
+    lib/bpf: Don't leak fp in bpf_find_mntpt()
+
+    If fopen() succeeded but len != PATH_MAX, the function leaks the open
+    FILE pointer. Fix this by checking len value before calling fopen().
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Acked-by: Daniel Borkmann <daniel@iogearbox.net>
+---
+ lib/bpf.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/lib/bpf.c b/lib/bpf.c
+index 3aabf44d1abf8..33c5288e82187 100644
+--- a/lib/bpf.c
++++ b/lib/bpf.c
+@@ -432,8 +432,11 @@ static const char *bpf_find_mntpt(const char *fstype, unsigned long magic,
+ 		}
+ 	}
+ 
++	if (len != PATH_MAX)
++		return NULL;
++
+ 	fp = fopen("/proc/mounts", "r");
+-	if (fp == NULL || len != PATH_MAX)
++	if (fp == NULL)
+ 		return NULL;
+ 
+ 	while (fscanf(fp, "%*s %" textify(PATH_MAX) "s %99s %*s %*d %*d\n",
+-- 
+2.20.1
+
diff --git a/SOURCES/0101-ifstat-nstat-Check-fdopen-return-value.patch b/SOURCES/0101-ifstat-nstat-Check-fdopen-return-value.patch
new file mode 100644
index 0000000..792575a
--- /dev/null
+++ b/SOURCES/0101-ifstat-nstat-Check-fdopen-return-value.patch
@@ -0,0 +1,84 @@
+From 5ae0f31d9c5d40dbf9eaf00435b9df1968109f5e Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:07 +0200
+Subject: [PATCH] ifstat, nstat: Check fdopen() return value
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 6d02518fdc37e
+
+commit 6d02518fdc37eb12abff67b6f8c741fbd81dce72
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 24 11:46:31 2017 +0200
+
+    ifstat, nstat: Check fdopen() return value
+
+    Prevent passing NULL FILE pointer to fgets() later.
+
+    Fix both tools in a single patch since the code changes are basically
+    identical.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ misc/ifstat.c | 16 +++++++++++-----
+ misc/nstat.c  | 16 +++++++++++-----
+ 2 files changed, 22 insertions(+), 10 deletions(-)
+
+diff --git a/misc/ifstat.c b/misc/ifstat.c
+index 1be21703bf14c..ac3eff6b870a9 100644
+--- a/misc/ifstat.c
++++ b/misc/ifstat.c
+@@ -992,12 +992,18 @@ int main(int argc, char *argv[])
+ 	    && verify_forging(fd) == 0) {
+ 		FILE *sfp = fdopen(fd, "r");
+ 
+-		load_raw_table(sfp);
+-		if (hist_db && source_mismatch) {
+-			fprintf(stderr, "ifstat: history is stale, ignoring it.\n");
+-			hist_db = NULL;
++		if (!sfp) {
++			fprintf(stderr, "ifstat: fdopen failed: %s\n",
++				strerror(errno));
++			close(fd);
++		} else  {
++			load_raw_table(sfp);
++			if (hist_db && source_mismatch) {
++				fprintf(stderr, "ifstat: history is stale, ignoring it.\n");
++				hist_db = NULL;
++			}
++			fclose(sfp);
+ 		}
+-		fclose(sfp);
+ 	} else {
+ 		if (fd >= 0)
+ 			close(fd);
+diff --git a/misc/nstat.c b/misc/nstat.c
+index 1212b1f2c8128..a4dd405d43a93 100644
+--- a/misc/nstat.c
++++ b/misc/nstat.c
+@@ -706,12 +706,18 @@ int main(int argc, char *argv[])
+ 	    && verify_forging(fd) == 0) {
+ 		FILE *sfp = fdopen(fd, "r");
+ 
+-		load_good_table(sfp);
+-		if (hist_db && source_mismatch) {
+-			fprintf(stderr, "nstat: history is stale, ignoring it.\n");
+-			hist_db = NULL;
++		if (!sfp) {
++			fprintf(stderr, "nstat: fdopen failed: %s\n",
++				strerror(errno));
++			close(fd);
++		} else {
++			load_good_table(sfp);
++			if (hist_db && source_mismatch) {
++				fprintf(stderr, "nstat: history is stale, ignoring it.\n");
++				hist_db = NULL;
++			}
++			fclose(sfp);
+ 		}
+-		fclose(sfp);
+ 	} else {
+ 		if (fd >= 0)
+ 			close(fd);
+-- 
+2.20.1
+
diff --git a/SOURCES/0102-tc-q_netem-Don-t-dereference-possibly-NULL-pointer.patch b/SOURCES/0102-tc-q_netem-Don-t-dereference-possibly-NULL-pointer.patch
new file mode 100644
index 0000000..4b35e5f
--- /dev/null
+++ b/SOURCES/0102-tc-q_netem-Don-t-dereference-possibly-NULL-pointer.patch
@@ -0,0 +1,46 @@
+From a7329f9d8681bdbd2d8257b152ae6b4959232e67 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:08 +0200
+Subject: [PATCH] tc/q_netem: Don't dereference possibly NULL pointer
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit a754de3ccd937
+
+commit a754de3ccd937500940c6fcd0ad043855f56862d
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 24 11:46:32 2017 +0200
+
+    tc/q_netem: Don't dereference possibly NULL pointer
+
+    Assuming 'opt' might be NULL, move the call to RTA_PAYLOAD to after the
+    check since it dereferences its parameter.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ tc/q_netem.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/tc/q_netem.c b/tc/q_netem.c
+index 0975ae111de97..5a9e747411e85 100644
+--- a/tc/q_netem.c
++++ b/tc/q_netem.c
+@@ -538,7 +538,7 @@ static int netem_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
+ 	int *ecn = NULL;
+ 	struct tc_netem_qopt qopt;
+ 	const struct tc_netem_rate *rate = NULL;
+-	int len = RTA_PAYLOAD(opt) - sizeof(qopt);
++	int len;
+ 	__u64 rate64 = 0;
+ 
+ 	SPRINT_BUF(b1);
+@@ -546,6 +546,7 @@ static int netem_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
+ 	if (opt == NULL)
+ 		return 0;
+ 
++	len = RTA_PAYLOAD(opt) - sizeof(qopt);
+ 	if (len < 0) {
+ 		fprintf(stderr, "options size error\n");
+ 		return -1;
+-- 
+2.20.1
+
diff --git a/SOURCES/0103-tc-tc_filter-Make-sure-filter-name-is-not-empty.patch b/SOURCES/0103-tc-tc_filter-Make-sure-filter-name-is-not-empty.patch
new file mode 100644
index 0000000..d74eae8
--- /dev/null
+++ b/SOURCES/0103-tc-tc_filter-Make-sure-filter-name-is-not-empty.patch
@@ -0,0 +1,39 @@
+From a4c190565a85db814ad1185ada5382e7fb8707a0 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:08 +0200
+Subject: [PATCH] tc/tc_filter: Make sure filter name is not empty
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 75716932a0af2
+
+commit 75716932a0af28da207aa57c212794ab28ce9036
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 24 11:46:33 2017 +0200
+
+    tc/tc_filter: Make sure filter name is not empty
+
+    The later check for 'k[0] != 0' requires a non-empty filter name,
+    otherwise NULL pointer dereference in 'q' might happen.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ tc/tc_filter.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/tc/tc_filter.c b/tc/tc_filter.c
+index e640492b25ba6..a6bb73d12eaba 100644
+--- a/tc/tc_filter.c
++++ b/tc/tc_filter.c
+@@ -380,6 +380,9 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv)
+ 			usage();
+ 			return 0;
+ 		} else {
++			if (!**argv)
++				invarg("invalid filter name", *argv);
++
+ 			strncpy(k, *argv, sizeof(k)-1);
+ 
+ 			q = get_filter_kind(k);
+-- 
+2.20.1
+
diff --git a/SOURCES/0104-tipc-bearer-Prevent-NULL-pointer-dereference.patch b/SOURCES/0104-tipc-bearer-Prevent-NULL-pointer-dereference.patch
new file mode 100644
index 0000000..d4530f3
--- /dev/null
+++ b/SOURCES/0104-tipc-bearer-Prevent-NULL-pointer-dereference.patch
@@ -0,0 +1,35 @@
+From 73b2d3ee4bbdbfba7db035d9b89a2bcffc15e1ba Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:08 +0200
+Subject: [PATCH] tipc/bearer: Prevent NULL pointer dereference
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 70a6df3962b84
+
+commit 70a6df3962b8448fc9c28d72606828a004ed5b6b
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 24 11:46:34 2017 +0200
+
+    tipc/bearer: Prevent NULL pointer dereference
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ tipc/bearer.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tipc/bearer.c b/tipc/bearer.c
+index c3d4491f8f6ef..0d84570150624 100644
+--- a/tipc/bearer.c
++++ b/tipc/bearer.c
+@@ -439,7 +439,7 @@ static int cmd_bearer_enable(struct nlmsghdr *nlh, const struct cmd *cmd,
+ 		return err;
+ 
+ 	opt = get_opt(opts, "media");
+-	if (strcmp(opt->val, "udp") == 0) {
++	if (opt && strcmp(opt->val, "udp") == 0) {
+ 		err = nl_add_udp_enable_opts(nlh, opts, cmdl);
+ 		if (err)
+ 			return err;
+-- 
+2.20.1
+
diff --git a/SOURCES/0105-ipntable-Avoid-memory-allocation-for-filter.name.patch b/SOURCES/0105-ipntable-Avoid-memory-allocation-for-filter.name.patch
new file mode 100644
index 0000000..da866f9
--- /dev/null
+++ b/SOURCES/0105-ipntable-Avoid-memory-allocation-for-filter.name.patch
@@ -0,0 +1,58 @@
+From c176919cbf8f11f666c2281785e58fd147ecfea0 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:08 +0200
+Subject: [PATCH] ipntable: Avoid memory allocation for filter.name
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 45c2ec9e95fef
+
+commit 45c2ec9e95fef8eb6f0807d9a7e5f14c14313c7e
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 24 11:51:45 2017 +0200
+
+    ipntable: Avoid memory allocation for filter.name
+
+    The original issue was that filter.name might end up unterminated if
+    user provided string was too long. But in fact it is not necessary to
+    copy the commandline parameter at all: just make filter.name point to it
+    instead.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ ip/ipntable.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/ip/ipntable.c b/ip/ipntable.c
+index ae8c74ead2cb8..2f72c989f35df 100644
+--- a/ip/ipntable.c
++++ b/ip/ipntable.c
+@@ -37,7 +37,7 @@ static struct
+ 	int family;
+ 	int index;
+ #define NONE_DEV	(-1)
+-	char name[1024];
++	const char *name;
+ } filter;
+ 
+ static void usage(void) __attribute__((noreturn));
+@@ -367,7 +367,7 @@ static int print_ntable(const struct sockaddr_nl *who, struct nlmsghdr *n, void
+ 	if (tb[NDTA_NAME]) {
+ 		const char *name = rta_getattr_str(tb[NDTA_NAME]);
+ 
+-		if (strlen(filter.name) > 0 && strcmp(filter.name, name))
++		if (filter.name && strcmp(filter.name, name))
+ 			return 0;
+ 	}
+ 	if (tb[NDTA_PARMS]) {
+@@ -631,7 +631,7 @@ static int ipntable_show(int argc, char **argv)
+ 		} else if (strcmp(*argv, "name") == 0) {
+ 			NEXT_ARG();
+ 
+-			strncpy(filter.name, *argv, sizeof(filter.name));
++			filter.name = *argv;
+ 		} else
+ 			invarg("unknown", *argv);
+ 
+-- 
+2.20.1
+
diff --git a/SOURCES/0106-lib-fs-Fix-format-string-in-find_fs_mount.patch b/SOURCES/0106-lib-fs-Fix-format-string-in-find_fs_mount.patch
new file mode 100644
index 0000000..59d8032
--- /dev/null
+++ b/SOURCES/0106-lib-fs-Fix-format-string-in-find_fs_mount.patch
@@ -0,0 +1,39 @@
+From dfc6dc25fcc666ed3fa938bca5ccd87d6cf4a99e Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:08 +0200
+Subject: [PATCH] lib/fs: Fix format string in find_fs_mount()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit eab450789829e
+
+commit eab450789829e33a64dbd08dced3438d580d5179
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 24 11:51:46 2017 +0200
+
+    lib/fs: Fix format string in find_fs_mount()
+
+    A field width of 4096 allows fscanf() to store that amount of characters
+    into the given buffer, though that doesn't include the terminating NULL
+    byte. Decrease the value by one to leave space for it.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ lib/fs.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/lib/fs.c b/lib/fs.c
+index c59ac564581d0..1ff881ecfcd8c 100644
+--- a/lib/fs.c
++++ b/lib/fs.c
+@@ -45,7 +45,7 @@ static char *find_fs_mount(const char *fs_to_find)
+ 		return NULL;
+ 	}
+ 
+-	while (fscanf(fp, "%*s %4096s %127s %*s %*d %*d\n",
++	while (fscanf(fp, "%*s %4095s %127s %*s %*d %*d\n",
+ 		      path, fstype) == 2) {
+ 		if (strcmp(fstype, fs_to_find) == 0) {
+ 			mnt = strdup(path);
+-- 
+2.20.1
+
diff --git a/SOURCES/0107-lib-inet_proto-Review-inet_proto_-a2n-n2a.patch b/SOURCES/0107-lib-inet_proto-Review-inet_proto_-a2n-n2a.patch
new file mode 100644
index 0000000..3bce03d
--- /dev/null
+++ b/SOURCES/0107-lib-inet_proto-Review-inet_proto_-a2n-n2a.patch
@@ -0,0 +1,90 @@
+From e47b57df11565c51b9d8a5307a63d93f8e9a061b Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:08 +0200
+Subject: [PATCH] lib/inet_proto: Review inet_proto_{a2n,n2a}()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit cfda500a7d808
+
+commit cfda500a7d808a6e0f3eca47abd75c22cfe716e5
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 24 11:51:47 2017 +0200
+
+    lib/inet_proto: Review inet_proto_{a2n,n2a}()
+
+    The original intent was to make sure strings written by those functions
+    are NUL-terminated at all times, though it was suggested to get rid of
+    the 15 char protocol name limit as well which this patch accomplishes.
+
+    In addition to that, simplify inet_proto_a2n() a bit: Use the error
+    checking in get_u8() to find out whether passed 'buf' contains a valid
+    decimal number instead of checking the first character's value manually.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ lib/inet_proto.c | 24 +++++++++++++-----------
+ 1 file changed, 13 insertions(+), 11 deletions(-)
+
+diff --git a/lib/inet_proto.c b/lib/inet_proto.c
+index ceda082b12a2e..53c029039b6d5 100644
+--- a/lib/inet_proto.c
++++ b/lib/inet_proto.c
+@@ -25,7 +25,7 @@
+ 
+ const char *inet_proto_n2a(int proto, char *buf, int len)
+ {
+-	static char ncache[16];
++	static char *ncache;
+ 	static int icache = -1;
+ 	struct protoent *pe;
+ 
+@@ -34,9 +34,12 @@ const char *inet_proto_n2a(int proto, char *buf, int len)
+ 
+ 	pe = getprotobynumber(proto);
+ 	if (pe) {
++		if (icache != -1)
++			free(ncache);
+ 		icache = proto;
+-		strncpy(ncache, pe->p_name, 16);
+-		strncpy(buf, pe->p_name, len);
++		ncache = strdup(pe->p_name);
++		strncpy(buf, pe->p_name, len - 1);
++		buf[len - 1] = '\0';
+ 		return buf;
+ 	}
+ 	snprintf(buf, len, "ipproto-%d", proto);
+@@ -45,24 +48,23 @@ const char *inet_proto_n2a(int proto, char *buf, int len)
+ 
+ int inet_proto_a2n(const char *buf)
+ {
+-	static char ncache[16];
++	static char *ncache;
+ 	static int icache = -1;
+ 	struct protoent *pe;
++	__u8 ret;
+ 
+-	if (icache>=0 && strcmp(ncache, buf) == 0)
++	if (icache != -1 && strcmp(ncache, buf) == 0)
+ 		return icache;
+ 
+-	if (buf[0] >= '0' && buf[0] <= '9') {
+-		__u8 ret;
+-		if (get_u8(&ret, buf, 10))
+-			return -1;
++	if (!get_u8(&ret, buf, 10))
+ 		return ret;
+-	}
+ 
+ 	pe = getprotobyname(buf);
+ 	if (pe) {
++		if (icache != -1)
++			free(ncache);
+ 		icache = pe->p_proto;
+-		strncpy(ncache, pe->p_name, 16);
++		ncache = strdup(pe->p_name);
+ 		return pe->p_proto;
+ 	}
+ 	return -1;
+-- 
+2.20.1
+
diff --git a/SOURCES/0108-lnstat_util-Simplify-alloc_and_open-a-bit.patch b/SOURCES/0108-lnstat_util-Simplify-alloc_and_open-a-bit.patch
new file mode 100644
index 0000000..4a7541c
--- /dev/null
+++ b/SOURCES/0108-lnstat_util-Simplify-alloc_and_open-a-bit.patch
@@ -0,0 +1,44 @@
+From 5cdf4d78d15b127d0f4a7a09e4700d7df16dda19 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:08 +0200
+Subject: [PATCH] lnstat_util: Simplify alloc_and_open() a bit
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit bc27878d21909
+
+commit bc27878d21909b110dd21eea0c3505d023f29dc2
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 24 11:51:48 2017 +0200
+
+    lnstat_util: Simplify alloc_and_open() a bit
+
+    Relying upon callers and using unsafe strcpy() is probably not the best
+    idea. Aside from that, using snprintf() allows to format the string for
+    lf->path in one go.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ misc/lnstat_util.c | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
+
+diff --git a/misc/lnstat_util.c b/misc/lnstat_util.c
+index cc54598fe1bef..ec19238c24b94 100644
+--- a/misc/lnstat_util.c
++++ b/misc/lnstat_util.c
+@@ -180,11 +180,8 @@ static struct lnstat_file *alloc_and_open(const char *path, const char *file)
+ 	}
+ 
+ 	/* initialize */
+-	/* de->d_name is guaranteed to be <= NAME_MAX */
+-	strcpy(lf->basename, file);
+-	strcpy(lf->path, path);
+-	strcat(lf->path, "/");
+-	strcat(lf->path, lf->basename);
++	snprintf(lf->basename, sizeof(lf->basename), "%s", file);
++	snprintf(lf->path, sizeof(lf->path), "%s/%s", path, file);
+ 
+ 	/* initialize to default */
+ 	lf->interval.tv_sec = 1;
+-- 
+2.20.1
+
diff --git a/SOURCES/0109-tc-m_xt-Fix-for-potential-string-buffer-overflows.patch b/SOURCES/0109-tc-m_xt-Fix-for-potential-string-buffer-overflows.patch
new file mode 100644
index 0000000..c411268
--- /dev/null
+++ b/SOURCES/0109-tc-m_xt-Fix-for-potential-string-buffer-overflows.patch
@@ -0,0 +1,55 @@
+From 8ac8129d710b8a084ce213791874330aa30ec70e Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:08 +0200
+Subject: [PATCH] tc/m_xt: Fix for potential string buffer overflows
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 56270e54661e8
+
+commit 56270e54661e8ca51d4b3661b9f9bb12a0a40d95
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 24 11:51:49 2017 +0200
+
+    tc/m_xt: Fix for potential string buffer overflows
+
+    - Use strncpy() when writing to target->t->u.user.name and make sure the
+      final byte remains untouched (xtables_calloc() set it to zero).
+    - 'tname' length sanitization was completely wrong: If it's length
+      exceeded the 16 bytes available in 'k', passing a length value of 16
+      to strncpy() would overwrite the previously NULL'ed 'k[15]'. Also, the
+      sanitization has to happen if 'tname' is exactly 16 bytes long as
+      well.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ tc/m_xt.c | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/tc/m_xt.c b/tc/m_xt.c
+index ad52d239caf61..9218b14594403 100644
+--- a/tc/m_xt.c
++++ b/tc/m_xt.c
+@@ -95,7 +95,8 @@ build_st(struct xtables_target *target, struct xt_entry_target *t)
+ 	if (t == NULL) {
+ 		target->t = xtables_calloc(1, size);
+ 		target->t->u.target_size = size;
+-		strcpy(target->t->u.user.name, target->name);
++		strncpy(target->t->u.user.name, target->name,
++			sizeof(target->t->u.user.name) - 1);
+ 		target->t->u.user.revision = target->revision;
+ 
+ 		if (target->init != NULL)
+@@ -277,8 +278,8 @@ static int parse_ipt(struct action_util *a, int *argc_p,
+ 	}
+ 	fprintf(stdout, " index %d\n", index);
+ 
+-	if (strlen(tname) > 16) {
+-		size = 16;
++	if (strlen(tname) >= 16) {
++		size = 15;
+ 		k[15] = 0;
+ 	} else {
+ 		size = 1 + strlen(tname);
+-- 
+2.20.1
+
diff --git a/SOURCES/0110-lib-ll_map-Choose-size-of-new-cache-items-at-run-tim.patch b/SOURCES/0110-lib-ll_map-Choose-size-of-new-cache-items-at-run-tim.patch
new file mode 100644
index 0000000..3ea22e5
--- /dev/null
+++ b/SOURCES/0110-lib-ll_map-Choose-size-of-new-cache-items-at-run-tim.patch
@@ -0,0 +1,48 @@
+From 6ab89ff96d59c90cd6227399a065d52cc38e0ee7 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:08 +0200
+Subject: [PATCH] lib/ll_map: Choose size of new cache items at run-time
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 4b9e91782269f
+
+commit 4b9e91782269fc871d158ed4f11bfcfe4e3b8bf7
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 24 11:51:50 2017 +0200
+
+    lib/ll_map: Choose size of new cache items at run-time
+
+    Instead of having a fixed buffer of 16 bytes for the interface name,
+    tailor size of new ll_cache entry using the interface name's actual
+    length. This also makes sure the following call to strcpy() is safe.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ lib/ll_map.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/lib/ll_map.c b/lib/ll_map.c
+index 4e4556c9ac80b..70684b02042b6 100644
+--- a/lib/ll_map.c
++++ b/lib/ll_map.c
+@@ -30,7 +30,7 @@ struct ll_cache {
+ 	unsigned	flags;
+ 	unsigned 	index;
+ 	unsigned short	type;
+-	char		name[IFNAMSIZ];
++	char		name[];
+ };
+ 
+ #define IDXMAP_SIZE	1024
+@@ -120,7 +120,7 @@ int ll_remember_index(const struct sockaddr_nl *who,
+ 		return 0;
+ 	}
+ 
+-	im = malloc(sizeof(*im));
++	im = malloc(sizeof(*im) + strlen(ifname) + 1);
+ 	if (im == NULL)
+ 		return 0;
+ 	im->index = ifi->ifi_index;
+-- 
+2.20.1
+
diff --git a/SOURCES/0111-ss-Make-struct-tcpstat-fields-timer-and-timeout-unsi.patch b/SOURCES/0111-ss-Make-struct-tcpstat-fields-timer-and-timeout-unsi.patch
new file mode 100644
index 0000000..0561037
--- /dev/null
+++ b/SOURCES/0111-ss-Make-struct-tcpstat-fields-timer-and-timeout-unsi.patch
@@ -0,0 +1,58 @@
+From ca6a2e6f21fc48b494216a095f5bd792a0c6e35d Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:08 +0200
+Subject: [PATCH] ss: Make struct tcpstat fields 'timer' and 'timeout' unsigned
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 4cbf5224f2b50
+
+commit 4cbf5224f2b50a24e1873508e7a0f1f81cc81a81
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 24 11:41:26 2017 +0200
+
+    ss: Make struct tcpstat fields 'timer' and 'timeout' unsigned
+
+    Both 'timer' and 'timeout' variables of struct tcpstat are either
+    scanned as unsigned values from /proc/net/tcp{,6} or copied from
+    'idiag_timer' and 'idiag_expries' fields of struct inet_diag_msg, which
+    itself are unsigned. Therefore they may be unsigned as well, which
+    eliminates the need to check for negative values.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ misc/ss.c | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+diff --git a/misc/ss.c b/misc/ss.c
+index 7a38e9d830e8d..2a981d8b06918 100644
+--- a/misc/ss.c
++++ b/misc/ss.c
+@@ -716,8 +716,8 @@ struct dctcpstat {
+ 
+ struct tcpstat {
+ 	struct sockstat	    ss;
+-	int		    timer;
+-	int		    timeout;
++	unsigned int	    timer;
++	unsigned int	    timeout;
+ 	int		    probes;
+ 	char		    cong_alg[16];
+ 	double		    rto, ato, rtt, rttvar;
+@@ -903,13 +903,11 @@ static void sock_addr_print(const char *addr, char *delim, const char *port,
+ 	sock_addr_print_width(addr_width, addr, delim, serv_width, port, ifname);
+ }
+ 
+-static const char *print_ms_timer(int timeout)
++static const char *print_ms_timer(unsigned int timeout)
+ {
+ 	static char buf[64];
+ 	int secs, msecs, minutes;
+ 
+-	if (timeout < 0)
+-		timeout = 0;
+ 	secs = timeout/1000;
+ 	minutes = secs/60;
+ 	secs = secs%60;
+-- 
+2.20.1
+
diff --git a/SOURCES/0112-ss-Make-sure-scanned-index-value-to-unix_state_map-i.patch b/SOURCES/0112-ss-Make-sure-scanned-index-value-to-unix_state_map-i.patch
new file mode 100644
index 0000000..48630b2
--- /dev/null
+++ b/SOURCES/0112-ss-Make-sure-scanned-index-value-to-unix_state_map-i.patch
@@ -0,0 +1,36 @@
+From f92edf9b3d088bf8a5619073de43b2f693590be8 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:08 +0200
+Subject: [PATCH] ss: Make sure scanned index value to unix_state_map is sane
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 0aa03350c00d7
+
+commit 0aa03350c00d70edbbdab0662a2d8262be2bb68d
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 24 11:41:27 2017 +0200
+
+    ss: Make sure scanned index value to unix_state_map is sane
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ misc/ss.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/misc/ss.c b/misc/ss.c
+index 2a981d8b06918..fdb00a9f3f696 100644
+--- a/misc/ss.c
++++ b/misc/ss.c
+@@ -3236,7 +3236,8 @@ static int unix_show(struct filter *f)
+ 
+ 		if (flags & (1 << 16)) {
+ 			u->state = SS_LISTEN;
+-		} else {
++		} else if (u->state > 0 &&
++			   u->state <= ARRAY_SIZE(unix_state_map)) {
+ 			u->state = unix_state_map[u->state-1];
+ 			if (u->type == SOCK_DGRAM && u->state == SS_CLOSE && u->rport)
+ 				u->state = SS_ESTABLISHED;
+-- 
+2.20.1
+
diff --git a/SOURCES/0113-netem-maketable-Check-return-value-of-fscanf.patch b/SOURCES/0113-netem-maketable-Check-return-value-of-fscanf.patch
new file mode 100644
index 0000000..bf2b9b5
--- /dev/null
+++ b/SOURCES/0113-netem-maketable-Check-return-value-of-fscanf.patch
@@ -0,0 +1,37 @@
+From d533a60518e79593c6a1813a6f44aa3889045120 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:08 +0200
+Subject: [PATCH] netem/maketable: Check return value of fscanf()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 92963d136de8c
+
+commit 92963d136de8c370324716add98888b2ce6e6a94
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 24 11:41:28 2017 +0200
+
+    netem/maketable: Check return value of fscanf()
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ netem/maketable.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/netem/maketable.c b/netem/maketable.c
+index ad660e7d457f0..ccb8f0c68b062 100644
+--- a/netem/maketable.c
++++ b/netem/maketable.c
+@@ -38,8 +38,8 @@ readdoubles(FILE *fp, int *number)
+ 	}
+ 
+ 	for (i=0; i<limit; ++i){
+-		fscanf(fp, "%lf", &x[i]);
+-		if (feof(fp))
++		if (fscanf(fp, "%lf", &x[i]) != 1 ||
++		    feof(fp))
+ 			break;
+ 		++n;
+ 	}
+-- 
+2.20.1
+
diff --git a/SOURCES/0114-lib-bpf-Check-return-value-of-write.patch b/SOURCES/0114-lib-bpf-Check-return-value-of-write.patch
new file mode 100644
index 0000000..728cf10
--- /dev/null
+++ b/SOURCES/0114-lib-bpf-Check-return-value-of-write.patch
@@ -0,0 +1,40 @@
+From 78f4b87c3f014e378377d3ecc55d1ec46cd57b51 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:08 +0200
+Subject: [PATCH] lib/bpf: Check return value of write()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit b5c78e1b2c868
+
+commit b5c78e1b2c8681e82684f47563acd3d383893658
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 24 11:41:29 2017 +0200
+
+    lib/bpf: Check return value of write()
+
+    This is merely to silence the compiler warning. If write to stderr
+    failed, assume that printing an error message will fail as well so don't
+    even try.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ lib/bpf.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/lib/bpf.c b/lib/bpf.c
+index 33c5288e82187..7eb754ad7cb56 100644
+--- a/lib/bpf.c
++++ b/lib/bpf.c
+@@ -486,7 +486,8 @@ int bpf_trace_pipe(void)
+ 
+ 		ret = read(fd, buff, sizeof(buff) - 1);
+ 		if (ret > 0) {
+-			write(2, buff, ret);
++			if (write(STDERR_FILENO, buff, ret) != ret)
++				return -1;
+ 			fflush(stderr);
+ 		}
+ 	}
+-- 
+2.20.1
+
diff --git a/SOURCES/0115-lib-fs-Fix-and-simplify-make_path.patch b/SOURCES/0115-lib-fs-Fix-and-simplify-make_path.patch
new file mode 100644
index 0000000..3137352
--- /dev/null
+++ b/SOURCES/0115-lib-fs-Fix-and-simplify-make_path.patch
@@ -0,0 +1,65 @@
+From 7ab899539b920609712ad24f871b50a19fd8189f Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:08 +0200
+Subject: [PATCH] lib/fs: Fix and simplify make_path()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit ac3415f5c1b1d
+
+commit ac3415f5c1b1df2d6a4bf770ad52e2e14c09e58e
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 24 11:41:30 2017 +0200
+
+    lib/fs: Fix and simplify make_path()
+
+    Calling stat() before mkdir() is racey: The entry might change in
+    between. Also, the call to stat() seems to exist only to check if the
+    directory exists already. So simply call mkdir() unconditionally and
+    catch only errors other than EEXIST.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ lib/fs.c | 20 +++++---------------
+ 1 file changed, 5 insertions(+), 15 deletions(-)
+
+diff --git a/lib/fs.c b/lib/fs.c
+index 1ff881ecfcd8c..ebe05cd44e11b 100644
+--- a/lib/fs.c
++++ b/lib/fs.c
+@@ -102,7 +102,6 @@ out:
+ int make_path(const char *path, mode_t mode)
+ {
+ 	char *dir, *delim;
+-	struct stat sbuf;
+ 	int rc = -1;
+ 
+ 	delim = dir = strdup(path);
+@@ -120,20 +119,11 @@ int make_path(const char *path, mode_t mode)
+ 		if (delim)
+ 			*delim = '\0';
+ 
+-		if (stat(dir, &sbuf) != 0) {
+-			if (errno != ENOENT) {
+-				fprintf(stderr,
+-					"stat failed for %s: %s\n",
+-					dir, strerror(errno));
+-				goto out;
+-			}
+-
+-			if (mkdir(dir, mode) != 0) {
+-				fprintf(stderr,
+-					"mkdir failed for %s: %s\n",
+-					dir, strerror(errno));
+-				goto out;
+-			}
++		rc = mkdir(dir, mode);
++		if (mkdir(dir, mode) != 0 && errno != EEXIST) {
++			fprintf(stderr, "mkdir failed for %s: %s\n",
++				dir, strerror(errno));
++			goto out;
+ 		}
+ 
+ 		if (delim == NULL)
+-- 
+2.20.1
+
diff --git a/SOURCES/0116-lib-libnetlink-Don-t-pass-NULL-parameter-to-memcpy.patch b/SOURCES/0116-lib-libnetlink-Don-t-pass-NULL-parameter-to-memcpy.patch
new file mode 100644
index 0000000..dcbfc2f
--- /dev/null
+++ b/SOURCES/0116-lib-libnetlink-Don-t-pass-NULL-parameter-to-memcpy.patch
@@ -0,0 +1,49 @@
+From 8af39fdff4f966d00571bda2610eac8fae2f7482 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:08 +0200
+Subject: [PATCH] lib/libnetlink: Don't pass NULL parameter to memcpy()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 893deac4c43b5
+
+commit 893deac4c43b57ae49f736ec050724b6de181062
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 24 11:41:31 2017 +0200
+
+    lib/libnetlink: Don't pass NULL parameter to memcpy()
+
+    Both addattr_l() and rta_addattr_l() may be called with NULL data
+    pointer and 0 alen parameters. Avoid calling memcpy() in that case.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ lib/libnetlink.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/lib/libnetlink.c b/lib/libnetlink.c
+index 75e20abf0b97f..ff26ddf50552b 100644
+--- a/lib/libnetlink.c
++++ b/lib/libnetlink.c
+@@ -898,7 +898,8 @@ int addattr_l(struct nlmsghdr *n, int maxlen, int type, const void *data,
+ 	rta = NLMSG_TAIL(n);
+ 	rta->rta_type = type;
+ 	rta->rta_len = len;
+-	memcpy(RTA_DATA(rta), data, alen);
++	if (alen)
++		memcpy(RTA_DATA(rta), data, alen);
+ 	n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + RTA_ALIGN(len);
+ 	return 0;
+ }
+@@ -985,7 +986,8 @@ int rta_addattr_l(struct rtattr *rta, int maxlen, int type,
+ 	subrta = (struct rtattr *)(((char *)rta) + RTA_ALIGN(rta->rta_len));
+ 	subrta->rta_type = type;
+ 	subrta->rta_len = len;
+-	memcpy(RTA_DATA(subrta), data, alen);
++	if (alen)
++		memcpy(RTA_DATA(subrta), data, alen);
+ 	rta->rta_len = NLMSG_ALIGN(rta->rta_len) + RTA_ALIGN(len);
+ 	return 0;
+ }
+-- 
+2.20.1
+
diff --git a/SOURCES/0117-utils-Implement-strlcpy-and-strlcat.patch b/SOURCES/0117-utils-Implement-strlcpy-and-strlcat.patch
new file mode 100644
index 0000000..660b433
--- /dev/null
+++ b/SOURCES/0117-utils-Implement-strlcpy-and-strlcat.patch
@@ -0,0 +1,65 @@
+From 3bcdea42e7402e79a914fe3cbefdcc1caa89464c Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:08 +0200
+Subject: [PATCH] utils: Implement strlcpy() and strlcat()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 8d15e012a3227
+
+commit 8d15e012a3227d79295cd95582bb6d8a6f0bdc92
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Fri Sep 1 18:52:51 2017 +0200
+
+    utils: Implement strlcpy() and strlcat()
+
+    By making use of strncpy(), both implementations are really simple so
+    there is no need to add libbsd as additional dependency.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ include/utils.h |  3 +++
+ lib/utils.c     | 19 +++++++++++++++++++
+ 2 files changed, 22 insertions(+)
+
+diff --git a/include/utils.h b/include/utils.h
+index d707a9dacdb85..d596a6fc10574 100644
+--- a/include/utils.h
++++ b/include/utils.h
+@@ -264,4 +264,7 @@ int make_path(const char *path, mode_t mode);
+ char *find_cgroup2_mount(void);
+ int get_command_name(const char *pid, char *comm, size_t len);
+ 
++size_t strlcpy(char *dst, const char *src, size_t size);
++size_t strlcat(char *dst, const char *src, size_t size);
++
+ #endif /* __UTILS_H__ */
+diff --git a/lib/utils.c b/lib/utils.c
+index fc9c575ba0c7d..c9ba2f332c2a7 100644
+--- a/lib/utils.c
++++ b/lib/utils.c
+@@ -1228,3 +1228,22 @@ int get_real_family(int rtm_type, int rtm_family)
+ 
+ 	return rtm_family;
+ }
++
++size_t strlcpy(char *dst, const char *src, size_t size)
++{
++	if (size) {
++		strncpy(dst, src, size - 1);
++		dst[size - 1] = '\0';
++	}
++	return strlen(src);
++}
++
++size_t strlcat(char *dst, const char *src, size_t size)
++{
++	size_t dlen = strlen(dst);
++
++	if (dlen > size)
++		return dlen + strlen(src);
++
++	return dlen + strlcpy(dst + dlen, src, size - dlen);
++}
+-- 
+2.20.1
+
diff --git a/SOURCES/0118-Convert-the-obvious-cases-to-strlcpy.patch b/SOURCES/0118-Convert-the-obvious-cases-to-strlcpy.patch
new file mode 100644
index 0000000..200a2d8
--- /dev/null
+++ b/SOURCES/0118-Convert-the-obvious-cases-to-strlcpy.patch
@@ -0,0 +1,135 @@
+From e557cf7984d2f06aff158a9089e714e5f445d3ac Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:08:08 +0200
+Subject: [PATCH] Convert the obvious cases to strlcpy()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 18f156bfecda2
+Conflicts:
+* on iproute_lwtunnel.c, due to missing commit
+  e8493916a8ede ("iproute: add support for SR-IPv6 lwtunnel encapsulation")
+* on lib/bpf.c, due to missing commit
+  95ae9a4870e7d ("bpf: fix mnt path when from env")
+  fix bpf_find_mntpt() in this case, instead.
+
+commit 18f156bfecda20166c2fb543ba8c9c6559edef9c
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Fri Sep 1 18:52:52 2017 +0200
+
+    Convert the obvious cases to strlcpy()
+
+    This converts the typical idiom of manually terminating the buffer after
+    a call to strncpy().
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ ip/ipnetns.c     | 3 +--
+ ip/ipvrf.c       | 3 +--
+ lib/bpf.c        | 3 +--
+ lib/fs.c         | 3 +--
+ lib/inet_proto.c | 3 +--
+ misc/ss.c        | 3 +--
+ tc/em_ipset.c    | 3 +--
+ 7 files changed, 7 insertions(+), 14 deletions(-)
+
+diff --git a/ip/ipnetns.c b/ip/ipnetns.c
+index 1c0ade90dee5e..427b59c57381d 100644
+--- a/ip/ipnetns.c
++++ b/ip/ipnetns.c
+@@ -523,8 +523,7 @@ int netns_identify_pid(const char *pidstr, char *name, int len)
+ 
+ 		if ((st.st_dev == netst.st_dev) &&
+ 		    (st.st_ino == netst.st_ino)) {
+-			strncpy(name, entry->d_name, len - 1);
+-			name[len - 1] = '\0';
++			strlcpy(name, entry->d_name, len);
+ 		}
+ 	}
+ 	closedir(dir);
+diff --git a/ip/ipvrf.c b/ip/ipvrf.c
+index ae3b48fa81996..f58c8df728265 100644
+--- a/ip/ipvrf.c
++++ b/ip/ipvrf.c
+@@ -333,8 +333,7 @@ static int vrf_path(char *vpath, size_t len)
+ 		if (vrf)
+ 			*vrf = '\0';
+ 
+-		strncpy(vpath, start, len - 1);
+-		vpath[len - 1] = '\0';
++		strlcpy(vpath, start, len);
+ 
+ 		/* if vrf path is just / then return nothing */
+ 		if (!strcmp(vpath, "/"))
+diff --git a/lib/bpf.c b/lib/bpf.c
+index 7eb754ad7cb56..e072cba214067 100644
+--- a/lib/bpf.c
++++ b/lib/bpf.c
+@@ -424,8 +424,7 @@ static const char *bpf_find_mntpt(const char *fstype, unsigned long magic,
+ 		ptr = known_mnts;
+ 		while (*ptr) {
+ 			if (bpf_valid_mntpt(*ptr, magic) == 0) {
+-				strncpy(mnt, *ptr, len - 1);
+-				mnt[len - 1] = 0;
++				strlcpy(mnt, *ptr, len);
+ 				return mnt;
+ 			}
+ 			ptr++;
+diff --git a/lib/fs.c b/lib/fs.c
+index ebe05cd44e11b..86efd4ed2ed80 100644
+--- a/lib/fs.c
++++ b/lib/fs.c
+@@ -172,8 +172,7 @@ int get_command_name(const char *pid, char *comm, size_t len)
+ 		if (nl)
+ 			*nl = '\0';
+ 
+-		strncpy(comm, name, len - 1);
+-		comm[len - 1] = '\0';
++		strlcpy(comm, name, len);
+ 		break;
+ 	}
+ 
+diff --git a/lib/inet_proto.c b/lib/inet_proto.c
+index 53c029039b6d5..bdfd52fdafe5a 100644
+--- a/lib/inet_proto.c
++++ b/lib/inet_proto.c
+@@ -38,8 +38,7 @@ const char *inet_proto_n2a(int proto, char *buf, int len)
+ 			free(ncache);
+ 		icache = proto;
+ 		ncache = strdup(pe->p_name);
+-		strncpy(buf, pe->p_name, len - 1);
+-		buf[len - 1] = '\0';
++		strlcpy(buf, pe->p_name, len);
+ 		return buf;
+ 	}
+ 	snprintf(buf, len, "ipproto-%d", proto);
+diff --git a/misc/ss.c b/misc/ss.c
+index fdb00a9f3f696..6aaae1b5390e4 100644
+--- a/misc/ss.c
++++ b/misc/ss.c
+@@ -444,8 +444,7 @@ static void user_ent_hash_build(void)
+ 
+ 	user_ent_hash_build_init = 1;
+ 
+-	strncpy(name, root, sizeof(name)-1);
+-	name[sizeof(name)-1] = 0;
++	strlcpy(name, root, sizeof(name));
+ 
+ 	if (strlen(name) == 0 || name[strlen(name)-1] != '/')
+ 		strcat(name, "/");
+diff --git a/tc/em_ipset.c b/tc/em_ipset.c
+index b59756515d239..48b287f5ba3b2 100644
+--- a/tc/em_ipset.c
++++ b/tc/em_ipset.c
+@@ -145,8 +145,7 @@ get_set_byname(const char *setname, struct xt_set_info *info)
+ 	int res;
+ 
+ 	req.op = IP_SET_OP_GET_BYNAME;
+-	strncpy(req.set.name, setname, IPSET_MAXNAMELEN);
+-	req.set.name[IPSET_MAXNAMELEN - 1] = '\0';
++	strlcpy(req.set.name, setname, IPSET_MAXNAMELEN);
+ 	res = do_getsockopt(&req);
+ 	if (res != 0)
+ 		return -1;
+-- 
+2.20.1
+
diff --git a/SOURCES/0119-Convert-harmful-calls-to-strncpy-to-strlcpy.patch b/SOURCES/0119-Convert-harmful-calls-to-strncpy-to-strlcpy.patch
new file mode 100644
index 0000000..ee6b156
--- /dev/null
+++ b/SOURCES/0119-Convert-harmful-calls-to-strncpy-to-strlcpy.patch
@@ -0,0 +1,66 @@
+From 9556150792daf8f2fbea934bcb77b4b74a21b2e1 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:09:12 +0200
+Subject: [PATCH] Convert harmful calls to strncpy() to strlcpy()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 532b8874fe545
+
+commit 532b8874fe545acaa8d45c4dd3b54b8f3bb41d9f
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Fri Sep 1 18:52:53 2017 +0200
+
+    Convert harmful calls to strncpy() to strlcpy()
+
+    This patch converts spots where manual buffer termination was missing to
+    strlcpy() since that does what is needed.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ genl/ctrl.c     | 2 +-
+ ip/ipvrf.c      | 2 +-
+ ip/xfrm_state.c | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/genl/ctrl.c b/genl/ctrl.c
+index 21e857cfcfc25..a6d31b04e5679 100644
+--- a/genl/ctrl.c
++++ b/genl/ctrl.c
+@@ -317,7 +317,7 @@ static int ctrl_list(int cmd, int argc, char **argv)
+ 
+ 		if (matches(*argv, "name") == 0) {
+ 			NEXT_ARG();
+-			strncpy(d, *argv, sizeof (d) - 1);
++			strlcpy(d, *argv, sizeof(d));
+ 			addattr_l(nlh, 128, CTRL_ATTR_FAMILY_NAME,
+ 				  d, strlen(d) + 1);
+ 		} else if (matches(*argv, "id") == 0) {
+diff --git a/ip/ipvrf.c b/ip/ipvrf.c
+index f58c8df728265..406cddbcd44ca 100644
+--- a/ip/ipvrf.c
++++ b/ip/ipvrf.c
+@@ -71,7 +71,7 @@ static int vrf_identify(pid_t pid, char *name, size_t len)
+ 			if (end)
+ 				*end = '\0';
+ 
+-			strncpy(name, vrf, len - 1);
++			strlcpy(name, vrf, len);
+ 			break;
+ 		}
+ 	}
+diff --git a/ip/xfrm_state.c b/ip/xfrm_state.c
+index 04ed3492ad3b5..2222737cdd98d 100644
+--- a/ip/xfrm_state.c
++++ b/ip/xfrm_state.c
+@@ -123,7 +123,7 @@ static int xfrm_algo_parse(struct xfrm_algo *alg, enum xfrm_attr_type_t type,
+ 	fprintf(stderr, "warning: ALGO-NAME/ALGO-KEYMAT values will be sent to the kernel promiscuously! (verifying them isn't implemented yet)\n");
+ #endif
+ 
+-	strncpy(alg->alg_name, name, sizeof(alg->alg_name));
++	strlcpy(alg->alg_name, name, sizeof(alg->alg_name));
+ 
+ 	if (slen > 2 && strncmp(key, "0x", 2) == 0) {
+ 		/* split two chars "0x" from the top */
+-- 
+2.20.1
+
diff --git a/SOURCES/0120-ipxfrm-Replace-STRBUF_CAT-macro-with-strlcat.patch b/SOURCES/0120-ipxfrm-Replace-STRBUF_CAT-macro-with-strlcat.patch
new file mode 100644
index 0000000..ea251a2
--- /dev/null
+++ b/SOURCES/0120-ipxfrm-Replace-STRBUF_CAT-macro-with-strlcat.patch
@@ -0,0 +1,75 @@
+From 65d69021e5b8998cec1e7a13b8b297bfc606f9fd Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:09:12 +0200
+Subject: [PATCH] ipxfrm: Replace STRBUF_CAT macro with strlcat()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 44cc6c792a650
+
+commit 44cc6c792a6503e024f042c65f35cd44b3283b20
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Fri Sep 1 18:52:54 2017 +0200
+
+    ipxfrm: Replace STRBUF_CAT macro with strlcat()
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ ip/ipxfrm.c | 21 +++++----------------
+ 1 file changed, 5 insertions(+), 16 deletions(-)
+
+diff --git a/ip/ipxfrm.c b/ip/ipxfrm.c
+index b0cfac178f8bc..df72a0c0bf88e 100644
+--- a/ip/ipxfrm.c
++++ b/ip/ipxfrm.c
+@@ -40,17 +40,6 @@
+ #include "ip_common.h"
+ 
+ #define STRBUF_SIZE	(128)
+-#define STRBUF_CAT(buf, str) \
+-	do { \
+-		int rest = sizeof(buf) - 1 - strlen(buf); \
+-		if (rest > 0) { \
+-			int len = strlen(str); \
+-			if (len > rest) \
+-				len = rest; \
+-			strncat(buf, str, len); \
+-			buf[sizeof(buf) - 1] = '\0'; \
+-		} \
+-	} while (0);
+ 
+ struct xfrm_filter filter;
+ 
+@@ -883,8 +872,8 @@ void xfrm_state_info_print(struct xfrm_usersa_info *xsinfo,
+ 			   prefix, title);
+ 
+ 	if (prefix)
+-		STRBUF_CAT(buf, prefix);
+-	STRBUF_CAT(buf, "\t");
++		strlcat(buf, prefix, sizeof(buf));
++	strlcat(buf, "\t", sizeof(buf));
+ 
+ 	fputs(buf, fp);
+ 	fprintf(fp, "replay-window %u ", xsinfo->replay_window);
+@@ -925,7 +914,7 @@ void xfrm_state_info_print(struct xfrm_usersa_info *xsinfo,
+ 		char sbuf[STRBUF_SIZE];
+ 
+ 		memcpy(sbuf, buf, sizeof(sbuf));
+-		STRBUF_CAT(sbuf, "sel ");
++		strlcat(sbuf, "sel ", sizeof(sbuf));
+ 
+ 		xfrm_selector_print(&xsinfo->sel, xsinfo->family, fp, sbuf);
+ 	}
+@@ -973,8 +962,8 @@ void xfrm_policy_info_print(struct xfrm_userpolicy_info *xpinfo,
+ 	}
+ 
+ 	if (prefix)
+-		STRBUF_CAT(buf, prefix);
+-	STRBUF_CAT(buf, "\t");
++		strlcat(buf, prefix, sizeof(buf));
++	strlcat(buf, "\t", sizeof(buf));
+ 
+ 	fputs(buf, fp);
+ 	if (xpinfo->dir >= XFRM_POLICY_MAX) {
+-- 
+2.20.1
+
diff --git a/SOURCES/0121-tc_util-No-need-to-terminate-an-snprintf-ed-buffer.patch b/SOURCES/0121-tc_util-No-need-to-terminate-an-snprintf-ed-buffer.patch
new file mode 100644
index 0000000..da2efeb
--- /dev/null
+++ b/SOURCES/0121-tc_util-No-need-to-terminate-an-snprintf-ed-buffer.patch
@@ -0,0 +1,37 @@
+From 42b9cc605f54f2a3ad75a29b5f2fc308bfe5fc61 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:09:12 +0200
+Subject: [PATCH] tc_util: No need to terminate an snprintf'ed buffer
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 9376314b49a47
+
+commit 9376314b49a47eb42ade3fc0d41cb51438f8dbc6
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Fri Sep 1 18:52:55 2017 +0200
+
+    tc_util: No need to terminate an snprintf'ed buffer
+
+    snprintf() won't leave the buffer unterminated, so manually terminating
+    is not necessary here.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ tc/tc_util.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/tc/tc_util.c b/tc/tc_util.c
+index 24ca1f1c1c040..296825ae174e0 100644
+--- a/tc/tc_util.c
++++ b/tc/tc_util.c
+@@ -430,7 +430,6 @@ const char *action_n2a(int action)
+ 		return "stolen";
+ 	default:
+ 		snprintf(buf, 64, "%d", action);
+-		buf[63] = '\0';
+ 		return buf;
+ 	}
+ }
+-- 
+2.20.1
+
diff --git a/SOURCES/0122-lnstat_util-Make-sure-buffer-is-NUL-terminated.patch b/SOURCES/0122-lnstat_util-Make-sure-buffer-is-NUL-terminated.patch
new file mode 100644
index 0000000..20ccdc3
--- /dev/null
+++ b/SOURCES/0122-lnstat_util-Make-sure-buffer-is-NUL-terminated.patch
@@ -0,0 +1,40 @@
+From ed508c9ee5991655039d2b080191b1c70680b5c8 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:09:12 +0200
+Subject: [PATCH] lnstat_util: Make sure buffer is NUL-terminated
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit bc4a57b87990b
+
+commit bc4a57b87990b30c85fdf0efbc1f8f219466daf4
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Fri Sep 1 18:52:56 2017 +0200
+
+    lnstat_util: Make sure buffer is NUL-terminated
+
+    Can't use strlcpy() here since lnstat is not linked against libutil.
+
+    While being at it, fix coding style in that chunk as well.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ misc/lnstat_util.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/misc/lnstat_util.c b/misc/lnstat_util.c
+index ec19238c24b94..c2dc42ec1ff12 100644
+--- a/misc/lnstat_util.c
++++ b/misc/lnstat_util.c
+@@ -150,7 +150,8 @@ static int lnstat_scan_compat_rtstat_fields(struct lnstat_file *lf)
+ {
+ 	char buf[FGETS_BUF_SIZE];
+ 
+-	strncpy(buf, RTSTAT_COMPAT_LINE, sizeof(buf)-1);
++	strncpy(buf, RTSTAT_COMPAT_LINE, sizeof(buf) - 1);
++	buf[sizeof(buf) - 1] = '\0';
+ 
+ 	return __lnstat_scan_fields(lf, buf);
+ }
+-- 
+2.20.1
+
diff --git a/SOURCES/0123-utils-strlcpy-and-strlcat-don-t-clobber-dst.patch b/SOURCES/0123-utils-strlcpy-and-strlcat-don-t-clobber-dst.patch
new file mode 100644
index 0000000..230f3a6
--- /dev/null
+++ b/SOURCES/0123-utils-strlcpy-and-strlcat-don-t-clobber-dst.patch
@@ -0,0 +1,62 @@
+From 866b995355894ab8f20d22a554d47322dcf1029a Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:09:13 +0200
+Subject: [PATCH] utils: strlcpy() and strlcat() don't clobber dst
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 50ea3c64384b1
+
+commit 50ea3c64384b1d1bfa9c96de86c21ac8e9fef183
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Wed Sep 6 18:51:42 2017 +0200
+
+    utils: strlcpy() and strlcat() don't clobber dst
+
+    As David Laight correctly pointed out, the first version of strlcpy()
+    modified dst buffer behind the string copied into it. Fix this by
+    writing NUL to the byte immediately following src string instead of to
+    the last byte in dst. Doing so also allows to reduce overhead by using
+    memcpy().
+
+    Improve strlcat() by avoiding the call to strlcpy() if dst string is
+    already full, not just as sanity check.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ lib/utils.c | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+diff --git a/lib/utils.c b/lib/utils.c
+index c9ba2f332c2a7..228d97bfe5e9b 100644
+--- a/lib/utils.c
++++ b/lib/utils.c
+@@ -1231,18 +1231,22 @@ int get_real_family(int rtm_type, int rtm_family)
+ 
+ size_t strlcpy(char *dst, const char *src, size_t size)
+ {
++	size_t srclen = strlen(src);
++
+ 	if (size) {
+-		strncpy(dst, src, size - 1);
+-		dst[size - 1] = '\0';
++		size_t minlen = min(srclen, size - 1);
++
++		memcpy(dst, src, minlen);
++		dst[minlen] = '\0';
+ 	}
+-	return strlen(src);
++	return srclen;
+ }
+ 
+ size_t strlcat(char *dst, const char *src, size_t size)
+ {
+ 	size_t dlen = strlen(dst);
+ 
+-	if (dlen > size)
++	if (dlen >= size)
+ 		return dlen + strlen(src);
+ 
+ 	return dlen + strlcpy(dst + dlen, src, size - dlen);
+-- 
+2.20.1
+
diff --git a/SOURCES/0124-ip-6-tunnel-Avoid-copying-user-supplied-interface-na.patch b/SOURCES/0124-ip-6-tunnel-Avoid-copying-user-supplied-interface-na.patch
new file mode 100644
index 0000000..8881924
--- /dev/null
+++ b/SOURCES/0124-ip-6-tunnel-Avoid-copying-user-supplied-interface-na.patch
@@ -0,0 +1,152 @@
+From 74331750f118690ca3c375e52b10272b992320e7 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:09:13 +0200
+Subject: [PATCH] ip{6, }tunnel: Avoid copying user-supplied interface name
+ around
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 26111ab1dba82
+
+commit 26111ab1dba820421ccaf283ac097a79b95023a2
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Mon Oct 2 13:46:35 2017 +0200
+
+    ip{6, }tunnel: Avoid copying user-supplied interface name around
+
+    In both files' parse_args() functions as well as in iptunnel's do_prl()
+    and do_6rd() functions, a user-supplied 'dev' parameter is uselessly
+    copied into a temporary buffer before passing it to ll_name_to_index()
+    or copying into a struct ifreq.  Avoid this by just caching the argv
+    pointer value until the later lookup/strcpy.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ ip/ip6tunnel.c |  6 +++---
+ ip/iptunnel.c  | 22 +++++++++-------------
+ 2 files changed, 12 insertions(+), 16 deletions(-)
+
+diff --git a/ip/ip6tunnel.c b/ip/ip6tunnel.c
+index b4a7def144226..c12d700e74189 100644
+--- a/ip/ip6tunnel.c
++++ b/ip/ip6tunnel.c
+@@ -136,7 +136,7 @@ static void print_tunnel(struct ip6_tnl_parm2 *p)
+ static int parse_args(int argc, char **argv, int cmd, struct ip6_tnl_parm2 *p)
+ {
+ 	int count = 0;
+-	char medium[IFNAMSIZ] = {};
++	const char *medium = NULL;
+ 
+ 	while (argc > 0) {
+ 		if (strcmp(*argv, "mode") == 0) {
+@@ -180,7 +180,7 @@ static int parse_args(int argc, char **argv, int cmd, struct ip6_tnl_parm2 *p)
+ 			memcpy(&p->laddr, &laddr.data, sizeof(p->laddr));
+ 		} else if (strcmp(*argv, "dev") == 0) {
+ 			NEXT_ARG();
+-			strncpy(medium, *argv, IFNAMSIZ - 1);
++			medium = *argv;
+ 		} else if (strcmp(*argv, "encaplimit") == 0) {
+ 			NEXT_ARG();
+ 			if (strcmp(*argv, "none") == 0) {
+@@ -285,7 +285,7 @@ static int parse_args(int argc, char **argv, int cmd, struct ip6_tnl_parm2 *p)
+ 		count++;
+ 		argc--; argv++;
+ 	}
+-	if (medium[0]) {
++	if (medium) {
+ 		p->link = ll_name_to_index(medium);
+ 		if (p->link == 0) {
+ 			fprintf(stderr, "Cannot find device \"%s\"\n", medium);
+diff --git a/ip/iptunnel.c b/ip/iptunnel.c
+index 105d0f5576f1a..0acfd0793d3cd 100644
+--- a/ip/iptunnel.c
++++ b/ip/iptunnel.c
+@@ -60,7 +60,7 @@ static void set_tunnel_proto(struct ip_tunnel_parm *p, int proto)
+ static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p)
+ {
+ 	int count = 0;
+-	char medium[IFNAMSIZ] = {};
++	const char *medium = NULL;
+ 	int isatap = 0;
+ 
+ 	memset(p, 0, sizeof(*p));
+@@ -139,7 +139,7 @@ static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p)
+ 				p->iph.saddr = htonl(INADDR_ANY);
+ 		} else if (strcmp(*argv, "dev") == 0) {
+ 			NEXT_ARG();
+-			strncpy(medium, *argv, IFNAMSIZ - 1);
++			medium = *argv;
+ 		} else if (strcmp(*argv, "ttl") == 0 ||
+ 			   strcmp(*argv, "hoplimit") == 0 ||
+ 			   strcmp(*argv, "hlim") == 0) {
+@@ -216,7 +216,7 @@ static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p)
+ 		}
+ 	}
+ 
+-	if (medium[0]) {
++	if (medium) {
+ 		p->link = ll_name_to_index(medium);
+ 		if (p->link == 0) {
+ 			fprintf(stderr, "Cannot find device \"%s\"\n", medium);
+@@ -465,9 +465,8 @@ static int do_prl(int argc, char **argv)
+ {
+ 	struct ip_tunnel_prl p = {};
+ 	int count = 0;
+-	int devname = 0;
+ 	int cmd = 0;
+-	char medium[IFNAMSIZ] = {};
++	const char *medium = NULL;
+ 
+ 	while (argc > 0) {
+ 		if (strcmp(*argv, "prl-default") == 0) {
+@@ -488,8 +487,7 @@ static int do_prl(int argc, char **argv)
+ 			count++;
+ 		} else if (strcmp(*argv, "dev") == 0) {
+ 			NEXT_ARG();
+-			strncpy(medium, *argv, IFNAMSIZ-1);
+-			devname++;
++			medium = *argv;
+ 		} else {
+ 			fprintf(stderr,
+ 				"Invalid PRL parameter \"%s\"\n", *argv);
+@@ -502,7 +500,7 @@ static int do_prl(int argc, char **argv)
+ 		}
+ 		argc--; argv++;
+ 	}
+-	if (devname == 0) {
++	if (!medium) {
+ 		fprintf(stderr, "Must specify device\n");
+ 		exit(-1);
+ 	}
+@@ -513,9 +511,8 @@ static int do_prl(int argc, char **argv)
+ static int do_6rd(int argc, char **argv)
+ {
+ 	struct ip_tunnel_6rd ip6rd = {};
+-	int devname = 0;
+ 	int cmd = 0;
+-	char medium[IFNAMSIZ] = {};
++	const char *medium = NULL;
+ 	inet_prefix prefix;
+ 
+ 	while (argc > 0) {
+@@ -537,8 +534,7 @@ static int do_6rd(int argc, char **argv)
+ 			cmd = SIOCDEL6RD;
+ 		} else if (strcmp(*argv, "dev") == 0) {
+ 			NEXT_ARG();
+-			strncpy(medium, *argv, IFNAMSIZ-1);
+-			devname++;
++			medium = *argv;
+ 		} else {
+ 			fprintf(stderr,
+ 				"Invalid 6RD parameter \"%s\"\n", *argv);
+@@ -546,7 +542,7 @@ static int do_6rd(int argc, char **argv)
+ 		}
+ 		argc--; argv++;
+ 	}
+-	if (devname == 0) {
++	if (!medium) {
+ 		fprintf(stderr, "Must specify device\n");
+ 		exit(-1);
+ 	}
+-- 
+2.20.1
+
diff --git a/SOURCES/0125-tc-flower-No-need-to-cache-indev-arg.patch b/SOURCES/0125-tc-flower-No-need-to-cache-indev-arg.patch
new file mode 100644
index 0000000..d6312ea
--- /dev/null
+++ b/SOURCES/0125-tc-flower-No-need-to-cache-indev-arg.patch
@@ -0,0 +1,42 @@
+From 85bcdf3ca3a76ce3b4f62769aa64adcb1c849082 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:09:13 +0200
+Subject: [PATCH] tc: flower: No need to cache indev arg
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit ee474849c8511
+
+commit ee474849c85116ec36e387882447f737ac3fdefb
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Mon Oct 2 13:46:36 2017 +0200
+
+    tc: flower: No need to cache indev arg
+
+    Since addattrstrz() will copy the provided string into the attribute
+    payload, there is no need to cache the data.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ tc/f_flower.c | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+diff --git a/tc/f_flower.c b/tc/f_flower.c
+index e2c7daa0b8e03..34249254603ff 100644
+--- a/tc/f_flower.c
++++ b/tc/f_flower.c
+@@ -642,11 +642,8 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
+ 		} else if (matches(*argv, "skip_sw") == 0) {
+ 			flags |= TCA_CLS_FLAGS_SKIP_SW;
+ 		} else if (matches(*argv, "indev") == 0) {
+-			char ifname[IFNAMSIZ] = {};
+-
+ 			NEXT_ARG();
+-			strncpy(ifname, *argv, sizeof(ifname) - 1);
+-			addattrstrz(n, MAX_MSG, TCA_FLOWER_INDEV, ifname);
++			addattrstrz(n, MAX_MSG, TCA_FLOWER_INDEV, *argv);
+ 		} else if (matches(*argv, "vlan_id") == 0) {
+ 			__u16 vid;
+ 
+-- 
+2.20.1
+
diff --git a/SOURCES/0126-Check-user-supplied-interface-name-lengths.patch b/SOURCES/0126-Check-user-supplied-interface-name-lengths.patch
new file mode 100644
index 0000000..ada9ba1
--- /dev/null
+++ b/SOURCES/0126-Check-user-supplied-interface-name-lengths.patch
@@ -0,0 +1,378 @@
+From 358ca205cfc9646aefae6572607a0a1363086e51 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Mon, 29 Apr 2019 20:09:13 +0200
+Subject: [PATCH] Check user supplied interface name lengths
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 625df645b703d
+
+commit 625df645b703dc858d54784c35beff64464afae2
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Mon Oct 2 13:46:37 2017 +0200
+
+    Check user supplied interface name lengths
+
+    The original problem was that something like:
+
+    | strncpy(ifr.ifr_name, *argv, IFNAMSIZ);
+
+    might leave ifr.ifr_name unterminated if length of *argv exceeds
+    IFNAMSIZ. In order to fix this, I thought about replacing all those
+    cases with (equivalent) calls to snprintf() or even introducing
+    strlcpy(). But as Ulrich Drepper correctly pointed out when rejecting
+    the latter from being added to glibc, truncating a string without
+    notifying the user is not to be considered good practice. So let's
+    excercise what he suggested and reject empty, overlong or otherwise
+    invalid interface names right from the start - this way calls to
+    strncpy() like shown above become safe and the user has a chance to
+    reconsider what he was trying to do.
+
+    Note that this doesn't add calls to check_ifname() to all places where
+    user supplied interface name is parsed. In many cases, the interface
+    must exist already and is therefore looked up using ll_name_to_index(),
+    so if_nametoindex() will perform the necessary checks already.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ include/utils.h |  2 ++
+ ip/ip6tunnel.c  |  3 ++-
+ ip/ipl2tp.c     |  4 +++-
+ ip/iplink.c     | 31 ++++++++++++-------------------
+ ip/ipmaddr.c    |  3 ++-
+ ip/iprule.c     | 10 ++++++++--
+ ip/iptunnel.c   |  7 ++++++-
+ ip/iptuntap.c   |  6 ++++--
+ lib/utils.c     | 29 +++++++++++++++++++++++++++++
+ misc/arpd.c     |  3 ++-
+ tc/f_flower.c   |  2 ++
+ 11 files changed, 72 insertions(+), 28 deletions(-)
+
+diff --git a/include/utils.h b/include/utils.h
+index d596a6fc10574..0382460136180 100644
+--- a/include/utils.h
++++ b/include/utils.h
+@@ -145,6 +145,8 @@ void missarg(const char *) __attribute__((noreturn));
+ void invarg(const char *, const char *) __attribute__((noreturn));
+ void duparg(const char *, const char *) __attribute__((noreturn));
+ void duparg2(const char *, const char *) __attribute__((noreturn));
++int check_ifname(const char *);
++int get_ifname(char *, const char *);
+ int matches(const char *arg, const char *pattern);
+ int inet_addr_match(const inet_prefix *a, const inet_prefix *b, int bits);
+ 
+diff --git a/ip/ip6tunnel.c b/ip/ip6tunnel.c
+index c12d700e74189..bc44bef7f030c 100644
+--- a/ip/ip6tunnel.c
++++ b/ip/ip6tunnel.c
+@@ -273,7 +273,8 @@ static int parse_args(int argc, char **argv, int cmd, struct ip6_tnl_parm2 *p)
+ 				usage();
+ 			if (p->name[0])
+ 				duparg2("name", *argv);
+-			strncpy(p->name, *argv, IFNAMSIZ - 1);
++			if (get_ifname(p->name, *argv))
++				invarg("\"name\" not a valid ifname", *argv);
+ 			if (cmd == SIOCCHGTUNNEL && count == 0) {
+ 				struct ip6_tnl_parm2 old_p = {};
+ 
+diff --git a/ip/ipl2tp.c b/ip/ipl2tp.c
+index 742adbe4f9c3a..7c5ed313b186f 100644
+--- a/ip/ipl2tp.c
++++ b/ip/ipl2tp.c
+@@ -182,7 +182,7 @@ static int create_session(struct l2tp_parm *p)
+ 	if (p->peer_cookie_len)
+ 		addattr_l(&req.n, 1024, L2TP_ATTR_PEER_COOKIE,
+ 			  p->peer_cookie,  p->peer_cookie_len);
+-	if (p->ifname && p->ifname[0])
++	if (p->ifname)
+ 		addattrstrz(&req.n, 1024, L2TP_ATTR_IFNAME, p->ifname);
+ 
+ 	if (rtnl_talk(&genl_rth, &req.n, NULL) < 0)
+@@ -545,6 +545,8 @@ static int parse_args(int argc, char **argv, int cmd, struct l2tp_parm *p)
+ 			}
+ 		} else if (strcmp(*argv, "name") == 0) {
+ 			NEXT_ARG();
++			if (check_ifname(*argv))
++				invarg("\"name\" not a valid ifname", *argv);
+ 			p->ifname = *argv;
+ 		} else if (strcmp(*argv, "remote") == 0) {
+ 			NEXT_ARG();
+diff --git a/ip/iplink.c b/ip/iplink.c
+index db5b2c9645ba8..50f1075d94171 100644
+--- a/ip/iplink.c
++++ b/ip/iplink.c
+@@ -581,6 +581,8 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req,
+ 			req->i.ifi_flags &= ~IFF_UP;
+ 		} else if (strcmp(*argv, "name") == 0) {
+ 			NEXT_ARG();
++			if (check_ifname(*argv))
++				invarg("\"name\" not a valid ifname", *argv);
+ 			*name = *argv;
+ 		} else if (strcmp(*argv, "index") == 0) {
+ 			NEXT_ARG();
+@@ -848,6 +850,8 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req,
+ 				NEXT_ARG();
+ 			if (*dev)
+ 				duparg2("dev", *argv);
++			if (check_ifname(*argv))
++				invarg("\"dev\" not a valid ifname", *argv);
+ 			*dev = *argv;
+ 			dev_index = ll_name_to_index(*dev);
+ 		}
+@@ -870,7 +874,6 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req,
+ 
+ static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv)
+ {
+-	int len;
+ 	char *dev = NULL;
+ 	char *name = NULL;
+ 	char *link = NULL;
+@@ -960,13 +963,8 @@ static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv)
+ 	}
+ 
+ 	if (name) {
+-		len = strlen(name) + 1;
+-		if (len == 1)
+-			invarg("\"\" is not a valid device identifier\n",
+-			       "name");
+-		if (len > IFNAMSIZ)
+-			invarg("\"name\" too long\n", name);
+-		addattr_l(&req.n, sizeof(req), IFLA_IFNAME, name, len);
++		addattr_l(&req.n, sizeof(req),
++			  IFLA_IFNAME, name, strlen(name) + 1);
+ 	}
+ 
+ 	if (type) {
+@@ -1016,7 +1014,6 @@ static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv)
+ 
+ int iplink_get(unsigned int flags, char *name, __u32 filt_mask)
+ {
+-	int len;
+ 	struct iplink_req req = {
+ 		.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)),
+ 		.n.nlmsg_flags = NLM_F_REQUEST | flags,
+@@ -1026,13 +1023,8 @@ int iplink_get(unsigned int flags, char *name, __u32 filt_mask)
+ 	struct nlmsghdr *answer;
+ 
+ 	if (name) {
+-		len = strlen(name) + 1;
+-		if (len == 1)
+-			invarg("\"\" is not a valid device identifier\n",
+-				   "name");
+-		if (len > IFNAMSIZ)
+-			invarg("\"name\" too long\n", name);
+-		addattr_l(&req.n, sizeof(req), IFLA_IFNAME, name, len);
++		addattr_l(&req.n, sizeof(req),
++			  IFLA_IFNAME, name, strlen(name) + 1);
+ 	}
+ 	addattr32(&req.n, sizeof(req), IFLA_EXT_MASK, filt_mask);
+ 
+@@ -1256,6 +1248,8 @@ static int do_set(int argc, char **argv)
+ 			flags &= ~IFF_UP;
+ 		} else if (strcmp(*argv, "name") == 0) {
+ 			NEXT_ARG();
++			if (check_ifname(*argv))
++				invarg("\"name\" not a valid ifname", *argv);
+ 			newname = *argv;
+ 		} else if (matches(*argv, "address") == 0) {
+ 			NEXT_ARG();
+@@ -1346,6 +1340,8 @@ static int do_set(int argc, char **argv)
+ 
+ 			if (dev)
+ 				duparg2("dev", *argv);
++			if (check_ifname(*argv))
++				invarg("\"dev\" not a valid ifname", *argv);
+ 			dev = *argv;
+ 		}
+ 		argc--; argv++;
+@@ -1374,9 +1370,6 @@ static int do_set(int argc, char **argv)
+ 	}
+ 
+ 	if (newname && strcmp(dev, newname)) {
+-		if (strlen(newname) == 0)
+-			invarg("\"\" is not a valid device identifier\n",
+-			       "name");
+ 		if (do_changename(dev, newname) < 0)
+ 			return -1;
+ 		dev = newname;
+diff --git a/ip/ipmaddr.c b/ip/ipmaddr.c
+index 85a69e779563d..5683f6fa830c1 100644
+--- a/ip/ipmaddr.c
++++ b/ip/ipmaddr.c
+@@ -284,7 +284,8 @@ static int multiaddr_modify(int cmd, int argc, char **argv)
+ 			NEXT_ARG();
+ 			if (ifr.ifr_name[0])
+ 				duparg("dev", *argv);
+-			strncpy(ifr.ifr_name, *argv, IFNAMSIZ);
++			if (get_ifname(ifr.ifr_name, *argv))
++				invarg("\"dev\" not a valid ifname", *argv);
+ 		} else {
+ 			if (matches(*argv, "address") == 0) {
+ 				NEXT_ARG();
+diff --git a/ip/iprule.c b/ip/iprule.c
+index e64b4d7db2815..201d3bdc20427 100644
+--- a/ip/iprule.c
++++ b/ip/iprule.c
+@@ -472,11 +472,13 @@ static int iprule_list_flush_or_save(int argc, char **argv, int action)
+ 		} else if (strcmp(*argv, "dev") == 0 ||
+ 			   strcmp(*argv, "iif") == 0) {
+ 			NEXT_ARG();
+-			strncpy(filter.iif, *argv, IFNAMSIZ);
++			if (get_ifname(filter.iif, *argv))
++				invarg("\"iif\"/\"dev\" not a valid ifname", *argv);
+ 			filter.iifmask = 1;
+ 		} else if (strcmp(*argv, "oif") == 0) {
+ 			NEXT_ARG();
+-			strncpy(filter.oif, *argv, IFNAMSIZ);
++			if (get_ifname(filter.oif, *argv))
++				invarg("\"oif\" not a valid ifname", *argv);
+ 			filter.oifmask = 1;
+ 		} else if (strcmp(*argv, "l3mdev") == 0) {
+ 			filter.l3mdev = 1;
+@@ -695,10 +697,14 @@ static int iprule_modify(int cmd, int argc, char **argv)
+ 		} else if (strcmp(*argv, "dev") == 0 ||
+ 			   strcmp(*argv, "iif") == 0) {
+ 			NEXT_ARG();
++			if (check_ifname(*argv))
++				invarg("\"iif\"/\"dev\" not a valid ifname", *argv);
+ 			addattr_l(&req.n, sizeof(req), FRA_IFNAME,
+ 				  *argv, strlen(*argv)+1);
+ 		} else if (strcmp(*argv, "oif") == 0) {
+ 			NEXT_ARG();
++			if (check_ifname(*argv))
++				invarg("\"oif\" not a valid ifname", *argv);
+ 			addattr_l(&req.n, sizeof(req), FRA_OIFNAME,
+ 				  *argv, strlen(*argv)+1);
+ 		} else if (strcmp(*argv, "l3mdev") == 0) {
+diff --git a/ip/iptunnel.c b/ip/iptunnel.c
+index 0acfd0793d3cd..208a1f06ab12f 100644
+--- a/ip/iptunnel.c
++++ b/ip/iptunnel.c
+@@ -178,7 +178,8 @@ static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p)
+ 
+ 			if (p->name[0])
+ 				duparg2("name", *argv);
+-			strncpy(p->name, *argv, IFNAMSIZ - 1);
++			if (get_ifname(p->name, *argv))
++				invarg("\"name\" not a valid ifname", *argv);
+ 			if (cmd == SIOCCHGTUNNEL && count == 0) {
+ 				struct ip_tunnel_parm old_p = {};
+ 
+@@ -487,6 +488,8 @@ static int do_prl(int argc, char **argv)
+ 			count++;
+ 		} else if (strcmp(*argv, "dev") == 0) {
+ 			NEXT_ARG();
++			if (check_ifname(*argv))
++				invarg("\"dev\" not a valid ifname", *argv);
+ 			medium = *argv;
+ 		} else {
+ 			fprintf(stderr,
+@@ -534,6 +537,8 @@ static int do_6rd(int argc, char **argv)
+ 			cmd = SIOCDEL6RD;
+ 		} else if (strcmp(*argv, "dev") == 0) {
+ 			NEXT_ARG();
++			if (check_ifname(*argv))
++				invarg("\"dev\" not a valid ifname", *argv);
+ 			medium = *argv;
+ 		} else {
+ 			fprintf(stderr,
+diff --git a/ip/iptuntap.c b/ip/iptuntap.c
+index 451f7f0eac6bb..b46e452f21278 100644
+--- a/ip/iptuntap.c
++++ b/ip/iptuntap.c
+@@ -176,7 +176,8 @@ static int parse_args(int argc, char **argv,
+ 			ifr->ifr_flags |= IFF_MULTI_QUEUE;
+ 		} else if (matches(*argv, "dev") == 0) {
+ 			NEXT_ARG();
+-			strncpy(ifr->ifr_name, *argv, IFNAMSIZ-1);
++			if (get_ifname(ifr->ifr_name, *argv))
++				invarg("\"dev\" not a valid ifname", *argv);
+ 		} else {
+ 			if (matches(*argv, "name") == 0) {
+ 				NEXT_ARG();
+@@ -184,7 +185,8 @@ static int parse_args(int argc, char **argv,
+ 				usage();
+ 			if (ifr->ifr_name[0])
+ 				duparg2("name", *argv);
+-			strncpy(ifr->ifr_name, *argv, IFNAMSIZ);
++			if (get_ifname(ifr->ifr_name, *argv))
++				invarg("\"name\" not a valid ifname", *argv);
+ 		}
+ 		count++;
+ 		argc--; argv++;
+diff --git a/lib/utils.c b/lib/utils.c
+index 228d97bfe5e9b..0c56f0b478f23 100644
+--- a/lib/utils.c
++++ b/lib/utils.c
+@@ -20,6 +20,7 @@
+ #include <sys/socket.h>
+ #include <netinet/in.h>
+ #include <string.h>
++#include <ctype.h>
+ #include <netdb.h>
+ #include <arpa/inet.h>
+ #include <asm/types.h>
+@@ -697,6 +698,34 @@ void duparg2(const char *key, const char *arg)
+ 	exit(-1);
+ }
+ 
++int check_ifname(const char *name)
++{
++	/* These checks mimic kernel checks in dev_valid_name */
++	if (*name == '\0')
++		return -1;
++	if (strlen(name) >= IFNAMSIZ)
++		return -1;
++
++	while (*name) {
++		if (*name == '/' || isspace(*name))
++			return -1;
++		++name;
++	}
++	return 0;
++}
++
++/* buf is assumed to be IFNAMSIZ */
++int get_ifname(char *buf, const char *name)
++{
++	int ret;
++
++	ret = check_ifname(name);
++	if (ret == 0)
++		strncpy(buf, name, IFNAMSIZ);
++
++	return ret;
++}
++
+ int matches(const char *cmd, const char *pattern)
+ {
+ 	int len = strlen(cmd);
+diff --git a/misc/arpd.c b/misc/arpd.c
+index c9d86475e5995..67d86b67957b8 100644
+--- a/misc/arpd.c
++++ b/misc/arpd.c
+@@ -662,7 +662,8 @@ int main(int argc, char **argv)
+ 		struct ifreq ifr = {};
+ 
+ 		for (i = 0; i < ifnum; i++) {
+-			strncpy(ifr.ifr_name, ifnames[i], IFNAMSIZ);
++			if (get_ifname(ifr.ifr_name, ifnames[i]))
++				invarg("not a valid ifname", ifnames[i]);
+ 			if (ioctl(udp_sock, SIOCGIFINDEX, &ifr)) {
+ 				perror("ioctl(SIOCGIFINDEX)");
+ 				exit(-1);
+diff --git a/tc/f_flower.c b/tc/f_flower.c
+index 34249254603ff..f3f8d3427c761 100644
+--- a/tc/f_flower.c
++++ b/tc/f_flower.c
+@@ -643,6 +643,8 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
+ 			flags |= TCA_CLS_FLAGS_SKIP_SW;
+ 		} else if (matches(*argv, "indev") == 0) {
+ 			NEXT_ARG();
++			if (check_ifname(*argv))
++				invarg("\"indev\" not a valid ifname", *argv);
+ 			addattrstrz(n, MAX_MSG, TCA_FLOWER_INDEV, *argv);
+ 		} else if (matches(*argv, "vlan_id") == 0) {
+ 			__u16 vid;
+-- 
+2.20.1
+
diff --git a/SOURCES/0127-bpf-minor-cleanups-for-bpf_trace_pipe.patch b/SOURCES/0127-bpf-minor-cleanups-for-bpf_trace_pipe.patch
new file mode 100644
index 0000000..a96efb9
--- /dev/null
+++ b/SOURCES/0127-bpf-minor-cleanups-for-bpf_trace_pipe.patch
@@ -0,0 +1,73 @@
+From edf0ae950c5b9d3c5eed29a40f5669cf657995e6 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Tue, 30 Apr 2019 15:43:03 +0200
+Subject: [PATCH] bpf: minor cleanups for bpf_trace_pipe
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646
+Upstream Status: iproute2.git commit 1b736dc469dca
+
+commit 1b736dc469dcabd4180848a1f1b3d1fef2b84dbc
+Author: Daniel Borkmann <daniel@iogearbox.net>
+Date:   Tue Sep 5 02:24:31 2017 +0200
+
+    bpf: minor cleanups for bpf_trace_pipe
+
+    Just minor nits, e.g. no need to fflush() and instead of returning
+    right away, just break and close the fd.
+
+    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
+---
+ lib/bpf.c | 19 +++++++++----------
+ 1 file changed, 9 insertions(+), 10 deletions(-)
+
+diff --git a/lib/bpf.c b/lib/bpf.c
+index e072cba214067..f0e6c6fb732ee 100644
+--- a/lib/bpf.c
++++ b/lib/bpf.c
+@@ -461,9 +461,9 @@ int bpf_trace_pipe(void)
+ 		"/trace",
+ 		0,
+ 	};
++	int fd_in, fd_out = STDERR_FILENO;
+ 	char tpipe[PATH_MAX];
+ 	const char *mnt;
+-	int fd;
+ 
+ 	mnt = bpf_find_mntpt("tracefs", TRACEFS_MAGIC, tracefs_mnt,
+ 			     sizeof(tracefs_mnt), tracefs_known_mnts);
+@@ -474,8 +474,8 @@ int bpf_trace_pipe(void)
+ 
+ 	snprintf(tpipe, sizeof(tpipe), "%s/trace_pipe", mnt);
+ 
+-	fd = open(tpipe, O_RDONLY);
+-	if (fd < 0)
++	fd_in = open(tpipe, O_RDONLY);
++	if (fd_in < 0)
+ 		return -1;
+ 
+ 	fprintf(stderr, "Running! Hang up with ^C!\n\n");
+@@ -483,15 +483,14 @@ int bpf_trace_pipe(void)
+ 		static char buff[4096];
+ 		ssize_t ret;
+ 
+-		ret = read(fd, buff, sizeof(buff) - 1);
+-		if (ret > 0) {
+-			if (write(STDERR_FILENO, buff, ret) != ret)
+-				return -1;
+-			fflush(stderr);
+-		}
++		ret = read(fd_in, buff, sizeof(buff));
++		if (ret > 0 && write(fd_out, buff, ret) == ret)
++			continue;
++		break;
+ 	}
+ 
+-	return 0;
++	close(fd_in);
++	return -1;
+ }
+ 
+ static int bpf_gen_global(const char *bpf_sub_dir)
+-- 
+2.20.1
+
diff --git a/SOURCES/0128-ip-tunnel-Use-tnl_parse_key-to-parse-tunnel-key.patch b/SOURCES/0128-ip-tunnel-Use-tnl_parse_key-to-parse-tunnel-key.patch
new file mode 100644
index 0000000..537029f
--- /dev/null
+++ b/SOURCES/0128-ip-tunnel-Use-tnl_parse_key-to-parse-tunnel-key.patch
@@ -0,0 +1,339 @@
+From 8f2338a51859158b8699e0736f84ab1e42a3da97 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Wed, 5 Jun 2019 13:05:04 +0200
+Subject: [PATCH] ip/tunnel: Use tnl_parse_key() to parse tunnel key
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660
+Upstream Status: iproute2.git commit 1f44b93744f11
+Conflicts: context change due to missing commit 2a80154fde40b
+           ("vti6: fix local/remote any addr handling")
+
+commit 1f44b93744f11f2a8249e3c13751ab7debebaa5f
+Author: Serhey Popovych <serhe.popovych@gmail.com>
+Date:   Mon Dec 18 19:48:03 2017 +0200
+
+    ip/tunnel: Use tnl_parse_key() to parse tunnel key
+
+    It is added with
+    commit a7ed1520ee96 ("ip/tunnel: introduce tnl_parse_key()")
+    to avoid code duplication in ip6?tunnel.c.
+
+    Reuse it for gre/gre6 and vti/vti6 tunnel rtnl
+    configuration interface with the same purpose
+    it is used in tunnel ioctl interface in ip6?tunnel.c.
+
+    While there change type of key variables from
+    unsigned integer to __be32 to reflect nature of the
+    value they store and place error message in
+    tnl_parse_key() on a single line to make single
+    call to fprintf().
+
+    Signed-off-by: Serhey Popovych <serhe.popovych@gmail.com>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ ip/link_gre.c  | 45 +++++----------------------------------------
+ ip/link_gre6.c | 45 +++++----------------------------------------
+ ip/link_vti.c  | 45 +++++----------------------------------------
+ ip/link_vti6.c | 45 +++++----------------------------------------
+ ip/tunnel.c    |  5 +++--
+ 5 files changed, 23 insertions(+), 162 deletions(-)
+
+diff --git a/ip/link_gre.c b/ip/link_gre.c
+index ced993692e6f6..1376d2e3af7de 100644
+--- a/ip/link_gre.c
++++ b/ip/link_gre.c
+@@ -77,8 +77,8 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
+ 	struct rtattr *greinfo[IFLA_GRE_MAX + 1];
+ 	__u16 iflags = 0;
+ 	__u16 oflags = 0;
+-	unsigned int ikey = 0;
+-	unsigned int okey = 0;
++	__be32 ikey = 0;
++	__be32 okey = 0;
+ 	unsigned int saddr = 0;
+ 	unsigned int daddr = 0;
+ 	unsigned int link = 0;
+@@ -167,53 +167,18 @@ get_failed:
+ 
+ 	while (argc > 0) {
+ 		if (!matches(*argv, "key")) {
+-			unsigned int uval;
+-
+ 			NEXT_ARG();
+ 			iflags |= GRE_KEY;
+ 			oflags |= GRE_KEY;
+-			if (strchr(*argv, '.'))
+-				uval = get_addr32(*argv);
+-			else {
+-				if (get_unsigned(&uval, *argv, 0) < 0) {
+-					fprintf(stderr,
+-						"Invalid value for \"key\": \"%s\"; it should be an unsigned integer\n", *argv);
+-					exit(-1);
+-				}
+-				uval = htonl(uval);
+-			}
+-
+-			ikey = okey = uval;
++			ikey = okey = tnl_parse_key("key", *argv);
+ 		} else if (!matches(*argv, "ikey")) {
+-			unsigned int uval;
+-
+ 			NEXT_ARG();
+ 			iflags |= GRE_KEY;
+-			if (strchr(*argv, '.'))
+-				uval = get_addr32(*argv);
+-			else {
+-				if (get_unsigned(&uval, *argv, 0) < 0) {
+-					fprintf(stderr, "invalid value for \"ikey\": \"%s\"; it should be an unsigned integer\n", *argv);
+-					exit(-1);
+-				}
+-				uval = htonl(uval);
+-			}
+-			ikey = uval;
++			ikey = tnl_parse_key("ikey", *argv);
+ 		} else if (!matches(*argv, "okey")) {
+-			unsigned int uval;
+-
+ 			NEXT_ARG();
+ 			oflags |= GRE_KEY;
+-			if (strchr(*argv, '.'))
+-				uval = get_addr32(*argv);
+-			else {
+-				if (get_unsigned(&uval, *argv, 0) < 0) {
+-					fprintf(stderr, "invalid value for \"okey\": \"%s\"; it should be an unsigned integer\n", *argv);
+-					exit(-1);
+-				}
+-				uval = htonl(uval);
+-			}
+-			okey = uval;
++			okey = tnl_parse_key("okey", *argv);
+ 		} else if (!matches(*argv, "seq")) {
+ 			iflags |= GRE_SEQ;
+ 			oflags |= GRE_SEQ;
+diff --git a/ip/link_gre6.c b/ip/link_gre6.c
+index a9d18ee954641..22e6e44aae29b 100644
+--- a/ip/link_gre6.c
++++ b/ip/link_gre6.c
+@@ -89,8 +89,8 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
+ 	struct rtattr *greinfo[IFLA_GRE_MAX + 1];
+ 	__u16 iflags = 0;
+ 	__u16 oflags = 0;
+-	unsigned int ikey = 0;
+-	unsigned int okey = 0;
++	__be32 ikey = 0;
++	__be32 okey = 0;
+ 	struct in6_addr raddr = IN6ADDR_ANY_INIT;
+ 	struct in6_addr laddr = IN6ADDR_ANY_INIT;
+ 	unsigned int link = 0;
+@@ -181,53 +181,18 @@ get_failed:
+ 
+ 	while (argc > 0) {
+ 		if (!matches(*argv, "key")) {
+-			unsigned int uval;
+-
+ 			NEXT_ARG();
+ 			iflags |= GRE_KEY;
+ 			oflags |= GRE_KEY;
+-			if (strchr(*argv, '.'))
+-				uval = get_addr32(*argv);
+-			else {
+-				if (get_unsigned(&uval, *argv, 0) < 0) {
+-					fprintf(stderr,
+-						"Invalid value for \"key\"\n");
+-					exit(-1);
+-				}
+-				uval = htonl(uval);
+-			}
+-
+-			ikey = okey = uval;
++			ikey = okey = tnl_parse_key("key", *argv);
+ 		} else if (!matches(*argv, "ikey")) {
+-			unsigned int uval;
+-
+ 			NEXT_ARG();
+ 			iflags |= GRE_KEY;
+-			if (strchr(*argv, '.'))
+-				uval = get_addr32(*argv);
+-			else {
+-				if (get_unsigned(&uval, *argv, 0) < 0) {
+-					fprintf(stderr, "invalid value of \"ikey\"\n");
+-					exit(-1);
+-				}
+-				uval = htonl(uval);
+-			}
+-			ikey = uval;
++			ikey = tnl_parse_key("ikey", *argv);
+ 		} else if (!matches(*argv, "okey")) {
+-			unsigned int uval;
+-
+ 			NEXT_ARG();
+ 			oflags |= GRE_KEY;
+-			if (strchr(*argv, '.'))
+-				uval = get_addr32(*argv);
+-			else {
+-				if (get_unsigned(&uval, *argv, 0) < 0) {
+-					fprintf(stderr, "invalid value of \"okey\"\n");
+-					exit(-1);
+-				}
+-				uval = htonl(uval);
+-			}
+-			okey = uval;
++			okey = tnl_parse_key("okey", *argv);
+ 		} else if (!matches(*argv, "seq")) {
+ 			iflags |= GRE_SEQ;
+ 			oflags |= GRE_SEQ;
+diff --git a/ip/link_vti.c b/ip/link_vti.c
+index d2aacbe78ded1..6e4234170bb50 100644
+--- a/ip/link_vti.c
++++ b/ip/link_vti.c
+@@ -62,8 +62,8 @@ static int vti_parse_opt(struct link_util *lu, int argc, char **argv,
+ 	struct rtattr *tb[IFLA_MAX + 1];
+ 	struct rtattr *linkinfo[IFLA_INFO_MAX+1];
+ 	struct rtattr *vtiinfo[IFLA_VTI_MAX + 1];
+-	unsigned int ikey = 0;
+-	unsigned int okey = 0;
++	__be32 ikey = 0;
++	__be32 okey = 0;
+ 	unsigned int saddr = 0;
+ 	unsigned int daddr = 0;
+ 	unsigned int link = 0;
+@@ -116,49 +116,14 @@ get_failed:
+ 
+ 	while (argc > 0) {
+ 		if (!matches(*argv, "key")) {
+-			unsigned int uval;
+-
+ 			NEXT_ARG();
+-			if (strchr(*argv, '.'))
+-				uval = get_addr32(*argv);
+-			else {
+-				if (get_unsigned(&uval, *argv, 0) < 0) {
+-					fprintf(stderr,
+-						"Invalid value for \"key\": \"%s\"; it should be an unsigned integer\n", *argv);
+-					exit(-1);
+-				}
+-				uval = htonl(uval);
+-			}
+-
+-			ikey = okey = uval;
++			ikey = okey = tnl_parse_key("key", *argv);
+ 		} else if (!matches(*argv, "ikey")) {
+-			unsigned int uval;
+-
+ 			NEXT_ARG();
+-			if (strchr(*argv, '.'))
+-				uval = get_addr32(*argv);
+-			else {
+-				if (get_unsigned(&uval, *argv, 0) < 0) {
+-					fprintf(stderr, "invalid value for \"ikey\": \"%s\"; it should be an unsigned integer\n", *argv);
+-					exit(-1);
+-				}
+-				uval = htonl(uval);
+-			}
+-			ikey = uval;
++			ikey = tnl_parse_key("ikey", *argv);
+ 		} else if (!matches(*argv, "okey")) {
+-			unsigned int uval;
+-
+ 			NEXT_ARG();
+-			if (strchr(*argv, '.'))
+-				uval = get_addr32(*argv);
+-			else {
+-				if (get_unsigned(&uval, *argv, 0) < 0) {
+-					fprintf(stderr, "invalid value for \"okey\": \"%s\"; it should be an unsigned integer\n", *argv);
+-					exit(-1);
+-				}
+-				uval = htonl(uval);
+-			}
+-			okey = uval;
++			okey = tnl_parse_key("okey", *argv);
+ 		} else if (!matches(*argv, "remote")) {
+ 			NEXT_ARG();
+ 			if (!strcmp(*argv, "any")) {
+diff --git a/ip/link_vti6.c b/ip/link_vti6.c
+index aedfbeaeea0e1..e246cedbcb7a7 100644
+--- a/ip/link_vti6.c
++++ b/ip/link_vti6.c
+@@ -59,8 +59,8 @@ static int vti6_parse_opt(struct link_util *lu, int argc, char **argv,
+ 	struct rtattr *vtiinfo[IFLA_VTI_MAX + 1];
+ 	struct in6_addr saddr;
+ 	struct in6_addr daddr;
+-	unsigned int ikey = 0;
+-	unsigned int okey = 0;
++	__be32 ikey = 0;
++	__be32 okey = 0;
+ 	unsigned int link = 0;
+ 	int len;
+ 
+@@ -111,49 +111,14 @@ get_failed:
+ 
+ 	while (argc > 0) {
+ 		if (!matches(*argv, "key")) {
+-			unsigned int uval;
+-
+ 			NEXT_ARG();
+-			if (strchr(*argv, '.'))
+-				uval = get_addr32(*argv);
+-			else {
+-				if (get_unsigned(&uval, *argv, 0) < 0) {
+-					fprintf(stderr,
+-						"Invalid value for \"key\": \"%s\"; it should be an unsigned integer\n", *argv);
+-					exit(-1);
+-				}
+-				uval = htonl(uval);
+-			}
+-
+-			ikey = okey = uval;
++			ikey = okey = tnl_parse_key("key", *argv);
+ 		} else if (!matches(*argv, "ikey")) {
+-			unsigned int uval;
+-
+ 			NEXT_ARG();
+-			if (strchr(*argv, '.'))
+-				uval = get_addr32(*argv);
+-			else {
+-				if (get_unsigned(&uval, *argv, 0) < 0) {
+-					fprintf(stderr, "invalid value for \"ikey\": \"%s\"; it should be an unsigned integer\n", *argv);
+-					exit(-1);
+-				}
+-				uval = htonl(uval);
+-			}
+-			ikey = uval;
++			ikey = tnl_parse_key("ikey", *argv);
+ 		} else if (!matches(*argv, "okey")) {
+-			unsigned int uval;
+-
+ 			NEXT_ARG();
+-			if (strchr(*argv, '.'))
+-				uval = get_addr32(*argv);
+-			else {
+-				if (get_unsigned(&uval, *argv, 0) < 0) {
+-					fprintf(stderr, "invalid value for \"okey\": \"%s\"; it should be an unsigned integer\n", *argv);
+-					exit(-1);
+-				}
+-				uval = htonl(uval);
+-			}
+-			okey = uval;
++			okey = tnl_parse_key("okey", *argv);
+ 		} else if (!matches(*argv, "remote")) {
+ 			NEXT_ARG();
+ 			if (!strcmp(*argv, "any")) {
+diff --git a/ip/tunnel.c b/ip/tunnel.c
+index 7956d71aa7334..3967d5df3ca1c 100644
+--- a/ip/tunnel.c
++++ b/ip/tunnel.c
+@@ -189,8 +189,9 @@ __be32 tnl_parse_key(const char *name, const char *key)
+ 		return get_addr32(key);
+ 
+ 	if (get_unsigned(&uval, key, 0) < 0) {
+-		fprintf(stderr, "invalid value for \"%s\": \"%s\";", name, key);
+-		fprintf(stderr, " it should be an unsigned integer\n");
++		fprintf(stderr,
++			"invalid value for \"%s\": \"%s\"; it should be an unsigned integer\n",
++			name, key);
+ 		exit(-1);
+ 	}
+ 	return htonl(uval);
+-- 
+2.20.1
+
diff --git a/SOURCES/0129-man-ip-link-document-GRE-tunnels.patch b/SOURCES/0129-man-ip-link-document-GRE-tunnels.patch
new file mode 100644
index 0000000..76b36b3
--- /dev/null
+++ b/SOURCES/0129-man-ip-link-document-GRE-tunnels.patch
@@ -0,0 +1,218 @@
+From 266b19dec4b79c4f63118dd6151c1b0a80f521f7 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Wed, 5 Jun 2019 13:08:00 +0200
+Subject: [PATCH] man: ip link: document GRE tunnels
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660
+Upstream Status: iproute2.git commit d21c028cf7414
+Conflicts: context change due to missing commit 1eccc5734148c
+           ("ip: add vxcan/veth to ip-link man page")
+
+commit d21c028cf74147360c530a4c53063bbe677dbe73
+Author: Sabrina Dubroca <sd@queasysnail.net>
+Date:   Fri Apr 20 10:31:59 2018 +0200
+
+    man: ip link: document GRE tunnels
+
+    GRE tunnels are currently only documented together with IPIP and SIT
+    tunnels, but they actually have very different configuration
+    options. Let's separate them.
+
+    Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
+    Signed-off-by: David Ahern <dsahern@gmail.com>
+---
+ man/man8/ip-link.8.in | 152 ++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 148 insertions(+), 4 deletions(-)
+
+diff --git a/man/man8/ip-link.8.in b/man/man8/ip-link.8.in
+index 48417dbce80aa..cfea1bdfdc030 100644
+--- a/man/man8/ip-link.8.in
++++ b/man/man8/ip-link.8.in
+@@ -643,15 +643,88 @@ keyword.
+ .in -8
+ 
+ .TP
+-GRE, IPIP, SIT Type Support
+-For a link of types
+-.I GRE/IPIP/SIT
++IPIP, SIT Type Support
++For a link of type
++.IR IPIP or SIT
++the following additional arguments are supported:
++
++.BI "ip link add " DEVICE
++.BR type " { " ipip " | " sit " }"
++.BI " remote " ADDR " local " ADDR
++[
++.BR encap " { " fou " | " gue " | " none " }"
++] [
++.BR encap-sport " { " \fIPORT " | " auto " }"
++] [
++.BI "encap-dport " PORT
++] [
++.RB [ no ] encap-csum
++] [
++.RB [ no ] encap-remcsum
++]
++
++.in +8
++.sp
++.BI  remote " ADDR "
++- specifies the remote address of the tunnel.
++
++.sp
++.BI  local " ADDR "
++- specifies the fixed local address for tunneled packets.
++It must be an address on another interface on this host.
++
++.sp
++.BR encap " { " fou " | " gue " | " none " }"
++- specifies type of secondary UDP encapsulation. "fou" indicates
++Foo-Over-UDP, "gue" indicates Generic UDP Encapsulation.
++
++.sp
++.BR encap-sport " { " \fIPORT " | " auto " }"
++- specifies the source port in UDP encapsulation.
++.IR PORT
++indicates the port by number, "auto"
++indicates that the port number should be chosen automatically
++(the kernel picks a flow based on the flow hash of the
++encapsulated packet).
++
++.sp
++.RB [ no ] encap-csum
++- specifies if UDP checksums are enabled in the secondary
++encapsulation.
++
++.sp
++.RB [ no ] encap-remcsum
++- specifies if Remote Checksum Offload is enabled. This is only
++applicable for Generic UDP Encapsulation.
++
++.in -8
++.TP
++GRE Type Support
++For a link of type
++.IR GRE " or " GRETAP
+ the following additional arguments are supported:
+ 
+ .BI "ip link add " DEVICE
+-.BR type " { " gre " | " ipip " | " sit " }"
++.BR type " { " gre " | " gretap " }"
+ .BI " remote " ADDR " local " ADDR
+ [
++.RB [ i | o ] seq
++] [
++.RB [ i | o ] key
++.I KEY
++] [
++.RB [ i | o ] csum
++] [
++.BI ttl " TTL "
++] [
++.BI tos " TOS "
++] [
++.RB [ no ] pmtudisc
++] [
++.RB [ no ] ignore-df
++] [
++.BI dev " PHYS_DEV "
++] [
+ .BR encap " { " fou " | " gue " | " none " }"
+ ] [
+ .BR encap-sport " { " \fIPORT " | " auto " }"
+@@ -661,6 +734,8 @@ the following additional arguments are supported:
+ .RB [ no ] encap-csum
+ ] [
+ .RB [ no ] encap-remcsum
++] [
++.BR external
+ ]
+ 
+ .in +8
+@@ -673,6 +748,70 @@ the following additional arguments are supported:
+ - specifies the fixed local address for tunneled packets.
+ It must be an address on another interface on this host.
+ 
++.sp
++.RB [ i | o ] seq
++- serialize packets.
++The
++.B oseq
++flag enables sequencing of outgoing packets.
++The
++.B iseq
++flag requires that all input packets are serialized.
++
++.sp
++.RB [ i | o ] key
++.I KEY
++- use keyed GRE with key
++.IR KEY ". "KEY
++is either a number or an IPv4 address-like dotted quad.
++The
++.B key
++parameter specifies the same key to use in both directions.
++The
++.BR ikey " and " okey
++parameters specify different keys for input and output.
++
++.sp
++.RB  [ i | o ] csum
++- generate/require checksums for tunneled packets.
++The
++.B ocsum
++flag calculates checksums for outgoing packets.
++The
++.B icsum
++flag requires that all input packets have the correct
++checksum. The
++.B csum
++flag is equivalent to the combination
++.B "icsum ocsum" .
++
++.sp
++.BI ttl " TTL"
++- specifies the TTL value to use in outgoing packets.
++
++.sp
++.BI tos " TOS"
++- specifies the TOS value to use in outgoing packets.
++
++.sp
++.RB [ no ] pmtudisc
++- enables/disables Path MTU Discovery on this tunnel.
++It is enabled by default. Note that a fixed ttl is incompatible
++with this option: tunneling with a fixed ttl always makes pmtu
++discovery.
++
++.sp
++.RB [ no ] ignore-df
++- enables/disables IPv4 DF suppression on this tunnel.
++Normally datagrams that exceed the MTU will be fragmented; the presence
++of the DF flag inhibits this, resulting instead in an ICMP Unreachable
++(Fragmentation Required) message.  Enabling this attribute casues the
++DF flag to be ignored.
++
++.sp
++.BI dev " PHYS_DEV"
++- specifies the physical device to use for tunnel endpoint communication.
++
+ .sp
+ .BR encap " { " fou " | " gue " | " none " }"
+ - specifies type of secondary UDP encapsulation. "fou" indicates
+@@ -697,6 +836,11 @@ encapsulation.
+ - specifies if Remote Checksum Offload is enabled. This is only
+ applicable for Generic UDP Encapsulation.
+ 
++.sp
++.BR external
++- make this tunnel externally controlled
++.RB "(e.g. " "ip route encap" ).
++
+ .in -8
+ 
+ .TP
+-- 
+2.20.1
+
diff --git a/SOURCES/0130-gre-gre6-allow-clearing-i-o-key-seq-csum-flags.patch b/SOURCES/0130-gre-gre6-allow-clearing-i-o-key-seq-csum-flags.patch
new file mode 100644
index 0000000..2d4af18
--- /dev/null
+++ b/SOURCES/0130-gre-gre6-allow-clearing-i-o-key-seq-csum-flags.patch
@@ -0,0 +1,268 @@
+From 24eec64aa52b65b606d8cc0b03619f3974f12484 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Wed, 5 Jun 2019 13:08:41 +0200
+Subject: [PATCH] gre/gre6: allow clearing {,i,o}{key,seq,csum} flags
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660
+Upstream Status: iproute2.git commit 7f520601f59ee
+Conflicts: context change on ip/link_gre?.c due to missing commit
+           ae91205c4d2a7 ("gre/gre6: Unify gre_print_help()")
+
+commit 7f520601f59ee35da2fc48b3f1b39ed2b80c9efa
+Author: Sabrina Dubroca <sd@queasysnail.net>
+Date:   Fri Apr 20 10:32:00 2018 +0200
+
+    gre/gre6: allow clearing {,i,o}{key,seq,csum} flags
+
+    Currently, iproute allows setting those flags, but it's impossible to
+    clear them, since their current value is fetched from the kernel and
+    then we OR in the additional flags passed on the command line.
+
+    Add no* variants to allow clearing them.
+
+    Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
+    Signed-off-by: David Ahern <dsahern@gmail.com>
+---
+ ip/link_gre.c         | 30 +++++++++++++++++++++++++++---
+ ip/link_gre6.c        | 30 +++++++++++++++++++++++++++---
+ man/man8/ip-link.8.in | 27 ++++++++++++++++++---------
+ 3 files changed, 72 insertions(+), 15 deletions(-)
+
+diff --git a/ip/link_gre.c b/ip/link_gre.c
+index 1376d2e3af7de..41e2edbedb6eb 100644
+--- a/ip/link_gre.c
++++ b/ip/link_gre.c
+@@ -28,9 +28,9 @@ static void print_usage(FILE *f)
+ 	fprintf(f,
+ 		"Usage: ... { gre | gretap } [ remote ADDR ]\n"
+ 		"                            [ local ADDR ]\n"
+-		"                            [ [i|o]seq ]\n"
+-		"                            [ [i|o]key KEY ]\n"
+-		"                            [ [i|o]csum ]\n"
++		"                            [ [no][i|o]seq ]\n"
++		"                            [ [i|o]key KEY | no[i|o]key ]\n"
++		"                            [ [no][i|o]csum ]\n"
+ 		"                            [ ttl TTL ]\n"
+ 		"                            [ tos TOS ]\n"
+ 		"                            [ [no]pmtudisc ]\n"
+@@ -171,28 +171,52 @@ get_failed:
+ 			iflags |= GRE_KEY;
+ 			oflags |= GRE_KEY;
+ 			ikey = okey = tnl_parse_key("key", *argv);
++		} else if (!matches(*argv, "nokey")) {
++			iflags &= ~GRE_KEY;
++			oflags &= ~GRE_KEY;
++			ikey = okey = 0;
+ 		} else if (!matches(*argv, "ikey")) {
+ 			NEXT_ARG();
+ 			iflags |= GRE_KEY;
+ 			ikey = tnl_parse_key("ikey", *argv);
++		} else if (!matches(*argv, "noikey")) {
++			iflags &= ~GRE_KEY;
++			ikey = 0;
+ 		} else if (!matches(*argv, "okey")) {
+ 			NEXT_ARG();
+ 			oflags |= GRE_KEY;
+ 			okey = tnl_parse_key("okey", *argv);
++		} else if (!matches(*argv, "nookey")) {
++			oflags &= ~GRE_KEY;
++			okey = 0;
+ 		} else if (!matches(*argv, "seq")) {
+ 			iflags |= GRE_SEQ;
+ 			oflags |= GRE_SEQ;
++		} else if (!matches(*argv, "noseq")) {
++			iflags &= ~GRE_SEQ;
++			oflags &= ~GRE_SEQ;
+ 		} else if (!matches(*argv, "iseq")) {
+ 			iflags |= GRE_SEQ;
++		} else if (!matches(*argv, "noiseq")) {
++			iflags &= ~GRE_SEQ;
+ 		} else if (!matches(*argv, "oseq")) {
+ 			oflags |= GRE_SEQ;
++		} else if (!matches(*argv, "nooseq")) {
++			oflags &= ~GRE_SEQ;
+ 		} else if (!matches(*argv, "csum")) {
+ 			iflags |= GRE_CSUM;
+ 			oflags |= GRE_CSUM;
++		} else if (!matches(*argv, "nocsum")) {
++			iflags &= ~GRE_CSUM;
++			oflags &= ~GRE_CSUM;
+ 		} else if (!matches(*argv, "icsum")) {
+ 			iflags |= GRE_CSUM;
++		} else if (!matches(*argv, "noicsum")) {
++			iflags &= ~GRE_CSUM;
+ 		} else if (!matches(*argv, "ocsum")) {
+ 			oflags |= GRE_CSUM;
++		} else if (!matches(*argv, "noocsum")) {
++			oflags &= ~GRE_CSUM;
+ 		} else if (!matches(*argv, "nopmtudisc")) {
+ 			pmtudisc = 0;
+ 		} else if (!matches(*argv, "pmtudisc")) {
+diff --git a/ip/link_gre6.c b/ip/link_gre6.c
+index 22e6e44aae29b..127e51de4ab73 100644
+--- a/ip/link_gre6.c
++++ b/ip/link_gre6.c
+@@ -35,9 +35,9 @@ static void print_usage(FILE *f)
+ 	fprintf(f,
+ 		"Usage: ... { ip6gre | ip6gretap } [ remote ADDR ]\n"
+ 		"                                  [ local ADDR ]\n"
+-		"                                  [ [i|o]seq ]\n"
+-		"                                  [ [i|o]key KEY ]\n"
+-		"                                  [ [i|o]csum ]\n"
++		"                                  [ [no][i|o]seq ]\n"
++		"                                  [ [i|o]key KEY | no[i|o]key ]\n"
++		"                                  [ [no][i|o]csum ]\n"
+ 		"                                  [ hoplimit TTL ]\n"
+ 		"                                  [ encaplimit ELIM ]\n"
+ 		"                                  [ tclass TCLASS ]\n"
+@@ -185,28 +185,52 @@ get_failed:
+ 			iflags |= GRE_KEY;
+ 			oflags |= GRE_KEY;
+ 			ikey = okey = tnl_parse_key("key", *argv);
++		} else if (!matches(*argv, "nokey")) {
++			iflags &= ~GRE_KEY;
++			oflags &= ~GRE_KEY;
++			ikey = okey = 0;
+ 		} else if (!matches(*argv, "ikey")) {
+ 			NEXT_ARG();
+ 			iflags |= GRE_KEY;
+ 			ikey = tnl_parse_key("ikey", *argv);
++		} else if (!matches(*argv, "noikey")) {
++			iflags &= ~GRE_KEY;
++			ikey = 0;
+ 		} else if (!matches(*argv, "okey")) {
+ 			NEXT_ARG();
+ 			oflags |= GRE_KEY;
+ 			okey = tnl_parse_key("okey", *argv);
++		} else if (!matches(*argv, "nookey")) {
++			oflags &= ~GRE_KEY;
++			okey = 0;
+ 		} else if (!matches(*argv, "seq")) {
+ 			iflags |= GRE_SEQ;
+ 			oflags |= GRE_SEQ;
++		} else if (!matches(*argv, "noseq")) {
++			iflags &= ~GRE_SEQ;
++			oflags &= ~GRE_SEQ;
+ 		} else if (!matches(*argv, "iseq")) {
+ 			iflags |= GRE_SEQ;
++		} else if (!matches(*argv, "noiseq")) {
++			iflags &= ~GRE_SEQ;
+ 		} else if (!matches(*argv, "oseq")) {
+ 			oflags |= GRE_SEQ;
++		} else if (!matches(*argv, "nooseq")) {
++			oflags &= ~GRE_SEQ;
+ 		} else if (!matches(*argv, "csum")) {
+ 			iflags |= GRE_CSUM;
+ 			oflags |= GRE_CSUM;
++		} else if (!matches(*argv, "nocsum")) {
++			iflags &= ~GRE_CSUM;
++			oflags &= ~GRE_CSUM;
+ 		} else if (!matches(*argv, "icsum")) {
+ 			iflags |= GRE_CSUM;
++		} else if (!matches(*argv, "noicsum")) {
++			iflags &= ~GRE_CSUM;
+ 		} else if (!matches(*argv, "ocsum")) {
+ 			oflags |= GRE_CSUM;
++		} else if (!matches(*argv, "noocsum")) {
++			oflags &= ~GRE_CSUM;
+ 		} else if (!matches(*argv, "remote")) {
+ 			inet_prefix addr;
+ 
+diff --git a/man/man8/ip-link.8.in b/man/man8/ip-link.8.in
+index cfea1bdfdc030..8be5d5e1e9fd6 100644
+--- a/man/man8/ip-link.8.in
++++ b/man/man8/ip-link.8.in
+@@ -708,12 +708,14 @@ the following additional arguments are supported:
+ .BR type " { " gre " | " gretap " }"
+ .BI " remote " ADDR " local " ADDR
+ [
+-.RB [ i | o ] seq
++.RB [ no ] "" [ i | o ] seq
+ ] [
+ .RB [ i | o ] key
+ .I KEY
++|
++.BR no [ i | o ] key
+ ] [
+-.RB [ i | o ] csum
++.RB [ no ] "" [ i | o ] csum
+ ] [
+ .BI ttl " TTL "
+ ] [
+@@ -749,7 +751,7 @@ the following additional arguments are supported:
+ It must be an address on another interface on this host.
+ 
+ .sp
+-.RB [ i | o ] seq
++.RB  [ no ] "" [ i | o ] seq
+ - serialize packets.
+ The
+ .B oseq
+@@ -761,6 +763,8 @@ flag requires that all input packets are serialized.
+ .sp
+ .RB [ i | o ] key
+ .I KEY
++|
++.BR no [ i | o ] key
+ - use keyed GRE with key
+ .IR KEY ". "KEY
+ is either a number or an IPv4 address-like dotted quad.
+@@ -772,7 +776,7 @@ The
+ parameters specify different keys for input and output.
+ 
+ .sp
+-.RB  [ i | o ] csum
++.RB  [ no ] "" [ i | o ] csum
+ - generate/require checksums for tunneled packets.
+ The
+ .B ocsum
+@@ -853,12 +857,14 @@ the following additional arguments are supported:
+ .BR type " { " ip6gre " | " ip6gretap " }"
+ .BI remote " ADDR " local " ADDR"
+ [
+-.RB [ i | o ] seq
++.RB [ no ] "" [ i | o ] seq
+ ] [
+ .RB [ i | o ] key
+ .I KEY
++|
++.BR no [ i | o ] key
+ ] [
+-.RB [ i | o ] csum
++.RB [ no ] "" [ i | o ] csum
+ ] [
+ .BI hoplimit " TTL "
+ ] [
+@@ -884,7 +890,7 @@ the following additional arguments are supported:
+ It must be an address on another interface on this host.
+ 
+ .sp
+-.RB  [ i | o ] seq
++.RB  [ no ] "" [ i | o ] seq
+ - serialize packets.
+ The
+ .B oseq
+@@ -894,7 +900,10 @@ The
+ flag requires that all input packets are serialized.
+ 
+ .sp
+-.RB  [ i | o ] key " \fIKEY"
++.RB [ i | o ] key
++.I KEY
++|
++.BR no [ i | o ] key
+ - use keyed GRE with key
+ .IR KEY ". "KEY
+ is either a number or an IPv4 address-like dotted quad.
+@@ -906,7 +915,7 @@ The
+ parameters specify different keys for input and output.
+ 
+ .sp
+-.RB  [ i | o ] csum
++.RB  [ no ] "" [ i | o ] csum
+ - generate/require checksums for tunneled packets.
+ The
+ .B ocsum
+-- 
+2.20.1
+
diff --git a/SOURCES/0131-tc_filter-add-support-for-chain-index.patch b/SOURCES/0131-tc_filter-add-support-for-chain-index.patch
new file mode 100644
index 0000000..4fe63f0
--- /dev/null
+++ b/SOURCES/0131-tc_filter-add-support-for-chain-index.patch
@@ -0,0 +1,250 @@
+From 55c511b5caab0bfb9997bca9031947a45fe7854b Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Wed, 5 Jun 2019 13:09:39 +0200
+Subject: [PATCH] tc_filter: add support for chain index
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660
+Upstream Status: iproute2.git commit 732f03461bc48
+
+commit 732f03461bc48cf94946ee3cc92ab5832862b989
+Author: Jiri Pirko <jiri@mellanox.com>
+Date:   Tue May 16 19:29:35 2017 +0200
+
+    tc_filter: add support for chain index
+
+    Allow user to put filter to a specific chain identified by index.
+
+    Signed-off-by: Jiri Pirko <jiri@mellanox.com>
+---
+ tc/tc_filter.c | 87 +++++++++++++++++++++++++++++++++++++++++---------
+ 1 file changed, 72 insertions(+), 15 deletions(-)
+
+diff --git a/tc/tc_filter.c b/tc/tc_filter.c
+index a6bb73d12eaba..8dbebf1ffa32a 100644
+--- a/tc/tc_filter.c
++++ b/tc/tc_filter.c
+@@ -31,7 +31,7 @@ static void usage(void)
+ 	fprintf(stderr,
+ 		"Usage: tc filter [ add | del | change | replace | show ] dev STRING\n"
+ 		"Usage: tc filter get dev STRING parent CLASSID protocol PROTO handle FILTERID pref PRIO FILTER_TYPE\n"
+-		"       [ pref PRIO ] protocol PROTO\n"
++		"       [ pref PRIO ] protocol PROTO [ chain CHAIN_INDEX ]\n"
+ 		"       [ estimator INTERVAL TIME_CONSTANT ]\n"
+ 		"       [ root | ingress | egress | parent CLASSID ]\n"
+ 		"       [ handle FILTERID ] [ [ FILTER_TYPE ] [ help | OPTIONS ] ]\n"
+@@ -59,6 +59,8 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv)
+ 	__u32 prio = 0;
+ 	__u32 protocol = 0;
+ 	int protocol_set = 0;
++	__u32 chain_index;
++	int chain_index_set = 0;
+ 	char *fhandle = NULL;
+ 	char  d[16] = {};
+ 	char  k[16] = {};
+@@ -127,6 +129,13 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv)
+ 				invarg("invalid protocol", *argv);
+ 			protocol = id;
+ 			protocol_set = 1;
++		} else if (matches(*argv, "chain") == 0) {
++			NEXT_ARG();
++			if (chain_index_set)
++				duparg("chain", *argv);
++			if (get_u32(&chain_index, *argv, 0))
++				invarg("invalid chain index value", *argv);
++			chain_index_set = 1;
+ 		} else if (matches(*argv, "estimator") == 0) {
+ 			if (parse_estimator(&argc, &argv, &est) < 0)
+ 				return -1;
+@@ -146,6 +155,9 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv)
+ 
+ 	req.t.tcm_info = TC_H_MAKE(prio<<16, protocol);
+ 
++	if (chain_index_set)
++		addattr32(&req.n, sizeof(req), TCA_CHAIN, chain_index);
++
+ 	if (k[0])
+ 		addattr_l(&req.n, sizeof(req), TCA_KIND, k, strlen(k)+1);
+ 
+@@ -167,6 +179,7 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv)
+ 			return -1;
+ 		}
+ 	}
++
+ 	if (est.ewma_log)
+ 		addattr_l(&req.n, sizeof(req), TCA_RATE, &est, sizeof(est));
+ 
+@@ -193,6 +206,8 @@ static __u32 filter_parent;
+ static int filter_ifindex;
+ static __u32 filter_prio;
+ static __u32 filter_protocol;
++static __u32 filter_chain_index;
++static int filter_chain_index_set;
+ __u16 f_proto;
+ 
+ int print_filter(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
+@@ -270,6 +285,15 @@ int print_filter(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
+ 		}
+ 	}
+ 	fprintf(fp, "%s ", rta_getattr_str(tb[TCA_KIND]));
++
++	if (tb[TCA_CHAIN]) {
++		__u32 chain_index = rta_getattr_u32(tb[TCA_CHAIN]);
++
++		if (!filter_chain_index_set ||
++		    filter_chain_index != chain_index)
++			fprintf(fp, "chain %u ", chain_index);
++	}
++
+ 	q = get_filter_kind(RTA_DATA(tb[TCA_KIND]));
+ 	if (tb[TCA_OPTIONS]) {
+ 		if (q)
+@@ -312,6 +336,8 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv)
+ 	__u32 prio = 0;
+ 	__u32 protocol = 0;
+ 	int protocol_set = 0;
++	__u32 chain_index;
++	int chain_index_set = 0;
+ 	__u32 parent_handle = 0;
+ 	char *fhandle = NULL;
+ 	char  d[16] = {};
+@@ -376,6 +402,13 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv)
+ 				invarg("invalid protocol", *argv);
+ 			protocol = id;
+ 			protocol_set = 1;
++		} else if (matches(*argv, "chain") == 0) {
++			NEXT_ARG();
++			if (chain_index_set)
++				duparg("chain", *argv);
++			if (get_u32(&chain_index, *argv, 0))
++				invarg("invalid chain index value", *argv);
++			chain_index_set = 1;
+ 		} else if (matches(*argv, "help") == 0) {
+ 			usage();
+ 			return 0;
+@@ -405,6 +438,9 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv)
+ 
+ 	req.t.tcm_info = TC_H_MAKE(prio<<16, protocol);
+ 
++	if (chain_index_set)
++		addattr32(&req.n, sizeof(req), TCA_CHAIN, chain_index);
++
+ 	if (req.t.tcm_parent == TC_H_UNSPEC) {
+ 		fprintf(stderr, "Must specify filter parent\n");
+ 		return -1;
+@@ -462,10 +498,20 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv)
+ 
+ static int tc_filter_list(int argc, char **argv)
+ {
+-	struct tcmsg t = { .tcm_family = AF_UNSPEC };
++	struct {
++		struct nlmsghdr n;
++		struct tcmsg t;
++		char buf[MAX_MSG];
++	} req = {
++		.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcmsg)),
++		.n.nlmsg_type = RTM_GETTFILTER,
++		.t.tcm_parent = TC_H_UNSPEC,
++		.t.tcm_family = AF_UNSPEC,
++	};
+ 	char d[16] = {};
+ 	__u32 prio = 0;
+ 	__u32 protocol = 0;
++	__u32 chain_index;
+ 	char *fhandle = NULL;
+ 
+ 	while (argc > 0) {
+@@ -475,39 +521,39 @@ static int tc_filter_list(int argc, char **argv)
+ 				duparg("dev", *argv);
+ 			strncpy(d, *argv, sizeof(d)-1);
+ 		} else if (strcmp(*argv, "root") == 0) {
+-			if (t.tcm_parent) {
++			if (req.t.tcm_parent) {
+ 				fprintf(stderr,
+ 					"Error: \"root\" is duplicate parent ID\n");
+ 				return -1;
+ 			}
+-			filter_parent = t.tcm_parent = TC_H_ROOT;
++			filter_parent = req.t.tcm_parent = TC_H_ROOT;
+ 		} else if (strcmp(*argv, "ingress") == 0) {
+-			if (t.tcm_parent) {
++			if (req.t.tcm_parent) {
+ 				fprintf(stderr,
+ 					"Error: \"ingress\" is duplicate parent ID\n");
+ 				return -1;
+ 			}
+ 			filter_parent = TC_H_MAKE(TC_H_CLSACT,
+ 						  TC_H_MIN_INGRESS);
+-			t.tcm_parent = filter_parent;
++			req.t.tcm_parent = filter_parent;
+ 		} else if (strcmp(*argv, "egress") == 0) {
+-			if (t.tcm_parent) {
++			if (req.t.tcm_parent) {
+ 				fprintf(stderr,
+ 					"Error: \"egress\" is duplicate parent ID\n");
+ 				return -1;
+ 			}
+ 			filter_parent = TC_H_MAKE(TC_H_CLSACT,
+ 						  TC_H_MIN_EGRESS);
+-			t.tcm_parent = filter_parent;
++			req.t.tcm_parent = filter_parent;
+ 		} else if (strcmp(*argv, "parent") == 0) {
+ 			__u32 handle;
+ 
+ 			NEXT_ARG();
+-			if (t.tcm_parent)
++			if (req.t.tcm_parent)
+ 				duparg("parent", *argv);
+ 			if (get_tc_classid(&handle, *argv))
+ 				invarg("invalid parent ID", *argv);
+-			filter_parent = t.tcm_parent = handle;
++			filter_parent = req.t.tcm_parent = handle;
+ 		} else if (strcmp(*argv, "handle") == 0) {
+ 			NEXT_ARG();
+ 			if (fhandle)
+@@ -531,6 +577,14 @@ static int tc_filter_list(int argc, char **argv)
+ 				invarg("invalid protocol", *argv);
+ 			protocol = res;
+ 			filter_protocol = protocol;
++		} else if (matches(*argv, "chain") == 0) {
++			NEXT_ARG();
++			if (filter_chain_index_set)
++				duparg("chain", *argv);
++			if (get_u32(&chain_index, *argv, 0))
++				invarg("invalid chain index value", *argv);
++			filter_chain_index_set = 1;
++			filter_chain_index = chain_index;
+ 		} else if (matches(*argv, "help") == 0) {
+ 			usage();
+ 		} else {
+@@ -543,20 +597,23 @@ static int tc_filter_list(int argc, char **argv)
+ 		argc--; argv++;
+ 	}
+ 
+-	t.tcm_info = TC_H_MAKE(prio<<16, protocol);
++	req.t.tcm_info = TC_H_MAKE(prio<<16, protocol);
+ 
+ 	ll_init_map(&rth);
+ 
+ 	if (d[0]) {
+-		t.tcm_ifindex = ll_name_to_index(d);
+-		if (t.tcm_ifindex == 0) {
++		req.t.tcm_ifindex = ll_name_to_index(d);
++		if (req.t.tcm_ifindex == 0) {
+ 			fprintf(stderr, "Cannot find device \"%s\"\n", d);
+ 			return 1;
+ 		}
+-		filter_ifindex = t.tcm_ifindex;
++		filter_ifindex = req.t.tcm_ifindex;
+ 	}
+ 
+-	if (rtnl_dump_request(&rth, RTM_GETTFILTER, &t, sizeof(t)) < 0) {
++	if (filter_chain_index_set)
++		addattr32(&req.n, sizeof(req), TCA_CHAIN, chain_index);
++
++	if (rtnl_dump_request_n(&rth, &req.n) < 0) {
+ 		perror("Cannot send dump request");
+ 		return 1;
+ 	}
+-- 
+2.20.1
+
diff --git a/SOURCES/0132-tc-actions-add-helpers-to-parse-and-print-control-ac.patch b/SOURCES/0132-tc-actions-add-helpers-to-parse-and-print-control-ac.patch
new file mode 100644
index 0000000..7d1a3b4
--- /dev/null
+++ b/SOURCES/0132-tc-actions-add-helpers-to-parse-and-print-control-ac.patch
@@ -0,0 +1,772 @@
+From 23f1822fa8129326de4709d643f41cf26b6bae88 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Wed, 5 Jun 2019 13:09:39 +0200
+Subject: [PATCH] tc: actions: add helpers to parse and print control actions
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660
+Upstream Status: iproute2.git commit e67aba5595811
+Conflicts: context change due to out-of-order cherry-pick of
+           commit 73aa988868e7e ("tc/m_gact: Drop dead code")
+
+commit e67aba559581143f9bc34f0706b0c3feeeab08fa
+Author: Jiri Pirko <jiri@mellanox.com>
+Date:   Tue May 16 19:29:36 2017 +0200
+
+    tc: actions: add helpers to parse and print control actions
+
+    Each tc action is terminated by a control action. Each action parses and
+    prints then intividually. Introduce set of helpers and allow to share
+    this code.
+
+    Signed-off-by: Jiri Pirko <jiri@mellanox.com>
+---
+ tc/m_bpf.c        |   8 +--
+ tc/m_connmark.c   |   4 +-
+ tc/m_csum.c       |   9 ++-
+ tc/m_gact.c       |  45 ++++-----------
+ tc/m_ife.c        |  10 ++--
+ tc/m_mirred.c     |  10 ++--
+ tc/m_nat.c        |  11 ++--
+ tc/m_pedit.c      |   8 +--
+ tc/m_police.c     |  50 +++++------------
+ tc/m_sample.c     |   4 +-
+ tc/m_simple.c     |   3 -
+ tc/m_skbedit.c    |   7 +--
+ tc/m_skbmod.c     |  30 +---------
+ tc/m_tunnel_key.c |   8 +--
+ tc/m_vlan.c       |   9 ++-
+ tc/tc_util.c      | 137 +++++++++++++++++++++++++++++++++++++++++++++-
+ tc/tc_util.h      |  11 +++-
+ 17 files changed, 209 insertions(+), 155 deletions(-)
+
+diff --git a/tc/m_bpf.c b/tc/m_bpf.c
+index 1ddc334f2f21b..57283030a35f5 100644
+--- a/tc/m_bpf.c
++++ b/tc/m_bpf.c
+@@ -75,7 +75,7 @@ static int bpf_parse_opt(struct action_util *a, int *ptr_argc, char ***ptr_argv,
+ 			 int tca_id, struct nlmsghdr *n)
+ {
+ 	const char *bpf_obj = NULL, *bpf_uds_name = NULL;
+-	struct tc_act_bpf parm = { .action = TC_ACT_PIPE };
++	struct tc_act_bpf parm = {};
+ 	struct bpf_cfg_in cfg = {};
+ 	bool seen_run = false;
+ 	struct rtattr *tail;
+@@ -123,8 +123,8 @@ opt_bpf:
+ 		NEXT_ARG_FWD();
+ 	}
+ 
+-	if (argc && !action_a2n(*argv, &parm.action, false))
+-		NEXT_ARG_FWD();
++	parse_action_control_dflt(&argc, &argv, &parm.action,
++				  false, TC_ACT_PIPE);
+ 
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+@@ -186,7 +186,7 @@ static int bpf_print_opt(struct action_util *au, FILE *f, struct rtattr *arg)
+ 				      b, sizeof(b)));
+ 	}
+ 
+-	fprintf(f, "default-action %s\n", action_n2a(parm->action));
++	print_action_control(f, "default-action ", parm->action, "\n");
+ 	fprintf(f, "\tindex %u ref %d bind %d", parm->index, parm->refcnt,
+ 		parm->bindcnt);
+ 
+diff --git a/tc/m_connmark.c b/tc/m_connmark.c
+index 295f90d52eefd..3c2274bc0d2af 100644
+--- a/tc/m_connmark.c
++++ b/tc/m_connmark.c
+@@ -80,9 +80,7 @@ parse_connmark(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
+ 		}
+ 	}
+ 
+-	sel.action = TC_ACT_PIPE;
+-	if (argc && !action_a2n(*argv, &sel.action, false))
+-		NEXT_ARG_FWD();
++	parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_PIPE);
+ 
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+diff --git a/tc/m_csum.c b/tc/m_csum.c
+index 0ee8cad3fbe4c..7b156734f64c5 100644
+--- a/tc/m_csum.c
++++ b/tc/m_csum.c
+@@ -123,8 +123,7 @@ parse_csum(struct action_util *a, int *argc_p,
+ 		return -1;
+ 	}
+ 
+-	if (argc && !action_a2n(*argv, &sel.action, false))
+-		NEXT_ARG_FWD();
++	parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_OK);
+ 
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+@@ -200,10 +199,10 @@ print_csum(struct action_util *au, FILE *f, struct rtattr *arg)
+ 		uflag_1 = "?empty";
+ 	}
+ 
+-	fprintf(f, "csum (%s%s%s%s%s%s%s) action %s\n",
++	fprintf(f, "csum (%s%s%s%s%s%s%s) ",
+ 		uflag_1, uflag_2, uflag_3,
+-		uflag_4, uflag_5, uflag_6, uflag_7,
+-		action_n2a(sel->action));
++		uflag_4, uflag_5, uflag_6, uflag_7);
++	print_action_control(f, "action ", sel->action, "\n");
+ 	fprintf(f, "\tindex %u ref %d bind %d", sel->index, sel->refcnt,
+ 		sel->bindcnt);
+ 
+diff --git a/tc/m_gact.c b/tc/m_gact.c
+index 0cb5222fd3817..bc3860bbe4441 100644
+--- a/tc/m_gact.c
++++ b/tc/m_gact.c
+@@ -68,26 +68,13 @@ usage(void)
+ 	exit(-1);
+ }
+ 
+-static int
+-get_act(char ***argv_p)
+-{
+-	int n;
+-
+-	if (action_a2n(**argv_p, &n, false)) {
+-		fprintf(stderr, "bad action type %s\n", **argv_p);
+-		return -10;
+-	}
+-	return n;
+-}
+-
+ static int
+ parse_gact(struct action_util *a, int *argc_p, char ***argv_p,
+ 	   int tca_id, struct nlmsghdr *n)
+ {
+ 	int argc = *argc_p;
+ 	char **argv = *argv_p;
+-	int action = TC_POLICE_RECLASSIFY;
+-	struct tc_gact p = { .action = TC_POLICE_RECLASSIFY };
++	struct tc_gact p = { 0 };
+ #ifdef CONFIG_GACT_PROB
+ 	int rd = 0;
+ 	struct tc_gact_p pp;
+@@ -101,16 +88,8 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p,
+ 	if (matches(*argv, "gact") == 0) {
+ 		argc--;
+ 		argv++;
+-	} else {
+-		action = get_act(&argv);
+-		if (action != -10) {
+-			p.action = action;
+-			argc--;
+-			argv++;
+-		} else {
+-			explain();
+-			return action;
+-		}
++	} else if (parse_action_control(&argc, &argv, &p.action, false) == -1) {
++		usage();
+ 	}
+ 
+ #ifdef CONFIG_GACT_PROB
+@@ -129,13 +108,9 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p,
+ 				return -1;
+ 			}
+ 
+-			action = get_act(&argv);
+-			if (action != -10) { /* FIXME */
+-				pp.paction = action;
+-			} else {
+-				explain();
+-				return -1;
+-			}
++			if (parse_action_control(&argc, &argv,
++						 &pp.paction, false) == -1)
++				usage();
+ 			argc--;
+ 			argv++;
+ 			if (get_u16(&pp.pval, *argv, 10)) {
+@@ -204,7 +179,8 @@ print_gact(struct action_util *au, FILE * f, struct rtattr *arg)
+ 	}
+ 	p = RTA_DATA(tb[TCA_GACT_PARMS]);
+ 
+-	fprintf(f, "gact action %s", action_n2a(p->action));
++	fprintf(f, "gact ");
++	print_action_control(f, "action ", p->action, "");
+ #ifdef CONFIG_GACT_PROB
+ 	if (tb[TCA_GACT_PROB] != NULL) {
+ 		pp = RTA_DATA(tb[TCA_GACT_PROB]);
+@@ -213,8 +189,9 @@ print_gact(struct action_util *au, FILE * f, struct rtattr *arg)
+ 		memset(&pp_dummy, 0, sizeof(pp_dummy));
+ 		pp = &pp_dummy;
+ 	}
+-	fprintf(f, "\n\t random type %s %s val %d",
+-		prob_n2a(pp->ptype), action_n2a(pp->paction), pp->pval);
++	fprintf(f, "\n\t random type %s", prob_n2a(pp->ptype));
++	print_action_control(f, " ", pp->paction, " ");
++	fprintf(f, "val %d", pp->pval);
+ #endif
+ 	fprintf(f, "\n\t index %u ref %d bind %d", p->index, p->refcnt,
+ 		p->bindcnt);
+diff --git a/tc/m_ife.c b/tc/m_ife.c
+index f6131b1332324..e3521e62c178c 100644
+--- a/tc/m_ife.c
++++ b/tc/m_ife.c
+@@ -57,7 +57,7 @@ static int parse_ife(struct action_util *a, int *argc_p, char ***argv_p,
+ 	int argc = *argc_p;
+ 	char **argv = *argv_p;
+ 	int ok = 0;
+-	struct tc_ife p = { .action = TC_ACT_PIPE };	/* good default */
++	struct tc_ife p = { 0 };
+ 	struct rtattr *tail;
+ 	struct rtattr *tail2;
+ 	char dbuf[ETH_ALEN];
+@@ -156,8 +156,7 @@ static int parse_ife(struct action_util *a, int *argc_p, char ***argv_p,
+ 		argv++;
+ 	}
+ 
+-	if (argc && !action_a2n(*argv, &p.action, false))
+-		NEXT_ARG_FWD();
++	parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE);
+ 
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+@@ -245,9 +244,8 @@ static int print_ife(struct action_util *au, FILE *f, struct rtattr *arg)
+ 	}
+ 	p = RTA_DATA(tb[TCA_IFE_PARMS]);
+ 
+-	fprintf(f, "ife %s action %s ",
+-		(p->flags & IFE_ENCODE) ? "encode" : "decode",
+-		action_n2a(p->action));
++	fprintf(f, "ife %s ", p->flags & IFE_ENCODE ? "encode" : "decode");
++	print_action_control(f, "action ", p->action, " ");
+ 
+ 	if (tb[TCA_IFE_TYPE]) {
+ 		ife_type = rta_getattr_u16(tb[TCA_IFE_TYPE]);
+diff --git a/tc/m_mirred.c b/tc/m_mirred.c
+index e9438904fdf50..2384bda1ff045 100644
+--- a/tc/m_mirred.c
++++ b/tc/m_mirred.c
+@@ -170,10 +170,8 @@ parse_direction(struct action_util *a, int *argc_p, char ***argv_p,
+ 	}
+ 
+ 
+-	if (argc &&
+-	    (p.eaction == TCA_EGRESS_MIRROR || p.eaction == TCA_INGRESS_MIRROR)
+-	    && !action_a2n(*argv, &p.action, false))
+-		NEXT_ARG();
++	if (p.eaction == TCA_EGRESS_MIRROR || p.eaction == TCA_INGRESS_MIRROR)
++		parse_action_control(&argc, &argv, &p.action, false);
+ 
+ 	if (argc) {
+ 		if (iok && matches(*argv, "index") == 0) {
+@@ -272,8 +270,8 @@ print_mirred(struct action_util *au, FILE * f, struct rtattr *arg)
+ 		return -1;
+ 	}
+ 
+-	fprintf(f, "mirred (%s to device %s) %s",
+-		mirred_n2a(p->eaction), dev, action_n2a(p->action));
++	fprintf(f, "mirred (%s to device %s)", mirred_n2a(p->eaction), dev);
++	print_action_control(f, " ", p->action, "");
+ 
+ 	fprintf(f, "\n ");
+ 	fprintf(f, "\tindex %u ref %d bind %d", p->index, p->refcnt,
+diff --git a/tc/m_nat.c b/tc/m_nat.c
+index 525f185e2c082..31b68fb6bd784 100644
+--- a/tc/m_nat.c
++++ b/tc/m_nat.c
+@@ -115,8 +115,7 @@ parse_nat(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct
+ 		return -1;
+ 	}
+ 
+-	if (argc && !action_a2n(*argv, &sel.action, false))
+-		NEXT_ARG_FWD();
++	parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_OK);
+ 
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+@@ -164,12 +163,12 @@ print_nat(struct action_util *au, FILE * f, struct rtattr *arg)
+ 	len = ffs(sel->mask);
+ 	len = len ? 33 - len : 0;
+ 
+-	fprintf(f, " nat %s %s/%d %s %s", sel->flags & TCA_NAT_FLAG_EGRESS ?
+-					  "egress" : "ingress",
++	fprintf(f, " nat %s %s/%d %s", sel->flags & TCA_NAT_FLAG_EGRESS ?
++				       "egress" : "ingress",
+ 		format_host_r(AF_INET, 4, &sel->old_addr, buf1, sizeof(buf1)),
+ 		len,
+-		format_host_r(AF_INET, 4, &sel->new_addr, buf2, sizeof(buf2)),
+-		action_n2a(sel->action));
++		format_host_r(AF_INET, 4, &sel->new_addr, buf2, sizeof(buf2)));
++	print_action_control(f, " ", sel->action, "");
+ 
+ 	if (show_stats) {
+ 		if (tb[TCA_NAT_TM]) {
+diff --git a/tc/m_pedit.c b/tc/m_pedit.c
+index dfa6b2c4835e9..b7d26b4540beb 100644
+--- a/tc/m_pedit.c
++++ b/tc/m_pedit.c
+@@ -670,8 +670,7 @@ int parse_pedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
+ 		return -1;
+ 	}
+ 
+-	if (argc && !action_a2n(*argv, &sel.sel.action, false))
+-		NEXT_ARG();
++	parse_action_control_dflt(&argc, &argv, &sel.sel.action, false, TC_ACT_OK);
+ 
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+@@ -776,8 +775,9 @@ int print_pedit(struct action_util *au, FILE *f, struct rtattr *arg)
+ 		}
+ 	}
+ 
+-	fprintf(f, " pedit action %s keys %d\n ",
+-		action_n2a(sel->action), sel->nkeys);
++	fprintf(f, " pedit ");
++	print_action_control(f, "action ", sel->action, " ");
++	fprintf(f,"keys %d\n ", sel->nkeys);
+ 	fprintf(f, "\t index %u ref %d bind %d", sel->index, sel->refcnt,
+ 		sel->bindcnt);
+ 
+diff --git a/tc/m_police.c b/tc/m_police.c
+index 226e20e4e8005..2b73969de5daf 100644
+--- a/tc/m_police.c
++++ b/tc/m_police.c
+@@ -50,27 +50,6 @@ static void explain1(char *arg)
+ 	fprintf(stderr, "Illegal \"%s\"\n", arg);
+ }
+ 
+-static int get_police_result(int *action, int *result, char *arg)
+-{
+-	char *p = strchr(arg, '/');
+-
+-	if (p)
+-		*p = 0;
+-
+-	if (action_a2n(arg, action, true)) {
+-		if (p)
+-			*p = '/';
+-		return -1;
+-	}
+-
+-	if (p) {
+-		*p = '/';
+-		if (action_a2n(p+1, result, true))
+-			return -1;
+-	}
+-	return 0;
+-}
+-
+ int act_parse_police(struct action_util *a, int *argc_p, char ***argv_p,
+ 		     int tca_id, struct nlmsghdr *n)
+ {
+@@ -166,23 +145,19 @@ int act_parse_police(struct action_util *a, int *argc_p, char ***argv_p,
+ 				explain1("peakrate");
+ 				return -1;
+ 			}
+-		} else if (matches(*argv, "reclassify") == 0) {
+-			p.action = TC_POLICE_RECLASSIFY;
+-		} else if (matches(*argv, "drop") == 0 ||
+-			   matches(*argv, "shot") == 0) {
+-			p.action = TC_POLICE_SHOT;
+-		} else if (matches(*argv, "continue") == 0) {
+-			p.action = TC_POLICE_UNSPEC;
+-		} else if (matches(*argv, "pass") == 0) {
+-			p.action = TC_POLICE_OK;
+-		} else if (matches(*argv, "pipe") == 0) {
+-			p.action = TC_POLICE_PIPE;
++		} else if (matches(*argv, "reclassify") == 0 ||
++			   matches(*argv, "drop") == 0 ||
++			   matches(*argv, "shot") == 0 ||
++			   matches(*argv, "continue") == 0 ||
++			   matches(*argv, "pass") == 0 ||
++			   matches(*argv, "pipe") == 0) {
++			if (parse_action_control(&argc, &argv, &p.action, false))
++				return -1;
+ 		} else if (strcmp(*argv, "conform-exceed") == 0) {
+ 			NEXT_ARG();
+-			if (get_police_result(&p.action, &presult, *argv)) {
+-				fprintf(stderr, "Illegal \"action\"\n");
++			if (parse_action_control_slash(&argc, &argv, &p.action,
++						       &presult, true))
+ 				return -1;
+-			}
+ 		} else if (matches(*argv, "overhead") == 0) {
+ 			NEXT_ARG();
+ 			if (get_u16(&overhead, *argv, 10)) {
+@@ -318,12 +293,13 @@ int print_police(struct action_util *a, FILE *f, struct rtattr *arg)
+ 		fprintf(f, "avrate %s ",
+ 			sprint_rate(rta_getattr_u32(tb[TCA_POLICE_AVRATE]),
+ 				    b1));
+-	fprintf(f, "action %s", action_n2a(p->action));
++
++	print_action_control(f, "action ", p->action, "");
+ 
+ 	if (tb[TCA_POLICE_RESULT]) {
+ 		__u32 action = rta_getattr_u32(tb[TCA_POLICE_RESULT]);
+ 
+-		fprintf(f, "/%s ", action_n2a(action));
++		print_action_control(f, "/", action, " ");
+ 	} else
+ 		fprintf(f, " ");
+ 
+diff --git a/tc/m_sample.c b/tc/m_sample.c
+index 9291109071a89..ff5ee6bd1ef63 100644
+--- a/tc/m_sample.c
++++ b/tc/m_sample.c
+@@ -98,9 +98,7 @@ static int parse_sample(struct action_util *a, int *argc_p, char ***argv_p,
+ 		NEXT_ARG_FWD();
+ 	}
+ 
+-	p.action = TC_ACT_PIPE;
+-	if (argc && !action_a2n(*argv, &p.action, false))
+-		NEXT_ARG_FWD();
++	parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE);
+ 
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+diff --git a/tc/m_simple.c b/tc/m_simple.c
+index 65e48addf161b..f8937bcabb7ae 100644
+--- a/tc/m_simple.c
++++ b/tc/m_simple.c
+@@ -120,9 +120,6 @@ parse_simple(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
+ 		}
+ 	}
+ 
+-	if (argc && !action_a2n(*argv, &sel.action, false))
+-		NEXT_ARG_FWD();
+-
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+ 			NEXT_ARG();
+diff --git a/tc/m_skbedit.c b/tc/m_skbedit.c
+index 638715f679d37..aa374fcb33ed9 100644
+--- a/tc/m_skbedit.c
++++ b/tc/m_skbedit.c
+@@ -120,9 +120,8 @@ parse_skbedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
+ 		argv++;
+ 	}
+ 
+-	sel.action = TC_ACT_PIPE;
+-	if (argc && !action_a2n(*argv, &sel.action, false))
+-		NEXT_ARG();
++	parse_action_control_dflt(&argc, &argv, &sel.action,
++				  false, TC_ACT_PIPE);
+ 
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+@@ -214,7 +213,7 @@ static int print_skbedit(struct action_util *au, FILE *f, struct rtattr *arg)
+ 			fprintf(f, " ptype %d", *ptype);
+ 	}
+ 
+-	fprintf(f, " %s", action_n2a(p->action));
++	print_action_control(f, " ", p->action, "");
+ 
+ 	fprintf(f, "\n\t index %u ref %d bind %d",
+ 		p->index, p->refcnt, p->bindcnt);
+diff --git a/tc/m_skbmod.c b/tc/m_skbmod.c
+index acb7771d2901b..1ccd474309348 100644
+--- a/tc/m_skbmod.c
++++ b/tc/m_skbmod.c
+@@ -61,7 +61,6 @@ static int parse_skbmod(struct action_util *a, int *argc_p, char ***argv_p,
+ 	char *saddr = NULL;
+ 
+ 	memset(&p, 0, sizeof(p));
+-	p.action = TC_ACT_PIPE;	/* good default */
+ 
+ 	if (argc <= 0)
+ 		return -1;
+@@ -123,31 +122,7 @@ static int parse_skbmod(struct action_util *a, int *argc_p, char ***argv_p,
+ 		argv++;
+ 	}
+ 
+-	if (argc) {
+-		if (matches(*argv, "reclassify") == 0) {
+-			p.action = TC_ACT_RECLASSIFY;
+-			argc--;
+-			argv++;
+-		} else if (matches(*argv, "pipe") == 0) {
+-			p.action = TC_ACT_PIPE;
+-			argc--;
+-			argv++;
+-		} else if (matches(*argv, "drop") == 0 ||
+-			   matches(*argv, "shot") == 0) {
+-			p.action = TC_ACT_SHOT;
+-			argc--;
+-			argv++;
+-		} else if (matches(*argv, "continue") == 0) {
+-			p.action = TC_ACT_UNSPEC;
+-			argc--;
+-			argv++;
+-		} else if (matches(*argv, "pass") == 0 ||
+-			   matches(*argv, "ok") == 0) {
+-			p.action = TC_ACT_OK;
+-			argc--;
+-			argv++;
+-		}
+-	}
++	parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE);
+ 
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+@@ -206,7 +181,8 @@ static int print_skbmod(struct action_util *au, FILE *f, struct rtattr *arg)
+ 
+ 	p = RTA_DATA(tb[TCA_SKBMOD_PARMS]);
+ 
+-	fprintf(f, "skbmod action %s ", action_n2a(p->action));
++	fprintf(f, "skbmod ");
++	print_action_control(f, "", p->action, " ");
+ 
+ 	if (tb[TCA_SKBMOD_ETYPE]) {
+ 		skbmod_etype = rta_getattr_u16(tb[TCA_SKBMOD_ETYPE]);
+diff --git a/tc/m_tunnel_key.c b/tc/m_tunnel_key.c
+index 60fd1c464e531..cdde64a15b929 100644
+--- a/tc/m_tunnel_key.c
++++ b/tc/m_tunnel_key.c
+@@ -99,7 +99,7 @@ static int tunnel_key_parse_tos_ttl(char *str, int type, struct nlmsghdr *n)
+ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p,
+ 			    int tca_id, struct nlmsghdr *n)
+ {
+-	struct tc_tunnel_key parm = { .action = TC_ACT_PIPE };
++	struct tc_tunnel_key parm = {};
+ 	char **argv = *argv_p;
+ 	int argc = *argc_p;
+ 	struct rtattr *tail;
+@@ -194,8 +194,8 @@ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p,
+ 		NEXT_ARG_FWD();
+ 	}
+ 
+-	if (argc && !action_a2n(*argv, &parm.action, false))
+-		NEXT_ARG_FWD();
++	parse_action_control_dflt(&argc, &argv, &parm.action,
++				  false, TC_ACT_PIPE);
+ 
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+@@ -318,7 +318,7 @@ static int print_tunnel_key(struct action_util *au, FILE *f, struct rtattr *arg)
+ 					  tb[TCA_TUNNEL_KEY_ENC_TTL]);
+ 		break;
+ 	}
+-	fprintf(f, " %s", action_n2a(parm->action));
++	print_action_control(f, " ", parm->action, "");
+ 
+ 	fprintf(f, "\n\tindex %d ref %d bind %d", parm->index, parm->refcnt,
+ 		parm->bindcnt);
+diff --git a/tc/m_vlan.c b/tc/m_vlan.c
+index 44b9375966da3..2441b06847ecd 100644
+--- a/tc/m_vlan.c
++++ b/tc/m_vlan.c
+@@ -59,7 +59,7 @@ static int parse_vlan(struct action_util *a, int *argc_p, char ***argv_p,
+ 	int proto_set = 0;
+ 	__u8 prio;
+ 	int prio_set = 0;
+-	struct tc_vlan parm = { 0 };
++	struct tc_vlan parm = {};
+ 
+ 	if (matches(*argv, "vlan") != 0)
+ 		return -1;
+@@ -133,9 +133,8 @@ static int parse_vlan(struct action_util *a, int *argc_p, char ***argv_p,
+ 		argv++;
+ 	}
+ 
+-	parm.action = TC_ACT_PIPE;
+-	if (argc && !action_a2n(*argv, &parm.action, false))
+-		NEXT_ARG_FWD();
++	parse_action_control_dflt(&argc, &argv, &parm.action,
++				  false, TC_ACT_PIPE);
+ 
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+@@ -224,7 +223,7 @@ static int print_vlan(struct action_util *au, FILE *f, struct rtattr *arg)
+ 		}
+ 		break;
+ 	}
+-	fprintf(f, " %s", action_n2a(parm->action));
++	print_action_control(f, " ", parm->action, "");
+ 
+ 	fprintf(f, "\n\t index %u ref %d bind %d", parm->index, parm->refcnt,
+ 		parm->bindcnt);
+diff --git a/tc/tc_util.c b/tc/tc_util.c
+index 296825ae174e0..840222832690b 100644
+--- a/tc/tc_util.c
++++ b/tc/tc_util.c
+@@ -411,7 +411,7 @@ char *sprint_qdisc_handle(__u32 h, char *buf)
+ 	return buf;
+ }
+ 
+-const char *action_n2a(int action)
++static const char *action_n2a(int action)
+ {
+ 	static char buf[64];
+ 
+@@ -443,7 +443,7 @@ const char *action_n2a(int action)
+  *
+  * In error case, returns -1 and does not touch @result. Otherwise returns 0.
+  */
+-int action_a2n(char *arg, int *result, bool allow_num)
++static int action_a2n(char *arg, int *result, bool allow_num)
+ {
+ 	int n;
+ 	char dummy;
+@@ -474,6 +474,139 @@ int action_a2n(char *arg, int *result, bool allow_num)
+ 	return 0;
+ }
+ 
++/* Parse action control including possible options.
++ *
++ * Parameters:
++ * @argc_p - pointer to argc to parse
++ * @argv_p - pointer to argv to parse
++ * @result_p - pointer to output variable
++ * @allow_num - whether action may be in numeric format already
++ *
++ * In error case, returns -1 and does not touch @result_1p. Otherwise returns 0.
++ */
++int parse_action_control(int *argc_p, char ***argv_p,
++			 int *result_p, bool allow_num)
++{
++	int argc = *argc_p;
++	char **argv = *argv_p;
++	int result;
++
++	if (!argc)
++		return -1;
++	if (action_a2n(*argv, &result, allow_num) == -1) {
++		fprintf(stderr, "Bad action type %s\n", *argv);
++		return -1;
++	}
++	NEXT_ARG_FWD();
++	*argc_p = argc;
++	*argv_p = argv;
++	*result_p = result;
++	return 0;
++}
++
++/* Parse action control including possible options.
++ *
++ * Parameters:
++ * @argc_p - pointer to argc to parse
++ * @argv_p - pointer to argv to parse
++ * @result_p - pointer to output variable
++ * @allow_num - whether action may be in numeric format already
++ * @default_result - set as a result in case of parsing error
++ *
++ * In case there is an error during parsing, the default result is used.
++ */
++void parse_action_control_dflt(int *argc_p, char ***argv_p,
++			       int *result_p, bool allow_num,
++			       int default_result)
++{
++	if (parse_action_control(argc_p, argv_p, result_p, allow_num))
++		*result_p = default_result;
++}
++
++static int parse_action_control_slash_spaces(int *argc_p, char ***argv_p,
++					     int *result1_p, int *result2_p,
++					     bool allow_num)
++{
++	int argc = *argc_p;
++	char **argv = *argv_p;
++	int result1, result2;
++	int *result_p = &result1;
++	int ok = 0;
++	int ret;
++
++	while (argc > 0) {
++		switch (ok) {
++		case 1:
++			if (strcmp(*argv, "/") != 0)
++				goto out;
++			result_p = &result2;
++			NEXT_ARG();
++			/* fall-through */
++		case 0: /* fall-through */
++		case 2:
++			ret = parse_action_control(&argc, &argv,
++						   result_p, allow_num);
++			if (ret)
++				return ret;
++			ok++;
++			break;
++		default:
++			goto out;
++		}
++	}
++out:
++	*result1_p = result1;
++	if (ok == 2)
++		*result2_p = result2;
++	*argc_p = argc;
++	*argv_p = argv;
++	return 0;
++}
++
++/* Parse action control with slash including possible options.
++ *
++ * Parameters:
++ * @argc_p - pointer to argc to parse
++ * @argv_p - pointer to argv to parse
++ * @result1_p - pointer to the first (before slash) output variable
++ * @result2_p - pointer to the second (after slash) output variable
++ * @allow_num - whether action may be in numeric format already
++ *
++ * In error case, returns -1 and does not touch @result*. Otherwise returns 0.
++ */
++int parse_action_control_slash(int *argc_p, char ***argv_p,
++			       int *result1_p, int *result2_p, bool allow_num)
++{
++	char **argv = *argv_p;
++	int result1, result2;
++	char *p = strchr(*argv, '/');
++
++	if (!p)
++		return parse_action_control_slash_spaces(argc_p, argv_p,
++							 result1_p, result2_p,
++							 allow_num);
++	*p = 0;
++	if (action_a2n(*argv, &result1, allow_num)) {
++		if (p)
++			*p = '/';
++		return -1;
++	}
++
++	*p = '/';
++	if (action_a2n(p + 1, &result2, allow_num))
++		return -1;
++
++	*result1_p = result1;
++	*result2_p = result2;
++	return 0;
++}
++
++void print_action_control(FILE *f, const char *prefix,
++			  int action, const char *suffix)
++{
++	fprintf(f, "%s%s%s", prefix, action_n2a(action), suffix);
++}
++
+ int get_linklayer(unsigned int *val, const char *arg)
+ {
+ 	int res;
+diff --git a/tc/tc_util.h b/tc/tc_util.h
+index 4db26c6d5e25b..5c54ad384eae6 100644
+--- a/tc/tc_util.h
++++ b/tc/tc_util.h
+@@ -100,8 +100,15 @@ char *sprint_tc_classid(__u32 h, char *buf);
+ int tc_print_police(FILE *f, struct rtattr *tb);
+ int parse_police(int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n);
+ 
+-const char *action_n2a(int action);
+-int action_a2n(char *arg, int *result, bool allow_num);
++int parse_action_control(int *argc_p, char ***argv_p,
++			 int *result_p, bool allow_num);
++void parse_action_control_dflt(int *argc_p, char ***argv_p,
++			       int *result_p, bool allow_num,
++			       int default_result);
++int parse_action_control_slash(int *argc_p, char ***argv_p,
++			       int *result1_p, int *result2_p, bool allow_num);
++void print_action_control(FILE *f, const char *prefix,
++			  int action, const char *suffix);
+ int act_parse_police(struct action_util *a, int *argc_p,
+ 		     char ***argv_p, int tca_id, struct nlmsghdr *n);
+ int print_police(struct action_util *a, FILE *f, struct rtattr *tb);
+-- 
+2.20.1
+
diff --git a/SOURCES/0133-tc-actions-introduce-support-for-goto-chain-action.patch b/SOURCES/0133-tc-actions-introduce-support-for-goto-chain-action.patch
new file mode 100644
index 0000000..bd60875
--- /dev/null
+++ b/SOURCES/0133-tc-actions-introduce-support-for-goto-chain-action.patch
@@ -0,0 +1,247 @@
+From eaccce1b85efafbea1607ff88d7259541f311ee2 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Wed, 5 Jun 2019 13:10:31 +0200
+Subject: [PATCH] tc/actions: introduce support for goto chain action
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660
+Upstream Status: iproute2.git commit d19f72f7898a7
+
+commit d19f72f7898a78ef76628833c204afb96f9a05cd
+Author: Jiri Pirko <jiri@mellanox.com>
+Date:   Tue May 16 19:29:37 2017 +0200
+
+    tc/actions: introduce support for goto chain action
+
+    Allow user to set control action "goto" with filter chain index as
+    a parameter.
+
+    Signed-off-by: Jiri Pirko <jiri@mellanox.com>
+---
+ man/man8/tc-ife.8    |  2 +-
+ man/man8/tc-pedit.8  |  2 +-
+ man/man8/tc-police.8 |  2 +-
+ man/man8/tc-vlan.8   |  2 +-
+ tc/m_connmark.c      |  3 ++-
+ tc/m_gact.c          |  6 ++++--
+ tc/m_pedit.c         |  3 ++-
+ tc/m_police.c        |  6 ++++--
+ tc/m_skbmod.c        |  3 ++-
+ tc/m_vlan.c          |  3 ++-
+ tc/tc_util.c         | 24 +++++++++++++++++++++++-
+ 11 files changed, 43 insertions(+), 13 deletions(-)
+
+diff --git a/man/man8/tc-ife.8 b/man/man8/tc-ife.8
+index a8f1f287d1502..24595cc6d615c 100644
+--- a/man/man8/tc-ife.8
++++ b/man/man8/tc-ife.8
+@@ -34,7 +34,7 @@ IFE - encapsulate/decapsulate metadata
+ 
+ .ti -8
+ .IR CONTROL " := { "
+-.BR reclassify " | " use " | " pipe " | " drop " | " continue " | " ok " }"
++.BR reclassify " | " use " | " pipe " | " drop " | " continue " | " ok " | " goto " " chain " " CHAIN_INDEX " }"
+ .SH DESCRIPTION
+ The
+ .B ife
+diff --git a/man/man8/tc-pedit.8 b/man/man8/tc-pedit.8
+index 82d4217bc9589..bbd725c4d0ba1 100644
+--- a/man/man8/tc-pedit.8
++++ b/man/man8/tc-pedit.8
+@@ -82,7 +82,7 @@ pedit - generic packet editor action
+ 
+ .ti -8
+ .IR CONTROL " := {"
+-.BR reclassify " | " pipe " | " drop " | " shot " | " continue " | " pass " }"
++.BR reclassify " | " pipe " | " drop " | " shot " | " continue " | " pass " | " goto " " chain " " CHAIN_INDEX " }"
+ .SH DESCRIPTION
+ The
+ .B pedit
+diff --git a/man/man8/tc-police.8 b/man/man8/tc-police.8
+index 620c28813fc7e..bcc5f438825d1 100644
+--- a/man/man8/tc-police.8
++++ b/man/man8/tc-police.8
+@@ -30,7 +30,7 @@ police - policing action
+ 
+ .ti -8
+ .IR EXCEEDACT/NOTEXCEEDACT " := { "
+-.BR pipe " | " ok " | " reclassify " | " drop " | " continue " }"
++.BR pipe " | " ok " | " reclassify " | " drop " | " continue " | " goto " " chain " " CHAIN_INDEX " }"
+ .SH DESCRIPTION
+ The
+ .B police
+diff --git a/man/man8/tc-vlan.8 b/man/man8/tc-vlan.8
+index a526f66b60b4c..f5ffc25f054ed 100644
+--- a/man/man8/tc-vlan.8
++++ b/man/man8/tc-vlan.8
+@@ -26,7 +26,7 @@ vlan - vlan manipulation module
+ 
+ .ti -8
+ .IR CONTROL " := { "
+-.BR reclassify " | " pipe " | " drop " | " continue " | " pass " }"
++.BR reclassify " | " pipe " | " drop " | " continue " | " pass " | " goto " " chain " " CHAIN_INDEX " }"
+ .SH DESCRIPTION
+ The
+ .B vlan
+diff --git a/tc/m_connmark.c b/tc/m_connmark.c
+index 3c2274bc0d2af..37d7185415490 100644
+--- a/tc/m_connmark.c
++++ b/tc/m_connmark.c
+@@ -30,7 +30,8 @@ explain(void)
+ 	fprintf(stderr, "Usage: ... connmark [zone ZONE] [CONTROL] [index <INDEX>]\n");
+ 	fprintf(stderr, "where :\n"
+ 		"\tZONE is the conntrack zone\n"
+-		"\tCONTROL := reclassify|pipe|drop|continue|ok\n");
++		"\tCONTROL := reclassify | pipe | drop | continue | ok |\n"
++		"\t           goto chain <CHAIN_INDEX>\n");
+ }
+ 
+ static void
+diff --git a/tc/m_gact.c b/tc/m_gact.c
+index bc3860bbe4441..c04c00bbded3c 100644
+--- a/tc/m_gact.c
++++ b/tc/m_gact.c
+@@ -45,7 +45,8 @@ explain(void)
+ #ifdef CONFIG_GACT_PROB
+ 	fprintf(stderr, "Usage: ... gact <ACTION> [RAND] [INDEX]\n");
+ 	fprintf(stderr,
+-		"Where: \tACTION := reclassify | drop | continue | pass | pipe\n"
++		"Where: \tACTION := reclassify | drop | continue | pass | pipe |\n"
++		"       \t          goto chain <CHAIN_INDEX>\n"
+ 			"\tRAND := random <RANDTYPE> <ACTION> <VAL>\n"
+ 			"\tRANDTYPE := netrand | determ\n"
+ 			"\tVAL : = value not exceeding 10000\n"
+@@ -54,7 +55,8 @@ explain(void)
+ #else
+ 	fprintf(stderr, "Usage: ... gact <ACTION> [INDEX]\n");
+ 	fprintf(stderr,
+-		"Where: \tACTION := reclassify | drop | continue | pass | pipe\n"
++		"Where: \tACTION := reclassify | drop | continue | pass | pipe |\n"
++		"       \t          goto chain <CHAIN_INDEX>\n"
+ 		"\tINDEX := index value used\n"
+ 		"\n");
+ #endif
+diff --git a/tc/m_pedit.c b/tc/m_pedit.c
+index b7d26b4540beb..5d89ab1d832ab 100644
+--- a/tc/m_pedit.c
++++ b/tc/m_pedit.c
+@@ -45,7 +45,8 @@ static void explain(void)
+ 		"\t\tCMD:= clear | invert | set <setval>| add <addval> | retain\n"
+ 		"\t<LAYERED>:= ip <ipdata> | ip6 <ip6data>\n"
+ 		" \t\t| udp <udpdata> | tcp <tcpdata> | icmp <icmpdata>\n"
+-		"\tCONTROL:= reclassify | pipe | drop | continue | pass\n"
++		"\tCONTROL:= reclassify | pipe | drop | continue | pass |\n"
++		"\t          goto chain <CHAIN_INDEX>\n"
+ 		"\tNOTE: if 'ex' is set, extended functionality will be supported (kernel >= 4.11)\n"
+ 		"For Example usage look at the examples directory\n");
+ 
+diff --git a/tc/m_police.c b/tc/m_police.c
+index 2b73969de5daf..86117db0482ec 100644
+--- a/tc/m_police.c
++++ b/tc/m_police.c
+@@ -41,7 +41,8 @@ static void usage(void)
+ 	fprintf(stderr, "Where: CONTROL := conform-exceed <EXCEEDACT>[/NOTEXCEEDACT]\n");
+ 	fprintf(stderr, "                  Define how to handle packets which exceed (<EXCEEDACT>)\n");
+ 	fprintf(stderr, "                  or conform (<NOTEXCEEDACT>) the configured bandwidth limit.\n");
+-	fprintf(stderr, "       EXCEEDACT/NOTEXCEEDACT := { pipe | ok | reclassify | drop | continue }\n");
++	fprintf(stderr, "       EXCEEDACT/NOTEXCEEDACT := { pipe | ok | reclassify | drop | continue |\n");
++	fprintf(stderr, "                                   goto chain <CHAIN_INDEX> }\n");
+ 	exit(-1);
+ }
+ 
+@@ -150,7 +151,8 @@ int act_parse_police(struct action_util *a, int *argc_p, char ***argv_p,
+ 			   matches(*argv, "shot") == 0 ||
+ 			   matches(*argv, "continue") == 0 ||
+ 			   matches(*argv, "pass") == 0 ||
+-			   matches(*argv, "pipe") == 0) {
++			   matches(*argv, "pipe") == 0 ||
++			   matches(*argv, "goto") == 0) {
+ 			if (parse_action_control(&argc, &argv, &p.action, false))
+ 				return -1;
+ 		} else if (strcmp(*argv, "conform-exceed") == 0) {
+diff --git a/tc/m_skbmod.c b/tc/m_skbmod.c
+index 1ccd474309348..ba79308ba8354 100644
+--- a/tc/m_skbmod.c
++++ b/tc/m_skbmod.c
+@@ -36,7 +36,8 @@ static void skbmod_explain(void)
+ 		"\tDMAC := 6 byte Destination MAC address\n"
+ 		"\tSMAC := optional 6 byte Source MAC address\n"
+ 		"\tETYPE := optional 16 bit ethertype\n"
+-		"\tCONTROL := reclassify|pipe|drop|continue|ok\n"
++		"\tCONTROL := reclassify | pipe | drop | continue | ok |\n"
++		"\t           goto chain <CHAIN_INDEX>\n"
+ 		"\tINDEX := skbmod index value to use\n");
+ }
+ 
+diff --git a/tc/m_vlan.c b/tc/m_vlan.c
+index 2441b06847ecd..cccb4996b05f3 100644
+--- a/tc/m_vlan.c
++++ b/tc/m_vlan.c
+@@ -32,7 +32,8 @@ static void explain(void)
+ 	fprintf(stderr, "       vlan modify [ protocol VLANPROTO ] id VLANID [ priority VLANPRIO ] [CONTROL]\n");
+ 	fprintf(stderr, "       VLANPROTO is one of 802.1Q or 802.1AD\n");
+ 	fprintf(stderr, "            with default: 802.1Q\n");
+-	fprintf(stderr, "       CONTROL := reclassify | pipe | drop | continue | pass\n");
++	fprintf(stderr, "       CONTROL := reclassify | pipe | drop | continue | pass |\n");
++	fprintf(stderr, "                  goto chain <CHAIN_INDEX>\n");
+ }
+ 
+ static void usage(void)
+diff --git a/tc/tc_util.c b/tc/tc_util.c
+index 840222832690b..194185a0fa1d8 100644
+--- a/tc/tc_util.c
++++ b/tc/tc_util.c
+@@ -415,6 +415,8 @@ static const char *action_n2a(int action)
+ {
+ 	static char buf[64];
+ 
++	if (TC_ACT_EXT_CMP(action, TC_ACT_GOTO_CHAIN))
++		return "goto";
+ 	switch (action) {
+ 	case TC_ACT_UNSPEC:
+ 		return "continue";
+@@ -458,6 +460,7 @@ static int action_a2n(char *arg, int *result, bool allow_num)
+ 		{"ok", TC_ACT_OK},
+ 		{"reclassify", TC_ACT_RECLASSIFY},
+ 		{"pipe", TC_ACT_PIPE},
++		{"goto", TC_ACT_GOTO_CHAIN},
+ 		{ NULL },
+ 	}, *iter;
+ 
+@@ -497,6 +500,22 @@ int parse_action_control(int *argc_p, char ***argv_p,
+ 		fprintf(stderr, "Bad action type %s\n", *argv);
+ 		return -1;
+ 	}
++	if (result == TC_ACT_GOTO_CHAIN) {
++		__u32 chain_index;
++
++		NEXT_ARG();
++		if (matches(*argv, "chain") != 0) {
++			fprintf(stderr, "\"chain index\" expected\n");
++			return -1;
++		}
++		NEXT_ARG();
++		if (get_u32(&chain_index, *argv, 10) ||
++		    chain_index > TC_ACT_EXT_VAL_MASK) {
++			fprintf(stderr, "Illegal \"chain index\"\n");
++			return -1;
++		}
++		result |= chain_index;
++	}
+ 	NEXT_ARG_FWD();
+ 	*argc_p = argc;
+ 	*argv_p = argv;
+@@ -604,7 +623,10 @@ int parse_action_control_slash(int *argc_p, char ***argv_p,
+ void print_action_control(FILE *f, const char *prefix,
+ 			  int action, const char *suffix)
+ {
+-	fprintf(f, "%s%s%s", prefix, action_n2a(action), suffix);
++	fprintf(f, "%s%s", prefix, action_n2a(action));
++	if (TC_ACT_EXT_CMP(action, TC_ACT_GOTO_CHAIN))
++		fprintf(f, " chain %u", action & TC_ACT_EXT_VAL_MASK);
++	fprintf(f, "%s", suffix);
+ }
+ 
+ int get_linklayer(unsigned int *val, const char *arg)
+-- 
+2.20.1
+
diff --git a/SOURCES/0134-tc-gact-fix-control-action-parsing.patch b/SOURCES/0134-tc-gact-fix-control-action-parsing.patch
new file mode 100644
index 0000000..46e953c
--- /dev/null
+++ b/SOURCES/0134-tc-gact-fix-control-action-parsing.patch
@@ -0,0 +1,41 @@
+From 46ce82dd840a158c8fe80842ac808b1df425e216 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Wed, 5 Jun 2019 13:10:31 +0200
+Subject: [PATCH] tc: gact: fix control action parsing
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660
+Upstream Status: iproute2.git commit 18f05d06016d9
+Conflicts: context change due to out-of-order cherry-pick of
+           commit 73aa988868e7e ("tc/m_gact: Drop dead code")
+
+commit 18f05d06016d9492c87fd105d831de0d6d858f43
+Author: Jiri Pirko <jiri@mellanox.com>
+Date:   Mon Jun 5 16:22:03 2017 +0200
+
+    tc: gact: fix control action parsing
+
+    parse_action_control helper does advancing of the arg inside. So don't
+    do it outside.
+
+    Fixes: e67aba559581 ("tc: actions: add helpers to parse and print control actions")
+    Signed-off-by: Jiri Pirko <jiri@mellanox.com>
+---
+ tc/m_gact.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/tc/m_gact.c b/tc/m_gact.c
+index c04c00bbded3c..73346d4e9333b 100644
+--- a/tc/m_gact.c
++++ b/tc/m_gact.c
+@@ -113,8 +113,6 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p,
+ 			if (parse_action_control(&argc, &argv,
+ 						 &pp.paction, false) == -1)
+ 				usage();
+-			argc--;
+-			argv++;
+ 			if (get_u16(&pp.pval, *argv, 10)) {
+ 				fprintf(stderr, "Illegal probability val 0x%x\n", pp.pval);
+ 				return -1;
+-- 
+2.20.1
+
diff --git a/SOURCES/0135-tc-don-t-print-error-message-on-miss-when-parsing-ac.patch b/SOURCES/0135-tc-don-t-print-error-message-on-miss-when-parsing-ac.patch
new file mode 100644
index 0000000..3d32538
--- /dev/null
+++ b/SOURCES/0135-tc-don-t-print-error-message-on-miss-when-parsing-ac.patch
@@ -0,0 +1,97 @@
+From 8efbb8de949eedd4341d075175f932245a9f142c Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Wed, 5 Jun 2019 13:11:03 +0200
+Subject: [PATCH] tc: don't print error message on miss when parsing action
+ with default
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660
+Upstream Status: iproute2.git commit c794b7b179026
+
+commit c794b7b17902627b19ddc00699d89ea7b6b1edf7
+Author: Jiri Pirko <jiri@mellanox.com>
+Date:   Thu Jun 15 14:10:51 2017 +0200
+
+    tc: don't print error message on miss when parsing action with default
+
+    In case default control action parsing takes place, it is ok to miss.
+    So don't print error message.
+
+    Fixes: e67aba559581 ("tc: actions: add helpers to parse and print control actions")
+    Reported-by: Jiri Benc <jbenc@redhat.com>
+    Signed-off-by: Jiri Pirko <jiri@mellanox.com>
+    Tested-by: Jiri Benc <jbenc@redhat.com>
+---
+ tc/tc_util.c | 36 ++++++++++++++++++++++--------------
+ 1 file changed, 22 insertions(+), 14 deletions(-)
+
+diff --git a/tc/tc_util.c b/tc/tc_util.c
+index 194185a0fa1d8..cdc23477ada53 100644
+--- a/tc/tc_util.c
++++ b/tc/tc_util.c
+@@ -477,18 +477,8 @@ static int action_a2n(char *arg, int *result, bool allow_num)
+ 	return 0;
+ }
+ 
+-/* Parse action control including possible options.
+- *
+- * Parameters:
+- * @argc_p - pointer to argc to parse
+- * @argv_p - pointer to argv to parse
+- * @result_p - pointer to output variable
+- * @allow_num - whether action may be in numeric format already
+- *
+- * In error case, returns -1 and does not touch @result_1p. Otherwise returns 0.
+- */
+-int parse_action_control(int *argc_p, char ***argv_p,
+-			 int *result_p, bool allow_num)
++static int __parse_action_control(int *argc_p, char ***argv_p, int *result_p,
++				  bool allow_num, bool ignore_a2n_miss)
+ {
+ 	int argc = *argc_p;
+ 	char **argv = *argv_p;
+@@ -497,7 +487,8 @@ int parse_action_control(int *argc_p, char ***argv_p,
+ 	if (!argc)
+ 		return -1;
+ 	if (action_a2n(*argv, &result, allow_num) == -1) {
+-		fprintf(stderr, "Bad action type %s\n", *argv);
++		if (!ignore_a2n_miss)
++			fprintf(stderr, "Bad action type %s\n", *argv);
+ 		return -1;
+ 	}
+ 	if (result == TC_ACT_GOTO_CHAIN) {
+@@ -523,6 +514,23 @@ int parse_action_control(int *argc_p, char ***argv_p,
+ 	return 0;
+ }
+ 
++/* Parse action control including possible options.
++ *
++ * Parameters:
++ * @argc_p - pointer to argc to parse
++ * @argv_p - pointer to argv to parse
++ * @result_p - pointer to output variable
++ * @allow_num - whether action may be in numeric format already
++ *
++ * In error case, returns -1 and does not touch @result_1p. Otherwise returns 0.
++ */
++int parse_action_control(int *argc_p, char ***argv_p,
++			 int *result_p, bool allow_num)
++{
++	return __parse_action_control(argc_p, argv_p, result_p,
++				      allow_num, false);
++}
++
+ /* Parse action control including possible options.
+  *
+  * Parameters:
+@@ -538,7 +546,7 @@ void parse_action_control_dflt(int *argc_p, char ***argv_p,
+ 			       int *result_p, bool allow_num,
+ 			       int default_result)
+ {
+-	if (parse_action_control(argc_p, argv_p, result_p, allow_num))
++	if (__parse_action_control(argc_p, argv_p, result_p, allow_num, true))
+ 		*result_p = default_result;
+ }
+ 
+-- 
+2.20.1
+
diff --git a/SOURCES/0136-tc-util-Don-t-call-NEXT_ARG_FWD-in-__parse_action_co.patch b/SOURCES/0136-tc-util-Don-t-call-NEXT_ARG_FWD-in-__parse_action_co.patch
new file mode 100644
index 0000000..1b806df
--- /dev/null
+++ b/SOURCES/0136-tc-util-Don-t-call-NEXT_ARG_FWD-in-__parse_action_co.patch
@@ -0,0 +1,235 @@
+From 1a12c7c90330410171007ada7513247fda5a1c57 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Wed, 5 Jun 2019 13:11:03 +0200
+Subject: [PATCH] tc: util: Don't call NEXT_ARG_FWD() in
+ __parse_action_control()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660
+Upstream Status: iproute2.git commit 3572e01a090a2
+Conflicts: context change mainly due to missing commit 35f2a7639dca4
+           ("tc/actions: introduce support for jump action")
+
+commit 3572e01a090a298e2f4c4f796bad6639b652e031
+Author: Michal Privoznik <mprivozn@redhat.com>
+Date:   Fri Dec 8 11:18:07 2017 +0100
+
+    tc: util: Don't call NEXT_ARG_FWD() in __parse_action_control()
+
+    Not all callers want parse_action_control*() to advance the
+    arguments. For instance act_parse_police() does the argument
+    advancing itself.
+
+    Fixes: e67aba559581 ("tc: actions: add helpers to parse and print control actions")
+    Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
+---
+ tc/m_bpf.c        |  1 +
+ tc/m_connmark.c   |  1 +
+ tc/m_csum.c       |  1 +
+ tc/m_gact.c       | 12 ++++++------
+ tc/m_ife.c        |  1 +
+ tc/m_mirred.c     |  4 +++-
+ tc/m_nat.c        |  1 +
+ tc/m_pedit.c      |  1 +
+ tc/m_sample.c     |  1 +
+ tc/m_skbedit.c    |  1 +
+ tc/m_skbmod.c     |  1 +
+ tc/m_tunnel_key.c |  1 +
+ tc/m_vlan.c       |  1 +
+ tc/tc_util.c      |  1 -
+ 14 files changed, 20 insertions(+), 8 deletions(-)
+
+diff --git a/tc/m_bpf.c b/tc/m_bpf.c
+index 57283030a35f5..c2bad5640707c 100644
+--- a/tc/m_bpf.c
++++ b/tc/m_bpf.c
+@@ -125,6 +125,7 @@ opt_bpf:
+ 
+ 	parse_action_control_dflt(&argc, &argv, &parm.action,
+ 				  false, TC_ACT_PIPE);
++	NEXT_ARG_FWD();
+ 
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+diff --git a/tc/m_connmark.c b/tc/m_connmark.c
+index 37d7185415490..47c7a8c2b17e7 100644
+--- a/tc/m_connmark.c
++++ b/tc/m_connmark.c
+@@ -82,6 +82,7 @@ parse_connmark(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
+ 	}
+ 
+ 	parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_PIPE);
++	NEXT_ARG_FWD();
+ 
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+diff --git a/tc/m_csum.c b/tc/m_csum.c
+index 7b156734f64c5..e1352c0820f69 100644
+--- a/tc/m_csum.c
++++ b/tc/m_csum.c
+@@ -124,6 +124,7 @@ parse_csum(struct action_util *a, int *argc_p,
+ 	}
+ 
+ 	parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_OK);
++	NEXT_ARG_FWD();
+ 
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+diff --git a/tc/m_gact.c b/tc/m_gact.c
+index 73346d4e9333b..dd9542a5cc644 100644
+--- a/tc/m_gact.c
++++ b/tc/m_gact.c
+@@ -86,14 +86,13 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p,
+ 	if (argc < 0)
+ 		return -1;
+ 
+-
+-	if (matches(*argv, "gact") == 0) {
+-		argc--;
+-		argv++;
+-	} else if (parse_action_control(&argc, &argv, &p.action, false) == -1) {
+-		usage();
++	if (matches(*argv, "gact") != 0 &&
++		parse_action_control(&argc, &argv, &p.action, false) == -1) {
++		usage();	/* does not return */
+ 	}
+ 
++	NEXT_ARG_FWD();
++
+ #ifdef CONFIG_GACT_PROB
+ 	if (argc > 0) {
+ 		if (matches(*argv, "random") == 0) {
+@@ -113,6 +112,7 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p,
+ 			if (parse_action_control(&argc, &argv,
+ 						 &pp.paction, false) == -1)
+ 				usage();
++			NEXT_ARG_FWD();
+ 			if (get_u16(&pp.pval, *argv, 10)) {
+ 				fprintf(stderr, "Illegal probability val 0x%x\n", pp.pval);
+ 				return -1;
+diff --git a/tc/m_ife.c b/tc/m_ife.c
+index e3521e62c178c..54fad8f70e73a 100644
+--- a/tc/m_ife.c
++++ b/tc/m_ife.c
+@@ -158,6 +158,7 @@ static int parse_ife(struct action_util *a, int *argc_p, char ***argv_p,
+ 
+ 	parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE);
+ 
++	NEXT_ARG_FWD();
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+ 			NEXT_ARG();
+diff --git a/tc/m_mirred.c b/tc/m_mirred.c
+index 2384bda1ff045..b09b016c2ca39 100644
+--- a/tc/m_mirred.c
++++ b/tc/m_mirred.c
+@@ -170,8 +170,10 @@ parse_direction(struct action_util *a, int *argc_p, char ***argv_p,
+ 	}
+ 
+ 
+-	if (p.eaction == TCA_EGRESS_MIRROR || p.eaction == TCA_INGRESS_MIRROR)
++	if (p.eaction == TCA_EGRESS_MIRROR || p.eaction == TCA_INGRESS_MIRROR) {
+ 		parse_action_control(&argc, &argv, &p.action, false);
++		NEXT_ARG_FWD();
++	}
+ 
+ 	if (argc) {
+ 		if (iok && matches(*argv, "index") == 0) {
+diff --git a/tc/m_nat.c b/tc/m_nat.c
+index 31b68fb6bd784..bb455f080b3a4 100644
+--- a/tc/m_nat.c
++++ b/tc/m_nat.c
+@@ -117,6 +117,7 @@ parse_nat(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct
+ 
+ 	parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_OK);
+ 
++	NEXT_ARG_FWD();
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+ 			NEXT_ARG();
+diff --git a/tc/m_pedit.c b/tc/m_pedit.c
+index 5d89ab1d832ab..3391be95da38c 100644
+--- a/tc/m_pedit.c
++++ b/tc/m_pedit.c
+@@ -673,6 +673,7 @@ int parse_pedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
+ 
+ 	parse_action_control_dflt(&argc, &argv, &sel.sel.action, false, TC_ACT_OK);
+ 
++	NEXT_ARG_FWD();
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+ 			NEXT_ARG();
+diff --git a/tc/m_sample.c b/tc/m_sample.c
+index ff5ee6bd1ef63..31774c0e806b4 100644
+--- a/tc/m_sample.c
++++ b/tc/m_sample.c
+@@ -100,6 +100,7 @@ static int parse_sample(struct action_util *a, int *argc_p, char ***argv_p,
+ 
+ 	parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE);
+ 
++	NEXT_ARG_FWD();
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+ 			NEXT_ARG();
+diff --git a/tc/m_skbedit.c b/tc/m_skbedit.c
+index aa374fcb33ed9..c41a7bb082dad 100644
+--- a/tc/m_skbedit.c
++++ b/tc/m_skbedit.c
+@@ -123,6 +123,7 @@ parse_skbedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
+ 	parse_action_control_dflt(&argc, &argv, &sel.action,
+ 				  false, TC_ACT_PIPE);
+ 
++	NEXT_ARG_FWD();
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+ 			NEXT_ARG();
+diff --git a/tc/m_skbmod.c b/tc/m_skbmod.c
+index ba79308ba8354..00318d42642a5 100644
+--- a/tc/m_skbmod.c
++++ b/tc/m_skbmod.c
+@@ -125,6 +125,7 @@ static int parse_skbmod(struct action_util *a, int *argc_p, char ***argv_p,
+ 
+ 	parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE);
+ 
++	NEXT_ARG_FWD();
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+ 			NEXT_ARG();
+diff --git a/tc/m_tunnel_key.c b/tc/m_tunnel_key.c
+index cdde64a15b929..0ff3f1a2b9876 100644
+--- a/tc/m_tunnel_key.c
++++ b/tc/m_tunnel_key.c
+@@ -197,6 +197,7 @@ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p,
+ 	parse_action_control_dflt(&argc, &argv, &parm.action,
+ 				  false, TC_ACT_PIPE);
+ 
++	NEXT_ARG_FWD();
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+ 			NEXT_ARG();
+diff --git a/tc/m_vlan.c b/tc/m_vlan.c
+index cccb4996b05f3..0b2966ce82e53 100644
+--- a/tc/m_vlan.c
++++ b/tc/m_vlan.c
+@@ -137,6 +137,7 @@ static int parse_vlan(struct action_util *a, int *argc_p, char ***argv_p,
+ 	parse_action_control_dflt(&argc, &argv, &parm.action,
+ 				  false, TC_ACT_PIPE);
+ 
++	NEXT_ARG_FWD();
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+ 			NEXT_ARG();
+diff --git a/tc/tc_util.c b/tc/tc_util.c
+index cdc23477ada53..4584d4a448fb4 100644
+--- a/tc/tc_util.c
++++ b/tc/tc_util.c
+@@ -507,7 +507,6 @@ static int __parse_action_control(int *argc_p, char ***argv_p, int *result_p,
+ 		}
+ 		result |= chain_index;
+ 	}
+-	NEXT_ARG_FWD();
+ 	*argc_p = argc;
+ 	*argv_p = argv;
+ 	*result_p = result;
+-- 
+2.20.1
+
diff --git a/SOURCES/0137-tc-fix-parsing-of-the-control-action.patch b/SOURCES/0137-tc-fix-parsing-of-the-control-action.patch
new file mode 100644
index 0000000..78b9286
--- /dev/null
+++ b/SOURCES/0137-tc-fix-parsing-of-the-control-action.patch
@@ -0,0 +1,321 @@
+From cb73324026eb3f9c315735b9020890f43eeaac43 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Wed, 5 Jun 2019 13:12:06 +0200
+Subject: [PATCH] tc: fix parsing of the control action
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660
+Upstream Status: iproute2.git commit 75ef7b18d2a13
+Conflicts: context change due to missing commit 35f2a7639dca4
+           ("tc/actions: introduce support for jump action")
+
+commit 75ef7b18d2a13657056706895bf8d8dd3ac93e46
+Author: Davide Caratti <dcaratti@redhat.com>
+Date:   Fri Mar 2 19:36:16 2018 +0100
+
+    tc: fix parsing of the control action
+
+    If the user didn't specify any control action, don't pop the command line
+    arguments: otherwise, parsing of the next argument (tipically the 'index'
+    keyword) results in an error, causing the following 'tc-testing' failures:
+
+     Test a6d6: Add skbedit action with index
+     Test 38f3: Delete skbedit action
+     Test a568: Add action with ife type
+     Test b983: Add action without ife type
+     Test 7d50: Add skbmod action to set destination mac
+     Test 9b29: Add skbmod action to set source mac
+     Test e93a: Delete an skbmod action
+
+    Also, add missing parse for 'ok' control action to m_police, to fix the
+    following 'tc-testing' failure:
+
+     Test 8dd5: Add police action with control ok
+
+    tested with:
+     # ./tdc.py
+
+    test results:
+     all tests ok using kernel 4.16-rc2, except 9aa8 "Get a single skbmod
+     action from a list" (which is failing also before this commit)
+
+    Fixes: 3572e01a090a ("tc: util: Don't call NEXT_ARG_FWD() in __parse_action_control()")
+    Cc: Michal Privoznik <mprivozn@redhat.com>
+    Cc: Wolfgang Bumiller <w.bumiller@proxmox.com>
+    Signed-off-by: Davide Caratti <dcaratti@redhat.com>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ tc/m_bpf.c        |  1 -
+ tc/m_connmark.c   |  1 -
+ tc/m_csum.c       |  1 -
+ tc/m_gact.c       |  9 +++------
+ tc/m_ife.c        |  1 -
+ tc/m_mirred.c     |  5 ++---
+ tc/m_nat.c        |  1 -
+ tc/m_pedit.c      |  1 -
+ tc/m_police.c     | 16 ++++++++++------
+ tc/m_sample.c     |  1 -
+ tc/m_skbedit.c    |  1 -
+ tc/m_skbmod.c     |  1 -
+ tc/m_tunnel_key.c |  1 -
+ tc/m_vlan.c       |  1 -
+ tc/tc_util.c      |  6 +++++-
+ 15 files changed, 20 insertions(+), 27 deletions(-)
+
+diff --git a/tc/m_bpf.c b/tc/m_bpf.c
+index c2bad5640707c..57283030a35f5 100644
+--- a/tc/m_bpf.c
++++ b/tc/m_bpf.c
+@@ -125,7 +125,6 @@ opt_bpf:
+ 
+ 	parse_action_control_dflt(&argc, &argv, &parm.action,
+ 				  false, TC_ACT_PIPE);
+-	NEXT_ARG_FWD();
+ 
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+diff --git a/tc/m_connmark.c b/tc/m_connmark.c
+index 47c7a8c2b17e7..37d7185415490 100644
+--- a/tc/m_connmark.c
++++ b/tc/m_connmark.c
+@@ -82,7 +82,6 @@ parse_connmark(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
+ 	}
+ 
+ 	parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_PIPE);
+-	NEXT_ARG_FWD();
+ 
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+diff --git a/tc/m_csum.c b/tc/m_csum.c
+index e1352c0820f69..7b156734f64c5 100644
+--- a/tc/m_csum.c
++++ b/tc/m_csum.c
+@@ -124,7 +124,6 @@ parse_csum(struct action_util *a, int *argc_p,
+ 	}
+ 
+ 	parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_OK);
+-	NEXT_ARG_FWD();
+ 
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+diff --git a/tc/m_gact.c b/tc/m_gact.c
+index dd9542a5cc644..45eecf7ea1647 100644
+--- a/tc/m_gact.c
++++ b/tc/m_gact.c
+@@ -86,12 +86,10 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p,
+ 	if (argc < 0)
+ 		return -1;
+ 
+-	if (matches(*argv, "gact") != 0 &&
+-		parse_action_control(&argc, &argv, &p.action, false) == -1) {
++	if (!matches(*argv, "gact"))
++		NEXT_ARG_FWD();
++	if (parse_action_control(&argc, &argv, &p.action, false))
+ 		usage();	/* does not return */
+-	}
+-
+-	NEXT_ARG_FWD();
+ 
+ #ifdef CONFIG_GACT_PROB
+ 	if (argc > 0) {
+@@ -112,7 +110,6 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p,
+ 			if (parse_action_control(&argc, &argv,
+ 						 &pp.paction, false) == -1)
+ 				usage();
+-			NEXT_ARG_FWD();
+ 			if (get_u16(&pp.pval, *argv, 10)) {
+ 				fprintf(stderr, "Illegal probability val 0x%x\n", pp.pval);
+ 				return -1;
+diff --git a/tc/m_ife.c b/tc/m_ife.c
+index 54fad8f70e73a..e3521e62c178c 100644
+--- a/tc/m_ife.c
++++ b/tc/m_ife.c
+@@ -158,7 +158,6 @@ static int parse_ife(struct action_util *a, int *argc_p, char ***argv_p,
+ 
+ 	parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE);
+ 
+-	NEXT_ARG_FWD();
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+ 			NEXT_ARG();
+diff --git a/tc/m_mirred.c b/tc/m_mirred.c
+index b09b016c2ca39..b1f45f1e6ecb0 100644
+--- a/tc/m_mirred.c
++++ b/tc/m_mirred.c
+@@ -76,6 +76,7 @@ parse_direction(struct action_util *a, int *argc_p, char ***argv_p,
+ 	while (argc > 0) {
+ 
+ 		if (matches(*argv, "action") == 0) {
++			NEXT_ARG();
+ 			break;
+ 		} else if (!egress && matches(*argv, "egress") == 0) {
+ 			egress = 1;
+@@ -170,10 +171,8 @@ parse_direction(struct action_util *a, int *argc_p, char ***argv_p,
+ 	}
+ 
+ 
+-	if (p.eaction == TCA_EGRESS_MIRROR || p.eaction == TCA_INGRESS_MIRROR) {
++	if (p.eaction == TCA_EGRESS_MIRROR || p.eaction == TCA_INGRESS_MIRROR)
+ 		parse_action_control(&argc, &argv, &p.action, false);
+-		NEXT_ARG_FWD();
+-	}
+ 
+ 	if (argc) {
+ 		if (iok && matches(*argv, "index") == 0) {
+diff --git a/tc/m_nat.c b/tc/m_nat.c
+index bb455f080b3a4..31b68fb6bd784 100644
+--- a/tc/m_nat.c
++++ b/tc/m_nat.c
+@@ -117,7 +117,6 @@ parse_nat(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct
+ 
+ 	parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_OK);
+ 
+-	NEXT_ARG_FWD();
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+ 			NEXT_ARG();
+diff --git a/tc/m_pedit.c b/tc/m_pedit.c
+index 3391be95da38c..5d89ab1d832ab 100644
+--- a/tc/m_pedit.c
++++ b/tc/m_pedit.c
+@@ -673,7 +673,6 @@ int parse_pedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
+ 
+ 	parse_action_control_dflt(&argc, &argv, &sel.sel.action, false, TC_ACT_OK);
+ 
+-	NEXT_ARG_FWD();
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+ 			NEXT_ARG();
+diff --git a/tc/m_police.c b/tc/m_police.c
+index 86117db0482ec..b79545961f4d7 100644
+--- a/tc/m_police.c
++++ b/tc/m_police.c
+@@ -151,15 +151,18 @@ int act_parse_police(struct action_util *a, int *argc_p, char ***argv_p,
+ 			   matches(*argv, "shot") == 0 ||
+ 			   matches(*argv, "continue") == 0 ||
+ 			   matches(*argv, "pass") == 0 ||
++			   matches(*argv, "ok") == 0 ||
+ 			   matches(*argv, "pipe") == 0 ||
+ 			   matches(*argv, "goto") == 0) {
+-			if (parse_action_control(&argc, &argv, &p.action, false))
+-				return -1;
++			if (!parse_action_control(&argc, &argv, &p.action, false))
++				goto action_ctrl_ok;
++			return -1;
+ 		} else if (strcmp(*argv, "conform-exceed") == 0) {
+ 			NEXT_ARG();
+-			if (parse_action_control_slash(&argc, &argv, &p.action,
+-						       &presult, true))
+-				return -1;
++			if (!parse_action_control_slash(&argc, &argv, &p.action,
++							&presult, true))
++				goto action_ctrl_ok;
++			return -1;
+ 		} else if (matches(*argv, "overhead") == 0) {
+ 			NEXT_ARG();
+ 			if (get_u16(&overhead, *argv, 10)) {
+@@ -175,8 +178,9 @@ int act_parse_police(struct action_util *a, int *argc_p, char ***argv_p,
+ 		} else {
+ 			break;
+ 		}
++		NEXT_ARG_FWD();
++action_ctrl_ok:
+ 		ok++;
+-		argc--; argv++;
+ 	}
+ 
+ 	if (!ok)
+diff --git a/tc/m_sample.c b/tc/m_sample.c
+index 31774c0e806b4..ff5ee6bd1ef63 100644
+--- a/tc/m_sample.c
++++ b/tc/m_sample.c
+@@ -100,7 +100,6 @@ static int parse_sample(struct action_util *a, int *argc_p, char ***argv_p,
+ 
+ 	parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE);
+ 
+-	NEXT_ARG_FWD();
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+ 			NEXT_ARG();
+diff --git a/tc/m_skbedit.c b/tc/m_skbedit.c
+index c41a7bb082dad..aa374fcb33ed9 100644
+--- a/tc/m_skbedit.c
++++ b/tc/m_skbedit.c
+@@ -123,7 +123,6 @@ parse_skbedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
+ 	parse_action_control_dflt(&argc, &argv, &sel.action,
+ 				  false, TC_ACT_PIPE);
+ 
+-	NEXT_ARG_FWD();
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+ 			NEXT_ARG();
+diff --git a/tc/m_skbmod.c b/tc/m_skbmod.c
+index 00318d42642a5..ba79308ba8354 100644
+--- a/tc/m_skbmod.c
++++ b/tc/m_skbmod.c
+@@ -125,7 +125,6 @@ static int parse_skbmod(struct action_util *a, int *argc_p, char ***argv_p,
+ 
+ 	parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE);
+ 
+-	NEXT_ARG_FWD();
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+ 			NEXT_ARG();
+diff --git a/tc/m_tunnel_key.c b/tc/m_tunnel_key.c
+index 0ff3f1a2b9876..cdde64a15b929 100644
+--- a/tc/m_tunnel_key.c
++++ b/tc/m_tunnel_key.c
+@@ -197,7 +197,6 @@ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p,
+ 	parse_action_control_dflt(&argc, &argv, &parm.action,
+ 				  false, TC_ACT_PIPE);
+ 
+-	NEXT_ARG_FWD();
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+ 			NEXT_ARG();
+diff --git a/tc/m_vlan.c b/tc/m_vlan.c
+index 0b2966ce82e53..cccb4996b05f3 100644
+--- a/tc/m_vlan.c
++++ b/tc/m_vlan.c
+@@ -137,7 +137,6 @@ static int parse_vlan(struct action_util *a, int *argc_p, char ***argv_p,
+ 	parse_action_control_dflt(&argc, &argv, &parm.action,
+ 				  false, TC_ACT_PIPE);
+ 
+-	NEXT_ARG_FWD();
+ 	if (argc) {
+ 		if (matches(*argv, "index") == 0) {
+ 			NEXT_ARG();
+diff --git a/tc/tc_util.c b/tc/tc_util.c
+index 4584d4a448fb4..65695ea592ed8 100644
+--- a/tc/tc_util.c
++++ b/tc/tc_util.c
+@@ -507,6 +507,7 @@ static int __parse_action_control(int *argc_p, char ***argv_p, int *result_p,
+ 		}
+ 		result |= chain_index;
+ 	}
++	NEXT_ARG_FWD();
+ 	*argc_p = argc;
+ 	*argv_p = argv;
+ 	*result_p = result;
+@@ -603,8 +604,8 @@ out:
+ int parse_action_control_slash(int *argc_p, char ***argv_p,
+ 			       int *result1_p, int *result2_p, bool allow_num)
+ {
++	int result1, result2, argc = *argc_p;
+ 	char **argv = *argv_p;
+-	int result1, result2;
+ 	char *p = strchr(*argv, '/');
+ 
+ 	if (!p)
+@@ -624,6 +625,9 @@ int parse_action_control_slash(int *argc_p, char ***argv_p,
+ 
+ 	*result1_p = result1;
+ 	*result2_p = result2;
++	NEXT_ARG_FWD();
++	*argc_p = argc;
++	*argv_p = argv;
+ 	return 0;
+ }
+ 
+-- 
+2.20.1
+
diff --git a/SOURCES/0138-m_mirred-don-t-bail-if-the-control-action-is-missing.patch b/SOURCES/0138-m_mirred-don-t-bail-if-the-control-action-is-missing.patch
new file mode 100644
index 0000000..f87d77e
--- /dev/null
+++ b/SOURCES/0138-m_mirred-don-t-bail-if-the-control-action-is-missing.patch
@@ -0,0 +1,46 @@
+From e4526cbbfb6151e87e493a7fecfe2384a3751100 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Wed, 5 Jun 2019 13:12:49 +0200
+Subject: [PATCH] m_mirred: don't bail if the control action is missing
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660
+Upstream Status: iproute2.git commit 6eccf7ecdb010
+
+commit 6eccf7ecdb010a90e5271942748ef4338ddb61ae
+Author: Paolo Abeni <pabeni@redhat.com>
+Date:   Mon May 20 11:56:52 2019 +0200
+
+    m_mirred: don't bail if the control action is missing
+
+    The mirred act admits an optional control action, defaulting
+    to TC_ACT_PIPE. The parsing code currently emits an error message
+    if the control action is not provided on the command line, even
+    if the command itself completes with no error.
+
+    This change shuts down the error message, using the appropriate
+    parsing helper.
+
+    Fixes: e67aba559581 ("tc: actions: add helpers to parse and print control actions")
+    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ tc/m_mirred.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/tc/m_mirred.c b/tc/m_mirred.c
+index b1f45f1e6ecb0..90d0b633c1318 100644
+--- a/tc/m_mirred.c
++++ b/tc/m_mirred.c
+@@ -172,7 +172,8 @@ parse_direction(struct action_util *a, int *argc_p, char ***argv_p,
+ 
+ 
+ 	if (p.eaction == TCA_EGRESS_MIRROR || p.eaction == TCA_INGRESS_MIRROR)
+-		parse_action_control(&argc, &argv, &p.action, false);
++		parse_action_control_dflt(&argc, &argv, &p.action, false,
++					  TC_ACT_PIPE);
+ 
+ 	if (argc) {
+ 		if (iok && matches(*argv, "index") == 0) {
+-- 
+2.20.1
+
diff --git a/SOURCES/0139-tc-m_tunnel_key-add-csum-nocsum-option.patch b/SOURCES/0139-tc-m_tunnel_key-add-csum-nocsum-option.patch
new file mode 100644
index 0000000..3aa571a
--- /dev/null
+++ b/SOURCES/0139-tc-m_tunnel_key-add-csum-nocsum-option.patch
@@ -0,0 +1,131 @@
+From 0152070641c58eccf6c6d9981a33f17ada23996f Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Wed, 5 Jun 2019 13:12:49 +0200
+Subject: [PATCH] tc: m_tunnel_key: add csum/nocsum option
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660
+Upstream Status: iproute2.git commit 59eb271d1d259
+Conflicts: context change due to out-of-order cherry-pick of
+           commit 9f89b0cc0eda2 ("tc/act_tunnel_key: Enable
+           setup of tos and ttl")
+
+commit 59eb271d1d259da21372d222a2d995e57ef648a9
+Author: Jiri Benc <jbenc@redhat.com>
+Date:   Wed Jun 14 21:30:18 2017 +0200
+
+    tc: m_tunnel_key: add csum/nocsum option
+
+    Allows control of UDP zero checksum.
+
+    Signed-off-by: Jiri Benc <jbenc@redhat.com>
+---
+ man/man8/tc-tunnel_key.8 | 18 ++++++++++++++++++
+ tc/m_tunnel_key.c        | 21 ++++++++++++++++++++-
+ 2 files changed, 38 insertions(+), 1 deletion(-)
+
+diff --git a/man/man8/tc-tunnel_key.8 b/man/man8/tc-tunnel_key.8
+index 5e93c59d49465..0cd792a66d185 100644
+--- a/man/man8/tc-tunnel_key.8
++++ b/man/man8/tc-tunnel_key.8
+@@ -18,6 +18,7 @@ tunnel_key - Tunnel metadata manipulation
+ .BI dst_port " UDP_PORT"
+ .BI tos " TOS"
+ .BI ttl " TTL"
++.RB "[ " csum " | " nocsum " ]"
+ 
+ .SH DESCRIPTION
+ The
+@@ -85,6 +86,23 @@ Outer header TOS
+ .TP
+ .B ttl
+ Outer header TTL
++.TP
++.RB [ no ] csum
++Controlls outer UDP checksum. When set to
++.B csum
++(which is default), the outer UDP checksum is calculated and included in the
++packets. When set to
++.BR nocsum ,
++outer UDP checksum is zero. Note that when using zero UDP checksums with
++IPv6, the other tunnel endpoint must be configured to accept such packets.
++In Linux, this would be the
++.B udp6zerocsumrx
++option for the VXLAN tunnel interface.
++.IP
++If using
++.B nocsum
++with IPv6, be sure you know what you are doing. Zero UDP checksums provide
++weaker protection against corrupted packets. See RFC6935 for details.
+ .RE
+ .SH EXAMPLES
+ The following example encapsulates incoming ICMP packets on eth0 into a vxlan
+diff --git a/tc/m_tunnel_key.c b/tc/m_tunnel_key.c
+index cdde64a15b929..992adc51c28ab 100644
+--- a/tc/m_tunnel_key.c
++++ b/tc/m_tunnel_key.c
+@@ -28,7 +28,8 @@ static void explain(void)
+ 		"id <TUNNELID>\n"
+ 		"src_ip <IP> (mandatory)\n"
+ 		"dst_ip <IP> (mandatory)\n"
+-		"dst_port <UDP_PORT>\n");
++		"dst_port <UDP_PORT>\n"
++		"csum | nocsum (default is \"csum\")\n");
+ }
+ 
+ static void usage(void)
+@@ -107,6 +108,7 @@ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p,
+ 	int ret;
+ 	int has_src_ip = 0;
+ 	int has_dst_ip = 0;
++	int csum = 1;
+ 
+ 	if (matches(*argv, "tunnel_key") != 0)
+ 		return -1;
+@@ -186,6 +188,10 @@ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p,
+ 				fprintf(stderr, "Illegal \"ttl\"\n");
+ 				return -1;
+ 			}
++		} else if (matches(*argv, "csum") == 0) {
++			csum = 1;
++		} else if (matches(*argv, "nocsum") == 0) {
++			csum = 0;
+ 		} else if (matches(*argv, "help") == 0) {
+ 			usage();
+ 		} else {
+@@ -194,6 +200,8 @@ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p,
+ 		NEXT_ARG_FWD();
+ 	}
+ 
++	addattr8(n, MAX_MSG, TCA_TUNNEL_KEY_NO_CSUM, !csum);
++
+ 	parse_action_control_dflt(&argc, &argv, &parm.action,
+ 				  false, TC_ACT_PIPE);
+ 
+@@ -276,6 +284,15 @@ static void tunnel_key_print_tos_ttl(FILE *f, char *name,
+ 	}
+ }
+ 
++static void tunnel_key_print_flag(FILE *f, const char *name_on,
++				  const char *name_off,
++				  struct rtattr *attr)
++{
++	if (!attr)
++		return;
++	fprintf(f, "\n\t%s", rta_getattr_u8(attr) ? name_on : name_off);
++}
++
+ static int print_tunnel_key(struct action_util *au, FILE *f, struct rtattr *arg)
+ {
+ 	struct rtattr *tb[TCA_TUNNEL_KEY_MAX + 1];
+@@ -312,6 +329,8 @@ static int print_tunnel_key(struct action_util *au, FILE *f, struct rtattr *arg)
+ 					tb[TCA_TUNNEL_KEY_ENC_KEY_ID]);
+ 		tunnel_key_print_dst_port(f, "dst_port",
+ 					  tb[TCA_TUNNEL_KEY_ENC_DST_PORT]);
++		tunnel_key_print_flag(f, "nocsum", "csum",
++				      tb[TCA_TUNNEL_KEY_NO_CSUM]);
+ 		tunnel_key_print_tos_ttl(f, "tos",
+ 					  tb[TCA_TUNNEL_KEY_ENC_TOS]);
+ 		tunnel_key_print_tos_ttl(f, "ttl",
+-- 
+2.20.1
+
diff --git a/SOURCES/0140-gre6-add-collect-metadata-support.patch b/SOURCES/0140-gre6-add-collect-metadata-support.patch
new file mode 100644
index 0000000..38ec1d7
--- /dev/null
+++ b/SOURCES/0140-gre6-add-collect-metadata-support.patch
@@ -0,0 +1,160 @@
+From b9961cdb54c22fa1b3f1eac5446a008fde7532e6 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Wed, 5 Jun 2019 13:13:31 +0200
+Subject: [PATCH] gre6: add collect metadata support
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660
+Upstream Status: iproute2.git commit 6231c5bec6d25
+Conflicts:
+* Context change due to missing commit
+  ad4b1425c3182 ("iplink: Expose IFLA_*_FWMARK attributes for supported link types")
+* Adjusted gre_print_opt() to missing commit 6856fb65484ba
+  ("ip: link_gre6.c: add json output support")
+
+commit 6231c5bec6d256f7861f39d3a578f5259f274cc4
+Author: William Tu <u9012063@gmail.com>
+Date:   Tue Dec 12 18:22:52 2017 -0800
+
+    gre6: add collect metadata support
+
+    The patch adds 'external' option to support collect metadata
+    gre6 tunnel.  The 'external' keyword is already used to set the
+    device into collect metadata mode such as vxlan, geneve, ipip,
+    etc.  This patch extends support for ipv6 gre and gretap.
+    Example of L3 and L2 gre device:
+    bash:~# ip link add dev ip6gre123 type ip6gre external
+    bash:~# ip link add dev ip6gretap123 type ip6gretap external
+
+    Signed-off-by: William Tu <u9012063@gmail.com>
+    Cc: Daniel Borkmann <daniel@iogearbox.net>
+---
+ ip/link_gre6.c        | 49 ++++++++++++++++++++++++++++---------------
+ man/man8/ip-link.8.in | 17 +++++++++++++++
+ 2 files changed, 49 insertions(+), 17 deletions(-)
+
+diff --git a/ip/link_gre6.c b/ip/link_gre6.c
+index 127e51de4ab73..ea42fb1a9f664 100644
+--- a/ip/link_gre6.c
++++ b/ip/link_gre6.c
+@@ -102,6 +102,7 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
+ 	__u16 encapflags = TUNNEL_ENCAP_FLAG_CSUM6;
+ 	__u16 encapsport = 0;
+ 	__u16 encapdport = 0;
++	__u8 metadata = 0;
+ 	int len;
+ 
+ 	if (!(n->nlmsg_flags & NLM_F_CREATE)) {
+@@ -173,6 +174,9 @@ get_failed:
+ 		if (greinfo[IFLA_GRE_ENCAP_SPORT])
+ 			encapsport = rta_getattr_u16(greinfo[IFLA_GRE_ENCAP_SPORT]);
+ 
++		if (greinfo[IFLA_GRE_COLLECT_METADATA])
++			metadata = 1;
++
+ 		if (greinfo[IFLA_GRE_ENCAP_DPORT])
+ 			encapdport = rta_getattr_u16(greinfo[IFLA_GRE_ENCAP_DPORT]);
+ 
+@@ -333,6 +337,8 @@ get_failed:
+ 			encapflags |= TUNNEL_ENCAP_FLAG_REMCSUM;
+ 		} else if (strcmp(*argv, "noencap-remcsum") == 0) {
+ 			encapflags &= ~TUNNEL_ENCAP_FLAG_REMCSUM;
++		} else if (strcmp(*argv, "external") == 0) {
++			metadata = 1;
+ 		} else if (strcmp(*argv, "encaplimit") == 0) {
+ 			NEXT_ARG();
+ 			if (strcmp(*argv, "none") == 0) {
+@@ -350,23 +356,27 @@ get_failed:
+ 		argc--; argv++;
+ 	}
+ 
+-	addattr32(n, 1024, IFLA_GRE_IKEY, ikey);
+-	addattr32(n, 1024, IFLA_GRE_OKEY, okey);
+-	addattr_l(n, 1024, IFLA_GRE_IFLAGS, &iflags, 2);
+-	addattr_l(n, 1024, IFLA_GRE_OFLAGS, &oflags, 2);
+-	addattr_l(n, 1024, IFLA_GRE_LOCAL, &laddr, sizeof(laddr));
+-	addattr_l(n, 1024, IFLA_GRE_REMOTE, &raddr, sizeof(raddr));
+-	if (link)
+-		addattr32(n, 1024, IFLA_GRE_LINK, link);
+-	addattr_l(n, 1024, IFLA_GRE_TTL, &hop_limit, 1);
+-	addattr_l(n, 1024, IFLA_GRE_ENCAP_LIMIT, &encap_limit, 1);
+-	addattr_l(n, 1024, IFLA_GRE_FLOWINFO, &flowinfo, 4);
+-	addattr32(n, 1024, IFLA_GRE_FLAGS, flags);
+-
+-	addattr16(n, 1024, IFLA_GRE_ENCAP_TYPE, encaptype);
+-	addattr16(n, 1024, IFLA_GRE_ENCAP_FLAGS, encapflags);
+-	addattr16(n, 1024, IFLA_GRE_ENCAP_SPORT, htons(encapsport));
+-	addattr16(n, 1024, IFLA_GRE_ENCAP_DPORT, htons(encapdport));
++	if (!metadata) {
++		addattr32(n, 1024, IFLA_GRE_IKEY, ikey);
++		addattr32(n, 1024, IFLA_GRE_OKEY, okey);
++		addattr_l(n, 1024, IFLA_GRE_IFLAGS, &iflags, 2);
++		addattr_l(n, 1024, IFLA_GRE_OFLAGS, &oflags, 2);
++		addattr_l(n, 1024, IFLA_GRE_LOCAL, &laddr, sizeof(laddr));
++		addattr_l(n, 1024, IFLA_GRE_REMOTE, &raddr, sizeof(raddr));
++		if (link)
++			addattr32(n, 1024, IFLA_GRE_LINK, link);
++		addattr_l(n, 1024, IFLA_GRE_TTL, &hop_limit, 1);
++		addattr_l(n, 1024, IFLA_GRE_ENCAP_LIMIT, &encap_limit, 1);
++		addattr_l(n, 1024, IFLA_GRE_FLOWINFO, &flowinfo, 4);
++		addattr32(n, 1024, IFLA_GRE_FLAGS, flags);
++
++		addattr16(n, 1024, IFLA_GRE_ENCAP_TYPE, encaptype);
++		addattr16(n, 1024, IFLA_GRE_ENCAP_FLAGS, encapflags);
++		addattr16(n, 1024, IFLA_GRE_ENCAP_SPORT, htons(encapsport));
++		addattr16(n, 1024, IFLA_GRE_ENCAP_DPORT, htons(encapdport));
++	} else {
++		addattr_l(n, 1024, IFLA_GRE_COLLECT_METADATA, NULL, 0);
++	}
+ 
+ 	return 0;
+ }
+@@ -385,6 +395,11 @@ static void gre_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
+ 	if (!tb)
+ 		return;
+ 
++	if (tb[IFLA_GRE_COLLECT_METADATA]) {
++		fprintf(f, "external");
++		return;
++	}
++
+ 	if (tb[IFLA_GRE_FLAGS])
+ 		flags = rta_getattr_u32(tb[IFLA_GRE_FLAGS]);
+ 
+diff --git a/man/man8/ip-link.8.in b/man/man8/ip-link.8.in
+index 8be5d5e1e9fd6..612bd8ce92696 100644
+--- a/man/man8/ip-link.8.in
++++ b/man/man8/ip-link.8.in
+@@ -877,6 +877,8 @@ the following additional arguments are supported:
+ .BI "dscp inherit"
+ ] [
+ .BI dev " PHYS_DEV "
++] [
++.RB external
+ ]
+ 
+ .in +8
+@@ -958,6 +960,21 @@ or
+ .IR 00 ".." ff
+ when tunneling non-IP packets. The default value is 00.
+ 
++.sp
++.RB external
++- make this tunnel externally controlled (or not, which is the default).
++In the kernel, this is referred to as collect metadata mode.  This flag is
++mutually exclusive with the
++.BR remote ,
++.BR local ,
++.BR seq ,
++.BR key,
++.BR csum,
++.BR hoplimit,
++.BR encaplimit,
++.BR flowlabel " and " tclass
++options.
++
+ .in -8
+ 
+ .TP
+-- 
+2.20.1
+
diff --git a/SOURCES/0141-tc_util-Silence-spurious-compiler-warning.patch b/SOURCES/0141-tc_util-Silence-spurious-compiler-warning.patch
new file mode 100644
index 0000000..b345515
--- /dev/null
+++ b/SOURCES/0141-tc_util-Silence-spurious-compiler-warning.patch
@@ -0,0 +1,40 @@
+From 774b1c35d4515434e979d9090960ad3293bfe12e Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Wed, 5 Jun 2019 13:18:27 +0200
+Subject: [PATCH] tc_util: Silence spurious compiler warning
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660
+Upstream Status: iproute2.git commit 66942e522e54d
+
+commit 66942e522e54d9f96153590b7c1c7830b8f73f5c
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Wed Nov 15 15:01:31 2017 +0100
+
+    tc_util: Silence spurious compiler warning
+
+    GCC version 7.2.1 complains that 'result1' may be used uninitialized in
+    parse_action_control_slash_spaces(). This should not be possible in
+    practice, so the actual value 'result1' is initialized with does not
+    matter.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+---
+ tc/tc_util.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tc/tc_util.c b/tc/tc_util.c
+index 65695ea592ed8..e115e5a70e3a1 100644
+--- a/tc/tc_util.c
++++ b/tc/tc_util.c
+@@ -556,7 +556,7 @@ static int parse_action_control_slash_spaces(int *argc_p, char ***argv_p,
+ {
+ 	int argc = *argc_p;
+ 	char **argv = *argv_p;
+-	int result1, result2;
++	int result1 = -1, result2;
+ 	int *result_p = &result1;
+ 	int ok = 0;
+ 	int ret;
+-- 
+2.20.1
+
diff --git a/SOURCES/0142-ss-use-for-any-address-any-family-sockets.patch b/SOURCES/0142-ss-use-for-any-address-any-family-sockets.patch
new file mode 100644
index 0000000..8e97133
--- /dev/null
+++ b/SOURCES/0142-ss-use-for-any-address-any-family-sockets.patch
@@ -0,0 +1,76 @@
+From 04453080a3a92071227fd79a039137f72fa82e15 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Wed, 12 Jun 2019 15:00:33 +0200
+Subject: [PATCH] ss: use [::] for any address/any family sockets
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1588122
+Upstream Status: RHEL-only
+
+commit d981824803999a339f4b8fb9ad36d9d5990d9eab
+Author: Andrea Claudi <aclaudi@redhat.com>
+Date:   Wed Jun 12 14:49:07 2019 +0200
+
+    ss: use [::] for any address/any family sockets
+
+    commit aba9c23a6e1cb ("ss: enclose IPv6 address in brackets")
+    brings in the unintended side effect of showing as "*" sockets
+    listening to any address in any family. This is consistent with
+    upstream iproute and RHEL 8 iproute version, but not with
+    previous versions of RHEL 7 iproute.
+
+    This commit partially reverts aba9c23a6e1cb using "[::]" for
+    any family sockets when -f inet6 is used.
+
+    Tested with
+    # ss -ln -f inet6
+
+    ("ss: enclose IPv6 address in brackets")
+---
+ misc/ss.c | 29 ++++++++++++-----------------
+ 1 file changed, 12 insertions(+), 17 deletions(-)
+
+diff --git a/misc/ss.c b/misc/ss.c
+index 6aaae1b5390e4..8f184fb929d31 100644
+--- a/misc/ss.c
++++ b/misc/ss.c
+@@ -1090,25 +1090,20 @@ static void inet_addr_print(const inet_prefix *a, int port, unsigned int ifindex
+ 			ap = format_host(AF_INET, 4, a->data);
+ 		}
+ 	} else {
+-		if (!memcmp(a->data, &in6addr_any, sizeof(in6addr_any))) {
+-			buf[0] = '*';
+-			buf[1] = 0;
+-		} else {
+-			ap = format_host(a->family, 16, a->data);
+-
+-			/* Numeric IPv6 addresses should be bracketed */
+-			if (strchr(ap, ':')) {
+-				snprintf(buf, sizeof(buf),
+-					 "[%s]", ap);
+-				ap = buf;
+-			}
++		ap = format_host(a->family, 16, a->data);
+ 
+-			est_len = strlen(ap);
+-			if (est_len <= addr_width)
+-				est_len = addr_width;
+-			else
+-				est_len = addr_width + ((est_len-addr_width+3)/4)*4;
++		/* Numeric IPv6 addresses should be bracketed */
++		if (strchr(ap, ':')) {
++			snprintf(buf, sizeof(buf),
++				 "[%s]", ap);
++			ap = buf;
+ 		}
++
++		est_len = strlen(ap);
++		if (est_len <= addr_width)
++			est_len = addr_width;
++		else
++			est_len = addr_width + ((est_len-addr_width+3)/4)*4;
+ 	}
+ 
+ 	if (ifindex) {
+-- 
+2.20.1
+
diff --git a/SOURCES/0143-tc-introduce-tc_qdisc_block_exists-helper.patch b/SOURCES/0143-tc-introduce-tc_qdisc_block_exists-helper.patch
new file mode 100644
index 0000000..df5bbd6
--- /dev/null
+++ b/SOURCES/0143-tc-introduce-tc_qdisc_block_exists-helper.patch
@@ -0,0 +1,110 @@
+From 2e2ac620670997b59d65a73b0af3e77431be3c18 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Tue, 18 Jun 2019 20:01:45 +0200
+Subject: [PATCH] tc: introduce tc_qdisc_block_exists helper
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1721291
+Upstream Status: iproute2.git commit d0bcedd549566
+Conflicts: context change due to missing commit 6f7df6b2a1fef
+           ("tc: Optimize gact action lookup")
+
+commit d0bcedd549566a87354aa804df3be6be80681ee9
+Author: Jiri Pirko <jiri@mellanox.com>
+Date:   Sat Jan 20 11:00:27 2018 +0100
+
+    tc: introduce tc_qdisc_block_exists helper
+
+    This hepler used qdisc dump to list all qdisc and find if block index in
+    question is used by any of them. That means the block with specified
+    index exists.
+
+    Signed-off-by: Jiri Pirko <jiri@mellanox.com>
+    Signed-off-by: David Ahern <dsahern@gmail.com>
+---
+ tc/tc_qdisc.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++
+ tc/tc_util.h  |  2 ++
+ 2 files changed, 63 insertions(+)
+
+diff --git a/tc/tc_qdisc.c b/tc/tc_qdisc.c
+index 8b0c5c72dbad1..f8e06ccf205a0 100644
+--- a/tc/tc_qdisc.c
++++ b/tc/tc_qdisc.c
+@@ -366,3 +366,64 @@ int do_qdisc(int argc, char **argv)
+ 	fprintf(stderr, "Command \"%s\" is unknown, try \"tc qdisc help\".\n", *argv);
+ 	return -1;
+ }
++
++struct tc_qdisc_block_exists_ctx {
++	__u32 block_index;
++	bool found;
++};
++
++static int tc_qdisc_block_exists_cb(const struct sockaddr_nl *who,
++				    struct nlmsghdr *n, void *arg)
++{
++	struct tc_qdisc_block_exists_ctx *ctx = arg;
++	struct tcmsg *t = NLMSG_DATA(n);
++	struct rtattr *tb[TCA_MAX+1];
++	int len = n->nlmsg_len;
++
++	if (n->nlmsg_type != RTM_NEWQDISC)
++		return 0;
++
++	len -= NLMSG_LENGTH(sizeof(*t));
++	if (len < 0)
++		return -1;
++
++	parse_rtattr(tb, TCA_MAX, TCA_RTA(t), len);
++
++	if (tb[TCA_KIND] == NULL)
++		return -1;
++
++	if (tb[TCA_INGRESS_BLOCK] &&
++	    RTA_PAYLOAD(tb[TCA_INGRESS_BLOCK]) >= sizeof(__u32)) {
++		__u32 block = rta_getattr_u32(tb[TCA_INGRESS_BLOCK]);
++
++		if (block == ctx->block_index)
++			ctx->found = true;
++	}
++
++	if (tb[TCA_EGRESS_BLOCK] &&
++	    RTA_PAYLOAD(tb[TCA_EGRESS_BLOCK]) >= sizeof(__u32)) {
++		__u32 block = rta_getattr_u32(tb[TCA_EGRESS_BLOCK]);
++
++		if (block == ctx->block_index)
++			ctx->found = true;
++	}
++	return 0;
++}
++
++bool tc_qdisc_block_exists(__u32 block_index)
++{
++	struct tc_qdisc_block_exists_ctx ctx = { .block_index = block_index };
++	struct tcmsg t = { .tcm_family = AF_UNSPEC };
++
++	if (rtnl_dump_request(&rth, RTM_GETQDISC, &t, sizeof(t)) < 0) {
++		perror("Cannot send dump request");
++		return false;
++	}
++
++	if (rtnl_dump_filter(&rth, tc_qdisc_block_exists_cb, &ctx) < 0) {
++		perror("Dump terminated\n");
++		return false;
++	}
++
++	return ctx.found;
++}
+diff --git a/tc/tc_util.h b/tc/tc_util.h
+index 5c54ad384eae6..8344c11833ee8 100644
+--- a/tc/tc_util.h
++++ b/tc/tc_util.h
+@@ -122,4 +122,6 @@ int prio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt);
+ int cls_names_init(char *path);
+ void cls_names_uninit(void);
+ 
++bool tc_qdisc_block_exists(__u32 block_index);
++
+ #endif
+-- 
+2.20.1
+
diff --git a/SOURCES/0144-tc_filter-resolve-device-name-before-parsing-filter.patch b/SOURCES/0144-tc_filter-resolve-device-name-before-parsing-filter.patch
new file mode 100644
index 0000000..66c8eaa
--- /dev/null
+++ b/SOURCES/0144-tc_filter-resolve-device-name-before-parsing-filter.patch
@@ -0,0 +1,113 @@
+From 83b78ff645260a51ff5d643169009faeb3032d3c Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Tue, 18 Jun 2019 20:02:54 +0200
+Subject: [PATCH] tc_filter: resolve device name before parsing filter
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1721291
+Upstream Status: iproute2.git commit 01ea76b1cf545
+
+commit 01ea76b1cf54516c71a9a54fba672410ada2cccb
+Author: Jakub Kicinski <jakub.kicinski@netronome.com>
+Date:   Thu Nov 23 18:12:06 2017 -0800
+
+    tc_filter: resolve device name before parsing filter
+
+    Move resolving device name into an ifindex before calling filter
+    specific callbacks.  This way if filters need the ifindex, they
+    can read it from the request.
+
+    Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
+    Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com>
+    Acked-by: Daniel Borkmann <daniel@iogearbox.net>
+---
+ tc/tc_filter.c | 50 ++++++++++++++++++++++++--------------------------
+ 1 file changed, 24 insertions(+), 26 deletions(-)
+
+diff --git a/tc/tc_filter.c b/tc/tc_filter.c
+index 8dbebf1ffa32a..e479039159df6 100644
+--- a/tc/tc_filter.c
++++ b/tc/tc_filter.c
+@@ -161,6 +161,16 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv)
+ 	if (k[0])
+ 		addattr_l(&req.n, sizeof(req), TCA_KIND, k, strlen(k)+1);
+ 
++	if (d[0])  {
++		ll_init_map(&rth);
++
++		req.t.tcm_ifindex = ll_name_to_index(d);
++		if (req.t.tcm_ifindex == 0) {
++			fprintf(stderr, "Cannot find device \"%s\"\n", d);
++			return 1;
++		}
++	}
++
+ 	if (q) {
+ 		if (q->parse_fopt(q, fhandle, argc, argv, &req.n))
+ 			return 1;
+@@ -183,17 +193,6 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv)
+ 	if (est.ewma_log)
+ 		addattr_l(&req.n, sizeof(req), TCA_RATE, &est, sizeof(est));
+ 
+-
+-	if (d[0])  {
+-		ll_init_map(&rth);
+-
+-		req.t.tcm_ifindex = ll_name_to_index(d);
+-		if (req.t.tcm_ifindex == 0) {
+-			fprintf(stderr, "Cannot find device \"%s\"\n", d);
+-			return 1;
+-		}
+-	}
+-
+ 	if (rtnl_talk(&rth, &req.n, NULL) < 0) {
+ 		fprintf(stderr, "We have an error talking to the kernel\n");
+ 		return 2;
+@@ -453,10 +452,23 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv)
+ 		return -1;
+ 	}
+ 
++	if (d[0])  {
++		ll_init_map(&rth);
++
++		req.t.tcm_ifindex = ll_name_to_index(d);
++		if (req.t.tcm_ifindex  == 0) {
++			fprintf(stderr, "Cannot find device \"%s\"\n", d);
++			return 1;
++		}
++		filter_ifindex = req.t.tcm_ifindex;
++	} else {
++		fprintf(stderr, "Must specify netdevice \"dev\"\n");
++		return -1;
++	}
++
+ 	if (q->parse_fopt(q, fhandle, argc, argv, &req.n))
+ 		return 1;
+ 
+-
+ 	if (!fhandle) {
+ 		fprintf(stderr, "Must specify filter \"handle\"\n");
+ 		return -1;
+@@ -471,20 +483,6 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv)
+ 		return -1;
+ 	}
+ 
+-	if (d[0])  {
+-		ll_init_map(&rth);
+-
+-		req.t.tcm_ifindex = ll_name_to_index(d);
+-		if (req.t.tcm_ifindex  == 0) {
+-			fprintf(stderr, "Cannot find device \"%s\"\n", d);
+-			return 1;
+-		}
+-		filter_ifindex = req.t.tcm_ifindex;
+-	} else {
+-		fprintf(stderr, "Must specify netdevice \"dev\"\n");
+-		return -1;
+-	}
+-
+ 	if (rtnl_talk(&rth, &req.n, &answer) < 0) {
+ 		fprintf(stderr, "We have an error talking to the kernel\n");
+ 		return 2;
+-- 
+2.20.1
+
diff --git a/SOURCES/0145-tc-introduce-support-for-block-handle-for-filter-ope.patch b/SOURCES/0145-tc-introduce-support-for-block-handle-for-filter-ope.patch
new file mode 100644
index 0000000..1fe56ff
--- /dev/null
+++ b/SOURCES/0145-tc-introduce-support-for-block-handle-for-filter-ope.patch
@@ -0,0 +1,269 @@
+From 13e1ae7b588c723091f81538bb5834b274f0b0c7 Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Tue, 18 Jun 2019 20:02:54 +0200
+Subject: [PATCH] tc: introduce support for block-handle for filter operations
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1721291
+Upstream Status: iproute2.git commit 0c7cef9669a82
+Conflicts: context change due to missing commit 485d0c6001c4a
+           ("tc: Add batchsize feature for filter and actions"),
+           also adjust code to use fprintf instead of print_string
+           due to missing commit 249284ff5a44a ("tc: jsonify filter core")
+
+commit 0c7cef9669a82d4ad0438922f7ce57c18100d6b8
+Author: Jiri Pirko <jiri@mellanox.com>
+Date:   Sat Jan 20 11:00:28 2018 +0100
+
+    tc: introduce support for block-handle for filter operations
+
+    So far, qdisc was the only handle that could be used to manipulate
+    filters. Kernel added support for using block to manipulate it. So add
+    the support to use block index to manipulate filters. The magic
+    TCM_IFINDEX_MAGIC_BLOCK indicates the block index is in use.
+
+    Signed-off-by: Jiri Pirko <jiri@mellanox.com>
+    Signed-off-by: David Ahern <dsahern@gmail.com>
+---
+ man/man8/tc.8  |  18 +++++++++
+ tc/tc_filter.c | 102 +++++++++++++++++++++++++++++++++++++++++--------
+ 2 files changed, 104 insertions(+), 16 deletions(-)
+
+diff --git a/man/man8/tc.8 b/man/man8/tc.8
+index a341a8f995f85..c493ccfa7c900 100644
+--- a/man/man8/tc.8
++++ b/man/man8/tc.8
+@@ -41,6 +41,19 @@ tc \- show / manipulate traffic control settings
+ .B flowid
+ \fIflow-id\fR
+ 
++.B tc
++.RI "[ " OPTIONS " ]"
++.B filter [ add | change | replace | delete | get ] block
++\fIBLOCK_INDEX\fR
++.B [ handle \fIfilter-id\fR ]
++.B protocol
++\fIprotocol\fR
++.B prio
++\fIpriority\fR filtertype
++[ filtertype specific parameters ]
++.B flowid
++\fIflow-id\fR
++
+ .B tc
+ .RI "[ " OPTIONS " ]"
+ .RI "[ " FORMAT " ]"
+@@ -58,6 +71,11 @@ tc \- show / manipulate traffic control settings
+ .RI "[ " OPTIONS " ]"
+ .B filter show dev
+ \fIDEV\fR
++.P
++.B tc
++.RI "[ " OPTIONS " ]"
++.B filter show block
++\fIBLOCK_INDEX\fR
+ 
+ .P
+ .ti 8
+diff --git a/tc/tc_filter.c b/tc/tc_filter.c
+index e479039159df6..5676ed3a74383 100644
+--- a/tc/tc_filter.c
++++ b/tc/tc_filter.c
+@@ -29,14 +29,17 @@
+ static void usage(void)
+ {
+ 	fprintf(stderr,
+-		"Usage: tc filter [ add | del | change | replace | show ] dev STRING\n"
+-		"Usage: tc filter get dev STRING parent CLASSID protocol PROTO handle FILTERID pref PRIO FILTER_TYPE\n"
++		"Usage: tc filter [ add | del | change | replace | show ] [ dev STRING ]\n"
++		"       tc filter [ add | del | change | replace | show ] [ block BLOCK_INDEX ]\n"
++		"       tc filter get dev STRING parent CLASSID protocol PROTO handle FILTERID pref PRIO FILTER_TYPE\n"
++		"       tc filter get block BLOCK_INDEX protocol PROTO handle FILTERID pref PRIO FILTER_TYPE\n"
+ 		"       [ pref PRIO ] protocol PROTO [ chain CHAIN_INDEX ]\n"
+ 		"       [ estimator INTERVAL TIME_CONSTANT ]\n"
+ 		"       [ root | ingress | egress | parent CLASSID ]\n"
+ 		"       [ handle FILTERID ] [ [ FILTER_TYPE ] [ help | OPTIONS ] ]\n"
+ 		"\n"
+ 		"       tc filter show [ dev STRING ] [ root | ingress | egress | parent CLASSID ]\n"
++		"       tc filter show [ block BLOCK_INDEX ]\n"
+ 		"Where:\n"
+ 		"FILTER_TYPE := { rsvp | u32 | bpf | fw | route | etc. }\n"
+ 		"FILTERID := ... format depends on classifier, see there\n"
+@@ -61,6 +64,7 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv)
+ 	int protocol_set = 0;
+ 	__u32 chain_index;
+ 	int chain_index_set = 0;
++	__u32 block_index = 0;
+ 	char *fhandle = NULL;
+ 	char  d[16] = {};
+ 	char  k[16] = {};
+@@ -74,7 +78,21 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv)
+ 			NEXT_ARG();
+ 			if (d[0])
+ 				duparg("dev", *argv);
++			if (block_index) {
++				fprintf(stderr, "Error: \"dev\" and \"block\" are mutually exlusive\n");
++				return -1;
++			}
+ 			strncpy(d, *argv, sizeof(d)-1);
++		} else if (matches(*argv, "block") == 0) {
++			NEXT_ARG();
++			if (block_index)
++				duparg("block", *argv);
++			if (d[0]) {
++				fprintf(stderr, "Error: \"dev\" and \"block\" are mutually exlusive\n");
++				return -1;
++			}
++			if (get_u32(&block_index, *argv, 0) || !block_index)
++				invarg("invalid block index value", *argv);
+ 		} else if (strcmp(*argv, "root") == 0) {
+ 			if (req.t.tcm_parent) {
+ 				fprintf(stderr,
+@@ -169,6 +187,9 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv)
+ 			fprintf(stderr, "Cannot find device \"%s\"\n", d);
+ 			return 1;
+ 		}
++	} else if (block_index) {
++		req.t.tcm_ifindex = TCM_IFINDEX_MAGIC_BLOCK;
++		req.t.tcm_block_index = block_index;
+ 	}
+ 
+ 	if (q) {
+@@ -207,6 +228,7 @@ static __u32 filter_prio;
+ static __u32 filter_protocol;
+ static __u32 filter_chain_index;
+ static int filter_chain_index_set;
++static __u32 filter_block_index;
+ __u16 f_proto;
+ 
+ int print_filter(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
+@@ -251,19 +273,25 @@ int print_filter(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
+ 		fprintf(fp, "added ");
+ 
+ 	fprintf(fp, "filter ");
+-	if (!filter_ifindex || filter_ifindex != t->tcm_ifindex)
+-		fprintf(fp, "dev %s ", ll_index_to_name(t->tcm_ifindex));
+-
+-	if (!filter_parent || filter_parent != t->tcm_parent) {
+-		if (t->tcm_parent == TC_H_ROOT)
+-			fprintf(fp, "root ");
+-		else if (t->tcm_parent == TC_H_MAKE(TC_H_CLSACT, TC_H_MIN_INGRESS))
+-			fprintf(fp, "ingress ");
+-		else if (t->tcm_parent == TC_H_MAKE(TC_H_CLSACT, TC_H_MIN_EGRESS))
+-			fprintf(fp, "egress ");
+-		else {
+-			print_tc_classid(abuf, sizeof(abuf), t->tcm_parent);
+-			fprintf(fp, "parent %s ", abuf);
++	if (t->tcm_ifindex == TCM_IFINDEX_MAGIC_BLOCK) {
++		if (!filter_block_index ||
++		    filter_block_index != t->tcm_block_index)
++			fprintf(fp, "block %u ", t->tcm_block_index);
++	} else {
++		if (!filter_ifindex || filter_ifindex != t->tcm_ifindex)
++			fprintf(fp, "dev %s ", ll_index_to_name(t->tcm_ifindex));
++
++		if (!filter_parent || filter_parent != t->tcm_parent) {
++			if (t->tcm_parent == TC_H_ROOT)
++				fprintf(fp, "root ");
++			else if (t->tcm_parent == TC_H_MAKE(TC_H_CLSACT, TC_H_MIN_INGRESS))
++				fprintf(fp, "ingress ");
++			else if (t->tcm_parent == TC_H_MAKE(TC_H_CLSACT, TC_H_MIN_EGRESS))
++				fprintf(fp, "egress ");
++			else {
++				print_tc_classid(abuf, sizeof(abuf), t->tcm_parent);
++				fprintf(fp, "parent %s ", abuf);
++			}
+ 		}
+ 	}
+ 
+@@ -337,6 +365,7 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv)
+ 	int protocol_set = 0;
+ 	__u32 chain_index;
+ 	int chain_index_set = 0;
++	__u32 block_index = 0;
+ 	__u32 parent_handle = 0;
+ 	char *fhandle = NULL;
+ 	char  d[16] = {};
+@@ -347,7 +376,21 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv)
+ 			NEXT_ARG();
+ 			if (d[0])
+ 				duparg("dev", *argv);
++			if (block_index) {
++				fprintf(stderr, "Error: \"dev\" and \"block\" are mutually exlusive\n");
++				return -1;
++			}
+ 			strncpy(d, *argv, sizeof(d)-1);
++		} else if (matches(*argv, "block") == 0) {
++			NEXT_ARG();
++			if (block_index)
++				duparg("block", *argv);
++			if (d[0]) {
++				fprintf(stderr, "Error: \"dev\" and \"block\" are mutually exlusive\n");
++				return -1;
++			}
++			if (get_u32(&block_index, *argv, 0) || !block_index)
++				invarg("invalid block index value", *argv);
+ 		} else if (strcmp(*argv, "root") == 0) {
+ 			if (req.t.tcm_parent) {
+ 				fprintf(stderr,
+@@ -461,8 +504,12 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv)
+ 			return 1;
+ 		}
+ 		filter_ifindex = req.t.tcm_ifindex;
++	} else if (block_index) {
++		req.t.tcm_ifindex = TCM_IFINDEX_MAGIC_BLOCK;
++		req.t.tcm_block_index = block_index;
++		filter_block_index = block_index;
+ 	} else {
+-		fprintf(stderr, "Must specify netdevice \"dev\"\n");
++		fprintf(stderr, "Must specify netdevice \"dev\" or block index \"block\"\n");
+ 		return -1;
+ 	}
+ 
+@@ -510,6 +557,7 @@ static int tc_filter_list(int argc, char **argv)
+ 	__u32 prio = 0;
+ 	__u32 protocol = 0;
+ 	__u32 chain_index;
++	__u32 block_index = 0;
+ 	char *fhandle = NULL;
+ 
+ 	while (argc > 0) {
+@@ -517,7 +565,21 @@ static int tc_filter_list(int argc, char **argv)
+ 			NEXT_ARG();
+ 			if (d[0])
+ 				duparg("dev", *argv);
++			if (block_index) {
++				fprintf(stderr, "Error: \"dev\" cannot be used in the same time as \"block\"\n");
++				return -1;
++			}
+ 			strncpy(d, *argv, sizeof(d)-1);
++		} else if (matches(*argv, "block") == 0) {
++			NEXT_ARG();
++			if (block_index)
++				duparg("block", *argv);
++			if (d[0]) {
++				fprintf(stderr, "Error: \"block\" cannot be used in the same time as \"dev\"\n");
++				return -1;
++			}
++			if (get_u32(&block_index, *argv, 0) || !block_index)
++				invarg("invalid block index value", *argv);
+ 		} else if (strcmp(*argv, "root") == 0) {
+ 			if (req.t.tcm_parent) {
+ 				fprintf(stderr,
+@@ -606,6 +668,14 @@ static int tc_filter_list(int argc, char **argv)
+ 			return 1;
+ 		}
+ 		filter_ifindex = req.t.tcm_ifindex;
++	} else if (block_index) {
++		if (!tc_qdisc_block_exists(block_index)) {
++			fprintf(stderr, "Cannot find block \"%u\"\n", block_index);
++			return 1;
++		}
++		req.t.tcm_ifindex = TCM_IFINDEX_MAGIC_BLOCK;
++		req.t.tcm_block_index = block_index;
++		filter_block_index = block_index;
+ 	}
+ 
+ 	if (filter_chain_index_set)
+-- 
+2.20.1
+
diff --git a/SOURCES/0146-tc-implement-ingress-egress-block-index-attributes-f.patch b/SOURCES/0146-tc-implement-ingress-egress-block-index-attributes-f.patch
new file mode 100644
index 0000000..e0aa77c
--- /dev/null
+++ b/SOURCES/0146-tc-implement-ingress-egress-block-index-attributes-f.patch
@@ -0,0 +1,121 @@
+From f38f33f8693ed7a4f883b18862e47f822ff8a62d Mon Sep 17 00:00:00 2001
+From: Andrea Claudi <aclaudi@redhat.com>
+Date: Tue, 18 Jun 2019 20:04:42 +0200
+Subject: [PATCH] tc: implement ingress/egress block index attributes for
+ qdiscs
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1721291
+Upstream Status: iproute2.git commit 063463efd7f0d
+Conflicts: adjust the code to make it compile due to missing
+           commit c91d262f414d2 ("tc: jsonify qdisc core")
+
+commit 063463efd7f0d91b7372b089a7b7aff7fc9ac0f6
+Author: Jiri Pirko <jiri@mellanox.com>
+Date:   Sat Jan 20 11:00:29 2018 +0100
+
+    tc: implement ingress/egress block index attributes for qdiscs
+
+    During qdisc creation it is possible to specify shared block for bot
+    ingress and egress. Pass this values to kernel according to the command
+    line options.
+
+    Signed-off-by: Jiri Pirko <jiri@mellanox.com>
+    Signed-off-by: David Ahern <dsahern@gmail.com>
+---
+ man/man8/tc.8 |  6 +++++-
+ tc/tc_qdisc.c | 34 ++++++++++++++++++++++++++++++++++
+ 2 files changed, 39 insertions(+), 1 deletion(-)
+
+diff --git a/man/man8/tc.8 b/man/man8/tc.8
+index c493ccfa7c900..c89a7a8ecf83b 100644
+--- a/man/man8/tc.8
++++ b/man/man8/tc.8
+@@ -11,7 +11,11 @@ tc \- show / manipulate traffic control settings
+ \fIqdisc-id\fR
+ .B | root ]
+ .B [ handle
+-\fIqdisc-id\fR ] qdisc
++\fIqdisc-id\fR ]
++.B [ ingress_block
++\fIBLOCK_INDEX\fR ]
++.B [ egress_block
++\fIBLOCK_INDEX\fR ] qdisc
+ [ qdisc specific parameters ]
+ .P
+ 
+diff --git a/tc/tc_qdisc.c b/tc/tc_qdisc.c
+index f8e06ccf205a0..26d23f43007ae 100644
+--- a/tc/tc_qdisc.c
++++ b/tc/tc_qdisc.c
+@@ -32,6 +32,7 @@ static int usage(void)
+ 	fprintf(stderr, "       [ handle QHANDLE ] [ root | ingress | clsact | parent CLASSID ]\n");
+ 	fprintf(stderr, "       [ estimator INTERVAL TIME_CONSTANT ]\n");
+ 	fprintf(stderr, "       [ stab [ help | STAB_OPTIONS] ]\n");
++	fprintf(stderr, "       [ ingress_block BLOCK_INDEX ] [ egress_block BLOCK_INDEX ]\n");
+ 	fprintf(stderr, "       [ [ QDISC_KIND ] [ help | OPTIONS ] ]\n");
+ 	fprintf(stderr, "\n");
+ 	fprintf(stderr, "       tc qdisc show [ dev STRING ] [ ingress | clsact ]\n");
+@@ -62,6 +63,8 @@ static int tc_qdisc_modify(int cmd, unsigned int flags, int argc, char **argv)
+ 		.n.nlmsg_type = cmd,
+ 		.t.tcm_family = AF_UNSPEC,
+ 	};
++	__u32 ingress_block = 0;
++	__u32 egress_block = 0;
+ 
+ 	while (argc > 0) {
+ 		if (strcmp(*argv, "dev") == 0) {
+@@ -122,6 +125,14 @@ static int tc_qdisc_modify(int cmd, unsigned int flags, int argc, char **argv)
+ 			if (parse_size_table(&argc, &argv, &stab.szopts) < 0)
+ 				return -1;
+ 			continue;
++		} else if (matches(*argv, "ingress_block") == 0) {
++			NEXT_ARG();
++			if (get_u32(&ingress_block, *argv, 0) || !ingress_block)
++				invarg("invalid ingress block index value", *argv);
++		} else if (matches(*argv, "egress_block") == 0) {
++			NEXT_ARG();
++			if (get_u32(&egress_block, *argv, 0) || !egress_block)
++				invarg("invalid egress block index value", *argv);
+ 		} else if (matches(*argv, "help") == 0) {
+ 			usage();
+ 		} else {
+@@ -139,6 +150,13 @@ static int tc_qdisc_modify(int cmd, unsigned int flags, int argc, char **argv)
+ 	if (est.ewma_log)
+ 		addattr_l(&req.n, sizeof(req), TCA_RATE, &est, sizeof(est));
+ 
++	if (ingress_block)
++		addattr32(&req.n, sizeof(req),
++			  TCA_INGRESS_BLOCK, ingress_block);
++	if (egress_block)
++		addattr32(&req.n, sizeof(req),
++			  TCA_EGRESS_BLOCK, egress_block);
++
+ 	if (q) {
+ 		if (q->parse_qopt) {
+ 			if (q->parse_qopt(q, argc, argv, &req.n))
+@@ -252,6 +270,22 @@ int print_qdisc(const struct sockaddr_nl *who,
+ 	if (t->tcm_info != 1)
+ 		fprintf(fp, "refcnt %d ", t->tcm_info);
+ 
++	if (tb[TCA_INGRESS_BLOCK] &&
++	    RTA_PAYLOAD(tb[TCA_INGRESS_BLOCK]) >= sizeof(__u32)) {
++		__u32 block = rta_getattr_u32(tb[TCA_INGRESS_BLOCK]);
++
++		if (block)
++			fprintf(fp, "ingress_block %u ", block);
++	}
++
++	if (tb[TCA_EGRESS_BLOCK] &&
++	    RTA_PAYLOAD(tb[TCA_EGRESS_BLOCK]) >= sizeof(__u32)) {
++		__u32 block = rta_getattr_u32(tb[TCA_EGRESS_BLOCK]);
++
++		if (block)
++			fprintf(fp, "egress_block %u ", block);
++	}
++
+ 	/* pfifo_fast is generic enough to warrant the hardcoding --JHS */
+ 	if (strcmp("pfifo_fast", RTA_DATA(tb[TCA_KIND])) == 0)
+ 		q = get_qdisc_kind("prio");
+-- 
+2.20.1
+
diff --git a/SOURCES/avpkt b/SOURCES/avpkt
new file mode 100644
index 0000000..c362b94
--- /dev/null
+++ b/SOURCES/avpkt
@@ -0,0 +1 @@
+AVPKT=3000
diff --git a/SOURCES/cbq-0000.example b/SOURCES/cbq-0000.example
new file mode 100644
index 0000000..5503374
--- /dev/null
+++ b/SOURCES/cbq-0000.example
@@ -0,0 +1,5 @@
+DEVICE=eth0,10Mbit,1Mbit
+RATE=128Kbit
+WEIGHT=10Kbit
+PRIO=5
+RULE=192.168.1.0/24
diff --git a/SOURCES/rt_dsfield.deprecated b/SOURCES/rt_dsfield.deprecated
new file mode 100644
index 0000000..c8eec63
--- /dev/null
+++ b/SOURCES/rt_dsfield.deprecated
@@ -0,0 +1,17 @@
+
+# Deprecated values dropped upstream
+# Kept in RHEL for backwards-compatibility
+0x00   default
+0x10   lowdelay
+0x08   throughput
+0x04   reliability
+# This value overlap with ECT, do not use it!
+0x02   mincost
+# These values seems do not want to die, Cisco likes them by a strange reason.
+0x20   priority
+0x40   immediate
+0x60   flash
+0x80   flash-override
+0xa0   critical
+0xc0   internet
+0xe0   network
diff --git a/SPECS/iproute.spec b/SPECS/iproute.spec
new file mode 100644
index 0000000..9c0adae
--- /dev/null
+++ b/SPECS/iproute.spec
@@ -0,0 +1,1712 @@
+%global             cbq_version v0.7.3
+
+%define rpmversion 4.11.0
+%define baserelease 0.el7
+%define specrelease 25%{?dist}
+%define pkg_release %{specrelease}%{?buildid}
+
+Summary:            Advanced IP routing and network device configuration tools
+Name:               iproute
+Version:            %{rpmversion}
+Release:            %{pkg_release}
+Group:              Applications/System
+URL:                http://kernel.org/pub/linux/utils/net/%{name}2/
+Source0:            %{name}-%{rpmversion}-%{baserelease}.tar.xz
+Source1:            cbq-0000.example
+Source2:            avpkt
+Source3:            rt_dsfield.deprecated
+Patch0:             0001-Confirm-success-for-each-tc-batch-command.patch
+Patch1:             0002-Really-fix-get_addr-and-get_prefix-error-messages.patch
+Patch2:             0003-tc-simple-Fix-documentation.patch
+Patch3:             0004-tc-fix-m_simple-usage.patch
+Patch4:             0005-bpf-Make-bytecode-file-reading-a-little-more-robust.patch
+Patch5:             0006-ss-Fix-for-added-diag-support-check.patch
+Patch6:             0007-tc-simple.8-Fix-reference-to-non-existing-tc-actions.patch
+Patch7:             0008-lib-bpf-Fix-bytecode-file-parsing.patch
+Patch8:             0009-tc-simple.8-Fix-one-more-reference-to-non-existing-t.patch
+Patch9:             0010-tc-m_xt-Prevent-a-segfault-in-libipt.patch
+Patch10:            0011-link_gre6-really-support-encaplimit-option.patch
+Patch11:            0012-tc-fix-typo-in-manpage.patch
+Patch12:            0013-ip-neigh-allow-flush-FAILED-neighbour-entry.patch
+Patch13:            0014-netns-avoid-directory-traversal.patch
+Patch14:            0015-utils-return-default-family-when-rtm_family-is-not-R.patch
+Patch15:            0016-link_gre6-Fix-for-changing-tclass-flowlabel.patch
+Patch16:            0017-netlink-Change-rtnl_dump_done-to-always-show-error.patch
+Patch17:            0018-libnetlink-drop-unused-parameter-to-rtnl_dump_done.patch
+Patch18:            0019-iproute-Add-support-for-extended-ack-to-rtnl_talk.patch
+Patch19:            0020-iplink-check-for-message-truncation-in-iplink_get.patch
+Patch20:            0021-iplink-double-the-buffer-size-also-in-iplink_get.patch
+Patch21:            0022-lib-libnetlink-re-malloc-buff-if-size-is-not-enough.patch
+Patch22:            0023-lib-libnetlink-update-rtnl_talk-to-support-malloc-bu.patch
+Patch23:            0024-Update-linux-headers.patch
+Patch24:            0025-devlink-Change-netlink-attribute-validation.patch
+Patch25:            0026-devlink-Add-support-for-pipeline-debug-dpipe.patch
+Patch26:            0027-tc-Reflect-HW-offload-status.patch
+Patch27:            0028-pedit-Fix-a-typo-in-warning.patch
+Patch28:            0029-pedit-Do-not-allow-using-retain-for-too-big-fields.patch
+Patch29:            0030-pedit-Check-for-extended-capability-in-protocol-pars.patch
+Patch30:            0031-pedit-Introduce-ipv6-support.patch
+Patch31:            0032-devlink-Add-option-to-set-and-show-eswitch-encapsula.patch
+Patch32:            0033-tc-flower-add-support-for-tcp-flags.patch
+Patch33:            0034-iplink-Update-usage-in-help-message.patch
+Patch34:            0035-tc-flower-add-support-for-matching-on-ip-tos-and-ttl.patch
+Patch35:            0036-iproute-build-more-easily-on-Android.patch
+Patch36:            0037-uapi-add-include-linux-vm_sockets_diag.h.patch
+Patch37:            0038-ss-allow-AF_FAMILY-constants-32.patch
+Patch38:            0039-ss-add-AF_VSOCK-support.patch
+Patch39:            0040-link_gre6-Detect-invalid-encaplimit-values.patch
+Patch40:            0041-man-tc-csum.8-Fix-inconsistency-in-example-descripti.patch
+Patch41:            0042-tc-fix-command-tc-actions-del-hang-issue.patch
+Patch42:            0043-ip-link-Fix-use-after-free-in-nl_get_ll_addr_len.patch
+Patch43:            0044-tc-m_tunnel_key-reformat-the-usage-text.patch
+Patch44:            0045-tc-m_tunnel_key-Allow-key-less-tunnels.patch
+Patch45:            0046-tc-include-stdint.h-explicitly-for-UINT16_MAX.patch
+Patch46:            0047-Update-kernel-headers.patch
+Patch47:            0048-tc-flower-Add-match-on-encapsulating-tos-ttl.patch
+Patch48:            0049-tc-act_tunnel_key-Enable-setup-of-tos-and-ttl.patch
+Patch49:            0050-iproute-Abort-if-nexthop-cannot-be-parsed.patch
+Patch50:            0051-ip-route-Fix-segfault-with-many-nexthops.patch
+Patch51:            0052-man-ip-route.8-Document-nexthop-limit.patch
+Patch52:            0053-ip-route-Fix-nexthop-encap-parsing.patch
+Patch53:            0054-ip-link-Fix-listing-of-alias-interfaces.patch
+Patch54:            0055-ip-Add-violation-counters-to-VF-statisctics.patch
+Patch55:            0056-devlink-Add-support-for-devlink-resource-abstraction.patch
+Patch56:            0057-devlink-Add-support-for-hot-reload.patch
+Patch57:            0058-devlink-Update-man-pages-and-add-resource-man.patch
+Patch58:            0059-devlink-Add-param-command-support.patch
+Patch59:            0060-man-ip-route.8-ssthresh-parameter-is-NUMBER.patch
+Patch60:            0061-man-tc-vlan.8-Fix-for-incorrect-example.patch
+Patch61:            0062-tc-flower-Add-support-for-QinQ.patch
+Patch62:            0063-utils-Move-BIT-macro-to-common-header.patch
+Patch63:            0064-lib-make-resolve_hosts-variable-common.patch
+Patch64:            0065-json_writer-add-new-json-handlers-null-float-with-fo.patch
+Patch65:            0066-rdma-Add-MR-resource-tracking-information.patch
+Patch66:            0067-rdma-add-infrastructure-for-RDMA-tool.patch
+Patch67:            0068-rdma-add-man-pages-for-RDMA-tool.patch
+Patch68:            0069-tc-f_flower-Add-support-for-matching-first-frag-pack.patch
+Patch69:            0070-ss-enclose-IPv6-address-in-brackets.patch
+Patch70:            0071-ip-address-Use-correct-max-attribute-value-in-print_.patch
+Patch71:            0072-examples-Some-shell-fixes-to-cbq.init.patch
+Patch72:            0073-ifcfg-Quote-left-hand-side-of-expression.patch
+Patch73:            0074-tipc-node-Fix-socket-fd-check-in-cmd_node_get_addr.patch
+Patch74:            0075-iproute_lwtunnel-Argument-to-strerror-must-be-positi.patch
+Patch75:            0076-iproute_lwtunnel-csum_mode-value-checking-was-ineffe.patch
+Patch76:            0077-ss-Don-t-leak-fd-in-tcp_show_netlink_file.patch
+Patch77:            0078-tc-em_ipset-Don-t-leak-sockfd-on-error-path.patch
+Patch78:            0079-ipvrf-Fix-error-path-of-vrf_switch.patch
+Patch79:            0080-ifstat-Fix-memleak-in-error-case.patch
+Patch80:            0081-ifstat-Fix-memleak-in-dump_kern_db-for-json-output.patch
+Patch81:            0082-ss-Fix-potential-memleak-in-unix_stats_print.patch
+Patch82:            0083-tipc-bearer-Fix-resource-leak-in-error-path.patch
+Patch83:            0084-devlink-No-need-for-this-self-assignment.patch
+Patch84:            0085-ipntable-No-need-to-check-and-assign-to-parms_rta.patch
+Patch85:            0086-iproute-Fix-for-missing-Oifs-display.patch
+Patch86:            0087-lib-rt_names-Drop-dead-code-in-rtnl_rttable_n2a.patch
+Patch87:            0088-ss-Skip-useless-check-in-parse_hostcond.patch
+Patch88:            0089-ss-Drop-useless-assignment.patch
+Patch89:            0090-tc-m_gact-Drop-dead-code.patch
+Patch90:            0091-ipaddress-Avoid-accessing-uninitialized-variable-lcl.patch
+Patch91:            0092-iplink_can-Prevent-overstepping-array-bounds.patch
+Patch92:            0093-ipmaddr-Avoid-accessing-uninitialized-data.patch
+Patch93:            0094-ss-Use-C99-initializer-in-netlink_show_one.patch
+Patch94:            0095-netem-maketable-Check-return-value-of-fstat.patch
+Patch95:            0096-tc-q_multiq-Don-t-pass-garbage-in-TCA_OPTIONS.patch
+Patch96:            0097-iproute-Check-mark-value-input.patch
+Patch97:            0098-iplink_vrf-Complain-if-main-table-is-not-found.patch
+Patch98:            0099-devlink-Check-return-code-of-strslashrsplit.patch
+Patch99:            0100-lib-bpf-Don-t-leak-fp-in-bpf_find_mntpt.patch
+Patch100:           0101-ifstat-nstat-Check-fdopen-return-value.patch
+Patch101:           0102-tc-q_netem-Don-t-dereference-possibly-NULL-pointer.patch
+Patch102:           0103-tc-tc_filter-Make-sure-filter-name-is-not-empty.patch
+Patch103:           0104-tipc-bearer-Prevent-NULL-pointer-dereference.patch
+Patch104:           0105-ipntable-Avoid-memory-allocation-for-filter.name.patch
+Patch105:           0106-lib-fs-Fix-format-string-in-find_fs_mount.patch
+Patch106:           0107-lib-inet_proto-Review-inet_proto_-a2n-n2a.patch
+Patch107:           0108-lnstat_util-Simplify-alloc_and_open-a-bit.patch
+Patch108:           0109-tc-m_xt-Fix-for-potential-string-buffer-overflows.patch
+Patch109:           0110-lib-ll_map-Choose-size-of-new-cache-items-at-run-tim.patch
+Patch110:           0111-ss-Make-struct-tcpstat-fields-timer-and-timeout-unsi.patch
+Patch111:           0112-ss-Make-sure-scanned-index-value-to-unix_state_map-i.patch
+Patch112:           0113-netem-maketable-Check-return-value-of-fscanf.patch
+Patch113:           0114-lib-bpf-Check-return-value-of-write.patch
+Patch114:           0115-lib-fs-Fix-and-simplify-make_path.patch
+Patch115:           0116-lib-libnetlink-Don-t-pass-NULL-parameter-to-memcpy.patch
+Patch116:           0117-utils-Implement-strlcpy-and-strlcat.patch
+Patch117:           0118-Convert-the-obvious-cases-to-strlcpy.patch
+Patch118:           0119-Convert-harmful-calls-to-strncpy-to-strlcpy.patch
+Patch119:           0120-ipxfrm-Replace-STRBUF_CAT-macro-with-strlcat.patch
+Patch120:           0121-tc_util-No-need-to-terminate-an-snprintf-ed-buffer.patch
+Patch121:           0122-lnstat_util-Make-sure-buffer-is-NUL-terminated.patch
+Patch122:           0123-utils-strlcpy-and-strlcat-don-t-clobber-dst.patch
+Patch123:           0124-ip-6-tunnel-Avoid-copying-user-supplied-interface-na.patch
+Patch124:           0125-tc-flower-No-need-to-cache-indev-arg.patch
+Patch125:           0126-Check-user-supplied-interface-name-lengths.patch
+Patch126:           0127-bpf-minor-cleanups-for-bpf_trace_pipe.patch
+Patch127:           0128-ip-tunnel-Use-tnl_parse_key-to-parse-tunnel-key.patch
+Patch128:           0129-man-ip-link-document-GRE-tunnels.patch
+Patch129:           0130-gre-gre6-allow-clearing-i-o-key-seq-csum-flags.patch
+Patch130:           0131-tc_filter-add-support-for-chain-index.patch
+Patch131:           0132-tc-actions-add-helpers-to-parse-and-print-control-ac.patch
+Patch132:           0133-tc-actions-introduce-support-for-goto-chain-action.patch
+Patch133:           0134-tc-gact-fix-control-action-parsing.patch
+Patch134:           0135-tc-don-t-print-error-message-on-miss-when-parsing-ac.patch
+Patch135:           0136-tc-util-Don-t-call-NEXT_ARG_FWD-in-__parse_action_co.patch
+Patch136:           0137-tc-fix-parsing-of-the-control-action.patch
+Patch137:           0138-m_mirred-don-t-bail-if-the-control-action-is-missing.patch
+Patch138:           0139-tc-m_tunnel_key-add-csum-nocsum-option.patch
+Patch139:           0140-gre6-add-collect-metadata-support.patch
+Patch140:           0141-tc_util-Silence-spurious-compiler-warning.patch
+Patch141:           0142-ss-use-for-any-address-any-family-sockets.patch
+Patch142:           0143-tc-introduce-tc_qdisc_block_exists-helper.patch
+Patch143:           0144-tc_filter-resolve-device-name-before-parsing-filter.patch
+Patch144:           0145-tc-introduce-support-for-block-handle-for-filter-ope.patch
+Patch145:           0146-tc-implement-ingress-egress-block-index-attributes-f.patch
+License:            GPLv2+ and Public Domain
+BuildRequires:      bison
+BuildRequires:      flex
+BuildRequires:      iptables-devel >= 1.4.5
+BuildRequires:      libdb-devel
+BuildRequires:      libmnl-devel
+BuildRequires:      libselinux-devel
+BuildRequires:      linuxdoc-tools
+BuildRequires:      pkgconfig
+BuildRequires:      psutils
+BuildRequires:      tex(cm-super-t1.enc)
+BuildRequires:      tex(dvips)
+BuildRequires:      tex(ecrm1000.tfm)
+BuildRequires:      tex(latex)
+BuildRequires:      tex(fullpage.sty)
+%if 0%{?fedora}
+BuildRequires:      linux-atm-libs-devel
+%endif
+# For the UsrMove transition period
+Conflicts:          filesystem < 3
+Provides:           /sbin/ip
+
+%description
+The iproute package contains networking utilities (ip and rtmon, for example)
+which are designed to use the advanced networking capabilities of the Linux
+kernel.
+
+%package doc
+Summary:            ip and tc documentation with examples
+Group:              Applications/System
+License:            GPLv2+
+Requires:           %{name} = %{version}-%{release}
+
+%description doc
+The iproute documentation contains howtos and examples of settings.
+
+%package devel
+Summary:            iproute development files
+Group:              Development/Libraries
+License:            GPLv2+
+Requires:           %{name} = %{version}-%{release}
+Provides:           iproute-static = %{version}-%{release}
+
+%description devel
+The libnetlink static library.
+
+%prep
+%autosetup -p1 -n %{name}-%{version}-%{baserelease}
+sed -i 's/iproute-doc/%{name}-%{version}/' man/man8/lnstat.8
+
+%build
+export LIBDIR=/%{_libdir}
+export IPT_LIB_DIR=/%{_lib}/xtables
+export CFLAGS="${CFLAGS:-%optflags} -fno-exceptions"
+./configure
+make %{?_smp_mflags}
+make -C doc
+
+%install
+export SBINDIR=%{_sbindir}
+export MANDIR=%{_mandir}
+export LIBDIR=%{_libdir}
+export CONFDIR=%{_sysconfdir}/iproute2
+export DOCDIR=%{_docdir}
+%make_install
+# libnetlink for iproute-devel
+install -m644 include/libnetlink.h %{buildroot}%{_includedir}
+install -m644 lib/libnetlink.a %{buildroot}%{_libdir}
+# RHEL7 ships cbq tool in standard location
+install -m755 examples/cbq.init-%{cbq_version} %{buildroot}%{_sbindir}/cbq
+echo '.so man8/tc-cbq.8' > %{buildroot}%{_mandir}/man8/cbq.8
+install -d -m755 %{buildroot}%{_sysconfdir}/sysconfig/cbq
+install -m644 %{SOURCE1} %{SOURCE2} %{buildroot}%{_sysconfdir}/sysconfig/cbq
+# These man pages are missing in respective Makefile
+for manpage in genl ifcfg ip-vrf; do
+	install -m644 man/man8/${manpage}.8 %{buildroot}%{_mandir}/man8
+done
+# files in here are extracted manually from %{_builddir}
+rm -rf %{buildroot}%{_docdir}
+# RHEL7 does not support TIPC so remove tipc tool and its man pages
+rm -f %{buildroot}%{_sbindir}/tipc
+rm -rf %{buildroot}%{_mandir}/man8/tipc*
+# Append deprecated values to rt_dsfield for compatibility reasons
+cat %{SOURCE3} >>%{buildroot}%{_sysconfdir}/iproute2/rt_dsfield
+
+%files
+%dir %{_sysconfdir}/iproute2
+%doc COPYING
+%doc README README.decnet README.iproute2+tc README.distribution README.lnstat
+%{_mandir}/man7/*
+%{_mandir}/man8/*
+%attr(644,root,root) %config(noreplace) %{_sysconfdir}/iproute2/*
+%{_sbindir}/*
+%dir %{_libdir}/tc/
+%{_libdir}/tc/*
+%dir %{_sysconfdir}/sysconfig/cbq
+%config(noreplace) %{_sysconfdir}/sysconfig/cbq/*
+%{_datadir}/bash-completion/completions/tc
+
+%files doc
+%doc COPYING
+%doc doc/*.ps
+%doc examples
+
+%files devel
+%doc COPYING
+%{_mandir}/man3/*
+%{_libdir}/libnetlink.a
+%{_includedir}/libnetlink.h
+%{_includedir}/iproute2/bpf_elf.h
+
+%changelog
+* Fri Jun 21 2019 Andrea Claudi <aclaudi@redhat.com> [4.11.0-25.el7]
+- tc: implement ingress/egress block index attributes for qdiscs (Andrea Claudi) [1721291]
+- tc: introduce support for block-handle for filter operations (Andrea Claudi) [1721291]
+- tc_filter: resolve device name before parsing filter (Andrea Claudi) [1721291]
+- tc: introduce tc_qdisc_block_exists helper (Andrea Claudi) [1721291]
+
+* Wed Jun 12 2019 Andrea Claudi <aclaudi@redhat.com> [4.11.0-24.el7]
+- ss: use [::] for any address/any family sockets (Andrea Claudi) [1588122]
+
+* Wed Jun 05 2019 Andrea Claudi <aclaudi@redhat.com> [4.11.0-23.el7]
+- tc_util: Silence spurious compiler warning (Andrea Claudi) [1714660]
+- gre6: add collect metadata support (Andrea Claudi) [1714660]
+- tc: m_tunnel_key: add csum/nocsum option (Andrea Claudi) [1714660]
+- m_mirred: don't bail if the control action is missing (Andrea Claudi) [1714660]
+- tc: fix parsing of the control action (Andrea Claudi) [1714660]
+- tc: util: Don't call NEXT_ARG_FWD() in __parse_action_control() (Andrea Claudi) [1714660]
+- tc: don't print error message on miss when parsing action with default (Andrea Claudi) [1714660]
+- tc: gact: fix control action parsing (Andrea Claudi) [1714660]
+- tc/actions: introduce support for goto chain action (Andrea Claudi) [1714660]
+- tc: actions: add helpers to parse and print control actions (Andrea Claudi) [1714660]
+- tc_filter: add support for chain index (Andrea Claudi) [1714660]
+- gre/gre6: allow clearing {,i,o}{key,seq,csum} flags (Andrea Claudi) [1714660]
+- man: ip link: document GRE tunnels (Andrea Claudi) [1714660]
+- ip/tunnel: Use tnl_parse_key() to parse tunnel key (Andrea Claudi) [1714660]
+
+* Tue Apr 30 2019 Andrea Claudi <aclaudi@redhat.com> [4.11.0-22.el7]
+- bpf: minor cleanups for bpf_trace_pipe (Andrea Claudi) [1465646]
+
+* Mon Apr 29 2019 Andrea Claudi <aclaudi@redhat.com> [4.11.0-21.el7]
+- Check user supplied interface name lengths (Andrea Claudi) [1465646]
+- tc: flower: No need to cache indev arg (Andrea Claudi) [1465646]
+- ip{6, }tunnel: Avoid copying user-supplied interface name around (Andrea Claudi) [1465646]
+- utils: strlcpy() and strlcat() don't clobber dst (Andrea Claudi) [1465646]
+- lnstat_util: Make sure buffer is NUL-terminated (Andrea Claudi) [1465646]
+- tc_util: No need to terminate an snprintf'ed buffer (Andrea Claudi) [1465646]
+- ipxfrm: Replace STRBUF_CAT macro with strlcat() (Andrea Claudi) [1465646]
+- Convert harmful calls to strncpy() to strlcpy() (Andrea Claudi) [1465646]
+- Convert the obvious cases to strlcpy() (Andrea Claudi) [1465646]
+- utils: Implement strlcpy() and strlcat() (Andrea Claudi) [1465646]
+- lib/libnetlink: Don't pass NULL parameter to memcpy() (Andrea Claudi) [1465646]
+- lib/fs: Fix and simplify make_path() (Andrea Claudi) [1465646]
+- lib/bpf: Check return value of write() (Andrea Claudi) [1465646]
+- netem/maketable: Check return value of fscanf() (Andrea Claudi) [1465646]
+- ss: Make sure scanned index value to unix_state_map is sane (Andrea Claudi) [1465646]
+- ss: Make struct tcpstat fields 'timer' and 'timeout' unsigned (Andrea Claudi) [1465646]
+- lib/ll_map: Choose size of new cache items at run-time (Andrea Claudi) [1465646]
+- tc/m_xt: Fix for potential string buffer overflows (Andrea Claudi) [1465646]
+- lnstat_util: Simplify alloc_and_open() a bit (Andrea Claudi) [1465646]
+- lib/inet_proto: Review inet_proto_{a2n,n2a}() (Andrea Claudi) [1465646]
+- lib/fs: Fix format string in find_fs_mount() (Andrea Claudi) [1465646]
+- ipntable: Avoid memory allocation for filter.name (Andrea Claudi) [1465646]
+- tipc/bearer: Prevent NULL pointer dereference (Andrea Claudi) [1465646]
+- tc/tc_filter: Make sure filter name is not empty (Andrea Claudi) [1465646]
+- tc/q_netem: Don't dereference possibly NULL pointer (Andrea Claudi) [1465646]
+- ifstat, nstat: Check fdopen() return value (Andrea Claudi) [1465646]
+- lib/bpf: Don't leak fp in bpf_find_mntpt() (Andrea Claudi) [1465646]
+- devlink: Check return code of strslashrsplit() (Andrea Claudi) [1465646]
+- iplink_vrf: Complain if main table is not found (Andrea Claudi) [1465646]
+- iproute: Check mark value input (Andrea Claudi) [1465646]
+- tc/q_multiq: Don't pass garbage in TCA_OPTIONS (Andrea Claudi) [1465646]
+- netem/maketable: Check return value of fstat() (Andrea Claudi) [1465646]
+- ss: Use C99 initializer in netlink_show_one() (Andrea Claudi) [1465646]
+- ipmaddr: Avoid accessing uninitialized data (Andrea Claudi) [1465646]
+- iplink_can: Prevent overstepping array bounds (Andrea Claudi) [1465646]
+- ipaddress: Avoid accessing uninitialized variable lcl (Andrea Claudi) [1465646]
+- tc/m_gact: Drop dead code (Andrea Claudi) [1465646]
+- ss: Drop useless assignment (Andrea Claudi) [1465646]
+- ss: Skip useless check in parse_hostcond() (Andrea Claudi) [1465646]
+- lib/rt_names: Drop dead code in rtnl_rttable_n2a() (Andrea Claudi) [1465646]
+- iproute: Fix for missing 'Oifs:' display (Andrea Claudi) [1465646]
+- ipntable: No need to check and assign to parms_rta (Andrea Claudi) [1465646]
+- devlink: No need for this self-assignment (Andrea Claudi) [1465646]
+- tipc/bearer: Fix resource leak in error path (Andrea Claudi) [1465646]
+- ss: Fix potential memleak in unix_stats_print() (Andrea Claudi) [1465646]
+- ifstat: Fix memleak in dump_kern_db() for json output (Andrea Claudi) [1465646]
+- ifstat: Fix memleak in error case (Andrea Claudi) [1465646]
+- ipvrf: Fix error path of vrf_switch() (Andrea Claudi) [1465646]
+- tc/em_ipset: Don't leak sockfd on error path (Andrea Claudi) [1465646]
+- ss: Don't leak fd in tcp_show_netlink_file() (Andrea Claudi) [1465646]
+- iproute_lwtunnel: csum_mode value checking was ineffective (Andrea Claudi) [1465646]
+- iproute_lwtunnel: Argument to strerror must be positive (Andrea Claudi) [1465646]
+- tipc/node: Fix socket fd check in cmd_node_get_addr() (Andrea Claudi) [1465646]
+- ifcfg: Quote left-hand side of [ ] expression (Andrea Claudi) [1465646]
+- examples: Some shell fixes to cbq.init (Andrea Claudi) [1465646]
+- ip-address: Use correct max attribute value in print_vf_stats64() (Andrea Claudi) [1679749]
+- ss: enclose IPv6 address in brackets (Andrea Claudi) [1588122]
+- tc: f_flower: Add support for matching first frag packets (Andrea Claudi) [1559814]
+
+* Thu Mar 28 2019 Andrea Claudi <aclaudi@redhat.com> [4.11.0-20.el7]
+- rdma: add man pages for RDMA tool (Andrea Claudi) [1642479]
+
+* Wed Mar 27 2019 Andrea Claudi <aclaudi@redhat.com> [4.11.0-19.el7]
+- rdma: add infrastructure for RDMA tool (Andrea Claudi) [1642479 1641914]
+- rdma: Add MR resource tracking information (Andrea Claudi) [1642479 1641914]
+- json_writer: add new json handlers (null, float with format, lluint, hu) (Andrea Claudi) [1642479 1641914]
+- lib: make resolve_hosts variable common (Andrea Claudi) [1642479 1641914]
+- utils: Move BIT macro to common header (Andrea Claudi) [1642479 1641914]
+- tc: flower: Add support for QinQ (Andrea Claudi) [1642347]
+- man: tc-vlan.8: Fix for incorrect example (Andrea Claudi) [1593630]
+- man: ip-route.8: ssthresh parameter is NUMBER (Andrea Claudi) [1593628]
+- devlink: Add param command support (Andrea Claudi) [1644731]
+- devlink: Update man pages and add resource man (Andrea Claudi) [1644731]
+- devlink: Add support for hot reload (Andrea Claudi) [1644731]
+- devlink: Add support for devlink resource abstraction (Andrea Claudi) [1644731]
+
+* Mon Mar 18 2019 Andrea Claudi <aclaudi@redhat.com> [4.11.0-18.el7]
+- ip: Add violation counters to VF statisctics (Andrea Claudi) [1471680]
+
+* Mon Mar 11 2019 Phil Sutter <psutter@redhat.com> [4.11.0-17.el7]
+- ip-link: Fix listing of alias interfaces (Phil Sutter) [1673226]
+
+* Thu Feb 21 2019 Phil Sutter <psutter@redhat.com> [4.11.0-16.el7]
+- ip-route: Fix nexthop encap parsing (Phil Sutter) [1624656]
+- man: ip-route.8: Document nexthop limit (Phil Sutter) [1624656]
+- ip-route: Fix segfault with many nexthops (Phil Sutter) [1624656]
+- iproute: Abort if nexthop cannot be parsed (Phil Sutter) [1624656]
+
+* Wed Feb 06 2019 Phil Sutter <psutter@redhat.com> [4.11.0-15.el7]
+- tc/act_tunnel_key: Enable setup of tos and ttl (Phil Sutter) [1641909]
+- tc/flower: Add match on encapsulating tos/ttl (Phil Sutter) [1641909]
+- Update kernel headers (Phil Sutter)
+- tc: include stdint.h explicitly for UINT16_MAX (Phil Sutter) [1641909]
+- tc: m_tunnel_key: Allow key-less tunnels (Phil Sutter) [1658506]
+- tc: m_tunnel_key: reformat the usage text (Phil Sutter) [1658506]
+
+* Tue Mar 06 2018 Phil Sutter <psutter@redhat.com> [4.11.0-14.el7]
+- ip-link: Fix use after free in nl_get_ll_addr_len() (Phil Sutter) [1550097]
+
+* Fri Dec 15 2017 Phil Sutter <psutter@redhat.com> [4.11.0-13.el7]
+- tc: fix command "tc actions del" hang issue (Phil Sutter) [1526394]
+
+* Wed Dec 06 2017 Phil Sutter <psutter@redhat.com> [4.11.0-12.el7]
+- man: tc-csum.8: Fix inconsistency in example description (Phil Sutter) [1417162]
+- link_gre6: Detect invalid encaplimit values (Phil Sutter) [1459600]
+
+* Mon Nov 13 2017 Phil Sutter <psutter@redhat.com> [4.11.0-11.el7]
+- ss: add AF_VSOCK support (Stefano Brivio) [1472759]
+- ss: allow AF_FAMILY constants >32 (Stefano Brivio) [1472759]
+- uapi: add include linux/vm_sockets_diag.h (Stefano Brivio) [1472759]
+- iproute: build more easily on Android (Phil Sutter) [1472759]
+
+* Fri Nov 10 2017 Phil Sutter <psutter@redhat.com> [4.11.0-10.el7]
+- tc: flower: add support for matching on ip tos and ttl (Kamal Heib) [1456539]
+- iplink: Update usage in help message (Kamal Heib) [1456539]
+- tc: flower: add support for tcp flags (Kamal Heib) [1456539]
+- devlink: Add option to set and show eswitch encapsulation support (Kamal Heib) [1456539]
+- pedit: Introduce ipv6 support (Kamal Heib) [1456539]
+- pedit: Check for extended capability in protocol parser (Kamal Heib) [1456539]
+- pedit: Do not allow using retain for too big fields (Kamal Heib) [1456539]
+- pedit: Fix a typo in warning (Kamal Heib) [1456539]
+- tc: Reflect HW offload status (Kamal Heib) [1456539]
+- devlink: Add support for pipeline debug (dpipe) (Kamal Heib) [1456539]
+- devlink: Change netlink attribute validation (Kamal Heib) [1456539]
+- Update linux headers (Phil Sutter) [1456539]
+
+* Wed Nov 08 2017 Phil Sutter <psutter@redhat.com> [4.11.0-9.el7]
+- lib/libnetlink: update rtnl_talk to support malloc buff at run time (Hangbin Liu) [1380803]
+- lib/libnetlink: re malloc buff if size is not enough (Hangbin Liu) [1380803]
+- iplink: double the buffer size also in iplink_get() (Hangbin Liu) [1380803]
+- iplink: check for message truncation in iplink_get() (Hangbin Liu) [1380803]
+- iproute: Add support for extended ack to rtnl_talk (Hangbin Liu) [1380803]
+- libnetlink: drop unused parameter to rtnl_dump_done (Hangbin Liu) [1380803]
+- netlink: Change rtnl_dump_done to always show error (Hangbin Liu) [1380803]
+
+* Fri Oct 20 2017 Phil Sutter <psutter@redhat.com> [4.11.0-8.el7]
+- Fix subpackage dependencies (don't require base package ARCH) (Phil Sutter) [1489548]
+
+* Wed Oct 18 2017 Phil Sutter <psutter@redhat.com> [4.11.0-7.el7]
+- Make sub-packages depend on base package (Phil Sutter) [1489548]
+
+* Fri Oct 06 2017 Phil Sutter <psutter@redhat.com> [4.11.0-6.el7]
+- link_gre6: Fix for changing tclass/flowlabel (Phil Sutter) [1487486]
+- utils: return default family when rtm_family is not RTNL_FAMILY_IPMR/IP6MR (Stefano Brivio) [1475762]
+- netns: avoid directory traversal (Phil Sutter) [1468529]
+- Disable -fexceptions CFLAG passed by build system (Phil Sutter) [1418715]
+
+* Thu Sep 28 2017 Phil Sutter <psutter@redhat.com> [4.11.0-5.el7]
+- ip neigh: allow flush FAILED neighbour entry (Matteo Croce) [1469945]
+- tc: fix typo in manpage (Phil Sutter) [1417162]
+- link_gre6: really support encaplimit option (Phil Sutter) [1459600]
+- tc: m_xt: Prevent a segfault in libipt (Phil Sutter) [1465599]
+
+* Wed Sep 06 2017 Phil Sutter <psutter@redhat.com> [4.11.0-4.el7]
+- tc-simple.8: Fix one more reference to non-existing tc-actions.8 (Phil Sutter) [1477523]
+
+* Wed Sep 06 2017 Phil Sutter <psutter@redhat.com> [4.11.0-3.el7]
+- lib/bpf: Fix bytecode-file parsing (Phil Sutter) [1477491]
+- tc-simple.8: Fix reference to non-existing tc-actions.8 (Phil Sutter) [1477523]
+- ss: Fix for added diag support check (Phil Sutter) [1487152]
+
+* Fri Aug 11 2017 Phil Sutter <psutter@redhat.com> [4.11.0-2.el7]
+- rt_dsfield: Ship deprecated values for compatibility (Phil Sutter) [1480136]
+- bpf: Make bytecode-file reading a little more robust (Phil Sutter) [1477491]
+- tc: fix m_simple usage (Phil Sutter) [1477523]
+- tc-simple: Fix documentation (Phil Sutter) [1477523]
+- Really fix get_addr() and get_prefix() error messages (Phil Sutter) [1477206]
+
+* Tue Jun 27 2017 Phil Sutter <psutter@redhat.com> [4.11.0-1.el7]
+- Rebase onto upstream version 4.11.0 (Phil Sutter) [1418715]
+
+* Tue Jun 13 2017 Sabrina Dubroca <sdubroca@redhat.com> [3.10.0-87.el7]
+- devlink: Add e-switch support (Sabrina Dubroca) [1459772]
+- devlink: whitespace cleanup (Sabrina Dubroca) [1459772]
+- devlink: Convert conditional in dl_argv_handle_port() to switch() (Sabrina Dubroca) [1459772]
+- devlink: write usage help messages to stderr (Sabrina Dubroca) [1459772]
+- devlink: Add usage help for eswitch subcommand (Sabrina Dubroca) [1459772]
+- devlink: Call dl_free in early exit case (Sabrina Dubroca) [1459772]
+
+* Mon Jun 12 2017 Eric Garver <egarver@redhat.com> [3.10.0-86.el7]
+- Revert "ip-route man: add usage and description for lwtunnel encap attributes" (Eric Garver) [1459975]
+- Revert "lwtunnel: implement support for ip6 encap" (Eric Garver) [1459975]
+- Revert "lwtunnel: fix argument parsing" (Eric Garver) [1459975]
+- Revert "lwtunnel: Add encapsulation support to ip route" (Eric Garver) [1459975]
+
+* Mon Jun 12 2017 Eric Garver <egarver@redhat.com> [3.10.0-85.el7]
+- Revert "vxlan: Add support for remote checksum offload" (Eric Garver) [1459975]
+
+* Wed May 31 2017 Ivan Vecera <ivecera@redhat.com> [3.10.0-84.el7]
+- tc: Add support for the matchall traffic classifier. (Ivan Vecera) [1435624]
+- tc: man: Add man entry for the matchall classifier. (Ivan Vecera) [1435624]
+- tc: add missing limits.h header (Ivan Vecera) [1435624]
+- tc: man: matchall: Fix example indentation (Ivan Vecera) [1435624]
+- tc: matchall: Print skip flags when dumping a filter (Ivan Vecera) [1435624]
+- tc, clsact: add clsact frontend (Ivan Vecera) [1435624]
+
+* Thu May 18 2017 Phil Sutter <psutter@redhat.com> [3.10.0-83.el7]
+- vxlan: Add support for remote checksum offload (Phil Sutter) [1446363]
+
+* Thu Apr 20 2017 Phil Sutter <psutter@redhat.com> [3.10.0-82.el7]
+- ip-route: Prevent some other double spaces in output (Phil Sutter) [1374446]
+
+* Wed Apr 05 2017 Phil Sutter <psutter@redhat.com> [3.10.0-81.el7]
+- man: ip-link: Specify min/max values for bridge slave priority and cost (Phil Sutter) [1374360]
+- man: ip-link.8: document bridge options (Phil Sutter) [1373869]
+
+* Tue Apr 04 2017 Phil Sutter <psutter@redhat.com> [3.10.0-80.el7]
+- tc: m_xt: Drop needless parentheses from #if checks (Phil Sutter) [1326726]
+- tc: m_xt: Fix segfault with iptables-1.6.0 (Phil Sutter) [1326726]
+- m_xt: whitespace cleanup (Phil Sutter) [1326726]
+- tc: m_xt: Introduce get_xtables_target_opts() (Phil Sutter) [1326726]
+- tc: m_xt: Simplify argc adjusting in parse_ipt() (Phil Sutter) [1326726]
+- tc: m_xt: Get rid of iargc variable in parse_ipt() (Phil Sutter) [1326726]
+- tc: m_xt: Get rid of rargc in parse_ipt() (Phil Sutter) [1326726]
+- tc: m_xt: Drop unused variable fw in parse_ipt() (Phil Sutter) [1326726]
+- tc: m_xt: Get rid of one indentation level in parse_ipt() (Phil Sutter) [1326726]
+- tc: m_xt: Fix indenting (Phil Sutter) [1326726]
+- tc: m_xt: Fix segfault when adding multiple actions at once (Phil Sutter) [1326726]
+- tc: m_xt: Prevent segfault with standard targets (Phil Sutter) [1326726]
+- man: update doc after support of ESN and anti-replay window (Phil Sutter) [1425059]
+- xfrm: add support of ESN and anti-replay window (Phil Sutter) [1425059]
+
+* Fri Mar 17 2017 Phil Sutter <psutter@redhat.com> [3.10.0-79.el7]
+- man: ss.8: Add missing protocols to description of -A (Phil Sutter) [1063934]
+
+* Fri Mar 17 2017 Phil Sutter <psutter@redhat.com> [3.10.0-78.el7]
+- ip-address: Support filtering by slave type, too (Phil Sutter) [1375434]
+- tc: don't accept qdisc 'handle' greater than ffff (Davide Caratti) [1375393]
+- macsec: show usage even if the module is not available (Timothy Redaelli) [1367071]
+- libgenl: introduce genl_init_handle (Timothy Redaelli) [1367071]
+- tc: flower: Fix parsing ip address (Phil Sutter) [1422629]
+- tc: flower: support masked ICMP code and type match (Phil Sutter) [1422629]
+- tc: flower: provide generic masked u8 print helper (Phil Sutter) [1422629]
+- tc: flower: provide generic masked u8 parser helper (Phil Sutter) [1422629]
+- tc: flower: Update documentation to indicate ARP takes IPv4 prefixes (Phil Sutter) [1422629]
+- tc: flower: use correct type when calling flower_icmp_attr_type (Phil Sutter) [1422629]
+- f_flower: don't set TCA_FLOWER_KEY_ETH_TYPE for "protocol all" (Phil Sutter) [1422629]
+- tc: flower: Refactor matching flags to be more user friendly (Phil Sutter) [1422629]
+- tc: flower: Support matching ARP (Phil Sutter) [1422629]
+- kernel headers update (Phil Sutter) [1422629]
+- tc: flower: Fix incorrect error msg about eth type (Phil Sutter) [1422629]
+- tc: flower: Add missing err check when parsing flower options (Phil Sutter) [1422629]
+- tc: flower: Fix flower output for src and dst ports (Phil Sutter) [1422629]
+- tc: flower: Update dest UDP port documentation (Phil Sutter) [1422629]
+- tc: flower: support matching flags (Phil Sutter) [1422629]
+- tc/cls_flower: Add to the usage encapsulation dest UDP port (Phil Sutter) [1422629]
+- tc: flower: Allow *_mac options to accept a mask (Phil Sutter) [1422629]
+- tc: flower: document that *_ip parameters take a PREFIX as an argument. (Phil Sutter) [1422629]
+- tc: flower: Fix typo and style in flower man page (Phil Sutter) [1422629]
+- tc/cls_flower: Add dest UDP port to tunnel params (Phil Sutter) [1422629]
+- tc: flower: support matching on ICMP type and code (Phil Sutter) [1422629]
+- tc: flower: introduce enum flower_endpoint (Phil Sutter) [1422629]
+- tc: flower: make use of flower_port_attr_type() safe and silent (Phil Sutter) [1422629]
+- tc: flower: correct name of ip_proto parameter to flower_parse_port() (Phil Sutter) [1422629]
+- tc: flower: document SCTP ip_proto (Phil Sutter) [1422629]
+- tc: flower: remove references to eth_type in manpage (Phil Sutter) [1422629]
+- tc/cls_flower: Classify packet in ip tunnels (Phil Sutter) [1422629]
+- libnetlink: Introduce rta_getattr_be*() (Phil Sutter) [1422629]
+- tc: flower: Support matching on SCTP ports (Phil Sutter) [1422629]
+- tc: flower: Fix usage message (Phil Sutter) [1422629]
+- tc: flower checkpatch cleanups (Phil Sutter) [1422629]
+- tc: flower: Introduce vlan support (Phil Sutter) [1422629]
+- tc: flower: Add skip_{hw|sw} support (Phil Sutter) [1422629]
+- utils: add get_be{16, 32, 64}, use them where possible (Phil Sutter) [1422629]
+- lib/utils: introduce rt_addr_n2a_rta() (Phil Sutter) [1422629]
+- utils: make rt_addr_n2a() non-reentrant by default (Phil Sutter) [1422629]
+- make format_host non-reentrant by default (Phil Sutter) [1422629]
+- tc: flower no need to specify the ethertype (Phil Sutter) [1422629]
+- ip6tunnel: print local/remote addresses like iptunnel does (Phil Sutter) [1422629]
+- tc: ship filter man pages and refer to them in tc.8 (Phil Sutter) [1422629]
+- tc: add a man page for flower filter (Phil Sutter) [1422629]
+- tc: improve filter help texts a bit (Phil Sutter) [1422629]
+- tc: add support for Flower classifier (Phil Sutter) [1422629]
+- ip: make -resolve addr to print names rather than addresses (Phil Sutter) [1422629]
+
+* Tue Feb 28 2017 Phil Sutter <psutter@redhat.com> [3.10.0-77.el7]
+- change of rtnetlink to use RTN_F_OFFLOAD (Phil Sutter) [1417289]
+- bridge: add support for the multicast flood flag (Phil Sutter) [1417289]
+- RH-INTERNAL: Update kernel headers to v4.10.0 (Phil Sutter) [1417289]
+- bridge: man: fix STP LISTENING description (Phil Sutter) [1417289]
+- bridge: man: fix BPUD typo (Phil Sutter) [1417289]
+- bridge: man: fix "brige" typo (Phil Sutter) [1417289]
+- bridge: vlan: fix a few "fdb" typos in vlan doc (Phil Sutter) [1417289]
+- bridge: vlan: add support to filter by vlan id (Phil Sutter) [1417289]
+- bridge: mdb: add support to filter by vlan id (Phil Sutter) [1417289]
+- bridge: fdb: add support to filter by vlan id (Phil Sutter) [1417289]
+- bridge: code cleanup (Phil Sutter) [1417289]
+- bridge: mdb: add support for extended router port information (Phil Sutter) [1417289]
+- bridge: mdb: add support for offloaded mdb entries (Phil Sutter) [1417289]
+- bridge: mdb: add user-space support for extended attributes (Phil Sutter) [1417289]
+- iplink: bridge: remove unnecessary returns (Phil Sutter) [1417289]
+- bridge: add support for dynamic fdb entries (Phil Sutter) [1417289]
+- iplink: bridge_slave: export read-only values (Phil Sutter) [1417289]
+- iplink: bridge: add support for IFLA_BR_MCAST_STARTUP_QUERY_INTVL (Phil Sutter) [1417289]
+- iplink: bridge: add support for IFLA_BR_MCAST_QUERY_RESPONSE_INTVL (Phil Sutter) [1417289]
+- iplink: bridge: add support for IFLA_BR_MCAST_QUERY_INTVL (Phil Sutter) [1417289]
+- iplink: bridge: add support for IFLA_BR_MCAST_QUERIER_INTVL (Phil Sutter) [1417289]
+- iplink: bridge: add support for IFLA_BR_MCAST_MEMBERSHIP_INTVL (Phil Sutter) [1417289]
+- iplink: bridge: add support for IFLA_BR_MCAST_LAST_MEMBER_INTVL (Phil Sutter) [1417289]
+- iplink: bridge: add support for IFLA_BR_MCAST_STARTUP_QUERY_CNT (Phil Sutter) [1417289]
+- iplink: bridge: add support for IFLA_BR_MCAST_LAST_MEMBER_CNT (Phil Sutter) [1417289]
+- iplink: bridge: add support for IFLA_BR_MCAST_HASH_MAX (Phil Sutter) [1417289]
+- iplink: bridge: add support for IFLA_BR_MCAST_HASH_ELASTICITY (Phil Sutter) [1417289]
+- iplink: bridge: add support for IFLA_BR_MCAST_QUERIER (Phil Sutter) [1417289]
+- iplink: bridge: add support for IFLA_BR_MCAST_QUERY_USE_IFADDR (Phil Sutter) [1417289]
+- iplink: bridge: add support for IFLA_BR_MCAST_SNOOPING (Phil Sutter) [1417289]
+- iplink: bridge: add support for IFLA_BR_MCAST_ROUTER (Phil Sutter) [1417289]
+- iplink: bridge: add support for IFLA_BR_VLAN_DEFAULT_PVID (Phil Sutter) [1417289]
+- iplink: bridge: add support for IFLA_BR_GROUP_ADDR (Phil Sutter) [1417289]
+- iplink: bridge: add support for IFLA_BR_GROUP_FWD_MASK (Phil Sutter) [1417289]
+- iplink: bridge: export read-only timers (Phil Sutter) [1417289]
+- iplink: bridge: export root_(port|path_cost), topology_change and change_detected (Phil Sutter) [1417289]
+- iplink: bridge: export bridge_id and designated_root (Phil Sutter) [1417289]
+- bridge: support for static fdb entries (Phil Sutter) [1417289]
+- bridge.8: minor formatting cleanup (Phil Sutter) [1417289]
+- bridge.8: document fdb replace command (Phil Sutter) [1417289]
+- bridge: fdb: minor syntax fix in help text (Phil Sutter) [1417289]
+- bridge: add calls to fflush in fdb and mdb print functions (Phil Sutter) [1417289]
+- ip, bridge: document -timestamp option (Phil Sutter) [1417289]
+- bridge: add batch command support (Phil Sutter) [1417289]
+- iplink: Add support for IFLA_BR_VLAN_PROTOCOL attribute (Phil Sutter) [1417289]
+- iplink: add support for IFLA_BR_VLAN_FILTERING attribute (Phil Sutter) [1417289]
+- bridge: mdb: add deleted when monitoring delmdb event (Phil Sutter) [1417289]
+- bridge: mdb: add support for vlans (Phil Sutter) [1417289]
+- ip link: proto_down config and display. (Phil Sutter) [1417289]
+- bridge: mdb: add support for router add/del notifications monitoring (Phil Sutter) [1417289]
+- ip: fix all the checkpatch warnings (Phil Sutter) [1417289]
+- iproute2: ipa: show switch id (Phil Sutter) [1417289]
+- ip: return correct exit code on route failure (Phil Sutter) [1417289]
+- iproute2: unify naming for entries offloaded to hardware (Phil Sutter) [1417289]
+- route: label externally offloaded routes (Phil Sutter) [1417289]
+- fix ip -force -batch to continue on errors (Phil Sutter) [1417289]
+- bridge link: add support to specify master (Phil Sutter) [1417289]
+- Allow specifying bridge port STP state by name rather than number. (Phil Sutter) [1417289]
+- iproute2: bridge vlan show new option to print ranges (Phil Sutter) [1417289]
+- iproute2: bridge: support vlan range adds (Phil Sutter) [1417289]
+- bridge/link: add learning_sync policy flag (Phil Sutter) [1417289]
+- bridge link: add option 'self' (Phil Sutter) [1417289]
+- bridge/fdb: add flag/indication for FDB entry synced from offload device (Phil Sutter) [1417289]
+- bridge/fdb: fix statistics output spacing (Phil Sutter) [1417289]
+- iproute2 bridge: bring to above par with brctl show macs (Phil Sutter) [1417289]
+- link dump filter (Phil Sutter) [1417289]
+- bridge: Make filter_index match in signedness (Phil Sutter) [1417289]
+- bridge: Add learning and flood support (Phil Sutter) [1417289]
+- iproute2: ipa: show port id (Phil Sutter) [1417289]
+- bridge: fix reporting of IPv6 addresses (Phil Sutter) [1417289]
+- iplink: bridge_slave: add support for IFLA_BRPORT_PROXYARP_WIFI (Phil Sutter) [1374360]
+- iplink: bridge_slave: add support for IFLA_BRPORT_PROXYARP (Phil Sutter) [1374360]
+- Revert "man: ip-link: Remove bits about proxy_arp and proxy_arp_wifi" (Phil Sutter) [1374360]
+
+* Tue Feb 21 2017 Phil Sutter <psutter@redhat.com> [3.10.0-76.el7]
+- iplink: add missing link type (Phil Sutter) [1374493]
+- man: ip-link: Remove bits about proxy_arp and proxy_arp_wifi (Phil Sutter) [1374360]
+- iplink: bridge_slave: add support for IFLA_BRPORT_FAST_LEAVE (Phil Sutter) [1374360]
+- iplink: bridge_slave: add support for IFLA_BRPORT_MULTICAST_ROUTER (Phil Sutter) [1374360]
+- macsec: fix input range of 'icvlen' parameter (Phil Sutter) [1373121]
+
+* Tue Feb 21 2017 Phil Sutter <psutter@redhat.com> [3.10.0-75.el7]
+- ip: vfinfo: remove code duplication for IFLA_VF_RSS_QUERY_EN (Timothy Redaelli) [1264149]
+- ipaddress: Print IFLA_VF_QUERY_RSS_EN setting (Timothy Redaelli) [1264149]
+- ipaddress: Simplify vf_info parsing (Timothy Redaelli) [1264149]
+- ip-route: Prevent some double spaces in output (Timothy Redaelli) [1374446]
+- ip-route man: add usage and description for lwtunnel encap attributes (Phil Sutter) [1329730]
+- lwtunnel: implement support for ip6 encap (Phil Sutter) [1329730]
+- lwtunnel: fix argument parsing (Phil Sutter) [1329730]
+- lwtunnel: Add encapsulation support to ip route (Phil Sutter) [1329730]
+- libnetlink: introduce rta_nest and u8, u16, u64 helpers for nesting within rtattr (Phil Sutter) [1329730]
+- utils: add missing return value (Phil Sutter) [1329730]
+- remove unnecessary extern (Phil Sutter) [1329730]
+- ss: Add support for SCTP protocol (Phil Sutter) [1063934]
+- include: Add linux/sctp.h (Phil Sutter) [1063934]
+- update inet_diag.h header (Phil Sutter) [1063934]
+- macsec: fix byte ordering on input/display of 'sci' (Davide Caratti) [1355629]
+- macsec: fix input of 'port', improve documentation of 'address' (Davide Caratti) [1355629]
+- misc/ss: tcp cwnd should be unsigned (Davide Caratti) [1375215]
+
+* Thu Aug 25 2016 Phil Sutter <psutter@redhat.com> [3.10.0-74.el7]
+- ip route: restore_handler should check tb[RTA_PREFSRC] for local networks (Phil Sutter) [1362728]
+
+* Thu Aug 18 2016 Phil Sutter <psutter@redhat.com> [3.10.0-73.el7]
+- ip-link: add missing {min,max}_tx_rate to help text (Phil Sutter) [1340914]
+- man: ip-link.8: Document missing geneve options (Phil Sutter) [1339178]
+- iproute.spec: Fix for missing cbq.8 man page (Phil Sutter) [1362551]
+
+* Thu Aug 04 2016 Phil Sutter <psutter@redhat.com> [3.10.0-72.el7]
+- macsec: cipher and icvlen can be set separately (Davide Caratti) [1354408]
+- ip {link,address}: add 'macsec' item to TYPE list (Davide Caratti) [1354702]
+- man: macsec: fix macsec related typos (Davide Caratti) [1354702 1354319]
+- Revert "Allow specifying bridge port STP state by name rather than number." (Phil Sutter) [1288042]
+- Revert "fix ip -force -batch to continue on errors" (Phil Sutter) [1288042]
+- Revert "ip: fix exit code for addrlabel" (Phil Sutter) [1288042]
+- Revert "link dump filter" (Phil Sutter) [1288042]
+- Revert "ip: return correct exit code on route failure" (Phil Sutter) [1288042]
+- Revert "ip: fix exit code for rule failures" (Phil Sutter) [1288042]
+- man: ip-link: Drop fou and gue related documentation (Phil Sutter) [1013584]
+- man: ip-link, ip-address: Drop references to ipvlan (Phil Sutter) [1013584]
+- doc, man: ip-rule: Remove incorrect statement about rule 0 (Phil Sutter) [1362561]
+
+* Sat Jul 30 2016 Phil Sutter <psutter@redhat.com> [3.10.0-71.el7]
+- ip: add paren to silence warning (Phil Sutter) [1340914]
+- Fix MAC address length check (Jakub Sitnicki) [1253767 1271580]
+- iplink: Check address length via netlink (Jakub Sitnicki) [1253767 1271580]
+- iplink: Add missing variable initialization (Jakub Sitnicki) [1253767 1271580]
+- ip link: Fix crash on older kernels when show VF dev (Jakub Sitnicki) [1340914]
+- ip link: Remove unnecessary device checking (Jakub Sitnicki) [1340914]
+- ip: check for missing dev arg when doing VF rate (Jakub Sitnicki) [1340914]
+- Add support to configure SR-IOV VF minimum and maximum Tx rate through ip tool (Jakub Sitnicki) [1340914]
+
+* Fri Jul 22 2016 Phil Sutter <psutter@redhat.com> [3.10.0-70.el7]
+- man: ip-link: Document query_rss option (Phil Sutter) [1264146]
+- Document VF link state control in the ip-link man page (Phil Sutter) [1264146]
+- ipneigh: List all nud states in help output (Phil Sutter) [1276661]
+- iproute2: ip-route.8.in: Add expires option for ip route (Phil Sutter) [1357020]
+- ip route: timeout for routes has to be set in seconds (Phil Sutter) [1357020]
+- route: allow routes to be configured with expire values (Phil Sutter) [1357020]
+
+* Wed Jul 20 2016 Phil Sutter <psutter@redhat.com> [3.10.0-69.el7]
+- ip-address.8: Document autojoin flag (Phil Sutter) [1333513]
+- ip-link.8: Fix font choices (Phil Sutter) [1269528]
+- ip-link: fix man page warnings (Phil Sutter) [1269528]
+- vxlan: fix help and man text (Phil Sutter) [1269528]
+- ip-link: fix unterminated string in manpage (Phil Sutter) [1269528]
+- ip-link.8: Add slave type option descriptions (Phil Sutter) [1269528]
+- ip-link.8: Place 'ip link set' warning more prominently (Phil Sutter) [1269528]
+- ip-link.8: Extend type list in synopsis (Phil Sutter) [1269528]
+- man ip-link: Remove extra GROUP explanation (Phil Sutter) [1269528]
+- man ip-link: Add short description about 'group' (Phil Sutter) [1269528]
+- man ip-link: Add deleting links by group (Phil Sutter) [1269528]
+- iplink: bond_slave: Add missing help functions (Phil Sutter) [1269528]
+- iplink: List valid 'type' argument in ip link help text (Phil Sutter) [1269528]
+- ip link: Add group in usage() for 'ip link delete' (Phil Sutter) [1269528]
+- iproute: constify rtattr_cmp (Phil Sutter) [1348133]
+- ip route: restore route entries in correct order (Phil Sutter) [1348133]
+
+* Sat Jul 09 2016 Phil Sutter <psutter@redhat.com> [3.10.0-68.el7]
+- devlink: add manpage for shared buffer (Phil Sutter) [1342515]
+- devlink: implement shared buffer occupancy control (Phil Sutter) [1342515]
+- devlink: implement shared buffer support (Phil Sutter) [1342515]
+- devlink: allow to parse both devlink and port handle in the same time (Phil Sutter) [1342515]
+- devlink: introduce dump filtering function (Phil Sutter) [1342515]
+- devlink: split dl_argv_parse_put to parse and put parts (Phil Sutter) [1342515]
+- devlink: introduce helper to print out nice names (ifnames) (Phil Sutter) [1342515]
+- devlink: introduce pr_out_port_handle helper (Phil Sutter) [1342515]
+- list: add list_add_tail helper (Phil Sutter) [1342515]
+- list: add list_for_each_entry_reverse macro (Phil Sutter) [1342515]
+- devlink: fix "devlink port" help message (Phil Sutter) [1342515]
+- devlink: ignore build result (Phil Sutter) [1342515]
+- add devlink tool (Phil Sutter) [1342515]
+- include: add linked list implementation from kernel (Phil Sutter) [1342515]
+- configure: cleanup (Phil Sutter) [1342515]
+- configure: Check for libmnl (Phil Sutter) [1342515]
+- configure: Add check for the doc tools (Phil Sutter) [1342515]
+- add if_macsec header (Davide Caratti) [1300765]
+- RH-INTERNAL: update kernel headers to v4.6.0 (Davide Caratti) [1300765]
+- utils: fix hex digits parsing in hexstring_a2n() (Davide Caratti) [1300765]
+- ip: add MACsec support (Davide Caratti) [1300765]
+- utils: provide get_hex to read a hex digit from a char (Davide Caratti) [1300765]
+- utils: add get_be{16, 32, 64}, use them where possible (Davide Caratti) [1300765]
+- utils: make hexstring_a2n provide the number of hex digits parsed (Davide Caratti) [1300765]
+- lib/ll_addr: improve ll_addr_n2a() a bit (Davide Caratti) [1300765]
+- iproute2: arpd: use ll_addr_a2n and ll_addr_n2a (Davide Caratti) [1300765]
+- iproute2: utils: change hexstring_n2a and hexstring_a2n to do not work with ":" (Davide Caratti) [1300765]
+
+* Tue Jul 05 2016 Phil Sutter <psutter@redhat.com> [3.10.0-67.el7]
+- geneve: fix IPv6 remote address reporting (Phil Sutter) [1339178]
+- geneve: add support to set flow label (Phil Sutter) [1339178]
+- geneve: Add support for configuring UDP checksums. (Phil Sutter) [1339178]
+- geneve: add support for lwt tunnel creation and dst port selection (Phil Sutter) [1339178]
+- geneve: add support for IPv6 link partners (Phil Sutter) [1339178]
+- iplink_geneve: add tos configuration at link creation (Phil Sutter) [1339178]
+- iplink_geneve: add ttl configuration at link creation (Phil Sutter) [1339178]
+- iproute2: update ip-link.8 for geneve tunnels (Phil Sutter) [1339178]
+- iproute2: GENEVE support (Phil Sutter) [1339178]
+- man: ip-address, ip-link: Document 'type' quirk (Phil Sutter) [1341343]
+- man: ip-link.8: Fix 'ip link delete' description (Phil Sutter) [1341343]
+
+* Thu Jun 16 2016 Phil Sutter <psutter@redhat.com> [3.10.0-66.el7]
+- ip-link: Support printing VF trust setting (Phil Sutter) [1302119]
+- iplink: Support VF Trust (Phil Sutter) [1302119]
+- add new IFLA_VF_TRUST netlink attribute (Phil Sutter) [1302119]
+- ipaddress: Allow listing addresses by type (Phil Sutter) [1341343]
+- man ip-link: Small example of 'ip link show master' (Phil Sutter) [1341343]
+- ip link: Show devices by type (Phil Sutter) [1341343]
+- ip link: Allow to filter devices by master dev (Phil Sutter) [1341343]
+
+* Fri Jun 03 2016 Phil Sutter <psutter@redhat.com> [3.10.0-65.el7]
+- man: ip, ip-link: Fix ip option location (Phil Sutter) [1251186]
+- ip: enable configuring multicast group autojoin (Phil Sutter) [1333513]
+- ss: Fix accidental state filter override (Phil Sutter) [1318005]
+- ss: Drop silly assignment (Phil Sutter) [1318005]
+- ss: Fix wrong filter behaviour (Phil Sutter) [1318005]
+
+* Wed Mar 30 2016 Phil Sutter <psutter@redhat.com> [3.10.0-64.el7]
+- Add missing build dependency to spec file (Phil Sutter) [1275426]
+
+* Wed Mar 30 2016 Phil Sutter <psutter@redhat.com> [3.10.0-63.el7]
+- doc/tc-filters.tex: Drop overly subjective paragraphs (Phil Sutter) [1275426]
+- doc: Add my article about tc, filters and actions (Phil Sutter) [1275426]
+- gitignore: Ignore 'doc' files generated at runtime (Phil Sutter) [1275426]
+- tests: Add runtime generated files to .gitignore (Phil Sutter) [1275426]
+- man: ship action man pages (Phil Sutter) [1275426]
+- man: tc-skbedit.8: Elaborate a bit on TX queues (Phil Sutter) [1275426]
+- man: tc-police.8: Emphasize on the two rate control mechanisms (Phil Sutter) [1275426]
+- man: tc-mirred.8: Reword man page a bit, add generic mirror example (Phil Sutter) [1275426]
+- man: tc-csum.8: Add an example (Phil Sutter) [1275426]
+- tc: connmark, pedit: Rename BRANCH to CONTROL (Phil Sutter) [1275426]
+- tc: pedit: document branch control in help output (Phil Sutter) [1275426]
+- man: tc-u32: Minor syntax fix (Phil Sutter) [1275426]
+- man: Add a man page for the xt action (Phil Sutter) [1275426]
+- man: Add a man page for the skbedit action (Phil Sutter) [1275426]
+- man: Add a man page for the simple action (Phil Sutter) [1275426]
+- man: Add a man page for the police action (Phil Sutter) [1275426]
+- man: Add a man page for the pedit action (Phil Sutter) [1275426]
+- man: Add a man page for the nat action (Phil Sutter) [1275426]
+- man: Add a man page for the mirred action (Phil Sutter) [1275426]
+- man: Add a man page for the csum action. (Phil Sutter) [1275426]
+
+* Wed Mar 23 2016 Phil Sutter <psutter@redhat.com> [3.10.0-62.el7]
+- tc: fix compilation warning on 32bits arch (Phil Sutter) [1315930]
+- whitespace cleanup (Phil Sutter) [1315930]
+- tc: minor spelling fixes (Phil Sutter) [1315930]
+- simple print newline (Phil Sutter) [1315930]
+- tc: introduce simple action (Phil Sutter) [1315930]
+- man: rtpr: add minimal manpage (Phil Sutter) [1316059]
+
+* Tue Mar 08 2016 Phil Sutter <psutter@redhat.com> [3.10.0-61.el7]
+- fix print_ipt: segfault if more then one filter with action -j MARK. (Phil Sutter) [1314403]
+- man: ip-link: Beef up VXLAN csum options a bit (Phil Sutter) [1254625]
+- libnetlink: Double the dump buffer size (Phil Sutter) [1304840]
+
+* Mon Mar 07 2016 Phil Sutter <psutter@redhat.com> [3.10.0-60.el7]
+- man: ip-neighbour.8: Document all known nud states (Phil Sutter) [1276661]
+- fix indentation of ip neighbour man page (Phil Sutter) [1276661]
+- man: ip-*.8: drop any reference to generic ip options (Phil Sutter) [1251186]
+- man8: scrub trailing whitespace (Phil Sutter) [1251186]
+- TBF man page fix (tbf is not classless) (Phil Sutter) [1251186]
+- man tc-htb: Fix HRB -> HTB typo (Phil Sutter) [1251186]
+- man: Spelling fixes (Phil Sutter) [1251186]
+- fix spelling of Kuznetsov (Phil Sutter) [1251186]
+- man: ip-l2tp.8: Fix BNF syntax (Phil Sutter) [1251186]
+- man: ip.8: Add missing flags and token subcommand description (Phil Sutter) [1251186]
+- man: ip: add -h[uman-readable] option (Phil Sutter) [1251186]
+- man: ip-xfrm.8: Document missing parameters (Phil Sutter) [1251186]
+- man: ip-tunnel.8: Document missing 6rd action (Phil Sutter) [1251186]
+- add 'vti'/'vti6' tunnel modes to ip-tunnel manual page (Phil Sutter) [1251186]
+- man: ip-token.8: Review synopsis section (Phil Sutter) [1251186]
+- man: ip-rule.8: Review synopsis section (Phil Sutter) [1251186]
+- man: ip-ntable.8: Review synopsis section (Phil Sutter) [1251186]
+- man: ip-netns.8: Clarify synopsis a bit (Phil Sutter) [1251186]
+- man: ip-neighbour: Fix for missing NUD_STATE description (Phil Sutter) [1251186]
+- man: ip-link.8: Fix and improve synopsis (Phil Sutter) [1251186]
+- man: ip-link.8: minor font fix (Phil Sutter) [1251186]
+- man: ip-address.8: Minor syntax fixes (Phil Sutter) [1251186]
+- iprule: add missing nat keyword to help text (Phil Sutter) [1251186]
+- iproute: TYPE keyword is not optional, fix help text accordingly (Phil Sutter) [1251186]
+- ipntable: Fix typo in help text (Phil Sutter) [1251186]
+- ipneigh: add missing proxy keyword to help text (Phil Sutter) [1251186]
+- iplink: fix help text syntax (Phil Sutter) [1251186]
+- ipaddrlabel: Improve help text precision (Phil Sutter) [1251186]
+- ip: align help text with manpage (Phil Sutter) [1251186]
+- ipl2tp: Print help even on systems without l2tp support (Phil Sutter) [1251186]
+- iprule: Align help text with man page synopsis (Phil Sutter) [1251186]
+- iplink: macvtap: fix man page (Phil Sutter) [1013584]
+- man: ip-link: document MACVLAN/MACVTAP interface types (Phil Sutter) [1013584]
+- man: ip-link: fix a typo (Phil Sutter) [1013584]
+- man ip-link: Add missing link types - vti,ipvlan,nlmon (Phil Sutter) [1013584]
+- iproute2: ip-link.8.in: Spelling fixes (Phil Sutter) [1013584]
+- ip-link: Document IPoIB link type in the man page (Phil Sutter) [1013584]
+- iproute: Descriptions of fou and gue options in ip-link man pages (Phil Sutter) [1013584]
+- iproute2: ip6gre: update man pages (Phil Sutter) [1013584]
+- ip: macvlan: support MACVLAN_FLAG_NOPROMISC flag (Phil Sutter) [1013584]
+- ip: link: consolidate macvlan and macvtap (Phil Sutter) [1013584]
+
+* Wed Feb 24 2016 Phil Sutter <psutter@redhat.com> [3.10.0-59.el7]
+- iplink: add ageing_time, stp_state and priority for bridge (Phil Sutter) [1270759]
+- iplink: shortify printing the usage of link type (Phil Sutter) [1270759]
+- iplink: use the short format to print help info (Phil Sutter) [1270759]
+- iplink_bridge: add support for priority (Phil Sutter) [1270759]
+- iplink_bridge: add support for stp_state (Phil Sutter) [1270759]
+- iplink_bridge: add support for ageing_time (Phil Sutter) [1270759]
+- add bridge master device support (Phil Sutter) [1270759]
+- add bridge_slave device support (Phil Sutter) [1270759]
+- iplink: bond_slave: fix ad_actor/partner_oper_port_state output (Phil Sutter) [1269528]
+- ip: remove extra newlines at end-of-file (Phil Sutter) [1269528]
+- ip link: missing options in bond usage (Phil Sutter) [1269528]
+- bond: fix return after invarg (Phil Sutter) [1269528]
+- iplink: bonding: add support for IFLA_BOND_TLB_DYNAMIC_LB (Phil Sutter) [1269528]
+- bonding: export 3ad actor and partner port state (Phil Sutter) [1269528]
+- iplink_bond: add support for ad_actor and port_key options (Phil Sutter) [1269528]
+- ip link: Shortify printing the usage of link type (Phil Sutter) [1269528]
+- add help command to bonding master (Phil Sutter) [1269528]
+- iproute2: allow to change slave options via type_slave (Phil Sutter) [1269528]
+- ip: add nlmon as a device type to help message (Phil Sutter) [1269528]
+- iplink: can: fix help text and man page (Phil Sutter) [1269528]
+- iplink_bond_slave: show mii_status only once (Phil Sutter) [1269528]
+- iplink_bond: fix parameter value matching (Phil Sutter) [1269528]
+- iplink_bond: fix arp_all_targets parameter name in output (Phil Sutter) [1269528]
+- iplink: add support for bonding slave (Phil Sutter) [1269528]
+- introduce support for slave info data (Phil Sutter) [1269528]
+- iproute2: finish support for bonding attributes (Phil Sutter) [1269528]
+- iplink: add support for bonding netlink (Phil Sutter) [1269528]
+- iplink: update available type list (Phil Sutter) [1269528]
+- xfrm: revise man page and document ip xfrm policy set (Phil Sutter) [1269528]
+- xfrm: add command for configuring SPD hash table (Phil Sutter) [1212026]
+
+* Thu Feb 18 2016 Phil Sutter <psutter@redhat.com> [3.10.0-58.el7]
+- tc: ship filter man pages and refer to them in tc.8 (Phil Sutter) [1286711]
+- tc: add a man page for u32 filter (Phil Sutter) [1286711]
+- tc: add a man page for tcindex filter (Phil Sutter) [1286711]
+- tc: add a man page for route filter (Phil Sutter) [1286711]
+- tc: add a man page for fw filter (Phil Sutter) [1286711]
+- tc: add a man page for flow filter (Phil Sutter) [1286711]
+- tc: add a man page for cgroup filter (Phil Sutter) [1286711]
+- tc: add a man page for basic filter (Phil Sutter) [1286711]
+- batch: support quoted strings (Phil Sutter) [1272593]
+- man: fix whatis for fq (Phil Sutter) [1261520]
+- man: tc: add man page for fq pacer (Phil Sutter) [1261520]
+
+* Thu Feb 18 2016 Phil Sutter <psutter@redhat.com> [3.10.0-57.el7]
+- route: Fix printing of locked entries (Phil Sutter) [1291832]
+- route: ignore RTAX_HOPLIMIT of value -1 (Phil Sutter) [1291832]
+- ip-link: remove warning message (Phil Sutter) [1291832]
+- ip: route: add congestion control metric (Phil Sutter) [1291832]
+- ip route: enable per-route ecn settings via 'features' option (Phil Sutter) [1291832]
+- iproute2: ip-route.8.in: minor fixes (Phil Sutter) [1291832]
+- iproute: restrict hoplimit values to be in range [0; 255] (Phil Sutter) [1291832]
+- man ss: Fix explanation when no options specified (Phil Sutter) [1291818]
+- libnetlink: don't confuse variables in rtnl_talk() (Phil Sutter) [1288042]
+- libnetlink: add size argument to rtnl_talk (Phil Sutter) [1288042]
+- ip: fix exit code for rule failures (Phil Sutter) [1288042]
+- ip: return correct exit code on route failure (Phil Sutter) [1288042]
+- link dump filter (Phil Sutter) [1288042]
+- ip: fix exit code for addrlabel (Phil Sutter) [1288042]
+- fix ip -force -batch to continue on errors (Phil Sutter) [1288042]
+- Allow specifying bridge port STP state by name rather than number. (Phil Sutter) [1288042]
+- gre: raising the size of the buffer holding nl messages. (Phil Sutter) [1288042]
+- neighbor: check return values (Phil Sutter) [1277094]
+- ip-address: fix oneline mode for interfaces with VF (Phil Sutter) [1272405]
+- ss: add support for segs_in and segs_out (Phil Sutter) [1269114]
+- ss: add support for bytes_acked & bytes_received (Phil Sutter) [1269114]
+- ss: return -1 if an unrecognized option was given (Phil Sutter) [1265238]
+- man: ip-address: document mngtmpaddr and noprefixroute flags (Phil Sutter) [1231898]
+- man: ip-address: align synopsis with help output (Phil Sutter) [1231898]
+- ip-address.8.in: fix BNF syntax error (Phil Sutter) [1231898]
+- ip-address: fix and extend documentation (Phil Sutter) [1231898]
+- ip: extend "ip-address" man page to reflect the recent flag extensions (Phil Sutter) [1231898]
+- ip: allow ip address show to list addresses with certain flags not being set (Phil Sutter) [1231898]
+- bridge fdb: add 'use' option to set NTF_USE flag in fdb add requests (Phil Sutter) [1075692]
+- bridge: drop man page fragment (Phil Sutter) [1075692]
+- bridge: drop reference to unused option embedded from manpage (Phil Sutter) [1075692]
+
+* Thu Feb 18 2016 Phil Sutter <psutter@redhat.com> [3.10.0-56.el7]
+- ipaddress: fix ipaddr_flush for Linux >= 3.1 (Phil Sutter) [1291825]
+- ipaddress: simplify ipaddr_flush() (Phil Sutter) [1291825]
+- libnetlink: introduce nc_flags (Phil Sutter) [1291825]
+- iproute2: Ignore EADDRNOTAVAIL errors during address flush operation (Phil Sutter) [1291825]
+- lnstat: fix header displaying mechanism (Phil Sutter) [1263392]
+- man: lnstat: rewrite manpage (Phil Sutter) [1269133]
+
+* Wed Feb 17 2016 Phil Sutter <psutter@redhat.com> [3.10.0-55.el7]
+- Resolves: #1290860 - Rework list of patches, replace by upstream backports
+
+* Thu Sep 17 2015 Phil Sutter - 3.10.0-54
+- Related: #1241486 - backport: tc: fq scheduler - add missing documentation
+
+* Thu Sep 03 2015 Phil Sutter - 3.10.0-53
+- Related: #1212026 - [6wind 7.2 Feat]: backport: ipxfrm: unable to configure
+  SPD hash table - reverted this backport due to unmet dependencies
+
+* Mon Aug 24 2015 Phil Sutter - 3.10.0-52
+- Resolves: #1254095 - bridge: Add master device name to bridge fdb show
+- Resolves: #1255316 - tc does not allow to attach pfifo_fast qdisc
+- Related: #1251070 - Fix multiple programming errors in iproute package
+
+* Sun Aug 16 2015 Phil Sutter - 3.10.0-51
+- Resolves: bz#1251451 - can't change the remote/local address of tunnel
+  interface to "any" in ipip mode
+- Related: #1213869 - [6wind 7.2 Feat]: backport: iproute2: various netns
+  features
+- Related: #1215006 - [RFE] backport current version of the ss command
+- Resolves: #1251070 - Fix multiple programming errors in iproute package
+- Related: #1198456 - backport: dynamic precision, human readable, and IEC
+  output to ip stats
+- Related: #1210402 - [6wind 7.2 Feat]: backport: vxlan: unable to configure
+  UDP checksums
+- Related: #1213869 - [6wind 7.2 Feat]: backport: iproute2: various netns
+  features
+
+* Fri Aug 07 2015 Phil Sutter - 3.10.0-50
+- Resolves: #1244851 - vti tunnel does not work
+- Resolves: #1155116 - iproute2: implement "-d" option for "ip mon"
+
+* Thu Aug 06 2015 Phil Sutter - 3.10.0-49
+- Resolves: bz#1241486 - backport: tc: fq scheduler
+- Related: #1215006 - backport current version of the ss command
+
+* Wed Aug 05 2015 Phil Sutter - 3.10.0-48
+- Related: #1215006 - backport current version of the ss command
+- Resolves: #1247315 - Fix limitation in iproute/ss regarding dual-stack sockets
+
+* Mon Aug 03 2015 Phil Sutter - 3.10.0-47
+- Related: #1215006 - backport current version of the ss command
+- Related: #1219280 - backport: iproute2: vti6 support
+
+* Wed Jul 08 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-46
+- Related: #1198456 - add missing parts
+
+* Wed Jul 08 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-45
+- Related: #1213869 - add support for 'ip -all netns'
+
+* Wed Jul 08 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-44
+- Related: #1176180 - put back addrgenmode docs
+
+* Wed Jul 08 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-43
+- Related: #1131928 - make netns docs consistent
+
+* Wed Jul 08 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-42
+- Resolves: #1169901 - ip rule help output contains action reject, but this
+  action does not work
+
+* Tue Jul 07 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-41
+- Resolves: #1169874 - ip rule command allows to remove rule with priority 0
+
+* Tue Jul 07 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-40
+- Resolves: #1042802 - make 'ip -d monitor' consistent with 'ip -d link'
+
+* Thu Jun 04 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-39
+- Resolves: #1228166 - remove redundant libnl-devel build dependency
+
+* Tue Jun 02 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-38
+- Resolves: #1131473 - backport: implement -s option for ip a
+
+* Tue Jun 02 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-37
+- Resolves: #1213869 - backport: iproute2: unable to manage nsid
+
+* Fri May 29 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-36
+- Resolves: #1224970 - backport: ipv6: support noprefixroute and mngtmpaddr
+
+* Thu May 28 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-35
+- Related: #1198456 - refactor patchset thoroughly
+
+* Mon May 25 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-34
+- Resolves: #1176684 - backport: ip xfrm monitor all does not work
+
+* Mon May 25 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-33
+- Resolves: #1219280 - backport: iproute2: vti6 support
+
+* Wed May 20 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-32
+- Resolves: #1198489 - backport: "ip route del" without arguments should print
+  help
+
+* Thu May 14 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-31
+- Resolves: #1218568 - backport: iproute2: query_rss command is missing
+
+* Thu May 14 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-30
+- Resolves: #1212026 - backport: ipxfrm: unable to configure SPD hash table
+
+* Wed May 13 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-29
+- Resolves: #1210402 - backport: vxlan: unable to configure UDP checksums
+
+* Wed May 13 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-28
+- Resolves: #1131928 - backport: introduce option to ip to operate on a
+  different namespace
+
+* Wed May 13 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-27
+- Resolves: #1198456 - make sure the patch is applied
+
+* Tue Apr 28 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-26
+- Resolves: #1198456 - backport changes in link statistics
+
+* Tue Apr 28 2015 Pavel Šimerda <psimerda@redhat.com>
+- Resolves: #1139173 - ip -s xfrm state crashes with segfault
+
+* Tue Apr 28 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-24
+- Resolves: #1215006 - backport current version of the ss command
+
+* Fri Apr 17 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-23
+- Resolves: #1203646 - backport VXLAN-GBP
+
+* Thu Apr 16 2015 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-22
+- Resolves: #1176180 - ip -d link show: print addrgenmode
+
+* Fri Oct 24 2014 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-21
+- Related: #1119180 - improve addrgen documentation
+
+* Fri Oct 24 2014 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-20
+- Related: #1119180 - document addrgen
+
+* Wed Oct 08 2014 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-19
+- Resolves: #1081081 - lnstat man page references iproute-doc when it should
+  reference iproute-<ver>
+
+* Fri Oct 03 2014 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-18
+- Resolves: #1044535 - tc: add cls_bpf frontend
+
+* Fri Oct 03 2014 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-17
+- Resolves: #1044535 - backport tc:
+
+* Fri Oct 03 2014 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-16
+- Resolves: #1091010 - [RFE] iproute2: Allow Configurable TCP Delayed Ack in
+  RHEL
+
+* Fri Oct 03 2014 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-15
+- Resolves: #1100271 - ip -6 addrlabel return incorrect error message
+
+* Fri Oct 03 2014 Pavel Šimerda <psimerda@redhat.com> - 3.10.0-14
+- Resolves: #1119180 - iproute2: allow to ipv6 set address generation mode
+
+* Tue Feb 25 2014 Petr Šabata <contyk@redhat.com> - 3.10.0-13
+- Add VF link state control mechanisms (#1061593)
+
+* Tue Feb 25 2014 Petr Šabata <contyk@redhat.com> - 3.10.0-12
+- Add destination port and IPv6 support to VXLAN (#1067437)
+
+* Wed Jan 29 2014 Petr Šabata <contyk@redhat.com> - 3.10.0-11
+- Don't hang on rtnl_send() failure (#1040454)
+- Add the dstport option to vxlan (#1039855)
+
+* Fri Jan 24 2014 Daniel Mach <dmach@redhat.com> - 3.10.0-10
+- Mass rebuild 2014-01-24
+
+* Fri Dec 27 2013 Daniel Mach <dmach@redhat.com> - 3.10.0-9
+- Mass rebuild 2013-12-27
+
+* Tue Nov 26 2013 Petr Šabata <contyk@redhat.com> - 3.10.0-8
+- Document fdb replace and embedded bridge options (#1024697)
+
+* Fri Nov 22 2013 Petr Šabata <contyk@redhat.com> - 3.10.0-7
+- Fix the rtt time values (#1032501)
+
+* Fri Nov 08 2013 Petr Šabata <contyk@redhat.com> - 3.10.0-6
+- Fix lnstat -i (#1024426)
+- Support IPv6 peer addresses (#1017228)
+- Add the replace command to bridge fdb (#1024697)
+- Document link type vlan (#979326)
+
+* Tue Oct 01 2013 Petr Pisar <ppisar@redhat.com> - 3.10.0-5
+- Close file with bridge monitor file (#1011818)
+
+* Tue Sep 24 2013 Petr Pisar <ppisar@redhat.com> - 3.10.0-4
+- Document tc -OK option (#977844)
+- Document "bridge mdb" and "bridge monitor mdb" (#1009860)
+
+* Wed Sep 18 2013 Marcela Mašláňová <mmaslano@redhat.com> - 3.10.0-3
+- Add '-OK' command line option to tc telling it to write an "OK\n" to stdout
+- rhbz#977844
+
+* Mon Aug 05 2013 Petr Šabata <contyk@redhat.com> - 3.10.0-2.1
+- Add a skeleton manpages for genl and ifstat (#881180)
+
+* Wed Jul 17 2013 Petr Šabata <contyk@redhat.com> - 3.10.0-2
+- Fix the XFRM patch
+
+* Wed Jul 17 2013 Petr Šabata <contyk@redhat.com> - 3.10.0-1
+- 3.10.0 bump
+- Drop the SHAREDIR patch and revert to upstream ways (#966445)
+- Fix an XFRM regression with FORTIFY_SOURCE
+
+* Tue Apr 30 2013 Petr Šabata <contyk@redhat.com> - 3.9.0-1
+- 3.9.0 bump
+
+* Thu Apr 25 2013 Petr Šabata <contyk@redhat.com> - 3.8.0-4
+- ATM is available in Fedora only
+
+* Tue Mar 12 2013 Petr Šabata <contyk@redhat.com> - 3.8.0-3
+- Mention the "up" argument in documentation and help outputs (#907468)
+
+* Mon Mar 04 2013 Petr Šabata <contyk@redhat.com> - 3.8.0-2
+- Bump for 1.4.18 rebuild
+
+* Tue Feb 26 2013 Petr Šabata <contyk@redhat.com> - 3.8.0-1
+- 3.8.0 bump
+
+* Fri Feb 08 2013 Petr Šabata <contyk@redhat.com> - 3.7.0-2
+- Don't propogate mounts out of ip (#882047)
+
+* Wed Dec 12 2012 Petr Šabata <contyk@redhat.com> - 3.7.0-1
+- 3.7.0 bump
+
+* Mon Nov 19 2012 Petr Šabata <contyk@redhat.com> - 3.6.0-3
+- Include section 7 manpages (#876857)
+- Fix ancient bogus dates in the changelog (correction based upon commits)
+- Explicitly require some TeX fonts no longer present in the base distribution
+
+* Thu Oct 04 2012 Petr Šabata <contyk@redhat.com> - 3.6.0-2
+- List all interfaces by default
+
+* Wed Oct 03 2012 Petr Šabata <contyk@redhat.com> - 3.6.0-1
+- 3.6.0 bump
+
+* Thu Aug 30 2012 Petr Šabata <contyk@redhat.com> - 3.5.1-2
+- Remove the explicit iptables dependency (#852840)
+
+* Tue Aug 14 2012 Petr Šabata <contyk@redhat.com> - 3.5.1-1
+- 3.5.1 bugfix release bump
+- Rename 'br' to 'bridge'
+
+* Mon Aug 06 2012 Petr Šabata <contyk@redhat.com> - 3.5.0-2
+- Install the new bridge utility
+
+* Thu Aug 02 2012 Petr Šabata <contyk@redhat.com> - 3.5.0-1
+- 3.5.0 bump
+- Move to db5.
+
+* Thu Jul 19 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.4.0-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
+
+* Tue May 22 2012 Petr Šabata <contyk@redhat.com> - 3.4.0-1
+- 3.4.0 bump
+- Drop the print route patch (included upstream)
+
+* Mon Apr 30 2012 Petr Šabata <contyk@redhat.com> - 3.3.0-2
+- Let's install rtmon too... (#814819)
+
+* Thu Mar 22 2012 Petr Šabata <contyk@redhat.com> - 3.3.0-1
+- 3.3.0 bump
+- Update source URL
+
+* Mon Feb 27 2012 Petr Šabata <contyk@redhat.com> - 3.2.0-3
+- Address dangerous /tmp files security issue (CVE-2012-1088, #797881, #797878)
+
+* Fri Jan 27 2012 Petr Šabata <contyk@redhat.com> - 3.2.0-2
+- Simplify the spec a bit thanks to the UsrMove feature
+
+* Fri Jan 06 2012 Petr Šabata <contyk@redhat.com> - 3.2.0-1
+- 3.2.0 bump
+- Removing a useless, now conflicting patch (initcwnd already decumented)
+
+* Thu Nov 24 2011 Petr Šabata <contyk@redhat.com> - 3.1.0-1
+- 3.1.0 bump
+- Point URL and Source to the new location on kernel.org
+- Remove now obsolete defattr
+- Dropping various patches now included upstream
+- Dropping iproute2-2.6.25-segfault.patch; I fail to understand the reason for
+  this hack
+
+* Tue Nov 15 2011 Petr Šabata <contyk@redhat.com> - 2.6.39-6
+- ss -ul should display UDP CLOSED sockets (#691100)
+
+* Thu Oct 06 2011 Petr Sabata <contyk@redhat.com> - 2.6.39-5
+- Fix ss, lnstat and arpd usage and manpages
+
+* Wed Sep 07 2011 Petr Sabata <contyk@redhat.com> - 2.6.39-4
+- lnstat should dump (-d) to stdout instead of stderr (#736332)
+
+* Tue Jul 26 2011 Petr Sabata <contyk@redhat.com> - 2.6.39-3
+- Rebuild for xtables7
+
+* Tue Jul 12 2011 Petr Sabata <contyk@redhat.com> - 2.6.39-2
+- Rebuild for xtables6
+
+* Thu Jun 30 2011 Petr Sabata <contyk@redhat.com> - 2.6.39-1
+- 2.6.39 bump
+
+* Wed Apr 27 2011 Petr Sabata <psabata@redhat.com> - 2.6.38.1-4
+- Link [cr]tstat to lnstat
+
+* Wed Apr 27 2011 Petr Sabata <psabata@redhat.com> - 2.6.38.1-3
+- Install ctstat, rtstat and routef manpage symlinks
+- Install m_xt & m_ipt tc modules
+- Creating devel and virtual static subpackages with libnetlink
+
+* Thu Apr 21 2011 Petr Sabata <psabata@redhat.com> - 2.6.38.1-2
+- General cleanup
+- Use global instead of define
+- Buildroot removal
+- Correcting URL and Source links
+- Install genl, ifstat, routef, routel and rtpr (rhbz#697319)
+
+* Fri Mar 18 2011 Petr Sabata <psabata@redhat.com> - 2.6.38.1-1
+- 2.6.38.1 bump
+
+* Wed Mar 16 2011 Petr Sabata <psabata@redhat.com> - 2.6.38-1
+- 2.6.38 bump
+
+* Wed Feb 09 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2.6.37-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
+
+* Mon Jan 31 2011 Petr Sabata <psabata@redhat.com> - 2.6.37-2
+- man-pages.patch update, ip(8) TYPE whitespace
+
+* Mon Jan 10 2011 Petr Sabata <psabata@redhat.com> - 2.6.37-1
+- 2.6.37 upstream release
+- ss(8) improvements patch removed (included upstream)
+
+* Wed Dec 08 2010 Petr Sabata <psabata@redhat.com> - 2.6.35-10
+- fix a typo in ss(8) improvements patch, rhbz#661267
+
+* Tue Nov 30 2010 Petr Sabata <psabata@redhat.com> - 2.6.35-9
+- ss(8) improvements patch by jpopelka; should be included in 2.6.36
+
+* Tue Nov 09 2010 Petr Sabata <psabata@redhat.com> - 2.6.35-8
+- rhbz#641599, use the versioned path, man-pages.patch update, prep update
+
+* Tue Oct 12 2010 Petr Sabata <psabata@redhat.com> - 2.6.35-7
+- Do not segfault if peer name is omitted when creating a peer veth link, rhbz#642322
+
+* Mon Oct 11 2010 Petr Sabata <psabata@redhat.com> - 2.6.35-6
+- Man-pages update, rhbz#641599
+
+* Wed Sep 29 2010 jkeating - 2.6.35-5
+- Rebuilt for gcc bug 634757
+
+* Tue Sep 21 2010 Petr Sabata <psabata@redhat.com> - 2.6.35-4
+- Modified man-pages.patch to fix cbq manpage, rhbz#635877
+
+* Tue Sep 21 2010 Petr Sabata <psabata@redhat.com> - 2.6.35-3
+- Don't print routes with negative metric fix, rhbz#628739
+
+* Wed Aug 18 2010 Petr Sabata <psabata@redhat.com> - 2.6.35-2
+- 'ip route get' fix, iproute2-2.6.35-print-route.patch
+- rhbz#622782
+
+* Thu Aug 05 2010 Petr Sabata <psabata@redhat.com> - 2.6.35-1
+- 2.6.35 version bump
+- iproute2-tc-priority.patch removed (included in upstream now)
+
+* Thu Jul 08 2010 Petr Sabata <psabata@redhat.com> - 2.6.34-5
+- Licensing guidelines compliance fix
+
+* Wed Jul 07 2010 Petr Sabata <psabata@redhat.com> - 2.6.34-4
+- Requires: iptables >= 1.4.5, BuildRequires: iptables-devel >= 1.4.5
+
+* Thu Jul 01 2010 Petr Sabata <psabata@redhat.com> - 2.6.34-3
+- Build now runs ./configure to regenerate Makefile for ipt/xt detection
+
+* Mon Jun 21 2010 Petr Sabata <psabata@redhat.com> - 2.6.34-2
+- iproute-tc-priority.patch, rhbz#586112
+
+* Mon Jun 21 2010 Petr Sabata <psabata@redhat.com> - 2.6.34-1
+- 2.6.34 version bump
+
+* Tue Apr 20 2010 Marcela Mašláňová <mmaslano@redhat.com> - 2.6.33-2
+- 578729 6rd tunnel correctly 3979ef91de9ed17d21672aaaefd6c228485135a2
+- change BR texlive to tex according to guidelines
+
+* Thu Feb 25 2010 Marcela Mašláňová <mmaslano@redhat.com> - 2.6.33-1
+- update
+
+* Tue Jan 26 2010 Marcela Mašláňová <mmaslano@redhat.com> - 2.6.32-2
+- add macvlan aka VESA support d63a9b2b1e4e3eab0d0577d0a0f412d50be1e0a7
+- kernel headers 2.6.33 ab322673298bd0b8927cdd9d11f3d36af5941b93
+  are needed for macvlan features and probably for other added later.
+- fix number of release which contains 2.6.32 kernel headers and features
+  but it was released as 2.6.31
+
+* Mon Jan  4 2010 Marcela Mašláňová <mmaslano@redhat.com> - 2.6.31-1
+- update to 2.6.31
+
+* Fri Nov 27 2009 Marcela Mašláňová <mmaslano@redhat.com> - 2.6.29-5.1.20091106gita7a9ddbb
+- 539232 patch cbq initscript
+
+* Fri Nov 27 2009 Marcela Mašláňová <mmaslano@redhat.com> - 2.6.29-5.0.20091106gita7a9ddbb
+- snapshot with kernel headers for 2.6.32
+
+* Fri Oct  9 2009 Marcela Mašláňová <mmaslano@redhat.com> - 2.6.29-5.0.20091009gitdaf49fd6
+- new official version isn't available but it's needed -> switch to git snapshots
+
+* Thu Sep 24 2009 Marcela Mašláňová <mmaslano@redhat.com> - 2.6.29-5
+- create missing man pages
+
+* Fri Jul 24 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2.6.29-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
+
+* Thu Apr 23 2009 Marcela Mašláňová <mmaslano@redhat.com> - 2.6.29-3
+- new iptables (xtables) bring problems to tc, when ipt is used. 
+  rhbz#497344 still broken. tc_modules.patch brings correct paths to
+  xtables, but that doesn't fix whole issue.
+- 497355 ip should allow creation of an IPsec SA with 'proto any' 
+  and specified sport and dport as selectors
+
+* Tue Apr 14 2009 Marcela Mašláňová <mmaslano@redhat.com> - 2.6.29-2
+- c3651bf4763d7247e3edd4e20526a85de459041b ip6tunnel: Fix no default 
+ display of ip4ip6 tunnels
+- e48f73d6a5e90d2f883e15ccedf4f53d26bb6e74 missing arpd directory
+
+* Wed Mar 25 2009 Marcela Mašláňová <mmaslano@redhat.com> - 2.6.29-1
+- update to 2.6.29
+- remove DDR patch which became part of sourc
+- add patch with correct headers 1957a322c9932e1a1d2ca1fd37ce4b335ceb7113
+
+* Wed Feb 25 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2.6.28-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
+
+* Wed Feb  4 2009 Marcela Mašláňová <mmaslano@redhat.com> - 2.6.28-2
+- 483484 install distribution files into /usr/share and also fixed
+ install paths in spec
+- add the latest change from git which add DRR support
+ c86f34942a0ce9f8203c0c38f9fe9604f96be706
+
+* Mon Jan 19 2009 Marcela Mašláňová <mmaslano@redhat.com> - 2.6.28-1
+- previous two patches were included into 2.6.28 release.
+- update
+
+* Mon Jan 12 2009 Marcela Mašláňová <mmaslano@redhat.com> - 2.6.27-2
+- 475130 - Negative preferred lifetimes of IPv6 prefixes/addresses
+  displayed incorrectly
+- 472878 - “ip maddr show” in IB interface causes a stack corruption
+- both patches will be probably in iproute v2.6.28
+
+* Thu Dec 4 2008 Marcela Maslanova <mmaslano@redhat.com> - 2.6.27-1
+- aead support was included into upstream version
+- patch for moving libs is now deprecated
+- update to 2.6.27
+
+* Tue Aug 12 2008 Marcela Maslanova <mmaslano@redhat.com> - 2.6.26-1
+- update to 2.6.26
+- clean patches
+
+* Tue Jul 22 2008 Marcela Maslanova <mmaslano@redhat.com> - 2.6.25-5
+- fix iproute2-2.6.25-segfault.patch
+
+* Thu Jul 10 2008 Tom "spot" Callaway <tcallawa@redhat.com> - 2.6.25-4
+- rebuild for new db4-4.7
+
+* Thu Jul  3 2008 Marcela Maslanova <mmaslano@redhat.com> - 2.6.25-3
+- 449933 instead of failing strncpy use copying byte after byte
+
+* Wed May 14 2008 Marcela Maslanova <mmaslano@redhat.com> - 2.6.25-2
+- allow replay setting, solve also 444724
+
+* Mon Apr 21 2008 Marcela Maslanova <mmaslano@redhat.com> - 2.6.25-1
+- update
+- remove patch for backward compatibility
+- add patch for AEAD compatibility
+
+* Thu Feb 21 2008 Marcela Maslanova <mmaslano@redhat.com> - 2.6.23-4
+- add creating ps file again. Fix was done in texlive
+
+* Wed Feb  6 2008 Marcela Maslanova <mmaslano@redhat.com> - 2.6.23-3
+- rebuild without tetex files. It isn't working in rawhide yet. Added
+  new source for ps files. 
+- #431179 backward compatibility for previous iproute versions
+
+* Mon Jan 21 2008 Marcela Maslanova <mmaslano@redhat.com> - 2.6.23-2
+- rebuild with fix tetex and linuxdoc-tools -> manual pdf
+- clean unnecessary patches
+- add into spec *.so objects, new BR linux-atm-libs-devel
+
+* Wed Oct 31 2007 Marcela Maslanova <mmaslano@redhat.com> - 2.6.23-1
+- new version from upstrem 2.3.23
+
+* Tue Oct 23 2007 Marcela Maslanova <mmaslano@redhat.com> - 2.6.22-5
+- move files from /usr/lib/tc to /usr/share/tc
+- remove listing files twice
+
+* Fri Aug 31 2007 Marcela Maslanova <mmaslano@redhat.com> - 2.6.22-3
+- package review #225903
+
+* Mon Aug 27 2007 Jeremy Katz <katzj@redhat.com> - 2.6.22-2
+- rebuild for new db4
+
+* Wed Jul 11 2007 Radek Vokál <rvokal@redhat.com> - 2.6.22-1
+- upgrade to 2.6.22
+
+* Mon Mar 19 2007 Radek Vokál <rvokal@redhat.com> - 2.6.20-2
+- fix broken tc-pfifo man page (#232891)
+
+* Thu Mar 15 2007 Radek Vokál <rvokal@redhat.com> - 2.6.20-1
+- upgrade to 2.6.20
+
+* Fri Dec 15 2006 Radek Vokál <rvokal@redhat.com> - 2.6.19-1
+- upgrade to 2.6.19
+
+* Mon Dec 11 2006 Radek Vokál <rvokal@redhat.com> - 2.6.18-5
+- fix snapshot version
+
+* Fri Dec  1 2006 Radek Vokál <rvokal@redhat.com> - 2.6.18-4
+- spec file cleanup
+- one more rebuilt against db4
+
+* Thu Nov 16 2006 Radek Vokál <rvokal@redhat.com> - 2.6.18-3
+- fix defective manpage for tc-pfifo (#215399)
+
+* Mon Nov 13 2006 Radek Vokál <rvokal@redhat.com> - 2.6.18-2
+- rebuilt against new db4
+
+* Tue Oct  3 2006 Radek Vokal <rvokal@redhat.com> - 2.6.18-1
+- upgrade to upstream 2.6.18
+- initcwnd patch merged
+- bug fix for xfrm monitor
+- alignment fixes for cris
+- documentation corrections
+        
+* Mon Oct  2 2006 Radek Vokal <rvokal@redhat.com> - 2.6.16-7
+- fix ip.8 man page, add initcwnd option
+
+* Sun Oct 01 2006 Jesse Keating <jkeating@redhat.com> - 2.6.16-6
+- rebuilt for unwind info generation, broken in gcc-4.1.1-21
+
+* Tue Sep 19 2006 Radek Vokal <rvokal@redhat.com> - 2.6.16-5
+- fix crash when resolving ip address
+
+* Mon Aug 21 2006 Radek Vokál <rvokal@redhat.com> - 2.6.16-4
+- add LOWER_UP and DORMANT flags (#202199)
+- use dist tag
+
+* Wed Jul 12 2006 Jesse Keating <jkeating@redhat.com> - 2.6.16-3.1
+- rebuild
+
+* Mon Jun 26 2006 Radek Vokál <rvokal@redhat.com> - 2.6.16-3
+- improve handling of initcwnd value (#179719)
+
+* Sun May 28 2006 Radek Vokál <rvokal@redhat.com> - 2.6.16-2
+- fix BuildRequires: flex (#193403)
+
+* Sun Mar 26 2006 Radek Vokál <rvokal@redhat.com> - 2.6.16-1
+- upgrade to 2.6.16-060323
+- don't hardcode /usr/lib in tc (#186607)
+
+* Wed Feb 22 2006 Radek Vokál <rvokal@redhat.com> - 2.6.15-2
+- own /usr/lib/tc (#181953)
+- obsoletes shapecfg (#182284)
+
+* Fri Feb 10 2006 Jesse Keating <jkeating@redhat.com> - 2.6.15-1.2
+- bump again for double-long bug on ppc(64)
+
+* Tue Feb 07 2006 Jesse Keating <jkeating@redhat.com> - 2.6.15-1.1
+- rebuilt for new gcc4.1 snapshot and glibc changes
+
+* Tue Jan 17 2006 Radek Vokal <rvokal@redhat.com> 2.6.15-1
+- upgrade to 2.6.15-060110
+
+* Mon Dec 12 2005 Radek Vokal <rvokal@redhat.com> 2.6.14-11
+- rebuilt
+
+* Fri Dec 09 2005 Radek Vokal <rvokal@redhat.com> 2.6.14-10
+- remove backup of config files (#175302)
+
+* Fri Nov 11 2005 Radek Vokal <rvokal@redhat.com> 2.6.14-9
+- use tc manpages and cbq.init from source tarball (#172851)
+
+* Thu Nov 10 2005 Radek Vokal <rvokal@redhat.com> 2.6.14-8
+- new upstream source 
+
+* Mon Oct 31 2005 Radek Vokal <rvokal@redhat.com> 2.6.14-7
+- add warning to ip tunnel add command (#128107)
+
+* Fri Oct 07 2005 Bill Nottingham <notting@redhat.com> 2.6.14-6
+- update from upstream (appears to fix #170111)
+
+* Fri Oct 07 2005 Radek Vokal <rvokal@redhat.com> 2.6.14-5
+- update from upstream
+- fixed host_len size for memcpy (#168903) <Matt_Domsch@dell.com>
+
+* Fri Sep 23 2005 Radek Vokal <rvokal@redhat.com> 2.6.14-4
+- add RPM_OPT_FLAGS
+
+* Mon Sep 19 2005 Radek Vokal <rvokal@redhat.com> 2.6.14-3
+- forget to apply the patch :( 
+
+* Mon Sep 19 2005 Radek Vokal <rvokal@redhat.com> 2.6.14-2
+- make ip help work again (#168449)
+
+* Wed Sep 14 2005 Radek Vokal <rvokal@redhat.com> 2.6.14-1
+- upgrade to ss050901 for 2.6.14 kernel headers
+
+* Fri Aug 26 2005 Radek Vokal <rvokal@redhat.com> 2.6.13-3
+- added /sbin/cbq script and sample configuration files (#166301)
+
+* Fri Aug 19 2005 Radek Vokal <rvokal@redhat.com> 2.6.13-2
+- upgrade to iproute2-050816
+
+* Thu Aug 11 2005 Radek Vokal <rvokal@redhat.com> 2.6.13-1
+- update to snapshot for 2.6.13+ kernel
+
+* Tue May 24 2005 Radek Vokal <rvokal@redhat.com> 2.6.11-2
+- removed useless initvar patch (#150798)
+- new upstream source 
+
+* Tue Mar 15 2005 Radek Vokal <rvokal@redhat.com> 2.6.11-1
+- update to iproute-2.6.11
+
+* Fri Mar 04 2005 Radek Vokal <rvokal@redhat.com> 2.6.10-2
+- gcc4 rebuilt
+
+* Wed Feb 16 2005 Radek Vokal <rvokal@redhat.com> 2.6.10-1
+- update to iproute-2.6.10
+
+* Thu Dec 23 2004 Radek Vokal <rvokal@redhat.com> 2.6.9-6
+- added arpd into sbin
+
+* Mon Nov 29 2004 Radek Vokal <rvokal@redhat.com> 2.6.9-5
+- debug info removed from makefile and from spec (#140891)
+
+* Tue Nov 16 2004 Radek Vokal <rvokal@redhat.com> 2.6.9-4
+- source file updated from snapshot version
+- endian patch adding <endian.h> 
+
+* Sat Sep 18 2004 Joshua Blanton <jblanton@cs.ohiou.edu> 2.6.9-3
+- added installation of netem module for tc
+
+* Mon Sep 06 2004 Radek Vokal <rvokal@redhat.com> 2.6.9-2
+- fixed possible buffer owerflow, path by Steve Grubb <linux_4ever@yahoo.com>
+
+* Wed Sep 01 2004 Radek Vokal <rvokal@redhat.com> 2.6.9-1
+- updated to iproute-2.6.9, spec file change, patches cleared
+
+* Tue Jun 15 2004 Elliot Lee <sopwith@redhat.com>
+- rebuilt
+
+* Wed May 26 2004 Phil Knirsch <pknirsch@redhat.com> 2.4.7-16
+- Took tons of manpages from debian, much more complete (#123952).
+
+* Thu May 06 2004 Phil Knirsch <pknirsch@redhat.com> 2.4.7-15
+- rebuilt
+
+* Thu May 06 2004 Phil Knirsch <pknirsch@redhat.com> 2.4.7-13.2
+- Built security errata version for FC1.
+
+* Wed Apr 21 2004 Phil Knirsch <pknirsch@redhat.com> 2.4.7-14
+- Fixed -f option for ss (#118355).
+- Small description fix (#110997).
+- Added initialization of some vars (#74961). 
+- Added patch to initialize "default" rule as well (#60693).
+
+* Fri Feb 13 2004 Elliot Lee <sopwith@redhat.com>
+- rebuilt
+
+* Wed Nov 05 2003 Phil Knirsch <pknirsch@redhat.com> 2.4.7-12
+- Security errata for netlink (CAN-2003-0856).
+
+* Thu Oct 23 2003 Phil Knirsch <pknirsch@redhat.com>
+- Updated to latest version. Used by other distros, so seems stable. ;-)
+- Quite a few patches needed updating in that turn.
+- Added ss (#107363) and several other new nifty tools.
+
+* Tue Jun 17 2003 Phil Knirsch <pknirsch@redhat.com>
+- rebuilt
+
+* Wed Jun 04 2003 Elliot Lee <sopwith@redhat.com>
+- rebuilt
+
+* Wed Jan 22 2003 Tim Powers <timp@redhat.com>
+- rebuilt
+
+* Thu Jan 16 2003 Phil Knirsch <pknirsch@redhat.com> 2.4.7-7
+- Added htb3-tc patch from http://luxik.cdi.cz/~devik/qos/htb/ (#75486).
+
+* Fri Oct 11 2002 Bill Nottingham <notting@redhat.com> 2.4.7-6
+- remove flags patch at author's request
+
+* Fri Jun 21 2002 Tim Powers <timp@redhat.com>
+- automated rebuild
+
+* Wed Jun 19 2002 Phil Knirsch <pknirsch@redhat.com> 2.4.7-4
+- Don't forcibly strip binaries
+
+* Mon May 27 2002 Phil Knirsch <pknirsch@redhat.com> 2.4.7-3
+- Fixed missing diffserv and atm support in config (#57278).
+- Fixed inconsistent numeric base problem for command line (#65473).
+
+* Tue May 14 2002 Phil Knirsch <pknirsch@redhat.com> 2.4.7-2
+- Added patch to fix crosscompiling by Adrian Linkins.
+
+* Fri Mar 15 2002 Phil Knirsch <pknirsch@redhat.com> 2.4.7-1
+- Update to latest stable release 2.4.7-now-ss010824.
+- Added simple man page for ip.
+
+* Wed Aug  8 2001 Bill Nottingham <notting@redhat.com>
+- allow setting of allmulti & promisc flags (#48669)
+
+* Mon Jul 02 2001 Than Ngo <than@redhat.com>
+- fix build problem in beehive if kernel-sources is not installed
+
+* Fri May 25 2001 Helge Deller <hdeller@redhat.de>
+- updated to iproute2-2.2.4-now-ss001007.tar.gz 
+- bzip2 source tar file
+- "License" replaces "Copyright"
+- added "BuildPrereq: tetex-latex tetex-dvips psutils"
+- rebuilt for 7.2
+
+* Tue May  1 2001 Bill Nottingham <notting@redhat.com>
+- use the system headers - the included ones are broken
+- ETH_P_ECHO went away
+
+* Sat Jan  6 2001 Jeff Johnson <jbj@redhat.com>
+- test for specific KERNEL_INCLUDE directories.
+
+* Thu Oct 12 2000 Than Ngo <than@redhat.com>
+- rebuild for 7.1
+
+* Thu Oct 12 2000 Than Ngo <than@redhat.com>
+- add default configuration files for iproute (Bug #10549, #18887)
+
+* Tue Jul 25 2000 Jakub Jelinek <jakub@redhat.com>
+- fix include-glibc/ to cope with glibc 2.2 new resolver headers
+
+* Thu Jul 13 2000 Prospector <bugzilla@redhat.com>
+- automatic rebuild
+
+* Sun Jun 18 2000 Than Ngo <than@redhat.de>
+- rebuilt in the new build environment
+- use RPM macros
+- handle RPM_OPT_FLAGS
+
+* Sat Jun 03 2000 Than Ngo <than@redhat.de>
+- fix iproute to build with new glibc
+
+* Fri May 26 2000 Ngo Than <than@redhat.de>
+- update to 2.2.4-now-ss000305
+- add configuration files
+
+* Mon Sep 13 1999 Bill Nottingham <notting@redhat.com>
+- strip binaries
+
+* Mon Aug 16 1999 Cristian Gafton <gafton@redhat.com>
+- first build