* so we have to process the entire buffer. */
state = ARP_STATE(ifp);
state->bpf_flags &= ~BPF_EOF;
+ state->bpf_flags |= BPF_READING;
while (!(state->bpf_flags & BPF_EOF)) {
bytes = bpf_read(ifp, state->bpf_fd, buf, sizeof(buf),
&state->bpf_flags);
if (bytes == -1) {
logerr("%s: %s", __func__, ifp->name);
arp_close(ifp);
- return;
+ break;
}
arp_packet(ifp, buf, (size_t)bytes);
/* Check we still have a state after processing. */
if ((state = ARP_STATE(ifp)) == NULL)
break;
}
+ if (state != NULL) {
+ state->bpf_flags &= ~BPF_READING;
+ if (state->bpf_flags & BPF_FREE) {
+ free(state);
+ ifp->if_data[IF_DATA_ARP] = NULL;
+ }
+ }
}
int
/* If there are no more ARP states, close the socket. */
if (TAILQ_FIRST(&state->arp_states) == NULL) {
arp_close(ifp);
- free(state);
- ifp->if_data[IF_DATA_ARP] = NULL;
+ if (state->bpf_flags & BPF_READING)
+ state->bpf_flags |= BPF_EOF | BPF_FREE;
+ else {
+ free(state);
+ ifp->if_data[IF_DATA_ARP] = NULL;
+ }
} else
if (bpf_arp(ifp, state->bpf_fd) == -1)
logerr(__func__);
#ifndef BPF_HEADER
#define BPF_HEADER
-#define BPF_EOF (1U << 0)
-#define BPF_PARTIALCSUM (2U << 0)
+#define BPF_EOF (1U << 0)
+#define BPF_PARTIALCSUM (1U << 1)
+#define BPF_READING (1U << 2)
+#define BPF_FREE (1U << 3)
#include "dhcpcd.h"
* This means we have no kernel call to just get one packet,
* so we have to process the entire buffer. */
state->bpf_flags &= ~BPF_EOF;
+ state->bpf_flags |= BPF_READING;
while (!(state->bpf_flags & BPF_EOF)) {
bytes = bpf_read(ifp, state->bpf_fd, buf, sizeof(buf),
&state->bpf_flags);
logerr("%s: %s", __func__, ifp->name);
dhcp_close(ifp);
}
- return;
+ break;
}
dhcp_handlepacket(ifp, buf, (size_t)bytes);
/* Check we still have a state after processing. */
if ((state = D_STATE(ifp)) == NULL)
break;
}
+ if (state != NULL)
+ state->bpf_flags &= ~BPF_READING;
}
static void