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:54:23 +0100 [thread overview]
Message-ID: <20190131145423.GA37343@nyx.local> (raw)
In-Reply-To: <22d7dfc2-6013-00e4-b477-0c7d4151dceb@suse.de>
On Thu, Jan 31, 2019 at 03:31:34PM +0100, Alexander Graf wrote:
> On 01/31/2019 03:25 PM, Patrick Wildt wrote:
> > 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;
>
> Is there any way to pass an object reference in as parameter that allows us
> to find the exact efi net object back again? IIRC the network code was
> pretty much single target, but maybe we don't have to encode that in every
> single place ...
I agree, but I have to say that I don't know the u-boot code enough to
know that.
> > +}
> > +
> > /**
> > * 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();
>
> Won't this fail to compile with !CONFIG_EFI_LOADER?
>
> Alex
Turns out I sent an older diff. I had made that change, but I forgot
to append the right one. Sorry for the mishap.
Patrick
diff --git a/include/efi_loader.h b/include/efi_loader.h
index 53f08161ab..4f131e52c2 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);
@@ -559,6 +561,7 @@ static inline void efi_restore_gd(void) { }
static inline void efi_set_bootdev(const char *dev, const char *devnr,
const char *path) { }
static inline void efi_net_set_dhcp_ack(void *pkt, int len) { }
+static inline void efi_net_set_dhcp_ack_received(void) { }
static inline void efi_print_image_infos(void *pc) { }
#endif /* CONFIG_IS_ENABLED(EFI_LOADER) */
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:54 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
2019-01-31 14:31 ` Alexander Graf
2019-01-31 14:54 ` Patrick Wildt [this message]
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=20190131145423.GA37343@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