Coverage Report

Created: 2025-12-27 06:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wireshark/epan/dissectors/packet-usbll.c
Line
Count
Source
1
/* packet-usbll.c
2
 *
3
 * 2019 Tomasz Mon <desowin@gmail.com>
4
 *
5
 * USB link layer dissector
6
 *
7
 * This code is separated from packet-usb.c on purpose.
8
 * It is important to note that packet-usb.c operates on the USB URB level.
9
 * The idea behind this file is to transform low level link layer data
10
 * (captured by hardware sniffers) into structures that resemble URB and pass
11
 * such URB to the URB common dissection code.
12
 *
13
 * SPDX-License-Identifier: GPL-2.0-or-later
14
 */
15
16
#include "config.h"
17
#include <epan/packet.h>
18
#include <epan/expert.h>
19
#include <epan/crc16-tvb.h>
20
#include <wsutil/crc5.h>
21
#include <epan/address_types.h>
22
#include <epan/to_str.h>
23
#include <epan/proto_data.h>
24
#include <epan/reassemble.h>
25
#include <wiretap/wtap.h>
26
#include "packet-usb.h"
27
28
void proto_register_usbll(void);
29
void proto_reg_handoff_usbll(void);
30
31
static dissector_handle_t unknown_speed_handle;
32
static dissector_handle_t low_speed_handle;
33
static dissector_handle_t full_speed_handle;
34
static dissector_handle_t high_speed_handle;
35
36
static int proto_usbll;
37
38
/* Fields defined by USB 2.0 standard */
39
static int hf_usbll_pid;
40
static int hf_usbll_device_addr;
41
static int hf_usbll_endp;
42
static int hf_usbll_crc5;
43
static int hf_usbll_crc5_status;
44
static int hf_usbll_data;
45
static int hf_usbll_data_crc;
46
static int hf_usbll_data_crc_status;
47
static int hf_usbll_sof_framenum;
48
static int hf_usbll_split_hub_addr;
49
static int hf_usbll_split_sc;
50
static int hf_usbll_split_port;
51
static int hf_usbll_split_s;
52
static int hf_usbll_split_e;
53
static int hf_usbll_split_u;
54
static int hf_usbll_split_iso_se;
55
static int hf_usbll_split_et;
56
static int hf_usbll_split_crc5;
57
static int hf_usbll_split_crc5_status;
58
static int hf_usbll_src;
59
static int hf_usbll_dst;
60
static int hf_usbll_addr;
61
static int hf_usbll_transfer_fragments;
62
static int hf_usbll_transfer_fragment;
63
static int hf_usbll_transfer_fragment_overlap;
64
static int hf_usbll_transfer_fragment_overlap_conflicts;
65
static int hf_usbll_transfer_fragment_multiple_tails;
66
static int hf_usbll_transfer_fragment_too_long_fragment;
67
static int hf_usbll_transfer_fragment_error;
68
static int hf_usbll_transfer_fragment_count;
69
static int hf_usbll_transfer_reassembled_in;
70
static int hf_usbll_transfer_reassembled_length;
71
/* Fields defined by USB 2.0 ECN: Link Power Management (LPM) and
72
 * USB 2.0 ECN Errata for Link Power Management 9/28/2011
73
 */
74
static int hf_usbll_subpid;
75
static int hf_usbll_lpm_link_state;
76
static int hf_usbll_lpm_besl;
77
static int hf_usbll_lpm_remote_wake;
78
static int hf_usbll_lpm_reserved;
79
80
static int ett_usbll;
81
static int ett_usbll_transfer_fragment;
82
static int ett_usbll_transfer_fragments;
83
84
static const fragment_items usbll_frag_items = {
85
    /* Fragment subtrees */
86
    &ett_usbll_transfer_fragment,
87
    &ett_usbll_transfer_fragments,
88
    /* Fragment Fields */
89
    &hf_usbll_transfer_fragments,
90
    &hf_usbll_transfer_fragment,
91
    &hf_usbll_transfer_fragment_overlap,
92
    &hf_usbll_transfer_fragment_overlap_conflicts,
93
    &hf_usbll_transfer_fragment_multiple_tails,
94
    &hf_usbll_transfer_fragment_too_long_fragment,
95
    &hf_usbll_transfer_fragment_error,
96
    &hf_usbll_transfer_fragment_count,
97
    /* Reassembled in field */
98
    &hf_usbll_transfer_reassembled_in,
99
    /* Reassembled length field */
100
    &hf_usbll_transfer_reassembled_length,
101
    /* Reassembled data field */
102
    NULL,
103
    /* Tag */
104
    "USB transfer fragments"
105
};
106
107
static expert_field ei_invalid_pid;
108
static expert_field ei_invalid_subpid;
109
static expert_field ei_conflicting_subpid;
110
static expert_field ei_undecoded;
111
static expert_field ei_wrong_crc5;
112
static expert_field ei_wrong_split_crc5;
113
static expert_field ei_wrong_crc16;
114
static expert_field ei_invalid_s;
115
static expert_field ei_invalid_e_u;
116
static expert_field ei_invalid_pid_sequence;
117
static expert_field ei_invalid_setup_data;
118
119
static int usbll_address_type = -1;
120
121
static reassembly_table usbll_reassembly_table;
122
123
static wmem_map_t *transfer_info;
124
125
static const enum_val_t dissect_unknown_speed_as[] = {
126
    { "unk",  "Unknown",    USB_SPEED_UNKNOWN },
127
    { "low",  "Low-Speed",  USB_SPEED_LOW },
128
    { "full", "Full-Speed", USB_SPEED_FULL },
129
    { "high", "High-Speed", USB_SPEED_HIGH },
130
    { NULL, NULL, 0 }
131
};
132
133
static int global_dissect_unknown_speed_as = USB_SPEED_UNKNOWN;
134
135
/* USB packet ID is 4-bit. It is send in octet alongside complemented form.
136
 * The list of PIDs is available in Universal Serial Bus Specification Revision 2.0,
137
 * Table 8-1. PID Types
138
 * Packets here are sorted by the complemented form (high nibble).
139
 */
140
0
#define USB_PID_DATA_MDATA         0x0F
141
0
#define USB_PID_HANDSHAKE_STALL    0x1E
142
0
#define USB_PID_TOKEN_SETUP        0x2D
143
0
#define USB_PID_SPECIAL_PRE_OR_ERR 0x3C
144
0
#define USB_PID_DATA_DATA1         0x4B
145
0
#define USB_PID_HANDSHAKE_NAK      0x5A
146
0
#define USB_PID_TOKEN_IN           0x69
147
1
#define USB_PID_SPECIAL_SPLIT      0x78
148
0
#define USB_PID_DATA_DATA2         0x87
149
0
#define USB_PID_HANDSHAKE_NYET     0x96
150
1
#define USB_PID_TOKEN_SOF          0xA5
151
2
#define USB_PID_SPECIAL_PING       0xB4
152
0
#define USB_PID_DATA_DATA0         0xC3
153
0
#define USB_PID_HANDSHAKE_ACK      0xD2
154
0
#define USB_PID_TOKEN_OUT          0xE1
155
2
#define USB_PID_SPECIAL_EXT        0xF0
156
static const value_string usb_packetid_vals[] = {
157
    {USB_PID_DATA_MDATA,         "MDATA"},
158
    {USB_PID_HANDSHAKE_STALL,    "STALL"},
159
    {USB_PID_TOKEN_SETUP,        "SETUP"},
160
    {USB_PID_SPECIAL_PRE_OR_ERR, "PRE/ERR"},
161
    {USB_PID_DATA_DATA1,         "DATA1"},
162
    {USB_PID_HANDSHAKE_NAK,      "NAK"},
163
    {USB_PID_TOKEN_IN,           "IN"},
164
    {USB_PID_SPECIAL_SPLIT,      "SPLIT"},
165
    {USB_PID_DATA_DATA2,         "DATA2"},
166
    {USB_PID_HANDSHAKE_NYET,     "NYET"},
167
    {USB_PID_TOKEN_SOF,          "SOF"},
168
    {USB_PID_SPECIAL_PING,       "PING"},
169
    {USB_PID_DATA_DATA0,         "DATA0"},
170
    {USB_PID_HANDSHAKE_ACK,      "ACK"},
171
    {USB_PID_TOKEN_OUT,          "OUT"},
172
    {USB_PID_SPECIAL_EXT,        "EXT"},
173
    {0, NULL}
174
};
175
static value_string_ext usb_packetid_vals_ext =
176
    VALUE_STRING_EXT_INIT(usb_packetid_vals);
177
178
/* EXT PID and SubPIDs are defined in USB 2.0 ECN: Link Power Management (LPM)
179
 * Currently only LPM SubPID is defined, all other are reserved. The reserved
180
 * PIDs are either conflicting with USB 2.0 Token PIDs (and can not be reused
181
 * as SubPID in order to maintain backwards compatibility) or not yet defined
182
 * (reserved for future use, because old devices will simply reject them).
183
 */
184
0
#define USB_SUBPID_RESERVED_MDATA     0x0F
185
0
#define USB_SUBPID_RESERVED_STALL     0x1E
186
0
#define USB_SUBPID_CONFLICT_SETUP     0x2D
187
0
#define USB_SUBPID_CONFLICT_PRE       0x3C
188
0
#define USB_SUBPID_RESERVED_DATA1     0x4B
189
0
#define USB_SUBPID_RESERVED_NAK       0x5A
190
0
#define USB_SUBPID_CONFLICT_IN        0x69
191
0
#define USB_SUBPID_CONFLICT_SPLIT     0x78
192
0
#define USB_SUBPID_RESERVED_DATA2     0x87
193
0
#define USB_SUBPID_RESERVED_NYET      0x96
194
0
#define USB_SUBPID_CONFLICT_SOF       0xA5
195
0
#define USB_SUBPID_CONFLICT_PING      0xB4
196
0
#define USB_SUBPID_LPM                0xC3
197
0
#define USB_SUBPID_RESERVED_ACK       0xD2
198
0
#define USB_SUBPID_CONFLICT_OUT       0xE1
199
0
#define USB_SUBPID_RESERVED_EXT       0xF0
200
static const value_string usb_subpid_vals[] = {
201
    {USB_SUBPID_RESERVED_MDATA,  "Reserved (MDATA)"},
202
    {USB_SUBPID_RESERVED_STALL,  "Reserved (STALL)"},
203
    {USB_SUBPID_CONFLICT_SETUP,  "Reserved (conflict with SETUP)"},
204
    {USB_SUBPID_CONFLICT_PRE,    "Reserved (conflict with PRE)"},
205
    {USB_SUBPID_RESERVED_DATA1,  "Reserved (DATA1)"},
206
    {USB_SUBPID_RESERVED_NAK,    "Reserved (NAK)"},
207
    {USB_SUBPID_CONFLICT_IN,     "Reserved (conflict with IN)"},
208
    {USB_SUBPID_CONFLICT_SPLIT,  "Reserved (conflict with SPLIT)"},
209
    {USB_SUBPID_RESERVED_DATA2,  "Reserved (DATA2)"},
210
    {USB_SUBPID_RESERVED_NYET,   "Reserved (NYET)"},
211
    {USB_SUBPID_CONFLICT_SOF,    "Reserved (conflict with SOF)"},
212
    {USB_SUBPID_CONFLICT_PING,   "Reserved (conflict with PING)"},
213
    {USB_SUBPID_LPM,             "LPM"},
214
    {USB_SUBPID_RESERVED_ACK,    "Reserved (ACK)"},
215
    {USB_SUBPID_CONFLICT_OUT,    "Reserved (conflict with OUT)"},
216
    {USB_SUBPID_RESERVED_EXT,    "Reserved (EXT)"},
217
    {0, NULL}
218
};
219
static value_string_ext usb_subpid_vals_ext =
220
    VALUE_STRING_EXT_INIT(usb_subpid_vals);
221
222
static void lpm_link_state_str(char *buf, uint32_t value)
223
0
{
224
0
    if (value == 0x01) {
225
0
        snprintf(buf, ITEM_LABEL_LENGTH, "L1 (Sleep)");
226
0
    } else {
227
0
        snprintf(buf, ITEM_LABEL_LENGTH, "Reserved for future use");
228
0
    }
229
0
}
230
231
static unsigned besl_to_us(uint8_t besl)
232
0
{
233
0
    unsigned int us;
234
0
    if (besl == 0) {
235
0
        us = 125;
236
0
    } else if (besl == 1) {
237
0
        us = 150;
238
0
    } else if (besl <= 5) {
239
0
        us = 100 * besl;
240
0
    } else {
241
0
        us = 1000 * (besl - 5);
242
0
    }
243
0
    return us;
244
0
}
245
246
void usb_lpm_besl_str(char *buf, uint32_t value)
247
0
{
248
0
    snprintf(buf, ITEM_LABEL_LENGTH, "%d us (%d)", besl_to_us(value), value);
249
0
}
250
251
static const value_string usb_lpm_remote_wake_vals[] = {
252
    {0, "Disable"},
253
    {1, "Enable"},
254
    {0, NULL},
255
};
256
257
static const value_string usb_start_complete_vals[] = {
258
    {0, "Start"},
259
    {1, "Complete"},
260
    {0, NULL}
261
};
262
263
static const value_string usb_split_speed_vals[] = {
264
    {0, "Full"},
265
    {1, "Low"},
266
    {0, NULL}
267
};
268
269
static const value_string usb_split_iso_se_vals[] = {
270
    {0, "High-speed data is the middle of the fullspeed data payload"},
271
    {1, "High-speed data is the beginning of the full-speed data payload"},
272
    {2, "High-speed data is the end of the full-speed data payload"},
273
    {3, "High-speed data is all of the full-speed data payload"},
274
    {0, NULL}
275
};
276
277
0
#define USB_EP_TYPE_CONTROL     0
278
1
#define USB_EP_TYPE_ISOCHRONOUS 1
279
0
#define USB_EP_TYPE_BULK        2
280
1
#define USB_EP_TYPE_INTERRUPT   3
281
static const value_string usb_endpoint_type_vals[] = {
282
    {USB_EP_TYPE_CONTROL,     "Control"},
283
    {USB_EP_TYPE_ISOCHRONOUS, "Isochronous"},
284
    {USB_EP_TYPE_BULK,        "Bulk"},
285
    {USB_EP_TYPE_INTERRUPT,   "Interrupt"},
286
    {0, NULL}
287
};
288
289
/* Macros for Token Packets. */
290
1
#define TOKEN_BITS_GET_ADDRESS(bits) (bits & 0x007F)
291
1
#define TOKEN_BITS_GET_ENDPOINT(bits) ((bits & 0x0780) >> 7)
292
293
/* Macros for Split Packets. */
294
1
#define SPLIT_BITS_GET_HUB_ADDRESS(bits) (uint8_t)(bits & 0x007F)
295
1
#define SPLIT_BITS_GET_HUB_PORT(bits) (uint8_t)((bits & 0x7F00) >> 8)
296
2
#define SPLIT_BITS_GET_ENDPOINT_TYPE(bits) ((bits & 0x060000) >> 17)
297
1
#define SPLIT_BIT_SPEED 0x8000
298
1
#define SPLIT_BIT_E_U 0x10000
299
3
#define SPLIT_BIT_START_COMPLETE 0x0080
300
301
/* Bitmasks definitions for usbll_address_t flags
302
 * and 'flags' parameter of usbll_set_address function.
303
 */
304
#define USBLL_ADDRESS_STANDARD 0
305
6
#define USBLL_ADDRESS_HOST 0x01
306
6
#define USBLL_ADDRESS_HUB_PORT 0x02
307
4
#define USBLL_ADDRESS_BROADCAST 0x04
308
2
#define USBLL_ADDRESS_HOST_TO_DEV 0
309
4
#define USBLL_ADDRESS_DEV_TO_HOST 0x08
310
311
#define USBLL_ADDRESS_IS_DEV_TO_HOST(flags) \
312
4
    (flags & USBLL_ADDRESS_DEV_TO_HOST)
313
314
#define USBLL_ADDRESS_IS_HOST_TO_DEV(flags) \
315
4
    (!USBLL_ADDRESS_IS_DEV_TO_HOST(flags))
316
317
typedef enum usbll_state {
318
    STATE_IDLE,      /* No transaction, e.g. after SOF */
319
    STATE_INVALID,   /* Invalid PID sequence, e.g. ACK without transaction  */
320
    STATE_IN,
321
    STATE_IN_DATA0,
322
    STATE_IN_DATA1,
323
    STATE_IN_HS_ISOCHRONOUS_DATA2,
324
    STATE_IN_ACK,
325
    STATE_IN_NAK,
326
    STATE_IN_STALL,
327
    STATE_OUT,
328
    STATE_OUT_DATA0,
329
    STATE_OUT_DATA1,
330
    STATE_OUT_HS_ISOCHRONOUS_DATA2,
331
    STATE_OUT_HS_ISOCHRONOUS_MDATA,
332
    STATE_OUT_ACK,
333
    STATE_OUT_NAK,
334
    STATE_OUT_STALL,
335
    STATE_OUT_NYET,
336
    STATE_PING,
337
    STATE_PING_ACK,
338
    STATE_PING_NAK,
339
    STATE_PING_STALL,
340
    STATE_SETUP,
341
    STATE_SETUP_DATA0,
342
    STATE_SETUP_ACK,
343
    /* LS/FS Control transactions via HS hub */
344
    STATE_SSPLIT_CONTROL,
345
    STATE_SSPLIT_CONTROL_SETUP,
346
    STATE_SSPLIT_CONTROL_SETUP_DATA0,
347
    STATE_SSPLIT_CONTROL_SETUP_ACK,
348
    STATE_SSPLIT_CONTROL_SETUP_NAK,
349
    STATE_SSPLIT_CONTROL_OUT,
350
    STATE_SSPLIT_CONTROL_OUT_DATA0,
351
    STATE_SSPLIT_CONTROL_OUT_DATA1,
352
    STATE_SSPLIT_CONTROL_OUT_ACK,
353
    STATE_SSPLIT_CONTROL_OUT_NAK,
354
    STATE_SSPLIT_CONTROL_IN,
355
    STATE_SSPLIT_CONTROL_IN_ACK,
356
    STATE_SSPLIT_CONTROL_IN_NAK,
357
    STATE_CSPLIT_CONTROL,
358
    STATE_CSPLIT_CONTROL_SETUP,
359
    STATE_CSPLIT_CONTROL_SETUP_ACK,
360
    STATE_CSPLIT_CONTROL_SETUP_NYET,
361
    STATE_CSPLIT_CONTROL_OUT,
362
    STATE_CSPLIT_CONTROL_OUT_ACK,
363
    STATE_CSPLIT_CONTROL_OUT_NAK,
364
    STATE_CSPLIT_CONTROL_OUT_STALL,
365
    STATE_CSPLIT_CONTROL_OUT_NYET,
366
    STATE_CSPLIT_CONTROL_IN,
367
    STATE_CSPLIT_CONTROL_IN_DATA0,
368
    STATE_CSPLIT_CONTROL_IN_DATA1,
369
    STATE_CSPLIT_CONTROL_IN_NAK,
370
    STATE_CSPLIT_CONTROL_IN_STALL,
371
    STATE_CSPLIT_CONTROL_IN_NYET,
372
    /* LS/FS Bulk transactions via HS hub */
373
    STATE_SSPLIT_BULK,
374
    STATE_SSPLIT_BULK_OUT,
375
    STATE_SSPLIT_BULK_OUT_DATA0,
376
    STATE_SSPLIT_BULK_OUT_DATA1,
377
    STATE_SSPLIT_BULK_OUT_ACK,
378
    STATE_SSPLIT_BULK_OUT_NAK,
379
    STATE_SSPLIT_BULK_IN,
380
    STATE_SSPLIT_BULK_IN_ACK,
381
    STATE_SSPLIT_BULK_IN_NAK,
382
    STATE_CSPLIT_BULK,
383
    STATE_CSPLIT_BULK_OUT,
384
    STATE_CSPLIT_BULK_OUT_ACK,
385
    STATE_CSPLIT_BULK_OUT_NAK,
386
    STATE_CSPLIT_BULK_OUT_STALL,
387
    STATE_CSPLIT_BULK_OUT_NYET,
388
    STATE_CSPLIT_BULK_IN,
389
    STATE_CSPLIT_BULK_IN_DATA0,
390
    STATE_CSPLIT_BULK_IN_DATA1,
391
    STATE_CSPLIT_BULK_IN_NAK,
392
    STATE_CSPLIT_BULK_IN_STALL,
393
    STATE_CSPLIT_BULK_IN_NYET,
394
    /* LS/FS Interrupt transactions via HS hub */
395
    STATE_SSPLIT_INTERRUPT,
396
    STATE_SSPLIT_INTERRUPT_OUT,
397
    STATE_SSPLIT_INTERRUPT_OUT_DATA0,
398
    STATE_SSPLIT_INTERRUPT_OUT_DATA1,
399
    STATE_SSPLIT_INTERRUPT_IN,
400
    STATE_CSPLIT_INTERRUPT,
401
    STATE_CSPLIT_INTERRUPT_OUT,
402
    STATE_CSPLIT_INTERRUPT_OUT_ACK,
403
    STATE_CSPLIT_INTERRUPT_OUT_NAK,
404
    STATE_CSPLIT_INTERRUPT_OUT_STALL,
405
    STATE_CSPLIT_INTERRUPT_OUT_ERR,
406
    STATE_CSPLIT_INTERRUPT_OUT_NYET,
407
    STATE_CSPLIT_INTERRUPT_IN,
408
    STATE_CSPLIT_INTERRUPT_IN_MDATA,
409
    STATE_CSPLIT_INTERRUPT_IN_DATA0,
410
    STATE_CSPLIT_INTERRUPT_IN_DATA1,
411
    STATE_CSPLIT_INTERRUPT_IN_NAK,
412
    STATE_CSPLIT_INTERRUPT_IN_STALL,
413
    STATE_CSPLIT_INTERRUPT_IN_ERR,
414
    STATE_CSPLIT_INTERRUPT_IN_NYET,
415
    /* FS Isochronous transactions via HS hub */
416
    STATE_SSPLIT_ISOCHRONOUS,
417
    STATE_SSPLIT_ISOCHRONOUS_OUT,
418
    STATE_SSPLIT_ISOCHRONOUS_OUT_DATA0,
419
    STATE_SSPLIT_ISOCHRONOUS_IN,
420
    STATE_CSPLIT_ISOCHRONOUS,
421
    STATE_CSPLIT_ISOCHRONOUS_IN,
422
    STATE_CSPLIT_ISOCHRONOUS_IN_DATA0,
423
    STATE_CSPLIT_ISOCHRONOUS_IN_MDATA,
424
    STATE_CSPLIT_ISOCHRONOUS_IN_ERR,
425
    STATE_CSPLIT_ISOCHRONOUS_IN_NYET,
426
    /* USB 2.0 ECN: Link Power Management (LPM) */
427
    STATE_EXT,
428
    STATE_SUBPID_INVALID,
429
    STATE_SUBPID_NOT_REUSABLE,
430
    STATE_SUBPID_LPM,
431
    STATE_SUBPID_LPM_ACK,
432
    STATE_SUBPID_LPM_NYET,
433
    STATE_SUBPID_LPM_STALL,
434
    STATE_SUBPID_RESERVED,
435
} usbll_state_t;
436
437
typedef enum usbll_ep_type {
438
    USBLL_EP_UNKNOWN,
439
    USBLL_EP_CONTROL,
440
    USBLL_EP_BULK,
441
    USBLL_EP_INTERRUPT,
442
    USBLL_EP_ISOCHRONOUS,
443
} usbll_ep_type_t;
444
445
/* usbll_address_t represents the address
446
 * of Host, Hub and Devices.
447
 */
448
typedef struct {
449
    uint8_t flags;       /* flags    - Contains information if address is
450
                         *            Host, Hub, Device or Broadcast.
451
                         */
452
    uint8_t device;      /* device   - Device or Hub Address */
453
    uint8_t endpoint;    /* endpoint - It represents endpoint number for
454
                         *            Device and port number for Hub.
455
                         */
456
} usbll_address_t;
457
458
typedef struct usbll_transaction_info {
459
    uint32_t starts_in;
460
    uint8_t pid;
461
    uint8_t address;
462
    uint8_t endpoint;
463
    usb_speed_t speed;
464
    struct usbll_transaction_info *split_start;
465
    struct usbll_transaction_info *split_complete;
466
} usbll_transaction_info_t;
467
468
typedef struct usbll_transfer_info {
469
    /* First data packet number, used as reassembly key */
470
    uint32_t first_packet;
471
    /* Offset this packet starts at */
472
    uint32_t offset;
473
    usbll_ep_type_t type;
474
    /* true if data from host to device, false when from device to host */
475
    bool from_host;
476
    /* false if this is the last packet */
477
    bool more_frags;
478
} usbll_transfer_info_t;
479
480
/* USB is a stateful protocol. The addresses of Data Packets
481
 * and Handshake Packets depend on the packets before them.
482
 *
483
 * We maintain a static global pointer of the type usbll_data_t.
484
 * Maintaining a pointer instead of a conversation helps in reducing
485
 * memory usage, taking the following advantages:
486
 * 1. Packets are always ordered.
487
 * 2. Addresses of packets only up to last 3 packets are required.
488
 *
489
 * Previous pointer is used in the initial pass to link packets
490
 * into transactions.
491
 */
492
typedef struct usbll_data {
493
    usbll_state_t transaction_state;
494
    usbll_transaction_info_t *transaction;
495
    struct usbll_data *prev;
496
    struct usbll_data *next;
497
} usbll_data_t;
498
499
static usbll_data_t *usbll_data_ptr;
500
501
/* Transaction Translator arrays used only during first pass. */
502
static usbll_transaction_info_t ***tt_non_periodic;
503
static usbll_transaction_info_t ***tt_periodic;
504
505
typedef enum usbll_transfer_data {
506
    USBLL_TRANSFER_NORMAL,
507
    USBLL_TRANSFER_GET_DEVICE_DESCRIPTOR,
508
} usbll_transfer_data_t;
509
510
typedef struct usbll_endpoint_info {
511
    usbll_ep_type_t type;
512
    usbll_transfer_data_t data;
513
    /* Maximum packet size, 0 if not known */
514
    uint16_t max_packet_size;
515
    /* DATA0/DATA1 tracking to detect retransmissions */
516
    uint8_t last_data_pid;
517
    /* true if last data packet was acknowledged */
518
    bool last_data_acked;
519
    /* Current transfer key, 0 if no transfer in progress */
520
    uint32_t active_transfer_key;
521
    /* Offset where next packet should start at */
522
    uint32_t transfer_offset;
523
    /* Last data packet length that was part of transfer */
524
    uint32_t last_data_len;
525
    /* Transfer length if known, 0 if unknown */
526
    uint32_t requested_transfer_length;
527
} usbll_endpoint_info_t;
528
529
/* Endpoint info arrays used only during first pass. */
530
static usbll_endpoint_info_t **ep_info_in;
531
static usbll_endpoint_info_t **ep_info_out;
532
533
static unsigned usbll_fragment_key_hash(const void *k)
534
0
{
535
0
    return GPOINTER_TO_UINT(k);
536
0
}
537
538
static int usbll_fragment_key_equal(const void *k1, const void *k2)
539
0
{
540
0
    return GPOINTER_TO_UINT(k1) == GPOINTER_TO_UINT(k2);
541
0
}
542
543
static void *usbll_fragment_key(const packet_info *pinfo _U_, const uint32_t id, const void *data _U_)
544
0
{
545
0
    return GUINT_TO_POINTER(id);
546
0
}
547
548
static void usbll_fragment_free_key(void *ptr _U_)
549
0
{
550
    /* there's nothing to be freed */
551
0
}
552
553
static const reassembly_table_functions usbll_reassembly_table_functions = {
554
    .hash_func = usbll_fragment_key_hash,
555
    .equal_func = usbll_fragment_key_equal,
556
    .temporary_key_func = usbll_fragment_key,
557
    .persistent_key_func = usbll_fragment_key,
558
    .free_temporary_key_func = usbll_fragment_free_key,
559
    .free_persistent_key_func = usbll_fragment_free_key,
560
};
561
562
static usbll_state_t
563
usbll_next_state(usbll_state_t state, uint8_t pid)
564
1
{
565
1
    if (state == STATE_EXT)
566
0
    {
567
0
        switch (pid)
568
0
        {
569
0
            case USB_SUBPID_RESERVED_MDATA:        return STATE_SUBPID_RESERVED;
570
0
            case USB_SUBPID_RESERVED_STALL:        return STATE_SUBPID_RESERVED;
571
0
            case USB_SUBPID_CONFLICT_SETUP:        return STATE_SUBPID_NOT_REUSABLE;
572
0
            case USB_SUBPID_CONFLICT_PRE:          return STATE_SUBPID_NOT_REUSABLE;
573
0
            case USB_SUBPID_RESERVED_DATA1:        return STATE_SUBPID_RESERVED;
574
0
            case USB_SUBPID_RESERVED_NAK:          return STATE_SUBPID_RESERVED;
575
0
            case USB_SUBPID_CONFLICT_IN:           return STATE_SUBPID_NOT_REUSABLE;
576
0
            case USB_SUBPID_CONFLICT_SPLIT:        return STATE_SUBPID_NOT_REUSABLE;
577
0
            case USB_SUBPID_RESERVED_DATA2:        return STATE_SUBPID_RESERVED;
578
0
            case USB_SUBPID_RESERVED_NYET:         return STATE_SUBPID_RESERVED;
579
0
            case USB_SUBPID_CONFLICT_SOF:          return STATE_SUBPID_NOT_REUSABLE;
580
0
            case USB_SUBPID_CONFLICT_PING:         return STATE_SUBPID_NOT_REUSABLE;
581
0
            case USB_SUBPID_LPM:                   return STATE_SUBPID_LPM;
582
0
            case USB_SUBPID_RESERVED_ACK:          return STATE_SUBPID_RESERVED;
583
0
            case USB_SUBPID_CONFLICT_OUT:          return STATE_SUBPID_NOT_REUSABLE;
584
0
            case USB_SUBPID_RESERVED_EXT:          return STATE_SUBPID_RESERVED;
585
0
            default:                               return STATE_SUBPID_INVALID;
586
0
        }
587
0
    }
588
1
    else if (pid == USB_PID_SPECIAL_EXT)
589
0
    {
590
0
        return STATE_EXT;
591
0
    }
592
1
    else if (pid == USB_PID_TOKEN_SOF)
593
0
    {
594
0
        return STATE_IDLE;
595
0
    }
596
1
    else if (pid == USB_PID_SPECIAL_PING)
597
1
    {
598
1
        return STATE_PING;
599
1
    }
600
0
    else if (pid == USB_PID_TOKEN_SETUP)
601
0
    {
602
0
        switch (state)
603
0
        {
604
0
            case STATE_SSPLIT_CONTROL:             return STATE_SSPLIT_CONTROL_SETUP;
605
0
            case STATE_CSPLIT_CONTROL:             return STATE_CSPLIT_CONTROL_SETUP;
606
0
            default:                               return STATE_SETUP;
607
0
        }
608
0
    }
609
0
    else if (pid == USB_PID_TOKEN_OUT)
610
0
    {
611
0
        switch (state)
612
0
        {
613
0
            case STATE_SSPLIT_CONTROL:             return STATE_SSPLIT_CONTROL_OUT;
614
0
            case STATE_CSPLIT_CONTROL:             return STATE_CSPLIT_CONTROL_OUT;
615
0
            case STATE_SSPLIT_BULK:                return STATE_SSPLIT_BULK_OUT;
616
0
            case STATE_CSPLIT_BULK:                return STATE_CSPLIT_BULK_OUT;
617
0
            case STATE_SSPLIT_INTERRUPT:           return STATE_SSPLIT_INTERRUPT_OUT;
618
0
            case STATE_CSPLIT_INTERRUPT:           return STATE_CSPLIT_INTERRUPT_OUT;
619
0
            case STATE_SSPLIT_ISOCHRONOUS:         return STATE_SSPLIT_ISOCHRONOUS_OUT;
620
0
            default:                               return STATE_OUT;
621
0
        }
622
0
    }
623
0
    else if (pid == USB_PID_TOKEN_IN)
624
0
    {
625
0
        switch (state)
626
0
        {
627
0
            case STATE_SSPLIT_CONTROL:             return STATE_SSPLIT_CONTROL_IN;
628
0
            case STATE_CSPLIT_CONTROL:             return STATE_CSPLIT_CONTROL_IN;
629
0
            case STATE_SSPLIT_BULK:                return STATE_SSPLIT_BULK_IN;
630
0
            case STATE_CSPLIT_BULK:                return STATE_CSPLIT_BULK_IN;
631
0
            case STATE_SSPLIT_INTERRUPT:           return STATE_SSPLIT_INTERRUPT_IN;
632
0
            case STATE_CSPLIT_INTERRUPT:           return STATE_CSPLIT_INTERRUPT_IN;
633
0
            case STATE_SSPLIT_ISOCHRONOUS:         return STATE_SSPLIT_ISOCHRONOUS_IN;
634
0
            case STATE_CSPLIT_ISOCHRONOUS:         return STATE_CSPLIT_ISOCHRONOUS_IN;
635
0
            default:                               return STATE_IN;
636
0
        }
637
0
    }
638
0
    else if (pid == USB_PID_DATA_DATA0)
639
0
    {
640
0
        switch (state)
641
0
        {
642
0
            case STATE_IN:                         return STATE_IN_DATA0;
643
0
            case STATE_OUT:                        return STATE_OUT_DATA0;
644
0
            case STATE_SETUP:                      return STATE_SETUP_DATA0;
645
0
            case STATE_SSPLIT_CONTROL_SETUP:       return STATE_SSPLIT_CONTROL_SETUP_DATA0;
646
0
            case STATE_SSPLIT_CONTROL_OUT:         return STATE_SSPLIT_CONTROL_OUT_DATA0;
647
0
            case STATE_CSPLIT_CONTROL_IN:          return STATE_CSPLIT_CONTROL_IN_DATA0;
648
0
            case STATE_SSPLIT_BULK_OUT:            return STATE_SSPLIT_BULK_OUT_DATA0;
649
0
            case STATE_CSPLIT_BULK_IN:             return STATE_CSPLIT_BULK_IN_DATA0;
650
0
            case STATE_SSPLIT_INTERRUPT_OUT:       return STATE_SSPLIT_INTERRUPT_OUT_DATA0;
651
0
            case STATE_CSPLIT_INTERRUPT_IN:        return STATE_CSPLIT_INTERRUPT_IN_DATA0;
652
0
            case STATE_SSPLIT_ISOCHRONOUS_OUT:     return STATE_SSPLIT_ISOCHRONOUS_OUT_DATA0;
653
0
            case STATE_CSPLIT_ISOCHRONOUS_IN:      return STATE_CSPLIT_ISOCHRONOUS_IN_DATA0;
654
0
            default:                               return STATE_INVALID;
655
0
        }
656
0
    }
657
0
    else if (pid == USB_PID_DATA_DATA1)
658
0
    {
659
0
        switch (state)
660
0
        {
661
0
            case STATE_IN:                         return STATE_IN_DATA1;
662
0
            case STATE_OUT:                        return STATE_OUT_DATA1;
663
0
            case STATE_SSPLIT_CONTROL_OUT:         return STATE_SSPLIT_CONTROL_OUT_DATA1;
664
0
            case STATE_CSPLIT_CONTROL_IN:          return STATE_CSPLIT_CONTROL_IN_DATA1;
665
0
            case STATE_SSPLIT_BULK_OUT:            return STATE_SSPLIT_BULK_OUT_DATA1;
666
0
            case STATE_CSPLIT_BULK_IN:             return STATE_CSPLIT_BULK_IN_DATA1;
667
0
            case STATE_SSPLIT_INTERRUPT_OUT:       return STATE_SSPLIT_INTERRUPT_OUT_DATA1;
668
0
            case STATE_CSPLIT_INTERRUPT_IN:        return STATE_CSPLIT_INTERRUPT_IN_DATA1;
669
0
            default:                               return STATE_INVALID;
670
0
        }
671
0
    }
672
0
    else if (pid == USB_PID_DATA_DATA2)
673
0
    {
674
0
        switch (state)
675
0
        {
676
0
            case STATE_IN:                         return STATE_IN_HS_ISOCHRONOUS_DATA2;
677
0
            default:                               return STATE_INVALID;
678
0
        }
679
0
    }
680
0
    else if (pid == USB_PID_DATA_MDATA)
681
0
    {
682
0
        switch (state)
683
0
        {
684
0
            case STATE_OUT:                        return STATE_OUT_HS_ISOCHRONOUS_MDATA;
685
0
            case STATE_CSPLIT_INTERRUPT_IN:        return STATE_CSPLIT_INTERRUPT_IN_MDATA;
686
0
            case STATE_CSPLIT_ISOCHRONOUS_IN:      return STATE_CSPLIT_ISOCHRONOUS_IN_MDATA;
687
0
            default:                               return STATE_INVALID;
688
0
        }
689
0
    }
690
0
    else if (pid == USB_PID_HANDSHAKE_ACK)
691
0
    {
692
0
        switch (state)
693
0
        {
694
0
            case STATE_IN_DATA0:                   return STATE_IN_ACK;
695
0
            case STATE_IN_DATA1:                   return STATE_IN_ACK;
696
0
            case STATE_OUT_DATA0:                  return STATE_OUT_ACK;
697
0
            case STATE_OUT_DATA1:                  return STATE_OUT_ACK;
698
0
            case STATE_PING:                       return STATE_PING_ACK;
699
0
            case STATE_SETUP_DATA0:                return STATE_SETUP_ACK;
700
0
            case STATE_SSPLIT_CONTROL_SETUP_DATA0: return STATE_SSPLIT_CONTROL_SETUP_ACK;
701
0
            case STATE_CSPLIT_CONTROL_SETUP:       return STATE_CSPLIT_CONTROL_SETUP_ACK;
702
0
            case STATE_SSPLIT_CONTROL_OUT_DATA0:   return STATE_SSPLIT_CONTROL_OUT_ACK;
703
0
            case STATE_SSPLIT_CONTROL_OUT_DATA1:   return STATE_SSPLIT_CONTROL_OUT_ACK;
704
0
            case STATE_CSPLIT_CONTROL_OUT:         return STATE_CSPLIT_CONTROL_OUT_ACK;
705
0
            case STATE_SSPLIT_CONTROL_IN:          return STATE_SSPLIT_CONTROL_IN_ACK;
706
0
            case STATE_SSPLIT_BULK_OUT_DATA0:      return STATE_SSPLIT_BULK_OUT_ACK;
707
0
            case STATE_SSPLIT_BULK_OUT_DATA1:      return STATE_SSPLIT_BULK_OUT_ACK;
708
0
            case STATE_SSPLIT_BULK_IN:             return STATE_SSPLIT_BULK_IN_ACK;
709
0
            case STATE_CSPLIT_BULK_OUT:            return STATE_CSPLIT_BULK_OUT_ACK;
710
0
            case STATE_CSPLIT_INTERRUPT_OUT:       return STATE_CSPLIT_INTERRUPT_OUT_ACK;
711
0
            case STATE_SUBPID_LPM:                 return STATE_SUBPID_LPM_ACK;
712
0
            default:                               return STATE_INVALID;
713
0
        }
714
0
    }
715
0
    else if (pid == USB_PID_HANDSHAKE_NAK)
716
0
    {
717
0
        switch (state)
718
0
        {
719
0
            case STATE_IN:                         return STATE_IN_NAK;
720
0
            case STATE_OUT_DATA0:                  return STATE_OUT_NAK;
721
0
            case STATE_OUT_DATA1:                  return STATE_OUT_NAK;
722
0
            case STATE_PING:                       return STATE_PING_NAK;
723
0
            case STATE_SSPLIT_CONTROL_SETUP_DATA0: return STATE_SSPLIT_CONTROL_SETUP_NAK;
724
0
            case STATE_SSPLIT_CONTROL_OUT_DATA0:   return STATE_SSPLIT_CONTROL_OUT_NAK;
725
0
            case STATE_SSPLIT_CONTROL_OUT_DATA1:   return STATE_SSPLIT_CONTROL_OUT_NAK;
726
0
            case STATE_SSPLIT_CONTROL_IN:          return STATE_SSPLIT_CONTROL_IN_NAK;
727
0
            case STATE_CSPLIT_CONTROL_OUT:         return STATE_CSPLIT_CONTROL_OUT_NAK;
728
0
            case STATE_CSPLIT_CONTROL_IN:          return STATE_CSPLIT_CONTROL_IN_NAK;
729
0
            case STATE_SSPLIT_BULK_OUT_DATA0:      return STATE_SSPLIT_BULK_OUT_NAK;
730
0
            case STATE_SSPLIT_BULK_OUT_DATA1:      return STATE_SSPLIT_BULK_OUT_NAK;
731
0
            case STATE_SSPLIT_BULK_IN:             return STATE_SSPLIT_BULK_IN_NAK;
732
0
            case STATE_CSPLIT_BULK_OUT:            return STATE_CSPLIT_BULK_OUT_NAK;
733
0
            case STATE_CSPLIT_BULK_IN:             return STATE_CSPLIT_BULK_IN_NAK;
734
0
            case STATE_CSPLIT_INTERRUPT_OUT:       return STATE_CSPLIT_INTERRUPT_OUT_NAK;
735
0
            case STATE_CSPLIT_INTERRUPT_IN:        return STATE_CSPLIT_INTERRUPT_IN_NAK;
736
0
            default:                               return STATE_INVALID;
737
0
        }
738
0
    }
739
0
    else if (pid == USB_PID_HANDSHAKE_STALL)
740
0
    {
741
0
        switch (state)
742
0
        {
743
0
            case STATE_IN:                         return STATE_IN_STALL;
744
0
            case STATE_OUT_DATA0:                  return STATE_OUT_STALL;
745
0
            case STATE_OUT_DATA1:                  return STATE_OUT_STALL;
746
0
            case STATE_PING:                       return STATE_PING_STALL;
747
0
            case STATE_CSPLIT_CONTROL_OUT:         return STATE_CSPLIT_CONTROL_OUT_STALL;
748
0
            case STATE_CSPLIT_CONTROL_IN:          return STATE_CSPLIT_CONTROL_IN_STALL;
749
0
            case STATE_CSPLIT_BULK_OUT:            return STATE_CSPLIT_BULK_OUT_STALL;
750
0
            case STATE_CSPLIT_BULK_IN:             return STATE_CSPLIT_BULK_IN_STALL;
751
0
            case STATE_CSPLIT_INTERRUPT_OUT:       return STATE_CSPLIT_INTERRUPT_OUT_STALL;
752
0
            case STATE_CSPLIT_INTERRUPT_IN:        return STATE_CSPLIT_INTERRUPT_IN_STALL;
753
0
            case STATE_SUBPID_LPM:                 return STATE_SUBPID_LPM_STALL;
754
0
            default:                               return STATE_INVALID;
755
0
        }
756
0
    }
757
0
    else if (pid == USB_PID_HANDSHAKE_NYET)
758
0
    {
759
        /* Allowed only in High-Speed */
760
0
        switch (state)
761
0
        {
762
0
            case STATE_OUT_DATA0:                return STATE_OUT_NYET;
763
0
            case STATE_OUT_DATA1:                return STATE_OUT_NYET;
764
0
            case STATE_CSPLIT_CONTROL_SETUP:     return STATE_CSPLIT_CONTROL_SETUP_NYET;
765
0
            case STATE_CSPLIT_CONTROL_OUT:       return STATE_CSPLIT_CONTROL_OUT_NYET;
766
0
            case STATE_CSPLIT_CONTROL_IN:        return STATE_CSPLIT_CONTROL_IN_NYET;
767
0
            case STATE_CSPLIT_BULK_OUT:          return STATE_CSPLIT_BULK_OUT_NYET;
768
0
            case STATE_CSPLIT_BULK_IN:           return STATE_CSPLIT_BULK_IN_NYET;
769
0
            case STATE_CSPLIT_INTERRUPT_OUT:     return STATE_CSPLIT_INTERRUPT_OUT_NYET;
770
0
            case STATE_CSPLIT_INTERRUPT_IN:      return STATE_CSPLIT_INTERRUPT_IN_NYET;
771
0
            case STATE_CSPLIT_ISOCHRONOUS_IN:    return STATE_CSPLIT_ISOCHRONOUS_IN_NYET;
772
0
            case STATE_SUBPID_LPM:               return STATE_SUBPID_LPM_NYET;
773
0
            default:                             return STATE_INVALID;
774
0
        }
775
0
    }
776
0
    else if (pid == USB_PID_SPECIAL_PRE_OR_ERR)
777
0
    {
778
0
        switch (state)
779
0
        {
780
0
            case STATE_CSPLIT_INTERRUPT_OUT:     return STATE_CSPLIT_INTERRUPT_OUT_ERR;
781
0
            case STATE_CSPLIT_INTERRUPT_IN:      return STATE_CSPLIT_INTERRUPT_IN_ERR;
782
0
            case STATE_CSPLIT_ISOCHRONOUS_IN:    return STATE_CSPLIT_ISOCHRONOUS_IN_ERR;
783
0
            default:                             return STATE_IDLE;
784
0
        }
785
0
    }
786
787
    /* SPLIT is not suitable for this function as the state cannot be
788
     * determined by looking solely at PID.
789
     */
790
0
    DISSECTOR_ASSERT(pid != USB_PID_SPECIAL_SPLIT);
791
792
0
    return STATE_IDLE;
793
1
}
794
795
static bool usbll_is_non_periodic_split_start_token(usbll_state_t state)
796
1
{
797
1
    switch (state)
798
1
    {
799
0
        case STATE_SSPLIT_CONTROL_SETUP:
800
0
        case STATE_SSPLIT_CONTROL_OUT:
801
0
        case STATE_SSPLIT_CONTROL_IN:
802
0
        case STATE_SSPLIT_BULK_OUT:
803
0
        case STATE_SSPLIT_BULK_IN:
804
0
            return true;
805
1
        default:
806
1
            return false;
807
1
    }
808
809
1
}
810
static bool usbll_is_periodic_split_start_token(usbll_state_t state)
811
1
{
812
1
    switch (state)
813
1
    {
814
0
        case STATE_SSPLIT_INTERRUPT_OUT:
815
0
        case STATE_SSPLIT_INTERRUPT_IN:
816
0
        case STATE_SSPLIT_ISOCHRONOUS_OUT:
817
0
        case STATE_SSPLIT_ISOCHRONOUS_IN:
818
0
            return true;
819
1
        default:
820
1
            return false;
821
1
    }
822
823
1
}
824
static bool usbll_is_split_start_token(usbll_state_t state)
825
1
{
826
1
    return usbll_is_non_periodic_split_start_token(state) || usbll_is_periodic_split_start_token(state);
827
1
}
828
829
static bool usbll_is_non_periodic_split_complete_token(usbll_state_t state)
830
1
{
831
1
    switch (state)
832
1
    {
833
0
        case STATE_CSPLIT_CONTROL_SETUP:
834
0
        case STATE_CSPLIT_CONTROL_OUT:
835
0
        case STATE_CSPLIT_CONTROL_IN:
836
0
        case STATE_CSPLIT_BULK_OUT:
837
0
        case STATE_CSPLIT_BULK_IN:
838
0
            return true;
839
1
        default:
840
1
            return false;
841
1
    }
842
1
}
843
844
static bool usbll_is_periodic_split_complete_token(usbll_state_t state)
845
1
{
846
1
    switch (state)
847
1
    {
848
0
        case STATE_CSPLIT_INTERRUPT_OUT:
849
0
        case STATE_CSPLIT_INTERRUPT_IN:
850
0
        case STATE_CSPLIT_ISOCHRONOUS_IN:
851
0
            return true;
852
1
        default:
853
1
            return false;
854
1
    }
855
1
}
856
857
static bool usbll_is_split_complete_token(usbll_state_t state)
858
1
{
859
1
    return usbll_is_non_periodic_split_complete_token(state) || usbll_is_periodic_split_complete_token(state);
860
1
}
861
862
static bool usbll_is_split_token(usbll_state_t state)
863
0
{
864
0
    return usbll_is_split_start_token(state) || usbll_is_split_complete_token(state);
865
0
}
866
867
static bool usbll_is_non_split_token(usbll_state_t state)
868
1
{
869
1
    switch (state)
870
1
    {
871
0
        case STATE_IN:
872
0
        case STATE_OUT:
873
1
        case STATE_PING:
874
1
        case STATE_SETUP:
875
1
        case STATE_EXT:
876
1
            return true;
877
0
        default:
878
0
            return false;
879
1
    }
880
1
}
881
882
static bool usbll_is_extended_subpid(usbll_state_t state)
883
3
{
884
3
    switch (state)
885
3
    {
886
0
        case STATE_SUBPID_INVALID:
887
0
        case STATE_SUBPID_NOT_REUSABLE:
888
0
        case STATE_SUBPID_LPM:
889
0
        case STATE_SUBPID_RESERVED:
890
0
            return true;
891
3
        default:
892
3
            return false;
893
3
    }
894
3
}
895
896
static bool usbll_is_setup_data(usbll_state_t state)
897
0
{
898
0
    switch (state)
899
0
    {
900
0
        case STATE_SETUP_DATA0:
901
0
        case STATE_SSPLIT_CONTROL_SETUP_DATA0:
902
0
            return true;
903
0
        default:
904
0
            return false;
905
0
    }
906
0
}
907
908
static bool usbll_is_data_from_host(usbll_state_t state)
909
0
{
910
0
    switch (state)
911
0
    {
912
0
        case STATE_OUT_DATA0:
913
0
        case STATE_OUT_DATA1:
914
0
        case STATE_OUT_HS_ISOCHRONOUS_DATA2:
915
0
        case STATE_OUT_HS_ISOCHRONOUS_MDATA:
916
0
        case STATE_SETUP_DATA0:
917
0
        case STATE_SSPLIT_CONTROL_SETUP_DATA0:
918
0
        case STATE_SSPLIT_CONTROL_OUT_DATA0:
919
0
        case STATE_SSPLIT_CONTROL_OUT_DATA1:
920
0
        case STATE_SSPLIT_BULK_OUT_DATA0:
921
0
        case STATE_SSPLIT_BULK_OUT_DATA1:
922
0
        case STATE_SSPLIT_INTERRUPT_OUT_DATA0:
923
0
        case STATE_SSPLIT_INTERRUPT_OUT_DATA1:
924
0
        case STATE_SSPLIT_ISOCHRONOUS_OUT_DATA0:
925
0
            return true;
926
0
        case STATE_IN_DATA0:
927
0
        case STATE_IN_DATA1:
928
0
        case STATE_IN_HS_ISOCHRONOUS_DATA2:
929
0
        case STATE_CSPLIT_CONTROL_IN_DATA0:
930
0
        case STATE_CSPLIT_CONTROL_IN_DATA1:
931
0
        case STATE_CSPLIT_BULK_IN_DATA0:
932
0
        case STATE_CSPLIT_BULK_IN_DATA1:
933
0
        case STATE_CSPLIT_INTERRUPT_IN_MDATA:
934
0
        case STATE_CSPLIT_INTERRUPT_IN_DATA0:
935
0
        case STATE_CSPLIT_INTERRUPT_IN_DATA1:
936
0
        case STATE_CSPLIT_ISOCHRONOUS_IN_DATA0:
937
0
        case STATE_CSPLIT_ISOCHRONOUS_IN_MDATA:
938
0
            return false;
939
0
        default:
940
0
            DISSECTOR_ASSERT_NOT_REACHED();
941
0
    }
942
0
}
943
944
static bool usbll_is_split_data_from_device(usbll_state_t state)
945
0
{
946
0
    switch (state)
947
0
    {
948
0
        case STATE_CSPLIT_CONTROL_IN_DATA0:
949
0
        case STATE_CSPLIT_CONTROL_IN_DATA1:
950
0
        case STATE_CSPLIT_BULK_IN_DATA0:
951
0
        case STATE_CSPLIT_BULK_IN_DATA1:
952
0
        case STATE_CSPLIT_INTERRUPT_IN_MDATA:
953
0
        case STATE_CSPLIT_INTERRUPT_IN_DATA0:
954
0
        case STATE_CSPLIT_INTERRUPT_IN_DATA1:
955
0
        case STATE_CSPLIT_ISOCHRONOUS_IN_DATA0:
956
0
        case STATE_CSPLIT_ISOCHRONOUS_IN_MDATA:
957
0
            return true;
958
0
        default:
959
0
            return false;
960
0
    }
961
0
}
962
963
static bool usbll_is_setup_ack(usbll_state_t state)
964
0
{
965
0
    switch (state)
966
0
    {
967
0
        case STATE_SETUP_ACK:
968
0
        case STATE_CSPLIT_CONTROL_SETUP_ACK:
969
0
            return true;
970
0
        default:
971
0
            return false;
972
0
    }
973
0
}
974
975
static bool usbll_is_data_ack(usbll_state_t state)
976
0
{
977
0
    switch (state)
978
0
    {
979
0
        case STATE_IN_ACK:
980
0
        case STATE_OUT_ACK:
981
0
        case STATE_OUT_NYET:
982
0
        case STATE_CSPLIT_CONTROL_OUT_ACK:
983
0
        case STATE_CSPLIT_BULK_OUT_ACK:
984
0
        case STATE_CSPLIT_INTERRUPT_OUT_ACK:
985
0
            return true;
986
0
        default:
987
0
            return false;
988
0
    }
989
0
}
990
991
static bool usbll_is_acked_data_from_host(usbll_state_t state)
992
0
{
993
0
    switch (state)
994
0
    {
995
0
        case STATE_OUT_ACK:
996
0
        case STATE_OUT_NYET:
997
0
        case STATE_CSPLIT_CONTROL_OUT_ACK:
998
0
        case STATE_CSPLIT_BULK_OUT_ACK:
999
0
        case STATE_CSPLIT_INTERRUPT_OUT_ACK:
1000
0
            return true;
1001
0
        case STATE_IN_ACK:
1002
0
            return false;
1003
0
        default:
1004
0
            DISSECTOR_ASSERT_NOT_REACHED();
1005
0
    }
1006
0
}
1007
1008
static bool usbll_is_endpoint_stall(usbll_state_t state)
1009
0
{
1010
0
    switch (state)
1011
0
    {
1012
0
        case STATE_IN_STALL:
1013
0
        case STATE_OUT_STALL:
1014
0
        case STATE_PING_STALL:
1015
0
        case STATE_CSPLIT_CONTROL_OUT_STALL:
1016
0
        case STATE_CSPLIT_CONTROL_IN_STALL:
1017
0
        case STATE_CSPLIT_BULK_OUT_STALL:
1018
0
        case STATE_CSPLIT_BULK_IN_STALL:
1019
0
        case STATE_CSPLIT_INTERRUPT_OUT_STALL:
1020
0
        case STATE_CSPLIT_INTERRUPT_IN_STALL:
1021
0
            return true;
1022
0
        default:
1023
0
            return false;
1024
0
    }
1025
0
}
1026
1027
static bool usbll_is_stalled_data_from_host(usbll_state_t state)
1028
0
{
1029
0
    switch (state)
1030
0
    {
1031
0
        case STATE_OUT_STALL:
1032
0
        case STATE_PING_STALL:
1033
0
        case STATE_CSPLIT_CONTROL_OUT_STALL:
1034
0
        case STATE_CSPLIT_BULK_OUT_STALL:
1035
0
        case STATE_CSPLIT_INTERRUPT_OUT_STALL:
1036
0
            return true;
1037
0
        case STATE_IN_STALL:
1038
0
        case STATE_CSPLIT_CONTROL_IN_STALL:
1039
0
        case STATE_CSPLIT_BULK_IN_STALL:
1040
0
        case STATE_CSPLIT_INTERRUPT_IN_STALL:
1041
0
            return false;
1042
0
        default:
1043
0
            DISSECTOR_ASSERT_NOT_REACHED();
1044
0
    }
1045
0
}
1046
1047
static usb_speed_t usbll_get_data_transaction_speed(usbll_data_t *data)
1048
0
{
1049
0
    switch (data->transaction_state)
1050
0
    {
1051
0
        case STATE_IN_DATA0:
1052
0
        case STATE_IN_DATA1:
1053
0
        case STATE_IN_HS_ISOCHRONOUS_DATA2:
1054
0
        case STATE_IN_STALL:
1055
0
        case STATE_OUT_DATA0:
1056
0
        case STATE_OUT_DATA1:
1057
0
        case STATE_OUT_HS_ISOCHRONOUS_DATA2:
1058
0
        case STATE_OUT_HS_ISOCHRONOUS_MDATA:
1059
0
        case STATE_OUT_STALL:
1060
0
        case STATE_PING_STALL:
1061
0
        case STATE_SETUP_DATA0:
1062
0
            DISSECTOR_ASSERT(data->transaction != NULL);
1063
0
            return data->transaction->speed;
1064
0
        case STATE_SSPLIT_CONTROL_SETUP_DATA0:
1065
0
        case STATE_SSPLIT_CONTROL_OUT_DATA0:
1066
0
        case STATE_SSPLIT_CONTROL_OUT_DATA1:
1067
0
        case STATE_SSPLIT_BULK_OUT_DATA0:
1068
0
        case STATE_SSPLIT_BULK_OUT_DATA1:
1069
0
        case STATE_SSPLIT_INTERRUPT_OUT_DATA0:
1070
0
        case STATE_SSPLIT_INTERRUPT_OUT_DATA1:
1071
0
        case STATE_SSPLIT_ISOCHRONOUS_OUT_DATA0:
1072
0
            DISSECTOR_ASSERT(data->transaction != NULL);
1073
0
            DISSECTOR_ASSERT(data->transaction->split_start != NULL);
1074
0
            return data->transaction->split_start->speed;
1075
0
        case STATE_CSPLIT_CONTROL_OUT_STALL:
1076
0
        case STATE_CSPLIT_CONTROL_IN_DATA0:
1077
0
        case STATE_CSPLIT_CONTROL_IN_DATA1:
1078
0
        case STATE_CSPLIT_CONTROL_IN_STALL:
1079
0
        case STATE_CSPLIT_BULK_OUT_STALL:
1080
0
        case STATE_CSPLIT_BULK_IN_DATA0:
1081
0
        case STATE_CSPLIT_BULK_IN_DATA1:
1082
0
        case STATE_CSPLIT_BULK_IN_STALL:
1083
0
        case STATE_CSPLIT_INTERRUPT_OUT_STALL:
1084
0
        case STATE_CSPLIT_INTERRUPT_IN_MDATA:
1085
0
        case STATE_CSPLIT_INTERRUPT_IN_DATA0:
1086
0
        case STATE_CSPLIT_INTERRUPT_IN_DATA1:
1087
0
        case STATE_CSPLIT_INTERRUPT_IN_STALL:
1088
0
        case STATE_CSPLIT_ISOCHRONOUS_IN_DATA0:
1089
0
        case STATE_CSPLIT_ISOCHRONOUS_IN_MDATA:
1090
0
            DISSECTOR_ASSERT(data->transaction != NULL);
1091
0
            DISSECTOR_ASSERT(data->transaction->split_complete != NULL);
1092
0
            return data->transaction->split_complete->speed;
1093
0
        default:
1094
0
            DISSECTOR_ASSERT_NOT_REACHED();
1095
0
    }
1096
0
}
1097
1098
static int usbll_addr_to_str(const address* addr, char *buf, int buf_len)
1099
4
{
1100
4
    const usbll_address_t *addrp = (const usbll_address_t *)addr->data;
1101
1102
4
    if (addrp->flags & USBLL_ADDRESS_HOST) {
1103
2
        (void) g_strlcpy(buf, "host", buf_len);
1104
2
    } else if (addrp->flags & USBLL_ADDRESS_BROADCAST) {
1105
0
        (void) g_strlcpy(buf, "broadcast", buf_len);
1106
2
    } else if (addrp->flags & USBLL_ADDRESS_HUB_PORT) {
1107
        /*
1108
         * In split transaction we use : to mark that the last part is port not
1109
         * endpoint.
1110
         */
1111
1
        snprintf(buf, buf_len, "%d:%d", addrp->device,
1112
1
                       addrp->endpoint);
1113
1
    } else {
1114
        /* Just a standard address.endpoint notation. */
1115
1
        snprintf(buf, buf_len, "%d.%d", addrp->device,
1116
1
                       addrp->endpoint);
1117
1
    }
1118
1119
4
    return (int)(strlen(buf)+1);
1120
4
}
1121
1122
static int usbll_addr_str_len(const address* addr _U_)
1123
4
{
1124
4
    return 50; /* The same as for usb. */
1125
4
}
1126
1127
static void
1128
usbll_set_address(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo,
1129
                  uint8_t device, uint8_t endpoint, uint8_t flags)
1130
2
{
1131
2
    proto_item     *sub_item;
1132
2
    usbll_address_t *src_addr, *dst_addr;
1133
2
    const char *str_src_addr, *str_dst_addr;
1134
1135
2
    src_addr = wmem_new0(pinfo->pool, usbll_address_t);
1136
2
    dst_addr = wmem_new0(pinfo->pool, usbll_address_t);
1137
1138
2
    if (USBLL_ADDRESS_IS_HOST_TO_DEV(flags)) {
1139
2
        src_addr->flags = USBLL_ADDRESS_HOST;
1140
1141
2
        if (flags & USBLL_ADDRESS_BROADCAST) {
1142
0
            dst_addr->flags = USBLL_ADDRESS_BROADCAST;
1143
0
            pinfo->ptype = PT_NONE;
1144
2
        } else {
1145
2
            dst_addr->device = device;
1146
2
            dst_addr->endpoint = endpoint;
1147
2
            if (flags & USBLL_ADDRESS_HUB_PORT) {
1148
1
                dst_addr->flags = USBLL_ADDRESS_HUB_PORT;
1149
1
                pinfo->ptype = PT_NONE;
1150
1
            } else {
1151
1
                pinfo->ptype = PT_USB;
1152
1
                pinfo->destport = dst_addr->endpoint;
1153
1
            }
1154
2
        }
1155
2
    } else {
1156
0
        dst_addr->flags = USBLL_ADDRESS_HOST;
1157
0
        src_addr->device = device;
1158
0
        src_addr->endpoint = endpoint;
1159
0
        if (flags & USBLL_ADDRESS_HUB_PORT) {
1160
0
            src_addr->flags = USBLL_ADDRESS_HUB_PORT;
1161
0
            pinfo->ptype = PT_NONE;
1162
0
        } else {
1163
0
            pinfo->ptype = PT_USB;
1164
0
            pinfo->srcport = src_addr->endpoint;
1165
0
            pinfo->destport = NO_ENDPOINT;
1166
0
        }
1167
0
    }
1168
1169
2
    pinfo->p2p_dir = USBLL_ADDRESS_IS_HOST_TO_DEV(flags) ? P2P_DIR_SENT : P2P_DIR_RECV;
1170
1171
2
    set_address(&pinfo->net_src, usbll_address_type, sizeof(usbll_address_t), (char *)src_addr);
1172
2
    copy_address_shallow(&pinfo->src, &pinfo->net_src);
1173
1174
2
    set_address(&pinfo->net_dst, usbll_address_type, sizeof(usbll_address_t), (char *)dst_addr);
1175
2
    copy_address_shallow(&pinfo->dst, &pinfo->net_dst);
1176
1177
2
    str_src_addr = address_to_str(pinfo->pool, &pinfo->src);
1178
2
    str_dst_addr = address_to_str(pinfo->pool, &pinfo->dst);
1179
1180
2
    sub_item = proto_tree_add_string(tree, hf_usbll_src, tvb, 0, 0, str_src_addr);
1181
2
    proto_item_set_generated(sub_item);
1182
1183
2
    sub_item = proto_tree_add_string(tree, hf_usbll_addr, tvb, 0, 0, str_src_addr);
1184
2
    proto_item_set_hidden(sub_item);
1185
1186
2
    sub_item = proto_tree_add_string(tree, hf_usbll_dst, tvb, 0, 0, str_dst_addr);
1187
2
    proto_item_set_generated(sub_item);
1188
1189
2
    sub_item = proto_tree_add_string(tree, hf_usbll_addr, tvb, 0, 0, str_dst_addr);
1190
2
    proto_item_set_hidden(sub_item);
1191
2
}
1192
1193
static void
1194
usbll_generate_address(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, usbll_data_t *data)
1195
3
{
1196
3
    switch (data->transaction_state)
1197
3
    {
1198
1
        case STATE_IDLE:
1199
1
        case STATE_INVALID:
1200
            /* Do not set address if we are not sure about it */
1201
1
            break;
1202
0
        case STATE_IN:
1203
0
        case STATE_IN_ACK:
1204
0
        case STATE_OUT:
1205
0
        case STATE_OUT_DATA0:
1206
0
        case STATE_OUT_DATA1:
1207
0
        case STATE_OUT_HS_ISOCHRONOUS_DATA2:
1208
0
        case STATE_OUT_HS_ISOCHRONOUS_MDATA:
1209
1
        case STATE_PING:
1210
1
        case STATE_SETUP:
1211
1
        case STATE_SETUP_DATA0:
1212
1
        case STATE_EXT:
1213
1
        case STATE_SUBPID_INVALID:
1214
1
        case STATE_SUBPID_NOT_REUSABLE:
1215
1
        case STATE_SUBPID_LPM:
1216
1
        case STATE_SUBPID_RESERVED:
1217
1
            DISSECTOR_ASSERT(data->transaction != NULL);
1218
1
            usbll_set_address(tree, tvb, pinfo,
1219
1
                              data->transaction->address, data->transaction->endpoint,
1220
1
                              USBLL_ADDRESS_HOST_TO_DEV);
1221
1
            break;
1222
0
        case STATE_IN_DATA0:
1223
0
        case STATE_IN_DATA1:
1224
0
        case STATE_IN_HS_ISOCHRONOUS_DATA2:
1225
0
        case STATE_IN_NAK:
1226
0
        case STATE_IN_STALL:
1227
0
        case STATE_OUT_ACK:
1228
0
        case STATE_OUT_NAK:
1229
0
        case STATE_OUT_STALL:
1230
0
        case STATE_OUT_NYET:
1231
0
        case STATE_PING_ACK:
1232
0
        case STATE_PING_NAK:
1233
0
        case STATE_PING_STALL:
1234
0
        case STATE_SETUP_ACK:
1235
0
        case STATE_SUBPID_LPM_ACK:
1236
0
        case STATE_SUBPID_LPM_NYET:
1237
0
        case STATE_SUBPID_LPM_STALL:
1238
0
            DISSECTOR_ASSERT(data->transaction != NULL);
1239
0
            usbll_set_address(tree, tvb, pinfo,
1240
0
                              data->transaction->address, data->transaction->endpoint,
1241
0
                              USBLL_ADDRESS_DEV_TO_HOST);
1242
0
            break;
1243
0
        case STATE_SSPLIT_CONTROL:
1244
0
        case STATE_CSPLIT_CONTROL:
1245
0
        case STATE_SSPLIT_BULK:
1246
0
        case STATE_CSPLIT_BULK:
1247
0
        case STATE_SSPLIT_INTERRUPT:
1248
1
        case STATE_CSPLIT_INTERRUPT:
1249
1
        case STATE_SSPLIT_ISOCHRONOUS:
1250
1
        case STATE_CSPLIT_ISOCHRONOUS:
1251
1
            DISSECTOR_ASSERT(data->transaction != NULL);
1252
1
            usbll_set_address(tree, tvb, pinfo,
1253
1
                              data->transaction->address, data->transaction->endpoint,
1254
1
                              USBLL_ADDRESS_HOST_TO_DEV | USBLL_ADDRESS_HUB_PORT);
1255
1
            break;
1256
0
        case STATE_SSPLIT_CONTROL_SETUP:
1257
0
        case STATE_SSPLIT_CONTROL_SETUP_DATA0:
1258
0
        case STATE_SSPLIT_CONTROL_OUT:
1259
0
        case STATE_SSPLIT_CONTROL_OUT_DATA0:
1260
0
        case STATE_SSPLIT_CONTROL_OUT_DATA1:
1261
0
        case STATE_SSPLIT_CONTROL_IN:
1262
0
        case STATE_SSPLIT_BULK_OUT:
1263
0
        case STATE_SSPLIT_BULK_OUT_DATA0:
1264
0
        case STATE_SSPLIT_BULK_OUT_DATA1:
1265
0
        case STATE_SSPLIT_BULK_IN:
1266
0
        case STATE_SSPLIT_INTERRUPT_OUT:
1267
0
        case STATE_SSPLIT_INTERRUPT_OUT_DATA0:
1268
0
        case STATE_SSPLIT_INTERRUPT_OUT_DATA1:
1269
0
        case STATE_SSPLIT_INTERRUPT_IN:
1270
0
        case STATE_SSPLIT_ISOCHRONOUS_OUT:
1271
0
        case STATE_SSPLIT_ISOCHRONOUS_OUT_DATA0:
1272
0
        case STATE_SSPLIT_ISOCHRONOUS_IN:
1273
0
            DISSECTOR_ASSERT(data->transaction != NULL);
1274
0
            DISSECTOR_ASSERT(data->transaction->split_start != NULL);
1275
0
            usbll_set_address(tree, tvb, pinfo,
1276
0
                              data->transaction->address, data->transaction->endpoint,
1277
0
                              USBLL_ADDRESS_HOST_TO_DEV);
1278
0
            break;
1279
0
        case STATE_SSPLIT_CONTROL_SETUP_ACK:
1280
0
        case STATE_SSPLIT_CONTROL_SETUP_NAK:
1281
0
        case STATE_SSPLIT_CONTROL_OUT_ACK:
1282
0
        case STATE_SSPLIT_CONTROL_OUT_NAK:
1283
0
        case STATE_SSPLIT_CONTROL_IN_ACK:
1284
0
        case STATE_SSPLIT_CONTROL_IN_NAK:
1285
0
        case STATE_SSPLIT_BULK_OUT_ACK:
1286
0
        case STATE_SSPLIT_BULK_OUT_NAK:
1287
0
        case STATE_SSPLIT_BULK_IN_ACK:
1288
0
        case STATE_SSPLIT_BULK_IN_NAK:
1289
0
            DISSECTOR_ASSERT(data->transaction != NULL);
1290
0
            DISSECTOR_ASSERT(data->transaction->split_start != NULL);
1291
0
            usbll_set_address(tree, tvb, pinfo,
1292
0
                              data->transaction->split_start->address, data->transaction->split_start->endpoint,
1293
0
                              USBLL_ADDRESS_DEV_TO_HOST | USBLL_ADDRESS_HUB_PORT);
1294
0
            break;
1295
0
        case STATE_CSPLIT_CONTROL_SETUP:
1296
0
        case STATE_CSPLIT_CONTROL_OUT:
1297
0
        case STATE_CSPLIT_CONTROL_IN:
1298
0
        case STATE_CSPLIT_BULK_OUT:
1299
0
        case STATE_CSPLIT_BULK_IN:
1300
0
        case STATE_CSPLIT_INTERRUPT_OUT:
1301
0
        case STATE_CSPLIT_INTERRUPT_IN:
1302
0
        case STATE_CSPLIT_ISOCHRONOUS_IN:
1303
0
            DISSECTOR_ASSERT(data->transaction != NULL);
1304
0
            DISSECTOR_ASSERT(data->transaction->split_complete != NULL);
1305
0
            usbll_set_address(tree, tvb, pinfo,
1306
0
                              data->transaction->address, data->transaction->endpoint,
1307
0
                              USBLL_ADDRESS_HOST_TO_DEV);
1308
0
            break;
1309
0
        case STATE_CSPLIT_CONTROL_SETUP_ACK:
1310
0
        case STATE_CSPLIT_CONTROL_OUT_ACK:
1311
0
        case STATE_CSPLIT_CONTROL_OUT_NAK:
1312
0
        case STATE_CSPLIT_CONTROL_OUT_STALL:
1313
0
        case STATE_CSPLIT_CONTROL_IN_DATA0:
1314
0
        case STATE_CSPLIT_CONTROL_IN_DATA1:
1315
0
        case STATE_CSPLIT_CONTROL_IN_NAK:
1316
0
        case STATE_CSPLIT_CONTROL_IN_STALL:
1317
0
        case STATE_CSPLIT_BULK_OUT_ACK:
1318
0
        case STATE_CSPLIT_BULK_OUT_NAK:
1319
0
        case STATE_CSPLIT_BULK_OUT_STALL:
1320
0
        case STATE_CSPLIT_BULK_IN_DATA0:
1321
0
        case STATE_CSPLIT_BULK_IN_DATA1:
1322
0
        case STATE_CSPLIT_BULK_IN_NAK:
1323
0
        case STATE_CSPLIT_BULK_IN_STALL:
1324
0
        case STATE_CSPLIT_INTERRUPT_OUT_ACK:
1325
0
        case STATE_CSPLIT_INTERRUPT_OUT_NAK:
1326
0
        case STATE_CSPLIT_INTERRUPT_OUT_STALL:
1327
0
        case STATE_CSPLIT_INTERRUPT_IN_MDATA:
1328
0
        case STATE_CSPLIT_INTERRUPT_IN_DATA0:
1329
0
        case STATE_CSPLIT_INTERRUPT_IN_DATA1:
1330
0
        case STATE_CSPLIT_INTERRUPT_IN_NAK:
1331
0
        case STATE_CSPLIT_INTERRUPT_IN_STALL:
1332
0
        case STATE_CSPLIT_ISOCHRONOUS_IN_DATA0:
1333
0
        case STATE_CSPLIT_ISOCHRONOUS_IN_MDATA:
1334
0
            DISSECTOR_ASSERT(data->transaction != NULL);
1335
0
            DISSECTOR_ASSERT(data->transaction->split_complete != NULL);
1336
0
            usbll_set_address(tree, tvb, pinfo,
1337
0
                              data->transaction->address, data->transaction->endpoint,
1338
0
                              USBLL_ADDRESS_DEV_TO_HOST);
1339
0
            break;
1340
0
        case STATE_CSPLIT_CONTROL_SETUP_NYET:
1341
0
        case STATE_CSPLIT_CONTROL_OUT_NYET:
1342
0
        case STATE_CSPLIT_CONTROL_IN_NYET:
1343
0
        case STATE_CSPLIT_BULK_OUT_NYET:
1344
0
        case STATE_CSPLIT_BULK_IN_NYET:
1345
0
        case STATE_CSPLIT_INTERRUPT_OUT_ERR:
1346
0
        case STATE_CSPLIT_INTERRUPT_OUT_NYET:
1347
0
        case STATE_CSPLIT_INTERRUPT_IN_ERR:
1348
0
        case STATE_CSPLIT_INTERRUPT_IN_NYET:
1349
0
        case STATE_CSPLIT_ISOCHRONOUS_IN_ERR:
1350
0
        case STATE_CSPLIT_ISOCHRONOUS_IN_NYET:
1351
0
            DISSECTOR_ASSERT(data->transaction != NULL);
1352
0
            usbll_set_address(tree, tvb, pinfo,
1353
0
                              data->transaction->address, data->transaction->endpoint,
1354
0
                              USBLL_ADDRESS_DEV_TO_HOST | USBLL_ADDRESS_HUB_PORT);
1355
0
            break;
1356
0
        default:
1357
0
            DISSECTOR_ASSERT_NOT_REACHED();
1358
3
    }
1359
3
}
1360
1361
static usbll_transaction_info_t *
1362
tt_restore_transaction(packet_info *pinfo, usbll_state_t state, uint8_t hub_address, uint8_t port)
1363
0
{
1364
    /* The buffer is simply updated with each subsequent packet, this is fine
1365
     * if and only if we access it only during first pass.
1366
     */
1367
0
    DISSECTOR_ASSERT(!PINFO_FD_VISITED(pinfo));
1368
0
    DISSECTOR_ASSERT(usbll_is_split_complete_token(state));
1369
0
    DISSECTOR_ASSERT(hub_address <= 127);
1370
0
    DISSECTOR_ASSERT(port <= 127);
1371
1372
0
    if (!tt_periodic || !tt_non_periodic)
1373
0
    {
1374
        /* No transaction has been registered yet */
1375
0
        return NULL;
1376
0
    }
1377
1378
0
    if (usbll_is_periodic_split_complete_token(state))
1379
0
    {
1380
0
        return tt_periodic[hub_address][port];
1381
0
    }
1382
0
    else
1383
0
    {
1384
0
        DISSECTOR_ASSERT(usbll_is_non_periodic_split_complete_token(state));
1385
0
        return tt_non_periodic[hub_address][port];
1386
0
    }
1387
0
}
1388
1389
static void
1390
tt_store_transaction(packet_info *pinfo, usbll_state_t state, uint8_t hub_address, uint8_t port,
1391
                     usbll_transaction_info_t *transaction)
1392
0
{
1393
0
    DISSECTOR_ASSERT(!PINFO_FD_VISITED(pinfo));
1394
0
    DISSECTOR_ASSERT(usbll_is_split_start_token(state));
1395
0
    DISSECTOR_ASSERT(hub_address <= 127);
1396
0
    DISSECTOR_ASSERT(port <= 127);
1397
1398
0
    if (!tt_periodic || !tt_non_periodic)
1399
0
    {
1400
        /* Lazy allocate lookup table. Both address and port are 7 bit numbers,
1401
         * so simply allocate buffers capable to hold all possible combinations.
1402
         */
1403
0
        int i;
1404
0
        tt_periodic = wmem_alloc_array(wmem_file_scope(), usbll_transaction_info_t **, 128);
1405
0
        for (i = 0; i < 128; i++)
1406
0
        {
1407
0
            tt_periodic[i] = wmem_alloc0_array(wmem_file_scope(), usbll_transaction_info_t *, 128);
1408
0
        }
1409
0
        tt_non_periodic = wmem_alloc_array(wmem_file_scope(), usbll_transaction_info_t **, 128);
1410
0
        for (i = 0; i < 128; i++)
1411
0
        {
1412
0
            tt_non_periodic[i] = wmem_alloc0_array(wmem_file_scope(), usbll_transaction_info_t *, 128);
1413
0
        }
1414
0
    }
1415
1416
0
    if (usbll_is_periodic_split_start_token(state))
1417
0
    {
1418
0
        tt_periodic[hub_address][port] = transaction;
1419
0
    }
1420
0
    else
1421
0
    {
1422
0
        DISSECTOR_ASSERT(usbll_is_non_periodic_split_start_token(state));
1423
0
        tt_non_periodic[hub_address][port] = transaction;
1424
0
    }
1425
0
}
1426
1427
static usbll_ep_type_t
1428
usbll_ep_type_from_urb_type(uint8_t urb_type)
1429
0
{
1430
0
    switch (urb_type)
1431
0
    {
1432
0
        case URB_ISOCHRONOUS: return USBLL_EP_ISOCHRONOUS;
1433
0
        case URB_INTERRUPT:   return USBLL_EP_INTERRUPT;
1434
0
        case URB_CONTROL:     return USBLL_EP_CONTROL;
1435
0
        case URB_BULK:        return USBLL_EP_BULK;
1436
0
        default:              return USBLL_EP_UNKNOWN;
1437
0
    }
1438
0
}
1439
1440
static void
1441
usbll_reset_endpoint_info(usbll_endpoint_info_t *info, usbll_ep_type_t type, uint16_t max_packet_size)
1442
0
{
1443
0
    info->type = type;
1444
0
    info->data = USBLL_TRANSFER_NORMAL;
1445
0
    info->max_packet_size = max_packet_size;
1446
0
    info->last_data_pid = 0;
1447
0
    info->last_data_acked = false;
1448
0
    info->active_transfer_key = 0;
1449
0
    info->transfer_offset = 0;
1450
0
    info->last_data_len = 0;
1451
0
    info->requested_transfer_length = 0;
1452
0
}
1453
1454
static void usbll_reset_device_endpoints(int addr)
1455
0
{
1456
0
    int ep;
1457
0
    DISSECTOR_ASSERT((addr >= 0) && (addr <= 127));
1458
1459
    /* Endpoint 0 is always control type */
1460
0
    usbll_reset_endpoint_info(&ep_info_in[addr][0], USBLL_EP_CONTROL, 0);
1461
0
    usbll_reset_endpoint_info(&ep_info_out[addr][0], USBLL_EP_CONTROL, 0);
1462
0
    for (ep = 1; ep < 16; ep++)
1463
0
    {
1464
0
        usbll_reset_endpoint_info(&ep_info_in[addr][ep], USBLL_EP_UNKNOWN, 0);
1465
0
        usbll_reset_endpoint_info(&ep_info_out[addr][ep], USBLL_EP_UNKNOWN, 0);
1466
0
    }
1467
0
}
1468
1469
static void usbll_init_endpoint_tables(void)
1470
0
{
1471
    /* Address is 7 bits (0 - 127), while endpoint is 4 bits (0 - 15) */
1472
0
    int addr;
1473
0
    ep_info_in = wmem_alloc_array(wmem_file_scope(), usbll_endpoint_info_t *, 128);
1474
0
    for (addr = 0; addr < 128; addr++)
1475
0
    {
1476
0
        ep_info_in[addr] = wmem_alloc_array(wmem_file_scope(), usbll_endpoint_info_t, 16);
1477
0
    }
1478
0
    ep_info_out = wmem_alloc_array(wmem_file_scope(), usbll_endpoint_info_t *, 128);
1479
0
    for (addr = 0; addr < 128; addr++)
1480
0
    {
1481
0
        ep_info_out[addr] = wmem_alloc_array(wmem_file_scope(), usbll_endpoint_info_t, 16);
1482
0
    }
1483
1484
0
    for (addr = 0; addr < 128; addr++)
1485
0
    {
1486
0
        usbll_reset_device_endpoints(addr);
1487
0
    }
1488
0
}
1489
1490
static usbll_endpoint_info_t *
1491
usbll_get_endpoint_info(packet_info *pinfo, uint8_t addr, uint8_t ep, bool from_host)
1492
0
{
1493
0
    usbll_endpoint_info_t *info;
1494
0
    DISSECTOR_ASSERT(!PINFO_FD_VISITED(pinfo));
1495
0
    DISSECTOR_ASSERT(addr <= 127);
1496
0
    DISSECTOR_ASSERT(ep <= 15);
1497
1498
0
    if (!ep_info_in || !ep_info_out)
1499
0
    {
1500
0
        usbll_init_endpoint_tables();
1501
0
        DISSECTOR_ASSERT(ep_info_in != NULL);
1502
0
        DISSECTOR_ASSERT(ep_info_out != NULL);
1503
0
    }
1504
1505
0
    if (from_host)
1506
0
    {
1507
0
        info = &ep_info_out[addr][ep];
1508
0
    }
1509
0
    else
1510
0
    {
1511
0
        info = &ep_info_in[addr][ep];
1512
0
    }
1513
1514
0
    if (ep != 0)
1515
0
    {
1516
        /* Get endpoint type and max packet size from USB dissector
1517
         * USB dissector gets the information from CONFIGURATION descriptor
1518
         *
1519
         * TODO: Reorganize USB dissector to call us whenever selected
1520
         *       configuration and/or interface changes. USB dissector
1521
         *       currently assumes only one configuration and that all
1522
         *       alternate interface settings have matching endpoint
1523
         *       information. This should be fixed but is good for now
1524
         *       as most devices fullfills this (wrong) assumption.
1525
         */
1526
0
        usb_conv_info_t *usb_conv_info;
1527
0
        usbll_ep_type_t  type = USBLL_EP_UNKNOWN;
1528
0
        uint16_t         max_packet_size = 0;
1529
0
        uint8_t          endpoint = ep | (from_host ? 0 : 0x80);
1530
0
        usb_conv_info = get_existing_usb_ep_conv_info(pinfo, 0, addr, endpoint);
1531
0
        if (usb_conv_info && usb_conv_info->max_packet_size)
1532
0
        {
1533
0
            type = usbll_ep_type_from_urb_type(usb_conv_info->descriptor_transfer_type);
1534
0
            max_packet_size = usb_conv_info->max_packet_size;
1535
0
        }
1536
        /* Reset endpoint info if endpoint parameters changed */
1537
0
        if ((info->type != type) || (info->max_packet_size != max_packet_size))
1538
0
        {
1539
0
            usbll_reset_endpoint_info(info, type, max_packet_size);
1540
0
        }
1541
0
    }
1542
1543
0
    return info;
1544
0
}
1545
1546
static int
1547
dissect_usbll_sof(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
1548
0
{
1549
0
    uint32_t frame;
1550
    /* SOF Packets are broadcasted from Host to all devices. */
1551
0
    usbll_set_address(tree, tvb, pinfo, 0, 0, USBLL_ADDRESS_HOST_TO_DEV | USBLL_ADDRESS_BROADCAST);
1552
1553
0
    proto_tree_add_item_ret_uint(tree, hf_usbll_sof_framenum, tvb, offset, 2, ENC_LITTLE_ENDIAN, &frame);
1554
0
    proto_tree_add_checksum(tree, tvb, offset,
1555
0
                            hf_usbll_crc5, hf_usbll_crc5_status, &ei_wrong_crc5, pinfo,
1556
0
                            crc5_usb_11bit_input(frame),
1557
0
                            ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_VERIFY);
1558
0
    offset += 2;
1559
1560
0
    return offset;
1561
0
}
1562
1563
static int
1564
dissect_usbll_token(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset,
1565
                    uint8_t pid, usbll_data_t *data, usb_speed_t speed)
1566
1
{
1567
1
    uint8_t          device_address;
1568
1
    uint8_t          endpoint;
1569
1
    uint16_t         address_bits;
1570
1571
1
    static int * const address_fields[] = {
1572
1
        &hf_usbll_device_addr,
1573
1
        &hf_usbll_endp,
1574
1
        NULL
1575
1
    };
1576
1577
1
    address_bits = tvb_get_letohs(tvb, offset);
1578
1
    device_address = TOKEN_BITS_GET_ADDRESS(address_bits);
1579
1
    endpoint = TOKEN_BITS_GET_ENDPOINT(address_bits);
1580
1581
1
    proto_tree_add_bitmask_list_value(tree, tvb, offset, 2, address_fields, address_bits);
1582
1
    proto_tree_add_checksum(tree, tvb, offset,
1583
1
                            hf_usbll_crc5, hf_usbll_crc5_status, &ei_wrong_crc5, pinfo,
1584
1
                            crc5_usb_11bit_input(address_bits),
1585
1
                            ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_VERIFY);
1586
1
    offset += 2;
1587
1588
1
    if (!PINFO_FD_VISITED(pinfo))
1589
1
    {
1590
1
        usbll_state_t             prev_state;
1591
1
        usbll_transaction_info_t *transaction = NULL;
1592
1
        usbll_transaction_info_t *split_transaction = NULL;
1593
1594
1
        prev_state = data->prev ? data->prev->transaction_state : STATE_IDLE;
1595
1
        data->transaction_state = usbll_next_state(prev_state, pid);
1596
1597
1
        DISSECTOR_ASSERT(usbll_is_non_split_token(data->transaction_state) ||
1598
1
                         usbll_is_split_token(data->transaction_state));
1599
1600
1
        if (usbll_is_split_complete_token(data->transaction_state))
1601
0
        {
1602
0
            DISSECTOR_ASSERT(data->prev != NULL);
1603
0
            DISSECTOR_ASSERT(data->prev->transaction != NULL);
1604
0
            DISSECTOR_ASSERT(data->prev->transaction->pid == USB_PID_SPECIAL_SPLIT);
1605
0
            split_transaction = data->prev->transaction;
1606
1607
0
            transaction = tt_restore_transaction(pinfo, data->transaction_state,
1608
0
                                                 split_transaction->address, split_transaction->endpoint);
1609
1610
0
            if (transaction == NULL)
1611
0
            {
1612
                /* Most likely capture simply misses Split Start */
1613
0
                transaction = wmem_new0(wmem_file_scope(), usbll_transaction_info_t);
1614
0
                transaction->pid = pid;
1615
0
                transaction->address = device_address;
1616
0
                transaction->endpoint = endpoint;
1617
0
                transaction->speed = speed;
1618
0
            }
1619
1620
0
            transaction->split_complete = data->prev->transaction;
1621
0
        }
1622
1
        else
1623
1
        {
1624
1
            transaction = wmem_new0(wmem_file_scope(), usbll_transaction_info_t);
1625
1
            transaction->starts_in = pinfo->num;
1626
1
            transaction->pid = pid;
1627
1
            transaction->address = device_address;
1628
1
            transaction->endpoint = endpoint;
1629
1
            transaction->speed = speed;
1630
1
        }
1631
1632
1
        if (usbll_is_split_start_token(data->transaction_state))
1633
0
        {
1634
0
            DISSECTOR_ASSERT(data->prev != NULL);
1635
0
            DISSECTOR_ASSERT(data->prev->transaction != NULL);
1636
0
            DISSECTOR_ASSERT(data->prev->transaction->pid == USB_PID_SPECIAL_SPLIT);
1637
0
            transaction->split_start = data->prev->transaction;
1638
1639
0
            tt_store_transaction(pinfo, data->transaction_state,
1640
0
                                 transaction->split_start->address, transaction->split_start->endpoint,
1641
0
                                 transaction);
1642
0
        }
1643
1644
1
        data->transaction = transaction;
1645
1
    }
1646
1647
1
    return offset;
1648
1
}
1649
1650
static bool
1651
packet_ends_transfer(usbll_endpoint_info_t *ep_info, uint32_t offset, int data_size)
1652
0
{
1653
0
    DISSECTOR_ASSERT(ep_info->type != USBLL_EP_UNKNOWN);
1654
1655
0
    if (ep_info->requested_transfer_length != 0)
1656
0
    {
1657
        /* We know requested transfer length */
1658
0
        if (offset + data_size >= ep_info->requested_transfer_length)
1659
0
        {
1660
            /* No more data needed */
1661
0
            return true;
1662
0
        }
1663
        /* else check max packet size as transfer can end prematurely */
1664
0
    }
1665
0
    else
1666
0
    {
1667
0
        DISSECTOR_ASSERT(ep_info->type != USBLL_EP_CONTROL);
1668
0
        DISSECTOR_ASSERT(ep_info->max_packet_size != 0);
1669
        /* We don't know requested transfer length, for bulk transfers
1670
         * assume that transfer can be larger than max packet length,
1671
         * for periodic transfers assume transfer is not larger than
1672
         * max packet length.
1673
         */
1674
0
        if (ep_info->type != USBLL_EP_BULK)
1675
0
        {
1676
            /* For High-Bandwidth endpoints allow up to Total Payload Length */
1677
0
            if (USB_MPS_ADDNL(ep_info->max_packet_size))
1678
0
            {
1679
0
                uint32_t total_payload = USB_MPS_TPL(ep_info->max_packet_size);
1680
1681
                /* Short packet always ends transfer */
1682
0
                if (data_size < USB_MPS_EP_SIZE(ep_info->max_packet_size))
1683
0
                {
1684
0
                    return true;
1685
0
                }
1686
1687
0
                return offset + data_size >= total_payload;
1688
0
            }
1689
1690
0
            return true;
1691
0
        }
1692
0
    }
1693
1694
0
    if (ep_info->max_packet_size)
1695
0
    {
1696
0
        return data_size < ep_info->max_packet_size;
1697
0
    }
1698
1699
0
    DISSECTOR_ASSERT(ep_info->type == USBLL_EP_CONTROL);
1700
    /* This code is valid only for high-speed control endpoints */
1701
0
    if (data_size < 64)
1702
0
    {
1703
0
        return true;
1704
0
    }
1705
1706
0
    return false;
1707
0
}
1708
1709
static bool is_get_device_descriptor(uint8_t setup[8])
1710
0
{
1711
0
    uint16_t lang_id = setup[4] | (setup[5] << 8);
1712
0
    uint16_t length = setup[6] | (setup[7] << 8);
1713
0
    return (setup[0] == USB_DIR_IN) &&
1714
0
           (setup[1] == USB_SETUP_GET_DESCRIPTOR) &&
1715
0
           (setup[2] == 0x00) && /* Descriptor Index */
1716
0
           (setup[3] == 0x01) && /* DEVICE descriptor */
1717
0
           (lang_id == 0x00) && /* no language specified */
1718
0
           (length >= 8); /* at least 8 bytes needed to get bMaxPacketSize0 */
1719
0
}
1720
1721
static bool is_set_address(uint8_t setup[8])
1722
0
{
1723
0
    uint16_t addr = setup[2] | (setup[3] << 8);
1724
0
    uint16_t idx = setup[4] | (setup[5] << 8);
1725
0
    uint16_t length = setup[6] | (setup[7] << 8);
1726
0
    return (setup[0] == USB_DIR_OUT) &&
1727
0
           (setup[1] == USB_SETUP_SET_ADDRESS) &&
1728
0
           (addr <= 127) && (idx == 0x00) && (length == 0x00);
1729
0
}
1730
1731
static void
1732
usbll_construct_urb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
1733
                    int data_offset, int data_size, usbll_data_t *data)
1734
0
{
1735
0
    usbll_transfer_info_t *transfer = NULL;
1736
1737
0
    transfer = (usbll_transfer_info_t *)wmem_map_lookup(transfer_info, GUINT_TO_POINTER(pinfo->num));
1738
0
    if (transfer)
1739
0
    {
1740
0
        tvbuff_t *transfer_tvb;
1741
1742
0
        if ((transfer->first_packet == pinfo->num) && (!transfer->more_frags) &&
1743
0
            (((transfer->type == USBLL_EP_CONTROL) && (transfer->from_host)) ||
1744
0
             (transfer->type == USBLL_EP_ISOCHRONOUS)))
1745
0
        {
1746
            /* No multi-packet reassembly needed, simply construct tvb */
1747
0
            transfer_tvb = tvb_new_subset_length(tvb, data_offset, data_size);
1748
0
            add_new_data_source(pinfo, transfer_tvb, "USB transfer");
1749
0
        }
1750
0
        else
1751
0
        {
1752
0
            fragment_head *head;
1753
0
            head = fragment_add_check_with_fallback(&usbll_reassembly_table,
1754
0
                       tvb, data_offset,
1755
0
                       pinfo, transfer->first_packet, NULL,
1756
0
                       transfer->offset, data_size, transfer->more_frags, transfer->first_packet);
1757
0
            transfer_tvb = process_reassembled_data(tvb, data_offset, pinfo,
1758
0
                                                    "USB transfer", head, &usbll_frag_items,
1759
0
                                                    NULL, tree);
1760
0
        }
1761
1762
0
        if (transfer_tvb != NULL)
1763
0
        {
1764
0
            usb_pseudo_urb_t pseudo_urb;
1765
0
            pseudo_urb.from_host = transfer->from_host;
1766
0
            switch (transfer->type)
1767
0
            {
1768
0
                case USBLL_EP_UNKNOWN:
1769
0
                    pseudo_urb.transfer_type = URB_UNKNOWN;
1770
0
                    break;
1771
0
                case USBLL_EP_CONTROL:
1772
0
                    pseudo_urb.transfer_type = URB_CONTROL;
1773
0
                    break;
1774
0
                case USBLL_EP_BULK:
1775
0
                    pseudo_urb.transfer_type = URB_BULK;
1776
0
                    break;
1777
0
                case USBLL_EP_INTERRUPT:
1778
0
                    pseudo_urb.transfer_type = URB_INTERRUPT;
1779
0
                    break;
1780
0
                case USBLL_EP_ISOCHRONOUS:
1781
0
                    pseudo_urb.transfer_type = URB_ISOCHRONOUS;
1782
0
                    break;
1783
0
                default:
1784
0
                    DISSECTOR_ASSERT_NOT_REACHED();
1785
0
            }
1786
0
            pseudo_urb.device_address = data->transaction->address;
1787
0
            pseudo_urb.endpoint = data->transaction->endpoint | (transfer->from_host ? 0 : 0x80);
1788
0
            pseudo_urb.bus_id = 0;
1789
0
            pseudo_urb.speed = usbll_get_data_transaction_speed(data);
1790
0
            dissect_usb_common(transfer_tvb, pinfo, proto_tree_get_parent_tree(tree),
1791
0
                               USB_HEADER_PSEUDO_URB, &pseudo_urb);
1792
0
        }
1793
0
    }
1794
0
}
1795
1796
static int
1797
dissect_usbll_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset,
1798
                   uint8_t pid, usbll_data_t *data, int *payload_size)
1799
0
{
1800
    /* TODO: How to determine the expected DATA size? */
1801
0
    uint16_t               computed_crc, actual_crc;
1802
0
    int                    data_offset = offset;
1803
0
    int                    data_size = tvb_reported_length_remaining(tvb, offset) - 2;
1804
0
    proto_item            *data_item = NULL;
1805
0
    usbll_transfer_info_t *transfer = NULL;
1806
1807
0
    data_item = proto_tree_add_item(tree, hf_usbll_data, tvb, offset, data_size, ENC_NA);
1808
0
    offset += data_size;
1809
1810
0
    actual_crc = tvb_get_letohs(tvb, offset);
1811
0
    computed_crc = crc16_usb_tvb_offset(tvb, 1, offset - 1);
1812
0
    proto_tree_add_checksum(tree, tvb, offset,
1813
0
                            hf_usbll_data_crc, hf_usbll_data_crc_status, &ei_wrong_crc16, pinfo,
1814
0
                            computed_crc, ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_VERIFY);
1815
0
    offset += 2;
1816
1817
0
    if (!PINFO_FD_VISITED(pinfo))
1818
0
    {
1819
0
        usbll_state_t             prev_state;
1820
1821
0
        prev_state = data->prev ? data->prev->transaction_state : STATE_IDLE;
1822
0
        data->transaction_state = usbll_next_state(prev_state, pid);
1823
0
        if (data->transaction_state != STATE_INVALID)
1824
0
        {
1825
0
            DISSECTOR_ASSERT(data->prev != NULL);
1826
0
            DISSECTOR_ASSERT(data->prev->transaction != NULL);
1827
0
            data->transaction = data->prev->transaction;
1828
0
        }
1829
0
    }
1830
1831
0
    if (actual_crc != computed_crc)
1832
0
    {
1833
        /* Do not reassemble on CRC error */
1834
0
        return offset;
1835
0
    }
1836
1837
0
    if (usbll_is_setup_data(data->transaction_state))
1838
0
    {
1839
0
        if (data_size != 8)
1840
0
        {
1841
0
            expert_add_info(pinfo, data_item, &ei_invalid_setup_data);
1842
0
        }
1843
0
        else if (!PINFO_FD_VISITED(pinfo))
1844
0
        {
1845
0
            usbll_endpoint_info_t *ep_out, *ep_in;
1846
1847
0
            ep_out = usbll_get_endpoint_info(pinfo, data->transaction->address, data->transaction->endpoint, true);
1848
0
            ep_in = usbll_get_endpoint_info(pinfo, data->transaction->address, data->transaction->endpoint, false);
1849
1850
            /* Check if SETUP data is indeed to control endpoint (discard if targtet endpoint is not control).
1851
             * Practically all control transfers are to endpoint 0 which is always control endpoint.
1852
             */
1853
0
            if ((ep_out->type == USBLL_EP_CONTROL) && (ep_in->type == USBLL_EP_CONTROL))
1854
0
            {
1855
0
                uint8_t setup[8];
1856
0
                bool data_stage_from_host;
1857
0
                uint16_t requested_length;
1858
1859
0
                tvb_memcpy(tvb, setup, data_offset, 8);
1860
1861
                /* bmRequestType D7 0 = Host-to-device, 1 = Device-to-host */
1862
0
                data_stage_from_host = (setup[0] & 0x80) ? false : true;
1863
                /* wLength */
1864
0
                requested_length = setup[6] | (setup[7] << 8);
1865
1866
0
                usbll_reset_endpoint_info(ep_out, USBLL_EP_CONTROL, ep_out->max_packet_size);
1867
0
                usbll_reset_endpoint_info(ep_in, USBLL_EP_CONTROL, ep_in->max_packet_size);
1868
1869
0
                transfer = wmem_new0(wmem_file_scope(), usbll_transfer_info_t);
1870
0
                transfer->first_packet = pinfo->num;
1871
0
                transfer->offset = 0;
1872
0
                transfer->type = USBLL_EP_CONTROL;
1873
0
                transfer->from_host = true; /* SETUP is always from host to service */
1874
1875
0
                if (requested_length > 0)
1876
0
                {
1877
0
                    if (data_stage_from_host)
1878
0
                    {
1879
                        /* Merge SETUP data with OUT Data to pass to USB dissector */
1880
0
                        transfer->more_frags = true;
1881
0
                        ep_out->active_transfer_key = pinfo->num;
1882
0
                        ep_out->requested_transfer_length = 8 + requested_length;
1883
0
                        ep_out->transfer_offset = 8;
1884
0
                        ep_out->last_data_pid = pid;
1885
0
                        ep_out->last_data_acked = false;
1886
                        /* If SETUP is sent again, it always starts a new transfer.
1887
                         * If we receive DATA0 next then it is really a host failure.
1888
                         * Do not "overwrite" the 8 SETUP bytes in such case.
1889
                         */
1890
0
                        ep_out->last_data_len = 0;
1891
0
                    }
1892
0
                    else
1893
0
                    {
1894
0
                        transfer->more_frags = false;
1895
                        /* Expect requested_length when reading from control endpoint.
1896
                         * The data should start with DATA1. If we receive DATA0 then
1897
                         * this is really device failure.
1898
                         */
1899
0
                        ep_in->requested_transfer_length = requested_length;
1900
0
                        ep_in->last_data_pid = pid;
1901
0
                        ep_in->last_data_acked = false;
1902
0
                        ep_in->last_data_len = 0;
1903
0
                    }
1904
0
                }
1905
1906
0
                if (is_get_device_descriptor(setup))
1907
0
                {
1908
0
                    ep_in->data = USBLL_TRANSFER_GET_DEVICE_DESCRIPTOR;
1909
0
                }
1910
0
                else if (is_set_address(setup))
1911
0
                {
1912
0
                    int addr = setup[2];
1913
0
                    if (addr > 0)
1914
0
                    {
1915
                        /* Prevent transfer reassembly across reset boundary.
1916
                         * Do not reset for default address (0) because there
1917
                         * can only be control transfers to default address
1918
                         * and we don't want to lose max packet size info.
1919
                         */
1920
0
                        usbll_reset_device_endpoints(addr);
1921
0
                    }
1922
0
                }
1923
1924
0
                wmem_map_insert(transfer_info, GUINT_TO_POINTER(pinfo->num), transfer);
1925
0
            }
1926
0
        }
1927
0
    }
1928
0
    else if ((!PINFO_FD_VISITED(pinfo)) && (data->transaction_state != STATE_INVALID))
1929
0
    {
1930
0
        usbll_endpoint_info_t *ep_info;
1931
0
        bool                   from_host;
1932
1933
0
        from_host = usbll_is_data_from_host(data->transaction_state);
1934
0
        ep_info = usbll_get_endpoint_info(pinfo, data->transaction->address, data->transaction->endpoint, from_host);
1935
1936
0
        if (ep_info->type == USBLL_EP_CONTROL)
1937
0
        {
1938
0
            if (ep_info->requested_transfer_length > 0)
1939
0
            {
1940
0
                if (pid == ep_info->last_data_pid)
1941
0
                {
1942
0
                    if (ep_info->last_data_len == 0)
1943
0
                    {
1944
                        /* We received DATA0 immediately after SETUP (as response to OUT or IN)
1945
                         * Do not reassemble the data, instead mark it as unexpected PID.
1946
                         */
1947
0
                        data->transaction_state = STATE_INVALID;
1948
0
                    }
1949
0
                    else
1950
0
                    {
1951
                        /* Retransmission */
1952
0
                        transfer = wmem_new0(wmem_file_scope(), usbll_transfer_info_t);
1953
0
                        transfer->first_packet = ep_info->active_transfer_key;
1954
0
                        transfer->offset = ep_info->transfer_offset - ep_info->last_data_len;
1955
0
                        transfer->type = USBLL_EP_CONTROL;
1956
0
                        transfer->from_host = from_host;
1957
0
                        transfer->more_frags = !packet_ends_transfer(ep_info, transfer->offset, data_size);
1958
0
                        wmem_map_insert(transfer_info, GUINT_TO_POINTER(pinfo->num), transfer);
1959
                        /* Do not update endpoint info, previously transferred packet must have
1960
                         * the same data length as retransmitted packet.
1961
                         */
1962
0
                    }
1963
0
                }
1964
0
                else if ((pid == USB_PID_DATA_DATA0) || (pid == USB_PID_DATA_DATA1))
1965
0
                {
1966
0
                    if (ep_info->active_transfer_key == 0)
1967
0
                    {
1968
                        /* This is allowed only when Data stage is from device to host */
1969
0
                        DISSECTOR_ASSERT(!from_host);
1970
0
                        DISSECTOR_ASSERT(ep_info->transfer_offset == 0);
1971
0
                        DISSECTOR_ASSERT(ep_info->last_data_len == 0);
1972
0
                        ep_info->active_transfer_key = pinfo->num;
1973
1974
0
                        if ((ep_info->data == USBLL_TRANSFER_GET_DEVICE_DESCRIPTOR) && (data_size >= 8))
1975
0
                        {
1976
0
                            usbll_endpoint_info_t *ep_out;
1977
0
                            usb_speed_t            speed;
1978
0
                            uint16_t               max_packet_size;
1979
0
                            ep_out = usbll_get_endpoint_info(pinfo, data->transaction->address, data->transaction->endpoint, true);
1980
0
                            max_packet_size = tvb_get_uint8(tvb, data_offset + 7);
1981
0
                            speed = usbll_get_data_transaction_speed(data);
1982
0
                            max_packet_size = sanitize_usb_max_packet_size(ENDPOINT_TYPE_CONTROL, speed, max_packet_size);
1983
0
                            ep_info->max_packet_size = ep_out->max_packet_size = max_packet_size;
1984
0
                        }
1985
0
                    }
1986
0
                    transfer = wmem_new0(wmem_file_scope(), usbll_transfer_info_t);
1987
0
                    transfer->first_packet = ep_info->active_transfer_key;
1988
0
                    transfer->offset = ep_info->transfer_offset;
1989
0
                    transfer->type = USBLL_EP_CONTROL;
1990
0
                    transfer->from_host = from_host;
1991
0
                    transfer->more_frags = !packet_ends_transfer(ep_info, transfer->offset, data_size);
1992
0
                    wmem_map_insert(transfer_info, GUINT_TO_POINTER(pinfo->num), transfer);
1993
1994
0
                    ep_info->last_data_pid = pid;
1995
0
                    ep_info->last_data_acked = usbll_is_split_data_from_device(data->transaction_state);
1996
0
                    ep_info->transfer_offset += data_size;
1997
0
                    ep_info->last_data_len = data_size;
1998
0
                }
1999
0
                else
2000
0
                {
2001
                    /* Only DATA0 and DATA1 are allowed in Control transfers */
2002
0
                    data->transaction_state = STATE_INVALID;
2003
0
                }
2004
0
            }
2005
0
            else
2006
0
            {
2007
                /* We don't know anything about the control transfer.
2008
                 * Most likely the capture is incomplete, there's nothing to be done here.
2009
                 */
2010
0
            }
2011
0
        }
2012
0
        else if ((ep_info->type == USBLL_EP_BULK) || (ep_info->type == USBLL_EP_INTERRUPT))
2013
0
        {
2014
0
            if (pid == ep_info->last_data_pid)
2015
0
            {
2016
                /* Retransmission */
2017
0
                DISSECTOR_ASSERT(ep_info->active_transfer_key != 0);
2018
0
                transfer = wmem_new0(wmem_file_scope(), usbll_transfer_info_t);
2019
0
                transfer->first_packet = ep_info->active_transfer_key;
2020
0
                transfer->offset = ep_info->transfer_offset - ep_info->last_data_len;
2021
0
                transfer->type = ep_info->type;
2022
0
                transfer->from_host = from_host;
2023
0
                transfer->more_frags = !packet_ends_transfer(ep_info, transfer->offset, data_size);
2024
0
                wmem_map_insert(transfer_info, GUINT_TO_POINTER(pinfo->num), transfer);
2025
                /* Do not update endpoint info, previously transferred packet must have
2026
                 * the same data length as retransmitted packet.
2027
                 */
2028
0
            }
2029
0
            else if ((ep_info->active_transfer_key == 0) ||
2030
0
                     packet_ends_transfer(ep_info, ep_info->transfer_offset - ep_info->last_data_len, ep_info->last_data_len))
2031
0
            {
2032
                 /* Packet starts new transfer */
2033
0
                 transfer = wmem_new0(wmem_file_scope(), usbll_transfer_info_t);
2034
0
                 transfer->first_packet = pinfo->num;
2035
0
                 transfer->offset = 0;
2036
0
                 transfer->type = ep_info->type;
2037
0
                 transfer->from_host = from_host;
2038
0
                 transfer->more_frags = !packet_ends_transfer(ep_info, transfer->offset, data_size);
2039
0
                 wmem_map_insert(transfer_info, GUINT_TO_POINTER(pinfo->num), transfer);
2040
2041
0
                 ep_info->last_data_pid = pid;
2042
0
                 ep_info->last_data_acked = usbll_is_split_data_from_device(data->transaction_state);
2043
0
                 ep_info->active_transfer_key = pinfo->num;
2044
0
                 ep_info->transfer_offset = data_size;
2045
0
                 ep_info->last_data_len = data_size;
2046
0
            }
2047
0
            else
2048
0
            {
2049
0
                transfer = wmem_new0(wmem_file_scope(), usbll_transfer_info_t);
2050
0
                transfer->first_packet = ep_info->active_transfer_key;
2051
0
                transfer->offset = ep_info->transfer_offset;
2052
0
                transfer->type = ep_info->type;
2053
0
                transfer->from_host = from_host;
2054
0
                transfer->more_frags = !packet_ends_transfer(ep_info, transfer->offset, data_size);
2055
0
                wmem_map_insert(transfer_info, GUINT_TO_POINTER(pinfo->num), transfer);
2056
2057
0
                ep_info->last_data_pid = pid;
2058
0
                ep_info->last_data_acked = usbll_is_split_data_from_device(data->transaction_state);
2059
0
                ep_info->transfer_offset += data_size;
2060
0
                ep_info->last_data_len = data_size;
2061
0
            }
2062
0
        }
2063
0
        else if (ep_info->type == USBLL_EP_ISOCHRONOUS)
2064
0
        {
2065
            /* TODO: Reassemble high-bandwidth endpoints data */
2066
0
            transfer = wmem_new0(wmem_file_scope(), usbll_transfer_info_t);
2067
0
            transfer->first_packet = pinfo->num;
2068
0
            transfer->offset = 0;
2069
0
            transfer->type = ep_info->type;
2070
0
            transfer->from_host = from_host;
2071
0
            transfer->more_frags = false;
2072
0
            wmem_map_insert(transfer_info, GUINT_TO_POINTER(pinfo->num), transfer);
2073
0
        }
2074
0
    }
2075
2076
0
    *payload_size = data_size;
2077
2078
0
    return offset;
2079
0
}
2080
2081
static int
2082
dissect_usbll_split(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset,
2083
                    uint8_t pid, usbll_data_t *data)
2084
1
{
2085
1
    uint8_t          hub_address;
2086
1
    uint8_t          hub_port;
2087
1
    proto_item      *split_e_u;
2088
1
    proto_item      *split_s;
2089
2090
1
    int32_t tmp = tvb_get_int24(tvb, offset, ENC_LITTLE_ENDIAN);
2091
2092
1
    hub_address = SPLIT_BITS_GET_HUB_ADDRESS(tmp);
2093
1
    hub_port = SPLIT_BITS_GET_HUB_PORT(tmp);
2094
2095
1
    col_append_str(pinfo->cinfo, COL_INFO, (tmp & SPLIT_BIT_START_COMPLETE) ? " Complete" : " Start");
2096
2097
1
    proto_tree_add_uint(tree, hf_usbll_split_hub_addr, tvb, offset, 3, tmp);
2098
1
    proto_tree_add_uint(tree, hf_usbll_split_sc, tvb, offset, 3, tmp);
2099
1
    proto_tree_add_uint(tree, hf_usbll_split_port, tvb, offset, 3, tmp);
2100
2101
1
    if (tmp & SPLIT_BIT_START_COMPLETE) {
2102
1
        proto_tree_add_uint(tree, hf_usbll_split_s, tvb, offset, 3, tmp);
2103
1
        split_e_u = proto_tree_add_uint(tree, hf_usbll_split_u, tvb, offset, 3, tmp);
2104
2105
1
        if (tmp & SPLIT_BIT_E_U)
2106
1
            expert_add_info(pinfo, split_e_u, &ei_invalid_e_u);
2107
1
    } else {
2108
        /* S/E fields have special meaning for Isochronous OUT transfers. */
2109
0
        if (data->next && data->next->transaction_state == STATE_SSPLIT_ISOCHRONOUS_OUT) {
2110
0
            DISSECTOR_ASSERT(SPLIT_BITS_GET_ENDPOINT_TYPE(tmp) == USB_EP_TYPE_ISOCHRONOUS);
2111
0
            proto_tree_add_uint(tree, hf_usbll_split_iso_se, tvb, offset, 3, tmp);
2112
0
        } else if (SPLIT_BITS_GET_ENDPOINT_TYPE(tmp) != USB_EP_TYPE_ISOCHRONOUS) {
2113
0
            split_s = proto_tree_add_uint(tree, hf_usbll_split_s, tvb, offset, 3, tmp);
2114
0
            split_e_u = proto_tree_add_uint(tree, hf_usbll_split_e, tvb, offset, 3, tmp);
2115
2116
0
            if ((SPLIT_BITS_GET_ENDPOINT_TYPE(tmp) == USB_EP_TYPE_BULK) && (tmp & SPLIT_BIT_SPEED))
2117
0
                expert_add_info(pinfo, split_s, &ei_invalid_s);
2118
0
            if (tmp & SPLIT_BIT_E_U)
2119
0
                expert_add_info(pinfo, split_e_u, &ei_invalid_e_u);
2120
0
        } else if (data->next &&
2121
0
                   (data->next->transaction_state == STATE_SSPLIT_ISOCHRONOUS_IN ||
2122
0
                    data->next->transaction_state == STATE_CSPLIT_ISOCHRONOUS_IN)) {
2123
0
            DISSECTOR_ASSERT(SPLIT_BITS_GET_ENDPOINT_TYPE(tmp) == USB_EP_TYPE_ISOCHRONOUS);
2124
0
            split_s = proto_tree_add_uint(tree, hf_usbll_split_s, tvb, offset, 3, tmp);
2125
0
            split_e_u = proto_tree_add_uint(tree, hf_usbll_split_e, tvb, offset, 3, tmp);
2126
2127
0
            if (tmp & SPLIT_BIT_SPEED)
2128
0
                expert_add_info(pinfo, split_s, &ei_invalid_s);
2129
0
            if (tmp & SPLIT_BIT_E_U)
2130
0
                expert_add_info(pinfo, split_e_u, &ei_invalid_e_u);
2131
0
        }
2132
0
    }
2133
1
    proto_tree_add_uint(tree, hf_usbll_split_et, tvb, offset, 3, tmp);
2134
2135
1
    proto_tree_add_checksum(tree, tvb, offset,
2136
1
                            hf_usbll_split_crc5, hf_usbll_split_crc5_status, &ei_wrong_split_crc5, pinfo,
2137
1
                            crc5_usb_19bit_input(tmp),
2138
1
                            ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_VERIFY);
2139
1
    offset += 3;
2140
2141
1
    if (!PINFO_FD_VISITED(pinfo))
2142
1
    {
2143
1
        usbll_transaction_info_t *transaction;
2144
1
        transaction = wmem_new0(wmem_file_scope(), usbll_transaction_info_t);
2145
1
        transaction->starts_in = pinfo->num;
2146
1
        transaction->pid = pid;
2147
1
        transaction->address = hub_address;
2148
1
        transaction->endpoint = hub_port;
2149
1
        if (SPLIT_BITS_GET_ENDPOINT_TYPE(tmp) == USB_EP_TYPE_ISOCHRONOUS)
2150
0
            transaction->speed = USB_SPEED_FULL;
2151
1
        else
2152
1
            transaction->speed = (tmp & SPLIT_BIT_SPEED) ? USB_SPEED_LOW : USB_SPEED_FULL;
2153
2154
1
        data->transaction = transaction;
2155
1
        if (tmp & SPLIT_BIT_START_COMPLETE)
2156
1
        {
2157
1
            switch (SPLIT_BITS_GET_ENDPOINT_TYPE(tmp))
2158
1
            {
2159
0
                case USB_EP_TYPE_CONTROL:
2160
0
                    data->transaction_state = STATE_CSPLIT_CONTROL;
2161
0
                    break;
2162
0
                case USB_EP_TYPE_ISOCHRONOUS:
2163
0
                    data->transaction_state = STATE_CSPLIT_ISOCHRONOUS;
2164
0
                    break;
2165
0
                case USB_EP_TYPE_BULK:
2166
0
                    data->transaction_state = STATE_CSPLIT_BULK;
2167
0
                    break;
2168
1
                case USB_EP_TYPE_INTERRUPT:
2169
1
                    data->transaction_state = STATE_CSPLIT_INTERRUPT;
2170
1
                    break;
2171
1
            }
2172
1
        }
2173
0
        else
2174
0
        {
2175
0
            switch (SPLIT_BITS_GET_ENDPOINT_TYPE(tmp))
2176
0
            {
2177
0
                case USB_EP_TYPE_CONTROL:
2178
0
                    data->transaction_state = STATE_SSPLIT_CONTROL;
2179
0
                    break;
2180
0
                case USB_EP_TYPE_ISOCHRONOUS:
2181
0
                    data->transaction_state = STATE_SSPLIT_ISOCHRONOUS;
2182
0
                    break;
2183
0
                case USB_EP_TYPE_BULK:
2184
0
                    data->transaction_state = STATE_SSPLIT_BULK;
2185
0
                    break;
2186
0
                case USB_EP_TYPE_INTERRUPT:
2187
0
                    data->transaction_state = STATE_SSPLIT_INTERRUPT;
2188
0
                    break;
2189
0
            }
2190
0
        }
2191
1
    }
2192
2193
1
    return offset;
2194
1
}
2195
2196
static int
2197
dissect_usbll_handshake(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int offset,
2198
                        uint8_t pid, usbll_data_t *data)
2199
0
{
2200
0
    if (!PINFO_FD_VISITED(pinfo))
2201
0
    {
2202
0
        usbll_state_t             prev_state;
2203
2204
0
        prev_state = data->prev ? data->prev->transaction_state : STATE_IDLE;
2205
0
        data->transaction_state = usbll_next_state(prev_state, pid);
2206
2207
0
        if (data->transaction_state != STATE_INVALID)
2208
0
        {
2209
0
            DISSECTOR_ASSERT(data->prev != NULL);
2210
0
            DISSECTOR_ASSERT(data->prev->transaction != NULL);
2211
0
            data->transaction = data->prev->transaction;
2212
0
        }
2213
2214
0
        if (usbll_is_setup_ack(data->transaction_state))
2215
0
        {
2216
0
            usbll_endpoint_info_t *ep_out, *ep_in;
2217
0
            ep_out = usbll_get_endpoint_info(pinfo, data->transaction->address, data->transaction->endpoint, true);
2218
0
            ep_in = usbll_get_endpoint_info(pinfo, data->transaction->address, data->transaction->endpoint, false);
2219
0
            if ((ep_out->type == USBLL_EP_CONTROL) && (ep_in->type == USBLL_EP_CONTROL))
2220
0
            {
2221
0
                if (ep_out->active_transfer_key != 0)
2222
0
                {
2223
0
                    DISSECTOR_ASSERT(ep_in->active_transfer_key == 0);
2224
0
                    ep_out->last_data_acked = true;
2225
0
                }
2226
0
                else if (ep_in->active_transfer_key != 0)
2227
0
                {
2228
0
                    DISSECTOR_ASSERT(ep_out->active_transfer_key == 0);
2229
0
                    ep_in->last_data_acked = true;
2230
0
                }
2231
0
            }
2232
0
        }
2233
2234
0
        if (usbll_is_data_ack(data->transaction_state))
2235
0
        {
2236
0
            usbll_endpoint_info_t *ep_info;
2237
0
            bool                   from_host;
2238
2239
0
            from_host = usbll_is_acked_data_from_host(data->transaction_state);
2240
0
            ep_info = usbll_get_endpoint_info(pinfo, data->transaction->address, data->transaction->endpoint, from_host);
2241
2242
0
            ep_info->last_data_acked = true;
2243
0
        }
2244
2245
0
        if (usbll_is_endpoint_stall(data->transaction_state))
2246
0
        {
2247
0
            usbll_endpoint_info_t *ep_info;
2248
0
            usbll_transfer_info_t *transfer;
2249
0
            uint32_t               last_offset;
2250
0
            bool                   from_host;
2251
2252
0
            from_host = usbll_is_stalled_data_from_host(data->transaction_state);
2253
0
            ep_info = usbll_get_endpoint_info(pinfo, data->transaction->address, data->transaction->endpoint, from_host);
2254
2255
0
            last_offset = ep_info->transfer_offset - ep_info->last_data_len;
2256
2257
0
            if (ep_info->active_transfer_key &&
2258
0
                !packet_ends_transfer(ep_info, last_offset, ep_info->last_data_len))
2259
0
            {
2260
                /* STALL terminates ongoing transfer. While the STALL packet is
2261
                 * always sent by device, the transfer can be either IN or OUT.
2262
                 * For IN usbll source and destination will match usb source
2263
                 * and destination. For OUT the source and destination will be
2264
                 * swapped in usb dissector.
2265
                 */
2266
0
                 transfer = wmem_new0(wmem_file_scope(), usbll_transfer_info_t);
2267
0
                 transfer->first_packet = ep_info->active_transfer_key;
2268
0
                 if (!from_host)
2269
0
                 {
2270
                    /* Data is from device, all reassembled data is in URB */
2271
0
                    transfer->offset = ep_info->transfer_offset;
2272
0
                 }
2273
0
                 else if (data->transaction_state == STATE_PING_STALL)
2274
0
                 {
2275
0
                    if (ep_info->last_data_acked)
2276
0
                    {
2277
                        /* Last DATA packet was acknowledged with NYET */
2278
0
                        transfer->offset = ep_info->transfer_offset;
2279
0
                    }
2280
0
                    else
2281
0
                    {
2282
                        /* Last DATA packet was NAKed. Drop it from URB. */
2283
0
                        transfer->offset = last_offset;
2284
0
                    }
2285
0
                 }
2286
0
                 else
2287
0
                 {
2288
                    /* Last DATA packet was not acknowledged by device because
2289
                     * endpoint was STALLed. Drop last DATA packet from URB.
2290
                     */
2291
0
                    transfer->offset = last_offset;
2292
0
                 }
2293
0
                 transfer->type = ep_info->type;
2294
0
                 transfer->from_host = from_host;
2295
0
                 transfer->more_frags = false;
2296
0
                 wmem_map_insert(transfer_info, GUINT_TO_POINTER(pinfo->num), transfer);
2297
0
            }
2298
2299
            /* Transfers cannot span across STALL handshake */
2300
0
            ep_info->last_data_pid = 0;
2301
0
            ep_info->last_data_acked = false;
2302
0
            ep_info->active_transfer_key = 0;
2303
0
            ep_info->transfer_offset = 0;
2304
0
            ep_info->last_data_len = 0;
2305
0
            ep_info->requested_transfer_length = 0;
2306
0
        }
2307
0
    }
2308
2309
0
    return offset;
2310
0
}
2311
2312
static void check_for_extended_subpid(uint8_t pid, usbll_data_t *data)
2313
3
{
2314
3
    if (data->prev && data->prev->transaction_state == STATE_EXT)
2315
0
    {
2316
0
        data->transaction_state = usbll_next_state(STATE_EXT, pid);
2317
2318
0
        if (data->transaction_state != STATE_SUBPID_INVALID)
2319
0
        {
2320
0
            DISSECTOR_ASSERT(data->prev != NULL);
2321
0
            DISSECTOR_ASSERT(data->prev->transaction != NULL);
2322
0
            data->transaction = data->prev->transaction;
2323
0
        }
2324
0
    }
2325
3
}
2326
2327
static int
2328
dissect_usbll_lpm_token(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
2329
0
{
2330
0
    uint16_t         attributes_bits;
2331
2332
0
    static int * const attributes_fields[] = {
2333
0
        &hf_usbll_lpm_link_state,
2334
0
        &hf_usbll_lpm_besl,
2335
0
        &hf_usbll_lpm_remote_wake,
2336
0
        &hf_usbll_lpm_reserved,
2337
0
        NULL
2338
0
    };
2339
2340
0
    attributes_bits = tvb_get_letohs(tvb, offset);
2341
2342
0
    proto_tree_add_bitmask_list_value(tree, tvb, offset, 2, attributes_fields, attributes_bits);
2343
0
    proto_tree_add_checksum(tree, tvb, offset,
2344
0
                            hf_usbll_crc5, hf_usbll_crc5_status, &ei_wrong_crc5, pinfo,
2345
0
                            crc5_usb_11bit_input(attributes_bits),
2346
0
                            ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_VERIFY);
2347
0
    offset += 2;
2348
2349
0
    return offset;
2350
0
}
2351
2352
static usbll_data_t *
2353
usbll_restore_data(packet_info *pinfo)
2354
0
{
2355
0
    return (usbll_data_t *)p_get_proto_data(wmem_file_scope(), pinfo, proto_usbll, pinfo->num);
2356
0
}
2357
2358
static usbll_data_t *
2359
usbll_create_data(packet_info *pinfo)
2360
3
{
2361
    /* allocate a data structure, as it is the first call on this frame. */
2362
3
    usbll_data_t *n_data_ptr = wmem_new0(wmem_file_scope(), usbll_data_t);
2363
2364
3
    p_add_proto_data(wmem_file_scope(), pinfo, proto_usbll, pinfo->num, n_data_ptr);
2365
2366
3
    if (usbll_data_ptr)
2367
2
        *n_data_ptr = *usbll_data_ptr;
2368
2369
3
    n_data_ptr->transaction_state = STATE_IDLE;
2370
3
    n_data_ptr->prev = usbll_data_ptr;
2371
3
    if (n_data_ptr->prev)
2372
2
    {
2373
2
        n_data_ptr->prev->next = n_data_ptr;
2374
2
    }
2375
2376
3
    return n_data_ptr;
2377
3
}
2378
2379
static void
2380
usbll_cleanup_data(void)
2381
0
{
2382
0
    usbll_data_ptr = NULL;
2383
0
    tt_non_periodic = NULL;
2384
0
    tt_periodic = NULL;
2385
0
    ep_info_in = NULL;
2386
0
    ep_info_out = NULL;
2387
0
}
2388
2389
static int
2390
dissect_usbll_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, usb_speed_t speed)
2391
3
{
2392
3
    proto_item       *item;
2393
3
    proto_tree       *tree;
2394
3
    int               offset = 0;
2395
3
    int               data_offset;
2396
3
    int               data_size;
2397
3
    uint8_t           pid;
2398
3
    bool              is_subpid;
2399
3
    const char       *str;
2400
3
    usbll_data_t     *data;
2401
2402
3
    item = proto_tree_add_item(parent_tree, proto_usbll, tvb, offset, -1, ENC_NA);
2403
3
    tree = proto_item_add_subtree(item, ett_usbll);
2404
2405
3
    pid = tvb_get_uint8(tvb, offset);
2406
2407
3
    if (PINFO_FD_VISITED(pinfo)) {
2408
0
        data = usbll_restore_data(pinfo);
2409
3
    } else {
2410
3
        data = usbll_data_ptr = usbll_create_data(pinfo);
2411
3
        check_for_extended_subpid(pid, data);
2412
3
    }
2413
2414
3
    is_subpid = usbll_is_extended_subpid(data->transaction_state);
2415
3
    if (is_subpid) {
2416
0
        proto_tree_add_item(tree, hf_usbll_subpid, tvb, offset, 1, ENC_LITTLE_ENDIAN);
2417
0
        str = try_val_to_str(pid, usb_subpid_vals);
2418
3
    } else {
2419
3
        proto_tree_add_item(tree, hf_usbll_pid, tvb, offset, 1, ENC_LITTLE_ENDIAN);
2420
3
        str = try_val_to_str(pid, usb_packetid_vals);
2421
3
    }
2422
3
    offset++;
2423
2424
3
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "USBLL");
2425
3
    if (str) {
2426
2
        col_set_str(pinfo->cinfo, COL_INFO, str);
2427
2
    } else if (is_subpid) {
2428
0
        col_add_fstr(pinfo->cinfo, COL_INFO, "Invalid SubPID (0x%02x)", pid);
2429
0
        expert_add_info(pinfo, item, &ei_invalid_subpid);
2430
1
    } else {
2431
1
        col_add_fstr(pinfo->cinfo, COL_INFO, "Invalid Packet ID (0x%02x)", pid);
2432
1
        expert_add_info(pinfo, item, &ei_invalid_pid);
2433
1
    }
2434
2435
    /* If handler updates data size, then it means we should process with data
2436
     * reassembly at data offset with the provided data size.
2437
     */
2438
3
    data_offset = offset;
2439
3
    data_size = -1;
2440
2441
3
    if (is_subpid) {
2442
0
        switch (pid)
2443
0
        {
2444
0
            case USB_SUBPID_LPM:
2445
0
                offset = dissect_usbll_lpm_token(tvb, pinfo, tree, offset);
2446
0
                break;
2447
2448
0
            default:
2449
0
                break;
2450
0
        }
2451
3
    } else {
2452
3
        switch (pid)
2453
3
        {
2454
0
            case USB_PID_TOKEN_SETUP:
2455
0
            case USB_PID_TOKEN_OUT:
2456
0
            case USB_PID_TOKEN_IN:
2457
1
            case USB_PID_SPECIAL_PING:
2458
1
            case USB_PID_SPECIAL_EXT:
2459
1
                offset = dissect_usbll_token(tvb, pinfo, tree, offset, pid, data, speed);
2460
1
                break;
2461
2462
0
            case USB_PID_DATA_DATA0:
2463
0
            case USB_PID_DATA_DATA1:
2464
0
            case USB_PID_DATA_DATA2:
2465
0
            case USB_PID_DATA_MDATA:
2466
0
                offset = dissect_usbll_data(tvb, pinfo, tree, offset, pid, data, &data_size);
2467
0
                break;
2468
2469
0
            case USB_PID_HANDSHAKE_ACK:
2470
0
            case USB_PID_HANDSHAKE_NAK:
2471
0
            case USB_PID_HANDSHAKE_NYET:
2472
0
            case USB_PID_HANDSHAKE_STALL:
2473
0
                offset = dissect_usbll_handshake(tvb, pinfo, tree, offset, pid, data);
2474
0
                data_size = 0;
2475
0
                break;
2476
2477
0
            case USB_PID_TOKEN_SOF:
2478
0
                offset = dissect_usbll_sof(tvb, pinfo, tree, offset);
2479
0
                break;
2480
2481
1
            case USB_PID_SPECIAL_SPLIT:
2482
1
                offset = dissect_usbll_split(tvb, pinfo, tree, offset, pid, data);
2483
1
                break;
2484
0
            case USB_PID_SPECIAL_PRE_OR_ERR:
2485
0
                break;
2486
1
            default:
2487
1
                break;
2488
3
        }
2489
3
    }
2490
2491
3
    usbll_generate_address(tree, tvb, pinfo, data);
2492
3
    if (data->transaction_state == STATE_INVALID) {
2493
0
        expert_add_info(pinfo, item, &ei_invalid_pid_sequence);
2494
3
    } else if (data->transaction_state == STATE_SUBPID_NOT_REUSABLE) {
2495
0
        expert_add_info(pinfo, item, &ei_conflicting_subpid);
2496
0
    }
2497
2498
3
    if (tvb_reported_length_remaining(tvb, offset) > 0) {
2499
3
        proto_tree_add_expert(tree, pinfo, &ei_undecoded, tvb, offset, -1);
2500
3
        offset += tvb_captured_length_remaining(tvb, offset);
2501
3
    }
2502
2503
3
    if (data_size >= 0) {
2504
0
        usbll_construct_urb(tvb, pinfo, tree, data_offset, data_size, data);
2505
0
    }
2506
2507
3
    return offset;
2508
3
}
2509
2510
static int
2511
dissect_usbll_unknown_speed(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void *data _U_)
2512
1
{
2513
1
    return dissect_usbll_packet(tvb, pinfo, parent_tree, global_dissect_unknown_speed_as);
2514
1
}
2515
2516
static int
2517
dissect_usbll_low_speed(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void *data _U_)
2518
2
{
2519
2
    return dissect_usbll_packet(tvb, pinfo, parent_tree, USB_SPEED_LOW);
2520
2
}
2521
2522
static int
2523
dissect_usbll_full_speed(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void *data _U_)
2524
0
{
2525
0
    return dissect_usbll_packet(tvb, pinfo, parent_tree, USB_SPEED_FULL);
2526
0
}
2527
2528
static int
2529
dissect_usbll_high_speed(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void *data _U_)
2530
0
{
2531
0
    return dissect_usbll_packet(tvb, pinfo, parent_tree, USB_SPEED_HIGH);
2532
0
}
2533
2534
void
2535
proto_register_usbll(void)
2536
14
{
2537
14
    module_t         *usbll_module;
2538
14
    expert_module_t  *expert_module;
2539
2540
14
    static hf_register_info hf[] = {
2541
        /* Common header fields */
2542
14
        { &hf_usbll_pid,
2543
14
            { "PID", "usbll.pid",
2544
14
              FT_UINT8, BASE_HEX|BASE_EXT_STRING, &usb_packetid_vals_ext, 0x00,
2545
14
              "USB Packet ID", HFILL }},
2546
14
        { &hf_usbll_src,
2547
14
            { "Source", "usbll.src",
2548
14
            FT_STRING, BASE_NONE, NULL, 0x0,
2549
14
            NULL, HFILL }},
2550
14
        { &hf_usbll_dst,
2551
14
            { "Destination", "usbll.dst",
2552
14
            FT_STRING, BASE_NONE, NULL, 0x0,
2553
14
            NULL, HFILL }},
2554
14
        { &hf_usbll_addr,
2555
14
            { "Source or Destination", "usbll.addr",
2556
14
            FT_STRING, BASE_NONE, NULL, 0x0,
2557
14
            NULL, HFILL }},
2558
2559
        /* Token header fields */
2560
14
        { &hf_usbll_device_addr,
2561
14
            { "Address", "usbll.device_addr",
2562
14
              FT_UINT16, BASE_DEC, NULL, 0x007F,
2563
14
              NULL, HFILL }},
2564
14
        { &hf_usbll_endp,
2565
14
            { "Endpoint", "usbll.endp",
2566
14
              FT_UINT16, BASE_DEC, NULL, 0x0780,
2567
14
              NULL, HFILL }},
2568
2569
        /*SOF header field */
2570
14
        { &hf_usbll_sof_framenum,
2571
14
            { "Frame Number", "usbll.frame_num",
2572
14
              FT_UINT16, BASE_DEC, NULL, 0x07FF,
2573
14
              NULL, HFILL }},
2574
2575
        /* Token and SOF header fields */
2576
14
        { &hf_usbll_crc5,
2577
14
            { "CRC5", "usbll.crc5",
2578
14
              FT_UINT16, BASE_HEX, NULL, 0xF800,
2579
14
              NULL, HFILL }},
2580
14
        { &hf_usbll_crc5_status,
2581
14
            { "CRC5 Status", "usbll.crc5.status",
2582
14
              FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0,
2583
14
              NULL, HFILL }},
2584
2585
        /* Data header fields */
2586
14
        { &hf_usbll_data,
2587
14
            { "Data", "usbll.data",
2588
14
              FT_BYTES, BASE_NONE|BASE_ALLOW_ZERO, NULL, 0,
2589
14
              NULL, HFILL }},
2590
14
        { &hf_usbll_data_crc,
2591
14
            { "CRC", "usbll.crc16",
2592
14
              FT_UINT16, BASE_HEX, NULL, 0x0,
2593
14
              NULL, HFILL }},
2594
14
        { &hf_usbll_data_crc_status,
2595
14
            { "CRC Status", "usbll.crc16.status",
2596
14
              FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0,
2597
14
              NULL, HFILL }},
2598
2599
        /* Split header fields */
2600
14
        { &hf_usbll_split_hub_addr,
2601
14
            { "Hub Address", "usbll.split_hub_addr",
2602
14
              FT_UINT24, BASE_DEC, NULL, 0x00007F,
2603
14
              NULL, HFILL }},
2604
14
        { &hf_usbll_split_sc,
2605
14
            { "SC", "usbll.split_sc",
2606
14
              FT_UINT24, BASE_DEC, VALS(usb_start_complete_vals), 0x000080,
2607
14
              NULL, HFILL }},
2608
14
        { &hf_usbll_split_port,
2609
14
            { "Port", "usbll.split_port",
2610
14
              FT_UINT24, BASE_DEC, NULL, 0x007F00,
2611
14
              NULL, HFILL }},
2612
14
        { &hf_usbll_split_s,
2613
14
            { "Speed", "usbll.split_s",
2614
14
              FT_UINT24, BASE_DEC, VALS(usb_split_speed_vals), 0x008000,
2615
14
              NULL, HFILL }},
2616
14
        { &hf_usbll_split_e,
2617
14
            { "E", "usbll.split_e",
2618
14
              FT_UINT24, BASE_DEC, NULL, 0x010000,
2619
14
              "Unused. Must be 0.", HFILL }},
2620
14
        { &hf_usbll_split_u,
2621
14
            { "U", "usbll.split_u",
2622
14
              FT_UINT24, BASE_DEC, NULL, 0x010000,
2623
14
              "Unused. Must be 0.", HFILL }},
2624
14
        { &hf_usbll_split_iso_se,
2625
14
            { "Start and End", "usbll.split_se",
2626
14
              FT_UINT24, BASE_DEC, VALS(usb_split_iso_se_vals), 0x018000,
2627
14
              NULL, HFILL }},
2628
14
        { &hf_usbll_split_et,
2629
14
            { "Endpoint Type", "usbll.split_et",
2630
14
              FT_UINT24, BASE_DEC, VALS(usb_endpoint_type_vals), 0x060000,
2631
14
              NULL, HFILL }},
2632
14
        { &hf_usbll_split_crc5,
2633
14
            { "CRC5", "usbll.split_crc5",
2634
14
              FT_UINT24, BASE_HEX, NULL, 0xF80000,
2635
14
              NULL, HFILL }},
2636
14
        { &hf_usbll_split_crc5_status,
2637
14
            { "CRC5 Status", "usbll.split_crc5.status",
2638
14
              FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0,
2639
14
              NULL, HFILL }},
2640
14
        { &hf_usbll_transfer_fragments,
2641
14
            { "Transfer fragments", "usbll.fragments",
2642
14
              FT_NONE, BASE_NONE, NULL, 0x00,
2643
14
              NULL, HFILL }},
2644
14
        { &hf_usbll_transfer_fragment,
2645
14
            {"Transfer fragment", "usbll.fragment",
2646
14
            FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL }},
2647
14
        { &hf_usbll_transfer_fragment_overlap,
2648
14
            {"Transfer fragment overlap", "usbll.fragment.overlap",
2649
14
            FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL }},
2650
14
        { &hf_usbll_transfer_fragment_overlap_conflicts,
2651
14
            {"Transfer fragment overlapping with conflicting data",
2652
14
            "usbll.fragment.overlap.conflicts",
2653
14
            FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL }},
2654
14
        { &hf_usbll_transfer_fragment_multiple_tails,
2655
14
            {"Transfer has multiple tail fragments",
2656
14
            "usbll.fragment.multiple_tails",
2657
14
            FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL }},
2658
14
        { &hf_usbll_transfer_fragment_too_long_fragment,
2659
14
            {"Transfer fragment too long", "usbll.fragment.too_long_fragment",
2660
14
            FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL }},
2661
14
        { &hf_usbll_transfer_fragment_error,
2662
14
            {"Transfer defragmentation error", "usbll.fragment.error",
2663
14
            FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL }},
2664
14
        { &hf_usbll_transfer_fragment_count,
2665
14
            {"Transfer fragment count", "usbll.fragment.count",
2666
14
            FT_UINT32, BASE_DEC, NULL, 0x00, NULL, HFILL }},
2667
14
        { &hf_usbll_transfer_reassembled_in,
2668
14
            {"Reassembled in", "usbll.reassembled.in",
2669
14
            FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL }},
2670
14
        { &hf_usbll_transfer_reassembled_length,
2671
14
            {"Reassembled length", "usbll.reassembled.length",
2672
14
            FT_UINT32, BASE_DEC, NULL, 0x00, NULL, HFILL }},
2673
2674
        /* USB 2.0 Link Power Management Addendum */
2675
14
        { &hf_usbll_subpid,
2676
14
            { "SubPID", "usbll.subpid",
2677
14
              FT_UINT8, BASE_HEX|BASE_EXT_STRING, &usb_subpid_vals_ext, 0x00,
2678
14
              "Extended Token Packet SubPID", HFILL }},
2679
14
        { &hf_usbll_lpm_link_state,
2680
14
            { "bLinkState", "usbll.lpm_link_state",
2681
14
              FT_UINT16, BASE_CUSTOM, CF_FUNC(lpm_link_state_str), 0x000F,
2682
14
              NULL, HFILL }},
2683
14
        { &hf_usbll_lpm_besl,
2684
14
            { "BESL", "usbll.lpm_besl",
2685
14
              FT_UINT16, BASE_CUSTOM, CF_FUNC(usb_lpm_besl_str), 0x00F0,
2686
14
              "Best Effort Service Latency", HFILL}},
2687
14
        { &hf_usbll_lpm_remote_wake,
2688
14
            { "bRemoteWake", "usbll.lpm_remote_wake",
2689
14
              FT_UINT16, BASE_DEC, VALS(usb_lpm_remote_wake_vals), 0x0100,
2690
14
              NULL, HFILL }},
2691
14
        { &hf_usbll_lpm_reserved,
2692
14
            { "Reserved", "usbll.lpm_reserved",
2693
14
              FT_UINT16, BASE_DEC, NULL, 0x0600,
2694
14
              NULL, HFILL }},
2695
14
    };
2696
2697
14
    static ei_register_info ei[] = {
2698
14
        { &ei_invalid_pid, { "usbll.invalid_pid", PI_MALFORMED, PI_ERROR, "Invalid USB Packet ID", EXPFILL }},
2699
14
        { &ei_invalid_subpid, { "usbll.invalid_subpid", PI_MALFORMED, PI_ERROR, "Invalid SubPID", EXPFILL }},
2700
14
        { &ei_conflicting_subpid, { "usbll.conflicting_subpid", PI_MALFORMED, PI_ERROR, "Token PID cannot be reused as SubPID", EXPFILL }},
2701
14
        { &ei_undecoded, { "usbll.undecoded", PI_UNDECODED, PI_WARN, "Not dissected yet (report to wireshark.org)", EXPFILL }},
2702
14
        { &ei_wrong_crc5, { "usbll.crc5.wrong", PI_PROTOCOL, PI_WARN, "Wrong CRC5", EXPFILL }},
2703
14
        { &ei_wrong_split_crc5, { "usbll.split_crc5.wrong", PI_PROTOCOL, PI_WARN, "Wrong Split CRC5", EXPFILL }},
2704
14
        { &ei_wrong_crc16, { "usbll.crc16.wrong", PI_PROTOCOL, PI_WARN, "Wrong CRC16", EXPFILL }},
2705
14
        { &ei_invalid_s, { "usbll.invalid_s", PI_MALFORMED, PI_ERROR, "Invalid bit (Must be 0)", EXPFILL }},
2706
14
        { &ei_invalid_e_u, { "usbll.invalid_e_u", PI_MALFORMED, PI_ERROR, "Invalid bit (Must be 0)", EXPFILL }},
2707
14
        { &ei_invalid_pid_sequence, {"usbll.invalid_pid_sequence", PI_MALFORMED, PI_ERROR, "Invalid PID Sequence",EXPFILL }},
2708
14
        { &ei_invalid_setup_data, {"usbll.invalid_setup_data", PI_MALFORMED, PI_ERROR, "Invalid data length (Must be 8 bytes)", EXPFILL }},
2709
14
    };
2710
2711
14
    static int *ett[] = {
2712
14
        &ett_usbll,
2713
14
        &ett_usbll_transfer_fragment,
2714
14
        &ett_usbll_transfer_fragments,
2715
14
    };
2716
2717
14
    transfer_info = wmem_map_new_autoreset(wmem_epan_scope(), wmem_file_scope(), g_direct_hash, g_direct_equal);
2718
14
    proto_usbll = proto_register_protocol("USB Link Layer", "USBLL", "usbll");
2719
14
    proto_register_field_array(proto_usbll, hf, array_length(hf));
2720
14
    proto_register_subtree_array(ett, array_length(ett));
2721
2722
14
    expert_module = expert_register_protocol(proto_usbll);
2723
14
    expert_register_field_array(expert_module, ei, array_length(ei));
2724
2725
14
    usbll_module = prefs_register_protocol(proto_usbll, NULL);
2726
2727
14
    prefs_register_enum_preference(usbll_module, "global_pref_dissect_unknown_speed_as",
2728
14
        "Decode unknown speed packets as",
2729
14
        "Use specified speed if speed is not indicated in capture",
2730
14
        &global_dissect_unknown_speed_as, dissect_unknown_speed_as, false);
2731
2732
14
    unknown_speed_handle = register_dissector("usbll", dissect_usbll_unknown_speed, proto_usbll);
2733
14
    low_speed_handle = register_dissector("usbll.low_speed", dissect_usbll_low_speed, proto_usbll);
2734
14
    full_speed_handle = register_dissector("usbll.full_speed", dissect_usbll_full_speed, proto_usbll);
2735
14
    high_speed_handle = register_dissector("usbll.high_speed", dissect_usbll_high_speed, proto_usbll);
2736
14
    register_cleanup_routine(usbll_cleanup_data);
2737
2738
14
    usbll_address_type = address_type_dissector_register("AT_USBLL", "USBLL Address",
2739
14
                                                         usbll_addr_to_str, usbll_addr_str_len,
2740
14
                                                         NULL, NULL, NULL, NULL, NULL);
2741
2742
14
    reassembly_table_register(&usbll_reassembly_table, &usbll_reassembly_table_functions);
2743
14
}
2744
2745
void
2746
proto_reg_handoff_usbll(void)
2747
14
{
2748
14
    dissector_add_uint("wtap_encap", WTAP_ENCAP_USB_2_0, unknown_speed_handle);
2749
14
    dissector_add_uint("wtap_encap", WTAP_ENCAP_USB_2_0_LOW_SPEED, low_speed_handle);
2750
14
    dissector_add_uint("wtap_encap", WTAP_ENCAP_USB_2_0_FULL_SPEED, full_speed_handle);
2751
14
    dissector_add_uint("wtap_encap", WTAP_ENCAP_USB_2_0_HIGH_SPEED, high_speed_handle);
2752
14
}
2753
2754
/*
2755
 * Editor modelines
2756
 *
2757
 * Local Variables:
2758
 * c-basic-offset: 4
2759
 * tab-width: 8
2760
 * indent-tabs-mode: nil
2761
 * End:
2762
 *
2763
 * ex: set shiftwidth=4 tabstop=8 expandtab:
2764
 * :indentSize=4:tabSize=8:noTabs=true:
2765
 */