|
|
1.1 root 1: /* pup_cksum.c 6.1 83/07/29 */
2:
3: #include "../h/types.h"
4: #include "../h/mbuf.h"
5:
6: /*
7: * Checksum routine for PUP-I Protocol family (VAX Version).
8: */
9: pup_cksum(m, len)
10: register struct mbuf *m;
11: register int len;
12: {
13: register u_short *w;
14: register int sum = 0; /* known to be r8 */
15: register int mlen = 0;
16:
17: for (;;) {
18: /*
19: * Each trip around loop adds in
20: * words from one mbuf segment.
21: */
22: w = mtod(m, u_short *);
23: if (mlen == -1) {
24: /*
25: * There is a byte left from the last segment;
26: * add it into the checksum.
27: */
28: sum += *(u_char *)w << 8;
29: asm("rotl $1,r8,r8");
30: w = (u_short *)((char *)w + 1);
31: mlen = m->m_len - 1;
32: len--;
33: } else
34: mlen = m->m_len;
35: m = m->m_next;
36: if (len < mlen)
37: mlen = len;
38: len -= mlen;
39: while ((mlen -= 2) >= 0) {
40: asm("addw2 (r9)+,r8; rotl $1,r8,r8;");
41: }
42: if (mlen == -1)
43: sum += *(u_char *)w;
44: if (len == 0)
45: break;
46: /*
47: * Locate the next block with some data.
48: * If there is a word split across a boundary we
49: * will wrap to the top with mlen == -1 and
50: * then add it in shifted appropriately.
51: */
52: for (;;) {
53: if (m == 0) {
54: printf("pup_cksum: out of data\n");
55: goto done;
56: }
57: if (m->m_len)
58: break;
59: m = m->m_next;
60: }
61: }
62: done:
63: return (sum);
64: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.