On 11/6/24 14:03, Adriano Cordova wrote:
Each wget request now fills the struct wget_info. Also, the
efi bootdevice is now set conditionally to the set_bootdevice
variable in wget_info, and the same holds for lmb memory check.

Signed-off-by: Adriano Cordova <adria...@gmail.com>
---
  net/wget.c | 88 +++++++++++++++++++++++++++++++++++++++++-------------
  1 file changed, 67 insertions(+), 21 deletions(-)

diff --git a/net/wget.c b/net/wget.c
index 635f82efbb..24be0a4932 100644
--- a/net/wget.c
+++ b/net/wget.c
@@ -22,10 +22,10 @@ DECLARE_GLOBAL_DATA_PTR;
  /* The default, change with environment variable 'httpdstp' */
  #define SERVER_PORT           80

-static const char bootfile1[] = "GET ";
+static const char bootfileGET[] = "GET ";
+static const char bootfileHEAD[] = "HEAD ";
  static const char bootfile3[] = " HTTP/1.0\r\n\r\n";
  static const char http_eom[] = "\r\n\r\n";
-static const char http_ok[] = "200";
  static const char content_len[] = "Content-Length";
  static const char linefeed[] = "\r\n";
  static struct in_addr web_server_ip;
@@ -77,7 +77,7 @@ static inline int store_block(uchar *src, unsigned int 
offset, unsigned int len)
        ulong newsize = offset + len;
        uchar *ptr;

-       if (CONFIG_IS_ENABLED(LMB)) {
+       if (CONFIG_IS_ENABLED(LMB) && wget_info.set_bootdev) {
                if (store_addr < image_load_addr ||
                    lmb_read_check(store_addr, len)) {
                        printf("\nwget error: ");
@@ -132,8 +132,17 @@ static void wget_send_stored(void)
                        IP_TCP_HDR_SIZE + TCP_TSOPT_SIZE + 2;
                offset = ptr;

-               memcpy(offset, &bootfile1, strlen(bootfile1));
-               offset += strlen(bootfile1);
+               switch (wget_info.method) {
+               case WGET_HTTP_METHOD_HEAD:
+                       memcpy(offset, &bootfileHEAD, strlen(bootfileHEAD));
+                       offset += strlen(bootfileHEAD);
+                       break;
+               case WGET_HTTP_METHOD_GET:
+               default:
+                       memcpy(offset, &bootfileGET, strlen(bootfileGET));
+                       offset += strlen(bootfileGET);
+                       break;
+               }

                memcpy(offset, image_url, strlen(image_url));
                offset += strlen(image_url);
@@ -193,6 +202,47 @@ static void wget_timeout_handler(void)
  #define PKT_QUEUE_OFFSET 0x20000
  #define PKT_QUEUE_PACKET_SIZE 0x800

+static void wget_fill_info(const uchar *pkt, int hlen, struct wget_http_info 
*info)
+{
+       const char *first_space;
+       const char *second_space;
+       char *pos, *end;
+
+       if (info->headers && hlen < MAX_HTTP_HEADERS_SIZE)
+               strncpy(info->headers, pkt, hlen);
+
+       //Get status code
+       first_space = strchr(pkt, ' ');
+       if (!first_space) {
+               info->status_code = -1;
+               return;
+       }
+
+       second_space = strchr(first_space + 1, ' ');
+       if (!second_space) {
+               info->status_code = -1;
+               return;
+       }
+
+       info->status_code = simple_strtoul(first_space + 1, &end, 10);
+
+       if (second_space != end)
+               info->status_code = -1;
+
+       pos = strstr((char *)pkt, content_len);
+
+       if (pos) {
+               pos += sizeof(content_len) + 1;
+               while (*pos == ' ')
+                       pos++;
+               content_length = simple_strtoul(pos, &end, 10);
+               debug_cond(DEBUG_WGET,
+                          "wget: Connected Len %lu\n",
+                          content_length);
+               wget_info.hdr_cont_len = content_length;
+       }
+}
+
  static void wget_connected(uchar *pkt, unsigned int tcp_seq_num,
                           u8 action, unsigned int tcp_ack_num, unsigned int 
len)
  {
@@ -241,7 +291,11 @@ static void wget_connected(uchar *pkt, unsigned int 
tcp_seq_num,
                initial_data_seq_num = tcp_seq_num + hlen;
                next_data_seq_num    = tcp_seq_num + len;

-               if (strstr((char *)pkt, http_ok) == 0) {
+               wget_fill_info(pkt, hlen, &wget_info);
+               debug_cond(DEBUG_WGET,
+                          "wget: HTTP Status Code %ld\n", 
wget_info.status_code);

Why is status code defined as long in

  include/net-common.h:537: ulong status_code;

I have never seen a status code with more than 3 digits.

Cf. RFC 2616 (https://datatracker.ietf.org/doc/html/rfc2616) and
RFC 9110
(https://www.rfc-editor.org/rfc/rfc9110#name-overview-of-status-codes).

Acked-by: Heinrich Schuchardt <xypron.g...@gmx.de>

+
+               if (wget_info.status_code != 200) {
                        debug_cond(DEBUG_WGET,
                                   "wget: Connected Bad Xfer\n");
                        wget_loop_state = NETLOOP_FAIL;
@@ -251,17 +305,6 @@ static void wget_connected(uchar *pkt, unsigned int 
tcp_seq_num,
                                   "wget: Connected Pkt %p hlen %x\n",
                                   pkt, hlen);

-                       pos = strstr((char *)pkt, content_len);
-                       if (!pos) {
-                               content_length = -1;
-                       } else {
-                               pos += sizeof(content_len) + 2;
-                               strict_strtoul(pos, 10, &content_length);
-                               debug_cond(DEBUG_WGET,
-                                          "wget: Connected Len %lu\n",
-                                          content_length);
-                       }
-
                        net_boot_file_size = 0;

                        if (len > hlen) {
@@ -397,10 +440,13 @@ static void wget_handler(uchar *pkt, u16 dport,
        case WGET_TRANSFERRED:
                printf("Packets received %d, Transfer Successful\n", packets);
                net_set_state(wget_loop_state);
-               efi_set_bootdev("Net", "", image_url,
-                               map_sysmem(image_load_addr, 0),
-                               net_boot_file_size);
-               env_set_hex("filesize", net_boot_file_size);
+               wget_info.file_size = net_boot_file_size;
+               if (wget_info.method == WGET_HTTP_METHOD_GET && 
wget_info.set_bootdev) {
+                       efi_set_bootdev("Net", "", image_url,
+                                       map_sysmem(image_load_addr, 0),
+                                       net_boot_file_size);
+                       env_set_hex("filesize", net_boot_file_size);
+               }
                break;
        }
  }

Reply via email to