Skip to content
Snippets Groups Projects
  • Lothar Felten's avatar
    d8970dae
    net: Add new wol command - Wake on LAN · d8970dae
    Lothar Felten authored
    
    Add a new command 'wol': Wait for an incoming Wake-on-LAN packet or
    time 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 or colon
    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.
    
    Some Ethernet drivers seem to pad the incoming packet. The additional
    padding bytes might be recognized as Wake-on-LAN password bytes.
    
    By default enabled in pengwyn_defconfig.
    
    Signed-off-by: default avatarLothar Felten <lothar.felten@gmail.com>
    Acked-by: default avatarJoe Hershberger <joe.hershberger@ni.com>
    d8970dae
    History
    net: Add new wol command - Wake on LAN
    Lothar Felten authored
    
    Add a new command 'wol': Wait for an incoming Wake-on-LAN packet or
    time 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 or colon
    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.
    
    Some Ethernet drivers seem to pad the incoming packet. The additional
    padding bytes might be recognized as Wake-on-LAN password bytes.
    
    By default enabled in pengwyn_defconfig.
    
    Signed-off-by: default avatarLothar Felten <lothar.felten@gmail.com>
    Acked-by: default avatarJoe Hershberger <joe.hershberger@ni.com>
wol.h 1.40 KiB
/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * wol - Wake-on-LAN
 *
 * Supports both Wake-on-LAN packet types:
 * - EtherType 0x0842 packets
 * - UDP packets on ports 0, 7 and 9.
 *
 * Copyright 2018 Lothar Felten, lothar.felten@gmail.com
 */

#if defined(CONFIG_CMD_WOL)

#ifndef __WOL_H__
#define __WOL_H__

#include <net.h>

/**********************************************************************/

#define WOL_SYNC_BYTE			0xFF
#define WOL_SYNC_COUNT			6
#define WOL_MAC_REPETITIONS		16
#define WOL_DEFAULT_TIMEOUT		5000
#define WOL_PASSWORD_4B			4
#define WOL_PASSWORD_6B			6

/*
 * Wake-on-LAN header
 */
struct wol_hdr {
	u8	wol_sync[WOL_SYNC_COUNT];			/* sync bytes */
	u8	wol_dest[WOL_MAC_REPETITIONS * ARP_HLEN];	/* 16x MAC */
	u8	wol_passwd[0];					/* optional */
};

/*
 * Initialize wol (beginning of netloop)
 */
void wol_start(void);

/*
 * Check incoming Wake-on-LAN packet for:
 * - sync bytes
 * - sixteen copies of the target MAC address
 *
 * Optionally store the four or six byte password in the environment
 * variable "wolpassword"
 *
 * @param ip IP header in the packet
 * @param len Packet length
 */
void wol_receive(struct ip_udp_hdr *ip, unsigned int len);

/*
 * Set the timeout for the reception of a Wake-on-LAN packet
 *
 * @param timeout in milliseconds
 */
void wol_set_timeout(ulong timeout);

/**********************************************************************/

#endif /* __WOL_H__ */
#endif