[PATCHv8 03/15] net/lwip: implement dns cmd
Simon Goldschmidt
goldsimon at gmx.de
Wed Sep 13 10:32:25 CEST 2023
On 13.09.2023 07:56, Ilias Apalodimas wrote:
> On Fri, Sep 08, 2023 at 07:53:08PM +0600, Maxim Uvarov 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 | 63 ++++++++++++++++++++++++++++++++++++
>> 3 files changed, 84 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..ab3db1a214
>> --- /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[]);
>> +
>> +/**
>> + * 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
>> + * -EINPROGRESS success, can go to the polling loop
>> + * Other value < 0, if error
>> + */
>> +int ulwip_dns(char *name, char *varname);
>> diff --git a/net/lwip/Makefile b/net/lwip/Makefile
>> index 3fd5d34564..5d8d5527c6 100644
>> --- a/net/lwip/Makefile
>> +++ b/net/lwip/Makefile
>> @@ -62,3 +62,5 @@ obj-$(CONFIG_NET) += lwip-external/src/netif/ethernet.o
>>
>> obj-$(CONFIG_NET) += port/if.o
>> obj-$(CONFIG_NET) += port/sys-arch.o
>> +
>> +obj-y += 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..b340302f2c
>> --- /dev/null
>> +++ b/net/lwip/apps/dns/lwip-dns.c
>> @@ -0,0 +1,63 @@
>> +// 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;
>> + char *ipstr = ip4addr_ntoa(ipaddr);
>> +
>> + if (varname)
>> + env_set(varname, ipstr);
>> + log_info("resolved %s to %s\n", name, ipstr);
>> + 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;
>> + char *dnsenv = env_get("dnsip");
>> + char *dns2env = env_get("dnsip2");
>> +
>> + if (!dnsenv && !dns2env) {
>> + log_err("nameserver is not set with dnsip and dnsip2 vars\n");
>> + return -ENOENT;
>> + }
>> +
>> + if (!dnsenv)
>> + log_warning("dnsip var is not set\n");
>> + if (!dns2env)
>> + log_warning("dnsip2 var is not set\n");
>> +
>> + dns_init();
>> +
>> + if (ipaddr_aton(dnsenv, &dns1))
>> + dns_setserver(0, &dns1);
>> +
>> + if (ipaddr_aton(dns2env, &dns2))
>> + dns_setserver(1, &dns2);
>
> env_get will return NULL if any of these is not set. Looking at
> ipaddr_aton() of lwip that might lead to a NULL deref in ip_2_ip6()
Looking at the NULL checks in ipaddr_aton(), you found a bug in lwIP.
I'd vote to leave the above code as is and rely on the bug being fixed
in lwIP before U-Boot enables IPv6 (this is only a bug in dual-stack
mode where IPv4 and IPv6 is enabled).
Regards,
Simon
>
>> +
>> + err = dns_gethostbyname(name, &ipaddr, dns_found_cb, varname);
>> + if (err == ERR_OK)
>> + dns_found_cb(name, &ipaddr, varname);
>> +
>> + /* convert lwIP ERR_INPROGRESS to U-Boot -EINPROGRESS */
>> + if (err == ERR_INPROGRESS)
>> + err = -EINPROGRESS;
>> +
>> + return err;
>> +}
>> --
>> 2.30.2
>>
More information about the U-Boot
mailing list