/* in_cksum.c 1.1 81/10/14 */
#include "../bbnnet/net.h"
#include "../bbnnet/count.h"
* Network primitives; this file varies per-cpu,
* and the code here is for VAX only.
printf("old %x new %x \n", i
, j
);
printf("m->m_off %d m->m_len %d\n", m
->m_off
, m
->m_len
);
* Checksum routine for TCP/IP headers. This
* is very heavily used in the network
* code and should be rewritten for each CPU
* to be as fast as possible.
register u_short
*w
; /* known to be r9 */
register int sum
= 0; /* known to be r8 */
w
= (u_short
*)((int)m
+ m
->m_off
);
sum
+= *(u_char
*)w
<< 8;
w
= (unsigned short *)((char *)w
+ 1);
while ((mlen
-= 32) >= 0) {
#define ADD asm("movzwl (r9)+,r0; addl2 r0,r8");
ADD
; ADD
; ADD
; ADD
; ADD
; ADD
; ADD
; ADD
;
ADD
; ADD
; ADD
; ADD
; ADD
; ADD
; ADD
; ADD
;
while ((mlen
-= 8) >= 0) {
while ((mlen
-= 2) >= 0) {
panic("cksum: out of data");
return(~(sum
+ (sum
>> 16)) & 0xffff);
* These routines are implemented as inline expansions
* and are mentioned here for reference only
* htons and ntohs do byte reverse of a 16 bit integer
* htonl and ntohl do byte reverse of a 32 bit integer
register unsigned short *w
;
register unsigned long sum
;
w
= (unsigned short *)((int)m
+ m
->m_off
);
for (; len
> 0; len
-= 2, mlen
-= 2) {
try: if (mlen
> 1) { /* can get a word */
} else /* trailing odd byte */
sum
+= *((char *)w
) & 0xff;
} else if (mlen
> 0) { /* last byte of mbuf */
sum
+= *((char *)w
) & 0xff;
/* get next good mbuf for hi byte */
while ((m
= m
->m_next
) != 0 &&
(mlen
= m
->m_len
+ 1) == 1);
w
= (unsigned short *)((int)m
+ m
->m_off
);
sum
+= (*((char *)w
) & 0xff) << 8;
w
= (unsigned short *)((int)w
+ 1);
len
= 0; /* force loop exit */
} else { /* end of mbuf, get next and try again */
while ((m
= m
->m_next
) != 0 && (mlen
= m
->m_len
) == 0);
w
= (unsigned short *)((int)m
+ m
->m_off
);
/* add in one's complement carry */
sum
= (sum
+ (sum
>> 16)) & 0xffff;