diff mbox series

[v3,09/15] efi_loader: net: set EFI bootdevice device path to HTTP when loaded from wget

Message ID 20241111210959.560738-10-adrianox@gmail.com
State Superseded, archived
Delegated to: Heinrich Schuchardt
Headers show
Series efi_loader: efi http and ipconfig drivers | expand

Commit Message

Adriano Cordova Nov. 11, 2024, 9:09 p.m. UTC
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>
---

(no changes since v2)

 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(-)

Comments

Ilias Apalodimas Nov. 18, 2024, 12:23 p.m. UTC | #1
On Mon, 11 Nov 2024 at 23:10, Adriano Cordova <adrianox@gmail.com> wrote:
>
> 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).

We want the reasoning of why you need the change in the commit log,
instead of what the code does.

>
> Signed-off-by: Adriano Cordova <adrianox@gmail.com>
> ---
>
> (no changes since v2)
>
>  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 96b204dfc3..f49f8e6be0 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 158f08b9e5..afb4abc3ff 100644
> --- a/lib/efi_loader/efi_device_path.c
> +++ b/lib/efi_loader/efi_device_path.c
> @@ -1168,7 +1168,7 @@ efi_status_t efi_dp_from_name(const char *dev, const char *devnr,
>                 dp = efi_dp_from_mem(EFI_RESERVED_MEMORY_TYPE,
>                                      (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 53c3b169e0..5c44e324be 100644
> --- a/net/lwip/wget.c
> +++ b/net/lwip/wget.c
> @@ -217,6 +217,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 36158e0a9c..676d4db759 100644
> --- a/net/wget.c
> +++ b/net/wget.c
> @@ -442,6 +442,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
>
diff mbox series

Patch

diff --git a/include/efi_loader.h b/include/efi_loader.h
index 96b204dfc3..f49f8e6be0 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 158f08b9e5..afb4abc3ff 100644
--- a/lib/efi_loader/efi_device_path.c
+++ b/lib/efi_loader/efi_device_path.c
@@ -1168,7 +1168,7 @@  efi_status_t efi_dp_from_name(const char *dev, const char *devnr,
 		dp = efi_dp_from_mem(EFI_RESERVED_MEMORY_TYPE,
 				     (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 53c3b169e0..5c44e324be 100644
--- a/net/lwip/wget.c
+++ b/net/lwip/wget.c
@@ -217,6 +217,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 36158e0a9c..676d4db759 100644
--- a/net/wget.c
+++ b/net/wget.c
@@ -442,6 +442,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);