diff options
-rw-r--r-- | interface.h | 3 | ||||
-rw-r--r-- | print-usb.c | 63 | ||||
-rw-r--r-- | tcpdump.c | 14 |
3 files changed, 57 insertions, 23 deletions
diff --git a/interface.h b/interface.h index 2507168a..3638ddf7 100644 --- a/interface.h +++ b/interface.h @@ -318,7 +318,8 @@ extern void bfd_print(const u_char *, u_int, u_int); extern void sip_print(const u_char *, u_int); extern void syslog_print(const u_char *, u_int); extern u_int bt_if_print(const struct pcap_pkthdr *, const u_char *); -extern u_int usb_linux_print(const struct pcap_pkthdr *, const u_char *); +extern u_int usb_linux_48_byte_print(const struct pcap_pkthdr *, const u_char *); +extern u_int usb_linux_64_byte_print(const struct pcap_pkthdr *, const u_char *); #ifdef INET6 extern void ip6_print(const u_char *, u_int); diff --git a/print-usb.c b/print-usb.c index 1195133f..8e15e7bf 100644 --- a/print-usb.c +++ b/print-usb.c @@ -36,7 +36,8 @@ #include <pcap/usb.h> /* returns direction: 1=inbound 2=outbound -1=invalid */ -static int get_direction(int transfer_type, int event_type) +static int +get_direction(int transfer_type, int event_type) { int direction; @@ -79,23 +80,11 @@ static int get_direction(int transfer_type, int event_type) return direction; } -/* - * This is the top level routine of the printer. 'p' points - * to the ether header of the packet, 'h->ts' is the timestamp, - * 'h->len' is the length of the packet off the wire, and 'h->caplen' - * is the number of bytes actually captured. - */ -u_int usb_linux_print(const struct pcap_pkthdr *h, register const u_char *p) +static void +usb_header_print(const pcap_usb_header *uh) { - const pcap_usb_header *uh; int direction; - if (h->caplen < sizeof(pcap_usb_header)) { - printf("[|usb]"); - return(sizeof(pcap_usb_header)); - } - - uh = (const pcap_usb_header *) p; switch(uh->transfer_type) { case URB_ISOCHRONOUS: @@ -135,9 +124,51 @@ u_int usb_linux_print(const struct pcap_pkthdr *h, register const u_char *p) else if(direction == 2) printf(" to"); printf(" %d:%d:%d", uh->bus_id, uh->device_address, uh->endpoint_number & 0x7f); +} + +/* + * This is the top level routine of the printer for captures with a + * 48-byte header. + * + * 'p' points to the header of the packet, 'h->ts' is the timestamp, + * 'h->len' is the length of the packet off the wire, and 'h->caplen' + * is the number of bytes actually captured. + */ +u_int +usb_linux_48_byte_print(const struct pcap_pkthdr *h, register const u_char *p) +{ + if (h->caplen < sizeof(pcap_usb_header)) { + printf("[|usb]"); + return(sizeof(pcap_usb_header)); + } + + usb_header_print((const pcap_usb_header *) p); return(sizeof(pcap_usb_header)); } -#endif +#ifdef DLT_USB_LINUX_MMAPPED +/* + * This is the top level routine of the printer for captures with a + * 64-byte header. + * + * 'p' points to the header of the packet, 'h->ts' is the timestamp, + * 'h->len' is the length of the packet off the wire, and 'h->caplen' + * is the number of bytes actually captured. + */ +u_int +usb_linux_64_byte_print(const struct pcap_pkthdr *h, register const u_char *p) +{ + if (h->caplen < sizeof(pcap_usb_header_mmapped)) { + printf("[|usb]"); + return(sizeof(pcap_usb_header_mmapped)); + } + + usb_header_print((const pcap_usb_header *) p); + + return(sizeof(pcap_usb_header_mmapped)); +} +#endif /* DLT_USB_LINUX_MMAPPED */ + +#endif /* defined(HAVE_PCAP_USB_H) && defined(DLT_USB_LINUX) */ @@ -285,12 +285,14 @@ static struct printer printers[] = { #if defined(DLT_BLUETOOTH_HCI_H4_WITH_PHDR) && defined(HAVE_PCAP_BLUETOOTH_H) { 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}, -#endif -#if defined(HAVE_PCAP_USB_H) && defined(DLT_USB_LINUX_MMAPPED) - { usb_linux_print, DLT_USB_LINUX_MMAPPED}, -#endif +#ifdef HAVE_PCAP_USB_H +#ifdef DLT_USB_LINUX + { usb_linux_48_byte_print, DLT_USB_LINUX}, +#endif /* DLT_USB_LINUX */ +#ifdef DLT_USB_LINUX_MMAPPED + { usb_linux_64_byte_print, DLT_USB_LINUX_MMAPPED}, +#endif /* DLT_USB_LINUX_MMAPPED */ +#endif /* HAVE_PCAP_USB_H */ #ifdef DLT_IPV4 { raw_if_print, DLT_IPV4 }, #endif |