#include <arpa/inet.h>
#include <linux/if_packet.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/ether.h>

#define BUF_SIZ		65536
#define SEND 0
#define RECV 1



void send_message(){

	//Do something here
memset(&sk_addr, 0, sk_addr_size); 
//set sk_addr for 0
sk_addr.sll_ifindex = if_idx.ifr_ifindex;
sk_addr.sll_halen = ETH_ALEN; 

byteSent = sendto(sockfd, buf, BUF_SIZ, 0, (struct socketaddr*)&sk_addr, sizeof(struct sockaddr_ll));
printf("success");

}

void recv_message(){

	//Do something here
memset(&sk_addr, 0, sk_addr_size);

recvLen = recvfrom(sockfd, buf, BUF_SIZ, 0, (struct sockaddr*)&sk_addr, &sk_addr_size);
printf("receive %s\n", buf);
}
//Sub function

int main(int argc, char *argv[])
{
	int mode;
	char hw_addr[6];
	char interfaceName[IFNAMSIZ];
	char buf[BUF_SIZ];
	memset(buf, 0, BUF_SIZ);
	//set buf for 0
	
	int correct=0;
	if (argc > 1){
		if(strncmp(argv[1],"Send", 4)==0){
			if (argc == 5){
				mode=SEND; 
				sscanf(argv[3], "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", &hw_addr[0], &hw_addr[1], &hw_addr[2], &hw_addr[3], &hw_addr[4], &hw_addr[5]);
				//set hw_addr
				strncpy(buf, argv[4], BUF_SIZ);
				//set buf
				correct=1;
				printf("  buf: %s\n", buf);
			}
		}
		else if(strncmp(argv[1],"Recv", 4)==0){
			if (argc == 3){
				mode=RECV;
				correct=1;
			}
		}
		strncpy(interfaceName, argv[2], IFNAMSIZ);   //set interfacename  
	 }   //set mode
	 if(!correct){
		fprintf(stderr, "./455_proj2 Send <InterfaceName>  <DestHWAddr> <Message>\n");
		fprintf(stderr, "./455_proj2 Recv <InterfaceName>\n");
		exit(1);
	 }

	//Do something here
int sockfd = 0;
struct sockaddr_ll sk_addr;
int sk_addr_size = sizeof(struct sockaddr_ll);

//Do something here

if((sockfd = ioctl(sockfd, SIOCGIFINDEX, htons(ETH_P_IP))) < 0){ //set sockfd
perror("socket fail");
exit(1);
}
	

	if(mode == SEND){
		send_message();
	}
	else if (mode == RECV){
		recv_message();
	}

	return 0;
}