iso_checksum.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. * You should have received a copy of the GNU General Public License along
  19. * with this program; if not, write to the Free Software Foundation, Inc.,
  20. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  21. */
  22. #include <zebra.h>
  23. #include "iso_checksum.h"
  24. #include "checksum.h"
  25. /*
  26. * Calculations of the OSI checksum.
  27. * ISO/IEC 8473 defines the sum as
  28. *
  29. * L
  30. * sum a (mod 255) = 0
  31. * 1 i
  32. *
  33. * L
  34. * sum (L-i+1)a (mod 255) = 0
  35. * 1 i
  36. *
  37. */
  38. /*
  39. * Verifies that the checksum is correct.
  40. * Return 0 on correct and 1 on invalid checksum.
  41. * Based on Annex C.4 of ISO/IEC 8473
  42. */
  43. int
  44. iso_csum_verify (u_char * buffer, int len, uint16_t * csum)
  45. {
  46. u_int16_t checksum;
  47. u_int32_t c0;
  48. u_int32_t c1;
  49. c0 = *csum & 0xff00;
  50. c1 = *csum & 0x00ff;
  51. /*
  52. * If both are zero return correct
  53. */
  54. if (c0 == 0 && c1 == 0)
  55. return 0;
  56. /*
  57. * If either, but not both are zero return incorrect
  58. */
  59. if (c0 == 0 || c1 == 0)
  60. return 1;
  61. /* Offset of checksum from the start of the buffer */
  62. int offset = (u_char *) csum - buffer;
  63. checksum = fletcher_checksum(buffer, len, offset);
  64. if (checksum == *csum)
  65. return 0;
  66. return 1;
  67. }