9 struct timeval timeout;
13 struct rawsock *rawsock_create(const char *interface)
15 char errbuf[PCAP_ERRBUF_SIZE];
16 struct bpf_program fp;
20 sock = malloc(sizeof(struct rawsock));
28 sock->pcap = pcap_open_live(interface, BUFSIZ, 1, 1, errbuf);
30 fprintf(stderr, "pcap_open_live: %s\n", errbuf);
35 fprintf(stderr, "Warning: %s.\n", errbuf);
38 if (pcap_datalink(sock->pcap) != DLT_EN10MB) {
39 fprintf(stderr, "Interface %s not supported.\n", interface);
43 err = pcap_compile(sock->pcap, &fp, "ether proto 0x0912", 0,
44 PCAP_NETMASK_UNKNOWN);
46 pcap_perror(sock->pcap, "pcap_compile");
50 if ((err = pcap_setfilter(sock->pcap, &fp))) {
51 pcap_perror(sock->pcap, "pcap_setfilter");
55 sock->fd = pcap_get_selectable_fd(sock->pcap);
57 fprintf(stderr, "No selectable file descriptor available.\n");
64 pcap_close(sock->pcap);
70 int rawsock_recv(struct rawsock *sock, uint8_t **buffer, unsigned *size)
72 struct pcap_pkthdr* hdr;
76 if (sock->timeout.tv_sec || sock->timeout.tv_usec) {
78 FD_SET(sock->fd, &fds);
80 status = select(sock->fd + 1, &fds, NULL, NULL, &sock->timeout);
84 } else if (status == 0) {
89 status = pcap_next_ex(sock->pcap, &hdr, (const u_char**)buffer);
99 pcap_perror(sock->pcap, "pcap_next_ex");
103 fprintf(stderr, "pcap_next_ex: returned %d.\n", status);
111 int rawsock_send(struct rawsock *sock, uint8_t *buffer, size_t size)
113 #if defined(_WIN32) || defined(_WIN64)
114 if (pcap_sendpacket(sock->pcap, buffer, size) == 0) {
117 pcap_perror(sock->pcap, "pcap_sendpacket");
121 if (pcap_inject(sock->pcap, buffer, size) != size) {
124 pcap_perror(sock->pcap, "pcap_inject");
130 int rawsock_close(struct rawsock *sock)
132 pcap_close(sock->pcap);
137 int rawsock_set_timeout(struct rawsock *sock, unsigned msec)
139 sock->timeout.tv_sec = msec / 1000;
140 sock->timeout.tv_usec = (msec % 1000) * 1000;