From: Adriano Cordova <adrianox@gmail.com>
To: u-boot@lists.denx.de
Cc: joe.hershberger@ni.com, rfried.dev@gmail.com,
jerome.forissier@linaro.org, xypron.glpk@gmx.de,
ilias.apalodimas@linaro.org, Adriano Cordova <adrianox@gmail.com>
Subject: [PATCH v2 09/15] efi_loader: net: set EFI bootdevice device path to HTTP when loaded from wget
Date: Fri, 8 Nov 2024 10:38:44 -0300 [thread overview]
Message-ID: <20241108133850.431075-10-adrianox@gmail.com> (raw)
In-Reply-To: <20241108133850.431075-1-adrianox@gmail.com>
Set the device path of the efi boot device to an HTTP device path
(as formed by efi_dp_from_http) when the next boot stage is loaded
using wget (i.e., when wget is used with wget_info.set_bootdev=1).
Signed-off-by: Adriano Cordova <adrianox@gmail.com>
---
include/efi_loader.h | 6 ++++++
lib/efi_loader/efi_device_path.c | 2 +-
lib/efi_loader/efi_net.c | 22 +++++++++++++++++++++-
net/lwip/wget.c | 1 +
net/wget.c | 1 +
5 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/include/efi_loader.h b/include/efi_loader.h
index ab79364857..c37c1a4660 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -126,6 +126,10 @@ static inline void efi_set_bootdev(const char *dev, const char *devnr,
#endif
#if CONFIG_IS_ENABLED(NETDEVICES) && CONFIG_IS_ENABLED(EFI_LOADER)
+/* Call this to update the current device path of the efi net device */
+void efi_net_set_dp(const char *dev, const char *server);
+/* Call this to get the current device path of the efi net device */
+void efi_net_get_dp(void **dp);
void efi_net_get_addr(struct efi_ipv4_address *ip,
struct efi_ipv4_address *mask,
struct efi_ipv4_address *gw);
@@ -133,6 +137,8 @@ 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_set_dp(const char *dev, const char *server) { }
+static inline void efi_net_get_dp(void **dp) { }
static inline void efi_net_get_addr(struct efi_ipv4_address *ip,
struct efi_ipv4_address *mask,
struct efi_ipv4_address *gw) { }
diff --git a/lib/efi_loader/efi_device_path.c b/lib/efi_loader/efi_device_path.c
index dc79a61196..d7c874fcdf 100644
--- a/lib/efi_loader/efi_device_path.c
+++ b/lib/efi_loader/efi_device_path.c
@@ -1165,7 +1165,7 @@ efi_status_t efi_dp_from_name(const char *dev, const char *devnr,
(uintptr_t)image_addr,
(uintptr_t)image_addr + image_size);
} else if (IS_ENABLED(CONFIG_NETDEVICES) && !strcmp(dev, "Net")) {
- dp = efi_dp_from_eth();
+ efi_net_get_dp((void **)&dp);
} else if (!strcmp(dev, "Uart")) {
dp = efi_dp_from_uart();
} else {
diff --git a/lib/efi_loader/efi_net.c b/lib/efi_loader/efi_net.c
index dd84b3f18d..d4570d4d7c 100644
--- a/lib/efi_loader/efi_net.c
+++ b/lib/efi_loader/efi_net.c
@@ -16,6 +16,7 @@
*/
#include <efi_loader.h>
+#include <dm.h>
#include <malloc.h>
#include <vsprintf.h>
#include <net.h>
@@ -31,6 +32,7 @@ static size_t *receive_lengths;
static int rx_packet_idx;
static int rx_packet_num;
static struct efi_net_obj *netobj;
+static struct efi_device_path *net_dp;
/*
* The notification function of this event is called in every timer cycle
@@ -902,8 +904,10 @@ efi_status_t efi_net_register(void)
&netobj->net);
if (r != EFI_SUCCESS)
goto failure_to_add_protocol;
+ if (!net_dp)
+ efi_net_set_dp("Net", NULL);
r = efi_add_protocol(&netobj->header, &efi_guid_device_path,
- efi_dp_from_eth());
+ net_dp);
if (r != EFI_SUCCESS)
goto failure_to_add_protocol;
r = efi_add_protocol(&netobj->header, &efi_pxe_base_code_protocol_guid,
@@ -999,6 +1003,22 @@ out_of_resources:
return EFI_OUT_OF_RESOURCES;
}
+void efi_net_set_dp(const char *dev, const char *server)
+{
+ if (!strcmp(dev, "Net"))
+ net_dp = efi_dp_from_eth();
+ else if (!strcmp(dev, "Http"))
+ net_dp = efi_dp_from_http(server);
+}
+
+void efi_net_get_dp(void **dp)
+{
+ if (!net_dp)
+ efi_net_set_dp("Net", NULL);
+ if (dp && net_dp)
+ *dp = efi_dp_dup(net_dp);
+}
+
void efi_net_get_addr(struct efi_ipv4_address *ip,
struct efi_ipv4_address *mask,
struct efi_ipv4_address *gw)
diff --git a/net/lwip/wget.c b/net/lwip/wget.c
index 88ce906930..64593d135d 100644
--- a/net/lwip/wget.c
+++ b/net/lwip/wget.c
@@ -218,6 +218,7 @@ static void httpc_result_cb(void *arg, httpc_result_t httpc_result,
print_size(rx_content_len / elapsed * 1000, "/s)\n");
printf("Bytes transferred = %lu (%lx hex)\n", ctx->size, ctx->size);
if (wget_info.set_bootdev) {
+ efi_net_set_dp("Http", ctx->server_name);
efi_set_bootdev("Net", "", ctx->path, map_sysmem(ctx->saved_daddr, 0),
rx_content_len);
}
diff --git a/net/wget.c b/net/wget.c
index 1b6f031b72..6e5a0fe1fc 100644
--- a/net/wget.c
+++ b/net/wget.c
@@ -443,6 +443,7 @@ static void wget_handler(uchar *pkt, u16 dport,
net_set_state(wget_loop_state);
wget_info.file_size = net_boot_file_size;
if (wget_info.method == WGET_HTTP_METHOD_GET && wget_info.set_bootdev) {
+ efi_net_set_dp("Http", NULL);
efi_set_bootdev("Net", "", image_url,
map_sysmem(image_load_addr, 0),
net_boot_file_size);
--
2.43.0
next prev parent reply other threads:[~2024-11-08 15:57 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-08 13:38 [PATCH v2 00/15] efi_loader: efi http and ipconfig drivers Adriano Cordova
2024-11-08 13:38 ` [PATCH v2 01/15] net: net_utils: Move ip_to_string to lib/net_utils.c Adriano Cordova
2024-11-08 16:19 ` Heinrich Schuchardt
2024-11-10 11:37 ` Ilias Apalodimas
2024-11-08 13:38 ` [PATCH v2 02/15] net: wget: let wget_with_dns work with dns disabled Adriano Cordova
2024-11-08 13:38 ` [PATCH v2 03/15] efi_loader: device_path: add definition of DEVICE_PATH_SUB_TYPE_MSG_IPV4 Adriano Cordova
2024-11-10 9:01 ` Ilias Apalodimas
2024-11-08 13:38 ` [PATCH v2 04/15] efi_loader: device_path: add efi_dp_from_ipv4 Adriano Cordova
2024-11-10 9:13 ` Ilias Apalodimas
2024-11-08 13:38 ` [PATCH v2 05/15] efi_loader: add IPv4() to device path to text protocol Adriano Cordova
2024-11-08 13:38 ` [PATCH v2 06/15] efi_api: add definitions for HTTP and IP4_CONFIG2 protocols Adriano Cordova
2024-11-08 13:38 ` [PATCH v2 07/15] efi_loader: efi_net: add efi_net_set_addr, efi_net_get_addr Adriano Cordova
2024-11-08 13:38 ` [PATCH v2 08/15] efi_loader: device_path: add support for HTTP device path Adriano Cordova
2024-11-10 9:19 ` Ilias Apalodimas
2024-11-08 13:38 ` Adriano Cordova [this message]
2024-11-08 13:38 ` [PATCH v2 10/15] efi_loader: net: add support to send http requests and parse http headers Adriano Cordova
2024-11-08 13:38 ` [PATCH v2 11/15] efi_loader: efi_net: add EFI_IP4_CONFIG2_PROTOCOL Adriano Cordova
2024-11-08 13:38 ` [PATCH v2 12/15] efi_loader: efi_net: add EFI_HTTP_PROTOCOL Adriano Cordova
2024-11-08 13:38 ` [PATCH v2 13/15] lib: uuid: display HTTP and IPV4 Config II protocols Adriano Cordova
2024-11-10 8:41 ` Ilias Apalodimas
2024-11-10 12:03 ` Heinrich Schuchardt
2024-11-08 13:38 ` [PATCH v2 14/15] efi_selftest: add test for HTTP protocol Adriano Cordova
2024-11-08 13:38 ` [PATCH v2 15/15] efi_selftest: add test for IPv4 Config2 protocol Adriano Cordova
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241108133850.431075-10-adrianox@gmail.com \
--to=adrianox@gmail.com \
--cc=ilias.apalodimas@linaro.org \
--cc=jerome.forissier@linaro.org \
--cc=joe.hershberger@ni.com \
--cc=rfried.dev@gmail.com \
--cc=u-boot@lists.denx.de \
--cc=xypron.glpk@gmx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox