ip link: Show devices by type

Added new option 'type' to 'ip link show'
command which allows to filter devices by type:

    ip link show type bridge
    ip link show type vlan

Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
This commit is contained in:
Vadim Kochan 2014-12-10 10:11:29 +02:00 committed by Stephen Hemminger
parent b5f39b2588
commit 712249d8fa
3 changed files with 46 additions and 2 deletions

View File

@ -57,6 +57,7 @@ static struct
int flushe; int flushe;
int group; int group;
int master; int master;
char *kind;
} filter; } filter;
static int do_link; static int do_link;
@ -189,6 +190,18 @@ static void print_linkmode(FILE *f, struct rtattr *tb)
fprintf(f, "mode %s ", link_modes[mode]); fprintf(f, "mode %s ", link_modes[mode]);
} }
static char *parse_link_kind(struct rtattr *tb)
{
struct rtattr *linkinfo[IFLA_INFO_MAX+1];
parse_rtattr_nested(linkinfo, IFLA_INFO_MAX, tb);
if (linkinfo[IFLA_INFO_KIND])
return RTA_DATA(linkinfo[IFLA_INFO_KIND]);
return "";
}
static void print_linktype(FILE *fp, struct rtattr *tb) static void print_linktype(FILE *fp, struct rtattr *tb)
{ {
struct rtattr *linkinfo[IFLA_INFO_MAX+1]; struct rtattr *linkinfo[IFLA_INFO_MAX+1];
@ -551,6 +564,17 @@ int print_linkinfo(const struct sockaddr_nl *who,
else if (filter.master > 0) else if (filter.master > 0)
return -1; return -1;
if (filter.kind) {
if (tb[IFLA_LINKINFO]) {
char *kind = parse_link_kind(tb[IFLA_LINKINFO]);
if (strcmp(kind, filter.kind))
return -1;
} else {
return -1;
}
}
if (n->nlmsg_type == RTM_DELLINK) if (n->nlmsg_type == RTM_DELLINK)
fprintf(fp, "Deleted "); fprintf(fp, "Deleted ");
@ -1302,6 +1326,9 @@ static int ipaddr_list_flush_or_save(int argc, char **argv, int action)
if (!ifindex) if (!ifindex)
invarg("Device does not exist\n", *argv); invarg("Device does not exist\n", *argv);
filter.master = ifindex; filter.master = ifindex;
} else if (do_link && strcmp(*argv, "type") == 0) {
NEXT_ARG();
filter.kind = *argv;
} else { } else {
if (strcmp(*argv, "dev") == 0) { if (strcmp(*argv, "dev") == 0) {
NEXT_ARG(); NEXT_ARG();

View File

@ -82,7 +82,7 @@ void iplink_usage(void)
fprintf(stderr, " [ master DEVICE ]\n"); fprintf(stderr, " [ master DEVICE ]\n");
fprintf(stderr, " [ nomaster ]\n"); fprintf(stderr, " [ nomaster ]\n");
fprintf(stderr, " [ addrgenmode { eui64 | none } ]\n"); fprintf(stderr, " [ addrgenmode { eui64 | none } ]\n");
fprintf(stderr, " ip link show [ DEVICE | group GROUP ] [up] [master DEV]\n"); fprintf(stderr, " ip link show [ DEVICE | group GROUP ] [up] [master DEV] [type TYPE]\n");
if (iplink_have_newlink()) { if (iplink_have_newlink()) {
fprintf(stderr, " ip link help [ TYPE ]\n"); fprintf(stderr, " ip link help [ TYPE ]\n");

View File

@ -148,7 +148,9 @@ ip-link \- network device configuration
.IR GROUP " | " .IR GROUP " | "
.BR up " | " .BR up " | "
.B master .B master
.IR DEVICE " ]" .IR DEVICE " | "
.B type
.IR TYPE " ]"
.ti -8 .ti -8
.B ip link help .B ip link help
@ -688,6 +690,11 @@ only display running interfaces.
.I DEVICE .I DEVICE
specifies the master device which enslaves devices to show. specifies the master device which enslaves devices to show.
.TP
.BI type " TYPE "
.I TYPE
specifies the type of devices to show.
.TP .TP
The show command has additional formatting options: The show command has additional formatting options:
@ -722,6 +729,16 @@ ip link show
Shows the state of all network interfaces on the system. Shows the state of all network interfaces on the system.
.RE .RE
.PP .PP
ip link show type bridge
.RS 4
Shows the bridge devices.
.RE
.PP
ip link show type vlan
.RS 4
Shows the vlan devices.
.RE
.PP
ip link set dev ppp0 mtu 1400 ip link set dev ppp0 mtu 1400
.RS 4 .RS 4
Change the MTU the ppp0 device. Change the MTU the ppp0 device.