diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..7d6864c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+SOURCES/iproute2-4.18.0.tar.xz
diff --git a/.iproute.metadata b/.iproute.metadata
new file mode 100644
index 0000000..9a32132
--- /dev/null
+++ b/.iproute.metadata
@@ -0,0 +1 @@
+ff02c7352bae407a76d71b36558700bb489026fc SOURCES/iproute2-4.18.0.tar.xz
diff --git a/SOURCES/0001-man-bridge.8-Document-oneline-option.patch b/SOURCES/0001-man-bridge.8-Document-oneline-option.patch
new file mode 100644
index 0000000..964901d
--- /dev/null
+++ b/SOURCES/0001-man-bridge.8-Document-oneline-option.patch
@@ -0,0 +1,58 @@
+From 7a9b3fa0fe560cb209f01642e6591ff0b5d42d12 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 13 Sep 2018 20:36:09 +0200
+Subject: [PATCH] man: bridge.8: Document -oneline option
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1612704
+Upstream Status: iproute2.git commit 05758f5c7b357
+
+commit 05758f5c7b357c53b53e16604bcdfb269fc68a13
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 16 12:27:53 2018 +0200
+
+    man: bridge.8: Document -oneline option
+
+    Copied the description from ip.8.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ man/man8/bridge.8 | 15 ++++++++++++++-
+ 1 file changed, 14 insertions(+), 1 deletion(-)
+
+diff --git a/man/man8/bridge.8 b/man/man8/bridge.8
+index e7f7148..95851e0 100644
+--- a/man/man8/bridge.8
++++ b/man/man8/bridge.8
+@@ -24,7 +24,8 @@ bridge \- show / manipulate bridge addresses and devices
+ \fB\-b\fR[\fIatch\fR] filename |
+ \fB\-c\fR[\folor\fR] |
+ \fB\-p\fR[\fIretty\fR] |
+-\fB\-j\fR[\fIson\fR] }
++\fB\-j\fR[\fIson\fR] |
++\fB\-o\fR[\fIneline\fr] }
+ 
+ .ti -8
+ .BR "bridge link set"
+@@ -181,6 +182,18 @@ Output results in JavaScript Object Notation (JSON).
+ .BR "\-p", " \-pretty"
+ When combined with -j generate a pretty JSON output.
+ 
++.TP
++.BR "\-o", " \-oneline"
++output each record on a single line, replacing line feeds
++with the
++.B '\e'
++character. This is convenient when you want to count records
++with
++.BR wc (1)
++or to
++.BR grep (1)
++the output.
++
+ 
+ .SH BRIDGE - COMMAND SYNTAX
+ 
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0002-bridge-trivial-Make-help-text-consistent.patch b/SOURCES/0002-bridge-trivial-Make-help-text-consistent.patch
new file mode 100644
index 0000000..fab3de3
--- /dev/null
+++ b/SOURCES/0002-bridge-trivial-Make-help-text-consistent.patch
@@ -0,0 +1,39 @@
+From 653ed98ba60d13b2c11338fe4d766eaf8eb5b364 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 13 Sep 2018 20:36:09 +0200
+Subject: [PATCH] bridge: trivial: Make help text consistent
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1612704
+Upstream Status: iproute2.git commit f9ff0cd69c451
+
+commit f9ff0cd69c4514bc78657d33459655248c9e1357
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 16 12:27:54 2018 +0200
+
+    bridge: trivial: Make help text consistent
+
+    Change curly braces into brackets for -json option in help text to be
+    consistent with the rest.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ bridge/bridge.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/bridge/bridge.c b/bridge/bridge.c
+index 7fcfe11..28e1381 100644
+--- a/bridge/bridge.c
++++ b/bridge/bridge.c
+@@ -42,7 +42,7 @@ static void usage(void)
+ "where	OBJECT := { link | fdb | mdb | vlan | monitor }\n"
+ "	OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] |\n"
+ "		     -o[neline] | -t[imestamp] | -n[etns] name |\n"
+-"		     -c[ompressvlans] -color -p[retty] -j{son} }\n");
++"		     -c[ompressvlans] -color -p[retty] -j[son] }\n");
+ 	exit(-1);
+ }
+ 
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0003-devlink-trivial-Make-help-text-consistent.patch b/SOURCES/0003-devlink-trivial-Make-help-text-consistent.patch
new file mode 100644
index 0000000..6db3c0b
--- /dev/null
+++ b/SOURCES/0003-devlink-trivial-Make-help-text-consistent.patch
@@ -0,0 +1,40 @@
+From fbcb1d0f1411bb21c9045a03188345e9c550624b Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 13 Sep 2018 20:36:09 +0200
+Subject: [PATCH] devlink: trivial: Make help text consistent
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1612704
+Upstream Status: iproute2.git commit bb75b9bf2f3fa
+Conflicts: Context change due to missing 'region' support.
+
+commit bb75b9bf2f3fa392807bf09ed41eef25b89e1e82
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 16 12:27:55 2018 +0200
+
+    devlink: trivial: Make help text consistent
+
+    Typically the part of the flag in brackets completes the leading part
+    instead of repeating it.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ devlink/devlink.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/devlink/devlink.c b/devlink/devlink.c
+index df2c66d..1142d16 100644
+--- a/devlink/devlink.c
++++ b/devlink/devlink.c
+@@ -4492,7 +4492,7 @@ static void help(void)
+ 	pr_err("Usage: devlink [ OPTIONS ] OBJECT { COMMAND | help }\n"
+ 	       "       devlink [ -f[orce] ] -b[atch] filename\n"
+ 	       "where  OBJECT := { dev | port | sb | monitor | dpipe | resource }\n"
+-	       "       OPTIONS := { -V[ersion] | -n[no-nice-names] | -j[json] | -p[pretty] | -v[verbose] }\n");
++	       "       OPTIONS := { -V[ersion] | -n[o-nice-names] | -j[json] | -p[pretty] | -v[verbose] }\n");
+ }
+ 
+ static int dl_cmd(struct dl *dl, int argc, char **argv)
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0004-man-devlink.8-Document-verbose-option.patch b/SOURCES/0004-man-devlink.8-Document-verbose-option.patch
new file mode 100644
index 0000000..460eb6c
--- /dev/null
+++ b/SOURCES/0004-man-devlink.8-Document-verbose-option.patch
@@ -0,0 +1,40 @@
+From 6ab77b078026ed63e0234c1c1645b665723b0509 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 13 Sep 2018 20:38:04 +0200
+Subject: [PATCH] man: devlink.8: Document -verbose option
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1612704
+Upstream Status: iproute2.git commit 29b1430ba9aa9
+
+commit 29b1430ba9aa9bceb42b07232f5138e511034a5a
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 16 12:27:56 2018 +0200
+
+    man: devlink.8: Document -verbose option
+
+    This was the only bit missing in comparison to devlink help text.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ man/man8/devlink.8 | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/man/man8/devlink.8 b/man/man8/devlink.8
+index efc6e62..92972b7 100644
+--- a/man/man8/devlink.8
++++ b/man/man8/devlink.8
+@@ -47,6 +47,10 @@ Generate JSON output.
+ .BR "\-p" , " --pretty"
+ When combined with -j generate a pretty JSON output.
+ 
++.TP
++.BR "\-v" , " --verbose"
++Turn on verbose output.
++
+ .SS
+ .I OBJECT
+ 
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0005-genl-Fix-help-text.patch b/SOURCES/0005-genl-Fix-help-text.patch
new file mode 100644
index 0000000..81f271f
--- /dev/null
+++ b/SOURCES/0005-genl-Fix-help-text.patch
@@ -0,0 +1,44 @@
+From 83af05569ffb9d607438f93d98c5ead84b1cc5ac Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 13 Sep 2018 20:38:04 +0200
+Subject: [PATCH] genl: Fix help text
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1612704
+Upstream Status: iproute2.git commit d94974bc91eb2
+
+commit d94974bc91eb2aa2df4592140e1aa3ea0d3cddba
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 16 12:27:57 2018 +0200
+
+    genl: Fix help text
+
+    The '| help' part was misleading: In fact, 'genl help' does not work but
+    'genl <OBJECT> help' does. Fix the help text to make that clear.
+
+    In addition to that, list -Version and -help flags as well.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ genl/genl.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/genl/genl.c b/genl/genl.c
+index 20ecb8b..1940a23 100644
+--- a/genl/genl.c
++++ b/genl/genl.c
+@@ -98,9 +98,9 @@ static void usage(void) __attribute__((noreturn));
+ 
+ static void usage(void)
+ {
+-	fprintf(stderr, "Usage: genl [ OPTIONS ] OBJECT | help }\n"
++	fprintf(stderr, "Usage: genl [ OPTIONS ] OBJECT [help] }\n"
+ 	                "where  OBJECT := { ctrl etc }\n"
+-	                "       OPTIONS := { -s[tatistics] | -d[etails] | -r[aw] }\n");
++	                "       OPTIONS := { -s[tatistics] | -d[etails] | -r[aw] | -V[ersion] | -h[elp] }\n");
+ 	exit(-1);
+ }
+ 
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0006-man-ifstat.8-Document-json-and-pretty-options.patch b/SOURCES/0006-man-ifstat.8-Document-json-and-pretty-options.patch
new file mode 100644
index 0000000..18142aa
--- /dev/null
+++ b/SOURCES/0006-man-ifstat.8-Document-json-and-pretty-options.patch
@@ -0,0 +1,42 @@
+From a2e5a2d8f8c41fb4f87c66d827f3e22035a11dd7 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 13 Sep 2018 20:38:04 +0200
+Subject: [PATCH] man: ifstat.8: Document --json and --pretty options
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1612704
+Upstream Status: iproute2.git commit a486d25b9cbfc
+
+commit a486d25b9cbfc3469e30297495333d95a5576bdc
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 16 12:27:58 2018 +0200
+
+    man: ifstat.8: Document --json and --pretty options
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ man/man8/ifstat.8 | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/man/man8/ifstat.8 b/man/man8/ifstat.8
+index 3ba0088..8cd164d 100644
+--- a/man/man8/ifstat.8
++++ b/man/man8/ifstat.8
+@@ -48,6 +48,14 @@ Report average over the last SECS seconds.
+ .B \-z, \-\-zeros
+ Show entries with zero activity.
+ .TP
++.B \-j, \-\-json
++Display results in JSON format
++.TP
++.B \-p, \-\-pretty
++If combined with
++.BR \-\-json ,
++pretty print the output.
++.TP
+ .B \-x, \-\-extended=TYPE
+ Show extended stats of TYPE. Supported types are:
+ 
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0007-man-rtacct.8-Fix-nstat-options.patch b/SOURCES/0007-man-rtacct.8-Fix-nstat-options.patch
new file mode 100644
index 0000000..84cc481
--- /dev/null
+++ b/SOURCES/0007-man-rtacct.8-Fix-nstat-options.patch
@@ -0,0 +1,69 @@
+From f586cb6ed5543621ec55ac07a6d2b72504c9c65b Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 13 Sep 2018 20:38:04 +0200
+Subject: [PATCH] man: rtacct.8: Fix nstat options
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1612704
+Upstream Status: iproute2.git commit 71170d854e96d
+
+commit 71170d854e96d2e7dff338f482cb23dfadbbd702
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 16 12:28:00 2018 +0200
+
+    man: rtacct.8: Fix nstat options
+
+    Add missing --pretty and --json options, correct --zero to --zeros and
+    correct the mess around --scan/--interval including broken man page
+    formatting.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ man/man8/rtacct.8 | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+diff --git a/man/man8/rtacct.8 b/man/man8/rtacct.8
+index 01321e6..ccdbf6c 100644
+--- a/man/man8/rtacct.8
++++ b/man/man8/rtacct.8
+@@ -4,7 +4,7 @@
+ nstat, rtacct - network statistics tools.
+ 
+ .SH SYNOPSIS
+-Usage: nstat [ -h?vVzrnasd:t: ] [ PATTERN [ PATTERN ] ]
++Usage: nstat [ -h?vVzrnasd:t:jp ] [ PATTERN [ PATTERN ] ]
+ .br
+ Usage: rtacct [ -h?vVzrnasd:t: ] [ ListOfRealms ]
+ 
+@@ -21,7 +21,7 @@ Print help
+ .B \-V, \-\-version
+ Print version
+ .TP
+-.B \-z, \-\-zero
++.B \-z, \-\-zeros
+ Dump zero counters too. By default they are not shown.
+ .TP
+ .B \-r, \-\-reset
+@@ -39,12 +39,16 @@ Do not update history, so that the next time you will see counters including val
+ .B \-j, \-\-json
+ Display results in JSON format.
+ .TP
+-.B \-d, \-\-interval <INTERVAL>
++.B \-p, \-\-pretty
++When combined with
++.BR \-\-json ,
++pretty print the output.
++.TP
++.B \-d, \-\-scan <INTERVAL>
+ Run in daemon mode collecting statistics. <INTERVAL> is interval between measurements in seconds.
+ .TP
+-
++.B \-t, \-\-interval <INTERVAL>
+ Time interval to average rates. Default value is 60 seconds.
+-.TP
+ 
+ .SH SEE ALSO
+ lnstat(8)
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0008-rtmon-List-options-in-help-text.patch b/SOURCES/0008-rtmon-List-options-in-help-text.patch
new file mode 100644
index 0000000..4cdf9d8
--- /dev/null
+++ b/SOURCES/0008-rtmon-List-options-in-help-text.patch
@@ -0,0 +1,38 @@
+From b5ebd3fee37bc9d1832c545f605c639140b8d6f1 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 13 Sep 2018 20:38:04 +0200
+Subject: [PATCH] rtmon: List options in help text
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1612704
+Upstream Status: iproute2.git commit 6417c06b59b07
+
+commit 6417c06b59b0731bcff4c0999661b256be6f52cb
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 16 12:28:01 2018 +0200
+
+    rtmon: List options in help text
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ ip/rtmon.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/ip/rtmon.c b/ip/rtmon.c
+index acc11df..0e795f7 100644
+--- a/ip/rtmon.c
++++ b/ip/rtmon.c
+@@ -63,7 +63,9 @@ static int dump_msg2(const struct sockaddr_nl *who,
+ 
+ static void usage(void)
+ {
+-	fprintf(stderr, "Usage: rtmon file FILE [ all | LISTofOBJECTS]\n");
++	fprintf(stderr, "Usage: rtmon [ OPTIONS ] file FILE [ all | LISTofOBJECTS ]\n");
++	fprintf(stderr, "OPTIONS := { -f[amily] { inet | inet6 | link | help } |\n"
++			"             -4 | -6 | -0 | -V[ersion] }\n");
+ 	fprintf(stderr, "LISTofOBJECTS := [ link ] [ address ] [ route ]\n");
+ 	exit(-1);
+ }
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0009-man-ss.8-Describe-events-option.patch b/SOURCES/0009-man-ss.8-Describe-events-option.patch
new file mode 100644
index 0000000..f6882f0
--- /dev/null
+++ b/SOURCES/0009-man-ss.8-Describe-events-option.patch
@@ -0,0 +1,37 @@
+From 222a4bb5ed730ff84a984a49d4f7fea39e930f97 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 13 Sep 2018 20:38:04 +0200
+Subject: [PATCH] man: ss.8: Describe --events option
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1612704
+Upstream Status: iproute2.git commit d559db725cfe0
+
+commit d559db725cfe033718d7bcfff01285c194a6e92d
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 16 12:28:02 2018 +0200
+
+    man: ss.8: Describe --events option
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ man/man8/ss.8 | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/man/man8/ss.8 b/man/man8/ss.8
+index 28033d8..7a6572b 100644
+--- a/man/man8/ss.8
++++ b/man/man8/ss.8
+@@ -242,6 +242,9 @@ Print summary statistics. This option does not parse socket lists obtaining
+ summary from various sources. It is useful when amount of sockets is so huge
+ that parsing /proc/net/tcp is painful.
+ .TP
++.B \-E, \-\-events
++Continually display sockets as they are destroyed
++.TP
+ .B \-Z, \-\-context
+ As the
+ .B \-p
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0010-ip-Add-missing-M-flag-to-help-text.patch b/SOURCES/0010-ip-Add-missing-M-flag-to-help-text.patch
new file mode 100644
index 0000000..7ee55c1
--- /dev/null
+++ b/SOURCES/0010-ip-Add-missing-M-flag-to-help-text.patch
@@ -0,0 +1,36 @@
+From 093a6272457a68f18bd992f3667051bcd31e32bc Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 13 Sep 2018 20:38:04 +0200
+Subject: [PATCH] ip: Add missing -M flag to help text
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1612704
+Upstream Status: iproute2.git commit 644b9c238c2dd
+
+commit 644b9c238c2dde8b0b931d153fc6719e00ebfc6b
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Aug 16 12:27:59 2018 +0200
+
+    ip: Add missing -M flag to help text
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ ip/ip.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/ip/ip.c b/ip/ip.c
+index 71d5170..bb964f3 100644
+--- a/ip/ip.c
++++ b/ip/ip.c
+@@ -55,7 +55,7 @@ static void usage(void)
+ "       OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |\n"
+ "                    -h[uman-readable] | -iec | -j[son] | -p[retty] |\n"
+ "                    -f[amily] { inet | inet6 | ipx | dnet | mpls | bridge | link } |\n"
+-"                    -4 | -6 | -I | -D | -B | -0 |\n"
++"                    -4 | -6 | -I | -D | -M | -B | -0 |\n"
+ "                    -l[oops] { maximum-addr-flush-attempts } | -br[ief] |\n"
+ "                    -o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] |\n"
+ "                    -rc[vbuf] [size] | -n[etns] name | -a[ll] | -c[olor]}\n");
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0011-iprule-Fix-destination-prefix-output.patch b/SOURCES/0011-iprule-Fix-destination-prefix-output.patch
new file mode 100644
index 0000000..0ac6054
--- /dev/null
+++ b/SOURCES/0011-iprule-Fix-destination-prefix-output.patch
@@ -0,0 +1,47 @@
+From deef2321cf38ef0314bea307dbc27d376ad39624 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 13 Sep 2018 20:45:38 +0200
+Subject: [PATCH] iprule: Fix destination prefix output
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1623503
+Upstream Status: iproute2.git commit 1a75322c5a8de
+
+commit 1a75322c5a8dee6e1ed0017d76c87ef85c505b98
+Author: Stefan Bader <stefan.bader@canonical.com>
+Date:   Tue Aug 28 16:27:29 2018 +0200
+
+    iprule: Fix destination prefix output
+
+    When adding support for JSON output the new code for printing
+    the destination prefix adds a stray blank character before
+    the bitmask. This causes some user-space parsing to fail.
+
+    Current output:
+      ...: from x.x.x.x/l to y.y.y.y /l
+    Previous output:
+      ...: from x.x.x.x/l to y.y.y.y/l
+
+    Fixes: 0dd4ccc5 "iprule: add json support"
+    Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
+    Acked-by: Luca Boccassi <bluca@debian.org>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ ip/iprule.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/ip/iprule.c b/ip/iprule.c
+index 8b94214..744d6d8 100644
+--- a/ip/iprule.c
++++ b/ip/iprule.c
+@@ -239,7 +239,7 @@ int print_rule(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
+ 
+ 		print_string(PRINT_FP, NULL, "to ", NULL);
+ 		print_color_string(PRINT_ANY, ifa_family_color(frh->family),
+-				   "dst", "%s ", dst);
++				   "dst", "%s", dst);
+ 		if (frh->dst_len != host_len)
+ 			print_uint(PRINT_ANY, "dstlen", "/%u ", frh->dst_len);
+ 		else
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0012-tc-act_tunnel_key-Enable-setup-of-tos-and-ttl.patch b/SOURCES/0012-tc-act_tunnel_key-Enable-setup-of-tos-and-ttl.patch
new file mode 100644
index 0000000..9e38110
--- /dev/null
+++ b/SOURCES/0012-tc-act_tunnel_key-Enable-setup-of-tos-and-ttl.patch
@@ -0,0 +1,147 @@
+From b24c686f3e5bb0acbebf40c3e7f5a16f0582fd64 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 13 Sep 2018 20:55:45 +0200
+Subject: [PATCH] tc/act_tunnel_key: Enable setup of tos and ttl
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1615915
+Upstream Status: iproute2.git commit 9f89b0cc0eda2
+Conflicts: Context change due to missing Geneve support.
+
+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        | 53 ++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 61 insertions(+)
+
+diff --git a/man/man8/tc-tunnel_key.8 b/man/man8/tc-tunnel_key.8
+index e979a74..71cee5b 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"
+ .RB "[ " csum " | " nocsum " ]"
+ 
+ .SH DESCRIPTION
+@@ -79,6 +81,12 @@ Outer header destination IP address (IPv4 or IPv6)
+ .B dst_port
+ Outer header destination UDP port
+ .TP
++.B tos
++Outer header TOS
++.TP
++.B ttl
++Outer header TTL
++.TP
+ .RB [ no ] csum
+ Controlls outer UDP checksum. When set to
+ .B csum
+diff --git a/tc/m_tunnel_key.c b/tc/m_tunnel_key.c
+index 0fa4615..8d0a8d1 100644
+--- a/tc/m_tunnel_key.c
++++ b/tc/m_tunnel_key.c
+@@ -81,6 +81,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)
+ {
+@@ -157,6 +173,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, "csum") == 0) {
+ 			csum = 1;
+ 		} else if (matches(*argv, "nocsum") == 0) {
+@@ -260,6 +292,23 @@ static void tunnel_key_print_flag(FILE *f, const char *name_on,
+ 		     rta_getattr_u8(attr) ? name_on : name_off);
+ }
+ 
++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) {
++		print_string(PRINT_FP, NULL, "%s", _SL_);
++		print_uint(PRINT_ANY, "tos", "\ttos 0x%x",
++			   rta_getattr_u8(attr));
++	} else if (matches(name, "ttl") == 0 && rta_getattr_u8(attr) != 0) {
++		print_string(PRINT_FP, NULL, "%s", _SL_);
++		print_uint(PRINT_ANY, "ttl", "\tttl %u",
++			   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];
+@@ -299,6 +348,10 @@ static int print_tunnel_key(struct action_util *au, FILE *f, struct rtattr *arg)
+ 					  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",
++					  tb[TCA_TUNNEL_KEY_ENC_TTL]);
+ 		break;
+ 	}
+ 	print_action_control(f, " ", parm->action, "");
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0013-tc-flower-Add-match-on-encapsulating-tos-ttl.patch b/SOURCES/0013-tc-flower-Add-match-on-encapsulating-tos-ttl.patch
new file mode 100644
index 0000000..f5424be
--- /dev/null
+++ b/SOURCES/0013-tc-flower-Add-match-on-encapsulating-tos-ttl.patch
@@ -0,0 +1,127 @@
+From 23c57e53c5dfdaf113ecf1ebde8e04e8c7a10c50 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 13 Sep 2018 20:56:18 +0200
+Subject: [PATCH] tc/flower: Add match on encapsulating tos/ttl
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1615915
+Upstream Status: iproute2.git commit 761ec9e29ff86
+
+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 4f3714b..f917f24 100644
+--- a/man/man8/tc-flower.8
++++ b/man/man8/tc-flower.8
+@@ -70,6 +70,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
+@@ -252,6 +256,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).
+@@ -260,7 +268,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 1dfd57d..cd102f2 100644
+--- a/tc/f_flower.c
++++ b/tc/f_flower.c
+@@ -74,6 +74,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"
+@@ -972,6 +974,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);
+@@ -1463,6 +1485,11 @@ static int flower_print_opt(struct filter_util *qu, FILE *f,
+ 
+ 	flower_print_port("enc_dst_port", tb[TCA_FLOWER_KEY_ENC_UDP_DST_PORT]);
+ 
++	flower_print_ip_attr("enc_tos", tb[TCA_FLOWER_KEY_ENC_IP_TOS],
++			    tb[TCA_FLOWER_KEY_ENC_IP_TOS_MASK]);
++	flower_print_ip_attr("enc_ttl", tb[TCA_FLOWER_KEY_ENC_IP_TTL],
++			    tb[TCA_FLOWER_KEY_ENC_IP_TTL_MASK]);
++
+ 	flower_print_matching_flags("ip_flags", FLOWER_IP_FLAGS,
+ 				    tb[TCA_FLOWER_KEY_FLAGS],
+ 				    tb[TCA_FLOWER_KEY_FLAGS_MASK]);
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0014-Update-kernel-headers.patch b/SOURCES/0014-Update-kernel-headers.patch
new file mode 100644
index 0000000..131b654
--- /dev/null
+++ b/SOURCES/0014-Update-kernel-headers.patch
@@ -0,0 +1,668 @@
+From 7bd1daafe80ecd7e7419616fabadfe41c6e4fe7a Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 13 Sep 2018 21:29:59 +0200
+Subject: [PATCH] Update kernel headers
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1615915
+Upstream Status: RHEL-only
+
+This updates include/uapi/linux to the state of upstream commit
+761ec9e29ff867452057f59dc6ca430688b409ea.
+---
+ include/uapi/linux/bpf.h                  |   9 +-
+ include/uapi/linux/btf.h                  | 113 +++++++++++++++++++++++++
+ include/uapi/linux/devlink.h              |  42 ++++++++++
+ include/uapi/linux/if_link.h              |   4 +
+ include/uapi/linux/ila.h                  |   1 +
+ include/uapi/linux/pkt_cls.h              |   9 ++
+ include/uapi/linux/pkt_sched.h            | 135 ++++++++++++++++++++++++++++++
+ include/uapi/linux/sctp.h                 |   5 ++
+ include/uapi/linux/tc_act/tc_pedit.h      |   9 +-
+ include/uapi/linux/tc_act/tc_skbedit.h    |   2 +
+ include/uapi/linux/tc_act/tc_tunnel_key.h |  28 +++++++
+ include/uapi/linux/tcp.h                  |   4 -
+ include/uapi/linux/tipc_netlink.h         |  14 ++++
+ 13 files changed, 365 insertions(+), 10 deletions(-)
+ create mode 100644 include/uapi/linux/btf.h
+
+diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
+index 57e7390..b9a6367 100644
+--- a/include/uapi/linux/bpf.h
++++ b/include/uapi/linux/bpf.h
+@@ -1826,7 +1826,7 @@ union bpf_attr {
+  * 		A non-negative value equal to or less than *size* on success,
+  * 		or a negative error in case of failure.
+  *
+- * int skb_load_bytes_relative(const struct sk_buff *skb, u32 offset, void *to, u32 len, u32 start_header)
++ * 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*
+@@ -1877,7 +1877,7 @@ union bpf_attr {
+  *		* < 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
++ *		  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
+@@ -2033,7 +2033,6 @@ union bpf_attr {
+  *		This helper is only available is the kernel was compiled with
+  *		the **CONFIG_BPF_LIRC_MODE2** configuration option set to
+  *		"**y**".
+- *
+  *	Return
+  *		0
+  *
+@@ -2053,7 +2052,6 @@ union bpf_attr {
+  *		This helper is only available is the kernel was compiled with
+  *		the **CONFIG_BPF_LIRC_MODE2** configuration option set to
+  *		"**y**".
+- *
+  *	Return
+  *		0
+  *
+@@ -2557,6 +2555,9 @@ enum {
+ 					 * 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
+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/devlink.h b/include/uapi/linux/devlink.h
+index 493f71f..5ee0e73 100644
+--- a/include/uapi/linux/devlink.h
++++ b/include/uapi/linux/devlink.h
+@@ -78,6 +78,17 @@ enum devlink_command {
+ 	 */
+ 	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,
+ 	DEVLINK_CMD_MAX = __DEVLINK_CMD_MAX - 1
+@@ -142,6 +153,16 @@ enum devlink_port_flavour {
+ 				   */
+ };
+ 
++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,
+@@ -238,6 +259,27 @@ enum devlink_attr {
+ 	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 */
+ 
+ 	__DEVLINK_ATTR_MAX,
+diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h
+index 4eccc7f..1c64ed4 100644
+--- a/include/uapi/linux/if_link.h
++++ b/include/uapi/linux/if_link.h
+@@ -918,6 +918,7 @@ enum {
+ 	XDP_ATTACHED_DRV,
+ 	XDP_ATTACHED_SKB,
+ 	XDP_ATTACHED_HW,
++	XDP_ATTACHED_MULTI,
+ };
+ 
+ enum {
+@@ -926,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,
+ };
+ 
+diff --git a/include/uapi/linux/ila.h b/include/uapi/linux/ila.h
+index 666292c..6a6c97c 100644
+--- a/include/uapi/linux/ila.h
++++ b/include/uapi/linux/ila.h
+@@ -30,6 +30,7 @@ enum {
+ 	ILA_CMD_ADD,
+ 	ILA_CMD_DEL,
+ 	ILA_CMD_GET,
++	ILA_CMD_FLUSH,
+ 
+ 	__ILA_CMD_MAX,
+ };
+diff --git a/include/uapi/linux/pkt_cls.h b/include/uapi/linux/pkt_cls.h
+index 84e4c1d..b451225 100644
+--- a/include/uapi/linux/pkt_cls.h
++++ b/include/uapi/linux/pkt_cls.h
+@@ -469,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,
+ };
+ 
+diff --git a/include/uapi/linux/pkt_sched.h b/include/uapi/linux/pkt_sched.h
+index 37b5096..d9cc9dc 100644
+--- a/include/uapi/linux/pkt_sched.h
++++ b/include/uapi/linux/pkt_sched.h
+@@ -539,6 +539,7 @@ enum {
+ 	TCA_NETEM_LATENCY64,
+ 	TCA_NETEM_JITTER64,
+ 	TCA_NETEM_SLOT,
++	TCA_NETEM_SLOT_DIST,
+ 	__TCA_NETEM_MAX,
+ };
+ 
+@@ -581,6 +582,8 @@ struct tc_netem_slot {
+ 	__s64   max_delay;
+ 	__s32   max_packets;
+ 	__s32   max_bytes;
++	__s64	dist_delay; /* nsec */
++	__s64	dist_jitter; /* nsec */
+ };
+ 
+ enum {
+@@ -934,4 +937,136 @@ enum {
+ 
+ #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/sctp.h b/include/uapi/linux/sctp.h
+index 2d95ddc..dd164d7 100644
+--- a/include/uapi/linux/sctp.h
++++ b/include/uapi/linux/sctp.h
+@@ -100,6 +100,7 @@ typedef __s32 sctp_assoc_t;
+ #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.
+@@ -762,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 {
+@@ -772,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)));
+ 
+ /*
+diff --git a/include/uapi/linux/tc_act/tc_pedit.h b/include/uapi/linux/tc_act/tc_pedit.h
+index 162d109..24ec792 100644
+--- a/include/uapi/linux/tc_act/tc_pedit.h
++++ b/include/uapi/linux/tc_act/tc_pedit.h
+@@ -17,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
+@@ -38,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 {
+@@ -45,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 {
+@@ -55,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_skbedit.h b/include/uapi/linux/tc_act/tc_skbedit.h
+index fbcfe27..6de6071 100644
+--- a/include/uapi/linux/tc_act/tc_skbedit.h
++++ b/include/uapi/linux/tc_act/tc_skbedit.h
+@@ -30,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;
+@@ -45,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_tunnel_key.h b/include/uapi/linux/tc_act/tc_tunnel_key.h
+index 72bbefe..be384d6 100644
+--- a/include/uapi/linux/tc_act/tc_tunnel_key.h
++++ b/include/uapi/linux/tc_act/tc_tunnel_key.h
+@@ -36,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/tcp.h b/include/uapi/linux/tcp.h
+index 99e329b..2e766cf 100644
+--- a/include/uapi/linux/tcp.h
++++ b/include/uapi/linux/tcp.h
+@@ -127,10 +127,6 @@ enum {
+ 
+ #define TCP_CM_INQ		TCP_INQ
+ 
+-#define TCP_REPAIR_ON		1
+-#define TCP_REPAIR_OFF		0
+-#define TCP_REPAIR_OFF_NO_WP	-1	/* Turn off without window probes */
+-
+ struct tcp_repair_opt {
+ 	__u32	opt_code;
+ 	__u32	opt_val;
+diff --git a/include/uapi/linux/tipc_netlink.h b/include/uapi/linux/tipc_netlink.h
+index 85c1198..0ebe02e 100644
+--- a/include/uapi/linux/tipc_netlink.h
++++ b/include/uapi/linux/tipc_netlink.h
+@@ -121,6 +121,7 @@ enum {
+ 	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
+@@ -233,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,
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0015-ip-route-Fix-segfault-with-many-nexthops.patch b/SOURCES/0015-ip-route-Fix-segfault-with-many-nexthops.patch
new file mode 100644
index 0000000..d7458c4
--- /dev/null
+++ b/SOURCES/0015-ip-route-Fix-segfault-with-many-nexthops.patch
@@ -0,0 +1,529 @@
+From 4620f13fc0f0e344421c0b9a0b8747734d3caf00 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Wed, 19 Sep 2018 19:59:54 +0200
+Subject: [PATCH] ip-route: Fix segfault with many nexthops
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1625358
+Upstream Status: iproute2.git commit bd59e5b1517b0
+
+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 | 108 ++++++++++++++++++++++++++++++--------------------
+ 2 files changed, 91 insertions(+), 60 deletions(-)
+
+diff --git a/ip/iproute.c b/ip/iproute.c
+index 3083341..398322f 100644
+--- a/ip/iproute.c
++++ b/ip/iproute.c
+@@ -941,7 +941,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;
+@@ -962,11 +962,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();
+@@ -988,13 +993,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;
+ 
+@@ -1002,8 +1009,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;
+@@ -1016,7 +1024,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;
+ 
+@@ -1036,7 +1044,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);
+ 		}
+@@ -1044,7 +1052,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;
+ }
+ 
+@@ -1053,7 +1062,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,
+@@ -1484,8 +1493,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 e604481..969a476 100644
+--- a/ip/iproute_lwtunnel.c
++++ b/ip/iproute_lwtunnel.c
+@@ -538,8 +538,9 @@ static int parse_encap_seg6(struct rtattr *rta, size_t len, int *argcp,
+ 
+ 	memcpy(tuninfo->srh, srh, srhlen);
+ 
+-	rta_addattr_l(rta, len, SEG6_IPTUNNEL_SRH, tuninfo,
+-		      sizeof(*tuninfo) + srhlen);
++	if (rta_addattr_l(rta, len, SEG6_IPTUNNEL_SRH, tuninfo,
++			  sizeof(*tuninfo) + srhlen))
++		return -1;
+ 
+ 	free(tuninfo);
+ 	free(srh);
+@@ -611,6 +612,7 @@ static int parse_encap_seg6local(struct rtattr *rta, size_t len, int *argcp,
+ 	char segbuf[1024];
+ 	inet_prefix addr;
+ 	__u32 hmac = 0;
++	int ret = 0;
+ 
+ 	while (argc > 0) {
+ 		if (strcmp(*argv, "action") == 0) {
+@@ -620,27 +622,28 @@ static int parse_encap_seg6local(struct rtattr *rta, size_t len, int *argcp,
+ 			action = read_action_type(*argv);
+ 			if (!action)
+ 				invarg("\"action\" value is invalid\n", *argv);
+-			rta_addattr32(rta, len, SEG6_LOCAL_ACTION, action);
++			ret = rta_addattr32(rta, len, SEG6_LOCAL_ACTION,
++					    action);
+ 		} else if (strcmp(*argv, "table") == 0) {
+ 			NEXT_ARG();
+ 			if (table_ok++)
+ 				duparg2("table", *argv);
+ 			get_u32(&table, *argv, 0);
+-			rta_addattr32(rta, len, SEG6_LOCAL_TABLE, table);
++			ret = rta_addattr32(rta, len, SEG6_LOCAL_TABLE, table);
+ 		} else if (strcmp(*argv, "nh4") == 0) {
+ 			NEXT_ARG();
+ 			if (nh4_ok++)
+ 				duparg2("nh4", *argv);
+ 			get_addr(&addr, *argv, AF_INET);
+-			rta_addattr_l(rta, len, SEG6_LOCAL_NH4, &addr.data,
+-				      addr.bytelen);
++			ret = rta_addattr_l(rta, len, SEG6_LOCAL_NH4,
++					    &addr.data, addr.bytelen);
+ 		} else if (strcmp(*argv, "nh6") == 0) {
+ 			NEXT_ARG();
+ 			if (nh6_ok++)
+ 				duparg2("nh6", *argv);
+ 			get_addr(&addr, *argv, AF_INET6);
+-			rta_addattr_l(rta, len, SEG6_LOCAL_NH6, &addr.data,
+-				      addr.bytelen);
++			ret = rta_addattr_l(rta, len, SEG6_LOCAL_NH6,
++					    &addr.data, addr.bytelen);
+ 		} else if (strcmp(*argv, "iif") == 0) {
+ 			NEXT_ARG();
+ 			if (iif_ok++)
+@@ -648,7 +651,7 @@ static int parse_encap_seg6local(struct rtattr *rta, size_t len, int *argcp,
+ 			iif = ll_name_to_index(*argv);
+ 			if (!iif)
+ 				exit(nodev(*argv));
+-			rta_addattr32(rta, len, SEG6_LOCAL_IIF, iif);
++			ret = rta_addattr32(rta, len, SEG6_LOCAL_IIF, iif);
+ 		} else if (strcmp(*argv, "oif") == 0) {
+ 			NEXT_ARG();
+ 			if (oif_ok++)
+@@ -656,7 +659,7 @@ static int parse_encap_seg6local(struct rtattr *rta, size_t len, int *argcp,
+ 			oif = ll_name_to_index(*argv);
+ 			if (!oif)
+ 				exit(nodev(*argv));
+-			rta_addattr32(rta, len, SEG6_LOCAL_OIF, oif);
++			ret = rta_addattr32(rta, len, SEG6_LOCAL_OIF, oif);
+ 		} else if (strcmp(*argv, "srh") == 0) {
+ 			NEXT_ARG();
+ 			if (srh_ok++)
+@@ -691,6 +694,8 @@ static int parse_encap_seg6local(struct rtattr *rta, size_t len, int *argcp,
+ 		} else {
+ 			break;
+ 		}
++		if (ret)
++			return ret;
+ 		argc--; argv++;
+ 	}
+ 
+@@ -705,14 +710,14 @@ static int parse_encap_seg6local(struct rtattr *rta, size_t len, int *argcp,
+ 		srh = parse_srh(segbuf, hmac,
+ 				action == SEG6_LOCAL_ACTION_END_B6_ENCAP);
+ 		srhlen = (srh->hdrlen + 1) << 3;
+-		rta_addattr_l(rta, len, SEG6_LOCAL_SRH, srh, srhlen);
++		ret = rta_addattr_l(rta, len, SEG6_LOCAL_SRH, srh, srhlen);
+ 		free(srh);
+ 	}
+ 
+ 	*argcp = argc + 1;
+ 	*argvp = argv - 1;
+ 
+-	return 0;
++	return ret;
+ }
+ 
+ static int parse_encap_mpls(struct rtattr *rta, size_t len,
+@@ -730,8 +735,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;
+ 
+ 	argc--;
+ 	argv++;
+@@ -745,7 +751,8 @@ static int parse_encap_mpls(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, MPLS_IPTUNNEL_TTL, ttl);
++			if (rta_addattr8(rta, len, MPLS_IPTUNNEL_TTL, ttl))
++				return -1;
+ 		} else {
+ 			break;
+ 		}
+@@ -768,6 +775,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) {
+@@ -778,7 +786,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;
+ 
+@@ -786,8 +794,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;
+ 
+@@ -796,7 +804,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;
+ 
+@@ -805,10 +813,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++;
+ 	}
+ 
+@@ -819,7 +829,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,
+@@ -828,6 +838,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);
+@@ -836,7 +847,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) {
+@@ -849,8 +861,8 @@ 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,
+-				     (__u8)csum_mode);
++			ret = rta_addattr8(rta, 1024, ILA_ATTR_CSUM_MODE,
++					   (__u8)csum_mode);
+ 
+ 			argc--; argv++;
+ 		} else if (strcmp(*argv, "ident-type") == 0) {
+@@ -863,8 +875,8 @@ static int parse_encap_ila(struct rtattr *rta, size_t len,
+ 				invarg("\"ident-type\" value is invalid\n",
+ 				       *argv);
+ 
+-			rta_addattr8(rta, 1024, ILA_ATTR_IDENT_TYPE,
+-				     (__u8)ident_type);
++			ret = rta_addattr8(rta, 1024, ILA_ATTR_IDENT_TYPE,
++					   (__u8)ident_type);
+ 
+ 			argc--; argv++;
+ 		} else if (strcmp(*argv, "hook-type") == 0) {
+@@ -877,13 +889,15 @@ static int parse_encap_ila(struct rtattr *rta, size_t len,
+ 				invarg("\"hook-type\" value is invalid\n",
+ 				       *argv);
+ 
+-			rta_addattr8(rta, 1024, ILA_ATTR_HOOK_TYPE,
+-				     (__u8)hook_type);
++			ret = rta_addattr8(rta, 1024, ILA_ATTR_HOOK_TYPE,
++					   (__u8)hook_type);
+ 
+ 			argc--; argv++;
+ 		} else {
+ 			break;
+ 		}
++		if (ret)
++			break;
+ 	}
+ 
+ 	/* argv is currently the first unparsed argument,
+@@ -893,7 +907,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,
+@@ -902,6 +916,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) {
+@@ -912,7 +927,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;
+ 
+@@ -920,8 +935,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;
+ 
+@@ -930,7 +945,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;
+ 
+@@ -940,10 +955,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++;
+ 	}
+ 
+@@ -954,7 +972,7 @@ static int parse_encap_ip6(struct rtattr *rta, size_t len,
+ 	*argcp = argc + 1;
+ 	*argvp = argv - 1;
+ 
+-	return 0;
++	return ret;
+ }
+ 
+ static void lwt_bpf_usage(void)
+@@ -1021,6 +1039,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);
+@@ -1037,37 +1056,40 @@ 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)
+ 			exit(-1);
+ 		break;
+ 	case LWTUNNEL_ENCAP_SEG6:
+-		parse_encap_seg6(rta, len, &argc, &argv);
++		ret = parse_encap_seg6(rta, len, &argc, &argv);
+ 		break;
+ 	case LWTUNNEL_ENCAP_SEG6_LOCAL:
+-		parse_encap_seg6local(rta, len, &argc, &argv);
++		ret = parse_encap_seg6local(rta, len, &argc, &argv);
+ 		break;
+ 	default:
+ 		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/0016-bridge-mdb-fix-missing-new-line-when-show-bridge-mdb.patch b/SOURCES/0016-bridge-mdb-fix-missing-new-line-when-show-bridge-mdb.patch
new file mode 100644
index 0000000..17003fa
--- /dev/null
+++ b/SOURCES/0016-bridge-mdb-fix-missing-new-line-when-show-bridge-mdb.patch
@@ -0,0 +1,62 @@
+From e77e552d5814bf34ec65b8342875990c7f085edc Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Wed, 19 Sep 2018 20:00:42 +0200
+Subject: [PATCH] bridge/mdb: fix missing new line when show bridge mdb
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1625500
+Upstream Status: iproute2.git commit 92bba4ed4016a
+
+commit 92bba4ed4016af3ce7f7071d3c37f2cb34f240f5
+Author: Hangbin Liu <liuhangbin@gmail.com>
+Date:   Wed Sep 12 09:39:44 2018 +0800
+
+    bridge/mdb: fix missing new line when show bridge mdb
+
+    The bridge mdb show is broken on current iproute2. e.g.
+    ]# bridge mdb show
+    34: br0  veth0_br  224.1.1.2  temp 34: br0  veth0_br  224.1.1.1  temp
+
+    After fix:
+    ]# bridge mdb show
+    34: br0  veth0_br  224.1.1.2  temp
+    34: br0  veth0_br  224.1.1.1  temp
+
+    v2: Use json print lib as Stephen suggested.
+    v3: No need to use is_json_context() as print_string() could handle both cases.
+    v4: use new function print_nl() to print new line in non-json mode.
+
+    Reported-by: Ying Xu <yinxu@redhat.com>
+    Fixes: c7c1a1ef51aea ("bridge: colorize output and use JSON print library")
+    Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ bridge/mdb.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/bridge/mdb.c b/bridge/mdb.c
+index f38dc67..a7b7979 100644
+--- a/bridge/mdb.c
++++ b/bridge/mdb.c
+@@ -107,6 +107,10 @@ static void br_print_router_ports(FILE *f, struct rtattr *attr,
+ 			fprintf(f, "%s ", port_ifname);
+ 		}
+ 	}
++
++	if (!show_stats)
++		print_nl();
++
+ 	close_json_array(PRINT_JSON, NULL);
+ }
+ 
+@@ -164,6 +168,8 @@ static void print_mdb_entry(FILE *f, int ifindex, const struct br_mdb_entry *e,
+ 		print_string(PRINT_ANY, "timer", " %s",
+ 			     format_timer(timer));
+ 	}
++
++	print_nl();
+ 	close_json_object();
+ }
+ 
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0017-lib-introduce-print_nl.patch b/SOURCES/0017-lib-introduce-print_nl.patch
new file mode 100644
index 0000000..4751bd9
--- /dev/null
+++ b/SOURCES/0017-lib-introduce-print_nl.patch
@@ -0,0 +1,357 @@
+From 1934af7ac7bbd967f56d0cf5fa12ec0423bd5683 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Wed, 19 Sep 2018 20:23:03 +0200
+Subject: [PATCH] lib: introduce print_nl
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1625500
+Upstream Status: iproute2.git commit b85076cd74e77
+
+commit b85076cd74e77538918d35992b1a9cd17ff86af8
+Author: Stephen Hemminger <stephen@networkplumber.org>
+Date:   Tue Sep 11 08:29:33 2018 -0700
+
+    lib: introduce print_nl
+
+    Common pattern in iproute commands is to print a line seperator
+    in non-json mode. Make that a simple function.
+
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ bridge/bridge.c      |  1 -
+ include/json_print.h |  2 ++
+ ip/ip.c              |  1 -
+ ip/ipaddress.c       | 12 ++++++------
+ ip/ipila.c           |  2 +-
+ ip/ipl2tp.c          | 14 +++++++-------
+ ip/ipmacsec.c        |  2 +-
+ ip/ipmaddr.c         |  2 +-
+ ip/ipmroute.c        |  2 +-
+ ip/ipntable.c        | 16 ++++++++--------
+ lib/json_print.c     |  7 +++++++
+ lib/utils.c          |  1 +
+ tc/tc.c              |  1 -
+ 13 files changed, 35 insertions(+), 28 deletions(-)
+
+diff --git a/bridge/bridge.c b/bridge/bridge.c
+index 28e1381..7221c0b 100644
+--- a/bridge/bridge.c
++++ b/bridge/bridge.c
+@@ -30,7 +30,6 @@ int json;
+ int timestamp;
+ char *batch_file;
+ int force;
+-const char *_SL_;
+ 
+ static void usage(void) __attribute__((noreturn));
+ 
+diff --git a/include/json_print.h b/include/json_print.h
+index 218fedc..78a6c83 100644
+--- a/include/json_print.h
++++ b/include/json_print.h
+@@ -41,6 +41,8 @@ void close_json_object(void);
+ void open_json_array(enum output_type type, const char *delim);
+ void close_json_array(enum output_type type, const char *delim);
+ 
++void print_nl(void);
++
+ #define _PRINT_FUNC(type_name, type)					\
+ 	void print_color_##type_name(enum output_type t,		\
+ 				     enum color_attr color,		\
+diff --git a/ip/ip.c b/ip/ip.c
+index bb964f3..2ca55e3 100644
+--- a/ip/ip.c
++++ b/ip/ip.c
+@@ -33,7 +33,6 @@ int oneline;
+ int brief;
+ int json;
+ int timestamp;
+-const char *_SL_;
+ int force;
+ int max_flush_loops = 10;
+ int batch_mode;
+diff --git a/ip/ipaddress.c b/ip/ipaddress.c
+index b7b78f6..f315a81 100644
+--- a/ip/ipaddress.c
++++ b/ip/ipaddress.c
+@@ -240,7 +240,7 @@ static void print_linktype(FILE *fp, struct rtattr *tb)
+ 		const char *kind
+ 			= rta_getattr_str(linkinfo[IFLA_INFO_KIND]);
+ 
+-		print_string(PRINT_FP, NULL, "%s", _SL_);
++		print_nl();
+ 		print_string(PRINT_ANY, "info_kind", "    %s ", kind);
+ 
+ 		lu = get_link_kind(kind);
+@@ -269,7 +269,7 @@ static void print_linktype(FILE *fp, struct rtattr *tb)
+ 		const char *slave_kind
+ 			= rta_getattr_str(linkinfo[IFLA_INFO_SLAVE_KIND]);
+ 
+-		print_string(PRINT_FP, NULL, "%s", _SL_);
++		print_nl();
+ 		print_string(PRINT_ANY,
+ 			     "info_slave_kind",
+ 			     "    %s_slave ",
+@@ -749,7 +749,7 @@ static void print_link_stats(FILE *fp, struct nlmsghdr *n)
+ 	parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi),
+ 		     n->nlmsg_len - NLMSG_LENGTH(sizeof(*ifi)));
+ 	__print_link_stats(fp, tb);
+-	fprintf(fp, "%s", _SL_);
++	print_nl();
+ }
+ 
+ static int print_linkinfo_brief(FILE *fp, const char *name,
+@@ -913,7 +913,7 @@ int print_linkinfo(const struct sockaddr_nl *who,
+ 		print_link_event(fp, rta_getattr_u32(tb[IFLA_EVENT]));
+ 
+ 	if (!filter.family || filter.family == AF_PACKET || show_details) {
+-		print_string(PRINT_FP, NULL, "%s", _SL_);
++		print_nl();
+ 		print_string(PRINT_ANY,
+ 			     "link_type",
+ 			     "    link/%s ",
+@@ -1064,7 +1064,7 @@ int print_linkinfo(const struct sockaddr_nl *who,
+ 		xdp_dump(fp, tb[IFLA_XDP], true, true);
+ 
+ 	if (do_link && show_stats) {
+-		print_string(PRINT_FP, NULL, "%s", _SL_);
++		print_nl();
+ 		__print_link_stats(fp, tb);
+ 	}
+ 
+@@ -1392,7 +1392,7 @@ int print_addrinfo(const struct sockaddr_nl *who, struct nlmsghdr *n,
+ 	if (rta_tb[IFA_CACHEINFO]) {
+ 		struct ifa_cacheinfo *ci = RTA_DATA(rta_tb[IFA_CACHEINFO]);
+ 
+-		print_string(PRINT_FP, NULL, "%s", _SL_);
++		print_nl();
+ 		print_string(PRINT_FP, NULL, "       valid_lft ", NULL);
+ 
+ 		if (ci->ifa_valid == INFINITY_LIFE_TIME) {
+diff --git a/ip/ipila.c b/ip/ipila.c
+index 370385c..895fe0c 100644
+--- a/ip/ipila.c
++++ b/ip/ipila.c
+@@ -128,7 +128,7 @@ static int print_ila_mapping(const struct sockaddr_nl *who,
+ 	else
+ 		print_string(PRINT_FP, NULL, "%s", "-");
+ 
+-	print_string(PRINT_FP, NULL, "%s", _SL_);
++	print_nl();
+ 	close_json_object();
+ 
+ 	return 0;
+diff --git a/ip/ipl2tp.c b/ip/ipl2tp.c
+index 05e9638..414a9eb 100644
+--- a/ip/ipl2tp.c
++++ b/ip/ipl2tp.c
+@@ -228,7 +228,7 @@ static void print_tunnel(const struct l2tp_data *data)
+ 	print_string(PRINT_ANY, "encap", " encap %s",
+ 		     p->encap == L2TP_ENCAPTYPE_UDP ? "UDP" :
+ 		     p->encap == L2TP_ENCAPTYPE_IP ? "IP" : "??");
+-	print_string(PRINT_FP, NULL, "%s", _SL_);
++	print_nl();
+ 
+ 	print_string(PRINT_ANY, "local", "  From %s ",
+ 		     inet_ntop(p->local_ip.family, p->local_ip.data,
+@@ -236,11 +236,11 @@ static void print_tunnel(const struct l2tp_data *data)
+ 	print_string(PRINT_ANY, "peer", "to %s",
+ 		     inet_ntop(p->peer_ip.family, p->peer_ip.data,
+ 			       buf, sizeof(buf)));
+-	print_string(PRINT_FP, NULL, "%s", _SL_);
++	print_nl();
+ 
+ 	print_uint(PRINT_ANY, "peer_tunnel", "  Peer tunnel %u",
+ 		   p->peer_tunnel_id);
+-	print_string(PRINT_FP, NULL, "%s", _SL_);
++	print_nl();
+ 
+ 	if (p->encap == L2TP_ENCAPTYPE_UDP) {
+ 		print_string(PRINT_FP, NULL,
+@@ -250,7 +250,7 @@ static void print_tunnel(const struct l2tp_data *data)
+ 			   p->local_udp_port);
+ 		print_uint(PRINT_ANY, "peer_port", "/%hu",
+ 			   p->peer_udp_port);
+-		print_string(PRINT_FP, NULL, "%s", _SL_);
++		print_nl();
+ 
+ 		switch (p->local_ip.family) {
+ 		case AF_INET:
+@@ -292,18 +292,18 @@ static void print_session(struct l2tp_data *data)
+ 
+ 	print_uint(PRINT_ANY, "session_id", "Session %u", p->session_id);
+ 	print_uint(PRINT_ANY, "tunnel_id",  " in tunnel %u", p->tunnel_id);
+-	print_string(PRINT_FP, NULL, "%s", _SL_);
++	print_nl();
+ 
+ 	print_uint(PRINT_ANY, "peer_session_id",
+ 		     "  Peer session %u,", p->peer_session_id);
+ 	print_uint(PRINT_ANY, "peer_tunnel_id",
+ 		     " tunnel %u",  p->peer_tunnel_id);
+-	print_string(PRINT_FP, NULL, "%s", _SL_);
++	print_nl();
+ 
+ 	if (p->ifname != NULL) {
+ 		print_color_string(PRINT_ANY, COLOR_IFNAME,
+ 				   "interface", "  interface name: %s" , p->ifname);
+-		print_string(PRINT_FP, NULL, "%s", _SL_);
++		print_nl();
+ 	}
+ 
+ 	/* Show offsets only for plain console output (for legacy scripts) */
+diff --git a/ip/ipmacsec.c b/ip/ipmacsec.c
+index 4e4e158..fa56e0e 100644
+--- a/ip/ipmacsec.c
++++ b/ip/ipmacsec.c
+@@ -627,7 +627,7 @@ static void print_attrs(struct rtattr *attrs[])
+ 	if (attrs[MACSEC_SECY_ATTR_CIPHER_SUITE]) {
+ 		__u64 cid = rta_getattr_u64(attrs[MACSEC_SECY_ATTR_CIPHER_SUITE]);
+ 
+-		print_string(PRINT_FP, NULL, "%s", _SL_);
++		print_nl();
+ 		print_string(PRINT_ANY, "cipher_suite",
+ 			     "    cipher suite: %s,", cs_id_to_name(cid));
+ 	}
+diff --git a/ip/ipmaddr.c b/ip/ipmaddr.c
+index a484990..992b212 100644
+--- a/ip/ipmaddr.c
++++ b/ip/ipmaddr.c
+@@ -240,7 +240,7 @@ static void print_mlist(FILE *fp, struct ma_info *list)
+ 			print_uint(PRINT_ANY, "ifindex", "%d:", list->index);
+ 			print_color_string(PRINT_ANY, COLOR_IFNAME,
+ 					   "ifname", "\t%s", list->name);
+-			print_string(PRINT_FP, NULL, "%s", _SL_);
++			print_nl();
+ 			cur_index = list->index;
+ 
+ 			open_json_array(PRINT_JSON, "maddr");
+diff --git a/ip/ipmroute.c b/ip/ipmroute.c
+index cdb4d89..bc23cfe 100644
+--- a/ip/ipmroute.c
++++ b/ip/ipmroute.c
+@@ -181,7 +181,7 @@ int print_mroute(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
+ 	if (show_stats && tb[RTA_MFC_STATS]) {
+ 		struct rta_mfc_stats *mfcs = RTA_DATA(tb[RTA_MFC_STATS]);
+ 
+-		print_string(PRINT_FP, NULL, "%s", _SL_);
++		print_nl();
+ 		print_u64(PRINT_ANY, "packets", "  %"PRIu64" packets,",
+ 			   mfcs->mfcs_packets);
+ 		print_u64(PRINT_ANY, "bytes", " %"PRIu64" bytes", mfcs->mfcs_bytes);
+diff --git a/ip/ipntable.c b/ip/ipntable.c
+index 4fae181..dd4f7c2 100644
+--- a/ip/ipntable.c
++++ b/ip/ipntable.c
+@@ -346,7 +346,7 @@ static void print_ndtconfig(const struct ndt_config *ndtc)
+ 		   "entry_size %u ", ndtc->ndtc_entry_size);
+ 	print_uint(PRINT_ANY, "entries", "entries %u ", ndtc->ndtc_entries);
+ 
+-	print_string(PRINT_FP, NULL, "%s", _SL_);
++	print_nl();
+ 
+ 	print_string(PRINT_ANY, "last_flush",
+ 		     "        last_flush %s ",
+@@ -355,7 +355,7 @@ static void print_ndtconfig(const struct ndt_config *ndtc)
+ 		     "last_rand %s ",
+ 		     ntable_strtime_delta(ndtc->ndtc_last_rand));
+ 
+-	print_string(PRINT_FP, NULL, "%s", _SL_);
++	print_nl();
+ 
+ 	print_uint(PRINT_ANY, "hash_rnd",
+ 		   "        hash_rnd %u ", ndtc->ndtc_hash_rnd);
+@@ -367,7 +367,7 @@ static void print_ndtconfig(const struct ndt_config *ndtc)
+ 	print_uint(PRINT_ANY, "proxy_qlen",
+ 		   "proxy_qlen %u ", ndtc->ndtc_proxy_qlen);
+ 
+-	print_string(PRINT_FP, NULL, "%s", _SL_);
++	print_nl();
+ }
+ 
+ static void print_ndtparams(struct rtattr *tpb[])
+@@ -379,7 +379,7 @@ static void print_ndtparams(struct rtattr *tpb[])
+ 		print_string(PRINT_FP, NULL, "    dev ", NULL);
+ 		print_color_string(PRINT_ANY, COLOR_IFNAME,
+ 				   "dev", "%s ", ll_index_to_name(ifindex));
+-		print_string(PRINT_FP, NULL, "%s", _SL_);
++		print_nl();
+ 	}
+ 
+ 	print_string(PRINT_FP, NULL, "    ", NULL);
+@@ -482,7 +482,7 @@ static void print_ndtparams(struct rtattr *tpb[])
+ 		print_u64(PRINT_ANY, "locktime", "locktime %llu ", locktime);
+ 	}
+ 
+-	print_string(PRINT_FP, NULL, "%s", _SL_);
++	print_nl();
+ }
+ 
+ static void print_ndtstats(const struct ndt_stats *ndts)
+@@ -517,7 +517,7 @@ static void print_ndtstats(const struct ndt_stats *ndts)
+ 	print_u64(PRINT_ANY, "forced_gc_runs", "forced_gc_runs %llu ",
+ 		   ndts->ndts_forced_gc_runs);
+ 
+-	print_string(PRINT_FP, NULL, "%s", _SL_);
++	print_nl();
+ }
+ 
+ static int print_ntable(const struct sockaddr_nl *who,
+@@ -579,7 +579,7 @@ static int print_ntable(const struct sockaddr_nl *who,
+ 		print_string(PRINT_ANY, "name", "%s ", name);
+ 	}
+ 
+-	print_string(PRINT_FP, NULL, "%s", _SL_);
++	print_nl();
+ 
+ 	ret = (tb[NDTA_THRESH1] || tb[NDTA_THRESH2] || tb[NDTA_THRESH3] ||
+ 	       tb[NDTA_GC_INTERVAL]);
+@@ -611,7 +611,7 @@ static int print_ntable(const struct sockaddr_nl *who,
+ 	}
+ 
+ 	if (ret)
+-		print_string(PRINT_FP, NULL, "%s", _SL_);
++		print_nl();
+ 
+ 	if (tb[NDTA_CONFIG] && show_stats)
+ 		print_ndtconfig(RTA_DATA(tb[NDTA_CONFIG]));
+diff --git a/lib/json_print.c b/lib/json_print.c
+index 5dc41bf..09e51d0 100644
+--- a/lib/json_print.c
++++ b/lib/json_print.c
+@@ -221,3 +221,10 @@ void print_color_null(enum output_type type,
+ 		color_fprintf(stdout, color, fmt, value);
+ 	}
+ }
++
++/* Print line seperator (if not in JSON mode) */
++void print_nl(void)
++{
++	if (!_jw)
++		printf("%s", _SL_);
++}
+diff --git a/lib/utils.c b/lib/utils.c
+index 02ce677..e87ecf3 100644
+--- a/lib/utils.c
++++ b/lib/utils.c
+@@ -42,6 +42,7 @@
+ int resolve_hosts;
+ int timestamp_short;
+ int pretty;
++const char *_SL_ = "\n";
+ 
+ int read_prop(const char *dev, char *prop, long *value)
+ {
+diff --git a/tc/tc.c b/tc/tc.c
+index 3bb5910..2e97f2b 100644
+--- a/tc/tc.c
++++ b/tc/tc.c
+@@ -43,7 +43,6 @@ bool use_names;
+ int json;
+ int color;
+ int oneline;
+-const char *_SL_;
+ 
+ static char *conf_file;
+ 
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0018-bridge-fdb-Fix-for-missing-keywords-in-non-JSON-outp.patch b/SOURCES/0018-bridge-fdb-Fix-for-missing-keywords-in-non-JSON-outp.patch
new file mode 100644
index 0000000..a6c0a6e
--- /dev/null
+++ b/SOURCES/0018-bridge-fdb-Fix-for-missing-keywords-in-non-JSON-outp.patch
@@ -0,0 +1,58 @@
+From 32c326673c4c2a5513d52898ebab453ccbb178a2 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 18 Oct 2018 10:52:09 +0200
+Subject: [PATCH] bridge: fdb: Fix for missing keywords in non-JSON output
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1636532
+Upstream Status: iproute2.git commit 4abb8c723a648
+
+commit 4abb8c723a648ac9edc33741d2064e2507a6bae3
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Tue Oct 9 14:44:08 2018 +0200
+
+    bridge: fdb: Fix for missing keywords in non-JSON output
+
+    While migrating to JSON print library, some keywords were dropped from
+    standard output by accident. Add them back to unbreak output parsers.
+
+    Fixes: c7c1a1ef51aea ("bridge: colorize output and use JSON print library")
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ bridge/fdb.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/bridge/fdb.c b/bridge/fdb.c
+index 4dbc894..6487fac 100644
+--- a/bridge/fdb.c
++++ b/bridge/fdb.c
+@@ -182,7 +182,7 @@ int print_fdb(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
+ 		if (!is_json_context())
+ 			fprintf(fp, "dev ");
+ 		print_color_string(PRINT_ANY, COLOR_IFNAME,
+-				   "ifname", "%s ",
++				   "ifname", "dev %s ",
+ 				   ll_index_to_name(r->ndm_ifindex));
+ 	}
+ 
+@@ -199,7 +199,7 @@ int print_fdb(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
+ 
+ 		print_color_string(PRINT_ANY,
+ 				   ifa_family_color(family),
+-				    "dst", "%s ", dst);
++				    "dst", "dst %s ", dst);
+ 	}
+ 
+ 	if (vid)
+@@ -246,7 +246,7 @@ int print_fdb(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
+ 
+ 
+ 	if (tb[NDA_MASTER])
+-		print_string(PRINT_ANY, "master", "%s ",
++		print_string(PRINT_ANY, "master", "master %s ",
+ 			     ll_index_to_name(rta_getattr_u32(tb[NDA_MASTER])));
+ 
+ 	print_string(PRINT_ANY, "state", "%s\n",
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0019-ip-addrlabel-Fix-printing-of-label-value.patch b/SOURCES/0019-ip-addrlabel-Fix-printing-of-label-value.patch
new file mode 100644
index 0000000..801d99c
--- /dev/null
+++ b/SOURCES/0019-ip-addrlabel-Fix-printing-of-label-value.patch
@@ -0,0 +1,40 @@
+From fd07e443d264ddf25d4152af3a44144e1a9b3fd9 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 18 Oct 2018 10:52:51 +0200
+Subject: [PATCH] ip-addrlabel: Fix printing of label value
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1639412
+Upstream Status: iproute2.git commit 0b9b0d08c29f9
+
+commit 0b9b0d08c29f9aa6cc1b83c853964d9cc18dc6f2
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Mon Oct 15 22:20:58 2018 +0200
+
+    ip-addrlabel: Fix printing of label value
+
+    Passing the return value of RTA_DATA() to rta_getattr_u32() is wrong
+    since that function will call RTA_DATA() by itself already.
+
+    Fixes: a7ad1c8a6845d ("ipaddrlabel: add json support")
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ ip/ipaddrlabel.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/ip/ipaddrlabel.c b/ip/ipaddrlabel.c
+index 2f79c56..8abe572 100644
+--- a/ip/ipaddrlabel.c
++++ b/ip/ipaddrlabel.c
+@@ -95,7 +95,7 @@ int print_addrlabel(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg
+ 	}
+ 
+ 	if (tb[IFAL_LABEL] && RTA_PAYLOAD(tb[IFAL_LABEL]) == sizeof(uint32_t)) {
+-		uint32_t label = rta_getattr_u32(RTA_DATA(tb[IFAL_LABEL]));
++		uint32_t label = rta_getattr_u32(tb[IFAL_LABEL]);
+ 
+ 		print_uint(PRINT_ANY,
+ 			   "label", "label %u ", label);
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0020-iplink_vxlan-take-into-account-preferred_family-crea.patch b/SOURCES/0020-iplink_vxlan-take-into-account-preferred_family-crea.patch
new file mode 100644
index 0000000..ffae166
--- /dev/null
+++ b/SOURCES/0020-iplink_vxlan-take-into-account-preferred_family-crea.patch
@@ -0,0 +1,76 @@
+From f08a8608335d46bea1b2cb122823a4c538ce6e46 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 18 Oct 2018 10:53:57 +0200
+Subject: [PATCH] iplink_vxlan: take into account preferred_family creating
+ vxlan device
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1626321
+Upstream Status: iproute2.git commit c1360e3b483e5
+
+commit c1360e3b483e54a61a36bd2fdb3bfb91a4d2b32a
+Author: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
+Date:   Fri Sep 21 15:34:25 2018 +0200
+
+    iplink_vxlan: take into account preferred_family creating vxlan device
+
+    Take into account the configured preferred_family if neither saddr or
+    daddr are provided since otherwise vxlan kernel module will use IPv4 as
+    default remote inet family neglecting the one provided by userspace.
+    This behaviour was originally in commit 97d564b90ccb ("vxlan: use
+    preferred address family when neither group or remote is specified").
+    The issue can be triggered with the following reproducer:
+
+    $ip -6 link add vxlan1 type vxlan id 42 dev enp0s2 \
+         proxy nolearning l2miss l3miss
+    $bridge fdb add 46:47:1f:a7:1c:25 dev vxlan1 dst 2000::2
+    RTNETLINK answers: Address family not supported by protocol
+
+    Fixes: 1e9b8072de2c ("iplink_vxlan: Get rid of inet_get_addr()")
+    Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ ip/iplink_vxlan.c | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+diff --git a/ip/iplink_vxlan.c b/ip/iplink_vxlan.c
+index 2bc253f..831f39a 100644
+--- a/ip/iplink_vxlan.c
++++ b/ip/iplink_vxlan.c
+@@ -82,6 +82,7 @@ static int vxlan_parse_opt(struct link_util *lu, int argc, char **argv,
+ 	__u64 attrs = 0;
+ 	bool set_op = (n->nlmsg_type == RTM_NEWLINK &&
+ 		       !(n->nlmsg_flags & NLM_F_CREATE));
++	bool selected_family = false;
+ 
+ 	saddr.family = daddr.family = AF_UNSPEC;
+ 
+@@ -356,12 +357,26 @@ static int vxlan_parse_opt(struct link_util *lu, int argc, char **argv,
+ 		int type = (saddr.family == AF_INET) ? IFLA_VXLAN_LOCAL
+ 						     : IFLA_VXLAN_LOCAL6;
+ 		addattr_l(n, 1024, type, saddr.data, saddr.bytelen);
++		selected_family = true;
+ 	}
+ 
+ 	if (is_addrtype_inet(&daddr)) {
+ 		int type = (daddr.family == AF_INET) ? IFLA_VXLAN_GROUP
+ 						     : IFLA_VXLAN_GROUP6;
+ 		addattr_l(n, 1024, type, daddr.data, daddr.bytelen);
++		selected_family = true;
++	}
++
++	if (!selected_family) {
++		if (preferred_family == AF_INET) {
++			get_addr(&daddr, "default", AF_INET);
++			addattr_l(n, 1024, IFLA_VXLAN_GROUP,
++				  daddr.data, daddr.bytelen);
++		} else if (preferred_family == AF_INET6) {
++			get_addr(&daddr, "default", AF_INET6);
++			addattr_l(n, 1024, IFLA_VXLAN_GROUP6,
++				  daddr.data, daddr.bytelen);
++		}
+ 	}
+ 
+ 	if (!set_op || VXLAN_ATTRSET(attrs, IFLA_VXLAN_LEARNING))
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0021-json-make-0xhex-handle-u64.patch b/SOURCES/0021-json-make-0xhex-handle-u64.patch
new file mode 100644
index 0000000..fbdeb8e
--- /dev/null
+++ b/SOURCES/0021-json-make-0xhex-handle-u64.patch
@@ -0,0 +1,73 @@
+From 9822fef7a13eaec70be8e86c23bdb71569835bd0 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 18 Oct 2018 12:49:51 +0200
+Subject: [PATCH] json: make 0xhex handle u64
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1628428
+Upstream Status: iproute2.git commit 45ec4771d40cb
+
+commit 45ec4771d40cb367377e4148a2af22f25c20f3bf
+Author: Sabrina Dubroca <sd@queasysnail.net>
+Date:   Fri Oct 12 17:34:32 2018 +0200
+
+    json: make 0xhex handle u64
+
+    Stephen converted macsec's sci to use 0xhex, but 0xhex handles
+    unsigned int's, not 64 bits ints. Thus, the output of the "ip macsec
+    show" command is mangled, with half of the SCI replaced with 0s:
+
+    # ip macsec show
+    11: macsec0: [...]
+        cipher suite: GCM-AES-128, using ICV length 16
+        TXSC: 0000000001560001 on SA 0
+
+    # ip -d link show macsec0
+    11: macsec0@ens3: [...]
+        link/ether 52:54:00:12:01:56 brd ff:ff:ff:ff:ff:ff promiscuity 0
+        macsec sci 5254001201560001 [...]
+
+    where TXSC and sci should match.
+
+    Fixes: c0b904de6211 ("macsec: support JSON")
+    Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ include/json_print.h | 2 +-
+ lib/json_print.c     | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/include/json_print.h b/include/json_print.h
+index 78a6c83..218da31 100644
+--- a/include/json_print.h
++++ b/include/json_print.h
+@@ -66,7 +66,7 @@ _PRINT_FUNC(uint, unsigned int);
+ _PRINT_FUNC(u64, uint64_t);
+ _PRINT_FUNC(hu, unsigned short);
+ _PRINT_FUNC(hex, unsigned int);
+-_PRINT_FUNC(0xhex, unsigned int);
++_PRINT_FUNC(0xhex, unsigned long long int);
+ _PRINT_FUNC(luint, unsigned long int);
+ _PRINT_FUNC(lluint, unsigned long long int);
+ _PRINT_FUNC(float, double);
+diff --git a/lib/json_print.c b/lib/json_print.c
+index 09e51d0..cf13e9b 100644
+--- a/lib/json_print.c
++++ b/lib/json_print.c
+@@ -171,12 +171,12 @@ void print_color_0xhex(enum output_type type,
+ 		       enum color_attr color,
+ 		       const char *key,
+ 		       const char *fmt,
+-		       unsigned int hex)
++		       unsigned long long hex)
+ {
+ 	if (_IS_JSON_CONTEXT(type)) {
+ 		SPRINT_BUF(b1);
+ 
+-		snprintf(b1, sizeof(b1), "%#x", hex);
++		snprintf(b1, sizeof(b1), "%#llx", hex);
+ 		print_string(PRINT_JSON, key, NULL, b1);
+ 	} else if (_IS_FP_CONTEXT(type)) {
+ 		color_fprintf(stdout, color, fmt, hex);
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0022-macsec-fix-off-by-one-when-parsing-attributes.patch b/SOURCES/0022-macsec-fix-off-by-one-when-parsing-attributes.patch
new file mode 100644
index 0000000..6b629be
--- /dev/null
+++ b/SOURCES/0022-macsec-fix-off-by-one-when-parsing-attributes.patch
@@ -0,0 +1,114 @@
+From 03525ec63a5821a30461047da1dc8d907b3e3751 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 18 Oct 2018 12:49:51 +0200
+Subject: [PATCH] macsec: fix off-by-one when parsing attributes
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1628428
+Upstream Status: iproute2.git commit 9b45f8ec13b0d
+
+commit 9b45f8ec13b0d338c70ef0758f751c249be6c7f0
+Author: Sabrina Dubroca <sd@queasysnail.net>
+Date:   Fri Oct 12 17:34:12 2018 +0200
+
+    macsec: fix off-by-one when parsing attributes
+
+    I seem to have had a massive brainfart with uses of
+    parse_rtattr_nested(). The rtattr* array must have MAX+1 elements, and
+    the call to parse_rtattr_nested must have MAX as its bound. Let's fix
+    those.
+
+    Fixes: b26fc590ce62 ("ip: add MACsec support")
+    Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ ip/ipmacsec.c | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+diff --git a/ip/ipmacsec.c b/ip/ipmacsec.c
+index fa56e0e..007ce54 100644
+--- a/ip/ipmacsec.c
++++ b/ip/ipmacsec.c
+@@ -727,7 +727,7 @@ static void print_txsc_stats(const char *prefix, struct rtattr *attr)
+ 	if (!attr || show_stats == 0)
+ 		return;
+ 
+-	parse_rtattr_nested(stats, MACSEC_TXSC_STATS_ATTR_MAX + 1, attr);
++	parse_rtattr_nested(stats, MACSEC_TXSC_STATS_ATTR_MAX, attr);
+ 
+ 	print_stats(prefix, txsc_stats_names, NUM_MACSEC_TXSC_STATS_ATTR,
+ 		    stats);
+@@ -751,7 +751,7 @@ static void print_secy_stats(const char *prefix, struct rtattr *attr)
+ 	if (!attr || show_stats == 0)
+ 		return;
+ 
+-	parse_rtattr_nested(stats, MACSEC_SECY_STATS_ATTR_MAX + 1, attr);
++	parse_rtattr_nested(stats, MACSEC_SECY_STATS_ATTR_MAX, attr);
+ 
+ 	print_stats(prefix, secy_stats_names,
+ 		    NUM_MACSEC_SECY_STATS_ATTR, stats);
+@@ -772,7 +772,7 @@ static void print_rxsa_stats(const char *prefix, struct rtattr *attr)
+ 	if (!attr || show_stats == 0)
+ 		return;
+ 
+-	parse_rtattr_nested(stats, MACSEC_SA_STATS_ATTR_MAX + 1, attr);
++	parse_rtattr_nested(stats, MACSEC_SA_STATS_ATTR_MAX, attr);
+ 
+ 	print_stats(prefix, rxsa_stats_names, NUM_MACSEC_SA_STATS_ATTR, stats);
+ }
+@@ -789,7 +789,7 @@ static void print_txsa_stats(const char *prefix, struct rtattr *attr)
+ 	if (!attr || show_stats == 0)
+ 		return;
+ 
+-	parse_rtattr_nested(stats, MACSEC_SA_STATS_ATTR_MAX + 1, attr);
++	parse_rtattr_nested(stats, MACSEC_SA_STATS_ATTR_MAX, attr);
+ 
+ 	print_stats(prefix, txsa_stats_names, NUM_MACSEC_SA_STATS_ATTR, stats);
+ }
+@@ -817,7 +817,7 @@ static void print_tx_sc(const char *prefix, __u64 sci, __u8 encoding_sa,
+ 		bool state;
+ 
+ 		open_json_object(NULL);
+-		parse_rtattr_nested(sa_attr, MACSEC_SA_ATTR_MAX + 1, a);
++		parse_rtattr_nested(sa_attr, MACSEC_SA_ATTR_MAX, a);
+ 		state = rta_getattr_u8(sa_attr[MACSEC_SA_ATTR_ACTIVE]);
+ 
+ 		print_string(PRINT_FP, NULL, "%s", prefix);
+@@ -858,7 +858,7 @@ static void print_rxsc_stats(const char *prefix, struct rtattr *attr)
+ 	if (!attr || show_stats == 0)
+ 		return;
+ 
+-	parse_rtattr_nested(stats, MACSEC_RXSC_STATS_ATTR_MAX + 1, attr);
++	parse_rtattr_nested(stats, MACSEC_RXSC_STATS_ATTR_MAX, attr);
+ 
+ 	print_stats(prefix, rxsc_stats_names,
+ 		    NUM_MACSEC_RXSC_STATS_ATTR, stats);
+@@ -885,7 +885,7 @@ static void print_rx_sc(const char *prefix, __be64 sci, __u8 active,
+ 		bool state;
+ 
+ 		open_json_object(NULL);
+-		parse_rtattr_nested(sa_attr, MACSEC_SA_ATTR_MAX + 1, a);
++		parse_rtattr_nested(sa_attr, MACSEC_SA_ATTR_MAX, a);
+ 		state = rta_getattr_u8(sa_attr[MACSEC_SA_ATTR_ACTIVE]);
+ 
+ 		print_string(PRINT_FP, NULL, "%s", prefix);
+@@ -918,7 +918,7 @@ static void print_rxsc_list(struct rtattr *sc)
+ 
+ 		open_json_object(NULL);
+ 
+-		parse_rtattr_nested(sc_attr, MACSEC_RXSC_ATTR_MAX + 1, c);
++		parse_rtattr_nested(sc_attr, MACSEC_RXSC_ATTR_MAX, c);
+ 		print_rx_sc("    ",
+ 			    rta_getattr_u64(sc_attr[MACSEC_RXSC_ATTR_SCI]),
+ 			    rta_getattr_u32(sc_attr[MACSEC_RXSC_ATTR_ACTIVE]),
+@@ -958,7 +958,7 @@ static int process(const struct sockaddr_nl *who, struct nlmsghdr *n,
+ 	}
+ 
+ 	ifindex = rta_getattr_u32(attrs[MACSEC_ATTR_IFINDEX]);
+-	parse_rtattr_nested(attrs_secy, MACSEC_SECY_ATTR_MAX + 1,
++	parse_rtattr_nested(attrs_secy, MACSEC_SECY_ATTR_MAX,
+ 			    attrs[MACSEC_ATTR_SECY]);
+ 
+ 	if (!validate_secy_dump(attrs_secy)) {
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0023-uapi-add-snmp-header-file.patch b/SOURCES/0023-uapi-add-snmp-header-file.patch
new file mode 100644
index 0000000..c3e58d0
--- /dev/null
+++ b/SOURCES/0023-uapi-add-snmp-header-file.patch
@@ -0,0 +1,357 @@
+From 23bf1358295afa575227a41b5cd427cd1f3fdc0c Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 18 Oct 2018 12:51:12 +0200
+Subject: [PATCH] uapi: add snmp header file
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1626306
+Upstream Status: iproute2.git commit 9e030e77f20ab
+
+commit 9e030e77f20ab177e8717f054c9d53050b9a5d53
+Author: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
+Date:   Wed Oct 10 17:00:57 2018 +0200
+
+    uapi: add snmp header file
+
+    Introduce snmp header file. It will be used in subsequent patch in
+    order to parse device statistics reported in
+    IFLA_INET6_STATS/IFLA_INET6_ICMP6STATS netlink attributes
+
+    Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ include/uapi/linux/snmp.h | 323 ++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 323 insertions(+)
+ create mode 100644 include/uapi/linux/snmp.h
+
+diff --git a/include/uapi/linux/snmp.h b/include/uapi/linux/snmp.h
+new file mode 100644
+index 0000000..f80135e
+--- /dev/null
++++ b/include/uapi/linux/snmp.h
+@@ -0,0 +1,323 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
++/*
++ * Definitions for MIBs
++ *
++ * Author: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
++ */
++
++#ifndef _LINUX_SNMP_H
++#define _LINUX_SNMP_H
++
++/* ipstats mib definitions */
++/*
++ * RFC 1213:  MIB-II
++ * RFC 2011 (updates 1213):  SNMPv2-MIB-IP
++ * RFC 2863:  Interfaces Group MIB
++ * RFC 2465:  IPv6 MIB: General Group
++ * draft-ietf-ipv6-rfc2011-update-10.txt: MIB for IP: IP Statistics Tables
++ */
++enum
++{
++	IPSTATS_MIB_NUM = 0,
++/* frequently written fields in fast path, kept in same cache line */
++	IPSTATS_MIB_INPKTS,			/* InReceives */
++	IPSTATS_MIB_INOCTETS,			/* InOctets */
++	IPSTATS_MIB_INDELIVERS,			/* InDelivers */
++	IPSTATS_MIB_OUTFORWDATAGRAMS,		/* OutForwDatagrams */
++	IPSTATS_MIB_OUTPKTS,			/* OutRequests */
++	IPSTATS_MIB_OUTOCTETS,			/* OutOctets */
++/* other fields */
++	IPSTATS_MIB_INHDRERRORS,		/* InHdrErrors */
++	IPSTATS_MIB_INTOOBIGERRORS,		/* InTooBigErrors */
++	IPSTATS_MIB_INNOROUTES,			/* InNoRoutes */
++	IPSTATS_MIB_INADDRERRORS,		/* InAddrErrors */
++	IPSTATS_MIB_INUNKNOWNPROTOS,		/* InUnknownProtos */
++	IPSTATS_MIB_INTRUNCATEDPKTS,		/* InTruncatedPkts */
++	IPSTATS_MIB_INDISCARDS,			/* InDiscards */
++	IPSTATS_MIB_OUTDISCARDS,		/* OutDiscards */
++	IPSTATS_MIB_OUTNOROUTES,		/* OutNoRoutes */
++	IPSTATS_MIB_REASMTIMEOUT,		/* ReasmTimeout */
++	IPSTATS_MIB_REASMREQDS,			/* ReasmReqds */
++	IPSTATS_MIB_REASMOKS,			/* ReasmOKs */
++	IPSTATS_MIB_REASMFAILS,			/* ReasmFails */
++	IPSTATS_MIB_FRAGOKS,			/* FragOKs */
++	IPSTATS_MIB_FRAGFAILS,			/* FragFails */
++	IPSTATS_MIB_FRAGCREATES,		/* FragCreates */
++	IPSTATS_MIB_INMCASTPKTS,		/* InMcastPkts */
++	IPSTATS_MIB_OUTMCASTPKTS,		/* OutMcastPkts */
++	IPSTATS_MIB_INBCASTPKTS,		/* InBcastPkts */
++	IPSTATS_MIB_OUTBCASTPKTS,		/* OutBcastPkts */
++	IPSTATS_MIB_INMCASTOCTETS,		/* InMcastOctets */
++	IPSTATS_MIB_OUTMCASTOCTETS,		/* OutMcastOctets */
++	IPSTATS_MIB_INBCASTOCTETS,		/* InBcastOctets */
++	IPSTATS_MIB_OUTBCASTOCTETS,		/* OutBcastOctets */
++	IPSTATS_MIB_CSUMERRORS,			/* InCsumErrors */
++	IPSTATS_MIB_NOECTPKTS,			/* InNoECTPkts */
++	IPSTATS_MIB_ECT1PKTS,			/* InECT1Pkts */
++	IPSTATS_MIB_ECT0PKTS,			/* InECT0Pkts */
++	IPSTATS_MIB_CEPKTS,			/* InCEPkts */
++	IPSTATS_MIB_REASM_OVERLAPS,		/* ReasmOverlaps */
++	__IPSTATS_MIB_MAX
++};
++
++/* icmp mib definitions */
++/*
++ * RFC 1213:  MIB-II ICMP Group
++ * RFC 2011 (updates 1213):  SNMPv2 MIB for IP: ICMP group
++ */
++enum
++{
++	ICMP_MIB_NUM = 0,
++	ICMP_MIB_INMSGS,			/* InMsgs */
++	ICMP_MIB_INERRORS,			/* InErrors */
++	ICMP_MIB_INDESTUNREACHS,		/* InDestUnreachs */
++	ICMP_MIB_INTIMEEXCDS,			/* InTimeExcds */
++	ICMP_MIB_INPARMPROBS,			/* InParmProbs */
++	ICMP_MIB_INSRCQUENCHS,			/* InSrcQuenchs */
++	ICMP_MIB_INREDIRECTS,			/* InRedirects */
++	ICMP_MIB_INECHOS,			/* InEchos */
++	ICMP_MIB_INECHOREPS,			/* InEchoReps */
++	ICMP_MIB_INTIMESTAMPS,			/* InTimestamps */
++	ICMP_MIB_INTIMESTAMPREPS,		/* InTimestampReps */
++	ICMP_MIB_INADDRMASKS,			/* InAddrMasks */
++	ICMP_MIB_INADDRMASKREPS,		/* InAddrMaskReps */
++	ICMP_MIB_OUTMSGS,			/* OutMsgs */
++	ICMP_MIB_OUTERRORS,			/* OutErrors */
++	ICMP_MIB_OUTDESTUNREACHS,		/* OutDestUnreachs */
++	ICMP_MIB_OUTTIMEEXCDS,			/* OutTimeExcds */
++	ICMP_MIB_OUTPARMPROBS,			/* OutParmProbs */
++	ICMP_MIB_OUTSRCQUENCHS,			/* OutSrcQuenchs */
++	ICMP_MIB_OUTREDIRECTS,			/* OutRedirects */
++	ICMP_MIB_OUTECHOS,			/* OutEchos */
++	ICMP_MIB_OUTECHOREPS,			/* OutEchoReps */
++	ICMP_MIB_OUTTIMESTAMPS,			/* OutTimestamps */
++	ICMP_MIB_OUTTIMESTAMPREPS,		/* OutTimestampReps */
++	ICMP_MIB_OUTADDRMASKS,			/* OutAddrMasks */
++	ICMP_MIB_OUTADDRMASKREPS,		/* OutAddrMaskReps */
++	ICMP_MIB_CSUMERRORS,			/* InCsumErrors */
++	__ICMP_MIB_MAX
++};
++
++#define __ICMPMSG_MIB_MAX 512	/* Out+In for all 8-bit ICMP types */
++
++/* icmp6 mib definitions */
++/*
++ * RFC 2466:  ICMPv6-MIB
++ */
++enum
++{
++	ICMP6_MIB_NUM = 0,
++	ICMP6_MIB_INMSGS,			/* InMsgs */
++	ICMP6_MIB_INERRORS,			/* InErrors */
++	ICMP6_MIB_OUTMSGS,			/* OutMsgs */
++	ICMP6_MIB_OUTERRORS,			/* OutErrors */
++	ICMP6_MIB_CSUMERRORS,			/* InCsumErrors */
++	__ICMP6_MIB_MAX
++};
++
++#define __ICMP6MSG_MIB_MAX 512 /* Out+In for all 8-bit ICMPv6 types */
++
++/* tcp mib definitions */
++/*
++ * RFC 1213:  MIB-II TCP group
++ * RFC 2012 (updates 1213):  SNMPv2-MIB-TCP
++ */
++enum
++{
++	TCP_MIB_NUM = 0,
++	TCP_MIB_RTOALGORITHM,			/* RtoAlgorithm */
++	TCP_MIB_RTOMIN,				/* RtoMin */
++	TCP_MIB_RTOMAX,				/* RtoMax */
++	TCP_MIB_MAXCONN,			/* MaxConn */
++	TCP_MIB_ACTIVEOPENS,			/* ActiveOpens */
++	TCP_MIB_PASSIVEOPENS,			/* PassiveOpens */
++	TCP_MIB_ATTEMPTFAILS,			/* AttemptFails */
++	TCP_MIB_ESTABRESETS,			/* EstabResets */
++	TCP_MIB_CURRESTAB,			/* CurrEstab */
++	TCP_MIB_INSEGS,				/* InSegs */
++	TCP_MIB_OUTSEGS,			/* OutSegs */
++	TCP_MIB_RETRANSSEGS,			/* RetransSegs */
++	TCP_MIB_INERRS,				/* InErrs */
++	TCP_MIB_OUTRSTS,			/* OutRsts */
++	TCP_MIB_CSUMERRORS,			/* InCsumErrors */
++	__TCP_MIB_MAX
++};
++
++/* udp mib definitions */
++/*
++ * RFC 1213:  MIB-II UDP group
++ * RFC 2013 (updates 1213):  SNMPv2-MIB-UDP
++ */
++enum
++{
++	UDP_MIB_NUM = 0,
++	UDP_MIB_INDATAGRAMS,			/* InDatagrams */
++	UDP_MIB_NOPORTS,			/* NoPorts */
++	UDP_MIB_INERRORS,			/* InErrors */
++	UDP_MIB_OUTDATAGRAMS,			/* OutDatagrams */
++	UDP_MIB_RCVBUFERRORS,			/* RcvbufErrors */
++	UDP_MIB_SNDBUFERRORS,			/* SndbufErrors */
++	UDP_MIB_CSUMERRORS,			/* InCsumErrors */
++	UDP_MIB_IGNOREDMULTI,			/* IgnoredMulti */
++	__UDP_MIB_MAX
++};
++
++/* linux mib definitions */
++enum
++{
++	LINUX_MIB_NUM = 0,
++	LINUX_MIB_SYNCOOKIESSENT,		/* SyncookiesSent */
++	LINUX_MIB_SYNCOOKIESRECV,		/* SyncookiesRecv */
++	LINUX_MIB_SYNCOOKIESFAILED,		/* SyncookiesFailed */
++	LINUX_MIB_EMBRYONICRSTS,		/* EmbryonicRsts */
++	LINUX_MIB_PRUNECALLED,			/* PruneCalled */
++	LINUX_MIB_RCVPRUNED,			/* RcvPruned */
++	LINUX_MIB_OFOPRUNED,			/* OfoPruned */
++	LINUX_MIB_OUTOFWINDOWICMPS,		/* OutOfWindowIcmps */
++	LINUX_MIB_LOCKDROPPEDICMPS,		/* LockDroppedIcmps */
++	LINUX_MIB_ARPFILTER,			/* ArpFilter */
++	LINUX_MIB_TIMEWAITED,			/* TimeWaited */
++	LINUX_MIB_TIMEWAITRECYCLED,		/* TimeWaitRecycled */
++	LINUX_MIB_TIMEWAITKILLED,		/* TimeWaitKilled */
++	LINUX_MIB_PAWSACTIVEREJECTED,		/* PAWSActiveRejected */
++	LINUX_MIB_PAWSESTABREJECTED,		/* PAWSEstabRejected */
++	LINUX_MIB_DELAYEDACKS,			/* DelayedACKs */
++	LINUX_MIB_DELAYEDACKLOCKED,		/* DelayedACKLocked */
++	LINUX_MIB_DELAYEDACKLOST,		/* DelayedACKLost */
++	LINUX_MIB_LISTENOVERFLOWS,		/* ListenOverflows */
++	LINUX_MIB_LISTENDROPS,			/* ListenDrops */
++	LINUX_MIB_TCPHPHITS,			/* TCPHPHits */
++	LINUX_MIB_TCPPUREACKS,			/* TCPPureAcks */
++	LINUX_MIB_TCPHPACKS,			/* TCPHPAcks */
++	LINUX_MIB_TCPRENORECOVERY,		/* TCPRenoRecovery */
++	LINUX_MIB_TCPSACKRECOVERY,		/* TCPSackRecovery */
++	LINUX_MIB_TCPSACKRENEGING,		/* TCPSACKReneging */
++	LINUX_MIB_TCPSACKREORDER,		/* TCPSACKReorder */
++	LINUX_MIB_TCPRENOREORDER,		/* TCPRenoReorder */
++	LINUX_MIB_TCPTSREORDER,			/* TCPTSReorder */
++	LINUX_MIB_TCPFULLUNDO,			/* TCPFullUndo */
++	LINUX_MIB_TCPPARTIALUNDO,		/* TCPPartialUndo */
++	LINUX_MIB_TCPDSACKUNDO,			/* TCPDSACKUndo */
++	LINUX_MIB_TCPLOSSUNDO,			/* TCPLossUndo */
++	LINUX_MIB_TCPLOSTRETRANSMIT,		/* TCPLostRetransmit */
++	LINUX_MIB_TCPRENOFAILURES,		/* TCPRenoFailures */
++	LINUX_MIB_TCPSACKFAILURES,		/* TCPSackFailures */
++	LINUX_MIB_TCPLOSSFAILURES,		/* TCPLossFailures */
++	LINUX_MIB_TCPFASTRETRANS,		/* TCPFastRetrans */
++	LINUX_MIB_TCPSLOWSTARTRETRANS,		/* TCPSlowStartRetrans */
++	LINUX_MIB_TCPTIMEOUTS,			/* TCPTimeouts */
++	LINUX_MIB_TCPLOSSPROBES,		/* TCPLossProbes */
++	LINUX_MIB_TCPLOSSPROBERECOVERY,		/* TCPLossProbeRecovery */
++	LINUX_MIB_TCPRENORECOVERYFAIL,		/* TCPRenoRecoveryFail */
++	LINUX_MIB_TCPSACKRECOVERYFAIL,		/* TCPSackRecoveryFail */
++	LINUX_MIB_TCPRCVCOLLAPSED,		/* TCPRcvCollapsed */
++	LINUX_MIB_TCPDSACKOLDSENT,		/* TCPDSACKOldSent */
++	LINUX_MIB_TCPDSACKOFOSENT,		/* TCPDSACKOfoSent */
++	LINUX_MIB_TCPDSACKRECV,			/* TCPDSACKRecv */
++	LINUX_MIB_TCPDSACKOFORECV,		/* TCPDSACKOfoRecv */
++	LINUX_MIB_TCPABORTONDATA,		/* TCPAbortOnData */
++	LINUX_MIB_TCPABORTONCLOSE,		/* TCPAbortOnClose */
++	LINUX_MIB_TCPABORTONMEMORY,		/* TCPAbortOnMemory */
++	LINUX_MIB_TCPABORTONTIMEOUT,		/* TCPAbortOnTimeout */
++	LINUX_MIB_TCPABORTONLINGER,		/* TCPAbortOnLinger */
++	LINUX_MIB_TCPABORTFAILED,		/* TCPAbortFailed */
++	LINUX_MIB_TCPMEMORYPRESSURES,		/* TCPMemoryPressures */
++	LINUX_MIB_TCPMEMORYPRESSURESCHRONO,	/* TCPMemoryPressuresChrono */
++	LINUX_MIB_TCPSACKDISCARD,		/* TCPSACKDiscard */
++	LINUX_MIB_TCPDSACKIGNOREDOLD,		/* TCPSACKIgnoredOld */
++	LINUX_MIB_TCPDSACKIGNOREDNOUNDO,	/* TCPSACKIgnoredNoUndo */
++	LINUX_MIB_TCPSPURIOUSRTOS,		/* TCPSpuriousRTOs */
++	LINUX_MIB_TCPMD5NOTFOUND,		/* TCPMD5NotFound */
++	LINUX_MIB_TCPMD5UNEXPECTED,		/* TCPMD5Unexpected */
++	LINUX_MIB_TCPMD5FAILURE,		/* TCPMD5Failure */
++	LINUX_MIB_SACKSHIFTED,
++	LINUX_MIB_SACKMERGED,
++	LINUX_MIB_SACKSHIFTFALLBACK,
++	LINUX_MIB_TCPBACKLOGDROP,
++	LINUX_MIB_PFMEMALLOCDROP,
++	LINUX_MIB_TCPMINTTLDROP, /* RFC 5082 */
++	LINUX_MIB_TCPDEFERACCEPTDROP,
++	LINUX_MIB_IPRPFILTER, /* IP Reverse Path Filter (rp_filter) */
++	LINUX_MIB_TCPTIMEWAITOVERFLOW,		/* TCPTimeWaitOverflow */
++	LINUX_MIB_TCPREQQFULLDOCOOKIES,		/* TCPReqQFullDoCookies */
++	LINUX_MIB_TCPREQQFULLDROP,		/* TCPReqQFullDrop */
++	LINUX_MIB_TCPRETRANSFAIL,		/* TCPRetransFail */
++	LINUX_MIB_TCPRCVCOALESCE,		/* TCPRcvCoalesce */
++	LINUX_MIB_TCPOFOQUEUE,			/* TCPOFOQueue */
++	LINUX_MIB_TCPOFODROP,			/* TCPOFODrop */
++	LINUX_MIB_TCPOFOMERGE,			/* TCPOFOMerge */
++	LINUX_MIB_TCPCHALLENGEACK,		/* TCPChallengeACK */
++	LINUX_MIB_TCPSYNCHALLENGE,		/* TCPSYNChallenge */
++	LINUX_MIB_TCPFASTOPENACTIVE,		/* TCPFastOpenActive */
++	LINUX_MIB_TCPFASTOPENACTIVEFAIL,	/* TCPFastOpenActiveFail */
++	LINUX_MIB_TCPFASTOPENPASSIVE,		/* TCPFastOpenPassive*/
++	LINUX_MIB_TCPFASTOPENPASSIVEFAIL,	/* TCPFastOpenPassiveFail */
++	LINUX_MIB_TCPFASTOPENLISTENOVERFLOW,	/* TCPFastOpenListenOverflow */
++	LINUX_MIB_TCPFASTOPENCOOKIEREQD,	/* TCPFastOpenCookieReqd */
++	LINUX_MIB_TCPFASTOPENBLACKHOLE,		/* TCPFastOpenBlackholeDetect */
++	LINUX_MIB_TCPSPURIOUS_RTX_HOSTQUEUES, /* TCPSpuriousRtxHostQueues */
++	LINUX_MIB_BUSYPOLLRXPACKETS,		/* BusyPollRxPackets */
++	LINUX_MIB_TCPAUTOCORKING,		/* TCPAutoCorking */
++	LINUX_MIB_TCPFROMZEROWINDOWADV,		/* TCPFromZeroWindowAdv */
++	LINUX_MIB_TCPTOZEROWINDOWADV,		/* TCPToZeroWindowAdv */
++	LINUX_MIB_TCPWANTZEROWINDOWADV,		/* TCPWantZeroWindowAdv */
++	LINUX_MIB_TCPSYNRETRANS,		/* TCPSynRetrans */
++	LINUX_MIB_TCPORIGDATASENT,		/* TCPOrigDataSent */
++	LINUX_MIB_TCPHYSTARTTRAINDETECT,	/* TCPHystartTrainDetect */
++	LINUX_MIB_TCPHYSTARTTRAINCWND,		/* TCPHystartTrainCwnd */
++	LINUX_MIB_TCPHYSTARTDELAYDETECT,	/* TCPHystartDelayDetect */
++	LINUX_MIB_TCPHYSTARTDELAYCWND,		/* TCPHystartDelayCwnd */
++	LINUX_MIB_TCPACKSKIPPEDSYNRECV,		/* TCPACKSkippedSynRecv */
++	LINUX_MIB_TCPACKSKIPPEDPAWS,		/* TCPACKSkippedPAWS */
++	LINUX_MIB_TCPACKSKIPPEDSEQ,		/* TCPACKSkippedSeq */
++	LINUX_MIB_TCPACKSKIPPEDFINWAIT2,	/* TCPACKSkippedFinWait2 */
++	LINUX_MIB_TCPACKSKIPPEDTIMEWAIT,	/* TCPACKSkippedTimeWait */
++	LINUX_MIB_TCPACKSKIPPEDCHALLENGE,	/* TCPACKSkippedChallenge */
++	LINUX_MIB_TCPWINPROBE,			/* TCPWinProbe */
++	LINUX_MIB_TCPKEEPALIVE,			/* TCPKeepAlive */
++	LINUX_MIB_TCPMTUPFAIL,			/* TCPMTUPFail */
++	LINUX_MIB_TCPMTUPSUCCESS,		/* TCPMTUPSuccess */
++	LINUX_MIB_TCPDELIVERED,			/* TCPDelivered */
++	LINUX_MIB_TCPDELIVEREDCE,		/* TCPDeliveredCE */
++	LINUX_MIB_TCPACKCOMPRESSED,		/* TCPAckCompressed */
++	LINUX_MIB_TCPZEROWINDOWDROP,		/* TCPZeroWindowDrop */
++	LINUX_MIB_TCPRCVQDROP,			/* TCPRcvQDrop */
++	__LINUX_MIB_MAX
++};
++
++/* linux Xfrm mib definitions */
++enum
++{
++	LINUX_MIB_XFRMNUM = 0,
++	LINUX_MIB_XFRMINERROR,			/* XfrmInError */
++	LINUX_MIB_XFRMINBUFFERERROR,		/* XfrmInBufferError */
++	LINUX_MIB_XFRMINHDRERROR,		/* XfrmInHdrError */
++	LINUX_MIB_XFRMINNOSTATES,		/* XfrmInNoStates */
++	LINUX_MIB_XFRMINSTATEPROTOERROR,	/* XfrmInStateProtoError */
++	LINUX_MIB_XFRMINSTATEMODEERROR,		/* XfrmInStateModeError */
++	LINUX_MIB_XFRMINSTATESEQERROR,		/* XfrmInStateSeqError */
++	LINUX_MIB_XFRMINSTATEEXPIRED,		/* XfrmInStateExpired */
++	LINUX_MIB_XFRMINSTATEMISMATCH,		/* XfrmInStateMismatch */
++	LINUX_MIB_XFRMINSTATEINVALID,		/* XfrmInStateInvalid */
++	LINUX_MIB_XFRMINTMPLMISMATCH,		/* XfrmInTmplMismatch */
++	LINUX_MIB_XFRMINNOPOLS,			/* XfrmInNoPols */
++	LINUX_MIB_XFRMINPOLBLOCK,		/* XfrmInPolBlock */
++	LINUX_MIB_XFRMINPOLERROR,		/* XfrmInPolError */
++	LINUX_MIB_XFRMOUTERROR,			/* XfrmOutError */
++	LINUX_MIB_XFRMOUTBUNDLEGENERROR,	/* XfrmOutBundleGenError */
++	LINUX_MIB_XFRMOUTBUNDLECHECKERROR,	/* XfrmOutBundleCheckError */
++	LINUX_MIB_XFRMOUTNOSTATES,		/* XfrmOutNoStates */
++	LINUX_MIB_XFRMOUTSTATEPROTOERROR,	/* XfrmOutStateProtoError */
++	LINUX_MIB_XFRMOUTSTATEMODEERROR,	/* XfrmOutStateModeError */
++	LINUX_MIB_XFRMOUTSTATESEQERROR,		/* XfrmOutStateSeqError */
++	LINUX_MIB_XFRMOUTSTATEEXPIRED,		/* XfrmOutStateExpired */
++	LINUX_MIB_XFRMOUTPOLBLOCK,		/* XfrmOutPolBlock */
++	LINUX_MIB_XFRMOUTPOLDEAD,		/* XfrmOutPolDead */
++	LINUX_MIB_XFRMOUTPOLERROR,		/* XfrmOutPolError */
++	LINUX_MIB_XFRMFWDHDRERROR,		/* XfrmFwdHdrError*/
++	LINUX_MIB_XFRMOUTSTATEINVALID,		/* XfrmOutStateInvalid */
++	LINUX_MIB_XFRMACQUIREERROR,		/* XfrmAcquireError */
++	__LINUX_MIB_XFRMMAX
++};
++
++#endif	/* _LINUX_SNMP_H */
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0024-utils-fix-get_rtnl_link_stats_rta-stats-parsing.patch b/SOURCES/0024-utils-fix-get_rtnl_link_stats_rta-stats-parsing.patch
new file mode 100644
index 0000000..91b4ece
--- /dev/null
+++ b/SOURCES/0024-utils-fix-get_rtnl_link_stats_rta-stats-parsing.patch
@@ -0,0 +1,93 @@
+From 2e4e707b662df2cf505147ca19da94ef97b6ea25 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 18 Oct 2018 12:51:12 +0200
+Subject: [PATCH] utils: fix get_rtnl_link_stats_rta stats parsing
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1626306
+Upstream Status: iproute2.git commit c7a3b22961f52
+
+commit c7a3b22961f528760766aa85095eb1ab04a39797
+Author: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
+Date:   Wed Oct 10 17:00:58 2018 +0200
+
+    utils: fix get_rtnl_link_stats_rta stats parsing
+
+    iproute2 walks through the list of available tunnels using netlink
+    protocol in order to get device info instead of reading
+    them from proc filesystem. However the kernel reports device statistics
+    using IFLA_INET6_STATS/IFLA_INET6_ICMP6STATS attributes nested in
+    IFLA_PROTINFO one but iproutes expects these info in
+    IFLA_STATS64/IFLA_STATS attributes.
+    The issue can be triggered with the following reproducer:
+
+    $ip link add ip6d0 type ip6tnl mode ip6ip6 local 1111::1 remote 2222::1
+    $ip -6 -d -s tunnel show ip6d0
+    ip6d0: ipv6/ipv6 remote 2222::1 local 1111::1 encaplimit 4 hoplimit 64
+    tclass 0x00 flowlabel 0x00000 (flowinfo 0x00000000)
+    Dump terminated
+
+    Fix the issue introducing IFLA_INET6_STATS attribute parsing
+
+    Fixes: 3e953938717f ("iptunnel/ip6tunnel: Use netlink to walk through
+    tunnels list")
+
+    Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
+---
+ lib/utils.c | 27 +++++++++++++++++++++++++++
+ 1 file changed, 27 insertions(+)
+
+diff --git a/lib/utils.c b/lib/utils.c
+index e87ecf3..7be2d6b 100644
+--- a/lib/utils.c
++++ b/lib/utils.c
+@@ -27,6 +27,7 @@
+ #include <linux/param.h>
+ #include <linux/if_arp.h>
+ #include <linux/mpls.h>
++#include <linux/snmp.h>
+ #include <time.h>
+ #include <sys/time.h>
+ #include <errno.h>
+@@ -1549,6 +1550,24 @@ static void copy_rtnl_link_stats64(struct rtnl_link_stats64 *stats64,
+ 		*a++ = *b++;
+ }
+ 
++#define IPSTATS_MIB_MAX_LEN	(__IPSTATS_MIB_MAX * sizeof(__u64))
++static void get_snmp_counters(struct rtnl_link_stats64 *stats64,
++			      struct rtattr *s)
++{
++	__u64 *mib = (__u64 *)RTA_DATA(s);
++
++	memset(stats64, 0, sizeof(*stats64));
++
++	stats64->rx_packets = mib[IPSTATS_MIB_INPKTS];
++	stats64->rx_bytes = mib[IPSTATS_MIB_INOCTETS];
++	stats64->tx_packets = mib[IPSTATS_MIB_OUTPKTS];
++	stats64->tx_bytes = mib[IPSTATS_MIB_OUTOCTETS];
++	stats64->rx_errors = mib[IPSTATS_MIB_INDISCARDS];
++	stats64->tx_errors = mib[IPSTATS_MIB_OUTDISCARDS];
++	stats64->multicast = mib[IPSTATS_MIB_INMCASTPKTS];
++	stats64->rx_frame_errors = mib[IPSTATS_MIB_CSUMERRORS];
++}
++
+ int get_rtnl_link_stats_rta(struct rtnl_link_stats64 *stats64,
+ 			    struct rtattr *tb[])
+ {
+@@ -1565,6 +1584,14 @@ int get_rtnl_link_stats_rta(struct rtnl_link_stats64 *stats64,
+ 		rta = tb[IFLA_STATS];
+ 		size = sizeof(struct rtnl_link_stats);
+ 		s = &stats;
++	} else if (tb[IFLA_PROTINFO]) {
++		struct rtattr *ptb[IPSTATS_MIB_MAX_LEN + 1];
++
++		parse_rtattr_nested(ptb, IPSTATS_MIB_MAX_LEN,
++				    tb[IFLA_PROTINFO]);
++		if (ptb[IFLA_INET6_STATS])
++			get_snmp_counters(stats64, ptb[IFLA_INET6_STATS]);
++		return sizeof(*stats64);
+ 	} else {
+ 		return -1;
+ 	}
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0025-tc-htb-Print-default-value-in-hex.patch b/SOURCES/0025-tc-htb-Print-default-value-in-hex.patch
new file mode 100644
index 0000000..7e9fc45
--- /dev/null
+++ b/SOURCES/0025-tc-htb-Print-default-value-in-hex.patch
@@ -0,0 +1,43 @@
+From 3e679f946a6313983ca544a28ce0ccf0072962e5 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 25 Oct 2018 12:22:23 +0200
+Subject: [PATCH] tc: htb: Print default value in hex
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1641053
+Upstream Status: iproute2.git commit 737b8258b35f4
+
+commit 737b8258b35f4cc643a8153fdf955bfa0adec30f
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Tue Oct 23 12:36:24 2018 +0200
+
+    tc: htb: Print default value in hex
+
+    Value of 'default' is assumed to be hexadecimal when parsing, so
+    consequently it should be printed in hex as well. This is a regression
+    introduced when adding JSON output.
+
+    As requested, also change JSON output to print the value as hex string.
+
+    Fixes: f354fa6aa5ff0 ("tc: jsonify htb qdisc")
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ tc/q_htb.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tc/q_htb.c b/tc/q_htb.c
+index b93d31d..cce9ebc 100644
+--- a/tc/q_htb.c
++++ b/tc/q_htb.c
+@@ -341,7 +341,7 @@ static int htb_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
+ 		if (RTA_PAYLOAD(tb[TCA_HTB_INIT])  < sizeof(*gopt)) return -1;
+ 
+ 		print_int(PRINT_ANY, "r2q", "r2q %d", gopt->rate2quantum);
+-		print_uint(PRINT_ANY, "default", " default %u", gopt->defcls);
++		print_0xhex(PRINT_ANY, "default", " default %x", gopt->defcls);
+ 		print_uint(PRINT_ANY, "direct_packets_stat",
+ 			   " direct_packets_stat %u", gopt->direct_pkts);
+ 		if (show_details) {
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0026-libnetlink-fix-leak-and-using-unused-memory-on-error.patch b/SOURCES/0026-libnetlink-fix-leak-and-using-unused-memory-on-error.patch
new file mode 100644
index 0000000..9e355d1
--- /dev/null
+++ b/SOURCES/0026-libnetlink-fix-leak-and-using-unused-memory-on-error.patch
@@ -0,0 +1,81 @@
+From 3ec32595e21849de3165d52e1af48ca3bdf51fab Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 25 Oct 2018 12:24:30 +0200
+Subject: [PATCH] libnetlink: fix leak and using unused memory on error
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1602555
+Upstream Status: iproute2.git commit c60389e4f9ea8
+
+commit c60389e4f9ea88d7246dbb148d28791d577fe5b4
+Author: Stephen Hemminger <stephen@networkplumber.org>
+Date:   Thu Sep 13 12:33:38 2018 -0700
+
+    libnetlink: fix leak and using unused memory on error
+
+    If an error happens in multi-segment message (tc only)
+    then report the error and stop processing further responses.
+    This also fixes refering to the buffer after free.
+
+    The sequence check is not necessary here because the
+    response message has already been validated to be in
+    the window of the sequence number of the iov.
+
+    Reported-by: Mahesh Bandewar <mahesh@bandewar.net>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+    Acked-by: Mahesh Bandewar <maheshb@google.com>
+---
+ lib/libnetlink.c | 23 +++++++++--------------
+ 1 file changed, 9 insertions(+), 14 deletions(-)
+
+diff --git a/lib/libnetlink.c b/lib/libnetlink.c
+index 928de1d..5868092 100644
+--- a/lib/libnetlink.c
++++ b/lib/libnetlink.c
+@@ -617,7 +617,6 @@ static int __rtnl_talk_iov(struct rtnl_handle *rtnl, struct iovec *iov,
+ 	msg.msg_iovlen = 1;
+ 	i = 0;
+ 	while (1) {
+-next:
+ 		status = rtnl_recvmsg(rtnl->fd, &msg, &buf);
+ 		++i;
+ 
+@@ -660,27 +659,23 @@ next:
+ 
+ 				if (l < sizeof(struct nlmsgerr)) {
+ 					fprintf(stderr, "ERROR truncated\n");
+-				} else if (!err->error) {
++					free(buf);
++					return -1;
++				}
++
++				if (!err->error)
+ 					/* check messages from kernel */
+ 					nl_dump_ext_ack(h, errfn);
+ 
+-					if (answer)
+-						*answer = (struct nlmsghdr *)buf;
+-					else
+-						free(buf);
+-					if (h->nlmsg_seq == seq)
+-						return 0;
+-					else if (i < iovlen)
+-						goto next;
+-					return 0;
+-				}
+-
+ 				if (rtnl->proto != NETLINK_SOCK_DIAG &&
+ 				    show_rtnl_err)
+ 					rtnl_talk_error(h, err, errfn);
+ 
+ 				errno = -err->error;
+-				free(buf);
++				if (answer)
++					*answer = (struct nlmsghdr *)buf;
++				else
++					free(buf);
+ 				return -i;
+ 			}
+ 
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0027-libnetlink-don-t-return-error-on-success.patch b/SOURCES/0027-libnetlink-don-t-return-error-on-success.patch
new file mode 100644
index 0000000..99bb226
--- /dev/null
+++ b/SOURCES/0027-libnetlink-don-t-return-error-on-success.patch
@@ -0,0 +1,56 @@
+From 0a9e18d65228376c332d7ec0f87a19b8042e8a43 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 25 Oct 2018 12:24:30 +0200
+Subject: [PATCH] libnetlink: don't return error on success
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1602555
+Upstream Status: iproute2.git commit b45e300024bb0
+
+commit b45e300024bb0936a41821ad75117dc08b65669f
+Author: Stephen Hemminger <stephen@networkplumber.org>
+Date:   Tue Sep 25 10:08:48 2018 +0200
+
+    libnetlink: don't return error on success
+
+    Change to error handling broke normal code.
+
+    Fixes: c60389e4f9ea ("libnetlink: fix leak and using unused memory on error")
+    Reported-by: David Ahern <dsahern@gmail.com>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ lib/libnetlink.c | 13 ++++++++-----
+ 1 file changed, 8 insertions(+), 5 deletions(-)
+
+diff --git a/lib/libnetlink.c b/lib/libnetlink.c
+index 5868092..f18dcea 100644
+--- a/lib/libnetlink.c
++++ b/lib/libnetlink.c
+@@ -666,17 +666,20 @@ static int __rtnl_talk_iov(struct rtnl_handle *rtnl, struct iovec *iov,
+ 				if (!err->error)
+ 					/* check messages from kernel */
+ 					nl_dump_ext_ack(h, errfn);
++				else {
++					errno = -err->error;
+ 
+-				if (rtnl->proto != NETLINK_SOCK_DIAG &&
+-				    show_rtnl_err)
+-					rtnl_talk_error(h, err, errfn);
++					if (rtnl->proto != NETLINK_SOCK_DIAG &&
++					    show_rtnl_err)
++						rtnl_talk_error(h, err, errfn);
++				}
+ 
+-				errno = -err->error;
+ 				if (answer)
+ 					*answer = (struct nlmsghdr *)buf;
+ 				else
+ 					free(buf);
+-				return -i;
++
++				return err->error ? -i : 0;
+ 			}
+ 
+ 			if (answer) {
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0028-libnetlink-fix-use-after-free-of-message-buf.patch b/SOURCES/0028-libnetlink-fix-use-after-free-of-message-buf.patch
new file mode 100644
index 0000000..48beb77
--- /dev/null
+++ b/SOURCES/0028-libnetlink-fix-use-after-free-of-message-buf.patch
@@ -0,0 +1,53 @@
+From e7c11266309ffa65143455ceefc17fe92d93511c Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 25 Oct 2018 12:24:30 +0200
+Subject: [PATCH] libnetlink: fix use-after-free of message buf
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1602555
+Upstream Status: iproute2.git commit 8c50b728b226f
+
+commit 8c50b728b226f6254251282697ce38a72639a6fc
+Author: Vlad Buslov <vladbu@mellanox.com>
+Date:   Mon Oct 8 23:52:26 2018 +0300
+
+    libnetlink: fix use-after-free of message buf
+
+    In __rtnl_talk_iov() main loop, err is a pointer to memory in dynamically
+    allocated 'buf' that is used to store netlink messages. If netlink message
+    is an error message, buf is deallocated before returning with error code.
+    However, on return err->error code is checked one more time to generate
+    return value, after memory which err points to has already been
+    freed. Save error code in temporary variable and use the variable to
+    generate return value.
+
+    Fixes: c60389e4f9ea ("libnetlink: fix leak and using unused memory on error")
+    Signed-off-by: Vlad Buslov <vladbu@mellanox.com>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ lib/libnetlink.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/lib/libnetlink.c b/lib/libnetlink.c
+index f18dcea..a9932d4 100644
+--- a/lib/libnetlink.c
++++ b/lib/libnetlink.c
+@@ -656,6 +656,7 @@ static int __rtnl_talk_iov(struct rtnl_handle *rtnl, struct iovec *iov,
+ 
+ 			if (h->nlmsg_type == NLMSG_ERROR) {
+ 				struct nlmsgerr *err = (struct nlmsgerr *)NLMSG_DATA(h);
++				int error = err->error;
+ 
+ 				if (l < sizeof(struct nlmsgerr)) {
+ 					fprintf(stderr, "ERROR truncated\n");
+@@ -679,7 +680,7 @@ static int __rtnl_talk_iov(struct rtnl_handle *rtnl, struct iovec *iov,
+ 				else
+ 					free(buf);
+ 
+-				return err->error ? -i : 0;
++				return error ? -i : 0;
+ 			}
+ 
+ 			if (answer) {
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0029-devlink-Fix-error-reporting-in-cmd_resource_set.patch b/SOURCES/0029-devlink-Fix-error-reporting-in-cmd_resource_set.patch
new file mode 100644
index 0000000..ac59479
--- /dev/null
+++ b/SOURCES/0029-devlink-Fix-error-reporting-in-cmd_resource_set.patch
@@ -0,0 +1,41 @@
+From 8193c9eaecd5a9a5237424081c109df0d27770fd Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 25 Oct 2018 12:24:30 +0200
+Subject: [PATCH] devlink: Fix error reporting in cmd_resource_set()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1602555
+Upstream Status: iproute2.git commit b1ffc1f465928
+
+commit b1ffc1f465928706e22d585932cead8d74f021de
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Oct 18 13:28:23 2018 +0200
+
+    devlink: Fix error reporting in cmd_resource_set()
+
+    resource_path_parse() returns either zero or a negative error code,
+    hence the negated value must be passed to strerror().
+
+    Fixes: 8cd644095842a ("devlink: Add support for devlink resource abstraction")
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Acked-by: Jiri Pirko <jiri@mellanox.com>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ devlink/devlink.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/devlink/devlink.c b/devlink/devlink.c
+index 1142d16..7a5aef8 100644
+--- a/devlink/devlink.c
++++ b/devlink/devlink.c
+@@ -4457,7 +4457,7 @@ static int cmd_resource_set(struct dl *dl)
+ 				  &dl->opts.resource_id,
+ 				  &dl->opts.resource_id_valid);
+ 	if (err) {
+-		pr_err("error parsing resource path %s\n", strerror(err));
++		pr_err("error parsing resource path %s\n", strerror(-err));
+ 		goto out;
+ 	}
+ 
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0030-rdma-Fix-for-ineffective-check-in-add_filter.patch b/SOURCES/0030-rdma-Fix-for-ineffective-check-in-add_filter.patch
new file mode 100644
index 0000000..38b4687
--- /dev/null
+++ b/SOURCES/0030-rdma-Fix-for-ineffective-check-in-add_filter.patch
@@ -0,0 +1,42 @@
+From ad7f7e4a1fd4e0362a6d256c0d093d43b44e2c1d Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 25 Oct 2018 12:24:30 +0200
+Subject: [PATCH] rdma: Fix for ineffective check in add_filter()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1602555
+Upstream Status: iproute2.git commit 3b0070f6b1a31
+
+commit 3b0070f6b1a319b7d6a431a39270a4804cb5927e
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Oct 18 13:41:54 2018 +0200
+
+    rdma: Fix for ineffective check in add_filter()
+
+    With 'name' field defined as array in struct filters, it will always
+    contain a value irrespective of whether a name was assigned or not.
+
+    Fix this by turning the field into a const char pointer.
+
+    Fixes: 1174be72d1b4c ("rdma: Add filtering infrastructure")
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ rdma/rdma.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/rdma/rdma.h b/rdma/rdma.h
+index d4b7ba1..c3b7530 100644
+--- a/rdma/rdma.h
++++ b/rdma/rdma.h
+@@ -34,7 +34,7 @@
+ 
+ #define MAX_NUMBER_OF_FILTERS 64
+ struct filters {
+-	char name[32];
++	const char *name;
+ 	bool is_number;
+ };
+ 
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0031-ip-route-Fix-for-memleak-in-error-path.patch b/SOURCES/0031-ip-route-Fix-for-memleak-in-error-path.patch
new file mode 100644
index 0000000..9d3eea5
--- /dev/null
+++ b/SOURCES/0031-ip-route-Fix-for-memleak-in-error-path.patch
@@ -0,0 +1,65 @@
+From 0c762f107e6a5f6c56c42c0aba48f6aa9c6f1eef Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 25 Oct 2018 12:24:30 +0200
+Subject: [PATCH] ip-route: Fix for memleak in error path
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1602555
+Upstream Status: iproute2.git commit e5da392ff8e39
+
+commit e5da392ff8e3979b86cad04b238ffbbc8076e005
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Oct 18 14:30:31 2018 +0200
+
+    ip-route: Fix for memleak in error path
+
+    If call to rta_addattr_l() failed, parse_encap_seg6() would leak memory.
+    Fix this by making sure calls to free() are not skipped.
+
+    Fixes: bd59e5b1517b0 ("ip-route: Fix segfault with many nexthops")
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ ip/iproute_lwtunnel.c | 16 ++++++++++------
+ 1 file changed, 10 insertions(+), 6 deletions(-)
+
+diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c
+index 969a476..85045d4 100644
+--- a/ip/iproute_lwtunnel.c
++++ b/ip/iproute_lwtunnel.c
+@@ -498,6 +498,7 @@ static int parse_encap_seg6(struct rtattr *rta, size_t len, int *argcp,
+ 	int argc = *argcp;
+ 	int encap = -1;
+ 	__u32 hmac = 0;
++	int ret = 0;
+ 	int srhlen;
+ 
+ 	while (argc > 0) {
+@@ -539,16 +540,19 @@ static int parse_encap_seg6(struct rtattr *rta, size_t len, int *argcp,
+ 	memcpy(tuninfo->srh, srh, srhlen);
+ 
+ 	if (rta_addattr_l(rta, len, SEG6_IPTUNNEL_SRH, tuninfo,
+-			  sizeof(*tuninfo) + srhlen))
+-		return -1;
+-
+-	free(tuninfo);
+-	free(srh);
++			  sizeof(*tuninfo) + srhlen)) {
++		ret = -1;
++		goto out;
++	}
+ 
+ 	*argcp = argc + 1;
+ 	*argvp = argv - 1;
+ 
+-	return 0;
++out:
++	free(tuninfo);
++	free(srh);
++
++	return ret;
+ }
+ 
+ struct lwt_x {
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0032-rdma-Don-t-pass-garbage-to-rd_check_is_filtered.patch b/SOURCES/0032-rdma-Don-t-pass-garbage-to-rd_check_is_filtered.patch
new file mode 100644
index 0000000..090b370
--- /dev/null
+++ b/SOURCES/0032-rdma-Don-t-pass-garbage-to-rd_check_is_filtered.patch
@@ -0,0 +1,59 @@
+From 97d754cf27798bc19ccdf8ce6d6b5b878e4d2c25 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 25 Oct 2018 12:24:30 +0200
+Subject: [PATCH] rdma: Don't pass garbage to rd_check_is_filtered()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1602555
+Upstream Status: iproute2.git commit cdefe1d8e472f
+
+commit cdefe1d8e472f3a69d5f54d90092b9b50961bf91
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Oct 18 14:35:50 2018 +0200
+
+    rdma: Don't pass garbage to rd_check_is_filtered()
+
+    Variables 'src_port' and 'dst_port' are initialized only if attributes
+    RDMA_NLDEV_ATTR_RES_SRC_ADDR or RDMA_NLDEV_ATTR_RES_DST_ADDR are
+    present. Make sure to pass them over to rd_check_is_filtered() only if
+    that is the case.
+
+    Fixes: 9a362cc71a455 ("rdma: Add CM_ID resource tracking information")
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ rdma/res.c | 10 ++++------
+ 1 file changed, 4 insertions(+), 6 deletions(-)
+
+diff --git a/rdma/res.c b/rdma/res.c
+index 074b992..0d8c1c3 100644
+--- a/rdma/res.c
++++ b/rdma/res.c
+@@ -621,6 +621,8 @@ static int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data)
+ 			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]) {
+@@ -630,14 +632,10 @@ static int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data)
+ 			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 (rd_check_is_filtered(rd, "src-port", src_port))
+-			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]);
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0033-ip-route-Fix-parse_encap_seg6-srh-parsing.patch b/SOURCES/0033-ip-route-Fix-parse_encap_seg6-srh-parsing.patch
new file mode 100644
index 0000000..b30a47a
--- /dev/null
+++ b/SOURCES/0033-ip-route-Fix-parse_encap_seg6-srh-parsing.patch
@@ -0,0 +1,41 @@
+From ffe33dd788af80a6645ab62b1df8e8f215b8902a Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 25 Oct 2018 12:24:30 +0200
+Subject: [PATCH] ip-route: Fix parse_encap_seg6() srh parsing
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1602555
+Upstream Status: iproute2.git commit 3b5c5ef0a75a9
+
+commit 3b5c5ef0a75a9f685e78cd25da78706b5077bd83
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Oct 18 15:44:14 2018 +0200
+
+    ip-route: Fix parse_encap_seg6() srh parsing
+
+    In case caller did not specify 'segs' parameter, parse_srh() would read
+    garbage while iterating over 'segbuf'. Avoid this by initializing
+    'segbuf' to an empty string.
+
+    Fixes: e8493916a8ede ("iproute: add support for SR-IPv6 lwtunnel encapsulation")
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ 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 85045d4..4ebfaa7 100644
+--- a/ip/iproute_lwtunnel.c
++++ b/ip/iproute_lwtunnel.c
+@@ -494,7 +494,7 @@ static int parse_encap_seg6(struct rtattr *rta, size_t len, int *argcp,
+ 	struct seg6_iptunnel_encap *tuninfo;
+ 	struct ipv6_sr_hdr *srh;
+ 	char **argv = *argvp;
+-	char segbuf[1024];
++	char segbuf[1024] = "";
+ 	int argc = *argcp;
+ 	int encap = -1;
+ 	__u32 hmac = 0;
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0034-tipc-Drop-unused-variable-genl.patch b/SOURCES/0034-tipc-Drop-unused-variable-genl.patch
new file mode 100644
index 0000000..78713c4
--- /dev/null
+++ b/SOURCES/0034-tipc-Drop-unused-variable-genl.patch
@@ -0,0 +1,76 @@
+From 03b579ec713d0a1062b16d0eab64d3189f6e325a Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 25 Oct 2018 12:24:30 +0200
+Subject: [PATCH] tipc: Drop unused variable 'genl'
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1602555
+Upstream Status: iproute2.git commit 8d05f33a381a2
+
+commit 8d05f33a381a22572341204c667aafca02aabcca
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Oct 18 15:48:09 2018 +0200
+
+    tipc: Drop unused variable 'genl'
+
+    Although initialized by call to libmnl, the variable is used only in a
+    call to sizeof(). Drop it and call sizeof with its type instead.
+
+    Fixes: f043759dd4928 ("tipc: add new TIPC configuration tool")
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ tipc/node.c | 9 +++------
+ 1 file changed, 3 insertions(+), 6 deletions(-)
+
+diff --git a/tipc/node.c b/tipc/node.c
+index 0fa1064..2fec675 100644
+--- a/tipc/node.c
++++ b/tipc/node.c
+@@ -26,13 +26,12 @@
+ 
+ static int node_list_cb(const struct nlmsghdr *nlh, void *data)
+ {
+-	struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
+ 	struct nlattr *info[TIPC_NLA_MAX + 1] = {};
+ 	struct nlattr *attrs[TIPC_NLA_NODE_MAX + 1] = {};
+ 	char str[33] = {};
+ 	uint32_t addr;
+ 
+-	mnl_attr_parse(nlh, sizeof(*genl), parse_attrs, info);
++	mnl_attr_parse(nlh, sizeof(struct genlmsghdr), parse_attrs, info);
+ 	if (!info[TIPC_NLA_NODE])
+ 		return MNL_CB_ERROR;
+ 
+@@ -160,7 +159,6 @@ static int cmd_node_set_nodeid(struct nlmsghdr *nlh, const struct cmd *cmd,
+ 
+ static int nodeid_get_cb(const struct nlmsghdr *nlh, void *data)
+ {
+-	struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
+ 	struct nlattr *info[TIPC_NLA_MAX + 1] = {};
+ 	struct nlattr *attrs[TIPC_NLA_NET_MAX + 1] = {};
+ 	char str[33] = {0,};
+@@ -168,7 +166,7 @@ static int nodeid_get_cb(const struct nlmsghdr *nlh, void *data)
+ 	uint64_t *w0 = (uint64_t *) &id[0];
+ 	uint64_t *w1 = (uint64_t *) &id[8];
+ 
+-	mnl_attr_parse(nlh, sizeof(*genl), parse_attrs, info);
++	mnl_attr_parse(nlh, sizeof(struct genlmsghdr), parse_attrs, info);
+ 	if (!info[TIPC_NLA_NET])
+ 		return MNL_CB_ERROR;
+ 
+@@ -207,11 +205,10 @@ static int cmd_node_get_nodeid(struct nlmsghdr *nlh, const struct cmd *cmd,
+ 
+ static int netid_get_cb(const struct nlmsghdr *nlh, void *data)
+ {
+-	struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
+ 	struct nlattr *info[TIPC_NLA_MAX + 1] = {};
+ 	struct nlattr *attrs[TIPC_NLA_NET_MAX + 1] = {};
+ 
+-	mnl_attr_parse(nlh, sizeof(*genl), parse_attrs, info);
++	mnl_attr_parse(nlh, sizeof(struct genlmsghdr), parse_attrs, info);
+ 	if (!info[TIPC_NLA_NET])
+ 		return MNL_CB_ERROR;
+ 
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0035-tc-Remove-pointless-assignments-in-batch.patch b/SOURCES/0035-tc-Remove-pointless-assignments-in-batch.patch
new file mode 100644
index 0000000..b352d2e
--- /dev/null
+++ b/SOURCES/0035-tc-Remove-pointless-assignments-in-batch.patch
@@ -0,0 +1,60 @@
+From 0b59d9f255a9b1c366fe5da3206d5089167277d4 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 25 Oct 2018 12:24:30 +0200
+Subject: [PATCH] tc: Remove pointless assignments in batch()
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1602555
+Upstream Status: iproute2.git commit 6358bbc381c6e
+
+commit 6358bbc381c6e38465838370bcbbdeb77ec3565a
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Thu Oct 18 15:48:48 2018 +0200
+
+    tc: Remove pointless assignments in batch()
+
+    All these assignments are later overwritten without reading in between,
+    so just drop them.
+
+    Fixes: 485d0c6001c4a ("tc: Add batchsize feature for filter and actions")
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ tc/tc.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/tc/tc.c b/tc/tc.c
+index 2e97f2b..88e22ba 100644
+--- a/tc/tc.c
++++ b/tc/tc.c
+@@ -322,11 +322,11 @@ static int batch(const char *name)
+ 	struct batch_buf *head = NULL, *tail = NULL, *buf_pool = NULL;
+ 	char *largv[100], *largv_next[100];
+ 	char *line, *line_next = NULL;
+-	bool bs_enabled_next = false;
+ 	bool bs_enabled = false;
+ 	bool lastline = false;
+ 	int largc, largc_next;
+ 	bool bs_enabled_saved;
++	bool bs_enabled_next;
+ 	int batchsize = 0;
+ 	size_t len = 0;
+ 	int ret = 0;
+@@ -355,7 +355,6 @@ static int batch(const char *name)
+ 		goto Exit;
+ 	largc = makeargs(line, largv, 100);
+ 	bs_enabled = batchsize_enabled(largc, largv);
+-	bs_enabled_saved = bs_enabled;
+ 	do {
+ 		if (getcmdline(&line_next, &len, stdin) == -1)
+ 			lastline = true;
+@@ -391,7 +390,6 @@ static int batch(const char *name)
+ 		len = 0;
+ 		bs_enabled_saved = bs_enabled;
+ 		bs_enabled = bs_enabled_next;
+-		bs_enabled_next = false;
+ 
+ 		if (largc == 0) {
+ 			largc = largc_next;
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0036-tc_util-Add-support-for-showing-TCA_STATS_BASIC_HW-s.patch b/SOURCES/0036-tc_util-Add-support-for-showing-TCA_STATS_BASIC_HW-s.patch
new file mode 100644
index 0000000..75d7d0c
--- /dev/null
+++ b/SOURCES/0036-tc_util-Add-support-for-showing-TCA_STATS_BASIC_HW-s.patch
@@ -0,0 +1,103 @@
+From 1610b7b240601085ea42848e8d86469a091e560c Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 25 Oct 2018 17:01:52 +0200
+Subject: [PATCH] tc_util: Add support for showing TCA_STATS_BASIC_HW
+ statistics
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1637440
+Upstream Status: iproute2.git commit 5ac138324e31c
+
+commit 5ac138324e31c75edc65c69cedcf699fb624c113
+Author: Eelco Chaudron <echaudro@redhat.com>
+Date:   Tue Oct 2 03:27:18 2018 -0400
+
+    tc_util: Add support for showing TCA_STATS_BASIC_HW statistics
+
+    Add support for showing hardware specific counters to easy
+    troubleshooting hardware offload.
+
+    $ tc -s filter show dev enp3s0np0 parent ffff:
+    filter protocol ip pref 1 flower chain 0
+    filter protocol ip pref 1 flower chain 0 handle 0x1
+      eth_type ipv4
+      dst_ip 2.0.0.0
+      src_ip 1.0.0.0
+      ip_flags nofrag
+      in_hw
+            action order 1: mirred (Egress Redirect to device eth1) stolen
+            index 1 ref 1 bind 1 installed 0 sec used 0 sec
+            Action statistics:
+            Sent 534884742 bytes 8915697 pkt (dropped 0, overlimits 0 requeues 0)
+            Sent software 187542 bytes 4077 pkt
+            Sent hardware 534697200 bytes 8911620 pkt
+            backlog 0b 0p requeues 0
+            cookie 89173e6a44447001becfd486bda17e29
+
+    Signed-off-by: Eelco Chaudron <echaudro@redhat.com>
+    Signed-off-by: David Ahern <dsahern@gmail.com>
+---
+ tc/tc_util.c | 41 +++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 41 insertions(+)
+
+diff --git a/tc/tc_util.c b/tc/tc_util.c
+index d757852..5a1bbf2 100644
+--- a/tc/tc_util.c
++++ b/tc/tc_util.c
+@@ -800,6 +800,44 @@ void print_tm(FILE *f, const struct tcf_t *tm)
+ 	}
+ }
+ 
++static void print_tcstats_basic_hw(struct rtattr **tbs, char *prefix)
++{
++	struct gnet_stats_basic bs_hw;
++
++	if (!tbs[TCA_STATS_BASIC_HW])
++		return;
++
++	memcpy(&bs_hw, RTA_DATA(tbs[TCA_STATS_BASIC_HW]),
++	       MIN(RTA_PAYLOAD(tbs[TCA_STATS_BASIC_HW]), sizeof(bs_hw)));
++
++	if (bs_hw.bytes == 0 && bs_hw.packets == 0)
++		return;
++
++	if (tbs[TCA_STATS_BASIC]) {
++		struct gnet_stats_basic bs;
++
++		memcpy(&bs, RTA_DATA(tbs[TCA_STATS_BASIC]),
++		       MIN(RTA_PAYLOAD(tbs[TCA_STATS_BASIC]),
++			   sizeof(bs)));
++
++		if (bs.bytes >= bs_hw.bytes && bs.packets >= bs_hw.packets) {
++			print_string(PRINT_FP, NULL, "%s", _SL_);
++			print_string(PRINT_FP, NULL, "%s", prefix);
++			print_lluint(PRINT_ANY, "sw_bytes",
++				     "Sent software %llu bytes",
++				     bs.bytes - bs_hw.bytes);
++			print_uint(PRINT_ANY, "sw_packets", " %u pkt",
++				   bs.packets - bs_hw.packets);
++		}
++	}
++
++	print_string(PRINT_FP, NULL, "%s", _SL_);
++	print_string(PRINT_FP, NULL, "%s", prefix);
++	print_lluint(PRINT_ANY, "hw_bytes", "Sent hardware %llu bytes",
++		     bs_hw.bytes);
++	print_uint(PRINT_ANY, "hw_packets", " %u pkt", bs_hw.packets);
++}
++
+ void print_tcstats2_attr(FILE *fp, struct rtattr *rta, char *prefix, struct rtattr **xstats)
+ {
+ 	SPRINT_BUF(b1);
+@@ -826,6 +864,9 @@ void print_tcstats2_attr(FILE *fp, struct rtattr *rta, char *prefix, struct rtat
+ 		print_uint(PRINT_ANY, "requeues", " requeues %u) ", q.requeues);
+ 	}
+ 
++	if (tbs[TCA_STATS_BASIC_HW])
++		print_tcstats_basic_hw(tbs, prefix);
++
+ 	if (tbs[TCA_STATS_RATE_EST64]) {
+ 		struct gnet_stats_rate_est64 re = {0};
+ 
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0037-Update-kernel-headers.patch b/SOURCES/0037-Update-kernel-headers.patch
new file mode 100644
index 0000000..783e937
--- /dev/null
+++ b/SOURCES/0037-Update-kernel-headers.patch
@@ -0,0 +1,664 @@
+From 94b44c8f431c8d159fee6c067aded7b9c4e71104 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 25 Oct 2018 17:00:00 +0200
+Subject: [PATCH] Update kernel headers
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1637440
+Upstream Status: RHEL-only
+
+This updates include/uapi/linux to the state of upstream commit
+d9c0be4e9795473a73793058674c34d56cdb5eea.
+---
+ include/uapi/linux/bpf.h       | 121 ++++++++++++++++++++++++++++++++++++++++-
+ include/uapi/linux/btf.h       |   2 +-
+ include/uapi/linux/can.h       |   2 +-
+ include/uapi/linux/gen_stats.h |   1 +
+ include/uapi/linux/if_addr.h   |   1 +
+ include/uapi/linux/if_arp.h    |  18 +++---
+ include/uapi/linux/if_link.h   |  15 +++++
+ include/uapi/linux/if_packet.h |   1 +
+ include/uapi/linux/in6.h       |   1 +
+ include/uapi/linux/ip.h        |   1 +
+ include/uapi/linux/l2tp.h      |  15 ++---
+ include/uapi/linux/neighbour.h |   1 +
+ include/uapi/linux/netconf.h   |   1 +
+ include/uapi/linux/pkt_cls.h   |  34 +++++++++++-
+ include/uapi/linux/pkt_sched.h |  21 ++++++-
+ include/uapi/linux/rtnetlink.h |   7 +++
+ include/uapi/linux/tcp.h       |  14 ++++-
+ include/uapi/linux/xfrm.h      |   5 +-
+ 18 files changed, 235 insertions(+), 26 deletions(-)
+
+diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
+index b9a6367..abb7f77 100644
+--- a/include/uapi/linux/bpf.h
++++ b/include/uapi/linux/bpf.h
+@@ -75,6 +75,11 @@ struct bpf_lpm_trie_key {
+ 	__u8	data[0];	/* Arbitrary size */
+ };
+ 
++struct bpf_cgroup_storage_key {
++	__u64	cgroup_inode_id;	/* cgroup inode id */
++	__u32	attach_type;		/* program attach type */
++};
++
+ /* BPF syscall commands, see bpf(2) man-page for details. */
+ enum bpf_cmd {
+ 	BPF_MAP_CREATE,
+@@ -120,6 +125,8 @@ enum bpf_map_type {
+ 	BPF_MAP_TYPE_CPUMAP,
+ 	BPF_MAP_TYPE_XSKMAP,
+ 	BPF_MAP_TYPE_SOCKHASH,
++	BPF_MAP_TYPE_CGROUP_STORAGE,
++	BPF_MAP_TYPE_REUSEPORT_SOCKARRAY,
+ };
+ 
+ enum bpf_prog_type {
+@@ -144,6 +151,8 @@ enum bpf_prog_type {
+ 	BPF_PROG_TYPE_CGROUP_SOCK_ADDR,
+ 	BPF_PROG_TYPE_LWT_SEG6LOCAL,
+ 	BPF_PROG_TYPE_LIRC_MODE2,
++	BPF_PROG_TYPE_SK_REUSEPORT,
++	BPF_PROG_TYPE_FLOW_DISSECTOR,
+ };
+ 
+ enum bpf_attach_type {
+@@ -164,6 +173,7 @@ enum bpf_attach_type {
+ 	BPF_CGROUP_UDP4_SENDMSG,
+ 	BPF_CGROUP_UDP6_SENDMSG,
+ 	BPF_LIRC_MODE2,
++	BPF_FLOW_DISSECTOR,
+ 	__MAX_BPF_ATTACH_TYPE
+ };
+ 
+@@ -1371,6 +1381,20 @@ union bpf_attr {
+  * 		A 8-byte long non-decreasing number on success, or 0 if the
+  * 		socket field is missing inside *skb*.
+  *
++ * u64 bpf_get_socket_cookie(struct bpf_sock_addr *ctx)
++ * 	Description
++ * 		Equivalent to bpf_get_socket_cookie() helper that accepts
++ * 		*skb*, but gets socket from **struct bpf_sock_addr** contex.
++ * 	Return
++ * 		A 8-byte long non-decreasing number.
++ *
++ * u64 bpf_get_socket_cookie(struct bpf_sock_ops *ctx)
++ * 	Description
++ * 		Equivalent to bpf_get_socket_cookie() helper that accepts
++ * 		*skb*, but gets socket from **struct bpf_sock_ops** contex.
++ * 	Return
++ * 		A 8-byte long non-decreasing number.
++ *
+  * u32 bpf_get_socket_uid(struct sk_buff *skb)
+  * 	Return
+  * 		The owner UID of the socket associated to *skb*. If the socket
+@@ -2071,10 +2095,54 @@ union bpf_attr {
+  * 	Return
+  * 		The id is returned or 0 in case the id could not be retrieved.
+  *
++ * u64 bpf_skb_ancestor_cgroup_id(struct sk_buff *skb, int ancestor_level)
++ *	Description
++ *		Return id of cgroup v2 that is ancestor of cgroup associated
++ *		with the *skb* at the *ancestor_level*.  The root cgroup is at
++ *		*ancestor_level* zero and each step down the hierarchy
++ *		increments the level. If *ancestor_level* == level of cgroup
++ *		associated with *skb*, then return value will be same as that
++ *		of **bpf_skb_cgroup_id**\ ().
++ *
++ *		The helper is useful to implement policies based on cgroups
++ *		that are upper in hierarchy than immediate cgroup associated
++ *		with *skb*.
++ *
++ *		The format of returned id and helper limitations are same as in
++ *		**bpf_skb_cgroup_id**\ ().
++ *	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.
++ *
++ * void* get_local_storage(void *map, u64 flags)
++ *	Description
++ *		Get the pointer to the local storage area.
++ *		The type and the size of the local storage is defined
++ *		by the *map* argument.
++ *		The *flags* meaning is specific for each map type,
++ *		and has to be 0 for cgroup local storage.
++ *
++ *		Depending on the bpf program type, a local storage area
++ *		can be shared between multiple instances of the bpf program,
++ *		running simultaneously.
++ *
++ *		A user should care about the synchronization by himself.
++ *		For example, by using the BPF_STX_XADD instruction to alter
++ *		the shared data.
++ *	Return
++ *		Pointer to the local storage area.
++ *
++ * int bpf_sk_select_reuseport(struct sk_reuseport_md *reuse, struct bpf_map *map, void *key, u64 flags)
++ *	Description
++ *		Select a SO_REUSEPORT sk from a	BPF_MAP_TYPE_REUSEPORT_ARRAY map
++ *		It checks the selected sk is matching the incoming
++ *		request in the skb.
++ *	Return
++ *		0 on success, or a negative error in case of failure.
+  */
+ #define __BPF_FUNC_MAPPER(FN)		\
+ 	FN(unspec),			\
+@@ -2157,7 +2225,10 @@ union bpf_attr {
+ 	FN(rc_repeat),			\
+ 	FN(rc_keydown),			\
+ 	FN(skb_cgroup_id),		\
+-	FN(get_current_cgroup_id),
++	FN(get_current_cgroup_id),	\
++	FN(get_local_storage),		\
++	FN(sk_select_reuseport),	\
++	FN(skb_ancestor_cgroup_id),
+ 
+ /* integer value in 'imm' field of BPF_CALL instruction selects which helper
+  * function eBPF program intends to call
+@@ -2264,6 +2335,7 @@ struct __sk_buff {
+ 	/* ... here. */
+ 
+ 	__u32 data_meta;
++	struct bpf_flow_keys *flow_keys;
+ };
+ 
+ struct bpf_tunnel_key {
+@@ -2374,6 +2446,30 @@ struct sk_msg_md {
+ 	__u32 local_port;	/* stored in host byte order */
+ };
+ 
++struct sk_reuseport_md {
++	/*
++	 * Start of directly accessible data. It begins from
++	 * the tcp/udp header.
++	 */
++	void *data;
++	void *data_end;		/* End of directly accessible data */
++	/*
++	 * Total length of packet (starting from the tcp/udp header).
++	 * Note that the directly accessible bytes (data_end - data)
++	 * could be less than this "len".  Those bytes could be
++	 * indirectly read by a helper "bpf_skb_load_bytes()".
++	 */
++	__u32 len;
++	/*
++	 * Eth protocol in the mac header (network byte order). e.g.
++	 * ETH_P_IP(0x0800) and ETH_P_IPV6(0x86DD)
++	 */
++	__u32 eth_protocol;
++	__u32 ip_protocol;	/* IP protocol. e.g. IPPROTO_TCP, IPPROTO_UDP */
++	__u32 bind_inany;	/* Is sock bound to an INANY address? */
++	__u32 hash;		/* A hash of the packet 4 tuples */
++};
++
+ #define BPF_TAG_SIZE	8
+ 
+ struct bpf_prog_info {
+@@ -2685,4 +2781,27 @@ enum bpf_task_fd_type {
+ 	BPF_FD_TYPE_URETPROBE,		/* filename + offset */
+ };
+ 
++struct bpf_flow_keys {
++	__u16	nhoff;
++	__u16	thoff;
++	__u16	addr_proto;			/* ETH_P_* of valid addrs */
++	__u8	is_frag;
++	__u8	is_first_frag;
++	__u8	is_encap;
++	__u8	ip_proto;
++	__be16	n_proto;
++	__be16	sport;
++	__be16	dport;
++	union {
++		struct {
++			__be32	ipv4_src;
++			__be32	ipv4_dst;
++		};
++		struct {
++			__u32	ipv6_src[4];	/* in6_addr; network order */
++			__u32	ipv6_dst[4];	/* in6_addr; network order */
++		};
++	};
++};
++
+ #endif /* __LINUX_BPF_H__ */
+diff --git a/include/uapi/linux/btf.h b/include/uapi/linux/btf.h
+index 5dd580a..8d2a8ff 100644
+--- a/include/uapi/linux/btf.h
++++ b/include/uapi/linux/btf.h
+@@ -76,7 +76,7 @@ struct btf_type {
+  */
+ #define BTF_INT_ENCODING(VAL)	(((VAL) & 0x0f000000) >> 24)
+ #define BTF_INT_OFFSET(VAL)	(((VAL  & 0x00ff0000)) >> 16)
+-#define BTF_INT_BITS(VAL)	((VAL)  & 0x0000ffff)
++#define BTF_INT_BITS(VAL)	((VAL)  & 0x000000ff)
+ 
+ /* Attributes stored in the BTF_INT_ENCODING */
+ #define BTF_INT_SIGNED	(1 << 0)
+diff --git a/include/uapi/linux/can.h b/include/uapi/linux/can.h
+index 4d1ab8e..9009f0b 100644
+--- a/include/uapi/linux/can.h
++++ b/include/uapi/linux/can.h
+@@ -77,7 +77,7 @@ typedef __u32 canid_t;
+ /*
+  * Controller Area Network Error Message Frame Mask structure
+  *
+- * bit 0-28	: error class mask (see include/linux/can/error.h)
++ * bit 0-28	: error class mask (see include/uapi/linux/can/error.h)
+  * bit 29-31	: set to zero
+  */
+ typedef __u32 can_err_mask_t;
+diff --git a/include/uapi/linux/gen_stats.h b/include/uapi/linux/gen_stats.h
+index 24a861c..065408e 100644
+--- a/include/uapi/linux/gen_stats.h
++++ b/include/uapi/linux/gen_stats.h
+@@ -12,6 +12,7 @@ enum {
+ 	TCA_STATS_APP,
+ 	TCA_STATS_RATE_EST64,
+ 	TCA_STATS_PAD,
++	TCA_STATS_BASIC_HW,
+ 	__TCA_STATS_MAX,
+ };
+ #define TCA_STATS_MAX (__TCA_STATS_MAX - 1)
+diff --git a/include/uapi/linux/if_addr.h b/include/uapi/linux/if_addr.h
+index a924606..c4dd87f 100644
+--- a/include/uapi/linux/if_addr.h
++++ b/include/uapi/linux/if_addr.h
+@@ -34,6 +34,7 @@ enum {
+ 	IFA_MULTICAST,
+ 	IFA_FLAGS,
+ 	IFA_RT_PRIORITY,  /* u32, priority/metric for prefix route */
++	IFA_TARGET_NETNSID,
+ 	__IFA_MAX,
+ };
+ 
+diff --git a/include/uapi/linux/if_arp.h b/include/uapi/linux/if_arp.h
+index cd136a6..dbfbc22 100644
+--- a/include/uapi/linux/if_arp.h
++++ b/include/uapi/linux/if_arp.h
+@@ -114,18 +114,18 @@
+ 
+ /* 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 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[IFNAMSIZ];
+ };
+ 
+ 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) */
++	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. */
+diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h
+index 1c64ed4..9c25460 100644
+--- a/include/uapi/linux/if_link.h
++++ b/include/uapi/linux/if_link.h
+@@ -161,9 +161,12 @@ enum {
+ 	IFLA_EVENT,
+ 	IFLA_NEW_NETNSID,
+ 	IFLA_IF_NETNSID,
++	IFLA_TARGET_NETNSID = IFLA_IF_NETNSID, /* new alias */
+ 	IFLA_CARRIER_UP_COUNT,
+ 	IFLA_CARRIER_DOWN_COUNT,
+ 	IFLA_NEW_IFINDEX,
++	IFLA_MIN_MTU,
++	IFLA_MAX_MTU,
+ 	__IFLA_MAX
+ };
+ 
+@@ -332,6 +335,7 @@ enum {
+ 	IFLA_BRPORT_GROUP_FWD_MASK,
+ 	IFLA_BRPORT_NEIGH_SUPPRESS,
+ 	IFLA_BRPORT_ISOLATED,
++	IFLA_BRPORT_BACKUP_PORT,
+ 	__IFLA_BRPORT_MAX
+ };
+ #define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1)
+@@ -457,6 +461,16 @@ enum {
+ 
+ #define IFLA_MACSEC_MAX (__IFLA_MACSEC_MAX - 1)
+ 
++/* XFRM section */
++enum {
++	IFLA_XFRM_UNSPEC,
++	IFLA_XFRM_LINK,
++	IFLA_XFRM_IF_ID,
++	__IFLA_XFRM_MAX
++};
++
++#define IFLA_XFRM_MAX (__IFLA_XFRM_MAX - 1)
++
+ enum macsec_validation_type {
+ 	MACSEC_VALIDATE_DISABLED = 0,
+ 	MACSEC_VALIDATE_CHECK = 1,
+@@ -539,6 +553,7 @@ enum {
+ 	IFLA_GENEVE_UDP_ZERO_CSUM6_TX,
+ 	IFLA_GENEVE_UDP_ZERO_CSUM6_RX,
+ 	IFLA_GENEVE_LABEL,
++	IFLA_GENEVE_TTL_INHERIT,
+ 	__IFLA_GENEVE_MAX
+ };
+ #define IFLA_GENEVE_MAX	(__IFLA_GENEVE_MAX - 1)
+diff --git a/include/uapi/linux/if_packet.h b/include/uapi/linux/if_packet.h
+index 67b61d9..467b654 100644
+--- a/include/uapi/linux/if_packet.h
++++ b/include/uapi/linux/if_packet.h
+@@ -57,6 +57,7 @@ struct sockaddr_ll {
+ #define PACKET_QDISC_BYPASS		20
+ #define PACKET_ROLLOVER_STATS		21
+ #define PACKET_FANOUT_DATA		22
++#define PACKET_IGNORE_OUTGOING		23
+ 
+ #define PACKET_FANOUT_HASH		0
+ #define PACKET_FANOUT_LB		1
+diff --git a/include/uapi/linux/in6.h b/include/uapi/linux/in6.h
+index 409bb3f..2bb132a 100644
+--- a/include/uapi/linux/in6.h
++++ b/include/uapi/linux/in6.h
+@@ -177,6 +177,7 @@ struct in6_flowlabel_req {
+ #define IPV6_V6ONLY		26
+ #define IPV6_JOIN_ANYCAST	27
+ #define IPV6_LEAVE_ANYCAST	28
++#define IPV6_MULTICAST_ALL	29
+ 
+ /* IPV6_MTU_DISCOVER values */
+ #define IPV6_PMTUDISC_DONT		0
+diff --git a/include/uapi/linux/ip.h b/include/uapi/linux/ip.h
+index 883fd33..f4ecd2f 100644
+--- a/include/uapi/linux/ip.h
++++ b/include/uapi/linux/ip.h
+@@ -168,6 +168,7 @@ enum
+ 	IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN,
+ 	IPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST,
+ 	IPV4_DEVCONF_DROP_GRATUITOUS_ARP,
++	IPV4_DEVCONF_BC_FORWARDING,
+ 	__IPV4_DEVCONF_MAX
+ };
+ 
+diff --git a/include/uapi/linux/l2tp.h b/include/uapi/linux/l2tp.h
+index 1fe52a7..131c3a2 100644
+--- a/include/uapi/linux/l2tp.h
++++ b/include/uapi/linux/l2tp.h
+@@ -60,14 +60,14 @@ struct sockaddr_l2tpip6 {
+ /*
+  * Commands.
+  * Valid TLVs of each command are:-
+- * TUNNEL_CREATE	- CONN_ID, pw_type, netns, ifname, ipinfo, udpinfo, udpcsum, vlanid
++ * TUNNEL_CREATE	- CONN_ID, pw_type, netns, ifname, ipinfo, udpinfo, udpcsum
+  * TUNNEL_DELETE	- CONN_ID
+  * TUNNEL_MODIFY	- CONN_ID, udpcsum
+  * TUNNEL_GETSTATS	- CONN_ID, (stats)
+  * TUNNEL_GET		- CONN_ID, (...)
+- * SESSION_CREATE	- SESSION_ID, PW_TYPE, data_seq, cookie, peer_cookie, l2spec
++ * SESSION_CREATE	- SESSION_ID, PW_TYPE, cookie, peer_cookie, l2spec
+  * SESSION_DELETE	- SESSION_ID
+- * SESSION_MODIFY	- SESSION_ID, data_seq
++ * SESSION_MODIFY	- SESSION_ID
+  * SESSION_GET		- SESSION_ID, (...)
+  * SESSION_GETSTATS	- SESSION_ID, (stats)
+  *
+@@ -95,7 +95,7 @@ enum {
+ 	L2TP_ATTR_PW_TYPE,		/* u16, enum l2tp_pwtype */
+ 	L2TP_ATTR_ENCAP_TYPE,		/* u16, enum l2tp_encap_type */
+ 	L2TP_ATTR_OFFSET,		/* u16 (not used) */
+-	L2TP_ATTR_DATA_SEQ,		/* u16 */
++	L2TP_ATTR_DATA_SEQ,		/* u16 (not used) */
+ 	L2TP_ATTR_L2SPEC_TYPE,		/* u8, enum l2tp_l2spec_type */
+ 	L2TP_ATTR_L2SPEC_LEN,		/* u8 (not used) */
+ 	L2TP_ATTR_PROTO_VERSION,	/* u8 */
+@@ -105,7 +105,7 @@ enum {
+ 	L2TP_ATTR_SESSION_ID,		/* u32 */
+ 	L2TP_ATTR_PEER_SESSION_ID,	/* u32 */
+ 	L2TP_ATTR_UDP_CSUM,		/* u8 */
+-	L2TP_ATTR_VLAN_ID,		/* u16 */
++	L2TP_ATTR_VLAN_ID,		/* u16 (not used) */
+ 	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 */
+@@ -119,8 +119,8 @@ enum {
+ 	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_MTU,			/* u16 (not used) */
++	L2TP_ATTR_MRU,			/* u16 (not used) */
+ 	L2TP_ATTR_STATS,		/* nested */
+ 	L2TP_ATTR_IP6_SADDR,		/* struct in6_addr */
+ 	L2TP_ATTR_IP6_DADDR,		/* struct in6_addr */
+@@ -169,6 +169,7 @@ enum l2tp_encap_type {
+ 	L2TP_ENCAPTYPE_IP,
+ };
+ 
++/* For L2TP_ATTR_DATA_SEQ. Unused. */
+ enum l2tp_seqmode {
+ 	L2TP_SEQ_NONE = 0,
+ 	L2TP_SEQ_IP = 1,
+diff --git a/include/uapi/linux/neighbour.h b/include/uapi/linux/neighbour.h
+index 904db61..9981554 100644
+--- a/include/uapi/linux/neighbour.h
++++ b/include/uapi/linux/neighbour.h
+@@ -43,6 +43,7 @@ enum {
+ #define NTF_PROXY	0x08	/* == ATF_PUBL */
+ #define NTF_EXT_LEARNED	0x10
+ #define NTF_OFFLOADED   0x20
++#define NTF_STICKY	0x40
+ #define NTF_ROUTER	0x80
+ 
+ /*
+diff --git a/include/uapi/linux/netconf.h b/include/uapi/linux/netconf.h
+index 86ac1eb..229e885 100644
+--- a/include/uapi/linux/netconf.h
++++ b/include/uapi/linux/netconf.h
+@@ -18,6 +18,7 @@ enum {
+ 	NETCONFA_PROXY_NEIGH,
+ 	NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN,
+ 	NETCONFA_INPUT,
++	NETCONFA_BC_FORWARDING,
+ 	__NETCONFA_MAX
+ };
+ #define NETCONFA_MAX	(__NETCONFA_MAX - 1)
+diff --git a/include/uapi/linux/pkt_cls.h b/include/uapi/linux/pkt_cls.h
+index b451225..401d0c1 100644
+--- a/include/uapi/linux/pkt_cls.h
++++ b/include/uapi/linux/pkt_cls.h
+@@ -45,6 +45,7 @@ enum {
+ 				   * the skb and act like everything
+ 				   * is alright.
+ 				   */
++#define TC_ACT_VALUE_MAX	TC_ACT_TRAP
+ 
+ /* There is a special kind of actions called "extended actions",
+  * which need a value parameter. These have a local opcode located in
+@@ -55,11 +56,12 @@ enum {
+ #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_EXT_OPCODE(combined) ((combined) & (~TC_ACT_EXT_VAL_MASK))
++#define TC_ACT_EXT_CMP(combined, opcode) (TC_ACT_EXT_OPCODE(combined) == opcode)
+ 
+ #define TC_ACT_JUMP __TC_ACT_EXT(1)
+ #define TC_ACT_GOTO_CHAIN __TC_ACT_EXT(2)
++#define TC_ACT_EXT_OPCODE_MAX	TC_ACT_GOTO_CHAIN
+ 
+ /* Action type identifiers*/
+ enum {
+@@ -478,12 +480,40 @@ enum {
+ 	TCA_FLOWER_KEY_ENC_IP_TTL,	/* u8 */
+ 	TCA_FLOWER_KEY_ENC_IP_TTL_MASK,	/* u8 */
+ 
++	TCA_FLOWER_KEY_ENC_OPTS,
++	TCA_FLOWER_KEY_ENC_OPTS_MASK,
++
++	TCA_FLOWER_IN_HW_COUNT,
++
+ 	__TCA_FLOWER_MAX,
+ };
+ 
+ #define TCA_FLOWER_MAX (__TCA_FLOWER_MAX - 1)
+ 
+ enum {
++	TCA_FLOWER_KEY_ENC_OPTS_UNSPEC,
++	TCA_FLOWER_KEY_ENC_OPTS_GENEVE, /* Nested
++					 * TCA_FLOWER_KEY_ENC_OPT_GENEVE_
++					 * attributes
++					 */
++	__TCA_FLOWER_KEY_ENC_OPTS_MAX,
++};
++
++#define TCA_FLOWER_KEY_ENC_OPTS_MAX (__TCA_FLOWER_KEY_ENC_OPTS_MAX - 1)
++
++enum {
++	TCA_FLOWER_KEY_ENC_OPT_GENEVE_UNSPEC,
++	TCA_FLOWER_KEY_ENC_OPT_GENEVE_CLASS,            /* u16 */
++	TCA_FLOWER_KEY_ENC_OPT_GENEVE_TYPE,             /* u8 */
++	TCA_FLOWER_KEY_ENC_OPT_GENEVE_DATA,             /* 4 to 128 bytes */
++
++	__TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX,
++};
++
++#define TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX \
++		(__TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX - 1)
++
++enum {
+ 	TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT = (1 << 0),
+ 	TCA_FLOWER_KEY_FLAGS_FRAG_IS_FIRST = (1 << 1),
+ };
+diff --git a/include/uapi/linux/pkt_sched.h b/include/uapi/linux/pkt_sched.h
+index d9cc9dc..e9b7244 100644
+--- a/include/uapi/linux/pkt_sched.h
++++ b/include/uapi/linux/pkt_sched.h
+@@ -124,6 +124,21 @@ struct tc_fifo_qopt {
+ 	__u32	limit;	/* Queue length: bytes for bfifo, packets for pfifo */
+ };
+ 
++/* SKBPRIO section */
++
++/*
++ * Priorities go from zero to (SKBPRIO_MAX_PRIORITY - 1).
++ * SKBPRIO_MAX_PRIORITY should be at least 64 in order for skbprio to be able
++ * to map one to one the DS field of IPV4 and IPV6 headers.
++ * Memory allocation grows linearly with SKBPRIO_MAX_PRIORITY.
++ */
++
++#define SKBPRIO_MAX_PRIORITY 64
++
++struct tc_skbprio_qopt {
++	__u32	limit;		/* Queue length in packets. */
++};
++
+ /* PRIO section */
+ 
+ #define TCQ_PRIO_BANDS	16
+@@ -380,9 +395,9 @@ enum {
+ struct tc_htb_xstats {
+ 	__u32 lends;
+ 	__u32 borrows;
+-	__u32 giants;	/* too big packets (rate will not be accurate) */
+-	__u32 tokens;
+-	__u32 ctokens;
++	__u32 giants;	/* unused since 'Make HTB scheduler work with TSO.' */
++	__s32 tokens;
++	__s32 ctokens;
+ };
+ 
+ /* HFSC section */
+diff --git a/include/uapi/linux/rtnetlink.h b/include/uapi/linux/rtnetlink.h
+index c3a7d8e..8c1d600 100644
+--- a/include/uapi/linux/rtnetlink.h
++++ b/include/uapi/linux/rtnetlink.h
+@@ -150,6 +150,13 @@ enum {
+ 	RTM_NEWCACHEREPORT = 96,
+ #define RTM_NEWCACHEREPORT RTM_NEWCACHEREPORT
+ 
++	RTM_NEWCHAIN = 100,
++#define RTM_NEWCHAIN RTM_NEWCHAIN
++	RTM_DELCHAIN,
++#define RTM_DELCHAIN RTM_DELCHAIN
++	RTM_GETCHAIN,
++#define RTM_GETCHAIN RTM_GETCHAIN
++
+ 	__RTM_MAX,
+ #define RTM_MAX		(((__RTM_MAX + 3) & ~3) - 1)
+ };
+diff --git a/include/uapi/linux/tcp.h b/include/uapi/linux/tcp.h
+index 2e766cf..6ec7766 100644
+--- a/include/uapi/linux/tcp.h
++++ b/include/uapi/linux/tcp.h
+@@ -127,6 +127,10 @@ enum {
+ 
+ #define TCP_CM_INQ		TCP_INQ
+ 
++#define TCP_REPAIR_ON		1
++#define TCP_REPAIR_OFF		0
++#define TCP_REPAIR_OFF_NO_WP	-1	/* Turn off without window probes */
++
+ struct tcp_repair_opt {
+ 	__u32	opt_code;
+ 	__u32	opt_val;
+@@ -231,6 +235,11 @@ struct tcp_info {
+ 
+ 	__u32	tcpi_delivered;
+ 	__u32	tcpi_delivered_ce;
++
++	__u64	tcpi_bytes_sent;     /* RFC4898 tcpEStatsPerfHCDataOctetsOut */
++	__u64	tcpi_bytes_retrans;  /* RFC4898 tcpEStatsPerfOctetsRetrans */
++	__u32	tcpi_dsack_dups;     /* RFC4898 tcpEStatsStackDSACKDups */
++	__u32	tcpi_reord_seen;     /* reordering events seen */
+ };
+ 
+ /* netlink attributes types for SCM_TIMESTAMPING_OPT_STATS */
+@@ -253,7 +262,10 @@ enum {
+ 	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 */
+-
++	TCP_NLA_BYTES_SENT,	/* Data bytes sent including retransmission */
++	TCP_NLA_BYTES_RETRANS,	/* Data bytes retransmitted */
++	TCP_NLA_DSACK_DUPS,	/* DSACK blocks received */
++	TCP_NLA_REORD_SEEN,	/* reordering events seen */
+ };
+ 
+ /* for TCP_MD5SIG socket option */
+diff --git a/include/uapi/linux/xfrm.h b/include/uapi/linux/xfrm.h
+index 93fb192..5cdda9d 100644
+--- a/include/uapi/linux/xfrm.h
++++ b/include/uapi/linux/xfrm.h
+@@ -305,9 +305,12 @@ enum xfrm_attr_type_t {
+ 	XFRMA_ADDRESS_FILTER,	/* struct xfrm_address_filter */
+ 	XFRMA_PAD,
+ 	XFRMA_OFFLOAD_DEV,	/* struct xfrm_state_offload */
+-	XFRMA_OUTPUT_MARK,	/* __u32 */
++	XFRMA_SET_MARK,		/* __u32 */
++	XFRMA_SET_MARK_MASK,	/* __u32 */
++	XFRMA_IF_ID,		/* __u32 */
+ 	__XFRMA_MAX
+ 
++#define XFRMA_OUTPUT_MARK XFRMA_SET_MARK	/* Compatibility */
+ #define XFRMA_MAX (__XFRMA_MAX - 1)
+ };
+ 
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0038-man-ip-route.8-Document-nexthop-limit.patch b/SOURCES/0038-man-ip-route.8-Document-nexthop-limit.patch
new file mode 100644
index 0000000..8c64720
--- /dev/null
+++ b/SOURCES/0038-man-ip-route.8-Document-nexthop-limit.patch
@@ -0,0 +1,46 @@
+From b99d3fd8b5a7dd140a2b4c7a7e70aea7478634f7 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Mon, 26 Nov 2018 19:11:55 +0100
+Subject: [PATCH] man: ip-route.8: Document nexthop limit
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1625358
+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 b21a847..e464353 100644
+--- a/man/man8/ip-route.8.in
++++ b/man/man8/ip-route.8.in
+@@ -589,6 +589,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/0039-ip-route-Fix-nexthop-encap-parsing.patch b/SOURCES/0039-ip-route-Fix-nexthop-encap-parsing.patch
new file mode 100644
index 0000000..efe5f79
--- /dev/null
+++ b/SOURCES/0039-ip-route-Fix-nexthop-encap-parsing.patch
@@ -0,0 +1,101 @@
+From 06ce7afb4135de6ed92a286793cba5129f17f614 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Mon, 26 Nov 2018 19:11:55 +0100
+Subject: [PATCH] ip-route: Fix nexthop encap parsing
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1625358
+Upstream Status: iproute2.git commit 05d978e0850a6
+
+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 | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c
+index 4ebfaa7..388cd19 100644
+--- a/ip/iproute_lwtunnel.c
++++ b/ip/iproute_lwtunnel.c
+@@ -851,7 +851,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) {
+@@ -865,7 +865,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++;
+@@ -879,7 +879,7 @@ static int parse_encap_ila(struct rtattr *rta, size_t len,
+ 				invarg("\"ident-type\" value is invalid\n",
+ 				       *argv);
+ 
+-			ret = rta_addattr8(rta, 1024, ILA_ATTR_IDENT_TYPE,
++			ret = rta_addattr8(rta, len, ILA_ATTR_IDENT_TYPE,
+ 					   (__u8)ident_type);
+ 
+ 			argc--; argv++;
+@@ -893,7 +893,7 @@ static int parse_encap_ila(struct rtattr *rta, size_t len,
+ 				invarg("\"hook-type\" value is invalid\n",
+ 				       *argv);
+ 
+-			ret = rta_addattr8(rta, 1024, ILA_ATTR_HOOK_TYPE,
++			ret = rta_addattr8(rta, len, ILA_ATTR_HOOK_TYPE,
+ 					   (__u8)hook_type);
+ 
+ 			argc--; argv++;
+@@ -1016,7 +1016,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) {
+@@ -1057,7 +1057,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);
+@@ -1090,7 +1090,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/0040-man-rdma-Add-reference-to-rdma-resource.8.patch b/SOURCES/0040-man-rdma-Add-reference-to-rdma-resource.8.patch
new file mode 100644
index 0000000..3b5b1f4
--- /dev/null
+++ b/SOURCES/0040-man-rdma-Add-reference-to-rdma-resource.8.patch
@@ -0,0 +1,64 @@
+From d2662aea40d63db11a38dc8bcbc354eafe280b8a Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Tue, 11 Dec 2018 15:03:12 +0100
+Subject: [PATCH] man: rdma: Add reference to rdma-resource.8
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1610334
+Upstream Status: iproute2.git commit b2ec8f431402f
+
+commit b2ec8f431402f621ed0a2435d895df55eb1354af
+Author: Phil Sutter <phil@nwl.cc>
+Date:   Mon Nov 26 18:58:31 2018 +0100
+
+    man: rdma: Add reference to rdma-resource.8
+
+    All rdma-related man pages list each other in SEE ALSO section, only
+    rdma-resource.8 is missing. Add it for the sake of consistency.
+
+    Signed-off-by: Phil Sutter <phil@nwl.cc>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ man/man8/rdma-dev.8  | 1 +
+ man/man8/rdma-link.8 | 1 +
+ man/man8/rdma.8      | 1 +
+ 3 files changed, 3 insertions(+)
+
+diff --git a/man/man8/rdma-dev.8 b/man/man8/rdma-dev.8
+index 461681b..b7abfe1 100644
+--- a/man/man8/rdma-dev.8
++++ b/man/man8/rdma-dev.8
+@@ -49,6 +49,7 @@ Shows the state of specified RDMA device.
+ .SH SEE ALSO
+ .BR rdma (8),
+ .BR rdma-link (8),
++.BR rdma-resource (8),
+ .br
+ 
+ .SH AUTHOR
+diff --git a/man/man8/rdma-link.8 b/man/man8/rdma-link.8
+index 97dd8bb..bddf347 100644
+--- a/man/man8/rdma-link.8
++++ b/man/man8/rdma-link.8
+@@ -49,6 +49,7 @@ Shows the state of specified rdma link.
+ .SH SEE ALSO
+ .BR rdma (8),
+ .BR rdma-dev (8),
++.BR rdma-resource (8),
+ .br
+ 
+ .SH AUTHOR
+diff --git a/man/man8/rdma.8 b/man/man8/rdma.8
+index 12aa149..b2b5aef 100644
+--- a/man/man8/rdma.8
++++ b/man/man8/rdma.8
+@@ -106,6 +106,7 @@ 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
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0041-iplink-fix-incorrect-any-address-handling-for-ip-tun.patch b/SOURCES/0041-iplink-fix-incorrect-any-address-handling-for-ip-tun.patch
new file mode 100644
index 0000000..47684a7
--- /dev/null
+++ b/SOURCES/0041-iplink-fix-incorrect-any-address-handling-for-ip-tun.patch
@@ -0,0 +1,144 @@
+From 6549ac61c997af9a96d13cb4ae94d1a7b1993762 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Tue, 18 Dec 2018 17:34:35 +0100
+Subject: [PATCH] iplink: fix incorrect any address handling for ip tunnels
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1626304
+Upstream Status: iproute2.git commit fa1e658e84ab2
+
+commit fa1e658e84ab267bb98955e44774831bb36f3861
+Author: Hangbin Liu <liuhangbin@gmail.com>
+Date:   Tue Sep 18 17:48:40 2018 +0800
+
+    iplink: fix incorrect any address handling for ip tunnels
+
+    After commit d42c7891d26e4 ("utils: Do not reset family for default, any,
+    all addresses"), when call get_addr() for any/all addresses, we will set
+    addr->flags to ADDRTYPE_INET_UNSPEC if family is AF_INET/AF_INET6, which
+    makes is_addrtype_inet() checking passed and assigns incorrect address
+    to kernel. The ip link cmd will return error like:
+
+    ]# ip link add ipip1 type ipip local any remote 1.1.1.1
+    RTNETLINK answers: Numerical result out of range
+
+    Fix it by using is_addrtype_inet_not_unspec() to avoid unspec addresses.
+
+    geneve, vxlan are not affected as they use AF_UNSPEC family when call
+    get_addr()
+
+    Reported-by: Jianlin Shi <jishi@redhat.com>
+    Fixes: d42c7891d26e4 ("utils: Do not reset family for default, any, all addresses")
+    Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ ip/link_gre.c    | 4 ++--
+ ip/link_gre6.c   | 4 ++--
+ ip/link_ip6tnl.c | 4 ++--
+ ip/link_iptnl.c  | 4 ++--
+ ip/link_vti.c    | 4 ++--
+ ip/link_vti6.c   | 4 ++--
+ 6 files changed, 12 insertions(+), 12 deletions(-)
+
+diff --git a/ip/link_gre.c b/ip/link_gre.c
+index ede761b..1ee7ee1 100644
+--- a/ip/link_gre.c
++++ b/ip/link_gre.c
+@@ -395,9 +395,9 @@ get_failed:
+ 	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);
+-	if (is_addrtype_inet(&saddr))
++	if (is_addrtype_inet_not_unspec(&saddr))
+ 		addattr_l(n, 1024, IFLA_GRE_LOCAL, saddr.data, saddr.bytelen);
+-	if (is_addrtype_inet(&daddr))
++	if (is_addrtype_inet_not_unspec(&daddr))
+ 		addattr_l(n, 1024, IFLA_GRE_REMOTE, daddr.data, daddr.bytelen);
+ 	addattr_l(n, 1024, IFLA_GRE_PMTUDISC, &pmtudisc, 1);
+ 	if (ignore_df)
+diff --git a/ip/link_gre6.c b/ip/link_gre6.c
+index 181b2ea..20f9305 100644
+--- a/ip/link_gre6.c
++++ b/ip/link_gre6.c
+@@ -424,9 +424,9 @@ get_failed:
+ 	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);
+-	if (is_addrtype_inet(&saddr))
++	if (is_addrtype_inet_not_unspec(&saddr))
+ 		addattr_l(n, 1024, IFLA_GRE_LOCAL, saddr.data, saddr.bytelen);
+-	if (is_addrtype_inet(&daddr))
++	if (is_addrtype_inet_not_unspec(&daddr))
+ 		addattr_l(n, 1024, IFLA_GRE_REMOTE, daddr.data, daddr.bytelen);
+ 	if (link)
+ 		addattr32(n, 1024, IFLA_GRE_LINK, link);
+diff --git a/ip/link_ip6tnl.c b/ip/link_ip6tnl.c
+index c7fef2e..cfe2c5a 100644
+--- a/ip/link_ip6tnl.c
++++ b/ip/link_ip6tnl.c
+@@ -320,11 +320,11 @@ get_failed:
+ 		return 0;
+ 	}
+ 
+-	if (is_addrtype_inet(&saddr)) {
++	if (is_addrtype_inet_not_unspec(&saddr)) {
+ 		addattr_l(n, 1024, IFLA_IPTUN_LOCAL,
+ 			  saddr.data, saddr.bytelen);
+ 	}
+-	if (is_addrtype_inet(&daddr)) {
++	if (is_addrtype_inet_not_unspec(&daddr)) {
+ 		addattr_l(n, 1024, IFLA_IPTUN_REMOTE,
+ 			  daddr.data, daddr.bytelen);
+ 	}
+diff --git a/ip/link_iptnl.c b/ip/link_iptnl.c
+index 57f4d0c..7ec1594 100644
+--- a/ip/link_iptnl.c
++++ b/ip/link_iptnl.c
+@@ -325,11 +325,11 @@ get_failed:
+ 		return 0;
+ 	}
+ 
+-	if (is_addrtype_inet(&saddr)) {
++	if (is_addrtype_inet_not_unspec(&saddr)) {
+ 		addattr_l(n, 1024, IFLA_IPTUN_LOCAL,
+ 			  saddr.data, saddr.bytelen);
+ 	}
+-	if (is_addrtype_inet(&daddr)) {
++	if (is_addrtype_inet_not_unspec(&daddr)) {
+ 		addattr_l(n, 1024, IFLA_IPTUN_REMOTE,
+ 			  daddr.data, daddr.bytelen);
+ 	}
+diff --git a/ip/link_vti.c b/ip/link_vti.c
+index 6196a1c..3fff441 100644
+--- a/ip/link_vti.c
++++ b/ip/link_vti.c
+@@ -157,9 +157,9 @@ get_failed:
+ 
+ 	addattr32(n, 1024, IFLA_VTI_IKEY, ikey);
+ 	addattr32(n, 1024, IFLA_VTI_OKEY, okey);
+-	if (is_addrtype_inet(&saddr))
++	if (is_addrtype_inet_not_unspec(&saddr))
+ 		addattr_l(n, 1024, IFLA_VTI_LOCAL, saddr.data, saddr.bytelen);
+-	if (is_addrtype_inet(&daddr))
++	if (is_addrtype_inet_not_unspec(&daddr))
+ 		addattr_l(n, 1024, IFLA_VTI_REMOTE, daddr.data, daddr.bytelen);
+ 	addattr32(n, 1024, IFLA_VTI_FWMARK, fwmark);
+ 	if (link)
+diff --git a/ip/link_vti6.c b/ip/link_vti6.c
+index 4263615..f5a267a 100644
+--- a/ip/link_vti6.c
++++ b/ip/link_vti6.c
+@@ -159,9 +159,9 @@ get_failed:
+ 
+ 	addattr32(n, 1024, IFLA_VTI_IKEY, ikey);
+ 	addattr32(n, 1024, IFLA_VTI_OKEY, okey);
+-	if (is_addrtype_inet(&saddr))
++	if (is_addrtype_inet_not_unspec(&saddr))
+ 		addattr_l(n, 1024, IFLA_VTI_LOCAL, saddr.data, saddr.bytelen);
+-	if (is_addrtype_inet(&daddr))
++	if (is_addrtype_inet_not_unspec(&daddr))
+ 		addattr_l(n, 1024, IFLA_VTI_REMOTE, daddr.data, daddr.bytelen);
+ 	addattr32(n, 1024, IFLA_VTI_FWMARK, fwmark);
+ 	if (link)
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0042-l2tp-Fix-printing-of-cookie-and-peer_cookie-values.patch b/SOURCES/0042-l2tp-Fix-printing-of-cookie-and-peer_cookie-values.patch
new file mode 100644
index 0000000..51f278d
--- /dev/null
+++ b/SOURCES/0042-l2tp-Fix-printing-of-cookie-and-peer_cookie-values.patch
@@ -0,0 +1,45 @@
+From 7fa3df19e2b907e09b2de902a122daaff114ee0c Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 31 Jan 2019 16:48:25 +0100
+Subject: [PATCH] l2tp: Fix printing of cookie and peer_cookie values
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1643805
+Upstream Status: iproute2.git commit b876b7e2b492f
+
+commit b876b7e2b492fa14ce1f3db6c18bf22b2df10132
+Author: Andrea Claudi <aclaudi@redhat.com>
+Date:   Fri Nov 30 15:34:24 2018 +0100
+
+    l2tp: Fix printing of cookie and peer_cookie values
+
+    print_cookie() invocations miss %s format specifier.
+    While at it, align printout to the previous lines.
+
+    Fixes: 98453b65800f7 ("ip/l2tp: add JSON support")
+    Signed-off-by: Andrea Claudi <aclaudi@redhat.com>
+    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+---
+ ip/ipl2tp.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/ip/ipl2tp.c b/ip/ipl2tp.c
+index 414a9eb..87c13db 100644
+--- a/ip/ipl2tp.c
++++ b/ip/ipl2tp.c
+@@ -311,10 +311,11 @@ static void print_session(struct l2tp_data *data)
+ 	print_uint(PRINT_FP, "peer_offset", " peer offset %u\n", 0);
+ 
+ 	if (p->cookie_len > 0)
+-		print_cookie("cookie", "cookie",
++		print_cookie("cookie", "  cookie %s",
+ 			     p->cookie, p->cookie_len);
++
+ 	if (p->peer_cookie_len > 0)
+-		print_cookie("peer_cookie", "peer cookie",
++		print_cookie("peer_cookie", "  peer cookie %s",
+ 			     p->peer_cookie, p->peer_cookie_len);
+ 
+ 	if (p->reorder_timeout != 0)
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0043-tc-f_flower-add-geneve-option-match-support-to-flowe.patch b/SOURCES/0043-tc-f_flower-add-geneve-option-match-support-to-flowe.patch
new file mode 100644
index 0000000..9086978
--- /dev/null
+++ b/SOURCES/0043-tc-f_flower-add-geneve-option-match-support-to-flowe.patch
@@ -0,0 +1,403 @@
+From 9dd748cd49d15b7e90a7a65de53d431a2c515c86 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 31 Jan 2019 17:13:07 +0100
+Subject: [PATCH] tc: f_flower: add geneve option match support to flower
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1654761
+Upstream Status: iproute2.git commit 56155d4df86d4
+
+commit 56155d4df86d489c4207444c8a90ce4e0e22e49f
+Author: Pieter Jansen van Vuuren <pieter.jansenvanvuuren@netronome.com>
+Date:   Fri Sep 28 16:03:39 2018 +0200
+
+    tc: f_flower: add geneve option match support to flower
+
+    Allow matching on options in Geneve tunnel headers.
+
+    The options can be described in the form
+    CLASS:TYPE:DATA/CLASS_MASK:TYPE_MASK:DATA_MASK, where CLASS is
+    represented as a 16bit hexadecimal value, TYPE as an 8bit
+    hexadecimal value and DATA as a variable length hexadecimal value.
+
+    e.g.
+     # ip link add name geneve0 type geneve dstport 0 external
+     # tc qdisc add dev geneve0 ingress
+     # tc filter add dev geneve0 protocol ip parent ffff: \
+         flower \
+           enc_src_ip 10.0.99.192 \
+           enc_dst_ip 10.0.99.193 \
+           enc_key_id 11 \
+           geneve_opts 0102:80:1122334421314151/ffff:ff:ffffffffffffffff \
+           ip_proto udp \
+           action mirred egress redirect dev eth1
+
+    Signed-off-by: Pieter Jansen van Vuuren <pieter.jansenvanvuuren@netronome.com>
+    Signed-off-by: Simon Horman <simon.horman@netronome.com>
+    Signed-off-by: David Ahern <dsahern@gmail.com>
+---
+ man/man8/tc-flower.8 |  13 ++-
+ tc/f_flower.c        | 282 +++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 294 insertions(+), 1 deletion(-)
+
+diff --git a/man/man8/tc-flower.8 b/man/man8/tc-flower.8
+index f917f24..276b527 100644
+--- a/man/man8/tc-flower.8
++++ b/man/man8/tc-flower.8
+@@ -74,6 +74,8 @@ flower \- flow based traffic control filter
+ .IR TOS " | "
+ .B enc_ttl
+ .IR TTL " | "
++.B geneve_opts
++.IR OPTIONS " | "
+ .BR ip_flags
+ .IR IP_FLAGS
+ .SH DESCRIPTION
+@@ -260,6 +262,8 @@ bits is assumed.
+ .BI enc_tos " NUMBER"
+ .TQ
+ .BI enc_ttl " NUMBER"
++.TQ
++.BI geneve_opts " OPTIONS"
+ Match on IP tunnel metadata. Key id
+ .I NUMBER
+ is a 32 bit tunnel key id (e.g. VNI for VXLAN tunnel).
+@@ -272,7 +276,14 @@ 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.
++is an 8 bit time-to-live value. geneve_opts
++.I OPTIONS
++must be a valid list of comma-separated geneve options where each option
++consists of a key optionally followed by a slash and corresponding mask. If
++the masks is missing, \fBtc\fR assumes a full-length match. The options can
++be described in the form CLASS:TYPE:DATA/CLASS_MASK:TYPE_MASK:DATA_MASK,
++where CLASS is represented as a 16bit hexadecimal value, TYPE as an 8bit
++hexadecimal value and DATA as a variable length hexadecimal value.
+ .TP
+ .BI ip_flags " IP_FLAGS"
+ .I IP_FLAGS
+diff --git a/tc/f_flower.c b/tc/f_flower.c
+index cd102f2..43102c8 100644
+--- a/tc/f_flower.c
++++ b/tc/f_flower.c
+@@ -76,6 +76,7 @@ static void explain(void)
+ 		"                       enc_key_id [ KEY-ID ] |\n"
+ 		"                       enc_tos MASKED-IP_TOS |\n"
+ 		"                       enc_ttl MASKED-IP_TTL |\n"
++		"                       geneve_opts MASKED-OPTIONS |\n"
+ 		"                       ip_flags IP-FLAGS | \n"
+ 		"                       enc_dst_port [ port_number ] }\n"
+ 		"       FILTERID := X:Y:Z\n"
+@@ -580,6 +581,179 @@ static int flower_parse_enc_port(char *str, int type, struct nlmsghdr *n)
+ 	return 0;
+ }
+ 
++static int flower_parse_geneve_opts(char *str, struct nlmsghdr *n)
++{
++	struct rtattr *nest;
++	char *token;
++	int i, err;
++
++	nest = addattr_nest(n, MAX_MSG, TCA_FLOWER_KEY_ENC_OPTS_GENEVE);
++
++	i = 1;
++	token = strsep(&str, ":");
++	while (token) {
++		switch (i) {
++		case TCA_FLOWER_KEY_ENC_OPT_GENEVE_CLASS:
++		{
++			__be16 opt_class;
++
++			if (!strlen(token))
++				break;
++			err = get_be16(&opt_class, token, 16);
++			if (err)
++				return err;
++
++			addattr16(n, MAX_MSG, i, opt_class);
++			break;
++		}
++		case TCA_FLOWER_KEY_ENC_OPT_GENEVE_TYPE:
++		{
++			__u8 opt_type;
++
++			if (!strlen(token))
++				break;
++			err = get_u8(&opt_type, token, 16);
++			if (err)
++				return err;
++
++			addattr8(n, MAX_MSG, i, opt_type);
++			break;
++		}
++		case TCA_FLOWER_KEY_ENC_OPT_GENEVE_DATA:
++		{
++			size_t token_len = strlen(token);
++			__u8 *opts;
++
++			if (!token_len)
++				break;
++			opts = malloc(token_len / 2);
++			if (!opts)
++				return -1;
++			if (hex2mem(token, opts, token_len / 2) < 0) {
++				free(opts);
++				return -1;
++			}
++			addattr_l(n, MAX_MSG, i, opts, token_len / 2);
++			free(opts);
++
++			break;
++		}
++		default:
++			fprintf(stderr, "Unknown \"geneve_opts\" type\n");
++			return -1;
++		}
++
++		token = strsep(&str, ":");
++		i++;
++	}
++	addattr_nest_end(n, nest);
++
++	return 0;
++}
++
++static int flower_parse_enc_opt_part(char *str, struct nlmsghdr *n)
++{
++	char *token;
++	int err;
++
++	token = strsep(&str, ",");
++	while (token) {
++		err = flower_parse_geneve_opts(token, n);
++		if (err)
++			return err;
++
++		token = strsep(&str, ",");
++	}
++
++	return 0;
++}
++
++static int flower_check_enc_opt_key(char *key)
++{
++	int key_len, col_cnt = 0;
++
++	key_len = strlen(key);
++	while ((key = strchr(key, ':'))) {
++		if (strlen(key) == key_len)
++			return -1;
++
++		key_len = strlen(key) - 1;
++		col_cnt++;
++		key++;
++	}
++
++	if (col_cnt != 2 || !key_len)
++		return -1;
++
++	return 0;
++}
++
++static int flower_parse_enc_opts(char *str, struct nlmsghdr *n)
++{
++	char key[XATTR_SIZE_MAX], mask[XATTR_SIZE_MAX];
++	int data_len, key_len, mask_len, err;
++	char *token, *slash;
++	struct rtattr *nest;
++
++	key_len = 0;
++	mask_len = 0;
++	token = strsep(&str, ",");
++	while (token) {
++		slash = strchr(token, '/');
++		if (slash)
++			*slash = '\0';
++
++		if ((key_len + strlen(token) > XATTR_SIZE_MAX) ||
++		    flower_check_enc_opt_key(token))
++			return -1;
++
++		strcpy(&key[key_len], token);
++		key_len += strlen(token) + 1;
++		key[key_len - 1] = ',';
++
++		if (!slash) {
++			/* Pad out mask when not provided */
++			if (mask_len + strlen(token) > XATTR_SIZE_MAX)
++				return -1;
++
++			data_len = strlen(rindex(token, ':'));
++			sprintf(&mask[mask_len], "ffff:ff:");
++			mask_len += 8;
++			memset(&mask[mask_len], 'f', data_len - 1);
++			mask_len += data_len;
++			mask[mask_len - 1] = ',';
++			token = strsep(&str, ",");
++			continue;
++		}
++
++		if (mask_len + strlen(slash + 1) > XATTR_SIZE_MAX)
++			return -1;
++
++		strcpy(&mask[mask_len], slash + 1);
++		mask_len += strlen(slash + 1) + 1;
++		mask[mask_len - 1] = ',';
++
++		*slash = '/';
++		token = strsep(&str, ",");
++	}
++	key[key_len - 1] = '\0';
++	mask[mask_len - 1] = '\0';
++
++	nest = addattr_nest(n, MAX_MSG, TCA_FLOWER_KEY_ENC_OPTS);
++	err = flower_parse_enc_opt_part(key, n);
++	if (err)
++		return err;
++	addattr_nest_end(n, nest);
++
++	nest = addattr_nest(n, MAX_MSG, TCA_FLOWER_KEY_ENC_OPTS_MASK);
++	err = flower_parse_enc_opt_part(mask, n);
++	if (err)
++		return err;
++	addattr_nest_end(n, nest);
++
++	return 0;
++}
++
+ static int flower_parse_opt(struct filter_util *qu, char *handle,
+ 			    int argc, char **argv, struct nlmsghdr *n)
+ {
+@@ -994,6 +1168,13 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
+ 				fprintf(stderr, "Illegal \"enc_ttl\"\n");
+ 				return -1;
+ 			}
++		} else if (matches(*argv, "geneve_opts") == 0) {
++			NEXT_ARG();
++			ret = flower_parse_enc_opts(*argv, n);
++			if (ret < 0) {
++				fprintf(stderr, "Illegal \"geneve_opts\"\n");
++				return -1;
++			}
+ 		} else if (matches(*argv, "action") == 0) {
+ 			NEXT_ARG();
+ 			ret = parse_action(&argc, &argv, TCA_FLOWER_ACT, n);
+@@ -1291,6 +1472,105 @@ static void flower_print_key_id(const char *name, struct rtattr *attr)
+ 	print_uint(PRINT_ANY, name, namefrm, rta_getattr_be32(attr));
+ }
+ 
++static void flower_print_geneve_opts(const char *name, struct rtattr *attr,
++				     char *strbuf)
++{
++	struct rtattr *tb[TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX + 1];
++	int ii, data_len, offset = 0, slen = 0;
++	struct rtattr *i = RTA_DATA(attr);
++	int rem = RTA_PAYLOAD(attr);
++	__u8 type, data_r[rem];
++	char data[rem * 2 + 1];
++	__u16 class;
++
++	open_json_array(PRINT_JSON, name);
++	while (rem) {
++		parse_rtattr(tb, TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX, i, rem);
++		class = rta_getattr_be16(tb[TCA_FLOWER_KEY_ENC_OPT_GENEVE_CLASS]);
++		type = rta_getattr_u8(tb[TCA_FLOWER_KEY_ENC_OPT_GENEVE_TYPE]);
++		data_len = RTA_PAYLOAD(tb[TCA_FLOWER_KEY_ENC_OPT_GENEVE_DATA]);
++		hexstring_n2a(RTA_DATA(tb[TCA_FLOWER_KEY_ENC_OPT_GENEVE_DATA]),
++			      data_len, data, sizeof(data));
++		hex2mem(data, data_r, data_len);
++		offset += data_len + 20;
++		rem -= data_len + 20;
++		i = RTA_DATA(attr) + offset;
++
++		open_json_object(NULL);
++		print_uint(PRINT_JSON, "class", NULL, class);
++		print_uint(PRINT_JSON, "type", NULL, type);
++		open_json_array(PRINT_JSON, "data");
++		for (ii = 0; ii < data_len; ii++)
++			print_uint(PRINT_JSON, NULL, NULL, data_r[ii]);
++		close_json_array(PRINT_JSON, "data");
++		close_json_object();
++
++		slen += sprintf(strbuf + slen, "%04x:%02x:%s",
++				class, type, data);
++		if (rem)
++			slen += sprintf(strbuf + slen, ",");
++	}
++	close_json_array(PRINT_JSON, name);
++}
++
++static void flower_print_geneve_parts(const char *name, struct rtattr *attr,
++				      char *key, char *mask)
++{
++	char *namefrm = "\n  geneve_opt %s";
++	char *key_token, *mask_token, *out;
++	int len;
++
++	out = malloc(RTA_PAYLOAD(attr) * 4 + 3);
++	if (!out)
++		return;
++
++	len = 0;
++	key_token = strsep(&key, ",");
++	mask_token = strsep(&mask, ",");
++	while (key_token) {
++		len += sprintf(&out[len], "%s/%s,", key_token, mask_token);
++		mask_token = strsep(&mask, ",");
++		key_token = strsep(&key, ",");
++	}
++
++	out[len - 1] = '\0';
++	print_string(PRINT_FP, name, namefrm, out);
++	free(out);
++}
++
++static void flower_print_enc_opts(const char *name, struct rtattr *attr,
++				  struct rtattr *mask_attr)
++{
++	struct rtattr *key_tb[TCA_FLOWER_KEY_ENC_OPTS_MAX + 1];
++	struct rtattr *msk_tb[TCA_FLOWER_KEY_ENC_OPTS_MAX + 1];
++	char *key, *msk;
++
++	if (!attr)
++		return;
++
++	key = malloc(RTA_PAYLOAD(attr) * 2 + 1);
++	if (!key)
++		return;
++
++	msk = malloc(RTA_PAYLOAD(attr) * 2 + 1);
++	if (!msk)
++		goto err_key_free;
++
++	parse_rtattr_nested(key_tb, TCA_FLOWER_KEY_ENC_OPTS_MAX, attr);
++	flower_print_geneve_opts("geneve_opt_key",
++				 key_tb[TCA_FLOWER_KEY_ENC_OPTS_GENEVE], key);
++
++	parse_rtattr_nested(msk_tb, TCA_FLOWER_KEY_ENC_OPTS_MAX, mask_attr);
++	flower_print_geneve_opts("geneve_opt_mask",
++				 msk_tb[TCA_FLOWER_KEY_ENC_OPTS_GENEVE], msk);
++
++	flower_print_geneve_parts(name, attr, key, msk);
++
++	free(msk);
++err_key_free:
++	free(key);
++}
++
+ static void flower_print_masked_u8(const char *name, struct rtattr *attr,
+ 				   struct rtattr *mask_attr,
+ 				   const char *(*value_to_str)(__u8 value))
+@@ -1489,6 +1769,8 @@ static int flower_print_opt(struct filter_util *qu, FILE *f,
+ 			    tb[TCA_FLOWER_KEY_ENC_IP_TOS_MASK]);
+ 	flower_print_ip_attr("enc_ttl", tb[TCA_FLOWER_KEY_ENC_IP_TTL],
+ 			    tb[TCA_FLOWER_KEY_ENC_IP_TTL_MASK]);
++	flower_print_enc_opts("enc_opt", tb[TCA_FLOWER_KEY_ENC_OPTS],
++			      tb[TCA_FLOWER_KEY_ENC_OPTS_MASK]);
+ 
+ 	flower_print_matching_flags("ip_flags", FLOWER_IP_FLAGS,
+ 				    tb[TCA_FLOWER_KEY_FLAGS],
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0044-tc-m_tunnel_key-Add-tunnel-option-support-to-act_tun.patch b/SOURCES/0044-tc-m_tunnel_key-Add-tunnel-option-support-to-act_tun.patch
new file mode 100644
index 0000000..6bed3d5
--- /dev/null
+++ b/SOURCES/0044-tc-m_tunnel_key-Add-tunnel-option-support-to-act_tun.patch
@@ -0,0 +1,292 @@
+From d75736d332f6aa0fcd12352e2d2a5c1aa65c6464 Mon Sep 17 00:00:00 2001
+From: Phil Sutter <psutter@redhat.com>
+Date: Thu, 31 Jan 2019 17:13:07 +0100
+Subject: [PATCH] tc: m_tunnel_key: Add tunnel option support to act_tunnel_key
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1654761
+Upstream Status: iproute2.git commit 6217917a38268
+Conflicts: Context change due to previous backport of tos and ttl
+           support.
+
+commit 6217917a382682d8e8a7ecdeb0c6626f701a0933
+Author: Simon Horman <simon.horman@netronome.com>
+Date:   Thu Jul 5 17:12:00 2018 -0700
+
+    tc: m_tunnel_key: Add tunnel option support to act_tunnel_key
+
+    Allow setting tunnel options using the act_tunnel_key action.
+
+    Options are expressed as class:type:data and multiple options
+    may be listed using a comma delimiter.
+
+     # ip link add name geneve0 type geneve dstport 0 external
+     # tc qdisc add dev eth0 ingress
+     # tc filter add dev eth0 protocol ip parent ffff: \
+         flower indev eth0 \
+            ip_proto udp \
+            action tunnel_key \
+                set src_ip 10.0.99.192 \
+                dst_ip 10.0.99.193 \
+                dst_port 6081 \
+                id 11 \
+                geneve_opts 0102:80:00800022,0102:80:00800022 \
+        action mirred egress redirect dev geneve0
+
+    Signed-off-by: Simon Horman <simon.horman@netronome.com>
+    Signed-off-by: Pieter Jansen van Vuuren <pieter.jansenvanvuuren@netronome.com>
+    Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>
+    Signed-off-by: David Ahern <dsahern@gmail.com>
+---
+ man/man8/tc-tunnel_key.8 |  12 +++-
+ tc/m_tunnel_key.c        | 177 +++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 188 insertions(+), 1 deletion(-)
+
+diff --git a/man/man8/tc-tunnel_key.8 b/man/man8/tc-tunnel_key.8
+index 71cee5b..1e09362 100644
+--- a/man/man8/tc-tunnel_key.8
++++ b/man/man8/tc-tunnel_key.8
+@@ -66,7 +66,9 @@ and
+ .B dst_ip
+ options.
+ .B dst_port
+-is optional.
++and
++.B geneve_opts
++are optional.
+ .RS
+ .TP
+ .B id
+@@ -81,6 +83,14 @@ Outer header destination IP address (IPv4 or IPv6)
+ .B dst_port
+ Outer header destination UDP port
+ .TP
++.B geneve_opts
++Geneve variable length options.
++.B geneve_opts
++is specified in the form CLASS:TYPE:DATA, where CLASS is represented as a
++16bit hexadecimal value, TYPE as an 8bit hexadecimal value and DATA as a
++variable length hexadecimal value. Additionally multiple options may be
++listed using a comma delimiter.
++.TP
+ .B tos
+ Outer header TOS
+ .TP
+diff --git a/tc/m_tunnel_key.c b/tc/m_tunnel_key.c
+index 8d0a8d1..e9e71e4 100644
+--- a/tc/m_tunnel_key.c
++++ b/tc/m_tunnel_key.c
+@@ -29,6 +29,7 @@ static void explain(void)
+ 		"src_ip <IP> (mandatory)\n"
+ 		"dst_ip <IP> (mandatory)\n"
+ 		"dst_port <UDP_PORT>\n"
++		"geneve_opts <OPTIONS>\n"
+ 		"csum | nocsum (default is \"csum\")\n");
+ }
+ 
+@@ -81,6 +82,114 @@ static int tunnel_key_parse_dst_port(char *str, int type, struct nlmsghdr *n)
+ 	return 0;
+ }
+ 
++static int tunnel_key_parse_be16(char *str, int base, int type,
++				 struct nlmsghdr *n)
++{
++	int ret;
++	__be16 value;
++
++	ret = get_be16(&value, str, base);
++	if (ret)
++		return ret;
++
++	addattr16(n, MAX_MSG, type, value);
++
++	return 0;
++}
++
++static int tunnel_key_parse_u8(char *str, int base, int type,
++			       struct nlmsghdr *n)
++{
++	int ret;
++	__u8 value;
++
++	ret = get_u8(&value, str, base);
++	if (ret)
++		return ret;
++
++	addattr8(n, MAX_MSG, type, value);
++
++	return 0;
++}
++
++static int tunnel_key_parse_geneve_opt(char *str, struct nlmsghdr *n)
++{
++	char *token, *saveptr = NULL;
++	struct rtattr *nest;
++	int i, ret;
++
++	nest = addattr_nest(n, MAX_MSG, TCA_TUNNEL_KEY_ENC_OPTS_GENEVE);
++
++	token = strtok_r(str, ":", &saveptr);
++	i = 1;
++	while (token) {
++		switch (i) {
++		case TCA_TUNNEL_KEY_ENC_OPT_GENEVE_CLASS:
++		{
++			ret = tunnel_key_parse_be16(token, 16, i, n);
++			if (ret)
++				return ret;
++			break;
++		}
++		case TCA_TUNNEL_KEY_ENC_OPT_GENEVE_TYPE:
++		{
++			ret = tunnel_key_parse_u8(token, 16, i, n);
++			if (ret)
++				return ret;
++			break;
++		}
++		case TCA_TUNNEL_KEY_ENC_OPT_GENEVE_DATA:
++		{
++			size_t token_len = strlen(token);
++			uint8_t *opts;
++
++			opts = malloc(token_len / 2);
++			if (!opts)
++				return -1;
++			if (hex2mem(token, opts, token_len / 2) < 0) {
++				free(opts);
++				return -1;
++			}
++			addattr_l(n, MAX_MSG, i, opts, token_len / 2);
++			free(opts);
++
++			break;
++		}
++		default:
++			return -1;
++		}
++
++		token = strtok_r(NULL, ":", &saveptr);
++		i++;
++	}
++
++	addattr_nest_end(n, nest);
++
++	return 0;
++}
++
++static int tunnel_key_parse_geneve_opts(char *str, struct nlmsghdr *n)
++{
++	char *token, *saveptr = NULL;
++	struct rtattr *nest;
++	int ret;
++
++	nest = addattr_nest(n, MAX_MSG, TCA_TUNNEL_KEY_ENC_OPTS);
++
++	token = strtok_r(str, ",", &saveptr);
++	while (token) {
++		ret = tunnel_key_parse_geneve_opt(token, n);
++		if (ret)
++			return ret;
++
++		token = strtok_r(NULL, ",", &saveptr);
++	}
++
++	addattr_nest_end(n, nest);
++
++	return 0;
++}
++
+ static int tunnel_key_parse_tos_ttl(char *str, int type, struct nlmsghdr *n)
+ {
+ 	int ret;
+@@ -173,6 +282,13 @@ 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, "geneve_opts") == 0) {
++			NEXT_ARG();
++
++			if (tunnel_key_parse_geneve_opts(*argv, n)) {
++				fprintf(stderr, "Illegal \"geneve_opts\"\n");
++				return -1;
++			}
+ 		} else if (matches(*argv, "tos") == 0) {
+ 			NEXT_ARG();
+ 			ret = tunnel_key_parse_tos_ttl(*argv,
+@@ -292,6 +408,65 @@ static void tunnel_key_print_flag(FILE *f, const char *name_on,
+ 		     rta_getattr_u8(attr) ? name_on : name_off);
+ }
+ 
++static void tunnel_key_print_geneve_options(const char *name,
++					    struct rtattr *attr)
++{
++	struct rtattr *tb[TCA_TUNNEL_KEY_ENC_OPT_GENEVE_MAX + 1];
++	struct rtattr *i = RTA_DATA(attr);
++	int ii, data_len = 0, offset = 0;
++	int rem = RTA_PAYLOAD(attr);
++	char strbuf[rem * 2 + 1];
++	char data[rem * 2 + 1];
++	uint8_t data_r[rem];
++	uint16_t clss;
++	uint8_t type;
++
++	open_json_array(PRINT_JSON, name);
++	print_string(PRINT_FP, name, "\n\t%s ", "geneve_opt");
++
++	while (rem) {
++		parse_rtattr(tb, TCA_TUNNEL_KEY_ENC_OPT_GENEVE_MAX, i, rem);
++		clss = rta_getattr_be16(tb[TCA_TUNNEL_KEY_ENC_OPT_GENEVE_CLASS]);
++		type = rta_getattr_u8(tb[TCA_TUNNEL_KEY_ENC_OPT_GENEVE_TYPE]);
++		data_len = RTA_PAYLOAD(tb[TCA_TUNNEL_KEY_ENC_OPT_GENEVE_DATA]);
++		hexstring_n2a(RTA_DATA(tb[TCA_TUNNEL_KEY_ENC_OPT_GENEVE_DATA]),
++			      data_len, data, sizeof(data));
++		hex2mem(data, data_r, data_len);
++		offset += data_len + 20;
++		rem -= data_len + 20;
++		i = RTA_DATA(attr) + offset;
++
++		open_json_object(NULL);
++		print_uint(PRINT_JSON, "class", NULL, clss);
++		print_uint(PRINT_JSON, "type", NULL, type);
++		open_json_array(PRINT_JSON, "data");
++		for (ii = 0; ii < data_len; ii++)
++			print_uint(PRINT_JSON, NULL, NULL, data_r[ii]);
++		close_json_array(PRINT_JSON, "data");
++		close_json_object();
++
++		sprintf(strbuf, "%04x:%02x:%s", clss, type, data);
++		if (rem)
++			print_string(PRINT_FP, NULL, "%s,", strbuf);
++		else
++			print_string(PRINT_FP, NULL, "%s", strbuf);
++	}
++
++	close_json_array(PRINT_JSON, name);
++}
++
++static void tunnel_key_print_key_opt(const char *name, struct rtattr *attr)
++{
++	struct rtattr *tb[TCA_TUNNEL_KEY_ENC_OPTS_MAX + 1];
++
++	if (!attr)
++		return;
++
++	parse_rtattr_nested(tb, TCA_TUNNEL_KEY_ENC_OPTS_MAX, attr);
++	tunnel_key_print_geneve_options(name,
++					tb[TCA_TUNNEL_KEY_ENC_OPTS_GENEVE]);
++}
++
+ static void tunnel_key_print_tos_ttl(FILE *f, char *name,
+ 				     struct rtattr *attr)
+ {
+@@ -346,6 +521,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_key_opt("geneve_opts",
++					 tb[TCA_TUNNEL_KEY_ENC_OPTS]);
+ 		tunnel_key_print_flag(f, "nocsum", "csum",
+ 				      tb[TCA_TUNNEL_KEY_NO_CSUM]);
+ 		tunnel_key_print_tos_ttl(f, "tos",
+-- 
+1.8.3.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..0813dbe
--- /dev/null
+++ b/SPECS/iproute.spec
@@ -0,0 +1,1021 @@
+%global             cbq_version v0.7.3
+
+%define rpmversion 4.18.0
+%define specrelease 11%{?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:            http://kernel.org/pub/linux/utils/net/%{name}2/%{name}2-%{version}.tar.xz
+Source1:            cbq-0000.example
+Source2:            avpkt
+Source3:            rt_dsfield.deprecated
+Patch0:             0001-man-bridge.8-Document-oneline-option.patch
+Patch1:             0002-bridge-trivial-Make-help-text-consistent.patch
+Patch2:             0003-devlink-trivial-Make-help-text-consistent.patch
+Patch3:             0004-man-devlink.8-Document-verbose-option.patch
+Patch4:             0005-genl-Fix-help-text.patch
+Patch5:             0006-man-ifstat.8-Document-json-and-pretty-options.patch
+Patch6:             0007-man-rtacct.8-Fix-nstat-options.patch
+Patch7:             0008-rtmon-List-options-in-help-text.patch
+Patch8:             0009-man-ss.8-Describe-events-option.patch
+Patch9:             0010-ip-Add-missing-M-flag-to-help-text.patch
+Patch10:            0011-iprule-Fix-destination-prefix-output.patch
+Patch11:            0012-tc-act_tunnel_key-Enable-setup-of-tos-and-ttl.patch
+Patch12:            0013-tc-flower-Add-match-on-encapsulating-tos-ttl.patch
+Patch13:            0014-Update-kernel-headers.patch
+Patch14:            0015-ip-route-Fix-segfault-with-many-nexthops.patch
+Patch15:            0016-bridge-mdb-fix-missing-new-line-when-show-bridge-mdb.patch
+Patch16:            0017-lib-introduce-print_nl.patch
+Patch17:            0018-bridge-fdb-Fix-for-missing-keywords-in-non-JSON-outp.patch
+Patch18:            0019-ip-addrlabel-Fix-printing-of-label-value.patch
+Patch19:            0020-iplink_vxlan-take-into-account-preferred_family-crea.patch
+Patch20:            0021-json-make-0xhex-handle-u64.patch
+Patch21:            0022-macsec-fix-off-by-one-when-parsing-attributes.patch
+Patch22:            0023-uapi-add-snmp-header-file.patch
+Patch23:            0024-utils-fix-get_rtnl_link_stats_rta-stats-parsing.patch
+Patch24:            0025-tc-htb-Print-default-value-in-hex.patch
+Patch25:            0026-libnetlink-fix-leak-and-using-unused-memory-on-error.patch
+Patch26:            0027-libnetlink-don-t-return-error-on-success.patch
+Patch27:            0028-libnetlink-fix-use-after-free-of-message-buf.patch
+Patch28:            0029-devlink-Fix-error-reporting-in-cmd_resource_set.patch
+Patch29:            0030-rdma-Fix-for-ineffective-check-in-add_filter.patch
+Patch30:            0031-ip-route-Fix-for-memleak-in-error-path.patch
+Patch31:            0032-rdma-Don-t-pass-garbage-to-rd_check_is_filtered.patch
+Patch32:            0033-ip-route-Fix-parse_encap_seg6-srh-parsing.patch
+Patch33:            0034-tipc-Drop-unused-variable-genl.patch
+Patch34:            0035-tc-Remove-pointless-assignments-in-batch.patch
+Patch35:            0036-tc_util-Add-support-for-showing-TCA_STATS_BASIC_HW-s.patch
+Patch36:            0037-Update-kernel-headers.patch
+Patch37:            0038-man-ip-route.8-Document-nexthop-limit.patch
+Patch38:            0039-ip-route-Fix-nexthop-encap-parsing.patch
+Patch39:            0040-man-rdma-Add-reference-to-rdma-resource.8.patch
+Patch40:            0041-iplink-fix-incorrect-any-address-handling-for-ip-tun.patch
+Patch41:            0042-l2tp-Fix-printing-of-cookie-and-peer_cookie-values.patch
+Patch42:            0043-tc-f_flower-add-geneve-option-match-support-to-flowe.patch
+Patch43:            0044-tc-m_tunnel_key-Add-tunnel-option-support-to-act_tun.patch
+License:            GPLv2+ and Public Domain
+BuildRequires:      bison
+BuildRequires:      elfutils-libelf-devel
+BuildRequires:      flex
+BuildRequires:      iptables-devel >= 1.4.5
+BuildRequires:      libdb-devel
+BuildRequires:      libmnl-devel
+BuildRequires:      libselinux-devel
+BuildRequires:      pkgconfig
+%if ! 0%{?_module_build}
+%if 0%{?fedora}
+BuildRequires:      linux-atm-libs-devel
+%endif
+%endif
+# For the UsrMove transition period
+Conflicts:          filesystem < 3
+Provides:           /sbin/ip
+Obsoletes:          %{name} < 4.5.0-3
+
+%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 tc
+Summary:            Linux Traffic Control utility
+Group:              Applications/System
+License:            GPLv2+
+Obsoletes:          %{name} < 4.5.0-3
+Requires:           %{name}%{?_isa} = %{version}-%{release}
+Provides:           tc
+
+%description tc
+The Traffic Control utility manages queueing disciplines, their classes and
+attached filters and actions. It is the standard tool to configure QoS in
+Linux.
+
+%if ! 0%{?_module_build}
+%package doc
+Summary:            Documentation for iproute2 utilities with examples
+Group:              Applications/System
+License:            GPLv2+
+Requires:           %{name} = %{version}-%{release}
+
+%description doc
+The iproute documentation contains howtos and examples of settings.
+%endif
+
+%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}2-%{version}
+
+%build
+export CFLAGS="%{optflags} -fno-exceptions"
+export LDFLAGS="%{build_ldflags}"
+export LIBDIR=/%{_libdir}
+export IPT_LIB_DIR=/%{_lib}/xtables
+./configure
+make %{?_smp_mflags}
+
+%install
+export DESTDIR='%{buildroot}'
+export SBINDIR='%{_sbindir}'
+export MANDIR='%{_mandir}'
+export LIBDIR='%{_libdir}'
+export CONFDIR='%{_sysconfdir}/iproute2'
+export DOCDIR='%{_docdir}'
+%make_install
+
+install -m755 examples/cbq.init-%{cbq_version} ${DESTDIR}/${SBINDIR}/cbq
+echo '.so man8/tc-cbq.8' > %{buildroot}%{_mandir}/man8/cbq.8
+
+install -d -m755 %{buildroot}%{_sysconfdir}/sysconfig/cbq
+for config in \
+    %{SOURCE1} \
+    %{SOURCE2}
+    do install -m644 ${config} %{buildroot}%{_sysconfdir}/sysconfig/cbq
+done
+
+# libnetlink
+install -D -m644 include/libnetlink.h %{buildroot}%{_includedir}/libnetlink.h
+install -D -m644 lib/libnetlink.a %{buildroot}%{_libdir}/libnetlink.a
+
+# drop these files, iproute-doc package extracts files directly from _builddir
+rm -rf '%{buildroot}%{_docdir}'
+
+# Append deprecated values to rt_dsfield for compatibility reasons
+cat %{SOURCE3} >>%{buildroot}%{_sysconfdir}/iproute2/rt_dsfield
+
+%files
+%dir %{_sysconfdir}/iproute2
+%{!?_licensedir:%global license %%doc}
+%license COPYING
+%doc README README.decnet README.iproute2+tc README.distribution README.lnstat
+%{_mandir}/man7/*
+%exclude %{_mandir}/man7/tc-*
+%{_mandir}/man8/*
+%exclude %{_mandir}/man8/tc*
+%exclude %{_mandir}/man8/cbq*
+%attr(644,root,root) %config(noreplace) %{_sysconfdir}/iproute2/*
+%{_sbindir}/*
+%exclude %{_sbindir}/tc
+%exclude %{_sbindir}/cbq
+
+%files tc
+%{!?_licensedir:%global license %%doc}
+%license COPYING
+%doc README.iproute2+tc
+%{_mandir}/man7/tc-*
+%{_mandir}/man8/tc*
+%{_mandir}/man8/cbq*
+%dir %{_libdir}/tc/
+%{_libdir}/tc/*
+%{_sbindir}/tc
+%{_sbindir}/cbq
+%dir %{_sysconfdir}/sysconfig/cbq
+%config(noreplace) %{_sysconfdir}/sysconfig/cbq/*
+%{_datadir}/bash-completion/completions/tc
+
+%if ! 0%{?_module_build}
+%files doc
+%{!?_licensedir:%global license %%doc}
+%license COPYING
+%doc examples
+%endif
+
+%files devel
+%{!?_licensedir:%global license %%doc}
+%license COPYING
+%{_mandir}/man3/*
+%{_libdir}/libnetlink.a
+%{_includedir}/libnetlink.h
+%{_includedir}/iproute2/bpf_elf.h
+
+%changelog
+* Thu Jan 31 2019 Phil Sutter <psutter@redhat.com> [4.18.0-11.el8]
+- tc: m_tunnel_key: Add tunnel option support to act_tunnel_key (Phil Sutter) [1654761]
+- tc: f_flower: add geneve option match support to flower (Phil Sutter) [1654761]
+- l2tp: Fix printing of cookie and peer_cookie values (Phil Sutter) [1643805]
+
+* Tue Dec 18 2018 Phil Sutter <psutter@redhat.com> [4.18.0-10.el8]
+- iplink: fix incorrect any address handling for ip tunnels (Phil Sutter) [1626304]
+
+* Tue Dec 11 2018 Phil Sutter <psutter@redhat.com> [4.18.0-9.el8]
+- man: rdma: Add reference to rdma-resource.8 (Phil Sutter) [1610334]
+
+* Thu Nov 29 2018 Phil Sutter <psutter@redhat.com> [4.18.0-8.el8]
+- Bump release to run fresh CI tests.
+
+* Mon Nov 26 2018 Phil Sutter <psutter@redhat.com> [4.18.0-7.el8]
+- ip-route: Fix nexthop encap parsing (Phil Sutter) [1625358]
+- man: ip-route.8: Document nexthop limit (Phil Sutter) [1625358]
+
+* Thu Oct 25 2018 Phil Sutter <psutter@redhat.com> [4.18.0-6.el8]
+- Update kernel headers (Phil Sutter) [1637440]
+- tc_util: Add support for showing TCA_STATS_BASIC_HW statistics (Phil Sutter) [1637440]
+- tc: Remove pointless assignments in batch() (Phil Sutter) [1602555]
+- tipc: Drop unused variable 'genl' (Phil Sutter) [1602555]
+- ip-route: Fix parse_encap_seg6() srh parsing (Phil Sutter) [1602555]
+- rdma: Don't pass garbage to rd_check_is_filtered() (Phil Sutter) [1602555]
+- ip-route: Fix for memleak in error path (Phil Sutter) [1602555]
+- rdma: Fix for ineffective check in add_filter() (Phil Sutter) [1602555]
+- devlink: Fix error reporting in cmd_resource_set() (Phil Sutter) [1602555]
+- libnetlink: fix use-after-free of message buf (Phil Sutter) [1602555]
+- libnetlink: don't return error on success (Phil Sutter) [1602555]
+- libnetlink: fix leak and using unused memory on error (Phil Sutter) [1602555]
+- tc: htb: Print default value in hex (Phil Sutter) [1641053]
+
+* Thu Oct 18 2018 Phil Sutter <psutter@redhat.com> [4.18.0-5.el8]
+- utils: fix get_rtnl_link_stats_rta stats parsing (Phil Sutter) [1626306]
+- uapi: add snmp header file (Phil Sutter) [1626306]
+- macsec: fix off-by-one when parsing attributes (Phil Sutter) [1628428]
+- json: make 0xhex handle u64 (Phil Sutter) [1628428]
+
+* Thu Oct 18 2018 Phil Sutter <psutter@redhat.com> [4.18.0-4.el8]
+- iplink_vxlan: take into account preferred_family creating vxlan device (Phil Sutter) [1626321]
+- ip-addrlabel: Fix printing of label value (Phil Sutter) [1639412]
+- bridge: fdb: Fix for missing keywords in non-JSON output (Phil Sutter) [1636532]
+
+* Wed Sep 19 2018 Phil Sutter <psutter@redhat.com> [4.18.0-3.el8]
+- lib: introduce print_nl (Phil Sutter) [1625500]
+
+* Wed Sep 19 2018 Phil Sutter <psutter@redhat.com> [4.18.0-2.el8]
+- bridge/mdb: fix missing new line when show bridge mdb (Phil Sutter) [1625500]
+- ip-route: Fix segfault with many nexthops (Phil Sutter) [1625358]
+- Update kernel headers (Phil Sutter) [1615915]
+- tc/flower: Add match on encapsulating tos/ttl (Phil Sutter) [1615915]
+- tc/act_tunnel_key: Enable setup of tos and ttl (Phil Sutter) [1615915]
+- iprule: Fix destination prefix output (Phil Sutter) [1623503]
+- ip: Add missing -M flag to help text (Phil Sutter) [1612704]
+- man: ss.8: Describe --events option (Phil Sutter) [1612704]
+- rtmon: List options in help text (Phil Sutter) [1612704]
+- man: rtacct.8: Fix nstat options (Phil Sutter) [1612704]
+- man: ifstat.8: Document --json and --pretty options (Phil Sutter) [1612704]
+- genl: Fix help text (Phil Sutter) [1612704]
+- man: devlink.8: Document -verbose option (Phil Sutter) [1612704]
+- devlink: trivial: Make help text consistent (Phil Sutter) [1612704]
+- bridge: trivial: Make help text consistent (Phil Sutter) [1612704]
+- man: bridge.8: Document -oneline option (Phil Sutter) [1612704]
+
+* Tue Aug 14 2018 Phil Sutter - 4.18.0-1
+- New version 4.18.0
+
+* Thu Aug 09 2018 Phil Sutter <psutter@redhat.com> [4.17.0-1.el8]
+- rdma: print driver resource attributes (Phil Sutter) [1610334]
+- rdma: update rdma_netlink.h to get new driver attributes (Phil Sutter) [1610334]
+- rdma: Print net device name and index for RDMA device (Phil Sutter) [1610334]
+- devlink: CTRL_ATTR_FAMILY_ID is a u16 (Phil Sutter) [1589317]
+- tc: Do not use addattr_nest_compat on mqprio and netem (Phil Sutter) [1589317]
+- ipaddress: Fix and make consistent label match handling (Phil Sutter) [1589317]
+- rt_dsfield: Ship deprecated values for compatibility (Phil Sutter) [1595683]
+- New version 4.17.0 including upstream-suggested fixes (Phil Sutter) [1589317]
+
+* Fri Feb 09 2018 Phil Sutter <psutter@redhat.com> - 4.15.0-1
+- New version 4.15.0
+
+* Fri Feb  9 2018 Florian Weimer <fweimer@redhat.com> - 4.14.1-6
+- Use LDFLAGS defaults from redhat-rpm-config
+
+* Wed Feb 07 2018 Fedora Release Engineering <releng@fedoraproject.org> - 4.14.1-5
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
+
+* Mon Dec 11 2017 Phil Sutter <psutter@redhat.com> - 4.14.1-4
+- Add missing patch files.
+
+* Mon Dec 11 2017 Phil Sutter <psutter@redhat.com> - 4.14.1-3
+- Add upstream suggested backports.
+- Make use of %%autosetup macro.
+
+* Wed Nov 15 2017 Phil Sutter <psutter@redhat.com> - 4.14.1-2
+- Drop unused build dependencies
+
+* Wed Nov 15 2017 Phil Sutter <psutter@redhat.com> - 4.14.1-1
+- New version 4.14.1
+
+* Tue Sep 19 2017 Phil Sutter <psutter@redhat.com> - 4.13.0-1
+- New version 4.13.0
+
+* Wed Aug 02 2017 Fedora Release Engineering <releng@fedoraproject.org> - 4.12.0-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild
+
+* Wed Jul 26 2017 Fedora Release Engineering <releng@fedoraproject.org> - 4.12.0-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
+
+* Fri Jul 21 2017 Phil Sutter <psutter@redhat.com> - 4.12.0-1
+- New version 4.12.0
+
+* Tue May 23 2017 Phil Sutter <psutter@redhat.com> - 4.11.0-1
+- Add virtual capability to tc subpackage so it's easier found
+- New version 4.11.0
+
+* Thu May 11 2017 Karsten Hopp <karsten@redhat.com> - 4.10.0-3
+- don't build docs for module builds to limit dependencies
+
+* Fri Mar 17 2017 Phil Sutter <psutter@redhat.com> - 4.10.0-2
+- Add two fixes to 4.10.0 release from upstream.
+
+* Tue Mar 14 2017 Phil Sutter <psutter@redhat.com> - 4.10.0-1
+- Ship new header iproute2/bpf_elf.h
+- Document content of remaining docs fixup patch in spec file
+- Drop patches already applied upstream
+- New version 4.10.0
+
+* Fri Feb 10 2017 Fedora Release Engineering <releng@fedoraproject.org> - 4.9.0-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
+
+* Thu Feb  2 2017 Thomas Woerner <twoerner@redhat.com> - 4.9.0-3
+- Release bump for iptables-1.6.1 (libxtables.so.12)
+
+* Sat Jan 28 2017 Phil Sutter <psutter@redhat.com> - 4.9.0-2
+- Fix for failing 'make install'
+
+* Sat Jan 28 2017 Phil Sutter <psutter@redhat.com> - 4.9.0-1
+- New version 4.9.0
+
+* Fri Jan 13 2017 Phil Sutter <psutter@redhat.com> - 4.8.0-2
+- Fix segfault in xt action
+
+* Wed Nov 30 2016 Phil Sutter <psutter@redhat.com> - 4.8.0-1
+- New version 4.8.0
+
+* Wed Aug 10 2016 Phil Sutter <psutter@redhat.com> - 4.7.0-1
+- New version 4.7.0
+
+* Wed May 04 2016 Phil Sutter <psutter@redhat.com> - 4.6.0-1
+- New version 4.6.0
+
+* Wed Apr 13  2016 Thomas Woerner <twoerner@redhat.com> - 4.5.0-4
+- Rebuild for new iptables-1.6.0 with libxtables so bump
+
+* Fri Apr 08 2016 Phil Sutter <psutter@redhat.com> - 4.5.0-3
+- Fix upgrade path by adding correct Requires/Obsoletes statements to spec file
+- Move README.iproute2+tc into tc subpackage
+
+* Fri Mar 18 2016 Phil Sutter <psutter@redhat.com> - 4.5.0-2
+- Split tc into it's own subpackage
+
+* Fri Mar 18 2016 Phil Sutter <psutter@redhat.com> - 4.5.0-1
+- New version 4.5.0
+
+* Thu Feb 04 2016 Fedora Release Engineering <releng@fedoraproject.org> - 4.4.0-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
+
+* Tue Jan 19 2016 Phil Sutter <psutter@redhat.com> - 4.4.0-1
+- New version 4.4.0
+
+* Sun Oct 04 2015 Phil Sutter <psutter@redhat.com> - 4.2.0-4
+- Simplify RPM install stage by using package's install target
+
+* Sun Oct 04 2015 Phil Sutter <psutter@redhat.com> - 4.2.0-3
+- Add missing build dependency to libmnl-devel
+- Ship tipc utility
+
+* Thu Sep 24 2015 Phil Sutter <psutter@redhat.com> - 4.2.0-2
+- Add missing build dependency to libselinux-devel
+
+* Wed Sep 02 2015 Pavel Šimerda <psimerda@redhat.com> - 4.2.0-1
+- new version 4.2.0
+
+* Tue Jul 07 2015 Pavel Šimerda <psimerda@redhat.com> - 4.1.1-1
+- new version 4.1.1
+
+* Wed Jun 17 2015 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 4.0.0-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
+
+* Wed May 13 2015 Pavel Šimerda <psimerda@redhat.com> - 4.0.0-3
+- remove patch rejected by upstream
+
+* Mon May 11 2015 Pavel Šimerda <psimerda@redhat.com> - 4.0.0-2
+- Remove patch rejected by upstream
+
+* Tue Apr 14 2015 Pavel Šimerda <psimerda@redhat.com> - 4.0.0-1
+- new version 4.0.0
+
+* Fri Mar 13 2015 Pavel Šimerda <psimerda@redhat.com> - 3.19.0-1
+- new version 3.19.0
+
+* Sat Oct 04 2014 Lubomir Rintel <lkundrak@v3.sk> - 3.16.0-3
+- Backport fix for ip link add name regression that broke libvirt
+
+* Sat Aug 16 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.16.0-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
+
+* Tue Aug 05 2014 Petr Šabata <contyk@redhat.com> - 3.16.0-1
+- 3.16 bump
+
+* Sat Jul 12 2014 Tom Callaway <spot@fedoraproject.org> - 3.15.0-2
+- fix license handling
+
+* Thu Jun 12 2014 Petr Šabata <contyk@redhat.com> - 3.15.0-1
+- 3.15.0 bump
+
+* Sat Jun 07 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.14.0-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
+
+* Tue May 06 2014 Petr Šabata <contyk@redhat.com> - 3.14.0-2
+- Fix incorrect references in ss(8), #1092653
+
+* Tue Apr 15 2014 Petr Šabata <contyk@redhat.com> - 3.14.0-1
+- 3.14 bump
+- Drop out iplink_have_newlink() fix in favor of upstream's approach
+
+* Tue Nov 26 2013 Petr Šabata <contyk@redhat.com> - 3.12.0-2
+- Drop libnl from dependencies (#1034454)
+
+* Mon Nov 25 2013 Petr Šabata <contyk@redhat.com> - 3.12.0-1
+- 3.12.0 bump
+
+* Thu Nov 21 2013 Petr Šabata <contyk@redhat.com> - 3.11.0-2
+- Fix the rtt time parsing again
+
+* Tue Oct 22 2013 Petr Šabata <contyk@redhat.com> - 3.11.0-1
+- 3.11 bump
+
+* Tue Oct 01 2013 Petr Pisar <ppisar@redhat.com> - 3.10.0-8
+- Close file with bridge monitor file (bug #1011822)
+
+* Tue Sep 24 2013 Petr Pisar <ppisar@redhat.com> - 3.10.0-7
+- Add tc -OK option
+- Document "bridge mdb" and "bridge monitor mdb"
+
+* Fri Aug 30 2013 Petr Šabata <contyk@redhat.com> - 3.10.0-6
+- Fix lnstat -i properly this time
+
+* Thu Aug 29 2013 Petr Šabata <contyk@redhat.com> - 3.10.0-5
+- Fix an 'ip link' hang (#996537)
+
+* Tue Aug 13 2013 Petr Šabata <contyk@redhat.com> - 3.10.0-4
+- lnstat -i: Run indefinitely if the --count isn't specified (#977845)
+- Switch to unversioned %%docdir
+
+* Sat Aug 03 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.10.0-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
+
+* 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