X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/72553e343da66ecfb6e7826a2fce121b9015cffd..refs/heads/tcpdump-4.6:/print-usb.c diff --git a/print-usb.c b/print-usb.c index 1195133f..75f78fc9 100644 --- a/print-usb.c +++ b/print-usb.c @@ -19,24 +19,24 @@ * */ +#define NETDISSECT_REWORKED #ifdef HAVE_CONFIG_H #include "config.h" #endif #include -#include -#include -#include - #include "interface.h" #if defined(HAVE_PCAP_USB_H) && defined(DLT_USB_LINUX) #include +static const char tstr[] = "[|usb]"; + /* 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,65 +79,97 @@ 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(netdissect_options *ndo, 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: - printf("ISOCHRONOUS"); + ND_PRINT((ndo, "ISOCHRONOUS")); break; case URB_INTERRUPT: - printf("INTERRUPT"); + ND_PRINT((ndo, "INTERRUPT")); break; case URB_CONTROL: - printf("CONTROL"); + ND_PRINT((ndo, "CONTROL")); break; case URB_BULK: - printf("BULK"); + ND_PRINT((ndo, "BULK")); break; default: - printf(" ?"); + ND_PRINT((ndo, " ?")); } switch(uh->event_type) { case URB_SUBMIT: - printf(" SUBMIT"); + ND_PRINT((ndo, " SUBMIT")); break; case URB_COMPLETE: - printf(" COMPLETE"); + ND_PRINT((ndo, " COMPLETE")); break; case URB_ERROR: - printf(" ERROR"); + ND_PRINT((ndo, " ERROR")); break; default: - printf(" ?"); + ND_PRINT((ndo, " ?")); } direction = get_direction(uh->transfer_type, uh->event_type); if(direction == 1) - printf(" from"); + ND_PRINT((ndo, " from")); else if(direction == 2) - printf(" to"); - printf(" %d:%d:%d", uh->bus_id, uh->device_address, uh->endpoint_number & 0x7f); + ND_PRINT((ndo, " to")); + ND_PRINT((ndo, " %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(netdissect_options *ndo, const struct pcap_pkthdr *h, + register const u_char *p) +{ + if (h->caplen < sizeof(pcap_usb_header)) { + ND_PRINT((ndo, "%s", tstr)); + return(sizeof(pcap_usb_header)); + } + + usb_header_print(ndo, (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(netdissect_options *ndo, const struct pcap_pkthdr *h, + register const u_char *p) +{ + if (h->caplen < sizeof(pcap_usb_header_mmapped)) { + ND_PRINT((ndo, "%s", tstr)); + return(sizeof(pcap_usb_header_mmapped)); + } + + usb_header_print(ndo, (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) */