]>
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 | |
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. | |
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 | * | |
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 | |
eb5d44eb | 46 | */ |
47 | ||
48 | int | |
c5f119c0 | 49 | iso_csum_verify (u_char * buffer, int len, uint16_t csum, int offset) |
f390d2c7 | 50 | { |
6a270cd9 | 51 | u_int16_t checksum; |
eb5d44eb | 52 | u_int32_t c0; |
53 | u_int32_t c1; | |
eb5d44eb | 54 | |
c5f119c0 QY |
55 | c0 = csum & 0xff00; |
56 | c1 = csum & 0x00ff; | |
eb5d44eb | 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; | |
f390d2c7 | 69 | |
6a270cd9 | 70 | checksum = fletcher_checksum(buffer, len, offset); |
c5f119c0 | 71 | if (checksum == csum) |
eb5d44eb | 72 | return 0; |
eb5d44eb | 73 | return 1; |
74 | } |