Lines Matching defs:bpf

43 #include <net/bpf.h>
54 #include "bpf.h"
148 struct bpf *
150 int (*filter)(const struct bpf *, const struct in_addr *),
153 struct bpf *bpf;
169 bpf = calloc(1, sizeof(*bpf));
170 if (bpf == NULL)
172 bpf->bpf_ifp = ifp;
174 /* /dev/bpf is a cloner on modern kernels */
175 bpf->bpf_fd = open("/dev/bpf", BPF_OPEN_FLAGS);
177 /* Support older kernels where /dev/bpf is not a cloner */
178 if (bpf->bpf_fd == -1) {
183 snprintf(device, sizeof(device), "/dev/bpf%d", n++);
184 bpf->bpf_fd = open(device, BPF_OPEN_FLAGS);
185 } while (bpf->bpf_fd == -1 && errno == EBUSY);
188 if (bpf->bpf_fd == -1)
192 if ((fd_opts = fcntl(bpf->bpf_fd, F_GETFD)) == -1 ||
193 fcntl(bpf->bpf_fd, F_SETFD, fd_opts | FD_CLOEXEC) == -1)
197 if (ioctl(bpf->bpf_fd, BIOCVERSION, &pv) == -1)
206 if (ioctl(bpf->bpf_fd, BIOCSETIF, &ifr) == -1)
211 if (ioctl(bpf->bpf_fd, BIOCIMMEDIATE, &flags) == -1)
215 if (filter(bpf, ia) != 0)
219 if (ioctl(bpf->bpf_fd, BIOCGBLEN, &ibuf_len) == -1)
221 bpf->bpf_size = (size_t)ibuf_len;
222 bpf->bpf_buffer = malloc(bpf->bpf_size);
223 if (bpf->bpf_buffer == NULL)
225 return bpf;
228 if (bpf->bpf_fd != -1)
229 close(bpf->bpf_fd);
230 free(bpf);
237 bpf_read(struct bpf *bpf, void *data, size_t len)
243 bpf->bpf_flags &= ~BPF_EOF;
245 if (bpf->bpf_len == 0) {
246 bytes = read(bpf->bpf_fd, bpf->bpf_buffer,
247 bpf->bpf_size);
252 lseek(bpf->bpf_fd, 0, SEEK_SET);
258 bpf->bpf_len = (size_t)bytes;
259 bpf->bpf_pos = 0;
262 payload = (const char *)bpf->bpf_buffer + bpf->bpf_pos;
264 if (bpf->bpf_pos + packet.bh_caplen + packet.bh_hdrlen >
265 bpf->bpf_len)
272 if (bpf_frame_bcast(bpf->bpf_ifp, payload) == 0)
273 bpf->bpf_flags |= BPF_BCAST;
275 bpf->bpf_flags &= ~BPF_BCAST;
278 bpf->bpf_pos += BPF_WORDALIGN(packet.bh_hdrlen +
280 if (bpf->bpf_pos >= bpf->bpf_len) {
281 bpf->bpf_len = bpf->bpf_pos = 0;
282 bpf->bpf_flags |= BPF_EOF;
315 bpf_send(const struct bpf *bpf, uint16_t protocol,
321 switch(bpf->bpf_ifp->hwtype) {
324 memcpy(&eh.ether_shost, bpf->bpf_ifp->hwaddr,
337 return writev(bpf->bpf_fd, iov, 2);
342 bpf_close(struct bpf *bpf)
345 close(bpf->bpf_fd);
346 free(bpf->bpf_buffer);
347 free(bpf);
353 bpf_cmp_hwaddr(struct bpf_insn *bpf, size_t bpf_len, size_t off,
390 bp = bpf;
433 return (unsigned int)(bp - bpf);
487 bpf_arp_rw(const struct bpf *bpf, const struct in_addr *ia, bool recv)
489 const struct interface *ifp = bpf->bpf_ifp;
546 return bpf_wattach(bpf->bpf_fd, buf, (unsigned int)(bp - buf));
549 return bpf_attach(bpf->bpf_fd, buf, (unsigned int)(bp - buf));
553 bpf_arp(const struct bpf *bpf, const struct in_addr *ia)
557 if (bpf_arp_rw(bpf, ia, true) == -1 ||
558 bpf_arp_rw(bpf, ia, false) == -1 ||
559 ioctl(bpf->bpf_fd, BIOCLOCK) == -1)
563 return bpf_arp_rw(bpf, ia, true);
641 bpf_bootp_rw(const struct bpf *bpf, bool read)
648 switch(bpf->bpf_ifp->hwtype) {
677 return bpf_wattach(bpf->bpf_fd, buf, (unsigned int)(bp - buf));
690 return bpf_attach(bpf->bpf_fd, buf, (unsigned int)(bp - buf));
694 bpf_bootp(const struct bpf *bpf, __unused const struct in_addr *ia)
698 if (bpf_bootp_rw(bpf, true) == -1 ||
699 bpf_bootp_rw(bpf, false) == -1 ||
700 ioctl(bpf->bpf_fd, BIOCLOCK) == -1)
712 return bpf_bootp_rw(bpf, true);