projects
/
cascardo
/
ovs.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
dpif: Use separate OVS_PACKET_ATTR_PROBE for packet messges
[cascardo/ovs.git]
/
datapath
/
vport-lisp.c
diff --git
a/datapath/vport-lisp.c
b/datapath/vport-lisp.c
index
a067e05
..
db4d06f
100644
(file)
--- a/
datapath/vport-lisp.c
+++ b/
datapath/vport-lisp.c
@@
-406,37
+406,35
@@
static void lisp_fix_segment(struct sk_buff *skb)
udph->len = htons(skb->len - skb_transport_offset(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
}
#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)) {
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))
err = skb_unclone(skb, GFP_ATOMIC);
if (unlikely(err))
-
return er
r;
+
goto erro
r;
skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_TUNNEL;
} else if (skb->ip_summed != CHECKSUM_PARTIAL)
skb->ip_summed = CHECKSUM_NONE;
skb->encapsulation = 1;
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
}
#endif
@@
-451,15
+449,17
@@
static int lisp_send(struct vport *vport, struct sk_buff *skb)
int sent_len;
int err;
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)) {
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 */
}
/* Route lookup */
@@
-500,9
+500,12
@@
static int lisp_send(struct vport *vport, struct sk_buff *skb)
lisp_build_header(vport, skb);
/* Offloading */
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;
goto err_free_rt;
+ }
skb->ignore_df = 1;
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:
err_free_rt:
ip_rt_put(rt);
error:
+ kfree_skb(skb);
return err;
}
return err;
}