]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/libpcap/pcap-bpf.c
This commit was generated by cvs2svn to compensate for changes in r170256,
[FreeBSD/FreeBSD.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  * $FreeBSD$
22  */
23 #ifndef lint
24 static const char rcsid[] _U_ =
25     "@(#) $Header: /tcpdump/master/libpcap/pcap-bpf.c,v 1.86.2.8 2005/07/10 10:55:31 guy Exp $ (LBL)";
26 #endif
27
28 #ifdef HAVE_CONFIG_H
29 #include "config.h"
30 #endif
31
32 #include <sys/param.h>                  /* optionally get BSD define */
33 #include <sys/time.h>
34 #include <sys/timeb.h>
35 #include <sys/socket.h>
36 #include <sys/file.h>
37 #include <sys/ioctl.h>
38 #include <sys/utsname.h>
39
40 #include <net/if.h>
41
42 #ifdef _AIX
43
44 /*
45  * Make "pcap.h" not include "pcap-bpf.h"; we are going to include the
46  * native OS version, as we need "struct bpf_config" from it.
47  */
48 #define PCAP_DONT_INCLUDE_PCAP_BPF_H
49
50 #include <sys/types.h>
51
52 /*
53  * Prevent bpf.h from redefining the DLT_ values to their
54  * IFT_ values, as we're going to return the standard libpcap
55  * values, not IBM's non-standard IFT_ values.
56  */
57 #undef _AIX
58 #include <net/bpf.h>
59 #define _AIX
60
61 #include <net/if_types.h>               /* for IFT_ values */
62 #include <sys/sysconfig.h>
63 #include <sys/device.h>
64 #include <sys/cfgodm.h>
65 #include <cf.h>
66
67 #ifdef __64BIT__
68 #define domakedev makedev64
69 #define getmajor major64
70 #define bpf_hdr bpf_hdr32
71 #else /* __64BIT__ */
72 #define domakedev makedev
73 #define getmajor major
74 #endif /* __64BIT__ */
75
76 #define BPF_NAME "bpf"
77 #define BPF_MINORS 4
78 #define DRIVER_PATH "/usr/lib/drivers"
79 #define BPF_NODE "/dev/bpf"
80 static int bpfloadedflag = 0;
81 static int odmlockid = 0;
82
83 #else /* _AIX */
84
85 #include <net/bpf.h>
86
87 #endif /* _AIX */
88
89 #include <ctype.h>
90 #include <errno.h>
91 #include <netdb.h>
92 #include <stdio.h>
93 #include <stdlib.h>
94 #include <string.h>
95 #include <unistd.h>
96
97 #include "pcap-int.h"
98
99 #ifdef HAVE_DAG_API
100 #include "pcap-dag.h"
101 #endif /* HAVE_DAG_API */
102
103 #ifdef HAVE_OS_PROTO_H
104 #include "os-proto.h"
105 #endif
106
107 #include "gencode.h"    /* for "no_optimize" */
108
109 static int pcap_setfilter_bpf(pcap_t *p, struct bpf_program *fp);
110 static int pcap_setdirection_bpf(pcap_t *, pcap_direction_t);
111 static int pcap_set_datalink_bpf(pcap_t *p, int dlt);
112
113 static int
114 pcap_stats_bpf(pcap_t *p, struct pcap_stat *ps)
115 {
116         struct bpf_stat s;
117
118         /*
119          * "ps_recv" counts packets handed to the filter, not packets
120          * that passed the filter.  This includes packets later dropped
121          * because we ran out of buffer space.
122          *
123          * "ps_drop" counts packets dropped inside the BPF device
124          * because we ran out of buffer space.  It doesn't count
125          * packets dropped by the interface driver.  It counts
126          * only packets that passed the filter.
127          *
128          * Both statistics include packets not yet read from the kernel
129          * by libpcap, and thus not yet seen by the application.
130          */
131         if (ioctl(p->fd, BIOCGSTATS, (caddr_t)&s) < 0) {
132                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCGSTATS: %s",
133                     pcap_strerror(errno));
134                 return (-1);
135         }
136
137         ps->ps_recv = s.bs_recv;
138         ps->ps_drop = s.bs_drop;
139         return (0);
140 }
141
142 static int
143 pcap_read_bpf(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
144 {
145         int cc;
146         int n = 0;
147         register u_char *bp, *ep;
148         u_char *datap;
149         struct bpf_insn *fcode;
150 #ifdef PCAP_FDDIPAD
151         register int pad;
152 #endif
153
154         fcode = p->md.use_bpf ? NULL : p->fcode.bf_insns;
155  again:
156         /*
157          * Has "pcap_breakloop()" been called?
158          */
159         if (p->break_loop) {
160                 /*
161                  * Yes - clear the flag that indicates that it
162                  * has, and return -2 to indicate that we were
163                  * told to break out of the loop.
164                  */
165                 p->break_loop = 0;
166                 return (-2);
167         }
168         cc = p->cc;
169         if (p->cc == 0) {
170                 cc = read(p->fd, (char *)p->buffer, p->bufsize);
171                 if (cc < 0) {
172                         /* Don't choke when we get ptraced */
173                         switch (errno) {
174
175                         case EINTR:
176                                 goto again;
177
178 #ifdef _AIX
179                         case EFAULT:
180                                 /*
181                                  * Sigh.  More AIX wonderfulness.
182                                  *
183                                  * For some unknown reason the uiomove()
184                                  * operation in the bpf kernel extension
185                                  * used to copy the buffer into user 
186                                  * space sometimes returns EFAULT. I have
187                                  * no idea why this is the case given that
188                                  * a kernel debugger shows the user buffer 
189                                  * is correct. This problem appears to 
190                                  * be mostly mitigated by the memset of 
191                                  * the buffer before it is first used. 
192                                  * Very strange.... Shaun Clowes
193                                  *
194                                  * In any case this means that we shouldn't 
195                                  * treat EFAULT as a fatal error; as we
196                                  * don't have an API for returning
197                                  * a "some packets were dropped since
198                                  * the last packet you saw" indication,
199                                  * we just ignore EFAULT and keep reading.
200                                  */
201                                 goto again;
202 #endif 
203   
204                         case EWOULDBLOCK:
205                                 return (0);
206 #if defined(sun) && !defined(BSD)
207                         /*
208                          * Due to a SunOS bug, after 2^31 bytes, the kernel
209                          * file offset overflows and read fails with EINVAL.
210                          * The lseek() to 0 will fix things.
211                          */
212                         case EINVAL:
213                                 if (lseek(p->fd, 0L, SEEK_CUR) +
214                                     p->bufsize < 0) {
215                                         (void)lseek(p->fd, 0L, SEEK_SET);
216                                         goto again;
217                                 }
218                                 /* fall through */
219 #endif
220                         }
221                         snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "read: %s",
222                             pcap_strerror(errno));
223                         return (-1);
224                 }
225                 bp = p->buffer;
226         } else
227                 bp = p->bp;
228
229         /*
230          * Loop through each packet.
231          */
232 #define bhp ((struct bpf_hdr *)bp)
233         ep = bp + cc;
234 #ifdef PCAP_FDDIPAD
235         pad = p->fddipad;
236 #endif
237         while (bp < ep) {
238                 register int caplen, hdrlen;
239
240                 /*
241                  * Has "pcap_breakloop()" been called?
242                  * If so, return immediately - if we haven't read any
243                  * packets, clear the flag and return -2 to indicate
244                  * that we were told to break out of the loop, otherwise
245                  * leave the flag set, so that the *next* call will break
246                  * out of the loop without having read any packets, and
247                  * return the number of packets we've processed so far.
248                  */
249                 if (p->break_loop) {
250                         if (n == 0) {
251                                 p->break_loop = 0;
252                                 return (-2);
253                         } else {
254                                 p->bp = bp;
255                                 p->cc = ep - bp;
256                                 return (n);
257                         }
258                 }
259
260                 caplen = bhp->bh_caplen;
261                 hdrlen = bhp->bh_hdrlen;
262                 datap = bp + hdrlen;
263                 /*
264                  * Short-circuit evaluation: if using BPF filter
265                  * in kernel, no need to do it now.
266                  *
267 #ifdef PCAP_FDDIPAD
268                  * Note: the filter code was generated assuming
269                  * that p->fddipad was the amount of padding
270                  * before the header, as that's what's required
271                  * in the kernel, so we run the filter before
272                  * skipping that padding.
273 #endif
274                  */
275                 if (fcode == NULL ||
276                     bpf_filter(fcode, datap, bhp->bh_datalen, caplen)) {
277                         struct pcap_pkthdr pkthdr;
278
279                         pkthdr.ts.tv_sec = bhp->bh_tstamp.tv_sec;
280 #ifdef _AIX
281                         /*
282                          * AIX's BPF returns seconds/nanoseconds time
283                          * stamps, not seconds/microseconds time stamps.
284                          */
285                         pkthdr.ts.tv_usec = bhp->bh_tstamp.tv_usec/1000;
286 #else
287                         pkthdr.ts.tv_usec = bhp->bh_tstamp.tv_usec;
288 #endif
289 #ifdef PCAP_FDDIPAD
290                         if (caplen > pad)
291                                 pkthdr.caplen = caplen - pad;
292                         else
293                                 pkthdr.caplen = 0;
294                         if (bhp->bh_datalen > pad)
295                                 pkthdr.len = bhp->bh_datalen - pad;
296                         else
297                                 pkthdr.len = 0;
298                         datap += pad;
299 #else
300                         pkthdr.caplen = caplen;
301                         pkthdr.len = bhp->bh_datalen;
302 #endif
303                         (*callback)(user, &pkthdr, datap);
304                         bp += BPF_WORDALIGN(caplen + hdrlen);
305                         if (++n >= cnt && cnt > 0) {
306                                 p->bp = bp;
307                                 p->cc = ep - bp;
308                                 return (n);
309                         }
310                 } else {
311                         /*
312                          * Skip this packet.
313                          */
314                         bp += BPF_WORDALIGN(caplen + hdrlen);
315                 }
316         }
317 #undef bhp
318         p->cc = 0;
319         return (n);
320 }
321
322 static int
323 pcap_inject_bpf(pcap_t *p, const void *buf, size_t size)
324 {
325         int ret;
326
327         ret = write(p->fd, buf, size);
328 #ifdef __APPLE__
329         if (ret == -1 && errno == EAFNOSUPPORT) {
330                 /*
331                  * In Mac OS X, there's a bug wherein setting the
332                  * BIOCSHDRCMPLT flag causes writes to fail; see,
333                  * for example:
334                  *
335                  *      http://cerberus.sourcefire.com/~jeff/archives/patches/macosx/BIOCSHDRCMPLT-10.3.3.patch
336                  *
337                  * So, if, on OS X, we get EAFNOSUPPORT from the write, we
338                  * assume it's due to that bug, and turn off that flag
339                  * and try again.  If we succeed, it either means that
340                  * somebody applied the fix from that URL, or other patches
341                  * for that bug from
342                  *
343                  *      http://cerberus.sourcefire.com/~jeff/archives/patches/macosx/
344                  *
345                  * and are running a Darwin kernel with those fixes, or
346                  * that Apple fixed the problem in some OS X release.
347                  */
348                 u_int spoof_eth_src = 0;
349
350                 if (ioctl(p->fd, BIOCSHDRCMPLT, &spoof_eth_src) == -1) {
351                         (void)snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
352                             "send: can't turn off BIOCSHDRCMPLT: %s",
353                             pcap_strerror(errno));
354                         return (-1);
355                 }
356
357                 /*
358                  * Now try the write again.
359                  */
360                 ret = write(p->fd, buf, size);
361         }
362 #endif /* __APPLE__ */
363         if (ret == -1) {
364                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "send: %s",
365                     pcap_strerror(errno));
366                 return (-1);
367         }
368         return (ret);
369 }
370
371 #ifdef _AIX
372 static int 
373 bpf_odminit(char *errbuf)
374 {
375         char *errstr;
376
377         if (odm_initialize() == -1) {
378                 if (odm_err_msg(odmerrno, &errstr) == -1)
379                         errstr = "Unknown error";
380                 snprintf(errbuf, PCAP_ERRBUF_SIZE,
381                     "bpf_load: odm_initialize failed: %s",
382                     errstr);
383                 return (-1);
384         }
385
386         if ((odmlockid = odm_lock("/etc/objrepos/config_lock", ODM_WAIT)) == -1) {
387                 if (odm_err_msg(odmerrno, &errstr) == -1)
388                         errstr = "Unknown error";
389                 snprintf(errbuf, PCAP_ERRBUF_SIZE,
390                     "bpf_load: odm_lock of /etc/objrepos/config_lock failed: %s",
391                     errstr);
392                 return (-1);
393         }
394
395         return (0);
396 }
397
398 static int 
399 bpf_odmcleanup(char *errbuf)
400 {
401         char *errstr;
402
403         if (odm_unlock(odmlockid) == -1) {
404                 if (odm_err_msg(odmerrno, &errstr) == -1)
405                         errstr = "Unknown error";
406                 snprintf(errbuf, PCAP_ERRBUF_SIZE,
407                     "bpf_load: odm_unlock failed: %s",
408                     errstr);
409                 return (-1);
410         }
411
412         if (odm_terminate() == -1) {
413                 if (odm_err_msg(odmerrno, &errstr) == -1)
414                         errstr = "Unknown error";
415                 snprintf(errbuf, PCAP_ERRBUF_SIZE,
416                     "bpf_load: odm_terminate failed: %s",
417                     errstr);
418                 return (-1);
419         }
420
421         return (0);
422 }
423
424 static int
425 bpf_load(char *errbuf)
426 {
427         long major;
428         int *minors;
429         int numminors, i, rc;
430         char buf[1024];
431         struct stat sbuf;
432         struct bpf_config cfg_bpf;
433         struct cfg_load cfg_ld;
434         struct cfg_kmod cfg_km;
435
436         /*
437          * This is very very close to what happens in the real implementation
438          * but I've fixed some (unlikely) bug situations.
439          */
440         if (bpfloadedflag)
441                 return (0);
442
443         if (bpf_odminit(errbuf) != 0)
444                 return (-1);
445
446         major = genmajor(BPF_NAME);
447         if (major == -1) {
448                 snprintf(errbuf, PCAP_ERRBUF_SIZE,
449                     "bpf_load: genmajor failed: %s", pcap_strerror(errno));
450                 return (-1);
451         }
452
453         minors = getminor(major, &numminors, BPF_NAME);
454         if (!minors) {
455                 minors = genminor("bpf", major, 0, BPF_MINORS, 1, 1);
456                 if (!minors) {
457                         snprintf(errbuf, PCAP_ERRBUF_SIZE,
458                             "bpf_load: genminor failed: %s",
459                             pcap_strerror(errno));
460                         return (-1);
461                 }
462         }
463
464         if (bpf_odmcleanup(errbuf))
465                 return (-1);
466
467         rc = stat(BPF_NODE "0", &sbuf);
468         if (rc == -1 && errno != ENOENT) {
469                 snprintf(errbuf, PCAP_ERRBUF_SIZE,
470                     "bpf_load: can't stat %s: %s",
471                     BPF_NODE "0", pcap_strerror(errno));
472                 return (-1);
473         }
474
475         if (rc == -1 || getmajor(sbuf.st_rdev) != major) {
476                 for (i = 0; i < BPF_MINORS; i++) {
477                         sprintf(buf, "%s%d", BPF_NODE, i);
478                         unlink(buf);
479                         if (mknod(buf, S_IRUSR | S_IFCHR, domakedev(major, i)) == -1) {
480                                 snprintf(errbuf, PCAP_ERRBUF_SIZE,
481                                     "bpf_load: can't mknod %s: %s",
482                                     buf, pcap_strerror(errno));
483                                 return (-1);
484                         }
485                 }
486         }
487
488         /* Check if the driver is loaded */
489         memset(&cfg_ld, 0x0, sizeof(cfg_ld));
490         cfg_ld.path = buf;
491         sprintf(cfg_ld.path, "%s/%s", DRIVER_PATH, BPF_NAME);
492         if ((sysconfig(SYS_QUERYLOAD, (void *)&cfg_ld, sizeof(cfg_ld)) == -1) ||
493             (cfg_ld.kmid == 0)) {
494                 /* Driver isn't loaded, load it now */
495                 if (sysconfig(SYS_SINGLELOAD, (void *)&cfg_ld, sizeof(cfg_ld)) == -1) {
496                         snprintf(errbuf, PCAP_ERRBUF_SIZE,
497                             "bpf_load: could not load driver: %s",
498                             strerror(errno));
499                         return (-1);
500                 }
501         }
502
503         /* Configure the driver */
504         cfg_km.cmd = CFG_INIT;
505         cfg_km.kmid = cfg_ld.kmid;
506         cfg_km.mdilen = sizeof(cfg_bpf);
507         cfg_km.mdiptr = (void *)&cfg_bpf; 
508         for (i = 0; i < BPF_MINORS; i++) {
509                 cfg_bpf.devno = domakedev(major, i);
510                 if (sysconfig(SYS_CFGKMOD, (void *)&cfg_km, sizeof(cfg_km)) == -1) {
511                         snprintf(errbuf, PCAP_ERRBUF_SIZE,
512                             "bpf_load: could not configure driver: %s",
513                             strerror(errno));
514                         return (-1);
515                 }
516         }
517         
518         bpfloadedflag = 1;
519
520         return (0);
521 }
522 #endif
523
524 static inline int
525 bpf_open(pcap_t *p, char *errbuf)
526 {
527         int fd;
528         int n = 0;
529         char device[sizeof "/dev/bpf0000000000"];
530
531 #ifdef _AIX
532         /*
533          * Load the bpf driver, if it isn't already loaded,
534          * and create the BPF device entries, if they don't
535          * already exist.
536          */
537         if (bpf_load(errbuf) == -1)
538                 return (-1);
539 #endif
540
541         /*
542          * Go through all the minors and find one that isn't in use.
543          */
544         do {
545                 (void)snprintf(device, sizeof(device), "/dev/bpf%d", n++);
546                 /*
547                  * Initially try a read/write open (to allow the inject
548                  * method to work).  If that fails due to permission
549                  * issues, fall back to read-only.  This allows a
550                  * non-root user to be granted specific access to pcap
551                  * capabilities via file permissions.
552                  *
553                  * XXX - we should have an API that has a flag that
554                  * controls whether to open read-only or read-write,
555                  * so that denial of permission to send (or inability
556                  * to send, if sending packets isn't supported on
557                  * the device in question) can be indicated at open
558                  * time.
559                  */
560                 fd = open(device, O_RDWR);
561                 if (fd == -1 && errno == EACCES)
562                         fd = open(device, O_RDONLY);
563         } while (fd < 0 && errno == EBUSY);
564
565         /*
566          * XXX better message for all minors used
567          */
568         if (fd < 0)
569                 snprintf(errbuf, PCAP_ERRBUF_SIZE, "(no devices found) %s: %s",
570                     device, pcap_strerror(errno));
571
572         return (fd);
573 }
574
575 /*
576  * We include the OS's <net/bpf.h>, not our "pcap-bpf.h", so we probably
577  * don't get DLT_DOCSIS defined.
578  */
579 #ifndef DLT_DOCSIS
580 #define DLT_DOCSIS      143
581 #endif
582
583 pcap_t *
584 pcap_open_live(const char *device, int snaplen, int promisc, int to_ms,
585     char *ebuf)
586 {
587         int fd;
588         struct ifreq ifr;
589         struct bpf_version bv;
590 #ifdef BIOCGDLTLIST
591         struct bpf_dltlist bdl;
592 #endif
593 #if defined(BIOCGHDRCMPLT) && defined(BIOCSHDRCMPLT)
594         u_int spoof_eth_src = 1;
595 #endif
596         u_int v;
597         pcap_t *p;
598         struct bpf_insn total_insn;
599         struct bpf_program total_prog;
600         struct utsname osinfo;
601
602 #ifdef HAVE_DAG_API
603         if (strstr(device, "dag")) {
604                 return dag_open_live(device, snaplen, promisc, to_ms, ebuf);
605         }
606 #endif /* HAVE_DAG_API */
607
608 #ifdef BIOCGDLTLIST
609         memset(&bdl, 0, sizeof(bdl));
610 #endif
611
612         p = (pcap_t *)malloc(sizeof(*p));
613         if (p == NULL) {
614                 snprintf(ebuf, PCAP_ERRBUF_SIZE, "malloc: %s",
615                     pcap_strerror(errno));
616                 return (NULL);
617         }
618         memset(p, 0, sizeof(*p));
619         fd = bpf_open(p, ebuf);
620         if (fd < 0)
621                 goto bad;
622
623         p->fd = fd;
624         p->snapshot = snaplen;
625
626         if (ioctl(fd, BIOCVERSION, (caddr_t)&bv) < 0) {
627                 snprintf(ebuf, PCAP_ERRBUF_SIZE, "BIOCVERSION: %s",
628                     pcap_strerror(errno));
629                 goto bad;
630         }
631         if (bv.bv_major != BPF_MAJOR_VERSION ||
632             bv.bv_minor < BPF_MINOR_VERSION) {
633                 snprintf(ebuf, PCAP_ERRBUF_SIZE,
634                     "kernel bpf filter out of date");
635                 goto bad;
636         }
637
638         /*
639          * Try finding a good size for the buffer; 32768 may be too
640          * big, so keep cutting it in half until we find a size
641          * that works, or run out of sizes to try.  If the default
642          * is larger, don't make it smaller.
643          *
644          * XXX - there should be a user-accessible hook to set the
645          * initial buffer size.
646          */
647         if ((ioctl(fd, BIOCGBLEN, (caddr_t)&v) < 0) || v < 32768)
648                 v = 32768;
649         for ( ; v != 0; v >>= 1) {
650                 /* Ignore the return value - this is because the call fails
651                  * on BPF systems that don't have kernel malloc.  And if
652                  * the call fails, it's no big deal, we just continue to
653                  * use the standard buffer size.
654                  */
655                 (void) ioctl(fd, BIOCSBLEN, (caddr_t)&v);
656
657                 (void)strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name));
658                 if (ioctl(fd, BIOCSETIF, (caddr_t)&ifr) >= 0)
659                         break;  /* that size worked; we're done */
660
661                 if (errno != ENOBUFS) {
662                         snprintf(ebuf, PCAP_ERRBUF_SIZE, "BIOCSETIF: %s: %s",
663                             device, pcap_strerror(errno));
664                         goto bad;
665                 }
666         }
667
668         if (v == 0) {
669                 snprintf(ebuf, PCAP_ERRBUF_SIZE,
670                          "BIOCSBLEN: %s: No buffer size worked", device);
671                 goto bad;
672         }
673
674         /* Get the data link layer type. */
675         if (ioctl(fd, BIOCGDLT, (caddr_t)&v) < 0) {
676                 snprintf(ebuf, PCAP_ERRBUF_SIZE, "BIOCGDLT: %s",
677                     pcap_strerror(errno));
678                 goto bad;
679         }
680 #ifdef _AIX
681         /*
682          * AIX's BPF returns IFF_ types, not DLT_ types, in BIOCGDLT.
683          */
684         switch (v) {
685
686         case IFT_ETHER:
687         case IFT_ISO88023:
688                 v = DLT_EN10MB;
689                 break;
690
691         case IFT_FDDI:
692                 v = DLT_FDDI;
693                 break;
694
695         case IFT_ISO88025:
696                 v = DLT_IEEE802;
697                 break;
698
699         case IFT_LOOP:
700                 v = DLT_NULL;
701                 break;
702
703         default:
704                 /*
705                  * We don't know what to map this to yet.
706                  */
707                 snprintf(ebuf, PCAP_ERRBUF_SIZE, "unknown interface type %u",
708                     v);
709                 goto bad;
710         }
711 #endif
712 #if _BSDI_VERSION - 0 >= 199510
713         /* The SLIP and PPP link layer header changed in BSD/OS 2.1 */
714         switch (v) {
715
716         case DLT_SLIP:
717                 v = DLT_SLIP_BSDOS;
718                 break;
719
720         case DLT_PPP:
721                 v = DLT_PPP_BSDOS;
722                 break;
723
724         case 11:        /*DLT_FR*/
725                 v = DLT_FRELAY;
726                 break;
727
728         case 12:        /*DLT_C_HDLC*/
729                 v = DLT_CHDLC;
730                 break;
731         }
732 #endif
733 #ifdef PCAP_FDDIPAD
734         if (v == DLT_FDDI)
735                 p->fddipad = PCAP_FDDIPAD;
736         else
737                 p->fddipad = 0;
738 #endif
739         p->linktype = v;
740
741 #ifdef BIOCGDLTLIST
742         /*
743          * We know the default link type -- now determine all the DLTs
744          * this interface supports.  If this fails with EINVAL, it's
745          * not fatal; we just don't get to use the feature later.
746          */
747         if (ioctl(fd, BIOCGDLTLIST, (caddr_t)&bdl) == 0) {
748                 u_int i;
749                 int is_ethernet;
750
751                 bdl.bfl_list = (u_int *) malloc(sizeof(u_int) * (bdl.bfl_len + 1));
752                 if (bdl.bfl_list == NULL) {
753                         (void)snprintf(ebuf, PCAP_ERRBUF_SIZE, "malloc: %s",
754                             pcap_strerror(errno));
755                         goto bad;
756                 }
757
758                 if (ioctl(fd, BIOCGDLTLIST, (caddr_t)&bdl) < 0) {
759                         (void)snprintf(ebuf, PCAP_ERRBUF_SIZE,
760                             "BIOCGDLTLIST: %s", pcap_strerror(errno));
761                         free(bdl.bfl_list);
762                         goto bad;
763                 }
764
765                 /*
766                  * OK, for real Ethernet devices, add DLT_DOCSIS to the
767                  * list, so that an application can let you choose it,
768                  * in case you're capturing DOCSIS traffic that a Cisco
769                  * Cable Modem Termination System is putting out onto
770                  * an Ethernet (it doesn't put an Ethernet header onto
771                  * the wire, it puts raw DOCSIS frames out on the wire
772                  * inside the low-level Ethernet framing).
773                  *
774                  * A "real Ethernet device" is defined here as a device
775                  * that has a link-layer type of DLT_EN10MB and that has
776                  * no alternate link-layer types; that's done to exclude
777                  * 802.11 interfaces (which might or might not be the
778                  * right thing to do, but I suspect it is - Ethernet <->
779                  * 802.11 bridges would probably badly mishandle frames
780                  * that don't have Ethernet headers).
781                  */
782                 if (p->linktype == DLT_EN10MB) {
783                         is_ethernet = 1;
784                         for (i = 0; i < bdl.bfl_len; i++) {
785                                 if (bdl.bfl_list[i] != DLT_EN10MB) {
786                                         is_ethernet = 0;
787                                         break;
788                                 }
789                         }
790                         if (is_ethernet) {
791                                 /*
792                                  * We reserved one more slot at the end of
793                                  * the list.
794                                  */
795                                 bdl.bfl_list[bdl.bfl_len] = DLT_DOCSIS;
796                                 bdl.bfl_len++;
797                         }
798                 }
799                 p->dlt_count = bdl.bfl_len;
800                 p->dlt_list = bdl.bfl_list;
801         } else {
802                 if (errno != EINVAL) {
803                         (void)snprintf(ebuf, PCAP_ERRBUF_SIZE,
804                             "BIOCGDLTLIST: %s", pcap_strerror(errno));
805                         goto bad;
806                 }
807         }
808 #endif
809
810         /*
811          * If this is an Ethernet device, and we don't have a DLT_ list,
812          * give it a list with DLT_EN10MB and DLT_DOCSIS.  (That'd give
813          * 802.11 interfaces DLT_DOCSIS, which isn't the right thing to
814          * do, but there's not much we can do about that without finding
815          * some other way of determining whether it's an Ethernet or 802.11
816          * device.)
817          */
818         if (p->linktype == DLT_EN10MB && p->dlt_count == 0) {
819                 p->dlt_list = (u_int *) malloc(sizeof(u_int) * 2);
820                 /*
821                  * If that fails, just leave the list empty.
822                  */
823                 if (p->dlt_list != NULL) {
824                         p->dlt_list[0] = DLT_EN10MB;
825                         p->dlt_list[1] = DLT_DOCSIS;
826                         p->dlt_count = 2;
827                 }
828         }
829                 
830 #if defined(BIOCGHDRCMPLT) && defined(BIOCSHDRCMPLT)
831         /*
832          * Do a BIOCSHDRCMPLT, if defined, to turn that flag on, so
833          * the link-layer source address isn't forcibly overwritten.
834          * (Should we ignore errors?  Should we do this only if
835          * we're open for writing?)
836          *
837          * XXX - I seem to remember some packet-sending bug in some
838          * BSDs - check CVS log for "bpf.c"?
839          */
840         if (ioctl(fd, BIOCSHDRCMPLT, &spoof_eth_src) == -1) {
841                 (void)snprintf(ebuf, PCAP_ERRBUF_SIZE,
842                     "BIOCSHDRCMPLT: %s", pcap_strerror(errno));
843                 goto bad;
844         }
845 #endif
846         /* set timeout */
847         if (to_ms != 0) {
848                 /*
849                  * XXX - is this seconds/nanoseconds in AIX?
850                  * (Treating it as such doesn't fix the timeout
851                  * problem described below.)
852                  */
853                 struct timeval to;
854                 to.tv_sec = to_ms / 1000;
855                 to.tv_usec = (to_ms * 1000) % 1000000;
856                 if (ioctl(p->fd, BIOCSRTIMEOUT, (caddr_t)&to) < 0) {
857                         snprintf(ebuf, PCAP_ERRBUF_SIZE, "BIOCSRTIMEOUT: %s",
858                             pcap_strerror(errno));
859                         goto bad;
860                 }
861         }
862
863 #ifdef _AIX
864 #ifdef  BIOCIMMEDIATE
865         /*
866          * Darren Reed notes that
867          *
868          *      On AIX (4.2 at least), if BIOCIMMEDIATE is not set, the
869          *      timeout appears to be ignored and it waits until the buffer
870          *      is filled before returning.  The result of not having it
871          *      set is almost worse than useless if your BPF filter
872          *      is reducing things to only a few packets (i.e. one every
873          *      second or so).
874          *
875          * so we turn BIOCIMMEDIATE mode on if this is AIX.
876          *
877          * We don't turn it on for other platforms, as that means we
878          * get woken up for every packet, which may not be what we want;
879          * in the Winter 1993 USENIX paper on BPF, they say:
880          *
881          *      Since a process might want to look at every packet on a
882          *      network and the time between packets can be only a few
883          *      microseconds, it is not possible to do a read system call
884          *      per packet and BPF must collect the data from several
885          *      packets and return it as a unit when the monitoring
886          *      application does a read.
887          *
888          * which I infer is the reason for the timeout - it means we
889          * wait that amount of time, in the hopes that more packets
890          * will arrive and we'll get them all with one read.
891          *
892          * Setting BIOCIMMEDIATE mode on FreeBSD (and probably other
893          * BSDs) causes the timeout to be ignored.
894          *
895          * On the other hand, some platforms (e.g., Linux) don't support
896          * timeouts, they just hand stuff to you as soon as it arrives;
897          * if that doesn't cause a problem on those platforms, it may
898          * be OK to have BIOCIMMEDIATE mode on BSD as well.
899          *
900          * (Note, though, that applications may depend on the read
901          * completing, even if no packets have arrived, when the timeout
902          * expires, e.g. GUI applications that have to check for input
903          * while waiting for packets to arrive; a non-zero timeout
904          * prevents "select()" from working right on FreeBSD and
905          * possibly other BSDs, as the timer doesn't start until a
906          * "read()" is done, so the timer isn't in effect if the
907          * application is blocked on a "select()", and the "select()"
908          * doesn't get woken up for a BPF device until the buffer
909          * fills up.)
910          */
911         v = 1;
912         if (ioctl(p->fd, BIOCIMMEDIATE, &v) < 0) {
913                 snprintf(ebuf, PCAP_ERRBUF_SIZE, "BIOCIMMEDIATE: %s",
914                     pcap_strerror(errno));
915                 goto bad;
916         }
917 #endif  /* BIOCIMMEDIATE */
918 #endif  /* _AIX */
919
920         if (promisc) {
921                 /* set promiscuous mode, okay if it fails */
922                 if (ioctl(p->fd, BIOCPROMISC, NULL) < 0) {
923                         snprintf(ebuf, PCAP_ERRBUF_SIZE, "BIOCPROMISC: %s",
924                             pcap_strerror(errno));
925                 }
926         }
927
928         if (ioctl(fd, BIOCGBLEN, (caddr_t)&v) < 0) {
929                 snprintf(ebuf, PCAP_ERRBUF_SIZE, "BIOCGBLEN: %s",
930                     pcap_strerror(errno));
931                 goto bad;
932         }
933         p->bufsize = v;
934         p->buffer = (u_char *)malloc(p->bufsize);
935         if (p->buffer == NULL) {
936                 snprintf(ebuf, PCAP_ERRBUF_SIZE, "malloc: %s",
937                     pcap_strerror(errno));
938                 goto bad;
939         }
940 #ifdef _AIX
941         /* For some strange reason this seems to prevent the EFAULT 
942          * problems we have experienced from AIX BPF. */
943         memset(p->buffer, 0x0, p->bufsize);
944 #endif
945
946         /*
947          * If there's no filter program installed, there's
948          * no indication to the kernel of what the snapshot
949          * length should be, so no snapshotting is done.
950          *
951          * Therefore, when we open the device, we install
952          * an "accept everything" filter with the specified
953          * snapshot length.
954          */
955         total_insn.code = (u_short)(BPF_RET | BPF_K);
956         total_insn.jt = 0;
957         total_insn.jf = 0;
958         total_insn.k = snaplen;
959
960         total_prog.bf_len = 1;
961         total_prog.bf_insns = &total_insn;
962         if (ioctl(p->fd, BIOCSETF, (caddr_t)&total_prog) < 0) {
963                 snprintf(ebuf, PCAP_ERRBUF_SIZE, "BIOCSETF: %s",
964                     pcap_strerror(errno));
965                 goto bad;
966         }
967
968         /*
969          * On most BPF platforms, either you can do a "select()" or
970          * "poll()" on a BPF file descriptor and it works correctly,
971          * or you can do it and it will return "readable" if the
972          * hold buffer is full but not if the timeout expires *and*
973          * a non-blocking read will, if the hold buffer is empty
974          * but the store buffer isn't empty, rotate the buffers
975          * and return what packets are available.
976          *
977          * In the latter case, the fact that a non-blocking read
978          * will give you the available packets means you can work
979          * around the failure of "select()" and "poll()" to wake up
980          * and return "readable" when the timeout expires by using
981          * the timeout as the "select()" or "poll()" timeout, putting
982          * the BPF descriptor into non-blocking mode, and read from
983          * it regardless of whether "select()" reports it as readable
984          * or not.
985          *
986          * However, in FreeBSD 4.3 and 4.4, "select()" and "poll()"
987          * won't wake up and return "readable" if the timer expires
988          * and non-blocking reads return EWOULDBLOCK if the hold
989          * buffer is empty, even if the store buffer is non-empty.
990          *
991          * This means the workaround in question won't work.
992          *
993          * Therefore, on FreeBSD 4.3 and 4.4, we set "p->selectable_fd"
994          * to -1, which means "sorry, you can't use 'select()' or 'poll()'
995          * here".  On all other BPF platforms, we set it to the FD for
996          * the BPF device; in NetBSD, OpenBSD, and Darwin, a non-blocking
997          * read will, if the hold buffer is empty and the store buffer
998          * isn't empty, rotate the buffers and return what packets are
999          * there (and in sufficiently recent versions of OpenBSD
1000          * "select()" and "poll()" should work correctly).
1001          *
1002          * XXX - what about AIX?
1003          */
1004         p->selectable_fd = p->fd;       /* assume select() works until we know otherwise */
1005         if (uname(&osinfo) == 0) {
1006                 /*
1007                  * We can check what OS this is.
1008                  */
1009                 if (strcmp(osinfo.sysname, "FreeBSD") == 0) {
1010                         if (strncmp(osinfo.release, "4.3-", 4) == 0 ||
1011                              strncmp(osinfo.release, "4.4-", 4) == 0)
1012                                 p->selectable_fd = -1;
1013                 }
1014         }
1015
1016         p->read_op = pcap_read_bpf;
1017         p->inject_op = pcap_inject_bpf;
1018         p->setfilter_op = pcap_setfilter_bpf;
1019         p->setdirection_op = pcap_setdirection_bpf;
1020         p->set_datalink_op = pcap_set_datalink_bpf;
1021         p->getnonblock_op = pcap_getnonblock_fd;
1022         p->setnonblock_op = pcap_setnonblock_fd;
1023         p->stats_op = pcap_stats_bpf;
1024         p->close_op = pcap_close_common;
1025
1026         return (p);
1027  bad:
1028         (void)close(fd);
1029         if (p->dlt_list != NULL)
1030                 free(p->dlt_list);
1031         free(p);
1032         return (NULL);
1033 }
1034
1035 int
1036 pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf)
1037 {
1038 #ifdef HAVE_DAG_API
1039         if (dag_platform_finddevs(alldevsp, errbuf) < 0)
1040                 return (-1);
1041 #endif /* HAVE_DAG_API */
1042
1043         return (0);
1044 }
1045
1046 static int
1047 pcap_setfilter_bpf(pcap_t *p, struct bpf_program *fp)
1048 {
1049         /*
1050          * It looks that BPF code generated by gen_protochain() is not
1051          * compatible with some of kernel BPF code (for example BSD/OS 3.1).
1052          * Take a safer side for now.
1053          */
1054         if (no_optimize) {
1055                 /*
1056                  * XXX - what if we already have a filter in the kernel?
1057                  */
1058                 if (install_bpf_program(p, fp) < 0)
1059                         return (-1);
1060                 p->md.use_bpf = 0;      /* filtering in userland */
1061                 return (0);
1062         }
1063
1064         /*
1065          * Free any user-mode filter we might happen to have installed.
1066          */
1067         pcap_freecode(&p->fcode);
1068
1069         /*
1070          * Try to install the kernel filter.
1071          */
1072         if (ioctl(p->fd, BIOCSETF, (caddr_t)fp) < 0) {
1073                 snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCSETF: %s",
1074                     pcap_strerror(errno));
1075                 return (-1);
1076         }
1077         p->md.use_bpf = 1;      /* filtering in the kernel */
1078
1079         /*
1080          * Discard any previously-received packets, as they might have
1081          * passed whatever filter was formerly in effect, but might
1082          * not pass this filter (BIOCSETF discards packets buffered
1083          * in the kernel, so you can lose packets in any case).
1084          */
1085         p->cc = 0;
1086         return (0);
1087 }
1088
1089 /*
1090  * Set direction flag: Which packets do we accept on a forwarding
1091  * single device? IN, OUT or both?
1092  */
1093 static int
1094 pcap_setdirection_bpf(pcap_t *p, pcap_direction_t d)
1095 {
1096 #if defined(BIOCSDIRECTION)
1097         u_int direction;
1098
1099         direction = (d == PCAP_D_IN) ? BPF_D_IN :
1100             ((d == PCAP_D_OUT) ? BPF_D_OUT : BPF_D_INOUT);
1101         if (ioctl(p->fd, BIOCSDIRECTION, &direction) == -1) {
1102                 (void) snprintf(p->errbuf, sizeof(p->errbuf),
1103                     "Cannot set direction to %s: %s",
1104                         (d == PCAP_D_IN) ? "PCAP_D_IN" :
1105                         ((d == PCAP_D_OUT) ? "PCAP_D_OUT" : "PCAP_D_INOUT"),
1106                         strerror(errno));
1107                 return (-1);
1108         }
1109         return (0);
1110 #elif defined(BIOCSSEESENT)
1111         u_int seesent;
1112
1113         /*
1114          * We don't support PCAP_D_OUT.
1115          */
1116         if (d == PCAP_D_OUT) {
1117                 snprintf(p->errbuf, sizeof(p->errbuf),
1118                     "Setting direction to PCAP_D_OUT is not supported on BPF");
1119                 return -1;
1120         }
1121
1122         seesent = (d == PCAP_D_INOUT);
1123         if (ioctl(p->fd, BIOCSSEESENT, &seesent) == -1) {
1124                 (void) snprintf(p->errbuf, sizeof(p->errbuf),
1125                     "Cannot set direction to %s: %s",
1126                         (d == PCAP_D_INOUT) ? "PCAP_D_INOUT" : "PCAP_D_IN",
1127                         strerror(errno));
1128                 return (-1);
1129         }
1130         return (0);
1131 #else
1132         (void) snprintf(p->errbuf, sizeof(p->errbuf),
1133             "This system doesn't support BIOCSSEESENT, so the direction can't be set");
1134         return (-1);
1135 #endif
1136 }
1137
1138 static int
1139 pcap_set_datalink_bpf(pcap_t *p, int dlt)
1140 {
1141 #ifdef BIOCSDLT
1142         if (ioctl(p->fd, BIOCSDLT, &dlt) == -1) {
1143                 (void) snprintf(p->errbuf, sizeof(p->errbuf),
1144                     "Cannot set DLT %d: %s", dlt, strerror(errno));
1145                 return (-1);
1146         }
1147 #endif
1148         return (0);
1149 }