#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <linux/in.h>
#include <linux/if_ether.h>
#include <net/if.h>
#include <linux/filter.h>
#include <sys/ioctl.h>
int
main(
int
argc,
char
**argv) {
int
sock, n;
char
buffer[2048];
unsigned
char
*iphead, *ethhead;
struct
ifreq ethreq;
struct
sock_filter BPF_code[]= {
{ 0x28, 0, 0, 0x0000000c },
{ 0x15, 0, 12, 0x00000800 },
{ 0x30, 0, 0, 0x00000017 },
{ 0x15, 0, 10, 0x00000011 },
{ 0x20, 0, 0, 0x0000001a },
{ 0x15, 2, 0, 0xc0a8090a },
{ 0x20, 0, 0, 0x0000001e },
{ 0x15, 0, 6, 0xc0a8090a },
{ 0x28, 0, 0, 0x00000014 },
{ 0x45, 4, 0, 0x00001fff },
{ 0xb1, 0, 0, 0x0000000e },
{ 0x48, 0, 0, 0x0000000e },
{ 0x15, 0, 1, 0x00001388 },
{ 0x6, 0, 0, 0x00000044 },
{ 0x6, 0, 0, 0x00000000 }
};
struct
sock_fprog Filter;
Filter.len = 15;
Filter.filter = BPF_code;
if
( (sock=socket(PF_PACKET, SOCK_RAW,
htons(ETH_P_IP)))<0) {
perror
(
"socket"
);
exit
(1);
}
strncpy
(ethreq.ifr_name,
"eth0"
,IFNAMSIZ);
if
(ioctl(sock,SIOCGIFFLAGS,?req)==-1) {
perror
(
"ioctl"
);
close(sock);
exit
(1);
}
ethreq.ifr_flags|=IFF_PROMISC;
if
(ioctl(sock,SIOCSIFFLAGS,?req)==-1) {
perror
(
"ioctl"
);
close(sock);
exit
(1);
}
if
(setsockopt(sock, SOL_SOCKET, SO_ATTACH_FILTER,
&Filter,
sizeof
(Filter))<0){
perror
(
"setsockopt"
);
close(sock);
exit
(1);
}
while
(1) {
printf
(
"----------\n"
);
n = recvfrom(sock,buffer,2048,0,NULL,NULL);
printf
(
"%d bytes read\n"
,n);
if
(n<42) {
perror
(
"recvfrom():"
);
printf
(
"Incomplete packet (errno is %d)\n"
,
errno
);
close(sock);
exit
(0);
}
ethhead = buffer;
printf
(
"Source MAC address: "
"%02x:%02x:%02x:%02x:%02x:%02x\n"
,
ethhead[0],ethhead[1],ethhead[2],
ethhead[3],ethhead[4],ethhead[5]);
printf
(
"Destination MAC address: "
"%02x:%02x:%02x:%02x:%02x:%02x\n"
,
ethhead[6],ethhead[7],ethhead[8],
ethhead[9],ethhead[10],ethhead[11]);
iphead = buffer+14;
if
(*iphead==0x45) {
printf
(
"Source host %d.%d.%d.%d\n"
,
iphead[12],iphead[13],
iphead[14],iphead[15]);
printf
(
"Dest host %d.%d.%d.%d\n"
,
iphead[16],iphead[17],
iphead[18],iphead[19]);
printf
(
"Source,Dest ports %d,%d\n"
,
(iphead[20]<<8)+iphead[21],
(iphead[22]<<8)+iphead[23]);
printf
(
"Layer-4 protocol %d\n"
,iphead[9]);
}
}
}