]>
Commit | Line | Data |
---|---|---|
eb5d44eb | 1 | /* |
2 | * IS-IS Rout(e)ing protocol - iso_checksum.c | |
3 | * ISO checksum related routines | |
4 | * | |
5 | * Copyright (C) 2001,2002 Sampo Saaristo | |
d62a17ae | 6 | * Tampere University of Technology |
eb5d44eb | 7 | * Institute of Communications Engineering |
8 | * | |
d62a17ae | 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) | |
eb5d44eb | 12 | * any later version. |
13 | * | |
d62a17ae | 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 | |
eb5d44eb | 17 | * more details. |
896014f4 DL |
18 | * |
19 | * You should have received a copy of the GNU General Public License along | |
20 | * with this program; see the file COPYING; if not, write to the Free Software | |
21 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
eb5d44eb | 22 | */ |
23 | ||
24 | #include <zebra.h> | |
25 | #include "iso_checksum.h" | |
6a270cd9 | 26 | #include "checksum.h" |
eb5d44eb | 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 | * | |
d62a17ae | 36 | * L |
eb5d44eb | 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 | |
eb5d44eb | 46 | */ |
47 | ||
d7c0a89a | 48 | int iso_csum_verify(uint8_t *buffer, int len, uint16_t csum, int offset) |
f390d2c7 | 49 | { |
d7c0a89a QY |
50 | uint16_t checksum; |
51 | uint32_t c0; | |
52 | uint32_t c1; | |
eb5d44eb | 53 | |
d62a17ae | 54 | c0 = csum & 0xff00; |
55 | c1 = csum & 0x00ff; | |
eb5d44eb | 56 | |
d62a17ae | 57 | /* |
58 | * If both are zero return correct | |
59 | */ | |
60 | if (c0 == 0 && c1 == 0) | |
61 | return 0; | |
eb5d44eb | 62 | |
d62a17ae | 63 | /* |
64 | * If either, but not both are zero return incorrect | |
65 | */ | |
66 | if (c0 == 0 || c1 == 0) | |
67 | return 1; | |
f390d2c7 | 68 | |
d62a17ae | 69 | checksum = fletcher_checksum(buffer, len, offset); |
af8ac8f9 | 70 | if (checksum == htons(csum)) |
d62a17ae | 71 | return 0; |
72 | return 1; | |
eb5d44eb | 73 | } |