#!/bin/bash
hex="\xFF\xFF\xFF\xFF\xFF\xFF"
mac_hex="\\x`printf "$1" | sed 's/:/\\\\x/g'`"
wol_string="$hex"
for i in {1..16}
do
wol_string+="$mac_hex"
done
printf "$wol_string" | nc -u -b -w 1 "$2" 9
It took me a while to find an explanation of something so simple, I can't figure out why everyone relies on huge binary packages and libraries to do it. I just needed something on my router so that I could wake my machines from outside the house. I ended up just writing a couple shell scripts that called it and triggering them with nginx via FastCGI so I could click on a link to wake up my machines.Nothing against the article though, but maybe someone knows a good writeup.
A lot of sleep modes leave more running than you'd expect.
"+5 V Standby" is provided by a separate voltage regulator, which continues to work even when the PC, including the rest of the ATX PSU, is shut down.
"+5 V Standby" typically can provide up to 2 A, i.e. up to 10 watt, though some old PSUs may be able to deliver only up to 5 watt and some of the bigger ATX PSUs may be able to deliver up to 15 watt.
Besides supplying the Ethernet cards, to enable WoL, "+5 V Standby" can be used by the USB ports if configured so in BIOS, to enable waking the PC with the keyboard, or to enable charging from USB even when the PC is shut down.
I also finally found this old page of using an old dev board to construct a WoL listener for a mobo that didn't support it -- might be an interesting read for the curious: https://web.archive.org/web/20140525022112/https://hackingbe...
> In this script a fifo is created where the output of tcpdump is dumped. For whatever reason tcpdum | grep was not working properly, and would have a “miss” rate of about 50%. So tcpdump output is dumped in the fifo:
>
> tcpdump -i eth1 2>&1 | tee > /tmp/tcp_wol.fifo &
>
> and it’s grepped in a loop, when the magic packet (see http://en.wikipedia.org/wiki/Wake-on-LAN) is found , a led is triggered, thus powering-up the computer (with a driver and relay, will come back at this).
One thing I noticed is that if I connect to a gigabit upstream port, that the connection drops to 100 mbit/s when the computer is off, but if I connect to a 2.5 Gbit port, it stays at full speed. This is based both on LEDs on the connector as well as the OpenWRT dashboard on the router. If it made a difference it was too small to reliably measure with my simple meter.
If it makes a difference (potentially does for conversion losses I would guess), this is on 230 V mains.
> . I n o t h e r w o r d s , s i l i c o n - o r g a t e - l evel
This part, I don't know, but default magic packet has 6 bytes of 0xff, followed by the mac address sixteen times in a row, so it's a fairly simple state machine as the packet comes in. The AMD whitepaper others linked might have details?
> how, it wakes up the system via PCIe
Pci-e pin 11-B is wake#. PCI 2.2 added PME# on 19A which does the same job for PCI. Pull it high (I think) to wakeup the host. I don't think there's a pin for this on ISA, so you'd need some system specific connector to wakeup from an ISA nic.
> how switches route the frames to the port which has/had the client.
Ethernet switching is a whole different thing. You can send a broadcast frame and those should get flooded to all ports. If you send a unicast frame, the switch looks up the destination mac in its address table, if present, it sends only to the port where that address was seen, otherwise it floods to all ports.
"How to send a magic packet in $LANG" isn't very interesting to me. There are plenty of guides for it, and I remember actually doing it 20+ years ago with a short PHP script.
Even at the time, the task didn't seem like "enough" for a show-the-world blog post. A dramatically shortened version (no validation, error handling, logging, etc.) for your amusement:
// Given $macAddress and $addr and $port
$macAddress = str_replace(":","",$macAddress);
$macAddress = str_replace("-","",$macAddress);
$header = pack('H12','FFFFFFFFFFFF');
$payload = pack("H12",$macAddress);
$packet = $header . str_repeat($payload,16);
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_set_option($sock, 1, 6, TRUE);
socket_sendto($sock, $payload, strlen($payload), 0, $addr, $port);
socket_close($sock);> Even at the time, the task didn't seem like "enough" for a show-the-world blog post.
Its an old (de facto industry) standard, but maybe more relevant than ever. I'm interested in moving more of my compute usage off-cloud these days, which is why this is of interest to me right now. I suspect many others feel the same way.
Might be a good time to post other tidbits of knowledge you have like this, targeted at software engineers that are starting to get more into infrastructure management. Standards that are ubiquitous and just work are awesome.
I think they did a great job for writing in a secondary language.
How good are you at blogging in your third language?
Ich? Nicht so gut, aber Ich kann veillicht ein bisschen posten auf Deutsch.
Agus co dhiù, bha Beurla an dàrnan cànan agamsa.
So if my posts in English (proper English, not North American "Simplified English") are a bit squint at times, blame that.
Then again, an LLM could probably help clean up the grammar.
The only way I can describe it is like when I was playing with LPC10 codecs (the 2400bps codec used in Speak'n'Spells, and other such 80s talking things). It didn't sound like me, it sounded like a Speak'n'Spell with my accent, if that makes sense.
No? Okay, if not, if you want I could probably record another clip to show you.