From 2f28bf9869d8ece7f5108db0d69da518cd61c060 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Feb 01 2021 08:09:29 +0000 Subject: import iproute-5.9.0-2.el8 --- diff --git a/.iproute.metadata b/.iproute.metadata index 1f0d715..3b76ec4 100644 --- a/.iproute.metadata +++ b/.iproute.metadata @@ -1 +1 @@ -281177590d12112868ff1e513cee66546b10b7a5 SOURCES/iproute2-5.9.0.tar.xz +c9e0ca453307ce7c221ccffc10939f4136b4ad5d SOURCES/iproute2-5.9.0.tar.xz diff --git a/SOURCES/0001-v5.9.0.patch b/SOURCES/0001-v5.9.0.patch new file mode 100644 index 0000000..f0868bb --- /dev/null +++ b/SOURCES/0001-v5.9.0.patch @@ -0,0 +1,20 @@ +From cb7ce51cc1abd7b98370b903ec96205ebfe48661 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Stephen Hemminger +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 new file mode 100644 index 0000000..60a94f4 --- /dev/null +++ b/SOURCES/0002-Update-kernel-headers.patch @@ -0,0 +1,308 @@ +From 1b8a3c04bf8d115e2d427d41a437be03ecf34ce8 Mon Sep 17 00:00:00 2001 +Message-Id: <1b8a3c04bf8d115e2d427d41a437be03ecf34ce8.1611877215.git.aclaudi@redhat.com> +In-Reply-To: +References: +From: Andrea Claudi +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 +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 +--- + 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 ++ + #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 new file mode 100644 index 0000000..fa1b401 --- /dev/null +++ b/SOURCES/0003-m_vlan-add-pop_eth-and-push_eth-actions.patch @@ -0,0 +1,343 @@ +From cac52dd831b6982f6b27b02c26243edbe0b7d747 Mon Sep 17 00:00:00 2001 +Message-Id: +In-Reply-To: +References: +From: Andrea Claudi +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 +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 + Signed-off-by: David Ahern +--- + 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 new file mode 100644 index 0000000..54c1c3c --- /dev/null +++ b/SOURCES/0004-m_mpls-add-mac_push-action.patch @@ -0,0 +1,342 @@ +From 0afe12a4a9471ed1343693338ec6350dc66ba295 Mon Sep 17 00:00:00 2001 +Message-Id: <0afe12a4a9471ed1343693338ec6350dc66ba295.1611877215.git.aclaudi@redhat.com> +In-Reply-To: +References: +From: Andrea Claudi +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 +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 + Signed-off-by: David Ahern +--- + 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 \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 new file mode 100644 index 0000000..197b3d6 --- /dev/null +++ b/SOURCES/0005-m_mpls-test-the-mac_push-action-after-modify.patch @@ -0,0 +1,58 @@ +From 8c66f562e88887d2bf1c1064117496c4cb862b11 Mon Sep 17 00:00:00 2001 +Message-Id: <8c66f562e88887d2bf1c1064117496c4cb862b11.1611877215.git.aclaudi@redhat.com> +In-Reply-To: +References: +From: Andrea Claudi +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 +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 + Signed-off-by: David Ahern +--- + 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 new file mode 100644 index 0000000..a70ac17 --- /dev/null +++ b/SOURCES/0006-tc-vlan-fix-help-and-error-message-strings.patch @@ -0,0 +1,52 @@ +From cdb8197d0e7380b3679ded6bab398883aead92dc Mon Sep 17 00:00:00 2001 +Message-Id: +In-Reply-To: +References: +From: Andrea Claudi +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 +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 + Signed-off-by: Stephen Hemminger +--- + 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 new file mode 100644 index 0000000..a53a799 --- /dev/null +++ b/SOURCES/0007-tc-mpls-fix-manpage-example-and-help-message-string.patch @@ -0,0 +1,82 @@ +From 8953735b551d5f3c18c9523ea24055f4a7f9b927 Mon Sep 17 00:00:00 2001 +Message-Id: <8953735b551d5f3c18c9523ea24055f4a7f9b927.1611877215.git.aclaudi@redhat.com> +In-Reply-To: +References: +From: Andrea Claudi +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 +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 + Signed-off-by: Stephen Hemminger +--- + 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 new file mode 100644 index 0000000..3c57d58 --- /dev/null +++ b/SOURCES/0008-tc-flower-fix-json-output-with-mpls-lse.patch @@ -0,0 +1,120 @@ +From 52754e4b7d4b52e9852869d7e2f6af1b890677f1 Mon Sep 17 00:00:00 2001 +Message-Id: <52754e4b7d4b52e9852869d7e2f6af1b890677f1.1611877215.git.aclaudi@redhat.com> +In-Reply-To: +References: +From: Andrea Claudi +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 +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 + Signed-off-by: Stephen Hemminger +--- + 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/SPECS/iproute.spec b/SPECS/iproute.spec index 05b072a..4d1ebdc 100644 --- a/SPECS/iproute.spec +++ b/SPECS/iproute.spec @@ -1,5 +1,5 @@ %define rpmversion 5.9.0 -%define specrelease 1%{?dist} +%define specrelease 2%{?dist} %define pkg_release %{specrelease}%{?buildid} Summary: Advanced IP routing and network device configuration tools @@ -10,6 +10,14 @@ 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 License: GPLv2+ and Public Domain BuildRequires: bison BuildRequires: elfutils-libelf-devel @@ -142,6 +150,15 @@ cat %{SOURCE1} >>%{buildroot}%{_sysconfdir}/iproute2/rt_dsfield %{_includedir}/iproute2/bpf_elf.h %changelog +* Thu Jan 28 2021 Andrea Claudi [5.9.0-2.el8] +- tc: flower: fix json output with mpls lse (Andrea Claudi) [1885770] +- tc-mpls: fix manpage example and help message string (Andrea Claudi) [1885770] +- tc-vlan: fix help and error message strings (Andrea Claudi) [1885770] +- m_mpls: test the 'mac_push' action after 'modify' (Andrea Claudi) [1885770] +- m_mpls: add mac_push action (Andrea Claudi) [1885770] +- m_vlan: add pop_eth and push_eth actions (Andrea Claudi) [1885770] +- Update kernel headers (Andrea Claudi) [1885770] + * Tue Nov 17 2020 Andrea Claudi [5.9.0-1.el8] - Rebase iproute to v5.9.0 [1896011]