import iproute-5.9.0-4.el8
This commit is contained in:
commit
dbbe06c1a4
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
SOURCES/iproute2-5.9.0.tar.xz
|
1
.iproute.metadata
Normal file
1
.iproute.metadata
Normal file
@ -0,0 +1 @@
|
||||
c9e0ca453307ce7c221ccffc10939f4136b4ad5d SOURCES/iproute2-5.9.0.tar.xz
|
20
SOURCES/0001-v5.9.0.patch
Normal file
20
SOURCES/0001-v5.9.0.patch
Normal file
@ -0,0 +1,20 @@
|
||||
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
|
||||
|
308
SOURCES/0002-Update-kernel-headers.patch
Normal file
308
SOURCES/0002-Update-kernel-headers.patch
Normal file
@ -0,0 +1,308 @@
|
||||
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
|
||||
|
343
SOURCES/0003-m_vlan-add-pop_eth-and-push_eth-actions.patch
Normal file
343
SOURCES/0003-m_vlan-add-pop_eth-and-push_eth-actions.patch
Normal file
@ -0,0 +1,343 @@
|
||||
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
|
||||
|
342
SOURCES/0004-m_mpls-add-mac_push-action.patch
Normal file
342
SOURCES/0004-m_mpls-add-mac_push-action.patch
Normal file
@ -0,0 +1,342 @@
|
||||
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
|
||||
|
@ -0,0 +1,58 @@
|
||||
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
|
||||
|
@ -0,0 +1,52 @@
|
||||
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
|
||||
|
@ -0,0 +1,82 @@
|
||||
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
|
||||
|
120
SOURCES/0008-tc-flower-fix-json-output-with-mpls-lse.patch
Normal file
120
SOURCES/0008-tc-flower-fix-json-output-with-mpls-lse.patch
Normal file
@ -0,0 +1,120 @@
|
||||
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
|
||||
|
67
SOURCES/0009-iproute-force-rtm_dst_len-to-32-128.patch
Normal file
67
SOURCES/0009-iproute-force-rtm_dst_len-to-32-128.patch
Normal file
@ -0,0 +1,67 @@
|
||||
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
|
||||
|
@ -0,0 +1,104 @@
|
||||
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
|
||||
|
17
SOURCES/rt_dsfield.deprecated
Normal file
17
SOURCES/rt_dsfield.deprecated
Normal file
@ -0,0 +1,17 @@
|
||||
|
||||
# Deprecated values dropped upstream
|
||||
# Kept in RHEL for backwards-compatibility
|
||||
0x00 default
|
||||
0x10 lowdelay
|
||||
0x08 throughput
|
||||
0x04 reliability
|
||||
# This value overlap with ECT, do not use it!
|
||||
0x02 mincost
|
||||
# These values seems do not want to die, Cisco likes them by a strange reason.
|
||||
0x20 priority
|
||||
0x40 immediate
|
||||
0x60 flash
|
||||
0x80 flash-override
|
||||
0xa0 critical
|
||||
0xc0 internet
|
||||
0xe0 network
|
1077
SPECS/iproute.spec
Normal file
1077
SPECS/iproute.spec
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user