[U-Boot] [PATCH v3 010/108] net: Move the checksum functions to lib/

Bin Meng bmeng.cn at gmail.com
Mon Oct 28 04:45:27 UTC 2019


Hi Simon,

On Mon, Oct 21, 2019 at 11:33 AM Simon Glass <sjg at 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 at 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 at 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


More information about the U-Boot mailing list