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.16-rc4 87 lines 2.2 kB view raw
1/* TODO: csum_tcpudp_magic could be speeded up, and csum_fold as well */ 2 3#ifndef _CRIS_CHECKSUM_H 4#define _CRIS_CHECKSUM_H 5 6#include <asm/arch/checksum.h> 7 8/* 9 * computes the checksum of a memory block at buff, length len, 10 * and adds in "sum" (32-bit) 11 * 12 * returns a 32-bit number suitable for feeding into itself 13 * or csum_tcpudp_magic 14 * 15 * this function must be called with even lengths, except 16 * for the last fragment, which may be odd 17 * 18 * it's best to have buff aligned on a 32-bit boundary 19 */ 20unsigned int csum_partial(const unsigned char * buff, int len, unsigned int sum); 21 22/* 23 * the same as csum_partial, but copies from src while it 24 * checksums 25 * 26 * here even more important to align src and dst on a 32-bit (or even 27 * better 64-bit) boundary 28 */ 29 30unsigned int csum_partial_copy_nocheck(const char *src, char *dst, 31 int len, unsigned int sum); 32 33/* 34 * Fold a partial checksum into a word 35 */ 36 37static inline unsigned int csum_fold(unsigned int sum) 38{ 39 /* the while loop is unnecessary really, it's always enough with two 40 iterations */ 41 42 while(sum >> 16) 43 sum = (sum & 0xffff) + (sum >> 16); /* add in end-around carry */ 44 45 return ~sum; 46} 47 48extern unsigned int csum_partial_copy_from_user(const char *src, char *dst, 49 int len, unsigned int sum, 50 int *errptr); 51 52/* 53 * This is a version of ip_compute_csum() optimized for IP headers, 54 * which always checksum on 4 octet boundaries. 55 * 56 */ 57 58static inline unsigned short ip_fast_csum(unsigned char * iph, 59 unsigned int ihl) 60{ 61 return csum_fold(csum_partial(iph, ihl * 4, 0)); 62} 63 64/* 65 * computes the checksum of the TCP/UDP pseudo-header 66 * returns a 16-bit checksum, already complemented 67 */ 68 69static inline unsigned short int csum_tcpudp_magic(unsigned long saddr, 70 unsigned long daddr, 71 unsigned short len, 72 unsigned short proto, 73 unsigned int sum) 74{ 75 return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum)); 76} 77 78/* 79 * this routine is used for miscellaneous IP-like checksums, mainly 80 * in icmp.c 81 */ 82 83static inline unsigned short ip_compute_csum(unsigned char * buff, int len) { 84 return csum_fold (csum_partial(buff, len, 0)); 85} 86 87#endif