]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - net/openvswitch/vport.c
Merge remote-tracking branch 'arm-soc/for-next'
[karo-tx-linux.git] / net / openvswitch / vport.c
index 320c765ce44a07e71daedfd457d37c81ea2e4c49..0ac0fd004d7ed885c009560d966da5b29b47f242 100644 (file)
@@ -479,3 +479,33 @@ void ovs_vport_deferred_free(struct vport *vport)
        call_rcu(&vport->rcu, free_vport_rcu);
 }
 EXPORT_SYMBOL_GPL(ovs_vport_deferred_free);
+
+static unsigned int packet_length(const struct sk_buff *skb)
+{
+       unsigned int length = skb->len - ETH_HLEN;
+
+       if (skb->protocol == htons(ETH_P_8021Q))
+               length -= VLAN_HLEN;
+
+       return length;
+}
+
+void ovs_vport_send(struct vport *vport, struct sk_buff *skb)
+{
+       int mtu = vport->dev->mtu;
+
+       if (unlikely(packet_length(skb) > mtu && !skb_is_gso(skb))) {
+               net_warn_ratelimited("%s: dropped over-mtu packet: %d > %d\n",
+                                    vport->dev->name,
+                                    packet_length(skb), mtu);
+               vport->dev->stats.tx_errors++;
+               goto drop;
+       }
+
+       skb->dev = vport->dev;
+       vport->ops->send(skb);
+       return;
+
+drop:
+       kfree_skb(skb);
+}