Commit a567dd62 authored by Vlad Yasevich's avatar Vlad Yasevich Committed by David S. Miller

macvtap: simplify usage of tap_features

In macvtap, tap_features specific the features of that the user
has specified via ioctl().  If we treat macvtap as a macvlan+tap
then we could all the tap a pseudo-device and give it other features
like SG and GSO.  Then we can stop using the features of lower
device (macvlan) when forwarding the traffic the tap.

This solves the issue of possible checksum offload mismatch between
tap feature and macvlan features.
Signed-off-by: default avatarVlad Yasevich <vyasevic@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7ed5c5ae
...@@ -68,6 +68,8 @@ static const struct proto_ops macvtap_socket_ops; ...@@ -68,6 +68,8 @@ static const struct proto_ops macvtap_socket_ops;
#define TUN_OFFLOADS (NETIF_F_HW_CSUM | NETIF_F_TSO_ECN | NETIF_F_TSO | \ #define TUN_OFFLOADS (NETIF_F_HW_CSUM | NETIF_F_TSO_ECN | NETIF_F_TSO | \
NETIF_F_TSO6 | NETIF_F_UFO) NETIF_F_TSO6 | NETIF_F_UFO)
#define RX_OFFLOADS (NETIF_F_GRO | NETIF_F_LRO) #define RX_OFFLOADS (NETIF_F_GRO | NETIF_F_LRO)
#define TAP_FEATURES (NETIF_F_GSO | NETIF_F_SG)
/* /*
* RCU usage: * RCU usage:
* The macvtap_queue and the macvlan_dev are loosely coupled, the * The macvtap_queue and the macvlan_dev are loosely coupled, the
...@@ -278,7 +280,8 @@ static int macvtap_forward(struct net_device *dev, struct sk_buff *skb) ...@@ -278,7 +280,8 @@ static int macvtap_forward(struct net_device *dev, struct sk_buff *skb)
{ {
struct macvlan_dev *vlan = netdev_priv(dev); struct macvlan_dev *vlan = netdev_priv(dev);
struct macvtap_queue *q = macvtap_get_queue(dev, skb); struct macvtap_queue *q = macvtap_get_queue(dev, skb);
netdev_features_t features; netdev_features_t features = TAP_FEATURES;
if (!q) if (!q)
goto drop; goto drop;
...@@ -289,7 +292,7 @@ static int macvtap_forward(struct net_device *dev, struct sk_buff *skb) ...@@ -289,7 +292,7 @@ static int macvtap_forward(struct net_device *dev, struct sk_buff *skb)
/* Apply the forward feature mask so that we perform segmentation /* Apply the forward feature mask so that we perform segmentation
* according to users wishes. * according to users wishes.
*/ */
features = netif_skb_features(skb) & vlan->tap_features; features |= vlan->tap_features;
if (netif_needs_gso(skb, features)) { if (netif_needs_gso(skb, features)) {
struct sk_buff *segs = __skb_gso_segment(skb, features, false); struct sk_buff *segs = __skb_gso_segment(skb, features, false);
...@@ -1064,8 +1067,7 @@ static int set_offload(struct macvtap_queue *q, unsigned long arg) ...@@ -1064,8 +1067,7 @@ static int set_offload(struct macvtap_queue *q, unsigned long arg)
/* tap_features are the same as features on tun/tap and /* tap_features are the same as features on tun/tap and
* reflect user expectations. * reflect user expectations.
*/ */
vlan->tap_features = vlan->dev->features & vlan->tap_features = feature_mask;
(feature_mask | ~TUN_OFFLOADS);
vlan->set_features = features; vlan->set_features = features;
netdev_update_features(vlan->dev); netdev_update_features(vlan->dev);
......
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