xref: /minix3/external/bsd/libpcap/dist/pcap/usb.h (revision d56f51ea7d8b9045e5c8e2028422523d3f9a5840)
1*d56f51eaSDavid van Moolenbroek /*	$NetBSD: usb.h,v 1.3 2015/03/31 21:39:43 christos Exp $	*/
2*d56f51eaSDavid van Moolenbroek 
3*d56f51eaSDavid van Moolenbroek /*
4*d56f51eaSDavid van Moolenbroek  * Copyright (c) 2006 Paolo Abeni (Italy)
5*d56f51eaSDavid van Moolenbroek  * All rights reserved.
6*d56f51eaSDavid van Moolenbroek  *
7*d56f51eaSDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
8*d56f51eaSDavid van Moolenbroek  * modification, are permitted provided that the following conditions
9*d56f51eaSDavid van Moolenbroek  * are met:
10*d56f51eaSDavid van Moolenbroek  *
11*d56f51eaSDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
12*d56f51eaSDavid van Moolenbroek  * notice, this list of conditions and the following disclaimer.
13*d56f51eaSDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
14*d56f51eaSDavid van Moolenbroek  * notice, this list of conditions and the following disclaimer in the
15*d56f51eaSDavid van Moolenbroek  * documentation and/or other materials provided with the distribution.
16*d56f51eaSDavid van Moolenbroek  * 3. The name of the author may not be used to endorse or promote
17*d56f51eaSDavid van Moolenbroek  * products derived from this software without specific prior written
18*d56f51eaSDavid van Moolenbroek  * permission.
19*d56f51eaSDavid van Moolenbroek  *
20*d56f51eaSDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21*d56f51eaSDavid van Moolenbroek  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22*d56f51eaSDavid van Moolenbroek  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23*d56f51eaSDavid van Moolenbroek  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24*d56f51eaSDavid van Moolenbroek  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25*d56f51eaSDavid van Moolenbroek  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26*d56f51eaSDavid van Moolenbroek  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27*d56f51eaSDavid van Moolenbroek  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28*d56f51eaSDavid van Moolenbroek  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29*d56f51eaSDavid van Moolenbroek  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30*d56f51eaSDavid van Moolenbroek  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*d56f51eaSDavid van Moolenbroek  *
32*d56f51eaSDavid van Moolenbroek  * Basic USB data struct
33*d56f51eaSDavid van Moolenbroek  * By Paolo Abeni <paolo.abeni@email.it>
34*d56f51eaSDavid van Moolenbroek  */
35*d56f51eaSDavid van Moolenbroek 
36*d56f51eaSDavid van Moolenbroek #ifndef _PCAP_USB_STRUCTS_H__
37*d56f51eaSDavid van Moolenbroek #define _PCAP_USB_STRUCTS_H__
38*d56f51eaSDavid van Moolenbroek 
39*d56f51eaSDavid van Moolenbroek /*
40*d56f51eaSDavid van Moolenbroek  * possible transfer mode
41*d56f51eaSDavid van Moolenbroek  */
42*d56f51eaSDavid van Moolenbroek #define URB_TRANSFER_IN   0x80
43*d56f51eaSDavid van Moolenbroek #define URB_ISOCHRONOUS   0x0
44*d56f51eaSDavid van Moolenbroek #define URB_INTERRUPT     0x1
45*d56f51eaSDavid van Moolenbroek #define URB_CONTROL       0x2
46*d56f51eaSDavid van Moolenbroek #define URB_BULK          0x3
47*d56f51eaSDavid van Moolenbroek 
48*d56f51eaSDavid van Moolenbroek /*
49*d56f51eaSDavid van Moolenbroek  * possible event type
50*d56f51eaSDavid van Moolenbroek  */
51*d56f51eaSDavid van Moolenbroek #define URB_SUBMIT        'S'
52*d56f51eaSDavid van Moolenbroek #define URB_COMPLETE      'C'
53*d56f51eaSDavid van Moolenbroek #define URB_ERROR         'E'
54*d56f51eaSDavid van Moolenbroek 
55*d56f51eaSDavid van Moolenbroek /*
56*d56f51eaSDavid van Moolenbroek  * USB setup header as defined in USB specification.
57*d56f51eaSDavid van Moolenbroek  * Appears at the front of each Control S-type packet in DLT_USB captures.
58*d56f51eaSDavid van Moolenbroek  */
59*d56f51eaSDavid van Moolenbroek typedef struct _usb_setup {
60*d56f51eaSDavid van Moolenbroek 	u_int8_t bmRequestType;
61*d56f51eaSDavid van Moolenbroek 	u_int8_t bRequest;
62*d56f51eaSDavid van Moolenbroek 	u_int16_t wValue;
63*d56f51eaSDavid van Moolenbroek 	u_int16_t wIndex;
64*d56f51eaSDavid van Moolenbroek 	u_int16_t wLength;
65*d56f51eaSDavid van Moolenbroek } pcap_usb_setup;
66*d56f51eaSDavid van Moolenbroek 
67*d56f51eaSDavid van Moolenbroek /*
68*d56f51eaSDavid van Moolenbroek  * Information from the URB for Isochronous transfers.
69*d56f51eaSDavid van Moolenbroek  */
70*d56f51eaSDavid van Moolenbroek typedef struct _iso_rec {
71*d56f51eaSDavid van Moolenbroek 	int32_t	error_count;
72*d56f51eaSDavid van Moolenbroek 	int32_t	numdesc;
73*d56f51eaSDavid van Moolenbroek } iso_rec;
74*d56f51eaSDavid van Moolenbroek 
75*d56f51eaSDavid van Moolenbroek /*
76*d56f51eaSDavid van Moolenbroek  * Header prepended by linux kernel to each event.
77*d56f51eaSDavid van Moolenbroek  * Appears at the front of each packet in DLT_USB_LINUX captures.
78*d56f51eaSDavid van Moolenbroek  */
79*d56f51eaSDavid van Moolenbroek typedef struct _usb_header {
80*d56f51eaSDavid van Moolenbroek 	u_int64_t id;
81*d56f51eaSDavid van Moolenbroek 	u_int8_t event_type;
82*d56f51eaSDavid van Moolenbroek 	u_int8_t transfer_type;
83*d56f51eaSDavid van Moolenbroek 	u_int8_t endpoint_number;
84*d56f51eaSDavid van Moolenbroek 	u_int8_t device_address;
85*d56f51eaSDavid van Moolenbroek 	u_int16_t bus_id;
86*d56f51eaSDavid van Moolenbroek 	char setup_flag;/*if !=0 the urb setup header is not present*/
87*d56f51eaSDavid van Moolenbroek 	char data_flag; /*if !=0 no urb data is present*/
88*d56f51eaSDavid van Moolenbroek 	int64_t ts_sec;
89*d56f51eaSDavid van Moolenbroek 	int32_t ts_usec;
90*d56f51eaSDavid van Moolenbroek 	int32_t status;
91*d56f51eaSDavid van Moolenbroek 	u_int32_t urb_len;
92*d56f51eaSDavid van Moolenbroek 	u_int32_t data_len; /* amount of urb data really present in this event*/
93*d56f51eaSDavid van Moolenbroek 	pcap_usb_setup setup;
94*d56f51eaSDavid van Moolenbroek } pcap_usb_header;
95*d56f51eaSDavid van Moolenbroek 
96*d56f51eaSDavid van Moolenbroek /*
97*d56f51eaSDavid van Moolenbroek  * Header prepended by linux kernel to each event for the 2.6.31
98*d56f51eaSDavid van Moolenbroek  * and later kernels; for the 2.6.21 through 2.6.30 kernels, the
99*d56f51eaSDavid van Moolenbroek  * "iso_rec" information, and the fields starting with "interval"
100*d56f51eaSDavid van Moolenbroek  * are zeroed-out padding fields.
101*d56f51eaSDavid van Moolenbroek  *
102*d56f51eaSDavid van Moolenbroek  * Appears at the front of each packet in DLT_USB_LINUX_MMAPPED captures.
103*d56f51eaSDavid van Moolenbroek  */
104*d56f51eaSDavid van Moolenbroek typedef struct _usb_header_mmapped {
105*d56f51eaSDavid van Moolenbroek 	u_int64_t id;
106*d56f51eaSDavid van Moolenbroek 	u_int8_t event_type;
107*d56f51eaSDavid van Moolenbroek 	u_int8_t transfer_type;
108*d56f51eaSDavid van Moolenbroek 	u_int8_t endpoint_number;
109*d56f51eaSDavid van Moolenbroek 	u_int8_t device_address;
110*d56f51eaSDavid van Moolenbroek 	u_int16_t bus_id;
111*d56f51eaSDavid van Moolenbroek 	char setup_flag;/*if !=0 the urb setup header is not present*/
112*d56f51eaSDavid van Moolenbroek 	char data_flag; /*if !=0 no urb data is present*/
113*d56f51eaSDavid van Moolenbroek 	int64_t ts_sec;
114*d56f51eaSDavid van Moolenbroek 	int32_t ts_usec;
115*d56f51eaSDavid van Moolenbroek 	int32_t status;
116*d56f51eaSDavid van Moolenbroek 	u_int32_t urb_len;
117*d56f51eaSDavid van Moolenbroek 	u_int32_t data_len; /* amount of urb data really present in this event*/
118*d56f51eaSDavid van Moolenbroek 	union {
119*d56f51eaSDavid van Moolenbroek 		pcap_usb_setup setup;
120*d56f51eaSDavid van Moolenbroek 		iso_rec iso;
121*d56f51eaSDavid van Moolenbroek 	} s;
122*d56f51eaSDavid van Moolenbroek 	int32_t	interval;	/* for Interrupt and Isochronous events */
123*d56f51eaSDavid van Moolenbroek 	int32_t start_frame;	/* for Isochronous events */
124*d56f51eaSDavid van Moolenbroek 	u_int32_t xfer_flags;	/* copy of URB's transfer flags */
125*d56f51eaSDavid van Moolenbroek 	u_int32_t ndesc;	/* number of isochronous descriptors */
126*d56f51eaSDavid van Moolenbroek } pcap_usb_header_mmapped;
127*d56f51eaSDavid van Moolenbroek 
128*d56f51eaSDavid van Moolenbroek /*
129*d56f51eaSDavid van Moolenbroek  * Isochronous descriptors; for isochronous transfers there might be
130*d56f51eaSDavid van Moolenbroek  * one or more of these at the beginning of the packet data.  The
131*d56f51eaSDavid van Moolenbroek  * number of descriptors is given by the "ndesc" field in the header;
132*d56f51eaSDavid van Moolenbroek  * as indicated, in older kernels that don't put the descriptors at
133*d56f51eaSDavid van Moolenbroek  * the beginning of the packet, that field is zeroed out, so that field
134*d56f51eaSDavid van Moolenbroek  * can be trusted even in captures from older kernels.
135*d56f51eaSDavid van Moolenbroek  */
136*d56f51eaSDavid van Moolenbroek typedef struct _usb_isodesc {
137*d56f51eaSDavid van Moolenbroek 	int32_t		status;
138*d56f51eaSDavid van Moolenbroek 	u_int32_t	offset;
139*d56f51eaSDavid van Moolenbroek 	u_int32_t	len;
140*d56f51eaSDavid van Moolenbroek 	u_int8_t	pad[4];
141*d56f51eaSDavid van Moolenbroek } usb_isodesc;
142*d56f51eaSDavid van Moolenbroek 
143*d56f51eaSDavid van Moolenbroek #endif
144