iproute2: support listing devices by group
User can specify device group to list by using the group keyword: ip link show group test If no group is specified, 0 (default) is implied. Signed-off-by: Vlad Dogaru <ddvlad@rosedu.org>
This commit is contained in:
committed by
Stephen Hemminger
parent
77d1e6ab84
commit
ac694c333f
2
etc/iproute2/group
Normal file
2
etc/iproute2/group
Normal file
@@ -0,0 +1,2 @@
|
||||
# device group names
|
||||
0 default
|
||||
@@ -13,6 +13,7 @@ int rtnl_rtscope_a2n(__u32 *id, char *arg);
|
||||
int rtnl_rttable_a2n(__u32 *id, char *arg);
|
||||
int rtnl_rtrealm_a2n(__u32 *id, char *arg);
|
||||
int rtnl_dsfield_a2n(__u32 *id, char *arg);
|
||||
int rtnl_group_a2n(int *id, char *arg);
|
||||
|
||||
const char *inet_proto_n2a(int proto, char *buf, int len);
|
||||
int inet_proto_a2n(char *buf);
|
||||
|
||||
@@ -49,6 +49,7 @@ static struct
|
||||
char *flushb;
|
||||
int flushp;
|
||||
int flushe;
|
||||
int group;
|
||||
} filter;
|
||||
|
||||
static int do_link;
|
||||
@@ -246,6 +247,12 @@ int print_linkinfo(const struct sockaddr_nl *who,
|
||||
fnmatch(filter.label, RTA_DATA(tb[IFLA_IFNAME]), 0))
|
||||
return 0;
|
||||
|
||||
if (tb[IFLA_GROUP]) {
|
||||
int group = *(int*)RTA_DATA(tb[IFLA_GROUP]);
|
||||
if (group != filter.group)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (n->nlmsg_type == RTM_DELLINK)
|
||||
fprintf(fp, "Deleted ");
|
||||
|
||||
@@ -718,9 +725,12 @@ static int ipaddr_list_or_flush(int argc, char **argv, int flush)
|
||||
if (filter.family == AF_UNSPEC)
|
||||
filter.family = preferred_family;
|
||||
|
||||
filter.group = INIT_NETDEV_GROUP;
|
||||
|
||||
if (flush) {
|
||||
if (argc <= 0) {
|
||||
fprintf(stderr, "Flush requires arguments.\n");
|
||||
|
||||
return -1;
|
||||
}
|
||||
if (filter.family == AF_PACKET) {
|
||||
@@ -779,6 +789,10 @@ static int ipaddr_list_or_flush(int argc, char **argv, int flush)
|
||||
} else if (strcmp(*argv, "label") == 0) {
|
||||
NEXT_ARG();
|
||||
filter.label = *argv;
|
||||
} else if (strcmp(*argv, "group") == 0) {
|
||||
NEXT_ARG();
|
||||
if (rtnl_group_a2n(&filter.group, *argv))
|
||||
invarg("Invalid \"group\" value\n", *argv);
|
||||
} else {
|
||||
if (strcmp(*argv, "dev") == 0) {
|
||||
NEXT_ARG();
|
||||
|
||||
@@ -71,7 +71,7 @@ void iplink_usage(void)
|
||||
fprintf(stderr, " [ vf NUM [ mac LLADDR ]\n");
|
||||
fprintf(stderr, " [ vlan VLANID [ qos VLAN-QOS ] ]\n");
|
||||
fprintf(stderr, " [ rate TXRATE ] ] \n");
|
||||
fprintf(stderr, " ip link show [ DEVICE ]\n");
|
||||
fprintf(stderr, " ip link show [ DEVICE | group GROUP ]\n");
|
||||
|
||||
if (iplink_have_newlink()) {
|
||||
fprintf(stderr, "\n");
|
||||
|
||||
@@ -447,3 +447,53 @@ int rtnl_dsfield_a2n(__u32 *id, char *arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static struct rtnl_hash_entry dflt_group_entry = { .id = 0, .name = "default" };
|
||||
|
||||
static struct rtnl_hash_entry * rtnl_group_hash[256] = {
|
||||
[0] = &dflt_group_entry,
|
||||
};
|
||||
|
||||
static int rtnl_group_init;
|
||||
|
||||
static void rtnl_group_initialize(void)
|
||||
{
|
||||
rtnl_group_init = 1;
|
||||
rtnl_hash_initialize("/etc/iproute2/group",
|
||||
rtnl_group_hash, 256);
|
||||
}
|
||||
|
||||
int rtnl_group_a2n(int *id, char *arg)
|
||||
{
|
||||
static char *cache = NULL;
|
||||
static unsigned long res;
|
||||
struct rtnl_hash_entry *entry;
|
||||
char *end;
|
||||
int i;
|
||||
|
||||
if (cache && strcmp(cache, arg) == 0) {
|
||||
*id = res;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!rtnl_group_init)
|
||||
rtnl_group_initialize();
|
||||
|
||||
for (i=0; i<256; i++) {
|
||||
entry = rtnl_group_hash[i];
|
||||
while (entry && strcmp(entry->name, arg))
|
||||
entry = entry->next;
|
||||
if (entry) {
|
||||
cache = entry->name;
|
||||
res = entry->id;
|
||||
*id = res;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
i = strtol(arg, &end, 0);
|
||||
if (!end || end == arg || *end || i < 0)
|
||||
return -1;
|
||||
*id = i;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -99,7 +99,9 @@ ip \- show / manipulate routing, devices, policy routing and tunnels
|
||||
|
||||
.ti -8
|
||||
.B ip link show
|
||||
.RI "[ " DEVICE " ]"
|
||||
.RI "[ " DEVICE " | "
|
||||
.B group
|
||||
.IR GROUP " ]"
|
||||
|
||||
.ti -8
|
||||
.BR "ip addr" " { " add " | " del " } "
|
||||
@@ -1056,7 +1058,12 @@ call.
|
||||
.BI dev " NAME " (default)
|
||||
.I NAME
|
||||
specifies the network device to show.
|
||||
If this argument is omitted all devices are listed.
|
||||
If this argument is omitted all devices in the default group are listed.
|
||||
|
||||
.TP
|
||||
.BI group " GROUP "
|
||||
.I GROUP
|
||||
specifies what group of devices to show.
|
||||
|
||||
.TP
|
||||
.B up
|
||||
|
||||
Reference in New Issue
Block a user