|
@@ -696,16 +696,12 @@ static int geneve_build_skb(struct rtable *rt, struct sk_buff *skb,
|
|
min_headroom = LL_RESERVED_SPACE(rt->dst.dev) + rt->dst.header_len
|
|
min_headroom = LL_RESERVED_SPACE(rt->dst.dev) + rt->dst.header_len
|
|
+ GENEVE_BASE_HLEN + opt_len + sizeof(struct iphdr);
|
|
+ GENEVE_BASE_HLEN + opt_len + sizeof(struct iphdr);
|
|
err = skb_cow_head(skb, min_headroom);
|
|
err = skb_cow_head(skb, min_headroom);
|
|
- if (unlikely(err)) {
|
|
|
|
- kfree_skb(skb);
|
|
|
|
|
|
+ if (unlikely(err))
|
|
goto free_rt;
|
|
goto free_rt;
|
|
- }
|
|
|
|
|
|
|
|
- skb = udp_tunnel_handle_offloads(skb, udp_sum);
|
|
|
|
- if (IS_ERR(skb)) {
|
|
|
|
- err = PTR_ERR(skb);
|
|
|
|
|
|
+ err = udp_tunnel_handle_offloads(skb, udp_sum);
|
|
|
|
+ if (err)
|
|
goto free_rt;
|
|
goto free_rt;
|
|
- }
|
|
|
|
|
|
|
|
gnvh = (struct genevehdr *)__skb_push(skb, sizeof(*gnvh) + opt_len);
|
|
gnvh = (struct genevehdr *)__skb_push(skb, sizeof(*gnvh) + opt_len);
|
|
geneve_build_header(gnvh, tun_flags, vni, opt_len, opt);
|
|
geneve_build_header(gnvh, tun_flags, vni, opt_len, opt);
|
|
@@ -733,16 +729,12 @@ static int geneve6_build_skb(struct dst_entry *dst, struct sk_buff *skb,
|
|
min_headroom = LL_RESERVED_SPACE(dst->dev) + dst->header_len
|
|
min_headroom = LL_RESERVED_SPACE(dst->dev) + dst->header_len
|
|
+ GENEVE_BASE_HLEN + opt_len + sizeof(struct ipv6hdr);
|
|
+ GENEVE_BASE_HLEN + opt_len + sizeof(struct ipv6hdr);
|
|
err = skb_cow_head(skb, min_headroom);
|
|
err = skb_cow_head(skb, min_headroom);
|
|
- if (unlikely(err)) {
|
|
|
|
- kfree_skb(skb);
|
|
|
|
|
|
+ if (unlikely(err))
|
|
goto free_dst;
|
|
goto free_dst;
|
|
- }
|
|
|
|
|
|
|
|
- skb = udp_tunnel_handle_offloads(skb, udp_sum);
|
|
|
|
- if (IS_ERR(skb)) {
|
|
|
|
- err = PTR_ERR(skb);
|
|
|
|
|
|
+ err = udp_tunnel_handle_offloads(skb, udp_sum);
|
|
|
|
+ if (IS_ERR(skb))
|
|
goto free_dst;
|
|
goto free_dst;
|
|
- }
|
|
|
|
|
|
|
|
gnvh = (struct genevehdr *)__skb_push(skb, sizeof(*gnvh) + opt_len);
|
|
gnvh = (struct genevehdr *)__skb_push(skb, sizeof(*gnvh) + opt_len);
|
|
geneve_build_header(gnvh, tun_flags, vni, opt_len, opt);
|
|
geneve_build_header(gnvh, tun_flags, vni, opt_len, opt);
|
|
@@ -937,7 +929,7 @@ static netdev_tx_t geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
|
|
err = geneve_build_skb(rt, skb, key->tun_flags, vni,
|
|
err = geneve_build_skb(rt, skb, key->tun_flags, vni,
|
|
info->options_len, opts, flags, xnet);
|
|
info->options_len, opts, flags, xnet);
|
|
if (unlikely(err))
|
|
if (unlikely(err))
|
|
- goto err;
|
|
|
|
|
|
+ goto tx_error;
|
|
|
|
|
|
tos = ip_tunnel_ecn_encap(key->tos, iip, skb);
|
|
tos = ip_tunnel_ecn_encap(key->tos, iip, skb);
|
|
ttl = key->ttl;
|
|
ttl = key->ttl;
|
|
@@ -946,7 +938,7 @@ static netdev_tx_t geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
|
|
err = geneve_build_skb(rt, skb, 0, geneve->vni,
|
|
err = geneve_build_skb(rt, skb, 0, geneve->vni,
|
|
0, NULL, flags, xnet);
|
|
0, NULL, flags, xnet);
|
|
if (unlikely(err))
|
|
if (unlikely(err))
|
|
- goto err;
|
|
|
|
|
|
+ goto tx_error;
|
|
|
|
|
|
tos = ip_tunnel_ecn_encap(fl4.flowi4_tos, iip, skb);
|
|
tos = ip_tunnel_ecn_encap(fl4.flowi4_tos, iip, skb);
|
|
ttl = geneve->ttl;
|
|
ttl = geneve->ttl;
|
|
@@ -964,7 +956,7 @@ static netdev_tx_t geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
|
|
|
|
|
|
tx_error:
|
|
tx_error:
|
|
dev_kfree_skb(skb);
|
|
dev_kfree_skb(skb);
|
|
-err:
|
|
|
|
|
|
+
|
|
if (err == -ELOOP)
|
|
if (err == -ELOOP)
|
|
dev->stats.collisions++;
|
|
dev->stats.collisions++;
|
|
else if (err == -ENETUNREACH)
|
|
else if (err == -ENETUNREACH)
|
|
@@ -1026,7 +1018,7 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
|
|
info->options_len, opts,
|
|
info->options_len, opts,
|
|
flags, xnet);
|
|
flags, xnet);
|
|
if (unlikely(err))
|
|
if (unlikely(err))
|
|
- goto err;
|
|
|
|
|
|
+ goto tx_error;
|
|
|
|
|
|
prio = ip_tunnel_ecn_encap(key->tos, iip, skb);
|
|
prio = ip_tunnel_ecn_encap(key->tos, iip, skb);
|
|
ttl = key->ttl;
|
|
ttl = key->ttl;
|
|
@@ -1035,7 +1027,7 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
|
|
err = geneve6_build_skb(dst, skb, 0, geneve->vni,
|
|
err = geneve6_build_skb(dst, skb, 0, geneve->vni,
|
|
0, NULL, flags, xnet);
|
|
0, NULL, flags, xnet);
|
|
if (unlikely(err))
|
|
if (unlikely(err))
|
|
- goto err;
|
|
|
|
|
|
+ goto tx_error;
|
|
|
|
|
|
prio = ip_tunnel_ecn_encap(ip6_tclass(fl6.flowlabel),
|
|
prio = ip_tunnel_ecn_encap(ip6_tclass(fl6.flowlabel),
|
|
iip, skb);
|
|
iip, skb);
|
|
@@ -1054,7 +1046,7 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
|
|
|
|
|
|
tx_error:
|
|
tx_error:
|
|
dev_kfree_skb(skb);
|
|
dev_kfree_skb(skb);
|
|
-err:
|
|
|
|
|
|
+
|
|
if (err == -ELOOP)
|
|
if (err == -ELOOP)
|
|
dev->stats.collisions++;
|
|
dev->stats.collisions++;
|
|
else if (err == -ENETUNREACH)
|
|
else if (err == -ENETUNREACH)
|