6ec6515fb7c7202c50596cbcb5945d9a0b4fe4f1
[dragonfly.git] / contrib / libpcap / pcap-bpf.c
1 /*
2  * Copyright (c) 1993, 1994, 1995, 1996, 1998
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that: (1) source code distributions
7  * retain the above copyright notice and this paragraph in its entirety, (2)
8  * distributions including binary code include the above copyright notice and
9  * this paragraph in its entirety in the documentation or other materials
10  * provided with the distribution, and (3) all advertising materials mentioning
11  * features or use of this software display the following acknowledgement:
12  * ``This product includes software developed by the University of California,
13  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14  * the University nor the names of its contributors may be used to endorse
15  * or promote products derived from this software without specific prior
16  * written permission.
17  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20  */
21 #ifndef lint
22 static const char rcsid[] _U_ =
23     "@(#) $Header: /tcpdump/master/libpcap/pcap-bpf.c,v 1.99.2.17 2008-09-16 18:43:02 guy Exp $ (LBL)";
24 #endif
25
26 #ifdef HAVE_CONFIG_H
27 #include "config.h"
28 #endif
29
30 #include <sys/param.h>                  /* optionally get BSD define */
31 #ifdef HAVE_ZEROCOPY_BPF
32 #include <sys/mman.h>
33 #endif
34 #include <sys/time.h>
35 #include <sys/timeb.h>
36 #include <sys/socket.h>
37 #include <sys/file.h>
38 #include <sys/ioctl.h>
39 #include <sys/utsname.h>
40
41 #ifdef HAVE_ZEROCOPY_BPF
42 #include <machine/atomic.h>
43 #endif
44
45 #include <net/if.h>
46
47 #ifdef _AIX
48
49 /*
50  * Make "pcap.h" not include "pcap/bpf.h"; we are going to include the
51  * native OS version, as we need "struct bpf_config" from it.
52  */
53 #define PCAP_DONT_INCLUDE_PCAP_BPF_H
54
55 #include <sys/types.h>
56
57 /*
58  * Prevent bpf.h from redefining the DLT_ values to their
59  * IFT_ values, as we're going to return the standard libpcap
60  * values, not IBM's non-standard IFT_ values.
61  */
62 #undef _AIX
63 #include <net/bpf.h>
64 #define _AIX
65
66 #include <net/if_types.h>               /* for IFT_ values */
67 #include <sys/sysconfig.h>
68 #include <sys/device.h>
69 #include <sys/cfgodm.h>
70 #include <cf.h>
71
72 #ifdef __64BIT__
73 #define domakedev makedev64
74 #define getmajor major64
75 #define bpf_hdr bpf_hdr32
76 #else /* __64BIT__ */
77 #define domakedev makedev
78 #define getmajor major
79 #endif /* __64BIT__ */
80
81 #define BPF_NAME "bpf"
82 #define BPF_MINORS 4
83 #define DRIVER_PATH "/usr/lib/drivers"
84 #define BPF_NODE "/dev/bpf"
85 static int bpfloadedflag = 0;
86 static int odmlockid = 0;
87
88 #else /* _AIX */
89
90 #include <net/bpf.h>
91
92 #endif /* _AIX */
93
94 #include <ctype.h>
95 #include <errno.h>
96 #include <netdb.h>
97 #include <stdio.h>
98 #include <stdlib.h>
99 #include <string.h>
100 #include <unistd.h>
101
102 #ifdef HAVE_NET_IF_MEDIA_H
103 # include <net/if_media.h>
104 #endif
105
106 #include "pcap-int.h"
107
108 #ifdef HAVE_DAG_API
109 #include "pcap-dag.h"
110 #endif /* HAVE_DAG_API */
111
112 #ifdef HAVE_OS_PROTO_H
113 #include "os-proto.h"
114 #endif
115
116 #ifdef BIOCGDLTLIST
117 # if (defined(HAVE_NET_IF_MEDIA_H) && defined(IFM_IEEE80211)) && !defined(__APPLE__)
118 #define HAVE_BSD_IEEE80211
119 # endif
120
121 # if defined(__APPLE__) || defined(HAVE_BSD_IEEE80211)
122 static int find_802_11(struct bpf_dltlist *);
123
124 #  ifdef HAVE_BSD_IEEE80211
125 static int monitor_mode(pcap_t *, int);
126 #  endif
127
128 #  if defined(__APPLE__)
129 static void remove_en(pcap_t *);
130 static void remove_802_11(pcap_t *);
131 #  endif
132
133 # endif /* defined(__APPLE__) || defined(HAVE_BSD_IEEE80211) */
134
135 #endif /* BIOCGDLTLIST */
136
137 /*
138  * We include the OS's <net/bpf.h>, not our "pcap/bpf.h", so we probably
139  * don't get DLT_DOCSIS defined.
140  */
141 #ifndef DLT_DOCSIS
142 #define DLT_DOCSIS      143
143 #endif
144
145 /*
146  * On OS X, we don't even get any of the 802.11-plus-radio-header DLT_'s
147  * defined, even though some of them are used by various Airport drivers.
148  */
149 #ifndef DLT_PRISM_HEADER
150 #define DLT_PRISM_HEADER        119
151 #endif
152 #ifndef DLT_AIRONET_HEADER
153 #define DLT_AIRONET_HEADER      120
154 #endif
155 #ifndef DLT_IEEE802_11_RADIO
156 #define DLT_IEEE802_11_RADIO    127
157 #endif
158 #ifndef DLT_IEEE802_11_RADIO_AVS
159 #define DLT_IEEE802_11_RADIO_AVS 163
160 #endif
161
162 static int pcap_can_set_rfmon_bpf(pcap_t *p);
163 static int pcap_activate_bpf(pcap_t *p);
164 static int pcap_setfilter_bpf(pcap_t *p, struct bpf_program *fp);
165 static int pcap_setdirection_bpf(pcap_t *, pcap_direction_t);
166 static int pcap_set_datalink_bpf(pcap_t *p, int dlt);
167
168 #ifdef HAVE_ZEROCOPY_BPF
169 /*
170  * For zerocopy bpf, we need to override the setnonblock/getnonblock routines
171  * so we don't call select(2) if the pcap handle is in non-blocking mode.  We
172  * preserve the timeout supplied by pcap_open functions to make sure it
173  * does not get clobbered if the pcap handle moves between blocking and non-
174  * blocking mode.
175  */
176 static int
177 pcap_getnonblock_zbuf(pcap_t *p, char *errbuf)
178
179         /*
180          * Use a negative value for the timeout to represent that the
181          * pcap handle is in non-blocking mode.
182          */
183         return (p->md.timeout < 0);
184 }
185
186 static int
187 pcap_setnonblock_zbuf(pcap_t *p, int nonblock, char *errbuf)
188 {   
189         /*
190          * Map each value to the corresponding 2's complement, to
191          * preserve the timeout value provided with pcap_set_timeout.
192          * (from pcap-linux.c).
193          */
194         if (nonblock) {
195                 if (p->md.timeout > 0)
196                         p->md.timeout = p->md.timeout * -1 - 1;
197         } else
198                 if (p->md.timeout < 0)
199                         p->md.timeout = (p->md.timeout + 1) * -1;
200         return (0);
201 }
202
203 /*
204  * Zero-copy specific close method.  Un-map the shared buffers then call
205  * pcap_cleanup_live_common.
206  */
207 static void
208 pcap_cleanup_zbuf(pcap_t *p)
209 {
210         /*
211          * Delete the mappings.  Note that p->buffer gets initialized to one
212          * of the mmapped regions in this case, so do not try and free it
213          * directly; null it out so that pcap_cleanup_live_common() doesn't
214          * try to free it.
215          */
216         if (p->md.zbuf1 != MAP_FAILED && p->md.zbuf1 != NULL)
217                 (void) munmap(p->md.zbuf1, p->md.zbufsize);
218         if (p->md.zbuf2 != MAP_FAILED && p->md.zbuf2 != NULL)
219                 (void) munmap(p->md.zbuf2, p->md.zbufsize);
220         p->buffer = NULL;
221         pcap_cleanup_live_common(p);
222 }
223
224 /*
225  * Zero-copy BPF buffer routines to check for and acknowledge BPF data in
226  * shared memory buffers.
227  *
228  * pcap_next_zbuf_shm(): Check for a newly available shared memory buffer,
229  * and set up p->buffer and cc to reflect one if available.  Notice that if
230  * there was no prior buffer, we select zbuf1 as this will be the first
231  * buffer filled for a fresh BPF session.
232  */
233 static int
234 pcap_next_zbuf_shm(pcap_t *p, int *cc)
235 {
236         struct bpf_zbuf_header *bzh;
237
238         if (p->md.zbuffer == p->md.zbuf2 || p->md.zbuffer == NULL) {
239                 bzh = (struct bpf_zbuf_header *)p->md.zbuf1;
240                 if (bzh->bzh_user_gen !=
241                     atomic_load_acq_int(&bzh->bzh_kernel_gen)) {
242                         p->md.bzh = bzh;
243                         p->md.zbuffer = (u_char *)p->md.zbuf1;
244                         p->buffer = p->md.zbuffer + sizeof(*bzh);
245                         *cc = bzh->bzh_kernel_len;
246                         return (1);
247                 }
248         } else if (p->md.zbuffer == p->md.zbuf1) {
249                 bzh = (struct bpf_zbuf_header *)p->md.zbuf2;
250                 if (bzh->bzh_user_gen !=
251                     atomic_load_acq_int(&bzh->bzh_kernel_gen)) {
252                         p->md.bzh = bzh;
253                         p->md.zbuffer = (u_char *)p->md.zbuf2;
254                         p->buffer = p->md.zbuffer + sizeof(*bzh);
255                         *cc = bzh->bzh_kernel_len;
256                         return (1);
257                 }
258         }
259         *cc = 0;
260         return (0);
261 }
262
263 /*
264  * pcap_next_zbuf() -- Similar to pcap_next_zbuf_shm(), except wait using
265  * select() for data or a timeout, and possibly force rotation of the buffer
266  * in the event we time out or are in immediate mode.  Invoke the shared
267  * memory check before doing system calls in order to avoid doing avoidable
268  * work.
269  */
270 static int
271 pcap_next_zbuf(pcap_t *p, int *cc)
272 {
273         struct bpf_zbuf bz;
274         struct timeval tv;
275         struct timespec cur;
276         fd_set r_set;
277         int data, r;
278         int expire, tmout;
279
280 #define TSTOMILLI(ts) (((ts)->tv_sec * 1000) + ((ts)->tv_nsec / 1000000))
281         /*
282          * Start out by seeing whether anything is waiting by checking the
283          * next shared memory buffer for data.
284          */
285         data = pcap_next_zbuf_shm(p, cc);
286         if (data)
287                 return (data);
288         /*
289          * If a previous sleep was interrupted due to signal delivery, make
290          * sure that the timeout gets adjusted accordingly.  This requires
291          * that we analyze when the timeout should be been expired, and
292          * subtract the current time from that.  If after this operation,
293          * our timeout is less then or equal to zero, handle it like a
294          * regular timeout.
295          */
296         tmout = p->md.timeout;
297         if (tmout)
298                 (void) clock_gettime(CLOCK_MONOTONIC, &cur);
299         if (p->md.interrupted && p->md.timeout) {
300                 expire = TSTOMILLI(&p->md.firstsel) + p->md.timeout;
301                 tmout = expire - TSTOMILLI(&cur);
302 #undef TSTOMILLI
303                 if (tmout <= 0) {
304                         p->md.interrupted = 0;
305                         data = pcap_next_zbuf_shm(p, cc);
306                         if (data)
307                                 return (data);
308                         if (ioctl(p->fd, BIOCROTZBUF, &bz) < 0) {
309                                 (void) snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
310                                     "BIOCROTZBUF: %s", strerror(errno));
311                                 return (PCAP_ERROR);
312                         }
313                         return (pcap_next_zbuf_shm(p, cc));
314                 }
315         }
316         /*
317          * No data in the buffer, so must use select() to wait for data or
318          * the next timeout.  Note that we only call select if the handle
319          * is in blocking mode.
320          */
321         if (p->md.timeout >= 0) {
322                 FD_ZERO(&r_set);
323                 FD_SET(p->fd, &r_set);
324                 if (tmout != 0) {
325                         tv.tv_sec = tmout / 1000;
326                         tv.tv_usec = (tmout * 1000) % 1000000;
327                 }
328                 r = select(p->fd + 1, &r_set, NULL, NULL,
329                     p->md.timeout != 0 ? &tv : NULL);
330                 if (r < 0 && errno == EINTR) {
331                         if (!p->md.interrupted && p->md.timeout) {
332                                 p->md.interrupted = 1;
333                                 p->md.firstsel = cur;
334                         }
335                         return (0);
336                 } else if (r < 0) {
337                         (void) snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
338                             "select: %s", strerror(errno));
339                         return (PCAP_ERROR);
340                 }
341         }
342         p->md.interrupted = 0;
343         /*
344          * Check again for data, which may exist now that we've either been
345          * woken up as a result of data or timed out.  Try the "there's data"
346          * case first since it doesn't require a system call.
347          */
348         data = pcap_next_zbuf_shm(p, cc);
349         if (data)
350                 return (data);
351         /*
352          * Try forcing a buffer rotation to dislodge timed out or immediate
353          * data.
354          */
355         if (ioctl(p->fd, BIOCROTZBUF, &bz) < 0) {
356                 (void) snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
357                     "BIOCROTZBUF: %s", strerror(errno));
358                 return (PCAP_ERROR);
359         }
360         return (pcap_next_zbuf_shm(p, cc));
361 }
362
363 /*
364  * Notify kernel that we are done with the buffer.  We don't reset zbuffer so
365  * that we know which buffer to use next time around.
366  */
367 static int
368 pcap_ack_zbuf(pcap_t *p)
369 {
370
371         atomic_store_rel_int(&p->md.bzh->bzh_user_gen,
372             p->md.bzh->bzh_kernel_gen);
373         p->md.bzh = NULL;
374         p->buffer = NULL;
375         return (0);
376 }
377 #endif
378
379 pcap_t *
380 pcap_create(const char *device, char *ebuf)
381 {
382         pcap_t *p;
383
384 #ifdef HAVE_DAG_API
385         if (strstr(device, "dag"))
386                 return (dag_create(device, ebuf));
387 #endif /* HAVE_DAG_API */
388
389         p = pcap_create_common(device, ebuf);
390         if (p == NULL)
391                 return (NULL);
392
393         p->activate_op = pcap_activate_bpf;
394         p->can_set_rfmon_op = pcap_can_set_rfmon_bpf;
395         return (p);
396 }
397
398 static int
399 bpf_open(pcap_t *p)
400 {
401         int fd;
402 #ifdef HAVE_CLONING_BPF
403         static const char device[] = "/dev/bpf";
404 #else
405         int n = 0;
406         char device[sizeof "/dev/bpf0000000000"];
407 #endif
408
409 #ifdef _AIX
410         /*
411          * Load the bpf driver, if it isn't already loaded,
412          * and create the BPF device entries, if they don't
413          * already exist.
414          */
415         if (bpf_load(p->errbuf) == PCAP_ERROR)
416                 return (PCAP_ERROR);
417 #endif
418
419 #ifdef HAVE_CLONING_BPF
420         if ((fd = open(device, O_RDWR)) == -1 &&
421             (errno != EACCES || (fd = open(device, O_RDONLY)) == -1)) {
422                 if (errno == EACCES)
423                         fd = PCAP_ERROR_PERM_DENIED;
424                 else
425                         fd = PCAP_ERROR;
426                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
427                   "(cannot open device) %s: %s", device, pcap_strerror(errno));
428         }
429 #else
430         /*
431          * Go through all the minors and find one that isn't in use.
432          */
433         do {
434                 (void)snprintf(device, sizeof(device), "/dev/bpf%d", n++);
435                 /*
436                  * Initially try a read/write open (to allow the inject
437                  * method to work).  If that fails due to permission
438                  * issues, fall back to read-only.  This allows a
439                  * non-root user to be granted specific access to pcap
440                  * capabilities via file permissions.
441                  *
442                  * XXX - we should have an API that has a flag that
443                  * controls whether to open read-only or read-write,
444                  * so that denial of permission to send (or inability
445                  * to send, if sending packets isn't supported on
446                  * the device in question) can be indicated at open
447                  * time.
448                  */
449                 fd = open(device, O_RDWR);
450                 if (fd == -1 && errno == EACCES)
451                         fd = open(device, O_RDONLY);
452         } while (fd < 0 && errno == EBUSY);
453
454         /*
455          * XXX better message for all minors used
456          */
457         if (fd < 0) {
458                 if (errno == EACCES)
459                         fd = PCAP_ERROR_PERM_DENIED;
460                 else
461                         fd = PCAP_ERROR;
462                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "(no devices found) %s: %s",
463                     device, pcap_strerror(errno));
464         }
465 #endif
466
467         return (fd);
468 }
469
470 #ifdef BIOCGDLTLIST
471 static int
472 get_dlt_list(int fd, int v, struct bpf_dltlist *bdlp, char *ebuf)
473 {
474         memset(bdlp, 0, sizeof(*bdlp));
475         if (ioctl(fd, BIOCGDLTLIST, (caddr_t)bdlp) == 0) {
476                 u_int i;
477                 int is_ethernet;
478
479                 bdlp->bfl_list = (u_int *) malloc(sizeof(u_int) * (bdlp->bfl_len + 1));
480                 if (bdlp->bfl_list == NULL) {
481                         (void)snprintf(ebuf, PCAP_ERRBUF_SIZE, "malloc: %s",
482                             pcap_strerror(errno));
483                         return (PCAP_ERROR);
484                 }
485
486                 if (ioctl(fd, BIOCGDLTLIST, (caddr_t)bdlp) < 0) {
487                         (void)snprintf(ebuf, PCAP_ERRBUF_SIZE,
488                             "BIOCGDLTLIST: %s", pcap_strerror(errno));
489                         free(bdlp->bfl_list);
490                         return (PCAP_ERROR);
491                 }
492
493                 /*
494                  * OK, for real Ethernet devices, add DLT_DOCSIS to the
495                  * list, so that an application can let you choose it,
496                  * in case you're capturing DOCSIS traffic that a Cisco
497                  * Cable Modem Termination System is putting out onto
498                  * an Ethernet (it doesn't put an Ethernet header onto
499                  * the wire, it puts raw DOCSIS frames out on the wire
500                  * inside the low-level Ethernet framing).
501                  *
502                  * A "real Ethernet device" is defined here as a device
503                  * that has a link-layer type of DLT_EN10MB and that has
504                  * no alternate link-layer types; that's done to exclude
505                  * 802.11 interfaces (which might or might not be the
506                  * right thing to do, but I suspect it is - Ethernet <->
507                  * 802.11 bridges would probably badly mishandle frames
508                  * that don't have Ethernet headers).
509                  */
510                 if (v == DLT_EN10MB) {
511                         is_ethernet = 1;
512                         for (i = 0; i < bdlp->bfl_len; i++) {
513                                 if (bdlp->bfl_list[i] != DLT_EN10MB) {
514                                         is_ethernet = 0;
515                                         break;
516                                 }
517                         }
518                         if (is_ethernet) {
519                                 /*
520                                  * We reserved one more slot at the end of
521                                  * the list.
522                                  */
523                                 bdlp->bfl_list[bdlp->bfl_len] = DLT_DOCSIS;
524                                 bdlp->bfl_len++;
525                         }
526                 }
527         } else {
528                 /*
529                  * EINVAL just means "we don't support this ioctl on
530                  * this device"; don't treat it as an error.
531                  */
532                 if (errno != EINVAL) {
533                         (void)snprintf(ebuf, PCAP_ERRBUF_SIZE,
534                             "BIOCGDLTLIST: %s", pcap_strerror(errno));
535                         return (PCAP_ERROR);
536                 }
537         }
538         return (0);
539 }
540 #endif
541
542 static int
543 pcap_can_set_rfmon_bpf(pcap_t *p)
544 {
545 #if defined(__APPLE__)
546         struct utsname osinfo;
547         struct ifreq ifr;
548         int fd;
549 #ifdef BIOCGDLTLIST
550         struct bpf_dltlist bdl;
551 #endif
552
553         /*
554          * The joys of monitor mode on OS X.
555          *
556          * Prior to 10.4, it's not supported at all.
557          *
558          * In 10.4, if adapter enN supports monitor mode, there's a
559          * wltN adapter corresponding to it; you open it, instead of
560          * enN, to get monitor mode.  You get whatever link-layer
561          * headers it supplies.
562          *
563          * In 10.5, and, we assume, later releases, if adapter enN
564          * supports monitor mode, it offers, among its selectable
565          * DLT_ values, values that let you get the 802.11 header;
566          * selecting one of those values puts the adapter into monitor
567          * mode (i.e., you can't get 802.11 headers except in monitor
568          * mode, and you can't get Ethernet headers in monitor mode).
569          */
570         if (uname(&osinfo) == -1) {
571                 /*
572                  * Can't get the OS version; just say "no".
573                  */
574                 return (0);
575         }
576         /*
577          * We assume osinfo.sysname is "Darwin", because
578          * __APPLE__ is defined.  We just check the version.
579          */
580         if (osinfo.release[0] < '8' && osinfo.release[1] == '.') {
581                 /*
582                  * 10.3 (Darwin 7.x) or earlier.
583                  * Monitor mode not supported.
584                  */
585                 return (0);
586         }
587         if (osinfo.release[0] == '8' && osinfo.release[1] == '.') {
588                 /*
589                  * 10.4 (Darwin 8.x).  s/en/wlt/, and check
590                  * whether the device exists.
591                  */
592                 if (strncmp(p->opt.source, "en", 2) != 0) {
593                         /*
594                          * Not an enN device; no monitor mode.
595                          */
596                         return (0);
597                 }
598                 fd = socket(AF_INET, SOCK_DGRAM, 0);
599                 if (fd == -1) {
600                         (void)snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
601                             "socket: %s", pcap_strerror(errno));
602                         return (PCAP_ERROR);
603                 }
604                 strlcpy(ifr.ifr_name, "wlt", sizeof(ifr.ifr_name));
605                 strlcat(ifr.ifr_name, p->opt.source + 2, sizeof(ifr.ifr_name));
606                 if (ioctl(fd, SIOCGIFFLAGS, (char *)&ifr) < 0) {
607                         /*
608                          * No such device?
609                          */
610                         close(fd);
611                         return (0);
612                 }
613                 close(fd);
614                 return (1);
615         }
616
617 #ifdef BIOCGDLTLIST
618         /*
619          * Everything else is 10.5 or later; for those,
620          * we just open the enN device, and check whether
621          * we have any 802.11 devices.
622          *
623          * First, open a BPF device.
624          */
625         fd = bpf_open(p);
626         if (fd < 0)
627                 return (fd);
628
629         /*
630          * Now bind to the device.
631          */
632         (void)strncpy(ifr.ifr_name, p->opt.source, sizeof(ifr.ifr_name));
633         if (ioctl(fd, BIOCSETIF, (caddr_t)&ifr) < 0) {
634                 if (errno == ENETDOWN) {
635                         /*
636                          * Return a "network down" indication, so that
637                          * the application can report that rather than
638                          * saying we had a mysterious failure and
639                          * suggest that they report a problem to the
640                          * libpcap developers.
641                          */
642                         close(fd);
643                         return (PCAP_ERROR_IFACE_NOT_UP);
644                 } else {
645                         snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
646                             "BIOCSETIF: %s: %s",
647                             p->opt.source, pcap_strerror(errno));
648                         close(fd);
649                         return (PCAP_ERROR);
650                 }
651         }
652
653         /*
654          * We know the default link type -- now determine all the DLTs
655          * this interface supports.  If this fails with EINVAL, it's
656          * not fatal; we just don't get to use the feature later.
657          * (We don't care about DLT_DOCSIS, so we pass DLT_NULL
658          * as the default DLT for this adapter.)
659          */
660         if (get_dlt_list(fd, DLT_NULL, &bdl, p->errbuf) == PCAP_ERROR) {
661                 close(fd);
662                 return (PCAP_ERROR);
663         }
664         if (find_802_11(&bdl) != -1) {
665                 /*
666                  * We have an 802.11 DLT, so we can set monitor mode.
667                  */
668                 free(bdl.bfl_list);
669                 close(fd);
670                 return (1);
671         }
672         free(bdl.bfl_list);
673 #endif /* BIOCGDLTLIST */
674         return (0);
675 #elif defined(HAVE_BSD_IEEE80211)
676         int ret;
677
678         ret = monitor_mode(p, 0);
679         if (ret == PCAP_ERROR_RFMON_NOTSUP)
680                 return (0);     /* not an error, just a "can't do" */
681         if (ret == 0)
682                 return (1);     /* success */
683         return (ret);
684 #else
685         return (0);
686 #endif
687 }
688
689 static int
690 pcap_stats_bpf(pcap_t *p, struct pcap_stat *ps)
691 {
692         struct bpf_stat s;
693
694         /*
695          * "ps_recv" counts packets handed to the filter, not packets
696          * that passed the filter.  This includes packets later dropped
697          * because we ran out of buffer space.
698          *
699          * "ps_drop" counts packets dropped inside the BPF device
700          * because we ran out of buffer space.  It doesn't count
701          * packets dropped by the interface driver.  It counts
702          * only packets that passed the filter.
703          *
704          * Both statistics include packets not yet read from the kernel
705          * by libpcap, and thus not yet seen by the application.
706          */
707         if (ioctl(p->fd, BIOCGSTATS, (caddr_t)&s) < 0) {
708                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCGSTATS: %s",
709                     pcap_strerror(errno));
710                 return (PCAP_ERROR);
711         }
712
713         ps->ps_recv = s.bs_recv;
714         ps->ps_drop = s.bs_drop;
715         return (0);
716 }
717
718 static int
719 pcap_read_bpf(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
720 {
721         int cc;
722         int n = 0;
723         register u_char *bp, *ep;
724         u_char *datap;
725 #ifdef PCAP_FDDIPAD
726         register int pad;
727 #endif
728 #ifdef HAVE_ZEROCOPY_BPF
729         int i;
730 #endif
731
732  again:
733         /*
734          * Has "pcap_breakloop()" been called?
735          */
736         if (p->break_loop) {
737                 /*
738                  * Yes - clear the flag that indicates that it
739                  * has, and return PCAP_ERROR_BREAK to indicate
740                  * that we were told to break out of the loop.
741                  */
742                 p->break_loop = 0;
743                 return (PCAP_ERROR_BREAK);
744         }
745         cc = p->cc;
746         if (p->cc == 0) {
747                 /*
748                  * When reading without zero-copy from a file descriptor, we
749                  * use a single buffer and return a length of data in the
750                  * buffer.  With zero-copy, we update the p->buffer pointer
751                  * to point at whatever underlying buffer contains the next
752                  * data and update cc to reflect the data found in the
753                  * buffer.
754                  */
755 #ifdef HAVE_ZEROCOPY_BPF
756                 if (p->md.zerocopy) {
757                         if (p->buffer != NULL)
758                                 pcap_ack_zbuf(p);
759                         i = pcap_next_zbuf(p, &cc);
760                         if (i == 0)
761                                 goto again;
762                         if (i < 0)
763                                 return (PCAP_ERROR);
764                 } else
765 #endif
766                 {
767                         cc = read(p->fd, (char *)p->buffer, p->bufsize);
768                 }
769                 if (cc < 0) {
770                         /* Don't choke when we get ptraced */
771                         switch (errno) {
772
773                         case EINTR:
774                                 goto again;
775
776 #ifdef _AIX
777                         case EFAULT:
778                                 /*
779                                  * Sigh.  More AIX wonderfulness.
780                                  *
781                                  * For some unknown reason the uiomove()
782                                  * operation in the bpf kernel extension
783                                  * used to copy the buffer into user
784                                  * space sometimes returns EFAULT. I have
785                                  * no idea why this is the case given that
786                                  * a kernel debugger shows the user buffer
787                                  * is correct. This problem appears to
788                                  * be mostly mitigated by the memset of
789                                  * the buffer before it is first used.
790                                  * Very strange.... Shaun Clowes
791                                  *
792                                  * In any case this means that we shouldn't
793                                  * treat EFAULT as a fatal error; as we
794                                  * don't have an API for returning
795                                  * a "some packets were dropped since
796                                  * the last packet you saw" indication,
797                                  * we just ignore EFAULT and keep reading.
798                                  */
799                                 goto again;
800 #endif
801
802                         case EWOULDBLOCK:
803                                 return (0);
804 #if defined(sun) && !defined(BSD)
805                         /*
806                          * Due to a SunOS bug, after 2^31 bytes, the kernel
807                          * file offset overflows and read fails with EINVAL.
808                          * The lseek() to 0 will fix things.
809                          */
810                         case EINVAL:
811                                 if (lseek(p->fd, 0L, SEEK_CUR) +
812                                     p->bufsize < 0) {
813                                         (void)lseek(p->fd, 0L, SEEK_SET);
814                                         goto again;
815                                 }
816                                 /* fall through */
817 #endif
818                         }
819                         snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "read: %s",
820                             pcap_strerror(errno));
821                         return (PCAP_ERROR);
822                 }
823                 bp = p->buffer;
824         } else
825                 bp = p->bp;
826
827         /*
828          * Loop through each packet.
829          */
830 #define bhp ((struct bpf_hdr *)bp)
831         ep = bp + cc;
832 #ifdef PCAP_FDDIPAD
833         pad = p->fddipad;
834 #endif
835         while (bp < ep) {
836                 register int caplen, hdrlen;
837
838                 /*
839                  * Has "pcap_breakloop()" been called?
840                  * If so, return immediately - if we haven't read any
841                  * packets, clear the flag and return PCAP_ERROR_BREAK
842                  * to indicate that we were told to break out of the loop,
843                  * otherwise leave the flag set, so that the *next* call
844                  * will break out of the loop without having read any
845                  * packets, and return the number of packets we've
846                  * processed so far.
847                  */
848                 if (p->break_loop) {
849                         if (n == 0) {
850                                 p->break_loop = 0;
851                                 return (PCAP_ERROR_BREAK);
852                         } else {
853                                 p->bp = bp;
854                                 p->cc = ep - bp;
855                                 return (n);
856                         }
857                 }
858
859                 caplen = bhp->bh_caplen;
860                 hdrlen = bhp->bh_hdrlen;
861                 datap = bp + hdrlen;
862                 /*
863                  * Short-circuit evaluation: if using BPF filter
864                  * in kernel, no need to do it now - we already know
865                  * the packet passed the filter.
866                  *
867 #ifdef PCAP_FDDIPAD
868                  * Note: the filter code was generated assuming
869                  * that p->fddipad was the amount of padding
870                  * before the header, as that's what's required
871                  * in the kernel, so we run the filter before
872                  * skipping that padding.
873 #endif
874                  */
875                 if (p->md.use_bpf ||
876                     bpf_filter(p->fcode.bf_insns, datap, bhp->bh_datalen, caplen)) {
877                         struct pcap_pkthdr pkthdr;
878
879                         pkthdr.ts.tv_sec = bhp->bh_tstamp.tv_sec;
880 #ifdef _AIX
881                         /*
882                          * AIX's BPF returns seconds/nanoseconds time
883                          * stamps, not seconds/microseconds time stamps.
884                          */
885                         pkthdr.ts.tv_usec = bhp->bh_tstamp.tv_usec/1000;
886 #else
887                         pkthdr.ts.tv_usec = bhp->bh_tstamp.tv_usec;
888 #endif
889 #ifdef PCAP_FDDIPAD
890                         if (caplen > pad)
891                                 pkthdr.caplen = caplen - pad;
892                         else
893                                 pkthdr.caplen = 0;
894                         if (bhp->bh_datalen > pad)
895                                 pkthdr.len = bhp->bh_datalen - pad;
896                         else
897                                 pkthdr.len = 0;
898                         datap += pad;
899 #else
900                         pkthdr.caplen = caplen;
901                         pkthdr.len = bhp->bh_datalen;
902 #endif
903                         (*callback)(user, &pkthdr, datap);
904                         bp += BPF_WORDALIGN(caplen + hdrlen);
905                         if (++n >= cnt && cnt > 0) {
906                                 p->bp = bp;
907                                 p->cc = ep - bp;
908                                 return (n);
909                         }
910                 } else {
911                         /*
912                          * Skip this packet.
913                          */
914                         bp += BPF_WORDALIGN(caplen + hdrlen);
915                 }
916         }
917 #undef bhp
918         p->cc = 0;
919         return (n);
920 }
921
922 static int
923 pcap_inject_bpf(pcap_t *p, const void *buf, size_t size)
924 {
925         int ret;
926
927         ret = write(p->fd, buf, size);
928 #ifdef __APPLE__
929         if (ret == -1 && errno == EAFNOSUPPORT) {
930                 /*
931                  * In Mac OS X, there's a bug wherein setting the
932                  * BIOCSHDRCMPLT flag causes writes to fail; see,
933                  * for example:
934                  *
935                  *      http://cerberus.sourcefire.com/~jeff/archives/patches/macosx/BIOCSHDRCMPLT-10.3.3.patch
936                  *
937                  * So, if, on OS X, we get EAFNOSUPPORT from the write, we
938                  * assume it's due to that bug, and turn off that flag
939                  * and try again.  If we succeed, it either means that
940                  * somebody applied the fix from that URL, or other patches
941                  * for that bug from
942                  *
943                  *      http://cerberus.sourcefire.com/~jeff/archives/patches/macosx/
944                  *
945                  * and are running a Darwin kernel with those fixes, or
946                  * that Apple fixed the problem in some OS X release.
947                  */
948                 u_int spoof_eth_src = 0;
949
950                 if (ioctl(p->fd, BIOCSHDRCMPLT, &spoof_eth_src) == -1) {
951                         (void)snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
952                             "send: can't turn off BIOCSHDRCMPLT: %s",
953                             pcap_strerror(errno));
954                         return (PCAP_ERROR);
955                 }
956
957                 /*
958                  * Now try the write again.
959                  */
960                 ret = write(p->fd, buf, size);
961         }
962 #endif /* __APPLE__ */
963         if (ret == -1) {
964                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "send: %s",
965                     pcap_strerror(errno));
966                 return (PCAP_ERROR);
967         }
968         return (ret);
969 }
970
971 #ifdef _AIX
972 static int
973 bpf_odminit(char *errbuf)
974 {
975         char *errstr;
976
977         if (odm_initialize() == -1) {
978                 if (odm_err_msg(odmerrno, &errstr) == -1)
979                         errstr = "Unknown error";
980                 snprintf(errbuf, PCAP_ERRBUF_SIZE,
981                     "bpf_load: odm_initialize failed: %s",
982                     errstr);
983                 return (PCAP_ERROR);
984         }
985
986         if ((odmlockid = odm_lock("/etc/objrepos/config_lock", ODM_WAIT)) == -1) {
987                 if (odm_err_msg(odmerrno, &errstr) == -1)
988                         errstr = "Unknown error";
989                 snprintf(errbuf, PCAP_ERRBUF_SIZE,
990                     "bpf_load: odm_lock of /etc/objrepos/config_lock failed: %s",
991                     errstr);
992                 return (PCAP_ERROR);
993         }
994
995         return (0);
996 }
997
998 static int
999 bpf_odmcleanup(char *errbuf)
1000 {
1001         char *errstr;
1002
1003         if (odm_unlock(odmlockid) == -1) {
1004                 if (odm_err_msg(odmerrno, &errstr) == -1)
1005                         errstr = "Unknown error";
1006                 snprintf(errbuf, PCAP_ERRBUF_SIZE,
1007                     "bpf_load: odm_unlock failed: %s",
1008                     errstr);
1009                 return (PCAP_ERROR);
1010         }
1011
1012         if (odm_terminate() == -1) {
1013                 if (odm_err_msg(odmerrno, &errstr) == -1)
1014                         errstr = "Unknown error";
1015                 snprintf(errbuf, PCAP_ERRBUF_SIZE,
1016                     "bpf_load: odm_terminate failed: %s",
1017                     errstr);
1018                 return (PCAP_ERROR);
1019         }
1020
1021         return (0);
1022 }
1023
1024 static int
1025 bpf_load(char *errbuf)
1026 {
1027         long major;
1028         int *minors;
1029         int numminors, i, rc;
1030         char buf[1024];
1031         struct stat sbuf;
1032         struct bpf_config cfg_bpf;
1033         struct cfg_load cfg_ld;
1034         struct cfg_kmod cfg_km;
1035
1036         /*
1037          * This is very very close to what happens in the real implementation
1038          * but I've fixed some (unlikely) bug situations.
1039          */
1040         if (bpfloadedflag)
1041                 return (0);
1042
1043         if (bpf_odminit(errbuf) == PCAP_ERROR)
1044                 return (PCAP_ERROR);
1045
1046         major = genmajor(BPF_NAME);
1047         if (major == -1) {
1048                 snprintf(errbuf, PCAP_ERRBUF_SIZE,
1049                     "bpf_load: genmajor failed: %s", pcap_strerror(errno));
1050                 return (PCAP_ERROR);
1051         }
1052
1053         minors = getminor(major, &numminors, BPF_NAME);
1054         if (!minors) {
1055                 minors = genminor("bpf", major, 0, BPF_MINORS, 1, 1);
1056                 if (!minors) {
1057                         snprintf(errbuf, PCAP_ERRBUF_SIZE,
1058                             "bpf_load: genminor failed: %s",
1059                             pcap_strerror(errno));
1060                         return (PCAP_ERROR);
1061                 }
1062         }
1063
1064         if (bpf_odmcleanup(errbuf) == PCAP_ERROR)
1065                 return (PCAP_ERROR);
1066
1067         rc = stat(BPF_NODE "0", &sbuf);
1068         if (rc == -1 && errno != ENOENT) {
1069                 snprintf(errbuf, PCAP_ERRBUF_SIZE,
1070                     "bpf_load: can't stat %s: %s",
1071                     BPF_NODE "0", pcap_strerror(errno));
1072                 return (PCAP_ERROR);
1073         }
1074
1075         if (rc == -1 || getmajor(sbuf.st_rdev) != major) {
1076                 for (i = 0; i < BPF_MINORS; i++) {
1077                         sprintf(buf, "%s%d", BPF_NODE, i);
1078                         unlink(buf);
1079                         if (mknod(buf, S_IRUSR | S_IFCHR, domakedev(major, i)) == -1) {
1080                                 snprintf(errbuf, PCAP_ERRBUF_SIZE,
1081                                     "bpf_load: can't mknod %s: %s",
1082                                     buf, pcap_strerror(errno));
1083                                 return (PCAP_ERROR);
1084                         }
1085                 }
1086         }
1087
1088         /* Check if the driver is loaded */
1089         memset(&cfg_ld, 0x0, sizeof(cfg_ld));
1090         cfg_ld.path = buf;
1091         sprintf(cfg_ld.path, "%s/%s", DRIVER_PATH, BPF_NAME);
1092         if ((sysconfig(SYS_QUERYLOAD, (void *)&cfg_ld, sizeof(cfg_ld)) == -1) ||
1093             (cfg_ld.kmid == 0)) {
1094                 /* Driver isn't loaded, load it now */
1095                 if (sysconfig(SYS_SINGLELOAD, (void *)&cfg_ld, sizeof(cfg_ld)) == -1) {
1096                         snprintf(errbuf, PCAP_ERRBUF_SIZE,
1097                             "bpf_load: could not load driver: %s",
1098                             strerror(errno));
1099                         return (PCAP_ERROR);
1100                 }
1101         }
1102
1103         /* Configure the driver */
1104         cfg_km.cmd = CFG_INIT;
1105         cfg_km.kmid = cfg_ld.kmid;
1106         cfg_km.mdilen = sizeof(cfg_bpf);
1107         cfg_km.mdiptr = (void *)&cfg_bpf;
1108         for (i = 0; i < BPF_MINORS; i++) {
1109                 cfg_bpf.devno = domakedev(major, i);
1110                 if (sysconfig(SYS_CFGKMOD, (void *)&cfg_km, sizeof(cfg_km)) == -1) {
1111                         snprintf(errbuf, PCAP_ERRBUF_SIZE,
1112                             "bpf_load: could not configure driver: %s",
1113                             strerror(errno));
1114                         return (PCAP_ERROR);
1115                 }
1116         }
1117
1118         bpfloadedflag = 1;
1119
1120         return (0);
1121 }
1122 #endif
1123
1124 /*
1125  * Turn off rfmon mode if necessary.
1126  */
1127 static void
1128 pcap_cleanup_bpf(pcap_t *p)
1129 {
1130 #ifdef HAVE_BSD_IEEE80211
1131         int sock;
1132         struct ifmediareq req;
1133         struct ifreq ifr;
1134 #endif
1135
1136         if (p->md.must_clear != 0) {
1137                 /*
1138                  * There's something we have to do when closing this
1139                  * pcap_t.
1140                  */
1141 #ifdef HAVE_BSD_IEEE80211
1142                 if (p->md.must_clear & MUST_CLEAR_RFMON) {
1143                         /*
1144                          * We put the interface into rfmon mode;
1145                          * take it out of rfmon mode.
1146                          *
1147                          * XXX - if somebody else wants it in rfmon
1148                          * mode, this code cannot know that, so it'll take
1149                          * it out of rfmon mode.
1150                          */
1151                         sock = socket(AF_INET, SOCK_DGRAM, 0);
1152                         if (sock == -1) {
1153                                 fprintf(stderr,
1154                                     "Can't restore interface flags (socket() failed: %s).\n"
1155                                     "Please adjust manually.\n",
1156                                     strerror(errno));
1157                         } else {
1158                                 memset(&req, 0, sizeof(req));
1159                                 strncpy(req.ifm_name, p->md.device,
1160                                     sizeof(req.ifm_name));
1161                                 if (ioctl(sock, SIOCGIFMEDIA, &req) < 0) {
1162                                         fprintf(stderr,
1163                                             "Can't restore interface flags (SIOCGIFMEDIA failed: %s).\n"
1164                                             "Please adjust manually.\n",
1165                                             strerror(errno));
1166                                 } else {
1167                                         if (req.ifm_current & IFM_IEEE80211_MONITOR) {
1168                                                 /*
1169                                                  * Rfmon mode is currently on;
1170                                                  * turn it off.
1171                                                  */
1172                                                 memset(&ifr, 0, sizeof(ifr));
1173                                                 (void)strncpy(ifr.ifr_name,
1174                                                     p->md.device,
1175                                                     sizeof(ifr.ifr_name));
1176                                                 ifr.ifr_media =
1177                                                     req.ifm_current & ~IFM_IEEE80211_MONITOR;
1178                                                 if (ioctl(sock, SIOCSIFMEDIA,
1179                                                     &ifr) == -1) {
1180                                                         fprintf(stderr,
1181                                                             "Can't restore interface flags (SIOCSIFMEDIA failed: %s).\n"
1182                                                             "Please adjust manually.\n",
1183                                                             strerror(errno));
1184                                                 }
1185                                         }
1186                                 }
1187                                 close(sock);
1188                         }
1189                 }
1190 #endif /* HAVE_BSD_IEEE80211 */
1191
1192                 /*
1193                  * Take this pcap out of the list of pcaps for which we
1194                  * have to take the interface out of some mode.
1195                  */
1196                 pcap_remove_from_pcaps_to_close(p);
1197                 p->md.must_clear = 0;
1198         }
1199
1200 #ifdef HAVE_ZEROCOPY_BPF
1201         /*
1202          * In zero-copy mode, p->buffer is just a pointer into one of the two
1203          * memory-mapped buffers, so no need to free it.
1204          */
1205         if (p->md.zerocopy) {
1206                 if (p->md.zbuf1 != MAP_FAILED && p->md.zbuf1 != NULL)
1207                         munmap(p->md.zbuf1, p->md.zbufsize);
1208                 if (p->md.zbuf2 != MAP_FAILED && p->md.zbuf2 != NULL)
1209                         munmap(p->md.zbuf2, p->md.zbufsize);
1210         }
1211 #endif
1212         if (p->md.device != NULL) {
1213                 free(p->md.device);
1214                 p->md.device = NULL;
1215         }
1216         pcap_cleanup_live_common(p);
1217 }
1218
1219 static int
1220 check_setif_failure(pcap_t *p, int error)
1221 {
1222 #ifdef __APPLE__
1223         int fd;
1224         struct ifreq ifr;
1225         int err;
1226 #endif
1227
1228         if (error == ENXIO) {
1229                 /*
1230                  * No such device exists.
1231                  */
1232 #ifdef __APPLE__
1233                 if (p->opt.rfmon && strncmp(p->opt.source, "wlt", 3) == 0) {
1234                         /*
1235                          * Monitor mode was requested, and we're trying
1236                          * to open a "wltN" device.  Assume that this
1237                          * is 10.4 and that we were asked to open an
1238                          * "enN" device; if that device exists, return
1239                          * "monitor mode not supported on the device".
1240                          */
1241                         fd = socket(AF_INET, SOCK_DGRAM, 0);
1242                         if (fd != -1) {
1243                                 strlcpy(ifr.ifr_name, "en",
1244                                     sizeof(ifr.ifr_name));
1245                                 strlcat(ifr.ifr_name, p->opt.source + 3,
1246                                     sizeof(ifr.ifr_name));
1247                                 if (ioctl(fd, SIOCGIFFLAGS, (char *)&ifr) < 0) {
1248                                         /*
1249                                          * We assume this failed because
1250                                          * the underlying device doesn't
1251                                          * exist.
1252                                          */
1253                                         err = PCAP_ERROR_NO_SUCH_DEVICE;
1254                                         strcpy(p->errbuf, "");
1255                                 } else {
1256                                         /*
1257                                          * The underlying "enN" device
1258                                          * exists, but there's no
1259                                          * corresponding "wltN" device;
1260                                          * that means that the "enN"
1261                                          * device doesn't support
1262                                          * monitor mode, probably because
1263                                          * it's an Ethernet device rather
1264                                          * than a wireless device.
1265                                          */
1266                                         err = PCAP_ERROR_RFMON_NOTSUP;
1267                                 }
1268                                 close(fd);
1269                         } else {
1270                                 /*
1271                                  * We can't find out whether there's
1272                                  * an underlying "enN" device, so
1273                                  * just report "no such device".
1274                                  */
1275                                 err = PCAP_ERROR_NO_SUCH_DEVICE;
1276                                 strcpy(p->errbuf, "");
1277                         }
1278                         return (err);
1279                 }
1280 #endif
1281                 /*
1282                  * No such device.
1283                  */
1284                 strcpy(p->errbuf, "");
1285                 return (PCAP_ERROR_NO_SUCH_DEVICE);
1286         } else if (errno == ENETDOWN) {
1287                 /*
1288                  * Return a "network down" indication, so that
1289                  * the application can report that rather than
1290                  * saying we had a mysterious failure and
1291                  * suggest that they report a problem to the
1292                  * libpcap developers.
1293                  */
1294                 return (PCAP_ERROR_IFACE_NOT_UP);
1295         } else {
1296                 /*
1297                  * Some other error; fill in the error string, and
1298                  * return PCAP_ERROR.
1299                  */
1300                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCSETIF: %s: %s",
1301                     p->opt.source, pcap_strerror(errno));
1302                 return (PCAP_ERROR);
1303         }
1304 }
1305
1306 static int
1307 pcap_activate_bpf(pcap_t *p)
1308 {
1309         int status = 0;
1310         int fd;
1311         struct ifreq ifr;
1312         struct bpf_version bv;
1313 #ifdef __APPLE__
1314         int sockfd;
1315         char *wltdev = NULL;
1316 #endif
1317 #ifdef BIOCGDLTLIST
1318         struct bpf_dltlist bdl;
1319 #if defined(__APPLE__) || defined(HAVE_BSD_IEEE80211)
1320         int new_dlt;
1321 #endif
1322 #endif /* BIOCGDLTLIST */
1323 #if defined(BIOCGHDRCMPLT) && defined(BIOCSHDRCMPLT)
1324         u_int spoof_eth_src = 1;
1325 #endif
1326         u_int v;
1327         struct bpf_insn total_insn;
1328         struct bpf_program total_prog;
1329         struct utsname osinfo;
1330         int have_osinfo = 0;
1331 #ifdef HAVE_ZEROCOPY_BPF
1332         struct bpf_zbuf bz;
1333         u_int bufmode, zbufmax;
1334 #endif
1335
1336         fd = bpf_open(p);
1337         if (fd < 0) {
1338                 status = fd;
1339                 goto bad;
1340         }
1341
1342         p->fd = fd;
1343
1344         if (ioctl(fd, BIOCVERSION, (caddr_t)&bv) < 0) {
1345                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCVERSION: %s",
1346                     pcap_strerror(errno));
1347                 status = PCAP_ERROR;
1348                 goto bad;
1349         }
1350         if (bv.bv_major != BPF_MAJOR_VERSION ||
1351             bv.bv_minor < BPF_MINOR_VERSION) {
1352                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1353                     "kernel bpf filter out of date");
1354                 status = PCAP_ERROR;
1355                 goto bad;
1356         }
1357
1358         p->md.device = strdup(p->opt.source);
1359         if (p->md.device == NULL) {
1360                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "strdup: %s",
1361                      pcap_strerror(errno));
1362                 status = PCAP_ERROR;
1363                 goto bad;
1364         }
1365
1366         /*
1367          * Attempt to find out the version of the OS on which we're running.
1368          */
1369         if (uname(&osinfo) == 0)
1370                 have_osinfo = 1;
1371
1372 #ifdef __APPLE__
1373         /*
1374          * See comment in pcap_can_set_rfmon_bpf() for an explanation
1375          * of why we check the version number.
1376          */
1377         if (p->opt.rfmon) {
1378                 if (have_osinfo) {
1379                         /*
1380                          * We assume osinfo.sysname is "Darwin", because
1381                          * __APPLE__ is defined.  We just check the version.
1382                          */
1383                         if (osinfo.release[0] < '8' &&
1384                             osinfo.release[1] == '.') {
1385                                 /*
1386                                  * 10.3 (Darwin 7.x) or earlier.
1387                                  */
1388                                 status = PCAP_ERROR_RFMON_NOTSUP;
1389                                 goto bad;
1390                         }
1391                         if (osinfo.release[0] == '8' &&
1392                             osinfo.release[1] == '.') {
1393                                 /*
1394                                  * 10.4 (Darwin 8.x).  s/en/wlt/
1395                                  */
1396                                 if (strncmp(p->opt.source, "en", 2) != 0) {
1397                                         /*
1398                                          * Not an enN device; check
1399                                          * whether the device even exists.
1400                                          */
1401                                         sockfd = socket(AF_INET, SOCK_DGRAM, 0);
1402                                         if (sockfd != -1) {
1403                                                 strlcpy(ifr.ifr_name,
1404                                                     p->opt.source,
1405                                                     sizeof(ifr.ifr_name));
1406                                                 if (ioctl(sockfd, SIOCGIFFLAGS,
1407                                                     (char *)&ifr) < 0) {
1408                                                         /*
1409                                                          * We assume this
1410                                                          * failed because
1411                                                          * the underlying
1412                                                          * device doesn't
1413                                                          * exist.
1414                                                          */
1415                                                         status = PCAP_ERROR_NO_SUCH_DEVICE;
1416                                                         strcpy(p->errbuf, "");
1417                                                 } else
1418                                                         status = PCAP_ERROR_RFMON_NOTSUP;
1419                                                 close(sockfd);
1420                                         } else {
1421                                                 /*
1422                                                  * We can't find out whether
1423                                                  * the device exists, so just
1424                                                  * report "no such device".
1425                                                  */
1426                                                 status = PCAP_ERROR_NO_SUCH_DEVICE;
1427                                                 strcpy(p->errbuf, "");
1428                                         }
1429                                         goto bad;
1430                                 }
1431                                 wltdev = malloc(strlen(p->opt.source) + 2);
1432                                 if (wltdev == NULL) {
1433                                         (void)snprintf(p->errbuf,
1434                                             PCAP_ERRBUF_SIZE, "malloc: %s",
1435                                             pcap_strerror(errno));
1436                                         status = PCAP_ERROR;
1437                                         goto bad;
1438                                 }
1439                                 strcpy(wltdev, "wlt");
1440                                 strcat(wltdev, p->opt.source + 2);
1441                                 free(p->opt.source);
1442                                 p->opt.source = wltdev;
1443                         }
1444                         /*
1445                          * Everything else is 10.5 or later; for those,
1446                          * we just open the enN device, and set the DLT.
1447                          */
1448                 }
1449         }
1450 #endif /* __APPLE__ */
1451 #ifdef HAVE_ZEROCOPY_BPF
1452         /*
1453          * If the BPF extension to set buffer mode is present, try setting
1454          * the mode to zero-copy.  If that fails, use regular buffering.  If
1455          * it succeeds but other setup fails, return an error to the user.
1456          */
1457         bufmode = BPF_BUFMODE_ZBUF;
1458         if (ioctl(fd, BIOCSETBUFMODE, (caddr_t)&bufmode) == 0) {
1459                 /*
1460                  * We have zerocopy BPF; use it.
1461                  */
1462                 p->md.zerocopy = 1;
1463
1464                 /*
1465                  * Set the cleanup and set/get nonblocking mode ops
1466                  * as appropriate for zero-copy mode.
1467                  */
1468                 p->cleanup_op = pcap_cleanup_zbuf;
1469                 p->setnonblock_op = pcap_setnonblock_zbuf;
1470                 p->getnonblock_op = pcap_getnonblock_zbuf;
1471
1472                 /*
1473                  * How to pick a buffer size: first, query the maximum buffer
1474                  * size supported by zero-copy.  This also lets us quickly
1475                  * determine whether the kernel generally supports zero-copy.
1476                  * Then, if a buffer size was specified, use that, otherwise
1477                  * query the default buffer size, which reflects kernel
1478                  * policy for a desired default.  Round to the nearest page
1479                  * size.
1480                  */
1481                 if (ioctl(fd, BIOCGETZMAX, (caddr_t)&zbufmax) < 0) {
1482                         snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCGETZMAX: %s",
1483                             pcap_strerror(errno));
1484                         goto bad;
1485                 }
1486
1487                 if (p->opt.buffer_size != 0) {
1488                         /*
1489                          * A buffer size was explicitly specified; use it.
1490                          */
1491                         v = p->opt.buffer_size;
1492                 } else {
1493                         if ((ioctl(fd, BIOCGBLEN, (caddr_t)&v) < 0) ||
1494                             v < 32768)
1495                                 v = 32768;
1496                 }
1497 #ifndef roundup
1498 #define roundup(x, y)   ((((x)+((y)-1))/(y))*(y))  /* to any y */
1499 #endif
1500                 p->md.zbufsize = roundup(v, getpagesize());
1501                 if (p->md.zbufsize > zbufmax)
1502                         p->md.zbufsize = zbufmax;
1503                 p->md.zbuf1 = mmap(NULL, p->md.zbufsize, PROT_READ | PROT_WRITE,
1504                     MAP_ANON, -1, 0);
1505                 p->md.zbuf2 = mmap(NULL, p->md.zbufsize, PROT_READ | PROT_WRITE,
1506                     MAP_ANON, -1, 0);
1507                 if (p->md.zbuf1 == MAP_FAILED || p->md.zbuf2 == MAP_FAILED) {
1508                         snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "mmap: %s",
1509                             pcap_strerror(errno));
1510                         goto bad;
1511                 }
1512                 bzero(&bz, sizeof(bz));
1513                 bz.bz_bufa = p->md.zbuf1;
1514                 bz.bz_bufb = p->md.zbuf2;
1515                 bz.bz_buflen = p->md.zbufsize;
1516                 if (ioctl(fd, BIOCSETZBUF, (caddr_t)&bz) < 0) {
1517                         snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCSETZBUF: %s",
1518                             pcap_strerror(errno));
1519                         goto bad;
1520                 }
1521                 (void)strncpy(ifr.ifr_name, p->opt.source, sizeof(ifr.ifr_name));
1522                 if (ioctl(fd, BIOCSETIF, (caddr_t)&ifr) < 0) {
1523                         snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCSETIF: %s: %s",
1524                             p->opt.source, pcap_strerror(errno));
1525                         goto bad;
1526                 }
1527                 v = p->md.zbufsize - sizeof(struct bpf_zbuf_header);
1528         } else
1529 #endif
1530         {
1531                 /*
1532                  * We don't have zerocopy BPF.
1533                  * Set the buffer size.
1534                  */
1535                 if (p->opt.buffer_size != 0) {
1536                         /*
1537                          * A buffer size was explicitly specified; use it.
1538                          */
1539                         if (ioctl(fd, BIOCSBLEN,
1540                             (caddr_t)&p->opt.buffer_size) < 0) {
1541                                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1542                                     "BIOCSBLEN: %s: %s", p->opt.source,
1543                                     pcap_strerror(errno));
1544                                 status = PCAP_ERROR;
1545                                 goto bad;
1546                         }
1547
1548                         /*
1549                          * Now bind to the device.
1550                          */
1551                         (void)strncpy(ifr.ifr_name, p->opt.source,
1552                             sizeof(ifr.ifr_name));
1553                         if (ioctl(fd, BIOCSETIF, (caddr_t)&ifr) < 0) {
1554                                 status = check_setif_failure(p, errno);
1555                                 goto bad;
1556                         }
1557                 } else {
1558                         /*
1559                          * No buffer size was explicitly specified.
1560                          *
1561                          * Try finding a good size for the buffer; 32768 may
1562                          * be too big, so keep cutting it in half until we
1563                          * find a size that works, or run out of sizes to try.
1564                          * If the default is larger, don't make it smaller.
1565                          */
1566                         if ((ioctl(fd, BIOCGBLEN, (caddr_t)&v) < 0) ||
1567                             v < 32768)
1568                                 v = 32768;
1569                         for ( ; v != 0; v >>= 1) {
1570                                 /*
1571                                  * Ignore the return value - this is because the
1572                                  * call fails on BPF systems that don't have
1573                                  * kernel malloc.  And if the call fails, it's
1574                                  * no big deal, we just continue to use the
1575                                  * standard buffer size.
1576                                  */
1577                                 (void) ioctl(fd, BIOCSBLEN, (caddr_t)&v);
1578
1579                                 (void)strncpy(ifr.ifr_name, p->opt.source,
1580                                     sizeof(ifr.ifr_name));
1581                                 if (ioctl(fd, BIOCSETIF, (caddr_t)&ifr) >= 0)
1582                                         break;  /* that size worked; we're done */
1583
1584                                 if (errno != ENOBUFS) {
1585                                         status = check_setif_failure(p, errno);
1586                                         goto bad;
1587                                 }
1588                         }
1589
1590                         if (v == 0) {
1591                                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1592                                     "BIOCSBLEN: %s: No buffer size worked",
1593                                     p->opt.source);
1594                                 status = PCAP_ERROR;
1595                                 goto bad;
1596                         }
1597                 }
1598         }
1599
1600         /* Get the data link layer type. */
1601         if (ioctl(fd, BIOCGDLT, (caddr_t)&v) < 0) {
1602                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCGDLT: %s",
1603                     pcap_strerror(errno));
1604                 status = PCAP_ERROR;
1605                 goto bad;
1606         }
1607
1608 #ifdef _AIX
1609         /*
1610          * AIX's BPF returns IFF_ types, not DLT_ types, in BIOCGDLT.
1611          */
1612         switch (v) {
1613
1614         case IFT_ETHER:
1615         case IFT_ISO88023:
1616                 v = DLT_EN10MB;
1617                 break;
1618
1619         case IFT_FDDI:
1620                 v = DLT_FDDI;
1621                 break;
1622
1623         case IFT_ISO88025:
1624                 v = DLT_IEEE802;
1625                 break;
1626
1627         case IFT_LOOP:
1628                 v = DLT_NULL;
1629                 break;
1630
1631         default:
1632                 /*
1633                  * We don't know what to map this to yet.
1634                  */
1635                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "unknown interface type %u",
1636                     v);
1637                 status = PCAP_ERROR;
1638                 goto bad;
1639         }
1640 #endif
1641 #if _BSDI_VERSION - 0 >= 199510
1642         /* The SLIP and PPP link layer header changed in BSD/OS 2.1 */
1643         switch (v) {
1644
1645         case DLT_SLIP:
1646                 v = DLT_SLIP_BSDOS;
1647                 break;
1648
1649         case DLT_PPP:
1650                 v = DLT_PPP_BSDOS;
1651                 break;
1652
1653         case 11:        /*DLT_FR*/
1654                 v = DLT_FRELAY;
1655                 break;
1656
1657         case 12:        /*DLT_C_HDLC*/
1658                 v = DLT_CHDLC;
1659                 break;
1660         }
1661 #endif
1662
1663 #ifdef BIOCGDLTLIST
1664         /*
1665          * We know the default link type -- now determine all the DLTs
1666          * this interface supports.  If this fails with EINVAL, it's
1667          * not fatal; we just don't get to use the feature later.
1668          */
1669         if (get_dlt_list(fd, v, &bdl, p->errbuf) == -1) {
1670                 status = PCAP_ERROR;
1671                 goto bad;
1672         }
1673         p->dlt_count = bdl.bfl_len;
1674         p->dlt_list = bdl.bfl_list;
1675
1676 #ifdef __APPLE__
1677         /*
1678          * Monitor mode fun, continued.
1679          *
1680          * For 10.5 and, we're assuming, later releases, as noted above,
1681          * 802.1 adapters that support monitor mode offer both DLT_EN10MB,
1682          * DLT_IEEE802_11, and possibly some 802.11-plus-radio-information
1683          * DLT_ value.  Choosing one of the 802.11 DLT_ values will turn
1684          * monitor mode on.
1685          *
1686          * Therefore, if the user asked for monitor mode, we filter out
1687          * the DLT_EN10MB value, as you can't get that in monitor mode,
1688          * and, if the user didn't ask for monitor mode, we filter out
1689          * the 802.11 DLT_ values, because selecting those will turn
1690          * monitor mode on.  Then, for monitor mode, if an 802.11-plus-
1691          * radio DLT_ value is offered, we try to select that, otherwise
1692          * we try to select DLT_IEEE802_11.
1693          */
1694         if (have_osinfo) {
1695                 if (isdigit((unsigned)osinfo.release[0]) &&
1696                      (osinfo.release[0] == '9' ||
1697                      isdigit((unsigned)osinfo.release[1]))) {
1698                         /*
1699                          * 10.5 (Darwin 9.x), or later.
1700                          */
1701                         new_dlt = find_802_11(&bdl);
1702                         if (new_dlt != -1) {
1703                                 /*
1704                                  * We have at least one 802.11 DLT_ value,
1705                                  * so this is an 802.11 interface.
1706                                  * new_dlt is the best of the 802.11
1707                                  * DLT_ values in the list.
1708                                  */
1709                                 if (p->opt.rfmon) {
1710                                         /*
1711                                          * Our caller wants monitor mode.
1712                                          * Purge DLT_EN10MB from the list
1713                                          * of link-layer types, as selecting
1714                                          * it will keep monitor mode off.
1715                                          */
1716                                         remove_en(p);
1717
1718                                         /*
1719                                          * If the new mode we want isn't
1720                                          * the default mode, attempt to
1721                                          * select the new mode.
1722                                          */
1723                                         if (new_dlt != v) {
1724                                                 if (ioctl(p->fd, BIOCSDLT,
1725                                                     &new_dlt) != -1) {
1726                                                         /*
1727                                                          * We succeeded;
1728                                                          * make this the
1729                                                          * new DLT_ value.
1730                                                          */
1731                                                         v = new_dlt;
1732                                                 }
1733                                         }
1734                                 } else {
1735                                         /*
1736                                          * Our caller doesn't want
1737                                          * monitor mode.  Unless this
1738                                          * is being done by pcap_open_live(),
1739                                          * purge the 802.11 link-layer types
1740                                          * from the list, as selecting
1741                                          * one of them will turn monitor
1742                                          * mode on.
1743                                          */
1744                                         if (!p->oldstyle)
1745                                                 remove_802_11(p);
1746                                 }
1747                         } else {
1748                                 if (p->opt.rfmon) {
1749                                         /*
1750                                          * The caller requested monitor
1751                                          * mode, but we have no 802.11
1752                                          * link-layer types, so they
1753                                          * can't have it.
1754                                          */
1755                                         status = PCAP_ERROR_RFMON_NOTSUP;
1756                                         goto bad;
1757                                 }
1758                         }
1759                 }
1760         }
1761 #elif defined(HAVE_BSD_IEEE80211)
1762         /*
1763          * *BSD with the new 802.11 ioctls.
1764          * Do we want monitor mode?
1765          */
1766         if (p->opt.rfmon) {
1767                 /*
1768                  * Try to put the interface into monitor mode.
1769                  */
1770                 status = monitor_mode(p, 1);
1771                 if (status != 0) {
1772                         /*
1773                          * We failed.
1774                          */
1775                         goto bad;
1776                 }
1777
1778                 /*
1779                  * We're in monitor mode.
1780                  * Try to find the best 802.11 DLT_ value and, if we
1781                  * succeed, try to switch to that mode if we're not
1782                  * already in that mode.
1783                  */
1784                 new_dlt = find_802_11(&bdl);
1785                 if (new_dlt != -1) {
1786                         /*
1787                          * We have at least one 802.11 DLT_ value.
1788                          * new_dlt is the best of the 802.11
1789                          * DLT_ values in the list.
1790                          *
1791                          * If the new mode we want isn't the default mode,
1792                          * attempt to select the new mode.
1793                          */
1794                         if (new_dlt != v) {
1795                                 if (ioctl(p->fd, BIOCSDLT, &new_dlt) != -1) {
1796                                         /*
1797                                          * We succeeded; make this the
1798                                          * new DLT_ value.
1799                                          */
1800                                         v = new_dlt;
1801                                 }
1802                         }
1803                 }
1804         }
1805 #endif /* various platforms */
1806 #endif /* BIOCGDLTLIST */
1807
1808         /*
1809          * If this is an Ethernet device, and we don't have a DLT_ list,
1810          * give it a list with DLT_EN10MB and DLT_DOCSIS.  (That'd give
1811          * 802.11 interfaces DLT_DOCSIS, which isn't the right thing to
1812          * do, but there's not much we can do about that without finding
1813          * some other way of determining whether it's an Ethernet or 802.11
1814          * device.)
1815          */
1816         if (v == DLT_EN10MB && p->dlt_count == 0) {
1817                 p->dlt_list = (u_int *) malloc(sizeof(u_int) * 2);
1818                 /*
1819                  * If that fails, just leave the list empty.
1820                  */
1821                 if (p->dlt_list != NULL) {
1822                         p->dlt_list[0] = DLT_EN10MB;
1823                         p->dlt_list[1] = DLT_DOCSIS;
1824                         p->dlt_count = 2;
1825                 }
1826         }
1827 #ifdef PCAP_FDDIPAD
1828         if (v == DLT_FDDI)
1829                 p->fddipad = PCAP_FDDIPAD;
1830         else
1831                 p->fddipad = 0;
1832 #endif
1833         p->linktype = v;
1834
1835 #if defined(BIOCGHDRCMPLT) && defined(BIOCSHDRCMPLT)
1836         /*
1837          * Do a BIOCSHDRCMPLT, if defined, to turn that flag on, so
1838          * the link-layer source address isn't forcibly overwritten.
1839          * (Should we ignore errors?  Should we do this only if
1840          * we're open for writing?)
1841          *
1842          * XXX - I seem to remember some packet-sending bug in some
1843          * BSDs - check CVS log for "bpf.c"?
1844          */
1845         if (ioctl(fd, BIOCSHDRCMPLT, &spoof_eth_src) == -1) {
1846                 (void)snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1847                     "BIOCSHDRCMPLT: %s", pcap_strerror(errno));
1848                 status = PCAP_ERROR;
1849                 goto bad;
1850         }
1851 #endif
1852         /* set timeout */
1853 #ifdef HAVE_ZEROCOPY_BPF
1854         if (p->md.timeout != 0 && !p->md.zerocopy) {
1855 #else
1856         if (p->md.timeout) {
1857 #endif
1858                 /*
1859                  * XXX - is this seconds/nanoseconds in AIX?
1860                  * (Treating it as such doesn't fix the timeout
1861                  * problem described below.)
1862                  */
1863                 struct timeval to;
1864                 to.tv_sec = p->md.timeout / 1000;
1865                 to.tv_usec = (p->md.timeout * 1000) % 1000000;
1866                 if (ioctl(p->fd, BIOCSRTIMEOUT, (caddr_t)&to) < 0) {
1867                         snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCSRTIMEOUT: %s",
1868                             pcap_strerror(errno));
1869                         status = PCAP_ERROR;
1870                         goto bad;
1871                 }
1872         }
1873
1874 #ifdef _AIX
1875 #ifdef  BIOCIMMEDIATE
1876         /*
1877          * Darren Reed notes that
1878          *
1879          *      On AIX (4.2 at least), if BIOCIMMEDIATE is not set, the
1880          *      timeout appears to be ignored and it waits until the buffer
1881          *      is filled before returning.  The result of not having it
1882          *      set is almost worse than useless if your BPF filter
1883          *      is reducing things to only a few packets (i.e. one every
1884          *      second or so).
1885          *
1886          * so we turn BIOCIMMEDIATE mode on if this is AIX.
1887          *
1888          * We don't turn it on for other platforms, as that means we
1889          * get woken up for every packet, which may not be what we want;
1890          * in the Winter 1993 USENIX paper on BPF, they say:
1891          *
1892          *      Since a process might want to look at every packet on a
1893          *      network and the time between packets can be only a few
1894          *      microseconds, it is not possible to do a read system call
1895          *      per packet and BPF must collect the data from several
1896          *      packets and return it as a unit when the monitoring
1897          *      application does a read.
1898          *
1899          * which I infer is the reason for the timeout - it means we
1900          * wait that amount of time, in the hopes that more packets
1901          * will arrive and we'll get them all with one read.
1902          *
1903          * Setting BIOCIMMEDIATE mode on FreeBSD (and probably other
1904          * BSDs) causes the timeout to be ignored.
1905          *
1906          * On the other hand, some platforms (e.g., Linux) don't support
1907          * timeouts, they just hand stuff to you as soon as it arrives;
1908          * if that doesn't cause a problem on those platforms, it may
1909          * be OK to have BIOCIMMEDIATE mode on BSD as well.
1910          *
1911          * (Note, though, that applications may depend on the read
1912          * completing, even if no packets have arrived, when the timeout
1913          * expires, e.g. GUI applications that have to check for input
1914          * while waiting for packets to arrive; a non-zero timeout
1915          * prevents "select()" from working right on FreeBSD and
1916          * possibly other BSDs, as the timer doesn't start until a
1917          * "read()" is done, so the timer isn't in effect if the
1918          * application is blocked on a "select()", and the "select()"
1919          * doesn't get woken up for a BPF device until the buffer
1920          * fills up.)
1921          */
1922         v = 1;
1923         if (ioctl(p->fd, BIOCIMMEDIATE, &v) < 0) {
1924                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCIMMEDIATE: %s",
1925                     pcap_strerror(errno));
1926                 status = PCAP_ERROR;
1927                 goto bad;
1928         }
1929 #endif  /* BIOCIMMEDIATE */
1930 #endif  /* _AIX */
1931
1932         if (p->opt.promisc) {
1933                 /* set promiscuous mode, just warn if it fails */
1934                 if (ioctl(p->fd, BIOCPROMISC, NULL) < 0) {
1935                         snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCPROMISC: %s",
1936                             pcap_strerror(errno));
1937                         status = PCAP_WARNING_PROMISC_NOTSUP;
1938                 }
1939         }
1940
1941         if (ioctl(fd, BIOCGBLEN, (caddr_t)&v) < 0) {
1942                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCGBLEN: %s",
1943                     pcap_strerror(errno));
1944                 status = PCAP_ERROR;
1945                 goto bad;
1946         }
1947         p->bufsize = v;
1948 #ifdef HAVE_ZEROCOPY_BPF
1949         if (!p->md.zerocopy) {
1950 #endif
1951         p->buffer = (u_char *)malloc(p->bufsize);
1952         if (p->buffer == NULL) {
1953                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "malloc: %s",
1954                     pcap_strerror(errno));
1955                 status = PCAP_ERROR;
1956                 goto bad;
1957         }
1958 #ifdef _AIX
1959         /* For some strange reason this seems to prevent the EFAULT
1960          * problems we have experienced from AIX BPF. */
1961         memset(p->buffer, 0x0, p->bufsize);
1962 #endif
1963 #ifdef HAVE_ZEROCOPY_BPF
1964         }
1965 #endif
1966
1967         /*
1968          * If there's no filter program installed, there's
1969          * no indication to the kernel of what the snapshot
1970          * length should be, so no snapshotting is done.
1971          *
1972          * Therefore, when we open the device, we install
1973          * an "accept everything" filter with the specified
1974          * snapshot length.
1975          */
1976         total_insn.code = (u_short)(BPF_RET | BPF_K);
1977         total_insn.jt = 0;
1978         total_insn.jf = 0;
1979         total_insn.k = p->snapshot;
1980
1981         total_prog.bf_len = 1;
1982         total_prog.bf_insns = &total_insn;
1983         if (ioctl(p->fd, BIOCSETF, (caddr_t)&total_prog) < 0) {
1984                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCSETF: %s",
1985                     pcap_strerror(errno));
1986                 status = PCAP_ERROR;
1987                 goto bad;
1988         }
1989
1990         /*
1991          * On most BPF platforms, either you can do a "select()" or
1992          * "poll()" on a BPF file descriptor and it works correctly,
1993          * or you can do it and it will return "readable" if the
1994          * hold buffer is full but not if the timeout expires *and*
1995          * a non-blocking read will, if the hold buffer is empty
1996          * but the store buffer isn't empty, rotate the buffers
1997          * and return what packets are available.
1998          *
1999          * In the latter case, the fact that a non-blocking read
2000          * will give you the available packets means you can work
2001          * around the failure of "select()" and "poll()" to wake up
2002          * and return "readable" when the timeout expires by using
2003          * the timeout as the "select()" or "poll()" timeout, putting
2004          * the BPF descriptor into non-blocking mode, and read from
2005          * it regardless of whether "select()" reports it as readable
2006          * or not.
2007          *
2008          * However, in FreeBSD 4.3 and 4.4, "select()" and "poll()"
2009          * won't wake up and return "readable" if the timer expires
2010          * and non-blocking reads return EWOULDBLOCK if the hold
2011          * buffer is empty, even if the store buffer is non-empty.
2012          *
2013          * This means the workaround in question won't work.
2014          *
2015          * Therefore, on FreeBSD 4.3 and 4.4, we set "p->selectable_fd"
2016          * to -1, which means "sorry, you can't use 'select()' or 'poll()'
2017          * here".  On all other BPF platforms, we set it to the FD for
2018          * the BPF device; in NetBSD, OpenBSD, and Darwin, a non-blocking
2019          * read will, if the hold buffer is empty and the store buffer
2020          * isn't empty, rotate the buffers and return what packets are
2021          * there (and in sufficiently recent versions of OpenBSD
2022          * "select()" and "poll()" should work correctly).
2023          *
2024          * XXX - what about AIX?
2025          */
2026         p->selectable_fd = p->fd;       /* assume select() works until we know otherwise */
2027         if (have_osinfo) {
2028                 /*
2029                  * We can check what OS this is.
2030                  */
2031                 if (strcmp(osinfo.sysname, "FreeBSD") == 0) {
2032                         if (strncmp(osinfo.release, "4.3-", 4) == 0 ||
2033                              strncmp(osinfo.release, "4.4-", 4) == 0)
2034                                 p->selectable_fd = -1;
2035                 }
2036         }
2037
2038         p->read_op = pcap_read_bpf;
2039         p->inject_op = pcap_inject_bpf;
2040         p->setfilter_op = pcap_setfilter_bpf;
2041         p->setdirection_op = pcap_setdirection_bpf;
2042         p->set_datalink_op = pcap_set_datalink_bpf;
2043         p->getnonblock_op = pcap_getnonblock_fd;
2044         p->setnonblock_op = pcap_setnonblock_fd;
2045         p->stats_op = pcap_stats_bpf;
2046         p->cleanup_op = pcap_cleanup_bpf;
2047
2048         return (status);
2049  bad:
2050         pcap_cleanup_bpf(p);
2051         return (status);
2052 }
2053
2054 int
2055 pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf)
2056 {
2057 #ifdef HAVE_DAG_API
2058         if (dag_platform_finddevs(alldevsp, errbuf) < 0)
2059                 return (-1);
2060 #endif /* HAVE_DAG_API */
2061
2062         return (0);
2063 }
2064
2065 #ifdef HAVE_BSD_IEEE80211
2066 static int
2067 monitor_mode(pcap_t *p, int set)
2068 {
2069         int sock;
2070         struct ifmediareq req;
2071         int *media_list;
2072         int i;
2073         int can_do;
2074         struct ifreq ifr;
2075
2076         sock = socket(AF_INET, SOCK_DGRAM, 0);
2077         if (sock == -1) {
2078                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "can't open socket: %s",
2079                     pcap_strerror(errno));
2080                 return (PCAP_ERROR);
2081         }
2082
2083         memset(&req, 0, sizeof req);
2084         strncpy(req.ifm_name, p->opt.source, sizeof req.ifm_name);
2085
2086         /*
2087          * Find out how many media types we have.
2088          */
2089         if (ioctl(sock, SIOCGIFMEDIA, &req) < 0) {
2090                 /*
2091                  * Can't get the media types.
2092                  */
2093                 if (errno == EINVAL) {
2094                         /*
2095                          * Interface doesn't support SIOC{G,S}IFMEDIA.
2096                          */
2097                         close(sock);
2098                         return (PCAP_ERROR_RFMON_NOTSUP);
2099                 }
2100                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "SIOCGIFMEDIA 1: %s",
2101                     pcap_strerror(errno));
2102                 close(sock);
2103                 return (PCAP_ERROR);
2104         }
2105         if (req.ifm_count == 0) {
2106                 /*
2107                  * No media types.
2108                  */
2109                 close(sock);
2110                 return (PCAP_ERROR_RFMON_NOTSUP);
2111         }
2112
2113         /*
2114          * Allocate a buffer to hold all the media types, and
2115          * get the media types.
2116          */
2117         media_list = malloc(req.ifm_count * sizeof(int));
2118         if (media_list == NULL) {
2119                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "malloc: %s",
2120                     pcap_strerror(errno));
2121                 close(sock);
2122                 return (PCAP_ERROR);
2123         }
2124         req.ifm_ulist = media_list;
2125         if (ioctl(sock, SIOCGIFMEDIA, &req) < 0) {
2126                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "SIOCGIFMEDIA: %s",
2127                     pcap_strerror(errno));
2128                 free(media_list);
2129                 close(sock);
2130                 return (PCAP_ERROR);
2131         }
2132
2133         /*
2134          * Look for an 802.11 "automatic" media type.
2135          * We assume that all 802.11 adapters have that media type,
2136          * and that it will carry the monitor mode supported flag.
2137          */
2138         can_do = 0;
2139         for (i = 0; i < req.ifm_count; i++) {
2140                 if (IFM_TYPE(media_list[i]) == IFM_IEEE80211
2141                     && IFM_SUBTYPE(media_list[i]) == IFM_AUTO) {
2142                         /* OK, does it do monitor mode? */
2143                         if (media_list[i] & IFM_IEEE80211_MONITOR) {
2144                                 can_do = 1;
2145                                 break;
2146                         }
2147                 }
2148         }
2149         free(media_list);
2150         if (!can_do) {
2151                 /*
2152                  * This adapter doesn't support monitor mode.
2153                  */
2154                 close(sock);
2155                 return (PCAP_ERROR_RFMON_NOTSUP);
2156         }
2157
2158         if (set) {
2159                 /*
2160                  * Don't just check whether we can enable monitor mode,
2161                  * do so, if it's not already enabled.
2162                  */
2163                 if ((req.ifm_current & IFM_IEEE80211_MONITOR) == 0) {
2164                         /*
2165                          * Monitor mode isn't currently on, so turn it on,
2166                          * and remember that we should turn it off when the
2167                          * pcap_t is closed.
2168                          */
2169
2170                         /*
2171                          * If we haven't already done so, arrange to have
2172                          * "pcap_close_all()" called when we exit.
2173                          */
2174                         if (!pcap_do_addexit(p)) {
2175                                 /*
2176                                  * "atexit()" failed; don't put the interface
2177                                  * in monitor mode, just give up.
2178                                  */
2179                                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
2180                                      "atexit failed");
2181                                 close(sock);
2182                                 return (PCAP_ERROR);
2183                         }
2184                         memset(&ifr, 0, sizeof(ifr));
2185                         (void)strncpy(ifr.ifr_name, p->opt.source,
2186                             sizeof(ifr.ifr_name));
2187                         ifr.ifr_media = req.ifm_current | IFM_IEEE80211_MONITOR;
2188                         if (ioctl(sock, SIOCSIFMEDIA, &ifr) == -1) {
2189                                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
2190                                      "SIOCSIFMEDIA: %s", pcap_strerror(errno));
2191                                 close(sock);
2192                                 return (PCAP_ERROR);
2193                         }
2194
2195                         p->md.must_clear |= MUST_CLEAR_RFMON;
2196
2197                         /*
2198                          * Add this to the list of pcaps to close when we exit.
2199                          */
2200                         pcap_add_to_pcaps_to_close(p);
2201                 }
2202         }
2203         return (0);
2204 }
2205 #endif /* HAVE_BSD_IEEE80211 */
2206
2207 #if defined(BIOCGDLTLIST) && (defined(__APPLE__) || defined(HAVE_BSD_IEEE80211))
2208 /*
2209  * Check whether we have any 802.11 link-layer types; return the best
2210  * of the 802.11 link-layer types if we find one, and return -1
2211  * otherwise.
2212  *
2213  * DLT_IEEE802_11_RADIO, with the radiotap header, is considered the
2214  * best 802.11 link-layer type; any of the other 802.11-plus-radio
2215  * headers are second-best; 802.11 with no radio information is
2216  * the least good.
2217  */
2218 static int
2219 find_802_11(struct bpf_dltlist *bdlp)
2220 {
2221         int new_dlt;
2222         int i;
2223
2224         /*
2225          * Scan the list of DLT_ values, looking for 802.11 values,
2226          * and, if we find any, choose the best of them.
2227          */
2228         new_dlt = -1;
2229         for (i = 0; i < bdlp->bfl_len; i++) {
2230                 switch (bdlp->bfl_list[i]) {
2231
2232                 case DLT_IEEE802_11:
2233                         /*
2234                          * 802.11, but no radio.
2235                          *
2236                          * Offer this, and select it as the new mode
2237                          * unless we've already found an 802.11
2238                          * header with radio information.
2239                          */
2240                         if (new_dlt == -1)
2241                                 new_dlt = bdlp->bfl_list[i];
2242                         break;
2243
2244                 case DLT_PRISM_HEADER:
2245                 case DLT_AIRONET_HEADER:
2246                 case DLT_IEEE802_11_RADIO_AVS:
2247                         /*
2248                          * 802.11 with radio, but not radiotap.
2249                          *
2250                          * Offer this, and select it as the new mode
2251                          * unless we've already found the radiotap DLT_.
2252                          */
2253                         if (new_dlt != DLT_IEEE802_11_RADIO)
2254                                 new_dlt = bdlp->bfl_list[i];
2255                         break;
2256
2257                 case DLT_IEEE802_11_RADIO:
2258                         /*
2259                          * 802.11 with radiotap.
2260                          *
2261                          * Offer this, and select it as the new mode.
2262                          */
2263                         new_dlt = bdlp->bfl_list[i];
2264                         break;
2265
2266                 default:
2267                         /*
2268                          * Not 802.11.
2269                          */
2270                         break;
2271                 }
2272         }
2273
2274         return (new_dlt);
2275 }
2276 #endif /* defined(BIOCGDLTLIST) && (defined(__APPLE__) || defined(HAVE_BSD_IEEE80211)) */
2277
2278 #if defined(__APPLE__) && defined(BIOCGDLTLIST)
2279 /*
2280  * Remove DLT_EN10MB from the list of DLT_ values.
2281  */
2282 static void
2283 remove_en(pcap_t *p)
2284 {
2285         int i, j;
2286
2287         /*
2288          * Scan the list of DLT_ values and discard DLT_EN10MB.
2289          */
2290         j = 0;
2291         for (i = 0; i < p->dlt_count; i++) {
2292                 switch (p->dlt_list[i]) {
2293
2294                 case DLT_EN10MB:
2295                         /*
2296                          * Don't offer this one.
2297                          */
2298                         continue;
2299
2300                 default:
2301                         /*
2302                          * Just copy this mode over.
2303                          */
2304                         break;
2305                 }
2306
2307                 /*
2308                  * Copy this DLT_ value to its new position.
2309                  */
2310                 p->dlt_list[j] = p->dlt_list[i];
2311                 j++;
2312         }
2313
2314         /*
2315          * Set the DLT_ count to the number of entries we copied.
2316          */
2317         p->dlt_count = j;
2318 }
2319
2320 /*
2321  * Remove DLT_EN10MB from the list of DLT_ values, and look for the
2322  * best 802.11 link-layer type in that list and return it.
2323  * Radiotap is better than anything else; 802.11 with any other radio
2324  * header is better than 802.11 with no radio header.
2325  */
2326 static void
2327 remove_802_11(pcap_t *p)
2328 {
2329         int i, j;
2330
2331         /*
2332          * Scan the list of DLT_ values and discard 802.11 values.
2333          */
2334         j = 0;
2335         for (i = 0; i < p->dlt_count; i++) {
2336                 switch (p->dlt_list[i]) {
2337
2338                 case DLT_IEEE802_11:
2339                 case DLT_PRISM_HEADER:
2340                 case DLT_AIRONET_HEADER:
2341                 case DLT_IEEE802_11_RADIO:
2342                 case DLT_IEEE802_11_RADIO_AVS:
2343                         /*
2344                          * 802.11.  Don't offer this one.
2345                          */
2346                         continue;
2347
2348                 default:
2349                         /*
2350                          * Just copy this mode over.
2351                          */
2352                         break;
2353                 }
2354
2355                 /*
2356                  * Copy this DLT_ value to its new position.
2357                  */
2358                 p->dlt_list[j] = p->dlt_list[i];
2359                 j++;
2360         }
2361
2362         /*
2363          * Set the DLT_ count to the number of entries we copied.
2364          */
2365         p->dlt_count = j;
2366 }
2367 #endif /* defined(__APPLE__) && defined(BIOCGDLTLIST) */
2368
2369 static int
2370 pcap_setfilter_bpf(pcap_t *p, struct bpf_program *fp)
2371 {
2372         /*
2373          * Free any user-mode filter we might happen to have installed.
2374          */
2375         pcap_freecode(&p->fcode);
2376
2377         /*
2378          * Try to install the kernel filter.
2379          */
2380         if (ioctl(p->fd, BIOCSETF, (caddr_t)fp) == 0) {
2381                 /*
2382                  * It worked.
2383                  */
2384                 p->md.use_bpf = 1;      /* filtering in the kernel */
2385
2386                 /*
2387                  * Discard any previously-received packets, as they might
2388                  * have passed whatever filter was formerly in effect, but
2389                  * might not pass this filter (BIOCSETF discards packets
2390                  * buffered in the kernel, so you can lose packets in any
2391                  * case).
2392                  */
2393                 p->cc = 0;
2394                 return (0);
2395         }
2396
2397         /*
2398          * We failed.
2399          *
2400          * If it failed with EINVAL, that's probably because the program
2401          * is invalid or too big.  Validate it ourselves; if we like it
2402          * (we currently allow backward branches, to support protochain),
2403          * run it in userland.  (There's no notion of "too big" for
2404          * userland.)
2405          *
2406          * Otherwise, just give up.
2407          * XXX - if the copy of the program into the kernel failed,
2408          * we will get EINVAL rather than, say, EFAULT on at least
2409          * some kernels.
2410          */
2411         if (errno != EINVAL) {
2412                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCSETF: %s",
2413                     pcap_strerror(errno));
2414                 return (-1);
2415         }
2416
2417         /*
2418          * install_bpf_program() validates the program.
2419          *
2420          * XXX - what if we already have a filter in the kernel?
2421          */
2422         if (install_bpf_program(p, fp) < 0)
2423                 return (-1);
2424         p->md.use_bpf = 0;      /* filtering in userland */
2425         return (0);
2426 }
2427
2428 /*
2429  * Set direction flag: Which packets do we accept on a forwarding
2430  * single device? IN, OUT or both?
2431  */
2432 static int
2433 pcap_setdirection_bpf(pcap_t *p, pcap_direction_t d)
2434 {
2435 #if defined(BIOCSDIRECTION)
2436         u_int direction;
2437
2438         direction = (d == PCAP_D_IN) ? BPF_D_IN :
2439             ((d == PCAP_D_OUT) ? BPF_D_OUT : BPF_D_INOUT);
2440         if (ioctl(p->fd, BIOCSDIRECTION, &direction) == -1) {
2441                 (void) snprintf(p->errbuf, sizeof(p->errbuf),
2442                     "Cannot set direction to %s: %s",
2443                         (d == PCAP_D_IN) ? "PCAP_D_IN" :
2444                         ((d == PCAP_D_OUT) ? "PCAP_D_OUT" : "PCAP_D_INOUT"),
2445                         strerror(errno));
2446                 return (-1);
2447         }
2448         return (0);
2449 #elif defined(BIOCSSEESENT)
2450         u_int seesent;
2451
2452         /*
2453          * We don't support PCAP_D_OUT.
2454          */
2455         if (d == PCAP_D_OUT) {
2456                 snprintf(p->errbuf, sizeof(p->errbuf),
2457                     "Setting direction to PCAP_D_OUT is not supported on BPF");
2458                 return -1;
2459         }
2460
2461         seesent = (d == PCAP_D_INOUT);
2462         if (ioctl(p->fd, BIOCSSEESENT, &seesent) == -1) {
2463                 (void) snprintf(p->errbuf, sizeof(p->errbuf),
2464                     "Cannot set direction to %s: %s",
2465                         (d == PCAP_D_INOUT) ? "PCAP_D_INOUT" : "PCAP_D_IN",
2466                         strerror(errno));
2467                 return (-1);
2468         }
2469         return (0);
2470 #else
2471         (void) snprintf(p->errbuf, sizeof(p->errbuf),
2472             "This system doesn't support BIOCSSEESENT, so the direction can't be set");
2473         return (-1);
2474 #endif
2475 }
2476
2477 static int
2478 pcap_set_datalink_bpf(pcap_t *p, int dlt)
2479 {
2480 #ifdef BIOCSDLT
2481         if (ioctl(p->fd, BIOCSDLT, &dlt) == -1) {
2482                 (void) snprintf(p->errbuf, sizeof(p->errbuf),
2483                     "Cannot set DLT %d: %s", dlt, strerror(errno));
2484                 return (-1);
2485         }
2486 #endif
2487         return (0);
2488 }