* [PATCH iproute2-next v2 0/3] Add flow label support to ip-rule and route get
@ 2024-12-30 8:58 Ido Schimmel
2024-12-30 8:58 ` [PATCH iproute2-next v2 1/3] Sync uAPI headers Ido Schimmel
` (3 more replies)
0 siblings, 4 replies; 7+ messages in thread
From: Ido Schimmel @ 2024-12-30 8:58 UTC (permalink / raw)
To: netdev; +Cc: dsahern, stephen, petrm, gnault, Ido Schimmel
Add IPv6 flow label support to ip-rule and route get requests following
kernel support that was added in kernel commit 6b3099ebca13 ("Merge
branch 'net-fib_rules-add-flow-label-selector-support'").
v2:
* Remove new line from invarg() invocations.
Ido Schimmel (3):
Sync uAPI headers
ip: route: Add IPv6 flow label support
iprule: Add flow label support
include/uapi/linux/fib_rules.h | 2 ++
include/uapi/linux/rtnetlink.h | 1 +
ip/iproute.c | 10 +++++-
ip/iprule.c | 66 +++++++++++++++++++++++++++++++++-
man/man8/ip-route.8.in | 8 ++++-
man/man8/ip-rule.8.in | 8 ++++-
6 files changed, 91 insertions(+), 4 deletions(-)
--
2.47.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH iproute2-next v2 1/3] Sync uAPI headers
2024-12-30 8:58 [PATCH iproute2-next v2 0/3] Add flow label support to ip-rule and route get Ido Schimmel
@ 2024-12-30 8:58 ` Ido Schimmel
2024-12-30 8:58 ` [PATCH iproute2-next v2 2/3] ip: route: Add IPv6 flow label support Ido Schimmel
` (2 subsequent siblings)
3 siblings, 0 replies; 7+ messages in thread
From: Ido Schimmel @ 2024-12-30 8:58 UTC (permalink / raw)
To: netdev; +Cc: dsahern, stephen, petrm, gnault, Ido Schimmel
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
---
include/uapi/linux/fib_rules.h | 2 ++
include/uapi/linux/rtnetlink.h | 1 +
2 files changed, 3 insertions(+)
diff --git a/include/uapi/linux/fib_rules.h b/include/uapi/linux/fib_rules.h
index a6924dd3aff1..00e9890ca3c0 100644
--- a/include/uapi/linux/fib_rules.h
+++ b/include/uapi/linux/fib_rules.h
@@ -68,6 +68,8 @@ enum {
FRA_SPORT_RANGE, /* sport */
FRA_DPORT_RANGE, /* dport */
FRA_DSCP, /* dscp */
+ FRA_FLOWLABEL, /* flowlabel */
+ FRA_FLOWLABEL_MASK, /* flowlabel mask */
__FRA_MAX
};
diff --git a/include/uapi/linux/rtnetlink.h b/include/uapi/linux/rtnetlink.h
index 458e5670ce67..478c9d836a7b 100644
--- a/include/uapi/linux/rtnetlink.h
+++ b/include/uapi/linux/rtnetlink.h
@@ -393,6 +393,7 @@ enum rtattr_type_t {
RTA_SPORT,
RTA_DPORT,
RTA_NH_ID,
+ RTA_FLOWLABEL,
__RTA_MAX
};
--
2.47.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH iproute2-next v2 2/3] ip: route: Add IPv6 flow label support
2024-12-30 8:58 [PATCH iproute2-next v2 0/3] Add flow label support to ip-rule and route get Ido Schimmel
2024-12-30 8:58 ` [PATCH iproute2-next v2 1/3] Sync uAPI headers Ido Schimmel
@ 2024-12-30 8:58 ` Ido Schimmel
2024-12-31 0:49 ` Stephen Hemminger
2024-12-30 8:58 ` [PATCH iproute2-next v2 3/3] iprule: Add " Ido Schimmel
2025-01-01 1:30 ` [PATCH iproute2-next v2 0/3] Add flow label support to ip-rule and route get patchwork-bot+netdevbpf
3 siblings, 1 reply; 7+ messages in thread
From: Ido Schimmel @ 2024-12-30 8:58 UTC (permalink / raw)
To: netdev; +Cc: dsahern, stephen, petrm, gnault, Ido Schimmel
Allow specifying an IPv6 flow label when performing a route lookup.
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Guillaume Nault <gnault@redhat.com>
---
ip/iproute.c | 10 +++++++++-
man/man8/ip-route.8.in | 8 +++++++-
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/ip/iproute.c b/ip/iproute.c
index 9520729e58eb..e1fe26ce05d0 100644
--- a/ip/iproute.c
+++ b/ip/iproute.c
@@ -67,7 +67,7 @@ static void usage(void)
" [ mark NUMBER ] [ vrf NAME ]\n"
" [ uid NUMBER ] [ ipproto PROTOCOL ]\n"
" [ sport NUMBER ] [ dport NUMBER ]\n"
- " [ as ADDRESS ]\n"
+ " [ as ADDRESS ] [ flowlabel FLOWLABEL ]\n"
" ip route { add | del | change | append | replace } ROUTE\n"
"SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ]\n"
" [ table TABLE_ID ] [ vrf NAME ] [ proto RTPROTO ]\n"
@@ -2129,6 +2129,14 @@ static int iproute_get(int argc, char **argv)
invarg("Invalid \"ipproto\" value\n",
*argv);
addattr8(&req.n, sizeof(req), RTA_IP_PROTO, ipproto);
+ } else if (strcmp(*argv, "flowlabel") == 0) {
+ __be32 flowlabel;
+
+ NEXT_ARG();
+ if (get_be32(&flowlabel, *argv, 0))
+ invarg("invalid flowlabel", *argv);
+ addattr32(&req.n, sizeof(req), RTA_FLOWLABEL,
+ flowlabel);
} else {
inet_prefix addr;
diff --git a/man/man8/ip-route.8.in b/man/man8/ip-route.8.in
index 676f289a6d26..69d445ef8b5c 100644
--- a/man/man8/ip-route.8.in
+++ b/man/man8/ip-route.8.in
@@ -47,7 +47,9 @@ ip-route \- routing table management
.B dport
.IR NUMBER " ] ["
.B as
-.IR ADDRESS " ]"
+.IR ADDRESS " ] ["
+.B flowlabel
+.IR FLOWLABEL " ]
.ti -8
.BR "ip route" " { " add " | " del " | " change " | " append " | "\
@@ -1316,6 +1318,10 @@ was given, relookup the route with the source set to the preferred
address received from the first lookup.
If policy routing is used, it may be a different route.
+.TP
+.BI flowlabel " FLOWLABEL"
+ipv6 flow label as seen by the route lookup
+
.P
Note that this operation is not equivalent to
.BR "ip route show" .
--
2.47.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH iproute2-next v2 3/3] iprule: Add flow label support
2024-12-30 8:58 [PATCH iproute2-next v2 0/3] Add flow label support to ip-rule and route get Ido Schimmel
2024-12-30 8:58 ` [PATCH iproute2-next v2 1/3] Sync uAPI headers Ido Schimmel
2024-12-30 8:58 ` [PATCH iproute2-next v2 2/3] ip: route: Add IPv6 flow label support Ido Schimmel
@ 2024-12-30 8:58 ` Ido Schimmel
2025-01-01 1:30 ` [PATCH iproute2-next v2 0/3] Add flow label support to ip-rule and route get patchwork-bot+netdevbpf
3 siblings, 0 replies; 7+ messages in thread
From: Ido Schimmel @ 2024-12-30 8:58 UTC (permalink / raw)
To: netdev; +Cc: dsahern, stephen, petrm, gnault, Ido Schimmel
Add support for 'flowlabel' selector in ip-rule.
Rules can be added with or without a mask in which case exact match is
used:
# ip -6 rule add flowlabel 0x12345 table 100
# ip -6 rule add flowlabel 0x11/0xff table 200
# ip -6 rule add flowlabel 0x54321 table 300
# ip -6 rule del flowlabel 0x54321 table 300
Dump output:
$ ip -6 rule show
0: from all lookup local
32764: from all lookup 200 flowlabel 0x11/0xff
32765: from all lookup 100 flowlabel 0x12345
32766: from all lookup main
Dump can be filtered by flow label value and mask:
$ ip -6 rule show flowlabel 0x12345
32765: from all lookup 100 flowlabel 0x12345
$ ip -6 rule show flowlabel 0x11/0xff
32764: from all lookup 200 flowlabel 0x11/0xff
JSON output:
$ ip -6 -j -p rule show flowlabel 0x12345
[ {
"priority": 32765,
"src": "all",
"table": "100",
"flowlabel": "0x12345",
"flowlabel_mask": "0xfffff"
} ]
$ ip -6 -j -p rule show flowlabel 0x11/0xff
[ {
"priority": 32764,
"src": "all",
"table": "200",
"flowlabel": "0x11",
"flowlabel_mask": "0xff"
} ]
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Guillaume Nault <gnault@redhat.com>
---
ip/iprule.c | 66 ++++++++++++++++++++++++++++++++++++++++++-
man/man8/ip-rule.8.in | 8 +++++-
2 files changed, 72 insertions(+), 2 deletions(-)
diff --git a/ip/iprule.c b/ip/iprule.c
index ae067c72a66d..ea30d418712c 100644
--- a/ip/iprule.c
+++ b/ip/iprule.c
@@ -46,7 +46,7 @@ static void usage(void)
" [ ipproto PROTOCOL ]\n"
" [ sport [ NUMBER | NUMBER-NUMBER ]\n"
" [ dport [ NUMBER | NUMBER-NUMBER ] ]\n"
- " [ dscp DSCP ]\n"
+ " [ dscp DSCP ] [ flowlabel FLOWLABEL[/MASK] ]\n"
"ACTION := [ table TABLE_ID ]\n"
" [ protocol PROTO ]\n"
" [ nat ADDRESS ]\n"
@@ -69,6 +69,7 @@ static struct
unsigned int pref, prefmask;
unsigned int fwmark, fwmask;
unsigned int dscp, dscpmask;
+ __u32 flowlabel, flowlabel_mask;
uint64_t tun_id;
char iif[IFNAMSIZ];
char oif[IFNAMSIZ];
@@ -232,6 +233,19 @@ static bool filter_nlmsg(struct nlmsghdr *n, struct rtattr **tb, int host_len)
}
}
+ if (filter.flowlabel_mask) {
+ __u32 flowlabel, flowlabel_mask;
+
+ if (!tb[FRA_FLOWLABEL] || !tb[FRA_FLOWLABEL_MASK])
+ return false;
+ flowlabel = rta_getattr_be32(tb[FRA_FLOWLABEL]);
+ flowlabel_mask = rta_getattr_be32(tb[FRA_FLOWLABEL_MASK]);
+
+ if (filter.flowlabel != flowlabel ||
+ filter.flowlabel_mask != flowlabel_mask)
+ return false;
+ }
+
table = frh_get_table(frh, tb);
if (filter.tb > 0 && filter.tb ^ table)
return false;
@@ -489,6 +503,23 @@ int print_rule(struct nlmsghdr *n, void *arg)
rtnl_dscp_n2a(dscp, b1, sizeof(b1)));
}
+ /* The kernel will either provide both attributes, or none */
+ if (tb[FRA_FLOWLABEL] && tb[FRA_FLOWLABEL_MASK]) {
+ __u32 flowlabel, flowlabel_mask;
+
+ flowlabel = rta_getattr_be32(tb[FRA_FLOWLABEL]);
+ flowlabel_mask = rta_getattr_be32(tb[FRA_FLOWLABEL_MASK]);
+
+ print_0xhex(PRINT_ANY, "flowlabel", " flowlabel %#llx",
+ flowlabel);
+ if (flowlabel_mask == LABEL_MAX_MASK)
+ print_0xhex(PRINT_JSON, "flowlabel_mask", NULL,
+ flowlabel_mask);
+ else
+ print_0xhex(PRINT_ANY, "flowlabel_mask", "/%#llx",
+ flowlabel_mask);
+ }
+
print_string(PRINT_FP, NULL, "\n", "");
close_json_object();
fflush(fp);
@@ -569,6 +600,24 @@ static int flush_rule(struct nlmsghdr *n, void *arg)
return 0;
}
+static void iprule_flowlabel_parse(char *arg, __u32 *flowlabel,
+ __u32 *flowlabel_mask)
+{
+ char *slash;
+
+ slash = strchr(arg, '/');
+ if (slash != NULL)
+ *slash = '\0';
+ if (get_u32(flowlabel, arg, 0))
+ invarg("invalid flowlabel", arg);
+ if (slash) {
+ if (get_u32(flowlabel_mask, slash + 1, 0))
+ invarg("invalid flowlabel mask", slash + 1);
+ } else {
+ *flowlabel_mask = LABEL_MAX_MASK;
+ }
+}
+
static int iprule_list_flush_or_save(int argc, char **argv, int action)
{
rtnl_filter_t filter_fn;
@@ -726,6 +775,11 @@ static int iprule_list_flush_or_save(int argc, char **argv, int action)
invarg("invalid dscp\n", *argv);
filter.dscp = dscp;
filter.dscpmask = 1;
+ } else if (strcmp(*argv, "flowlabel") == 0) {
+ NEXT_ARG();
+
+ iprule_flowlabel_parse(*argv, &filter.flowlabel,
+ &filter.flowlabel_mask);
} else {
if (matches(*argv, "dst") == 0 ||
matches(*argv, "to") == 0) {
@@ -1011,6 +1065,16 @@ static int iprule_modify(int cmd, int argc, char **argv)
if (rtnl_dscp_a2n(&dscp, *argv))
invarg("invalid dscp\n", *argv);
addattr8(&req.n, sizeof(req), FRA_DSCP, dscp);
+ } else if (strcmp(*argv, "flowlabel") == 0) {
+ __u32 flowlabel, flowlabel_mask;
+
+ NEXT_ARG();
+ iprule_flowlabel_parse(*argv, &flowlabel,
+ &flowlabel_mask);
+ addattr32(&req.n, sizeof(req), FRA_FLOWLABEL,
+ htonl(flowlabel));
+ addattr32(&req.n, sizeof(req), FRA_FLOWLABEL_MASK,
+ htonl(flowlabel_mask));
} else {
int type;
diff --git a/man/man8/ip-rule.8.in b/man/man8/ip-rule.8.in
index 51f3050ae8f8..6fc741d4f470 100644
--- a/man/man8/ip-rule.8.in
+++ b/man/man8/ip-rule.8.in
@@ -58,7 +58,9 @@ ip-rule \- routing policy database management
.IR NUMBER " | "
.IR NUMBER "-" NUMBER " ] ] [ "
.B tun_id
-.IR TUN_ID " ]"
+.IR TUN_ID " ] [ "
+.B flowlabel
+.IR FLOWLABEL\fR[\fB/\fIMASK "] ]"
.BR
@@ -322,6 +324,10 @@ In the last case the router does not translate the packets, but
masquerades them to this address.
Using map-to instead of nat means the same thing.
+.TP
+.BI flowlabel " FLOWLABEL\fR[\fB/\fIMASK\fR]"
+select the IPv6 flow label to match with an optional mask.
+
.B Warning:
Changes to the RPDB made with these commands do not become active
immediately. It is assumed that after a script finishes a batch of
--
2.47.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH iproute2-next v2 2/3] ip: route: Add IPv6 flow label support
2024-12-30 8:58 ` [PATCH iproute2-next v2 2/3] ip: route: Add IPv6 flow label support Ido Schimmel
@ 2024-12-31 0:49 ` Stephen Hemminger
2024-12-31 7:13 ` Ido Schimmel
0 siblings, 1 reply; 7+ messages in thread
From: Stephen Hemminger @ 2024-12-31 0:49 UTC (permalink / raw)
To: Ido Schimmel; +Cc: netdev, dsahern, petrm, gnault
On Mon, 30 Dec 2024 10:58:09 +0200
Ido Schimmel <idosch@nvidia.com> wrote:
> @@ -2129,6 +2129,14 @@ static int iproute_get(int argc, char **argv)
> invarg("Invalid \"ipproto\" value\n",
> *argv);
> addattr8(&req.n, sizeof(req), RTA_IP_PROTO, ipproto);
> + } else if (strcmp(*argv, "flowlabel") == 0) {
> + __be32 flowlabel;
> +
> + NEXT_ARG();
> + if (get_be32(&flowlabel, *argv, 0))
> + invarg("invalid flowlabel", *argv);
> + addattr32(&req.n, sizeof(req), RTA_FLOWLABEL,
> + flowlabel);
> } else {
> inet_prefix addr;
>
What about displaying flow label with the ip route command?
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH iproute2-next v2 2/3] ip: route: Add IPv6 flow label support
2024-12-31 0:49 ` Stephen Hemminger
@ 2024-12-31 7:13 ` Ido Schimmel
0 siblings, 0 replies; 7+ messages in thread
From: Ido Schimmel @ 2024-12-31 7:13 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: netdev, dsahern, petrm, gnault
On Mon, Dec 30, 2024 at 04:49:58PM -0800, Stephen Hemminger wrote:
> On Mon, 30 Dec 2024 10:58:09 +0200
> Ido Schimmel <idosch@nvidia.com> wrote:
>
> > @@ -2129,6 +2129,14 @@ static int iproute_get(int argc, char **argv)
> > invarg("Invalid \"ipproto\" value\n",
> > *argv);
> > addattr8(&req.n, sizeof(req), RTA_IP_PROTO, ipproto);
> > + } else if (strcmp(*argv, "flowlabel") == 0) {
> > + __be32 flowlabel;
> > +
> > + NEXT_ARG();
> > + if (get_be32(&flowlabel, *argv, 0))
> > + invarg("invalid flowlabel", *argv);
> > + addattr32(&req.n, sizeof(req), RTA_FLOWLABEL,
> > + flowlabel);
> > } else {
> > inet_prefix addr;
> >
>
> What about displaying flow label with the ip route command?
The flow label is not a route attribute and it is not present in
RTM_NEWROUTE messages. It is provided as an input to the route lookup
process in RTM_GETROUTE messages.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH iproute2-next v2 0/3] Add flow label support to ip-rule and route get
2024-12-30 8:58 [PATCH iproute2-next v2 0/3] Add flow label support to ip-rule and route get Ido Schimmel
` (2 preceding siblings ...)
2024-12-30 8:58 ` [PATCH iproute2-next v2 3/3] iprule: Add " Ido Schimmel
@ 2025-01-01 1:30 ` patchwork-bot+netdevbpf
3 siblings, 0 replies; 7+ messages in thread
From: patchwork-bot+netdevbpf @ 2025-01-01 1:30 UTC (permalink / raw)
To: Ido Schimmel; +Cc: netdev, dsahern, stephen, petrm, gnault
Hello:
This series was applied to iproute2/iproute2-next.git (main)
by David Ahern <dsahern@kernel.org>:
On Mon, 30 Dec 2024 10:58:07 +0200 you wrote:
> Add IPv6 flow label support to ip-rule and route get requests following
> kernel support that was added in kernel commit 6b3099ebca13 ("Merge
> branch 'net-fib_rules-add-flow-label-selector-support'").
>
> v2:
> * Remove new line from invarg() invocations.
>
> [...]
Here is the summary with links:
- [iproute2-next,v2,1/3] Sync uAPI headers
(no matching commit)
- [iproute2-next,v2,2/3] ip: route: Add IPv6 flow label support
https://git.kernel.org/pub/scm/network/iproute2/iproute2-next.git/commit/?id=35ae138e2c94
- [iproute2-next,v2,3/3] iprule: Add flow label support
https://git.kernel.org/pub/scm/network/iproute2/iproute2-next.git/commit/?id=0bd19d4645ce
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-01-01 1:30 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-30 8:58 [PATCH iproute2-next v2 0/3] Add flow label support to ip-rule and route get Ido Schimmel
2024-12-30 8:58 ` [PATCH iproute2-next v2 1/3] Sync uAPI headers Ido Schimmel
2024-12-30 8:58 ` [PATCH iproute2-next v2 2/3] ip: route: Add IPv6 flow label support Ido Schimmel
2024-12-31 0:49 ` Stephen Hemminger
2024-12-31 7:13 ` Ido Schimmel
2024-12-30 8:58 ` [PATCH iproute2-next v2 3/3] iprule: Add " Ido Schimmel
2025-01-01 1:30 ` [PATCH iproute2-next v2 0/3] Add flow label support to ip-rule and route get patchwork-bot+netdevbpf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).