From 1a54d44a23de7b0bf0dfe62dd3d09d8167e5a597 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Mon, 10 May 1999 21:37:39 +0000 Subject: Added packet checksumming code. Watch the comments for an explanation. --- lib/checksum.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 lib/checksum.c (limited to 'lib/checksum.c') diff --git a/lib/checksum.c b/lib/checksum.c new file mode 100644 index 0000000..4dfa252 --- /dev/null +++ b/lib/checksum.c @@ -0,0 +1,59 @@ +/* + * BIRD Library -- IP One-Complement Checksum + * + * (c) 1999 Martin Mares + * + * Can be freely distributed and used under the terms of the GNU GPL. + */ + +#include + +#include "nest/bird.h" +#include "checksum.h" + +static u16 +ipsum_calc(void *frag, unsigned len, va_list args) +{ + u16 sum = 0; + + for(;;) + { + u16 *x = frag; + ASSERT(!(len % 2)); + while (len) + { + u16 z = sum + *x++; + sum = z + (z < sum); + len -= 2; + } + frag = va_arg(args, void *); + if (!frag) + break; + len = va_arg(args, unsigned); + } + return sum; +} + +int +ipsum_verify(void *frag, unsigned len, ...) +{ + va_list args; + u16 sum; + + va_start(args, len); + sum = ipsum_calc(frag, len, args); + va_end(args); + return sum == 0xffff; +} + +u16 +ipsum_calculate(void *frag, unsigned len, ...) +{ + va_list args; + u16 sum; + + va_start(args, len); + sum = ipsum_calc(frag, len, args); + va_end(args); + return 0xffff - sum; +} -- cgit v1.2.3