From cbb5ba8633c2ad143366c3bc367f8c4f6434c084 Mon Sep 17 00:00:00 2001 From: Uwe Hermann Date: Sat, 1 Mar 2008 19:09:01 +0000 Subject: Rename lxbios to nvramtool, step 3 (rename directory). Signed-off-by: Uwe Hermann Acked-by: Stefan Reinauer git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3124 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1 --- util/nvramtool/compute_ip_checksum.c | 45 ++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 util/nvramtool/compute_ip_checksum.c (limited to 'util/nvramtool/compute_ip_checksum.c') diff --git a/util/nvramtool/compute_ip_checksum.c b/util/nvramtool/compute_ip_checksum.c new file mode 100644 index 0000000000..3d2c29feb8 --- /dev/null +++ b/util/nvramtool/compute_ip_checksum.c @@ -0,0 +1,45 @@ +/*****************************************************************************\ + * compute_ip_checksum.c + * $Id$ +\*****************************************************************************/ + +#include +#include "ip_checksum.h" + +/* Note: The contents of this file were borrowed from the coreboot source + * code which may be obtained from http://www.coreboot.org. + * Specifically, this code was obtained from coreboot (LinuxBIOS) + * version 1.0.0.8. + */ + +unsigned long compute_ip_checksum(void *addr, unsigned long length) +{ + uint8_t *ptr; + volatile union { + uint8_t byte[2]; + uint16_t word; + } value; + unsigned long sum; + unsigned long i; + /* In the most straight forward way possible, + * compute an ip style checksum. + */ + sum = 0; + ptr = addr; + for(i = 0; i < length; i++) { + unsigned long value; + value = ptr[i]; + if (i & 1) { + value <<= 8; + } + /* Add the new value */ + sum += value; + /* Wrap around the carry */ + if (sum > 0xFFFF) { + sum = (sum + (sum >> 16)) & 0xFFFF; + } + } + value.byte[0] = sum & 0xff; + value.byte[1] = (sum >> 8) & 0xff; + return (~value.word) & 0xFFFF; +} -- cgit v1.2.3