]> rtime.felk.cvut.cz Git - lisovros/iproute2_canprio.git/commitdiff
iproute2: support listing devices by group
authorVlad Dogaru <ddvlad@rosedu.org>
Wed, 2 Feb 2011 18:23:40 +0000 (20:23 +0200)
committerStephen Hemminger <stephen.hemminger@vyatta.com>
Fri, 25 Feb 2011 20:38:50 +0000 (12:38 -0800)
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>
etc/iproute2/group [new file with mode: 0644]
include/rt_names.h
ip/ipaddress.c
ip/iplink.c
lib/rt_names.c
man/man8/ip.8

diff --git a/etc/iproute2/group b/etc/iproute2/group
new file mode 100644 (file)
index 0000000..6f000b2
--- /dev/null
@@ -0,0 +1,2 @@
+# device group names
+0      default
index 07a10e0bcfe2f1b6aeddfc1c24306f5d1987d4ec..e5dbd45bbbdd9c792431713f984e8145ab15f8a2 100644 (file)
@@ -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);
index a775ecd38c4443517fe95d555b929d788e91cb1a..e4748e3ddcc05d395da6eac3c139739d9e36168f 100644 (file)
@@ -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();
index cb2c4f5e3367f460bc33adfbb664e0046a2e9e78..97a960ba51a6015ddcde6fadc94659270317bf94 100644 (file)
@@ -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");
index 52edfe3306876647151f7014e4300cb0bc8ca25a..30d43cd000fc0aeff2cf906d56849a343e03800b 100644 (file)
@@ -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;
+}
index 8d55fa9deb9a858f2fd29842d69caa6ee98665ca..730788ab8e995d9191d382dff369455d8def9927 100644 (file)
@@ -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