From: Ilias Apalodimas <ilias.apalodimas@linaro.org>
To: Maxim Uvarov <maxim.uvarov@linaro.org>
Cc: u-boot@lists.denx.de, pbrobinson@redhat.com,
joe.hershberger@ni.com, rfried.dev@gmail.com, trini@konsulko.com,
goldsimon@gmx.de, lwip-devel@nongnu.org
Subject: Re: [PATCHv5 11/13] net/lwip: connection between cmd and lwip apps
Date: Thu, 3 Aug 2023 11:56:15 +0300 [thread overview]
Message-ID: <ZMtrrzmamvgCxQ74@hades> (raw)
In-Reply-To: <20230802140658.10319-12-maxim.uvarov@linaro.org>
Hi Maxim
On Wed, Aug 02, 2023 at 08:06:56PM +0600, Maxim Uvarov wrote:
> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
> ---
> lib/lwip/Makefile | 2 +
> +
> +#include "apps/dns/lwip-dns.h"
> +#include "apps/ping/lwip_ping.h"
> +#include "ulwip.h"
> +
> +extern int uboot_lwip_init(void);
> +extern int uboot_lwip_loop_is_done(void);
> +
Can't we have these properly defined in .h files?
> +static int do_lwip_info(struct cmd_tbl *cmdtp, int flag, int argc,
> + char *const argv[])
> +{
> + printf("TBD: %s\n", __func__);
This is not an RFC, what's missing from fetching at least something
meaningful? E.g the lwip version?
> + return CMD_RET_SUCCESS;
> +}
> +
> +static int do_lwip_init(struct cmd_tbl *cmdtp, int flag, int argc,
> + char *const argv[])
> +{
> + if (!uboot_lwip_init())
> + return CMD_RET_SUCCESS;
> + return CMD_RET_FAILURE;
> +}
> +
> +static int lwip_empty_tmo(void) { return 0; };
> +int (*ulwip_tmo)(void) = lwip_empty_tmo;
> +void ulwip_set_tmo(int (*tmo)(void))
> +{
> + ulwip_tmo = tmo;
> +}
> +
> +static void ulwip_clear_tmo(void)
> +{
> + ulwip_tmo = lwip_empty_tmo;
> +}
> +
> +static void ulwip_timeout_handler(void)
> +{
> + eth_halt();
> + ulwip_tmo();
> + net_set_state(NETLOOP_FAIL); /* we did not get the reply */
I am not sure what I am reading here. You use callbacks a few lines above
to set a timeout function. But only set it for dhcp. On top of that the
function for DHCP has a case for a *successful* asignment of ip addresses.
Why are we setting the state to fail? And why are we complicating this by
assigning and removing callbacks if it's only used for dhcp?
> + ulwip_loop_set(0);
> +}
> +
> +static int ulwip_loop(void)
> +{
> + ulwip_loop_set(1);
> + if (net_loop(LWIP) < 0) {
> + ulwip_loop_set(0);
> + return CMD_RET_FAILURE;
> + }
> + ulwip_loop_set(0);
both of the cases are using ulwip_loop_set(0). Rewrite this with a ret
value and dont duplicate the function calls
> + return CMD_RET_SUCCESS;
> +}
> +
> +#if defined(CONFIG_CMD_PING)
> +int do_lwip_ping(struct cmd_tbl *cmdtp, int flag, int argc,
> + char *const argv[])
> +{
> + if (argc < 2) {
> + printf("argc = %d, error\n", argc);
> + return CMD_RET_USAGE;
> + }
> +
> + uboot_lwip_init();
> +
> + eth_init(); /* activate u-boot eth dev */
eth_init() can fail
> +
> + printf("Using %s device\n", eth_get_name());
> + printf("pinging addr: %s\n", argv[1]);
> +
> + net_set_timeout_handler(1000UL, ulwip_timeout_handler);
I think it's cleaner to use timeout functions per case instead of carryi ng
around that callback mess
> +
> + if (lwip_ping_init(argv[1])) {
> + printf("ping init fail\n");
> + return CMD_RET_FAILURE;
> + }
> +
> + ping_send_now();
> +
> + return ulwip_loop();
> +}
> +#endif /* CONFIG_CMD_PING */
> +
> +#if defined(CONFIG_CMD_WGET)
> +extern int lwip_wget(ulong addr, char *url);
> +
> +int do_lwip_wget(struct cmd_tbl *cmdtp, int flag, int argc,
> + char *const argv[])
> +{
> + char *url;
> +
> + if (argc < 2) {
> + printf("argc = %d, error\n", argc);
> + return CMD_RET_USAGE;
> + }
> + url = argv[1];
> +
> + uboot_lwip_init();
uboot_lwip_init() needs a rework here. It prints error messages and
doesn't return an error code. You need error checking on the entire
function
> +
> + eth_init(); /* activate u-boot eth dev */
> +
> + lwip_wget(image_load_addr, url);
> +
> + return ulwip_loop();
> +}
> +#endif
> +
> +#if defined(CONFIG_CMD_TFTPBOOT)
> +extern int lwip_tftp(ulong addr, char *filename);
> +
> +int do_lwip_tftp(struct cmd_tbl *cmdtp, int flag, int argc,
> + char *const argv[])
> +{
> + char *filename;
> + ulong addr;
> + char *end;
> + int ret;
> +
> + switch (argc) {
> + case 1:
> + filename = env_get("bootfile");
> + break;
> + case 2:
> + /*
> + * Only one arg - accept two forms:
> + * Just load address, or just boot file name. The latter
> + * form must be written in a format which can not be
> + * mis-interpreted as a valid number.
> + */
> + addr = hextoul(argv[1], &end);
> + if (end == (argv[1] + strlen(argv[1]))) {
> + image_load_addr = addr;
> + filename = env_get("bootfile");
> + } else {
> + filename = argv[1];
> + }
> + break;
> + case 3:
> + image_load_addr = hextoul(argv[1], NULL);
> + filename = argv[2];
> + break;
> + default:
> + return CMD_RET_USAGE;
> + }
> +
> + uboot_lwip_init();
> +
> + eth_init(); /* activate u-boot eth dev */
similar comments here, check return codes etc
> +
> + ret = lwip_tftp(image_load_addr, filename);
filename can be NULL
> + if (ret)
> + return ret;
> +
> + return ulwip_loop();
> +}
> +#endif /* CONFIG_CMD_TFTPBOOT */
> +
> +#if defined(CONFIG_CMD_DHCP)
> +extern int ulwip_dhcp(void);
> +
> +int do_lwip_dhcp(void)
> +{
> + int ret;
> + char *filename;
> +
> + uboot_lwip_init();
> +
> + ret = ulwip_dhcp();
> +
> + net_set_timeout_handler(2000UL, ulwip_timeout_handler);
> +
> + ulwip_loop();
> + if (IS_ENABLED(CONFIG_CMD_TFTPBOOT)) {
> + ulwip_clear_tmo();
> +
> + filename = env_get("bootfile");
> + if (!filename) {
> + printf("no bootfile\n");
> + return CMD_RET_FAILURE;
Why is this a failure? You just have the tftp command enabled but dont
want to download anything
> + }
> +
> + eth_init(); /* activate u-boot eth dev */
return codes etc
> + net_set_timeout_handler(20000UL, ulwip_timeout_handler);
> + lwip_tftp(image_load_addr, filename);
> +
> + ret = ulwip_loop();
> + }
> +
> + return ret;
> +}
> +
> +static int _do_lwip_dhcp(struct cmd_tbl *cmdtp, int flag, int argc,
> + char *const argv[])
> +{
> + return do_lwip_dhcp();
> +}
> +#endif /* CONFIG_CMD_DHCP */
> +
> +#if defined(CONFIG_CMD_DNS)
> +int do_lwip_dns(struct cmd_tbl *cmdtp, int flag, int argc,
> + char *const argv[])
> +{
> + int ret;
> + char *name;
> + char *varname;
> + int LWIP_ERR_INPROGRESS = -5;
This should be a define in lwip somewhere if its a documented value. If
not drop the caps
> +
> + if (argc == 1)
> + return CMD_RET_USAGE;
> +
> + name = argv[1];
> +
> + if (argc == 3)
> + varname = argv[2];
> + else
> + varname = NULL;
> +
> + uboot_lwip_init();
> +
> + ret = ulwip_dns(name, varname);
> + if (ret == 0)
> + return CMD_RET_SUCCESS;
> + if (ret != LWIP_ERR_INPROGRESS)
> + return CMD_RET_FAILURE;
> +
> + net_set_timeout_handler(1000UL, ulwip_timeout_handler);
> +
> + return ulwip_loop();
> +}
> +#endif /* CONFIG_CMD_DNS */
> +
> +static struct cmd_tbl cmds[] = {
> + U_BOOT_CMD_MKENT(info, 1, 0, do_lwip_info, "Info and stats", ""),
> + U_BOOT_CMD_MKENT(init, 1, 0, do_lwip_init,
> + "initialize lwip stack", ""),
> +#if defined(CONFIG_CMD_LWIP_PING)
> + U_BOOT_CMD_MKENT(ping, 2, 0, do_lwip_ping,
> + "send ICMP ECHO_REQUEST to network host",
> + "pingAddress"),
> +#endif
> +#if defined(CONFIG_CMD_WGET)
> + U_BOOT_CMD_MKENT(wget, 2, 0, do_lwip_wget, "", ""),
> +#endif
> +#if defined(CONFIG_CMD_TFTPBOOT)
> + U_BOOT_CMD_MKENT(tftp, 3, 0, do_lwip_tftp,
> + "boot image via network using TFTP protocol\n",
> + "[loadAddress] [[hostIPaddr:]bootfilename]"),
> +#endif
> +#if defined(CONFIG_CMD_DHCP)
> + U_BOOT_CMD_MKENT(dhcp, 1, 0, _do_lwip_dhcp,
> + "boot image via network using DHCP/TFTP protocol",
> + ""),
> +#endif
> +#if defined(CONFIG_CMD_DNS)
> + U_BOOT_CMD_MKENT(dns, 3, 0, do_lwip_dns,
> + "lookup dns name [and store address at variable]",
> + ""),
> +#endif
> +};
> +
> +static int do_ops(struct cmd_tbl *cmdtp, int flag, int argc,
> + char *const argv[])
> +{
> + struct cmd_tbl *cp;
> +
> + cp = find_cmd_tbl(argv[1], cmds, ARRAY_SIZE(cmds));
> +
> + argc--;
> + argv++;
> +
> + if (cp == NULL || 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(
> + lwip, 4, 1, do_ops,
> + "LWIP sub system",
> + "info - display info\n"
> + "init - init LWIP\n"
> + "ping addr - pingAddress\n"
> + "wget http://IPadress/url/\n"
> + "tftp [loadAddress] [[hostIPaddr:]bootfilename]\n"
> + "dhcp - boot image via network using DHCP/TFTP protocol\n"
> + );
> +
> +/* Old command kept for compatibility. Same as 'mmc info' */
> +U_BOOT_CMD(
> + lwipinfo, 1, 0, do_lwip_info,
> + "display LWIP info",
> + "- display LWIP stack info"
> +);
> --
> 2.30.2
>
Regards
/Ilias
next prev parent reply other threads:[~2023-08-03 8:56 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-02 14:06 [PATCHv5 00/13] net/lwip: add lwip library for the network stack Maxim Uvarov
2023-08-02 14:06 ` [PATCHv5 01/13] net/lwip: add doc/develop/net_lwip.rst Maxim Uvarov
2023-08-02 21:31 ` Simon Glass
2023-08-02 14:06 ` [PATCHv5 02/13] net/lwip: integrate lwip library Maxim Uvarov
2023-08-02 21:31 ` Simon Glass
2023-08-03 14:18 ` Maxim Uvarov
2023-08-02 14:06 ` [PATCHv5 03/13] net/lwip: implement dns cmd Maxim Uvarov
2023-08-02 21:31 ` Simon Glass
2023-08-02 14:06 ` [PATCHv5 04/13] net/lwip: implement dhcp cmd Maxim Uvarov
2023-08-03 6:26 ` Ilias Apalodimas
2023-08-03 14:34 ` Maxim Uvarov
2023-08-02 14:06 ` [PATCHv5 05/13] net/lwip: implement tftp cmd Maxim Uvarov
2023-08-03 6:42 ` Ilias Apalodimas
2023-08-10 11:28 ` Maxim Uvarov
2023-08-10 19:23 ` Simon Goldschmidt
2023-08-02 14:06 ` [PATCHv5 06/13] net/lwip: implement wget cmd Maxim Uvarov
2023-08-03 6:48 ` Ilias Apalodimas
2023-08-03 14:59 ` Maxim Uvarov
2023-08-02 14:06 ` [PATCHv5 07/13] net/lwip: implement ping cmd Maxim Uvarov
2023-08-03 9:32 ` Ilias Apalodimas
2023-08-03 15:25 ` Maxim Uvarov
2023-08-02 14:06 ` [PATCHv5 08/13] net/lwip: add lwip configuration configuration Maxim Uvarov
2023-08-02 14:06 ` [PATCHv5 09/13] net/lwip: implement lwip port to u-boot Maxim Uvarov
2023-08-02 21:31 ` Simon Glass
2023-08-03 16:21 ` Maxim Uvarov
2023-08-08 10:07 ` Maxim Uvarov
2023-08-08 17:54 ` Simon Glass
2023-08-02 14:06 ` [PATCHv5 10/13] net/lwip: update .gitignore with lwip Maxim Uvarov
2023-08-02 21:31 ` Simon Glass
2023-08-03 6:01 ` Ilias Apalodimas
2023-08-02 14:06 ` [PATCHv5 11/13] net/lwip: connection between cmd and lwip apps Maxim Uvarov
2023-08-02 21:31 ` Simon Glass
2023-08-03 8:56 ` Ilias Apalodimas [this message]
2023-08-08 12:19 ` Maxim Uvarov
2023-08-08 18:12 ` Ilias Apalodimas
2023-08-09 19:29 ` Maxim Uvarov
2023-08-02 14:06 ` [PATCHv5 12/13] net/lwip: replace original net commands with lwip Maxim Uvarov
2023-08-02 21:31 ` Simon Glass
2023-08-08 14:05 ` Maxim Uvarov
2023-08-08 17:54 ` Simon Glass
2023-08-02 14:06 ` [PATCHv5 13/13] net/lwip: drop old net/wget Maxim Uvarov
2023-08-02 14:19 ` Maxim Uvarov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZMtrrzmamvgCxQ74@hades \
--to=ilias.apalodimas@linaro.org \
--cc=goldsimon@gmx.de \
--cc=joe.hershberger@ni.com \
--cc=lwip-devel@nongnu.org \
--cc=maxim.uvarov@linaro.org \
--cc=pbrobinson@redhat.com \
--cc=rfried.dev@gmail.com \
--cc=trini@konsulko.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.