static void udp6_hwcsum_outgoing ( struct sock * sk , struct sk_buff * skb , const struct in6_addr * saddr , const struct in6_addr * daddr , int len ) {
 unsigned int offset ;
 struct udphdr * uh = udp_hdr ( skb ) ;
 __wsum csum = 0 ;
 if ( skb_queue_len ( & sk -> sk_write_queue ) == 1 ) {
 skb -> csum_start = skb_transport_header ( skb ) - skb -> head ;
 skb -> csum_offset = offsetof ( struct udphdr , check ) ;
 uh -> check = ~ csum_ipv6_magic ( saddr , daddr , len , IPPROTO_UDP , 0 ) ;
 }
 else {
 offset = skb_transport_offset ( skb ) ;
 skb -> csum = skb_checksum ( skb , offset , skb -> len - offset , 0 ) ;
 skb -> ip_summed = CHECKSUM_NONE ;
 skb_queue_walk ( & sk -> sk_write_queue , skb ) {
 csum = csum_add ( csum , skb -> csum ) ;
 }
 uh -> check = csum_ipv6_magic ( saddr , daddr , len , IPPROTO_UDP , csum ) ;
 if ( uh -> check == 0 ) uh -> check = CSUM_MANGLED_0 ;
 }
 }
static void udp6_hwcsum_outgoing ( struct sock * sk , struct sk_buff * skb , const struct in6_addr * saddr , const struct in6_addr * daddr , int len ) {
 unsigned int offset ;
 struct udphdr * uh = udp_hdr ( skb ) ;
 __wsum csum = 0 ;
 if ( skb_queue_len ( & sk -> sk_write_queue ) == 1 ) {
 skb -> csum_start = skb_transport_header ( skb ) - skb -> head ;
 skb -> csum_offset = offsetof ( struct udphdr , check ) ;
 uh -> check = ~ csum_ipv6_magic ( saddr , daddr , len , IPPROTO_UDP , 0 ) ;
 }
 else {
 offset = skb_transport_offset ( skb ) ;
 skb -> csum = skb_checksum ( skb , offset , skb -> len - offset , 0 ) ;
 skb -> ip_summed = CHECKSUM_NONE ;
 skb_queue_walk ( & sk -> sk_write_queue , skb ) {
 csum = csum_add ( csum , skb -> csum ) ;
 }
 uh -> check = csum_ipv6_magic ( saddr , daddr , len , IPPROTO_UDP , csum ) ;
 if ( uh -> check == 0 ) uh -> check = CSUM_MANGLED_0 ;
 }
 }