#include <net/llc.h>
-#include "checksum.h"
#include "datapath.h"
#include "vlan.h"
#include "vport-internal_dev.h"
if (unlikely(!skb))
return;
- if (unlikely(compute_ip_summed(skb, false)))
- goto error;
-
skb_push(skb, ETH_HLEN);
ovs_skb_postpush_rcsum(skb, skb->data, ETH_HLEN);
- vlan_copy_skb_tci(skb);
-
ovs_vport_receive(vport, skb, NULL);
return;
}
skb->dev = netdev_vport->dev;
- forward_ip_summed(skb, true);
if (vlan_tx_tag_present(skb) && !dev_supports_vlan_tx(skb->dev)) {
int features;
features &= ~(NETIF_F_TSO | NETIF_F_TSO6 |
NETIF_F_UFO | NETIF_F_FSO);
+ skb = __vlan_put_tag(skb, skb->vlan_proto, vlan_tx_tag_get(skb));
+ if (unlikely(!skb))
+ return 0;
+ vlan_set_tci(skb, 0);
+
if (netif_needs_gso(skb, features)) {
struct sk_buff *nskb;
goto drop;
skb_shinfo(skb)->gso_type &= ~SKB_GSO_DODGY;
- goto tag;
+ goto xmit;
}
if (IS_ERR(nskb))
do {
nskb = skb->next;
skb->next = NULL;
-
- skb = __vlan_put_tag(skb, skb->vlan_proto, vlan_tx_tag_get(skb));
- if (likely(skb)) {
- len += skb->len;
- vlan_set_tci(skb, 0);
- dev_queue_xmit(skb);
- }
-
+ len += skb->len;
+ dev_queue_xmit(skb);
skb = nskb;
} while (skb);
return len;
}
-
-tag:
- skb = __vlan_put_tag(skb, skb->vlan_proto, vlan_tx_tag_get(skb));
- if (unlikely(!skb))
- return 0;
- vlan_set_tci(skb, 0);
}
+xmit:
len = skb->len;
dev_queue_xmit(skb);