/* Need space for new headers (invalidates iph ptr) */
err = skb_cow_head(skb, min_headroom);
- if (unlikely(err))
+ if (unlikely(err)) {
+ kfree_skb(skb);
return err;
+ }
if (vlan_tx_tag_present(skb)) {
if (unlikely(!__vlan_put_tag(skb,
skb = handle_offloads(skb);
if (IS_ERR(skb))
- return 0;
+ return PTR_ERR(skb);
return iptunnel_xmit(vs->sock->sk, rt, skb, src, dst, IPPROTO_UDP,
tos, ttl, df, false);
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;
skb->vlan_proto,
vlan_tx_tag_get(skb)))) {
err = -ENOMEM;
+ skb = NULL;
goto err_free_rt;
}
vlan_set_tci(skb, 0);
/* Offloading */
skb = handle_offloads(skb);
if (IS_ERR(skb)) {
- err = 0;
+ err = PTR_ERR(skb);
+ skb = NULL;
goto err_free_rt;
}
err_free_rt:
ip_rt_put(rt);
error:
+ kfree_skb(skb);
return err;
}
tun_key = &OVS_CB(skb)->egress_tun_info->tunnel;
skb = gre_handle_offloads(skb, !!(tun_key->tun_flags & TUNNEL_CSUM));
if (IS_ERR(skb))
- return NULL;
+ return skb;
tpi.flags = filter_tnl_flags(tun_key->tun_flags) | gre64_flag;
skb->vlan_proto,
vlan_tx_tag_get(skb)))) {
err = -ENOMEM;
+ skb = NULL;
goto err_free_rt;
}
vlan_set_tci(skb, 0);
/* Push Tunnel header. */
skb = __build_header(skb, tunnel_hlen, seq, gre64_flag);
- if (unlikely(!skb)) {
- err = 0;
+ if (IS_ERR(skb)) {
+ err = PTR_ERR(skb);
+ skb = NULL;
goto err_free_rt;
}
err_free_rt:
ip_rt_put(rt);
error:
+ kfree_skb(skb);
return err;
}
{
int hlen;
- if (unlikely(!OVS_CB(skb)->egress_tun_info))
+ if (unlikely(!OVS_CB(skb)->egress_tun_info)) {
+ kfree_skb(skb);
return -EINVAL;
+ }
hlen = ip_gre_calc_hlen(OVS_CB(skb)->egress_tun_info->tunnel.tun_flags);
GRE_HEADER_SECTION; /* GRE SEQ */
__be32 seq;
- if (unlikely(!OVS_CB(skb)->egress_tun_info))
+ if (unlikely(!OVS_CB(skb)->egress_tun_info)) {
+ kfree_skb(skb);
return -EINVAL;
+ }
if (OVS_CB(skb)->egress_tun_info->tunnel.tun_flags & TUNNEL_CSUM)
hlen += GRE_HEADER_SECTION;
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 */
/* Offloading */
skb = handle_offloads(skb);
if (IS_ERR(skb)) {
- err = 0;
+ err = PTR_ERR(skb);
+ skb = NULL;
goto err_free_rt;
}
err_free_rt:
ip_rt_put(rt);
error:
+ kfree_skb(skb);
return err;
}
htonl(be64_to_cpu(tun_key->tun_id) << 8));
if (err < 0)
ip_rt_put(rt);
+ return err;
error:
+ kfree_skb(skb);
return err;
}
u64_stats_update_end(&stats->syncp);
} else if (sent < 0) {
ovs_vport_record_error(vport, VPORT_E_TX_ERROR);
- kfree_skb(skb);
- } else
+ } else {
ovs_vport_record_error(vport, VPORT_E_TX_DROPPED);
+ }
return sent;
}