static RETSIGTYPE cleanup(int);
static RETSIGTYPE child_cleanup(int);
static void usage(void) __attribute__((noreturn));
-static void show_dlts_and_exit(pcap_t *pd) __attribute__((noreturn));
+static void show_dlts_and_exit(const char *device, pcap_t *pd) __attribute__((noreturn));
static void print_packet(u_char *, const struct pcap_pkthdr *, const u_char *);
static void ndo_default_print(netdissect_options *, const u_char *, u_int);
{ cip_if_print, DLT_CIP },
#endif
#ifdef DLT_ATM_CLIP
- { cip_if_print, DLT_ATM_CLIP },
+ { cip_if_print, DLT_ATM_CLIP },
#endif
{ sl_if_print, DLT_SLIP },
#ifdef DLT_SLIP_BSDOS
{ chdlc_if_print, DLT_HDLC },
#endif
#ifdef DLT_PPP_SERIAL
- { ppp_hdlc_if_print, DLT_PPP_SERIAL },
+ { ppp_hdlc_if_print, DLT_PPP_SERIAL },
#endif
#ifdef DLT_PPP_ETHER
{ pppoe_if_print, DLT_PPP_ETHER },
{ ltalk_if_print, DLT_LTALK },
#endif
#if defined(DLT_PFLOG) && defined(HAVE_NET_PFVAR_H)
- { pflog_if_print, DLT_PFLOG },
+ { pflog_if_print, DLT_PFLOG },
#endif
#ifdef DLT_FR
{ fr_if_print, DLT_FR },
{ ieee802_11_radio_if_print, DLT_IEEE802_11_RADIO },
#endif
#ifdef DLT_ENC
- { enc_if_print, DLT_ENC },
+ { enc_if_print, DLT_ENC },
#endif
#ifdef DLT_SYMANTEC_FIREWALL
- { symantec_if_print, DLT_SYMANTEC_FIREWALL },
+ { symantec_if_print, DLT_SYMANTEC_FIREWALL },
#endif
#ifdef DLT_APPLE_IP_OVER_IEEE1394
{ ap1394_if_print, DLT_APPLE_IP_OVER_IEEE1394 },
{ juniper_services_print, DLT_JUNIPER_SERVICES },
#endif
#ifdef DLT_JUNIPER_ETHER
- { juniper_ether_print, DLT_JUNIPER_ETHER },
+ { juniper_ether_print, DLT_JUNIPER_ETHER },
#endif
#ifdef DLT_JUNIPER_PPP
- { juniper_ppp_print, DLT_JUNIPER_PPP },
+ { juniper_ppp_print, DLT_JUNIPER_PPP },
#endif
#ifdef DLT_JUNIPER_FRELAY
- { juniper_frelay_print, DLT_JUNIPER_FRELAY },
+ { juniper_frelay_print, DLT_JUNIPER_FRELAY },
#endif
#ifdef DLT_JUNIPER_CHDLC
- { juniper_chdlc_print, DLT_JUNIPER_CHDLC },
+ { juniper_chdlc_print, DLT_JUNIPER_CHDLC },
#endif
#ifdef DLT_MFR
- { mfr_if_print, DLT_MFR },
+ { mfr_if_print, DLT_MFR },
#endif
#if defined(DLT_BLUETOOTH_HCI_H4_WITH_PHDR) && defined(HAVE_PCAP_BLUETOOTH_H)
- { bt_if_print, DLT_BLUETOOTH_HCI_H4_WITH_PHDR},
+ { bt_if_print, DLT_BLUETOOTH_HCI_H4_WITH_PHDR},
#endif
#if defined(HAVE_PCAP_USB_H) && defined(DLT_USB_LINUX)
- { usb_linux_print, DLT_USB_LINUX},
+ { usb_linux_print, DLT_USB_LINUX},
#endif
#if defined(HAVE_PCAP_USB_H) && defined(DLT_USB_LINUX_MMAPPED)
- { usb_linux_print, DLT_USB_LINUX_MMAPPED},
+ { usb_linux_print, DLT_USB_LINUX_MMAPPED},
#endif
{ NULL, 0 },
};
static struct ndo_printer ndo_printers[] = {
#ifdef DLT_IPNET
- { ipnet_if_print, DLT_IPNET },
+ { ipnet_if_print, DLT_IPNET },
+#endif
+#ifdef DLT_IPV4
+ { raw_if_print, DLT_IPV4 },
+#endif
+#ifdef DLT_IPV6
+ { raw_if_print, DLT_IPV6 },
#endif
{ NULL, 0 },
};
static pcap_t *pd;
+static int supports_monitor_mode;
+
extern int optind;
extern int opterr;
extern char *optarg;
};
static void
-show_dlts_and_exit(pcap_t *pd)
+show_dlts_and_exit(const char *device, pcap_t *pd)
{
int n_dlts;
int *dlts = 0;
else if (n_dlts == 0 || !dlts)
error("No data link types.");
- (void) fprintf(stderr, "Data link types (use option -y to set):\n");
+ /*
+ * If the interface is known to support monitor mode, indicate
+ * whether these are the data link types available when not in
+ * monitor mode, if -I wasn't specified, or when in monitor mode,
+ * when -I was specified (the link-layer types available in
+ * monitor mode might be different from the ones available when
+ * not in monitor mode).
+ */
+ if (supports_monitor_mode)
+ (void) fprintf(stderr, "Data link types for %s %s (use option -y to set):\n",
+ device,
+ Iflag ? "when in monitor mode" : "when not in monitor mode");
+ else
+ (void) fprintf(stderr, "Data link types for %s (use option -y to set):\n",
+ device);
while (--n_dlts >= 0) {
dlt_name = pcap_datalink_val_to_name(dlts[n_dlts]);
pd = pcap_create(device, ebuf);
if (pd == NULL)
error("%s", ebuf);
+ /*
+ * Is this an interface that supports monitor mode?
+ */
+ if (pcap_can_set_rfmon(pd) == 1)
+ supports_monitor_mode = 1;
+ else
+ supports_monitor_mode = 0;
status = pcap_set_snaplen(pd, snaplen);
if (status != 0)
error("%s: pcap_set_snaplen failed: %s",
}
#endif /* !defined(HAVE_PCAP_CREATE) && defined(WIN32) */
if (Lflag)
- show_dlts_and_exit(pd);
+ show_dlts_and_exit(device, pd);
if (gndo->ndo_dlt >= 0) {
#ifdef HAVE_PCAP_SET_DATALINK
if (pcap_set_datalink(pd, gndo->ndo_dlt) < 0)