#include "src/lib.h"
int send_wol(const char *interface, unsigned char *buf, int len) {
struct sockaddr_ll sll;
struct ifreq ifr;
int sock, arp_source_ip, arp_target_ip;
if((sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0) {
perror("socket");
return 1;
}
memset(&ifr, 0x00, sizeof(ifr));
strcpy(ifr.ifr_name, interface);
if(ioctl(sock, SIOCGIFINDEX, &ifr) < 0 ) {
perror("ioctl ");
return 1;
}
memset(&sll, 0x00, sizeof(sll));
sll.sll_family = PF_PACKET;
sll.sll_ifindex = ifr.ifr_ifindex;
sll.sll_protocol = htons(ETH_P_ALL);
if(sendto(sock, buf, len, 0,
(struct sockaddr *)&sll, sizeof(sll)) < 0) {
perror("sendto ");
}
return 0;
}
void make_ether_packet(char *buf, const char *dstmac) {
struct ether_header *ether_header = (struct ether_header *)buf;
const char broadmac[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
const char srcmac[6] = {0x00, 0x90, 0x27, 0x85, 0xcf, 0x01};
memcpy(ether_header->ether_dhost, broadmac, 6);
memcpy(ether_header->ether_shost, srcmac, 6);
ether_header->ether_type = htons(0x0842);
}
void make_wol_packet(char *buf, const char *dstmac) {
int offset = 0;
const char broadmac[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
memcpy(buf, broadmac, sizeof(broadmac));
offset += sizeof(broadmac);
for (int i=0; i<16; i++) {
memcpy(buf + offset, dstmac, 6);
offset += 6;
}
}