1*1da177e4SLinus Torvalds /* 2*1da177e4SLinus Torvalds * INET An implementation of the TCP/IP protocol suite for the LINUX 3*1da177e4SLinus Torvalds * operating system. INET is implemented using the BSD Socket 4*1da177e4SLinus Torvalds * interface as the means of communication with the user level. 5*1da177e4SLinus Torvalds * 6*1da177e4SLinus Torvalds * Checksumming functions for IPv6 7*1da177e4SLinus Torvalds * 8*1da177e4SLinus Torvalds * Authors: Jorge Cwik, <jorge@laser.satlink.net> 9*1da177e4SLinus Torvalds * Arnt Gulbrandsen, <agulbra@nvg.unit.no> 10*1da177e4SLinus Torvalds * Borrows very liberally from tcp.c and ip.c, see those 11*1da177e4SLinus Torvalds * files for more names. 12*1da177e4SLinus Torvalds * 13*1da177e4SLinus Torvalds * This program is free software; you can redistribute it and/or 14*1da177e4SLinus Torvalds * modify it under the terms of the GNU General Public License 15*1da177e4SLinus Torvalds * as published by the Free Software Foundation; either version 16*1da177e4SLinus Torvalds * 2 of the License, or (at your option) any later version. 17*1da177e4SLinus Torvalds */ 18*1da177e4SLinus Torvalds 19*1da177e4SLinus Torvalds /* 20*1da177e4SLinus Torvalds * Fixes: 21*1da177e4SLinus Torvalds * 22*1da177e4SLinus Torvalds * Ralf Baechle : generic ipv6 checksum 23*1da177e4SLinus Torvalds * <ralf@waldorf-gmbh.de> 24*1da177e4SLinus Torvalds */ 25*1da177e4SLinus Torvalds 26*1da177e4SLinus Torvalds #ifndef _CHECKSUM_IPV6_H 27*1da177e4SLinus Torvalds #define _CHECKSUM_IPV6_H 28*1da177e4SLinus Torvalds 29*1da177e4SLinus Torvalds #include <asm/types.h> 30*1da177e4SLinus Torvalds #include <asm/byteorder.h> 31*1da177e4SLinus Torvalds #include <net/ip.h> 32*1da177e4SLinus Torvalds #include <asm/checksum.h> 33*1da177e4SLinus Torvalds #include <linux/in6.h> 34*1da177e4SLinus Torvalds 35*1da177e4SLinus Torvalds #ifndef _HAVE_ARCH_IPV6_CSUM 36*1da177e4SLinus Torvalds 37*1da177e4SLinus Torvalds static __inline__ unsigned short int csum_ipv6_magic(struct in6_addr *saddr, 38*1da177e4SLinus Torvalds struct in6_addr *daddr, 39*1da177e4SLinus Torvalds __u16 len, 40*1da177e4SLinus Torvalds unsigned short proto, 41*1da177e4SLinus Torvalds unsigned int csum) 42*1da177e4SLinus Torvalds { 43*1da177e4SLinus Torvalds 44*1da177e4SLinus Torvalds int carry; 45*1da177e4SLinus Torvalds __u32 ulen; 46*1da177e4SLinus Torvalds __u32 uproto; 47*1da177e4SLinus Torvalds 48*1da177e4SLinus Torvalds csum += saddr->s6_addr32[0]; 49*1da177e4SLinus Torvalds carry = (csum < saddr->s6_addr32[0]); 50*1da177e4SLinus Torvalds csum += carry; 51*1da177e4SLinus Torvalds 52*1da177e4SLinus Torvalds csum += saddr->s6_addr32[1]; 53*1da177e4SLinus Torvalds carry = (csum < saddr->s6_addr32[1]); 54*1da177e4SLinus Torvalds csum += carry; 55*1da177e4SLinus Torvalds 56*1da177e4SLinus Torvalds csum += saddr->s6_addr32[2]; 57*1da177e4SLinus Torvalds carry = (csum < saddr->s6_addr32[2]); 58*1da177e4SLinus Torvalds csum += carry; 59*1da177e4SLinus Torvalds 60*1da177e4SLinus Torvalds csum += saddr->s6_addr32[3]; 61*1da177e4SLinus Torvalds carry = (csum < saddr->s6_addr32[3]); 62*1da177e4SLinus Torvalds csum += carry; 63*1da177e4SLinus Torvalds 64*1da177e4SLinus Torvalds csum += daddr->s6_addr32[0]; 65*1da177e4SLinus Torvalds carry = (csum < daddr->s6_addr32[0]); 66*1da177e4SLinus Torvalds csum += carry; 67*1da177e4SLinus Torvalds 68*1da177e4SLinus Torvalds csum += daddr->s6_addr32[1]; 69*1da177e4SLinus Torvalds carry = (csum < daddr->s6_addr32[1]); 70*1da177e4SLinus Torvalds csum += carry; 71*1da177e4SLinus Torvalds 72*1da177e4SLinus Torvalds csum += daddr->s6_addr32[2]; 73*1da177e4SLinus Torvalds carry = (csum < daddr->s6_addr32[2]); 74*1da177e4SLinus Torvalds csum += carry; 75*1da177e4SLinus Torvalds 76*1da177e4SLinus Torvalds csum += daddr->s6_addr32[3]; 77*1da177e4SLinus Torvalds carry = (csum < daddr->s6_addr32[3]); 78*1da177e4SLinus Torvalds csum += carry; 79*1da177e4SLinus Torvalds 80*1da177e4SLinus Torvalds ulen = htonl((__u32) len); 81*1da177e4SLinus Torvalds csum += ulen; 82*1da177e4SLinus Torvalds carry = (csum < ulen); 83*1da177e4SLinus Torvalds csum += carry; 84*1da177e4SLinus Torvalds 85*1da177e4SLinus Torvalds uproto = htonl(proto); 86*1da177e4SLinus Torvalds csum += uproto; 87*1da177e4SLinus Torvalds carry = (csum < uproto); 88*1da177e4SLinus Torvalds csum += carry; 89*1da177e4SLinus Torvalds 90*1da177e4SLinus Torvalds return csum_fold(csum); 91*1da177e4SLinus Torvalds } 92*1da177e4SLinus Torvalds 93*1da177e4SLinus Torvalds #endif 94*1da177e4SLinus Torvalds #endif 95