diff --git a/.gitignore b/.gitignore
index 581167a..8da3976 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-SOURCES/iproute2-5.9.0.tar.xz
+SOURCES/iproute2-5.12.0.tar.xz
diff --git a/.iproute.metadata b/.iproute.metadata
index 3b76ec4..7ed2e23 100644
--- a/.iproute.metadata
+++ b/.iproute.metadata
@@ -1 +1 @@
-c9e0ca453307ce7c221ccffc10939f4136b4ad5d SOURCES/iproute2-5.9.0.tar.xz
+4e18c1d72a29f41a5968ac8a9b266470f6ad89a7 SOURCES/iproute2-5.12.0.tar.xz
diff --git a/SOURCES/0001-v5.9.0.patch b/SOURCES/0001-v5.9.0.patch
deleted file mode 100644
index f0868bb..0000000
--- a/SOURCES/0001-v5.9.0.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-From cb7ce51cc1abd7b98370b903ec96205ebfe48661 Mon Sep 17 00:00:00 2001
-Message-Id: <cb7ce51cc1abd7b98370b903ec96205ebfe48661.1611877215.git.aclaudi@redhat.com>
-From: Stephen Hemminger <stephen@networkplumber.org>
-Date: Thu, 15 Oct 2020 15:18:35 -0700
-Subject: [PATCH] v5.9.0
-
----
- include/version.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/include/version.h b/include/version.h
-index 0088493d..89d05974 100644
---- a/include/version.h
-+++ b/include/version.h
-@@ -1 +1 @@
--static const char version[] = "5.8.0";
-+static const char version[] = "5.9.0";
--- 
-2.29.2
-
diff --git a/SOURCES/0002-Update-kernel-headers.patch b/SOURCES/0002-Update-kernel-headers.patch
deleted file mode 100644
index 60a94f4..0000000
--- a/SOURCES/0002-Update-kernel-headers.patch
+++ /dev/null
@@ -1,308 +0,0 @@
-From 1b8a3c04bf8d115e2d427d41a437be03ecf34ce8 Mon Sep 17 00:00:00 2001
-Message-Id: <1b8a3c04bf8d115e2d427d41a437be03ecf34ce8.1611877215.git.aclaudi@redhat.com>
-In-Reply-To: <cb7ce51cc1abd7b98370b903ec96205ebfe48661.1611877215.git.aclaudi@redhat.com>
-References: <cb7ce51cc1abd7b98370b903ec96205ebfe48661.1611877215.git.aclaudi@redhat.com>
-From: Andrea Claudi <aclaudi@redhat.com>
-Date: Fri, 29 Jan 2021 00:34:34 +0100
-Subject: [PATCH] Update kernel headers
-
-Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1885770
-Upstream Status: unknown commit 34be2d26
-Conflicts: on include/uapi/linux/bpf.h, due to missing commits:
-  - c8eb4b52c1b1 ("Update kernel headers")
-  - f481515c89fa ("Update kernel headers")
-
-commit 34be2d2619e29836605a7d1669d642f892fc725e
-Author: David Ahern <dsahern@gmail.com>
-Date:   Wed Oct 7 00:01:26 2020 -0600
-
-    Update kernel headers
-
-    Update kernel headers to commit:
-        9faebeb2d800 ("Merge branch 'ethtool-allow-dumping-policies-to-user-space'")
-
-    Signed-off-by: David Ahern <dsahern@gmail.com>
----
- include/uapi/linux/bpf.h            | 64 +++++++++++++++++++++++++----
- include/uapi/linux/devlink.h        |  5 +++
- include/uapi/linux/genetlink.h      | 11 +++++
- include/uapi/linux/l2tp.h           |  1 +
- include/uapi/linux/netlink.h        |  2 +
- include/uapi/linux/tc_act/tc_mpls.h |  1 +
- include/uapi/linux/tc_act/tc_vlan.h |  4 ++
- 7 files changed, 79 insertions(+), 9 deletions(-)
-
-diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
-index b21cc6af..36e5bc2d 100644
---- a/include/uapi/linux/bpf.h
-+++ b/include/uapi/linux/bpf.h
-@@ -404,6 +404,9 @@ enum {
- 
- /* Enable memory-mapping BPF map */
- 	BPF_F_MMAPABLE		= (1U << 10),
-+
-+/* Share perf_event among processes */
-+	BPF_F_PRESERVE_ELEMS	= (1U << 11),
- };
- 
- /* Flags for BPF_PROG_QUERY. */
-@@ -414,6 +417,11 @@ enum {
-  */
- #define BPF_F_QUERY_EFFECTIVE	(1U << 0)
- 
-+/* Flags for BPF_PROG_TEST_RUN */
-+
-+/* If set, run the test on the cpu specified by bpf_attr.test.cpu */
-+#define BPF_F_TEST_RUN_ON_CPU	(1U << 0)
-+
- /* type for BPF_ENABLE_STATS */
- enum bpf_stats_type {
- 	/* enabled run_time_ns and run_cnt */
-@@ -556,6 +564,8 @@ union bpf_attr {
- 						 */
- 		__aligned_u64	ctx_in;
- 		__aligned_u64	ctx_out;
-+		__u32		flags;
-+		__u32		cpu;
- 	} test;
- 
- 	struct { /* anonymous struct used by BPF_*_GET_*_ID */
-@@ -622,8 +632,13 @@ union bpf_attr {
- 		};
- 		__u32		attach_type;	/* attach type */
- 		__u32		flags;		/* extra flags */
--		__aligned_u64	iter_info;	/* extra bpf_iter_link_info */
--		__u32		iter_info_len;	/* iter_info length */
-+		union {
-+			__u32		target_btf_id;	/* btf_id of target to attach to */
-+			struct {
-+				__aligned_u64	iter_info;	/* extra bpf_iter_link_info */
-+				__u32		iter_info_len;	/* iter_info length */
-+			};
-+		};
- 	} link_create;
- 
- 	struct { /* struct used by BPF_LINK_UPDATE command */
-@@ -2496,7 +2511,7 @@ union bpf_attr {
-  *		result is from *reuse*\ **->socks**\ [] using the hash of the
-  *		tuple.
-  *
-- * long bpf_sk_release(struct bpf_sock *sock)
-+ * long bpf_sk_release(void *sock)
-  *	Description
-  *		Release the reference held by *sock*. *sock* must be a
-  *		non-**NULL** pointer that was returned from
-@@ -2676,7 +2691,7 @@ union bpf_attr {
-  *		result is from *reuse*\ **->socks**\ [] using the hash of the
-  *		tuple.
-  *
-- * long bpf_tcp_check_syncookie(struct bpf_sock *sk, void *iph, u32 iph_len, struct tcphdr *th, u32 th_len)
-+ * long bpf_tcp_check_syncookie(void *sk, void *iph, u32 iph_len, struct tcphdr *th, u32 th_len)
-  * 	Description
-  * 		Check whether *iph* and *th* contain a valid SYN cookie ACK for
-  * 		the listening socket in *sk*.
-@@ -2842,6 +2857,7 @@ union bpf_attr {
-  *		0 on success.
-  *
-  *		**-ENOENT** if the bpf-local-storage cannot be found.
-+ *		**-EINVAL** if sk is not a fullsock (e.g. a request_sock).
-  *
-  * long bpf_send_signal(u32 sig)
-  *	Description
-@@ -2858,7 +2874,7 @@ union bpf_attr {
-  *
-  *		**-EAGAIN** if bpf program can try again.
-  *
-- * s64 bpf_tcp_gen_syncookie(struct bpf_sock *sk, void *iph, u32 iph_len, struct tcphdr *th, u32 th_len)
-+ * s64 bpf_tcp_gen_syncookie(void *sk, void *iph, u32 iph_len, struct tcphdr *th, u32 th_len)
-  *	Description
-  *		Try to issue a SYN cookie for the packet with corresponding
-  *		IP/TCP headers, *iph* and *th*, on the listening socket in *sk*.
-@@ -3087,7 +3103,7 @@ union bpf_attr {
-  * 	Return
-  * 		The id is returned or 0 in case the id could not be retrieved.
-  *
-- * long bpf_sk_assign(struct sk_buff *skb, struct bpf_sock *sk, u64 flags)
-+ * long bpf_sk_assign(struct sk_buff *skb, void *sk, u64 flags)
-  *	Description
-  *		Helper is overloaded depending on BPF program type. This
-  *		description applies to **BPF_PROG_TYPE_SCHED_CLS** and
-@@ -3215,11 +3231,11 @@ union bpf_attr {
-  *
-  *		**-EOVERFLOW** if an overflow happened: The same object will be tried again.
-  *
-- * u64 bpf_sk_cgroup_id(struct bpf_sock *sk)
-+ * u64 bpf_sk_cgroup_id(void *sk)
-  *	Description
-  *		Return the cgroup v2 id of the socket *sk*.
-  *
-- *		*sk* must be a non-**NULL** pointer to a full socket, e.g. one
-+ *		*sk* must be a non-**NULL** pointer to a socket, e.g. one
-  *		returned from **bpf_sk_lookup_xxx**\ (),
-  *		**bpf_sk_fullsock**\ (), etc. The format of returned id is
-  *		same as in **bpf_skb_cgroup_id**\ ().
-@@ -3229,7 +3245,7 @@ union bpf_attr {
-  *	Return
-  *		The id is returned or 0 in case the id could not be retrieved.
-  *
-- * u64 bpf_sk_ancestor_cgroup_id(struct bpf_sock *sk, int ancestor_level)
-+ * u64 bpf_sk_ancestor_cgroup_id(void *sk, int ancestor_level)
-  *	Description
-  *		Return id of cgroup v2 that is ancestor of cgroup associated
-  *		with the *sk* at the *ancestor_level*.  The root cgroup is at
-@@ -4447,4 +4463,34 @@ struct bpf_sk_lookup {
- 	__u32 local_port;	/* Host byte order */
- };
- 
-+/*
-+ * struct btf_ptr is used for typed pointer representation; the
-+ * type id is used to render the pointer data as the appropriate type
-+ * via the bpf_snprintf_btf() helper described above.  A flags field -
-+ * potentially to specify additional details about the BTF pointer
-+ * (rather than its mode of display) - is included for future use.
-+ * Display flags - BTF_F_* - are passed to bpf_snprintf_btf separately.
-+ */
-+struct btf_ptr {
-+	void *ptr;
-+	__u32 type_id;
-+	__u32 flags;		/* BTF ptr flags; unused at present. */
-+};
-+
-+/*
-+ * Flags to control bpf_snprintf_btf() behaviour.
-+ *     - BTF_F_COMPACT: no formatting around type information
-+ *     - BTF_F_NONAME: no struct/union member names/types
-+ *     - BTF_F_PTR_RAW: show raw (unobfuscated) pointer values;
-+ *       equivalent to %px.
-+ *     - BTF_F_ZERO: show zero-valued struct/union members; they
-+ *       are not displayed by default
-+ */
-+enum {
-+	BTF_F_COMPACT	=	(1ULL << 0),
-+	BTF_F_NONAME	=	(1ULL << 1),
-+	BTF_F_PTR_RAW	=	(1ULL << 2),
-+	BTF_F_ZERO	=	(1ULL << 3),
-+};
-+
- #endif /* __LINUX_BPF_H__ */
-diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h
-index b7f23faa..e5586fa0 100644
---- a/include/uapi/linux/devlink.h
-+++ b/include/uapi/linux/devlink.h
-@@ -13,6 +13,8 @@
- #ifndef _LINUX_DEVLINK_H_
- #define _LINUX_DEVLINK_H_
- 
-+#include <linux/const.h>
-+
- #define DEVLINK_GENL_NAME "devlink"
- #define DEVLINK_GENL_VERSION 0x1
- #define DEVLINK_GENL_MCGRP_CONFIG_NAME "config"
-@@ -193,6 +195,9 @@ enum devlink_port_flavour {
- 				      * port that faces the PCI VF.
- 				      */
- 	DEVLINK_PORT_FLAVOUR_VIRTUAL, /* Any virtual port facing the user. */
-+	DEVLINK_PORT_FLAVOUR_UNUSED, /* Port which exists in the switch, but
-+				      * is not used in any way.
-+				      */
- };
- 
- enum devlink_param_cmode {
-diff --git a/include/uapi/linux/genetlink.h b/include/uapi/linux/genetlink.h
-index 7c6c390c..9fa720ee 100644
---- a/include/uapi/linux/genetlink.h
-+++ b/include/uapi/linux/genetlink.h
-@@ -64,6 +64,8 @@ enum {
- 	CTRL_ATTR_OPS,
- 	CTRL_ATTR_MCAST_GROUPS,
- 	CTRL_ATTR_POLICY,
-+	CTRL_ATTR_OP_POLICY,
-+	CTRL_ATTR_OP,
- 	__CTRL_ATTR_MAX,
- };
- 
-@@ -85,6 +87,15 @@ enum {
- 	__CTRL_ATTR_MCAST_GRP_MAX,
- };
- 
-+enum {
-+	CTRL_ATTR_POLICY_UNSPEC,
-+	CTRL_ATTR_POLICY_DO,
-+	CTRL_ATTR_POLICY_DUMP,
-+
-+	__CTRL_ATTR_POLICY_DUMP_MAX,
-+	CTRL_ATTR_POLICY_DUMP_MAX = __CTRL_ATTR_POLICY_DUMP_MAX - 1
-+};
-+
- #define CTRL_ATTR_MCAST_GRP_MAX (__CTRL_ATTR_MCAST_GRP_MAX - 1)
- 
- 
-diff --git a/include/uapi/linux/l2tp.h b/include/uapi/linux/l2tp.h
-index 131c3a26..abc0fc81 100644
---- a/include/uapi/linux/l2tp.h
-+++ b/include/uapi/linux/l2tp.h
-@@ -144,6 +144,7 @@ enum {
- 	L2TP_ATTR_RX_OOS_PACKETS,	/* u64 */
- 	L2TP_ATTR_RX_ERRORS,		/* u64 */
- 	L2TP_ATTR_STATS_PAD,
-+	L2TP_ATTR_RX_COOKIE_DISCARDS,	/* u64 */
- 	__L2TP_ATTR_STATS_MAX,
- };
- 
-diff --git a/include/uapi/linux/netlink.h b/include/uapi/linux/netlink.h
-index 695c88e3..f7749205 100644
---- a/include/uapi/linux/netlink.h
-+++ b/include/uapi/linux/netlink.h
-@@ -327,6 +327,7 @@ enum netlink_attribute_type {
-  *	the index, if limited inside the nesting (U32)
-  * @NL_POLICY_TYPE_ATTR_BITFIELD32_MASK: valid mask for the
-  *	bitfield32 type (U32)
-+ * @NL_POLICY_TYPE_ATTR_MASK: mask of valid bits for unsigned integers (U64)
-  * @NL_POLICY_TYPE_ATTR_PAD: pad attribute for 64-bit alignment
-  */
- enum netlink_policy_type_attr {
-@@ -342,6 +343,7 @@ enum netlink_policy_type_attr {
- 	NL_POLICY_TYPE_ATTR_POLICY_MAXTYPE,
- 	NL_POLICY_TYPE_ATTR_BITFIELD32_MASK,
- 	NL_POLICY_TYPE_ATTR_PAD,
-+	NL_POLICY_TYPE_ATTR_MASK,
- 
- 	/* keep last */
- 	__NL_POLICY_TYPE_ATTR_MAX,
-diff --git a/include/uapi/linux/tc_act/tc_mpls.h b/include/uapi/linux/tc_act/tc_mpls.h
-index 9360e952..9e4e8f52 100644
---- a/include/uapi/linux/tc_act/tc_mpls.h
-+++ b/include/uapi/linux/tc_act/tc_mpls.h
-@@ -10,6 +10,7 @@
- #define TCA_MPLS_ACT_PUSH	2
- #define TCA_MPLS_ACT_MODIFY	3
- #define TCA_MPLS_ACT_DEC_TTL	4
-+#define TCA_MPLS_ACT_MAC_PUSH	5
- 
- struct tc_mpls {
- 	tc_gen;		/* generic TC action fields. */
-diff --git a/include/uapi/linux/tc_act/tc_vlan.h b/include/uapi/linux/tc_act/tc_vlan.h
-index 168995b5..5b306fe8 100644
---- a/include/uapi/linux/tc_act/tc_vlan.h
-+++ b/include/uapi/linux/tc_act/tc_vlan.h
-@@ -16,6 +16,8 @@
- #define TCA_VLAN_ACT_POP	1
- #define TCA_VLAN_ACT_PUSH	2
- #define TCA_VLAN_ACT_MODIFY	3
-+#define TCA_VLAN_ACT_POP_ETH	4
-+#define TCA_VLAN_ACT_PUSH_ETH	5
- 
- struct tc_vlan {
- 	tc_gen;
-@@ -30,6 +32,8 @@ enum {
- 	TCA_VLAN_PUSH_VLAN_PROTOCOL,
- 	TCA_VLAN_PAD,
- 	TCA_VLAN_PUSH_VLAN_PRIORITY,
-+	TCA_VLAN_PUSH_ETH_DST,
-+	TCA_VLAN_PUSH_ETH_SRC,
- 	__TCA_VLAN_MAX,
- };
- #define TCA_VLAN_MAX (__TCA_VLAN_MAX - 1)
--- 
-2.29.2
-
diff --git a/SOURCES/0003-m_vlan-add-pop_eth-and-push_eth-actions.patch b/SOURCES/0003-m_vlan-add-pop_eth-and-push_eth-actions.patch
deleted file mode 100644
index fa1b401..0000000
--- a/SOURCES/0003-m_vlan-add-pop_eth-and-push_eth-actions.patch
+++ /dev/null
@@ -1,343 +0,0 @@
-From cac52dd831b6982f6b27b02c26243edbe0b7d747 Mon Sep 17 00:00:00 2001
-Message-Id: <cac52dd831b6982f6b27b02c26243edbe0b7d747.1611877215.git.aclaudi@redhat.com>
-In-Reply-To: <cb7ce51cc1abd7b98370b903ec96205ebfe48661.1611877215.git.aclaudi@redhat.com>
-References: <cb7ce51cc1abd7b98370b903ec96205ebfe48661.1611877215.git.aclaudi@redhat.com>
-From: Andrea Claudi <aclaudi@redhat.com>
-Date: Fri, 29 Jan 2021 00:35:03 +0100
-Subject: [PATCH] m_vlan: add pop_eth and push_eth actions
-
-Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1885770
-Upstream Status: unknown commit d61167dd
-
-commit d61167dd88b45832843b1458cd156f3b85c8ff16
-Author: Guillaume Nault <gnault@redhat.com>
-Date:   Mon Oct 19 17:23:01 2020 +0200
-
-    m_vlan: add pop_eth and push_eth actions
-
-    Add support for the new TCA_VLAN_ACT_POP_ETH and TCA_VLAN_ACT_PUSH_ETH
-    actions (kernel commit 19fbcb36a39e ("net/sched: act_vlan:
-    Add {POP,PUSH}_ETH actions"). These action let TC remove or add the
-    Ethernet at the head of a frame.
-
-    Drop an Ethernet header:
-     # tc filter add dev ethX matchall action vlan pop_eth
-
-    Push an Ethernet header (the original frame must have no MAC header):
-     # tc filter add dev ethX matchall action vlan \
-           push_eth dst_mac 0a:00:00:00:00:02 src_mac 0a:00:00:00:00:01
-
-    Also add a test suite for m_vlan, which covers these new actions and
-    the pre-existing ones.
-
-    Signed-off-by: Guillaume Nault <gnault@redhat.com>
-    Signed-off-by: David Ahern <dsahern@gmail.com>
----
- man/man8/tc-vlan.8        | 39 +++++++++++++++++-
- tc/m_vlan.c               | 69 +++++++++++++++++++++++++++++++
- testsuite/tests/tc/vlan.t | 86 +++++++++++++++++++++++++++++++++++++++
- 3 files changed, 192 insertions(+), 2 deletions(-)
- create mode 100755 testsuite/tests/tc/vlan.t
-
-diff --git a/man/man8/tc-vlan.8 b/man/man8/tc-vlan.8
-index f5ffc25f..5c2808b1 100644
---- a/man/man8/tc-vlan.8
-+++ b/man/man8/tc-vlan.8
-@@ -5,8 +5,8 @@ vlan - vlan manipulation module
- .SH SYNOPSIS
- .in +8
- .ti -8
--.BR tc " ... " "action vlan" " { " pop " |"
--.IR PUSH " | " MODIFY " } [ " CONTROL " ]"
-+.BR tc " ... " "action vlan" " { " pop " | " pop_eth " |"
-+.IR PUSH " | " MODIFY " | " PUSH_ETH " } [ " CONTROL " ]"
- 
- .ti -8
- .IR PUSH " := "
-@@ -24,6 +24,11 @@ vlan - vlan manipulation module
- .IR VLANPRIO " ] "
- .BI id " VLANID"
- 
-+.ti -8
-+.IR PUSH_ETH " := "
-+.B push_eth
-+.BI dst_mac " LLADDR " src_mac " LLADDR "
-+
- .ti -8
- .IR CONTROL " := { "
- .BR reclassify " | " pipe " | " drop " | " continue " | " pass " | " goto " " chain " " CHAIN_INDEX " }"
-@@ -43,6 +48,20 @@ modes require at least a
- and allow to optionally choose the
- .I VLANPROTO
- to use.
-+
-+The
-+.B vlan
-+action can also be used to add or remove the base Ethernet header. The
-+.B pop_eth
-+mode, which takes no argument, is used to remove the base Ethernet header. All
-+existing VLANs must have been previously dropped. The opposite operation,
-+adding a base Ethernet header, is done with the
-+.B push_eth
-+mode. In that case, the packet must have no MAC header (stacking MAC headers is
-+not permitted). This mode is mostly useful when a previous action has
-+encapsulated the whole original frame behind a network header and one needs
-+to prepend an Ethernet header before forwarding the resulting packet.
-+
- .SH OPTIONS
- .TP
- .B pop
-@@ -58,6 +77,16 @@ Replace mode. Existing 802.1Q tag is replaced. Requires at least
- .B id
- option.
- .TP
-+.B pop_eth
-+Ethernet header decapsulation mode. Only works on a plain Ethernet header:
-+VLANs, if any, must be removed first.
-+.TP
-+.B push_eth
-+Ethernet header encapsulation mode. The Ethertype is automatically set
-+using the network header type. Chaining Ethernet headers is not allowed: the
-+packet must have no MAC header when using this mode. Requires the
-+.BR "dst_mac " and " src_mac " options.
-+.TP
- .BI id " VLANID"
- Specify the VLAN ID to encapsulate into.
- .I VLANID
-@@ -73,6 +102,12 @@ Choose the VLAN protocol to use. At the time of writing, the kernel accepts only
- .BI priority " VLANPRIO"
- Choose the VLAN priority to use. Decimal number in range of 0-7.
- .TP
-+.BI dst_mac " LLADDR"
-+Choose the destination MAC address to use.
-+.TP
-+.BI src_mac " LLADDR"
-+Choose the source MAC address to use.
-+.TP
- .I CONTROL
- How to continue after executing this action.
- .RS
-diff --git a/tc/m_vlan.c b/tc/m_vlan.c
-index 1096ba0f..e6b21330 100644
---- a/tc/m_vlan.c
-+++ b/tc/m_vlan.c
-@@ -23,6 +23,8 @@ static const char * const action_names[] = {
- 	[TCA_VLAN_ACT_POP] = "pop",
- 	[TCA_VLAN_ACT_PUSH] = "push",
- 	[TCA_VLAN_ACT_MODIFY] = "modify",
-+	[TCA_VLAN_ACT_POP_ETH] = "pop_eth",
-+	[TCA_VLAN_ACT_PUSH_ETH] = "push_eth",
- };
- 
- static void explain(void)
-@@ -31,6 +33,8 @@ static void explain(void)
- 		"Usage: vlan pop\n"
- 		"       vlan push [ protocol VLANPROTO ] id VLANID [ priority VLANPRIO ] [CONTROL]\n"
- 		"       vlan modify [ protocol VLANPROTO ] id VLANID [ priority VLANPRIO ] [CONTROL]\n"
-+		"       vlan pop_eth [CONTROL]\n"
-+		"       vlan push_eth dst_mac LLADDR src_mac LLADDR [CONTROL]\n"
- 		"       VLANPROTO is one of 802.1Q or 802.1AD\n"
- 		"            with default: 802.1Q\n"
- 		"       CONTROL := reclassify | pipe | drop | continue | pass |\n"
-@@ -63,6 +67,10 @@ static int parse_vlan(struct action_util *a, int *argc_p, char ***argv_p,
- 	char **argv = *argv_p;
- 	struct rtattr *tail;
- 	int action = 0;
-+	char dst_mac[ETH_ALEN] = {};
-+	int dst_mac_set = 0;
-+	char src_mac[ETH_ALEN] = {};
-+	int src_mac_set = 0;
- 	__u16 id;
- 	int id_set = 0;
- 	__u16 proto;
-@@ -95,6 +103,18 @@ static int parse_vlan(struct action_util *a, int *argc_p, char ***argv_p,
- 				return -1;
- 			}
- 			action = TCA_VLAN_ACT_MODIFY;
-+		} else if (matches(*argv, "pop_eth") == 0) {
-+			if (action) {
-+				unexpected(*argv);
-+				return -1;
-+			}
-+			action = TCA_VLAN_ACT_POP_ETH;
-+		} else if (matches(*argv, "push_eth") == 0) {
-+			if (action) {
-+				unexpected(*argv);
-+				return -1;
-+			}
-+			action = TCA_VLAN_ACT_PUSH_ETH;
- 		} else if (matches(*argv, "id") == 0) {
- 			if (!has_push_attribs(action))
- 				invarg("only valid for push/modify", *argv);
-@@ -119,6 +139,22 @@ static int parse_vlan(struct action_util *a, int *argc_p, char ***argv_p,
- 			if (get_u8(&prio, *argv, 0) || (prio & ~0x7))
- 				invarg("prio is invalid", *argv);
- 			prio_set = 1;
-+		} else if (matches(*argv, "dst_mac") == 0) {
-+			if (action != TCA_VLAN_ACT_PUSH_ETH)
-+				invarg("only valid for push_eth", *argv);
-+
-+			NEXT_ARG();
-+			if (ll_addr_a2n(dst_mac, sizeof(dst_mac), *argv) < 0)
-+				invarg("dst_mac is invalid", *argv);
-+			dst_mac_set = 1;
-+		} else if (matches(*argv, "src_mac") == 0) {
-+			if (action != TCA_VLAN_ACT_PUSH_ETH)
-+				invarg("only valid for push_eth", *argv);
-+
-+			NEXT_ARG();
-+			if (ll_addr_a2n(src_mac, sizeof(src_mac), *argv) < 0)
-+				invarg("src_mac is invalid", *argv);
-+			src_mac_set = 1;
- 		} else if (matches(*argv, "help") == 0) {
- 			usage();
- 		} else {
-@@ -150,6 +186,20 @@ static int parse_vlan(struct action_util *a, int *argc_p, char ***argv_p,
- 		return -1;
- 	}
- 
-+	if (action == TCA_VLAN_ACT_PUSH_ETH) {
-+		if (!dst_mac_set) {
-+			fprintf(stderr, "dst_mac needs to be set for %s\n",
-+				action_names[action]);
-+			explain();
-+			return -1;
-+		} else if (!src_mac_set) {
-+			fprintf(stderr, "src_mac needs to be set for %s\n",
-+				action_names[action]);
-+			explain();
-+			return -1;
-+		}
-+	}
-+
- 	parm.v_action = action;
- 	tail = addattr_nest(n, MAX_MSG, tca_id);
- 	addattr_l(n, MAX_MSG, TCA_VLAN_PARMS, &parm, sizeof(parm));
-@@ -167,6 +217,12 @@ static int parse_vlan(struct action_util *a, int *argc_p, char ***argv_p,
- 	}
- 	if (prio_set)
- 		addattr8(n, MAX_MSG, TCA_VLAN_PUSH_VLAN_PRIORITY, prio);
-+	if (dst_mac_set)
-+		addattr_l(n, MAX_MSG, TCA_VLAN_PUSH_ETH_DST, dst_mac,
-+			  sizeof(dst_mac));
-+	if (src_mac_set)
-+		addattr_l(n, MAX_MSG, TCA_VLAN_PUSH_ETH_SRC, src_mac,
-+			  sizeof(src_mac));
- 
- 	addattr_nest_end(n, tail);
- 
-@@ -216,6 +272,19 @@ static int print_vlan(struct action_util *au, FILE *f, struct rtattr *arg)
- 			print_uint(PRINT_ANY, "priority", " priority %u", val);
- 		}
- 		break;
-+	case TCA_VLAN_ACT_PUSH_ETH:
-+		if (tb[TCA_VLAN_PUSH_ETH_DST] &&
-+		    RTA_PAYLOAD(tb[TCA_VLAN_PUSH_ETH_DST]) == ETH_ALEN) {
-+			ll_addr_n2a(RTA_DATA(tb[TCA_VLAN_PUSH_ETH_DST]),
-+				    ETH_ALEN, 0, b1, sizeof(b1));
-+			print_string(PRINT_ANY, "dst_mac", " dst_mac %s", b1);
-+		}
-+		if (tb[TCA_VLAN_PUSH_ETH_SRC &&
-+		       RTA_PAYLOAD(tb[TCA_VLAN_PUSH_ETH_SRC]) == ETH_ALEN]) {
-+			ll_addr_n2a(RTA_DATA(tb[TCA_VLAN_PUSH_ETH_SRC]),
-+				    ETH_ALEN, 0, b1, sizeof(b1));
-+			print_string(PRINT_ANY, "src_mac", " src_mac %s", b1);
-+		}
- 	}
- 	print_action_control(f, " ", parm->action, "");
- 
-diff --git a/testsuite/tests/tc/vlan.t b/testsuite/tests/tc/vlan.t
-new file mode 100755
-index 00000000..b86dc364
---- /dev/null
-+++ b/testsuite/tests/tc/vlan.t
-@@ -0,0 +1,86 @@
-+#!/bin/sh
-+
-+. lib/generic.sh
-+
-+DEV="$(rand_dev)"
-+ts_ip "$0" "Add $DEV dummy interface" link add dev $DEV up type dummy
-+ts_tc "$0" "Add ingress qdisc" qdisc add dev $DEV ingress
-+
-+reset_qdisc()
-+{
-+	ts_tc "$0" "Remove ingress qdisc" qdisc del dev $DEV ingress
-+	ts_tc "$0" "Add ingress qdisc" qdisc add dev $DEV ingress
-+}
-+
-+ts_tc "$0" "Add vlan action pop" \
-+	filter add dev $DEV ingress matchall action vlan pop
-+ts_tc "$0" "Show ingress filters" filter show dev $DEV ingress
-+test_on "vlan"
-+test_on "pop"
-+test_on "pipe"
-+
-+reset_qdisc
-+ts_tc "$0" "Add vlan action push (default parameters)" \
-+	filter add dev $DEV ingress matchall action vlan push id 5
-+ts_tc "$0" "Show ingress filters" filter show dev $DEV ingress
-+test_on "vlan"
-+test_on "push"
-+test_on "id 5"
-+test_on "protocol 802.1Q"
-+test_on "priority 0"
-+test_on "pipe"
-+
-+reset_qdisc
-+ts_tc "$0" "Add vlan action push (explicit parameters)" \
-+	filter add dev $DEV ingress matchall            \
-+	action vlan push id 5 protocol 802.1ad priority 2
-+ts_tc "$0" "Show ingress filters" filter show dev $DEV ingress
-+test_on "vlan"
-+test_on "push"
-+test_on "id 5"
-+test_on "protocol 802.1ad"
-+test_on "priority 2"
-+test_on "pipe"
-+
-+reset_qdisc
-+ts_tc "$0" "Add vlan action modify (default parameters)" \
-+	filter add dev $DEV ingress matchall action vlan modify id 5
-+ts_tc "$0" "Show ingress filters" filter show dev $DEV ingress
-+test_on "vlan"
-+test_on "modify"
-+test_on "id 5"
-+test_on "protocol 802.1Q"
-+test_on "priority 0"
-+test_on "pipe"
-+
-+reset_qdisc
-+ts_tc "$0" "Add vlan action modify (explicit parameters)" \
-+	filter add dev $DEV ingress matchall              \
-+	action vlan modify id 5 protocol 802.1ad priority 2
-+ts_tc "$0" "Show ingress filters" filter show dev $DEV ingress
-+test_on "vlan"
-+test_on "modify"
-+test_on "id 5"
-+test_on "protocol 802.1ad"
-+test_on "priority 2"
-+test_on "pipe"
-+
-+reset_qdisc
-+ts_tc "$0" "Add vlan action pop_eth" \
-+	filter add dev $DEV ingress matchall action vlan pop_eth
-+ts_tc "$0" "Show ingress filters" filter show dev $DEV ingress
-+test_on "vlan"
-+test_on "pop_eth"
-+test_on "pipe"
-+
-+reset_qdisc
-+ts_tc "$0" "Add vlan action push_eth"                  \
-+	filter add dev $DEV ingress matchall           \
-+	action vlan push_eth dst_mac 02:00:00:00:00:02 \
-+	src_mac 02:00:00:00:00:01
-+ts_tc "$0" "Show ingress filters" filter show dev $DEV ingress
-+test_on "vlan"
-+test_on "push_eth"
-+test_on "dst_mac 02:00:00:00:00:02"
-+test_on "src_mac 02:00:00:00:00:01"
-+test_on "pipe"
--- 
-2.29.2
-
diff --git a/SOURCES/0004-m_mpls-add-mac_push-action.patch b/SOURCES/0004-m_mpls-add-mac_push-action.patch
deleted file mode 100644
index 54c1c3c..0000000
--- a/SOURCES/0004-m_mpls-add-mac_push-action.patch
+++ /dev/null
@@ -1,342 +0,0 @@
-From 0afe12a4a9471ed1343693338ec6350dc66ba295 Mon Sep 17 00:00:00 2001
-Message-Id: <0afe12a4a9471ed1343693338ec6350dc66ba295.1611877215.git.aclaudi@redhat.com>
-In-Reply-To: <cb7ce51cc1abd7b98370b903ec96205ebfe48661.1611877215.git.aclaudi@redhat.com>
-References: <cb7ce51cc1abd7b98370b903ec96205ebfe48661.1611877215.git.aclaudi@redhat.com>
-From: Andrea Claudi <aclaudi@redhat.com>
-Date: Fri, 29 Jan 2021 00:35:03 +0100
-Subject: [PATCH] m_mpls: add mac_push action
-
-Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1885770
-Upstream Status: unknown commit 02a261b5
-
-commit 02a261b5ba1c8580ac2a35bc6c87faa2ec9f5c96
-Author: Guillaume Nault <gnault@redhat.com>
-Date:   Mon Oct 19 17:23:08 2020 +0200
-
-    m_mpls: add mac_push action
-
-    Add support for the new TCA_MPLS_ACT_MAC_PUSH action (kernel commit
-    a45294af9e96 ("net/sched: act_mpls: Add action to push MPLS LSE before
-    Ethernet header")). This action let TC push an MPLS header before the
-    MAC header of a frame.
-
-    Example (encapsulate all outgoing frames with label 20, then add an
-    outer Ethernet header):
-     # tc filter add dev ethX matchall \
-           action mpls mac_push label 20 ttl 64 \
-           action vlan push_eth dst_mac 0a:00:00:00:00:02 \
-                                src_mac 0a:00:00:00:00:01
-
-    This patch also adds an alias for ETH_P_TEB, since it is useful when
-    decapsulating MPLS packets that contain an Ethernet frame.
-
-    With MAC_PUSH, there's no previous Ethertype to modify. However, the
-    "protocol" option is still needed, because the kernel uses it to set
-    skb->protocol. So rename can_modify_ethtype() to can_set_ethtype().
-
-    Also add a test suite for m_mpls, which covers the new action and the
-    pre-existing ones.
-
-    Signed-off-by: Guillaume Nault <gnault@redhat.com>
-    Signed-off-by: David Ahern <dsahern@gmail.com>
----
- lib/ll_proto.c            |  1 +
- man/man8/tc-mpls.8        | 44 +++++++++++++++++++++++--
- man/man8/tc-vlan.8        |  5 ++-
- tc/m_mpls.c               | 43 ++++++++++++++++--------
- testsuite/tests/tc/mpls.t | 69 +++++++++++++++++++++++++++++++++++++++
- 5 files changed, 145 insertions(+), 17 deletions(-)
- create mode 100755 testsuite/tests/tc/mpls.t
-
-diff --git a/lib/ll_proto.c b/lib/ll_proto.c
-index 2a0c1cb3..78179311 100644
---- a/lib/ll_proto.c
-+++ b/lib/ll_proto.c
-@@ -80,6 +80,7 @@ __PF(8021Q,802.1Q)
- __PF(8021AD,802.1ad)
- __PF(MPLS_UC,mpls_uc)
- __PF(MPLS_MC,mpls_mc)
-+__PF(TEB,teb)
- 
- { 0x8100, "802.1Q" },
- { 0x88cc, "LLDP" },
-diff --git a/man/man8/tc-mpls.8 b/man/man8/tc-mpls.8
-index 84ef2ef1..9e563e98 100644
---- a/man/man8/tc-mpls.8
-+++ b/man/man8/tc-mpls.8
-@@ -17,7 +17,7 @@ mpls - mpls manipulation module
- 
- .ti -8
- .IR PUSH " := "
--.BR push " [ " protocol
-+.RB "{ " push " | " mac_push " } [ " protocol
- .IR MPLS_PROTO " ]"
- .RB " [ " tc
- .IR MPLS_TC " ] "
-@@ -64,7 +64,14 @@ requires no arguments and simply subtracts 1 from the MPLS header TTL field.
- Decapsulation mode. Requires the protocol of the next header.
- .TP
- .B push
--Encapsulation mode. Requires at least the
-+Encapsulation mode. Adds the MPLS header between the MAC and the network
-+headers. Requires at least the
-+.B label
-+option.
-+.TP
-+.B mac_push
-+Encapsulation mode. Adds the MPLS header before the MAC header. Requires at
-+least the
- .B label
- option.
- .TP
-@@ -152,5 +159,36 @@ ip packets and output to eth1:
- .EE
- .RE
- 
-+Here is another example, where incoming Ethernet frames are encapsulated into
-+MPLS with label 123 and TTL 64. Then, an outer Ethernet header is added and the
-+resulting frame is finally sent on eth1:
-+
-+.RS
-+.EX
-+#tc qdisc add dev eth0 ingress
-+#tc filter add dev eth0 ingress matchall \\
-+	action mpls mac_push label 123 ttl 64 \\
-+	action vlan push_eth \\
-+		dst_mac 02:00:00:00:00:02 \\
-+		src_mac 02:00:00:00:00:01 \\
-+	action mirred egress redirect dev eth1
-+.EE
-+.RE
-+
-+The following example assumes that incoming MPLS packets with label 123
-+transport Ethernet frames. The outer Ethernet and the MPLS headers are
-+stripped, then the inner Ethernet frame is sent on eth1:
-+
-+.RS
-+.EX
-+#tc qdisc add dev eth0 ingress
-+#tc filter add dev eth0 ingress protocol mpls_uc \\
-+	flower mpls_label 123 mpls_bos 1 \\
-+	action vlan pop_eth \\
-+	action mpls pop protocol teb \\
-+	action mirred egress redirect dev eth1
-+.EE
-+.RE
-+
- .SH SEE ALSO
--.BR tc (8)
-+.BR tc "(8), " tc-mirred "(8), " tc-vlan (8)
-diff --git a/man/man8/tc-vlan.8 b/man/man8/tc-vlan.8
-index 5c2808b1..264053d3 100644
---- a/man/man8/tc-vlan.8
-+++ b/man/man8/tc-vlan.8
-@@ -157,5 +157,8 @@ process then restarted for the plain packet:
- .EE
- .RE
- 
-+For an example of the
-+.BR pop_eth " and " push_eth " modes, see " tc-mpls (8).
-+
- .SH SEE ALSO
--.BR tc (8)
-+.BR tc "(8), " tc-mpls (8)
-diff --git a/tc/m_mpls.c b/tc/m_mpls.c
-index 3d5d9b25..cb8019b1 100644
---- a/tc/m_mpls.c
-+++ b/tc/m_mpls.c
-@@ -17,6 +17,7 @@ static const char * const action_names[] = {
- 	[TCA_MPLS_ACT_PUSH] = "push",
- 	[TCA_MPLS_ACT_MODIFY] = "modify",
- 	[TCA_MPLS_ACT_DEC_TTL] = "dec_ttl",
-+	[TCA_MPLS_ACT_MAC_PUSH] = "mac_push",
- };
- 
- static void explain(void)
-@@ -25,9 +26,11 @@ static void explain(void)
- 		"Usage: mpls pop [ protocol MPLS_PROTO ]\n"
- 		"       mpls push [ protocol MPLS_PROTO ] [ label MPLS_LABEL ] [ tc MPLS_TC ]\n"
- 		"                 [ ttl MPLS_TTL ] [ bos MPLS_BOS ] [CONTROL]\n"
-+		"       mpls mac_push [ protocol MPLS_PROTO ] [ label MPLS_LABEL ] [ tc MPLS_TC ]\n"
-+		"                     [ ttl MPLS_TTL ] [ bos MPLS_BOS ] [CONTROL]\n"
- 		"       mpls modify [ label MPLS_LABEL ] [ tc MPLS_TC ] [ ttl MPLS_TTL ] [CONTROL]\n"
--		"           for pop MPLS_PROTO is next header of packet - e.g. ip or mpls_uc\n"
--		"           for push MPLS_PROTO is one of mpls_uc or mpls_mc\n"
-+		"           for pop, MPLS_PROTO is next header of packet - e.g. ip or mpls_uc\n"
-+		"           for push and mac_push, MPLS_PROTO is one of mpls_uc or mpls_mc\n"
- 		"               with default: mpls_uc\n"
- 		"       CONTROL := reclassify | pipe | drop | continue | pass |\n"
- 		"                  goto chain <CHAIN_INDEX>\n");
-@@ -41,12 +44,14 @@ static void usage(void)
- 
- static bool can_modify_mpls_fields(unsigned int action)
- {
--	return action == TCA_MPLS_ACT_PUSH || action == TCA_MPLS_ACT_MODIFY;
-+	return action == TCA_MPLS_ACT_PUSH || action == TCA_MPLS_ACT_MAC_PUSH ||
-+		action == TCA_MPLS_ACT_MODIFY;
- }
- 
--static bool can_modify_ethtype(unsigned int action)
-+static bool can_set_ethtype(unsigned int action)
- {
--	return action == TCA_MPLS_ACT_PUSH || action == TCA_MPLS_ACT_POP;
-+	return action == TCA_MPLS_ACT_PUSH || action == TCA_MPLS_ACT_MAC_PUSH ||
-+		action == TCA_MPLS_ACT_POP;
- }
- 
- static bool is_valid_label(__u32 label)
-@@ -94,6 +99,10 @@ static int parse_mpls(struct action_util *a, int *argc_p, char ***argv_p,
- 			if (check_double_action(action, *argv))
- 				return -1;
- 			action = TCA_MPLS_ACT_PUSH;
-+		} else if (matches(*argv, "mac_push") == 0) {
-+			if (check_double_action(action, *argv))
-+				return -1;
-+			action = TCA_MPLS_ACT_MAC_PUSH;
- 		} else if (matches(*argv, "modify") == 0) {
- 			if (check_double_action(action, *argv))
- 				return -1;
-@@ -104,31 +113,36 @@ static int parse_mpls(struct action_util *a, int *argc_p, char ***argv_p,
- 			action = TCA_MPLS_ACT_DEC_TTL;
- 		} else if (matches(*argv, "label") == 0) {
- 			if (!can_modify_mpls_fields(action))
--				invarg("only valid for push/modify", *argv);
-+				invarg("only valid for push, mac_push and modify",
-+				       *argv);
- 			NEXT_ARG();
- 			if (get_u32(&label, *argv, 0) || !is_valid_label(label))
- 				invarg("label must be <=0xFFFFF", *argv);
- 		} else if (matches(*argv, "tc") == 0) {
- 			if (!can_modify_mpls_fields(action))
--				invarg("only valid for push/modify", *argv);
-+				invarg("only valid for push, mac_push and modify",
-+				       *argv);
- 			NEXT_ARG();
- 			if (get_u8(&tc, *argv, 0) || (tc & ~0x7))
- 				invarg("tc field is 3 bits max", *argv);
- 		} else if (matches(*argv, "ttl") == 0) {
- 			if (!can_modify_mpls_fields(action))
--				invarg("only valid for push/modify", *argv);
-+				invarg("only valid for push, mac_push and modify",
-+				       *argv);
- 			NEXT_ARG();
- 			if (get_u8(&ttl, *argv, 0) || !ttl)
- 				invarg("ttl must be >0 and <=255", *argv);
- 		} else if (matches(*argv, "bos") == 0) {
- 			if (!can_modify_mpls_fields(action))
--				invarg("only valid for push/modify", *argv);
-+				invarg("only valid for push, mac_push and modify",
-+				       *argv);
- 			NEXT_ARG();
- 			if (get_u8(&bos, *argv, 0) || (bos & ~0x1))
- 				invarg("bos must be 0 or 1", *argv);
- 		} else if (matches(*argv, "protocol") == 0) {
--			if (!can_modify_ethtype(action))
--				invarg("only valid for push/pop", *argv);
-+			if (!can_set_ethtype(action))
-+				invarg("only valid for push, mac_push and pop",
-+				       *argv);
- 			NEXT_ARG();
- 			if (ll_proto_a2n(&proto, *argv))
- 				invarg("protocol is invalid", *argv);
-@@ -159,10 +173,12 @@ static int parse_mpls(struct action_util *a, int *argc_p, char ***argv_p,
- 	if (action == TCA_MPLS_ACT_PUSH && label == 0xffffffff)
- 		missarg("label");
- 
--	if (action == TCA_MPLS_ACT_PUSH && proto &&
-+	if ((action == TCA_MPLS_ACT_PUSH || action == TCA_MPLS_ACT_MAC_PUSH) &&
-+	    proto &&
- 	    proto != htons(ETH_P_MPLS_UC) && proto != htons(ETH_P_MPLS_MC)) {
- 		fprintf(stderr,
--			"invalid push protocol \"0x%04x\" - use mpls_(uc|mc)\n",
-+			"invalid %spush protocol \"0x%04x\" - use mpls_(uc|mc)\n",
-+			action == TCA_MPLS_ACT_MAC_PUSH ? "mac_" : "",
- 			ntohs(proto));
- 		return -1;
- 	}
-@@ -223,6 +239,7 @@ static int print_mpls(struct action_util *au, FILE *f, struct rtattr *arg)
- 		}
- 		break;
- 	case TCA_MPLS_ACT_PUSH:
-+	case TCA_MPLS_ACT_MAC_PUSH:
- 		if (tb[TCA_MPLS_PROTO]) {
- 			__u16 proto;
- 
-diff --git a/testsuite/tests/tc/mpls.t b/testsuite/tests/tc/mpls.t
-new file mode 100755
-index 00000000..cb25f361
---- /dev/null
-+++ b/testsuite/tests/tc/mpls.t
-@@ -0,0 +1,69 @@
-+#!/bin/sh
-+
-+. lib/generic.sh
-+
-+DEV="$(rand_dev)"
-+ts_ip "$0" "Add $DEV dummy interface" link add dev $DEV up type dummy
-+ts_tc "$0" "Add ingress qdisc" qdisc add dev $DEV ingress
-+
-+reset_qdisc()
-+{
-+	ts_tc "$0" "Remove ingress qdisc" qdisc del dev $DEV ingress
-+	ts_tc "$0" "Add ingress qdisc" qdisc add dev $DEV ingress
-+}
-+
-+ts_tc "$0" "Add mpls action pop"                              \
-+	filter add dev $DEV ingress protocol mpls_uc matchall \
-+	action mpls pop protocol ip
-+ts_tc "$0" "Show ingress filters" filter show dev $DEV ingress
-+test_on "mpls"
-+test_on "pop protocol ip pipe"
-+
-+reset_qdisc
-+ts_tc "$0" "Add mpls action push"                        \
-+	filter add dev $DEV ingress protocol ip matchall \
-+	action mpls push protocol mpls_uc label 20 tc 3 bos 1 ttl 64
-+ts_tc "$0" "Show ingress filters" filter show dev $DEV ingress
-+test_on "mpls"
-+test_on "push"
-+test_on "protocol mpls_uc"
-+test_on "label 20"
-+test_on "tc 3"
-+test_on "bos 1"
-+test_on "ttl 64"
-+test_on "pipe"
-+
-+reset_qdisc
-+ts_tc "$0" "Add mpls action mac_push"        \
-+	filter add dev $DEV ingress matchall \
-+	action mpls mac_push protocol mpls_uc label 20 tc 3 bos 1 ttl 64
-+ts_tc "$0" "Show ingress filters" filter show dev $DEV ingress
-+test_on "mpls"
-+test_on "mac_push"
-+test_on "protocol mpls_uc"
-+test_on "label 20"
-+test_on "tc 3"
-+test_on "bos 1"
-+test_on "ttl 64"
-+test_on "pipe"
-+
-+reset_qdisc
-+ts_tc "$0" "Add mpls action modify"                           \
-+	filter add dev $DEV ingress protocol mpls_uc matchall \
-+	action mpls modify label 20 tc 3 ttl 64
-+ts_tc "$0" "Show ingress filters" filter show dev $DEV ingress
-+test_on "mpls"
-+test_on "modify"
-+test_on "label 20"
-+test_on "tc 3"
-+test_on "ttl 64"
-+test_on "pipe"
-+
-+reset_qdisc
-+ts_tc "$0" "Add mpls action dec_ttl"                          \
-+	filter add dev $DEV ingress protocol mpls_uc matchall \
-+	action mpls dec_ttl
-+ts_tc "$0" "Show ingress filters" filter show dev $DEV ingress
-+test_on "mpls"
-+test_on "dec_ttl"
-+test_on "pipe"
--- 
-2.29.2
-
diff --git a/SOURCES/0005-m_mpls-test-the-mac_push-action-after-modify.patch b/SOURCES/0005-m_mpls-test-the-mac_push-action-after-modify.patch
deleted file mode 100644
index 197b3d6..0000000
--- a/SOURCES/0005-m_mpls-test-the-mac_push-action-after-modify.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-From 8c66f562e88887d2bf1c1064117496c4cb862b11 Mon Sep 17 00:00:00 2001
-Message-Id: <8c66f562e88887d2bf1c1064117496c4cb862b11.1611877215.git.aclaudi@redhat.com>
-In-Reply-To: <cb7ce51cc1abd7b98370b903ec96205ebfe48661.1611877215.git.aclaudi@redhat.com>
-References: <cb7ce51cc1abd7b98370b903ec96205ebfe48661.1611877215.git.aclaudi@redhat.com>
-From: Andrea Claudi <aclaudi@redhat.com>
-Date: Fri, 29 Jan 2021 00:35:03 +0100
-Subject: [PATCH] m_mpls: test the 'mac_push' action after 'modify'
-
-Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1885770
-Upstream Status: unknown commit f1298d76
-
-commit f1298d76606a581cf3ab9ec45a92b41e72a6b4f0
-Author: Guillaume Nault <gnault@redhat.com>
-Date:   Thu Oct 22 11:11:44 2020 +0200
-
-    m_mpls: test the 'mac_push' action after 'modify'
-
-    Commit 02a261b5ba1c ("m_mpls: add mac_push action") added a matches()
-    test for the "mac_push" string before the test for "modify".
-    This changes the previous behaviour as 'action m' used to match
-    "modify" while it now matches "mac_push".
-
-    Revert to the original behaviour by moving the "mac_push" test after
-    "modify".
-
-    Fixes: 02a261b5ba1c ("m_mpls: add mac_push action")
-    Signed-off-by: Guillaume Nault <gnault@redhat.com>
-    Signed-off-by: David Ahern <dsahern@gmail.com>
----
- tc/m_mpls.c | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
-
-diff --git a/tc/m_mpls.c b/tc/m_mpls.c
-index cb8019b1..2c3752ba 100644
---- a/tc/m_mpls.c
-+++ b/tc/m_mpls.c
-@@ -99,14 +99,14 @@ static int parse_mpls(struct action_util *a, int *argc_p, char ***argv_p,
- 			if (check_double_action(action, *argv))
- 				return -1;
- 			action = TCA_MPLS_ACT_PUSH;
--		} else if (matches(*argv, "mac_push") == 0) {
--			if (check_double_action(action, *argv))
--				return -1;
--			action = TCA_MPLS_ACT_MAC_PUSH;
- 		} else if (matches(*argv, "modify") == 0) {
- 			if (check_double_action(action, *argv))
- 				return -1;
- 			action = TCA_MPLS_ACT_MODIFY;
-+		} else if (matches(*argv, "mac_push") == 0) {
-+			if (check_double_action(action, *argv))
-+				return -1;
-+			action = TCA_MPLS_ACT_MAC_PUSH;
- 		} else if (matches(*argv, "dec_ttl") == 0) {
- 			if (check_double_action(action, *argv))
- 				return -1;
--- 
-2.29.2
-
diff --git a/SOURCES/0006-tc-vlan-fix-help-and-error-message-strings.patch b/SOURCES/0006-tc-vlan-fix-help-and-error-message-strings.patch
deleted file mode 100644
index a70ac17..0000000
--- a/SOURCES/0006-tc-vlan-fix-help-and-error-message-strings.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From cdb8197d0e7380b3679ded6bab398883aead92dc Mon Sep 17 00:00:00 2001
-Message-Id: <cdb8197d0e7380b3679ded6bab398883aead92dc.1611877215.git.aclaudi@redhat.com>
-In-Reply-To: <cb7ce51cc1abd7b98370b903ec96205ebfe48661.1611877215.git.aclaudi@redhat.com>
-References: <cb7ce51cc1abd7b98370b903ec96205ebfe48661.1611877215.git.aclaudi@redhat.com>
-From: Andrea Claudi <aclaudi@redhat.com>
-Date: Fri, 29 Jan 2021 00:35:03 +0100
-Subject: [PATCH] tc-vlan: fix help and error message strings
-
-Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1885770
-Upstream Status: unknown commit 7c7a0fe0
-
-commit 7c7a0fe0c81cdff258c4314c629d7a52ae331dc4
-Author: Guillaume Nault <gnault@redhat.com>
-Date:   Mon Nov 2 11:59:46 2020 +0100
-
-    tc-vlan: fix help and error message strings
-
-    * "vlan pop" can be followed by a CONTROL keyword.
-
-     * Add missing space in error message.
-
-    Signed-off-by: Guillaume Nault <gnault@redhat.com>
-    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
----
- tc/m_vlan.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/tc/m_vlan.c b/tc/m_vlan.c
-index e6b21330..57722b73 100644
---- a/tc/m_vlan.c
-+++ b/tc/m_vlan.c
-@@ -30,7 +30,7 @@ static const char * const action_names[] = {
- static void explain(void)
- {
- 	fprintf(stderr,
--		"Usage: vlan pop\n"
-+		"Usage: vlan pop [CONTROL]\n"
- 		"       vlan push [ protocol VLANPROTO ] id VLANID [ priority VLANPRIO ] [CONTROL]\n"
- 		"       vlan modify [ protocol VLANPROTO ] id VLANID [ priority VLANPRIO ] [CONTROL]\n"
- 		"       vlan pop_eth [CONTROL]\n"
-@@ -244,7 +244,7 @@ static int print_vlan(struct action_util *au, FILE *f, struct rtattr *arg)
- 	parse_rtattr_nested(tb, TCA_VLAN_MAX, arg);
- 
- 	if (!tb[TCA_VLAN_PARMS]) {
--		fprintf(stderr, "Missing vlanparameters\n");
-+		fprintf(stderr, "Missing vlan parameters\n");
- 		return -1;
- 	}
- 	parm = RTA_DATA(tb[TCA_VLAN_PARMS]);
--- 
-2.29.2
-
diff --git a/SOURCES/0007-tc-mpls-fix-manpage-example-and-help-message-string.patch b/SOURCES/0007-tc-mpls-fix-manpage-example-and-help-message-string.patch
deleted file mode 100644
index a53a799..0000000
--- a/SOURCES/0007-tc-mpls-fix-manpage-example-and-help-message-string.patch
+++ /dev/null
@@ -1,82 +0,0 @@
-From 8953735b551d5f3c18c9523ea24055f4a7f9b927 Mon Sep 17 00:00:00 2001
-Message-Id: <8953735b551d5f3c18c9523ea24055f4a7f9b927.1611877215.git.aclaudi@redhat.com>
-In-Reply-To: <cb7ce51cc1abd7b98370b903ec96205ebfe48661.1611877215.git.aclaudi@redhat.com>
-References: <cb7ce51cc1abd7b98370b903ec96205ebfe48661.1611877215.git.aclaudi@redhat.com>
-From: Andrea Claudi <aclaudi@redhat.com>
-Date: Fri, 29 Jan 2021 00:35:03 +0100
-Subject: [PATCH] tc-mpls: fix manpage example and help message string
-
-Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1885770
-Upstream Status: unknown commit 8682f588
-
-commit 8682f588bfed7862233a22626562696d662ca60c
-Author: Guillaume Nault <gnault@redhat.com>
-Date:   Mon Nov 2 12:24:25 2020 +0100
-
-    tc-mpls: fix manpage example and help message string
-
-    Manpage:
-     * Remove the extra "and to ip packets" part from command description
-       to make it more understandable.
-
-     * Redirect packets to eth1, instead of eth0, as told in the
-       description.
-
-    Help string:
-     * "mpls pop" can be followed by a CONTROL keyword.
-
-     * "mpls modify" can also set the MPLS_BOS field.
-
-    Signed-off-by: Guillaume Nault <gnault@redhat.com>
-    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
----
- man/man8/tc-mpls.8 | 6 +++---
- tc/m_mpls.c        | 5 +++--
- 2 files changed, 6 insertions(+), 5 deletions(-)
-
-diff --git a/man/man8/tc-mpls.8 b/man/man8/tc-mpls.8
-index 9e563e98..7f8be221 100644
---- a/man/man8/tc-mpls.8
-+++ b/man/man8/tc-mpls.8
-@@ -147,15 +147,15 @@ a label 123 and sends them out eth1:
- .EE
- .RE
- 
--In this example, incoming MPLS unicast packets on eth0 are decapsulated and to
--ip packets and output to eth1:
-+In this example, incoming MPLS unicast packets on eth0 are decapsulated
-+and redirected to eth1:
- 
- .RS
- .EX
- #tc qdisc add dev eth0 handle ffff: ingress
- #tc filter add dev eth0 protocol mpls_uc parent ffff: flower \\
- 	action mpls pop protocol ipv4  \\
--	action mirred egress redirect dev eth0
-+	action mirred egress redirect dev eth1
- .EE
- .RE
- 
-diff --git a/tc/m_mpls.c b/tc/m_mpls.c
-index 2c3752ba..9fee22e3 100644
---- a/tc/m_mpls.c
-+++ b/tc/m_mpls.c
-@@ -23,12 +23,13 @@ static const char * const action_names[] = {
- static void explain(void)
- {
- 	fprintf(stderr,
--		"Usage: mpls pop [ protocol MPLS_PROTO ]\n"
-+		"Usage: mpls pop [ protocol MPLS_PROTO ] [CONTROL]\n"
- 		"       mpls push [ protocol MPLS_PROTO ] [ label MPLS_LABEL ] [ tc MPLS_TC ]\n"
- 		"                 [ ttl MPLS_TTL ] [ bos MPLS_BOS ] [CONTROL]\n"
- 		"       mpls mac_push [ protocol MPLS_PROTO ] [ label MPLS_LABEL ] [ tc MPLS_TC ]\n"
- 		"                     [ ttl MPLS_TTL ] [ bos MPLS_BOS ] [CONTROL]\n"
--		"       mpls modify [ label MPLS_LABEL ] [ tc MPLS_TC ] [ ttl MPLS_TTL ] [CONTROL]\n"
-+		"       mpls modify [ label MPLS_LABEL ] [ tc MPLS_TC ] [ ttl MPLS_TTL ]\n"
-+		"                   [ bos MPLS_BOS ] [CONTROL]\n"
- 		"           for pop, MPLS_PROTO is next header of packet - e.g. ip or mpls_uc\n"
- 		"           for push and mac_push, MPLS_PROTO is one of mpls_uc or mpls_mc\n"
- 		"               with default: mpls_uc\n"
--- 
-2.29.2
-
diff --git a/SOURCES/0008-tc-flower-fix-json-output-with-mpls-lse.patch b/SOURCES/0008-tc-flower-fix-json-output-with-mpls-lse.patch
deleted file mode 100644
index 3c57d58..0000000
--- a/SOURCES/0008-tc-flower-fix-json-output-with-mpls-lse.patch
+++ /dev/null
@@ -1,120 +0,0 @@
-From 52754e4b7d4b52e9852869d7e2f6af1b890677f1 Mon Sep 17 00:00:00 2001
-Message-Id: <52754e4b7d4b52e9852869d7e2f6af1b890677f1.1611877215.git.aclaudi@redhat.com>
-In-Reply-To: <cb7ce51cc1abd7b98370b903ec96205ebfe48661.1611877215.git.aclaudi@redhat.com>
-References: <cb7ce51cc1abd7b98370b903ec96205ebfe48661.1611877215.git.aclaudi@redhat.com>
-From: Andrea Claudi <aclaudi@redhat.com>
-Date: Fri, 29 Jan 2021 00:35:04 +0100
-Subject: [PATCH] tc: flower: fix json output with mpls lse
-
-Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1885770
-Upstream Status: unknown commit 676a1a70
-
-commit 676a1a708f8e99d6a4faa3de8a093f8f8c14b9da
-Author: Guillaume Nault <gnault@redhat.com>
-Date:   Tue Jan 12 11:30:53 2021 +0100
-
-    tc: flower: fix json output with mpls lse
-
-    The json output of the TCA_FLOWER_KEY_MPLS_OPTS attribute was invalid.
-
-    Example:
-
-      $ tc filter add dev eth0 ingress protocol mpls_uc flower mpls \
-          lse depth 1 label 100                                     \
-          lse depth 2 label 200
-
-      $ tc -json filter show dev eth0 ingress
-        ...{"eth_type":"8847",
-            "  mpls":["    lse":["depth":1,"label":100],
-                      "    lse":["depth":2,"label":200]]}...
-
-    This is invalid as the arrays, introduced by "[", can't contain raw
-    string:value pairs. Those must be enclosed into "{}" to form valid json
-    ojects. Also, there are spurious whitespaces before the mpls and lse
-    strings because of the indentation used for normal output.
-
-    Fix this by putting all LSE parameters (depth, label, tc, bos and ttl)
-    into the same json object. The "mpls" key now directly contains a list
-    of such objects.
-
-    Also, handle strings differently for normal and json output, so that
-    json strings don't get spurious indentation whitespaces.
-
-    Normal output isn't modified.
-    The json output now looks like:
-
-      $ tc -json filter show dev eth0 ingress
-        ...{"eth_type":"8847",
-            "mpls":[{"depth":1,"label":100},
-                    {"depth":2,"label":200}]}...
-
-    Fixes: eb09a15c12fb ("tc: flower: support multiple MPLS LSE match")
-    Signed-off-by: Guillaume Nault <gnault@redhat.com>
-    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
----
- tc/f_flower.c | 16 +++++++++-------
- 1 file changed, 9 insertions(+), 7 deletions(-)
-
-diff --git a/tc/f_flower.c b/tc/f_flower.c
-index 00c919fd..27731078 100644
---- a/tc/f_flower.c
-+++ b/tc/f_flower.c
-@@ -2476,7 +2476,7 @@ static void flower_print_u32(const char *name, struct rtattr *attr)
- 	print_uint(PRINT_ANY, name, namefrm, rta_getattr_u32(attr));
- }
- 
--static void flower_print_mpls_opt_lse(const char *name, struct rtattr *lse)
-+static void flower_print_mpls_opt_lse(struct rtattr *lse)
- {
- 	struct rtattr *tb[TCA_FLOWER_KEY_MPLS_OPT_LSE_MAX + 1];
- 	struct rtattr *attr;
-@@ -2493,7 +2493,8 @@ static void flower_print_mpls_opt_lse(const char *name, struct rtattr *lse)
- 		     RTA_PAYLOAD(lse));
- 
- 	print_nl();
--	open_json_array(PRINT_ANY, name);
-+	print_string(PRINT_FP, NULL, "    lse", NULL);
-+	open_json_object(NULL);
- 	attr = tb[TCA_FLOWER_KEY_MPLS_OPT_LSE_DEPTH];
- 	if (attr)
- 		print_hhu(PRINT_ANY, "depth", " depth %u",
-@@ -2511,10 +2512,10 @@ static void flower_print_mpls_opt_lse(const char *name, struct rtattr *lse)
- 	attr = tb[TCA_FLOWER_KEY_MPLS_OPT_LSE_TTL];
- 	if (attr)
- 		print_hhu(PRINT_ANY, "ttl", " ttl %u", rta_getattr_u8(attr));
--	close_json_array(PRINT_JSON, NULL);
-+	close_json_object();
- }
- 
--static void flower_print_mpls_opts(const char *name, struct rtattr *attr)
-+static void flower_print_mpls_opts(struct rtattr *attr)
- {
- 	struct rtattr *lse;
- 	int rem;
-@@ -2523,11 +2524,12 @@ static void flower_print_mpls_opts(const char *name, struct rtattr *attr)
- 		return;
- 
- 	print_nl();
--	open_json_array(PRINT_ANY, name);
-+	print_string(PRINT_FP, NULL, "  mpls", NULL);
-+	open_json_array(PRINT_JSON, "mpls");
- 	rem = RTA_PAYLOAD(attr);
- 	lse = RTA_DATA(attr);
- 	while (RTA_OK(lse, rem)) {
--		flower_print_mpls_opt_lse("    lse", lse);
-+		flower_print_mpls_opt_lse(lse);
- 		lse = RTA_NEXT(lse, rem);
- 	};
- 	if (rem)
-@@ -2650,7 +2652,7 @@ static int flower_print_opt(struct filter_util *qu, FILE *f,
- 	flower_print_ip_attr("ip_ttl", tb[TCA_FLOWER_KEY_IP_TTL],
- 			    tb[TCA_FLOWER_KEY_IP_TTL_MASK]);
- 
--	flower_print_mpls_opts("  mpls", tb[TCA_FLOWER_KEY_MPLS_OPTS]);
-+	flower_print_mpls_opts(tb[TCA_FLOWER_KEY_MPLS_OPTS]);
- 	flower_print_u32("mpls_label", tb[TCA_FLOWER_KEY_MPLS_LABEL]);
- 	flower_print_u8("mpls_tc", tb[TCA_FLOWER_KEY_MPLS_TC]);
- 	flower_print_u8("mpls_bos", tb[TCA_FLOWER_KEY_MPLS_BOS]);
--- 
-2.29.2
-
diff --git a/SOURCES/0009-iproute-force-rtm_dst_len-to-32-128.patch b/SOURCES/0009-iproute-force-rtm_dst_len-to-32-128.patch
deleted file mode 100644
index c5aee30..0000000
--- a/SOURCES/0009-iproute-force-rtm_dst_len-to-32-128.patch
+++ /dev/null
@@ -1,67 +0,0 @@
-From f2cb0f1570ca603c5d92d6a7d87596d07fdb01cd Mon Sep 17 00:00:00 2001
-Message-Id: <f2cb0f1570ca603c5d92d6a7d87596d07fdb01cd.1612868485.git.aclaudi@redhat.com>
-In-Reply-To: <cb7ce51cc1abd7b98370b903ec96205ebfe48661.1612868485.git.aclaudi@redhat.com>
-References: <cb7ce51cc1abd7b98370b903ec96205ebfe48661.1612868485.git.aclaudi@redhat.com>
-From: Andrea Claudi <aclaudi@redhat.com>
-Date: Tue, 9 Feb 2021 12:00:58 +0100
-Subject: [PATCH] iproute: force rtm_dst_len to 32/128
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1852038
-Upstream Status: unknown commit 5a37254b
-
-commit 5a37254b71249bfb73d44d6278d767a6b127a2f9
-Author: Luca Boccassi <bluca@debian.org>
-Date:   Sun Jan 24 17:36:58 2021 +0000
-
-    iproute: force rtm_dst_len to 32/128
-
-    Since NETLINK_GET_STRICT_CHK was enabled, the kernel rejects commands
-    that pass a prefix length, eg:
-
-     ip route get `1.0.0.0/1
-      Error: ipv4: Invalid values in header for route get request.
-     ip route get 0.0.0.0/0
-      Error: ipv4: rtm_src_len and rtm_dst_len must be 32 for IPv4
-
-    Since there's no point in setting a rtm_dst_len that we know is going
-    to be rejected, just force it to the right value if it's passed on
-    the command line. Print a warning to stderr to notify users.
-
-    Bug-Debian: https://bugs.debian.org/944730
-    Reported-By: Clément 'wxcafé' Hertling <wxcafe@wxcafe.net>
-    Signed-off-by: Luca Boccassi <bluca@debian.org>
-    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
----
- ip/iproute.c | 13 ++++++++++++-
- 1 file changed, 12 insertions(+), 1 deletion(-)
-
-diff --git a/ip/iproute.c b/ip/iproute.c
-index 05ec2c29..1f3c347e 100644
---- a/ip/iproute.c
-+++ b/ip/iproute.c
-@@ -2067,7 +2067,18 @@ static int iproute_get(int argc, char **argv)
- 			if (addr.bytelen)
- 				addattr_l(&req.n, sizeof(req),
- 					  RTA_DST, &addr.data, addr.bytelen);
--			req.r.rtm_dst_len = addr.bitlen;
-+			if (req.r.rtm_family == AF_INET && addr.bitlen != 32) {
-+				fprintf(stderr,
-+					"Warning: /%u as prefix is invalid, only /32 (or none) is supported.\n",
-+					addr.bitlen);
-+				req.r.rtm_dst_len = 32;
-+			} else if (req.r.rtm_family == AF_INET6 && addr.bitlen != 128) {
-+				fprintf(stderr,
-+					"Warning: /%u as prefix is invalid, only /128 (or none) is supported.\n",
-+					addr.bitlen);
-+				req.r.rtm_dst_len = 128;
-+			} else
-+				req.r.rtm_dst_len = addr.bitlen;
- 			address_found = true;
- 		}
- 		argc--; argv++;
--- 
-2.29.2
-
diff --git a/SOURCES/0010-iplink_bareudp-cleanup-help-message-and-man-page.patch b/SOURCES/0010-iplink_bareudp-cleanup-help-message-and-man-page.patch
deleted file mode 100644
index a0ca03e..0000000
--- a/SOURCES/0010-iplink_bareudp-cleanup-help-message-and-man-page.patch
+++ /dev/null
@@ -1,104 +0,0 @@
-From e5143d1e2787fca4ea365c4010e0da5bcbbbba36 Mon Sep 17 00:00:00 2001
-Message-Id: <e5143d1e2787fca4ea365c4010e0da5bcbbbba36.1615575079.git.aclaudi@redhat.com>
-In-Reply-To: <cb7ce51cc1abd7b98370b903ec96205ebfe48661.1615575079.git.aclaudi@redhat.com>
-References: <cb7ce51cc1abd7b98370b903ec96205ebfe48661.1615575079.git.aclaudi@redhat.com>
-From: Andrea Claudi <aclaudi@redhat.com>
-Date: Mon, 8 Mar 2021 12:52:23 +0100
-Subject: [PATCH] iplink_bareudp: cleanup help message and man page
-
-Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1912412
-Upstream Status: unknown commit 86d9660d
-
-commit 86d9660dc1805be4435497ff194f618535e8fc97
-Author: Guillaume Nault <gnault@redhat.com>
-Date:   Mon Feb 1 18:44:07 2021 +0100
-
-    iplink_bareudp: cleanup help message and man page
-
-    * Fix PROTO description in help message (mpls isn't a valid argument).
-
-     * Remove SRCPORTMIN description from help message since it doesn't
-       appear in the syntax string.
-
-     * Use same keywords in help message and in man page.
-
-     * Use the "ethertype" option name (.B ethertype) rather than the
-       option value (.I ETHERTYPE) in the man page description of
-       [no]multiproto.
-
-    Signed-off-by: Guillaume Nault <gnault@redhat.com>
-    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
----
- ip/iplink_bareudp.c   |  8 +++++---
- man/man8/ip-link.8.in | 15 +++++++++------
- 2 files changed, 14 insertions(+), 9 deletions(-)
-
-diff --git a/ip/iplink_bareudp.c b/ip/iplink_bareudp.c
-index 860ec699..aa311106 100644
---- a/ip/iplink_bareudp.c
-+++ b/ip/iplink_bareudp.c
-@@ -22,9 +22,11 @@ static void print_explain(FILE *f)
- 		"		[ srcportmin PORT ]\n"
- 		"		[ [no]multiproto ]\n"
- 		"\n"
--		"Where:	PORT       := 0-65535\n"
--		"	PROTO      := NUMBER | ip | mpls\n"
--		"	SRCPORTMIN := 0-65535\n"
-+		"Where:	PORT  := UDP_PORT\n"
-+		"	PROTO := ETHERTYPE\n"
-+		"\n"
-+		"Note: ETHERTYPE can be given as number or as protocol name (\"ipv4\", \"ipv6\",\n"
-+		"      \"mpls_uc\", etc.).\n"
- 	);
- }
- 
-diff --git a/man/man8/ip-link.8.in b/man/man8/ip-link.8.in
-index f451ecf3..ce3c8636 100644
---- a/man/man8/ip-link.8.in
-+++ b/man/man8/ip-link.8.in
-@@ -1304,9 +1304,9 @@ For a link of type
- the following additional arguments are supported:
- 
- .BI "ip link add " DEVICE
--.BI type " bareudp " dstport " PORT " ethertype " ETHERTYPE"
-+.BI type " bareudp " dstport " PORT " ethertype " PROTO"
- [
--.BI srcportmin " SRCPORTMIN "
-+.BI srcportmin " PORT "
- ] [
- .RB [ no ] multiproto
- ]
-@@ -1317,11 +1317,14 @@ the following additional arguments are supported:
- - specifies the destination port for the UDP tunnel.
- 
- .sp
--.BI ethertype " ETHERTYPE"
-+.BI ethertype " PROTO"
- - specifies the ethertype of the L3 protocol being tunnelled.
-+.B ethertype
-+can be given as plain Ethernet protocol number or using the protocol name
-+("ipv4", "ipv6", "mpls_uc", etc.).
- 
- .sp
--.BI srcportmin " SRCPORTMIN"
-+.BI srcportmin " PORT"
- - selects the lowest value of the UDP tunnel source port range.
- 
- .sp
-@@ -1329,11 +1332,11 @@ the following additional arguments are supported:
- - activates support for protocols similar to the one
- .RB "specified by " ethertype .
- When
--.I ETHERTYPE
-+.B ethertype
- is "mpls_uc" (that is, unicast MPLS), this allows the tunnel to also handle
- multicast MPLS.
- When
--.I ETHERTYPE
-+.B ethertype
- is "ipv4", this allows the tunnel to also handle IPv6. This option is disabled
- by default.
- 
--- 
-2.30.2
-
diff --git a/SPECS/iproute.spec b/SPECS/iproute.spec
index 6ef0b52..63d37bd 100644
--- a/SPECS/iproute.spec
+++ b/SPECS/iproute.spec
@@ -1,25 +1,11 @@
-%define rpmversion 5.9.0
-%define specrelease 4%{?dist}
-%define pkg_release %{specrelease}%{?buildid}
-
 Summary:            Advanced IP routing and network device configuration tools
 Name:               iproute
-Version:            %{rpmversion}
-Release:            %{pkg_release}
+Version:            5.12.0
+Release:            0%{?dist}%{?buildid}
 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:            rt_dsfield.deprecated
-Patch0:             0001-v5.9.0.patch
-Patch1:             0002-Update-kernel-headers.patch
-Patch2:             0003-m_vlan-add-pop_eth-and-push_eth-actions.patch
-Patch3:             0004-m_mpls-add-mac_push-action.patch
-Patch4:             0005-m_mpls-test-the-mac_push-action-after-modify.patch
-Patch5:             0006-tc-vlan-fix-help-and-error-message-strings.patch
-Patch6:             0007-tc-mpls-fix-manpage-example-and-help-message-string.patch
-Patch7:             0008-tc-flower-fix-json-output-with-mpls-lse.patch
-Patch8:             0009-iproute-force-rtm_dst_len-to-32-128.patch
-Patch9:             0010-iplink_bareudp-cleanup-help-message-and-man-page.patch
 License:            GPLv2+ and Public Domain
 BuildRequires:      bison
 BuildRequires:      elfutils-libelf-devel
@@ -50,7 +36,7 @@ Group:              Applications/System
 License:            GPLv2+
 Obsoletes:          %{name} < 4.5.0-3
 Requires:           %{name}%{?_isa} = %{version}-%{release}
-Provides:           tc
+Provides:           /sbin/tc
 
 %description tc
 The Traffic Control utility manages queueing disciplines, their classes and
@@ -82,20 +68,12 @@ The libnetlink static library.
 %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}
+%configure
+%make_build
 
 %install
-export DESTDIR='%{buildroot}'
 export SBINDIR='%{_sbindir}'
-export MANDIR='%{_mandir}'
 export LIBDIR='%{_libdir}'
-export CONFDIR='%{_sysconfdir}/iproute2'
-export DOCDIR='%{_docdir}'
 %make_install
 
 echo '.so man8/tc-cbq.8' > %{buildroot}%{_mandir}/man8/cbq.8
@@ -152,6 +130,9 @@ cat %{SOURCE1} >>%{buildroot}%{_sysconfdir}/iproute2/rt_dsfield
 %{_includedir}/iproute2/bpf_elf.h
 
 %changelog
+* Thu Apr 29 2021 Andrea Claudi <aclaudi@redhat.com> [5.12.0-0.el8]
+- New version 5.12.0 [1939382]
+
 * Fri Mar 12 2021 Andrea Claudi <aclaudi@redhat.com> [5.9.0-4.el8]
 - iplink_bareudp: cleanup help message and man page (Andrea Claudi) [1912412]