[PATCH v11 13/29] net-lwip: add DHCP support and dhcp commmand
Jerome Forissier
jerome.forissier at linaro.org
Fri Oct 4 10:43:00 CEST 2024
On 10/4/24 08:50, Ilias Apalodimas wrote:
> Hi Jerome,
>
> [...]
>
>
>> +#define DHCP_TIMEOUT_MS 10000
>> +
>> +#ifdef CONFIG_CMD_TFTPBOOT
>> +/* Boot file obtained from DHCP (if present) */
>> +static char boot_file_name[DHCP_BOOT_FILE_LEN];
>> +#endif
>> +
>> +static void call_lwip_dhcp_fine_tmr(void *ctx)
>> +{
>> + dhcp_fine_tmr();
>> + sys_timeout(10, call_lwip_dhcp_fine_tmr, NULL);
>> +}
>> +
>> +static int dhcp_loop(struct udevice *udev)
>> +{
>> + char *ipstr = "ipaddr\0\0";
>> + char *maskstr = "netmask\0\0";
>> + char *gwstr = "gatewayip\0\0";
>> + unsigned long start;
>> + struct netif *netif;
>> + struct dhcp *dhcp;
>> + bool bound;
>> + int idx;
>> +
>> + idx = dev_seq(udev);
>> + if (idx < 0 || idx > 99) {
>> + log_err("unexpected idx %d\n", idx);
>> + return CMD_RET_FAILURE;
>> + }
>> +
>> + netif = net_lwip_new_netif_noip(udev);
>> + if (!netif)
>> + return CMD_RET_FAILURE;
>> +
>> + start = get_timer(0);
>> + dhcp_start(netif);
>
> This can fail. Don't we have to check that and exit?
Yes, will fix.
>> + call_lwip_dhcp_fine_tmr(NULL);
>> +
>> + /* Wait for DHCP to complete */
>> + do {
>> + net_lwip_rx(udev, netif);
>> + sys_check_timeouts();
>> + bound = dhcp_supplied_address(netif);
>> + if (bound)
>> + break;
>> + if (ctrlc()) {
>> + printf("Abort\n");
>> + break;
>> + }
>> + mdelay(1);
>> + } while (get_timer(start) < DHCP_TIMEOUT_MS);
>> +
>> + sys_untimeout(call_lwip_dhcp_fine_tmr, NULL);
>> +
>
> [...]
>
>> + free(pp);
>> + if (err) {
>> + log_err("send error %d\n", err);
>> + return ERR_ABRT;
>> + }
>> +
>> + return ERR_OK;
>> +}
>> +
>> +static err_t net_lwip_if_init(struct netif *netif)
>> +{
>> +#if LWIP_IPV4
>
> Do we ever not set this?
No. Removed in v12.
>> + netif->output = etharp_output;
>> +#endif
>> + netif->linkoutput = linkoutput;
>> + netif->mtu = 1500;
>> + netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP;
>> +
>> + return ERR_OK;
>> +}
>> +
>> +static void eth_init_rings(void)
>> +{
>> + int i;
>> +
>> + for (i = 0; i < PKTBUFSRX; i++)
>> + net_rx_packets[i] = net_pkt_buf + i * PKTSIZE_ALIGN;
>> +}
>> +
>> +struct netif *net_lwip_get_netif(void)
>> +{
>> + struct netif *netif, *found = NULL;
>> +
>> + NETIF_FOREACH(netif) {
>> + if (!found)
>> + found = netif;
>> + else
>> + printf("Error: more than one netif in lwIP\n");
>> + }
>> + return found;
>> +}
>> +
>> +static int get_udev_ipv4_info(struct udevice *dev, ip4_addr_t *ip,
>> + ip4_addr_t *mask, ip4_addr_t *gw)
>> +{
>> + char *ipstr = "ipaddr\0\0";
>> + char *maskstr = "netmask\0\0";
>> + char *gwstr = "gatewayip\0\0";
>> + int idx = dev_seq(dev);
>> + char *env;
>> +
>> + if (idx < 0 || idx > 99) {
>> + log_err("unexpected idx %d\n", idx);
>> + return -1;
>> + }
>> +
>
> [...]
>
> FWIW dhcp seems to work fine
>
> Tested-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
>
> Thanks
> /Ilias
Thanks,
--
Jerome
More information about the U-Boot
mailing list