主要流程(待完善):
1、使用wlanconfig *** create wlandev wifi0 wlanmode monitor创建一个monitor模式的vap;
2、创建AF_PACKET的socket:socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
3、将socket绑定到创建的monitor上:
struct ifreq ifr;
struct sockaddr_ll sll;
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, dev_name, sizeof(ifr.ifr_name));
if (ioctl(sock_fd, SIOCGIFINDEX, &ifr) == -1) {
fprintf( stderr, "%s: ioctl failed.\n", __func__);
return -1;
}
memset(&sll, 0, sizeof(sll));
sll.sll_family = AF_PACKET;
sll.sll_ifindex = ifr.ifr_ifindex;
sll.sll_protocol = htons(ETH_P_ALL);
bind(sock_fd, (struct sockaddr *) &sll, sizeof(sll);
4、设置socket为混杂模式:
struct packet_mreq mr;
memset(&mr, 0, sizeof(mr));
mr.mr_ifindex = devid;
mr.mr_type = PACKET_MR_PROMISC;
if (setsockopt(sock_fd, SOL_PACKET, PACKET_ADD_MEMBERSHIP,
&mr, sizeof(mr)) == -1) {
fprintf( stderr, "setsockopt failed : [%s]\n", strerror(errno) );
close(sock_fd);
exit( 1 );
}
5、循环从socket中接收数据:recvfrom