skb_set_inner_protocol(skb, htons(ETH_P_TEB));
 
-       udp_tunnel6_xmit_skb(vs->sock, dst, skb, dev, saddr, daddr, prio,
-                            ttl, src_port, dst_port);
+       udp_tunnel6_xmit_skb(dst, skb, dev, saddr, daddr, prio,
+                            ttl, src_port, dst_port,
+                            udp_get_no_check6_tx(vs->sock->sk));
        return 0;
 err:
        dst_release(dst);
 
        skb_set_inner_protocol(skb, htons(ETH_P_TEB));
 
-       return udp_tunnel_xmit_skb(vs->sock, rt, skb, src, dst, tos,
-                                  ttl, df, src_port, dst_port, xnet);
+       return udp_tunnel_xmit_skb(rt, skb, src, dst, tos,
+                                  ttl, df, src_port, dst_port, xnet,
+                                  vs->sock->sk->sk_no_check_tx);
 }
 EXPORT_SYMBOL_GPL(vxlan_xmit_skb);
 
 
                           struct udp_tunnel_sock_cfg *sock_cfg);
 
 /* Transmit the skb using UDP encapsulation. */
-int udp_tunnel_xmit_skb(struct socket *sock, struct rtable *rt,
-                       struct sk_buff *skb, __be32 src, __be32 dst,
-                       __u8 tos, __u8 ttl, __be16 df, __be16 src_port,
-                       __be16 dst_port, bool xnet);
+int udp_tunnel_xmit_skb(struct rtable *rt, struct sk_buff *skb,
+                       __be32 src, __be32 dst, __u8 tos, __u8 ttl,
+                       __be16 df, __be16 src_port, __be16 dst_port,
+                       bool xnet, bool nocheck);
 
 #if IS_ENABLED(CONFIG_IPV6)
-int udp_tunnel6_xmit_skb(struct socket *sock, struct dst_entry *dst,
-                        struct sk_buff *skb, struct net_device *dev,
-                        struct in6_addr *saddr, struct in6_addr *daddr,
+int udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sk_buff *skb,
+                        struct net_device *dev, struct in6_addr *saddr,
+                        struct in6_addr *daddr,
                         __u8 prio, __u8 ttl, __be16 src_port,
-                        __be16 dst_port);
+                        __be16 dst_port, bool nocheck);
 #endif
 
 void udp_tunnel_sock_release(struct socket *sock);
 
 
        skb_set_inner_protocol(skb, htons(ETH_P_TEB));
 
-       return udp_tunnel_xmit_skb(gs->sock, rt, skb, src, dst,
-                                  tos, ttl, df, src_port, dst_port, xnet);
+       return udp_tunnel_xmit_skb(rt, skb, src, dst,
+                                  tos, ttl, df, src_port, dst_port, xnet,
+                                  gs->sock->sk->sk_no_check_tx);
 }
 EXPORT_SYMBOL_GPL(geneve_xmit_skb);
 
 
 }
 EXPORT_SYMBOL_GPL(setup_udp_tunnel_sock);
 
-int udp_tunnel_xmit_skb(struct socket *sock, struct rtable *rt,
-                       struct sk_buff *skb, __be32 src, __be32 dst,
-                       __u8 tos, __u8 ttl, __be16 df, __be16 src_port,
-                       __be16 dst_port, bool xnet)
+int udp_tunnel_xmit_skb(struct rtable *rt, struct sk_buff *skb,
+                       __be32 src, __be32 dst, __u8 tos, __u8 ttl,
+                       __be16 df, __be16 src_port, __be16 dst_port,
+                       bool xnet, bool nocheck)
 {
        struct udphdr *uh;
 
        uh->source = src_port;
        uh->len = htons(skb->len);
 
-       udp_set_csum(sock->sk->sk_no_check_tx, skb, src, dst, skb->len);
+       udp_set_csum(nocheck, skb, src, dst, skb->len);
 
-       return iptunnel_xmit(sock->sk, rt, skb, src, dst, IPPROTO_UDP,
+       return iptunnel_xmit(skb->sk, rt, skb, src, dst, IPPROTO_UDP,
                             tos, ttl, df, xnet);
 }
 EXPORT_SYMBOL_GPL(udp_tunnel_xmit_skb);
 
 }
 EXPORT_SYMBOL_GPL(udp_sock_create6);
 
-int udp_tunnel6_xmit_skb(struct socket *sock, struct dst_entry *dst,
-                        struct sk_buff *skb, struct net_device *dev,
-                        struct in6_addr *saddr, struct in6_addr *daddr,
-                        __u8 prio, __u8 ttl, __be16 src_port, __be16 dst_port)
+int udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sk_buff *skb,
+                        struct net_device *dev, struct in6_addr *saddr,
+                        struct in6_addr *daddr,
+                        __u8 prio, __u8 ttl, __be16 src_port,
+                        __be16 dst_port, bool nocheck)
 {
        struct udphdr *uh;
        struct ipv6hdr *ip6h;
-       struct sock *sk = sock->sk;
 
        __skb_push(skb, sizeof(*uh));
        skb_reset_transport_header(skb);
                            | IPSKB_REROUTED);
        skb_dst_set(skb, dst);
 
-       udp6_set_csum(udp_get_no_check6_tx(sk), skb, saddr, daddr, skb->len);
+       udp6_set_csum(nocheck, skb, saddr, daddr, skb->len);
 
        __skb_push(skb, sizeof(*ip6h));
        skb_reset_network_header(skb);