Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
This commit is contained in:
@@ -2541,13 +2541,19 @@ netdev_features_t netif_skb_features(struct sk_buff *skb)
|
||||
return harmonize_features(skb, features);
|
||||
}
|
||||
|
||||
features &= (skb->dev->vlan_features | NETIF_F_HW_VLAN_CTAG_TX |
|
||||
NETIF_F_HW_VLAN_STAG_TX);
|
||||
features = netdev_intersect_features(features,
|
||||
skb->dev->vlan_features |
|
||||
NETIF_F_HW_VLAN_CTAG_TX |
|
||||
NETIF_F_HW_VLAN_STAG_TX);
|
||||
|
||||
if (protocol == htons(ETH_P_8021Q) || protocol == htons(ETH_P_8021AD))
|
||||
features &= NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST |
|
||||
NETIF_F_GEN_CSUM | NETIF_F_HW_VLAN_CTAG_TX |
|
||||
NETIF_F_HW_VLAN_STAG_TX;
|
||||
features = netdev_intersect_features(features,
|
||||
NETIF_F_SG |
|
||||
NETIF_F_HIGHDMA |
|
||||
NETIF_F_FRAGLIST |
|
||||
NETIF_F_GEN_CSUM |
|
||||
NETIF_F_HW_VLAN_CTAG_TX |
|
||||
NETIF_F_HW_VLAN_STAG_TX);
|
||||
|
||||
return harmonize_features(skb, features);
|
||||
}
|
||||
@@ -4894,7 +4900,8 @@ static void __netdev_adjacent_dev_remove(struct net_device *dev,
|
||||
if (adj->master)
|
||||
sysfs_remove_link(&(dev->dev.kobj), "master");
|
||||
|
||||
if (netdev_adjacent_is_neigh_list(dev, dev_list))
|
||||
if (netdev_adjacent_is_neigh_list(dev, dev_list) &&
|
||||
net_eq(dev_net(dev),dev_net(adj_dev)))
|
||||
netdev_adjacent_sysfs_del(dev, adj_dev->name, dev_list);
|
||||
|
||||
list_del_rcu(&adj->list);
|
||||
@@ -5164,11 +5171,65 @@ void netdev_upper_dev_unlink(struct net_device *dev,
|
||||
}
|
||||
EXPORT_SYMBOL(netdev_upper_dev_unlink);
|
||||
|
||||
void netdev_adjacent_add_links(struct net_device *dev)
|
||||
{
|
||||
struct netdev_adjacent *iter;
|
||||
|
||||
struct net *net = dev_net(dev);
|
||||
|
||||
list_for_each_entry(iter, &dev->adj_list.upper, list) {
|
||||
if (!net_eq(net,dev_net(iter->dev)))
|
||||
continue;
|
||||
netdev_adjacent_sysfs_add(iter->dev, dev,
|
||||
&iter->dev->adj_list.lower);
|
||||
netdev_adjacent_sysfs_add(dev, iter->dev,
|
||||
&dev->adj_list.upper);
|
||||
}
|
||||
|
||||
list_for_each_entry(iter, &dev->adj_list.lower, list) {
|
||||
if (!net_eq(net,dev_net(iter->dev)))
|
||||
continue;
|
||||
netdev_adjacent_sysfs_add(iter->dev, dev,
|
||||
&iter->dev->adj_list.upper);
|
||||
netdev_adjacent_sysfs_add(dev, iter->dev,
|
||||
&dev->adj_list.lower);
|
||||
}
|
||||
}
|
||||
|
||||
void netdev_adjacent_del_links(struct net_device *dev)
|
||||
{
|
||||
struct netdev_adjacent *iter;
|
||||
|
||||
struct net *net = dev_net(dev);
|
||||
|
||||
list_for_each_entry(iter, &dev->adj_list.upper, list) {
|
||||
if (!net_eq(net,dev_net(iter->dev)))
|
||||
continue;
|
||||
netdev_adjacent_sysfs_del(iter->dev, dev->name,
|
||||
&iter->dev->adj_list.lower);
|
||||
netdev_adjacent_sysfs_del(dev, iter->dev->name,
|
||||
&dev->adj_list.upper);
|
||||
}
|
||||
|
||||
list_for_each_entry(iter, &dev->adj_list.lower, list) {
|
||||
if (!net_eq(net,dev_net(iter->dev)))
|
||||
continue;
|
||||
netdev_adjacent_sysfs_del(iter->dev, dev->name,
|
||||
&iter->dev->adj_list.upper);
|
||||
netdev_adjacent_sysfs_del(dev, iter->dev->name,
|
||||
&dev->adj_list.lower);
|
||||
}
|
||||
}
|
||||
|
||||
void netdev_adjacent_rename_links(struct net_device *dev, char *oldname)
|
||||
{
|
||||
struct netdev_adjacent *iter;
|
||||
|
||||
struct net *net = dev_net(dev);
|
||||
|
||||
list_for_each_entry(iter, &dev->adj_list.upper, list) {
|
||||
if (!net_eq(net,dev_net(iter->dev)))
|
||||
continue;
|
||||
netdev_adjacent_sysfs_del(iter->dev, oldname,
|
||||
&iter->dev->adj_list.lower);
|
||||
netdev_adjacent_sysfs_add(iter->dev, dev,
|
||||
@@ -5176,6 +5237,8 @@ void netdev_adjacent_rename_links(struct net_device *dev, char *oldname)
|
||||
}
|
||||
|
||||
list_for_each_entry(iter, &dev->adj_list.lower, list) {
|
||||
if (!net_eq(net,dev_net(iter->dev)))
|
||||
continue;
|
||||
netdev_adjacent_sysfs_del(iter->dev, oldname,
|
||||
&iter->dev->adj_list.upper);
|
||||
netdev_adjacent_sysfs_add(iter->dev, dev,
|
||||
@@ -6778,6 +6841,7 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char
|
||||
|
||||
/* Send a netdev-removed uevent to the old namespace */
|
||||
kobject_uevent(&dev->dev.kobj, KOBJ_REMOVE);
|
||||
netdev_adjacent_del_links(dev);
|
||||
|
||||
/* Actually switch the network namespace */
|
||||
dev_net_set(dev, net);
|
||||
@@ -6792,6 +6856,7 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char
|
||||
|
||||
/* Send a netdev-add uevent to the new namespace */
|
||||
kobject_uevent(&dev->dev.kobj, KOBJ_ADD);
|
||||
netdev_adjacent_add_links(dev);
|
||||
|
||||
/* Fixup kobjects */
|
||||
err = device_rename(&dev->dev, dev->name);
|
||||
|
||||
Reference in New Issue
Block a user