]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
efi_selftest: Receive the packets until the receive buffer is empty
authorMasami Hiramatsu <masami.hiramatsu@linaro.org>
Thu, 16 Sep 2021 08:53:44 +0000 (17:53 +0900)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Thu, 21 Oct 2021 01:46:03 +0000 (03:46 +0200)
Repeatedly receive the packets until the receive buffer is empty.
If the buffer is empty, EFI_SIMPLE_NETWORK_PROTOCOL::Receive()
returns EFI_NOT_READY. We don't need to use the wait_for_event()
every time.

Signed-off-by: Masami Hiramatsu <masami.hiramatsu@linaro.org>
Reviewed-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
lib/efi_selftest/efi_selftest_snp.c

index c5366c872c38a3a67c53e201088341b2cb0ec76d..818cbfcacd49557332920c9b1c049c7427923e78 100644 (file)
@@ -362,39 +362,46 @@ static int execute(void)
                        continue;
                }
                /*
-                * Receive packet
+                * Receive packets until buffer is empty
                 */
-               buffer_size = sizeof(buffer);
-               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;
+               for (;;) {
+                       buffer_size = sizeof(buffer);
+                       ret = net->receive(net, NULL, &buffer_size, &buffer,
+                                          &srcaddr, &destaddr, NULL);
+                       if (ret == EFI_NOT_READY) {
+                               /* The received buffer is empty. */
+                               break;
+                       }
+
+                       if (ret != EFI_SUCCESS) {
+                               efi_st_error("Failed to receive packet");
+                               return EFI_ST_FAILURE;
+                       }
+                       /*
+                        * Check the packet is meant for this system.
+                        * Unfortunately QEMU ignores the broadcast flag.
+                        * So we have to check for broadcasts too.
+                        */
+                       if (memcmp(&destaddr, &net->mode->current_address, ARP_HLEN) &&
+                           memcmp(&destaddr, BROADCAST_MAC, ARP_HLEN))
+                               continue;
+                       /*
+                        * Check this is a DHCP reply
+                        */
+                       if (buffer.p.eth_hdr.et_protlen != ntohs(PROT_IP) ||
+                           buffer.p.ip_udp.ip_hl_v != 0x45 ||
+                           buffer.p.ip_udp.ip_p != IPPROTO_UDP ||
+                           buffer.p.ip_udp.udp_src != ntohs(67) ||
+                           buffer.p.ip_udp.udp_dst != ntohs(68) ||
+                           buffer.p.dhcp_hdr.op != BOOTREPLY)
+                               continue;
+                       /*
+                        * We successfully received a DHCP reply.
+                        */
+                       goto received;
                }
-               /*
-                * Check the packet is meant for this system.
-                * Unfortunately QEMU ignores the broadcast flag.
-                * So we have to check for broadcasts too.
-                */
-               if (memcmp(&destaddr, &net->mode->current_address, ARP_HLEN) &&
-                   memcmp(&destaddr, BROADCAST_MAC, ARP_HLEN))
-                       continue;
-               /*
-                * Check this is a DHCP reply
-                */
-               if (buffer.p.eth_hdr.et_protlen != ntohs(PROT_IP) ||
-                   buffer.p.ip_udp.ip_hl_v != 0x45 ||
-                   buffer.p.ip_udp.ip_p != IPPROTO_UDP ||
-                   buffer.p.ip_udp.udp_src != ntohs(67) ||
-                   buffer.p.ip_udp.udp_dst != ntohs(68) ||
-                   buffer.p.dhcp_hdr.op != BOOTREPLY)
-                       continue;
-               /*
-                * We successfully received a DHCP reply.
-                */
-               break;
        }
-
+received:
        /*
         * Write a log message.
         */