From: Patrick Wildt <patrick@blueri.se>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 2/2] efi_loader: set the dhcp ack received flag
Date: Thu, 31 Jan 2019 15:25:25 +0100 [thread overview]
Message-ID: <20190131142525.GA37117@nyx.local> (raw)
In-Reply-To: <141d2897-07ae-f1ef-bb01-83cd49d792fd@suse.de>
On Sun, Dec 02, 2018 at 10:21:12PM +0100, Alexander Graf wrote:
> On 27.03.18 18:05, Heinrich Schuchardt wrote:
> > On 03/27/2018 02:24 PM, Patrick Wildt wrote:
> >> The PXE object contains a flag that specifies whether or not a DHCP
> >> ACK has been received. This can be used by EFI Applications to find
> >> out whether or not it is worth to read the DHCP information from our
> >> object.
> >>
> >> Signed-off-by: Patrick Wildt <patrick@blueri.se>
> >> ---
> >> lib/efi_loader/efi_net.c | 4 +++-
> >> 1 file changed, 3 insertions(+), 1 deletion(-)
> >>
> >> 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;
> >> + }
> >
> > We have received a DHCPOFFER and we now send a DHCPREQUEST to the
> > selected server. This is when efi_net_set_dhcp_ack() is called which
> > sets the variable dhcp_ack.
> >
> > If the server sustains its offer it responds with a DHCPACK or with a
> > DHCPNACK. Shouldn't we ensure a DHCPACK was received (and not a DHCNACK)
> > before setting dhcp_ack_received?
>
> Patrick, ping? :)
>
> Alex
Sorry, I had a bit of other stuff to take care of and didn't get to it.
Turns out the change is rather easy to do, since we can just add another
function in the EFI subsystem to call once we receive the actual ACK.
This version works for me.
Patrick
diff --git a/include/efi_loader.h b/include/efi_loader.h
index 53f08161ab..3dcfc4b16f 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -285,6 +285,8 @@ efi_fs_from_path(struct efi_device_path *fp);
/* Called by networking code to memorize the dhcp ack package */
void efi_net_set_dhcp_ack(void *pkt, int len);
+/* Called by networking code to memorize we got an ack */
+void efi_net_set_dhcp_ack_received(void);
/* Called by efi_set_watchdog_timer to reset the timer */
efi_status_t efi_set_watchdog(unsigned long timeout);
diff --git a/lib/efi_loader/efi_net.c b/lib/efi_loader/efi_net.c
index c7d9da8521..96610c768e 100644
--- a/lib/efi_loader/efi_net.c
+++ b/lib/efi_loader/efi_net.c
@@ -15,6 +15,7 @@ static struct efi_pxe_packet *dhcp_ack;
static bool new_rx_packet;
static void *new_tx_packet;
static void *transmit_buffer;
+static int dhcp_ack_received;
/*
* The notification function of this event is called in every timer cycle
@@ -536,6 +537,16 @@ void efi_net_set_dhcp_ack(void *pkt, int len)
memcpy(dhcp_ack, pkt, min(len, maxsize));
}
+/**
+ * efi_net_set_dhcp_ack_received() - take note of a received ACK
+ *
+ * This function is called by dhcp_handler().
+ */
+void efi_net_set_dhcp_ack_received(void)
+{
+ dhcp_ack_received = 1;
+}
+
/**
* efi_net_push() - callback for received network packet
*
@@ -645,8 +656,10 @@ efi_status_t efi_net_register(void)
netobj->net_mode.if_type = ARP_ETHER;
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 = dhcp_ack_received;
+ }
/*
* Create WaitForPacket event.
diff --git a/net/bootp.c b/net/bootp.c
index 9a2b512e4a..b0c26418ca 100644
--- a/net/bootp.c
+++ b/net/bootp.c
@@ -1087,6 +1087,7 @@ static void dhcp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
dhcp_packet_process_options(bp);
/* Store net params from reply */
store_net_params(bp);
+ efi_net_set_dhcp_ack_received();
dhcp_state = BOUND;
printf("DHCP client bound to address %pI4 (%lu ms)\n",
&net_ip, get_timer(bootp_start));
next prev parent reply other threads:[~2019-01-31 14:25 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-27 12:24 [U-Boot] [PATCH 2/2] efi_loader: set the dhcp ack received flag Patrick Wildt
2018-03-27 16:05 ` Heinrich Schuchardt
2018-12-02 21:21 ` Alexander Graf
2019-01-31 14:25 ` Patrick Wildt [this message]
2019-01-31 14:31 ` Alexander Graf
2019-01-31 14:54 ` Patrick Wildt
2019-01-31 18:29 ` Heinrich Schuchardt
2019-02-04 16:43 ` Patrick Wildt
2019-02-04 17:28 ` Heinrich Schuchardt
2019-04-10 9:20 ` Patrick Wildt
2019-04-10 9:24 ` Patrick Wildt
2019-08-02 19:26 ` Patrick Wildt
2019-08-04 11:52 ` Heinrich Schuchardt
2019-08-05 20:08 ` [U-Boot] EFI_PXE_BASE_CODE_PROTOCOL Heinrich Schuchardt
2019-08-06 6:34 ` Heinrich Schuchardt
2019-08-06 8:44 ` Leif Lindholm
2019-08-06 17:02 ` Peter Jones
2019-08-06 18:52 ` Heinrich Schuchardt
2019-08-06 19:35 ` Leif Lindholm
2019-08-06 17:49 ` [U-Boot] [PATCH 2/2] efi_loader: set the dhcp ack received flag Heinrich Schuchardt
[not found] <7c21262c-62a9-ba5e-3f4f-023c7026d7f8@gmx.de>
2018-03-23 19:04 ` Heinrich Schuchardt
2018-03-25 17:44 ` Patrick Wildt
2018-03-25 20:04 ` Heinrich Schuchardt
2018-03-25 20:23 ` Patrick Wildt
2018-03-26 4:39 ` Heinrich Schuchardt
2018-03-26 7:28 ` Patrick Wildt
2018-03-26 11:34 ` Alexander Graf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190131142525.GA37117@nyx.local \
--to=patrick@blueri.se \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox