diff options
author | David S. Miller <davem@davemloft.net> | 2013-08-26 16:37:08 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-08-26 16:37:08 -0400 |
commit | b05930f5d1c7d5873cb050261d21789a99de9d48 (patch) | |
tree | 2d374846712b0bdacc5dd0a36b3c2f754886e560 /drivers/net/macvtap.c | |
parent | b65f63ee845136940db985f3072335d8cdb6fd6c (diff) | |
parent | 41a00f7950a6bc0aa956f6d6b423f0fbf34d431a (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts:
drivers/net/wireless/iwlwifi/pcie/trans.c
include/linux/inetdevice.h
The inetdevice.h conflict involves moving the IPV4_DEVCONF values
into a UAPI header, overlapping additions of some new entries.
The iwlwifi conflict is a context overlap.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/macvtap.c')
-rw-r--r-- | drivers/net/macvtap.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index 1c6e1116eb0a..9dccb1edfd2a 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c | |||
@@ -68,6 +68,8 @@ static const struct proto_ops macvtap_socket_ops; | |||
68 | #define TUN_OFFLOADS (NETIF_F_HW_CSUM | NETIF_F_TSO_ECN | NETIF_F_TSO | \ | 68 | #define TUN_OFFLOADS (NETIF_F_HW_CSUM | NETIF_F_TSO_ECN | NETIF_F_TSO | \ |
69 | NETIF_F_TSO6 | NETIF_F_UFO) | 69 | NETIF_F_TSO6 | NETIF_F_UFO) |
70 | #define RX_OFFLOADS (NETIF_F_GRO | NETIF_F_LRO) | 70 | #define RX_OFFLOADS (NETIF_F_GRO | NETIF_F_LRO) |
71 | #define TAP_FEATURES (NETIF_F_GSO | NETIF_F_SG) | ||
72 | |||
71 | /* | 73 | /* |
72 | * RCU usage: | 74 | * RCU usage: |
73 | * The macvtap_queue and the macvlan_dev are loosely coupled, the | 75 | * 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 | { | 280 | { |
279 | struct macvlan_dev *vlan = netdev_priv(dev); | 281 | struct macvlan_dev *vlan = netdev_priv(dev); |
280 | struct macvtap_queue *q = macvtap_get_queue(dev, skb); | 282 | struct macvtap_queue *q = macvtap_get_queue(dev, skb); |
281 | netdev_features_t features; | 283 | netdev_features_t features = TAP_FEATURES; |
284 | |||
282 | if (!q) | 285 | if (!q) |
283 | goto drop; | 286 | goto drop; |
284 | 287 | ||
@@ -287,9 +290,11 @@ static int macvtap_forward(struct net_device *dev, struct sk_buff *skb) | |||
287 | 290 | ||
288 | skb->dev = dev; | 291 | skb->dev = dev; |
289 | /* Apply the forward feature mask so that we perform segmentation | 292 | /* Apply the forward feature mask so that we perform segmentation |
290 | * according to users wishes. | 293 | * according to users wishes. This only works if VNET_HDR is |
294 | * enabled. | ||
291 | */ | 295 | */ |
292 | features = netif_skb_features(skb) & vlan->tap_features; | 296 | if (q->flags & IFF_VNET_HDR) |
297 | features |= vlan->tap_features; | ||
293 | if (netif_needs_gso(skb, features)) { | 298 | if (netif_needs_gso(skb, features)) { |
294 | struct sk_buff *segs = __skb_gso_segment(skb, features, false); | 299 | struct sk_buff *segs = __skb_gso_segment(skb, features, false); |
295 | 300 | ||
@@ -961,8 +966,7 @@ static int set_offload(struct macvtap_queue *q, unsigned long arg) | |||
961 | /* tap_features are the same as features on tun/tap and | 966 | /* tap_features are the same as features on tun/tap and |
962 | * reflect user expectations. | 967 | * reflect user expectations. |
963 | */ | 968 | */ |
964 | vlan->tap_features = vlan->dev->features & | 969 | vlan->tap_features = feature_mask; |
965 | (feature_mask | ~TUN_OFFLOADS); | ||
966 | vlan->set_features = features; | 970 | vlan->set_features = features; |
967 | netdev_update_features(vlan->dev); | 971 | netdev_update_features(vlan->dev); |
968 | 972 | ||
@@ -1058,10 +1062,6 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd, | |||
1058 | TUN_F_TSO_ECN | TUN_F_UFO)) | 1062 | TUN_F_TSO_ECN | TUN_F_UFO)) |
1059 | return -EINVAL; | 1063 | return -EINVAL; |
1060 | 1064 | ||
1061 | /* TODO: only accept frames with the features that | ||
1062 | got enabled for forwarded frames */ | ||
1063 | if (!(q->flags & IFF_VNET_HDR)) | ||
1064 | return -EINVAL; | ||
1065 | rtnl_lock(); | 1065 | rtnl_lock(); |
1066 | ret = set_offload(q, arg); | 1066 | ret = set_offload(q, arg); |
1067 | rtnl_unlock(); | 1067 | rtnl_unlock(); |