1*b636d99dSDavid van Moolenbroek /*
2*b636d99dSDavid van Moolenbroek * Copyright 2009 Bert Vermeulen <bert@biot.com>
3*b636d99dSDavid van Moolenbroek *
4*b636d99dSDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without
5*b636d99dSDavid van Moolenbroek * modification, are permitted provided that: (1) source code distributions
6*b636d99dSDavid van Moolenbroek * retain the above copyright notice and this paragraph in its entirety, (2)
7*b636d99dSDavid van Moolenbroek * distributions including binary code include the above copyright notice and
8*b636d99dSDavid van Moolenbroek * this paragraph in its entirety in the documentation or other materials
9*b636d99dSDavid van Moolenbroek * provided with the distribution, and (3) all advertising materials mentioning
10*b636d99dSDavid van Moolenbroek * features or use of this software display the following acknowledgement:
11*b636d99dSDavid van Moolenbroek * ``This product includes software developed by Paolo Abeni.''
12*b636d99dSDavid van Moolenbroek * The name of author may not be used to endorse or promote products derived
13*b636d99dSDavid van Moolenbroek * from this software without specific prior written permission.
14*b636d99dSDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
15*b636d99dSDavid van Moolenbroek * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
16*b636d99dSDavid van Moolenbroek * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
17*b636d99dSDavid van Moolenbroek *
18*b636d99dSDavid van Moolenbroek * Support for USB packets
19*b636d99dSDavid van Moolenbroek *
20*b636d99dSDavid van Moolenbroek */
21*b636d99dSDavid van Moolenbroek
22*b636d99dSDavid van Moolenbroek #define NETDISSECT_REWORKED
23*b636d99dSDavid van Moolenbroek #ifdef HAVE_CONFIG_H
24*b636d99dSDavid van Moolenbroek #include "config.h"
25*b636d99dSDavid van Moolenbroek #endif
26*b636d99dSDavid van Moolenbroek
27*b636d99dSDavid van Moolenbroek #include <tcpdump-stdinc.h>
28*b636d99dSDavid van Moolenbroek
29*b636d99dSDavid van Moolenbroek #include "interface.h"
30*b636d99dSDavid van Moolenbroek
31*b636d99dSDavid van Moolenbroek
32*b636d99dSDavid van Moolenbroek #if defined(HAVE_PCAP_USB_H) && defined(DLT_USB_LINUX)
33*b636d99dSDavid van Moolenbroek #include <pcap/usb.h>
34*b636d99dSDavid van Moolenbroek
35*b636d99dSDavid van Moolenbroek static const char tstr[] = "[|usb]";
36*b636d99dSDavid van Moolenbroek
37*b636d99dSDavid van Moolenbroek /* returns direction: 1=inbound 2=outbound -1=invalid */
38*b636d99dSDavid van Moolenbroek static int
get_direction(int transfer_type,int event_type)39*b636d99dSDavid van Moolenbroek get_direction(int transfer_type, int event_type)
40*b636d99dSDavid van Moolenbroek {
41*b636d99dSDavid van Moolenbroek int direction;
42*b636d99dSDavid van Moolenbroek
43*b636d99dSDavid van Moolenbroek direction = -1;
44*b636d99dSDavid van Moolenbroek switch(transfer_type){
45*b636d99dSDavid van Moolenbroek case URB_BULK:
46*b636d99dSDavid van Moolenbroek case URB_CONTROL:
47*b636d99dSDavid van Moolenbroek case URB_ISOCHRONOUS:
48*b636d99dSDavid van Moolenbroek switch(event_type)
49*b636d99dSDavid van Moolenbroek {
50*b636d99dSDavid van Moolenbroek case URB_SUBMIT:
51*b636d99dSDavid van Moolenbroek direction = 2;
52*b636d99dSDavid van Moolenbroek break;
53*b636d99dSDavid van Moolenbroek case URB_COMPLETE:
54*b636d99dSDavid van Moolenbroek case URB_ERROR:
55*b636d99dSDavid van Moolenbroek direction = 1;
56*b636d99dSDavid van Moolenbroek break;
57*b636d99dSDavid van Moolenbroek default:
58*b636d99dSDavid van Moolenbroek direction = -1;
59*b636d99dSDavid van Moolenbroek }
60*b636d99dSDavid van Moolenbroek break;
61*b636d99dSDavid van Moolenbroek case URB_INTERRUPT:
62*b636d99dSDavid van Moolenbroek switch(event_type)
63*b636d99dSDavid van Moolenbroek {
64*b636d99dSDavid van Moolenbroek case URB_SUBMIT:
65*b636d99dSDavid van Moolenbroek direction = 1;
66*b636d99dSDavid van Moolenbroek break;
67*b636d99dSDavid van Moolenbroek case URB_COMPLETE:
68*b636d99dSDavid van Moolenbroek case URB_ERROR:
69*b636d99dSDavid van Moolenbroek direction = 2;
70*b636d99dSDavid van Moolenbroek break;
71*b636d99dSDavid van Moolenbroek default:
72*b636d99dSDavid van Moolenbroek direction = -1;
73*b636d99dSDavid van Moolenbroek }
74*b636d99dSDavid van Moolenbroek break;
75*b636d99dSDavid van Moolenbroek default:
76*b636d99dSDavid van Moolenbroek direction = -1;
77*b636d99dSDavid van Moolenbroek }
78*b636d99dSDavid van Moolenbroek
79*b636d99dSDavid van Moolenbroek return direction;
80*b636d99dSDavid van Moolenbroek }
81*b636d99dSDavid van Moolenbroek
82*b636d99dSDavid van Moolenbroek static void
usb_header_print(netdissect_options * ndo,const pcap_usb_header * uh)83*b636d99dSDavid van Moolenbroek usb_header_print(netdissect_options *ndo, const pcap_usb_header *uh)
84*b636d99dSDavid van Moolenbroek {
85*b636d99dSDavid van Moolenbroek int direction;
86*b636d99dSDavid van Moolenbroek
87*b636d99dSDavid van Moolenbroek switch(uh->transfer_type)
88*b636d99dSDavid van Moolenbroek {
89*b636d99dSDavid van Moolenbroek case URB_ISOCHRONOUS:
90*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "ISOCHRONOUS"));
91*b636d99dSDavid van Moolenbroek break;
92*b636d99dSDavid van Moolenbroek case URB_INTERRUPT:
93*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "INTERRUPT"));
94*b636d99dSDavid van Moolenbroek break;
95*b636d99dSDavid van Moolenbroek case URB_CONTROL:
96*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "CONTROL"));
97*b636d99dSDavid van Moolenbroek break;
98*b636d99dSDavid van Moolenbroek case URB_BULK:
99*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "BULK"));
100*b636d99dSDavid van Moolenbroek break;
101*b636d99dSDavid van Moolenbroek default:
102*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, " ?"));
103*b636d99dSDavid van Moolenbroek }
104*b636d99dSDavid van Moolenbroek
105*b636d99dSDavid van Moolenbroek switch(uh->event_type)
106*b636d99dSDavid van Moolenbroek {
107*b636d99dSDavid van Moolenbroek case URB_SUBMIT:
108*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, " SUBMIT"));
109*b636d99dSDavid van Moolenbroek break;
110*b636d99dSDavid van Moolenbroek case URB_COMPLETE:
111*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, " COMPLETE"));
112*b636d99dSDavid van Moolenbroek break;
113*b636d99dSDavid van Moolenbroek case URB_ERROR:
114*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, " ERROR"));
115*b636d99dSDavid van Moolenbroek break;
116*b636d99dSDavid van Moolenbroek default:
117*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, " ?"));
118*b636d99dSDavid van Moolenbroek }
119*b636d99dSDavid van Moolenbroek
120*b636d99dSDavid van Moolenbroek direction = get_direction(uh->transfer_type, uh->event_type);
121*b636d99dSDavid van Moolenbroek if(direction == 1)
122*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, " from"));
123*b636d99dSDavid van Moolenbroek else if(direction == 2)
124*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, " to"));
125*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, " %d:%d:%d", uh->bus_id, uh->device_address, uh->endpoint_number & 0x7f));
126*b636d99dSDavid van Moolenbroek }
127*b636d99dSDavid van Moolenbroek
128*b636d99dSDavid van Moolenbroek /*
129*b636d99dSDavid van Moolenbroek * This is the top level routine of the printer for captures with a
130*b636d99dSDavid van Moolenbroek * 48-byte header.
131*b636d99dSDavid van Moolenbroek *
132*b636d99dSDavid van Moolenbroek * 'p' points to the header of the packet, 'h->ts' is the timestamp,
133*b636d99dSDavid van Moolenbroek * 'h->len' is the length of the packet off the wire, and 'h->caplen'
134*b636d99dSDavid van Moolenbroek * is the number of bytes actually captured.
135*b636d99dSDavid van Moolenbroek */
136*b636d99dSDavid van Moolenbroek u_int
usb_linux_48_byte_print(netdissect_options * ndo,const struct pcap_pkthdr * h,register const u_char * p)137*b636d99dSDavid van Moolenbroek usb_linux_48_byte_print(netdissect_options *ndo, const struct pcap_pkthdr *h,
138*b636d99dSDavid van Moolenbroek register const u_char *p)
139*b636d99dSDavid van Moolenbroek {
140*b636d99dSDavid van Moolenbroek if (h->caplen < sizeof(pcap_usb_header)) {
141*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "%s", tstr));
142*b636d99dSDavid van Moolenbroek return(sizeof(pcap_usb_header));
143*b636d99dSDavid van Moolenbroek }
144*b636d99dSDavid van Moolenbroek
145*b636d99dSDavid van Moolenbroek usb_header_print(ndo, (const pcap_usb_header *) p);
146*b636d99dSDavid van Moolenbroek
147*b636d99dSDavid van Moolenbroek return(sizeof(pcap_usb_header));
148*b636d99dSDavid van Moolenbroek }
149*b636d99dSDavid van Moolenbroek
150*b636d99dSDavid van Moolenbroek #ifdef DLT_USB_LINUX_MMAPPED
151*b636d99dSDavid van Moolenbroek /*
152*b636d99dSDavid van Moolenbroek * This is the top level routine of the printer for captures with a
153*b636d99dSDavid van Moolenbroek * 64-byte header.
154*b636d99dSDavid van Moolenbroek *
155*b636d99dSDavid van Moolenbroek * 'p' points to the header of the packet, 'h->ts' is the timestamp,
156*b636d99dSDavid van Moolenbroek * 'h->len' is the length of the packet off the wire, and 'h->caplen'
157*b636d99dSDavid van Moolenbroek * is the number of bytes actually captured.
158*b636d99dSDavid van Moolenbroek */
159*b636d99dSDavid van Moolenbroek u_int
usb_linux_64_byte_print(netdissect_options * ndo,const struct pcap_pkthdr * h,register const u_char * p)160*b636d99dSDavid van Moolenbroek usb_linux_64_byte_print(netdissect_options *ndo, const struct pcap_pkthdr *h,
161*b636d99dSDavid van Moolenbroek register const u_char *p)
162*b636d99dSDavid van Moolenbroek {
163*b636d99dSDavid van Moolenbroek if (h->caplen < sizeof(pcap_usb_header_mmapped)) {
164*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "%s", tstr));
165*b636d99dSDavid van Moolenbroek return(sizeof(pcap_usb_header_mmapped));
166*b636d99dSDavid van Moolenbroek }
167*b636d99dSDavid van Moolenbroek
168*b636d99dSDavid van Moolenbroek usb_header_print(ndo, (const pcap_usb_header *) p);
169*b636d99dSDavid van Moolenbroek
170*b636d99dSDavid van Moolenbroek return(sizeof(pcap_usb_header_mmapped));
171*b636d99dSDavid van Moolenbroek }
172*b636d99dSDavid van Moolenbroek #endif /* DLT_USB_LINUX_MMAPPED */
173*b636d99dSDavid van Moolenbroek
174*b636d99dSDavid van Moolenbroek #endif /* defined(HAVE_PCAP_USB_H) && defined(DLT_USB_LINUX) */
175*b636d99dSDavid van Moolenbroek
176