iplib: Add a helper for IP checksums
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 20 Dec 2016 18:31:11 +0000 (13:31 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 10 Jan 2017 00:01:40 +0000 (19:01 -0500)
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/iplib/include/iplib/iplib.h
user/iplib/ptclbsum.c

index 582fa2b..8c2a35f 100644 (file)
@@ -204,6 +204,7 @@ uint64_t    nhgetv(void*);
 unsigned int   nhgetl(void*);
 uint16_t       nhgets(void*);
 uint16_t       ptclbsum(uint8_t*, int);
+uint16_t ip_calc_xsum(uint8_t *addr, size_t len);
 
 int    v6tov4(uint8_t*, uint8_t*);
 void   v4tov6(uint8_t*, uint8_t*);
index 68cecee..e3f3c14 100644 (file)
@@ -18,6 +18,9 @@ static short endian = 1;
 static uint8_t *aendian = (uint8_t *)&endian;
 #define LITTLE *aendian
 
+/* "Returns the one's complement checksum used in IP protocols."  That's from
+ * Plan 9's man page.  This is not a usable, as is - you want to call
+ * ip_calc_xsum(). */
 uint16_t ptclbsum(uint8_t *addr, int len)
 {
        uint32_t losum, hisum, mdsum, x;
@@ -77,3 +80,10 @@ uint16_t ptclbsum(uint8_t *addr, int len)
 
        return losum & 0xffff;
 }
+
+/* Calculates an IP checksum for [addr, addr + len), returning the xsum in host
+ * endian. */
+uint16_t ip_calc_xsum(uint8_t *addr, size_t len)
+{
+       return ~ptclbsum(addr, len) & 0xffff;
+}