diff --git a/gtests/net/packetdrill/packet_socket_pcap.c b/gtests/net/packetdrill/packet_socket_pcap.c index 1e2bd210e5147272450d6486107e4e869f5ac4fe..82c63d50f8fea24b9b39f1e29a9e5b06f9717a50 100644 --- a/gtests/net/packetdrill/packet_socket_pcap.c +++ b/gtests/net/packetdrill/packet_socket_pcap.c @@ -35,7 +35,7 @@ #ifdef USE_LIBPCAP -#if defined(__FreeBSD__) +#if defined(__FreeBSD__) || defined(__APPLE__) #include <pcap/pcap.h> #elif defined(__OpenBSD__) || defined(__NetBSD__) #include <pcap.h> @@ -74,7 +74,7 @@ extern void die_pcap_perror(pcap_t *pcap, char *message) static void packet_socket_setup(struct packet_socket *psock) { - int bpf_fd = -1, val = -1; + int bpf_fd = -1; DEBUGP("calling pcap_create() with %s\n", psock->name); psock->pcap_in = pcap_create(psock->name, psock->pcap_error); @@ -104,32 +104,24 @@ static void packet_socket_setup(struct packet_socket *psock) die_pcap_perror(psock->pcap_in, "pcap_setdirection"); if (pcap_setdirection(psock->pcap_out, PCAP_D_OUT) != 0) die_pcap_perror(psock->pcap_out, "pcap_setdirection"); + /* By default libpcap with BPF waits until a read buffer fills + * up before returning any packets. We use the immediate mode to + * force the BPF device to return the first packet + * immediately. + */ + if (pcap_set_immediate_mode(psock->pcap_in, 1) != 0) + die_pcap_perror(psock->pcap_out, "pcap_set_immediate_mode"); + if (pcap_set_immediate_mode(psock->pcap_out, 1) != 0) + die_pcap_perror(psock->pcap_out, "pcap_set_immediate_mode"); bpf_fd = pcap_get_selectable_fd(psock->pcap_in); if (bpf_fd < 0) die_pcap_perror(psock->pcap_in, "pcap_get_selectable_fd"); - /* By default libpcap with BPF waits until a read buffer fills - * up before returning any packets. We use BIOCIMMEDIATE to - * force the BPF device to return the first packet - * immediately. - */ - val = 1; - if (ioctl(bpf_fd, BIOCIMMEDIATE, &val) < 0) - die_perror("ioctl BIOCIMMEDIATE on bpf fd"); bpf_fd = pcap_get_selectable_fd(psock->pcap_out); if (bpf_fd < 0) die_pcap_perror(psock->pcap_out, "pcap_get_selectable_fd"); - /* By default libpcap with BPF waits until a read buffer fills - * up before returning any packets. We use BIOCIMMEDIATE to - * force the BPF device to return the first packet - * immediately. - */ - val = 1; - if (ioctl(bpf_fd, BIOCIMMEDIATE, &val) < 0) - die_perror("ioctl BIOCIMMEDIATE on bpf fd"); - /* Find data link type. */ psock->data_link = pcap_datalink(psock->pcap_in); DEBUGP("data_link: %d\n", psock->data_link); @@ -290,7 +282,7 @@ int packet_socket_receive(struct packet_socket *psock, (u32)pkt_header->ts.tv_sec, (u32)pkt_header->ts.tv_usec); -#if defined(__FreeBSD__) || defined(__NetBSD__) +#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__APPLE__) packet->time_usecs = timeval_to_usecs(&pkt_header->ts); #elif defined(__OpenBSD__) packet->time_usecs = bpf_timeval_to_usecs(&pkt_header->ts);