test/py: test_ut.py: Ensure we use bytes
[oweals/u-boot.git] / lib / efi_selftest / efi_selftest_snp.c
index cc0705fb59fbab3ad14c664ebaacc5cab4efcaa0..9797ecaf42ee053c0f872e18369acf2bb86cf513 100644 (file)
@@ -1,10 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * efi_selftest_snp
  *
  * Copyright (c) 2017 Heinrich Schuchardt <xypron.glpk@gmx.de>
  *
- * SPDX-License-Identifier:    GPL-2.0+
- *
  * This unit test covers the Simple Network Protocol as well as
  * the CopyMem and SetMem boottime services.
  *
@@ -67,7 +66,7 @@ struct dhcp {
 static struct efi_boot_services *boottime;
 static struct efi_simple_network *net;
 static struct efi_event *timer;
-static const efi_guid_t efi_net_guid = EFI_SIMPLE_NETWORK_GUID;
+static const efi_guid_t efi_net_guid = EFI_SIMPLE_NETWORK_PROTOCOL_GUID;
 /* IP packet ID */
 static unsigned int net_ip_id;
 
@@ -104,7 +103,7 @@ static efi_status_t send_dhcp_discover(void)
        struct dhcp p = {};
 
        /*
-        * Fill ethernet header
+        * Fill Ethernet header
         */
        boottime->copy_mem(p.eth_hdr.et_dest, (void *)BROADCAST_MAC, ARP_HLEN);
        boottime->copy_mem(p.eth_hdr.et_src, &net->mode->current_address,
@@ -229,6 +228,38 @@ static int setup(const efi_handle_t handle,
                efi_st_error("WaitForPacket event missing\n");
                return EFI_ST_FAILURE;
        }
+       if (net->mode->state == EFI_NETWORK_INITIALIZED) {
+               /*
+                * Shut down network adapter.
+                */
+               ret = net->shutdown(net);
+               if (ret != EFI_SUCCESS) {
+                       efi_st_error("Failed to shut down network adapter\n");
+                       return EFI_ST_FAILURE;
+               }
+       }
+       if (net->mode->state == EFI_NETWORK_STARTED) {
+               /*
+                * Stop network adapter.
+                */
+               ret = net->stop(net);
+               if (ret != EFI_SUCCESS) {
+                       efi_st_error("Failed to stop network adapter\n");
+                       return EFI_ST_FAILURE;
+               }
+       }
+       /*
+        * Start network adapter.
+        */
+       ret = net->start(net);
+       if (ret != EFI_SUCCESS && ret != EFI_ALREADY_STARTED) {
+               efi_st_error("Failed to start network adapter\n");
+               return EFI_ST_FAILURE;
+       }
+       if (net->mode->state != EFI_NETWORK_STARTED) {
+               efi_st_error("Failed to start network adapter\n");
+               return EFI_ST_FAILURE;
+       }
        /*
         * Initialize network adapter.
         */
@@ -237,12 +268,8 @@ static int setup(const efi_handle_t handle,
                efi_st_error("Failed to initialize network adapter\n");
                return EFI_ST_FAILURE;
        }
-       /*
-        * Start network adapter.
-        */
-       ret = net->start(net);
-       if (ret != EFI_SUCCESS) {
-               efi_st_error("Failed to start network adapter\n");
+       if (net->mode->state != EFI_NETWORK_INITIALIZED) {
+               efi_st_error("Failed to initialize network adapter\n");
                return EFI_ST_FAILURE;
        }
        return EFI_ST_SUCCESS;
@@ -269,6 +296,7 @@ static int execute(void)
        struct efi_mac_address destaddr;
        size_t buffer_size;
        u8 *addr;
+
        /*
         * The timeout is to occur after 10 s.
         */
@@ -299,6 +327,8 @@ static int execute(void)
        events[0] = timer;
        events[1] = net->wait_for_packet;
        for (;;) {
+               u32 int_status;
+
                /*
                 * Wait for packet to be received or timer event.
                 */
@@ -324,8 +354,17 @@ static int execute(void)
                 * Receive packet
                 */
                buffer_size = sizeof(buffer);
-               net->receive(net, NULL, &buffer_size, &buffer,
-                            &srcaddr, &destaddr, NULL);
+               ret = net->get_status(net, &int_status, NULL);
+               if (ret != EFI_SUCCESS) {
+                       efi_st_error("Failed to get status");
+                       return EFI_ST_FAILURE;
+               }
+               if (!(int_status & EFI_SIMPLE_NETWORK_RECEIVE_INTERRUPT)) {
+                       efi_st_error("RX interrupt not set");
+                       return EFI_ST_FAILURE;
+               }
+               ret = net->receive(net, NULL, &buffer_size, &buffer,
+                                  &srcaddr, &destaddr, NULL);
                if (ret != EFI_SUCCESS) {
                        efi_st_error("Failed to receive packet");
                        return EFI_ST_FAILURE;
@@ -335,9 +374,8 @@ static int execute(void)
                 * Unfortunately QEMU ignores the broadcast flag.
                 * So we have to check for broadcasts too.
                 */
-               if (efi_st_memcmp(&destaddr, &net->mode->current_address,
-                                 ARP_HLEN) &&
-                   efi_st_memcmp(&destaddr, BROADCAST_MAC, ARP_HLEN))
+               if (memcmp(&destaddr, &net->mode->current_address, ARP_HLEN) &&
+                   memcmp(&destaddr, BROADCAST_MAC, ARP_HLEN))
                        continue;
                /*
                 * Check this is a DHCP reply
@@ -361,7 +399,7 @@ static int execute(void)
        addr = (u8 *)&buffer.p.ip_udp.ip_src;
        efi_st_printf("DHCP reply received from %u.%u.%u.%u (%pm) ",
                      addr[0], addr[1], addr[2], addr[3], &srcaddr);
-       if (!efi_st_memcmp(&destaddr, BROADCAST_MAC, ARP_HLEN))
+       if (!memcmp(&destaddr, BROADCAST_MAC, ARP_HLEN))
                efi_st_printf("as broadcast message.\n");
        else
                efi_st_printf("as unicast message.\n");
@@ -402,21 +440,29 @@ static int teardown(void)
        }
        if (net) {
                /*
-                * Stop network adapter.
+                * Shut down network adapter.
                 */
-               ret = net->stop(net);
+               ret = net->shutdown(net);
                if (ret != EFI_SUCCESS) {
-                       efi_st_error("Failed to stop network adapter\n");
+                       efi_st_error("Failed to shut down network adapter\n");
                        exit_status = EFI_ST_FAILURE;
                }
+               if (net->mode->state != EFI_NETWORK_STARTED) {
+                       efi_st_error("Failed to shutdown network adapter\n");
+                       return EFI_ST_FAILURE;
+               }
                /*
-                * Shut down network adapter.
+                * Stop network adapter.
                 */
-               ret = net->shutdown(net);
+               ret = net->stop(net);
                if (ret != EFI_SUCCESS) {
-                       efi_st_error("Failed to shut down network adapter\n");
+                       efi_st_error("Failed to stop network adapter\n");
                        exit_status = EFI_ST_FAILURE;
                }
+               if (net->mode->state != EFI_NETWORK_STOPPED) {
+                       efi_st_error("Failed to stop network adapter\n");
+                       return EFI_ST_FAILURE;
+               }
        }
 
        return exit_status;
@@ -428,4 +474,12 @@ EFI_UNIT_TEST(snp) = {
        .setup = setup,
        .execute = execute,
        .teardown = teardown,
+#ifdef CONFIG_SANDBOX
+       /*
+        * Running this test on the sandbox requires setting environment
+        * variable ethact to a network interface connected to a DHCP server and
+        * ethrotate to 'no'.
+        */
+       .on_request = true,
+#endif
 };