diff options
author | Stefan Reinauer <stepan@coresystems.de> | 2007-07-12 16:35:42 +0000 |
---|---|---|
committer | Stefan Reinauer <stepan@openbios.org> | 2007-07-12 16:35:42 +0000 |
commit | 6540ae5ea0a52e05ceb31675a2419d07197db738 (patch) | |
tree | 0dd2a6401ef2cfa5b06de374a6ba6db11e0b61c6 /util/lxbios/compute_ip_checksum.c | |
parent | 6cf687783bc9c54146cf85ce5e526e63ab7047fb (diff) |
Signed-off-by: Stefan Reinauer <stepan@coresystems.de>
Acked-by: Jordan Crouse <jordan.crouse@amd.com>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@2736 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'util/lxbios/compute_ip_checksum.c')
-rw-r--r-- | util/lxbios/compute_ip_checksum.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/util/lxbios/compute_ip_checksum.c b/util/lxbios/compute_ip_checksum.c new file mode 100644 index 0000000000..6220edb12f --- /dev/null +++ b/util/lxbios/compute_ip_checksum.c @@ -0,0 +1,44 @@ +/*****************************************************************************\ + * compute_ip_checksum.c + * $Id: compute_ip_checksum.c,v 1.1.1.1 2005/12/02 22:35:19 dsp_llnl Exp $ +\*****************************************************************************/ + +#include <stdint.h> +#include "ip_checksum.h" + +/* Note: The contents of this file were borrowed from the LinuxBIOS source + * code which may be obtained from http://www.linuxbios.org. + * Specifically, this code was obtained from 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; +} |