#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;
  }
}