/* Asanga Udugama (adu@comnets.uni-bremen.de)*/

#include <stdio.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#include <netinet/ip.h>
#include <netinet/ip_icmp.h>

// gcc -o raw_sock raw_sock.c 

main(int argc, char **argv)
{
	char recv_buffer[4096];
	struct sockaddr_in dst;
	struct ip *ip = (struct ip *) recv_buffer;
	//struct icmp *icmp = (struct icmp *)(ip +1);
	int s, dstL;
	int sockopt;
	int on = 1;
	int n;
	int loop = 0, i;

	s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
	printf("Value of socket()- %d \n",s);
	if (s < 0)
		printf("\nCann't creat socket");

	sockopt = setsockopt(s, 0, IP_HDRINCL, &on, sizeof(on));
	printf("Value of setsockopt() - %d \n", sockopt);
	if(sockopt < 0)
		exit(0);

	while(loop++ < 100) {
		bzero((char *)&dst, sizeof(dst));
		dst.sin_family = AF_INET;
		dstL = sizeof(dst);
		bzero(recv_buffer, sizeof(recv_buffer));
		n = recvfrom(s, recv_buffer, sizeof(recv_buffer), 0, (struct sockaddr *) &dst, &dstL);
		//n = recv(s, recv_buffer, sizeof(recv_buffer), 0);
		if(n > 0) {
			printf("IP Pkt (24 bytes) = ");
			for(i = 0; i < 24; i++) {
				printf("%02x ", (unsigned char) recv_buffer[i]);
			}
			printf("\n");
		} else {
			printf("No packet \n");
		}
	}


	close(s);
	exit(0);
}
