Hi Maxim, On Fri, 1 Sept 2023 at 08:49, Maxim Uvarov <maxim.uva...@linaro.org> wrote: > > > > On Wed, 23 Aug 2023 at 00:58, Simon Glass <s...@google.com> wrote: >> >> Hi Maxim, >> >> On Tue, 22 Aug 2023 at 03:39, Maxim Uvarov <maxim.uva...@linaro.org> wrote: >> > >> > U-Boot recently got support for an alternative network stack using LWIP. >> > Replace dns command with the LWIP variant while keeping the output and >> > error messages identical. >> > >> > Signed-off-by: Maxim Uvarov <maxim.uva...@linaro.org> >> > --- >> > include/net/lwip.h | 19 +++++++++++++++ >> > net/lwip/Makefile | 2 ++ >> > net/lwip/apps/dns/lwip-dns.c | 46 ++++++++++++++++++++++++++++++++++++ >> > 3 files changed, 67 insertions(+) >> > create mode 100644 include/net/lwip.h >> > create mode 100644 net/lwip/apps/dns/lwip-dns.c >> > >> > diff --git a/include/net/lwip.h b/include/net/lwip.h >> > new file mode 100644 >> > index 0000000000..cda896d062 >> > --- /dev/null >> > +++ b/include/net/lwip.h >> > @@ -0,0 +1,19 @@ >> > +/* SPDX-License-Identifier: GPL-2.0 */ >> > + >> > +int do_lwip_dns(struct cmd_tbl *cmdtp, int flag, int argc, >> > + char *const argv[]); >> >> Please make sure you comment all exported functions, including the return >> value. >> >> > + >> > +/** >> > + * ulwip_dns() - creates the DNS request to resolve a domain host name >> > + * >> > + * This function creates the DNS request to resolve a domain host name. >> > Function >> > + * can return immediately if previous request was cached or it might >> > require >> > + * entering the polling loop for a request to a remote server. >> > + * >> > + * @name: dns name to resolve >> > + * @varname: (optional) U-Boot variable name to store the result >> > + * Returns: ERR_OK(0) for fetching entry from the cache >> > + * ERR_INPROGRESS(-5) success, can go to the polling loop >> > + * Other value < 0, if error >> > + */ > > > here.
That seems to be a different function? > >> >> > +int ulwip_dns(char *name, char *varname); This one has no comment? >> > diff --git a/net/lwip/Makefile b/net/lwip/Makefile >> > index d1161bea78..6d2c00605b 100644 >> > --- a/net/lwip/Makefile >> > +++ b/net/lwip/Makefile >> > @@ -64,3 +64,5 @@ obj-$(CONFIG_NET) += $(LWIPDIR)/netif/ethernet.o >> > >> > obj-$(CONFIG_NET) += port/if.o >> > obj-$(CONFIG_NET) += port/sys-arch.o >> > + >> > +obj-$(CONFIG_CMD_DNS) += apps/dns/lwip-dns.o >> > diff --git a/net/lwip/apps/dns/lwip-dns.c b/net/lwip/apps/dns/lwip-dns.c >> > new file mode 100644 >> > index 0000000000..6e205c1153 >> > --- /dev/null >> > +++ b/net/lwip/apps/dns/lwip-dns.c >> > @@ -0,0 +1,46 @@ >> > +// SPDX-License-Identifier: GPL-2.0 >> > + >> > +/* >> > + * (C) Copyright 2023 Linaro Ltd. <maxim.uva...@linaro.org> >> > + */ >> > + >> > +#include <common.h> >> > +#include <command.h> >> > +#include <console.h> >> > + >> > +#include <lwip/dns.h> >> > +#include <lwip/ip_addr.h> >> > + >> > +#include <net/ulwip.h> >> > + >> > +static void dns_found_cb(const char *name, const ip_addr_t *ipaddr, void >> > *callback_arg) >> > +{ >> > + char *varname = (char *)callback_arg; >> > + >> > + if (varname) >> > + env_set(varname, ip4addr_ntoa(ipaddr)); That can fail >> > + >> > + log_info("resolved %s to %s\n", name, ip4addr_ntoa(ipaddr)); >> > + ulwip_exit(0); >> > +} >> > + >> > +int ulwip_dns(char *name, char *varname) >> > +{ >> > + int err; >> > + ip_addr_t ipaddr; /* not used */ >> > + ip_addr_t dns1; >> > + ip_addr_t dns2; >> > + >> > + ipaddr_aton(env_get("dnsip"), &dns1); >> > + ipaddr_aton(env_get("dnsip2"), &dns2); >> >> What if the env_get() fails? Won't that return NULL? >> > > all of these functions will not crash, they have null check. You can set > dnsip or dnsip2 or both. If both are not set then dns cmd will not look up > anything. > We can exit earlier here, but that is a common case and nothing bad if we > make code simpler and exit a little bit later. OK but I cannot see where the error is returned? > > >> >> > + >> > + dns_init(); >> > + dns_setserver(0, &dns1); >> > + dns_setserver(1, &dns2); >> >> Can either of these fail? >> >> Please be very attentive to error-checking. > > > All above functions are void. But they have LWIP_ASSERT() for sanity checks > in some places. > >> >> >> > + >> > + err = dns_gethostbyname(name, &ipaddr, dns_found_cb, varname); >> > + if (err == ERR_OK) >> >> Is that 0? If so, then if (err) is better >> > > dns_gethostbyname() returns ERR_OK which is defined > net/lwip/lwip-external/src/include/lwip/err.h. > Yes it's defined to 0 and maybe always will be defined to 0. But that may > change. And I would keep > the check against the same return macro that the function does. I cannot imagine it changing. > > >> >> > + dns_found_cb(name, &ipaddr, varname); >> > + >> > + return err; >> >> I am not sure what that is, but will review it when you add the header >> comments. >> > In the header file of this function is an explanation. It's above in this > patch: > + * Returns: ERR_OK(0) for fetching entry from the cache > + * ERR_INPROGRESS(-5) success, can go to the polling loop > + * Other value < 0, if error > + */ OK, so what I am getting at is trying to understand the error conversion. It seems that lwip uses different numbering from U-Boot/Linux, so we need to do a conversion somewhere? Regards, Simon