[ovs-dev] [PATCH 13/13] Upstream VXLAN: Add segmentation.
Pravin B Shelar
pshelar at nicira.com
Wed Nov 7 01:00:51 UTC 2012
Use UDP Tunnel segmention.
Signed-off-by: Pravin B Shelar <pshelar at nicira.com>
---
drivers/net/vxlan.c | 27 +++++++++++++++++++++++----
1 file changed, 23 insertions(+), 4 deletions(-)
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
index 983a239..07e43bb 100644
--- a/drivers/net/vxlan.c
+++ b/drivers/net/vxlan.c
@@ -616,6 +616,21 @@ static u16 vxlan_src_port(const struct vxlan_dev *vxlan, struct sk_buff *skb)
return (((u64) hash * range) >> 32) + vxlan->port_min;
}
+static int handle_gso(struct sk_buff *skb)
+{
+ if (skb_is_gso(skb)) {
+ int err = unclone_skb(skb, GFP_ATOMIC);
+ if (unlikely(err))
+ return err;
+
+ skb_shinfo(skb)->gso_type |= (SKB_GSO_UDP_TUNNEL | SKB_GSO_UDP);
+ skb->tunnel_hlen = sizeof(struct vxlanhdr);
+ } else {
+ skb->ip_summed = CHECKSUM_NONE;
+ }
+ return 0;
+}
+
/* Transmit local packets over Vxlan
*
* Outer IP header inherits ECN and DF from inner header.
@@ -638,7 +653,7 @@ static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev)
__u8 tos, ttl;
int err;
- if (skb->ip_summed == CHECKSUM_PARTIAL) {
+ if (!skb_is_gso(skb) && skb->ip_summed == CHECKSUM_PARTIAL) {
/* Pages aren't locked and could change at any time.
* If this happens after we compute the checksum, the
* checksum will be wrong. We linearize now to avoid
@@ -725,11 +740,14 @@ static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev)
iph->saddr = fl4.saddr;
iph->ttl = ttl ? : ip4_dst_hoplimit(&rt->dst);
+ skb->local_df = 1;
+ __ip_select_ident(ip_hdr(skb), &rt->dst, 0);
+
vxlan_set_owner(dev, skb);
/* See __IPTUNNEL_XMIT */
- skb->ip_summed = CHECKSUM_NONE;
- ip_select_ident(iph, &rt->dst, NULL);
+ if (handle_gso(skb))
+ goto drop;
err = ip_local_out(skb);
if (likely(net_xmit_eval(err) == 0)) {
@@ -887,7 +905,8 @@ static void vxlan_free(struct net_device *dev)
#define VXLAN_FEATURES (NETIF_F_SG | \
NETIF_F_FRAGLIST | \
NETIF_F_HIGHDMA | \
- NETIF_F_HW_CSUM)
+ NETIF_F_HW_CSUM | \
+ NETIF_F_TSO)
/* Initialize the device structure. */
static void vxlan_setup(struct net_device *dev)
--
1.7.10
More information about the dev
mailing list