summaryrefslogtreecommitdiff
path: root/lib/efi_loader/efi_net.c
diff options
context:
space:
mode:
authorAdriano Cordova <adrianox@gmail.com>2025-03-03 11:13:14 -0300
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>2025-03-10 07:01:37 +0100
commit267b0a7ddf89d414000d98345aa3222c7e01ff38 (patch)
tree45e8354ed7d018dc371436b295f688eb807fdbbf /lib/efi_loader/efi_net.c
parent6a832d4b2e5d4d1ebc9d036afcc02d9550257ab2 (diff)
efi_loader: efi_device_path: Pass net udevice as argument
In preparation to support multiple EFI net objects, support constructing device paths using an ethernet device different than the default. Add a udevice argument to the device path generation, and keep the callsites with eth_get_dev() to preserve existing functionality. Signed-off-by: Adriano Cordova <adriano.cordova@canonical.com>
Diffstat (limited to 'lib/efi_loader/efi_net.c')
-rw-r--r--lib/efi_loader/efi_net.c60
1 files changed, 9 insertions, 51 deletions
diff --git a/lib/efi_loader/efi_net.c b/lib/efi_loader/efi_net.c
index 27fc4014112..ebb7f4afd3c 100644
--- a/lib/efi_loader/efi_net.c
+++ b/lib/efi_loader/efi_net.c
@@ -952,14 +952,12 @@ efi_status_t efi_net_register(void)
if (r != EFI_SUCCESS)
goto failure_to_add_protocol;
- if (net_dp)
- r = efi_add_protocol(&netobj->header, &efi_guid_device_path,
- net_dp);
- else
- r = efi_net_set_dp("Net", NULL);
+ if (!net_dp)
+ efi_net_set_dp("Net", NULL);
+ r = efi_add_protocol(&netobj->header, &efi_guid_device_path,
+ net_dp);
if (r != EFI_SUCCESS)
goto failure_to_add_protocol;
-
r = efi_add_protocol(&netobj->header, &efi_pxe_base_code_protocol_guid,
&netobj->pxe);
if (r != EFI_SUCCESS)
@@ -1077,58 +1075,18 @@ out_of_resources:
*/
efi_status_t efi_net_set_dp(const char *dev, const char *server)
{
- efi_status_t ret = EFI_SUCCESS;
- struct efi_handler *phandler;
- struct efi_device_path *old_net_dp, *new_net_dp;
+ efi_free_pool(net_dp);
- old_net_dp = net_dp;
- new_net_dp = NULL;
+ net_dp = NULL;
if (!strcmp(dev, "Net"))
- new_net_dp = efi_dp_from_eth();
+ net_dp = efi_dp_from_eth(eth_get_dev());
else if (!strcmp(dev, "Http"))
- new_net_dp = efi_dp_from_http(server);
+ net_dp = efi_dp_from_http(server, eth_get_dev());
- if (!new_net_dp) {
+ if (!net_dp)
return EFI_OUT_OF_RESOURCES;
- }
-
- // If netobj is not started yet, end here.
- if (!netobj) {
- goto exit;
- }
-
- phandler = NULL;
- efi_search_protocol(&netobj->header, &efi_guid_device_path, &phandler);
-
- // If the device path protocol is not yet installed, install it
- if (!phandler)
- goto add;
-
- // If it is already installed, try to update it
- ret = efi_reinstall_protocol_interface(&netobj->header, &efi_guid_device_path,
- old_net_dp, new_net_dp);
- if (ret != EFI_SUCCESS)
- goto error;
-
- net_dp = new_net_dp;
- efi_free_pool(old_net_dp);
return EFI_SUCCESS;
-add:
- ret = efi_add_protocol(&netobj->header, &efi_guid_device_path,
- new_net_dp);
- if (ret != EFI_SUCCESS)
- goto error;
-exit:
- net_dp = new_net_dp;
- efi_free_pool(old_net_dp);
-
- return ret;
-error:
- // Failed, restore
- efi_free_pool(new_net_dp);
-
- return ret;
}
/**