Commit 600bb031 authored by David S. Miller's avatar David S. Miller

Merge branch 'bond-mpls'

Ariel Levkovich says:

====================
Support MPLS features in bonding and vlan net devices

Netdevice HW MPLS features are not passed from device driver's netdevice to
upper netdevice, specifically VLAN and bonding netdevice which are created
by the kernel when needed.

This prevents enablement and usage of HW offloads, such as TSO and checksumming
for MPLS tagged traffic when running via VLAN or bonding interface.

The patches introduce changes to the initialization steps of the VLAN and bonding
netdevices to inherit the MPLS features from lower netdevices to allow the HW
offloads.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents b20ac8da 8b6912a5
...@@ -1077,12 +1077,16 @@ static netdev_features_t bond_fix_features(struct net_device *dev, ...@@ -1077,12 +1077,16 @@ static netdev_features_t bond_fix_features(struct net_device *dev,
#define BOND_ENC_FEATURES (NETIF_F_HW_CSUM | NETIF_F_SG | \ #define BOND_ENC_FEATURES (NETIF_F_HW_CSUM | NETIF_F_SG | \
NETIF_F_RXCSUM | NETIF_F_ALL_TSO) NETIF_F_RXCSUM | NETIF_F_ALL_TSO)
#define BOND_MPLS_FEATURES (NETIF_F_HW_CSUM | NETIF_F_SG | \
NETIF_F_ALL_TSO)
static void bond_compute_features(struct bonding *bond) static void bond_compute_features(struct bonding *bond)
{ {
unsigned int dst_release_flag = IFF_XMIT_DST_RELEASE | unsigned int dst_release_flag = IFF_XMIT_DST_RELEASE |
IFF_XMIT_DST_RELEASE_PERM; IFF_XMIT_DST_RELEASE_PERM;
netdev_features_t vlan_features = BOND_VLAN_FEATURES; netdev_features_t vlan_features = BOND_VLAN_FEATURES;
netdev_features_t enc_features = BOND_ENC_FEATURES; netdev_features_t enc_features = BOND_ENC_FEATURES;
netdev_features_t mpls_features = BOND_MPLS_FEATURES;
struct net_device *bond_dev = bond->dev; struct net_device *bond_dev = bond->dev;
struct list_head *iter; struct list_head *iter;
struct slave *slave; struct slave *slave;
...@@ -1093,6 +1097,7 @@ static void bond_compute_features(struct bonding *bond) ...@@ -1093,6 +1097,7 @@ static void bond_compute_features(struct bonding *bond)
if (!bond_has_slaves(bond)) if (!bond_has_slaves(bond))
goto done; goto done;
vlan_features &= NETIF_F_ALL_FOR_ALL; vlan_features &= NETIF_F_ALL_FOR_ALL;
mpls_features &= NETIF_F_ALL_FOR_ALL;
bond_for_each_slave(bond, slave, iter) { bond_for_each_slave(bond, slave, iter) {
vlan_features = netdev_increment_features(vlan_features, vlan_features = netdev_increment_features(vlan_features,
...@@ -1101,6 +1106,11 @@ static void bond_compute_features(struct bonding *bond) ...@@ -1101,6 +1106,11 @@ static void bond_compute_features(struct bonding *bond)
enc_features = netdev_increment_features(enc_features, enc_features = netdev_increment_features(enc_features,
slave->dev->hw_enc_features, slave->dev->hw_enc_features,
BOND_ENC_FEATURES); BOND_ENC_FEATURES);
mpls_features = netdev_increment_features(mpls_features,
slave->dev->mpls_features,
BOND_MPLS_FEATURES);
dst_release_flag &= slave->dev->priv_flags; dst_release_flag &= slave->dev->priv_flags;
if (slave->dev->hard_header_len > max_hard_header_len) if (slave->dev->hard_header_len > max_hard_header_len)
max_hard_header_len = slave->dev->hard_header_len; max_hard_header_len = slave->dev->hard_header_len;
...@@ -1114,6 +1124,7 @@ static void bond_compute_features(struct bonding *bond) ...@@ -1114,6 +1124,7 @@ static void bond_compute_features(struct bonding *bond)
bond_dev->vlan_features = vlan_features; bond_dev->vlan_features = vlan_features;
bond_dev->hw_enc_features = enc_features | NETIF_F_GSO_ENCAP_ALL | bond_dev->hw_enc_features = enc_features | NETIF_F_GSO_ENCAP_ALL |
NETIF_F_GSO_UDP_L4; NETIF_F_GSO_UDP_L4;
bond_dev->mpls_features = mpls_features;
bond_dev->gso_max_segs = gso_max_segs; bond_dev->gso_max_segs = gso_max_segs;
netif_set_gso_max_size(bond_dev, gso_max_size); netif_set_gso_max_size(bond_dev, gso_max_size);
......
...@@ -585,6 +585,7 @@ static int vlan_dev_init(struct net_device *dev) ...@@ -585,6 +585,7 @@ static int vlan_dev_init(struct net_device *dev)
dev->vlan_features = real_dev->vlan_features & ~NETIF_F_ALL_FCOE; dev->vlan_features = real_dev->vlan_features & ~NETIF_F_ALL_FCOE;
dev->hw_enc_features = vlan_tnl_features(real_dev); dev->hw_enc_features = vlan_tnl_features(real_dev);
dev->mpls_features = real_dev->mpls_features;
/* ipv6 shared card related stuff */ /* ipv6 shared card related stuff */
dev->dev_id = real_dev->dev_id; dev->dev_id = real_dev->dev_id;
......
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