[PATCH] ip: Support filter links/neighs with no master
From: Lahav Schlesinger <hidden>
Date: 2021-08-19 10:45:44
Commit d3432bf10f17 ("net: Support filtering interfaces on no master")
in the kernel added support for filtering interfaces/neighbours that
have no master interface.
This patch completes it and adds this support to iproute2:
1. ip link show nomaster
2. ip address show nomaster
3. ip neighbour {show | flush} nomaster
Signed-off-by: Lahav Schlesinger <redacted>
---
ip/ipaddress.c | 4 +++-
ip/iplink.c | 2 +-
ip/ipneigh.c | 4 +++-
man/man8/ip-address.8.in | 7 ++++++-
man/man8/ip-link.8.in | 7 ++++++-
man/man8/ip-neighbour.8 | 7 ++++++-
6 files changed, 25 insertions(+), 6 deletions(-)
diff --git a/ip/ipaddress.c b/ip/ipaddress.c
index 85534aaf..a5b683f5 100644
--- a/ip/ipaddress.c
+++ b/ip/ipaddress.c@@ -61,7 +61,7 @@ static void usage(void) " [ to PREFIX ] [ FLAG-LIST ] [ label LABEL ] [up]\n" " ip address [ show [ dev IFNAME ] [ scope SCOPE-ID ] [ master DEVICE ]\n" " [ type TYPE ] [ to PREFIX ] [ FLAG-LIST ]\n" - " [ label LABEL ] [up] [ vrf NAME ] ]\n" + " [ label LABEL ] [up] [ vrf NAME ] [ nomaster ] ]\n" " ip address {showdump|restore}\n" "IFADDR := PREFIX | ADDR peer PREFIX\n" " [ broadcast ADDR ] [ anycast ADDR ]\n"
@@ -2123,6 +2123,8 @@ static int ipaddr_list_flush_or_save(int argc, char **argv, int action) if (!name_is_vrf(*argv)) invarg("Not a valid VRF name\n", *argv); filter.master = ifindex; + } else if (strcmp(*argv, "nomaster") == 0) { + filter.master = -1; } else if (strcmp(*argv, "type") == 0) { int soff;
diff --git a/ip/iplink.c b/ip/iplink.c
index 18b2ea25..f017f1f3 100644
--- a/ip/iplink.c
+++ b/ip/iplink.c@@ -119,7 +119,7 @@ void iplink_usage(void) " [ protodown_reason PREASON { on | off } ]\n" " [ gso_max_size BYTES ] | [ gso_max_segs PACKETS ]\n" "\n" - " ip link show [ DEVICE | group GROUP ] [up] [master DEV] [vrf NAME] [type TYPE]\n" + " ip link show [ DEVICE | group GROUP ] [up] [master DEV] [vrf NAME] [type TYPE] [nomaster]\n" "\n" " ip link xstats type TYPE [ ARGS ]\n" "\n"
diff --git a/ip/ipneigh.c b/ip/ipneigh.c
index 95bde520..b4a2f6df 100644
--- a/ip/ipneigh.c
+++ b/ip/ipneigh.c@@ -54,7 +54,7 @@ static void usage(void) " [ dev DEV ] [ router ] [ extern_learn ] [ protocol PROTO ]\n" "\n" " ip neigh { show | flush } [ proxy ] [ to PREFIX ] [ dev DEV ] [ nud STATE ]\n" - " [ vrf NAME ]\n" + " [ vrf NAME ] [ nomaster ]\n" " ip neigh get { ADDR | proxy ADDR } dev DEV\n" "\n" "STATE := { delay | failed | incomplete | noarp | none |\n"
@@ -536,6 +536,8 @@ static int do_show_or_flush(int argc, char **argv, int flush) if (!name_is_vrf(*argv)) invarg("Not a valid VRF name\n", *argv); filter.master = ifindex; + } else if (strcmp(*argv, "nomaster") == 0) { + filter.master = -1; } else if (strcmp(*argv, "unused") == 0) { filter.unused_only = 1; } else if (strcmp(*argv, "nud") == 0) {
diff --git a/man/man8/ip-address.8.in b/man/man8/ip-address.8.in
index fe773c91..65f67e06 100644
--- a/man/man8/ip-address.8.in
+++ b/man/man8/ip-address.8.in@@ -49,7 +49,8 @@ ip-address \- protocol address management .IR TYPE " ] [ " .B vrf .IR NAME " ] [ " -.BR up " ] ]" +.BR up " ] [" +.BR nomaster " ] ]" .ti -8 .BR "ip address" " { " showdump " | " restore " }"
@@ -340,6 +341,10 @@ output. .B up only list running interfaces. +.TP +.B nomaster +only list interfaces with no master. + .TP .BR dynamic " and " permanent (IPv6 only) only list addresses installed due to stateless
diff --git a/man/man8/ip-link.8.in b/man/man8/ip-link.8.in
index 572bed87..e749f23d 100644
--- a/man/man8/ip-link.8.in
+++ b/man/man8/ip-link.8.in@@ -179,7 +179,8 @@ ip-link \- network device configuration .B type .IR ETYPE " ] [" .B vrf -.IR NAME " ]" +.IR NAME " ] [" +.BR nomaster " ]" .ti -8 .B ip link xstats
@@ -2528,6 +2529,10 @@ interface list by comparing it with the relevant attribute in case the kernel didn't filter already. Therefore any string is accepted, but may lead to empty output. +.TP +.B nomaster +only show devices with no master + .SS ip link xstats - display extended statistics .TP
diff --git a/man/man8/ip-neighbour.8 b/man/man8/ip-neighbour.8
index a27f9ef8..02862964 100644
--- a/man/man8/ip-neighbour.8
+++ b/man/man8/ip-neighbour.8@@ -35,7 +35,8 @@ ip-neighbour \- neighbour/arp tables management. .B nud .IR STATE " ] [ " .B vrf -.IR NAME " ] " +.IR NAME " ] [" +.BR nomaster " ]" .ti -8 .B ip neigh get
@@ -191,6 +192,10 @@ only list the neighbours attached to this device. .BI vrf " NAME" only list the neighbours for given VRF. +.TP +.BI nomaster +only list neighbours attached to an interface with no master. + .TP .BI proxy list neighbour proxies.
--
2.25.1