
Hi Simon,
On Mon, Oct 21, 2019 at 11:33 AM Simon Glass sjg@chromium.org wrote:
These functions are used by code outside the network support, so move them to lib/ to be more accessible.
Fix up a few code-style nits while we are here.
Signed-off-by: Simon Glass sjg@chromium.org
Changes in v3: None Changes in v2: None
lib/Makefile | 2 +- lib/net_utils.c | 48 ++++++++++++++++++++++++++++++++++++++++ net/Makefile | 1 - net/checksum.c | 59 ------------------------------------------------- 4 files changed, 49 insertions(+), 61 deletions(-) delete mode 100644 net/checksum.c
diff --git a/lib/Makefile b/lib/Makefile index 0c89b4896fe..505527d58aa 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -76,7 +76,7 @@ endif ifdef CONFIG_SPL_BUILD obj-$(CONFIG_SPL_YMODEM_SUPPORT) += crc16.o obj-$(CONFIG_$(SPL_TPL_)HASH_SUPPORT) += crc16.o -obj-$(CONFIG_SPL_NET_SUPPORT) += net_utils.o +obj-y += net_utils.o endif obj-$(CONFIG_ADDR_MAP) += addr_map.o obj-y += qsort.o diff --git a/lib/net_utils.c b/lib/net_utils.c index 9fb9d4a4b05..252290210f1 100644 --- a/lib/net_utils.c +++ b/lib/net_utils.c @@ -41,3 +41,51 @@ struct in_addr string_to_ip(const char *s) addr.s_addr = htonl(addr.s_addr); return addr; }
+uint compute_ip_checksum(const void *vptr, uint nbytes) +{
int sum, oddbyte;
const unsigned short *ptr = vptr;
sum = 0;
while (nbytes > 1) {
sum += *ptr++;
nbytes -= 2;
}
if (nbytes == 1) {
oddbyte = 0;
((u8 *)&oddbyte)[0] = *(u8 *)ptr;
((u8 *)&oddbyte)[1] = 0;
sum += oddbyte;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
sum = ~sum & 0xffff;
return sum;
+}
+uint add_ip_checksums(uint offset, uint sum, uint new) +{
ulong checksum;
sum = ~sum & 0xffff;
new = ~new & 0xffff;
if (offset & 1) {
/*
* byte-swap the sum if it came from an odd offset; since the
* computation is endian-independent this works.
*/
new = ((new >> 8) & 0xff) | ((new << 8) & 0xff00);
}
checksum = sum + new;
if (checksum > 0xffff)
checksum -= 0xffff;
return (~checksum) & 0xffff;
+}
+int ip_checksum_ok(const void *addr, uint nbytes) +{
return !(compute_ip_checksum(addr, nbytes) & 0xfffe);
+} diff --git a/net/Makefile b/net/Makefile index 2a700c8401c..fef71b940a0 100644 --- a/net/Makefile +++ b/net/Makefile @@ -5,7 +5,6 @@
#ccflags-y += -DDEBUG
-obj-y += checksum.o
So I don't get it. checksum.o is built unconditionally here, why do we move it to another file?
obj-$(CONFIG_NET) += arp.o obj-$(CONFIG_CMD_BOOTP) += bootp.o obj-$(CONFIG_CMD_CDP) += cdp.o diff --git a/net/checksum.c b/net/checksum.c deleted file mode 100644 index 16ef4163567..00000000000 --- a/net/checksum.c +++ /dev/null @@ -1,59 +0,0 @@ -// SPDX-License-Identifier: BSD-2-Clause -/*
- This file was originally taken from the FreeBSD project.
- Copyright (c) 2001 Charles Mott cm@linktel.net
- Copyright (c) 2008 coresystems GmbH
- All rights reserved.
- */
-#include <common.h> -#include <net.h>
-unsigned compute_ip_checksum(const void *vptr, unsigned nbytes) -{
int sum, oddbyte;
const unsigned short *ptr = vptr;
sum = 0;
while (nbytes > 1) {
sum += *ptr++;
nbytes -= 2;
}
if (nbytes == 1) {
oddbyte = 0;
((u8 *)&oddbyte)[0] = *(u8 *)ptr;
((u8 *)&oddbyte)[1] = 0;
sum += oddbyte;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
sum = ~sum & 0xffff;
return sum;
-}
-unsigned add_ip_checksums(unsigned offset, unsigned sum, unsigned new) -{
unsigned long checksum;
sum = ~sum & 0xffff;
new = ~new & 0xffff;
if (offset & 1) {
/*
* byte-swap the sum if it came from an odd offset; since the
* computation is endian independant this works.
*/
new = ((new >> 8) & 0xff) | ((new << 8) & 0xff00);
}
checksum = sum + new;
if (checksum > 0xffff)
checksum -= 0xffff;
return (~checksum) & 0xffff;
-}
-int ip_checksum_ok(const void *addr, unsigned nbytes) -{
return !(compute_ip_checksum(addr, nbytes) & 0xfffe);
-}
Regards, Bin