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