Re: [PATCH v5 12/20] net: split cmd/net.c into cmd/net.c and cmd/net-common.c

Ilias Apalodimas
2024-07-29T12:42:20Z

On Thu, 25 Jul 2024 at 15:59, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
> Extract some code from cmd/net.c that will be useful in a subsequent
> commit to implement wget with NET_LWIP.
>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
> cmd/Makefile | 5 ++-
> cmd/net-common.c | 109 ++++++++++++++++++++++++++++++++++++++++++++
> cmd/net.c | 115 -----------------------------------------------
> 3 files changed, 113 insertions(+), 116 deletions(-)
> create mode 100644 cmd/net-common.c
>
> diff --git a/cmd/Makefile b/cmd/Makefile
> index fe733cf6ba9..2c3de45a074 100644
> --- a/cmd/Makefile
> +++ b/cmd/Makefile
> @@ -130,7 +130,10 @@ obj-$(CONFIG_CMD_NAND) += nand.o
> ifdef CONFIG_CMD_NET
> obj-$(CONFIG_NET) += net.o
> obj-$(CONFIG_NET_LWIP) += net-lwip.o
> -CFLAGS_net-lwip.o := -I$(srctree)/lib/lwip/lwip/src/include -I$(srctree)/lib/lwip/u-boot
> +obj-$(filter y,$(CONFIG_CMD_NET) $(CONFIG_CMD_NET_LWIP)) += net-common.o
> +lwip-includes := -I$(srctree)/lib/lwip/lwip/src/include -I$(srctree)/lib/lwip/u-boot
> +CFLAGS_net-lwip.o := $(lwip-includes)
> +CFLAGS_net-common.o := $(lwip-includes)
> endif
> obj-$(CONFIG_ENV_SUPPORT) += nvedit.o
> obj-$(CONFIG_CMD_NVEDIT_EFI) += nvedit_efi.o
> diff --git a/cmd/net-common.c b/cmd/net-common.c
> new file mode 100644
> index 00000000000..1c9fb83b896
> --- /dev/null
> +++ b/cmd/net-common.c
> @@ -0,0 +1,109 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * (C) Copyright 2000
> + * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
> + */
> +
> +#include <command.h>
> +#include <dm/device.h>
> +#include <dm/uclass.h>
> +#include <net.h>
> +#include <linux/compat.h>
> +#include <linux/ethtool.h>
> +
> +static int do_net_list(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
> +{
> + const struct udevice *current = eth_get_dev();
> + unsigned char env_enetaddr[ARP_HLEN];
> + const struct udevice *dev;
> + struct uclass *uc;
> +
> + uclass_id_foreach_dev(UCLASS_ETH, dev, uc) {
> + eth_env_get_enetaddr_by_index("eth", dev_seq(dev), env_enetaddr);
> + printf("eth%d : %s %pM %s\n", dev_seq(dev), dev->name, env_enetaddr,
> + current == dev ? "active" : "");
> + }
> + return CMD_RET_SUCCESS;
> +}
> +
> +static int do_net_stats(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
> +{
> + int nstats, err, i, off;
> + struct udevice *dev;
> + u64 *values;
> + u8 *strings;
> +
> + if (argc < 2)
> + return CMD_RET_USAGE;
> +
> + err = uclass_get_device_by_name(UCLASS_ETH, argv[1], &dev);
> + if (err) {
> + printf("Could not find device %s\n", argv[1]);
> + return CMD_RET_FAILURE;
> + }
> +
> + if (!eth_get_ops(dev)->get_sset_count ||
> + !eth_get_ops(dev)->get_strings ||
> + !eth_get_ops(dev)->get_stats) {
> + printf("Driver does not implement stats dump!\n");
> + return CMD_RET_FAILURE;
> + }
> +
> + nstats = eth_get_ops(dev)->get_sset_count(dev);
> + strings = kcalloc(nstats, ETH_GSTRING_LEN, GFP_KERNEL);
> + if (!strings)
> + return CMD_RET_FAILURE;
> +
> + values = kcalloc(nstats, sizeof(u64), GFP_KERNEL);
> + if (!values)
> + goto err_free_strings;
> +
> + eth_get_ops(dev)->get_strings(dev, strings);
> + eth_get_ops(dev)->get_stats(dev, values);
> +
> + off = 0;
> + for (i = 0; i < nstats; i++) {
> + printf(" %s: %llu\n", &strings[off], values[i]);
> + off += ETH_GSTRING_LEN;
> + };
> +
> + kfree(strings);
> + kfree(values);
> +
> + return CMD_RET_SUCCESS;
> +
> +err_free_strings:
> + kfree(strings);
> +
> + return CMD_RET_FAILURE;
> +}
> +
> +static struct cmd_tbl cmd_net[] = {
> + U_BOOT_CMD_MKENT(list, 1, 0, do_net_list, "", ""),
> + U_BOOT_CMD_MKENT(stats, 2, 0, do_net_stats, "", ""),
> +};
> +
> +static int do_net(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
> +{
> + struct cmd_tbl *cp;
> +
> + cp = find_cmd_tbl(argv[1], cmd_net, ARRAY_SIZE(cmd_net));
> +
> + /* Drop the net command */
> + argc--;
> + argv++;
> +
> + if (!cp || argc > cp->maxargs)
> + return CMD_RET_USAGE;
> + if (flag == CMD_FLAG_REPEAT && !cmd_is_repeatable(cp))
> + return CMD_RET_SUCCESS;
> +
> + return cp->cmd(cmdtp, flag, argc, argv);
> +}
> +
> +U_BOOT_CMD(
> + net, 3, 1, do_net,
> + "NET sub-system",
> + "list - list available devices\n"
> + "stats <device> - dump statistics for specified device\n"
> +);
> diff --git a/cmd/net.c b/cmd/net.c
> index b206ff58e68..ad5aaf9245e 100644
> --- a/cmd/net.c
> +++ b/cmd/net.c
> @@ -675,118 +675,3 @@ U_BOOT_CMD(
> );
>
> #endif /* CONFIG_CMD_LINK_LOCAL */
> -
> -static int do_net_list(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
> -{
> - const struct udevice *current = eth_get_dev();
> - unsigned char env_enetaddr[ARP_HLEN];
> - const struct udevice *dev;
> - struct uclass *uc;
> -
> - uclass_id_foreach_dev(UCLASS_ETH, dev, uc) {
> - eth_env_get_enetaddr_by_index("eth", dev_seq(dev), env_enetaddr);
> - printf("eth%d : %s %pM %s\n", dev_seq(dev), dev->name, env_enetaddr,
> - current == dev ? "active" : "");
> - }
> - return CMD_RET_SUCCESS;
> -}
> -
> -static int do_net_stats(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
> -{
> - int nstats, err, i, off;
> - struct udevice *dev;
> - u64 *values;
> - u8 *strings;
> -
> - if (argc < 2)
> - return CMD_RET_USAGE;
> -
> - err = uclass_get_device_by_name(UCLASS_ETH, argv[1], &dev);
> - if (err) {
> - printf("Could not find device %s\n", argv[1]);
> - return CMD_RET_FAILURE;
> - }
> -
> - if (!eth_get_ops(dev)->get_sset_count ||
> - !eth_get_ops(dev)->get_strings ||
> - !eth_get_ops(dev)->get_stats) {
> - printf("Driver does not implement stats dump!\n");
> - return CMD_RET_FAILURE;
> - }
> -
> - nstats = eth_get_ops(dev)->get_sset_count(dev);
> - strings = kcalloc(nstats, ETH_GSTRING_LEN, GFP_KERNEL);
> - if (!strings)
> - return CMD_RET_FAILURE;
> -
> - values = kcalloc(nstats, sizeof(u64), GFP_KERNEL);
> - if (!values)
> - goto err_free_strings;
> -
> - eth_get_ops(dev)->get_strings(dev, strings);
> - eth_get_ops(dev)->get_stats(dev, values);
> -
> - off = 0;
> - for (i = 0; i < nstats; i++) {
> - printf(" %s: %llu\n", &strings[off], values[i]);
> - off += ETH_GSTRING_LEN;
> - };
> -
> - return CMD_RET_SUCCESS;
> -
> -err_free_strings:
> - kfree(strings);
> -
> - return CMD_RET_FAILURE;
> -}
> -
> -static struct cmd_tbl cmd_net[] = {
> - U_BOOT_CMD_MKENT(list, 1, 0, do_net_list, "", ""),
> - U_BOOT_CMD_MKENT(stats, 2, 0, do_net_stats, "", ""),
> -};
> -
> -static int do_net(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
> -{
> - struct cmd_tbl *cp;
> -
> - cp = find_cmd_tbl(argv[1], cmd_net, ARRAY_SIZE(cmd_net));
> -
> - /* Drop the net command */
> - argc--;
> - argv++;
> -
> - if (!cp || argc > cp->maxargs)
> - return CMD_RET_USAGE;
> - if (flag == CMD_FLAG_REPEAT && !cmd_is_repeatable(cp))
> - return CMD_RET_SUCCESS;
> -
> - return cp->cmd(cmdtp, flag, argc, argv);
> -}
> -
> -U_BOOT_CMD(
> - net, 3, 1, do_net,
> - "NET sub-system",
> - "list - list available devices\n"
> - "stats <device> - dump statistics for specified device\n"
> -);
> -
> -#if defined(CONFIG_CMD_NCSI)
> -static int do_ncsi(struct cmd_tbl *cmdtp, int flag, int argc, char * const argv[])
> -{
> - if (!phy_interface_is_ncsi() || !ncsi_active()) {
> - printf("Device not configured for NC-SI\n");
> - return CMD_RET_FAILURE;
> - }
> -
> - if (net_loop(NCSI) < 0)
> - return CMD_RET_FAILURE;
> -
> - return CMD_RET_SUCCESS;
> -}
> -
> -U_BOOT_CMD(
> - ncsi, 1, 1, do_ncsi,
> - "Configure attached NIC via NC-SI",
> - ""
> -);
> -#endif /* CONFIG_CMD_NCSI */
> --
> 2.40.1
>

Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>