From 77e410d0a396009b4e57ff0a0ac923375f828bbc Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Wed, 18 Sep 2024 06:33:02 +0100 Subject: [PATCH 1/9] Keep track of which interface settings are active in DeviceData. We were already decoding descriptor requests to track endpoint types in DeviceData, but we weren't accounting for the use of alternate interface settings. Add that extra tracking to DeviceData, including decoding SetInterface requests when we see them so that we know which alternate setting is in use. --- src/capture.rs | 50 ++++++++++++++++++++++++++++++++++++++++---------- src/usb.rs | 2 +- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/capture.rs b/src/capture.rs index dd01857b..47a02d06 100644 --- a/src/capture.rs +++ b/src/capture.rs @@ -19,6 +19,7 @@ use crate::util::{fmt_count, fmt_size}; use anyhow::{Context, Error, bail}; use arc_swap::{ArcSwap, ArcSwapOption}; use bytemuck_derive::{Pod, Zeroable}; +use itertools::Itertools; use num_enum::{IntoPrimitive, FromPrimitive}; // Use 2MB block size for packet data, which is a large page size on x86_64. @@ -327,6 +328,7 @@ pub struct DeviceData { pub device_descriptor: ArcSwapOption, pub configurations: ArcSwap>>, pub config_number: ArcSwapOption, + pub interface_settings: ArcSwap>, pub endpoint_details: ArcSwap>, pub strings: ArcSwap>, pub version: AtomicU32, @@ -384,16 +386,19 @@ impl DeviceData { pub fn update_endpoint_details(&self) { if let Some(number) = self.config_number.load().as_ref() { if let Some(config) = &self.configurations.load().get(**number) { + let iface_settings = self.interface_settings.load(); self.endpoint_details.update(|endpoint_details| { - for iface in config.interfaces.values() { - for ep_desc in &iface.endpoint_descriptors { - let ep_addr = ep_desc.endpoint_address; - let ep_type = ep_desc.attributes.endpoint_type(); - let ep_max = ep_desc.max_packet_size as usize; - endpoint_details.set( - ep_addr, - (ep_type, Some(ep_max)) - ); + for ((num, alt), iface) in config.interfaces.iter() { + if iface_settings.get(*num) == Some(alt) { + for ep_desc in &iface.endpoint_descriptors { + let ep_addr = ep_desc.endpoint_address; + let ep_type = ep_desc.attributes.endpoint_type(); + let ep_max = ep_desc.max_packet_size as usize; + endpoint_details.set( + ep_addr, + (ep_type, Some(ep_max)) + ); + } } } }); @@ -425,6 +430,8 @@ impl DeviceData { => self.decode_descriptor_read(fields, payload)?, (RequestType::Standard, StandardRequest::SetConfiguration) => self.decode_configuration_set(fields)?, + (RequestType::Standard, StandardRequest::SetInterface) + => self.decode_interface_set(fields)?, _ => () } Ok(()) @@ -482,6 +489,30 @@ impl DeviceData { { let config_number = ConfigNum(fields.value.try_into()?); self.config_number.swap(Some(Arc::new(config_number))); + let mut interface_settings = VecMap::new(); + if let Some(config) = self.configurations.load().get(config_number) { + // All interfaces are reset to setting zero. + for (num, _alt) in config.interfaces + .keys() + .unique_by(|(num, _alt)| num) + { + interface_settings.set(*num, InterfaceAlt(0)); + } + } + self.interface_settings.swap(Arc::new(interface_settings)); + self.update_endpoint_details(); + self.increment_version(); + Ok(()) + } + + fn decode_interface_set(&self, fields: &SetupFields) + -> Result<(), Error> + { + let iface_num = InterfaceNum(fields.index.try_into()?); + let iface_alt = InterfaceAlt(fields.value.try_into()?); + self.interface_settings.update(|interface_settings| + interface_settings.set(iface_num, iface_alt) + ); self.update_endpoint_details(); self.increment_version(); Ok(()) @@ -1819,7 +1850,6 @@ mod tests { use std::path::PathBuf; use crate::decoder::Decoder; use crate::pcap::Loader; - use itertools::Itertools; fn summarize_item(cap: &mut CaptureReader, item: &TrafficItem, depth: usize) -> String diff --git a/src/usb.rs b/src/usb.rs index c58ddfcf..7279af33 100644 --- a/src/usb.rs +++ b/src/usb.rs @@ -124,7 +124,7 @@ pub fn validate_packet(packet: &[u8]) -> Result> { macro_rules! byte_type { ($name: ident) => { #[derive(Copy, Clone, Debug, Default, - PartialEq, Eq, PartialOrd, Ord, + PartialEq, Eq, Hash, PartialOrd, Ord, Pod, Zeroable, From, Into, Display)] #[repr(transparent)] pub struct $name(pub u8); From d82345e267c6f8dfe94cc4cccaba4e3e5bd1246a Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Tue, 17 Sep 2024 22:35:31 +0100 Subject: [PATCH 2/9] Store endpoint type in transaction state if known. When a transaction starts, we need to store the endpoint type in the transaction state if it's currently known, so that later in the transaction we can match on the endpoint state. --- src/decoder.rs | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/decoder.rs b/src/decoder.rs index 617e340e..58a0a76f 100644 --- a/src/decoder.rs +++ b/src/decoder.rs @@ -80,6 +80,7 @@ struct TransactionState { id: TransactionId, last: PID, endpoint_id: Option, + endpoint_type: Option, ep_transaction_id: Option, setup: Option, payload: Option>, @@ -683,19 +684,31 @@ impl Decoder { use PID::*; use TransactionStyle::*; let transaction_id = self.capture.transaction_index.push(packet_id)?; - let (style, endpoint_id) = match pid { - Malformed => (Simple(pid), Some(INVALID_EP_ID)), + let (style, endpoint_id, endpoint_type) = match pid { + Malformed => (Simple(pid), Some(INVALID_EP_ID), None), SPLIT => { let split = SplitFields::from_packet(packet); - (Split(split.sc(), split.endpoint_type(), None), None) + let style = Split(split.sc(), split.endpoint_type(), None); + (style, None, Some(split.endpoint_type())) }, - pid => (Simple(pid), Some(self.packet_endpoint(pid, packet)?)) + pid => { + let endpoint_id = self.packet_endpoint(pid, packet)?; + let ep_data = &self.endpoint_data[endpoint_id]; + let dev_data = self.capture.device_data(ep_data.device_id)?; + let (ep_type, _) = dev_data.endpoint_details(ep_data.address); + let endpoint_type = match ep_type { + EndpointType::Normal(usb_ep_type) => Some(usb_ep_type), + _ => None, + }; + (Simple(pid), Some(endpoint_id), endpoint_type) + } }; let mut state = TransactionState { style, id: transaction_id, last: pid, endpoint_id, + endpoint_type, ep_transaction_id: None, setup: None, payload: None, From 6c3ff474aa466c6b98dac635de6ad8ad3681addf Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Tue, 17 Sep 2024 22:35:51 +0100 Subject: [PATCH 3/9] Decode IN/OUT + DATA0/DATA1 based on endpoint type. Now that we have that context in the transaction state, we can decode IN | OUT followed by DATA0 | DATA1 to one of three possibilities: - Done if the endpoint is isochronous - Continue if the endpoint is not isochronous - Ambiguous if we don't know In the Ambiguous case, we add the packet to the transaction, but don't end the transaction or index any payload data. The transaction will be ended when the next token starts a new transaction. --- src/decoder.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/decoder.rs b/src/decoder.rs index 58a0a76f..ff065871 100644 --- a/src/decoder.rs +++ b/src/decoder.rs @@ -45,6 +45,7 @@ enum TransactionStatus { Retry, Done, Fail, + Ambiguous, Invalid } @@ -111,7 +112,9 @@ fn transaction_status(state: &Option, packet: &[u8]) }, Some(TransactionState { style: Simple(first), - last, ..}) => + last, + endpoint_type, + ..}) => { match (first, last, next) { // These tokens always start a new transaction. @@ -133,7 +136,15 @@ fn transaction_status(state: &Option, packet: &[u8]) // IN may be followed by NAK or STALL, failing transaction. (_, IN, NAK | STALL) => Fail, // IN or OUT may be followed by DATA0 or DATA1. - (_, IN | OUT, DATA0 | DATA1) if packet.len() >= 3 => Continue, + (_, IN | OUT, DATA0 | DATA1) => + match endpoint_type { + // No handshake for an isochronous transaction. + Some(Isochronous) => Done, + // Expect handshake if known to be non-isochronous. + Some(_) => Continue, + // If we don't know the endpoint type, we can't be sure. + None => Ambiguous, + }, // An ACK or NYET then completes the transaction. (IN | OUT, DATA0 | DATA1, ACK | NYET) => Done, // OUT may also be completed by NAK or STALL. @@ -667,6 +678,9 @@ impl Decoder { self.transaction_append(pid, packet)?; self.transaction_end(success, complete)?; }, + Ambiguous => { + self.transaction_append(pid, packet)?; + }, Invalid => { self.transaction_start(packet_id, pid, packet)?; self.transaction_end(false, false)?; From d198eb6e0d0e0327f2f76dd5acf2f632cf2f2525 Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Tue, 17 Sep 2024 22:39:25 +0100 Subject: [PATCH 4/9] Interpret known isochronous transactions as successful in UI. This fixes the initial issue seen where successful isochronous traffic was being interpreted as unsuccessful polling. This only addresses the unambiguous case, where we know that the endpoint type is isochronous. --- src/capture.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/capture.rs b/src/capture.rs index 47a02d06..bb9a6268 100644 --- a/src/capture.rs +++ b/src/capture.rs @@ -304,7 +304,7 @@ pub const FRAMING_EP_NUM: EndpointNum = EndpointNum(0x11); pub const INVALID_EP_ID: EndpointId = EndpointId::constant(0); pub const FRAMING_EP_ID: EndpointId = EndpointId::constant(1); -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone, Debug, PartialEq)] pub enum EndpointType { Unidentified, Framing, @@ -568,8 +568,10 @@ impl Transaction { self.payload_byte_range.as_ref().map(|range| range.len()) } - fn successful(&self) -> bool { + fn successful(&self, ep_type: EndpointType) -> bool { use PID::*; + use EndpointType::*; + use usb::EndpointType::*; match (self.start_pid, self.end_pid) { // SPLIT is successful if it ends with DATA0/DATA1/ACK/NYET. @@ -578,6 +580,9 @@ impl Transaction { // SETUP/IN/OUT is successful if it ends with ACK/NYET. (SETUP | IN | OUT, ACK | NYET) => true, + // Isochronous IN/OUT is successful if it ends with DATA0/DATA1. + (IN | OUT, DATA0 | DATA1) if ep_type == Normal(Isochronous) => true, + (..) => false } } @@ -587,6 +592,8 @@ impl Transaction { use StartComplete::*; use Direction::*; use PID::*; + use EndpointType::*; + use usb::EndpointType::*; let end_pid = match (direction, self.start_pid, self.split.as_ref()) { (In, OUT, None) | (Out, IN, None) => @@ -603,7 +610,7 @@ impl Transaction { }; if end_pid == STALL { Stalled - } else if self.successful() { + } else if self.successful(Normal(Control)) { Completed } else { Incomplete @@ -1453,7 +1460,7 @@ impl ItemSource for CaptureReader { } else { count }; - match (first_transaction.successful(), starting) { + match (first_transaction.successful(ep_type), starting) { (true, true) => { let ep_traf = self.endpoint_traffic(endpoint_id)?; From 0a7a38dba8b14dcd6c2a17ad3f4c90999952aa8f Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Tue, 17 Sep 2024 23:02:16 +0100 Subject: [PATCH 5/9] Add test case for unambiguous isochronous transactions. Includes descriptor requests as well as isochronous traffic. --- tests/iso-unambiguous/capture.pcap | Bin 0 -> 26023 bytes tests/iso-unambiguous/reference.txt | 1680 +++++++++++++++++++++++++++ tests/tests.txt | 1 + 3 files changed, 1681 insertions(+) create mode 100644 tests/iso-unambiguous/capture.pcap create mode 100644 tests/iso-unambiguous/reference.txt diff --git a/tests/iso-unambiguous/capture.pcap b/tests/iso-unambiguous/capture.pcap new file mode 100644 index 0000000000000000000000000000000000000000..b0925a213d54f2985f0d1b9336f390e625d3c394 GIT binary patch literal 26023 zcmds;c|eX?`^WF+sYo>xBWpyPrIpB%M9ES_m{E2THA$3YkY(a+@SCxXZOoX;ng)}x z@3LlQG=|1LS&JcQVhGLeoYU2HbBZjr-@35T*f03uqFM5$fU_^%%-MH-WNRjk*f&jk*p&Zj?4y@%4Al5> zkr#H>eua2s1wNqZE9?p5JtvMB^o%`ErND}blwToC3?1Os#T{qX=olaA3-2!OII}s` z_%uwlKUeTynT+V-F3rs8Yr-Qd@WxxHN6gGI#|I;zXHT9FMg-Q@Y5J#nop1JF9^v%L zM~-mt?uz*BiinB5sRUv*Kk6!DC;uLam`err#&{H_W><*S*78ev>S@POGVa`HG~zI6 z%NC=tM~I#I$)IQ3)zR*C*?9awv18W$#+qJdVx-%Z!^3{7I|c_5o6yH=42FT?GJh(8 z;(`GR<~VOGVxSoF<=Co=BCHQw@5Sd>`&^ z!p7rAU_+zbu6*!O#|RWkAtvK+a8T-5n@XTm*kl~$32bDi2*f~XbI%A>siAg5C^d z)Z6iLXxNAeI3TD7e?lctEuJ<(#tJhc5d+nx`y#8V>csB-p2$;IUX7IT5f)L1gGN#P zDC`lc3vvy5>fMZ@-Lo{>C6o%E5-7G|aobODa8SDBOC?ZB==%xg3Cyj3G-9AMZFsb* zWT{=h!j+1WqGkNqZo)z7@(Jn@N;WR}aJT9IGgy-RjG}3LMWYD7$>Ku zG>u0brW@@Xk3B-E$xVZvqYvZV+p#6$M_?Nxcgp}U zG`*(P(6$@%)O%6WWW01e;jjeBnbaeeAiqW;MnKOz>qK`8HXc6$Yv?m{COVU2Z5mAF z8J#*O${B-Z5)WpJKc^Cy%~`2n+9%U77R-7jPFKw`boD%W>d`gR<Gh?Ibnr3CM*XeW` zd&h#W+V<7-J8gJ>qUlU|YL`Bqsm7iQpNX;Ax>}5?JTwb?BO|>LOJhZrVx?m@YM8=) zS%<}1@n6?$F~^?68&u1W}-0S{rf z0ywui^4yw!&127a%$8#>tedUI?%FyVV*@LcJ~OFQVq>rnR8m6pIzG40Oe*K5X?wcx z*iFOd$gyL#%~4}N+BXMdvsnn+OP!IXRcEJ=uA5j~oe5iFy}nuvdn26@TUP#qp6`af zhKWw^%W^am2lk&eOy=&G&12U^&y{1>&7Z5r`YfC4?!tQc5vccN{}zK7nVK8x*zLV> z4fcwl=RZ_8(eqzdH<`!3wGg-Qi$9nr2Q2I{4+G#LJ|03PxQO?RR4|K;sffWvtjkKJ zi&(3{PcwGs?7+3o|CTDJUj8r*akxMenx$cnxQIJBq^mtm+E58*7SS~wG4Xn9X0{nI zm|3~?W}4ZYYQ`0}FfM#%XFF_`@ju5C4l~P-ryemglbkIW0X-}8w$R(5t5JFpA3WmW z7J2X;8X@;pfvbmhN|SMoqxhp6aUJP@h|PSAr8}Z_t=I# zLTO>UOtr_kd#1Yw8;>7>uF5TpEqeo;%5FzL(QLKeS`51>9mj4*Bec=lSoYHvvFppu zWMYWenoGmK#}LqO{0Wsn|H!oOWo)xo5n`Z!%fE>9*(Y4~0$o#cyUq2tL=?%m`*OlT z-{Cvz5&ABVpJD{`9C`WF-HMIJk3gL^=b$DI_FtOgPdwgAA{E%WC1oRG#q!Q?j zh*q$}vz{RadM1mW{hQv*%x7|{<6FXE>hU#7ut(?(&MLtO=y`FZ%mgQK+p7CX%#*8hRffChl}^R*^f$PJgvcV#9``wj?b}2 z=sk3Oq4s>*`Gq^*Bz^?y=86|rqo5baiK*GXA`XluRQnr;0;3vr{+6-RK`*ffjB19x zl#JNm_tWe*kX&a5|>2vV&Uy&`jeJ)o#X9Q#0Slshjc%ht#4cZ{9WG zGUK<13fI!F-(oVL-do?k3+;7`P~p1ZHKDMSQKscM8n{-oF2_WHSy<~m*c)}lldp=$ zFq)m-!Gt`QEiJy1YB!szGgCKv%d zF@+``?>HsnwQBP4U3{t`3R3d}sRUAvLli9BwiaR_73xxpq~uf5F1VJQIyISaNR3)r z>s=E*w}nvQdgZ<)CIedQFUxnKF=keBYMQ?lqOeT<1E>V9i$^Hfs_S(S1J_>)>yWEB zCG~pka6UhMdYFAEr~38%5OGLd8cIDv%6xfUwP)S>x*qu0Ow-DP`QXR0>dJ##y&w=) zBh<(m#{#9YTGlf5{0;ShlCxR8DoT3x!ml^gQha%8dh2>J-qxu;Mu5`Ew)L?`C|O=L z=*hZYA0yb?w)P7fTbI{@M>IEWfVjAjpZPby2oUQSLM0HpHbTL2x;8`%#B_ZdVrn+K zAE_di7}HQrbxS22#B#r<9wGMA;zk$&J;T;C!U#p|=Yx&ph(&&l5eKmo{iy_E;lmrt zm{%Jc#6WCzR~t-K#9oZDk@2rq5e}1Xzkzy$SetcCFammh+tLIh6fytvP2`A8T2sV9 z?A8ZV0{0fHO8w*P5fm5O+5-f_*8O^hN}x35l7j7A>wtNn zRJhrpiW2+0&tFA8U&^;G>zsp}I_Wjxpk!(4h&@8-);K4OfSx&1oG?N;C%;+Ygt!oE zkWDy<)y$<5i0N-CnBCeImwk<@j*-M5n}1Vt<;|X z3~PlEir9vvR)`C+sRUv(?OMy&iJzzk#9m!(jj4)Q_G<-y>Ew*5AhyQS z86$+4-)tAP=iVY0j8Me%+g%VBV$NM$5eKpOK2!p+2_L)4SV1>;#6Zj~*d0^Zt4PJw z_2U43DsGB(m+{>j35V3jS?-2cPShy^g>Bdm9+(SY+7S;!@TXi4IWaM!4T7+g4dbW; zo@3^;k+BxVZ4m>{#&6q_XR409gz#4p@#ykF6HgiM-`^8)NG%ygJwjV<6C#Y5=Sa-cIrm|O&imU6#G5l2AZ|5uHi^uq?sV67-8eTa?a|sl-4;pn- z!6q%c8G^k!caswj%^(n#DJX?X;92;Uf{l9B9rM6*RW(2IWS?l*U6)RKCI03~%@%%g z>Zve4#340eJoN~r0vCU^C#91=eaO~)kMcD<(#KyOJ8&6suyf1TQwfZ2Z&R=}cY9zQ z7~L-JK}O>9C^LE%%TtHc4v`zs!JZY}(U+%dFQ^&Knlm z6Z2pN%g0d(ECb>c?1!vzGOiQ@^X-2XRPEZrTTXgi*0; zpxU#vbD)9InZQ8g#QXNayTri?8a<;D7;Si~U^!=kFb<6LmxIWNy>APn;#6*w_##M7 z4RY#>IHV?f_BEJo9sj<_3Co^$47jAHhTQ0Xh!d70yZ6I9SV1kAN?_S*SU-#t*vY!V zh=Jw4=D}pi-nA?Ct%O_7^ADDB>sf?D>fX<(M;PTS>W>l7b7XaYgOw=V(qA4sa>xMW zUis|gW0~hOq{S> zmOBt*fxC8dpaB>4WT2eq-+VA~usSW=s05a=-h&C_&t5)=Ys&uQ5FbYJlK-5h#^&rh zKltAXW53pGD@ysV4yHEce;QozFp?K$T_&8R^3v!#)Dy-FzD~_B0(wdVn#tq*@+I{! zYmQleLnStQUfQ=+!Ol0d!=c$8@t$K&cIxbnwN-=ouNL;UlT$ZMCmd$>^#bY>|(lJ8BhTu-vYR zt7vB8El512=iM*Ytdj9z#|ek^SpLf@8(hkYKUUyq$$dh_g!g!^!DK+UbzAc;)GTz3 zoI2_uq2RjxIhDY*kI`Bg+hhGLCW32`-M9bd8s6hu8UJQ3;V|J#Uwr$n3FmJlRJf*u ztjAl~H9^kR!!N8sqB+URk4~Yw#vBUKZL`i_nK#5j}U8j zGy@}`C+~a)Mkr#XPY4&U5-#nwAr4|wyHg3otb?~W_ZR^^dkVkD2t~}ve7hXs{MB~EK`cCtN+4#kL&5IE>_7~}TFu;n zsZ}2T^7G`oZ+6J3hjIyr)W2@-FuZbNiwP9AqYHLoE`X~`cN&5xs{J4*p6>Mng0M^z z22%+8?8=f;mly3q98#yf-i19vY16N})t-g7 zb{i^%J==|-IJs)n-h&{l#ek+%0;Q7Hdt~f%0rh~=+tNK%l<+Aj-?}r_du4n_&|XXh zrRAa2Bb2OP?^Aoqs_(}L<(#bFYQG#|J#s(dAT}bJN+709S1`LV2M`0Xut^6nm0fI= zkAJzC{n7(+s(B9KAeNa&Jwoh~!y$}-o_%c&VT2-6XSv}1^a z*!CS%0b+X=)W^=iKphF6Z!Xaa?8+=grw z%=jVO5WJL~Ehh%lI)xxCWnm*Kf#+u}Psv#HtkZ~rXZpg^=8<__0Fk1R`%x%mD+ioLr`qpxlaj%MbuKL1WIWu6fEvk4(5TYu4e&H11AQpR(dW6`GIu|ekdS=;Pzz9XG zsQU#u;?`xtLF~6XR06THPZjLQ@mx#=vFE?!VyYq*U7RbY4s!ezahP<6w!dPJ5WDi{ zMYZS9%ZnJHh&ea<4RNvbrhP9V4r2Yos03mq5tn3abmz;6f!OL^moc@<<6pjGwW2P| z_|9(#htz_M%Z67@_+bKt?SRlc%mpwdBF_-4Ha$;Hd_3xR1Ys$^m`Ek?%=`3r84Js} zf*5$F?Y%;t>=TW6c=O7Vd)B{tMaDb$UPT;IuLWJj9-*|i+@NQO`8DxZ^Z5gzK=$~T zkNriXYsiV6+cWMOjtxtZF@;KCw0^dVWnV`OjGp9PCnNFMTRi^dse4PV%c&(cHxP%^ zPOWbk%=TQT8^{UEKGzJmc?E`C_}|0{%Tp$|Fb`I6Yi%ll<+G-@Fiv3Jrhgy?mT`6e zAWL=+S@9V0IJaEl^@og?MiLIGD-)&{v zIeE{3t9I!ga$*A_KfI3|td3bTDuLxD*ZVS782kV+uxvW~0a?=HUv9ZF>4A)=WD^dl zEpw?y7(KsMfDzEMprF9OsMgB@dF+}2g~-7Q_83SdFnTbuP{y1(K12+RCIvhsBYOPH zjUJ4DDC76m5e})&84nF+duTs#!t%$=M;Hs-oBfXrxJBn4$$78r{zMK|XRSMxz_Pv1 zpM+Io^PYFy(X7g|MqbMK#nH^1edk9uf7YmHKb-RAzv@=(Xok-kdEr7MC&XDQFU7WS z!k#c*unldY_QZ^%5}O(CGK*`0*hOAA>)#qNw*I`Ng|w!biDy#m!Rc@-{;Pzz)-pc) z7U3|n@<-GoX7=S3XN-WJTE2ilP|8_OB~Xg~PQgx>wZlA6s%hH3iV{9y z5Qo$*6nF$OjX3pt-R&b!XDm;!=x96P>&Fc2?UJfKI@Jcc*Za3PM++x zui`_$2lw>J>Mr9)?+^~D{hv~gP}))8hY`@@Tk2=16kgq59y~hKA3<1)^av_do|AD3 z_HbMe#6Za-u16Ime8R?+2Ce8Jr{0(pfH+JyX=VWS2&JU>m}As3r6qPL7+Uq(2HMX#qGAy!b- z2P2>-@pT`JP{ayt0_BK#F@cDK*!~$*0XKwHy8P`$?ht$;XsYfXFnlKn6pyyHiU_+$?{~0U~ z{;9=B2*TFIG@ueFjdlD;#_Icij2I}5>icmOC49ohm0C^uSjIy)6J9ypUDP9#9vmNn z5zv$J%MgrE&dH6%L*$4~lS2^)vB^nP0ZDCpvN?5C`Kq^4lzUJh{l@<2eCmvQVGO*9ak`~q+yr}VzUY0x~TwGmeeMVpeh#d~35{P9D zQ82gcQHX(9MD8d|t@7xQ@0feZC^_}K<7mVoRqr|4@XDDJFd9K&o0x9^?tJnN&_x@A zpzxf1Zww~FQrbSF5_nE1SFp%-;fR6f58cDblO7#%&l%z2a_WX}2#3^m8Pp?`)~1fb z2>rPelgEBgBLX>C!zT5p1V%^gB4lhx{qcx_QINxUGNMO^JT*ID zyo|T_l5j|kT{qrfwpu1}!t%?42^b69@1+wAxH`s>a^8x*k;ql9U>KFaGIzX!{Sg|4 z7+6}5k0MKU4+)PBxn+Jzl$`32O*o|Pxj;R_sMs+YBcNwl+h_x$M*h+A*n<`k2P?5| zHI=}~XQP6-?w*KoV3crTA{jLUqvBL<^yKbDIdx9s7{np#0W=)qOYxBP#dy`4j`A$0l*|*c*n$AqOk?IFd?W^hJV#RbL#B7#O`-9ZyE|=#U$o zJ`gXb4lE@cQoq(sHJEKHtEtEd%cL#|7z^C)J_!b#e^>%?V&CSa69=nPXD5}wa{FNg z>%ZUGLV0w!`n0o!IaA^X|7;5Xmwj$IrqJ0!dUUwDsSDyT+Y8Pv7Vmges@F_UoS+3>+v;&g6o(~R07xXT?*DY-rQ5!*U#pf zd;ZJ5mZh0{O8Z(+PB^%_Sy*_!V_!SlSs*H0eGgh-GN9AWz7x&+gHYjmVA=D%abJ01Ncn#dXQ{kYW|o3IVZ1PN*5_)^{?DnzX2!b)t@<3Xi(;G$Um?bJftQMI zd?n9}{~^T5rTka>%D+mD2QxV%z&BHpf2$Ej|%8cQ(yw0f&? zXfgYruJp94T-V62L-`bk-|uOc&AwM2?8pD!uNk+w(zgvhRxRf_er)H*e#H-N`v3Ym zn#)rfhefCgSI_=-z Date: Wed, 18 Sep 2024 07:05:19 +0100 Subject: [PATCH 6/9] Interpret ambiguous transactions in UI. Replaces the current: Transaction::successful() -> bool with a result() method that returns Success, Failure or Ambiguous. Adds handling of the Ambiguous cases when describing transaction groups. Transaction groups will be named e.g. "23 ambiguous transactions", rather than as polling groups or transfers. The detail pane will advise starting the capture before enumeration to resolve the ambiguity. --- src/capture.rs | 53 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 13 deletions(-) diff --git a/src/capture.rs b/src/capture.rs index bb9a6268..959f2e9b 100644 --- a/src/capture.rs +++ b/src/capture.rs @@ -559,6 +559,13 @@ pub struct Transaction { payload_byte_range: Option>>, } +#[derive(PartialEq)] +pub enum TransactionResult { + Success, + Failure, + Ambiguous +} + impl Transaction { fn packet_count(&self) -> u64 { self.packet_id_range.len() @@ -568,22 +575,30 @@ impl Transaction { self.payload_byte_range.as_ref().map(|range| range.len()) } - fn successful(&self, ep_type: EndpointType) -> bool { + fn result(&self, ep_type: EndpointType) -> TransactionResult { use PID::*; use EndpointType::*; use usb::EndpointType::*; + use TransactionResult::*; match (self.start_pid, self.end_pid) { // SPLIT is successful if it ends with DATA0/DATA1/ACK/NYET. - (SPLIT, DATA0 | DATA1 | ACK | NYET) => true, + (SPLIT, DATA0 | DATA1 | ACK | NYET) => Success, // SETUP/IN/OUT is successful if it ends with ACK/NYET. - (SETUP | IN | OUT, ACK | NYET) => true, - - // Isochronous IN/OUT is successful if it ends with DATA0/DATA1. - (IN | OUT, DATA0 | DATA1) if ep_type == Normal(Isochronous) => true, + (SETUP | IN | OUT, ACK | NYET) => Success, + + // IN/OUT followed by DATA0/DATA1 depends on endpoint type. + (IN | OUT, DATA0 | DATA1) => match ep_type { + // For an isochronous endpoint this is a success. + Normal(Isochronous) => Success, + // For an unidentified endpoint this is ambiguous. + Unidentified => Ambiguous, + // For any other endpoint type this is a failure (no handshake). + _ => Failure, + }, - (..) => false + (..) => Failure } } @@ -594,6 +609,7 @@ impl Transaction { use PID::*; use EndpointType::*; use usb::EndpointType::*; + use TransactionResult::*; let end_pid = match (direction, self.start_pid, self.split.as_ref()) { (In, OUT, None) | (Out, IN, None) => @@ -610,7 +626,7 @@ impl Transaction { }; if end_pid == STALL { Stalled - } else if self.successful(Normal(Control)) { + } else if self.result(Normal(Control)) == Success { Completed } else { Incomplete @@ -1390,6 +1406,7 @@ impl ItemSource for CaptureReader { Transfer(transfer_id) => { use EndpointType::*; use usb::EndpointType::*; + use TransactionResult::*; let entry = self.transfer_index.get(*transfer_id)?; let endpoint_id = entry.endpoint_id(); let endpoint = self.endpoints.get(endpoint_id)?; @@ -1460,8 +1477,8 @@ impl ItemSource for CaptureReader { } else { count }; - match (first_transaction.successful(ep_type), starting) { - (true, true) => { + match (first_transaction.result(ep_type), starting) { + (Success, true) => { let ep_traf = self.endpoint_traffic(endpoint_id)?; let data_range = @@ -1486,12 +1503,22 @@ impl ItemSource for CaptureReader { write!(s, ": {display_bytes}") } }, - (true, false) => write!(s, + (Success, false) => write!(s, "End of {ep_type_lower} transfer on endpoint {endpoint}"), - (false, true) => write!(s, + (Failure, true) => write!(s, "Polling {count} times for {ep_type_lower} transfer on endpoint {endpoint}"), - (false, false) => write!(s, + (Failure, false) => write!(s, "End polling for {ep_type_lower} transfer on endpoint {endpoint}"), + (Ambiguous, true) => { + write!(s, "{count} ambiguous transactions on endpoint {endpoint}")?; + if detail { + write!(s, "\nThe result of these transactions is ambiguous because the endpoint type is not known.")?; + write!(s, "\nTry starting the capture before this device is enumerated, so that its descriptors are captured.")?; + } + Ok(()) + }, + (Ambiguous, false) => write!(s, + "End of ambiguous transactions."), } } }?; From 09ef13ff35f1b69ddd3d1b4a84b827f180b48eac Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Wed, 18 Sep 2024 07:11:05 +0100 Subject: [PATCH 7/9] Add test case for ambiguous isochronous transactions. Includes isochronous traffic, but no descriptor requests. --- tests/iso-ambiguous/capture.pcap | Bin 0 -> 5646 bytes tests/iso-ambiguous/reference.txt | 14 ++++++++++++++ tests/tests.txt | 1 + 3 files changed, 15 insertions(+) create mode 100644 tests/iso-ambiguous/capture.pcap create mode 100644 tests/iso-ambiguous/reference.txt diff --git a/tests/iso-ambiguous/capture.pcap b/tests/iso-ambiguous/capture.pcap new file mode 100644 index 0000000000000000000000000000000000000000..4d7d8d9ec7f541874679f54b1b2a6dfeab6b2301 GIT binary patch literal 5646 zcmeaZ*|d;}frSAE{{LrSP+(+W-~tMqx#6zN45UFgb9N+1DE6tl@?jti!$9WH1=SBh zUYaKvj_%7QwQyx;pcDv$d`c16e*t8ROjH`WEql|_hFe&6&MHOsrPT7$;pR(?+b!t6 zJoUU~xcRbGdJ4KP)ikCIH(#2@EJpWbbH?J~=F3HMHlh2nZRMun=1Zr$2hn}`_~pUj z=F9c67twv`pmlM$`O+`$0lF_gWIY&ezT7kKJ-RP_R=*!^zKp*A5AMr{kapzaH~)s4 zFAEnjsW1audLRsKEeow@QUSFeVHn69x&YEz)=}Vt`w|+LDY|^a&6iG(1>wGg#^vSr zg2T<128pt8Uqa(jB~Ny^`O-~A5$;Q9Ts}8Y9B#g3T%-f{B{VKA*6R#6Uy7$1z^1^4o;pWSmDN%4=LgP}gC~7$Q5&$F#(~kfE literal 0 HcmV?d00001 diff --git a/tests/iso-ambiguous/reference.txt b/tests/iso-ambiguous/reference.txt new file mode 100644 index 00000000..c77f6c26 --- /dev/null +++ b/tests/iso-ambiguous/reference.txt @@ -0,0 +1,14 @@ +18 ambiguous transactions on endpoint 27.3 IN + IN transaction on 27.3 with 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... + IN packet on 27.3, CRC 0B + DATA0 packet with CRC E17B and 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... + IN transaction on 27.3 with 64 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00] + IN packet on 27.3, CRC 0B + DATA0 packet with CRC D0BF and 64 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00] + 16 times: IN transaction on 27.3 with 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... + IN packet on 27.3, CRC 0B + DATA0 packet with CRC E17B and 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... +7 ambiguous transactions on endpoint 27.3 OUT + 7 times: OUT transaction on 27.3 with 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... + OUT packet on 27.3, CRC 0B + DATA0 packet with CRC E17B and 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... diff --git a/tests/tests.txt b/tests/tests.txt index 1d6a50e1..1c846a67 100644 --- a/tests/tests.txt +++ b/tests/tests.txt @@ -4,6 +4,7 @@ emf2022-badge hackrf-connect hackrf-dfu-enum hackrf-restart-failure +iso-ambiguous iso-unambiguous ksolti-core-enum mouse From 8eef2c24bab36a319ebb081bfc9b0fd42c08cb4f Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Wed, 18 Sep 2024 07:30:15 +0100 Subject: [PATCH 8/9] Clarify descriptions of SetInterface/GetInterface requests. --- src/usb.rs | 5 ++--- tests/iso-unambiguous/reference.txt | 8 ++++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/usb.rs b/src/usb.rs index 7279af33..785f1710 100644 --- a/src/usb.rs +++ b/src/usb.rs @@ -428,9 +428,8 @@ impl StandardRequest { }, GetConfiguration => format!("Getting configuration"), SetConfiguration => format!("Setting configuration {}", fields.value), - GetInterface => format!("Getting interface {}", fields.index), - SetInterface => format!("Setting interface {} to {}", - fields.index, fields.value), + GetInterface => format!("Getting interface setting"), + SetInterface => format!("Setting alternate setting {}", fields.value), SynchFrame => format!("Synchronising frame"), Unknown => format!("Unknown standard request"), } diff --git a/tests/iso-unambiguous/reference.txt b/tests/iso-unambiguous/reference.txt index 745d21ee..1013bf3e 100644 --- a/tests/iso-unambiguous/reference.txt +++ b/tests/iso-unambiguous/reference.txt @@ -744,7 +744,7 @@ Getting string descriptor #0 for device 27, reading 4 bytes OUT packet on 27.0, CRC 18 DATA1 packet with CRC 0000 and no data ACK packet -Setting interface 1 to 0 for interface 27.1 +Setting alternate setting 0 for interface 27.1 SETUP transaction on 27.0 with 8 data bytes, ACK: [01, 0B, 00, 00, 01, 00, 00, 00] SETUP packet on 27.0, CRC 18 DATA0 packet with CRC 04C5 and 8 data bytes: [01, 0B, 00, 00, 01, 00, 00, 00] @@ -1132,7 +1132,7 @@ Class request #1, index 2, value 258 for interface 27.0, writing 1 bytes IN packet on 27.0, CRC 18 DATA1 packet with CRC 0000 and no data ACK packet -Setting interface 2 to 0 for interface 27.2 +Setting alternate setting 0 for interface 27.2 SETUP transaction on 27.0 with 8 data bytes, ACK: [01, 0B, 00, 00, 02, 00, 00, 00] SETUP packet on 27.0, CRC 18 DATA0 packet with CRC 40C5 and 8 data bytes: [01, 0B, 00, 00, 02, 00, 00, 00] @@ -1586,7 +1586,7 @@ Class request #1, index 4, value 256 for interface 27.0, writing 4 bytes IN packet on 27.0, CRC 18 DATA1 packet with CRC 0000 and no data ACK packet -Setting interface 1 to 1 for interface 27.1 +Setting alternate setting 1 for interface 27.1 SETUP transaction on 27.0 with 8 data bytes, ACK: [01, 0B, 01, 00, 01, 00, 00, 00] SETUP packet on 27.0, CRC 18 DATA0 packet with CRC D5C4 and 8 data bytes: [01, 0B, 01, 00, 01, 00, 00, 00] @@ -1598,7 +1598,7 @@ Setting interface 1 to 1 for interface 27.1 IN packet on 27.0, CRC 18 DATA1 packet with CRC 0000 and no data ACK packet -Setting interface 2 to 1 for interface 27.2 +Setting alternate setting 1 for interface 27.2 SETUP transaction on 27.0 with 8 data bytes, ACK: [01, 0B, 01, 00, 02, 00, 00, 00] SETUP packet on 27.0, CRC 18 DATA0 packet with CRC 91C4 and 8 data bytes: [01, 0B, 01, 00, 02, 00, 00, 00] From d2308a6b8ba50c86eb0a0a8e6535dcbdd7cab256 Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Thu, 19 Sep 2024 13:23:48 +0100 Subject: [PATCH 9/9] Don't end isochronous transfers on short packets. --- src/decoder.rs | 6 +-- tests/iso-unambiguous/reference.txt | 62 ++--------------------------- 2 files changed, 7 insertions(+), 61 deletions(-) diff --git a/src/decoder.rs b/src/decoder.rs index ff065871..76b422c8 100644 --- a/src/decoder.rs +++ b/src/decoder.rs @@ -406,7 +406,7 @@ impl EndpointData { } if complete { self.last_success = success; - if success && short { + if success && short && ep_type != Normal(Isochronous) { // New transfer, ended immediately by a short packet. Single } else { @@ -435,7 +435,7 @@ impl EndpointData { let success_changed = success != self.last_success; self.last_success = success; if success_changed { - if success && short { + if success && short && ep_type != Normal(Isochronous) { // New transfer, ended immediately by a short packet. Single } else { @@ -444,7 +444,7 @@ impl EndpointData { } } else if success { // Continuing an ongoing transfer. - if short { + if short && ep_type != Normal(Isochronous) { // A short packet ends the transfer. Done } else { diff --git a/tests/iso-unambiguous/reference.txt b/tests/iso-unambiguous/reference.txt index 1013bf3e..17377500 100644 --- a/tests/iso-unambiguous/reference.txt +++ b/tests/iso-unambiguous/reference.txt @@ -1610,71 +1610,17 @@ Setting alternate setting 1 for interface 27.2 IN packet on 27.0, CRC 18 DATA1 packet with CRC 0000 and no data ACK packet -Isochronous transfer of 192 bytes on endpoint 27.3 IN: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... +Isochronous transfer of 2.50 KiB on endpoint 27.3 IN: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... IN transaction on 27.3 with 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... IN packet on 27.3, CRC 0B DATA0 packet with CRC E17B and 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... -Isochronous transfer of 64 bytes on endpoint 27.3 IN: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00] IN transaction on 27.3 with 64 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00] IN packet on 27.3, CRC 0B DATA0 packet with CRC D0BF and 64 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00] -Isochronous transfer of 192 bytes on endpoint 27.3 IN: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - IN transaction on 27.3 with 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - IN packet on 27.3, CRC 0B - DATA0 packet with CRC E17B and 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... -Isochronous transfer of 192 bytes on endpoint 27.3 IN: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - IN transaction on 27.3 with 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - IN packet on 27.3, CRC 0B - DATA0 packet with CRC E17B and 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... -Isochronous transfer of 192 bytes on endpoint 27.3 IN: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - IN transaction on 27.3 with 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - IN packet on 27.3, CRC 0B - DATA0 packet with CRC E17B and 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... -Isochronous transfer of 192 bytes on endpoint 27.3 IN: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - IN transaction on 27.3 with 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - IN packet on 27.3, CRC 0B - DATA0 packet with CRC E17B and 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... -Isochronous transfer of 192 bytes on endpoint 27.3 IN: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - IN transaction on 27.3 with 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - IN packet on 27.3, CRC 0B - DATA0 packet with CRC E17B and 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... -Isochronous transfer of 192 bytes on endpoint 27.3 IN: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - IN transaction on 27.3 with 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - IN packet on 27.3, CRC 0B - DATA0 packet with CRC E17B and 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... -Isochronous transfer of 192 bytes on endpoint 27.3 IN: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - IN transaction on 27.3 with 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - IN packet on 27.3, CRC 0B - DATA0 packet with CRC E17B and 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... -Isochronous transfer of 192 bytes on endpoint 27.3 IN: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - IN transaction on 27.3 with 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - IN packet on 27.3, CRC 0B - DATA0 packet with CRC E17B and 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... -Isochronous transfer of 192 bytes on endpoint 27.3 IN: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - IN transaction on 27.3 with 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - IN packet on 27.3, CRC 0B - DATA0 packet with CRC E17B and 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... -Isochronous transfer of 192 bytes on endpoint 27.3 IN: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - IN transaction on 27.3 with 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - IN packet on 27.3, CRC 0B - DATA0 packet with CRC E17B and 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... -Isochronous transfer of 192 bytes on endpoint 27.3 OUT: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - OUT transaction on 27.3 with 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - OUT packet on 27.3, CRC 0B - DATA0 packet with CRC E17B and 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... -Isochronous transfer of 192 bytes on endpoint 27.3 IN: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - IN transaction on 27.3 with 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - IN packet on 27.3, CRC 0B - DATA0 packet with CRC E17B and 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... -Isochronous transfer of 192 bytes on endpoint 27.3 OUT: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - OUT transaction on 27.3 with 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - OUT packet on 27.3, CRC 0B - DATA0 packet with CRC E17B and 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... -Isochronous transfer of 192 bytes on endpoint 27.3 IN: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - IN transaction on 27.3 with 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... + 12 times: IN transaction on 27.3 with 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... IN packet on 27.3, CRC 0B DATA0 packet with CRC E17B and 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... -Isochronous transfer of 192 bytes on endpoint 27.3 OUT: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... - OUT transaction on 27.3 with 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... +Isochronous transfer of 576 bytes on endpoint 27.3 OUT: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... + 3 times: OUT transaction on 27.3 with 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]... OUT packet on 27.3, CRC 0B DATA0 packet with CRC E17B and 192 data bytes: [00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]...