return ret;
 }
 
+static void netpoll_udp_checksum(struct netpoll *np, struct sk_buff *skb,
+                                int len)
+{
+       struct udphdr *udph;
+       int udp_len;
+
+       udp_len = len + sizeof(struct udphdr);
+       udph = udp_hdr(skb);
+
+       /* check needs to be set, since it will be consumed in csum_partial */
+       udph->check = 0;
+       if (np->ipv6)
+               udph->check = csum_ipv6_magic(&np->local_ip.in6,
+                                             &np->remote_ip.in6,
+                                             udp_len, IPPROTO_UDP,
+                                             csum_partial(udph, udp_len, 0));
+       else
+               udph->check = csum_tcpudp_magic(np->local_ip.ip,
+                                               np->remote_ip.ip,
+                                               udp_len, IPPROTO_UDP,
+                                               csum_partial(udph, udp_len, 0));
+       if (udph->check == 0)
+               udph->check = CSUM_MANGLED_0;
+}
+
 netdev_tx_t netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
 {
        unsigned long flags;
        udph->dest = htons(np->remote_port);
        udph->len = htons(udp_len);
 
-       udph->check = 0;
+       netpoll_udp_checksum(np, skb, len);
        if (np->ipv6) {
-               udph->check = csum_ipv6_magic(&np->local_ip.in6,
-                                             &np->remote_ip.in6,
-                                             udp_len, IPPROTO_UDP,
-                                             csum_partial(udph, udp_len, 0));
-               if (udph->check == 0)
-                       udph->check = CSUM_MANGLED_0;
-
                skb_push(skb, sizeof(struct ipv6hdr));
                skb_reset_network_header(skb);
                ip6h = ipv6_hdr(skb);
                skb_reset_mac_header(skb);
                skb->protocol = eth->h_proto = htons(ETH_P_IPV6);
        } else {
-               udph->check = csum_tcpudp_magic(np->local_ip.ip,
-                                               np->remote_ip.ip,
-                                               udp_len, IPPROTO_UDP,
-                                               csum_partial(udph, udp_len, 0));
-               if (udph->check == 0)
-                       udph->check = CSUM_MANGLED_0;
-
                skb_push(skb, sizeof(struct iphdr));
                skb_reset_network_header(skb);
                iph = ip_hdr(skb);