]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Added packet checksumming code. Watch the comments for an explanation.
authorMartin Mares <mj@ucw.cz>
Mon, 10 May 1999 21:37:39 +0000 (21:37 +0000)
committerMartin Mares <mj@ucw.cz>
Mon, 10 May 1999 21:37:39 +0000 (21:37 +0000)
lib/Modules
lib/checksum.c [new file with mode: 0644]
lib/checksum.h [new file with mode: 0644]

index 19a790000177d360dad1e5383f6ccf579874d33c..1597b9afa3d2cf1b99f79aa2596ed9f71b12f17e 100644 (file)
@@ -27,3 +27,5 @@ slists.c
 slists.h
 event.c
 event.h
+checksum.c
+checksum.h
diff --git a/lib/checksum.c b/lib/checksum.c
new file mode 100644 (file)
index 0000000..4dfa252
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ *     BIRD Library -- IP One-Complement Checksum
+ *
+ *     (c) 1999 Martin Mares <mj@ucw.cz>
+ *
+ *     Can be freely distributed and used under the terms of the GNU GPL.
+ */
+
+#include <stdarg.h>
+
+#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;
+}
diff --git a/lib/checksum.h b/lib/checksum.h
new file mode 100644 (file)
index 0000000..8151554
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ *     BIRD Library -- IP One-Complement Checksum
+ *
+ *     (c) 1999 Martin Mares <mj@ucw.cz>
+ *
+ *     Can be freely distributed and used under the terms of the GNU GPL.
+ */
+
+#ifndef _BIRD_CHECKSUM_H_
+#define _BIRD_CHECKSUM_H_
+
+/*
+ *     Both checksumming functions accept a vararg list of packet
+ *     fragments finished by NULL pointer.
+ */
+
+int ipsum_verify(void *frag, unsigned len, ...);
+u16 ipsum_calculate(void *frag, unsigned len, ...);
+
+#endif