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