diff options
author | Vlad Dogaru <ddvlad@rosedu.org> | 2011-01-13 18:38:30 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-01-20 02:31:09 -0500 |
commit | cbda10fa97d72c7a1923be4426171aa90e8c6dab (patch) | |
tree | 113206ef603189e9f91f075e154cbdc8e1ac3f40 | |
parent | 441c793a56502638d45d5da2195056d686147370 (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.h | 1 | ||||
-rw-r--r-- | include/linux/netdevice.h | 7 | ||||
-rw-r--r-- | net/core/dev.c | 12 | ||||
-rw-r--r-- | net/core/rtnetlink.c | 6 |
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); | |||
1844 | extern int dev_change_net_namespace(struct net_device *, | 1850 | extern int dev_change_net_namespace(struct net_device *, |
1845 | struct net *, const char *); | 1851 | struct net *, const char *); |
1846 | extern int dev_set_mtu(struct net_device *, int); | 1852 | extern int dev_set_mtu(struct net_device *, int); |
1853 | extern void dev_set_group(struct net_device *, int); | ||
1847 | extern int dev_set_mac_address(struct net_device *, | 1854 | extern int dev_set_mac_address(struct net_device *, |
1848 | struct sockaddr *); | 1855 | struct sockaddr *); |
1849 | extern int dev_hard_start_xmit(struct sk_buff *skb, | 1856 | extern 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) | |||
4572 | EXPORT_SYMBOL(dev_set_mtu); | 4572 | EXPORT_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 | */ | ||
4579 | void dev_set_group(struct net_device *dev, int new_group) | ||
4580 | { | ||
4581 | dev->group = new_group; | ||
4582 | } | ||
4583 | EXPORT_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 | ||
5683 | free_pcpu: | 5695 | free_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 |