[PATCH v6 06/14] efi_loader: efi_net: add efi_net_set_addr, efi_net_get_addr
Jerome Forissier
jerome.forissier at linaro.org
Tue Dec 3 14:52:44 CET 2024
On 12/3/24 11:51, Heinrich Schuchardt wrote:
> On 28.11.24 15:44, Adriano Cordova wrote:
>> Add the functions efi_net_set_addr and efi_net_get_addr to set
>> and get the ip address from efi code in a network agnostic way.
>> This could also go in net_common, or be compiled conditionally
>> for each network stack.
>>
>> Signed-off-by: Adriano Cordova <adrianox at gmail.com>
>> ---
>> (no changes since v5)
>> Changes in v5:
>> - When possible use sizeof in memcpy instead of hardcoded value
>>
>> Changes in v4:
>> - Removed unnecessary casts
>> - Changed char *ipstr by char ipstr[].
>>
>> (no changes since v2)
>> include/efi_loader.h | 16 +++++
>> lib/efi_loader/efi_net.c | 125 +++++++++++++++++++++++++++++++++++++++
>> 2 files changed, 141 insertions(+)
>>
>> diff --git a/include/efi_loader.h b/include/efi_loader.h
>> index 39809eac1b..612bc42816 100644
>> --- a/include/efi_loader.h
>> +++ b/include/efi_loader.h
>> @@ -125,6 +125,22 @@ static inline void efi_set_bootdev(const char *dev, const char *devnr,
>> size_t buffer_size) { }
>> #endif
>>
>> +#if CONFIG_IS_ENABLED(NETDEVICES) && CONFIG_IS_ENABLED(EFI_LOADER)
>> +void efi_net_get_addr(struct efi_ipv4_address *ip,
>> + struct efi_ipv4_address *mask,
>> + struct efi_ipv4_address *gw);
>> +void efi_net_set_addr(struct efi_ipv4_address *ip,
>> + struct efi_ipv4_address *mask,
>> + struct efi_ipv4_address *gw);
>> +#else
>> +static inline void efi_net_get_addr(struct efi_ipv4_address *ip,
>> + struct efi_ipv4_address *mask,
>> + struct efi_ipv4_address *gw) { }
>> +static inline void efi_net_set_addr(struct efi_ipv4_address *ip,
>> + struct efi_ipv4_address *mask,
>> + struct efi_ipv4_address *gw) { }
>> +#endif
>> +
>> /* Maximum number of configuration tables */
>> #define EFI_MAX_CONFIGURATION_TABLES 16
>>
>> diff --git a/lib/efi_loader/efi_net.c b/lib/efi_loader/efi_net.c
>> index 7cd536705f..3491d4c481 100644
>> --- a/lib/efi_loader/efi_net.c
>> +++ b/lib/efi_loader/efi_net.c
>> @@ -17,6 +17,7 @@
>>
>> #include <efi_loader.h>
>> #include <malloc.h>
>> +#include <vsprintf.h>
>> #include <net.h>
>>
>> static const efi_guid_t efi_net_guid = EFI_SIMPLE_NETWORK_PROTOCOL_GUID;
>> @@ -997,3 +998,127 @@ out_of_resources:
>> printf("ERROR: Out of memory\n");
>> return EFI_OUT_OF_RESOURCES;
>> }
>> +
>> +/**
>> + * efi_net_get_addr() - get IP address information
>> + *
>> + * Copy the current IP address, mask, and gateway into the
>> + * efi_ipv4_address structs pointed to by ip, mask and gw,
>> + * respectively.
>> + *
>> + * @ip: pointer to an efi_ipv4_address struct to
>> + * be filled with the current IP address
>> + * @mask: pointer to an efi_ipv4_address struct to
>> + * be filled with the current network mask
>> + * @gw: pointer to an efi_ipv4_address struct to be
>> + * filled with the current network gateway
>> + */
>> +void efi_net_get_addr(struct efi_ipv4_address *ip,
>> + struct efi_ipv4_address *mask,
>> + struct efi_ipv4_address *gw)
>> +{
>> +#ifdef CONFIG_NET_LWIP
>> + char ipstr[] = "ipaddr\0\0";
>> + char maskstr[] = "netmask\0\0";
>> + char gwstr[] = "gatewayip\0\0";
>> + int idx;
>> + struct in_addr tmp;
>> + char *env;
>> +
>> + idx = dev_seq(eth_get_dev());
>> +
>> + if (idx < 0 || idx > 99) {
>> + log_err("unexpected idx %d\n", idx);
>> + return;
>> + }
>> +
>> + if (idx) {
>> + sprintf(ipstr, "ipaddr%d", idx);
>> + sprintf(maskstr, "netmask%d", idx);
>> + sprintf(gwstr, "gatewayip%d", idx);
>> + }
>> +
>> + env = env_get(ipstr);
>> + if (env && ip) {
>> + tmp = string_to_ip(env);
>> + memcpy(ip, &tmp, sizeof(tmp));
>> + }
>> +
>> + env = env_get(maskstr);
>> + if (env && mask) {
>> + tmp = string_to_ip(env);
>> + memcpy(mask, &tmp, sizeof(tmp));
>> + }
>> + env = env_get(gwstr);
>> + if (env && gw) {
>> + tmp = string_to_ip(env);
>> + memcpy(gw, &tmp, sizeof(tmp));
>> + }
>> +#else
>> + if (ip)
>> + memcpy(ip, &net_ip, sizeof(net_ip));
>> + if (mask)
>> + memcpy(mask, &net_netmask, sizeof(net_netmask));
>> +#endif
>> +}
>> +
>> +/**
>> + * efi_net_set_addr() - set IP address information
>> + *
>> + * Set the current IP address, mask, and gateway to the
>> + * efi_ipv4_address structs pointed to by ip, mask and gw,
>> + * respectively.
>> + *
>> + * @ip: pointer to new IP address
>> + * @mask: pointer to new network mask to set
>> + * @gw: pointer to new network gateway
>> + */
>> +void efi_net_set_addr(struct efi_ipv4_address *ip,
>> + struct efi_ipv4_address *mask,
>> + struct efi_ipv4_address *gw)
>> +{
>> +#ifdef CONFIG_NET_LWIP
>> + char ipstr[] = "ipaddr\0\0";
>> + char maskstr[] = "netmask\0\0";
>> + char gwstr[] = "gatewayip\0\0";
>> + int idx;
>> + struct in_addr *addr;
>> + char tmp[46];
>> +
>> + idx = dev_seq(eth_get_dev());
>> +
>> + if (idx < 0 || idx > 99) {
>> + log_err("unexpected idx %d\n", idx);
>> + return;
>> + }
>
> The same logic can be found in LWIP's dhcp_loop(), get_udev_ipv4_info().
>
> After this series I think it is time to carve it out into a function.
>
> It is unclear to me form where the idx > 99 in the LWIP stack is
> derived. struct udevice device defines seq_ as integer.
>
>> +
>> + if (idx) {
>> + sprintf(ipstr, "ipaddr%d", idx);
>> + sprintf(maskstr, "netmask%d", idx);
>> + sprintf(gwstr, "gatewayip%d", idx);
>
> @Jerome,
>
> The usage of environment variables ipaddr#, netmask#, gatewayip# by the
> LWIP stack should be documented in doc/usage/environment.rst. Could you,
> please, provide a patch.
https://lists.denx.de/pipermail/u-boot/2024-December/573696.html
Thanks!
--
Jerome
>
> For this patch
>
> Reviewed-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
>
>> + }
>> +
>> + if (ip) {
>> + addr = (struct in_addr *)ip;
>> + ip_to_string(*addr, tmp);
>> + env_set(ipstr, tmp);
>> + }
>> +
>> + if (mask) {
>> + addr = (struct in_addr *)mask;
>> + ip_to_string(*addr, tmp);
>> + env_set(maskstr, tmp);
>> + }
>> +
>> + if (gw) {
>> + addr = (struct in_addr *)gw;
>> + ip_to_string(*addr, tmp);
>> + env_set(gwstr, tmp);
>> + }
>> +#else
>> + if (ip)
>> + memcpy(&net_ip, ip, sizeof(*ip));
>> + if (mask)
>> + memcpy(&net_netmask, mask, sizeof(*mask));
>> +#endif
>> +}
>
More information about the U-Boot
mailing list