summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2020-02-05 14:47:08 +0000
committerRoy Marples <roy@marples.name>2020-02-05 14:47:08 +0000
commit690685a2972cf7a90f585954433ce9f0753cd581 (patch)
tree2363523d5998320e5c450d7ff32c339e5967518a
parent354d22cc67eabcb755f3ce60ab22f429bcf84b7a (diff)
downloaddhcpcd-690685a2972cf7a90f585954433ce9f0753cd581.tar.xz
BPF: Don't use magic in buffer length assignments
Define frame header lengths and frame size maximums. Use this to calculate required buffer sizes.
-rw-r--r--src/arp.c5
-rw-r--r--src/dhcp.c2
-rw-r--r--src/if.h5
3 files changed, 9 insertions, 3 deletions
diff --git a/src/arp.c b/src/arp.c
index 2460a1a3..6e3d634a 100644
--- a/src/arp.c
+++ b/src/arp.c
@@ -55,8 +55,9 @@
#include "logerr.h"
#if defined(ARP)
-#define ARP_LEN \
- (sizeof(struct arphdr) + (2 * sizeof(uint32_t)) + (2 * HWADDR_LEN))
+#define ARP_LEN \
+ (FRAMEHDRLEN_MAX + \
+ sizeof(struct arphdr) + (2 * sizeof(uint32_t)) + (2 * HWADDR_LEN))
/* ARP debugging can be quite noisy. Enable this for more noise! */
//#define ARP_DEBUG
diff --git a/src/dhcp.c b/src/dhcp.c
index 2b1e44f1..d5cb7305 100644
--- a/src/dhcp.c
+++ b/src/dhcp.c
@@ -3432,7 +3432,7 @@ static void
dhcp_readbpf(void *arg)
{
struct interface *ifp = arg;
- uint8_t buf[10240]; /* Max jumbo frame and some extra */
+ uint8_t buf[FRAMELEN_MAX];
ssize_t bytes;
struct dhcp_state *state = D_STATE(ifp);
ssize_t fl = (ssize_t)bpf_frame_header_len(ifp);
diff --git a/src/if.h b/src/if.h
index cc62cc94..cd24726b 100644
--- a/src/if.h
+++ b/src/if.h
@@ -81,6 +81,11 @@
# define ARPHRD_INFINIBAND 32
#endif
+/* Maximum frame length.
+ * Support jumbo frames and some extra. */
+#define FRAMEHDRLEN_MAX 14 /* only ethernet support */
+#define FRAMELEN_MAX (FRAMEHDRLEN_MAX + 9216)
+
/* Work out if we have a private address or not
* 10/8
* 172.16/12