dpif: Use separate OVS_PACKET_ATTR_PROBE for packet messges
[cascardo/ovs.git] / datapath / vport-lisp.c
index a067e05..db4d06f 100644 (file)
@@ -406,37 +406,35 @@ static void lisp_fix_segment(struct sk_buff *skb)
        udph->len = htons(skb->len - skb_transport_offset(skb));
 }
 
-static int handle_offloads(struct sk_buff *skb)
+static struct sk_buff *handle_offloads(struct sk_buff *skb)
 {
-       if (skb_is_gso(skb)) {
-               if (skb_is_encapsulated(skb))
-                       return -ENOSYS;
-
-               OVS_GSO_CB(skb)->fix_segment = lisp_fix_segment;
-       } else if (skb->ip_summed != CHECKSUM_PARTIAL) {
-               skb->ip_summed = CHECKSUM_NONE;
-       }
-       return 0;
+       return ovs_iptunnel_handle_offloads(skb, false, lisp_fix_segment);
 }
 #else
-static int handle_offloads(struct sk_buff *skb)
+static struct sk_buff *handle_offloads(struct sk_buff *skb)
 {
+       int err = 0;
+
        if (skb_is_gso(skb)) {
-               int err;
 
-               if (skb_is_encapsulated(skb))
-                       return -ENOSYS;
+               if (skb_is_encapsulated(skb)) {
+                       err = -ENOSYS;
+                       goto error;
+               }
 
                err = skb_unclone(skb, GFP_ATOMIC);
                if (unlikely(err))
-                       return err;
+                       goto error;
 
                skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_TUNNEL;
        } else if (skb->ip_summed != CHECKSUM_PARTIAL)
                skb->ip_summed = CHECKSUM_NONE;
 
        skb->encapsulation = 1;
-       return 0;
+       return skb;
+error:
+       kfree_skb(skb);
+       return ERR_PTR(err);
 }
 #endif
 
@@ -451,15 +449,17 @@ static int lisp_send(struct vport *vport, struct sk_buff *skb)
        int sent_len;
        int err;
 
-       if (unlikely(!OVS_CB(skb)->egress_tun_info))
-               return -EINVAL;
+       if (unlikely(!OVS_CB(skb)->egress_tun_info)) {
+               err = -EINVAL;
+               goto error;
+       }
 
        tun_key = &OVS_CB(skb)->egress_tun_info->tunnel;
 
        if (skb->protocol != htons(ETH_P_IP) &&
            skb->protocol != htons(ETH_P_IPV6)) {
-               kfree_skb(skb);
-               return 0;
+               err = 0;
+               goto error;
        }
 
        /* Route lookup */
@@ -500,9 +500,12 @@ static int lisp_send(struct vport *vport, struct sk_buff *skb)
        lisp_build_header(vport, skb);
 
        /* Offloading */
-       err = handle_offloads(skb);
-       if (err)
+       skb = handle_offloads(skb);
+       if (IS_ERR(skb)) {
+               err = PTR_ERR(skb);
+               skb = NULL;
                goto err_free_rt;
+       }
 
        skb->ignore_df = 1;
 
@@ -517,6 +520,7 @@ static int lisp_send(struct vport *vport, struct sk_buff *skb)
 err_free_rt:
        ip_rt_put(rt);
 error:
+       kfree_skb(skb);
        return err;
 }