summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2019-04-18 18:05:56 +0100
committerRoy Marples <roy@marples.name>2019-04-18 18:05:56 +0100
commit1232de73e3f7ec11d1c2c3c644d8f044d1613645 (patch)
treeb213c50a76a9bfa95814ada83919a09fee85e41c
parentf6c81bc59d932b558543c941ec6da3a58939e53f (diff)
downloaddhcpcd-1232de73e3f7ec11d1c2c3c644d8f044d1613645.tar.xz
BPF: Set BPF_MCAST flag as on BSD
-rw-r--r--src/bpf.c2
-rw-r--r--src/bpf.h1
-rw-r--r--src/if-linux.c4
3 files changed, 6 insertions, 1 deletions
diff --git a/src/bpf.c b/src/bpf.c
index 81d3a1c6..940dfd80 100644
--- a/src/bpf.c
+++ b/src/bpf.c
@@ -95,7 +95,7 @@ bpf_frame_header_len(const struct interface *ifp)
static const uint8_t etherbroadcastaddr[] =
{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
-static int
+int
bpf_frame_bcast(const struct interface *ifp, const char *frame)
{
diff --git a/src/bpf.h b/src/bpf.h
index f3ce5434..05c20941 100644
--- a/src/bpf.h
+++ b/src/bpf.h
@@ -37,6 +37,7 @@
extern const char *bpf_name;
size_t bpf_frame_header_len(const struct interface *);
+int bpf_frame_bcast(const struct interface *, const char *frame);
int bpf_open(struct interface *, int (*)(struct interface *, int));
int bpf_close(struct interface *, int);
int bpf_attach(int, void *, unsigned int);
diff --git a/src/if-linux.c b/src/if-linux.c
index dd0fb58f..22913d54 100644
--- a/src/if-linux.c
+++ b/src/if-linux.c
@@ -1412,6 +1412,10 @@ bpf_read(struct interface *ifp, int s, void *data, size_t len,
if (bytes) {
ssize_t fl = (ssize_t)bpf_frame_header_len(ifp);
+ if (bpf_frame_bcast(ifp, state->buffer) == 0)
+ *flags |= BPF_BCAST;
+ else
+ *flags &= ~BPF_BCAST;
bytes -= fl;
if ((size_t)bytes > len)
bytes = (ssize_t)len;