1*44609ad6Smarc /* $OpenBSD: pcap.c,v 1.3 2001/11/11 20:20:53 marc Exp $ */ 2*44609ad6Smarc /* 3*44609ad6Smarc * Placed in the PUBLIC DOMAIN 4*44609ad6Smarc */ 5*44609ad6Smarc 6*44609ad6Smarc #include <pcap.h> 7*44609ad6Smarc #include <stdlib.h> 8*44609ad6Smarc #include <stdio.h> 9*44609ad6Smarc #include <unistd.h> 10*44609ad6Smarc 11*44609ad6Smarc #include "test.h" 12*44609ad6Smarc 13*44609ad6Smarc #define LOOPBACK_IF "lo0" 14*44609ad6Smarc #define SNAPLEN 96 15*44609ad6Smarc #define NO_PROMISC 0 16*44609ad6Smarc #define PKTCNT 3 17*44609ad6Smarc 18*44609ad6Smarc volatile int packet_count = 0; 19*44609ad6Smarc 20*44609ad6Smarc void 21*44609ad6Smarc packet_ignore(u_char *tag, const struct pcap_pkthdr *hdr, const u_char *data) 22*44609ad6Smarc { 23*44609ad6Smarc packet_count += 1; 24*44609ad6Smarc } 25*44609ad6Smarc 26*44609ad6Smarc void * 27*44609ad6Smarc pcap_thread(void *arg) 28*44609ad6Smarc { 29*44609ad6Smarc char errbuf[PCAP_ERRBUF_SIZE]; 30*44609ad6Smarc pcap_t *handle; 31*44609ad6Smarc 32*44609ad6Smarc SET_NAME("pcap_thread"); 33*44609ad6Smarc handle = pcap_open_live(LOOPBACK_IF, SNAPLEN, NO_PROMISC, 0, errbuf); 34*44609ad6Smarc if (!handle) 35*44609ad6Smarc PANIC("You may need to run this test as UID 0 (root)"); 36*44609ad6Smarc ASSERT(pcap_loop(handle, PKTCNT, packet_ignore, 0) != -1); 37*44609ad6Smarc return 0; 38*44609ad6Smarc } 39*44609ad6Smarc 40*44609ad6Smarc void * 41*44609ad6Smarc ping_thread(void *arg) 42*44609ad6Smarc { 43*44609ad6Smarc SET_NAME("ping_thread"); 44*44609ad6Smarc ASSERT(system("ping -c 3 127.0.0.1") == 0); 45*44609ad6Smarc sleep(2); 46*44609ad6Smarc ASSERT(packet_count == 3); 47*44609ad6Smarc SUCCEED; 48*44609ad6Smarc } 49*44609ad6Smarc 50*44609ad6Smarc int 51*44609ad6Smarc main(int argc, char **argv) 52*44609ad6Smarc { 53*44609ad6Smarc pthread_t pcap; 54*44609ad6Smarc pthread_t ping; 55*44609ad6Smarc 56*44609ad6Smarc CHECKr(pthread_create(&pcap, NULL, pcap_thread, NULL)); 57*44609ad6Smarc sleep(1); 58*44609ad6Smarc CHECKr(pthread_create(&ping, NULL, ping_thread, NULL)); 59*44609ad6Smarc while (1) 60*44609ad6Smarc ; 61*44609ad6Smarc PANIC("while"); 62*44609ad6Smarc } 63