Annotation of embedaddon/quagga/isisd/iso_checksum.c, revision 1.1.1.1
1.1 misho 1: /*
2: * IS-IS Rout(e)ing protocol - iso_checksum.c
3: * ISO checksum related routines
4: *
5: * Copyright (C) 2001,2002 Sampo Saaristo
6: * Tampere University of Technology
7: * Institute of Communications Engineering
8: *
9: * This program is free software; you can redistribute it and/or modify it
10: * under the terms of the GNU General Public Licenseas published by the Free
11: * Software Foundation; either version 2 of the License, or (at your option)
12: * any later version.
13: *
14: * This program is distributed in the hope that it will be useful,but WITHOUT
15: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
17: * more details.
18:
19: * You should have received a copy of the GNU General Public License along
20: * with this program; if not, write to the Free Software Foundation, Inc.,
21: * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22: */
23:
24: #include <zebra.h>
25: #include "iso_checksum.h"
26: #include "checksum.h"
27:
28: /*
29: * Calculations of the OSI checksum.
30: * ISO/IEC 8473 defines the sum as
31: *
32: * L
33: * sum a (mod 255) = 0
34: * 1 i
35: *
36: * L
37: * sum (L-i+1)a (mod 255) = 0
38: * 1 i
39: *
40: */
41:
42: /*
43: * Verifies that the checksum is correct.
44: * Return 0 on correct and 1 on invalid checksum.
45: * Based on Annex C.4 of ISO/IEC 8473
46: */
47:
48: int
49: iso_csum_verify (u_char * buffer, int len, uint16_t * csum)
50: {
51: u_int16_t checksum;
52: u_int32_t c0;
53: u_int32_t c1;
54:
55: c0 = *csum & 0xff00;
56: c1 = *csum & 0x00ff;
57:
58: /*
59: * If both are zero return correct
60: */
61: if (c0 == 0 && c1 == 0)
62: return 0;
63:
64: /*
65: * If either, but not both are zero return incorrect
66: */
67: if (c0 == 0 || c1 == 0)
68: return 1;
69:
70: /* Offset of checksum from the start of the buffer */
71: int offset = (u_char *) csum - buffer;
72:
73: checksum = fletcher_checksum(buffer, len, offset);
74: if (checksum == *csum)
75: return 0;
76: return 1;
77: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>