mbox series

[v3,00/15] efi_loader: efi http and ipconfig drivers

Message ID 20241111210959.560738-1-adrianox@gmail.com
Headers show
Series efi_loader: efi http and ipconfig drivers | expand

Message

Adriano Cordova Nov. 11, 2024, 9:09 p.m. UTC
Add support for EFI_HTTP_PROTOCOL, EFI_HTTP_SERVICE_BINDING_PROTOCOL,
and EFI_IP4_CONFIG2_PROTOCOL.

This series depends on the series 'wget: Expose wget to applications',
also found at:
https://github.com/0n41rd4/u-boot/commits/http-driver-wget

The fist two patches of this series are not efi specific and have also
been sent to the corresponding maintainers, but this series depends on
them, so they are added here for redundancy. A branch with both series
of patches, concatenated, is at:
https://github.com/0n41rd4/u-boot/commits/efi-http-driver

Adriano Cordova (13):
  net: net_utils: Move ip_to_string to lib/net_utils.c
  net: wget: let wget_with_dns work with dns disabled
  efi_loader: device_path: add definition of
    DEVICE_PATH_SUB_TYPE_MSG_IPV4
  efi_loader: device_path: add efi_dp_from_ipv4
  efi_api: add definitions for HTTP and IP4_CONFIG2 protocols
  efi_loader: efi_net: add efi_net_set_addr, efi_net_get_addr
  efi_loader: device_path: add support for HTTP device path
  efi_loader: net: set EFI bootdevice device path to HTTP when loaded
    from wget
  efi_loader: net: add support to send http requests and parse http
    headers
  efi_loader: efi_net: add EFI_IP4_CONFIG2_PROTOCOL
  efi_loader: efi_net: add EFI_HTTP_PROTOCOL
  efi_selftest: add test for HTTP protocol
  efi_selftest: add test for IPv4 Config2 protocol

Heinrich Schuchardt (2):
  efi_loader: add IPv4() to device path to text protocol
  lib: uuid: display HTTP and IPV4 Config II protocols

 include/efi_api.h                        | 220 +++++++++
 include/efi_loader.h                     |  42 ++
 include/net-common.h                     |  10 +
 lib/efi_loader/Kconfig                   |  17 +
 lib/efi_loader/Makefile                  |   2 +
 lib/efi_loader/efi_device_path.c         |  95 +++-
 lib/efi_loader/efi_device_path_to_text.c |  23 +
 lib/efi_loader/efi_http.c                | 563 +++++++++++++++++++++++
 lib/efi_loader/efi_ipconfig.c            | 216 +++++++++
 lib/efi_loader/efi_net.c                 | 316 ++++++++++++-
 lib/efi_selftest/Makefile                |   2 +
 lib/efi_selftest/efi_selftest_http.c     | 315 +++++++++++++
 lib/efi_selftest/efi_selftest_ipconfig.c | 173 +++++++
 lib/net_utils.c                          |  11 +
 lib/uuid.c                               |  14 +
 net/lwip/wget.c                          |   1 +
 net/net.c                                |  11 -
 net/wget.c                               |  39 +-
 18 files changed, 2038 insertions(+), 32 deletions(-)
 create mode 100644 lib/efi_loader/efi_http.c
 create mode 100644 lib/efi_loader/efi_ipconfig.c
 create mode 100644 lib/efi_selftest/efi_selftest_http.c
 create mode 100644 lib/efi_selftest/efi_selftest_ipconfig.c

Comments

Ilias Apalodimas Nov. 14, 2024, 3:22 p.m. UTC | #1
Hi Adriano,

On Mon, 11 Nov 2024 at 23:10, Adriano Cordova <adrianox@gmail.com> wrote:

> Add support for EFI_HTTP_PROTOCOL, EFI_HTTP_SERVICE_BINDING_PROTOCOL,
> and EFI_IP4_CONFIG2_PROTOCOL.
>
> This series depends on the series 'wget: Expose wget to applications',
> also found at:
> https://github.com/0n41rd4/u-boot/commits/http-driver-wget
>
> The fist two patches of this series are not efi specific and have also
> been sent to the corresponding maintainers, but this series depends on
> them, so they are added here for redundancy. A branch with both series
> of patches, concatenated, is at:
> https://github.com/0n41rd4/u-boot/commits/efi-http-driver


It would help a lot if we had pointers (or an EFI app) using this protocol
to test. Are you using any of that for devel/debugging?

Thanks
/Ilias

>
>
> Adriano Cordova (13):
>   net: net_utils: Move ip_to_string to lib/net_utils.c
>   net: wget: let wget_with_dns work with dns disabled
>   efi_loader: device_path: add definition of
>     DEVICE_PATH_SUB_TYPE_MSG_IPV4
>   efi_loader: device_path: add efi_dp_from_ipv4
>   efi_api: add definitions for HTTP and IP4_CONFIG2 protocols
>   efi_loader: efi_net: add efi_net_set_addr, efi_net_get_addr
>   efi_loader: device_path: add support for HTTP device path
>   efi_loader: net: set EFI bootdevice device path to HTTP when loaded
>     from wget
>   efi_loader: net: add support to send http requests and parse http
>     headers
>   efi_loader: efi_net: add EFI_IP4_CONFIG2_PROTOCOL
>   efi_loader: efi_net: add EFI_HTTP_PROTOCOL
>   efi_selftest: add test for HTTP protocol
>   efi_selftest: add test for IPv4 Config2 protocol
>
> Heinrich Schuchardt (2):
>   efi_loader: add IPv4() to device path to text protocol
>   lib: uuid: display HTTP and IPV4 Config II protocols
>
>  include/efi_api.h                        | 220 +++++++++
>  include/efi_loader.h                     |  42 ++
>  include/net-common.h                     |  10 +
>  lib/efi_loader/Kconfig                   |  17 +
>  lib/efi_loader/Makefile                  |   2 +
>  lib/efi_loader/efi_device_path.c         |  95 +++-
>  lib/efi_loader/efi_device_path_to_text.c |  23 +
>  lib/efi_loader/efi_http.c                | 563 +++++++++++++++++++++++
>  lib/efi_loader/efi_ipconfig.c            | 216 +++++++++
>  lib/efi_loader/efi_net.c                 | 316 ++++++++++++-
>  lib/efi_selftest/Makefile                |   2 +
>  lib/efi_selftest/efi_selftest_http.c     | 315 +++++++++++++
>  lib/efi_selftest/efi_selftest_ipconfig.c | 173 +++++++
>  lib/net_utils.c                          |  11 +
>  lib/uuid.c                               |  14 +
>  net/lwip/wget.c                          |   1 +
>  net/net.c                                |  11 -
>  net/wget.c                               |  39 +-
>  18 files changed, 2038 insertions(+), 32 deletions(-)
>  create mode 100644 lib/efi_loader/efi_http.c
>  create mode 100644 lib/efi_loader/efi_ipconfig.c
>  create mode 100644 lib/efi_selftest/efi_selftest_http.c
>  create mode 100644 lib/efi_selftest/efi_selftest_ipconfig.c
>
> --
> 2.43.0
>
>
Adriano Cordova Nov. 14, 2024, 4:16 p.m. UTC | #2
Hi Ilias,
I have been testing with grub, and with the efi selftest. Here are the
steps to test with a riscv grub:

1. Get grubriscv64.efi from e.g. the following .deb package
wget
http://launchpadlibrarian.net/754414418/grub-efi-riscv64-unsigned_2.12-5ubuntu5.1_riscv64.deb

2. Compile U-boot with qemu-riscv64_smode_defconfig. Enable CMD_WGET.

3. Create a tap interface:
$ sudo ip tuntap add dev tap0 mode tap
$ sudo ip addr add 10.0.0.0/24 dev tap0
$ sudo ip link set dev tap0 up

4. Start an http server in a directory containing grubriscv64.efi and a
test file (e.g. a riscv kernel)
$  sudo python3 -m http.server 80 --bind 10.0.0.0

5. Launch U-boot:
$ qemu-system-riscv64 \
    -machine virt \
    -nographic \
    -kernel u-boot \
    -netdev tap,id=net0,ifname=tap0,script=no,downscript=no \
    -device virtio-net-device,netdev=net0

6. Inside U-boot's console
=> setenv ipaddr 10.0.0.1
=> setenv netmask 255.255.255.0
=> wget 10.0.0.0:80/grubriscv64.efi <http://10.0.0.0/grubriscv64.efi>
=> bootefi $loadaddr

7. Print debug, check address and installed protocols (optional):
grub> set debug="peimage,net"
grub> net_ls_addr
grub> lsefi

8. Download a test file, e.g. a kernel, through http (here Image is a riscv
linux kernel):
grub> linux (http,10.0.0.0:80)/Image

9. Try boot it:
grub> boot

Best,
Adriano

El jue, 14 nov 2024 a las 12:22, Ilias Apalodimas (<
ilias.apalodimas@linaro.org>) escribió:

> Hi Adriano,
>
> On Mon, 11 Nov 2024 at 23:10, Adriano Cordova <adrianox@gmail.com> wrote:
>
>> Add support for EFI_HTTP_PROTOCOL, EFI_HTTP_SERVICE_BINDING_PROTOCOL,
>> and EFI_IP4_CONFIG2_PROTOCOL.
>>
>> This series depends on the series 'wget: Expose wget to applications',
>> also found at:
>> https://github.com/0n41rd4/u-boot/commits/http-driver-wget
>>
>> The fist two patches of this series are not efi specific and have also
>> been sent to the corresponding maintainers, but this series depends on
>> them, so they are added here for redundancy. A branch with both series
>> of patches, concatenated, is at:
>> https://github.com/0n41rd4/u-boot/commits/efi-http-driver
>
>
> It would help a lot if we had pointers (or an EFI app) using this protocol
> to test. Are you using any of that for devel/debugging?
>
> Thanks
> /Ilias
>
>>
>>
>> Adriano Cordova (13):
>>   net: net_utils: Move ip_to_string to lib/net_utils.c
>>   net: wget: let wget_with_dns work with dns disabled
>>   efi_loader: device_path: add definition of
>>     DEVICE_PATH_SUB_TYPE_MSG_IPV4
>>   efi_loader: device_path: add efi_dp_from_ipv4
>>   efi_api: add definitions for HTTP and IP4_CONFIG2 protocols
>>   efi_loader: efi_net: add efi_net_set_addr, efi_net_get_addr
>>   efi_loader: device_path: add support for HTTP device path
>>   efi_loader: net: set EFI bootdevice device path to HTTP when loaded
>>     from wget
>>   efi_loader: net: add support to send http requests and parse http
>>     headers
>>   efi_loader: efi_net: add EFI_IP4_CONFIG2_PROTOCOL
>>   efi_loader: efi_net: add EFI_HTTP_PROTOCOL
>>   efi_selftest: add test for HTTP protocol
>>   efi_selftest: add test for IPv4 Config2 protocol
>>
>> Heinrich Schuchardt (2):
>>   efi_loader: add IPv4() to device path to text protocol
>>   lib: uuid: display HTTP and IPV4 Config II protocols
>>
>>  include/efi_api.h                        | 220 +++++++++
>>  include/efi_loader.h                     |  42 ++
>>  include/net-common.h                     |  10 +
>>  lib/efi_loader/Kconfig                   |  17 +
>>  lib/efi_loader/Makefile                  |   2 +
>>  lib/efi_loader/efi_device_path.c         |  95 +++-
>>  lib/efi_loader/efi_device_path_to_text.c |  23 +
>>  lib/efi_loader/efi_http.c                | 563 +++++++++++++++++++++++
>>  lib/efi_loader/efi_ipconfig.c            | 216 +++++++++
>>  lib/efi_loader/efi_net.c                 | 316 ++++++++++++-
>>  lib/efi_selftest/Makefile                |   2 +
>>  lib/efi_selftest/efi_selftest_http.c     | 315 +++++++++++++
>>  lib/efi_selftest/efi_selftest_ipconfig.c | 173 +++++++
>>  lib/net_utils.c                          |  11 +
>>  lib/uuid.c                               |  14 +
>>  net/lwip/wget.c                          |   1 +
>>  net/net.c                                |  11 -
>>  net/wget.c                               |  39 +-
>>  18 files changed, 2038 insertions(+), 32 deletions(-)
>>  create mode 100644 lib/efi_loader/efi_http.c
>>  create mode 100644 lib/efi_loader/efi_ipconfig.c
>>  create mode 100644 lib/efi_selftest/efi_selftest_http.c
>>  create mode 100644 lib/efi_selftest/efi_selftest_ipconfig.c
>>
>> --
>> 2.43.0
>>
>>
Heinrich Schuchardt Nov. 14, 2024, 4:33 p.m. UTC | #3
On 11/14/24 17:16, Adriano Córdova wrote:
> Hi Ilias,
> I have been testing with grub, and with the efi selftest. Here are the
> steps to test with a riscv grub:
>
> 1. Get grubriscv64.efi from e.g. the following .deb package
> wget http://launchpadlibrarian.net/754414418/grub-efi-riscv64-
> unsigned_2.12-5ubuntu5.1_riscv64.deb <http://
> launchpadlibrarian.net/754414418/grub-efi-riscv64-
> unsigned_2.12-5ubuntu5.1_riscv64.deb>

If you are on Debian or Ubuntu you can use

dpkg -x grub-efi-riscv64-unsigned_2.12-5ubuntu5.1_riscv64.deb target_dir

for extraction.

On other distros

ar -x grub-efi-riscv64-unsigned_2.12-5ubuntu5.1_riscv64.deb
mkdir -p target_dir
tar --zstd -xf data.tar.zst -C target_dir

target_dir/usr/lib/grub/riscv64-efi/monolithic/grubnetriscv64.efi
is the file I am using. That one has all the network modules included.

Best regards

Heinrich

>
> 2. Compile U-boot with qemu-riscv64_smode_defconfig. Enable CMD_WGET.
>
> 3. Create a tap interface:
> $ sudo ip tuntap add dev tap0 mode tap
> $ sudo ip addr add 10.0.0.0/24 <http://10.0.0.0/24> dev tap0
> $ sudo ip link set dev tap0 up
>
> 4. Start an http server in a directory containing grubriscv64.efi and a
> test file (e.g. a riscv kernel)
> $  sudo python3 -m http.server 80 --bind 10.0.0.0
>
> 5. Launch U-boot:
> $ qemu-system-riscv64 \
>      -machine virt \
>      -nographic \
>      -kernel u-boot \
>      -netdev tap,id=net0,ifname=tap0,script=no,downscript=no \
>      -device virtio-net-device,netdev=net0
>
> 6. Inside U-boot's console
> => setenv ipaddr 10.0.0.1
> => setenv netmask 255.255.255.0
> => wget 10.0.0.0:80/grubriscv64.efi <http://10.0.0.0/grubriscv64.efi>
> => bootefi $loadaddr
>
> 7. Print debug, check address and installed protocols (optional):
> grub> set debug="peimage,net"
> grub> net_ls_addr
> grub> lsefi
>
> 8. Download a test file, e.g. a kernel, through http (here Image is a
> riscv linux kernel):
> grub> linux (http,10.0.0.0:80)/Image
>
> 9. Try boot it:
> grub> boot
>
> Best,
> Adriano
>
> El jue, 14 nov 2024 a las 12:22, Ilias Apalodimas
> (<ilias.apalodimas@linaro.org <mailto:ilias.apalodimas@linaro.org>>)
> escribió:
>
>     Hi Adriano,
>
>     On Mon, 11 Nov 2024 at 23:10, Adriano Cordova <adrianox@gmail.com
>     <mailto:adrianox@gmail.com>> wrote:
>
>         Add support for EFI_HTTP_PROTOCOL,
>         EFI_HTTP_SERVICE_BINDING_PROTOCOL,
>         and EFI_IP4_CONFIG2_PROTOCOL.
>
>         This series depends on the series 'wget: Expose wget to
>         applications',
>         also found at:
>         https://github.com/0n41rd4/u-boot/commits/http-driver-wget
>         <https://github.com/0n41rd4/u-boot/commits/http-driver-wget>
>
>         The fist two patches of this series are not efi specific and
>         have also
>         been sent to the corresponding maintainers, but this series
>         depends on
>         them, so they are added here for redundancy. A branch with both
>         series
>         of patches, concatenated, is at:
>         https://github.com/0n41rd4/u-boot/commits/efi-http-driver
>         <https://github.com/0n41rd4/u-boot/commits/efi-http-driver>
>
>
>     It would help a lot if we had pointers (or an EFI app) using this
>     protocol to test. Are you using any of that for devel/debugging?
>
>     Thanks
>     /Ilias
>
>
>
>         Adriano Cordova (13):
>            net: net_utils: Move ip_to_string to lib/net_utils.c
>            net: wget: let wget_with_dns work with dns disabled
>            efi_loader: device_path: add definition of
>              DEVICE_PATH_SUB_TYPE_MSG_IPV4
>            efi_loader: device_path: add efi_dp_from_ipv4
>            efi_api: add definitions for HTTP and IP4_CONFIG2 protocols
>            efi_loader: efi_net: add efi_net_set_addr, efi_net_get_addr
>            efi_loader: device_path: add support for HTTP device path
>            efi_loader: net: set EFI bootdevice device path to HTTP when
>         loaded
>              from wget
>            efi_loader: net: add support to send http requests and parse http
>              headers
>            efi_loader: efi_net: add EFI_IP4_CONFIG2_PROTOCOL
>            efi_loader: efi_net: add EFI_HTTP_PROTOCOL
>            efi_selftest: add test for HTTP protocol
>            efi_selftest: add test for IPv4 Config2 protocol
>
>         Heinrich Schuchardt (2):
>            efi_loader: add IPv4() to device path to text protocol
>            lib: uuid: display HTTP and IPV4 Config II protocols
>
>           include/efi_api.h                        | 220 +++++++++
>           include/efi_loader.h                     |  42 ++
>           include/net-common.h                     |  10 +
>           lib/efi_loader/Kconfig                   |  17 +
>           lib/efi_loader/Makefile                  |   2 +
>           lib/efi_loader/efi_device_path.c         |  95 +++-
>           lib/efi_loader/efi_device_path_to_text.c |  23 +
>           lib/efi_loader/efi_http.c                | 563 +++++++++++++++
>         ++++++++
>           lib/efi_loader/efi_ipconfig.c            | 216 +++++++++
>           lib/efi_loader/efi_net.c                 | 316 ++++++++++++-
>           lib/efi_selftest/Makefile                |   2 +
>           lib/efi_selftest/efi_selftest_http.c     | 315 +++++++++++++
>           lib/efi_selftest/efi_selftest_ipconfig.c | 173 +++++++
>           lib/net_utils.c                          |  11 +
>           lib/uuid.c                               |  14 +
>           net/lwip/wget.c                          |   1 +
>           net/net.c                                |  11 -
>           net/wget.c                               |  39 +-
>           18 files changed, 2038 insertions(+), 32 deletions(-)
>           create mode 100644 lib/efi_loader/efi_http.c
>           create mode 100644 lib/efi_loader/efi_ipconfig.c
>           create mode 100644 lib/efi_selftest/efi_selftest_http.c
>           create mode 100644 lib/efi_selftest/efi_selftest_ipconfig.c
>
>         --
>         2.43.0
>