oneC_sum.c

Go to the documentation of this file.
00001 /*      oneC_sum() - One complement's checksum          Author: Kees J. Bot
00002  *                                                              8 May 1995
00003  * See RFC 1071, "Computing the Internet checksum"
00004  */
00005 
00006 #include <sys/types.h>
00007 #include <net/gen/oneCsum.h>
00008 
00009 u16_t oneC_sum(U16_t prev, void *data, size_t size)
00010 {
00011         u8_t *dptr;
00012         size_t n;
00013         u16_t word;
00014         u32_t sum;
00015         int swap= 0;
00016 
00017         sum= prev;
00018         dptr= data;
00019         n= size;
00020 
00021         swap= ((size_t) dptr & 1);
00022         if (swap) {
00023                 sum= ((sum & 0xFF) << 8) | ((sum & 0xFF00) >> 8);
00024                 if (n > 0) {
00025                         ((u8_t *) &word)[0]= 0;
00026                         ((u8_t *) &word)[1]= dptr[0];
00027                         sum+= (u32_t) word;
00028                         dptr+= 1;
00029                         n-= 1;
00030                 }
00031         }
00032 
00033         while (n >= 8) {
00034                 sum+= (u32_t) ((u16_t *) dptr)[0]
00035                     + (u32_t) ((u16_t *) dptr)[1]
00036                     + (u32_t) ((u16_t *) dptr)[2]
00037                     + (u32_t) ((u16_t *) dptr)[3];
00038                 dptr+= 8;
00039                 n-= 8;
00040         }
00041 
00042         while (n >= 2) {
00043                 sum+= (u32_t) ((u16_t *) dptr)[0];
00044                 dptr+= 2;
00045                 n-= 2;
00046         }
00047 
00048         if (n > 0) {
00049                 ((u8_t *) &word)[0]= dptr[0];
00050                 ((u8_t *) &word)[1]= 0;
00051                 sum+= (u32_t) word;
00052         }
00053 
00054         sum= (sum & 0xFFFF) + (sum >> 16);
00055         if (sum > 0xFFFF) sum++;
00056 
00057         if (swap) {
00058                 sum= ((sum & 0xFF) << 8) | ((sum & 0xFF00) >> 8);
00059         }
00060         return sum;
00061 }

Generated on Fri Apr 14 22:57:26 2006 for minix by  doxygen 1.4.6