netlink: support setting devgroup parameters
authorVlad Dogaru <ddvlad@rosedu.org>
Thu, 13 Jan 2011 23:38:31 +0000 (23:38 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 20 Jan 2011 07:31:10 +0000 (23:31 -0800)
If a rtnetlink request specifies a negative or zero ifindex and has no
interface name attribute, but has a group attribute, then the chenges
are made to all the interfaces belonging to the specified group.

Signed-off-by: Vlad Dogaru <ddvlad@rosedu.org>
Acked-by: Jamal Hadi Salim <hadi@cyberus.ca>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/rtnetlink.c

index 09062b07bf7f6df64573598449e9edf5cbbed6a1..a0b2eeb3b610a0fb1327db4c7736422159319e20 100644 (file)
@@ -1558,6 +1558,24 @@ err:
 }
 EXPORT_SYMBOL(rtnl_create_link);
 
+static int rtnl_group_changelink(struct net *net, int group,
+               struct ifinfomsg *ifm,
+               struct nlattr **tb)
+{
+       struct net_device *dev;
+       int err;
+
+       for_each_netdev(net, dev) {
+               if (dev->group == group) {
+                       err = do_setlink(dev, ifm, tb, NULL, 0);
+                       if (err < 0)
+                               return err;
+               }
+       }
+
+       return 0;
+}
+
 static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
 {
        struct net *net = sock_net(skb->sk);
@@ -1585,10 +1603,16 @@ replay:
        ifm = nlmsg_data(nlh);
        if (ifm->ifi_index > 0)
                dev = __dev_get_by_index(net, ifm->ifi_index);
-       else if (ifname[0])
-               dev = __dev_get_by_name(net, ifname);
-       else
-               dev = NULL;
+       else {
+               if (ifname[0])
+                       dev = __dev_get_by_name(net, ifname);
+               else if (tb[IFLA_GROUP])
+                       return rtnl_group_changelink(net,
+                                       nla_get_u32(tb[IFLA_GROUP]),
+                                       ifm, tb);
+               else
+                       dev = NULL;
+       }
 
        err = validate_linkmsg(dev, tb);
        if (err < 0)