Annotation of embedaddon/quagga/isisd/iso_checksum.c, revision 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>