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

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.13-rc3 107 lines 3.2 kB view raw
1#ifdef __KERNEL__ 2#ifndef _PPC_CHECKSUM_H 3#define _PPC_CHECKSUM_H 4 5 6/* 7 * computes the checksum of a memory block at buff, length len, 8 * and adds in "sum" (32-bit) 9 * 10 * returns a 32-bit number suitable for feeding into itself 11 * or csum_tcpudp_magic 12 * 13 * this function must be called with even lengths, except 14 * for the last fragment, which may be odd 15 * 16 * it's best to have buff aligned on a 32-bit boundary 17 */ 18extern unsigned int csum_partial(const unsigned char * buff, int len, 19 unsigned int sum); 20 21/* 22 * Computes the checksum of a memory block at src, length len, 23 * and adds in "sum" (32-bit), while copying the block to dst. 24 * If an access exception occurs on src or dst, it stores -EFAULT 25 * to *src_err or *dst_err respectively (if that pointer is not 26 * NULL), and, for an error on src, zeroes the rest of dst. 27 * 28 * Like csum_partial, this must be called with even lengths, 29 * except for the last fragment. 30 */ 31extern unsigned int csum_partial_copy_generic(const char *src, char *dst, 32 int len, unsigned int sum, 33 int *src_err, int *dst_err); 34 35#define csum_partial_copy_from_user(src, dst, len, sum, errp) \ 36 csum_partial_copy_generic((__force void *)(src), (dst), (len), (sum), (errp), NULL) 37 38/* FIXME: this needs to be written to really do no check -- Cort */ 39#define csum_partial_copy_nocheck(src, dst, len, sum) \ 40 csum_partial_copy_generic((src), (dst), (len), (sum), NULL, NULL) 41 42/* 43 * turns a 32-bit partial checksum (e.g. from csum_partial) into a 44 * 1's complement 16-bit checksum. 45 */ 46static inline unsigned int csum_fold(unsigned int sum) 47{ 48 unsigned int tmp; 49 50 /* swap the two 16-bit halves of sum */ 51 __asm__("rlwinm %0,%1,16,0,31" : "=r" (tmp) : "r" (sum)); 52 /* if there is a carry from adding the two 16-bit halves, 53 it will carry from the lower half into the upper half, 54 giving us the correct sum in the upper half. */ 55 sum = ~(sum + tmp) >> 16; 56 return sum; 57} 58 59/* 60 * this routine is used for miscellaneous IP-like checksums, mainly 61 * in icmp.c 62 */ 63static inline unsigned short ip_compute_csum(unsigned char * buff, int len) 64{ 65 return csum_fold(csum_partial(buff, len, 0)); 66} 67 68/* 69 * FIXME: I swiped this one from the sparc and made minor modifications. 70 * It may not be correct. -- Cort 71 */ 72static inline unsigned long csum_tcpudp_nofold(unsigned long saddr, 73 unsigned long daddr, 74 unsigned short len, 75 unsigned short proto, 76 unsigned int sum) 77{ 78 __asm__("\n\ 79 addc %0,%0,%1 \n\ 80 adde %0,%0,%2 \n\ 81 adde %0,%0,%3 \n\ 82 addze %0,%0 \n\ 83 " 84 : "=r" (sum) 85 : "r" (daddr), "r"(saddr), "r"((proto<<16)+len), "0"(sum)); 86 return sum; 87} 88 89/* 90 * This is a version of ip_compute_csum() optimized for IP headers, 91 * which always checksum on 4 octet boundaries. ihl is the number 92 * of 32-bit words and is always >= 5. 93 */ 94extern unsigned short ip_fast_csum(unsigned char * iph, unsigned int ihl); 95 96/* 97 * computes the checksum of the TCP/UDP pseudo-header 98 * returns a 16-bit checksum, already complemented 99 */ 100extern unsigned short csum_tcpudp_magic(unsigned long saddr, 101 unsigned long daddr, 102 unsigned short len, 103 unsigned short proto, 104 unsigned int sum); 105 106#endif 107#endif /* __KERNEL__ */