summaryrefslogtreecommitdiffstats
path: root/carl9170fw/tools/src/wol.c
diff options
context:
space:
mode:
Diffstat (limited to 'carl9170fw/tools/src/wol.c')
-rw-r--r--carl9170fw/tools/src/wol.c209
1 files changed, 0 insertions, 209 deletions
diff --git a/carl9170fw/tools/src/wol.c b/carl9170fw/tools/src/wol.c
deleted file mode 100644
index 41daba2..0000000
--- a/carl9170fw/tools/src/wol.c
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright 2011, Christian Lamparter <chunkeey@googlemail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <unistd.h>
-#include <stdbool.h>
-
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include <linux/types.h>
-#include <linux/if_ether.h> /* ETH_P_ALL */
-#include <linux/if_packet.h> /* sockaddr_ll */
-#include <linux/if.h> /* IFNAMSIZ */
-
-static int monitor_init(const char *ifname)
-{
- struct sockaddr_ll ll;
- int monitor_sock;
-
- memset(&ll, 0, sizeof(ll));
- ll.sll_family = AF_PACKET;
- ll.sll_ifindex = if_nametoindex(ifname);
- if (ll.sll_ifindex == 0) {
- fprintf(stderr, "Monitor interface '%s' does not exist\n", ifname);
- return -1;
- }
-
- monitor_sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
- if (monitor_sock < 0) {
- fprintf(stderr, "socket(PF_PACKET,SOCK_RAW): %s\n", strerror(errno));
- return -1;
- }
-
- if (bind(monitor_sock, (struct sockaddr *) &ll, sizeof(ll)) < 0) {
- fprintf(stderr, "bind(PACKET): %s\n", strerror(errno));
- close(monitor_sock);
- return -1;
- }
-
- return monitor_sock;
-}
-
-static int inject_frame(int s, const void *data, size_t len)
-{
-#define IEEE80211_RADIOTAP_F_FRAG 0x08
- unsigned char rtap_hdr[] = {
- 0x00, 0x00, /* radiotap version */
- 0x0e, 0x00, /* radiotap length */
- 0x02, 0xc0, 0x00, 0x00, /* bmap: flags, tx and rx flags */
- IEEE80211_RADIOTAP_F_FRAG, /* F_FRAG (fragment if required) */
- 0x00, /* padding */
- 0x00, 0x00, /* RX and TX flags to indicate that */
- 0x00, 0x00, /* this is the injected frame directly */
- };
- struct iovec iov[2] = {
- {
- .iov_base = &rtap_hdr,
- .iov_len = sizeof(rtap_hdr),
- },
- {
- .iov_base = (void *) data,
- .iov_len = len,
- }
- };
- struct msghdr msg = {
- .msg_name = NULL,
- .msg_namelen = 0,
- .msg_iov = iov,
- .msg_iovlen = 2,
- .msg_control = NULL,
- .msg_controllen = 0,
- .msg_flags = 0,
- };
- int ret;
-
- ret = sendmsg(s, &msg, 0);
- if (ret < 0)
- perror("sendmsg");
- return ret;
-}
-
-static unsigned char wol_magic_tmpl[30 + 6 + 16 * 6] = {
- 0x08, 0x00, 0x00, 0x00,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* RA */
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* TA */
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* SA */
- 0x00, 0x00,
-
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-};
-
-static void prepare_wol(unsigned char *wol_magic, unsigned char *mac)
-{
- int i;
-
- for (i = 0; i < 16; i++)
- memcpy(&wol_magic[30 + i * 6], mac, 6);
-}
-
-void usage(void)
-{
- fprintf(stderr, "Usage:\n");
- fprintf(stderr, "\twol -i monitor_dev -m DE:VI:CE:MA:CW:OL -n #num -v\n");
-
- fprintf(stderr, "\nDescription:\n");
- fprintf(stderr, "\tThis utility generates a WOL packet for the"
- "given [MAC] address and tries to injects"
- "it into [monitor_dev]\n");
-
- exit(EXIT_FAILURE);
-}
-
-#define MAC_STR "%2X:%2X:%2X:%2X:%2X:%2X"
-
-#define M(a, i) ((unsigned int *)&a[i])
-#define MAC_ARG(a) M(a, 0), M(a, 1), M(a, 2), M(a, 3), M(a, 4), M(a, 5)
-
-#define M2(a, i) (a[i])
-#define MAC_ARG2(a) M2(a, 0), M2(a, 1), M2(a, 2), M2(a, 3), M2(a, 4), M2(a, 5)
-
-int main(int argc, char **args)
-{
- int sock, err = 0, opt, num = 10;
- unsigned char mac[ETH_ALEN];
- char dev_name[IFNAMSIZ + 1] = { 0 };
- bool has_mac = false, has_dev = false, verbose = false;
-
- while ((opt = getopt(argc, args, "m:i:n:v")) != -EXIT_FAILURE) {
- switch (opt) {
- case 'i':
- has_dev = true;
- strncpy(dev_name, optarg, IFNAMSIZ);
- break;
- case 'm':
- has_mac = true;
- err = sscanf(optarg, MAC_STR, MAC_ARG(mac)) != 6;
- if (err)
- fprintf(stderr, "invalid MAC: \"%s\"\n", optarg);
- break;
-
- case 'n':
- err = sscanf(optarg, "%d", &num) != 1;
- err |= num < 1 | num > 1000;
- if (err)
- fprintf(stderr, "invalid tries: \"%s\"\n", optarg);
- break;
-
- case 'v':
- verbose = true;
- break;
-
- default:
- err = -EINVAL;
- break;
- }
-
- if (err)
- break;
- }
-
- if (!has_mac || !has_dev || err)
- usage();
-
- if (verbose)
- fprintf(stdout, "Opening monitor injection interface [%s].\n", dev_name);
-
- sock = monitor_init(dev_name);
- if (sock < 0)
- return EXIT_FAILURE;
-
- if (verbose)
- fprintf(stdout, "Generating %d WOL packet for ["MAC_STR"].\n", num, MAC_ARG2(mac));
-
- prepare_wol(wol_magic_tmpl, mac);
-
- while (num--) {
- err = inject_frame(sock, wol_magic_tmpl, sizeof(wol_magic_tmpl));
- if (err < 0) {
- fprintf(stderr, "failed to send WOL packet.\n");
- break;
- } else if (verbose) {
- fprintf(stdout, "WOL packet sent.\n");
- }
- }
-
- close(sock);
- if (err < 0)
- return EXIT_FAILURE;
-
- return 0;
-}