Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ipv6: move csum_ipv6_magic() and udp6_csum_init() into static library

As suggested by David, udp6_csum_init() is too big to be inlined,
move it to ipv6 static library, net/ipv6/ip6_checksum.c.

And the generic csum_ipv6_magic() too.

Cc: David S. Miller <davem@davemloft.net>
Signed-off-by: Cong Wang <amwang@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Cong Wang and committed by
David S. Miller
acb3e041 b7394d24

+103 -92
+5 -57
include/net/ip6_checksum.h
··· 35 35 #include <linux/ipv6.h> 36 36 37 37 #ifndef _HAVE_ARCH_IPV6_CSUM 38 - 39 - static __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr, 40 - const struct in6_addr *daddr, 41 - __u32 len, unsigned short proto, 42 - __wsum csum) 43 - { 44 - 45 - int carry; 46 - __u32 ulen; 47 - __u32 uproto; 48 - __u32 sum = (__force u32)csum; 49 - 50 - sum += (__force u32)saddr->s6_addr32[0]; 51 - carry = (sum < (__force u32)saddr->s6_addr32[0]); 52 - sum += carry; 53 - 54 - sum += (__force u32)saddr->s6_addr32[1]; 55 - carry = (sum < (__force u32)saddr->s6_addr32[1]); 56 - sum += carry; 57 - 58 - sum += (__force u32)saddr->s6_addr32[2]; 59 - carry = (sum < (__force u32)saddr->s6_addr32[2]); 60 - sum += carry; 61 - 62 - sum += (__force u32)saddr->s6_addr32[3]; 63 - carry = (sum < (__force u32)saddr->s6_addr32[3]); 64 - sum += carry; 65 - 66 - sum += (__force u32)daddr->s6_addr32[0]; 67 - carry = (sum < (__force u32)daddr->s6_addr32[0]); 68 - sum += carry; 69 - 70 - sum += (__force u32)daddr->s6_addr32[1]; 71 - carry = (sum < (__force u32)daddr->s6_addr32[1]); 72 - sum += carry; 73 - 74 - sum += (__force u32)daddr->s6_addr32[2]; 75 - carry = (sum < (__force u32)daddr->s6_addr32[2]); 76 - sum += carry; 77 - 78 - sum += (__force u32)daddr->s6_addr32[3]; 79 - carry = (sum < (__force u32)daddr->s6_addr32[3]); 80 - sum += carry; 81 - 82 - ulen = (__force u32)htonl((__u32) len); 83 - sum += ulen; 84 - carry = (sum < ulen); 85 - sum += carry; 86 - 87 - uproto = (__force u32)htonl(proto); 88 - sum += uproto; 89 - carry = (sum < uproto); 90 - sum += carry; 91 - 92 - return csum_fold((__force __wsum)sum); 93 - } 94 - 38 + __sum16 csum_ipv6_magic(const struct in6_addr *saddr, 39 + const struct in6_addr *daddr, 40 + __u32 len, unsigned short proto, 41 + __wsum csum); 95 42 #endif 96 43 97 44 static __inline__ __sum16 tcp_v6_check(int len, ··· 73 126 __tcp_v6_send_check(skb, &np->saddr, &np->daddr); 74 127 } 75 128 129 + int udp6_csum_init(struct sk_buff *skb, struct udphdr *uh, int proto); 76 130 #endif
+1 -1
net/ipv6/Makefile
··· 40 40 obj-$(CONFIG_IPV6_TUNNEL) += ip6_tunnel.o 41 41 obj-$(CONFIG_IPV6_GRE) += ip6_gre.o 42 42 43 - obj-y += addrconf_core.o exthdrs_core.o 43 + obj-y += addrconf_core.o exthdrs_core.o ip6_checksum.o 44 44 obj-$(CONFIG_INET) += output_core.o protocol.o $(ipv6-offload) 45 45 46 46 obj-$(subst m,y,$(CONFIG_IPV6)) += inet6_hashtables.o
+97
net/ipv6/ip6_checksum.c
··· 1 + #include <net/ip.h> 2 + #include <net/udp.h> 3 + #include <net/udplite.h> 4 + #include <asm/checksum.h> 5 + 6 + #ifndef _HAVE_ARCH_IPV6_CSUM 7 + __sum16 csum_ipv6_magic(const struct in6_addr *saddr, 8 + const struct in6_addr *daddr, 9 + __u32 len, unsigned short proto, 10 + __wsum csum) 11 + { 12 + 13 + int carry; 14 + __u32 ulen; 15 + __u32 uproto; 16 + __u32 sum = (__force u32)csum; 17 + 18 + sum += (__force u32)saddr->s6_addr32[0]; 19 + carry = (sum < (__force u32)saddr->s6_addr32[0]); 20 + sum += carry; 21 + 22 + sum += (__force u32)saddr->s6_addr32[1]; 23 + carry = (sum < (__force u32)saddr->s6_addr32[1]); 24 + sum += carry; 25 + 26 + sum += (__force u32)saddr->s6_addr32[2]; 27 + carry = (sum < (__force u32)saddr->s6_addr32[2]); 28 + sum += carry; 29 + 30 + sum += (__force u32)saddr->s6_addr32[3]; 31 + carry = (sum < (__force u32)saddr->s6_addr32[3]); 32 + sum += carry; 33 + 34 + sum += (__force u32)daddr->s6_addr32[0]; 35 + carry = (sum < (__force u32)daddr->s6_addr32[0]); 36 + sum += carry; 37 + 38 + sum += (__force u32)daddr->s6_addr32[1]; 39 + carry = (sum < (__force u32)daddr->s6_addr32[1]); 40 + sum += carry; 41 + 42 + sum += (__force u32)daddr->s6_addr32[2]; 43 + carry = (sum < (__force u32)daddr->s6_addr32[2]); 44 + sum += carry; 45 + 46 + sum += (__force u32)daddr->s6_addr32[3]; 47 + carry = (sum < (__force u32)daddr->s6_addr32[3]); 48 + sum += carry; 49 + 50 + ulen = (__force u32)htonl((__u32) len); 51 + sum += ulen; 52 + carry = (sum < ulen); 53 + sum += carry; 54 + 55 + uproto = (__force u32)htonl(proto); 56 + sum += uproto; 57 + carry = (sum < uproto); 58 + sum += carry; 59 + 60 + return csum_fold((__force __wsum)sum); 61 + } 62 + EXPORT_SYMBOL(csum_ipv6_magic); 63 + #endif 64 + 65 + int udp6_csum_init(struct sk_buff *skb, struct udphdr *uh, int proto) 66 + { 67 + int err; 68 + 69 + UDP_SKB_CB(skb)->partial_cov = 0; 70 + UDP_SKB_CB(skb)->cscov = skb->len; 71 + 72 + if (proto == IPPROTO_UDPLITE) { 73 + err = udplite_checksum_init(skb, uh); 74 + if (err) 75 + return err; 76 + } 77 + 78 + if (uh->check == 0) { 79 + /* RFC 2460 section 8.1 says that we SHOULD log 80 + this error. Well, it is reasonable. 81 + */ 82 + LIMIT_NETDEBUG(KERN_INFO "IPv6: udp checksum is 0\n"); 83 + return 1; 84 + } 85 + if (skb->ip_summed == CHECKSUM_COMPLETE && 86 + !csum_ipv6_magic(&ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr, 87 + skb->len, proto, skb->csum)) 88 + skb->ip_summed = CHECKSUM_UNNECESSARY; 89 + 90 + if (!skb_csum_unnecessary(skb)) 91 + skb->csum = ~csum_unfold(csum_ipv6_magic(&ipv6_hdr(skb)->saddr, 92 + &ipv6_hdr(skb)->daddr, 93 + skb->len, proto, 0)); 94 + 95 + return 0; 96 + } 97 + EXPORT_SYMBOL(udp6_csum_init);
-34
net/ipv6/udp.c
··· 752 752 return 0; 753 753 } 754 754 755 - static inline int udp6_csum_init(struct sk_buff *skb, struct udphdr *uh, 756 - int proto) 757 - { 758 - int err; 759 - 760 - UDP_SKB_CB(skb)->partial_cov = 0; 761 - UDP_SKB_CB(skb)->cscov = skb->len; 762 - 763 - if (proto == IPPROTO_UDPLITE) { 764 - err = udplite_checksum_init(skb, uh); 765 - if (err) 766 - return err; 767 - } 768 - 769 - if (uh->check == 0) { 770 - /* RFC 2460 section 8.1 says that we SHOULD log 771 - this error. Well, it is reasonable. 772 - */ 773 - LIMIT_NETDEBUG(KERN_INFO "IPv6: udp checksum is 0\n"); 774 - return 1; 775 - } 776 - if (skb->ip_summed == CHECKSUM_COMPLETE && 777 - !csum_ipv6_magic(&ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr, 778 - skb->len, proto, skb->csum)) 779 - skb->ip_summed = CHECKSUM_UNNECESSARY; 780 - 781 - if (!skb_csum_unnecessary(skb)) 782 - skb->csum = ~csum_unfold(csum_ipv6_magic(&ipv6_hdr(skb)->saddr, 783 - &ipv6_hdr(skb)->daddr, 784 - skb->len, proto, 0)); 785 - 786 - return 0; 787 - } 788 - 789 755 int __udp6_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, 790 756 int proto) 791 757 {