diff options
-rw-r--r-- | drivers/net/geneve.c | 32 | ||||
-rw-r--r-- | drivers/net/vxlan.c | 6 | ||||
-rw-r--r-- | include/net/ip_tunnels.h | 2 | ||||
-rw-r--r-- | include/net/udp_tunnel.h | 3 | ||||
-rw-r--r-- | net/ipv4/fou.c | 16 | ||||
-rw-r--r-- | net/ipv4/ip_gre.c | 20 | ||||
-rw-r--r-- | net/ipv4/ip_tunnel_core.c | 13 | ||||
-rw-r--r-- | net/ipv4/ipip.c | 7 | ||||
-rw-r--r-- | net/ipv6/sit.c | 14 | ||||
-rw-r--r-- | net/netfilter/ipvs/ip_vs_xmit.c | 6 |
10 files changed, 47 insertions, 72 deletions
diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index a9fbf17eb256..efbc7ceedc3a 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c | |||
@@ -696,16 +696,12 @@ static int geneve_build_skb(struct rtable *rt, struct sk_buff *skb, | |||
696 | min_headroom = LL_RESERVED_SPACE(rt->dst.dev) + rt->dst.header_len | 696 | min_headroom = LL_RESERVED_SPACE(rt->dst.dev) + rt->dst.header_len |
697 | + GENEVE_BASE_HLEN + opt_len + sizeof(struct iphdr); | 697 | + GENEVE_BASE_HLEN + opt_len + sizeof(struct iphdr); |
698 | err = skb_cow_head(skb, min_headroom); | 698 | err = skb_cow_head(skb, min_headroom); |
699 | if (unlikely(err)) { | 699 | if (unlikely(err)) |
700 | kfree_skb(skb); | ||
701 | goto free_rt; | 700 | goto free_rt; |
702 | } | ||
703 | 701 | ||
704 | skb = udp_tunnel_handle_offloads(skb, udp_sum); | 702 | err = udp_tunnel_handle_offloads(skb, udp_sum); |
705 | if (IS_ERR(skb)) { | 703 | if (err) |
706 | err = PTR_ERR(skb); | ||
707 | goto free_rt; | 704 | goto free_rt; |
708 | } | ||
709 | 705 | ||
710 | gnvh = (struct genevehdr *)__skb_push(skb, sizeof(*gnvh) + opt_len); | 706 | gnvh = (struct genevehdr *)__skb_push(skb, sizeof(*gnvh) + opt_len); |
711 | geneve_build_header(gnvh, tun_flags, vni, opt_len, opt); | 707 | 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, | |||
733 | min_headroom = LL_RESERVED_SPACE(dst->dev) + dst->header_len | 729 | min_headroom = LL_RESERVED_SPACE(dst->dev) + dst->header_len |
734 | + GENEVE_BASE_HLEN + opt_len + sizeof(struct ipv6hdr); | 730 | + GENEVE_BASE_HLEN + opt_len + sizeof(struct ipv6hdr); |
735 | err = skb_cow_head(skb, min_headroom); | 731 | err = skb_cow_head(skb, min_headroom); |
736 | if (unlikely(err)) { | 732 | if (unlikely(err)) |
737 | kfree_skb(skb); | ||
738 | goto free_dst; | 733 | goto free_dst; |
739 | } | ||
740 | 734 | ||
741 | skb = udp_tunnel_handle_offloads(skb, udp_sum); | 735 | err = udp_tunnel_handle_offloads(skb, udp_sum); |
742 | if (IS_ERR(skb)) { | 736 | if (IS_ERR(skb)) |
743 | err = PTR_ERR(skb); | ||
744 | goto free_dst; | 737 | goto free_dst; |
745 | } | ||
746 | 738 | ||
747 | gnvh = (struct genevehdr *)__skb_push(skb, sizeof(*gnvh) + opt_len); | 739 | gnvh = (struct genevehdr *)__skb_push(skb, sizeof(*gnvh) + opt_len); |
748 | geneve_build_header(gnvh, tun_flags, vni, opt_len, opt); | 740 | 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, | |||
937 | err = geneve_build_skb(rt, skb, key->tun_flags, vni, | 929 | err = geneve_build_skb(rt, skb, key->tun_flags, vni, |
938 | info->options_len, opts, flags, xnet); | 930 | info->options_len, opts, flags, xnet); |
939 | if (unlikely(err)) | 931 | if (unlikely(err)) |
940 | goto err; | 932 | goto tx_error; |
941 | 933 | ||
942 | tos = ip_tunnel_ecn_encap(key->tos, iip, skb); | 934 | tos = ip_tunnel_ecn_encap(key->tos, iip, skb); |
943 | ttl = key->ttl; | 935 | ttl = key->ttl; |
@@ -946,7 +938,7 @@ static netdev_tx_t geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev, | |||
946 | err = geneve_build_skb(rt, skb, 0, geneve->vni, | 938 | err = geneve_build_skb(rt, skb, 0, geneve->vni, |
947 | 0, NULL, flags, xnet); | 939 | 0, NULL, flags, xnet); |
948 | if (unlikely(err)) | 940 | if (unlikely(err)) |
949 | goto err; | 941 | goto tx_error; |
950 | 942 | ||
951 | tos = ip_tunnel_ecn_encap(fl4.flowi4_tos, iip, skb); | 943 | tos = ip_tunnel_ecn_encap(fl4.flowi4_tos, iip, skb); |
952 | ttl = geneve->ttl; | 944 | ttl = geneve->ttl; |
@@ -964,7 +956,7 @@ static netdev_tx_t geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev, | |||
964 | 956 | ||
965 | tx_error: | 957 | tx_error: |
966 | dev_kfree_skb(skb); | 958 | dev_kfree_skb(skb); |
967 | err: | 959 | |
968 | if (err == -ELOOP) | 960 | if (err == -ELOOP) |
969 | dev->stats.collisions++; | 961 | dev->stats.collisions++; |
970 | else if (err == -ENETUNREACH) | 962 | else if (err == -ENETUNREACH) |
@@ -1026,7 +1018,7 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev, | |||
1026 | info->options_len, opts, | 1018 | info->options_len, opts, |
1027 | flags, xnet); | 1019 | flags, xnet); |
1028 | if (unlikely(err)) | 1020 | if (unlikely(err)) |
1029 | goto err; | 1021 | goto tx_error; |
1030 | 1022 | ||
1031 | prio = ip_tunnel_ecn_encap(key->tos, iip, skb); | 1023 | prio = ip_tunnel_ecn_encap(key->tos, iip, skb); |
1032 | ttl = key->ttl; | 1024 | ttl = key->ttl; |
@@ -1035,7 +1027,7 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev, | |||
1035 | err = geneve6_build_skb(dst, skb, 0, geneve->vni, | 1027 | err = geneve6_build_skb(dst, skb, 0, geneve->vni, |
1036 | 0, NULL, flags, xnet); | 1028 | 0, NULL, flags, xnet); |
1037 | if (unlikely(err)) | 1029 | if (unlikely(err)) |
1038 | goto err; | 1030 | goto tx_error; |
1039 | 1031 | ||
1040 | prio = ip_tunnel_ecn_encap(ip6_tclass(fl6.flowlabel), | 1032 | prio = ip_tunnel_ecn_encap(ip6_tclass(fl6.flowlabel), |
1041 | iip, skb); | 1033 | iip, skb); |
@@ -1054,7 +1046,7 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev, | |||
1054 | 1046 | ||
1055 | tx_error: | 1047 | tx_error: |
1056 | dev_kfree_skb(skb); | 1048 | dev_kfree_skb(skb); |
1057 | err: | 1049 | |
1058 | if (err == -ELOOP) | 1050 | if (err == -ELOOP) |
1059 | dev->stats.collisions++; | 1051 | dev->stats.collisions++; |
1060 | else if (err == -ENETUNREACH) | 1052 | else if (err == -ENETUNREACH) |
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index a7112b3bc9b4..c2e22c2532a1 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
@@ -1797,9 +1797,9 @@ static int vxlan_build_skb(struct sk_buff *skb, struct dst_entry *dst, | |||
1797 | if (WARN_ON(!skb)) | 1797 | if (WARN_ON(!skb)) |
1798 | return -ENOMEM; | 1798 | return -ENOMEM; |
1799 | 1799 | ||
1800 | skb = iptunnel_handle_offloads(skb, type); | 1800 | err = iptunnel_handle_offloads(skb, type); |
1801 | if (IS_ERR(skb)) | 1801 | if (err) |
1802 | return PTR_ERR(skb); | 1802 | goto out_free; |
1803 | 1803 | ||
1804 | vxh = (struct vxlanhdr *) __skb_push(skb, sizeof(*vxh)); | 1804 | vxh = (struct vxlanhdr *) __skb_push(skb, sizeof(*vxh)); |
1805 | vxh->vx_flags = VXLAN_HF_VNI; | 1805 | vxh->vx_flags = VXLAN_HF_VNI; |
diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h index 9ae9fbbccd67..6d790910ebdf 100644 --- a/include/net/ip_tunnels.h +++ b/include/net/ip_tunnels.h | |||
@@ -309,7 +309,7 @@ void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb, | |||
309 | struct metadata_dst *iptunnel_metadata_reply(struct metadata_dst *md, | 309 | struct metadata_dst *iptunnel_metadata_reply(struct metadata_dst *md, |
310 | gfp_t flags); | 310 | gfp_t flags); |
311 | 311 | ||
312 | struct sk_buff *iptunnel_handle_offloads(struct sk_buff *skb, int gso_type_mask); | 312 | int iptunnel_handle_offloads(struct sk_buff *skb, int gso_type_mask); |
313 | 313 | ||
314 | static inline int iptunnel_pull_offloads(struct sk_buff *skb) | 314 | static inline int iptunnel_pull_offloads(struct sk_buff *skb) |
315 | { | 315 | { |
diff --git a/include/net/udp_tunnel.h b/include/net/udp_tunnel.h index 2dcf1de948ac..4f543262dd81 100644 --- a/include/net/udp_tunnel.h +++ b/include/net/udp_tunnel.h | |||
@@ -105,8 +105,7 @@ struct metadata_dst *udp_tun_rx_dst(struct sk_buff *skb, unsigned short family, | |||
105 | __be16 flags, __be64 tunnel_id, | 105 | __be16 flags, __be64 tunnel_id, |
106 | int md_size); | 106 | int md_size); |
107 | 107 | ||
108 | static inline struct sk_buff *udp_tunnel_handle_offloads(struct sk_buff *skb, | 108 | static inline int udp_tunnel_handle_offloads(struct sk_buff *skb, bool udp_csum) |
109 | bool udp_csum) | ||
110 | { | 109 | { |
111 | int type = udp_csum ? SKB_GSO_UDP_TUNNEL_CSUM : SKB_GSO_UDP_TUNNEL; | 110 | int type = udp_csum ? SKB_GSO_UDP_TUNNEL_CSUM : SKB_GSO_UDP_TUNNEL; |
112 | 111 | ||
diff --git a/net/ipv4/fou.c b/net/ipv4/fou.c index d039f8fff57f..7ac5ec87b004 100644 --- a/net/ipv4/fou.c +++ b/net/ipv4/fou.c | |||
@@ -802,11 +802,11 @@ int fou_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e, | |||
802 | int type = e->flags & TUNNEL_ENCAP_FLAG_CSUM ? SKB_GSO_UDP_TUNNEL_CSUM : | 802 | int type = e->flags & TUNNEL_ENCAP_FLAG_CSUM ? SKB_GSO_UDP_TUNNEL_CSUM : |
803 | SKB_GSO_UDP_TUNNEL; | 803 | SKB_GSO_UDP_TUNNEL; |
804 | __be16 sport; | 804 | __be16 sport; |
805 | int err; | ||
805 | 806 | ||
806 | skb = iptunnel_handle_offloads(skb, type); | 807 | err = iptunnel_handle_offloads(skb, type); |
807 | 808 | if (err) | |
808 | if (IS_ERR(skb)) | 809 | return err; |
809 | return PTR_ERR(skb); | ||
810 | 810 | ||
811 | sport = e->sport ? : udp_flow_src_port(dev_net(skb->dev), | 811 | sport = e->sport ? : udp_flow_src_port(dev_net(skb->dev), |
812 | skb, 0, 0, false); | 812 | skb, 0, 0, false); |
@@ -826,6 +826,7 @@ int gue_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e, | |||
826 | __be16 sport; | 826 | __be16 sport; |
827 | void *data; | 827 | void *data; |
828 | bool need_priv = false; | 828 | bool need_priv = false; |
829 | int err; | ||
829 | 830 | ||
830 | if ((e->flags & TUNNEL_ENCAP_FLAG_REMCSUM) && | 831 | if ((e->flags & TUNNEL_ENCAP_FLAG_REMCSUM) && |
831 | skb->ip_summed == CHECKSUM_PARTIAL) { | 832 | skb->ip_summed == CHECKSUM_PARTIAL) { |
@@ -836,10 +837,9 @@ int gue_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e, | |||
836 | 837 | ||
837 | optlen += need_priv ? GUE_LEN_PRIV : 0; | 838 | optlen += need_priv ? GUE_LEN_PRIV : 0; |
838 | 839 | ||
839 | skb = iptunnel_handle_offloads(skb, type); | 840 | err = iptunnel_handle_offloads(skb, type); |
840 | 841 | if (err) | |
841 | if (IS_ERR(skb)) | 842 | return err; |
842 | return PTR_ERR(skb); | ||
843 | 843 | ||
844 | /* Get source port (based on flow hash) before skb_push */ | 844 | /* Get source port (based on flow hash) before skb_push */ |
845 | sport = e->sport ? : udp_flow_src_port(dev_net(skb->dev), | 845 | sport = e->sport ? : udp_flow_src_port(dev_net(skb->dev), |
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index af5d1f38217f..eedd829a2f87 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c | |||
@@ -500,8 +500,7 @@ static void __gre_xmit(struct sk_buff *skb, struct net_device *dev, | |||
500 | ip_tunnel_xmit(skb, dev, tnl_params, tnl_params->protocol); | 500 | ip_tunnel_xmit(skb, dev, tnl_params, tnl_params->protocol); |
501 | } | 501 | } |
502 | 502 | ||
503 | static struct sk_buff *gre_handle_offloads(struct sk_buff *skb, | 503 | static int gre_handle_offloads(struct sk_buff *skb, bool csum) |
504 | bool csum) | ||
505 | { | 504 | { |
506 | return iptunnel_handle_offloads(skb, csum ? SKB_GSO_GRE_CSUM : SKB_GSO_GRE); | 505 | return iptunnel_handle_offloads(skb, csum ? SKB_GSO_GRE_CSUM : SKB_GSO_GRE); |
507 | } | 506 | } |
@@ -568,11 +567,8 @@ static void gre_fb_xmit(struct sk_buff *skb, struct net_device *dev) | |||
568 | } | 567 | } |
569 | 568 | ||
570 | /* Push Tunnel header. */ | 569 | /* Push Tunnel header. */ |
571 | skb = gre_handle_offloads(skb, !!(tun_info->key.tun_flags & TUNNEL_CSUM)); | 570 | if (gre_handle_offloads(skb, !!(tun_info->key.tun_flags & TUNNEL_CSUM))) |
572 | if (IS_ERR(skb)) { | ||
573 | skb = NULL; | ||
574 | goto err_free_rt; | 571 | goto err_free_rt; |
575 | } | ||
576 | 572 | ||
577 | flags = tun_info->key.tun_flags & (TUNNEL_CSUM | TUNNEL_KEY); | 573 | flags = tun_info->key.tun_flags & (TUNNEL_CSUM | TUNNEL_KEY); |
578 | build_header(skb, tunnel_hlen, flags, htons(ETH_P_TEB), | 574 | build_header(skb, tunnel_hlen, flags, htons(ETH_P_TEB), |
@@ -640,16 +636,14 @@ static netdev_tx_t ipgre_xmit(struct sk_buff *skb, | |||
640 | tnl_params = &tunnel->parms.iph; | 636 | tnl_params = &tunnel->parms.iph; |
641 | } | 637 | } |
642 | 638 | ||
643 | skb = gre_handle_offloads(skb, !!(tunnel->parms.o_flags&TUNNEL_CSUM)); | 639 | if (gre_handle_offloads(skb, !!(tunnel->parms.o_flags & TUNNEL_CSUM))) |
644 | if (IS_ERR(skb)) | 640 | goto free_skb; |
645 | goto out; | ||
646 | 641 | ||
647 | __gre_xmit(skb, dev, tnl_params, skb->protocol); | 642 | __gre_xmit(skb, dev, tnl_params, skb->protocol); |
648 | return NETDEV_TX_OK; | 643 | return NETDEV_TX_OK; |
649 | 644 | ||
650 | free_skb: | 645 | free_skb: |
651 | kfree_skb(skb); | 646 | kfree_skb(skb); |
652 | out: | ||
653 | dev->stats.tx_dropped++; | 647 | dev->stats.tx_dropped++; |
654 | return NETDEV_TX_OK; | 648 | return NETDEV_TX_OK; |
655 | } | 649 | } |
@@ -664,9 +658,8 @@ static netdev_tx_t gre_tap_xmit(struct sk_buff *skb, | |||
664 | return NETDEV_TX_OK; | 658 | return NETDEV_TX_OK; |
665 | } | 659 | } |
666 | 660 | ||
667 | skb = gre_handle_offloads(skb, !!(tunnel->parms.o_flags&TUNNEL_CSUM)); | 661 | if (gre_handle_offloads(skb, !!(tunnel->parms.o_flags & TUNNEL_CSUM))) |
668 | if (IS_ERR(skb)) | 662 | goto free_skb; |
669 | goto out; | ||
670 | 663 | ||
671 | if (skb_cow_head(skb, dev->needed_headroom)) | 664 | if (skb_cow_head(skb, dev->needed_headroom)) |
672 | goto free_skb; | 665 | goto free_skb; |
@@ -676,7 +669,6 @@ static netdev_tx_t gre_tap_xmit(struct sk_buff *skb, | |||
676 | 669 | ||
677 | free_skb: | 670 | free_skb: |
678 | kfree_skb(skb); | 671 | kfree_skb(skb); |
679 | out: | ||
680 | dev->stats.tx_dropped++; | 672 | dev->stats.tx_dropped++; |
681 | return NETDEV_TX_OK; | 673 | return NETDEV_TX_OK; |
682 | } | 674 | } |
diff --git a/net/ipv4/ip_tunnel_core.c b/net/ipv4/ip_tunnel_core.c index 43445df61efd..f46c5c873831 100644 --- a/net/ipv4/ip_tunnel_core.c +++ b/net/ipv4/ip_tunnel_core.c | |||
@@ -146,8 +146,8 @@ struct metadata_dst *iptunnel_metadata_reply(struct metadata_dst *md, | |||
146 | } | 146 | } |
147 | EXPORT_SYMBOL_GPL(iptunnel_metadata_reply); | 147 | EXPORT_SYMBOL_GPL(iptunnel_metadata_reply); |
148 | 148 | ||
149 | struct sk_buff *iptunnel_handle_offloads(struct sk_buff *skb, | 149 | int iptunnel_handle_offloads(struct sk_buff *skb, |
150 | int gso_type_mask) | 150 | int gso_type_mask) |
151 | { | 151 | { |
152 | int err; | 152 | int err; |
153 | 153 | ||
@@ -159,9 +159,9 @@ struct sk_buff *iptunnel_handle_offloads(struct sk_buff *skb, | |||
159 | if (skb_is_gso(skb)) { | 159 | if (skb_is_gso(skb)) { |
160 | err = skb_unclone(skb, GFP_ATOMIC); | 160 | err = skb_unclone(skb, GFP_ATOMIC); |
161 | if (unlikely(err)) | 161 | if (unlikely(err)) |
162 | goto error; | 162 | return err; |
163 | skb_shinfo(skb)->gso_type |= gso_type_mask; | 163 | skb_shinfo(skb)->gso_type |= gso_type_mask; |
164 | return skb; | 164 | return 0; |
165 | } | 165 | } |
166 | 166 | ||
167 | if (skb->ip_summed != CHECKSUM_PARTIAL) { | 167 | if (skb->ip_summed != CHECKSUM_PARTIAL) { |
@@ -174,10 +174,7 @@ struct sk_buff *iptunnel_handle_offloads(struct sk_buff *skb, | |||
174 | skb->encapsulation = 0; | 174 | skb->encapsulation = 0; |
175 | } | 175 | } |
176 | 176 | ||
177 | return skb; | 177 | return 0; |
178 | error: | ||
179 | kfree_skb(skb); | ||
180 | return ERR_PTR(err); | ||
181 | } | 178 | } |
182 | EXPORT_SYMBOL_GPL(iptunnel_handle_offloads); | 179 | EXPORT_SYMBOL_GPL(iptunnel_handle_offloads); |
183 | 180 | ||
diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c index ec51d02166de..92827483ee3d 100644 --- a/net/ipv4/ipip.c +++ b/net/ipv4/ipip.c | |||
@@ -219,9 +219,8 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
219 | if (unlikely(skb->protocol != htons(ETH_P_IP))) | 219 | if (unlikely(skb->protocol != htons(ETH_P_IP))) |
220 | goto tx_error; | 220 | goto tx_error; |
221 | 221 | ||
222 | skb = iptunnel_handle_offloads(skb, SKB_GSO_IPIP); | 222 | if (iptunnel_handle_offloads(skb, SKB_GSO_IPIP)) |
223 | if (IS_ERR(skb)) | 223 | goto tx_error; |
224 | goto out; | ||
225 | 224 | ||
226 | skb_set_inner_ipproto(skb, IPPROTO_IPIP); | 225 | skb_set_inner_ipproto(skb, IPPROTO_IPIP); |
227 | 226 | ||
@@ -230,7 +229,7 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
230 | 229 | ||
231 | tx_error: | 230 | tx_error: |
232 | kfree_skb(skb); | 231 | kfree_skb(skb); |
233 | out: | 232 | |
234 | dev->stats.tx_errors++; | 233 | dev->stats.tx_errors++; |
235 | return NETDEV_TX_OK; | 234 | return NETDEV_TX_OK; |
236 | } | 235 | } |
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index 83384308d032..a13d8c114ccb 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
@@ -913,10 +913,9 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb, | |||
913 | goto tx_error; | 913 | goto tx_error; |
914 | } | 914 | } |
915 | 915 | ||
916 | skb = iptunnel_handle_offloads(skb, SKB_GSO_SIT); | 916 | if (iptunnel_handle_offloads(skb, SKB_GSO_SIT)) { |
917 | if (IS_ERR(skb)) { | ||
918 | ip_rt_put(rt); | 917 | ip_rt_put(rt); |
919 | goto out; | 918 | goto tx_error; |
920 | } | 919 | } |
921 | 920 | ||
922 | if (df) { | 921 | if (df) { |
@@ -992,7 +991,6 @@ tx_error_icmp: | |||
992 | dst_link_failure(skb); | 991 | dst_link_failure(skb); |
993 | tx_error: | 992 | tx_error: |
994 | kfree_skb(skb); | 993 | kfree_skb(skb); |
995 | out: | ||
996 | dev->stats.tx_errors++; | 994 | dev->stats.tx_errors++; |
997 | return NETDEV_TX_OK; | 995 | return NETDEV_TX_OK; |
998 | } | 996 | } |
@@ -1002,15 +1000,15 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1002 | struct ip_tunnel *tunnel = netdev_priv(dev); | 1000 | struct ip_tunnel *tunnel = netdev_priv(dev); |
1003 | const struct iphdr *tiph = &tunnel->parms.iph; | 1001 | const struct iphdr *tiph = &tunnel->parms.iph; |
1004 | 1002 | ||
1005 | skb = iptunnel_handle_offloads(skb, SKB_GSO_IPIP); | 1003 | if (iptunnel_handle_offloads(skb, SKB_GSO_IPIP)) |
1006 | if (IS_ERR(skb)) | 1004 | goto tx_error; |
1007 | goto out; | ||
1008 | 1005 | ||
1009 | skb_set_inner_ipproto(skb, IPPROTO_IPIP); | 1006 | skb_set_inner_ipproto(skb, IPPROTO_IPIP); |
1010 | 1007 | ||
1011 | ip_tunnel_xmit(skb, dev, tiph, IPPROTO_IPIP); | 1008 | ip_tunnel_xmit(skb, dev, tiph, IPPROTO_IPIP); |
1012 | return NETDEV_TX_OK; | 1009 | return NETDEV_TX_OK; |
1013 | out: | 1010 | tx_error: |
1011 | kfree_skb(skb); | ||
1014 | dev->stats.tx_errors++; | 1012 | dev->stats.tx_errors++; |
1015 | return NETDEV_TX_OK; | 1013 | return NETDEV_TX_OK; |
1016 | } | 1014 | } |
diff --git a/net/netfilter/ipvs/ip_vs_xmit.c b/net/netfilter/ipvs/ip_vs_xmit.c index dc196a0f501d..6d19d2eeaa60 100644 --- a/net/netfilter/ipvs/ip_vs_xmit.c +++ b/net/netfilter/ipvs/ip_vs_xmit.c | |||
@@ -1013,8 +1013,7 @@ ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
1013 | if (IS_ERR(skb)) | 1013 | if (IS_ERR(skb)) |
1014 | goto tx_error; | 1014 | goto tx_error; |
1015 | 1015 | ||
1016 | skb = iptunnel_handle_offloads(skb, __tun_gso_type_mask(AF_INET, cp->af)); | 1016 | if (iptunnel_handle_offloads(skb, __tun_gso_type_mask(AF_INET, cp->af))) |
1017 | if (IS_ERR(skb)) | ||
1018 | goto tx_error; | 1017 | goto tx_error; |
1019 | 1018 | ||
1020 | skb->transport_header = skb->network_header; | 1019 | skb->transport_header = skb->network_header; |
@@ -1105,8 +1104,7 @@ ip_vs_tunnel_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
1105 | if (IS_ERR(skb)) | 1104 | if (IS_ERR(skb)) |
1106 | goto tx_error; | 1105 | goto tx_error; |
1107 | 1106 | ||
1108 | skb = iptunnel_handle_offloads(skb, __tun_gso_type_mask(AF_INET6, cp->af)); | 1107 | if (iptunnel_handle_offloads(skb, __tun_gso_type_mask(AF_INET6, cp->af))) |
1109 | if (IS_ERR(skb)) | ||
1110 | goto tx_error; | 1108 | goto tx_error; |
1111 | 1109 | ||
1112 | skb->transport_header = skb->network_header; | 1110 | skb->transport_header = skb->network_header; |