util/cbmem: Use commonlib ipchksum() algorithm

This patch switches the cbmem utility from its own IP checksum
implementation to the commonlib version (which is good because the old
one had a couple of bugs: doesn't work on odd sizes and may overflow
its carry accumulator with input larger than 64K).

Change-Id: I0bef2c85c37ddd3438b7ac6389e9daa3e4955b31
Signed-off-by: Julius Werner <jwerner@chromium.org>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/80256
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
Reviewed-by: Yidi Lin <yidilin@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
diff --git a/util/cbmem/Makefile b/util/cbmem/Makefile
index 9219a08..0c88aeb 100644
--- a/util/cbmem/Makefile
+++ b/util/cbmem/Makefile
@@ -4,6 +4,7 @@
 PROGRAM   = cbmem
 TOP      ?= $(abspath ../..)
 ROOT      = $(TOP)/src
+COMMONLIB = $(ROOT)/commonlib
 CC       ?= $(CROSS_COMPILE)gcc
 INSTALL  ?= /usr/bin/env install
 PREFIX   ?= /usr/local
@@ -13,14 +14,14 @@
 CPPFLAGS += -I . -I $(ROOT)/commonlib/include -I $(ROOT)/commonlib/bsd/include
 CPPFLAGS += -include $(ROOT)/commonlib/bsd/include/commonlib/bsd/compiler.h
 
-OBJS = $(PROGRAM).o
+OBJS = $(PROGRAM).o $(COMMONLIB)/bsd/ipchksum.o
 
 all: $(PROGRAM)
 
 $(PROGRAM): $(OBJS)
 
 clean:
-	rm -f $(PROGRAM) *.o .dependencies *~ junit.xml
+	rm -f $(PROGRAM) $(OBJS:.c=.o) .dependencies *~ junit.xml
 
 install: $(PROGRAM)
 	$(INSTALL) -d $(DESTDIR)$(PREFIX)/sbin/
diff --git a/util/cbmem/cbmem.c b/util/cbmem/cbmem.c
index d33b714..15b6770 100644
--- a/util/cbmem/cbmem.c
+++ b/util/cbmem/cbmem.c
@@ -19,6 +19,7 @@
 #include <assert.h>
 #include <regex.h>
 #include <commonlib/bsd/cbmem_id.h>
+#include <commonlib/bsd/ipchksum.h>
 #include <commonlib/bsd/tpm_log_defs.h>
 #include <commonlib/loglevel.h>
 #include <commonlib/timestamp_serialized.h>
@@ -199,25 +200,6 @@
 	return dest;
 }
 
-/*
- * calculate ip checksum (16 bit quantities) on a passed in buffer. In case
- * the buffer length is odd last byte is excluded from the calculation
- */
-static u16 ipchcksum(const void *addr, unsigned size)
-{
-	const u16 *p = addr;
-	unsigned i, n = size / 2; /* don't expect odd sized blocks */
-	u32 sum = 0;
-
-	for (i = 0; i < n; i++)
-		sum += p[i];
-
-	sum = (sum >> 16) + (sum & 0xffff);
-	sum += (sum >> 16);
-	sum = ~sum & 0xffff;
-	return (u16) sum;
-}
-
 /* Find the first cbmem entry filling in the details. */
 static int find_cbmem_entry(uint32_t id, uint64_t *addr, size_t *size)
 {
@@ -400,7 +382,7 @@
 		lbh = buf + i;
 		if (memcmp(lbh->signature, "LBIO", sizeof(lbh->signature)) ||
 		    !lbh->header_bytes ||
-		    ipchcksum(lbh, sizeof(*lbh))) {
+		    ipchksum(lbh, sizeof(*lbh))) {
 			continue;
 		}
 
@@ -411,7 +393,7 @@
 			continue;
 		}
 
-		if (ipchcksum(mapping_virt(&table_mapping), lbh->table_bytes) !=
+		if (ipchksum(mapping_virt(&table_mapping), lbh->table_bytes) !=
 		    lbh->table_checksum) {
 			debug("Signature found, but wrong checksum.\n");
 			unmap_memory(&table_mapping);