Skip to content

Commit

Permalink
iproute2: support listing devices by group
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
ddvlad authored and Stephen Hemminger committed Apr 12, 2011
1 parent 77d1e6a commit ac694c3
Show file tree
Hide file tree
Showing 6 changed files with 77 additions and 3 deletions.
2 changes: 2 additions & 0 deletions etc/iproute2/group
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# device group names
0 default
1 change: 1 addition & 0 deletions include/rt_names.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
14 changes: 14 additions & 0 deletions ip/ipaddress.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ static struct
char *flushb;
int flushp;
int flushe;
int group;
} filter;

static int do_link;
Expand Down Expand Up @@ -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 ");

Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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();
Expand Down
2 changes: 1 addition & 1 deletion ip/iplink.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down
50 changes: 50 additions & 0 deletions lib/rt_names.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
11 changes: 9 additions & 2 deletions man/man8/ip.8
Original file line number Diff line number Diff line change
Expand Up @@ -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 " } "
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit ac694c3

Please sign in to comment.