summaryrefslogtreecommitdiffstats
path: root/sbin/dhclient/bpf.c
diff options
context:
space:
mode:
authorkrw <krw@openbsd.org>2017-07-10 17:13:24 +0000
committerkrw <krw@openbsd.org>2017-07-10 17:13:24 +0000
commit9e1c2583c418ba0b08a3077b2ccd7a5bbd62a271 (patch)
tree8a9da0ea2661113e448d44e812beb6df282ae239 /sbin/dhclient/bpf.c
parentUpdate BUGS. (diff)
downloadwireguard-openbsd-9e1c2583c418ba0b08a3077b2ccd7a5bbd62a271.tar.xz
wireguard-openbsd-9e1c2583c418ba0b08a3077b2ccd7a5bbd62a271.zip
Take some of the mystery out of who does what by
renaming "if_register_bpf()" to "get_bpf_sock()", "if_register_send()" to "get_udp_sock()" and "if_register_receive()" to "configure_bpf_sock()". Pull back interface_info knowledge and just pass the interface name, rdomain and bpf socket fd as required.
Diffstat (limited to 'sbin/dhclient/bpf.c')
-rw-r--r--sbin/dhclient/bpf.c60
1 files changed, 24 insertions, 36 deletions
diff --git a/sbin/dhclient/bpf.c b/sbin/dhclient/bpf.c
index 1f701e55123..e7aca6f1662 100644
--- a/sbin/dhclient/bpf.c
+++ b/sbin/dhclient/bpf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: bpf.c,v 1.59 2017/07/10 00:47:47 krw Exp $ */
+/* $OpenBSD: bpf.c,v 1.60 2017/07/10 17:13:24 krw Exp $ */
/* BPF socket interface code, originally contributed by Archie Cobbs. */
@@ -65,32 +65,28 @@
#include "dhcpd.h"
#include "log.h"
-void if_register_bpf(struct interface_info *ifi);
-
/*
- * Called by get_interface_list for each interface that's discovered.
- * Opens a packet filter for each interface and adds it to the select
- * mask.
+ * Returns a packet filter socket fd on the interface.
*/
-void
-if_register_bpf(struct interface_info *ifi)
+int
+get_bpf_sock(char *name)
{
struct ifreq ifr;
- int sock;
+ int sock;
if ((sock = open("/dev/bpf", O_RDWR | O_CLOEXEC)) == -1)
fatal("Can't open bpf");
/* Set the BPF device to point at this interface. */
- strlcpy(ifr.ifr_name, ifi->name, IFNAMSIZ);
+ strlcpy(ifr.ifr_name, name, IFNAMSIZ);
if (ioctl(sock, BIOCSETIF, &ifr) < 0)
- fatal("Can't attach interface %s to /dev/bpf", ifi->name);
+ fatal("Can't attach interface %s to /dev/bpf", name);
- ifi->bfdesc = sock;
+ return sock;
}
-void
-if_register_send(struct interface_info *ifi)
+int
+get_udp_sock(int rdomain)
{
int sock, on = 1;
@@ -102,11 +98,11 @@ if_register_send(struct interface_info *ifi)
if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &on,
sizeof(on)) == -1)
fatal("setsockopt(IP_HDRINCL)");
- if (setsockopt(sock, IPPROTO_IP, SO_RTABLE, &ifi->rdomain,
- sizeof(ifi->rdomain)) == -1)
+ if (setsockopt(sock, IPPROTO_IP, SO_RTABLE, &rdomain,
+ sizeof(rdomain)) == -1)
fatal("setsockopt(SO_RTABLE)");
- ifi->ufdesc = sock;
+ return sock;
}
/*
@@ -184,18 +180,15 @@ struct bpf_insn dhcp_bpf_wfilter[] = {
int dhcp_bpf_wfilter_len = sizeof(dhcp_bpf_wfilter) / sizeof(struct bpf_insn);
-void
-if_register_receive(struct interface_info *ifi)
+int
+configure_bpf_sock(int bfdesc)
{
struct bpf_version v;
struct bpf_program p;
int flag = 1, sz;
- /* Open a BPF device and hang it on this interface. */
- if_register_bpf(ifi);
-
/* Make sure the BPF version is in range. */
- if (ioctl(ifi->bfdesc, BIOCVERSION, &v) < 0)
+ if (ioctl(bfdesc, BIOCVERSION, &v) < 0)
fatal("Can't get BPF version");
if (v.bv_major != BPF_MAJOR_VERSION ||
@@ -208,22 +201,15 @@ if_register_receive(struct interface_info *ifi)
* comes in, rather than waiting for the input buffer to fill
* with packets.
*/
- if (ioctl(ifi->bfdesc, BIOCIMMEDIATE, &flag) < 0)
+ if (ioctl(bfdesc, BIOCIMMEDIATE, &flag) < 0)
fatal("Can't set immediate mode on bpf device");
- if (ioctl(ifi->bfdesc, BIOCSFILDROP, &flag) < 0)
+ if (ioctl(bfdesc, BIOCSFILDROP, &flag) < 0)
fatal("Can't set filter-drop mode on bpf device");
/* Get the required BPF buffer length from the kernel. */
- if (ioctl(ifi->bfdesc, BIOCGBLEN, &sz) < 0)
+ if (ioctl(bfdesc, BIOCGBLEN, &sz) < 0)
fatal("Can't get bpf buffer length");
- ifi->rbuf_max = sz;
- ifi->rbuf = malloc(ifi->rbuf_max);
- if (!ifi->rbuf)
- fatalx("Can't allocate %lu bytes for bpf input buffer.",
- (unsigned long)ifi->rbuf_max);
- ifi->rbuf_offset = 0;
- ifi->rbuf_len = 0;
/* Set up the bpf filter program structure. */
p.bf_len = dhcp_bpf_filter_len;
@@ -236,7 +222,7 @@ if_register_receive(struct interface_info *ifi)
*/
dhcp_bpf_filter[8].k = LOCAL_PORT;
- if (ioctl(ifi->bfdesc, BIOCSETF, &p) < 0)
+ if (ioctl(bfdesc, BIOCSETF, &p) < 0)
fatal("Can't install packet filter program");
/* Set up the bpf write filter program structure. */
@@ -246,11 +232,13 @@ if_register_receive(struct interface_info *ifi)
if (dhcp_bpf_wfilter[7].k == 0x1fff)
dhcp_bpf_wfilter[7].k = htons(IP_MF|IP_OFFMASK);
- if (ioctl(ifi->bfdesc, BIOCSETWF, &p) < 0)
+ if (ioctl(bfdesc, BIOCSETWF, &p) < 0)
fatal("Can't install write filter program");
- if (ioctl(ifi->bfdesc, BIOCLOCK, NULL) < 0)
+ if (ioctl(bfdesc, BIOCLOCK, NULL) < 0)
fatalx("Cannot lock bpf");
+
+ return sz;
}
ssize_t