net: introduce CONFIG_DNS

Introduce the DNS Kconfig symbol so that various network commands may
use host names without the dns command (CMD_DNS) being selected.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
CC: E Shattow <e@freeshell.de>
This commit is contained in:
Jerome Forissier
2025-07-18 12:48:48 +02:00
parent 425f9839f3
commit 512be89796
12 changed files with 138 additions and 126 deletions

View File

@@ -244,11 +244,17 @@ config NET_RANDOM_ETHADDR
generated. It will be saved to the appropriate environment variable,
too.
config DNS
bool "Enable DNS resolutions"
select PROT_DNS_LWIP if NET_LWIP
help
Selecting this will allow the network stack to use server names
in addition to IP addresses.
config WGET
bool "Enable wget"
select PROT_TCP if NET
select PROT_TCP_LWIP if NET_LWIP
select PROT_DNS_LWIP if NET_LWIP
help
Selecting this will enable wget, an interface to send HTTP requests
via the network stack.

View File

@@ -10,7 +10,7 @@ ifeq ($(CONFIG_NET),y)
obj-$(CONFIG_NET) += arp.o
obj-$(CONFIG_CMD_BOOTP) += bootp.o
obj-$(CONFIG_CMD_CDP) += cdp.o
obj-$(CONFIG_CMD_DNS) += dns.o
obj-$(CONFIG_DNS) += dns.o
obj-$(CONFIG_CMD_LINK_LOCAL) += link_local.o
obj-$(CONFIG_IPV6) += ndisc.o
obj-$(CONFIG_$(PHASE_)DM_ETH) += net.o

View File

@@ -2,6 +2,7 @@ ccflags-y += -I$(srctree)/lib/lwip/lwip/src/include -I$(srctree)/lib/lwip/u-boot
obj-$(CONFIG_$(PHASE_)DM_ETH) += net-lwip.o
obj-$(CONFIG_CMD_DHCP) += dhcp.o
obj-$(CONFIG_DNS) += dns.o
obj-$(CONFIG_LWIP_ICMP_SHOW_UNREACH) += icmp_unreach.o
obj-$(CONFIG_CMD_TFTPBOOT) += tftp.o
obj-$(CONFIG_WGET) += wget.o

113
net/lwip/dns.c Normal file
View File

@@ -0,0 +1,113 @@
// SPDX-License-Identifier: GPL-2.0+
/* Copyright (C) 2024 Linaro Ltd. */
#include <command.h>
#include <console.h>
#include <env.h>
#include <lwip/dns.h>
#include <lwip/timeouts.h>
#include <net.h>
#include <time.h>
#define DNS_RESEND_MS 1000
#define DNS_TIMEOUT_MS 10000
struct dns_cb_arg {
ip_addr_t host_ipaddr;
const char *var;
bool done;
};
static void do_dns_tmr(void *arg)
{
dns_tmr();
}
static void dns_cb(const char *name, const ip_addr_t *ipaddr, void *arg)
{
struct dns_cb_arg *dns_cb_arg = arg;
char *ipstr = ip4addr_ntoa(ipaddr);
dns_cb_arg->done = true;
if (!ipaddr) {
printf("DNS: host not found\n");
dns_cb_arg->host_ipaddr.addr = 0;
return;
}
dns_cb_arg->host_ipaddr.addr = ipaddr->addr;
if (dns_cb_arg->var)
env_set(dns_cb_arg->var, ipstr);
}
static int dns_loop(struct udevice *udev, const char *name, const char *var)
{
struct dns_cb_arg dns_cb_arg = { };
struct netif *netif;
ip_addr_t ipaddr;
ulong start;
int ret;
dns_cb_arg.var = var;
netif = net_lwip_new_netif(udev);
if (!netif)
return CMD_RET_FAILURE;
if (net_lwip_dns_init()) {
net_lwip_remove_netif(netif);
return CMD_RET_FAILURE;
}
dns_cb_arg.done = false;
ret = dns_gethostbyname(name, &ipaddr, dns_cb, &dns_cb_arg);
if (ret == ERR_OK) {
dns_cb(name, &ipaddr, &dns_cb_arg);
} else if (ret == ERR_INPROGRESS) {
start = get_timer(0);
sys_timeout(DNS_RESEND_MS, do_dns_tmr, NULL);
do {
net_lwip_rx(udev, netif);
if (dns_cb_arg.done)
break;
if (ctrlc()) {
printf("\nAbort\n");
break;
}
} while (get_timer(start) < DNS_TIMEOUT_MS);
sys_untimeout(do_dns_tmr, NULL);
}
net_lwip_remove_netif(netif);
if (dns_cb_arg.done && dns_cb_arg.host_ipaddr.addr != 0) {
if (!var)
printf("%s\n", ipaddr_ntoa(&ipaddr));
return CMD_RET_SUCCESS;
}
return CMD_RET_FAILURE;
}
int do_dns(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
{
char *name;
char *var = NULL;
if (argc == 1 || argc > 3)
return CMD_RET_USAGE;
name = argv[1];
if (argc == 3)
var = argv[2];
if (net_lwip_eth_start() < 0)
return CMD_RET_FAILURE;
return dns_loop(eth_get_dev(), name, var);
}

View File

@@ -147,7 +147,7 @@ static int get_udev_ipv4_info(struct udevice *dev, ip4_addr_t *ip,
*/
int net_lwip_dns_init(void)
{
#if CONFIG_IS_ENABLED(CMD_DNS)
#if CONFIG_IS_ENABLED(DNS)
bool has_server = false;
ip_addr_t ns;
char *nsenv;
@@ -364,7 +364,7 @@ int net_lwip_rx(struct udevice *udev, struct netif *netif)
*/
int net_lwip_dns_resolve(char *name_or_ip, ip_addr_t *ip)
{
#if defined(CONFIG_CMD_DNS)
#if defined(CONFIG_DNS)
char *var = "_dnsres";
char *argv[] = { "dns", name_or_ip, var, NULL };
int argc = ARRAY_SIZE(argv) - 1;
@@ -373,7 +373,7 @@ int net_lwip_dns_resolve(char *name_or_ip, ip_addr_t *ip)
if (ipaddr_aton(name_or_ip, ip))
return 0;
#if defined(CONFIG_CMD_DNS)
#if defined(CONFIG_DNS)
if (do_dns(NULL, 0, argc, argv) != CMD_RET_SUCCESS)
return -1;

View File

@@ -114,7 +114,7 @@
#include "bootp.h"
#include "cdp.h"
#include "dhcpv6.h"
#if defined(CONFIG_CMD_DNS)
#if defined(CONFIG_DNS)
#include "dns.h"
#endif
#include "link_local.h"
@@ -287,7 +287,7 @@ static int on_vlan(const char *name, const char *value, enum env_op op,
}
U_BOOT_ENV_CALLBACK(vlan, on_vlan);
#if defined(CONFIG_CMD_DNS)
#if defined(CONFIG_DNS)
static int on_dnsip(const char *name, const char *value, enum env_op op,
int flags)
{
@@ -581,7 +581,7 @@ restart:
nc_start();
break;
#endif
#if defined(CONFIG_CMD_DNS)
#if defined(CONFIG_DNS)
case DNS:
dns_start();
break;
@@ -1506,7 +1506,7 @@ static int net_check_prereq(enum proto_t protocol)
}
goto common;
#endif
#if defined(CONFIG_CMD_DNS)
#if defined(CONFIG_DNS)
case DNS:
if (net_dns_server.s_addr == 0) {
puts("*** ERROR: DNS server address not given\n");
@@ -1539,7 +1539,7 @@ static int net_check_prereq(enum proto_t protocol)
return 1;
}
#if defined(CONFIG_CMD_PING) || \
defined(CONFIG_CMD_DNS) || defined(CONFIG_PROT_UDP)
defined(CONFIG_DNS) || defined(CONFIG_PROT_UDP)
common:
#endif
/* Fall through */

View File

@@ -393,7 +393,7 @@ int wget_do_request(ulong dst_addr, char *uri)
if (string_to_ip(host_name).s_addr) {
s = host_name;
} else {
#if IS_ENABLED(CONFIG_CMD_DNS)
#if IS_ENABLED(CONFIG_DNS)
net_dns_resolve = host_name;
net_dns_env_var = "httpserverip";
if (net_loop(DNS) < 0) {