[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20240408123458.50943-1-renmingshuai@huawei.com>
Date: Mon, 8 Apr 2024 20:34:58 +0800
From: renmingshuai <renmingshuai@...wei.com>
To: <renmingshuai@...wei.com>
CC: <dsahern@...il.com>, <liaichun@...wei.com>, <netdev@...r.kernel.org>,
<stephen@...workplumber.org>, <yanan@...wei.com>
Subject: Re: [PATCH] iplink: add an option to set IFLA_EXT_MASK attribute
>> Kernel has add IFLA_EXT_MASK attribute for indicating that certain
>> extended ifinfo values are requested by the user application. The ip
>> link show cmd always request VFs extended ifinfo.
>>
>> RTM_GETLINK for greater than about 220 VFs truncates IFLA_VFINFO_LIST
>> due to the maximum reach of nlattr's nla_len being exceeded.
>> As a result, ip link show command only show the truncated VFs info
>> sucn as:
>>
>> #ip link show dev eth0
>> 1: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 ...
>> link/ether ...
>> vf 0 link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
>> ...
>> Truncated VF list: eth0
>>
>> Add an option to set IFLA_EXT_MASK attribute and users can choose to
>> show the extended ifinfo or not.
>>
>> Signed-off-by: Mingshuai Ren <renmingshuai@...wei.com>
>
> Adding a new option with on/off seems like more than is necessary.
> If we need an option it should just be one word. Any new filter should
> have same conventions as existing filters. Maybe 'novf'
>
> And it looks like not sending IFLA_EXT_MASK will break the changes
> made for the link filter already done for VF's.
Thanks for your reply. As you suggested, I've added an option
named noVF, which has same conventions as existing filter.
Also, this new patch does not send RTEXT_FILTER_VF instead of
IFLA_EXT_MASK, and it does not break the changes made for the link
filter already done for VF's.
Please review it again.
---
ip/ip_common.h | 1 +
ip/ipaddress.c | 15 ++++++++++-----
ip/iplink.c | 2 +-
man/man8/ip-link.8.in | 7 ++++++-
4 files changed, 18 insertions(+), 7 deletions(-)
diff --git a/ip/ip_common.h b/ip/ip_common.h
index b65c2b41..d3645a2c 100644
--- a/ip/ip_common.h
+++ b/ip/ip_common.h
@@ -30,6 +30,7 @@ struct link_filter {
int target_nsid;
bool have_proto;
int proto;
+ int vfinfo;
};
const char *get_ip_lib_dir(void);
diff --git a/ip/ipaddress.c b/ip/ipaddress.c
index e536912f..a8899dc4 100644
--- a/ip/ipaddress.c
+++ b/ip/ipaddress.c
@@ -2029,10 +2029,11 @@ static int ipaddr_flush(void)
static int iplink_filter_req(struct nlmsghdr *nlh, int reqlen)
{
- __u32 filt_mask;
+ __u32 filt_mask = 0;
int err;
- filt_mask = RTEXT_FILTER_VF;
+ if (!filter.vfinfo)
+ filt_mask |= RTEXT_FILTER_VF;
if (!show_stats)
filt_mask |= RTEXT_FILTER_SKIP_STATS;
err = addattr32(nlh, reqlen, IFLA_EXT_MASK, filt_mask);
@@ -2070,12 +2071,13 @@ static int ipaddr_link_get(int index, struct nlmsg_chain *linfo)
.i.ifi_family = filter.family,
.i.ifi_index = index,
};
- __u32 filt_mask = RTEXT_FILTER_VF;
+ __u32 filt_mask = 0;
struct nlmsghdr *answer;
+ if (!filter.vfinfo)
+ filt_mask |= RTEXT_FILTER_VF;
if (!show_stats)
filt_mask |= RTEXT_FILTER_SKIP_STATS;
-
addattr32(&req.n, sizeof(req), IFLA_EXT_MASK, filt_mask);
if (rtnl_talk(&rth, &req.n, &answer) < 0) {
@@ -2139,6 +2141,7 @@ static int ipaddr_list_flush_or_save(int argc, char **argv, int action)
ipaddr_reset_filter(oneline, 0);
filter.showqueue = 1;
filter.family = preferred_family;
+ filter.vfinfo = 0;
if (action == IPADD_FLUSH) {
if (argc <= 0) {
@@ -2221,6 +2224,8 @@ static int ipaddr_list_flush_or_save(int argc, char **argv, int action)
invarg("\"proto\" value is invalid\n", *argv);
filter.have_proto = true;
filter.proto = proto;
+ } else if (strcmp(*argv, "noVF") == 0) {
+ filter.vfinfo = -1;
} else {
if (strcmp(*argv, "dev") == 0)
NEXT_ARG();
@@ -2274,7 +2279,7 @@ static int ipaddr_list_flush_or_save(int argc, char **argv, int action)
* the link device
*/
if (filter_dev && filter.group == -1 && do_link == 1) {
- if (iplink_get(filter_dev, RTEXT_FILTER_VF) < 0) {
+ if (iplink_get(filter_dev, filter.vfinfo < 0 ? 0 : RTEXT_FILTER_VF) < 0) {
perror("Cannot send link get request");
delete_json_obj();
exit(1);
diff --git a/ip/iplink.c b/ip/iplink.c
index 95314af5..ad4b068b 100644
--- a/ip/iplink.c
+++ b/ip/iplink.c
@@ -111,7 +111,7 @@ void iplink_usage(void)
" [ gro_max_size BYTES ] [ gro_ipv4_max_size BYTES ]\n"
"\n"
" ip link show [ DEVICE | group GROUP ] [up] [master DEV] [vrf NAME] [type TYPE]\n"
- " [nomaster]\n"
+ " [nomaster] [ noVF ]\n"
"\n"
" ip link xstats type TYPE [ ARGS ]\n"
"\n"
diff --git a/man/man8/ip-link.8.in b/man/man8/ip-link.8.in
index 31e2d7f0..dd497d5f 100644
--- a/man/man8/ip-link.8.in
+++ b/man/man8/ip-link.8.in
@@ -202,7 +202,8 @@ ip-link \- network device configuration
.IR ETYPE " ] ["
.B vrf
.IR NAME " ] ["
-.BR nomaster " ]"
+.BR nomaster " ] ["
+.BR noVF " ]"
.ti -8
.B ip link xstats
@@ -2898,6 +2899,10 @@ output.
.B nomaster
only show devices with no master
+.TP
+.B noVF
+only show devices with no VF info
+
.SS ip link xstats - display extended statistics
.TP
--
2.33.0
Powered by blists - more mailing lists