2 * Copyright (c) 1993, 1994, 1995, 1996, 1997, 1998
3 * The Regents of the University of California. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the Computer Systems
16 * Engineering Group at Lawrence Berkeley Laboratory.
17 * 4. Neither the name of the University nor of the Laboratory may be used
18 * to endorse or promote products derived from this software without
19 * specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
38 #include <pcap-types.h>
40 #include <sys/param.h>
44 #include <sys/ioctl.h>
45 #include <sys/socket.h>
46 #ifdef HAVE_SYS_SOCKIO_H
47 #include <sys/sockio.h>
50 struct mbuf
; /* Squelch compiler warnings on some platforms for */
51 struct rtentry
; /* declarations in <net/if.h> */
53 #include <netinet/in.h>
59 #if !defined(_MSC_VER) && !defined(__BORLANDC__) && !defined(__MINGW32__)
66 #include "diag-control.h"
68 #include "thread-local.h"
70 #ifdef HAVE_OS_PROTO_H
84 #endif /* HAVE_DAG_API */
86 #ifdef HAVE_SEPTEL_API
87 #include "pcap-septel.h"
88 #endif /* HAVE_SEPTEL_API */
92 #endif /* HAVE_SNF_API */
96 #endif /* HAVE_TC_API */
98 #ifdef PCAP_SUPPORT_LINUX_USBMON
99 #include "pcap-usb-linux.h"
102 #ifdef PCAP_SUPPORT_BT
103 #include "pcap-bt-linux.h"
106 #ifdef PCAP_SUPPORT_BT_MONITOR
107 #include "pcap-bt-monitor-linux.h"
110 #ifdef PCAP_SUPPORT_NETFILTER
111 #include "pcap-netfilter-linux.h"
114 #ifdef PCAP_SUPPORT_NETMAP
115 #include "pcap-netmap.h"
118 #ifdef PCAP_SUPPORT_DBUS
119 #include "pcap-dbus.h"
122 #ifdef PCAP_SUPPORT_RDMASNIFF
123 #include "pcap-rdmasniff.h"
126 #ifdef PCAP_SUPPORT_DPDK
127 #include "pcap-dpdk.h"
130 #ifdef HAVE_AIRPCAP_API
131 #include "pcap-airpcap.h"
136 * To quote the WSAStartup() documentation:
138 * The WSAStartup function typically leads to protocol-specific helper
139 * DLLs being loaded. As a result, the WSAStartup function should not
140 * be called from the DllMain function in a application DLL. This can
141 * potentially cause deadlocks.
143 * and the WSACleanup() documentation:
145 * The WSACleanup function typically leads to protocol-specific helper
146 * DLLs being unloaded. As a result, the WSACleanup function should not
147 * be called from the DllMain function in a application DLL. This can
148 * potentially cause deadlocks.
150 * So we don't initialize Winsock in a DllMain() routine.
152 * pcap_init() should be called to initialize pcap on both UN*X and
153 * Windows; it will initialize Winsock on Windows. (It will also be
154 * initialized as needed if pcap_init() hasn't been called.)
160 * Ignores the return value of WSACleanup(); given that this is
161 * an atexit() routine, there's nothing much we can do about
165 internal_wsockfini(void)
175 internal_wsockinit(char *errbuf
)
177 WORD wVersionRequested
;
187 * Versions of Windows that don't support Winsock 2.2 are
190 wVersionRequested
= MAKEWORD(2, 2);
191 status
= WSAStartup(wVersionRequested
, &wsaData
);
194 if (errbuf
!= NULL
) {
195 pcap_fmt_errmsg_for_win32_err(errbuf
, PCAP_ERRBUF_SIZE
,
196 status
, "WSAStartup() failed");
200 atexit(internal_wsockfini
);
206 * Exported in case some applications using WinPcap/Npcap called it,
207 * even though it wasn't exported.
212 return (internal_wsockinit(NULL
));
216 * This is the exported function; new programs should call this.
217 * *Newer* programs should call pcap_init().
222 return (internal_wsockinit(NULL
));
227 * Do whatever initialization is needed for libpcap.
229 * The argument specifies whether we use the local code page or UTF-8
230 * for strings; on UN*X, we just assume UTF-8 in places where the encoding
231 * would matter, whereas, on Windows, we use the local code page for
232 * PCAP_CHAR_ENC_LOCAL and UTF-8 for PCAP_CHAR_ENC_UTF_8.
234 * On Windows, we also disable the hack in pcap_create() to deal with
235 * being handed UTF-16 strings, because if the user calls this they're
236 * explicitly declaring that they will either be passing local code
237 * page strings or UTF-8 strings, so we don't need to allow UTF-16LE
238 * strings to be passed. For good measure, on Windows *and* UN*X,
239 * we disable pcap_lookupdev(), to prevent anybody from even
240 * *trying* to pass the result of pcap_lookupdev() - which might be
241 * UTF-16LE on Windows, for ugly compatibility reasons - to pcap_create()
242 * or pcap_open_live() or pcap_open().
244 * Returns 0 on success, -1 on error.
246 int pcap_new_api
; /* pcap_lookupdev() always fails */
247 int pcap_utf_8_mode
; /* Strings should be in UTF-8. */
248 int pcap_mmap_32bit
; /* Map packet buffers with 32-bit addresses. */
251 pcap_init(unsigned int opts
, char *errbuf
)
253 static int initialized
;
256 * Don't allow multiple calls that set different modes; that
257 * may mean a library is initializing pcap in one mode and
258 * a program using that library, or another library used by
259 * that program, is initializing it in another mode.
263 case PCAP_CHAR_ENC_LOCAL
:
264 /* Leave "UTF-8 mode" off. */
266 if (pcap_utf_8_mode
) {
267 snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
268 "Multiple pcap_init calls with different character encodings");
274 case PCAP_CHAR_ENC_UTF_8
:
275 /* Turn on "UTF-8 mode". */
277 if (!pcap_utf_8_mode
) {
278 snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
279 "Multiple pcap_init calls with different character encodings");
286 case PCAP_MMAP_32BIT
:
291 snprintf(errbuf
, PCAP_ERRBUF_SIZE
, "Unknown options specified");
296 * Turn the appropriate mode on for error messages; those routines
297 * are also used in rpcapd, which has no access to pcap's internal
298 * UTF-8 mode flag, so we have to call a routine to set its
301 pcap_fmt_set_encoding(opts
);
305 * Nothing more to do; for example, on Windows, we've
306 * already initialized Winsock.
313 * Now set up Winsock.
315 if (internal_wsockinit(errbuf
) == -1) {
330 * String containing the library version.
331 * Not explicitly exported via a header file - the right API to use
332 * is pcap_lib_version() - but some programs included it, so we
335 * We declare it here, right before defining it, to squelch any
336 * warnings we might get from compilers about the lack of a
339 PCAP_API
char pcap_version
[];
340 PCAP_API_DEF
char pcap_version
[] = PACKAGE_VERSION
;
343 pcap_set_not_initialized_message(pcap_t
*pcap
)
345 if (pcap
->activated
) {
346 /* A module probably forgot to set the function pointer */
347 (void)snprintf(pcap
->errbuf
, sizeof(pcap
->errbuf
),
348 "This operation isn't properly handled by that device");
351 /* in case the caller doesn't check for PCAP_ERROR_NOT_ACTIVATED */
352 (void)snprintf(pcap
->errbuf
, sizeof(pcap
->errbuf
),
353 "This handle hasn't been activated yet");
357 pcap_read_not_initialized(pcap_t
*pcap
, int cnt _U_
, pcap_handler callback _U_
,
360 pcap_set_not_initialized_message(pcap
);
361 /* this means 'not initialized' */
362 return (PCAP_ERROR_NOT_ACTIVATED
);
366 pcap_inject_not_initialized(pcap_t
*pcap
, const void * buf _U_
, int size _U_
)
368 pcap_set_not_initialized_message(pcap
);
369 /* this means 'not initialized' */
370 return (PCAP_ERROR_NOT_ACTIVATED
);
374 pcap_setfilter_not_initialized(pcap_t
*pcap
, struct bpf_program
*fp _U_
)
376 pcap_set_not_initialized_message(pcap
);
377 /* this means 'not initialized' */
378 return (PCAP_ERROR_NOT_ACTIVATED
);
382 pcap_setdirection_not_initialized(pcap_t
*pcap
, pcap_direction_t d _U_
)
384 pcap_set_not_initialized_message(pcap
);
385 /* this means 'not initialized' */
386 return (PCAP_ERROR_NOT_ACTIVATED
);
390 pcap_set_datalink_not_initialized(pcap_t
*pcap
, int dlt _U_
)
392 pcap_set_not_initialized_message(pcap
);
393 /* this means 'not initialized' */
394 return (PCAP_ERROR_NOT_ACTIVATED
);
398 pcap_getnonblock_not_initialized(pcap_t
*pcap
)
400 pcap_set_not_initialized_message(pcap
);
401 /* this means 'not initialized' */
402 return (PCAP_ERROR_NOT_ACTIVATED
);
406 pcap_stats_not_initialized(pcap_t
*pcap
, struct pcap_stat
*ps _U_
)
408 pcap_set_not_initialized_message(pcap
);
409 /* this means 'not initialized' */
410 return (PCAP_ERROR_NOT_ACTIVATED
);
414 static struct pcap_stat
*
415 pcap_stats_ex_not_initialized(pcap_t
*pcap
, int *pcap_stat_size _U_
)
417 pcap_set_not_initialized_message(pcap
);
422 pcap_setbuff_not_initialized(pcap_t
*pcap
, int dim _U_
)
424 pcap_set_not_initialized_message(pcap
);
425 /* this means 'not initialized' */
426 return (PCAP_ERROR_NOT_ACTIVATED
);
430 pcap_setmode_not_initialized(pcap_t
*pcap
, int mode _U_
)
432 pcap_set_not_initialized_message(pcap
);
433 /* this means 'not initialized' */
434 return (PCAP_ERROR_NOT_ACTIVATED
);
438 pcap_setmintocopy_not_initialized(pcap_t
*pcap
, int size _U_
)
440 pcap_set_not_initialized_message(pcap
);
441 /* this means 'not initialized' */
442 return (PCAP_ERROR_NOT_ACTIVATED
);
446 pcap_getevent_not_initialized(pcap_t
*pcap
)
448 pcap_set_not_initialized_message(pcap
);
449 return (INVALID_HANDLE_VALUE
);
453 pcap_oid_get_request_not_initialized(pcap_t
*pcap
, bpf_u_int32 oid _U_
,
454 void *data _U_
, size_t *lenp _U_
)
456 pcap_set_not_initialized_message(pcap
);
457 return (PCAP_ERROR_NOT_ACTIVATED
);
461 pcap_oid_set_request_not_initialized(pcap_t
*pcap
, bpf_u_int32 oid _U_
,
462 const void *data _U_
, size_t *lenp _U_
)
464 pcap_set_not_initialized_message(pcap
);
465 return (PCAP_ERROR_NOT_ACTIVATED
);
469 pcap_sendqueue_transmit_not_initialized(pcap_t
*pcap
, pcap_send_queue
* queue _U_
,
472 pcap_set_not_initialized_message(pcap
);
477 pcap_setuserbuffer_not_initialized(pcap_t
*pcap
, int size _U_
)
479 pcap_set_not_initialized_message(pcap
);
480 return (PCAP_ERROR_NOT_ACTIVATED
);
484 pcap_live_dump_not_initialized(pcap_t
*pcap
, char *filename _U_
, int maxsize _U_
,
487 pcap_set_not_initialized_message(pcap
);
488 return (PCAP_ERROR_NOT_ACTIVATED
);
492 pcap_live_dump_ended_not_initialized(pcap_t
*pcap
, int sync _U_
)
494 pcap_set_not_initialized_message(pcap
);
495 return (PCAP_ERROR_NOT_ACTIVATED
);
498 static PAirpcapHandle
499 pcap_get_airpcap_handle_not_initialized(pcap_t
*pcap
)
501 pcap_set_not_initialized_message(pcap
);
507 * Returns 1 if rfmon mode can be set on the pcap_t, 0 if it can't,
508 * a PCAP_ERROR value on an error.
511 pcap_can_set_rfmon(pcap_t
*p
)
513 return (p
->can_set_rfmon_op(p
));
517 * For systems where rfmon mode is never supported.
520 pcap_cant_set_rfmon(pcap_t
*p _U_
)
526 * Sets *tstamp_typesp to point to an array 1 or more supported time stamp
527 * types; the return value is the number of supported time stamp types.
528 * The list should be freed by a call to pcap_free_tstamp_types() when
529 * you're done with it.
531 * A return value of 0 means "you don't get a choice of time stamp type",
532 * in which case *tstamp_typesp is set to null.
534 * PCAP_ERROR is returned on error.
537 pcap_list_tstamp_types(pcap_t
*p
, int **tstamp_typesp
)
539 if (p
->tstamp_type_count
== 0) {
541 * We don't support multiple time stamp types.
542 * That means the only type we support is PCAP_TSTAMP_HOST;
543 * set up a list containing only that type.
545 *tstamp_typesp
= (int*)malloc(sizeof(**tstamp_typesp
));
546 if (*tstamp_typesp
== NULL
) {
547 pcap_fmt_errmsg_for_errno(p
->errbuf
, sizeof(p
->errbuf
),
551 **tstamp_typesp
= PCAP_TSTAMP_HOST
;
554 *tstamp_typesp
= (int*)calloc(sizeof(**tstamp_typesp
),
555 p
->tstamp_type_count
);
556 if (*tstamp_typesp
== NULL
) {
557 pcap_fmt_errmsg_for_errno(p
->errbuf
, sizeof(p
->errbuf
),
561 (void)memcpy(*tstamp_typesp
, p
->tstamp_type_list
,
562 sizeof(**tstamp_typesp
) * p
->tstamp_type_count
);
563 return (p
->tstamp_type_count
);
568 * In Windows, you might have a library built with one version of the
569 * C runtime library and an application built with another version of
570 * the C runtime library, which means that the library might use one
571 * version of malloc() and free() and the application might use another
572 * version of malloc() and free(). If so, that means something
573 * allocated by the library cannot be freed by the application, so we
574 * need to have a pcap_free_tstamp_types() routine to free up the list
575 * allocated by pcap_list_tstamp_types(), even though it's just a wrapper
579 pcap_free_tstamp_types(int *tstamp_type_list
)
581 free(tstamp_type_list
);
585 * Default one-shot callback; overridden for capture types where the
586 * packet data cannot be guaranteed to be available after the callback
587 * returns, so that a copy must be made.
590 pcap_oneshot(u_char
*user
, const struct pcap_pkthdr
*h
, const u_char
*pkt
)
592 struct oneshot_userdata
*sp
= (struct oneshot_userdata
*)user
;
599 pcap_next(pcap_t
*p
, struct pcap_pkthdr
*h
)
601 struct oneshot_userdata s
;
607 if (pcap_dispatch(p
, 1, p
->oneshot_callback
, (u_char
*)&s
) <= 0)
613 pcap_next_ex(pcap_t
*p
, struct pcap_pkthdr
**pkt_header
,
614 const u_char
**pkt_data
)
616 struct oneshot_userdata s
;
618 s
.hdr
= &p
->pcap_header
;
622 /* Saves a pointer to the packet headers */
623 *pkt_header
= &p
->pcap_header
;
625 if (p
->rfile
!= NULL
) {
628 /* We are on an offline capture */
629 status
= pcap_offline_read(p
, 1, p
->oneshot_callback
,
633 * Return codes for pcap_offline_read() are:
636 * - >0: OK - result is number of packets read, so
637 * it will be 1 in this case, as we've passed
638 * a maximum packet count of 1
639 * The first one ('0') conflicts with the return code of
640 * 0 from pcap_read() meaning "no packets arrived before
641 * the timeout expired", so we map it to -2 so you can
642 * distinguish between an EOF from a savefile and a
643 * "no packets arrived before the timeout expired, try
644 * again" from a live capture.
653 * Return codes for pcap_read() are:
656 * - -2: loop was broken out of with pcap_breakloop()
657 * - >0: OK, result is number of packets captured, so
658 * it will be 1 in this case, as we've passed
659 * a maximum packet count of 1
660 * The first one ('0') conflicts with the return code of 0 from
661 * pcap_offline_read() meaning "end of file".
663 return (p
->read_op(p
, 1, p
->oneshot_callback
, (u_char
*)&s
));
667 * Implementation of a pcap_if_list_t.
669 struct pcap_if_list
{
670 pcap_if_t
*beginning
;
673 static struct capture_source_type
{
674 int (*findalldevs_op
)(pcap_if_list_t
*, char *);
675 pcap_t
*(*create_op
)(const char *, char *, int *);
676 } capture_source_types
[] = {
678 { dag_findalldevs
, dag_create
},
680 #ifdef HAVE_SEPTEL_API
681 { septel_findalldevs
, septel_create
},
684 { snf_findalldevs
, snf_create
},
687 { TcFindAllDevs
, TcCreate
},
689 #ifdef PCAP_SUPPORT_BT
690 { bt_findalldevs
, bt_create
},
692 #ifdef PCAP_SUPPORT_BT_MONITOR
693 { bt_monitor_findalldevs
, bt_monitor_create
},
695 #ifdef PCAP_SUPPORT_LINUX_USBMON
696 { usb_findalldevs
, usb_create
},
698 #ifdef PCAP_SUPPORT_NETFILTER
699 { netfilter_findalldevs
, netfilter_create
},
701 #ifdef PCAP_SUPPORT_NETMAP
702 { pcap_netmap_findalldevs
, pcap_netmap_create
},
704 #ifdef PCAP_SUPPORT_DBUS
705 { dbus_findalldevs
, dbus_create
},
707 #ifdef PCAP_SUPPORT_RDMASNIFF
708 { rdmasniff_findalldevs
, rdmasniff_create
},
710 #ifdef PCAP_SUPPORT_DPDK
711 { pcap_dpdk_findalldevs
, pcap_dpdk_create
},
713 #ifdef HAVE_AIRPCAP_API
714 { airpcap_findalldevs
, airpcap_create
},
720 * Get a list of all capture sources that are up and that we can open.
721 * Returns -1 on error, 0 otherwise.
722 * The list, as returned through "alldevsp", may be null if no interfaces
723 * were up and could be opened.
726 pcap_findalldevs(pcap_if_t
**alldevsp
, char *errbuf
)
729 pcap_if_list_t devlist
;
732 * Find all the local network interfaces on which we
735 devlist
.beginning
= NULL
;
736 if (pcap_platform_finddevs(&devlist
, errbuf
) == -1) {
738 * Failed - free all of the entries we were given
741 if (devlist
.beginning
!= NULL
)
742 pcap_freealldevs(devlist
.beginning
);
748 * Ask each of the non-local-network-interface capture
749 * source types what interfaces they have.
751 for (i
= 0; capture_source_types
[i
].findalldevs_op
!= NULL
; i
++) {
752 if (capture_source_types
[i
].findalldevs_op(&devlist
, errbuf
) == -1) {
754 * We had an error; free the list we've been
757 if (devlist
.beginning
!= NULL
)
758 pcap_freealldevs(devlist
.beginning
);
765 * Return the first entry of the list of all devices.
767 *alldevsp
= devlist
.beginning
;
771 static struct sockaddr
*
772 dup_sockaddr(struct sockaddr
*sa
, size_t sa_length
)
774 struct sockaddr
*newsa
;
776 if ((newsa
= malloc(sa_length
)) == NULL
)
778 return (memcpy(newsa
, sa
, sa_length
));
782 * Construct a "figure of merit" for an interface, for use when sorting
783 * the list of interfaces, in which interfaces that are up are superior
784 * to interfaces that aren't up, interfaces that are up and running are
785 * superior to interfaces that are up but not running, and non-loopback
786 * interfaces that are up and running are superior to loopback interfaces,
787 * and interfaces with the same flags have a figure of merit that's higher
788 * the lower the instance number.
790 * The goal is to try to put the interfaces most likely to be useful for
791 * capture at the beginning of the list.
793 * The figure of merit, which is lower the "better" the interface is,
794 * has the uppermost bit set if the interface isn't running, the bit
795 * below that set if the interface isn't up, the bit below that
796 * set if the interface is a loopback interface, and the bit below
797 * that set if it's the "any" interface.
799 * Note: we don't sort by unit number because 1) not all interfaces have
800 * a unit number (systemd, for example, might assign interface names
801 * based on the interface's MAC address or on the physical location of
802 * the adapter's connector), and 2) if the name does end with a simple
803 * unit number, it's not a global property of the interface, it's only
804 * useful as a sort key for device names with the same prefix, so xyz0
805 * shouldn't necessarily sort before abc2. This means that interfaces
806 * with the same figure of merit will be sorted by the order in which
807 * the mechanism from which we're getting the interfaces supplies them.
810 get_figure_of_merit(pcap_if_t
*dev
)
815 if (!(dev
->flags
& PCAP_IF_RUNNING
))
817 if (!(dev
->flags
& PCAP_IF_UP
))
821 * Give non-wireless interfaces that aren't disconnected a better
822 * figure of merit than interfaces that are disconnected, as
823 * "disconnected" should indicate that the interface isn't
824 * plugged into a network and thus won't give you any traffic.
826 * For wireless interfaces, it means "associated with a network",
827 * which we presume not to necessarily prevent capture, as you
828 * might run the adapter in some flavor of monitor mode.
830 if (!(dev
->flags
& PCAP_IF_WIRELESS
) &&
831 (dev
->flags
& PCAP_IF_CONNECTION_STATUS
) == PCAP_IF_CONNECTION_STATUS_DISCONNECTED
)
835 * Sort loopback devices after non-loopback devices, *except* for
836 * disconnected devices.
838 if (dev
->flags
& PCAP_IF_LOOPBACK
)
842 * Sort the "any" device before loopback and disconnected devices,
843 * but after all other devices.
845 if (strcmp(dev
->name
, "any") == 0)
853 * Try to get a description for a given device.
854 * Returns a malloced description if it could and NULL if it couldn't.
856 * XXX - on FreeBSDs that support it, should it get the sysctl named
857 * "dev.{adapter family name}.{adapter unit}.%desc" to get a description
858 * of the adapter? Note that "dev.an.0.%desc" is "Aironet PC4500/PC4800"
859 * with my Cisco 350 card, so the name isn't entirely descriptive. The
860 * "dev.an.0.%pnpinfo" has a better description, although one might argue
861 * that the problem is really a driver bug - if it can find out that it's
862 * a Cisco 340 or 350, rather than an old Aironet card, it should use
863 * that in the description.
865 * Do NetBSD, DragonflyBSD, or OpenBSD support this as well? FreeBSD
866 * and OpenBSD let you get a description, but it's not generated by the OS,
867 * it's set with another ioctl that ifconfig supports; we use that to get
868 * a description in FreeBSD and OpenBSD, but if there is no such
869 * description available, it still might be nice to get some description
870 * string based on the device type or something such as that.
872 * In macOS, the System Configuration framework can apparently return
873 * names in 10.4 and later.
875 * It also appears that freedesktop.org's HAL offers an "info.product"
876 * string, but the HAL specification says it "should not be used in any
877 * UI" and "subsystem/capability specific properties" should be used
878 * instead and, in any case, I think HAL is being deprecated in
879 * favor of other stuff such as DeviceKit. DeviceKit doesn't appear
880 * to have any obvious product information for devices, but maybe
881 * I haven't looked hard enough.
883 * Using the System Configuration framework, or HAL, or DeviceKit, or
884 * whatever, would require that libpcap applications be linked with
885 * the frameworks/libraries in question. That shouldn't be a problem
886 * for programs linking with the shared version of libpcap (unless
887 * you're running on AIX - which I think is the only UN*X that doesn't
888 * support linking a shared library with other libraries on which it
889 * depends, and having an executable linked only with the first shared
890 * library automatically pick up the other libraries when started -
891 * and using HAL or whatever). Programs linked with the static
892 * version of libpcap would have to use pcap-config with the --static
893 * flag in order to get the right linker flags in order to pick up
894 * the additional libraries/frameworks; those programs need that anyway
895 * for libpcap 1.1 and beyond on Linux, as, by default, it requires
898 * Do any other UN*Xes, or desktop environments support getting a
903 get_if_description(const char *name
)
905 char *description
= NULL
;
907 struct ifreq ifrdesc
;
909 size_t descrlen
= 64;
911 size_t descrlen
= IFDESCRSIZE
;
912 #endif /* IFDESCRSIZE */
915 * Get the description for the interface.
917 memset(&ifrdesc
, 0, sizeof ifrdesc
);
918 pcap_strlcpy(ifrdesc
.ifr_name
, name
, sizeof ifrdesc
.ifr_name
);
919 s
= socket(AF_INET
, SOCK_DGRAM
, 0);
923 * On FreeBSD, if the buffer isn't big enough for the
924 * description, the ioctl succeeds, but the description
925 * isn't copied, ifr_buffer.length is set to the description
926 * length, and ifr_buffer.buffer is set to NULL.
930 if ((description
= malloc(descrlen
)) != NULL
) {
931 ifrdesc
.ifr_buffer
.buffer
= description
;
932 ifrdesc
.ifr_buffer
.length
= descrlen
;
933 if (ioctl(s
, SIOCGIFDESCR
, &ifrdesc
) == 0) {
934 if (ifrdesc
.ifr_buffer
.buffer
==
938 descrlen
= ifrdesc
.ifr_buffer
.length
;
941 * Failed to get interface description.
950 #else /* __FreeBSD__ */
952 * The only other OS that currently supports
953 * SIOCGIFDESCR is OpenBSD, and it has no way
954 * to get the description length - it's clamped
955 * to a maximum of IFDESCRSIZE.
957 if ((description
= malloc(descrlen
)) != NULL
) {
958 ifrdesc
.ifr_data
= (caddr_t
)description
;
959 if (ioctl(s
, SIOCGIFDESCR
, &ifrdesc
) != 0) {
961 * Failed to get interface description.
967 #endif /* __FreeBSD__ */
969 if (description
!= NULL
&& description
[0] == '\0') {
971 * Description is empty, so discard it.
980 * For FreeBSD, if we didn't get a description, and this is
981 * a device with a name of the form usbusN, label it as a USB
984 if (description
== NULL
) {
985 if (strncmp(name
, "usbus", 5) == 0) {
987 * OK, it begins with "usbus".
993 busnum
= strtol(name
+ 5, &p
, 10);
994 if (errno
== 0 && p
!= name
+ 5 && *p
== '\0' &&
995 busnum
>= 0 && busnum
<= INT_MAX
) {
997 * OK, it's a valid number that's not
998 * bigger than INT_MAX. Construct
999 * a description from it.
1000 * (If that fails, we don't worry about
1001 * it, we just return NULL.)
1003 if (pcap_asprintf(&description
,
1004 "USB bus number %ld", busnum
) == -1) {
1012 return (description
);
1013 #else /* SIOCGIFDESCR */
1014 get_if_description(const char *name _U_
)
1017 #endif /* SIOCGIFDESCR */
1021 * Look for a given device in the specified list of devices.
1023 * If we find it, return a pointer to its entry.
1025 * If we don't find it, attempt to add an entry for it, with the specified
1026 * IFF_ flags and description, and, if that succeeds, return a pointer to
1027 * the new entry, otherwise return NULL and set errbuf to an error message.
1030 pcap_find_or_add_if(pcap_if_list_t
*devlistp
, const char *name
,
1031 bpf_u_int32 if_flags
, get_if_flags_func get_flags_func
, char *errbuf
)
1033 bpf_u_int32 pcap_flags
;
1036 * Convert IFF_ flags to pcap flags.
1040 if (if_flags
& IFF_LOOPBACK
)
1041 pcap_flags
|= PCAP_IF_LOOPBACK
;
1044 * We don't have IFF_LOOPBACK, so look at the device name to
1045 * see if it looks like a loopback device.
1047 if (name
[0] == 'l' && name
[1] == 'o' &&
1048 (PCAP_ISDIGIT(name
[2]) || name
[2] == '\0'))
1049 pcap_flags
|= PCAP_IF_LOOPBACK
;
1052 if (if_flags
& IFF_UP
)
1053 pcap_flags
|= PCAP_IF_UP
;
1056 if (if_flags
& IFF_RUNNING
)
1057 pcap_flags
|= PCAP_IF_RUNNING
;
1061 * Attempt to find an entry for this device; if we don't find one,
1062 * attempt to add one.
1064 return (pcap_find_or_add_dev(devlistp
, name
, pcap_flags
,
1065 get_flags_func
, get_if_description(name
), errbuf
));
1069 * Look for a given device in the specified list of devices.
1071 * If we find it, then, if the specified address isn't null, add it to
1072 * the list of addresses for the device and return 0.
1074 * If we don't find it, attempt to add an entry for it, with the specified
1075 * IFF_ flags and description, and, if that succeeds, add the specified
1076 * address to its list of addresses if that address is non-null, and
1077 * return 0, otherwise return -1 and set errbuf to an error message.
1079 * (We can get called with a null address because we might get a list
1080 * of interface name/address combinations from the underlying OS, with
1081 * the address being absent in some cases, rather than a list of
1082 * interfaces with each interface having a list of addresses, so this
1083 * call may be the only call made to add to the list, and we want to
1084 * add interfaces even if they have no addresses.)
1087 pcap_add_addr_to_if(pcap_if_list_t
*devlistp
, const char *name
,
1088 bpf_u_int32 if_flags
, get_if_flags_func get_flags_func
,
1089 struct sockaddr
*addr
, size_t addr_size
,
1090 struct sockaddr
*netmask
, size_t netmask_size
,
1091 struct sockaddr
*broadaddr
, size_t broadaddr_size
,
1092 struct sockaddr
*dstaddr
, size_t dstaddr_size
,
1098 * Check whether the device exists and, if not, add it.
1100 curdev
= pcap_find_or_add_if(devlistp
, name
, if_flags
, get_flags_func
,
1102 if (curdev
== NULL
) {
1111 * There's no address to add; this entry just meant
1112 * "here's a new interface".
1118 * "curdev" is an entry for this interface, and we have an
1119 * address for it; add an entry for that address to the
1120 * interface's list of addresses.
1122 return (pcap_add_addr_to_dev(curdev
, addr
, addr_size
, netmask
,
1123 netmask_size
, broadaddr
, broadaddr_size
, dstaddr
,
1124 dstaddr_size
, errbuf
));
1129 * Add an entry to the list of addresses for an interface.
1130 * "curdev" is the entry for that interface.
1133 pcap_add_addr_to_dev(pcap_if_t
*curdev
,
1134 struct sockaddr
*addr
, size_t addr_size
,
1135 struct sockaddr
*netmask
, size_t netmask_size
,
1136 struct sockaddr
*broadaddr
, size_t broadaddr_size
,
1137 struct sockaddr
*dstaddr
, size_t dstaddr_size
,
1140 pcap_addr_t
*curaddr
, *prevaddr
, *nextaddr
;
1143 * Allocate the new entry and fill it in.
1145 curaddr
= (pcap_addr_t
*)malloc(sizeof(pcap_addr_t
));
1146 if (curaddr
== NULL
) {
1147 pcap_fmt_errmsg_for_errno(errbuf
, PCAP_ERRBUF_SIZE
,
1152 curaddr
->next
= NULL
;
1153 if (addr
!= NULL
&& addr_size
!= 0) {
1154 curaddr
->addr
= (struct sockaddr
*)dup_sockaddr(addr
, addr_size
);
1155 if (curaddr
->addr
== NULL
) {
1156 pcap_fmt_errmsg_for_errno(errbuf
, PCAP_ERRBUF_SIZE
,
1162 curaddr
->addr
= NULL
;
1164 if (netmask
!= NULL
&& netmask_size
!= 0) {
1165 curaddr
->netmask
= (struct sockaddr
*)dup_sockaddr(netmask
, netmask_size
);
1166 if (curaddr
->netmask
== NULL
) {
1167 pcap_fmt_errmsg_for_errno(errbuf
, PCAP_ERRBUF_SIZE
,
1169 if (curaddr
->addr
!= NULL
)
1170 free(curaddr
->addr
);
1175 curaddr
->netmask
= NULL
;
1177 if (broadaddr
!= NULL
&& broadaddr_size
!= 0) {
1178 curaddr
->broadaddr
= (struct sockaddr
*)dup_sockaddr(broadaddr
, broadaddr_size
);
1179 if (curaddr
->broadaddr
== NULL
) {
1180 pcap_fmt_errmsg_for_errno(errbuf
, PCAP_ERRBUF_SIZE
,
1182 if (curaddr
->netmask
!= NULL
)
1183 free(curaddr
->netmask
);
1184 if (curaddr
->addr
!= NULL
)
1185 free(curaddr
->addr
);
1190 curaddr
->broadaddr
= NULL
;
1192 if (dstaddr
!= NULL
&& dstaddr_size
!= 0) {
1193 curaddr
->dstaddr
= (struct sockaddr
*)dup_sockaddr(dstaddr
, dstaddr_size
);
1194 if (curaddr
->dstaddr
== NULL
) {
1195 pcap_fmt_errmsg_for_errno(errbuf
, PCAP_ERRBUF_SIZE
,
1197 if (curaddr
->broadaddr
!= NULL
)
1198 free(curaddr
->broadaddr
);
1199 if (curaddr
->netmask
!= NULL
)
1200 free(curaddr
->netmask
);
1201 if (curaddr
->addr
!= NULL
)
1202 free(curaddr
->addr
);
1207 curaddr
->dstaddr
= NULL
;
1210 * Find the end of the list of addresses.
1212 for (prevaddr
= curdev
->addresses
; prevaddr
!= NULL
; prevaddr
= nextaddr
) {
1213 nextaddr
= prevaddr
->next
;
1214 if (nextaddr
== NULL
) {
1216 * This is the end of the list.
1222 if (prevaddr
== NULL
) {
1224 * The list was empty; this is the first member.
1226 curdev
->addresses
= curaddr
;
1229 * "prevaddr" is the last member of the list; append
1230 * this member to it.
1232 prevaddr
->next
= curaddr
;
1239 * Look for a given device in the specified list of devices.
1241 * If we find it, return 0 and set *curdev_ret to point to it.
1243 * If we don't find it, attempt to add an entry for it, with the specified
1244 * flags and description, and, if that succeeds, return 0, otherwise
1245 * return -1 and set errbuf to an error message.
1248 pcap_find_or_add_dev(pcap_if_list_t
*devlistp
, const char *name
, bpf_u_int32 flags
,
1249 get_if_flags_func get_flags_func
, const char *description
, char *errbuf
)
1254 * Is there already an entry in the list for this device?
1256 curdev
= pcap_find_dev(devlistp
, name
);
1257 if (curdev
!= NULL
) {
1265 * No, we didn't find it.
1269 * Try to get additional flags for the device.
1271 if ((*get_flags_func
)(name
, &flags
, errbuf
) == -1) {
1279 * Now, try to add it to the list of devices.
1281 return (pcap_add_dev(devlistp
, name
, flags
, description
, errbuf
));
1285 * Look for a given device in the specified list of devices, and return
1286 * the entry for it if we find it or NULL if we don't.
1289 pcap_find_dev(pcap_if_list_t
*devlistp
, const char *name
)
1294 * Is there an entry in the list for this device?
1296 for (curdev
= devlistp
->beginning
; curdev
!= NULL
;
1297 curdev
= curdev
->next
) {
1298 if (strcmp(name
, curdev
->name
) == 0) {
1300 * We found it, so, yes, there is. No need to
1301 * add it. Provide the entry we found to our
1315 * Attempt to add an entry for a device, with the specified flags
1316 * and description, and, if that succeeds, return 0 and return a pointer
1317 * to the new entry, otherwise return NULL and set errbuf to an error
1320 * If we weren't given a description, try to get one.
1323 pcap_add_dev(pcap_if_list_t
*devlistp
, const char *name
, bpf_u_int32 flags
,
1324 const char *description
, char *errbuf
)
1326 pcap_if_t
*curdev
, *prevdev
, *nextdev
;
1327 u_int this_figure_of_merit
, nextdev_figure_of_merit
;
1329 curdev
= malloc(sizeof(pcap_if_t
));
1330 if (curdev
== NULL
) {
1331 pcap_fmt_errmsg_for_errno(errbuf
, PCAP_ERRBUF_SIZE
,
1337 * Fill in the entry.
1339 curdev
->next
= NULL
;
1340 curdev
->name
= strdup(name
);
1341 if (curdev
->name
== NULL
) {
1342 pcap_fmt_errmsg_for_errno(errbuf
, PCAP_ERRBUF_SIZE
,
1347 if (description
== NULL
) {
1349 * We weren't handed a description for the interface.
1351 curdev
->description
= NULL
;
1354 * We were handed a description; make a copy.
1356 curdev
->description
= strdup(description
);
1357 if (curdev
->description
== NULL
) {
1358 pcap_fmt_errmsg_for_errno(errbuf
, PCAP_ERRBUF_SIZE
,
1365 curdev
->addresses
= NULL
; /* list starts out as empty */
1366 curdev
->flags
= flags
;
1369 * Add it to the list, in the appropriate location.
1370 * First, get the "figure of merit" for this interface.
1372 this_figure_of_merit
= get_figure_of_merit(curdev
);
1375 * Now look for the last interface with an figure of merit
1376 * less than or equal to the new interface's figure of merit.
1378 * We start with "prevdev" being NULL, meaning we're before
1379 * the first element in the list.
1384 * Get the interface after this one.
1386 if (prevdev
== NULL
) {
1388 * The next element is the first element.
1390 nextdev
= devlistp
->beginning
;
1392 nextdev
= prevdev
->next
;
1395 * Are we at the end of the list?
1397 if (nextdev
== NULL
) {
1399 * Yes - we have to put the new entry after "prevdev".
1405 * Is the new interface's figure of merit less
1406 * than the next interface's figure of merit,
1407 * meaning that the new interface is better
1408 * than the next interface?
1410 nextdev_figure_of_merit
= get_figure_of_merit(nextdev
);
1411 if (this_figure_of_merit
< nextdev_figure_of_merit
) {
1413 * Yes - we should put the new entry
1414 * before "nextdev", i.e. after "prevdev".
1423 * Insert before "nextdev".
1425 curdev
->next
= nextdev
;
1428 * Insert after "prevdev" - unless "prevdev" is null,
1429 * in which case this is the first interface.
1431 if (prevdev
== NULL
) {
1433 * This is the first interface. Make it
1434 * the first element in the list of devices.
1436 devlistp
->beginning
= curdev
;
1438 prevdev
->next
= curdev
;
1443 * Add an entry for the "any" device.
1446 pcap_add_any_dev(pcap_if_list_t
*devlistp
, char *errbuf
)
1448 static const char any_descr
[] = "Pseudo-device that captures on all interfaces";
1451 * As it refers to all network devices, not to any particular
1452 * network device, the notion of "connected" vs. "disconnected"
1453 * doesn't apply to the "any" device.
1455 return pcap_add_dev(devlistp
, "any",
1456 PCAP_IF_UP
|PCAP_IF_RUNNING
|PCAP_IF_CONNECTION_STATUS_NOT_APPLICABLE
,
1461 * Free a list of interfaces.
1464 pcap_freealldevs(pcap_if_t
*alldevs
)
1466 pcap_if_t
*curdev
, *nextdev
;
1467 pcap_addr_t
*curaddr
, *nextaddr
;
1469 for (curdev
= alldevs
; curdev
!= NULL
; curdev
= nextdev
) {
1470 nextdev
= curdev
->next
;
1473 * Free all addresses.
1475 for (curaddr
= curdev
->addresses
; curaddr
!= NULL
; curaddr
= nextaddr
) {
1476 nextaddr
= curaddr
->next
;
1478 free(curaddr
->addr
);
1479 if (curaddr
->netmask
)
1480 free(curaddr
->netmask
);
1481 if (curaddr
->broadaddr
)
1482 free(curaddr
->broadaddr
);
1483 if (curaddr
->dstaddr
)
1484 free(curaddr
->dstaddr
);
1489 * Free the name string.
1494 * Free the description string, if any.
1496 if (curdev
->description
!= NULL
)
1497 free(curdev
->description
);
1500 * Free the interface.
1507 * pcap-npf.c has its own pcap_lookupdev(), for compatibility reasons, as
1508 * it actually returns the names of all interfaces, with a NUL separator
1509 * between them; some callers may depend on that.
1511 * MS-DOS has its own pcap_lookupdev(), but that might be useful only
1512 * as an optimization.
1514 * In all other cases, we just use pcap_findalldevs() to get a list of
1515 * devices, and pick from that list.
1517 #if !defined(HAVE_PACKET32) && !defined(MSDOS)
1519 * Return the name of a network interface attached to the system, or NULL
1520 * if none can be found. The interface must be configured up; the
1521 * lowest unit number is preferred; loopback is ignored.
1524 pcap_lookupdev(char *errbuf
)
1529 * Windows - use the same size as the old WinPcap 3.1 code.
1530 * XXX - this is probably bigger than it needs to be.
1532 #define IF_NAMESIZE 8192
1535 * UN*X - use the system's interface name size.
1536 * XXX - that might not be large enough for capture devices
1537 * that aren't regular network interfaces.
1540 static char device
[IF_NAMESIZE
+ 1];
1544 * We disable this in "new API" mode, because 1) in WinPcap/Npcap,
1545 * it may return UTF-16 strings, for backwards-compatibility
1546 * reasons, and we're also disabling the hack to make that work,
1547 * for not-going-past-the-end-of-a-string reasons, and 2) we
1548 * want its behavior to be consistent.
1550 * In addition, it's not thread-safe, so we've marked it as
1554 snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
1555 "pcap_lookupdev() is deprecated and is not supported in programs calling pcap_init()");
1559 if (pcap_findalldevs(&alldevs
, errbuf
) == -1)
1562 if (alldevs
== NULL
|| (alldevs
->flags
& PCAP_IF_LOOPBACK
)) {
1564 * There are no devices on the list, or the first device
1565 * on the list is a loopback device, which means there
1566 * are no non-loopback devices on the list. This means
1567 * we can't return any device.
1569 * XXX - why not return a loopback device? If we can't
1570 * capture on it, it won't be on the list, and if it's
1571 * on the list, there aren't any non-loopback devices,
1572 * so why not just supply it as the default device?
1574 (void)pcap_strlcpy(errbuf
, "no suitable device found",
1579 * Return the name of the first device on the list.
1581 (void)pcap_strlcpy(device
, alldevs
->name
, sizeof(device
));
1585 pcap_freealldevs(alldevs
);
1588 #endif /* !defined(HAVE_PACKET32) && !defined(MSDOS) */
1590 #if !defined(_WIN32) && !defined(MSDOS)
1592 * We don't just fetch the entire list of devices, search for the
1593 * particular device, and use its first IPv4 address, as that's too
1594 * much work to get just one device's netmask.
1596 * If we had an API to get attributes for a given device, we could
1600 pcap_lookupnet(const char *device
, bpf_u_int32
*netp
, bpf_u_int32
*maskp
,
1604 register struct sockaddr_in
*sin4
;
1608 * The pseudo-device "any" listens on all interfaces and therefore
1609 * has the network address and -mask "0.0.0.0" therefore catching
1610 * all traffic. Using NULL for the interface is the same as "any".
1612 if (!device
|| strcmp(device
, "any") == 0
1614 || strstr(device
, "dag") != NULL
1616 #ifdef HAVE_SEPTEL_API
1617 || strstr(device
, "septel") != NULL
1619 #ifdef PCAP_SUPPORT_BT
1620 || strstr(device
, "bluetooth") != NULL
1622 #ifdef PCAP_SUPPORT_LINUX_USBMON
1623 || strstr(device
, "usbmon") != NULL
1626 || strstr(device
, "snf") != NULL
1628 #ifdef PCAP_SUPPORT_NETMAP
1629 || strncmp(device
, "netmap:", 7) == 0
1630 || strncmp(device
, "vale", 4) == 0
1632 #ifdef PCAP_SUPPORT_DPDK
1633 || strncmp(device
, "dpdk:", 5) == 0
1640 fd
= socket(AF_INET
, SOCK_DGRAM
, 0);
1642 pcap_fmt_errmsg_for_errno(errbuf
, PCAP_ERRBUF_SIZE
,
1646 memset(&ifr
, 0, sizeof(ifr
));
1648 /* XXX Work around Linux kernel bug */
1649 ifr
.ifr_addr
.sa_family
= AF_INET
;
1651 (void)pcap_strlcpy(ifr
.ifr_name
, device
, sizeof(ifr
.ifr_name
));
1652 #if defined(__HAIKU__) && defined(__clang__)
1654 * In Haiku R1/beta4 <unistd.h> ioctl() is a macro that needs to take 4
1655 * arguments to initialize its intermediate 2-member structure fully so
1656 * that Clang does not generate a -Wmissing-field-initializers warning
1657 * (which manifests only when it runs with -Werror). This workaround
1658 * can be removed as soon as there is a Haiku release that fixes the
1659 * problem. See also https://review.haiku-os.org/c/haiku/+/6369
1661 if (ioctl(fd
, SIOCGIFADDR
, (char *)&ifr
, sizeof(ifr
)) < 0) {
1663 if (ioctl(fd
, SIOCGIFADDR
, (char *)&ifr
) < 0) {
1664 #endif /* __HAIKU__ && __clang__ */
1665 if (errno
== EADDRNOTAVAIL
) {
1666 (void)snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
1667 "%s: no IPv4 address assigned", device
);
1669 pcap_fmt_errmsg_for_errno(errbuf
, PCAP_ERRBUF_SIZE
,
1670 errno
, "SIOCGIFADDR: %s", device
);
1675 sin4
= (struct sockaddr_in
*)&ifr
.ifr_addr
;
1676 *netp
= sin4
->sin_addr
.s_addr
;
1677 memset(&ifr
, 0, sizeof(ifr
));
1679 /* XXX Work around Linux kernel bug */
1680 ifr
.ifr_addr
.sa_family
= AF_INET
;
1682 (void)pcap_strlcpy(ifr
.ifr_name
, device
, sizeof(ifr
.ifr_name
));
1683 #if defined(__HAIKU__) && defined(__clang__)
1684 /* Same as above. */
1685 if (ioctl(fd
, SIOCGIFNETMASK
, (char *)&ifr
, sizeof(ifr
)) < 0) {
1687 if (ioctl(fd
, SIOCGIFNETMASK
, (char *)&ifr
) < 0) {
1688 #endif /* __HAIKU__ && __clang__ */
1689 pcap_fmt_errmsg_for_errno(errbuf
, PCAP_ERRBUF_SIZE
,
1690 errno
, "SIOCGIFNETMASK: %s", device
);
1695 *maskp
= sin4
->sin_addr
.s_addr
;
1697 if (IN_CLASSA(*netp
))
1698 *maskp
= IN_CLASSA_NET
;
1699 else if (IN_CLASSB(*netp
))
1700 *maskp
= IN_CLASSB_NET
;
1701 else if (IN_CLASSC(*netp
))
1702 *maskp
= IN_CLASSC_NET
;
1704 (void)snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
1705 "inet class for 0x%x unknown", *netp
);
1712 #endif /* !defined(_WIN32) && !defined(MSDOS) */
1714 #ifdef ENABLE_REMOTE
1715 #include "pcap-rpcap.h"
1718 * Extract a substring from a string.
1721 get_substring(const char *p
, size_t len
, char *ebuf
)
1725 token
= malloc(len
+ 1);
1726 if (token
== NULL
) {
1727 pcap_fmt_errmsg_for_errno(ebuf
, PCAP_ERRBUF_SIZE
,
1731 memcpy(token
, p
, len
);
1737 * Parse a capture source that might be a URL.
1739 * If the source is not a URL, *schemep, *userinfop, *hostp, and *portp
1740 * are set to NULL, *pathp is set to point to the source, and 0 is
1743 * If source is a URL, and the URL refers to a local device (a special
1744 * case of rpcap:), *schemep, *userinfop, *hostp, and *portp are set
1745 * to NULL, *pathp is set to point to the device name, and 0 is returned.
1747 * If source is a URL, and it's not a special case that refers to a local
1748 * device, and the parse succeeds:
1750 * *schemep is set to point to an allocated string containing the scheme;
1752 * if user information is present in the URL, *userinfop is set to point
1753 * to an allocated string containing the user information, otherwise
1756 * if host information is present in the URL, *hostp is set to point
1757 * to an allocated string containing the host information, otherwise
1760 * if a port number is present in the URL, *portp is set to point
1761 * to an allocated string containing the port number, otherwise
1764 * *pathp is set to point to an allocated string containing the
1767 * and 0 is returned.
1769 * If the parse fails, ebuf is set to an error string, and -1 is returned.
1772 pcap_parse_source(const char *source
, char **schemep
, char **userinfop
,
1773 char **hostp
, char **portp
, char **pathp
, char *ebuf
)
1779 size_t authority_len
;
1781 char *parsep
, *atsignp
, *bracketp
;
1782 char *userinfo
, *host
, *port
, *path
;
1785 * Start out returning nothing.
1796 * URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
1798 * hier-part = "//" authority path-abempty
1803 * authority = [ userinfo "@" ] host [ ":" port ]
1805 * userinfo = *( unreserved / pct-encoded / sub-delims / ":" )
1807 * Step 1: look for the ":" at the end of the scheme.
1808 * A colon in the source is *NOT* sufficient to indicate that
1809 * this is a URL, as interface names on some platforms might
1810 * include colons (e.g., I think some Solaris interfaces
1813 colonp
= strchr(source
, ':');
1814 if (colonp
== NULL
) {
1816 * The source is the device to open.
1817 * Return a NULL pointer for the scheme, user information,
1818 * host, and port, and return the device as the path.
1820 *pathp
= strdup(source
);
1821 if (*pathp
== NULL
) {
1822 pcap_fmt_errmsg_for_errno(ebuf
, PCAP_ERRBUF_SIZE
,
1830 * All schemes must have "//" after them, i.e. we only support
1831 * hier-part = "//" authority path-abempty, not
1832 * hier-part = path-absolute
1833 * hier-part = path-rootless
1834 * hier-part = path-empty
1836 * We need that in order to distinguish between a local device
1837 * name that happens to contain a colon and a URI.
1839 if (strncmp(colonp
+ 1, "//", 2) != 0) {
1841 * The source is the device to open.
1842 * Return a NULL pointer for the scheme, user information,
1843 * host, and port, and return the device as the path.
1845 *pathp
= strdup(source
);
1846 if (*pathp
== NULL
) {
1847 pcap_fmt_errmsg_for_errno(ebuf
, PCAP_ERRBUF_SIZE
,
1855 * XXX - check whether the purported scheme could be a scheme?
1859 * OK, this looks like a URL.
1862 scheme_len
= colonp
- source
;
1863 scheme
= malloc(scheme_len
+ 1);
1864 if (scheme
== NULL
) {
1865 pcap_fmt_errmsg_for_errno(ebuf
, PCAP_ERRBUF_SIZE
,
1869 memcpy(scheme
, source
, scheme_len
);
1870 scheme
[scheme_len
] = '\0';
1873 * Treat file: specially - take everything after file:// as
1876 if (pcap_strcasecmp(scheme
, "file") == 0) {
1877 *pathp
= strdup(colonp
+ 3);
1878 if (*pathp
== NULL
) {
1879 pcap_fmt_errmsg_for_errno(ebuf
, PCAP_ERRBUF_SIZE
,
1889 * The WinPcap documentation says you can specify a local
1890 * interface with "rpcap://{device}"; we special-case
1891 * that here. If the scheme is "rpcap", and there are
1892 * no slashes past the "//", we just return the device.
1896 if ((pcap_strcasecmp(scheme
, "rpcap") == 0 ||
1897 pcap_strcasecmp(scheme
, "rpcaps") == 0) &&
1898 strchr(colonp
+ 3, '/') == NULL
) {
1902 * Return a NULL pointer for the scheme, user information,
1903 * host, and port, and return the device as the path.
1906 *pathp
= strdup(colonp
+ 3);
1907 if (*pathp
== NULL
) {
1908 pcap_fmt_errmsg_for_errno(ebuf
, PCAP_ERRBUF_SIZE
,
1916 * OK, now start parsing the authority.
1917 * Get token, terminated with / or terminated at the end of
1920 authority_len
= strcspn(colonp
+ 3, "/");
1921 authority
= get_substring(colonp
+ 3, authority_len
, ebuf
);
1922 if (authority
== NULL
) {
1929 endp
= colonp
+ 3 + authority_len
;
1932 * Now carve the authority field into its components.
1937 * Is there a userinfo field?
1939 atsignp
= strchr(parsep
, '@');
1940 if (atsignp
!= NULL
) {
1944 size_t userinfo_len
;
1946 userinfo_len
= atsignp
- parsep
;
1947 userinfo
= get_substring(parsep
, userinfo_len
, ebuf
);
1948 if (userinfo
== NULL
) {
1956 parsep
= atsignp
+ 1;
1965 * Is there a host field?
1967 if (*parsep
== '\0') {
1969 * No; there's no host field or port field.
1980 * Is it an IP-literal?
1982 if (*parsep
== '[') {
1985 * Treat everything up to the closing square
1986 * bracket as the IP-Literal; we don't worry
1987 * about whether it's a valid IPv6address or
1988 * IPvFuture (or an IPv4address, for that
1989 * matter, just in case we get handed a
1990 * URL with an IPv4 IP-Literal, of the sort
1991 * that pcap_createsrcstr() used to generate,
1992 * and that pcap_parsesrcstr(), in the original
1993 * WinPcap code, accepted).
1995 bracketp
= strchr(parsep
, ']');
1996 if (bracketp
== NULL
) {
1998 * There's no closing square bracket.
2000 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
2001 "IP-literal in URL doesn't end with ]");
2007 if (*(bracketp
+ 1) != '\0' &&
2008 *(bracketp
+ 1) != ':') {
2010 * There's extra crud after the
2011 * closing square bracket.
2013 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
2014 "Extra text after IP-literal in URL");
2020 host_len
= (bracketp
- 1) - parsep
;
2021 host
= get_substring(parsep
+ 1, host_len
, ebuf
);
2031 parsep
= bracketp
+ 1;
2035 * Treat everything up to a : or the end of
2036 * the string as the host.
2038 host_len
= strcspn(parsep
, ":");
2039 host
= get_substring(parsep
, host_len
, ebuf
);
2049 parsep
= parsep
+ host_len
;
2053 * Is there a port field?
2055 if (*parsep
== ':') {
2057 * Yes. It's the rest of the authority field.
2062 port_len
= strlen(parsep
);
2063 port
= get_substring(parsep
, port_len
, ebuf
);
2084 * Everything else is the path. Strip off the leading /.
2089 path
= strdup(endp
+ 1);
2091 pcap_fmt_errmsg_for_errno(ebuf
, PCAP_ERRBUF_SIZE
,
2100 *userinfop
= userinfo
;
2108 pcap_createsrcstr_ex(char *source
, int type
, const char *userinfo
, const char *host
,
2109 const char *port
, const char *name
, unsigned char uses_ssl
, char *errbuf
)
2114 pcap_strlcpy(source
, PCAP_SRC_FILE_STRING
, PCAP_BUF_SIZE
);
2115 if (name
!= NULL
&& *name
!= '\0') {
2116 pcap_strlcat(source
, name
, PCAP_BUF_SIZE
);
2119 snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
2120 "The file name cannot be NULL.");
2124 case PCAP_SRC_IFREMOTE
:
2125 pcap_strlcpy(source
,
2126 (uses_ssl
? "rpcaps://" : PCAP_SRC_IF_STRING
),
2128 if (host
!= NULL
&& *host
!= '\0') {
2129 if (userinfo
!= NULL
&& *userinfo
!= '\0') {
2130 pcap_strlcat(source
, userinfo
, PCAP_BUF_SIZE
);
2131 pcap_strlcat(source
, "@", PCAP_BUF_SIZE
);
2134 if (strchr(host
, ':') != NULL
) {
2136 * The host name contains a colon, so it's
2137 * probably an IPv6 address, and needs to
2138 * be included in square brackets.
2140 pcap_strlcat(source
, "[", PCAP_BUF_SIZE
);
2141 pcap_strlcat(source
, host
, PCAP_BUF_SIZE
);
2142 pcap_strlcat(source
, "]", PCAP_BUF_SIZE
);
2144 pcap_strlcat(source
, host
, PCAP_BUF_SIZE
);
2146 if (port
!= NULL
&& *port
!= '\0') {
2147 pcap_strlcat(source
, ":", PCAP_BUF_SIZE
);
2148 pcap_strlcat(source
, port
, PCAP_BUF_SIZE
);
2151 pcap_strlcat(source
, "/", PCAP_BUF_SIZE
);
2153 snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
2154 "The host name cannot be NULL.");
2158 if (name
!= NULL
&& *name
!= '\0')
2159 pcap_strlcat(source
, name
, PCAP_BUF_SIZE
);
2163 case PCAP_SRC_IFLOCAL
:
2164 pcap_strlcpy(source
, PCAP_SRC_IF_STRING
, PCAP_BUF_SIZE
);
2166 if (name
!= NULL
&& *name
!= '\0')
2167 pcap_strlcat(source
, name
, PCAP_BUF_SIZE
);
2172 snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
2173 "The interface type is not valid.");
2180 pcap_createsrcstr(char *source
, int type
, const char *host
, const char *port
,
2181 const char *name
, char *errbuf
)
2183 return (pcap_createsrcstr_ex(source
, type
, NULL
, host
, port
, name
, 0, errbuf
));
2187 pcap_parsesrcstr_ex(const char *source
, int *type
, char *userinfo
, char *host
,
2188 char *port
, char *name
, unsigned char *uses_ssl
, char *errbuf
)
2190 char *scheme
, *tmpuserinfo
, *tmphost
, *tmpport
, *tmppath
;
2192 /* Initialization stuff */
2204 /* Parse the source string */
2205 if (pcap_parse_source(source
, &scheme
, &tmpuserinfo
, &tmphost
,
2206 &tmpport
, &tmppath
, errbuf
) == -1) {
2213 if (scheme
== NULL
) {
2217 if (name
&& tmppath
)
2218 pcap_strlcpy(name
, tmppath
, PCAP_BUF_SIZE
);
2220 *type
= PCAP_SRC_IFLOCAL
;
2229 if (strcmp(scheme
, "rpcaps") == 0) {
2231 if (uses_ssl
) *uses_ssl
= 1;
2232 } else if (strcmp(scheme
, "rpcap") == 0) {
2240 * pcap_parse_source() has already handled the case of
2243 if (userinfo
&& tmpuserinfo
)
2244 pcap_strlcpy(userinfo
, tmpuserinfo
, PCAP_BUF_SIZE
);
2245 if (host
&& tmphost
)
2246 pcap_strlcpy(host
, tmphost
, PCAP_BUF_SIZE
);
2247 if (port
&& tmpport
)
2248 pcap_strlcpy(port
, tmpport
, PCAP_BUF_SIZE
);
2249 if (name
&& tmppath
)
2250 pcap_strlcpy(name
, tmppath
, PCAP_BUF_SIZE
);
2252 *type
= PCAP_SRC_IFREMOTE
;
2261 if (strcmp(scheme
, "file") == 0) {
2265 if (name
&& tmppath
)
2266 pcap_strlcpy(name
, tmppath
, PCAP_BUF_SIZE
);
2268 *type
= PCAP_SRC_FILE
;
2278 * Neither rpcap: nor file:; just treat the entire string
2279 * as a local device.
2282 pcap_strlcpy(name
, source
, PCAP_BUF_SIZE
);
2284 *type
= PCAP_SRC_IFLOCAL
;
2294 pcap_parsesrcstr(const char *source
, int *type
, char *host
, char *port
,
2295 char *name
, char *errbuf
)
2297 return (pcap_parsesrcstr_ex(source
, type
, NULL
, host
, port
, name
, NULL
, errbuf
));
2302 pcap_create(const char *device
, char *errbuf
)
2310 * A null device name is equivalent to the "any" device -
2311 * which might not be supported on this platform, but
2312 * this means that you'll get a "not supported" error
2313 * rather than, say, a crash when we try to dereference
2317 device_str
= strdup("any");
2321 * On Windows, for backwards compatibility reasons,
2322 * pcap_lookupdev() returns a pointer to a sequence of
2323 * pairs of UTF-16LE device names and local code page
2324 * description strings.
2326 * This means that if a program uses pcap_lookupdev()
2327 * to get a default device, and hands that to an API
2328 * that opens devices, we'll get handed a UTF-16LE
2329 * string, not a string in the local code page.
2331 * To work around that, we check whether the string
2332 * looks as if it might be a UTF-16LE string and, if
2333 * so, convert it back to the local code page's
2336 * We disable that check in "new API" mode, because:
2338 * 1) You *cannot* reliably detect whether a
2339 * string is UTF-16LE or not; "a" could either
2340 * be a one-character ASCII string or the first
2341 * character of a UTF-16LE string.
2343 * 2) Doing that test can run past the end of
2344 * the string, if it's a 1-character ASCII
2347 * This particular version of this heuristic dates
2348 * back to WinPcap 4.1.1; PacketOpenAdapter() does
2349 * uses the same heuristic, with the exact same
2352 * That's why we disable this in "new API" mode.
2353 * We keep it around in legacy mode for backwards
2356 if (!pcap_new_api
&& device
[0] != '\0' && device
[1] == '\0') {
2359 length
= wcslen((wchar_t *)device
);
2360 device_str
= (char *)malloc(length
+ 1);
2361 if (device_str
== NULL
) {
2362 pcap_fmt_errmsg_for_errno(errbuf
,
2363 PCAP_ERRBUF_SIZE
, errno
,
2368 snprintf(device_str
, length
+ 1, "%ws",
2369 (const wchar_t *)device
);
2372 device_str
= strdup(device
);
2374 if (device_str
== NULL
) {
2375 pcap_fmt_errmsg_for_errno(errbuf
, PCAP_ERRBUF_SIZE
,
2381 * Try each of the non-local-network-interface capture
2382 * source types until we find one that works for this
2383 * device or run out of types.
2385 for (i
= 0; capture_source_types
[i
].create_op
!= NULL
; i
++) {
2387 p
= capture_source_types
[i
].create_op(device_str
, errbuf
,
2391 * The device name refers to a device of the
2392 * type in question; either it succeeded,
2393 * in which case p refers to a pcap_t to
2394 * later activate for the device, or it
2395 * failed, in which case p is null and we
2396 * should return that to report the failure
2401 * We assume the caller filled in errbuf.
2406 p
->opt
.device
= device_str
;
2412 * OK, try it as a regular network interface.
2414 p
= pcap_create_interface(device_str
, errbuf
);
2417 * We assume the caller filled in errbuf.
2422 p
->opt
.device
= device_str
;
2427 * Set nonblocking mode on an unactivated pcap_t; this sets a flag
2428 * checked by pcap_activate(), which sets the mode after calling
2429 * the activate routine.
2432 pcap_setnonblock_unactivated(pcap_t
*p
, int nonblock
)
2434 p
->opt
.nonblock
= nonblock
;
2439 initialize_ops(pcap_t
*p
)
2442 * Set operation pointers for operations that only work on
2443 * an activated pcap_t to point to a routine that returns
2444 * a "this isn't activated" error.
2446 p
->read_op
= pcap_read_not_initialized
;
2447 p
->inject_op
= pcap_inject_not_initialized
;
2448 p
->setfilter_op
= pcap_setfilter_not_initialized
;
2449 p
->setdirection_op
= pcap_setdirection_not_initialized
;
2450 p
->set_datalink_op
= pcap_set_datalink_not_initialized
;
2451 p
->getnonblock_op
= pcap_getnonblock_not_initialized
;
2452 p
->stats_op
= pcap_stats_not_initialized
;
2454 p
->stats_ex_op
= pcap_stats_ex_not_initialized
;
2455 p
->setbuff_op
= pcap_setbuff_not_initialized
;
2456 p
->setmode_op
= pcap_setmode_not_initialized
;
2457 p
->setmintocopy_op
= pcap_setmintocopy_not_initialized
;
2458 p
->getevent_op
= pcap_getevent_not_initialized
;
2459 p
->oid_get_request_op
= pcap_oid_get_request_not_initialized
;
2460 p
->oid_set_request_op
= pcap_oid_set_request_not_initialized
;
2461 p
->sendqueue_transmit_op
= pcap_sendqueue_transmit_not_initialized
;
2462 p
->setuserbuffer_op
= pcap_setuserbuffer_not_initialized
;
2463 p
->live_dump_op
= pcap_live_dump_not_initialized
;
2464 p
->live_dump_ended_op
= pcap_live_dump_ended_not_initialized
;
2465 p
->get_airpcap_handle_op
= pcap_get_airpcap_handle_not_initialized
;
2469 * Default cleanup operation - implementations can override
2470 * this, but should call pcap_cleanup_live_common() after
2471 * doing their own additional cleanup.
2473 p
->cleanup_op
= pcap_cleanup_live_common
;
2476 * In most cases, the standard one-shot callback can
2477 * be used for pcap_next()/pcap_next_ex().
2479 p
->oneshot_callback
= pcap_oneshot
;
2482 * Default breakloop operation - implementations can override
2483 * this, but should call pcap_breakloop_common() before doing
2486 p
->breakloop_op
= pcap_breakloop_common
;
2490 pcap_alloc_pcap_t(char *ebuf
, size_t total_size
, size_t private_offset
)
2496 * total_size is the size of a structure containing a pcap_t
2497 * followed by a private structure.
2499 chunk
= calloc(total_size
, 1);
2500 if (chunk
== NULL
) {
2501 pcap_fmt_errmsg_for_errno(ebuf
, PCAP_ERRBUF_SIZE
,
2507 * Get a pointer to the pcap_t at the beginning.
2509 p
= (pcap_t
*)chunk
;
2512 p
->handle
= INVALID_HANDLE_VALUE
; /* not opened yet */
2514 p
->fd
= -1; /* not opened yet */
2516 p
->selectable_fd
= -1;
2517 p
->required_select_timeout
= NULL
;
2522 * private_offset is the offset, in bytes, of the private
2523 * data from the beginning of the structure.
2525 * Set the pointer to the private data; that's private_offset
2526 * bytes past the pcap_t.
2528 p
->priv
= (void *)(chunk
+ private_offset
);
2534 pcap_create_common(char *ebuf
, size_t total_size
, size_t private_offset
)
2538 p
= pcap_alloc_pcap_t(ebuf
, total_size
, private_offset
);
2543 * Default to "can't set rfmon mode"; if it's supported by
2544 * a platform, the create routine that called us can set
2545 * the op to its routine to check whether a particular
2546 * device supports it.
2548 p
->can_set_rfmon_op
= pcap_cant_set_rfmon
;
2551 * If pcap_setnonblock() is called on a not-yet-activated
2552 * pcap_t, default to setting a flag and turning
2553 * on non-blocking mode when activated.
2555 p
->setnonblock_op
= pcap_setnonblock_unactivated
;
2559 /* put in some defaults*/
2560 p
->snapshot
= 0; /* max packet size unspecified */
2561 p
->opt
.timeout
= 0; /* no timeout specified */
2562 p
->opt
.buffer_size
= 0; /* use the platform's default */
2565 p
->opt
.immediate
= 0;
2566 p
->opt
.tstamp_type
= -1; /* default to not setting time stamp type */
2567 p
->opt
.tstamp_precision
= PCAP_TSTAMP_PRECISION_MICRO
;
2569 * Platform-dependent options.
2572 p
->opt
.protocol
= 0;
2575 p
->opt
.nocapture_local
= 0;
2579 * Start out with no BPF code generation flags set.
2581 p
->bpf_codegen_flags
= 0;
2587 pcap_check_activated(pcap_t
*p
)
2590 snprintf(p
->errbuf
, PCAP_ERRBUF_SIZE
, "can't perform "
2591 " operation on activated capture");
2598 pcap_set_snaplen(pcap_t
*p
, int snaplen
)
2600 if (pcap_check_activated(p
))
2601 return (PCAP_ERROR_ACTIVATED
);
2602 p
->snapshot
= snaplen
;
2607 pcap_set_promisc(pcap_t
*p
, int promisc
)
2609 if (pcap_check_activated(p
))
2610 return (PCAP_ERROR_ACTIVATED
);
2611 p
->opt
.promisc
= promisc
;
2616 pcap_set_rfmon(pcap_t
*p
, int rfmon
)
2618 if (pcap_check_activated(p
))
2619 return (PCAP_ERROR_ACTIVATED
);
2620 p
->opt
.rfmon
= rfmon
;
2625 pcap_set_timeout(pcap_t
*p
, int timeout_ms
)
2627 if (pcap_check_activated(p
))
2628 return (PCAP_ERROR_ACTIVATED
);
2629 p
->opt
.timeout
= timeout_ms
;
2634 pcap_set_tstamp_type(pcap_t
*p
, int tstamp_type
)
2638 if (pcap_check_activated(p
))
2639 return (PCAP_ERROR_ACTIVATED
);
2642 * The argument should have been u_int, but that's too late
2643 * to change now - it's an API.
2645 if (tstamp_type
< 0)
2646 return (PCAP_WARNING_TSTAMP_TYPE_NOTSUP
);
2649 * If p->tstamp_type_count is 0, we only support PCAP_TSTAMP_HOST;
2650 * the default time stamp type is PCAP_TSTAMP_HOST.
2652 if (p
->tstamp_type_count
== 0) {
2653 if (tstamp_type
== PCAP_TSTAMP_HOST
) {
2654 p
->opt
.tstamp_type
= tstamp_type
;
2659 * Check whether we claim to support this type of time stamp.
2661 for (i
= 0; i
< p
->tstamp_type_count
; i
++) {
2662 if (p
->tstamp_type_list
[i
] == (u_int
)tstamp_type
) {
2666 p
->opt
.tstamp_type
= tstamp_type
;
2673 * We don't support this type of time stamp.
2675 return (PCAP_WARNING_TSTAMP_TYPE_NOTSUP
);
2679 pcap_set_immediate_mode(pcap_t
*p
, int immediate
)
2681 if (pcap_check_activated(p
))
2682 return (PCAP_ERROR_ACTIVATED
);
2683 p
->opt
.immediate
= immediate
;
2688 pcap_set_buffer_size(pcap_t
*p
, int buffer_size
)
2690 if (pcap_check_activated(p
))
2691 return (PCAP_ERROR_ACTIVATED
);
2692 if (buffer_size
<= 0) {
2694 * Silently ignore invalid values.
2698 p
->opt
.buffer_size
= buffer_size
;
2703 pcap_set_tstamp_precision(pcap_t
*p
, int tstamp_precision
)
2707 if (pcap_check_activated(p
))
2708 return (PCAP_ERROR_ACTIVATED
);
2711 * The argument should have been u_int, but that's too late
2712 * to change now - it's an API.
2714 if (tstamp_precision
< 0)
2715 return (PCAP_ERROR_TSTAMP_PRECISION_NOTSUP
);
2718 * If p->tstamp_precision_count is 0, we only support setting
2719 * the time stamp precision to microsecond precision; every
2720 * pcap module *MUST* support microsecond precision, even if
2721 * it does so by converting the native precision to
2724 if (p
->tstamp_precision_count
== 0) {
2725 if (tstamp_precision
== PCAP_TSTAMP_PRECISION_MICRO
) {
2726 p
->opt
.tstamp_precision
= tstamp_precision
;
2731 * Check whether we claim to support this precision of
2734 for (i
= 0; i
< p
->tstamp_precision_count
; i
++) {
2735 if (p
->tstamp_precision_list
[i
] == (u_int
)tstamp_precision
) {
2739 p
->opt
.tstamp_precision
= tstamp_precision
;
2746 * We don't support this time stamp precision.
2748 return (PCAP_ERROR_TSTAMP_PRECISION_NOTSUP
);
2752 pcap_get_tstamp_precision(pcap_t
*p
)
2754 return (p
->opt
.tstamp_precision
);
2758 pcap_activate(pcap_t
*p
)
2763 * Catch attempts to re-activate an already-activated
2764 * pcap_t; this should, for example, catch code that
2765 * calls pcap_open_live() followed by pcap_activate(),
2766 * as some code that showed up in a Stack Exchange
2769 if (pcap_check_activated(p
))
2770 return (PCAP_ERROR_ACTIVATED
);
2771 status
= p
->activate_op(p
);
2774 * If somebody requested non-blocking mode before
2775 * calling pcap_activate(), turn it on now.
2777 if (p
->opt
.nonblock
) {
2778 status
= p
->setnonblock_op(p
, 1);
2781 * Failed. Undo everything done by
2782 * the activate operation.
2791 if (p
->errbuf
[0] == '\0') {
2793 * No error message supplied by the activate routine;
2794 * for the benefit of programs that don't specially
2795 * handle errors other than PCAP_ERROR, return the
2796 * error message corresponding to the status.
2798 snprintf(p
->errbuf
, PCAP_ERRBUF_SIZE
, "%s",
2799 pcap_statustostr(status
));
2803 * Undo any operation pointer setting, etc. done by
2804 * the activate operation.
2812 pcap_open_live(const char *device
, int snaplen
, int promisc
, int to_ms
, char *errbuf
)
2816 #ifdef ENABLE_REMOTE
2817 char host
[PCAP_BUF_SIZE
+ 1];
2818 char port
[PCAP_BUF_SIZE
+ 1];
2819 char name
[PCAP_BUF_SIZE
+ 1];
2823 * A null device name is equivalent to the "any" device -
2824 * which might not be supported on this platform, but
2825 * this means that you'll get a "not supported" error
2826 * rather than, say, a crash when we try to dereference
2833 * Retrofit - we have to make older applications compatible with
2835 * So we're calling pcap_open_remote() from here; this is a very
2837 * Obviously, we cannot exploit all the new features; for instance,
2838 * we cannot send authentication, we cannot use a UDP data connection,
2841 if (pcap_parsesrcstr(device
, &srctype
, host
, port
, name
, errbuf
))
2844 if (srctype
== PCAP_SRC_IFREMOTE
) {
2846 * Although we already have host, port and iface, we prefer
2847 * to pass only 'device' to pcap_open_rpcap(), so that it has
2848 * to call pcap_parsesrcstr() again.
2849 * This is less optimized, but much clearer.
2851 return (pcap_open_rpcap(device
, snaplen
,
2852 promisc
? PCAP_OPENFLAG_PROMISCUOUS
: 0, to_ms
,
2855 if (srctype
== PCAP_SRC_FILE
) {
2856 snprintf(errbuf
, PCAP_ERRBUF_SIZE
, "unknown URL scheme \"file\"");
2859 if (srctype
== PCAP_SRC_IFLOCAL
) {
2861 * If it starts with rpcap://, that refers to a local device
2862 * (no host part in the URL). Remove the rpcap://, and
2863 * fall through to the regular open path.
2865 if (strncmp(device
, PCAP_SRC_IF_STRING
, strlen(PCAP_SRC_IF_STRING
)) == 0) {
2866 size_t len
= strlen(device
) - strlen(PCAP_SRC_IF_STRING
) + 1;
2869 device
+= strlen(PCAP_SRC_IF_STRING
);
2872 #endif /* ENABLE_REMOTE */
2874 p
= pcap_create(device
, errbuf
);
2877 status
= pcap_set_snaplen(p
, snaplen
);
2880 status
= pcap_set_promisc(p
, promisc
);
2883 status
= pcap_set_timeout(p
, to_ms
);
2887 * Mark this as opened with pcap_open_live(), so that, for
2888 * example, we show the full list of DLT_ values, rather
2889 * than just the ones that are compatible with capturing
2890 * when not in monitor mode. That allows existing applications
2891 * to work the way they used to work, but allows new applications
2892 * that know about the new open API to, for example, find out the
2893 * DLT_ values that they can select without changing whether
2894 * the adapter is in monitor mode or not.
2897 status
= pcap_activate(p
);
2902 if (status
== PCAP_ERROR
) {
2904 * Another buffer is a bit cumbersome, but it avoids
2905 * -Wformat-truncation.
2907 char trimbuf
[PCAP_ERRBUF_SIZE
- 5]; /* 2 bytes shorter */
2909 pcap_strlcpy(trimbuf
, p
->errbuf
, sizeof(trimbuf
));
2910 snprintf(errbuf
, PCAP_ERRBUF_SIZE
, "%s: %.*s", device
,
2911 PCAP_ERRBUF_SIZE
- 3, trimbuf
);
2912 } else if (status
== PCAP_ERROR_NO_SUCH_DEVICE
||
2913 status
== PCAP_ERROR_PERM_DENIED
||
2914 status
== PCAP_ERROR_PROMISC_PERM_DENIED
) {
2916 * Only show the additional message if it's not
2919 if (p
->errbuf
[0] != '\0') {
2923 char trimbuf
[PCAP_ERRBUF_SIZE
- 8]; /* 2 bytes shorter */
2925 pcap_strlcpy(trimbuf
, p
->errbuf
, sizeof(trimbuf
));
2926 snprintf(errbuf
, PCAP_ERRBUF_SIZE
, "%s: %s (%.*s)",
2927 device
, pcap_statustostr(status
),
2928 PCAP_ERRBUF_SIZE
- 6, trimbuf
);
2930 snprintf(errbuf
, PCAP_ERRBUF_SIZE
, "%s: %s",
2931 device
, pcap_statustostr(status
));
2934 snprintf(errbuf
, PCAP_ERRBUF_SIZE
, "%s: %s", device
,
2935 pcap_statustostr(status
));
2942 pcap_open_offline_common(char *ebuf
, size_t total_size
, size_t private_offset
)
2946 p
= pcap_alloc_pcap_t(ebuf
, total_size
, private_offset
);
2950 p
->opt
.tstamp_precision
= PCAP_TSTAMP_PRECISION_MICRO
;
2956 pcap_dispatch(pcap_t
*p
, int cnt
, pcap_handler callback
, u_char
*user
)
2958 return (p
->read_op(p
, cnt
, callback
, user
));
2962 pcap_loop(pcap_t
*p
, int cnt
, pcap_handler callback
, u_char
*user
)
2967 if (p
->rfile
!= NULL
) {
2969 * 0 means EOF, so don't loop if we get 0.
2971 n
= pcap_offline_read(p
, cnt
, callback
, user
);
2974 * XXX keep reading until we get something
2975 * (or an error occurs)
2978 n
= p
->read_op(p
, cnt
, callback
, user
);
2983 if (!PACKET_COUNT_IS_UNLIMITED(cnt
)) {
2992 * Force the loop in "pcap_read()" or "pcap_read_offline()" to terminate.
2995 pcap_breakloop(pcap_t
*p
)
3001 pcap_datalink(pcap_t
*p
)
3004 return (PCAP_ERROR_NOT_ACTIVATED
);
3005 return (p
->linktype
);
3009 pcap_datalink_ext(pcap_t
*p
)
3012 return (PCAP_ERROR_NOT_ACTIVATED
);
3013 return (p
->linktype_ext
);
3017 pcap_list_datalinks(pcap_t
*p
, int **dlt_buffer
)
3020 return (PCAP_ERROR_NOT_ACTIVATED
);
3021 if (p
->dlt_count
== 0) {
3023 * We couldn't fetch the list of DLTs, which means
3024 * this platform doesn't support changing the
3025 * DLT for an interface. Return a list of DLTs
3026 * containing only the DLT this device supports.
3028 *dlt_buffer
= (int*)malloc(sizeof(**dlt_buffer
));
3029 if (*dlt_buffer
== NULL
) {
3030 pcap_fmt_errmsg_for_errno(p
->errbuf
, sizeof(p
->errbuf
),
3032 return (PCAP_ERROR
);
3034 **dlt_buffer
= p
->linktype
;
3037 *dlt_buffer
= (int*)calloc(sizeof(**dlt_buffer
), p
->dlt_count
);
3038 if (*dlt_buffer
== NULL
) {
3039 pcap_fmt_errmsg_for_errno(p
->errbuf
, sizeof(p
->errbuf
),
3041 return (PCAP_ERROR
);
3043 (void)memcpy(*dlt_buffer
, p
->dlt_list
,
3044 sizeof(**dlt_buffer
) * p
->dlt_count
);
3045 return (p
->dlt_count
);
3050 * In Windows, you might have a library built with one version of the
3051 * C runtime library and an application built with another version of
3052 * the C runtime library, which means that the library might use one
3053 * version of malloc() and free() and the application might use another
3054 * version of malloc() and free(). If so, that means something
3055 * allocated by the library cannot be freed by the application, so we
3056 * need to have a pcap_free_datalinks() routine to free up the list
3057 * allocated by pcap_list_datalinks(), even though it's just a wrapper
3061 pcap_free_datalinks(int *dlt_list
)
3067 pcap_set_datalink(pcap_t
*p
, int dlt
)
3070 const char *dlt_name
;
3075 if (p
->dlt_count
== 0 || p
->set_datalink_op
== NULL
) {
3077 * We couldn't fetch the list of DLTs, or we don't
3078 * have a "set datalink" operation, which means
3079 * this platform doesn't support changing the
3080 * DLT for an interface. Check whether the new
3081 * DLT is the one this interface supports.
3083 if (p
->linktype
!= dlt
)
3087 * It is, so there's nothing we need to do here.
3091 for (i
= 0; i
< p
->dlt_count
; i
++)
3092 if (p
->dlt_list
[i
] == (u_int
)dlt
)
3094 if (i
>= p
->dlt_count
)
3096 if (p
->dlt_count
== 2 && p
->dlt_list
[0] == DLT_EN10MB
&&
3097 dlt
== DLT_DOCSIS
) {
3099 * This is presumably an Ethernet device, as the first
3100 * link-layer type it offers is DLT_EN10MB, and the only
3101 * other type it offers is DLT_DOCSIS. That means that
3102 * we can't tell the driver to supply DOCSIS link-layer
3103 * headers - we're just pretending that's what we're
3104 * getting, as, presumably, we're capturing on a dedicated
3105 * link to a Cisco Cable Modem Termination System, and
3106 * it's putting raw DOCSIS frames on the wire inside low-level
3112 if (p
->set_datalink_op(p
, dlt
) == -1)
3118 dlt_name
= pcap_datalink_val_to_name(dlt
);
3119 if (dlt_name
!= NULL
) {
3120 (void) snprintf(p
->errbuf
, sizeof(p
->errbuf
),
3121 "%s is not one of the DLTs supported by this device",
3124 (void) snprintf(p
->errbuf
, sizeof(p
->errbuf
),
3125 "DLT %d is not one of the DLTs supported by this device",
3132 * This array is designed for mapping upper and lower case letter
3133 * together for a case independent comparison. The mappings are
3134 * based upon ascii character sequences.
3136 static const u_char charmap
[] = {
3137 (u_char
)'\000', (u_char
)'\001', (u_char
)'\002', (u_char
)'\003',
3138 (u_char
)'\004', (u_char
)'\005', (u_char
)'\006', (u_char
)'\007',
3139 (u_char
)'\010', (u_char
)'\011', (u_char
)'\012', (u_char
)'\013',
3140 (u_char
)'\014', (u_char
)'\015', (u_char
)'\016', (u_char
)'\017',
3141 (u_char
)'\020', (u_char
)'\021', (u_char
)'\022', (u_char
)'\023',
3142 (u_char
)'\024', (u_char
)'\025', (u_char
)'\026', (u_char
)'\027',
3143 (u_char
)'\030', (u_char
)'\031', (u_char
)'\032', (u_char
)'\033',
3144 (u_char
)'\034', (u_char
)'\035', (u_char
)'\036', (u_char
)'\037',
3145 (u_char
)'\040', (u_char
)'\041', (u_char
)'\042', (u_char
)'\043',
3146 (u_char
)'\044', (u_char
)'\045', (u_char
)'\046', (u_char
)'\047',
3147 (u_char
)'\050', (u_char
)'\051', (u_char
)'\052', (u_char
)'\053',
3148 (u_char
)'\054', (u_char
)'\055', (u_char
)'\056', (u_char
)'\057',
3149 (u_char
)'\060', (u_char
)'\061', (u_char
)'\062', (u_char
)'\063',
3150 (u_char
)'\064', (u_char
)'\065', (u_char
)'\066', (u_char
)'\067',
3151 (u_char
)'\070', (u_char
)'\071', (u_char
)'\072', (u_char
)'\073',
3152 (u_char
)'\074', (u_char
)'\075', (u_char
)'\076', (u_char
)'\077',
3153 (u_char
)'\100', (u_char
)'\141', (u_char
)'\142', (u_char
)'\143',
3154 (u_char
)'\144', (u_char
)'\145', (u_char
)'\146', (u_char
)'\147',
3155 (u_char
)'\150', (u_char
)'\151', (u_char
)'\152', (u_char
)'\153',
3156 (u_char
)'\154', (u_char
)'\155', (u_char
)'\156', (u_char
)'\157',
3157 (u_char
)'\160', (u_char
)'\161', (u_char
)'\162', (u_char
)'\163',
3158 (u_char
)'\164', (u_char
)'\165', (u_char
)'\166', (u_char
)'\167',
3159 (u_char
)'\170', (u_char
)'\171', (u_char
)'\172', (u_char
)'\133',
3160 (u_char
)'\134', (u_char
)'\135', (u_char
)'\136', (u_char
)'\137',
3161 (u_char
)'\140', (u_char
)'\141', (u_char
)'\142', (u_char
)'\143',
3162 (u_char
)'\144', (u_char
)'\145', (u_char
)'\146', (u_char
)'\147',
3163 (u_char
)'\150', (u_char
)'\151', (u_char
)'\152', (u_char
)'\153',
3164 (u_char
)'\154', (u_char
)'\155', (u_char
)'\156', (u_char
)'\157',
3165 (u_char
)'\160', (u_char
)'\161', (u_char
)'\162', (u_char
)'\163',
3166 (u_char
)'\164', (u_char
)'\165', (u_char
)'\166', (u_char
)'\167',
3167 (u_char
)'\170', (u_char
)'\171', (u_char
)'\172', (u_char
)'\173',
3168 (u_char
)'\174', (u_char
)'\175', (u_char
)'\176', (u_char
)'\177',
3169 (u_char
)'\200', (u_char
)'\201', (u_char
)'\202', (u_char
)'\203',
3170 (u_char
)'\204', (u_char
)'\205', (u_char
)'\206', (u_char
)'\207',
3171 (u_char
)'\210', (u_char
)'\211', (u_char
)'\212', (u_char
)'\213',
3172 (u_char
)'\214', (u_char
)'\215', (u_char
)'\216', (u_char
)'\217',
3173 (u_char
)'\220', (u_char
)'\221', (u_char
)'\222', (u_char
)'\223',
3174 (u_char
)'\224', (u_char
)'\225', (u_char
)'\226', (u_char
)'\227',
3175 (u_char
)'\230', (u_char
)'\231', (u_char
)'\232', (u_char
)'\233',
3176 (u_char
)'\234', (u_char
)'\235', (u_char
)'\236', (u_char
)'\237',
3177 (u_char
)'\240', (u_char
)'\241', (u_char
)'\242', (u_char
)'\243',
3178 (u_char
)'\244', (u_char
)'\245', (u_char
)'\246', (u_char
)'\247',
3179 (u_char
)'\250', (u_char
)'\251', (u_char
)'\252', (u_char
)'\253',
3180 (u_char
)'\254', (u_char
)'\255', (u_char
)'\256', (u_char
)'\257',
3181 (u_char
)'\260', (u_char
)'\261', (u_char
)'\262', (u_char
)'\263',
3182 (u_char
)'\264', (u_char
)'\265', (u_char
)'\266', (u_char
)'\267',
3183 (u_char
)'\270', (u_char
)'\271', (u_char
)'\272', (u_char
)'\273',
3184 (u_char
)'\274', (u_char
)'\275', (u_char
)'\276', (u_char
)'\277',
3185 (u_char
)'\300', (u_char
)'\341', (u_char
)'\342', (u_char
)'\343',
3186 (u_char
)'\344', (u_char
)'\345', (u_char
)'\346', (u_char
)'\347',
3187 (u_char
)'\350', (u_char
)'\351', (u_char
)'\352', (u_char
)'\353',
3188 (u_char
)'\354', (u_char
)'\355', (u_char
)'\356', (u_char
)'\357',
3189 (u_char
)'\360', (u_char
)'\361', (u_char
)'\362', (u_char
)'\363',
3190 (u_char
)'\364', (u_char
)'\365', (u_char
)'\366', (u_char
)'\367',
3191 (u_char
)'\370', (u_char
)'\371', (u_char
)'\372', (u_char
)'\333',
3192 (u_char
)'\334', (u_char
)'\335', (u_char
)'\336', (u_char
)'\337',
3193 (u_char
)'\340', (u_char
)'\341', (u_char
)'\342', (u_char
)'\343',
3194 (u_char
)'\344', (u_char
)'\345', (u_char
)'\346', (u_char
)'\347',
3195 (u_char
)'\350', (u_char
)'\351', (u_char
)'\352', (u_char
)'\353',
3196 (u_char
)'\354', (u_char
)'\355', (u_char
)'\356', (u_char
)'\357',
3197 (u_char
)'\360', (u_char
)'\361', (u_char
)'\362', (u_char
)'\363',
3198 (u_char
)'\364', (u_char
)'\365', (u_char
)'\366', (u_char
)'\367',
3199 (u_char
)'\370', (u_char
)'\371', (u_char
)'\372', (u_char
)'\373',
3200 (u_char
)'\374', (u_char
)'\375', (u_char
)'\376', (u_char
)'\377',
3204 pcap_strcasecmp(const char *s1
, const char *s2
)
3206 register const u_char
*cm
= charmap
,
3207 *us1
= (const u_char
*)s1
,
3208 *us2
= (const u_char
*)s2
;
3210 while (cm
[*us1
] == cm
[*us2
++])
3213 return (cm
[*us1
] - cm
[*--us2
]);
3218 const char *description
;
3222 #define DLT_CHOICE(code, description) { #code, description, DLT_ ## code }
3223 #define DLT_CHOICE_SENTINEL { NULL, NULL, 0 }
3225 static struct dlt_choice dlt_choices
[] = {
3226 DLT_CHOICE(NULL
, "BSD loopback"),
3227 DLT_CHOICE(EN10MB
, "Ethernet"),
3228 DLT_CHOICE(IEEE802
, "Token ring"),
3229 DLT_CHOICE(ARCNET
, "BSD ARCNET"),
3230 DLT_CHOICE(SLIP
, "SLIP"),
3231 DLT_CHOICE(PPP
, "PPP"),
3232 DLT_CHOICE(FDDI
, "FDDI"),
3233 DLT_CHOICE(ATM_RFC1483
, "RFC 1483 LLC-encapsulated ATM"),
3234 DLT_CHOICE(RAW
, "Raw IP"),
3235 DLT_CHOICE(SLIP_BSDOS
, "BSD/OS SLIP"),
3236 DLT_CHOICE(PPP_BSDOS
, "BSD/OS PPP"),
3237 DLT_CHOICE(ATM_CLIP
, "Linux Classical IP over ATM"),
3238 DLT_CHOICE(PPP_SERIAL
, "PPP over serial"),
3239 DLT_CHOICE(PPP_ETHER
, "PPPoE"),
3240 DLT_CHOICE(SYMANTEC_FIREWALL
, "Symantec Firewall"),
3241 DLT_CHOICE(C_HDLC
, "Cisco HDLC"),
3242 DLT_CHOICE(IEEE802_11
, "802.11"),
3243 DLT_CHOICE(FRELAY
, "Frame Relay"),
3244 DLT_CHOICE(LOOP
, "OpenBSD loopback"),
3245 DLT_CHOICE(ENC
, "OpenBSD encapsulated IP"),
3246 DLT_CHOICE(LINUX_SLL
, "Linux cooked v1"),
3247 DLT_CHOICE(LTALK
, "Localtalk"),
3248 DLT_CHOICE(PFLOG
, "OpenBSD pflog file"),
3249 DLT_CHOICE(PFSYNC
, "Packet filter state syncing"),
3250 DLT_CHOICE(PRISM_HEADER
, "802.11 plus Prism header"),
3251 DLT_CHOICE(IP_OVER_FC
, "RFC 2625 IP-over-Fibre Channel"),
3252 DLT_CHOICE(SUNATM
, "Sun raw ATM"),
3253 DLT_CHOICE(IEEE802_11_RADIO
, "802.11 plus radiotap header"),
3254 DLT_CHOICE(ARCNET_LINUX
, "Linux ARCNET"),
3255 DLT_CHOICE(JUNIPER_MLPPP
, "Juniper Multi-Link PPP"),
3256 DLT_CHOICE(JUNIPER_MLFR
, "Juniper Multi-Link Frame Relay"),
3257 DLT_CHOICE(JUNIPER_ES
, "Juniper Encryption Services PIC"),
3258 DLT_CHOICE(JUNIPER_GGSN
, "Juniper GGSN PIC"),
3259 DLT_CHOICE(JUNIPER_MFR
, "Juniper FRF.16 Frame Relay"),
3260 DLT_CHOICE(JUNIPER_ATM2
, "Juniper ATM2 PIC"),
3261 DLT_CHOICE(JUNIPER_SERVICES
, "Juniper Advanced Services PIC"),
3262 DLT_CHOICE(JUNIPER_ATM1
, "Juniper ATM1 PIC"),
3263 DLT_CHOICE(APPLE_IP_OVER_IEEE1394
, "Apple IP-over-IEEE 1394"),
3264 DLT_CHOICE(MTP2_WITH_PHDR
, "SS7 MTP2 with Pseudo-header"),
3265 DLT_CHOICE(MTP2
, "SS7 MTP2"),
3266 DLT_CHOICE(MTP3
, "SS7 MTP3"),
3267 DLT_CHOICE(SCCP
, "SS7 SCCP"),
3268 DLT_CHOICE(DOCSIS
, "DOCSIS"),
3269 DLT_CHOICE(LINUX_IRDA
, "Linux IrDA"),
3270 DLT_CHOICE(IEEE802_11_RADIO_AVS
, "802.11 plus AVS radio information header"),
3271 DLT_CHOICE(JUNIPER_MONITOR
, "Juniper Passive Monitor PIC"),
3272 DLT_CHOICE(BACNET_MS_TP
, "BACnet MS/TP"),
3273 DLT_CHOICE(PPP_PPPD
, "PPP for pppd, with direction flag"),
3274 DLT_CHOICE(JUNIPER_PPPOE
, "Juniper PPPoE"),
3275 DLT_CHOICE(JUNIPER_PPPOE_ATM
, "Juniper PPPoE/ATM"),
3276 DLT_CHOICE(GPRS_LLC
, "GPRS LLC"),
3277 DLT_CHOICE(GPF_T
, "GPF-T"),
3278 DLT_CHOICE(GPF_F
, "GPF-F"),
3279 DLT_CHOICE(JUNIPER_PIC_PEER
, "Juniper PIC Peer"),
3280 DLT_CHOICE(ERF_ETH
, "Ethernet with Endace ERF header"),
3281 DLT_CHOICE(ERF_POS
, "Packet-over-SONET with Endace ERF header"),
3282 DLT_CHOICE(LINUX_LAPD
, "Linux vISDN LAPD"),
3283 DLT_CHOICE(JUNIPER_ETHER
, "Juniper Ethernet"),
3284 DLT_CHOICE(JUNIPER_PPP
, "Juniper PPP"),
3285 DLT_CHOICE(JUNIPER_FRELAY
, "Juniper Frame Relay"),
3286 DLT_CHOICE(JUNIPER_CHDLC
, "Juniper C-HDLC"),
3287 DLT_CHOICE(MFR
, "FRF.16 Frame Relay"),
3288 DLT_CHOICE(JUNIPER_VP
, "Juniper Voice PIC"),
3289 DLT_CHOICE(A429
, "Arinc 429"),
3290 DLT_CHOICE(A653_ICM
, "Arinc 653 Interpartition Communication"),
3291 DLT_CHOICE(USB_FREEBSD
, "USB with FreeBSD header"),
3292 DLT_CHOICE(BLUETOOTH_HCI_H4
, "Bluetooth HCI UART transport layer"),
3293 DLT_CHOICE(IEEE802_16_MAC_CPS
, "IEEE 802.16 MAC Common Part Sublayer"),
3294 DLT_CHOICE(USB_LINUX
, "USB with Linux header"),
3295 DLT_CHOICE(CAN20B
, "Controller Area Network (CAN) v. 2.0B"),
3296 DLT_CHOICE(IEEE802_15_4_LINUX
, "IEEE 802.15.4 with Linux padding"),
3297 DLT_CHOICE(PPI
, "Per-Packet Information"),
3298 DLT_CHOICE(IEEE802_16_MAC_CPS_RADIO
, "IEEE 802.16 MAC Common Part Sublayer plus radiotap header"),
3299 DLT_CHOICE(JUNIPER_ISM
, "Juniper Integrated Service Module"),
3300 DLT_CHOICE(IEEE802_15_4
, "IEEE 802.15.4 with FCS"),
3301 DLT_CHOICE(SITA
, "SITA pseudo-header"),
3302 DLT_CHOICE(ERF
, "Endace ERF header"),
3303 DLT_CHOICE(RAIF1
, "Ethernet with u10 Networks pseudo-header"),
3304 DLT_CHOICE(IPMB_KONTRON
, "IPMB with Kontron pseudo-header"),
3305 DLT_CHOICE(JUNIPER_ST
, "Juniper Secure Tunnel"),
3306 DLT_CHOICE(BLUETOOTH_HCI_H4_WITH_PHDR
, "Bluetooth HCI UART transport layer plus pseudo-header"),
3307 DLT_CHOICE(AX25_KISS
, "AX.25 with KISS header"),
3308 DLT_CHOICE(IPMB_LINUX
, "IPMB with Linux/Pigeon Point pseudo-header"),
3309 DLT_CHOICE(IEEE802_15_4_NONASK_PHY
, "IEEE 802.15.4 with non-ASK PHY data"),
3310 DLT_CHOICE(MPLS
, "MPLS with label as link-layer header"),
3311 DLT_CHOICE(LINUX_EVDEV
, "Linux evdev events"),
3312 DLT_CHOICE(USB_LINUX_MMAPPED
, "USB with padded Linux header"),
3313 DLT_CHOICE(DECT
, "DECT"),
3314 DLT_CHOICE(AOS
, "AOS Space Data Link protocol"),
3315 DLT_CHOICE(WIHART
, "WirelessHART"),
3316 DLT_CHOICE(FC_2
, "Fibre Channel FC-2"),
3317 DLT_CHOICE(FC_2_WITH_FRAME_DELIMS
, "Fibre Channel FC-2 with frame delimiters"),
3318 DLT_CHOICE(IPNET
, "Solaris ipnet"),
3319 DLT_CHOICE(CAN_SOCKETCAN
, "CAN-bus with SocketCAN headers"),
3320 DLT_CHOICE(IPV4
, "Raw IPv4"),
3321 DLT_CHOICE(IPV6
, "Raw IPv6"),
3322 DLT_CHOICE(IEEE802_15_4_NOFCS
, "IEEE 802.15.4 without FCS"),
3323 DLT_CHOICE(DBUS
, "D-Bus"),
3324 DLT_CHOICE(JUNIPER_VS
, "Juniper Virtual Server"),
3325 DLT_CHOICE(JUNIPER_SRX_E2E
, "Juniper SRX E2E"),
3326 DLT_CHOICE(JUNIPER_FIBRECHANNEL
, "Juniper Fibre Channel"),
3327 DLT_CHOICE(DVB_CI
, "DVB-CI"),
3328 DLT_CHOICE(MUX27010
, "MUX27010"),
3329 DLT_CHOICE(STANAG_5066_D_PDU
, "STANAG 5066 D_PDUs"),
3330 DLT_CHOICE(JUNIPER_ATM_CEMIC
, "Juniper ATM CEMIC"),
3331 DLT_CHOICE(NFLOG
, "Linux netfilter log messages"),
3332 DLT_CHOICE(NETANALYZER
, "Ethernet with Hilscher netANALYZER pseudo-header"),
3333 DLT_CHOICE(NETANALYZER_TRANSPARENT
, "Ethernet with Hilscher netANALYZER pseudo-header and with preamble and SFD"),
3334 DLT_CHOICE(IPOIB
, "RFC 4391 IP-over-Infiniband"),
3335 DLT_CHOICE(MPEG_2_TS
, "MPEG-2 transport stream"),
3336 DLT_CHOICE(NG40
, "ng40 protocol tester Iub/Iur"),
3337 DLT_CHOICE(NFC_LLCP
, "NFC LLCP PDUs with pseudo-header"),
3338 DLT_CHOICE(INFINIBAND
, "InfiniBand"),
3339 DLT_CHOICE(SCTP
, "SCTP"),
3340 DLT_CHOICE(USBPCAP
, "USB with USBPcap header"),
3341 DLT_CHOICE(RTAC_SERIAL
, "Schweitzer Engineering Laboratories RTAC packets"),
3342 DLT_CHOICE(BLUETOOTH_LE_LL
, "Bluetooth Low Energy air interface"),
3343 DLT_CHOICE(NETLINK
, "Linux netlink"),
3344 DLT_CHOICE(BLUETOOTH_LINUX_MONITOR
, "Bluetooth Linux Monitor"),
3345 DLT_CHOICE(BLUETOOTH_BREDR_BB
, "Bluetooth Basic Rate/Enhanced Data Rate baseband packets"),
3346 DLT_CHOICE(BLUETOOTH_LE_LL_WITH_PHDR
, "Bluetooth Low Energy air interface with pseudo-header"),
3347 DLT_CHOICE(PROFIBUS_DL
, "PROFIBUS data link layer"),
3348 DLT_CHOICE(PKTAP
, "Apple DLT_PKTAP"),
3349 DLT_CHOICE(EPON
, "Ethernet with 802.3 Clause 65 EPON preamble"),
3350 DLT_CHOICE(IPMI_HPM_2
, "IPMI trace packets"),
3351 DLT_CHOICE(ZWAVE_R1_R2
, "Z-Wave RF profile R1 and R2 packets"),
3352 DLT_CHOICE(ZWAVE_R3
, "Z-Wave RF profile R3 packets"),
3353 DLT_CHOICE(WATTSTOPPER_DLM
, "WattStopper Digital Lighting Management (DLM) and Legrand Nitoo Open protocol"),
3354 DLT_CHOICE(ISO_14443
, "ISO 14443 messages"),
3355 DLT_CHOICE(RDS
, "IEC 62106 Radio Data System groups"),
3356 DLT_CHOICE(USB_DARWIN
, "USB with Darwin header"),
3357 DLT_CHOICE(OPENFLOW
, "OpenBSD DLT_OPENFLOW"),
3358 DLT_CHOICE(SDLC
, "IBM SDLC frames"),
3359 DLT_CHOICE(TI_LLN_SNIFFER
, "TI LLN sniffer frames"),
3360 DLT_CHOICE(VSOCK
, "Linux vsock"),
3361 DLT_CHOICE(NORDIC_BLE
, "Nordic Semiconductor Bluetooth LE sniffer frames"),
3362 DLT_CHOICE(DOCSIS31_XRA31
, "Excentis XRA-31 DOCSIS 3.1 RF sniffer frames"),
3363 DLT_CHOICE(ETHERNET_MPACKET
, "802.3br mPackets"),
3364 DLT_CHOICE(DISPLAYPORT_AUX
, "DisplayPort AUX channel monitoring data"),
3365 DLT_CHOICE(LINUX_SLL2
, "Linux cooked v2"),
3366 DLT_CHOICE(OPENVIZSLA
, "OpenVizsla USB"),
3367 DLT_CHOICE(EBHSCR
, "Elektrobit High Speed Capture and Replay (EBHSCR)"),
3368 DLT_CHOICE(VPP_DISPATCH
, "VPP graph dispatch tracer"),
3369 DLT_CHOICE(DSA_TAG_BRCM
, "Broadcom tag"),
3370 DLT_CHOICE(DSA_TAG_BRCM_PREPEND
, "Broadcom tag (prepended)"),
3371 DLT_CHOICE(IEEE802_15_4_TAP
, "IEEE 802.15.4 with pseudo-header"),
3372 DLT_CHOICE(DSA_TAG_DSA
, "Marvell DSA"),
3373 DLT_CHOICE(DSA_TAG_EDSA
, "Marvell EDSA"),
3374 DLT_CHOICE(ELEE
, "ELEE lawful intercept packets"),
3375 DLT_CHOICE(Z_WAVE_SERIAL
, "Z-Wave serial frames between host and chip"),
3376 DLT_CHOICE(USB_2_0
, "USB 2.0/1.1/1.0 as transmitted over the cable"),
3377 DLT_CHOICE(ATSC_ALP
, "ATSC Link-Layer Protocol packets"),
3378 DLT_CHOICE(ETW
, "Event Tracing for Windows messages"),
3379 DLT_CHOICE(NETANALYZER_NG
, "Hilscher netANALYZER NG pseudo-footer"),
3380 DLT_CHOICE(ZBOSS_NCP
, "ZBOSS NCP protocol with pseudo-header"),
3381 DLT_CHOICE(USB_2_0_LOW_SPEED
, "Low-Speed USB 2.0/1.1/1.0 as transmitted over the cable"),
3382 DLT_CHOICE(USB_2_0_FULL_SPEED
, "Full-Speed USB 2.0/1.1/1.0 as transmitted over the cable"),
3383 DLT_CHOICE(USB_2_0_HIGH_SPEED
, "High-Speed USB 2.0 as transmitted over the cable"),
3384 DLT_CHOICE(AUERSWALD_LOG
, "Auerswald Logger Protocol"),
3385 DLT_CHOICE(ZWAVE_TAP
, "Z-Wave packets with a TAP meta-data header"),
3386 DLT_CHOICE(SILABS_DEBUG_CHANNEL
, "Silicon Labs debug channel protocol"),
3387 DLT_CHOICE(FIRA_UCI
, "Ultra-wideband controller interface protocol"),
3392 pcap_datalink_name_to_val(const char *name
)
3396 for (i
= 0; dlt_choices
[i
].name
!= NULL
; i
++) {
3397 if (pcap_strcasecmp(dlt_choices
[i
].name
, name
) == 0)
3398 return (dlt_choices
[i
].dlt
);
3404 pcap_datalink_val_to_name(int dlt
)
3408 for (i
= 0; dlt_choices
[i
].name
!= NULL
; i
++) {
3409 if (dlt_choices
[i
].dlt
== dlt
)
3410 return (dlt_choices
[i
].name
);
3416 pcap_datalink_val_to_description(int dlt
)
3420 for (i
= 0; dlt_choices
[i
].name
!= NULL
; i
++) {
3421 if (dlt_choices
[i
].dlt
== dlt
)
3422 return (dlt_choices
[i
].description
);
3428 pcap_datalink_val_to_description_or_dlt(int dlt
)
3430 static thread_local
char unkbuf
[40];
3431 const char *description
;
3433 description
= pcap_datalink_val_to_description(dlt
);
3434 if (description
!= NULL
) {
3437 (void)snprintf(unkbuf
, sizeof(unkbuf
), "DLT %d", dlt
);
3442 struct tstamp_type_choice
{
3444 const char *description
;
3448 static struct tstamp_type_choice tstamp_type_choices
[] = {
3449 { "host", "Host", PCAP_TSTAMP_HOST
},
3450 { "host_lowprec", "Host, low precision", PCAP_TSTAMP_HOST_LOWPREC
},
3451 { "host_hiprec", "Host, high precision", PCAP_TSTAMP_HOST_HIPREC
},
3452 { "adapter", "Adapter", PCAP_TSTAMP_ADAPTER
},
3453 { "adapter_unsynced", "Adapter, not synced with system time", PCAP_TSTAMP_ADAPTER_UNSYNCED
},
3454 { "host_hiprec_unsynced", "Host, high precision, not synced with system time", PCAP_TSTAMP_HOST_HIPREC_UNSYNCED
},
3459 pcap_tstamp_type_name_to_val(const char *name
)
3463 for (i
= 0; tstamp_type_choices
[i
].name
!= NULL
; i
++) {
3464 if (pcap_strcasecmp(tstamp_type_choices
[i
].name
, name
) == 0)
3465 return (tstamp_type_choices
[i
].type
);
3467 return (PCAP_ERROR
);
3471 pcap_tstamp_type_val_to_name(int tstamp_type
)
3475 for (i
= 0; tstamp_type_choices
[i
].name
!= NULL
; i
++) {
3476 if (tstamp_type_choices
[i
].type
== tstamp_type
)
3477 return (tstamp_type_choices
[i
].name
);
3483 pcap_tstamp_type_val_to_description(int tstamp_type
)
3487 for (i
= 0; tstamp_type_choices
[i
].name
!= NULL
; i
++) {
3488 if (tstamp_type_choices
[i
].type
== tstamp_type
)
3489 return (tstamp_type_choices
[i
].description
);
3495 pcap_snapshot(pcap_t
*p
)
3498 return (PCAP_ERROR_NOT_ACTIVATED
);
3499 return (p
->snapshot
);
3503 pcap_is_swapped(pcap_t
*p
)
3506 return (PCAP_ERROR_NOT_ACTIVATED
);
3507 return (p
->swapped
);
3511 pcap_major_version(pcap_t
*p
)
3514 return (PCAP_ERROR_NOT_ACTIVATED
);
3515 return (p
->version_major
);
3519 pcap_minor_version(pcap_t
*p
)
3522 return (PCAP_ERROR_NOT_ACTIVATED
);
3523 return (p
->version_minor
);
3527 pcap_bufsize(pcap_t
*p
)
3530 return (PCAP_ERROR_NOT_ACTIVATED
);
3531 return (p
->bufsize
);
3535 pcap_file(pcap_t
*p
)
3542 pcap_fileno(pcap_t
*p
)
3544 if (p
->handle
!= INVALID_HANDLE_VALUE
) {
3546 * This is a bogus and now-deprecated API; we
3547 * squelch the narrowing warning for the cast
3548 * from HANDLE to intptr_t. If Windows programmers
3549 * need to get at the HANDLE for a pcap_t, *if*
3550 * there is one, they should request such a
3551 * routine (and be prepared for it to return
3552 * INVALID_HANDLE_VALUE).
3555 return ((int)(intptr_t)p
->handle
);
3558 return (PCAP_ERROR
);
3562 pcap_fileno(pcap_t
*p
)
3568 #if !defined(_WIN32) && !defined(MSDOS)
3570 pcap_get_selectable_fd(pcap_t
*p
)
3572 return (p
->selectable_fd
);
3575 const struct timeval
*
3576 pcap_get_required_select_timeout(pcap_t
*p
)
3578 return (p
->required_select_timeout
);
3583 pcap_perror(pcap_t
*p
, const char *prefix
)
3585 fprintf(stderr
, "%s: %s\n", prefix
, p
->errbuf
);
3589 pcap_geterr(pcap_t
*p
)
3595 pcap_getnonblock(pcap_t
*p
, char *errbuf
)
3599 ret
= p
->getnonblock_op(p
);
3602 * The get nonblock operation sets p->errbuf; this
3603 * function *shouldn't* have had a separate errbuf
3604 * argument, as it didn't need one, but I goofed
3607 * We copy the error message to errbuf, so callers
3608 * can find it in either place.
3610 pcap_strlcpy(errbuf
, p
->errbuf
, PCAP_ERRBUF_SIZE
);
3616 * Get the current non-blocking mode setting, under the assumption that
3617 * it's just the standard POSIX non-blocking flag.
3619 #if !defined(_WIN32) && !defined(MSDOS)
3621 pcap_getnonblock_fd(pcap_t
*p
)
3625 fdflags
= fcntl(p
->fd
, F_GETFL
, 0);
3626 if (fdflags
== -1) {
3627 pcap_fmt_errmsg_for_errno(p
->errbuf
, PCAP_ERRBUF_SIZE
,
3631 if (fdflags
& O_NONBLOCK
)
3639 pcap_setnonblock(pcap_t
*p
, int nonblock
, char *errbuf
)
3643 ret
= p
->setnonblock_op(p
, nonblock
);
3646 * The set nonblock operation sets p->errbuf; this
3647 * function *shouldn't* have had a separate errbuf
3648 * argument, as it didn't need one, but I goofed
3651 * We copy the error message to errbuf, so callers
3652 * can find it in either place.
3654 pcap_strlcpy(errbuf
, p
->errbuf
, PCAP_ERRBUF_SIZE
);
3659 #if !defined(_WIN32) && !defined(MSDOS)
3661 * Set non-blocking mode, under the assumption that it's just the
3662 * standard POSIX non-blocking flag. (This can be called by the
3663 * per-platform non-blocking-mode routine if that routine also
3664 * needs to do some additional work.)
3667 pcap_setnonblock_fd(pcap_t
*p
, int nonblock
)
3671 fdflags
= fcntl(p
->fd
, F_GETFL
, 0);
3672 if (fdflags
== -1) {
3673 pcap_fmt_errmsg_for_errno(p
->errbuf
, PCAP_ERRBUF_SIZE
,
3678 fdflags
|= O_NONBLOCK
;
3680 fdflags
&= ~O_NONBLOCK
;
3681 if (fcntl(p
->fd
, F_SETFL
, fdflags
) == -1) {
3682 pcap_fmt_errmsg_for_errno(p
->errbuf
, PCAP_ERRBUF_SIZE
,
3691 * Generate error strings for PCAP_ERROR_ and PCAP_WARNING_ values.
3694 pcap_statustostr(int errnum
)
3696 static thread_local
char ebuf
[15+10+1];
3701 return("Generic warning");
3703 case PCAP_WARNING_TSTAMP_TYPE_NOTSUP
:
3704 return ("That type of time stamp is not supported by that device");
3706 case PCAP_WARNING_PROMISC_NOTSUP
:
3707 return ("That device doesn't support promiscuous mode");
3710 return("Generic error");
3712 case PCAP_ERROR_BREAK
:
3713 return("Loop terminated by pcap_breakloop");
3715 case PCAP_ERROR_NOT_ACTIVATED
:
3716 return("The pcap_t has not been activated");
3718 case PCAP_ERROR_ACTIVATED
:
3719 return ("The setting can't be changed after the pcap_t is activated");
3721 case PCAP_ERROR_NO_SUCH_DEVICE
:
3722 return ("No such device exists");
3724 case PCAP_ERROR_RFMON_NOTSUP
:
3725 return ("That device doesn't support monitor mode");
3727 case PCAP_ERROR_NOT_RFMON
:
3728 return ("That operation is supported only in monitor mode");
3730 case PCAP_ERROR_PERM_DENIED
:
3731 return ("You don't have permission to perform this capture on that device");
3733 case PCAP_ERROR_IFACE_NOT_UP
:
3734 return ("That device is not up");
3736 case PCAP_ERROR_CANTSET_TSTAMP_TYPE
:
3737 return ("That device doesn't support setting the time stamp type");
3739 case PCAP_ERROR_PROMISC_PERM_DENIED
:
3740 return ("You don't have permission to capture in promiscuous mode on that device");
3742 case PCAP_ERROR_TSTAMP_PRECISION_NOTSUP
:
3743 return ("That device doesn't support that time stamp precision");
3745 (void)snprintf(ebuf
, sizeof ebuf
, "Unknown error: %d", errnum
);
3750 * Not all systems have strerror().
3753 pcap_strerror(int errnum
)
3755 #ifdef HAVE_STRERROR
3757 static thread_local
char errbuf
[PCAP_ERRBUF_SIZE
];
3758 errno_t err
= strerror_s(errbuf
, PCAP_ERRBUF_SIZE
, errnum
);
3760 if (err
!= 0) /* err = 0 if successful */
3761 pcap_strlcpy(errbuf
, "strerror_s() error", PCAP_ERRBUF_SIZE
);
3764 return (strerror(errnum
));
3767 extern int sys_nerr
;
3768 extern const char *const sys_errlist
[];
3769 static thread_local
char errbuf
[PCAP_ERRBUF_SIZE
];
3771 if ((unsigned int)errnum
< sys_nerr
)
3772 return ((char *)sys_errlist
[errnum
]);
3773 (void)snprintf(errbuf
, sizeof errbuf
, "Unknown error: %d", errnum
);
3779 pcap_setfilter(pcap_t
*p
, struct bpf_program
*fp
)
3781 return (p
->setfilter_op(p
, fp
));
3785 * Set direction flag, which controls whether we accept only incoming
3786 * packets, only outgoing packets, or both.
3787 * Note that, depending on the platform, some or all direction arguments
3788 * might not be supported.
3791 pcap_setdirection(pcap_t
*p
, pcap_direction_t d
)
3793 if (p
->setdirection_op
== NULL
) {
3794 snprintf(p
->errbuf
, PCAP_ERRBUF_SIZE
,
3795 "Setting direction is not supported on this device");
3806 return (p
->setdirection_op(p
, d
));
3810 * Invalid direction.
3812 snprintf(p
->errbuf
, sizeof(p
->errbuf
),
3813 "Invalid direction");
3820 pcap_stats(pcap_t
*p
, struct pcap_stat
*ps
)
3822 return (p
->stats_op(p
, ps
));
3827 pcap_stats_ex(pcap_t
*p
, int *pcap_stat_size
)
3829 return (p
->stats_ex_op(p
, pcap_stat_size
));
3833 pcap_setbuff(pcap_t
*p
, int dim
)
3835 return (p
->setbuff_op(p
, dim
));
3839 pcap_setmode(pcap_t
*p
, int mode
)
3841 return (p
->setmode_op(p
, mode
));
3845 pcap_setmintocopy(pcap_t
*p
, int size
)
3847 return (p
->setmintocopy_op(p
, size
));
3851 pcap_getevent(pcap_t
*p
)
3853 return (p
->getevent_op(p
));
3857 pcap_oid_get_request(pcap_t
*p
, bpf_u_int32 oid
, void *data
, size_t *lenp
)
3859 return (p
->oid_get_request_op(p
, oid
, data
, lenp
));
3863 pcap_oid_set_request(pcap_t
*p
, bpf_u_int32 oid
, const void *data
, size_t *lenp
)
3865 return (p
->oid_set_request_op(p
, oid
, data
, lenp
));
3869 pcap_sendqueue_alloc(u_int memsize
)
3871 pcap_send_queue
*tqueue
;
3873 /* Allocate the queue */
3874 tqueue
= (pcap_send_queue
*)malloc(sizeof(pcap_send_queue
));
3875 if (tqueue
== NULL
){
3879 /* Allocate the buffer */
3880 tqueue
->buffer
= (char *)malloc(memsize
);
3881 if (tqueue
->buffer
== NULL
) {
3886 tqueue
->maxlen
= memsize
;
3893 pcap_sendqueue_destroy(pcap_send_queue
*queue
)
3895 free(queue
->buffer
);
3900 pcap_sendqueue_queue(pcap_send_queue
*queue
, const struct pcap_pkthdr
*pkt_header
, const u_char
*pkt_data
)
3902 if (queue
->len
+ sizeof(struct pcap_pkthdr
) + pkt_header
->caplen
> queue
->maxlen
){
3906 /* Copy the pcap_pkthdr header*/
3907 memcpy(queue
->buffer
+ queue
->len
, pkt_header
, sizeof(struct pcap_pkthdr
));
3908 queue
->len
+= sizeof(struct pcap_pkthdr
);
3910 /* copy the packet */
3911 memcpy(queue
->buffer
+ queue
->len
, pkt_data
, pkt_header
->caplen
);
3912 queue
->len
+= pkt_header
->caplen
;
3918 pcap_sendqueue_transmit(pcap_t
*p
, pcap_send_queue
*queue
, int sync
)
3920 return (p
->sendqueue_transmit_op(p
, queue
, sync
));
3924 pcap_setuserbuffer(pcap_t
*p
, int size
)
3926 return (p
->setuserbuffer_op(p
, size
));
3930 pcap_live_dump(pcap_t
*p
, char *filename
, int maxsize
, int maxpacks
)
3932 return (p
->live_dump_op(p
, filename
, maxsize
, maxpacks
));
3936 pcap_live_dump_ended(pcap_t
*p
, int sync
)
3938 return (p
->live_dump_ended_op(p
, sync
));
3942 pcap_get_airpcap_handle(pcap_t
*p
)
3944 PAirpcapHandle handle
;
3946 handle
= p
->get_airpcap_handle_op(p
);
3947 if (handle
== NULL
) {
3948 (void)snprintf(p
->errbuf
, sizeof(p
->errbuf
),
3949 "This isn't an AirPcap device");
3956 * On some platforms, we need to clean up promiscuous or monitor mode
3957 * when we close a device - and we want that to happen even if the
3958 * application just exits without explicitly closing devices.
3959 * On those platforms, we need to register a "close all the pcaps"
3960 * routine to be called when we exit, and need to maintain a list of
3961 * pcaps that need to be closed to clean up modes.
3963 * XXX - not thread-safe.
3967 * List of pcaps on which we've done something that needs to be
3969 * If there are any such pcaps, we arrange to call "pcap_close_all()"
3970 * when we exit, and have it close all of them.
3972 static struct pcap
*pcaps_to_close
;
3975 * TRUE if we've already called "atexit()" to cause "pcap_close_all()" to
3976 * be called on exit.
3978 static int did_atexit
;
3981 pcap_close_all(void)
3983 struct pcap
*handle
;
3985 while ((handle
= pcaps_to_close
) != NULL
) {
3989 * If a pcap module adds a pcap_t to the "close all"
3990 * list by calling pcap_add_to_pcaps_to_close(), it
3991 * must have a cleanup routine that removes it from the
3992 * list, by calling pcap_remove_from_pcaps_to_close(),
3993 * and must make that cleanup routine the cleanup_op
3996 * That means that, after pcap_close() - which calls
3997 * the cleanup_op for the pcap_t - the pcap_t must
3998 * have been removed from the list, so pcaps_to_close
3999 * must not be equal to handle.
4001 * We check for that, and abort if handle is still
4002 * at the head of the list, to prevent infinite loops.
4004 if (pcaps_to_close
== handle
)
4010 pcap_do_addexit(pcap_t
*p
)
4013 * If we haven't already done so, arrange to have
4014 * "pcap_close_all()" called when we exit.
4017 if (atexit(pcap_close_all
) != 0) {
4019 * "atexit()" failed; let our caller know.
4021 pcap_strlcpy(p
->errbuf
, "atexit failed", PCAP_ERRBUF_SIZE
);
4030 pcap_add_to_pcaps_to_close(pcap_t
*p
)
4032 p
->next
= pcaps_to_close
;
4037 pcap_remove_from_pcaps_to_close(pcap_t
*p
)
4039 pcap_t
*pc
, *prevpc
;
4041 for (pc
= pcaps_to_close
, prevpc
= NULL
; pc
!= NULL
;
4042 prevpc
= pc
, pc
= pc
->next
) {
4045 * Found it. Remove it from the list.
4047 if (prevpc
== NULL
) {
4049 * It was at the head of the list.
4051 pcaps_to_close
= pc
->next
;
4054 * It was in the middle of the list.
4056 prevpc
->next
= pc
->next
;
4064 pcap_breakloop_common(pcap_t
*p
)
4071 pcap_cleanup_live_common(pcap_t
*p
)
4073 if (p
->opt
.device
!= NULL
) {
4074 free(p
->opt
.device
);
4075 p
->opt
.device
= NULL
;
4077 if (p
->buffer
!= NULL
) {
4081 if (p
->dlt_list
!= NULL
) {
4086 if (p
->tstamp_type_list
!= NULL
) {
4087 free(p
->tstamp_type_list
);
4088 p
->tstamp_type_list
= NULL
;
4089 p
->tstamp_type_count
= 0;
4091 if (p
->tstamp_precision_list
!= NULL
) {
4092 free(p
->tstamp_precision_list
);
4093 p
->tstamp_precision_list
= NULL
;
4094 p
->tstamp_precision_count
= 0;
4096 pcap_freecode(&p
->fcode
);
4097 #if !defined(_WIN32) && !defined(MSDOS)
4102 p
->selectable_fd
= -1;
4107 * API compatible with WinPcap's "send a packet" routine - returns -1
4108 * on error, 0 otherwise.
4110 * XXX - what if we get a short write?
4113 pcap_sendpacket(pcap_t
*p
, const u_char
*buf
, int size
)
4116 pcap_fmt_errmsg_for_errno(p
->errbuf
, PCAP_ERRBUF_SIZE
,
4117 errno
, "The number of bytes to be sent must be positive");
4118 return (PCAP_ERROR
);
4121 if (p
->inject_op(p
, buf
, size
) == -1)
4127 * API compatible with OpenBSD's "send a packet" routine - returns -1 on
4128 * error, number of bytes written otherwise.
4131 pcap_inject(pcap_t
*p
, const void *buf
, size_t size
)
4134 * We return the number of bytes written, so the number of
4135 * bytes to write must fit in an int.
4137 if (size
> INT_MAX
) {
4138 pcap_fmt_errmsg_for_errno(p
->errbuf
, PCAP_ERRBUF_SIZE
,
4139 errno
, "More than %d bytes cannot be injected", INT_MAX
);
4140 return (PCAP_ERROR
);
4144 pcap_fmt_errmsg_for_errno(p
->errbuf
, PCAP_ERRBUF_SIZE
,
4145 errno
, "The number of bytes to be injected must not be zero");
4146 return (PCAP_ERROR
);
4149 return (p
->inject_op(p
, buf
, (int)size
));
4153 pcap_close(pcap_t
*p
)
4160 * Helpers for safely loading code at run time.
4161 * Currently Windows-only.
4165 // This wrapper around loadlibrary appends the system folder (usually
4166 // C:\Windows\System32) to the relative path of the DLL, so that the DLL
4167 // is always loaded from an absolute path (it's no longer possible to
4168 // load modules from the application folder).
4169 // This solves the DLL Hijacking issue discovered in August 2010:
4171 // https://blog.rapid7.com/2010/08/23/exploiting-dll-hijacking-flaws/
4172 // https://blog.rapid7.com/2010/08/23/application-dll-load-hijacking/
4173 // (the purported Rapid7 blog post link in the first of those two links
4174 // is broken; the second of those links works.)
4176 // If any links there are broken from all the content shuffling Rapid&
4177 // did, see archived versions of the posts at their original homes, at
4179 // https://web.archive.org/web/20110122175058/http://blog.metasploit.com/2010/08/exploiting-dll-hijacking-flaws.html
4180 // https://web.archive.org/web/20100828112111/http://blog.rapid7.com/?p=5325
4183 pcap_load_code(const char *name
)
4186 * XXX - should this work in UTF-16LE rather than in the local
4189 CHAR path
[MAX_PATH
];
4190 CHAR fullFileName
[MAX_PATH
];
4192 HMODULE hModule
= NULL
;
4196 res
= GetSystemDirectoryA(path
, MAX_PATH
);
4200 // some bad failure occurred;
4205 if (res
> MAX_PATH
) {
4207 // the buffer was not big enough
4209 SetLastError(ERROR_INSUFFICIENT_BUFFER
);
4213 if (res
+ 1 + strlen(name
) + 1 < MAX_PATH
) {
4214 memcpy(fullFileName
, path
, res
* sizeof(TCHAR
));
4215 fullFileName
[res
] = '\\';
4216 memcpy(&fullFileName
[res
+ 1], name
, (strlen(name
) + 1) * sizeof(TCHAR
));
4218 hModule
= LoadLibraryA(fullFileName
);
4220 SetLastError(ERROR_INSUFFICIENT_BUFFER
);
4228 pcap_find_function(pcap_code_handle_t code
, const char *func
)
4230 return (GetProcAddress(code
, func
));
4235 * Given a BPF program, a pcap_pkthdr structure for a packet, and the raw
4236 * data for the packet, check whether the packet passes the filter.
4237 * Returns the return value of the filter program, which will be zero if
4238 * the packet doesn't pass and non-zero if the packet does pass.
4241 pcap_offline_filter(const struct bpf_program
*fp
, const struct pcap_pkthdr
*h
,
4244 const struct bpf_insn
*fcode
= fp
->bf_insns
;
4247 return (pcap_filter(fcode
, pkt
, h
->len
, h
->caplen
));
4253 pcap_can_set_rfmon_dead(pcap_t
*p
)
4255 snprintf(p
->errbuf
, PCAP_ERRBUF_SIZE
,
4256 "Rfmon mode doesn't apply on a pcap_open_dead pcap_t");
4257 return (PCAP_ERROR
);
4261 pcap_read_dead(pcap_t
*p
, int cnt _U_
, pcap_handler callback _U_
,
4264 snprintf(p
->errbuf
, PCAP_ERRBUF_SIZE
,
4265 "Packets aren't available from a pcap_open_dead pcap_t");
4270 pcap_breakloop_dead(pcap_t
*p _U_
)
4273 * A "dead" pcap_t is just a placeholder to use in order to
4274 * compile a filter to BPF code or to open a savefile for
4275 * writing. It doesn't support any operations, including
4276 * capturing or reading packets, so there will never be a
4277 * get-packets loop in progress to break out *of*.
4279 * As such, this routine doesn't need to do anything.
4284 pcap_inject_dead(pcap_t
*p
, const void *buf _U_
, int size _U_
)
4286 snprintf(p
->errbuf
, PCAP_ERRBUF_SIZE
,
4287 "Packets can't be sent on a pcap_open_dead pcap_t");
4292 pcap_setfilter_dead(pcap_t
*p
, struct bpf_program
*fp _U_
)
4294 snprintf(p
->errbuf
, PCAP_ERRBUF_SIZE
,
4295 "A filter cannot be set on a pcap_open_dead pcap_t");
4300 pcap_setdirection_dead(pcap_t
*p
, pcap_direction_t d _U_
)
4302 snprintf(p
->errbuf
, PCAP_ERRBUF_SIZE
,
4303 "The packet direction cannot be set on a pcap_open_dead pcap_t");
4308 pcap_set_datalink_dead(pcap_t
*p
, int dlt _U_
)
4310 snprintf(p
->errbuf
, PCAP_ERRBUF_SIZE
,
4311 "The link-layer header type cannot be set on a pcap_open_dead pcap_t");
4316 pcap_getnonblock_dead(pcap_t
*p
)
4318 snprintf(p
->errbuf
, PCAP_ERRBUF_SIZE
,
4319 "A pcap_open_dead pcap_t does not have a non-blocking mode setting");
4324 pcap_setnonblock_dead(pcap_t
*p
, int nonblock _U_
)
4326 snprintf(p
->errbuf
, PCAP_ERRBUF_SIZE
,
4327 "A pcap_open_dead pcap_t does not have a non-blocking mode setting");
4332 pcap_stats_dead(pcap_t
*p
, struct pcap_stat
*ps _U_
)
4334 snprintf(p
->errbuf
, PCAP_ERRBUF_SIZE
,
4335 "Statistics aren't available from a pcap_open_dead pcap_t");
4340 static struct pcap_stat
*
4341 pcap_stats_ex_dead(pcap_t
*p
, int *pcap_stat_size _U_
)
4343 snprintf(p
->errbuf
, PCAP_ERRBUF_SIZE
,
4344 "Statistics aren't available from a pcap_open_dead pcap_t");
4349 pcap_setbuff_dead(pcap_t
*p
, int dim _U_
)
4351 snprintf(p
->errbuf
, PCAP_ERRBUF_SIZE
,
4352 "The kernel buffer size cannot be set on a pcap_open_dead pcap_t");
4357 pcap_setmode_dead(pcap_t
*p
, int mode _U_
)
4359 snprintf(p
->errbuf
, PCAP_ERRBUF_SIZE
,
4360 "impossible to set mode on a pcap_open_dead pcap_t");
4365 pcap_setmintocopy_dead(pcap_t
*p
, int size _U_
)
4367 snprintf(p
->errbuf
, PCAP_ERRBUF_SIZE
,
4368 "The mintocopy parameter cannot be set on a pcap_open_dead pcap_t");
4373 pcap_getevent_dead(pcap_t
*p
)
4375 snprintf(p
->errbuf
, PCAP_ERRBUF_SIZE
,
4376 "A pcap_open_dead pcap_t has no event handle");
4377 return (INVALID_HANDLE_VALUE
);
4381 pcap_oid_get_request_dead(pcap_t
*p
, bpf_u_int32 oid _U_
, void *data _U_
,
4384 snprintf(p
->errbuf
, PCAP_ERRBUF_SIZE
,
4385 "An OID get request cannot be performed on a pcap_open_dead pcap_t");
4386 return (PCAP_ERROR
);
4390 pcap_oid_set_request_dead(pcap_t
*p
, bpf_u_int32 oid _U_
, const void *data _U_
,
4393 snprintf(p
->errbuf
, PCAP_ERRBUF_SIZE
,
4394 "An OID set request cannot be performed on a pcap_open_dead pcap_t");
4395 return (PCAP_ERROR
);
4399 pcap_sendqueue_transmit_dead(pcap_t
*p
, pcap_send_queue
*queue _U_
,
4402 snprintf(p
->errbuf
, PCAP_ERRBUF_SIZE
,
4403 "Packets cannot be transmitted on a pcap_open_dead pcap_t");
4408 pcap_setuserbuffer_dead(pcap_t
*p
, int size _U_
)
4410 snprintf(p
->errbuf
, PCAP_ERRBUF_SIZE
,
4411 "The user buffer cannot be set on a pcap_open_dead pcap_t");
4416 pcap_live_dump_dead(pcap_t
*p
, char *filename _U_
, int maxsize _U_
,
4419 snprintf(p
->errbuf
, PCAP_ERRBUF_SIZE
,
4420 "Live packet dumping cannot be performed on a pcap_open_dead pcap_t");
4425 pcap_live_dump_ended_dead(pcap_t
*p
, int sync _U_
)
4427 snprintf(p
->errbuf
, PCAP_ERRBUF_SIZE
,
4428 "Live packet dumping cannot be performed on a pcap_open_dead pcap_t");
4432 static PAirpcapHandle
4433 pcap_get_airpcap_handle_dead(pcap_t
*p _U_
)
4440 pcap_cleanup_dead(pcap_t
*p _U_
)
4442 /* Nothing to do. */
4446 pcap_open_dead_with_tstamp_precision(int linktype
, int snaplen
, u_int precision
)
4450 switch (precision
) {
4452 case PCAP_TSTAMP_PRECISION_MICRO
:
4453 case PCAP_TSTAMP_PRECISION_NANO
:
4458 * This doesn't really matter, but we don't have any way
4459 * to report particular errors, so the only failure we
4460 * should have is a memory allocation failure. Just
4461 * pick microsecond precision.
4463 precision
= PCAP_TSTAMP_PRECISION_MICRO
;
4466 p
= malloc(sizeof(*p
));
4469 memset (p
, 0, sizeof(*p
));
4470 p
->snapshot
= snaplen
;
4471 p
->linktype
= linktype
;
4472 p
->opt
.tstamp_precision
= precision
;
4473 p
->can_set_rfmon_op
= pcap_can_set_rfmon_dead
;
4474 p
->read_op
= pcap_read_dead
;
4475 p
->inject_op
= pcap_inject_dead
;
4476 p
->setfilter_op
= pcap_setfilter_dead
;
4477 p
->setdirection_op
= pcap_setdirection_dead
;
4478 p
->set_datalink_op
= pcap_set_datalink_dead
;
4479 p
->getnonblock_op
= pcap_getnonblock_dead
;
4480 p
->setnonblock_op
= pcap_setnonblock_dead
;
4481 p
->stats_op
= pcap_stats_dead
;
4483 p
->stats_ex_op
= pcap_stats_ex_dead
;
4484 p
->setbuff_op
= pcap_setbuff_dead
;
4485 p
->setmode_op
= pcap_setmode_dead
;
4486 p
->setmintocopy_op
= pcap_setmintocopy_dead
;
4487 p
->getevent_op
= pcap_getevent_dead
;
4488 p
->oid_get_request_op
= pcap_oid_get_request_dead
;
4489 p
->oid_set_request_op
= pcap_oid_set_request_dead
;
4490 p
->sendqueue_transmit_op
= pcap_sendqueue_transmit_dead
;
4491 p
->setuserbuffer_op
= pcap_setuserbuffer_dead
;
4492 p
->live_dump_op
= pcap_live_dump_dead
;
4493 p
->live_dump_ended_op
= pcap_live_dump_ended_dead
;
4494 p
->get_airpcap_handle_op
= pcap_get_airpcap_handle_dead
;
4496 p
->breakloop_op
= pcap_breakloop_dead
;
4497 p
->cleanup_op
= pcap_cleanup_dead
;
4500 * A "dead" pcap_t never requires special BPF code generation.
4502 p
->bpf_codegen_flags
= 0;
4509 pcap_open_dead(int linktype
, int snaplen
)
4511 return (pcap_open_dead_with_tstamp_precision(linktype
, snaplen
,
4512 PCAP_TSTAMP_PRECISION_MICRO
));
4517 * Set the internal "debug printout" flag for the filter expression parser.
4518 * The code to print that stuff is present only if YYDEBUG is defined, so
4519 * the flag, and the routine to set it, are defined only if YYDEBUG is
4522 * This is intended for libpcap developers, not for general use.
4523 * If you want to set these in a program, you'll have to declare this
4524 * routine yourself, with the appropriate DLL import attribute on Windows;
4525 * it's not declared in any header file, and won't be declared in any
4526 * header file provided by libpcap.
4528 PCAP_API
void pcap_set_parser_debug(int value
);
4531 pcap_set_parser_debug(int value
)