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