source: rtems-libbsd/freebsd/contrib/tcpdump/checksum.c @ 084d4db

4.11
Last change on this file since 084d4db was 8440506, checked in by Chris Johns <chrisj@…>, on 06/15/15 at 07:42:23

Add tcpdump and libpcap.

  • Update the file builder generator to handle generator specific cflags and includes. The tcpdump and libpcap have localised headers and need specific headers paths to see them. There are also module specific flags and these need to be passed to the lex and yacc generators.
  • Add the tcpdump support.
  • Property mode set to 100644
File size: 5.5 KB
Line 
1#include <machine/rtems-bsd-user-space.h>
2
3/*
4 * Copyright (c) 1998-2006 The TCPDUMP project
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that: (1) source code
8 * distributions retain the above copyright notice and this paragraph
9 * in its entirety, and (2) distributions including binary code include
10 * the above copyright notice and this paragraph in its entirety in
11 * the documentation or other materials provided with the distribution.
12 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
13 * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
14 * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
15 * FOR A PARTICULAR PURPOSE.
16 *
17 * miscellaneous checksumming routines
18 *
19 * Original code by Hannes Gredler (hannes@juniper.net)
20 */
21
22#ifndef lint
23static const char rcsid[] _U_ =
24    "@(#) $Header: /tcpdump/master/tcpdump/checksum.c,v 1.4 2006-09-25 09:23:32 hannes Exp $";
25#endif
26
27#ifdef HAVE_CONFIG_H
28#include "config.h"
29#endif
30
31#include <tcpdump-stdinc.h>
32
33#include <stdio.h>
34#include <stdlib.h>
35#include <string.h>
36#include <assert.h>
37
38#include "interface.h"
39
40/*
41 * CRC-10 table generated using the following Python snippet:
42
43import sys
44
45crc_table = []
46for i in range(256):
47        accum = i << 2
48        for j in range(8):
49                accum <<= 1
50                if accum & 0x400:
51                        accum ^= 0x633
52        crc_table.append(accum)
53
54for i in range(len(crc_table)/8):
55        for j in range(8):
56                sys.stdout.write("0x%04x, " % crc_table[i*8+j])
57        sys.stdout.write("\n")
58
59 */
60static const u_int16_t crc10_table[256] =
61{
62        0x0000, 0x0233, 0x0255, 0x0066, 0x0299, 0x00aa, 0x00cc, 0x02ff,
63        0x0301, 0x0132, 0x0154, 0x0367, 0x0198, 0x03ab, 0x03cd, 0x01fe,
64        0x0031, 0x0202, 0x0264, 0x0057, 0x02a8, 0x009b, 0x00fd, 0x02ce,
65        0x0330, 0x0103, 0x0165, 0x0356, 0x01a9, 0x039a, 0x03fc, 0x01cf,
66        0x0062, 0x0251, 0x0237, 0x0004, 0x02fb, 0x00c8, 0x00ae, 0x029d,
67        0x0363, 0x0150, 0x0136, 0x0305, 0x01fa, 0x03c9, 0x03af, 0x019c,
68        0x0053, 0x0260, 0x0206, 0x0035, 0x02ca, 0x00f9, 0x009f, 0x02ac,
69        0x0352, 0x0161, 0x0107, 0x0334, 0x01cb, 0x03f8, 0x039e, 0x01ad,
70        0x00c4, 0x02f7, 0x0291, 0x00a2, 0x025d, 0x006e, 0x0008, 0x023b,
71        0x03c5, 0x01f6, 0x0190, 0x03a3, 0x015c, 0x036f, 0x0309, 0x013a,
72        0x00f5, 0x02c6, 0x02a0, 0x0093, 0x026c, 0x005f, 0x0039, 0x020a,
73        0x03f4, 0x01c7, 0x01a1, 0x0392, 0x016d, 0x035e, 0x0338, 0x010b,
74        0x00a6, 0x0295, 0x02f3, 0x00c0, 0x023f, 0x000c, 0x006a, 0x0259,
75        0x03a7, 0x0194, 0x01f2, 0x03c1, 0x013e, 0x030d, 0x036b, 0x0158,
76        0x0097, 0x02a4, 0x02c2, 0x00f1, 0x020e, 0x003d, 0x005b, 0x0268,
77        0x0396, 0x01a5, 0x01c3, 0x03f0, 0x010f, 0x033c, 0x035a, 0x0169,
78        0x0188, 0x03bb, 0x03dd, 0x01ee, 0x0311, 0x0122, 0x0144, 0x0377,
79        0x0289, 0x00ba, 0x00dc, 0x02ef, 0x0010, 0x0223, 0x0245, 0x0076,
80        0x01b9, 0x038a, 0x03ec, 0x01df, 0x0320, 0x0113, 0x0175, 0x0346,
81        0x02b8, 0x008b, 0x00ed, 0x02de, 0x0021, 0x0212, 0x0274, 0x0047,
82        0x01ea, 0x03d9, 0x03bf, 0x018c, 0x0373, 0x0140, 0x0126, 0x0315,
83        0x02eb, 0x00d8, 0x00be, 0x028d, 0x0072, 0x0241, 0x0227, 0x0014,
84        0x01db, 0x03e8, 0x038e, 0x01bd, 0x0342, 0x0171, 0x0117, 0x0324,
85        0x02da, 0x00e9, 0x008f, 0x02bc, 0x0043, 0x0270, 0x0216, 0x0025,
86        0x014c, 0x037f, 0x0319, 0x012a, 0x03d5, 0x01e6, 0x0180, 0x03b3,
87        0x024d, 0x007e, 0x0018, 0x022b, 0x00d4, 0x02e7, 0x0281, 0x00b2,
88        0x017d, 0x034e, 0x0328, 0x011b, 0x03e4, 0x01d7, 0x01b1, 0x0382,
89        0x027c, 0x004f, 0x0029, 0x021a, 0x00e5, 0x02d6, 0x02b0, 0x0083,
90        0x012e, 0x031d, 0x037b, 0x0148, 0x03b7, 0x0184, 0x01e2, 0x03d1,
91        0x022f, 0x001c, 0x007a, 0x0249, 0x00b6, 0x0285, 0x02e3, 0x00d0,
92        0x011f, 0x032c, 0x034a, 0x0179, 0x0386, 0x01b5, 0x01d3, 0x03e0,
93        0x021e, 0x002d, 0x004b, 0x0278, 0x0087, 0x02b4, 0x02d2, 0x00e1
94};
95
96static void
97init_crc10_table(void)
98{   
99#define CRC10_POLYNOMIAL 0x633
100    register int i, j;
101    register u_int16_t accum;
102    u_int16_t verify_crc10_table[256];
103   
104    for ( i = 0;  i < 256;  i++ )
105    {
106        accum = ((unsigned short) i << 2);
107        for ( j = 0;  j < 8;  j++ )
108        {
109            if ((accum <<= 1) & 0x400) accum ^= CRC10_POLYNOMIAL;
110        }
111        verify_crc10_table[i] = accum;
112    }
113    assert(memcmp(verify_crc10_table,
114                                  crc10_table,
115                                  sizeof(verify_crc10_table)) == 0);
116#undef CRC10_POLYNOMIAL
117}
118
119u_int16_t
120verify_crc10_cksum(u_int16_t accum, const u_char *p, int length)
121{
122    register int i;
123
124    for ( i = 0;  i < length;  i++ )
125    {
126        accum = ((accum << 8) & 0x3ff)
127            ^ crc10_table[( accum >> 2) & 0xff]
128            ^ *p++;
129    }
130    return accum;
131}
132
133/* precompute checksum tables */
134void
135init_checksum(void) {
136
137    init_crc10_table();
138
139}
140
141/*
142 * Creates the OSI Fletcher checksum. See 8473-1, Appendix C, section C.3.
143 * The checksum field of the passed PDU does not need to be reset to zero.
144 */
145u_int16_t
146create_osi_cksum (const u_int8_t *pptr, int checksum_offset, int length)
147{
148
149    int x;
150    int y;
151    u_int32_t mul;
152    u_int32_t c0;
153    u_int32_t c1;
154    u_int16_t checksum;
155    int index;
156
157    c0 = 0;
158    c1 = 0;
159
160    for (index = 0; index < length; index++) {
161        /*
162         * Ignore the contents of the checksum field.
163         */
164        if (index == checksum_offset ||
165            index == checksum_offset+1) {
166            c1 += c0;
167            pptr++;
168        } else {
169            c0 = c0 + *(pptr++);
170            c1 += c0;
171        }
172    }
173
174    c0 = c0 % 255;
175    c1 = c1 % 255;
176
177    mul = (length - checksum_offset)*(c0);
178 
179    x = mul - c0 - c1;
180    y = c1 - mul - 1;
181
182    if ( y >= 0 ) y++;
183    if ( x < 0 ) x--;
184
185    x %= 255;
186    y %= 255;
187
188
189    if (x == 0) x = 255;
190    if (y == 0) y = 255;
191
192    y &= 0x00FF;
193    checksum = ((x << 8) | y);
194 
195    return checksum;
196}
Note: See TracBrowser for help on using the repository browser.