Mercurial > hg > dhcpcd
changeset 4171:4ff80b2bbba1 draft
Fix prior patches by using correct bitmasks for flags.
Add BPF_READING and BPF_FREE so that arp can free the state
after finishing the read loop.
| author | Roy Marples <roy@marples.name> |
|---|---|
| date | Wed, 25 Oct 2017 00:04:44 +0100 |
| parents | cc4fbeafc390 |
| children | 9298bf22c505 |
| files | src/arp.c src/bpf.h src/dhcp.c |
| diffstat | 3 files changed, 23 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/arp.c Tue Oct 24 23:33:27 2017 +0100 +++ b/src/arp.c Wed Oct 25 00:04:44 2017 +0100 @@ -198,19 +198,27 @@ * 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 @@ -503,8 +511,12 @@ /* 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__);
--- a/src/bpf.h Tue Oct 24 23:33:27 2017 +0100 +++ b/src/bpf.h Wed Oct 25 00:04:44 2017 +0100 @@ -28,8 +28,10 @@ #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"
--- a/src/dhcp.c Tue Oct 24 23:33:27 2017 +0100 +++ b/src/dhcp.c Wed Oct 25 00:04:44 2017 +0100 @@ -3300,6 +3300,7 @@ * 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); @@ -3308,13 +3309,15 @@ 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
