Commit cbda10fa authored by Vlad Dogaru's avatar Vlad Dogaru Committed by David S. Miller

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: default avatarVlad Dogaru <ddvlad@rosedu.org>
Acked-by: default avatarJamal Hadi Salim <hadi@cyberus.ca>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 441c793a
...@@ -135,6 +135,7 @@ enum { ...@@ -135,6 +135,7 @@ enum {
IFLA_VF_PORTS, IFLA_VF_PORTS,
IFLA_PORT_SELF, IFLA_PORT_SELF,
IFLA_AF_SPEC, IFLA_AF_SPEC,
IFLA_GROUP, /* Group the device belongs to */
__IFLA_MAX __IFLA_MAX
}; };
......
...@@ -75,6 +75,9 @@ struct wireless_dev; ...@@ -75,6 +75,9 @@ struct wireless_dev;
#define NET_RX_SUCCESS 0 /* keep 'em coming, baby */ #define NET_RX_SUCCESS 0 /* keep 'em coming, baby */
#define NET_RX_DROP 1 /* packet dropped */ #define NET_RX_DROP 1 /* packet dropped */
/* Initial net device group. All devices belong to group 0 by default. */
#define INIT_NETDEV_GROUP 0
/* /*
* Transmit return codes: transmit return codes originate from three different * Transmit return codes: transmit return codes originate from three different
* namespaces: * namespaces:
...@@ -1153,6 +1156,9 @@ struct net_device { ...@@ -1153,6 +1156,9 @@ struct net_device {
/* phy device may attach itself for hardware timestamping */ /* phy device may attach itself for hardware timestamping */
struct phy_device *phydev; struct phy_device *phydev;
/* group the device belongs to */
int group;
}; };
#define to_net_dev(d) container_of(d, struct net_device, dev) #define to_net_dev(d) container_of(d, struct net_device, dev)
...@@ -1844,6 +1850,7 @@ extern int dev_set_alias(struct net_device *, const char *, size_t); ...@@ -1844,6 +1850,7 @@ extern int dev_set_alias(struct net_device *, const char *, size_t);
extern int dev_change_net_namespace(struct net_device *, extern int dev_change_net_namespace(struct net_device *,
struct net *, const char *); struct net *, const char *);
extern int dev_set_mtu(struct net_device *, int); extern int dev_set_mtu(struct net_device *, int);
extern void dev_set_group(struct net_device *, int);
extern int dev_set_mac_address(struct net_device *, extern int dev_set_mac_address(struct net_device *,
struct sockaddr *); struct sockaddr *);
extern int dev_hard_start_xmit(struct sk_buff *skb, extern int dev_hard_start_xmit(struct sk_buff *skb,
......
...@@ -4571,6 +4571,17 @@ int dev_set_mtu(struct net_device *dev, int new_mtu) ...@@ -4571,6 +4571,17 @@ int dev_set_mtu(struct net_device *dev, int new_mtu)
} }
EXPORT_SYMBOL(dev_set_mtu); EXPORT_SYMBOL(dev_set_mtu);
/**
* dev_set_group - Change group this device belongs to
* @dev: device
* @new_group: group this device should belong to
*/
void dev_set_group(struct net_device *dev, int new_group)
{
dev->group = new_group;
}
EXPORT_SYMBOL(dev_set_group);
/** /**
* dev_set_mac_address - Change Media Access Control Address * dev_set_mac_address - Change Media Access Control Address
* @dev: device * @dev: device
...@@ -5678,6 +5689,7 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name, ...@@ -5678,6 +5689,7 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
dev->priv_flags = IFF_XMIT_DST_RELEASE; dev->priv_flags = IFF_XMIT_DST_RELEASE;
setup(dev); setup(dev);
strcpy(dev->name, name); strcpy(dev->name, name);
dev->group = INIT_NETDEV_GROUP;
return dev; return dev;
free_pcpu: free_pcpu:
......
...@@ -868,6 +868,7 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, ...@@ -868,6 +868,7 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
netif_running(dev) ? dev->operstate : IF_OPER_DOWN); netif_running(dev) ? dev->operstate : IF_OPER_DOWN);
NLA_PUT_U8(skb, IFLA_LINKMODE, dev->link_mode); NLA_PUT_U8(skb, IFLA_LINKMODE, dev->link_mode);
NLA_PUT_U32(skb, IFLA_MTU, dev->mtu); NLA_PUT_U32(skb, IFLA_MTU, dev->mtu);
NLA_PUT_U32(skb, IFLA_GROUP, dev->group);
if (dev->ifindex != dev->iflink) if (dev->ifindex != dev->iflink)
NLA_PUT_U32(skb, IFLA_LINK, dev->iflink); NLA_PUT_U32(skb, IFLA_LINK, dev->iflink);
...@@ -1265,6 +1266,11 @@ static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm, ...@@ -1265,6 +1266,11 @@ static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm,
modified = 1; modified = 1;
} }
if (tb[IFLA_GROUP]) {
dev_set_group(dev, nla_get_u32(tb[IFLA_GROUP]));
modified = 1;
}
/* /*
* Interface selected by interface index but interface * Interface selected by interface index but interface
* name provided implies that a name change has been * name provided implies that a name change has been
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment