Path: blob/main/tests/sys/net/bpf/bpf_multi_read.c
39604 views
/*-1* SPDX-License-Identifier: BSD-2-Clause2*3* Copyright (c) 2025 Rubicon Communications, LLC (Netgate)4*5* Redistribution and use in source and binary forms, with or without6* modification, are permitted provided that the following conditions7* are met:8* 1. Redistributions of source code must retain the above copyright9* notice, this list of conditions and the following disclaimer.10* 2. Redistributions in binary form must reproduce the above copyright11* notice, this list of conditions and the following disclaimer in the12* documentation and/or other materials provided with the distribution.13*14* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND15* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE16* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE17* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE18* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL19* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS20* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)21* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT22* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY23* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF24* SUCH DAMAGE.25*26*/2728#include <err.h>29#include <stdio.h>30#include <pcap.h>31#include <unistd.h>3233static void34callback(u_char *arg __unused, const struct pcap_pkthdr *hdr __unused,35const unsigned char *bytes __unused)36{37}3839int40main(int argc, const char **argv)41{42pcap_t *pcap;43const char *interface;44char errbuf[PCAP_ERRBUF_SIZE] = { 0 };45int ret;4647if (argc != 2)48err(1, "Usage: %s <interface>\n", argv[0]);4950interface = argv[1];5152pcap = pcap_create(interface, errbuf);53if (! pcap)54perror("Failed to pcap interface");5556ret = pcap_set_snaplen(pcap, 86);57if (ret != 0)58perror("Failed to set snaplen");5960ret = pcap_set_timeout(pcap, 100);61if (ret != 0)62perror("Failed to set timeout");6364ret = pcap_activate(pcap);65if (ret != 0)66perror("Failed to activate");6768/* So we have two readers on one /dev/bpf fd */69fork();7071printf("Interface open\n");72pcap_loop(pcap, 0, callback, NULL);7374return (0);75}767778