* [PATCH iproute2-next v2 1/6] seg6: add support for the End.MAP behavior
2026-05-04 16:10 [PATCH iproute2-next v2 0/6] seg6: SRv6 Mobile User Plane (RFC 9433) Yuya Kusakabe
@ 2026-05-04 16:10 ` Yuya Kusakabe
2026-05-04 16:10 ` [PATCH iproute2-next v2 2/6] seg6: add support for the End.M.GTP4.E behavior Yuya Kusakabe
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Yuya Kusakabe @ 2026-05-04 16:10 UTC (permalink / raw)
To: dsahern; +Cc: Yuya Kusakabe, netdev
Add support for the End.MAP behavior, which swaps the IPv6 destination
address with the next SID without consuming the SRH. The new SID is
specified using the existing nh6 attribute.
Example:
ip -6 r a 2001:db8:f::/64 encap seg6local action End.MAP \
nh6 2001:db8:1::beef dev sr0
Link: https://datatracker.ietf.org/doc/html/rfc9433
Signed-off-by: Yuya Kusakabe <yuya.kusakabe@gmail.com>
---
include/uapi/linux/seg6_local.h | 2 ++
ip/iproute.c | 3 ++-
ip/iproute_lwtunnel.c | 1 +
man/man8/ip-route.8.in | 9 +++++++++
4 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/include/uapi/linux/seg6_local.h b/include/uapi/linux/seg6_local.h
index 6e71d97f6f44..1678db71e8e7 100644
--- a/include/uapi/linux/seg6_local.h
+++ b/include/uapi/linux/seg6_local.h
@@ -67,6 +67,8 @@ enum {
SEG6_LOCAL_ACTION_END_BPF = 15,
/* decap and lookup of DA in v4 or v6 table */
SEG6_LOCAL_ACTION_END_DT46 = 16,
+ /* swap DA with new SID, leave SRH untouched (RFC 9433 Section 6.2) */
+ SEG6_LOCAL_ACTION_END_MAP = 17,
__SEG6_LOCAL_ACTION_MAX,
};
diff --git a/ip/iproute.c b/ip/iproute.c
index 5b9e7ac1134a..61394847018f 100644
--- a/ip/iproute.c
+++ b/ip/iproute.c
@@ -105,7 +105,8 @@ static void usage(void)
"SEG6LOCAL := action ACTION [ OPTIONS ] [ count ]\n"
"ACTION := { End | End.X | End.T | End.DX2 | End.DX6 | End.DX4 |\n"
" End.DT6 | End.DT4 | End.DT46 | End.B6 | End.B6.Encaps |\n"
- " End.BM | End.S | End.AS | End.AM | End.BPF }\n"
+ " End.BM | End.S | End.AS | End.AM | End.BPF |\n"
+ " End.MAP }\n"
"OPTIONS := OPTION [ OPTIONS ]\n"
"OPTION := { flavors FLAVORS | srh SEG6HDR | nh4 ADDR | nh6 ADDR | iif DEV | oif DEV |\n"
" table TABLEID | vrftable TABLEID | endpoint PROGNAME }\n"
diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c
index 00b4f7565be6..3a25835662d1 100644
--- a/ip/iproute_lwtunnel.c
+++ b/ip/iproute_lwtunnel.c
@@ -405,6 +405,7 @@ static const char *seg6_action_names[SEG6_LOCAL_ACTION_MAX + 1] = {
[SEG6_LOCAL_ACTION_END_AM] = "End.AM",
[SEG6_LOCAL_ACTION_END_BPF] = "End.BPF",
[SEG6_LOCAL_ACTION_END_DT46] = "End.DT46",
+ [SEG6_LOCAL_ACTION_END_MAP] = "End.MAP",
};
static const char *format_action_type(int action)
diff --git a/man/man8/ip-route.8.in b/man/man8/ip-route.8.in
index 9f29fd436f59..c0b1e87ad022 100644
--- a/man/man8/ip-route.8.in
+++ b/man/man8/ip-route.8.in
@@ -1024,6 +1024,15 @@ followed by the specified SRH. The destination address of the outer IPv6
header is set to the first segment of the new SRH. The source
address is set as described in \fBip-sr\fR(8).
+.B End.MAP nh6
+.IR ADDRESS
+- SRv6 Mobile User Plane End.MAP behavior (RFC 9433 Section 6.2).
+Decrement the IPv6 Hop Limit, replace the IPv6 destination address
+with the configured next SID
+.RI ( nh6 ),
+and forward via the IPv6 FIB. The Segment Routing Header is left
+untouched.
+
.B Flavors parameters
The flavors represent additional operations that can modify or extend a
--
2.50.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH iproute2-next v2 2/6] seg6: add support for the End.M.GTP4.E behavior
2026-05-04 16:10 [PATCH iproute2-next v2 0/6] seg6: SRv6 Mobile User Plane (RFC 9433) Yuya Kusakabe
2026-05-04 16:10 ` [PATCH iproute2-next v2 1/6] seg6: add support for the End.MAP behavior Yuya Kusakabe
@ 2026-05-04 16:10 ` Yuya Kusakabe
2026-05-04 16:10 ` [PATCH iproute2-next v2 3/6] seg6: add support for the End.M.GTP6.E behavior Yuya Kusakabe
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Yuya Kusakabe @ 2026-05-04 16:10 UTC (permalink / raw)
To: dsahern; +Cc: Yuya Kusakabe, netdev
Add support for the End.M.GTP4.E behavior, which translates SRv6
traffic into IPv4/GTP-U. Four new keywords are introduced:
src IPv6 source-address template
v4_mask_len IPv4 DA portion of the SID, in bits (1..32)
v6_src_prefix_len Source UPF Prefix length P in the IPv6 SA
template (1..127, defaults to 64); requires
P + v4_mask_len <= 128
pdu_type GTP-U PDU Session Container PDU Type
(downlink|dl|uplink|ul or 0..15)
Example:
ip -6 r a 2001:db8:1::/56 encap seg6local action End.M.GTP4.E \
src 2001:db8::1 v4_mask_len 32 v6_src_prefix_len 64 \
pdu_type ul dev sr0
Link: https://datatracker.ietf.org/doc/html/rfc9433
Signed-off-by: Yuya Kusakabe <yuya.kusakabe@gmail.com>
---
include/uapi/linux/seg6_local.h | 6 +++
ip/iproute.c | 6 ++-
ip/iproute_lwtunnel.c | 103 ++++++++++++++++++++++++++++++++++++++++
man/man8/ip-route.8.in | 34 +++++++++++++
4 files changed, 147 insertions(+), 2 deletions(-)
diff --git a/include/uapi/linux/seg6_local.h b/include/uapi/linux/seg6_local.h
index 1678db71e8e7..8bb3cdc3a649 100644
--- a/include/uapi/linux/seg6_local.h
+++ b/include/uapi/linux/seg6_local.h
@@ -29,6 +29,10 @@ enum {
SEG6_LOCAL_VRFTABLE,
SEG6_LOCAL_COUNTERS,
SEG6_LOCAL_FLAVORS,
+ SEG6_LOCAL_MOBILE_SRC_ADDR,
+ SEG6_LOCAL_MOBILE_V4_MASK_LEN,
+ SEG6_LOCAL_MOBILE_PDU_TYPE,
+ SEG6_LOCAL_MOBILE_V6_SRC_PREFIX_LEN,
__SEG6_LOCAL_MAX,
};
#define SEG6_LOCAL_MAX (__SEG6_LOCAL_MAX - 1)
@@ -69,6 +73,8 @@ enum {
SEG6_LOCAL_ACTION_END_DT46 = 16,
/* swap DA with new SID, leave SRH untouched (RFC 9433 Section 6.2) */
SEG6_LOCAL_ACTION_END_MAP = 17,
+ /* SRv6 to IPv4/GTP-U encap (RFC 9433 Section 6.6) */
+ SEG6_LOCAL_ACTION_END_M_GTP4_E = 18,
__SEG6_LOCAL_ACTION_MAX,
};
diff --git a/ip/iproute.c b/ip/iproute.c
index 61394847018f..f9ebba6541af 100644
--- a/ip/iproute.c
+++ b/ip/iproute.c
@@ -106,10 +106,12 @@ static void usage(void)
"ACTION := { End | End.X | End.T | End.DX2 | End.DX6 | End.DX4 |\n"
" End.DT6 | End.DT4 | End.DT46 | End.B6 | End.B6.Encaps |\n"
" End.BM | End.S | End.AS | End.AM | End.BPF |\n"
- " End.MAP }\n"
+ " End.MAP | End.M.GTP4.E }\n"
"OPTIONS := OPTION [ OPTIONS ]\n"
"OPTION := { flavors FLAVORS | srh SEG6HDR | nh4 ADDR | nh6 ADDR | iif DEV | oif DEV |\n"
- " table TABLEID | vrftable TABLEID | endpoint PROGNAME }\n"
+ " table TABLEID | vrftable TABLEID | endpoint PROGNAME | MOBILE_OPTION }\n"
+ "MOBILE_OPTION := { src ADDR | v4_mask_len BITS | v6_src_prefix_len BITS |\n"
+ " pdu_type { downlink | dl | uplink | ul | 0..15 } }\n"
"FLAVORS := { FLAVOR[,FLAVOR] }\n"
"FLAVOR := { psp | usp | usd | next-csid }\n"
"IOAM6HDR := trace prealloc type IOAM6_TRACE_TYPE ns IOAM6_NAMESPACE size IOAM6_TRACE_SIZE\n"
diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c
index 3a25835662d1..49fe563d9b86 100644
--- a/ip/iproute_lwtunnel.c
+++ b/ip/iproute_lwtunnel.c
@@ -406,6 +406,7 @@ static const char *seg6_action_names[SEG6_LOCAL_ACTION_MAX + 1] = {
[SEG6_LOCAL_ACTION_END_BPF] = "End.BPF",
[SEG6_LOCAL_ACTION_END_DT46] = "End.DT46",
[SEG6_LOCAL_ACTION_END_MAP] = "End.MAP",
+ [SEG6_LOCAL_ACTION_END_M_GTP4_E] = "End.M.GTP4.E",
};
static const char *format_action_type(int action)
@@ -577,6 +578,41 @@ static void print_encap_seg6local(FILE *fp, struct rtattr *encap)
if (tb[SEG6_LOCAL_FLAVORS])
print_seg6_local_flavors(fp, tb[SEG6_LOCAL_FLAVORS]);
+
+ if (tb[SEG6_LOCAL_MOBILE_SRC_ADDR])
+ print_string(PRINT_ANY, "src", "src %s ",
+ rt_addr_n2a_rta(AF_INET6,
+ tb[SEG6_LOCAL_MOBILE_SRC_ADDR]));
+
+ if (tb[SEG6_LOCAL_MOBILE_V4_MASK_LEN])
+ print_uint(PRINT_ANY, "v4_mask_len", "v4_mask_len %u ",
+ rta_getattr_u8(tb[SEG6_LOCAL_MOBILE_V4_MASK_LEN]));
+
+ if (tb[SEG6_LOCAL_MOBILE_V6_SRC_PREFIX_LEN])
+ print_uint(PRINT_ANY, "v6_src_prefix_len",
+ "v6_src_prefix_len %u ",
+ rta_getattr_u8(tb[SEG6_LOCAL_MOBILE_V6_SRC_PREFIX_LEN]));
+
+ if (tb[SEG6_LOCAL_MOBILE_PDU_TYPE]) {
+ __u8 t = rta_getattr_u8(tb[SEG6_LOCAL_MOBILE_PDU_TYPE]);
+ const char *name = NULL;
+
+ switch (t) {
+ case 0:
+ name = "downlink";
+ break;
+ case 1:
+ name = "uplink";
+ break;
+ }
+
+ if (name)
+ print_string(PRINT_ANY, "pdu_type",
+ "pdu_type %s ", name);
+ else
+ print_uint(PRINT_ANY, "pdu_type",
+ "pdu_type %u ", t);
+ }
}
static void print_encap_mpls(FILE *fp, struct rtattr *encap)
@@ -1451,6 +1487,8 @@ static int parse_encap_seg6local(struct rtattr *rta, size_t len, int *argcp,
int nh4_ok = 0, nh6_ok = 0, iif_ok = 0, oif_ok = 0, flavors_ok = 0;
int segs_ok = 0, hmac_ok = 0, table_ok = 0, vrftable_ok = 0;
int action_ok = 0, srh_ok = 0, bpf_ok = 0, counters_ok = 0;
+ int mobile_src_ok = 0, mobile_v4mask_ok = 0, mobile_pdusess_ok = 0;
+ int mobile_v6src_plen_ok = 0;
__u32 action = 0, table, vrftable, iif, oif;
struct ipv6_sr_hdr *srh;
char **argv = *argvp;
@@ -1458,6 +1496,7 @@ static int parse_encap_seg6local(struct rtattr *rta, size_t len, int *argcp,
char segbuf[1024];
inet_prefix addr;
__u32 hmac = 0;
+ __u8 v4_mask_len = 0, v6_src_prefix_len = 0;
int ret = 0;
while (argc > 0) {
@@ -1559,6 +1598,70 @@ static int parse_encap_seg6local(struct rtattr *rta, size_t len, int *argcp,
if (lwt_parse_bpf(rta, len, &argc, &argv, SEG6_LOCAL_BPF,
BPF_PROG_TYPE_LWT_SEG6LOCAL) < 0)
exit(-1);
+ } else if (strcmp(*argv, "src") == 0) {
+ /*
+ * Mobile User Plane "src" template; scoped to the
+ * seg6local block and unrelated to the top-level
+ * "src" prefsrc keyword.
+ */
+ NEXT_ARG();
+ if (mobile_src_ok++)
+ duparg2("src", *argv);
+ get_addr(&addr, *argv, AF_INET6);
+ ret = rta_addattr_l(rta, len, SEG6_LOCAL_MOBILE_SRC_ADDR,
+ &addr.data, addr.bytelen);
+ } else if (strcmp(*argv, "v4_mask_len") == 0) {
+ NEXT_ARG();
+ if (mobile_v4mask_ok++)
+ duparg2("v4_mask_len", *argv);
+ if (get_u8(&v4_mask_len, *argv, 0) ||
+ v4_mask_len == 0 || v4_mask_len > 32)
+ invarg("\"v4_mask_len\" must be in the range 1..32\n",
+ *argv);
+ ret = rta_addattr8(rta, len, SEG6_LOCAL_MOBILE_V4_MASK_LEN,
+ v4_mask_len);
+ } else if (strcmp(*argv, "v6_src_prefix_len") == 0) {
+ NEXT_ARG();
+ if (mobile_v6src_plen_ok++)
+ duparg2("v6_src_prefix_len", *argv);
+ /*
+ * Per RFC 9433 Section 6.6 Figure 10, the IPv6 SA is
+ * "Source UPF Prefix (P bits) | IPv4 SA (b bits) |
+ * padding (128 - P - b)". P is validated as 1..127
+ * here; the kernel enforces P + b <= 128 via netlink
+ * extack.
+ */
+ if (get_u8(&v6_src_prefix_len, *argv, 0) ||
+ v6_src_prefix_len == 0 ||
+ v6_src_prefix_len > 127)
+ invarg("\"v6_src_prefix_len\" must be in the range 1..127\n",
+ *argv);
+ ret = rta_addattr8(rta, len,
+ SEG6_LOCAL_MOBILE_V6_SRC_PREFIX_LEN,
+ v6_src_prefix_len);
+ } else if (strcmp(*argv, "pdu_type") == 0) {
+ __u8 psc_type;
+
+ NEXT_ARG();
+ if (mobile_pdusess_ok++)
+ duparg2("pdu_type", *argv);
+ /*
+ * 3GPP TS 38.415 PDU Session Type is a 4-bit field; the
+ * kernel mirrors that range (0..15). 0 = DL, 1 = UL.
+ */
+ if (strcmp(*argv, "downlink") == 0 ||
+ strcmp(*argv, "dl") == 0) {
+ psc_type = 0;
+ } else if (strcmp(*argv, "uplink") == 0 ||
+ strcmp(*argv, "ul") == 0) {
+ psc_type = 1;
+ } else if (get_u8(&psc_type, *argv, 0) ||
+ psc_type > 15) {
+ invarg("invalid \"pdu_type\" value (must be downlink|dl|uplink|ul or 0..15)\n", *argv);
+ }
+ ret = rta_addattr8(rta, len,
+ SEG6_LOCAL_MOBILE_PDU_TYPE,
+ psc_type);
} else {
break;
}
diff --git a/man/man8/ip-route.8.in b/man/man8/ip-route.8.in
index c0b1e87ad022..a878d4375f03 100644
--- a/man/man8/ip-route.8.in
+++ b/man/man8/ip-route.8.in
@@ -1033,6 +1033,40 @@ with the configured next SID
and forward via the IPv6 FIB. The Segment Routing Header is left
untouched.
+.B End.M.GTP4.E src
+.IR ADDRESS
+.B v4_mask_len
+.IR BITS
+.RB [ "v6_src_prefix_len"
+.IR BITS ]
+.RB [ "pdu_type"
+.IR DIR ]
+- SRv6 Mobile User Plane End.M.GTP4.E behavior (RFC 9433 Section 6.6).
+At the SR egress gateway, the matching SRv6 packet is converted into
+an IPv4/UDP/GTP-U packet for delivery to a legacy IPv4-attached gNB or
+eNB. The IPv6 destination address of the matching SID encodes
+.IR Locator " | " "IPv4 DA" " (\fBv4_mask_len\fR bits) | "
+.IR "Args.Mob.Session" " (40 bits, RFC 9433 Section 6.1)" ,
+and the IPv6 source address is built from
+.B src
+as
+.IR "Source UPF Prefix" " (\fBv6_src_prefix_len\fR bits) | "
+.IR "IPv4 SA" " (\fBv4_mask_len\fR bits) | padding" .
+.B v4_mask_len
+must be in 1..32 and
+.B v6_src_prefix_len
+in 1..127 (default 64); the route prefix length plus
+.BR v4_mask_len " + 40"
+and
+.BR v6_src_prefix_len " + " v4_mask_len
+must each fit in 128 bits.
+.B pdu_type
+.RB ( downlink | dl | uplink | ul " or " 0..15 )
+forces a GTP-U PDU Session Container (3GPP TS 38.415) with the given
+PDU Type; when omitted no Container is inserted, so 5G N3 deployments
+must set it explicitly.
+The action only accepts packets with Segments Left = 0 or no SRH.
+
.B Flavors parameters
The flavors represent additional operations that can modify or extend a
--
2.50.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH iproute2-next v2 3/6] seg6: add support for the End.M.GTP6.E behavior
2026-05-04 16:10 [PATCH iproute2-next v2 0/6] seg6: SRv6 Mobile User Plane (RFC 9433) Yuya Kusakabe
2026-05-04 16:10 ` [PATCH iproute2-next v2 1/6] seg6: add support for the End.MAP behavior Yuya Kusakabe
2026-05-04 16:10 ` [PATCH iproute2-next v2 2/6] seg6: add support for the End.M.GTP4.E behavior Yuya Kusakabe
@ 2026-05-04 16:10 ` Yuya Kusakabe
2026-05-04 16:10 ` [PATCH iproute2-next v2 4/6] seg6: add support for the End.M.GTP6.D behavior Yuya Kusakabe
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Yuya Kusakabe @ 2026-05-04 16:10 UTC (permalink / raw)
To: dsahern; +Cc: Yuya Kusakabe, netdev
Add support for the End.M.GTP6.E behavior, which translates SRv6
traffic into IPv6/GTP-U. The behavior reuses the src and pdu_type
keywords introduced for End.M.GTP4.E; v4_mask_len is not meaningful
for an IPv6/GTP-U tunnel and is rejected.
Example:
ip -6 r a 2001:db8:1::/64 encap seg6local action End.M.GTP6.E \
src 2001:db8::1 pdu_type ul dev sr0
Link: https://datatracker.ietf.org/doc/html/rfc9433
Signed-off-by: Yuya Kusakabe <yuya.kusakabe@gmail.com>
---
include/uapi/linux/seg6_local.h | 2 ++
ip/iproute.c | 2 +-
ip/iproute_lwtunnel.c | 1 +
man/man8/ip-route.8.in | 21 +++++++++++++++++++++
4 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/include/uapi/linux/seg6_local.h b/include/uapi/linux/seg6_local.h
index 8bb3cdc3a649..6af145259ffb 100644
--- a/include/uapi/linux/seg6_local.h
+++ b/include/uapi/linux/seg6_local.h
@@ -75,6 +75,8 @@ enum {
SEG6_LOCAL_ACTION_END_MAP = 17,
/* SRv6 to IPv4/GTP-U encap (RFC 9433 Section 6.6) */
SEG6_LOCAL_ACTION_END_M_GTP4_E = 18,
+ /* SRv6 to IPv6/GTP-U encap (RFC 9433 Section 6.5) */
+ SEG6_LOCAL_ACTION_END_M_GTP6_E = 19,
__SEG6_LOCAL_ACTION_MAX,
};
diff --git a/ip/iproute.c b/ip/iproute.c
index f9ebba6541af..e009e7480e76 100644
--- a/ip/iproute.c
+++ b/ip/iproute.c
@@ -106,7 +106,7 @@ static void usage(void)
"ACTION := { End | End.X | End.T | End.DX2 | End.DX6 | End.DX4 |\n"
" End.DT6 | End.DT4 | End.DT46 | End.B6 | End.B6.Encaps |\n"
" End.BM | End.S | End.AS | End.AM | End.BPF |\n"
- " End.MAP | End.M.GTP4.E }\n"
+ " End.MAP | End.M.GTP4.E | End.M.GTP6.E }\n"
"OPTIONS := OPTION [ OPTIONS ]\n"
"OPTION := { flavors FLAVORS | srh SEG6HDR | nh4 ADDR | nh6 ADDR | iif DEV | oif DEV |\n"
" table TABLEID | vrftable TABLEID | endpoint PROGNAME | MOBILE_OPTION }\n"
diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c
index 49fe563d9b86..38e806b053c5 100644
--- a/ip/iproute_lwtunnel.c
+++ b/ip/iproute_lwtunnel.c
@@ -407,6 +407,7 @@ static const char *seg6_action_names[SEG6_LOCAL_ACTION_MAX + 1] = {
[SEG6_LOCAL_ACTION_END_DT46] = "End.DT46",
[SEG6_LOCAL_ACTION_END_MAP] = "End.MAP",
[SEG6_LOCAL_ACTION_END_M_GTP4_E] = "End.M.GTP4.E",
+ [SEG6_LOCAL_ACTION_END_M_GTP6_E] = "End.M.GTP6.E",
};
static const char *format_action_type(int action)
diff --git a/man/man8/ip-route.8.in b/man/man8/ip-route.8.in
index a878d4375f03..7cf97924d699 100644
--- a/man/man8/ip-route.8.in
+++ b/man/man8/ip-route.8.in
@@ -1067,6 +1067,27 @@ PDU Type; when omitted no Container is inserted, so 5G N3 deployments
must set it explicitly.
The action only accepts packets with Segments Left = 0 or no SRH.
+.B End.M.GTP6.E src
+.IR ADDRESS
+.RB [ "pdu_type"
+.IR DIR ]
+- SRv6 Mobile User Plane End.M.GTP6.E behavior (RFC 9433 Section 6.5).
+At the SR egress gateway, an SRv6 packet whose current SID is an
+End.M.GTP6.E SID is converted into an IPv6/UDP/GTP-U packet directed at
+the next segment held in
+.IR SRH[0] .
+The 40-bit Args.Mob.Session field defined in RFC 9433 Section 6.1 is
+read from the right-aligned tail of the matching SID, and its 32-bit
+PDU Session ID portion is used as the GTP-U TEID. The IPv6 source
+address of the new tunnel is set to the user-provided template
+.BR src .
+The action requires Segments Left to equal 1; other matching packets are
+dropped. The optional
+.B pdu_type
+takes the same syntax and semantics as in
+.B End.M.GTP4.E
+above (no PDU Session Container is inserted unless explicitly set).
+
.B Flavors parameters
The flavors represent additional operations that can modify or extend a
--
2.50.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH iproute2-next v2 4/6] seg6: add support for the End.M.GTP6.D behavior
2026-05-04 16:10 [PATCH iproute2-next v2 0/6] seg6: SRv6 Mobile User Plane (RFC 9433) Yuya Kusakabe
` (2 preceding siblings ...)
2026-05-04 16:10 ` [PATCH iproute2-next v2 3/6] seg6: add support for the End.M.GTP6.E behavior Yuya Kusakabe
@ 2026-05-04 16:10 ` Yuya Kusakabe
2026-05-04 16:10 ` [PATCH iproute2-next v2 5/6] seg6: add support for the End.M.GTP6.D.Di behavior Yuya Kusakabe
2026-05-04 16:10 ` [PATCH iproute2-next v2 6/6] seg6: add support for the H.M.GTP4.D behavior Yuya Kusakabe
5 siblings, 0 replies; 7+ messages in thread
From: Yuya Kusakabe @ 2026-05-04 16:10 UTC (permalink / raw)
To: dsahern; +Cc: Yuya Kusakabe, netdev
Add support for the End.M.GTP6.D behavior, which translates IPv6/GTP-U
traffic into an SRv6 SR Policy. The SR Policy is supplied through the
existing srh segs syntax, and a new sr_prefix_len keyword specifies
the locator length of the egress End.M.GTP6.E SID (1..88, leaving
40 bits for the Args.Mob.Session field).
Example:
ip -6 r a 2001:db8:f::/64 encap seg6local action End.M.GTP6.D \
srh segs 2001:db8:2::1,2001:db8:3::e \
src 2001:db8::1 sr_prefix_len 88 dev sr0
Link: https://datatracker.ietf.org/doc/html/rfc9433
Signed-off-by: Yuya Kusakabe <yuya.kusakabe@gmail.com>
---
include/uapi/linux/seg6_local.h | 3 +++
ip/iproute.c | 6 ++++--
ip/iproute_lwtunnel.c | 45 ++++++++++++++++++++++++++++++++++++++---
man/man8/ip-route.8.in | 29 ++++++++++++++++++++++++++
4 files changed, 78 insertions(+), 5 deletions(-)
diff --git a/include/uapi/linux/seg6_local.h b/include/uapi/linux/seg6_local.h
index 6af145259ffb..ed44fb858600 100644
--- a/include/uapi/linux/seg6_local.h
+++ b/include/uapi/linux/seg6_local.h
@@ -33,6 +33,7 @@ enum {
SEG6_LOCAL_MOBILE_V4_MASK_LEN,
SEG6_LOCAL_MOBILE_PDU_TYPE,
SEG6_LOCAL_MOBILE_V6_SRC_PREFIX_LEN,
+ SEG6_LOCAL_MOBILE_SR_PREFIX_LEN,
__SEG6_LOCAL_MAX,
};
#define SEG6_LOCAL_MAX (__SEG6_LOCAL_MAX - 1)
@@ -77,6 +78,8 @@ enum {
SEG6_LOCAL_ACTION_END_M_GTP4_E = 18,
/* SRv6 to IPv6/GTP-U encap (RFC 9433 Section 6.5) */
SEG6_LOCAL_ACTION_END_M_GTP6_E = 19,
+ /* IPv6/GTP-U decap into SRv6 (RFC 9433 Section 6.3) */
+ SEG6_LOCAL_ACTION_END_M_GTP6_D = 20,
__SEG6_LOCAL_ACTION_MAX,
};
diff --git a/ip/iproute.c b/ip/iproute.c
index e009e7480e76..6cd19c2c2b00 100644
--- a/ip/iproute.c
+++ b/ip/iproute.c
@@ -106,11 +106,13 @@ static void usage(void)
"ACTION := { End | End.X | End.T | End.DX2 | End.DX6 | End.DX4 |\n"
" End.DT6 | End.DT4 | End.DT46 | End.B6 | End.B6.Encaps |\n"
" End.BM | End.S | End.AS | End.AM | End.BPF |\n"
- " End.MAP | End.M.GTP4.E | End.M.GTP6.E }\n"
+ " End.MAP | End.M.GTP4.E | End.M.GTP6.E |\n"
+ " End.M.GTP6.D }\n"
"OPTIONS := OPTION [ OPTIONS ]\n"
"OPTION := { flavors FLAVORS | srh SEG6HDR | nh4 ADDR | nh6 ADDR | iif DEV | oif DEV |\n"
" table TABLEID | vrftable TABLEID | endpoint PROGNAME | MOBILE_OPTION }\n"
- "MOBILE_OPTION := { src ADDR | v4_mask_len BITS | v6_src_prefix_len BITS |\n"
+ "MOBILE_OPTION := { src ADDR | v4_mask_len BITS | sr_prefix_len BITS |\n"
+ " v6_src_prefix_len BITS |\n"
" pdu_type { downlink | dl | uplink | ul | 0..15 } }\n"
"FLAVORS := { FLAVOR[,FLAVOR] }\n"
"FLAVOR := { psp | usp | usd | next-csid }\n"
diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c
index 38e806b053c5..a63dfe379a89 100644
--- a/ip/iproute_lwtunnel.c
+++ b/ip/iproute_lwtunnel.c
@@ -408,6 +408,7 @@ static const char *seg6_action_names[SEG6_LOCAL_ACTION_MAX + 1] = {
[SEG6_LOCAL_ACTION_END_MAP] = "End.MAP",
[SEG6_LOCAL_ACTION_END_M_GTP4_E] = "End.M.GTP4.E",
[SEG6_LOCAL_ACTION_END_M_GTP6_E] = "End.M.GTP6.E",
+ [SEG6_LOCAL_ACTION_END_M_GTP6_D] = "End.M.GTP6.D",
};
static const char *format_action_type(int action)
@@ -589,6 +590,11 @@ static void print_encap_seg6local(FILE *fp, struct rtattr *encap)
print_uint(PRINT_ANY, "v4_mask_len", "v4_mask_len %u ",
rta_getattr_u8(tb[SEG6_LOCAL_MOBILE_V4_MASK_LEN]));
+ if (tb[SEG6_LOCAL_MOBILE_SR_PREFIX_LEN])
+ print_uint(PRINT_ANY, "sr_prefix_len",
+ "sr_prefix_len %u ",
+ rta_getattr_u8(tb[SEG6_LOCAL_MOBILE_SR_PREFIX_LEN]));
+
if (tb[SEG6_LOCAL_MOBILE_V6_SRC_PREFIX_LEN])
print_uint(PRINT_ANY, "v6_src_prefix_len",
"v6_src_prefix_len %u ",
@@ -616,6 +622,22 @@ static void print_encap_seg6local(FILE *fp, struct rtattr *encap)
}
}
+/*
+ * SRH-supplying actions (the seg6local equivalents of seg6 inline mode)
+ * pass the entire segment list explicitly; parse_srh() must not append the
+ * implicit terminating SID it adds for inline-style callers.
+ */
+static bool seg6local_action_excludes_final_seg(int action)
+{
+ switch (action) {
+ case SEG6_LOCAL_ACTION_END_B6_ENCAP:
+ case SEG6_LOCAL_ACTION_END_M_GTP6_D:
+ return true;
+ default:
+ return false;
+ }
+}
+
static void print_encap_mpls(FILE *fp, struct rtattr *encap)
{
struct rtattr *tb[MPLS_IPTUNNEL_MAX+1];
@@ -1489,7 +1511,7 @@ static int parse_encap_seg6local(struct rtattr *rta, size_t len, int *argcp,
int segs_ok = 0, hmac_ok = 0, table_ok = 0, vrftable_ok = 0;
int action_ok = 0, srh_ok = 0, bpf_ok = 0, counters_ok = 0;
int mobile_src_ok = 0, mobile_v4mask_ok = 0, mobile_pdusess_ok = 0;
- int mobile_v6src_plen_ok = 0;
+ int mobile_sr_plen_ok = 0, mobile_v6src_plen_ok = 0;
__u32 action = 0, table, vrftable, iif, oif;
struct ipv6_sr_hdr *srh;
char **argv = *argvp;
@@ -1497,7 +1519,7 @@ static int parse_encap_seg6local(struct rtattr *rta, size_t len, int *argcp,
char segbuf[1024];
inet_prefix addr;
__u32 hmac = 0;
- __u8 v4_mask_len = 0, v6_src_prefix_len = 0;
+ __u8 v4_mask_len = 0, sr_prefix_len = 0, v6_src_prefix_len = 0;
int ret = 0;
while (argc > 0) {
@@ -1621,6 +1643,23 @@ static int parse_encap_seg6local(struct rtattr *rta, size_t len, int *argcp,
*argv);
ret = rta_addattr8(rta, len, SEG6_LOCAL_MOBILE_V4_MASK_LEN,
v4_mask_len);
+ } else if (strcmp(*argv, "sr_prefix_len") == 0) {
+ NEXT_ARG();
+ if (mobile_sr_plen_ok++)
+ duparg2("sr_prefix_len", *argv);
+ /*
+ * The egress SID must leave room for the 40-bit
+ * Args.Mob.Session field, so the locator can be at
+ * most (128 - 40) = 88 bits.
+ */
+ if (get_u8(&sr_prefix_len, *argv, 0) ||
+ sr_prefix_len == 0 ||
+ sr_prefix_len > 88)
+ invarg("\"sr_prefix_len\" must be in the range 1..88\n",
+ *argv);
+ ret = rta_addattr8(rta, len,
+ SEG6_LOCAL_MOBILE_SR_PREFIX_LEN,
+ sr_prefix_len);
} else if (strcmp(*argv, "v6_src_prefix_len") == 0) {
NEXT_ARG();
if (mobile_v6src_plen_ok++)
@@ -1680,7 +1719,7 @@ static int parse_encap_seg6local(struct rtattr *rta, size_t len, int *argcp,
int srhlen;
srh = parse_srh(segbuf, hmac,
- action == SEG6_LOCAL_ACTION_END_B6_ENCAP);
+ seg6local_action_excludes_final_seg(action));
srhlen = (srh->hdrlen + 1) << 3;
ret = rta_addattr_l(rta, len, SEG6_LOCAL_SRH, srh, srhlen);
free(srh);
diff --git a/man/man8/ip-route.8.in b/man/man8/ip-route.8.in
index 7cf97924d699..35e6e2080a1f 100644
--- a/man/man8/ip-route.8.in
+++ b/man/man8/ip-route.8.in
@@ -1088,6 +1088,35 @@ takes the same syntax and semantics as in
.B End.M.GTP4.E
above (no PDU Session Container is inserted unless explicitly set).
+.B End.M.GTP6.D srh segs
+.IR SEGMENTS
+.B src
+.IR ADDRESS
+.B sr_prefix_len
+.IR BITS
+- SRv6 Mobile User Plane End.M.GTP6.D behavior (RFC 9433 Section 6.3).
+At the SR ingress gateway, the matching IPv6/UDP/GTP-U packet has its
+GTP-U envelope removed and the inner T-PDU is re-encapsulated in SRv6
+using the supplied SR Policy
+.RI ( srh
+\fBsegs\fR\~\fISEGMENTS\fR). The TEID is folded into the 40-bit
+Args.Mob.Session field placed immediately after the egress
+End.M.GTP6.E SID's locator (RFC 9433 Section 6.5),
+.B sr_prefix_len
+specifying the locator length in bits (1..88 -- the upper bound
+leaves room for the 40-bit Args.Mob.Session field within the
+128-bit egress SID). The egress SID's locator
+length cannot be inferred from local state at the SR Gateway. The
+egress
+.B End.M.GTP6.E
+SID can then recover the per-session identifier from the same offset.
+The new outer IPv6 source address is taken from
+.BR src .
+The action requires either no SRH or an SRH with
+.B Segments Left
+equal to zero on the inbound packet; other matching packets are
+dropped.
+
.B Flavors parameters
The flavors represent additional operations that can modify or extend a
--
2.50.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH iproute2-next v2 5/6] seg6: add support for the End.M.GTP6.D.Di behavior
2026-05-04 16:10 [PATCH iproute2-next v2 0/6] seg6: SRv6 Mobile User Plane (RFC 9433) Yuya Kusakabe
` (3 preceding siblings ...)
2026-05-04 16:10 ` [PATCH iproute2-next v2 4/6] seg6: add support for the End.M.GTP6.D behavior Yuya Kusakabe
@ 2026-05-04 16:10 ` Yuya Kusakabe
2026-05-04 16:10 ` [PATCH iproute2-next v2 6/6] seg6: add support for the H.M.GTP4.D behavior Yuya Kusakabe
5 siblings, 0 replies; 7+ messages in thread
From: Yuya Kusakabe @ 2026-05-04 16:10 UTC (permalink / raw)
To: dsahern; +Cc: Yuya Kusakabe, netdev
Add support for the End.M.GTP6.D.Di drop-in interconnect behavior,
which translates IPv6/GTP-U traffic into an SRv6 SR Policy while
preserving the original outer IPv6 destination as the final SRH
segment. Unlike End.M.GTP6.D, this behavior does not take
sr_prefix_len.
Example:
ip -6 r a 2001:db8:f::/64 encap seg6local action End.M.GTP6.D.Di \
srh segs 2001:db8:2::1,2001:db8:3::e \
src 2001:db8::1 dev sr0
Link: https://datatracker.ietf.org/doc/html/rfc9433
Signed-off-by: Yuya Kusakabe <yuya.kusakabe@gmail.com>
---
include/uapi/linux/seg6_local.h | 2 ++
ip/iproute.c | 2 +-
ip/iproute_lwtunnel.c | 2 ++
man/man8/ip-route.8.in | 16 ++++++++++++++++
4 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/include/uapi/linux/seg6_local.h b/include/uapi/linux/seg6_local.h
index ed44fb858600..0ca8405df2f2 100644
--- a/include/uapi/linux/seg6_local.h
+++ b/include/uapi/linux/seg6_local.h
@@ -80,6 +80,8 @@ enum {
SEG6_LOCAL_ACTION_END_M_GTP6_E = 19,
/* IPv6/GTP-U decap into SRv6 (RFC 9433 Section 6.3) */
SEG6_LOCAL_ACTION_END_M_GTP6_D = 20,
+ /* IPv6/GTP-U decap into SRv6, drop-in mode (RFC 9433 Section 6.4) */
+ SEG6_LOCAL_ACTION_END_M_GTP6_D_DI = 21,
__SEG6_LOCAL_ACTION_MAX,
};
diff --git a/ip/iproute.c b/ip/iproute.c
index 6cd19c2c2b00..40494ccf8eaa 100644
--- a/ip/iproute.c
+++ b/ip/iproute.c
@@ -107,7 +107,7 @@ static void usage(void)
" End.DT6 | End.DT4 | End.DT46 | End.B6 | End.B6.Encaps |\n"
" End.BM | End.S | End.AS | End.AM | End.BPF |\n"
" End.MAP | End.M.GTP4.E | End.M.GTP6.E |\n"
- " End.M.GTP6.D }\n"
+ " End.M.GTP6.D | End.M.GTP6.D.Di }\n"
"OPTIONS := OPTION [ OPTIONS ]\n"
"OPTION := { flavors FLAVORS | srh SEG6HDR | nh4 ADDR | nh6 ADDR | iif DEV | oif DEV |\n"
" table TABLEID | vrftable TABLEID | endpoint PROGNAME | MOBILE_OPTION }\n"
diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c
index a63dfe379a89..570d95780ae4 100644
--- a/ip/iproute_lwtunnel.c
+++ b/ip/iproute_lwtunnel.c
@@ -409,6 +409,7 @@ static const char *seg6_action_names[SEG6_LOCAL_ACTION_MAX + 1] = {
[SEG6_LOCAL_ACTION_END_M_GTP4_E] = "End.M.GTP4.E",
[SEG6_LOCAL_ACTION_END_M_GTP6_E] = "End.M.GTP6.E",
[SEG6_LOCAL_ACTION_END_M_GTP6_D] = "End.M.GTP6.D",
+ [SEG6_LOCAL_ACTION_END_M_GTP6_D_DI] = "End.M.GTP6.D.Di",
};
static const char *format_action_type(int action)
@@ -632,6 +633,7 @@ static bool seg6local_action_excludes_final_seg(int action)
switch (action) {
case SEG6_LOCAL_ACTION_END_B6_ENCAP:
case SEG6_LOCAL_ACTION_END_M_GTP6_D:
+ case SEG6_LOCAL_ACTION_END_M_GTP6_D_DI:
return true;
default:
return false;
diff --git a/man/man8/ip-route.8.in b/man/man8/ip-route.8.in
index 35e6e2080a1f..0487338707c6 100644
--- a/man/man8/ip-route.8.in
+++ b/man/man8/ip-route.8.in
@@ -1117,6 +1117,22 @@ The action requires either no SRH or an SRH with
equal to zero on the inbound packet; other matching packets are
dropped.
+.B End.M.GTP6.D.Di srh segs
+.IR SEGMENTS
+.B src
+.IR ADDRESS
+- SRv6 Mobile User Plane End.M.GTP6.D.Di drop-in interconnect behavior
+(RFC 9433 Section 6.4). Identical to
+.B End.M.GTP6.D
+except that the original outer IPv6 destination address of the
+incoming GTP-U packet is preserved as the final segment of the new
+SRH, allowing existing SRv6 networks to be inserted into a legacy
+mobile path without changing the destination semantics.
+.B sr_prefix_len
+is rejected for this action: the original outer destination is
+preserved verbatim instead of being repacked with an Args.Mob.Session
+field, so no locator length needs to be carried.
+
.B Flavors parameters
The flavors represent additional operations that can modify or extend a
--
2.50.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH iproute2-next v2 6/6] seg6: add support for the H.M.GTP4.D behavior
2026-05-04 16:10 [PATCH iproute2-next v2 0/6] seg6: SRv6 Mobile User Plane (RFC 9433) Yuya Kusakabe
` (4 preceding siblings ...)
2026-05-04 16:10 ` [PATCH iproute2-next v2 5/6] seg6: add support for the End.M.GTP6.D.Di behavior Yuya Kusakabe
@ 2026-05-04 16:10 ` Yuya Kusakabe
5 siblings, 0 replies; 7+ messages in thread
From: Yuya Kusakabe @ 2026-05-04 16:10 UTC (permalink / raw)
To: dsahern; +Cc: Yuya Kusakabe, netdev
Add support for the H.M.GTP4.D headend behavior, which translates
IPv4/GTP-U traffic into an SRv6 SR Policy. H.M.GTP4.D is installed
on an IPv4 route and reuses the existing src, v4_mask_len,
sr_prefix_len, and v6_src_prefix_len keywords.
The kernel validates that sr_prefix_len + v4_mask_len does not
exceed 88 bits and returns EINVAL via netlink extack otherwise,
since the locator, the embedded IPv4 destination, and the 40-bit
Args.Mob.Session field together must fit inside the 128-bit egress
SID.
Example:
ip -4 r a 10.0.0.0/24 encap seg6local action H.M.GTP4.D \
nh6 2001:db8:f:: src 2001:db8::1 \
v4_mask_len 32 sr_prefix_len 56 v6_src_prefix_len 64 dev sr0
Link: https://datatracker.ietf.org/doc/html/rfc9433
Signed-off-by: Yuya Kusakabe <yuya.kusakabe@gmail.com>
---
include/uapi/linux/seg6_local.h | 2 ++
ip/iproute.c | 2 +-
ip/iproute_lwtunnel.c | 1 +
man/man8/ip-route.8.in | 45 +++++++++++++++++++++++++++++++++++++++++
4 files changed, 49 insertions(+), 1 deletion(-)
diff --git a/include/uapi/linux/seg6_local.h b/include/uapi/linux/seg6_local.h
index 0ca8405df2f2..69a875fcad73 100644
--- a/include/uapi/linux/seg6_local.h
+++ b/include/uapi/linux/seg6_local.h
@@ -82,6 +82,8 @@ enum {
SEG6_LOCAL_ACTION_END_M_GTP6_D = 20,
/* IPv6/GTP-U decap into SRv6, drop-in mode (RFC 9433 Section 6.4) */
SEG6_LOCAL_ACTION_END_M_GTP6_D_DI = 21,
+ /* SR headend: IPv4/GTP-U decap, encap in SRv6 (RFC 9433 Section 6.7) */
+ SEG6_LOCAL_ACTION_H_M_GTP4_D = 22,
__SEG6_LOCAL_ACTION_MAX,
};
diff --git a/ip/iproute.c b/ip/iproute.c
index 40494ccf8eaa..d956b39a8ef8 100644
--- a/ip/iproute.c
+++ b/ip/iproute.c
@@ -107,7 +107,7 @@ static void usage(void)
" End.DT6 | End.DT4 | End.DT46 | End.B6 | End.B6.Encaps |\n"
" End.BM | End.S | End.AS | End.AM | End.BPF |\n"
" End.MAP | End.M.GTP4.E | End.M.GTP6.E |\n"
- " End.M.GTP6.D | End.M.GTP6.D.Di }\n"
+ " End.M.GTP6.D | End.M.GTP6.D.Di | H.M.GTP4.D }\n"
"OPTIONS := OPTION [ OPTIONS ]\n"
"OPTION := { flavors FLAVORS | srh SEG6HDR | nh4 ADDR | nh6 ADDR | iif DEV | oif DEV |\n"
" table TABLEID | vrftable TABLEID | endpoint PROGNAME | MOBILE_OPTION }\n"
diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c
index 570d95780ae4..0bb29e69dc52 100644
--- a/ip/iproute_lwtunnel.c
+++ b/ip/iproute_lwtunnel.c
@@ -410,6 +410,7 @@ static const char *seg6_action_names[SEG6_LOCAL_ACTION_MAX + 1] = {
[SEG6_LOCAL_ACTION_END_M_GTP6_E] = "End.M.GTP6.E",
[SEG6_LOCAL_ACTION_END_M_GTP6_D] = "End.M.GTP6.D",
[SEG6_LOCAL_ACTION_END_M_GTP6_D_DI] = "End.M.GTP6.D.Di",
+ [SEG6_LOCAL_ACTION_H_M_GTP4_D] = "H.M.GTP4.D",
};
static const char *format_action_type(int action)
diff --git a/man/man8/ip-route.8.in b/man/man8/ip-route.8.in
index 0487338707c6..7badfcc1e8c3 100644
--- a/man/man8/ip-route.8.in
+++ b/man/man8/ip-route.8.in
@@ -1133,6 +1133,51 @@ is rejected for this action: the original outer destination is
preserved verbatim instead of being repacked with an Args.Mob.Session
field, so no locator length needs to be carried.
+.B H.M.GTP4.D nh6
+.IR ADDRESS
+.B src
+.IR ADDRESS
+.B v4_mask_len
+.IR BITS
+.B sr_prefix_len
+.IR BITS
+.RB [ "v6_src_prefix_len"
+.IR BITS ]
+- SRv6 Mobile User Plane H.M.GTP4.D headend behavior (RFC 9433 Section
+6.7). Match an IPv4/UDP/GTP-U packet, strip the GTP-U envelope, and
+re-encapsulate the inner T-PDU in a new IPv6 header whose addresses
+encode the per-session identifiers expected by an
+.B End.M.GTP4.E
+SID at the egress SR gateway. The destination UPF prefix template is
+specified by
+.BR nh6 ,
+the source UPF prefix template by
+.BR src ;
+.B v4_mask_len
+is the bit length reserved for the original IPv4 destination/source
+address, and
+.B sr_prefix_len
+is the locator length of the egress End.M.GTP4.E SID (1..88).
+The 40-bit Args.Mob.Session field defined
+by RFC 9433 Section 6.1 follows the embedded IPv4 destination at the
+offset implied by
+.BR sr_prefix_len " + " v4_mask_len ;
+its width is fixed by the RFC and is not exposed as a knob.
+.BR sr_prefix_len " + " v4_mask_len
+must therefore be at most 88 bits so the resulting 128-bit SID can
+hold all three fields.
+.B v6_src_prefix_len
+controls the IPv6 SA layout per RFC 9433 Section 6.6 Figure 10
+(\fIP\fR | IPv4 SA | padding) in the same way as for End.M.GTP4.E:
+1..127, and
+.BR v6_src_prefix_len " + " v4_mask_len " <= 128" ;
+defaults to 64 when omitted.
+.PP
+.B Note:
+because H.M.GTP4.D matches IPv4/GTP-U packets, the route must be
+installed on the IPv4 FIB (\fBip -4 route add ...\fR); installing it
+under \fBip -6 route\fR is rejected by the kernel.
+
.B Flavors parameters
The flavors represent additional operations that can modify or extend a
--
2.50.1
^ permalink raw reply related [flat|nested] 7+ messages in thread