Skip to content
Snippets Groups Projects
Commit ccbfda22 authored by Michael Tuexen's avatar Michael Tuexen
Browse files

Set immediate mode before activating the handle.

This fixes a bug which did not show up on FreeBSD, but on MacOS.
parent 5b078e86
No related branches found
No related tags found
No related merge requests found
...@@ -89,6 +89,17 @@ static void packet_socket_setup(struct packet_socket *psock) ...@@ -89,6 +89,17 @@ static void packet_socket_setup(struct packet_socket *psock)
if (pcap_set_snaplen(psock->pcap_out, PACKET_READ_BYTES) != 0) if (pcap_set_snaplen(psock->pcap_out, PACKET_READ_BYTES) != 0)
die_pcap_perror(psock->pcap_out, "pcap_set_snaplen"); die_pcap_perror(psock->pcap_out, "pcap_set_snaplen");
/* 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.
* Enable this mode before activating the pcap handle.
*/
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");
if (pcap_activate(psock->pcap_in) != 0) if (pcap_activate(psock->pcap_in) != 0)
die_pcap_perror(psock->pcap_in, die_pcap_perror(psock->pcap_in,
"pcap_activate " "pcap_activate "
...@@ -104,15 +115,6 @@ static void packet_socket_setup(struct packet_socket *psock) ...@@ -104,15 +115,6 @@ static void packet_socket_setup(struct packet_socket *psock)
die_pcap_perror(psock->pcap_in, "pcap_setdirection"); die_pcap_perror(psock->pcap_in, "pcap_setdirection");
if (pcap_setdirection(psock->pcap_out, PCAP_D_OUT) != 0) if (pcap_setdirection(psock->pcap_out, PCAP_D_OUT) != 0)
die_pcap_perror(psock->pcap_out, "pcap_setdirection"); 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); bpf_fd = pcap_get_selectable_fd(psock->pcap_in);
if (bpf_fd < 0) if (bpf_fd < 0)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment