[U-Boot] [PATCH 1/2] [RFC]new command: wol - Wake on LAN

Simon Glass sjg at chromium.org
Mon Apr 30 23:12:26 UTC 2018


Hi Lothar,

On 23 April 2018 at 11:47, Lothar Felten <lothar.felten at gmail.com> wrote:
> This patch adds a new command 'wol': It waits for an incoming
> Wake-on-LAN
> packet or times out if no WoL packed is received.
> If the WoL packet contains a password, it is saved in the environment
> variable 'wolpassword' using the etherwake format (dot separated
> decimals).
>
> Intended use case: a networked device should boot an alternate image.
> It's attached to a network on a client site, modifying the DHCP server
> configuration or setup of a tftp server is not allowed.
> After power on the device waits a few seconds for a WoL packet. If a
> packet is received, the device boots the alternate image. Otherwise
> it boots the default image.
>
> This method is a simple way to interact with a system via network even
> if only the MAC address is known. Tools to send WoL packets are
> available on all common platforms.
>
> Signed-off-by: Lothar Felten <lothar.felten at gmail.com>
> ---
>  net/wol.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  net/wol.h | 40 ++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 94 insertions(+)
>  create mode 100644 net/wol.c
>  create mode 100644 net/wol.h
>
> diff --git a/net/wol.c b/net/wol.c
> new file mode 100644
> index 0000000000..0cedbaed85
> --- /dev/null
> +++ b/net/wol.c
> @@ -0,0 +1,54 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright 2018 Lothar Felten, lothar.felten at gmail.com
> + */
> +
> +#include <common.h>
> +#include <command.h>
> +#include <net.h>
> +#include "wol.h"
> +
> +/*
> + *     Handle a received wake-on-lan packet.
> + */
> +void wol_receive(struct ip_udp_hdr *ip, unsigned int len)
> +{
> +       char buf[4];
> +       int i;
> +       struct wol_hdr *wol;
> +
> +       wol = (struct wol_hdr *)ip;
> +
> +       if (len < 102)
> +               return;
> +
> +       for (i = 0; i < 6; i++)
> +               if (wol->wol_sync[i] != 0xff)
> +                       return;
> +
> +       for (i = 0; i < 16; i++)
> +               if (memcmp(&wol->wol_dest[i * 6], net_ethaddr, 6) != 0)
> +                       return;
> +
> +       /* save the optional password using the etherwake format */
> +       if (len >= 106) {

Is it possible to remove these four open-coded values and use values
from the header file instead?

> +               sprintf(buf, "%i.%i.%i.%i",
> +                       wol->wol_passwd[0], wol->wol_passwd[1],
> +                       wol->wol_passwd[2], wol->wol_passwd[3]);
> +               env_set("wolpassword", buf);
> +       }
> +       net_set_state(NETLOOP_SUCCESS);
> +}
> +
> +static void wol_timeout_handler(void)
> +{
> +       eth_halt();
> +       net_set_state(NETLOOP_FAIL);
> +}
> +
> +void wol_start(void)
> +{
> +       ulong timeout = env_get_ulong("woltimeout", 10, 5);
> +
> +       net_set_timeout_handler(timeout * 1000, wol_timeout_handler);
> +}
> diff --git a/net/wol.h b/net/wol.h
> new file mode 100644
> index 0000000000..e34767c733
> --- /dev/null
> +++ b/net/wol.h
> @@ -0,0 +1,40 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright 2018 Lothar Felten, lothar.felten at gmail.com
> + */
> +
> +#if defined(CONFIG_CMD_WOL)
> +
> +#ifndef __WOL_H__
> +#define __WOL_H__
> +
> +#include <net.h>
> +
> +/**********************************************************************/
> +
> +/*
> + *     Wake-on-LAN header.
> + */
> +struct wol_hdr {
> +       u8      wol_sync[6];            /* sync bytes                   */
> +       u8      wol_dest[16 * 6];       /* 16x destination MAC address  */
> +       u8      wol_passwd[4];          /* optional password            */
> +};
> +
> +/*
> + * Initialize wol (beginning of netloop)
> + */
> +void wol_start(void);
> +
> +/*
> + * Deal with the receipt of a wol packet
> + *
> + * @param ip IP header in the packet
> + * @param len Packet length
> + */
> +void wol_receive(struct ip_udp_hdr *ip, unsigned int len);

It seems like this should return an error code if the packet does not
match as expected (the 'return' in your impl)

Also you could expand a bit on what 'deal with' means. What exactly happens?

Seems like there should be a README addition somewhere too.

> +
> +/**********************************************************************/
> +
> +#endif /* __WOL_H__ */
> +#endif
> --
> 2.14.1
>

Regards,
Simon


More information about the U-Boot mailing list