[U-Boot] [PATCH 2/2] efi_loader: set the dhcp ack received flag

Heinrich Schuchardt xypron.glpk at gmx.de
Sun Mar 25 20:04:55 UTC 2018


On 03/25/2018 07:44 PM, Patrick Wildt wrote:
> On Fri, Mar 23, 2018 at 08:04:27PM +0100, Heinrich Schuchardt wrote:
>> On 03/23/2018 08:01 PM, Heinrich Schuchardt wrote:
>>> >From 689ada7663efae5ef13d021f3266e081d1d53293 Mon Sep 17 00:00:00 2001
>>> From: Patrick Wildt <patrick at blueri.se>
>>> Date: Fri, 23 Mar 2018 15:38:48 +0100
>>> Subject: [PATCH 2/2] efi_loader: set the dhcp ack received flag
>>>
>>> The PXE object contains a flag that specifies whether or not a DHCP
>>> ACK has been received.  This might be used by programs to find out
>>> whether or not it is worth to read the DHCP information ot ouf our
>>> object.
>>>
>>
>> Why should we implement this change now without a consumer for the
>> information?
>>
>>> Signed-off-by: Patrick Wildt <patrick at blueri.se>
>>> ---
>>>  include/efi_api.h        | 4 +++-
>>>  lib/efi_loader/efi_net.c | 4 +++-
>>>  2 files changed, 6 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/include/efi_api.h b/include/efi_api.h
>>> index 3ba650e57e..7dfa17f5c6 100644
>>> --- a/include/efi_api.h
>>> +++ b/include/efi_api.h
>>> @@ -756,7 +756,9 @@ struct efi_pxe_packet {
>>>
>>>  struct efi_pxe_mode
>>>  {
>>> -	u8 unused[52];
>>> +	u8 unused1[9];
>>> +	u8 dhcp_ack_received;
>>
>> Why use a byte in the middle of the unused region?
> 
> The EFI Spec defines shared interfaces.  In this case u-boot implements
> the PXE Base Code Protocol, and "struct efi_pxe_mode" is a definition
> for a struct that is shared on the interface.  The struct is defined in
> UEFI Spec 2.6 Chapter 23.3 as EFI_PXE_BASE_CODE_MODE.  In this struct,
> theres a boolean called DhcpAckReceivd, which is the 10th member of the
> struct.  Since booleans in EFI are defined to uint8_t, this means it's
> the 10th byte starting from the beginning of the struct.  Since u-boot
> does not define all of the members of the struct, the first 52 bytes are
> "unused".  Since I am now accessing a field in the interface in the
> middle of those 52 bytes, it is split up into a first set and a second
> set of unused bytes, with the new dhcp_ack_received in the middle.
> Thus, it's not just a simple byte in the middle of an unused region and
> putting it somewhere else would violate the spec.
> 
> The consumer in this case would be the EFI Application being booted
> using the "bootefi" command.
> 
> Please correct me if I'm wrong.
> 
> Best regards,
> Patrick

Thank you for the explanation. I think the right way go ahead is to add
all missing fields and to do away with unused[].

Please, carefully observe the alignment. The spec defines BOOLEAN as
8bit value. ToS is the 19th byte followed by an EFI_IP_ADDRESS which is
a 16-byte buffer aligned on a 4-byte boundary. So after ToS we need one
byte to ensure alignment. We could define a struct efi_ip_address as
u8 a[16] __attribute__((aligned(4))).

Best regards

Heinrich

> 
>>
>> Best regards
>>
>> Heinrich
>>
>>> +	u8 unused2[42];
>>>  	struct efi_pxe_packet dhcp_discover;
>>>  	struct efi_pxe_packet dhcp_ack;
>>>  	struct efi_pxe_packet proxy_offer;
>>> diff --git a/lib/efi_loader/efi_net.c b/lib/efi_loader/efi_net.c
>>> index 8c5d5b492c..0b9c7b9345 100644
>>> --- a/lib/efi_loader/efi_net.c
>>> +++ b/lib/efi_loader/efi_net.c
>>> @@ -332,8 +332,10 @@ int efi_net_register(void)
>>>  	netobj->net_mode.max_packet_size = PKTSIZE;
>>>
>>>  	netobj->pxe.mode = &netobj->pxe_mode;
>>> -	if (dhcp_ack)
>>> +	if (dhcp_ack) {
>>>  		netobj->pxe_mode.dhcp_ack = *dhcp_ack;
>>> +		netobj->pxe_mode.dhcp_ack_received = 1;
>>> +	}
>>>
>>>  	/*
>>>  	 * Create WaitForPacket event.
>>>
>>
> 



More information about the U-Boot mailing list