efi_selftest: Receive the packets until the receive buffer is empty
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>
This commit is contained in:
parent
9845b92436
commit
28fc87ee3a
1 changed files with 38 additions and 31 deletions
|
@ -362,39 +362,46 @@ static int execute(void)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Receive packet
|
* Receive packets until buffer is empty
|
||||||
*/
|
*/
|
||||||
buffer_size = sizeof(buffer);
|
for (;;) {
|
||||||
ret = net->receive(net, NULL, &buffer_size, &buffer,
|
buffer_size = sizeof(buffer);
|
||||||
&srcaddr, &destaddr, NULL);
|
ret = net->receive(net, NULL, &buffer_size, &buffer,
|
||||||
if (ret != EFI_SUCCESS) {
|
&srcaddr, &destaddr, NULL);
|
||||||
efi_st_error("Failed to receive packet");
|
if (ret == EFI_NOT_READY) {
|
||||||
return EFI_ST_FAILURE;
|
/* The received buffer is empty. */
|
||||||
}
|
break;
|
||||||
/*
|
}
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
received:
|
||||||
/*
|
/*
|
||||||
* Write a log message.
|
* Write a log message.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue