aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVlad Dogaru <ddvlad@rosedu.org>2011-01-13 18:38:30 -0500
committerDavid S. Miller <davem@davemloft.net>2011-01-20 02:31:09 -0500
commitcbda10fa97d72c7a1923be4426171aa90e8c6dab (patch)
tree113206ef603189e9f91f075e154cbdc8e1ac3f40
parent441c793a56502638d45d5da2195056d686147370 (diff)
net_device: add support for network device groups
Net devices can now be grouped, enabling simpler manipulation from userspace. This patch adds a group field to the net_device structure, as well as rtnetlink support to query and modify it. 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>
-rw-r--r--include/linux/if_link.h1
-rw-r--r--include/linux/netdevice.h7
-rw-r--r--net/core/dev.c12
-rw-r--r--net/core/rtnetlink.c6
4 files changed, 26 insertions, 0 deletions
diff --git a/include/linux/if_link.h b/include/linux/if_link.h
index 6485d2a89bec..f4a2e6b1b864 100644
--- a/include/linux/if_link.h
+++ b/include/linux/if_link.h
@@ -135,6 +135,7 @@ enum {
135 IFLA_VF_PORTS, 135 IFLA_VF_PORTS,
136 IFLA_PORT_SELF, 136 IFLA_PORT_SELF,
137 IFLA_AF_SPEC, 137 IFLA_AF_SPEC,
138 IFLA_GROUP, /* Group the device belongs to */
138 __IFLA_MAX 139 __IFLA_MAX
139}; 140};
140 141
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index d971346b0340..68a4627b74f5 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -75,6 +75,9 @@ struct wireless_dev;
75#define NET_RX_SUCCESS 0 /* keep 'em coming, baby */ 75#define NET_RX_SUCCESS 0 /* keep 'em coming, baby */
76#define NET_RX_DROP 1 /* packet dropped */ 76#define NET_RX_DROP 1 /* packet dropped */
77 77
78/* Initial net device group. All devices belong to group 0 by default. */
79#define INIT_NETDEV_GROUP 0
80
78/* 81/*
79 * Transmit return codes: transmit return codes originate from three different 82 * Transmit return codes: transmit return codes originate from three different
80 * namespaces: 83 * namespaces:
@@ -1153,6 +1156,9 @@ struct net_device {
1153 1156
1154 /* phy device may attach itself for hardware timestamping */ 1157 /* phy device may attach itself for hardware timestamping */
1155 struct phy_device *phydev; 1158 struct phy_device *phydev;
1159
1160 /* group the device belongs to */
1161 int group;
1156}; 1162};
1157#define to_net_dev(d) container_of(d, struct net_device, dev) 1163#define to_net_dev(d) container_of(d, struct net_device, dev)
1158 1164
@@ -1844,6 +1850,7 @@ extern int dev_set_alias(struct net_device *, const char *, size_t);
1844extern int dev_change_net_namespace(struct net_device *, 1850extern int dev_change_net_namespace(struct net_device *,
1845 struct net *, const char *); 1851 struct net *, const char *);
1846extern int dev_set_mtu(struct net_device *, int); 1852extern int dev_set_mtu(struct net_device *, int);
1853extern void dev_set_group(struct net_device *, int);
1847extern int dev_set_mac_address(struct net_device *, 1854extern int dev_set_mac_address(struct net_device *,
1848 struct sockaddr *); 1855 struct sockaddr *);
1849extern int dev_hard_start_xmit(struct sk_buff *skb, 1856extern int dev_hard_start_xmit(struct sk_buff *skb,
diff --git a/net/core/dev.c b/net/core/dev.c
index 7741507429f4..2b85d4ae981f 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -4572,6 +4572,17 @@ int dev_set_mtu(struct net_device *dev, int new_mtu)
4572EXPORT_SYMBOL(dev_set_mtu); 4572EXPORT_SYMBOL(dev_set_mtu);
4573 4573
4574/** 4574/**
4575 * dev_set_group - Change group this device belongs to
4576 * @dev: device
4577 * @new_group: group this device should belong to
4578 */
4579void dev_set_group(struct net_device *dev, int new_group)
4580{
4581 dev->group = new_group;
4582}
4583EXPORT_SYMBOL(dev_set_group);
4584
4585/**
4575 * dev_set_mac_address - Change Media Access Control Address 4586 * dev_set_mac_address - Change Media Access Control Address
4576 * @dev: device 4587 * @dev: device
4577 * @sa: new address 4588 * @sa: new address
@@ -5678,6 +5689,7 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
5678 dev->priv_flags = IFF_XMIT_DST_RELEASE; 5689 dev->priv_flags = IFF_XMIT_DST_RELEASE;
5679 setup(dev); 5690 setup(dev);
5680 strcpy(dev->name, name); 5691 strcpy(dev->name, name);
5692 dev->group = INIT_NETDEV_GROUP;
5681 return dev; 5693 return dev;
5682 5694
5683free_pcpu: 5695free_pcpu:
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index a5f7535aab5b..09062b07bf7f 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -868,6 +868,7 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
868 netif_running(dev) ? dev->operstate : IF_OPER_DOWN); 868 netif_running(dev) ? dev->operstate : IF_OPER_DOWN);
869 NLA_PUT_U8(skb, IFLA_LINKMODE, dev->link_mode); 869 NLA_PUT_U8(skb, IFLA_LINKMODE, dev->link_mode);
870 NLA_PUT_U32(skb, IFLA_MTU, dev->mtu); 870 NLA_PUT_U32(skb, IFLA_MTU, dev->mtu);
871 NLA_PUT_U32(skb, IFLA_GROUP, dev->group);
871 872
872 if (dev->ifindex != dev->iflink) 873 if (dev->ifindex != dev->iflink)
873 NLA_PUT_U32(skb, IFLA_LINK, dev->iflink); 874 NLA_PUT_U32(skb, IFLA_LINK, dev->iflink);
@@ -1265,6 +1266,11 @@ static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm,
1265 modified = 1; 1266 modified = 1;
1266 } 1267 }
1267 1268
1269 if (tb[IFLA_GROUP]) {
1270 dev_set_group(dev, nla_get_u32(tb[IFLA_GROUP]));
1271 modified = 1;
1272 }
1273
1268 /* 1274 /*
1269 * Interface selected by interface index but interface 1275 * Interface selected by interface index but interface
1270 * name provided implies that a name change has been 1276 * name provided implies that a name change has been