[PATCHv7 03/15] net/lwip: implement dns cmd

Maxim Uvarov maxim.uvarov at linaro.org
Fri Sep 1 16:49:28 CEST 2023


On Wed, 23 Aug 2023 at 00:58, Simon Glass <sjg at google.com> wrote:

> Hi Maxim,
>
> On Tue, 22 Aug 2023 at 03:39, Maxim Uvarov <maxim.uvarov at 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.uvarov at 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.


> > +int ulwip_dns(char *name, char *varname);
> > 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.uvarov at 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));
> > +
> > +       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.



> > +
> > +       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.



> > +               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
+ */


> > +}
> > --
> > 2.30.2
> >
>
> Regards,
> Simon
>


More information about the U-Boot mailing list