From 6b873c26cb6909366ae80fe2bdee9824aadfd69b Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Thu, 18 Jul 2024 21:48:02 +0100 Subject: [PATCH 1/8] Add crc crate dependency. --- Cargo.lock | 16 ++++++++++++++++ Cargo.toml | 1 + wix/rust_licenses.py | 22 +++++++++++----------- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9e6a9965..ee3885d7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -226,6 +226,21 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + [[package]] name = "crossbeam-channel" version = "0.5.13" @@ -1053,6 +1068,7 @@ dependencies = [ "built", "bytemuck", "bytemuck_derive", + "crc", "ctor", "derive_more", "futures-channel", diff --git a/Cargo.toml b/Cargo.toml index 1d7c417b..06cab82a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,6 +49,7 @@ lrumap = "0.1.0" memmap2 = "0.9.4" page_size = "0.6.0" anyhow = { version = "1.0.79", features = ["backtrace"] } +crc = "3.2.1" [dev-dependencies] serde = { version = "1.0.196", features = ["derive"] } diff --git a/wix/rust_licenses.py b/wix/rust_licenses.py index 0ad2965b..9523eee0 100644 --- a/wix/rust_licenses.py +++ b/wix/rust_licenses.py @@ -116,19 +116,19 @@ def validate_license(package, version, expr): src_path = os.path.join(manual_dir, dest_filename) else: # Look for a license file. - src_filenames = ( - 'LICENSE-MIT', - 'LICENSE-MIT.md', - 'license-mit', - 'LICENSE', - 'LICENSE.md', - 'COPYING', + file_paths = ( + ['LICENSE-MIT'], + ['LICENSE-MIT.md'], + ['license-mit'], + ['LICENSES', 'MIT.txt'], + ['LICENSE'], + ['LICENSE.md'], + ['COPYING'], ) src_dir = os.path.join(deps.name, f'{package}-{version}') - src_files = os.listdir(src_dir) - for filename in src_filenames: - if filename in src_files: - src_path = os.path.join(src_dir, filename) + for file_path in file_paths: + src_path = os.path.join(src_dir, *file_path) + if os.path.isfile(src_path): break else: raise ValueError( From bf693c17d8db0edf53ee956d2649c9b5c1a84ec0 Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Thu, 18 Jul 2024 21:48:23 +0100 Subject: [PATCH 2/8] Validate packet lengths and CRCs in decoder. --- src/decoder.rs | 11 +++++-- src/usb.rs | 80 +++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 85 insertions(+), 6 deletions(-) diff --git a/src/decoder.rs b/src/decoder.rs index ef5a5742..b86ef468 100644 --- a/src/decoder.rs +++ b/src/decoder.rs @@ -5,7 +5,7 @@ use anyhow::{Context, Error, bail}; use crate::capture::prelude::*; use crate::rcu::SingleWriterRcu; -use crate::usb::{self, prelude::*}; +use crate::usb::{self, prelude::*, validate_packet}; use crate::vec_map::{VecMap, Key}; impl PID { @@ -97,12 +97,19 @@ struct TransactionState { fn transaction_status(state: &Option, packet: &[u8]) -> Result { - let next = PID::from_packet(packet)?; use PID::*; use TransactionStatus::*; use TransactionStyle::*; use StartComplete::*; use usb::EndpointType::*; + + // First, check that this is a valid packet at all. + if !validate_packet(packet) { + return Ok(Invalid) + } + + let next = PID::from_packet(packet)?; + Ok(match state { None => match next { // Tokens may start a new transaction. diff --git a/src/usb.rs b/src/usb.rs index 8e46ea28..60abed65 100644 --- a/src/usb.rs +++ b/src/usb.rs @@ -2,11 +2,34 @@ use std::mem::size_of; use bytemuck_derive::{Pod, Zeroable}; use bytemuck::pod_read_unaligned; +use crc::{Crc, CRC_16_USB}; use num_enum::{IntoPrimitive, FromPrimitive}; use derive_more::{From, Into, Display}; use crate::vec_map::VecMap; +fn crc16(bytes: &[u8]) -> u16 { + const CRC16: Crc = Crc::::new(&CRC_16_USB); + CRC16.checksum(bytes) +} + +// We can't use the CRC_5_USB implementation, because we need to +// compute the CRC over either 11 or 19 bits of data, rather than +// over an integer number of bytes. + +fn crc5(mut input: u32, num_bits: u32) -> u8 { + let mut state: u32 = 0x1f; + for _ in 0..num_bits { + let cmp = input & 1 != state & 1; + input >>= 1; + state >>= 1; + if cmp { + state ^= 0x14; + } + } + (state ^ 0x1f) as u8 +} + #[allow(clippy::upper_case_acronyms)] #[derive(Copy, Clone, Debug, Default, IntoPrimitive, FromPrimitive, PartialEq, Eq)] #[repr(u8)] @@ -37,6 +60,48 @@ impl std::fmt::Display for PID { } } +pub fn validate_packet(packet: &[u8]) -> bool { + use PID::*; + + let len = packet.len(); + + if len == 0 { + return false; + } + + match PID::from(packet[0]) { + + // SOF and tokens must be three bytes, with a valid CRC5. + SOF | SETUP | IN | OUT | PING if len == 3 => { + let data = u32::from_le_bytes( + [packet[1], packet[2] & 0x07, 0, 0]); + let crc = packet[2] >> 3; + crc == crc5(data, 11) + } + + // SPLIT packets must be four bytes, with a valid CRC5. + SPLIT if len == 4 => { + let data = u32::from_le_bytes( + [packet[1], packet[2], packet[3] & 0x07, 0]); + let crc = packet[3] >> 3; + crc == crc5(data, 19) + }, + + // Data packets must be 3 to 1027 bytes, with a valid CRC16. + DATA0 | DATA1 | DATA2 | MDATA if (3..=1027).contains(&len) => { + let data = &packet[1..(len - 2)]; + let crc = u16::from_le_bytes([packet[len - 2], packet[len - 1]]); + crc == crc16(data) + } + + // Handshake packets must be a single byte. + ACK | NAK | NYET | STALL | ERR if len == 1 => true, + + // Anything else is invalid. + _ => false + } +} + #[derive(Copy, Clone, Debug, PartialEq, Eq, Default, Pod, Zeroable, From, Into, Display)] #[repr(transparent)] @@ -857,7 +922,8 @@ mod tests { #[test] fn test_parse_sof() { - let p = PacketFields::from_packet(&vec![0xa5, 0xde, 0x1e]); + let packet = vec![0xa5, 0xde, 0x1e]; + let p = PacketFields::from_packet(&packet); if let PacketFields::SOF(sof) = p { assert!(sof.frame_number() == 1758); assert!(sof.crc() == 0x03); @@ -869,7 +935,9 @@ mod tests { #[test] fn test_parse_setup() { - let p = PacketFields::from_packet(&vec![0x2d, 0x02, 0xa8]); + let packet = vec![0x2d, 0x02, 0xa8]; + assert!(validate_packet(&packet)); + let p = PacketFields::from_packet(&packet); if let PacketFields::Token(tok) = p { assert!(tok.device_address() == DeviceAddr(2)); assert!(tok.endpoint_number() == EndpointNum(0)); @@ -882,7 +950,9 @@ mod tests { #[test] fn test_parse_in() { - let p = PacketFields::from_packet(&vec![0x69, 0x82, 0x18]); + let packet = vec![0x69, 0x82, 0x18]; + assert!(validate_packet(&packet)); + let p = PacketFields::from_packet(&packet); if let PacketFields::Token(tok) = p { assert!(tok.device_address() == DeviceAddr(2)); assert!(tok.endpoint_number() == EndpointNum(1)); @@ -895,7 +965,9 @@ mod tests { #[test] fn test_parse_data() { - let p = PacketFields::from_packet(&vec![0xc3, 0x40, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xd5]); + let packet = &vec![0xc3, 0x40, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xd5]; + assert!(validate_packet(&packet)); + let p = PacketFields::from_packet(&packet); if let PacketFields::Data(data) = p { assert!(data.crc == 0xd5aa); } else { From 04d25226f16bc4255b585a8ffdc5a602cbb670a8 Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Thu, 18 Jul 2024 18:29:16 +0100 Subject: [PATCH 3/8] Validate packets when generating UI summaries. --- src/capture.rs | 57 ++++++++++++++++++++++++++++--- tests/mouse/reference.txt | 2 +- tests/ui/mouse-step/reference.txt | 12 +++---- 3 files changed, 60 insertions(+), 11 deletions(-) diff --git a/src/capture.rs b/src/capture.rs index 38beeed7..f49d9e8f 100644 --- a/src/capture.rs +++ b/src/capture.rs @@ -12,7 +12,7 @@ use crate::data_stream::{ use crate::compact_index::{compact_index, CompactWriter, CompactReader}; use crate::rcu::SingleWriterRcu; use crate::vec_map::VecMap; -use crate::usb::{self, prelude::*}; +use crate::usb::{self, prelude::*, validate_packet}; use crate::util::{fmt_count, fmt_size}; use anyhow::{Context, Error, bail}; @@ -1150,14 +1150,63 @@ impl ItemSource for CaptureReader { fn summary(&mut self, item: &TrafficItem) -> Result { + use PID::*; use TrafficItem::*; use usb::StartComplete::*; Ok(match item { Packet(.., packet_id) => { let packet = self.packet(*packet_id)?; - let first_byte = *packet.first().with_context(|| format!( - "Packet {packet_id} is empty, cannot retrieve PID"))?; - let pid = PID::from(first_byte); + let len = packet.len(); + if len == 0 { + return Ok("Malformed 0-byte packet".to_string()) + } + let pid = PID::from(packet[0]); + if !validate_packet(&packet) { + let too_long = len > 1027; + return Ok(format!( + "Malformed packet{} of {len} {}: {}", + match pid { + RSVD if too_long => + " (reserved PID, and too long)".to_string(), + Malformed if too_long => + " (invalid PID, and too long)".to_string(), + RSVD => + " (reserved PID)".to_string(), + Malformed => + " (invalid PID)".to_string(), + pid if too_long => format!( + " (possibly {pid}, but too long)"), + pid => format!( + " (possibly {pid}, but {})", + match pid { + SOF|SETUP|IN|OUT|PING => { + if len != 3 { + "wrong length" + } else { + "bad CRC" + } + }, + SPLIT => { + if len != 4 { + "wrong length" + } else { + "bad CRC" + } + }, + DATA0|DATA1|DATA2|MDATA => { + if len < 3 { + "too short" + } else { + "bad CRC" + } + }, + ACK|NAK|NYET|STALL|ERR => "too long", + RSVD|Malformed => unreachable!(), + }), + }, + if len == 1 {"byte"} else {"bytes"}, + Bytes::first(100, &packet[0 .. packet.len()]))) + } format!("{pid} packet{}", match PacketFields::from_packet(&packet) { PacketFields::SOF(sof) => format!( diff --git a/tests/mouse/reference.txt b/tests/mouse/reference.txt index aaa42db1..738225ec 100644 --- a/tests/mouse/reference.txt +++ b/tests/mouse/reference.txt @@ -1,6 +1,6 @@ 1 invalid groups 1 malformed packets - Malformed packet: [FF] + Malformed packet (invalid PID) of 1 byte: [FF] Getting device descriptor #0 for device 0, reading 18 of 64 requested bytes SETUP transaction on 0.0 with 8 data bytes, ACK: [80, 06, 00, 01, 00, 00, 40, 00] SETUP packet on 0.0, CRC 02 diff --git a/tests/ui/mouse-step/reference.txt b/tests/ui/mouse-step/reference.txt index 5ccca421..b61a53ca 100644 --- a/tests/ui/mouse-step/reference.txt +++ b/tests/ui/mouse-step/reference.txt @@ -7,17 +7,17 @@ At traffic row 1: + 1 malformed packets Expanding traffic view, row 1: 1 malformed packets At traffic row 2: -+ Malformed packet: [FF] ++ Malformed packet (invalid PID) of 1 byte: [FF] Updating after 2 packets decoded At traffic row 3: + Incomplete control transfer on device 0 At traffic row 0: - 1 invalid groups - 1 malformed packets -- Malformed packet: [FF] +- Malformed packet (invalid PID) of 1 byte: [FF] + 1 invalid groups + 1 malformed packets -+ Malformed packet: [FF] ++ Malformed packet (invalid PID) of 1 byte: [FF] Expanding traffic view, row 3: Incomplete control transfer on device 0 At traffic row 4: + SETUP transaction on 0.0 @@ -181,7 +181,7 @@ At traffic row 25: At traffic row 0: - 1 invalid groups - 1 malformed packets -- Malformed packet: [FF] +- Malformed packet (invalid PID) of 1 byte: [FF] - Incomplete control transfer on device 0 - SETUP transaction on 0.0 - SETUP packet on 0.0, CRC 02 @@ -202,7 +202,7 @@ At traffic row 0: - Incomplete control transfer on device 0 + 1 invalid groups + 1 malformed packets -+ Malformed packet: [FF] ++ Malformed packet (invalid PID) of 1 byte: [FF] + Getting device descriptor #0 for device 0, reading 18 of 64 requested bytes + SETUP transaction on 0.0 with 8 data bytes, ACK: [80, 06, 00, 01, 00, 00, 40, 00] + SETUP packet on 0.0, CRC 02 @@ -689,6 +689,6 @@ At traffic row 4: - OUT transaction on 0.0 with no data, ACK Collapsing traffic view, row 0: 1 invalid groups At traffic row 2: -- Malformed packet: [FF] +- Malformed packet (invalid PID) of 1 byte: [FF] At traffic row 1: - 1 malformed packets From f35922429f91bc3eb17cccbb54a1395ca4485d48 Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Thu, 18 Jul 2024 18:55:54 +0100 Subject: [PATCH 4/8] Add test case: Cynthion analyzer test captured using a bad cable. --- tests/analyzer-test-bad-cable/capture.pcap | Bin 0 -> 281571 bytes tests/analyzer-test-bad-cable/reference.txt | 2053 +++++++++++++++++++ tests/tests.txt | 1 + 3 files changed, 2054 insertions(+) create mode 100644 tests/analyzer-test-bad-cable/capture.pcap create mode 100644 tests/analyzer-test-bad-cable/reference.txt diff --git a/tests/analyzer-test-bad-cable/capture.pcap b/tests/analyzer-test-bad-cable/capture.pcap new file mode 100644 index 0000000000000000000000000000000000000000..0870e610acf8ce78293669267833df0fc3ac3f4c GIT binary patch literal 281571 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ĩK9j{{*S(UMHmL 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 N5yR73&LMkR{|ip&{51do literal 0 HcmV?d00001 diff --git a/tests/analyzer-test-bad-cable/reference.txt b/tests/analyzer-test-bad-cable/reference.txt new file mode 100644 index 00000000..18129832 --- /dev/null +++ b/tests/analyzer-test-bad-cable/reference.txt @@ -0,0 +1,2053 @@ +37 SOF groups + 98 SOF packets + 3 times: SOF packet with frame number 180, CRC 1E + 8 times: SOF packet with frame number 181, CRC 01 + 8 times: SOF packet with frame number 182, CRC 09 + 8 times: SOF packet with frame number 183, CRC 16 + 8 times: SOF packet with frame number 184, CRC 17 + 8 times: SOF packet with frame number 185, CRC 08 + 8 times: SOF packet with frame number 186, CRC 00 + 8 times: SOF packet with frame number 187, CRC 1F + 8 times: SOF packet with frame number 188, CRC 10 + 8 times: SOF packet with frame number 189, CRC 0F + 8 times: SOF packet with frame number 190, CRC 07 + 8 times: SOF packet with frame number 191, CRC 18 + 7 times: SOF packet with frame number 192, CRC 1F + 1 SOF packets + SOF packet with frame number 192, CRC 1F + 24 SOF packets + 8 times: SOF packet with frame number 193, CRC 00 + 8 times: SOF packet with frame number 194, CRC 08 + 8 times: SOF packet with frame number 195, CRC 17 + 8 times: 1 SOF packets + SOF packet with frame number 196, CRC 18 + 8 times: 1 SOF packets + SOF packet with frame number 197, CRC 07 + 4 times: 1 SOF packets + SOF packet with frame number 198, CRC 0F + 22 SOF packets + 4 times: SOF packet with frame number 198, CRC 0F + 8 times: SOF packet with frame number 199, CRC 10 + 8 times: SOF packet with frame number 200, CRC 11 + 2 times: SOF packet with frame number 201, CRC 0E + 1 SOF packets + SOF packet with frame number 201, CRC 0E + 38 SOF packets + 5 times: SOF packet with frame number 201, CRC 0E + 8 times: SOF packet with frame number 202, CRC 06 + 8 times: SOF packet with frame number 203, CRC 19 + 8 times: SOF packet with frame number 204, CRC 16 + 8 times: SOF packet with frame number 205, CRC 09 + SOF packet with frame number 206, CRC 01 + 2 times: 1 SOF packets + SOF packet with frame number 206, CRC 01 + 14270 SOF packets + 5 times: SOF packet with frame number 206, CRC 01 + 8 times: SOF packet with frame number 207, CRC 1E + 8 times: SOF packet with frame number 208, CRC 03 + 8 times: SOF packet with frame number 209, CRC 1C + 8 times: SOF packet with frame number 210, CRC 14 + 8 times: SOF packet with frame number 211, CRC 0B + 8 times: SOF packet with frame number 212, CRC 04 + 8 times: SOF packet with frame number 213, CRC 1B + 8 times: SOF packet with frame number 214, CRC 13 + 8 times: SOF packet with frame number 215, CRC 0C + 8 times: SOF packet with frame number 216, CRC 0D + 8 times: SOF packet with frame number 217, CRC 12 + 8 times: SOF packet with frame number 218, CRC 1A + 8 times: SOF packet with frame number 219, CRC 05 + 8 times: SOF packet with frame number 220, CRC 0A + 8 times: SOF packet with frame number 221, CRC 15 + 8 times: SOF packet with frame number 222, CRC 1D + 8 times: SOF packet with frame number 223, CRC 02 + 8 times: SOF packet with frame number 224, CRC 0E + 8 times: SOF packet with frame number 225, CRC 11 + 8 times: SOF packet with frame number 226, CRC 19 + 8 times: SOF packet with frame number 227, CRC 06 + 8 times: SOF packet with frame number 228, CRC 09 + 8 times: SOF packet with frame number 229, CRC 16 + 8 times: SOF packet with frame number 230, CRC 1E + 8 times: SOF packet with frame number 231, CRC 01 + 8 times: SOF packet with frame number 232, CRC 00 + 8 times: SOF packet with frame number 233, CRC 1F + 8 times: SOF packet with frame number 234, CRC 17 + 8 times: SOF packet with frame number 235, CRC 08 + 8 times: SOF packet with frame number 236, CRC 07 + 8 times: SOF packet with frame number 237, CRC 18 + 8 times: SOF packet with frame number 238, CRC 10 + 8 times: SOF packet with frame number 239, CRC 0F + 8 times: SOF packet with frame number 240, CRC 12 + 8 times: SOF packet with frame number 241, CRC 0D + 8 times: SOF packet with frame number 242, CRC 05 + 8 times: SOF packet with frame number 243, CRC 1A + 8 times: SOF packet with frame number 244, CRC 15 + 8 times: SOF packet with frame number 245, CRC 0A + 8 times: SOF packet with frame number 246, CRC 02 + 8 times: SOF packet with frame number 247, CRC 1D + 8 times: SOF packet with frame number 248, CRC 1C + 8 times: SOF packet with frame number 249, CRC 03 + 8 times: SOF packet with frame number 250, CRC 0B + 8 times: SOF packet with frame number 251, CRC 14 + 8 times: SOF packet with frame number 252, CRC 1B + 8 times: SOF packet with frame number 253, CRC 04 + 8 times: SOF packet with frame number 254, CRC 0C + 8 times: SOF packet with frame number 255, CRC 13 + 8 times: SOF packet with frame number 256, CRC 07 + 8 times: SOF packet with frame number 257, CRC 18 + 8 times: SOF packet with frame number 258, CRC 10 + 8 times: SOF packet with frame number 259, CRC 0F + 8 times: SOF packet with frame number 260, CRC 00 + 8 times: SOF packet with frame number 261, CRC 1F + 8 times: SOF packet with frame number 262, CRC 17 + 8 times: SOF packet with frame number 263, CRC 08 + 8 times: SOF packet with frame number 264, CRC 09 + 8 times: SOF packet with frame number 265, CRC 16 + 8 times: SOF packet with frame number 266, CRC 1E + 8 times: SOF packet with frame number 267, CRC 01 + 8 times: SOF packet with frame number 268, CRC 0E + 8 times: SOF packet with frame number 269, CRC 11 + 8 times: SOF packet with frame number 270, CRC 19 + 8 times: SOF packet with frame number 271, CRC 06 + 8 times: SOF packet with frame number 272, CRC 1B + 8 times: SOF packet with frame number 273, CRC 04 + 8 times: SOF packet with frame number 274, CRC 0C + 8 times: SOF packet with frame number 275, CRC 13 + 8 times: SOF packet with frame number 276, CRC 1C + 8 times: SOF packet with frame number 277, CRC 03 + 8 times: SOF packet with frame number 278, CRC 0B + 8 times: SOF packet with frame number 279, CRC 14 + 8 times: SOF packet with frame number 280, CRC 15 + 8 times: SOF packet with frame number 281, CRC 0A + 8 times: SOF packet with frame number 282, CRC 02 + 8 times: SOF packet with frame number 283, CRC 1D + 8 times: SOF packet with frame number 284, CRC 12 + 8 times: SOF packet with frame number 285, CRC 0D + 8 times: SOF packet with frame number 286, CRC 05 + 8 times: SOF packet with frame number 287, CRC 1A + 8 times: SOF packet with frame number 288, CRC 16 + 8 times: SOF packet with frame number 289, CRC 09 + 8 times: SOF packet with frame number 290, CRC 01 + 8 times: SOF packet with frame number 291, CRC 1E + 8 times: SOF packet with frame number 292, CRC 11 + 8 times: SOF packet with frame number 293, CRC 0E + 8 times: SOF packet with frame number 294, CRC 06 + 8 times: SOF packet with frame number 295, CRC 19 + 8 times: SOF packet with frame number 296, CRC 18 + 8 times: SOF packet with frame number 297, CRC 07 + 8 times: SOF packet with frame number 298, CRC 0F + 8 times: SOF packet with frame number 299, CRC 10 + 8 times: SOF packet with frame number 300, CRC 1F + 8 times: SOF packet with frame number 301, CRC 00 + 8 times: SOF packet with frame number 302, CRC 08 + 8 times: SOF packet with frame number 303, CRC 17 + 8 times: SOF packet with frame number 304, CRC 0A + 8 times: SOF packet with frame number 305, CRC 15 + 8 times: SOF packet with frame number 306, CRC 1D + 8 times: SOF packet with frame number 307, CRC 02 + 8 times: SOF packet with frame number 308, CRC 0D + 8 times: SOF packet with frame number 309, CRC 12 + 8 times: SOF packet with frame number 310, CRC 1A + 8 times: SOF packet with frame number 311, CRC 05 + 8 times: SOF packet with frame number 312, CRC 04 + 8 times: SOF packet with frame number 313, CRC 1B + 8 times: SOF packet with frame number 314, CRC 13 + 8 times: SOF packet with frame number 315, CRC 0C + 8 times: SOF packet with frame number 316, CRC 03 + 8 times: SOF packet with frame number 317, CRC 1C + 8 times: SOF packet with frame number 318, CRC 14 + 8 times: SOF packet with frame number 319, CRC 0B + 8 times: SOF packet with frame number 320, CRC 0C + 8 times: SOF packet with frame number 321, CRC 13 + 8 times: SOF packet with frame number 322, CRC 1B + 8 times: SOF packet with frame number 323, CRC 04 + 8 times: SOF packet with frame number 324, CRC 0B + 8 times: SOF packet with frame number 325, CRC 14 + 8 times: SOF packet with frame number 326, CRC 1C + 8 times: SOF packet with frame number 327, CRC 03 + 8 times: SOF packet with frame number 328, CRC 02 + 8 times: SOF packet with frame number 329, CRC 1D + 8 times: SOF packet with frame number 330, CRC 15 + 8 times: SOF packet with frame number 331, CRC 0A + 8 times: SOF packet with frame number 332, CRC 05 + 8 times: SOF packet with frame number 333, CRC 1A + 8 times: SOF packet with frame number 334, CRC 12 + 8 times: SOF packet with frame number 335, CRC 0D + 8 times: SOF packet with frame number 336, CRC 10 + 8 times: SOF packet with frame number 337, CRC 0F + 8 times: SOF packet with frame number 338, CRC 07 + 8 times: SOF packet with frame number 339, CRC 18 + 8 times: SOF packet with frame number 340, CRC 17 + 8 times: SOF packet with frame number 341, CRC 08 + 8 times: SOF packet with frame number 342, CRC 00 + 8 times: SOF packet with frame number 343, CRC 1F + 8 times: SOF packet with frame number 344, CRC 1E + 8 times: SOF packet with frame number 345, CRC 01 + 8 times: SOF packet with frame number 346, CRC 09 + 8 times: SOF packet with frame number 347, CRC 16 + 8 times: SOF packet with frame number 348, CRC 19 + 8 times: SOF packet with frame number 349, CRC 06 + 8 times: SOF packet with frame number 350, CRC 0E + 8 times: SOF packet with frame number 351, CRC 11 + 8 times: SOF packet with frame number 352, CRC 1D + 8 times: SOF packet with frame number 353, CRC 02 + 8 times: SOF packet with frame number 354, CRC 0A + 8 times: SOF packet with frame number 355, CRC 15 + 8 times: SOF packet with frame number 356, CRC 1A + 8 times: SOF packet with frame number 357, CRC 05 + 8 times: SOF packet with frame number 358, CRC 0D + 8 times: SOF packet with frame number 359, CRC 12 + 8 times: SOF packet with frame number 360, CRC 13 + 8 times: SOF packet with frame number 361, CRC 0C + 8 times: SOF packet with frame number 362, CRC 04 + 8 times: SOF packet with frame number 363, CRC 1B + 8 times: SOF packet with frame number 364, CRC 14 + 8 times: SOF packet with frame number 365, CRC 0B + 8 times: SOF packet with frame number 366, CRC 03 + 8 times: SOF packet with frame number 367, CRC 1C + 8 times: SOF packet with frame number 368, CRC 01 + 8 times: SOF packet with frame number 369, CRC 1E + 8 times: SOF packet with frame number 370, CRC 16 + 8 times: SOF packet with frame number 371, CRC 09 + 8 times: SOF packet with frame number 372, CRC 06 + 8 times: SOF packet with frame number 373, CRC 19 + 8 times: SOF packet with frame number 374, CRC 11 + 8 times: SOF packet with frame number 375, CRC 0E + 8 times: SOF packet with frame number 376, CRC 0F + 8 times: SOF packet with frame number 377, CRC 10 + 8 times: SOF packet with frame number 378, CRC 18 + 8 times: SOF packet with frame number 379, CRC 07 + 8 times: SOF packet with frame number 380, CRC 08 + 8 times: SOF packet with frame number 381, CRC 17 + 8 times: SOF packet with frame number 382, CRC 1F + 8 times: SOF packet with frame number 383, CRC 00 + 8 times: SOF packet with frame number 384, CRC 11 + 8 times: SOF packet with frame number 385, CRC 0E + 8 times: SOF packet with frame number 386, CRC 06 + 8 times: SOF packet with frame number 387, CRC 19 + 8 times: SOF packet with frame number 388, CRC 16 + 8 times: SOF packet with frame number 389, CRC 09 + 8 times: SOF packet with frame number 390, CRC 01 + 8 times: SOF packet with frame number 391, CRC 1E + 8 times: SOF packet with frame number 392, CRC 1F + 8 times: SOF packet with frame number 393, CRC 00 + 8 times: SOF packet with frame number 394, CRC 08 + 8 times: SOF packet with frame number 395, CRC 17 + 8 times: SOF packet with frame number 396, CRC 18 + 8 times: SOF packet with frame number 397, CRC 07 + 8 times: SOF packet with frame number 398, CRC 0F + 8 times: SOF packet with frame number 399, CRC 10 + 8 times: SOF packet with frame number 400, CRC 0D + 8 times: SOF packet with frame number 401, CRC 12 + 8 times: SOF packet with frame number 402, CRC 1A + 8 times: SOF packet with frame number 403, CRC 05 + 8 times: SOF packet with frame number 404, CRC 0A + 8 times: SOF packet with frame number 405, CRC 15 + 8 times: SOF packet with frame number 406, CRC 1D + 8 times: SOF packet with frame number 407, CRC 02 + 8 times: SOF packet with frame number 408, CRC 03 + 8 times: SOF packet with frame number 409, CRC 1C + 8 times: SOF packet with frame number 410, CRC 14 + 8 times: SOF packet with frame number 411, CRC 0B + 8 times: SOF packet with frame number 412, CRC 04 + 8 times: SOF packet with frame number 413, CRC 1B + 8 times: SOF packet with frame number 414, CRC 13 + 8 times: SOF packet with frame number 415, CRC 0C + 8 times: SOF packet with frame number 416, CRC 00 + 8 times: SOF packet with frame number 417, CRC 1F + 8 times: SOF packet with frame number 418, CRC 17 + 8 times: SOF packet with frame number 419, CRC 08 + 8 times: SOF packet with frame number 420, CRC 07 + 8 times: SOF packet with frame number 421, CRC 18 + 8 times: SOF packet with frame number 422, CRC 10 + 8 times: SOF packet with frame number 423, CRC 0F + 8 times: SOF packet with frame number 424, CRC 0E + 8 times: SOF packet with frame number 425, CRC 11 + 8 times: SOF packet with frame number 426, CRC 19 + 8 times: SOF packet with frame number 427, CRC 06 + 8 times: SOF packet with frame number 428, CRC 09 + 8 times: SOF packet with frame number 429, CRC 16 + 8 times: SOF packet with frame number 430, CRC 1E + 8 times: SOF packet with frame number 431, CRC 01 + 8 times: SOF packet with frame number 432, CRC 1C + 8 times: SOF packet with frame number 433, CRC 03 + 8 times: SOF packet with frame number 434, CRC 0B + 8 times: SOF packet with frame number 435, CRC 14 + 8 times: SOF packet with frame number 436, CRC 1B + 8 times: SOF packet with frame number 437, CRC 04 + 8 times: SOF packet with frame number 438, CRC 0C + 8 times: SOF packet with frame number 439, CRC 13 + 8 times: SOF packet with frame number 440, CRC 12 + 8 times: SOF packet with frame number 441, CRC 0D + 8 times: SOF packet with frame number 442, CRC 05 + 8 times: SOF packet with frame number 443, CRC 1A + 8 times: SOF packet with frame number 444, CRC 15 + 8 times: SOF packet with frame number 445, CRC 0A + 8 times: SOF packet with frame number 446, CRC 02 + 8 times: SOF packet with frame number 447, CRC 1D + 8 times: SOF packet with frame number 448, CRC 1A + 8 times: SOF packet with frame number 449, CRC 05 + 8 times: SOF packet with frame number 450, CRC 0D + 8 times: SOF packet with frame number 451, CRC 12 + 8 times: SOF packet with frame number 452, CRC 1D + 8 times: SOF packet with frame number 453, CRC 02 + 8 times: SOF packet with frame number 454, CRC 0A + 8 times: SOF packet with frame number 455, CRC 15 + 8 times: SOF packet with frame number 456, CRC 14 + 8 times: SOF packet with frame number 457, CRC 0B + 8 times: SOF packet with frame number 458, CRC 03 + 8 times: SOF packet with frame number 459, CRC 1C + 8 times: SOF packet with frame number 460, CRC 13 + 8 times: SOF packet with frame number 461, CRC 0C + 8 times: SOF packet with frame number 462, CRC 04 + 8 times: SOF packet with frame number 463, CRC 1B + 8 times: SOF packet with frame number 464, CRC 06 + 8 times: SOF packet with frame number 465, CRC 19 + 8 times: SOF packet with frame number 466, CRC 11 + 8 times: SOF packet with frame number 467, CRC 0E + 8 times: SOF packet with frame number 468, CRC 01 + 8 times: SOF packet with frame number 469, CRC 1E + 8 times: SOF packet with frame number 470, CRC 16 + 8 times: SOF packet with frame number 471, CRC 09 + 8 times: SOF packet with frame number 472, CRC 08 + 8 times: SOF packet with frame number 473, CRC 17 + 8 times: SOF packet with frame number 474, CRC 1F + 8 times: SOF packet with frame number 475, CRC 00 + 8 times: SOF packet with frame number 476, CRC 0F + 8 times: SOF packet with frame number 477, CRC 10 + 8 times: SOF packet with frame number 478, CRC 18 + 8 times: SOF packet with frame number 479, CRC 07 + 8 times: SOF packet with frame number 480, CRC 0B + 8 times: SOF packet with frame number 481, CRC 14 + 8 times: SOF packet with frame number 482, CRC 1C + 8 times: SOF packet with frame number 483, CRC 03 + 8 times: SOF packet with frame number 484, CRC 0C + 8 times: SOF packet with frame number 485, CRC 13 + 8 times: SOF packet with frame number 486, CRC 1B + 8 times: SOF packet with frame number 487, CRC 04 + 8 times: SOF packet with frame number 488, CRC 05 + 8 times: SOF packet with frame number 489, CRC 1A + 8 times: SOF packet with frame number 490, CRC 12 + 8 times: SOF packet with frame number 491, CRC 0D + 8 times: SOF packet with frame number 492, CRC 02 + 8 times: SOF packet with frame number 493, CRC 1D + 8 times: SOF packet with frame number 494, CRC 15 + 8 times: SOF packet with frame number 495, CRC 0A + 8 times: SOF packet with frame number 496, CRC 17 + 8 times: SOF packet with frame number 497, CRC 08 + 8 times: SOF packet with frame number 498, CRC 00 + 8 times: SOF packet with frame number 499, CRC 1F + 8 times: SOF packet with frame number 500, CRC 10 + 8 times: SOF packet with frame number 501, CRC 0F + 8 times: SOF packet with frame number 502, CRC 07 + 8 times: SOF packet with frame number 503, CRC 18 + 8 times: SOF packet with frame number 504, CRC 19 + 8 times: SOF packet with frame number 505, CRC 06 + 8 times: SOF packet with frame number 506, CRC 0E + 8 times: SOF packet with frame number 507, CRC 11 + 8 times: SOF packet with frame number 508, CRC 1E + 8 times: SOF packet with frame number 509, CRC 01 + 8 times: SOF packet with frame number 510, CRC 09 + 8 times: SOF packet with frame number 511, CRC 16 + 8 times: SOF packet with frame number 512, CRC 08 + 8 times: SOF packet with frame number 513, CRC 17 + 8 times: SOF packet with frame number 514, CRC 1F + 8 times: SOF packet with frame number 515, CRC 00 + 8 times: SOF packet with frame number 516, CRC 0F + 8 times: SOF packet with frame number 517, CRC 10 + 8 times: SOF packet with frame number 518, CRC 18 + 8 times: SOF packet with frame number 519, CRC 07 + 8 times: SOF packet with frame number 520, CRC 06 + 8 times: SOF packet with frame number 521, CRC 19 + 8 times: SOF packet with frame number 522, CRC 11 + 8 times: SOF packet with frame number 523, CRC 0E + 8 times: SOF packet with frame number 524, CRC 01 + 8 times: SOF packet with frame number 525, CRC 1E + 8 times: SOF packet with frame number 526, CRC 16 + 8 times: SOF packet with frame number 527, CRC 09 + 8 times: SOF packet with frame number 528, CRC 14 + 8 times: SOF packet with frame number 529, CRC 0B + 8 times: SOF packet with frame number 530, CRC 03 + 8 times: SOF packet with frame number 531, CRC 1C + 8 times: SOF packet with frame number 532, CRC 13 + 8 times: SOF packet with frame number 533, CRC 0C + 8 times: SOF packet with frame number 534, CRC 04 + 8 times: SOF packet with frame number 535, CRC 1B + 8 times: SOF packet with frame number 536, CRC 1A + 8 times: SOF packet with frame number 537, CRC 05 + 8 times: SOF packet with frame number 538, CRC 0D + 8 times: SOF packet with frame number 539, CRC 12 + 8 times: SOF packet with frame number 540, CRC 1D + 8 times: SOF packet with frame number 541, CRC 02 + 8 times: SOF packet with frame number 542, CRC 0A + 8 times: SOF packet with frame number 543, CRC 15 + 8 times: SOF packet with frame number 544, CRC 19 + 8 times: SOF packet with frame number 545, CRC 06 + 8 times: SOF packet with frame number 546, CRC 0E + 8 times: SOF packet with frame number 547, CRC 11 + 8 times: SOF packet with frame number 548, CRC 1E + 8 times: SOF packet with frame number 549, CRC 01 + 8 times: SOF packet with frame number 550, CRC 09 + 8 times: SOF packet with frame number 551, CRC 16 + 8 times: SOF packet with frame number 552, CRC 17 + 8 times: SOF packet with frame number 553, CRC 08 + 8 times: SOF packet with frame number 554, CRC 00 + 8 times: SOF packet with frame number 555, CRC 1F + 8 times: SOF packet with frame number 556, CRC 10 + 8 times: SOF packet with frame number 557, CRC 0F + 8 times: SOF packet with frame number 558, CRC 07 + 8 times: SOF packet with frame number 559, CRC 18 + 8 times: SOF packet with frame number 560, CRC 05 + 8 times: SOF packet with frame number 561, CRC 1A + 8 times: SOF packet with frame number 562, CRC 12 + 8 times: SOF packet with frame number 563, CRC 0D + 8 times: SOF packet with frame number 564, CRC 02 + 8 times: SOF packet with frame number 565, CRC 1D + 8 times: SOF packet with frame number 566, CRC 15 + 8 times: SOF packet with frame number 567, CRC 0A + 8 times: SOF packet with frame number 568, CRC 0B + 8 times: SOF packet with frame number 569, CRC 14 + 8 times: SOF packet with frame number 570, CRC 1C + 8 times: SOF packet with frame number 571, CRC 03 + 8 times: SOF packet with frame number 572, CRC 0C + 8 times: SOF packet with frame number 573, CRC 13 + 8 times: SOF packet with frame number 574, CRC 1B + 8 times: SOF packet with frame number 575, CRC 04 + 8 times: SOF packet with frame number 576, CRC 03 + 8 times: SOF packet with frame number 577, CRC 1C + 8 times: SOF packet with frame number 578, CRC 14 + 8 times: SOF packet with frame number 579, CRC 0B + 8 times: SOF packet with frame number 580, CRC 04 + 8 times: SOF packet with frame number 581, CRC 1B + 8 times: SOF packet with frame number 582, CRC 13 + 8 times: SOF packet with frame number 583, CRC 0C + 8 times: SOF packet with frame number 584, CRC 0D + 8 times: SOF packet with frame number 585, CRC 12 + 8 times: SOF packet with frame number 586, CRC 1A + 8 times: SOF packet with frame number 587, CRC 05 + 8 times: SOF packet with frame number 588, CRC 0A + 8 times: SOF packet with frame number 589, CRC 15 + 8 times: SOF packet with frame number 590, CRC 1D + 8 times: SOF packet with frame number 591, CRC 02 + 8 times: SOF packet with frame number 592, CRC 1F + 8 times: SOF packet with frame number 593, CRC 00 + 8 times: SOF packet with frame number 594, CRC 08 + 8 times: SOF packet with frame number 595, CRC 17 + 8 times: SOF packet with frame number 596, CRC 18 + 8 times: SOF packet with frame number 597, CRC 07 + 8 times: SOF packet with frame number 598, CRC 0F + 8 times: SOF packet with frame number 599, CRC 10 + 8 times: SOF packet with frame number 600, CRC 11 + 8 times: SOF packet with frame number 601, CRC 0E + 8 times: SOF packet with frame number 602, CRC 06 + 8 times: SOF packet with frame number 603, CRC 19 + 8 times: SOF packet with frame number 604, CRC 16 + 8 times: SOF packet with frame number 605, CRC 09 + 8 times: SOF packet with frame number 606, CRC 01 + 8 times: SOF packet with frame number 607, CRC 1E + 8 times: SOF packet with frame number 608, CRC 12 + 8 times: SOF packet with frame number 609, CRC 0D + 8 times: SOF packet with frame number 610, CRC 05 + 8 times: SOF packet with frame number 611, CRC 1A + 8 times: SOF packet with frame number 612, CRC 15 + 8 times: SOF packet with frame number 613, CRC 0A + 8 times: SOF packet with frame number 614, CRC 02 + 8 times: SOF packet with frame number 615, CRC 1D + 8 times: SOF packet with frame number 616, CRC 1C + 8 times: SOF packet with frame number 617, CRC 03 + 8 times: SOF packet with frame number 618, CRC 0B + 8 times: SOF packet with frame number 619, CRC 14 + 8 times: SOF packet with frame number 620, CRC 1B + 8 times: SOF packet with frame number 621, CRC 04 + 8 times: SOF packet with frame number 622, CRC 0C + 8 times: SOF packet with frame number 623, CRC 13 + 8 times: SOF packet with frame number 624, CRC 0E + 8 times: SOF packet with frame number 625, CRC 11 + 8 times: SOF packet with frame number 626, CRC 19 + 8 times: SOF packet with frame number 627, CRC 06 + 8 times: SOF packet with frame number 628, CRC 09 + 8 times: SOF packet with frame number 629, CRC 16 + 8 times: SOF packet with frame number 630, CRC 1E + 8 times: SOF packet with frame number 631, CRC 01 + 8 times: SOF packet with frame number 632, CRC 00 + 8 times: SOF packet with frame number 633, CRC 1F + 8 times: SOF packet with frame number 634, CRC 17 + 8 times: SOF packet with frame number 635, CRC 08 + 8 times: SOF packet with frame number 636, CRC 07 + 8 times: SOF packet with frame number 637, CRC 18 + 8 times: SOF packet with frame number 638, CRC 10 + 8 times: SOF packet with frame number 639, CRC 0F + 8 times: SOF packet with frame number 640, CRC 1E + 8 times: SOF packet with frame number 641, CRC 01 + 8 times: SOF packet with frame number 642, CRC 09 + 8 times: SOF packet with frame number 643, CRC 16 + 8 times: SOF packet with frame number 644, CRC 19 + 8 times: SOF packet with frame number 645, CRC 06 + 8 times: SOF packet with frame number 646, CRC 0E + 8 times: SOF packet with frame number 647, CRC 11 + 8 times: SOF packet with frame number 648, CRC 10 + 8 times: SOF packet with frame number 649, CRC 0F + 8 times: SOF packet with frame number 650, CRC 07 + 8 times: SOF packet with frame number 651, CRC 18 + 8 times: SOF packet with frame number 652, CRC 17 + 8 times: SOF packet with frame number 653, CRC 08 + 8 times: SOF packet with frame number 654, CRC 00 + 8 times: SOF packet with frame number 655, CRC 1F + 8 times: SOF packet with frame number 656, CRC 02 + 8 times: SOF packet with frame number 657, CRC 1D + 8 times: SOF packet with frame number 658, CRC 15 + 8 times: SOF packet with frame number 659, CRC 0A + 8 times: SOF packet with frame number 660, CRC 05 + 8 times: SOF packet with frame number 661, CRC 1A + 8 times: SOF packet with frame number 662, CRC 12 + 8 times: SOF packet with frame number 663, CRC 0D + 8 times: SOF packet with frame number 664, CRC 0C + 8 times: SOF packet with frame number 665, CRC 13 + 8 times: SOF packet with frame number 666, CRC 1B + 8 times: SOF packet with frame number 667, CRC 04 + 8 times: SOF packet with frame number 668, CRC 0B + 8 times: SOF packet with frame number 669, CRC 14 + 8 times: SOF packet with frame number 670, CRC 1C + 8 times: SOF packet with frame number 671, CRC 03 + 8 times: SOF packet with frame number 672, CRC 0F + 8 times: SOF packet with frame number 673, CRC 10 + 8 times: SOF packet with frame number 674, CRC 18 + 8 times: SOF packet with frame number 675, CRC 07 + 8 times: SOF packet with frame number 676, CRC 08 + 8 times: SOF packet with frame number 677, CRC 17 + 8 times: SOF packet with frame number 678, CRC 1F + 8 times: SOF packet with frame number 679, CRC 00 + 8 times: SOF packet with frame number 680, CRC 01 + 8 times: SOF packet with frame number 681, CRC 1E + 8 times: SOF packet with frame number 682, CRC 16 + 8 times: SOF packet with frame number 683, CRC 09 + 8 times: SOF packet with frame number 684, CRC 06 + 8 times: SOF packet with frame number 685, CRC 19 + 8 times: SOF packet with frame number 686, CRC 11 + 8 times: SOF packet with frame number 687, CRC 0E + 8 times: SOF packet with frame number 688, CRC 13 + 8 times: SOF packet with frame number 689, CRC 0C + 8 times: SOF packet with frame number 690, CRC 04 + 8 times: SOF packet with frame number 691, CRC 1B + 8 times: SOF packet with frame number 692, CRC 14 + 8 times: SOF packet with frame number 693, CRC 0B + 8 times: SOF packet with frame number 694, CRC 03 + 8 times: SOF packet with frame number 695, CRC 1C + 8 times: SOF packet with frame number 696, CRC 1D + 8 times: SOF packet with frame number 697, CRC 02 + 8 times: SOF packet with frame number 698, CRC 0A + 8 times: SOF packet with frame number 699, CRC 15 + 8 times: SOF packet with frame number 700, CRC 1A + 8 times: SOF packet with frame number 701, CRC 05 + 8 times: SOF packet with frame number 702, CRC 0D + 8 times: SOF packet with frame number 703, CRC 12 + 8 times: SOF packet with frame number 704, CRC 15 + 8 times: SOF packet with frame number 705, CRC 0A + 8 times: SOF packet with frame number 706, CRC 02 + 8 times: SOF packet with frame number 707, CRC 1D + 8 times: SOF packet with frame number 708, CRC 12 + 8 times: SOF packet with frame number 709, CRC 0D + 8 times: SOF packet with frame number 710, CRC 05 + 8 times: SOF packet with frame number 711, CRC 1A + 8 times: SOF packet with frame number 712, CRC 1B + 8 times: SOF packet with frame number 713, CRC 04 + 8 times: SOF packet with frame number 714, CRC 0C + 8 times: SOF packet with frame number 715, CRC 13 + 8 times: SOF packet with frame number 716, CRC 1C + 8 times: SOF packet with frame number 717, CRC 03 + 8 times: SOF packet with frame number 718, CRC 0B + 8 times: SOF packet with frame number 719, CRC 14 + 8 times: SOF packet with frame number 720, CRC 09 + 8 times: SOF packet with frame number 721, CRC 16 + 8 times: SOF packet with frame number 722, CRC 1E + 8 times: SOF packet with frame number 723, CRC 01 + 8 times: SOF packet with frame number 724, CRC 0E + 8 times: SOF packet with frame number 725, CRC 11 + 8 times: SOF packet with frame number 726, CRC 19 + 8 times: SOF packet with frame number 727, CRC 06 + 8 times: SOF packet with frame number 728, CRC 07 + 8 times: SOF packet with frame number 729, CRC 18 + 8 times: SOF packet with frame number 730, CRC 10 + 8 times: SOF packet with frame number 731, CRC 0F + 8 times: SOF packet with frame number 732, CRC 00 + 8 times: SOF packet with frame number 733, CRC 1F + 8 times: SOF packet with frame number 734, CRC 17 + 8 times: SOF packet with frame number 735, CRC 08 + 8 times: SOF packet with frame number 736, CRC 04 + 8 times: SOF packet with frame number 737, CRC 1B + 8 times: SOF packet with frame number 738, CRC 13 + 8 times: SOF packet with frame number 739, CRC 0C + 8 times: SOF packet with frame number 740, CRC 03 + 8 times: SOF packet with frame number 741, CRC 1C + 8 times: SOF packet with frame number 742, CRC 14 + 8 times: SOF packet with frame number 743, CRC 0B + 8 times: SOF packet with frame number 744, CRC 0A + 8 times: SOF packet with frame number 745, CRC 15 + 8 times: SOF packet with frame number 746, CRC 1D + 8 times: SOF packet with frame number 747, CRC 02 + 8 times: SOF packet with frame number 748, CRC 0D + 8 times: SOF packet with frame number 749, CRC 12 + 8 times: SOF packet with frame number 750, CRC 1A + 8 times: SOF packet with frame number 751, CRC 05 + 8 times: SOF packet with frame number 752, CRC 18 + 8 times: SOF packet with frame number 753, CRC 07 + 8 times: SOF packet with frame number 754, CRC 0F + 8 times: SOF packet with frame number 755, CRC 10 + 8 times: SOF packet with frame number 756, CRC 1F + 8 times: SOF packet with frame number 757, CRC 00 + 8 times: SOF packet with frame number 758, CRC 08 + 8 times: SOF packet with frame number 759, CRC 17 + 8 times: SOF packet with frame number 760, CRC 16 + 8 times: SOF packet with frame number 761, CRC 09 + 8 times: SOF packet with frame number 762, CRC 01 + 8 times: SOF packet with frame number 763, CRC 1E + 8 times: SOF packet with frame number 764, CRC 11 + 8 times: SOF packet with frame number 765, CRC 0E + 8 times: SOF packet with frame number 766, CRC 06 + 8 times: SOF packet with frame number 767, CRC 19 + 8 times: SOF packet with frame number 768, CRC 0D + 8 times: SOF packet with frame number 769, CRC 12 + 8 times: SOF packet with frame number 770, CRC 1A + 8 times: SOF packet with frame number 771, CRC 05 + 8 times: SOF packet with frame number 772, CRC 0A + 8 times: SOF packet with frame number 773, CRC 15 + 8 times: SOF packet with frame number 774, CRC 1D + 8 times: SOF packet with frame number 775, CRC 02 + 8 times: SOF packet with frame number 776, CRC 03 + 8 times: SOF packet with frame number 777, CRC 1C + 8 times: SOF packet with frame number 778, CRC 14 + 8 times: SOF packet with frame number 779, CRC 0B + 8 times: SOF packet with frame number 780, CRC 04 + 8 times: SOF packet with frame number 781, CRC 1B + 8 times: SOF packet with frame number 782, CRC 13 + 8 times: SOF packet with frame number 783, CRC 0C + 8 times: SOF packet with frame number 784, CRC 11 + 8 times: SOF packet with frame number 785, CRC 0E + 8 times: SOF packet with frame number 786, CRC 06 + 8 times: SOF packet with frame number 787, CRC 19 + 8 times: SOF packet with frame number 788, CRC 16 + 8 times: SOF packet with frame number 789, CRC 09 + 8 times: SOF packet with frame number 790, CRC 01 + 8 times: SOF packet with frame number 791, CRC 1E + 8 times: SOF packet with frame number 792, CRC 1F + 8 times: SOF packet with frame number 793, CRC 00 + 8 times: SOF packet with frame number 794, CRC 08 + 8 times: SOF packet with frame number 795, CRC 17 + 8 times: SOF packet with frame number 796, CRC 18 + 8 times: SOF packet with frame number 797, CRC 07 + 8 times: SOF packet with frame number 798, CRC 0F + 8 times: SOF packet with frame number 799, CRC 10 + 8 times: SOF packet with frame number 800, CRC 1C + 8 times: SOF packet with frame number 801, CRC 03 + 8 times: SOF packet with frame number 802, CRC 0B + 8 times: SOF packet with frame number 803, CRC 14 + 8 times: SOF packet with frame number 804, CRC 1B + 8 times: SOF packet with frame number 805, CRC 04 + 8 times: SOF packet with frame number 806, CRC 0C + 8 times: SOF packet with frame number 807, CRC 13 + 8 times: SOF packet with frame number 808, CRC 12 + 8 times: SOF packet with frame number 809, CRC 0D + 8 times: SOF packet with frame number 810, CRC 05 + 8 times: SOF packet with frame number 811, CRC 1A + 8 times: SOF packet with frame number 812, CRC 15 + 8 times: SOF packet with frame number 813, CRC 0A + 8 times: SOF packet with frame number 814, CRC 02 + 8 times: SOF packet with frame number 815, CRC 1D + 8 times: SOF packet with frame number 816, CRC 00 + 8 times: SOF packet with frame number 817, CRC 1F + 8 times: SOF packet with frame number 818, CRC 17 + 8 times: SOF packet with frame number 819, CRC 08 + 8 times: SOF packet with frame number 820, CRC 07 + 8 times: SOF packet with frame number 821, CRC 18 + 8 times: SOF packet with frame number 822, CRC 10 + 8 times: SOF packet with frame number 823, CRC 0F + 8 times: SOF packet with frame number 824, CRC 0E + 8 times: SOF packet with frame number 825, CRC 11 + 8 times: SOF packet with frame number 826, CRC 19 + 8 times: SOF packet with frame number 827, CRC 06 + 8 times: SOF packet with frame number 828, CRC 09 + 8 times: SOF packet with frame number 829, CRC 16 + 8 times: SOF packet with frame number 830, CRC 1E + 8 times: SOF packet with frame number 831, CRC 01 + 8 times: SOF packet with frame number 832, CRC 06 + 8 times: SOF packet with frame number 833, CRC 19 + 8 times: SOF packet with frame number 834, CRC 11 + 8 times: SOF packet with frame number 835, CRC 0E + 8 times: SOF packet with frame number 836, CRC 01 + 8 times: SOF packet with frame number 837, CRC 1E + 8 times: SOF packet with frame number 838, CRC 16 + 8 times: SOF packet with frame number 839, CRC 09 + 8 times: SOF packet with frame number 840, CRC 08 + 8 times: SOF packet with frame number 841, CRC 17 + 8 times: SOF packet with frame number 842, CRC 1F + 8 times: SOF packet with frame number 843, CRC 00 + 8 times: SOF packet with frame number 844, CRC 0F + 8 times: SOF packet with frame number 845, CRC 10 + 8 times: SOF packet with frame number 846, CRC 18 + 8 times: SOF packet with frame number 847, CRC 07 + 8 times: SOF packet with frame number 848, CRC 1A + 8 times: SOF packet with frame number 849, CRC 05 + 8 times: SOF packet with frame number 850, CRC 0D + 8 times: SOF packet with frame number 851, CRC 12 + 8 times: SOF packet with frame number 852, CRC 1D + 8 times: SOF packet with frame number 853, CRC 02 + 8 times: SOF packet with frame number 854, CRC 0A + 8 times: SOF packet with frame number 855, CRC 15 + 8 times: SOF packet with frame number 856, CRC 14 + 8 times: SOF packet with frame number 857, CRC 0B + 8 times: SOF packet with frame number 858, CRC 03 + 8 times: SOF packet with frame number 859, CRC 1C + 8 times: SOF packet with frame number 860, CRC 13 + 8 times: SOF packet with frame number 861, CRC 0C + 8 times: SOF packet with frame number 862, CRC 04 + 8 times: SOF packet with frame number 863, CRC 1B + 8 times: SOF packet with frame number 864, CRC 17 + 8 times: SOF packet with frame number 865, CRC 08 + 8 times: SOF packet with frame number 866, CRC 00 + 8 times: SOF packet with frame number 867, CRC 1F + 8 times: SOF packet with frame number 868, CRC 10 + 8 times: SOF packet with frame number 869, CRC 0F + 8 times: SOF packet with frame number 870, CRC 07 + 8 times: SOF packet with frame number 871, CRC 18 + 8 times: SOF packet with frame number 872, CRC 19 + 8 times: SOF packet with frame number 873, CRC 06 + 8 times: SOF packet with frame number 874, CRC 0E + 8 times: SOF packet with frame number 875, CRC 11 + 8 times: SOF packet with frame number 876, CRC 1E + 8 times: SOF packet with frame number 877, CRC 01 + 8 times: SOF packet with frame number 878, CRC 09 + 8 times: SOF packet with frame number 879, CRC 16 + 8 times: SOF packet with frame number 880, CRC 0B + 8 times: SOF packet with frame number 881, CRC 14 + 8 times: SOF packet with frame number 882, CRC 1C + 8 times: SOF packet with frame number 883, CRC 03 + 8 times: SOF packet with frame number 884, CRC 0C + 8 times: SOF packet with frame number 885, CRC 13 + 8 times: SOF packet with frame number 886, CRC 1B + 8 times: SOF packet with frame number 887, CRC 04 + 8 times: SOF packet with frame number 888, CRC 05 + 8 times: SOF packet with frame number 889, CRC 1A + 8 times: SOF packet with frame number 890, CRC 12 + 8 times: SOF packet with frame number 891, CRC 0D + 8 times: SOF packet with frame number 892, CRC 02 + 8 times: SOF packet with frame number 893, CRC 1D + 8 times: SOF packet with frame number 894, CRC 15 + 8 times: SOF packet with frame number 895, CRC 0A + 8 times: SOF packet with frame number 896, CRC 1B + 8 times: SOF packet with frame number 897, CRC 04 + 8 times: SOF packet with frame number 898, CRC 0C + 8 times: SOF packet with frame number 899, CRC 13 + 8 times: SOF packet with frame number 900, CRC 1C + 8 times: SOF packet with frame number 901, CRC 03 + 8 times: SOF packet with frame number 902, CRC 0B + 8 times: SOF packet with frame number 903, CRC 14 + 8 times: SOF packet with frame number 904, CRC 15 + 8 times: SOF packet with frame number 905, CRC 0A + 8 times: SOF packet with frame number 906, CRC 02 + 8 times: SOF packet with frame number 907, CRC 1D + 8 times: SOF packet with frame number 908, CRC 12 + 8 times: SOF packet with frame number 909, CRC 0D + 8 times: SOF packet with frame number 910, CRC 05 + 8 times: SOF packet with frame number 911, CRC 1A + 8 times: SOF packet with frame number 912, CRC 07 + 8 times: SOF packet with frame number 913, CRC 18 + 8 times: SOF packet with frame number 914, CRC 10 + 8 times: SOF packet with frame number 915, CRC 0F + 8 times: SOF packet with frame number 916, CRC 00 + 8 times: SOF packet with frame number 917, CRC 1F + 8 times: SOF packet with frame number 918, CRC 17 + 8 times: SOF packet with frame number 919, CRC 08 + 8 times: SOF packet with frame number 920, CRC 09 + 8 times: SOF packet with frame number 921, CRC 16 + 8 times: SOF packet with frame number 922, CRC 1E + 8 times: SOF packet with frame number 923, CRC 01 + 8 times: SOF packet with frame number 924, CRC 0E + 8 times: SOF packet with frame number 925, CRC 11 + 8 times: SOF packet with frame number 926, CRC 19 + 8 times: SOF packet with frame number 927, CRC 06 + 8 times: SOF packet with frame number 928, CRC 0A + 8 times: SOF packet with frame number 929, CRC 15 + 8 times: SOF packet with frame number 930, CRC 1D + 8 times: SOF packet with frame number 931, CRC 02 + 8 times: SOF packet with frame number 932, CRC 0D + 8 times: SOF packet with frame number 933, CRC 12 + 8 times: SOF packet with frame number 934, CRC 1A + 8 times: SOF packet with frame number 935, CRC 05 + 8 times: SOF packet with frame number 936, CRC 04 + 8 times: SOF packet with frame number 937, CRC 1B + 8 times: SOF packet with frame number 938, CRC 13 + 8 times: SOF packet with frame number 939, CRC 0C + 8 times: SOF packet with frame number 940, CRC 03 + 8 times: SOF packet with frame number 941, CRC 1C + 8 times: SOF packet with frame number 942, CRC 14 + 8 times: SOF packet with frame number 943, CRC 0B + 8 times: SOF packet with frame number 944, CRC 16 + 8 times: SOF packet with frame number 945, CRC 09 + 8 times: SOF packet with frame number 946, CRC 01 + 8 times: SOF packet with frame number 947, CRC 1E + 8 times: SOF packet with frame number 948, CRC 11 + 8 times: SOF packet with frame number 949, CRC 0E + 8 times: SOF packet with frame number 950, CRC 06 + 8 times: SOF packet with frame number 951, CRC 19 + 8 times: SOF packet with frame number 952, CRC 18 + 8 times: SOF packet with frame number 953, CRC 07 + 8 times: SOF packet with frame number 954, CRC 0F + 8 times: SOF packet with frame number 955, CRC 10 + 8 times: SOF packet with frame number 956, CRC 1F + 8 times: SOF packet with frame number 957, CRC 00 + 8 times: SOF packet with frame number 958, CRC 08 + 8 times: SOF packet with frame number 959, CRC 17 + 8 times: SOF packet with frame number 960, CRC 10 + 8 times: SOF packet with frame number 961, CRC 0F + 8 times: SOF packet with frame number 962, CRC 07 + 8 times: SOF packet with frame number 963, CRC 18 + 8 times: SOF packet with frame number 964, CRC 17 + 8 times: SOF packet with frame number 965, CRC 08 + 8 times: SOF packet with frame number 966, CRC 00 + 8 times: SOF packet with frame number 967, CRC 1F + 8 times: SOF packet with frame number 968, CRC 1E + 8 times: SOF packet with frame number 969, CRC 01 + 8 times: SOF packet with frame number 970, CRC 09 + 8 times: SOF packet with frame number 971, CRC 16 + 8 times: SOF packet with frame number 972, CRC 19 + 8 times: SOF packet with frame number 973, CRC 06 + 8 times: SOF packet with frame number 974, CRC 0E + 8 times: SOF packet with frame number 975, CRC 11 + 8 times: SOF packet with frame number 976, CRC 0C + 8 times: SOF packet with frame number 977, CRC 13 + 8 times: SOF packet with frame number 978, CRC 1B + 8 times: SOF packet with frame number 979, CRC 04 + 8 times: SOF packet with frame number 980, CRC 0B + 8 times: SOF packet with frame number 981, CRC 14 + 8 times: SOF packet with frame number 982, CRC 1C + 8 times: SOF packet with frame number 983, CRC 03 + 8 times: SOF packet with frame number 984, CRC 02 + 8 times: SOF packet with frame number 985, CRC 1D + 8 times: SOF packet with frame number 986, CRC 15 + 8 times: SOF packet with frame number 987, CRC 0A + 8 times: SOF packet with frame number 988, CRC 05 + 8 times: SOF packet with frame number 989, CRC 1A + 8 times: SOF packet with frame number 990, CRC 12 + 8 times: SOF packet with frame number 991, CRC 0D + 8 times: SOF packet with frame number 992, CRC 01 + 8 times: SOF packet with frame number 993, CRC 1E + 8 times: SOF packet with frame number 994, CRC 16 + 8 times: SOF packet with frame number 995, CRC 09 + 8 times: SOF packet with frame number 996, CRC 06 + 8 times: SOF packet with frame number 997, CRC 19 + 8 times: SOF packet with frame number 998, CRC 11 + 8 times: SOF packet with frame number 999, CRC 0E + 8 times: SOF packet with frame number 1000, CRC 0F + 8 times: SOF packet with frame number 1001, CRC 10 + 8 times: SOF packet with frame number 1002, CRC 18 + 8 times: SOF packet with frame number 1003, CRC 07 + 8 times: SOF packet with frame number 1004, CRC 08 + 8 times: SOF packet with frame number 1005, CRC 17 + 8 times: SOF packet with frame number 1006, CRC 1F + 8 times: SOF packet with frame number 1007, CRC 00 + 8 times: SOF packet with frame number 1008, CRC 1D + 8 times: SOF packet with frame number 1009, CRC 02 + 8 times: SOF packet with frame number 1010, CRC 0A + 8 times: SOF packet with frame number 1011, CRC 15 + 8 times: SOF packet with frame number 1012, CRC 1A + 8 times: SOF packet with frame number 1013, CRC 05 + 8 times: SOF packet with frame number 1014, CRC 0D + 8 times: SOF packet with frame number 1015, CRC 12 + 8 times: SOF packet with frame number 1016, CRC 13 + 8 times: SOF packet with frame number 1017, CRC 0C + 8 times: SOF packet with frame number 1018, CRC 04 + 8 times: SOF packet with frame number 1019, CRC 1B + 8 times: SOF packet with frame number 1020, CRC 14 + 8 times: SOF packet with frame number 1021, CRC 0B + 8 times: SOF packet with frame number 1022, CRC 03 + 8 times: SOF packet with frame number 1023, CRC 1C + 8 times: SOF packet with frame number 1024, CRC 16 + 8 times: SOF packet with frame number 1025, CRC 09 + 8 times: SOF packet with frame number 1026, CRC 01 + 8 times: SOF packet with frame number 1027, CRC 1E + 8 times: SOF packet with frame number 1028, CRC 11 + 8 times: SOF packet with frame number 1029, CRC 0E + 8 times: SOF packet with frame number 1030, CRC 06 + 8 times: SOF packet with frame number 1031, CRC 19 + 8 times: SOF packet with frame number 1032, CRC 18 + 8 times: SOF packet with frame number 1033, CRC 07 + 8 times: SOF packet with frame number 1034, CRC 0F + 8 times: SOF packet with frame number 1035, CRC 10 + 8 times: SOF packet with frame number 1036, CRC 1F + 8 times: SOF packet with frame number 1037, CRC 00 + 8 times: SOF packet with frame number 1038, CRC 08 + 8 times: SOF packet with frame number 1039, CRC 17 + 8 times: SOF packet with frame number 1040, CRC 0A + 8 times: SOF packet with frame number 1041, CRC 15 + 8 times: SOF packet with frame number 1042, CRC 1D + 8 times: SOF packet with frame number 1043, CRC 02 + 8 times: SOF packet with frame number 1044, CRC 0D + 8 times: SOF packet with frame number 1045, CRC 12 + 8 times: SOF packet with frame number 1046, CRC 1A + 8 times: SOF packet with frame number 1047, CRC 05 + 8 times: SOF packet with frame number 1048, CRC 04 + 8 times: SOF packet with frame number 1049, CRC 1B + 8 times: SOF packet with frame number 1050, CRC 13 + 8 times: SOF packet with frame number 1051, CRC 0C + 8 times: SOF packet with frame number 1052, CRC 03 + 8 times: SOF packet with frame number 1053, CRC 1C + 8 times: SOF packet with frame number 1054, CRC 14 + 8 times: SOF packet with frame number 1055, CRC 0B + 8 times: SOF packet with frame number 1056, CRC 07 + 8 times: SOF packet with frame number 1057, CRC 18 + 8 times: SOF packet with frame number 1058, CRC 10 + 8 times: SOF packet with frame number 1059, CRC 0F + 8 times: SOF packet with frame number 1060, CRC 00 + 8 times: SOF packet with frame number 1061, CRC 1F + 8 times: SOF packet with frame number 1062, CRC 17 + 8 times: SOF packet with frame number 1063, CRC 08 + 8 times: SOF packet with frame number 1064, CRC 09 + 8 times: SOF packet with frame number 1065, CRC 16 + 8 times: SOF packet with frame number 1066, CRC 1E + 8 times: SOF packet with frame number 1067, CRC 01 + 8 times: SOF packet with frame number 1068, CRC 0E + 8 times: SOF packet with frame number 1069, CRC 11 + 8 times: SOF packet with frame number 1070, CRC 19 + 8 times: SOF packet with frame number 1071, CRC 06 + 8 times: SOF packet with frame number 1072, CRC 1B + 8 times: SOF packet with frame number 1073, CRC 04 + 8 times: SOF packet with frame number 1074, CRC 0C + 8 times: SOF packet with frame number 1075, CRC 13 + 8 times: SOF packet with frame number 1076, CRC 1C + 8 times: SOF packet with frame number 1077, CRC 03 + 8 times: SOF packet with frame number 1078, CRC 0B + 8 times: SOF packet with frame number 1079, CRC 14 + 8 times: SOF packet with frame number 1080, CRC 15 + 8 times: SOF packet with frame number 1081, CRC 0A + 8 times: SOF packet with frame number 1082, CRC 02 + 8 times: SOF packet with frame number 1083, CRC 1D + 8 times: SOF packet with frame number 1084, CRC 12 + 8 times: SOF packet with frame number 1085, CRC 0D + 8 times: SOF packet with frame number 1086, CRC 05 + 8 times: SOF packet with frame number 1087, CRC 1A + 8 times: SOF packet with frame number 1088, CRC 1D + 8 times: SOF packet with frame number 1089, CRC 02 + 8 times: SOF packet with frame number 1090, CRC 0A + 8 times: SOF packet with frame number 1091, CRC 15 + 8 times: SOF packet with frame number 1092, CRC 1A + 8 times: SOF packet with frame number 1093, CRC 05 + 8 times: SOF packet with frame number 1094, CRC 0D + 8 times: SOF packet with frame number 1095, CRC 12 + 8 times: SOF packet with frame number 1096, CRC 13 + 8 times: SOF packet with frame number 1097, CRC 0C + 8 times: SOF packet with frame number 1098, CRC 04 + 8 times: SOF packet with frame number 1099, CRC 1B + 8 times: SOF packet with frame number 1100, CRC 14 + 8 times: SOF packet with frame number 1101, CRC 0B + 8 times: SOF packet with frame number 1102, CRC 03 + 8 times: SOF packet with frame number 1103, CRC 1C + 8 times: SOF packet with frame number 1104, CRC 01 + 8 times: SOF packet with frame number 1105, CRC 1E + 8 times: SOF packet with frame number 1106, CRC 16 + 8 times: SOF packet with frame number 1107, CRC 09 + 8 times: SOF packet with frame number 1108, CRC 06 + 8 times: SOF packet with frame number 1109, CRC 19 + 8 times: SOF packet with frame number 1110, CRC 11 + 8 times: SOF packet with frame number 1111, CRC 0E + 8 times: SOF packet with frame number 1112, CRC 0F + 8 times: SOF packet with frame number 1113, CRC 10 + 8 times: SOF packet with frame number 1114, CRC 18 + 8 times: SOF packet with frame number 1115, CRC 07 + 8 times: SOF packet with frame number 1116, CRC 08 + 8 times: SOF packet with frame number 1117, CRC 17 + 8 times: SOF packet with frame number 1118, CRC 1F + 8 times: SOF packet with frame number 1119, CRC 00 + 8 times: SOF packet with frame number 1120, CRC 0C + 8 times: SOF packet with frame number 1121, CRC 13 + 8 times: SOF packet with frame number 1122, CRC 1B + 8 times: SOF packet with frame number 1123, CRC 04 + 8 times: SOF packet with frame number 1124, CRC 0B + 8 times: SOF packet with frame number 1125, CRC 14 + 8 times: SOF packet with frame number 1126, CRC 1C + 8 times: SOF packet with frame number 1127, CRC 03 + 8 times: SOF packet with frame number 1128, CRC 02 + 8 times: SOF packet with frame number 1129, CRC 1D + 8 times: SOF packet with frame number 1130, CRC 15 + 8 times: SOF packet with frame number 1131, CRC 0A + 8 times: SOF packet with frame number 1132, CRC 05 + 8 times: SOF packet with frame number 1133, CRC 1A + 8 times: SOF packet with frame number 1134, CRC 12 + 8 times: SOF packet with frame number 1135, CRC 0D + 8 times: SOF packet with frame number 1136, CRC 10 + 8 times: SOF packet with frame number 1137, CRC 0F + 8 times: SOF packet with frame number 1138, CRC 07 + 8 times: SOF packet with frame number 1139, CRC 18 + 8 times: SOF packet with frame number 1140, CRC 17 + 8 times: SOF packet with frame number 1141, CRC 08 + 8 times: SOF packet with frame number 1142, CRC 00 + 8 times: SOF packet with frame number 1143, CRC 1F + 8 times: SOF packet with frame number 1144, CRC 1E + 8 times: SOF packet with frame number 1145, CRC 01 + 8 times: SOF packet with frame number 1146, CRC 09 + 8 times: SOF packet with frame number 1147, CRC 16 + 8 times: SOF packet with frame number 1148, CRC 19 + 8 times: SOF packet with frame number 1149, CRC 06 + 8 times: SOF packet with frame number 1150, CRC 0E + 8 times: SOF packet with frame number 1151, CRC 11 + 8 times: SOF packet with frame number 1152, CRC 00 + 8 times: SOF packet with frame number 1153, CRC 1F + 8 times: SOF packet with frame number 1154, CRC 17 + 8 times: SOF packet with frame number 1155, CRC 08 + 8 times: SOF packet with frame number 1156, CRC 07 + 8 times: SOF packet with frame number 1157, CRC 18 + 8 times: SOF packet with frame number 1158, CRC 10 + 8 times: SOF packet with frame number 1159, CRC 0F + 8 times: SOF packet with frame number 1160, CRC 0E + 8 times: SOF packet with frame number 1161, CRC 11 + 8 times: SOF packet with frame number 1162, CRC 19 + 8 times: SOF packet with frame number 1163, CRC 06 + 8 times: SOF packet with frame number 1164, CRC 09 + 8 times: SOF packet with frame number 1165, CRC 16 + 8 times: SOF packet with frame number 1166, CRC 1E + 8 times: SOF packet with frame number 1167, CRC 01 + 8 times: SOF packet with frame number 1168, CRC 1C + 8 times: SOF packet with frame number 1169, CRC 03 + 8 times: SOF packet with frame number 1170, CRC 0B + 8 times: SOF packet with frame number 1171, CRC 14 + 8 times: SOF packet with frame number 1172, CRC 1B + 8 times: SOF packet with frame number 1173, CRC 04 + 8 times: SOF packet with frame number 1174, CRC 0C + 8 times: SOF packet with frame number 1175, CRC 13 + 8 times: SOF packet with frame number 1176, CRC 12 + 8 times: SOF packet with frame number 1177, CRC 0D + 8 times: SOF packet with frame number 1178, CRC 05 + 8 times: SOF packet with frame number 1179, CRC 1A + 8 times: SOF packet with frame number 1180, CRC 15 + 8 times: SOF packet with frame number 1181, CRC 0A + 8 times: SOF packet with frame number 1182, CRC 02 + 8 times: SOF packet with frame number 1183, CRC 1D + 8 times: SOF packet with frame number 1184, CRC 11 + 8 times: SOF packet with frame number 1185, CRC 0E + 8 times: SOF packet with frame number 1186, CRC 06 + 8 times: SOF packet with frame number 1187, CRC 19 + 8 times: SOF packet with frame number 1188, CRC 16 + 8 times: SOF packet with frame number 1189, CRC 09 + 8 times: SOF packet with frame number 1190, CRC 01 + 8 times: SOF packet with frame number 1191, CRC 1E + 8 times: SOF packet with frame number 1192, CRC 1F + 8 times: SOF packet with frame number 1193, CRC 00 + 8 times: SOF packet with frame number 1194, CRC 08 + 8 times: SOF packet with frame number 1195, CRC 17 + 8 times: SOF packet with frame number 1196, CRC 18 + 8 times: SOF packet with frame number 1197, CRC 07 + 8 times: SOF packet with frame number 1198, CRC 0F + 8 times: SOF packet with frame number 1199, CRC 10 + 8 times: SOF packet with frame number 1200, CRC 0D + 8 times: SOF packet with frame number 1201, CRC 12 + 8 times: SOF packet with frame number 1202, CRC 1A + 8 times: SOF packet with frame number 1203, CRC 05 + 8 times: SOF packet with frame number 1204, CRC 0A + 8 times: SOF packet with frame number 1205, CRC 15 + 8 times: SOF packet with frame number 1206, CRC 1D + 8 times: SOF packet with frame number 1207, CRC 02 + 8 times: SOF packet with frame number 1208, CRC 03 + 8 times: SOF packet with frame number 1209, CRC 1C + 8 times: SOF packet with frame number 1210, CRC 14 + 8 times: SOF packet with frame number 1211, CRC 0B + 8 times: SOF packet with frame number 1212, CRC 04 + 8 times: SOF packet with frame number 1213, CRC 1B + 8 times: SOF packet with frame number 1214, CRC 13 + 8 times: SOF packet with frame number 1215, CRC 0C + 8 times: SOF packet with frame number 1216, CRC 0B + 8 times: SOF packet with frame number 1217, CRC 14 + 8 times: SOF packet with frame number 1218, CRC 1C + 8 times: SOF packet with frame number 1219, CRC 03 + 8 times: SOF packet with frame number 1220, CRC 0C + 8 times: SOF packet with frame number 1221, CRC 13 + 8 times: SOF packet with frame number 1222, CRC 1B + 8 times: SOF packet with frame number 1223, CRC 04 + 8 times: SOF packet with frame number 1224, CRC 05 + 8 times: SOF packet with frame number 1225, CRC 1A + 8 times: SOF packet with frame number 1226, CRC 12 + 8 times: SOF packet with frame number 1227, CRC 0D + 8 times: SOF packet with frame number 1228, CRC 02 + 8 times: SOF packet with frame number 1229, CRC 1D + 8 times: SOF packet with frame number 1230, CRC 15 + 8 times: SOF packet with frame number 1231, CRC 0A + 8 times: SOF packet with frame number 1232, CRC 17 + 8 times: SOF packet with frame number 1233, CRC 08 + 8 times: SOF packet with frame number 1234, CRC 00 + 8 times: SOF packet with frame number 1235, CRC 1F + 8 times: SOF packet with frame number 1236, CRC 10 + 8 times: SOF packet with frame number 1237, CRC 0F + 8 times: SOF packet with frame number 1238, CRC 07 + 8 times: SOF packet with frame number 1239, CRC 18 + 8 times: SOF packet with frame number 1240, CRC 19 + 8 times: SOF packet with frame number 1241, CRC 06 + 8 times: SOF packet with frame number 1242, CRC 0E + 8 times: SOF packet with frame number 1243, CRC 11 + 8 times: SOF packet with frame number 1244, CRC 1E + 8 times: SOF packet with frame number 1245, CRC 01 + 8 times: SOF packet with frame number 1246, CRC 09 + 8 times: SOF packet with frame number 1247, CRC 16 + 8 times: SOF packet with frame number 1248, CRC 1A + 8 times: SOF packet with frame number 1249, CRC 05 + 8 times: SOF packet with frame number 1250, CRC 0D + 8 times: SOF packet with frame number 1251, CRC 12 + 8 times: SOF packet with frame number 1252, CRC 1D + 8 times: SOF packet with frame number 1253, CRC 02 + 8 times: SOF packet with frame number 1254, CRC 0A + 8 times: SOF packet with frame number 1255, CRC 15 + 8 times: SOF packet with frame number 1256, CRC 14 + 8 times: SOF packet with frame number 1257, CRC 0B + 8 times: SOF packet with frame number 1258, CRC 03 + 8 times: SOF packet with frame number 1259, CRC 1C + 8 times: SOF packet with frame number 1260, CRC 13 + 8 times: SOF packet with frame number 1261, CRC 0C + 8 times: SOF packet with frame number 1262, CRC 04 + 8 times: SOF packet with frame number 1263, CRC 1B + 8 times: SOF packet with frame number 1264, CRC 06 + 8 times: SOF packet with frame number 1265, CRC 19 + 8 times: SOF packet with frame number 1266, CRC 11 + 8 times: SOF packet with frame number 1267, CRC 0E + 8 times: SOF packet with frame number 1268, CRC 01 + 8 times: SOF packet with frame number 1269, CRC 1E + 8 times: SOF packet with frame number 1270, CRC 16 + 8 times: SOF packet with frame number 1271, CRC 09 + 8 times: SOF packet with frame number 1272, CRC 08 + 8 times: SOF packet with frame number 1273, CRC 17 + 8 times: SOF packet with frame number 1274, CRC 1F + 8 times: SOF packet with frame number 1275, CRC 00 + 8 times: SOF packet with frame number 1276, CRC 0F + 8 times: SOF packet with frame number 1277, CRC 10 + 8 times: SOF packet with frame number 1278, CRC 18 + 8 times: SOF packet with frame number 1279, CRC 07 + 8 times: SOF packet with frame number 1280, CRC 13 + 8 times: SOF packet with frame number 1281, CRC 0C + 8 times: SOF packet with frame number 1282, CRC 04 + 8 times: SOF packet with frame number 1283, CRC 1B + 8 times: SOF packet with frame number 1284, CRC 14 + 8 times: SOF packet with frame number 1285, CRC 0B + 8 times: SOF packet with frame number 1286, CRC 03 + 8 times: SOF packet with frame number 1287, CRC 1C + 8 times: SOF packet with frame number 1288, CRC 1D + 8 times: SOF packet with frame number 1289, CRC 02 + 8 times: SOF packet with frame number 1290, CRC 0A + 8 times: SOF packet with frame number 1291, CRC 15 + 8 times: SOF packet with frame number 1292, CRC 1A + 8 times: SOF packet with frame number 1293, CRC 05 + 8 times: SOF packet with frame number 1294, CRC 0D + 8 times: SOF packet with frame number 1295, CRC 12 + 8 times: SOF packet with frame number 1296, CRC 0F + 8 times: SOF packet with frame number 1297, CRC 10 + 8 times: SOF packet with frame number 1298, CRC 18 + 8 times: SOF packet with frame number 1299, CRC 07 + 8 times: SOF packet with frame number 1300, CRC 08 + 8 times: SOF packet with frame number 1301, CRC 17 + 8 times: SOF packet with frame number 1302, CRC 1F + 8 times: SOF packet with frame number 1303, CRC 00 + 8 times: SOF packet with frame number 1304, CRC 01 + 8 times: SOF packet with frame number 1305, CRC 1E + 8 times: SOF packet with frame number 1306, CRC 16 + 8 times: SOF packet with frame number 1307, CRC 09 + 8 times: SOF packet with frame number 1308, CRC 06 + 8 times: SOF packet with frame number 1309, CRC 19 + 8 times: SOF packet with frame number 1310, CRC 11 + 8 times: SOF packet with frame number 1311, CRC 0E + 8 times: SOF packet with frame number 1312, CRC 02 + 8 times: SOF packet with frame number 1313, CRC 1D + 8 times: SOF packet with frame number 1314, CRC 15 + 8 times: SOF packet with frame number 1315, CRC 0A + 8 times: SOF packet with frame number 1316, CRC 05 + 8 times: SOF packet with frame number 1317, CRC 1A + 8 times: SOF packet with frame number 1318, CRC 12 + 8 times: SOF packet with frame number 1319, CRC 0D + 8 times: SOF packet with frame number 1320, CRC 0C + 8 times: SOF packet with frame number 1321, CRC 13 + 8 times: SOF packet with frame number 1322, CRC 1B + 8 times: SOF packet with frame number 1323, CRC 04 + 8 times: SOF packet with frame number 1324, CRC 0B + 8 times: SOF packet with frame number 1325, CRC 14 + 8 times: SOF packet with frame number 1326, CRC 1C + 8 times: SOF packet with frame number 1327, CRC 03 + 8 times: SOF packet with frame number 1328, CRC 1E + 8 times: SOF packet with frame number 1329, CRC 01 + 8 times: SOF packet with frame number 1330, CRC 09 + 8 times: SOF packet with frame number 1331, CRC 16 + 8 times: SOF packet with frame number 1332, CRC 19 + 8 times: SOF packet with frame number 1333, CRC 06 + 8 times: SOF packet with frame number 1334, CRC 0E + 8 times: SOF packet with frame number 1335, CRC 11 + 8 times: SOF packet with frame number 1336, CRC 10 + 8 times: SOF packet with frame number 1337, CRC 0F + 8 times: SOF packet with frame number 1338, CRC 07 + 8 times: SOF packet with frame number 1339, CRC 18 + 8 times: SOF packet with frame number 1340, CRC 17 + 8 times: SOF packet with frame number 1341, CRC 08 + 8 times: SOF packet with frame number 1342, CRC 00 + 8 times: SOF packet with frame number 1343, CRC 1F + 8 times: SOF packet with frame number 1344, CRC 18 + 8 times: SOF packet with frame number 1345, CRC 07 + 8 times: SOF packet with frame number 1346, CRC 0F + 8 times: SOF packet with frame number 1347, CRC 10 + 8 times: SOF packet with frame number 1348, CRC 1F + 8 times: SOF packet with frame number 1349, CRC 00 + 8 times: SOF packet with frame number 1350, CRC 08 + 8 times: SOF packet with frame number 1351, CRC 17 + 8 times: SOF packet with frame number 1352, CRC 16 + 8 times: SOF packet with frame number 1353, CRC 09 + 8 times: SOF packet with frame number 1354, CRC 01 + 8 times: SOF packet with frame number 1355, CRC 1E + 8 times: SOF packet with frame number 1356, CRC 11 + 8 times: SOF packet with frame number 1357, CRC 0E + 8 times: SOF packet with frame number 1358, CRC 06 + 8 times: SOF packet with frame number 1359, CRC 19 + 8 times: SOF packet with frame number 1360, CRC 04 + 8 times: SOF packet with frame number 1361, CRC 1B + 8 times: SOF packet with frame number 1362, CRC 13 + 8 times: SOF packet with frame number 1363, CRC 0C + 8 times: SOF packet with frame number 1364, CRC 03 + 8 times: SOF packet with frame number 1365, CRC 1C + 8 times: SOF packet with frame number 1366, CRC 14 + 8 times: SOF packet with frame number 1367, CRC 0B + 8 times: SOF packet with frame number 1368, CRC 0A + 8 times: SOF packet with frame number 1369, CRC 15 + 8 times: SOF packet with frame number 1370, CRC 1D + 8 times: SOF packet with frame number 1371, CRC 02 + 8 times: SOF packet with frame number 1372, CRC 0D + 8 times: SOF packet with frame number 1373, CRC 12 + 8 times: SOF packet with frame number 1374, CRC 1A + 8 times: SOF packet with frame number 1375, CRC 05 + 8 times: SOF packet with frame number 1376, CRC 09 + 8 times: SOF packet with frame number 1377, CRC 16 + 8 times: SOF packet with frame number 1378, CRC 1E + 8 times: SOF packet with frame number 1379, CRC 01 + 8 times: SOF packet with frame number 1380, CRC 0E + 8 times: SOF packet with frame number 1381, CRC 11 + 8 times: SOF packet with frame number 1382, CRC 19 + 8 times: SOF packet with frame number 1383, CRC 06 + 8 times: SOF packet with frame number 1384, CRC 07 + 8 times: SOF packet with frame number 1385, CRC 18 + 8 times: SOF packet with frame number 1386, CRC 10 + 8 times: SOF packet with frame number 1387, CRC 0F + 8 times: SOF packet with frame number 1388, CRC 00 + 8 times: SOF packet with frame number 1389, CRC 1F + 8 times: SOF packet with frame number 1390, CRC 17 + 8 times: SOF packet with frame number 1391, CRC 08 + 8 times: SOF packet with frame number 1392, CRC 15 + 8 times: SOF packet with frame number 1393, CRC 0A + 8 times: SOF packet with frame number 1394, CRC 02 + 8 times: SOF packet with frame number 1395, CRC 1D + 8 times: SOF packet with frame number 1396, CRC 12 + 8 times: SOF packet with frame number 1397, CRC 0D + 8 times: SOF packet with frame number 1398, CRC 05 + 8 times: SOF packet with frame number 1399, CRC 1A + 8 times: SOF packet with frame number 1400, CRC 1B + 8 times: SOF packet with frame number 1401, CRC 04 + 8 times: SOF packet with frame number 1402, CRC 0C + 8 times: SOF packet with frame number 1403, CRC 13 + 8 times: SOF packet with frame number 1404, CRC 1C + 8 times: SOF packet with frame number 1405, CRC 03 + 8 times: SOF packet with frame number 1406, CRC 0B + 8 times: SOF packet with frame number 1407, CRC 14 + 8 times: SOF packet with frame number 1408, CRC 05 + 8 times: SOF packet with frame number 1409, CRC 1A + 8 times: SOF packet with frame number 1410, CRC 12 + 8 times: SOF packet with frame number 1411, CRC 0D + 8 times: SOF packet with frame number 1412, CRC 02 + 8 times: SOF packet with frame number 1413, CRC 1D + 8 times: SOF packet with frame number 1414, CRC 15 + 8 times: SOF packet with frame number 1415, CRC 0A + 8 times: SOF packet with frame number 1416, CRC 0B + 8 times: SOF packet with frame number 1417, CRC 14 + 8 times: SOF packet with frame number 1418, CRC 1C + 8 times: SOF packet with frame number 1419, CRC 03 + 8 times: SOF packet with frame number 1420, CRC 0C + 8 times: SOF packet with frame number 1421, CRC 13 + 8 times: SOF packet with frame number 1422, CRC 1B + 8 times: SOF packet with frame number 1423, CRC 04 + 8 times: SOF packet with frame number 1424, CRC 19 + 8 times: SOF packet with frame number 1425, CRC 06 + 8 times: SOF packet with frame number 1426, CRC 0E + 8 times: SOF packet with frame number 1427, CRC 11 + 8 times: SOF packet with frame number 1428, CRC 1E + 8 times: SOF packet with frame number 1429, CRC 01 + 8 times: SOF packet with frame number 1430, CRC 09 + 8 times: SOF packet with frame number 1431, CRC 16 + 8 times: SOF packet with frame number 1432, CRC 17 + 8 times: SOF packet with frame number 1433, CRC 08 + 8 times: SOF packet with frame number 1434, CRC 00 + 8 times: SOF packet with frame number 1435, CRC 1F + 8 times: SOF packet with frame number 1436, CRC 10 + 8 times: SOF packet with frame number 1437, CRC 0F + 8 times: SOF packet with frame number 1438, CRC 07 + 8 times: SOF packet with frame number 1439, CRC 18 + 8 times: SOF packet with frame number 1440, CRC 14 + 8 times: SOF packet with frame number 1441, CRC 0B + 8 times: SOF packet with frame number 1442, CRC 03 + 8 times: SOF packet with frame number 1443, CRC 1C + 8 times: SOF packet with frame number 1444, CRC 13 + 8 times: SOF packet with frame number 1445, CRC 0C + 8 times: SOF packet with frame number 1446, CRC 04 + 8 times: SOF packet with frame number 1447, CRC 1B + 8 times: SOF packet with frame number 1448, CRC 1A + 8 times: SOF packet with frame number 1449, CRC 05 + 8 times: SOF packet with frame number 1450, CRC 0D + 8 times: SOF packet with frame number 1451, CRC 12 + 8 times: SOF packet with frame number 1452, CRC 1D + 8 times: SOF packet with frame number 1453, CRC 02 + 8 times: SOF packet with frame number 1454, CRC 0A + 8 times: SOF packet with frame number 1455, CRC 15 + 8 times: SOF packet with frame number 1456, CRC 08 + 8 times: SOF packet with frame number 1457, CRC 17 + 8 times: SOF packet with frame number 1458, CRC 1F + 8 times: SOF packet with frame number 1459, CRC 00 + 8 times: SOF packet with frame number 1460, CRC 0F + 8 times: SOF packet with frame number 1461, CRC 10 + 8 times: SOF packet with frame number 1462, CRC 18 + 8 times: SOF packet with frame number 1463, CRC 07 + 8 times: SOF packet with frame number 1464, CRC 06 + 8 times: SOF packet with frame number 1465, CRC 19 + 8 times: SOF packet with frame number 1466, CRC 11 + 8 times: SOF packet with frame number 1467, CRC 0E + 8 times: SOF packet with frame number 1468, CRC 01 + 8 times: SOF packet with frame number 1469, CRC 1E + 8 times: SOF packet with frame number 1470, CRC 16 + 8 times: SOF packet with frame number 1471, CRC 09 + 8 times: SOF packet with frame number 1472, CRC 0E + 8 times: SOF packet with frame number 1473, CRC 11 + 8 times: SOF packet with frame number 1474, CRC 19 + 8 times: SOF packet with frame number 1475, CRC 06 + 8 times: SOF packet with frame number 1476, CRC 09 + 8 times: SOF packet with frame number 1477, CRC 16 + 8 times: SOF packet with frame number 1478, CRC 1E + 8 times: SOF packet with frame number 1479, CRC 01 + 8 times: SOF packet with frame number 1480, CRC 00 + 8 times: SOF packet with frame number 1481, CRC 1F + 8 times: SOF packet with frame number 1482, CRC 17 + 8 times: SOF packet with frame number 1483, CRC 08 + 8 times: SOF packet with frame number 1484, CRC 07 + 8 times: SOF packet with frame number 1485, CRC 18 + 8 times: SOF packet with frame number 1486, CRC 10 + 8 times: SOF packet with frame number 1487, CRC 0F + 8 times: SOF packet with frame number 1488, CRC 12 + 8 times: SOF packet with frame number 1489, CRC 0D + 8 times: SOF packet with frame number 1490, CRC 05 + 8 times: SOF packet with frame number 1491, CRC 1A + 8 times: SOF packet with frame number 1492, CRC 15 + 8 times: SOF packet with frame number 1493, CRC 0A + 8 times: SOF packet with frame number 1494, CRC 02 + 8 times: SOF packet with frame number 1495, CRC 1D + 8 times: SOF packet with frame number 1496, CRC 1C + 8 times: SOF packet with frame number 1497, CRC 03 + 8 times: SOF packet with frame number 1498, CRC 0B + 8 times: SOF packet with frame number 1499, CRC 14 + 8 times: SOF packet with frame number 1500, CRC 1B + 8 times: SOF packet with frame number 1501, CRC 04 + 8 times: SOF packet with frame number 1502, CRC 0C + 8 times: SOF packet with frame number 1503, CRC 13 + 8 times: SOF packet with frame number 1504, CRC 1F + 8 times: SOF packet with frame number 1505, CRC 00 + 8 times: SOF packet with frame number 1506, CRC 08 + 8 times: SOF packet with frame number 1507, CRC 17 + 8 times: SOF packet with frame number 1508, CRC 18 + 8 times: SOF packet with frame number 1509, CRC 07 + 8 times: SOF packet with frame number 1510, CRC 0F + 8 times: SOF packet with frame number 1511, CRC 10 + 8 times: SOF packet with frame number 1512, CRC 11 + 8 times: SOF packet with frame number 1513, CRC 0E + 8 times: SOF packet with frame number 1514, CRC 06 + 8 times: SOF packet with frame number 1515, CRC 19 + 8 times: SOF packet with frame number 1516, CRC 16 + 8 times: SOF packet with frame number 1517, CRC 09 + 8 times: SOF packet with frame number 1518, CRC 01 + 8 times: SOF packet with frame number 1519, CRC 1E + 8 times: SOF packet with frame number 1520, CRC 03 + 8 times: SOF packet with frame number 1521, CRC 1C + 8 times: SOF packet with frame number 1522, CRC 14 + 8 times: SOF packet with frame number 1523, CRC 0B + 8 times: SOF packet with frame number 1524, CRC 04 + 8 times: SOF packet with frame number 1525, CRC 1B + 8 times: SOF packet with frame number 1526, CRC 13 + 8 times: SOF packet with frame number 1527, CRC 0C + 8 times: SOF packet with frame number 1528, CRC 0D + 8 times: SOF packet with frame number 1529, CRC 12 + 8 times: SOF packet with frame number 1530, CRC 1A + 8 times: SOF packet with frame number 1531, CRC 05 + 8 times: SOF packet with frame number 1532, CRC 0A + 8 times: SOF packet with frame number 1533, CRC 15 + 8 times: SOF packet with frame number 1534, CRC 1D + 8 times: SOF packet with frame number 1535, CRC 02 + 8 times: SOF packet with frame number 1536, CRC 1C + 8 times: SOF packet with frame number 1537, CRC 03 + 8 times: SOF packet with frame number 1538, CRC 0B + 8 times: SOF packet with frame number 1539, CRC 14 + 8 times: SOF packet with frame number 1540, CRC 1B + 8 times: SOF packet with frame number 1541, CRC 04 + 8 times: SOF packet with frame number 1542, CRC 0C + 8 times: SOF packet with frame number 1543, CRC 13 + 8 times: SOF packet with frame number 1544, CRC 12 + 8 times: SOF packet with frame number 1545, CRC 0D + 8 times: SOF packet with frame number 1546, CRC 05 + 8 times: SOF packet with frame number 1547, CRC 1A + 8 times: SOF packet with frame number 1548, CRC 15 + 8 times: SOF packet with frame number 1549, CRC 0A + 8 times: SOF packet with frame number 1550, CRC 02 + 8 times: SOF packet with frame number 1551, CRC 1D + 8 times: SOF packet with frame number 1552, CRC 00 + 8 times: SOF packet with frame number 1553, CRC 1F + 8 times: SOF packet with frame number 1554, CRC 17 + 8 times: SOF packet with frame number 1555, CRC 08 + 8 times: SOF packet with frame number 1556, CRC 07 + 8 times: SOF packet with frame number 1557, CRC 18 + 8 times: SOF packet with frame number 1558, CRC 10 + 8 times: SOF packet with frame number 1559, CRC 0F + 8 times: SOF packet with frame number 1560, CRC 0E + 8 times: SOF packet with frame number 1561, CRC 11 + 8 times: SOF packet with frame number 1562, CRC 19 + 8 times: SOF packet with frame number 1563, CRC 06 + 8 times: SOF packet with frame number 1564, CRC 09 + 8 times: SOF packet with frame number 1565, CRC 16 + 8 times: SOF packet with frame number 1566, CRC 1E + 8 times: SOF packet with frame number 1567, CRC 01 + 8 times: SOF packet with frame number 1568, CRC 0D + 8 times: SOF packet with frame number 1569, CRC 12 + 8 times: SOF packet with frame number 1570, CRC 1A + 8 times: SOF packet with frame number 1571, CRC 05 + 8 times: SOF packet with frame number 1572, CRC 0A + 8 times: SOF packet with frame number 1573, CRC 15 + 8 times: SOF packet with frame number 1574, CRC 1D + 8 times: SOF packet with frame number 1575, CRC 02 + 8 times: SOF packet with frame number 1576, CRC 03 + 8 times: SOF packet with frame number 1577, CRC 1C + 8 times: SOF packet with frame number 1578, CRC 14 + 8 times: SOF packet with frame number 1579, CRC 0B + 8 times: SOF packet with frame number 1580, CRC 04 + 8 times: SOF packet with frame number 1581, CRC 1B + 8 times: SOF packet with frame number 1582, CRC 13 + 8 times: SOF packet with frame number 1583, CRC 0C + 8 times: SOF packet with frame number 1584, CRC 11 + 8 times: SOF packet with frame number 1585, CRC 0E + 8 times: SOF packet with frame number 1586, CRC 06 + 8 times: SOF packet with frame number 1587, CRC 19 + 8 times: SOF packet with frame number 1588, CRC 16 + 8 times: SOF packet with frame number 1589, CRC 09 + 8 times: SOF packet with frame number 1590, CRC 01 + 8 times: SOF packet with frame number 1591, CRC 1E + 8 times: SOF packet with frame number 1592, CRC 1F + 8 times: SOF packet with frame number 1593, CRC 00 + 8 times: SOF packet with frame number 1594, CRC 08 + 8 times: SOF packet with frame number 1595, CRC 17 + 8 times: SOF packet with frame number 1596, CRC 18 + 8 times: SOF packet with frame number 1597, CRC 07 + 8 times: SOF packet with frame number 1598, CRC 0F + 8 times: SOF packet with frame number 1599, CRC 10 + 8 times: SOF packet with frame number 1600, CRC 17 + 8 times: SOF packet with frame number 1601, CRC 08 + 8 times: SOF packet with frame number 1602, CRC 00 + 8 times: SOF packet with frame number 1603, CRC 1F + 8 times: SOF packet with frame number 1604, CRC 10 + 8 times: SOF packet with frame number 1605, CRC 0F + 8 times: SOF packet with frame number 1606, CRC 07 + 8 times: SOF packet with frame number 1607, CRC 18 + 8 times: SOF packet with frame number 1608, CRC 19 + 8 times: SOF packet with frame number 1609, CRC 06 + 8 times: SOF packet with frame number 1610, CRC 0E + 8 times: SOF packet with frame number 1611, CRC 11 + 8 times: SOF packet with frame number 1612, CRC 1E + 8 times: SOF packet with frame number 1613, CRC 01 + 8 times: SOF packet with frame number 1614, CRC 09 + 8 times: SOF packet with frame number 1615, CRC 16 + 8 times: SOF packet with frame number 1616, CRC 0B + 8 times: SOF packet with frame number 1617, CRC 14 + 8 times: SOF packet with frame number 1618, CRC 1C + 8 times: SOF packet with frame number 1619, CRC 03 + 8 times: SOF packet with frame number 1620, CRC 0C + 8 times: SOF packet with frame number 1621, CRC 13 + 8 times: SOF packet with frame number 1622, CRC 1B + 8 times: SOF packet with frame number 1623, CRC 04 + 8 times: SOF packet with frame number 1624, CRC 05 + 8 times: SOF packet with frame number 1625, CRC 1A + 8 times: SOF packet with frame number 1626, CRC 12 + 8 times: SOF packet with frame number 1627, CRC 0D + 8 times: SOF packet with frame number 1628, CRC 02 + 8 times: SOF packet with frame number 1629, CRC 1D + 8 times: SOF packet with frame number 1630, CRC 15 + 8 times: SOF packet with frame number 1631, CRC 0A + 8 times: SOF packet with frame number 1632, CRC 06 + 8 times: SOF packet with frame number 1633, CRC 19 + 8 times: SOF packet with frame number 1634, CRC 11 + 8 times: SOF packet with frame number 1635, CRC 0E + 8 times: SOF packet with frame number 1636, CRC 01 + 8 times: SOF packet with frame number 1637, CRC 1E + 8 times: SOF packet with frame number 1638, CRC 16 + 8 times: SOF packet with frame number 1639, CRC 09 + 8 times: SOF packet with frame number 1640, CRC 08 + 8 times: SOF packet with frame number 1641, CRC 17 + 8 times: SOF packet with frame number 1642, CRC 1F + 8 times: SOF packet with frame number 1643, CRC 00 + 8 times: SOF packet with frame number 1644, CRC 0F + 8 times: SOF packet with frame number 1645, CRC 10 + 8 times: SOF packet with frame number 1646, CRC 18 + 8 times: SOF packet with frame number 1647, CRC 07 + 8 times: SOF packet with frame number 1648, CRC 1A + 8 times: SOF packet with frame number 1649, CRC 05 + 8 times: SOF packet with frame number 1650, CRC 0D + 8 times: SOF packet with frame number 1651, CRC 12 + 8 times: SOF packet with frame number 1652, CRC 1D + 8 times: SOF packet with frame number 1653, CRC 02 + 8 times: SOF packet with frame number 1654, CRC 0A + 8 times: SOF packet with frame number 1655, CRC 15 + 8 times: SOF packet with frame number 1656, CRC 14 + 8 times: SOF packet with frame number 1657, CRC 0B + 8 times: SOF packet with frame number 1658, CRC 03 + 8 times: SOF packet with frame number 1659, CRC 1C + 8 times: SOF packet with frame number 1660, CRC 13 + 8 times: SOF packet with frame number 1661, CRC 0C + 8 times: SOF packet with frame number 1662, CRC 04 + 8 times: SOF packet with frame number 1663, CRC 1B + 8 times: SOF packet with frame number 1664, CRC 0A + 8 times: SOF packet with frame number 1665, CRC 15 + 8 times: SOF packet with frame number 1666, CRC 1D + 8 times: SOF packet with frame number 1667, CRC 02 + 8 times: SOF packet with frame number 1668, CRC 0D + 8 times: SOF packet with frame number 1669, CRC 12 + 8 times: SOF packet with frame number 1670, CRC 1A + 8 times: SOF packet with frame number 1671, CRC 05 + 8 times: SOF packet with frame number 1672, CRC 04 + 8 times: SOF packet with frame number 1673, CRC 1B + 8 times: SOF packet with frame number 1674, CRC 13 + 8 times: SOF packet with frame number 1675, CRC 0C + 8 times: SOF packet with frame number 1676, CRC 03 + 8 times: SOF packet with frame number 1677, CRC 1C + 8 times: SOF packet with frame number 1678, CRC 14 + 8 times: SOF packet with frame number 1679, CRC 0B + 8 times: SOF packet with frame number 1680, CRC 16 + 8 times: SOF packet with frame number 1681, CRC 09 + 8 times: SOF packet with frame number 1682, CRC 01 + 8 times: SOF packet with frame number 1683, CRC 1E + 8 times: SOF packet with frame number 1684, CRC 11 + 8 times: SOF packet with frame number 1685, CRC 0E + 8 times: SOF packet with frame number 1686, CRC 06 + 8 times: SOF packet with frame number 1687, CRC 19 + 8 times: SOF packet with frame number 1688, CRC 18 + 8 times: SOF packet with frame number 1689, CRC 07 + 8 times: SOF packet with frame number 1690, CRC 0F + 8 times: SOF packet with frame number 1691, CRC 10 + 8 times: SOF packet with frame number 1692, CRC 1F + 8 times: SOF packet with frame number 1693, CRC 00 + 8 times: SOF packet with frame number 1694, CRC 08 + 8 times: SOF packet with frame number 1695, CRC 17 + 8 times: SOF packet with frame number 1696, CRC 1B + 8 times: SOF packet with frame number 1697, CRC 04 + 8 times: SOF packet with frame number 1698, CRC 0C + 8 times: SOF packet with frame number 1699, CRC 13 + 8 times: SOF packet with frame number 1700, CRC 1C + 8 times: SOF packet with frame number 1701, CRC 03 + 8 times: SOF packet with frame number 1702, CRC 0B + 8 times: SOF packet with frame number 1703, CRC 14 + 8 times: SOF packet with frame number 1704, CRC 15 + 8 times: SOF packet with frame number 1705, CRC 0A + 8 times: SOF packet with frame number 1706, CRC 02 + 8 times: SOF packet with frame number 1707, CRC 1D + 8 times: SOF packet with frame number 1708, CRC 12 + 8 times: SOF packet with frame number 1709, CRC 0D + 8 times: SOF packet with frame number 1710, CRC 05 + 8 times: SOF packet with frame number 1711, CRC 1A + 8 times: SOF packet with frame number 1712, CRC 07 + 8 times: SOF packet with frame number 1713, CRC 18 + 8 times: SOF packet with frame number 1714, CRC 10 + 8 times: SOF packet with frame number 1715, CRC 0F + 8 times: SOF packet with frame number 1716, CRC 00 + 8 times: SOF packet with frame number 1717, CRC 1F + 8 times: SOF packet with frame number 1718, CRC 17 + 8 times: SOF packet with frame number 1719, CRC 08 + 8 times: SOF packet with frame number 1720, CRC 09 + 8 times: SOF packet with frame number 1721, CRC 16 + 8 times: SOF packet with frame number 1722, CRC 1E + 8 times: SOF packet with frame number 1723, CRC 01 + 8 times: SOF packet with frame number 1724, CRC 0E + 8 times: SOF packet with frame number 1725, CRC 11 + 8 times: SOF packet with frame number 1726, CRC 19 + 8 times: SOF packet with frame number 1727, CRC 06 + 8 times: SOF packet with frame number 1728, CRC 01 + 8 times: SOF packet with frame number 1729, CRC 1E + 8 times: SOF packet with frame number 1730, CRC 16 + 8 times: SOF packet with frame number 1731, CRC 09 + 8 times: SOF packet with frame number 1732, CRC 06 + 8 times: SOF packet with frame number 1733, CRC 19 + 8 times: SOF packet with frame number 1734, CRC 11 + 8 times: SOF packet with frame number 1735, CRC 0E + 8 times: SOF packet with frame number 1736, CRC 0F + 8 times: SOF packet with frame number 1737, CRC 10 + 8 times: SOF packet with frame number 1738, CRC 18 + 8 times: SOF packet with frame number 1739, CRC 07 + 8 times: SOF packet with frame number 1740, CRC 08 + 8 times: SOF packet with frame number 1741, CRC 17 + 8 times: SOF packet with frame number 1742, CRC 1F + 8 times: SOF packet with frame number 1743, CRC 00 + 8 times: SOF packet with frame number 1744, CRC 1D + 8 times: SOF packet with frame number 1745, CRC 02 + 8 times: SOF packet with frame number 1746, CRC 0A + 8 times: SOF packet with frame number 1747, CRC 15 + 8 times: SOF packet with frame number 1748, CRC 1A + 8 times: SOF packet with frame number 1749, CRC 05 + 8 times: SOF packet with frame number 1750, CRC 0D + 8 times: SOF packet with frame number 1751, CRC 12 + 8 times: SOF packet with frame number 1752, CRC 13 + 8 times: SOF packet with frame number 1753, CRC 0C + 8 times: SOF packet with frame number 1754, CRC 04 + 8 times: SOF packet with frame number 1755, CRC 1B + 8 times: SOF packet with frame number 1756, CRC 14 + 8 times: SOF packet with frame number 1757, CRC 0B + 8 times: SOF packet with frame number 1758, CRC 03 + 8 times: SOF packet with frame number 1759, CRC 1C + 8 times: SOF packet with frame number 1760, CRC 10 + 8 times: SOF packet with frame number 1761, CRC 0F + 8 times: SOF packet with frame number 1762, CRC 07 + 8 times: SOF packet with frame number 1763, CRC 18 + 8 times: SOF packet with frame number 1764, CRC 17 + 8 times: SOF packet with frame number 1765, CRC 08 + 8 times: SOF packet with frame number 1766, CRC 00 + 8 times: SOF packet with frame number 1767, CRC 1F + 8 times: SOF packet with frame number 1768, CRC 1E + 8 times: SOF packet with frame number 1769, CRC 01 + 8 times: SOF packet with frame number 1770, CRC 09 + 8 times: SOF packet with frame number 1771, CRC 16 + 8 times: SOF packet with frame number 1772, CRC 19 + 8 times: SOF packet with frame number 1773, CRC 06 + 8 times: SOF packet with frame number 1774, CRC 0E + 8 times: SOF packet with frame number 1775, CRC 11 + 8 times: SOF packet with frame number 1776, CRC 0C + 8 times: SOF packet with frame number 1777, CRC 13 + 8 times: SOF packet with frame number 1778, CRC 1B + 8 times: SOF packet with frame number 1779, CRC 04 + 8 times: SOF packet with frame number 1780, CRC 0B + 8 times: SOF packet with frame number 1781, CRC 14 + 8 times: SOF packet with frame number 1782, CRC 1C + 8 times: SOF packet with frame number 1783, CRC 03 + 8 times: SOF packet with frame number 1784, CRC 02 + 8 times: SOF packet with frame number 1785, CRC 1D + 8 times: SOF packet with frame number 1786, CRC 15 + 8 times: SOF packet with frame number 1787, CRC 0A + 8 times: SOF packet with frame number 1788, CRC 05 + 8 times: SOF packet with frame number 1789, CRC 1A + 8 times: SOF packet with frame number 1790, CRC 12 + 8 times: SOF packet with frame number 1791, CRC 0D + 8 times: SOF packet with frame number 1792, CRC 19 + 8 times: SOF packet with frame number 1793, CRC 06 + 8 times: SOF packet with frame number 1794, CRC 0E + 8 times: SOF packet with frame number 1795, CRC 11 + 8 times: SOF packet with frame number 1796, CRC 1E + 8 times: SOF packet with frame number 1797, CRC 01 + 8 times: SOF packet with frame number 1798, CRC 09 + 8 times: SOF packet with frame number 1799, CRC 16 + 8 times: SOF packet with frame number 1800, CRC 17 + 8 times: SOF packet with frame number 1801, CRC 08 + 8 times: SOF packet with frame number 1802, CRC 00 + 8 times: SOF packet with frame number 1803, CRC 1F + 8 times: SOF packet with frame number 1804, CRC 10 + 8 times: SOF packet with frame number 1805, CRC 0F + 8 times: SOF packet with frame number 1806, CRC 07 + 8 times: SOF packet with frame number 1807, CRC 18 + 8 times: SOF packet with frame number 1808, CRC 05 + 8 times: SOF packet with frame number 1809, CRC 1A + 8 times: SOF packet with frame number 1810, CRC 12 + 8 times: SOF packet with frame number 1811, CRC 0D + 8 times: SOF packet with frame number 1812, CRC 02 + 8 times: SOF packet with frame number 1813, CRC 1D + 8 times: SOF packet with frame number 1814, CRC 15 + 8 times: SOF packet with frame number 1815, CRC 0A + 8 times: SOF packet with frame number 1816, CRC 0B + 8 times: SOF packet with frame number 1817, CRC 14 + 8 times: SOF packet with frame number 1818, CRC 1C + 8 times: SOF packet with frame number 1819, CRC 03 + 8 times: SOF packet with frame number 1820, CRC 0C + 8 times: SOF packet with frame number 1821, CRC 13 + 8 times: SOF packet with frame number 1822, CRC 1B + 8 times: SOF packet with frame number 1823, CRC 04 + 8 times: SOF packet with frame number 1824, CRC 08 + 8 times: SOF packet with frame number 1825, CRC 17 + 8 times: SOF packet with frame number 1826, CRC 1F + 8 times: SOF packet with frame number 1827, CRC 00 + 8 times: SOF packet with frame number 1828, CRC 0F + 8 times: SOF packet with frame number 1829, CRC 10 + 8 times: SOF packet with frame number 1830, CRC 18 + 8 times: SOF packet with frame number 1831, CRC 07 + 8 times: SOF packet with frame number 1832, CRC 06 + 8 times: SOF packet with frame number 1833, CRC 19 + 8 times: SOF packet with frame number 1834, CRC 11 + 8 times: SOF packet with frame number 1835, CRC 0E + 8 times: SOF packet with frame number 1836, CRC 01 + 8 times: SOF packet with frame number 1837, CRC 1E + 8 times: SOF packet with frame number 1838, CRC 16 + 8 times: SOF packet with frame number 1839, CRC 09 + 8 times: SOF packet with frame number 1840, CRC 14 + 8 times: SOF packet with frame number 1841, CRC 0B + 8 times: SOF packet with frame number 1842, CRC 03 + 8 times: SOF packet with frame number 1843, CRC 1C + 8 times: SOF packet with frame number 1844, CRC 13 + 8 times: SOF packet with frame number 1845, CRC 0C + 8 times: SOF packet with frame number 1846, CRC 04 + 8 times: SOF packet with frame number 1847, CRC 1B + 8 times: SOF packet with frame number 1848, CRC 1A + 8 times: SOF packet with frame number 1849, CRC 05 + 8 times: SOF packet with frame number 1850, CRC 0D + 8 times: SOF packet with frame number 1851, CRC 12 + 8 times: SOF packet with frame number 1852, CRC 1D + 8 times: SOF packet with frame number 1853, CRC 02 + 8 times: SOF packet with frame number 1854, CRC 0A + 8 times: SOF packet with frame number 1855, CRC 15 + 8 times: SOF packet with frame number 1856, CRC 12 + 8 times: SOF packet with frame number 1857, CRC 0D + 8 times: SOF packet with frame number 1858, CRC 05 + 8 times: SOF packet with frame number 1859, CRC 1A + 8 times: SOF packet with frame number 1860, CRC 15 + 8 times: SOF packet with frame number 1861, CRC 0A + 8 times: SOF packet with frame number 1862, CRC 02 + 8 times: SOF packet with frame number 1863, CRC 1D + 8 times: SOF packet with frame number 1864, CRC 1C + 8 times: SOF packet with frame number 1865, CRC 03 + 8 times: SOF packet with frame number 1866, CRC 0B + 8 times: SOF packet with frame number 1867, CRC 14 + 8 times: SOF packet with frame number 1868, CRC 1B + 8 times: SOF packet with frame number 1869, CRC 04 + 8 times: SOF packet with frame number 1870, CRC 0C + 8 times: SOF packet with frame number 1871, CRC 13 + 8 times: SOF packet with frame number 1872, CRC 0E + 8 times: SOF packet with frame number 1873, CRC 11 + 8 times: SOF packet with frame number 1874, CRC 19 + 8 times: SOF packet with frame number 1875, CRC 06 + 8 times: SOF packet with frame number 1876, CRC 09 + 8 times: SOF packet with frame number 1877, CRC 16 + 8 times: SOF packet with frame number 1878, CRC 1E + 8 times: SOF packet with frame number 1879, CRC 01 + 8 times: SOF packet with frame number 1880, CRC 00 + 8 times: SOF packet with frame number 1881, CRC 1F + 8 times: SOF packet with frame number 1882, CRC 17 + 8 times: SOF packet with frame number 1883, CRC 08 + 8 times: SOF packet with frame number 1884, CRC 07 + 8 times: SOF packet with frame number 1885, CRC 18 + 8 times: SOF packet with frame number 1886, CRC 10 + 8 times: SOF packet with frame number 1887, CRC 0F + 8 times: SOF packet with frame number 1888, CRC 03 + 8 times: SOF packet with frame number 1889, CRC 1C + 8 times: SOF packet with frame number 1890, CRC 14 + 8 times: SOF packet with frame number 1891, CRC 0B + 8 times: SOF packet with frame number 1892, CRC 04 + 8 times: SOF packet with frame number 1893, CRC 1B + 8 times: SOF packet with frame number 1894, CRC 13 + 8 times: SOF packet with frame number 1895, CRC 0C + 8 times: SOF packet with frame number 1896, CRC 0D + 8 times: SOF packet with frame number 1897, CRC 12 + 8 times: SOF packet with frame number 1898, CRC 1A + 8 times: SOF packet with frame number 1899, CRC 05 + 8 times: SOF packet with frame number 1900, CRC 0A + 8 times: SOF packet with frame number 1901, CRC 15 + 8 times: SOF packet with frame number 1902, CRC 1D + 8 times: SOF packet with frame number 1903, CRC 02 + 8 times: SOF packet with frame number 1904, CRC 1F + 8 times: SOF packet with frame number 1905, CRC 00 + 8 times: SOF packet with frame number 1906, CRC 08 + 8 times: SOF packet with frame number 1907, CRC 17 + 8 times: SOF packet with frame number 1908, CRC 18 + 8 times: SOF packet with frame number 1909, CRC 07 + 8 times: SOF packet with frame number 1910, CRC 0F + 8 times: SOF packet with frame number 1911, CRC 10 + 8 times: SOF packet with frame number 1912, CRC 11 + 8 times: SOF packet with frame number 1913, CRC 0E + 8 times: SOF packet with frame number 1914, CRC 06 + 8 times: SOF packet with frame number 1915, CRC 19 + 8 times: SOF packet with frame number 1916, CRC 16 + 8 times: SOF packet with frame number 1917, CRC 09 + 8 times: SOF packet with frame number 1918, CRC 01 + 8 times: SOF packet with frame number 1919, CRC 1E + 8 times: SOF packet with frame number 1920, CRC 0F + 8 times: SOF packet with frame number 1921, CRC 10 + 8 times: SOF packet with frame number 1922, CRC 18 + 8 times: SOF packet with frame number 1923, CRC 07 + 8 times: SOF packet with frame number 1924, CRC 08 + 8 times: SOF packet with frame number 1925, CRC 17 + 8 times: SOF packet with frame number 1926, CRC 1F + 8 times: SOF packet with frame number 1927, CRC 00 + 8 times: SOF packet with frame number 1928, CRC 01 + 8 times: SOF packet with frame number 1929, CRC 1E + 8 times: SOF packet with frame number 1930, CRC 16 + 8 times: SOF packet with frame number 1931, CRC 09 + 8 times: SOF packet with frame number 1932, CRC 06 + 8 times: SOF packet with frame number 1933, CRC 19 + 8 times: SOF packet with frame number 1934, CRC 11 + 8 times: SOF packet with frame number 1935, CRC 0E + 8 times: SOF packet with frame number 1936, CRC 13 + 8 times: SOF packet with frame number 1937, CRC 0C + 8 times: SOF packet with frame number 1938, CRC 04 + 8 times: SOF packet with frame number 1939, CRC 1B + 8 times: SOF packet with frame number 1940, CRC 14 + 8 times: SOF packet with frame number 1941, CRC 0B + 8 times: SOF packet with frame number 1942, CRC 03 + 8 times: SOF packet with frame number 1943, CRC 1C + 8 times: SOF packet with frame number 1944, CRC 1D + 8 times: SOF packet with frame number 1945, CRC 02 + 8 times: SOF packet with frame number 1946, CRC 0A + 8 times: SOF packet with frame number 1947, CRC 15 + 8 times: SOF packet with frame number 1948, CRC 1A + 8 times: SOF packet with frame number 1949, CRC 05 + 8 times: SOF packet with frame number 1950, CRC 0D + 8 times: SOF packet with frame number 1951, CRC 12 + 8 times: SOF packet with frame number 1952, CRC 1E + 8 times: SOF packet with frame number 1953, CRC 01 + 8 times: SOF packet with frame number 1954, CRC 09 + 8 times: SOF packet with frame number 1955, CRC 16 + 8 times: SOF packet with frame number 1956, CRC 19 + 8 times: SOF packet with frame number 1957, CRC 06 + 8 times: SOF packet with frame number 1958, CRC 0E + 8 times: SOF packet with frame number 1959, CRC 11 + 8 times: SOF packet with frame number 1960, CRC 10 + 8 times: SOF packet with frame number 1961, CRC 0F + 8 times: SOF packet with frame number 1962, CRC 07 + 8 times: SOF packet with frame number 1963, CRC 18 + 8 times: SOF packet with frame number 1964, CRC 17 + 8 times: SOF packet with frame number 1965, CRC 08 + 8 times: SOF packet with frame number 1966, CRC 00 + 8 times: SOF packet with frame number 1967, CRC 1F + 8 times: SOF packet with frame number 1968, CRC 02 + 8 times: SOF packet with frame number 1969, CRC 1D + 8 times: SOF packet with frame number 1970, CRC 15 + 8 times: SOF packet with frame number 1971, CRC 0A + 8 times: SOF packet with frame number 1972, CRC 05 + 8 times: SOF packet with frame number 1973, CRC 1A + 8 times: SOF packet with frame number 1974, CRC 12 + 8 times: SOF packet with frame number 1975, CRC 0D + 8 times: SOF packet with frame number 1976, CRC 0C + 8 times: SOF packet with frame number 1977, CRC 13 + 8 times: SOF packet with frame number 1978, CRC 1B + 8 times: SOF packet with frame number 1979, CRC 04 + 8 times: SOF packet with frame number 1980, CRC 0B + 8 times: SOF packet with frame number 1981, CRC 14 + 8 times: SOF packet with frame number 1982, CRC 1C + 8 times: SOF packet with frame number 1983, CRC 03 + 8 times: SOF packet with frame number 1984, CRC 04 + 8 times: SOF packet with frame number 1985, CRC 1B + 8 times: SOF packet with frame number 1986, CRC 13 + 8 times: SOF packet with frame number 1987, CRC 0C + 8 times: SOF packet with frame number 1988, CRC 03 + 8 times: SOF packet with frame number 1989, CRC 1C + SOF packet with frame number 1990, CRC 14 + 16 SOF packets + 7 times: SOF packet with frame number 1990, CRC 14 + 8 times: SOF packet with frame number 1991, CRC 0B + SOF packet with frame number 1992, CRC 0A + 16 SOF packets + 7 times: SOF packet with frame number 1992, CRC 0A + 8 times: SOF packet with frame number 1993, CRC 15 + SOF packet with frame number 1994, CRC 1D + 16 SOF packets + 7 times: SOF packet with frame number 1994, CRC 1D + 8 times: SOF packet with frame number 1995, CRC 02 + SOF packet with frame number 1996, CRC 0D + 16 SOF packets + 7 times: SOF packet with frame number 1996, CRC 0D + 8 times: SOF packet with frame number 1997, CRC 12 + SOF packet with frame number 1998, CRC 1A + 16 SOF packets + 7 times: SOF packet with frame number 1998, CRC 1A + 8 times: SOF packet with frame number 1999, CRC 05 + SOF packet with frame number 2000, CRC 18 + 16 SOF packets + 7 times: SOF packet with frame number 2000, CRC 18 + 8 times: SOF packet with frame number 2001, CRC 07 + SOF packet with frame number 2002, CRC 0F + 16 SOF packets + 7 times: SOF packet with frame number 2002, CRC 0F + 8 times: SOF packet with frame number 2003, CRC 10 + SOF packet with frame number 2004, CRC 1F + 2 SOF packets + 2 times: SOF packet with frame number 2004, CRC 1F +Setting address to 1 for device 0 + SETUP transaction on 0.0 with 8 data bytes, ACK: [00, 05, 01, 00, 00, 00, 00, 00] + SETUP packet on 0.0, CRC 02 + DATA0 packet with CRC 25EB and 8 data bytes: [00, 05, 01, 00, 00, 00, 00, 00] + ACK packet + IN transaction on 0.0 with no data, ACK + IN packet on 0.0, CRC 02 + DATA1 packet with CRC 0000 and no data + ACK packet +Getting device descriptor #0 for device 1, reading 18 bytes + SETUP transaction on 1.0 with 8 data bytes, ACK: [80, 06, 00, 01, 00, 00, 12, 00] + SETUP packet on 1.0, CRC 1D + DATA0 packet with CRC F4E0 and 8 data bytes: [80, 06, 00, 01, 00, 00, 12, 00] + ACK packet + IN transaction on 1.0 with 18 data bytes, ACK: [12, 01, 00, 02, 00, 00, 00, 40, 09, 12, 0A, 00, 01, 00, 01, 02, 00, 01] + IN packet on 1.0, CRC 1D + DATA1 packet with CRC EB49 and 18 data bytes: [12, 01, 00, 02, 00, 00, 00, 40, 09, 12, 0A, 00, 01, 00, 01, 02, 00, 01] + ACK packet + OUT transaction on 1.0 with no data, ACK + OUT packet on 1.0, CRC 1D + DATA1 packet with CRC 0000 and no data + ACK packet +Getting string descriptor #2, language 0x0409 for device 1, reading 2 bytes + SETUP transaction on 1.0 with 8 data bytes, ACK: [80, 06, 02, 03, 09, 04, 02, 00] + SETUP packet on 1.0, CRC 1D + DATA0 packet with CRC 4BD7 and 8 data bytes: [80, 06, 02, 03, 09, 04, 02, 00] + ACK packet + IN transaction on 1.0 with 2 data bytes, ACK: '2\x03' + IN packet on 1.0, CRC 1D + DATA1 packet with CRC 2EAB and 2 data bytes: '2\x03' + ACK packet + OUT transaction on 1.0 with no data, ACK + OUT packet on 1.0, CRC 1D + DATA1 packet with CRC 0000 and no data + ACK packet +Getting string descriptor #2, language 0x0409 for device 1, reading 50 bytes: 'USB Analyzer Test Device' + SETUP transaction on 1.0 with 8 data bytes, ACK: [80, 06, 02, 03, 09, 04, 32, 00] + SETUP packet on 1.0, CRC 1D + DATA0 packet with CRC 4BC3 and 8 data bytes: [80, 06, 02, 03, 09, 04, 32, 00] + ACK packet + IN transaction on 1.0 with 50 data bytes, ACK: [32, 03, 55, 00, 53, 00, 42, 00, 20, 00, 41, 00, 6E, 00, 61, 00, 6C, 00, 79, 00, 7A, 00, 65, 00, 72, 00, 20, 00, 54, 00, 65, 00, 73, 00, 74, 00, 20, 00, 44, 00, 65, 00, 76, 00, 69, 00, 63, 00, 65, 00] + IN packet on 1.0, CRC 1D + DATA1 packet with CRC FEEE and 50 data bytes: [32, 03, 55, 00, 53, 00, 42, 00, 20, 00, 41, 00, 6E, 00, 61, 00, 6C, 00, 79, 00, 7A, 00, 65, 00, 72, 00, 20, 00, 54, 00, 65, 00, 73, 00, 74, 00, 20, 00, 44, 00, 65, 00, 76, 00, 69, 00, 63, 00, 65, 00] + ACK packet + OUT transaction on 1.0 with no data, ACK + OUT packet on 1.0, CRC 1D + DATA1 packet with CRC 0000 and no data + ACK packet +Getting string descriptor #1, language 0x0409 for device 1, reading 2 bytes + SETUP transaction on 1.0 with 8 data bytes, ACK: [80, 06, 01, 03, 09, 04, 02, 00] + SETUP packet on 1.0, CRC 1D + DATA0 packet with CRC 78D7 and 8 data bytes: [80, 06, 01, 03, 09, 04, 02, 00] + ACK packet + IN transaction on 1.0 with 2 data bytes, ACK: '\"\x03' + IN packet on 1.0, CRC 1D + DATA1 packet with CRC EEA6 and 2 data bytes: '\"\x03' + ACK packet + OUT transaction on 1.0 with no data, ACK + OUT packet on 1.0, CRC 1D + DATA1 packet with CRC 0000 and no data + ACK packet +Getting string descriptor #1, language 0x0409 for device 1, reading 34 bytes: 'Cynthion Project' + SETUP transaction on 1.0 with 8 data bytes, ACK: [80, 06, 01, 03, 09, 04, 22, 00] + SETUP packet on 1.0, CRC 1D + DATA0 packet with CRC B8CE and 8 data bytes: [80, 06, 01, 03, 09, 04, 22, 00] + ACK packet + IN transaction on 1.0 with 34 data bytes, ACK: [22, 03, 43, 00, 79, 00, 6E, 00, 74, 00, 68, 00, 69, 00, 6F, 00, 6E, 00, 20, 00, 50, 00, 72, 00, 6F, 00, 6A, 00, 65, 00, 63, 00, 74, 00] + IN packet on 1.0, CRC 1D + DATA1 packet with CRC F669 and 34 data bytes: [22, 03, 43, 00, 79, 00, 6E, 00, 74, 00, 68, 00, 69, 00, 6F, 00, 6E, 00, 20, 00, 50, 00, 72, 00, 6F, 00, 6A, 00, 65, 00, 63, 00, 74, 00] + ACK packet + OUT transaction on 1.0 with no data, ACK + OUT packet on 1.0, CRC 1D + DATA1 packet with CRC 0000 and no data + ACK packet +Getting configuration descriptor #0 for device 1, reading 9 bytes + SETUP transaction on 1.0 with 8 data bytes, ACK: [80, 06, 00, 02, 00, 00, 09, 00] + SETUP packet on 1.0, CRC 1D + DATA0 packet with CRC 04AE and 8 data bytes: [80, 06, 00, 02, 00, 00, 09, 00] + ACK packet + IN transaction on 1.0 with 9 data bytes, ACK: [09, 02, 19, 00, 01, 01, 00, 80, FA] + IN packet on 1.0, CRC 1D + DATA1 packet with CRC F84B and 9 data bytes: [09, 02, 19, 00, 01, 01, 00, 80, FA] + ACK packet + OUT transaction on 1.0 with no data, ACK + OUT packet on 1.0, CRC 1D + DATA1 packet with CRC 0000 and no data + ACK packet +Getting configuration descriptor #0 for device 1, reading 25 bytes + SETUP transaction on 1.0 with 8 data bytes, ACK: [80, 06, 00, 02, 00, 00, 19, 00] + SETUP packet on 1.0, CRC 1D + DATA0 packet with CRC C4A3 and 8 data bytes: [80, 06, 00, 02, 00, 00, 19, 00] + ACK packet + IN transaction on 1.0 with 25 data bytes, ACK: [09, 02, 19, 00, 01, 01, 00, 80, FA, 09, 04, 00, 00, 01, FF, FF, FF, 00, 07, 05, 81, 03, 00, 02, 05] + IN packet on 1.0, CRC 1D + DATA1 packet with CRC A038 and 25 data bytes: [09, 02, 19, 00, 01, 01, 00, 80, FA, 09, 04, 00, 00, 01, FF, FF, FF, 00, 07, 05, 81, 03, 00, 02, 05] + ACK packet + OUT transaction on 1.0 with no data, ACK + OUT packet on 1.0, CRC 1D + DATA1 packet with CRC 0000 and no data + ACK packet +Setting configuration 1 for device 1 + SETUP transaction on 1.0 with 8 data bytes, ACK: [00, 09, 01, 00, 00, 00, 00, 00] + SETUP packet on 1.0, CRC 1D + DATA0 packet with CRC 2527 and 8 data bytes: [00, 09, 01, 00, 00, 00, 00, 00] + ACK packet + IN transaction on 1.0 with no data, ACK + IN packet on 1.0, CRC 1D + DATA1 packet with CRC 0000 and no data + ACK packet +Getting string descriptor #0 for device 1, reading 4 of 255 requested bytes + SETUP transaction on 1.0 with 8 data bytes, ACK: [80, 06, 00, 03, 00, 00, FF, 00] + SETUP packet on 1.0, CRC 1D + DATA0 packet with CRC 64D4 and 8 data bytes: [80, 06, 00, 03, 00, 00, FF, 00] + ACK packet + IN transaction on 1.0 with 4 data bytes, ACK: [04, 03, 09, 04] + IN packet on 1.0, CRC 1D + DATA1 packet with CRC 7809 and 4 data bytes: [04, 03, 09, 04] + ACK packet + OUT transaction on 1.0 with no data, ACK + OUT packet on 1.0, CRC 1D + DATA1 packet with CRC 0000 and no data + ACK packet +Polling 1 times for interrupt transfer on endpoint 1.1 IN + IN transaction on 1.1 + IN packet on 1.1, CRC 0B +1 invalid groups + DATA0 transaction on 0.16 + Malformed packet (possibly DATA0, but bad CRC) of 316 bytes: [C3, 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 3F, 88, 08, 89, 09, 8A, 0A, 8B, 0B, 8C, 0C, 8D, 0D, 8E, 0E, 8F, 0F, 90, 10, 91, 11, 92, 12, 93, 13, 94, 14, 95, 15, 96, 16, 97, 17, 98, 18, 99, 19, 9A, 1A, 9B, 1B, 9C, 1C, 9D, 1D, 9E, 1E, 9F, 9F, A0, 20, A1, 21, A2, 22, A3, 23, A4, 24, A5, 25, A6, 26, A7, 27, A8, 28, A9, 29, AA, 2A, AB, 2B, AC, 2C, AD, 2D, AE, 2E, AF, 2F, B0, 30, B1]... +1 invalid groups + ACK transaction on 0.16, ACK + ACK packet +Polling 1 times for interrupt transfer on endpoint 1.1 IN + IN transaction on 1.1 + IN packet on 1.1, CRC 0B +1 invalid groups + DATA1 transaction on 0.16 + Malformed packet (possibly DATA1, but bad CRC) of 514 bytes: [4B, 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 3F, 88, 08, 89, 09, 8A, 0A, 8B, 0B, 8C, 0C, 8D, 0D, 8E, 0E, 8F, 0F, 90, 10, 91, 11, 92, 12, 93, 13, 94, 14, 95, 15, 96, 16, 97, 17, 98, 18, 99, 19, 9A, 1A, 9B, 1B, 9C, 1C, 9D, 1D, 9E, 1E, 9F, 9F, A0, 20, A1, 21, A2, 22, A3, 23, A4, 24, A5, 25, A6, E6, B7, 13, 54, 94, D4, 14, 55, 95, D5, 15, 56, 96, D6, 16, 57, 97, D7, 17, 58, 98, D8]... +1 invalid groups + ACK transaction on 0.16, ACK + ACK packet +Polling 1 times for interrupt transfer on endpoint 1.1 IN + IN transaction on 1.1 + IN packet on 1.1, CRC 0B +1 invalid groups + DATA0 transaction on 0.16 + Malformed packet (possibly DATA0, but bad CRC) of 159 bytes: [C3, 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 3F, 88, 08, 89, 09, 8A, 0A, 8B, 0B, 8C, 0C, 8D, 0D, 8E, 0E, 8F, 0F, 90, 10, 91, 11, 92, 12, 93, 13, 94, 14, 95, 15, 96, 16, 97, 17, 98, 18, 99, 19, 9A, 1A, 9B, 1B, 9C, 1C, 9D, 1D, 9E, 1E, 9F, 9F, A0, 20, A1, 21, A2, 22, A3, 23, A4, 24, A5, 25, A6, 26, A7, 27, A8, 28, A9, 29, AA, 2A, AB, 2B, AC, 2C, AD, 2D, AE, 2E, AF, 1F, 58, 98, D8]... +1 invalid groups + ACK transaction on 0.16, ACK + ACK packet +Polling 1 times for interrupt transfer on endpoint 1.1 IN + IN transaction on 1.1 + IN packet on 1.1, CRC 0B +1 invalid groups + DATA1 transaction on 0.16 + Malformed packet (possibly DATA1, but bad CRC) of 506 bytes: [4B, 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 3F, 88, 08, 89, 09, 8A, 0A, 8B, 0B, 8C, 0C, 8D, 0D, 8E, 0E, 8F, 0F, 90, 10, 91, 11, 92, 12, 93, 13, 94, 14, 95, 15, 96, 16, 97, 17, 98, 18, 99, 19, 9A, 1A, 9B, 1B, 9C, 1C, 9D, 1D, 9E, 1E, 9F, 9F, A0, 20, A1, 21, A2, 22, A3, 23, A4, 24, A5, 25, A6, 26, A7, 27, A8, 28, A9, 29, AA, 2A, AB, 2B, AC, 2C, AD, 2D, AE, 2E, AF, 2F, B0, 30, B1]... +1 invalid groups + ACK transaction on 0.16, ACK + ACK packet +Polling 1 times for interrupt transfer on endpoint 1.1 IN + IN transaction on 1.1 + IN packet on 1.1, CRC 0B +1 invalid groups + DATA0 transaction on 0.16 + Malformed packet (possibly DATA0, but bad CRC) of 61 bytes: [C3, 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 3F, 88, 08, 89, 09, 8A, 0A, 8B, 0B, 8C, 0C, 8D, 0D, 8E, 0E, 8F, 0F, 90, 10, 91, 11, 92, 12, 93, 13, 94, 14, 95, 15, 96, 16, 97, 17, 98, 18, 99, 19, 9A, 1A, 9B, 1B, 9C, 1C, 9D, 1D] +1 invalid groups + ACK transaction on 0.16, ACK + ACK packet +Polling 1 times for interrupt transfer on endpoint 1.1 IN + IN transaction on 1.1 + IN packet on 1.1, CRC 0B +1 invalid groups + DATA1 transaction on 0.16 + Malformed packet (possibly DATA1, but bad CRC) of 61 bytes: [4B, 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 3F, 88, 08, 89, 09, 8A, 0A, 8B, 0B, 8C, 0C, 8D, 0D, 8E, 0E, 8F, 0F, 90, 10, 91, 11, 92, 12, 93, 13, 94, 14, 95, 15, 96, 16, 97, 17, 98, 18, 99, 19, 9A, 1A, 9B, 1B, 9C, 1C, 9D, 1D] +1 invalid groups + ACK transaction on 0.16, ACK + ACK packet +Polling 1 times for interrupt transfer on endpoint 1.1 IN + IN transaction on 1.1 + IN packet on 1.1, CRC 0B +1 invalid groups + DATA0 transaction on 0.16 + Malformed packet (possibly DATA0, but bad CRC) of 159 bytes: [C3, 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 3F, 88, 08, 89, 09, 8A, 0A, 8B, 0B, 8C, 0C, 8D, 0D, 8E, 0E, 8F, 0F, 90, 10, 91, 11, 92, 12, 93, 13, 94, 14, 95, 15, 96, 16, 97, 17, 98, 18, 99, 19, 9A, 1A, 9B, 1B, 9C, 1C, 9D, 1D, 9E, 1E, 9F, 9F, A0, 20, A1, 21, A2, 22, A3, 23, A4, 24, A5, 25, A6, 26, A7, 27, A8, 28, A9, 29, AA, 2A, AB, 2B, AC, 2C, AD, 2D, AE, 2E, AF, 1F, 58, 98, D8]... +1 invalid groups + ACK transaction on 0.16, ACK + ACK packet +Polling 1 times for interrupt transfer on endpoint 1.1 IN + IN transaction on 1.1 + IN packet on 1.1, CRC 0B +1 invalid groups + DATA1 transaction on 0.16 + Malformed packet (possibly DATA1, but bad CRC) of 381 bytes: [4B, 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 3F, 88, 08, 89, 09, 8A, 0A, 8B, 0B, 8C, 0C, 8D, 0D, 8E, 0E, 8F, 0F, 90, 10, 91, 11, 92, 12, 93, 13, 94, 14, 95, 15, 96, 16, 97, 17, 98, 18, 99, 19, 9A, 1A, 9B, 1B, 9C, 1C, 9D, 1D, 9E, 1E, 9F, 9F, A0, 20, A1, 21, A2, 22, A3, 23, A4, 24, A5, 25, A6, 26, A7, 27, A8, 28, A9, 29, AA, 2A, AB, 2B, AC, 2C, AD, 2D, AE, 2E, AF, 2F, B0, 30, B1]... +1 invalid groups + ACK transaction on 0.16, ACK + ACK packet diff --git a/tests/tests.txt b/tests/tests.txt index 039dc28e..a70f00d7 100644 --- a/tests/tests.txt +++ b/tests/tests.txt @@ -1,3 +1,4 @@ +analyzer-test-bad-cable emf2022-badge hackrf-connect hackrf-dfu-enum From c54b386d550def63361ee8ccd82058ae6639f2ba Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Thu, 18 Jul 2024 19:28:50 +0100 Subject: [PATCH 5/8] Improve labelling of groups of malformed packets. --- src/capture.rs | 17 +++++++++++++---- tests/analyzer-test-bad-cable/reference.txt | 16 ++++++++-------- tests/mouse/reference.txt | 2 +- tests/ui/mouse-step/reference.txt | 14 +++++++------- 4 files changed, 29 insertions(+), 20 deletions(-) diff --git a/src/capture.rs b/src/capture.rs index f49d9e8f..1b98ebb6 100644 --- a/src/capture.rs +++ b/src/capture.rs @@ -596,8 +596,6 @@ impl Transaction { Ok(match (self.start_pid, &self.split) { (SOF, _) => format!( "{} SOF packets", self.packet_count()), - (Malformed, _) => format!( - "{} malformed packets", self.packet_count()), (SPLIT, Some((split_fields, token_pid))) => format!( "{} {}", match split_fields.sc() { @@ -1246,8 +1244,19 @@ impl ItemSource for CaptureReader { let entry = self.transfer_index.get(*transfer_id)?; let endpoint_id = entry.endpoint_id(); let endpoint = self.endpoints.get(endpoint_id)?; - let transaction = self.transaction(*transaction_id)?; - transaction.description(self, &endpoint)? + let packet_id_range = self.transaction_index.target_range( + *transaction_id, self.packet_index.len())?; + let start_packet_id = packet_id_range.start; + let start_packet = self.packet(start_packet_id)?; + if validate_packet(&start_packet) { + let transaction = self.transaction(*transaction_id)?; + transaction.description(self, &endpoint)? + } else { + let packet_count = packet_id_range.len(); + format!("{} malformed {}", + packet_count, + if packet_count == 1 {"packet"} else {"packets"}) + } }, Transfer(transfer_id) => { use EndpointType::*; diff --git a/tests/analyzer-test-bad-cable/reference.txt b/tests/analyzer-test-bad-cable/reference.txt index 18129832..4b1dfa3e 100644 --- a/tests/analyzer-test-bad-cable/reference.txt +++ b/tests/analyzer-test-bad-cable/reference.txt @@ -1983,7 +1983,7 @@ Polling 1 times for interrupt transfer on endpoint 1.1 IN IN transaction on 1.1 IN packet on 1.1, CRC 0B 1 invalid groups - DATA0 transaction on 0.16 + 1 malformed packet Malformed packet (possibly DATA0, but bad CRC) of 316 bytes: [C3, 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 3F, 88, 08, 89, 09, 8A, 0A, 8B, 0B, 8C, 0C, 8D, 0D, 8E, 0E, 8F, 0F, 90, 10, 91, 11, 92, 12, 93, 13, 94, 14, 95, 15, 96, 16, 97, 17, 98, 18, 99, 19, 9A, 1A, 9B, 1B, 9C, 1C, 9D, 1D, 9E, 1E, 9F, 9F, A0, 20, A1, 21, A2, 22, A3, 23, A4, 24, A5, 25, A6, 26, A7, 27, A8, 28, A9, 29, AA, 2A, AB, 2B, AC, 2C, AD, 2D, AE, 2E, AF, 2F, B0, 30, B1]... 1 invalid groups ACK transaction on 0.16, ACK @@ -1992,7 +1992,7 @@ Polling 1 times for interrupt transfer on endpoint 1.1 IN IN transaction on 1.1 IN packet on 1.1, CRC 0B 1 invalid groups - DATA1 transaction on 0.16 + 1 malformed packet Malformed packet (possibly DATA1, but bad CRC) of 514 bytes: [4B, 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 3F, 88, 08, 89, 09, 8A, 0A, 8B, 0B, 8C, 0C, 8D, 0D, 8E, 0E, 8F, 0F, 90, 10, 91, 11, 92, 12, 93, 13, 94, 14, 95, 15, 96, 16, 97, 17, 98, 18, 99, 19, 9A, 1A, 9B, 1B, 9C, 1C, 9D, 1D, 9E, 1E, 9F, 9F, A0, 20, A1, 21, A2, 22, A3, 23, A4, 24, A5, 25, A6, E6, B7, 13, 54, 94, D4, 14, 55, 95, D5, 15, 56, 96, D6, 16, 57, 97, D7, 17, 58, 98, D8]... 1 invalid groups ACK transaction on 0.16, ACK @@ -2001,7 +2001,7 @@ Polling 1 times for interrupt transfer on endpoint 1.1 IN IN transaction on 1.1 IN packet on 1.1, CRC 0B 1 invalid groups - DATA0 transaction on 0.16 + 1 malformed packet Malformed packet (possibly DATA0, but bad CRC) of 159 bytes: [C3, 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 3F, 88, 08, 89, 09, 8A, 0A, 8B, 0B, 8C, 0C, 8D, 0D, 8E, 0E, 8F, 0F, 90, 10, 91, 11, 92, 12, 93, 13, 94, 14, 95, 15, 96, 16, 97, 17, 98, 18, 99, 19, 9A, 1A, 9B, 1B, 9C, 1C, 9D, 1D, 9E, 1E, 9F, 9F, A0, 20, A1, 21, A2, 22, A3, 23, A4, 24, A5, 25, A6, 26, A7, 27, A8, 28, A9, 29, AA, 2A, AB, 2B, AC, 2C, AD, 2D, AE, 2E, AF, 1F, 58, 98, D8]... 1 invalid groups ACK transaction on 0.16, ACK @@ -2010,7 +2010,7 @@ Polling 1 times for interrupt transfer on endpoint 1.1 IN IN transaction on 1.1 IN packet on 1.1, CRC 0B 1 invalid groups - DATA1 transaction on 0.16 + 1 malformed packet Malformed packet (possibly DATA1, but bad CRC) of 506 bytes: [4B, 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 3F, 88, 08, 89, 09, 8A, 0A, 8B, 0B, 8C, 0C, 8D, 0D, 8E, 0E, 8F, 0F, 90, 10, 91, 11, 92, 12, 93, 13, 94, 14, 95, 15, 96, 16, 97, 17, 98, 18, 99, 19, 9A, 1A, 9B, 1B, 9C, 1C, 9D, 1D, 9E, 1E, 9F, 9F, A0, 20, A1, 21, A2, 22, A3, 23, A4, 24, A5, 25, A6, 26, A7, 27, A8, 28, A9, 29, AA, 2A, AB, 2B, AC, 2C, AD, 2D, AE, 2E, AF, 2F, B0, 30, B1]... 1 invalid groups ACK transaction on 0.16, ACK @@ -2019,7 +2019,7 @@ Polling 1 times for interrupt transfer on endpoint 1.1 IN IN transaction on 1.1 IN packet on 1.1, CRC 0B 1 invalid groups - DATA0 transaction on 0.16 + 1 malformed packet Malformed packet (possibly DATA0, but bad CRC) of 61 bytes: [C3, 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 3F, 88, 08, 89, 09, 8A, 0A, 8B, 0B, 8C, 0C, 8D, 0D, 8E, 0E, 8F, 0F, 90, 10, 91, 11, 92, 12, 93, 13, 94, 14, 95, 15, 96, 16, 97, 17, 98, 18, 99, 19, 9A, 1A, 9B, 1B, 9C, 1C, 9D, 1D] 1 invalid groups ACK transaction on 0.16, ACK @@ -2028,7 +2028,7 @@ Polling 1 times for interrupt transfer on endpoint 1.1 IN IN transaction on 1.1 IN packet on 1.1, CRC 0B 1 invalid groups - DATA1 transaction on 0.16 + 1 malformed packet Malformed packet (possibly DATA1, but bad CRC) of 61 bytes: [4B, 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 3F, 88, 08, 89, 09, 8A, 0A, 8B, 0B, 8C, 0C, 8D, 0D, 8E, 0E, 8F, 0F, 90, 10, 91, 11, 92, 12, 93, 13, 94, 14, 95, 15, 96, 16, 97, 17, 98, 18, 99, 19, 9A, 1A, 9B, 1B, 9C, 1C, 9D, 1D] 1 invalid groups ACK transaction on 0.16, ACK @@ -2037,7 +2037,7 @@ Polling 1 times for interrupt transfer on endpoint 1.1 IN IN transaction on 1.1 IN packet on 1.1, CRC 0B 1 invalid groups - DATA0 transaction on 0.16 + 1 malformed packet Malformed packet (possibly DATA0, but bad CRC) of 159 bytes: [C3, 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 3F, 88, 08, 89, 09, 8A, 0A, 8B, 0B, 8C, 0C, 8D, 0D, 8E, 0E, 8F, 0F, 90, 10, 91, 11, 92, 12, 93, 13, 94, 14, 95, 15, 96, 16, 97, 17, 98, 18, 99, 19, 9A, 1A, 9B, 1B, 9C, 1C, 9D, 1D, 9E, 1E, 9F, 9F, A0, 20, A1, 21, A2, 22, A3, 23, A4, 24, A5, 25, A6, 26, A7, 27, A8, 28, A9, 29, AA, 2A, AB, 2B, AC, 2C, AD, 2D, AE, 2E, AF, 1F, 58, 98, D8]... 1 invalid groups ACK transaction on 0.16, ACK @@ -2046,7 +2046,7 @@ Polling 1 times for interrupt transfer on endpoint 1.1 IN IN transaction on 1.1 IN packet on 1.1, CRC 0B 1 invalid groups - DATA1 transaction on 0.16 + 1 malformed packet Malformed packet (possibly DATA1, but bad CRC) of 381 bytes: [4B, 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 3F, 88, 08, 89, 09, 8A, 0A, 8B, 0B, 8C, 0C, 8D, 0D, 8E, 0E, 8F, 0F, 90, 10, 91, 11, 92, 12, 93, 13, 94, 14, 95, 15, 96, 16, 97, 17, 98, 18, 99, 19, 9A, 1A, 9B, 1B, 9C, 1C, 9D, 1D, 9E, 1E, 9F, 9F, A0, 20, A1, 21, A2, 22, A3, 23, A4, 24, A5, 25, A6, 26, A7, 27, A8, 28, A9, 29, AA, 2A, AB, 2B, AC, 2C, AD, 2D, AE, 2E, AF, 2F, B0, 30, B1]... 1 invalid groups ACK transaction on 0.16, ACK diff --git a/tests/mouse/reference.txt b/tests/mouse/reference.txt index 738225ec..1c4942fe 100644 --- a/tests/mouse/reference.txt +++ b/tests/mouse/reference.txt @@ -1,5 +1,5 @@ 1 invalid groups - 1 malformed packets + 1 malformed packet Malformed packet (invalid PID) of 1 byte: [FF] Getting device descriptor #0 for device 0, reading 18 of 64 requested bytes SETUP transaction on 0.0 with 8 data bytes, ACK: [80, 06, 00, 01, 00, 00, 40, 00] diff --git a/tests/ui/mouse-step/reference.txt b/tests/ui/mouse-step/reference.txt index b61a53ca..25c39bde 100644 --- a/tests/ui/mouse-step/reference.txt +++ b/tests/ui/mouse-step/reference.txt @@ -4,8 +4,8 @@ At traffic row 0: + 1 invalid groups Expanding traffic view, row 0: 1 invalid groups At traffic row 1: -+ 1 malformed packets -Expanding traffic view, row 1: 1 malformed packets ++ 1 malformed packet +Expanding traffic view, row 1: 1 malformed packet At traffic row 2: + Malformed packet (invalid PID) of 1 byte: [FF] Updating after 2 packets decoded @@ -13,10 +13,10 @@ At traffic row 3: + Incomplete control transfer on device 0 At traffic row 0: - 1 invalid groups -- 1 malformed packets +- 1 malformed packet - Malformed packet (invalid PID) of 1 byte: [FF] + 1 invalid groups -+ 1 malformed packets ++ 1 malformed packet + Malformed packet (invalid PID) of 1 byte: [FF] Expanding traffic view, row 3: Incomplete control transfer on device 0 At traffic row 4: @@ -180,7 +180,7 @@ At traffic row 25: + Incomplete control transfer on device 4 At traffic row 0: - 1 invalid groups -- 1 malformed packets +- 1 malformed packet - Malformed packet (invalid PID) of 1 byte: [FF] - Incomplete control transfer on device 0 - SETUP transaction on 0.0 @@ -201,7 +201,7 @@ At traffic row 0: - OUT transaction on 0.0 - Incomplete control transfer on device 0 + 1 invalid groups -+ 1 malformed packets ++ 1 malformed packet + Malformed packet (invalid PID) of 1 byte: [FF] + Getting device descriptor #0 for device 0, reading 18 of 64 requested bytes + SETUP transaction on 0.0 with 8 data bytes, ACK: [80, 06, 00, 01, 00, 00, 40, 00] @@ -691,4 +691,4 @@ Collapsing traffic view, row 0: 1 invalid groups At traffic row 2: - Malformed packet (invalid PID) of 1 byte: [FF] At traffic row 1: -- 1 malformed packets +- 1 malformed packet From 1541c2fc1911fb5e4437e5c1fe0895b35ade0db4 Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Mon, 22 Jul 2024 18:29:00 +0100 Subject: [PATCH 6/8] Implement From<&u8> for PID. --- src/capture.rs | 2 +- src/decoder.rs | 2 +- src/usb.rs | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/capture.rs b/src/capture.rs index 1b98ebb6..4b0d7dfe 100644 --- a/src/capture.rs +++ b/src/capture.rs @@ -797,7 +797,7 @@ impl CaptureReader { match data_packet.first() { None => bail!("Found empty packet instead of setup data"), Some(byte) => { - let pid = PID::from(*byte); + let pid = PID::from(byte); if pid != PID::DATA0 { bail!("Found {pid} packet instead of setup data") } else if data_packet.len() != 11 { diff --git a/src/decoder.rs b/src/decoder.rs index b86ef468..5e65cac2 100644 --- a/src/decoder.rs +++ b/src/decoder.rs @@ -13,7 +13,7 @@ impl PID { let first_byte = packet .first() .context("Packet is empty, cannot retrieve PID")?; - Ok(PID::from(*first_byte)) + Ok(PID::from(first_byte)) } } diff --git a/src/usb.rs b/src/usb.rs index 60abed65..9fd82dab 100644 --- a/src/usb.rs +++ b/src/usb.rs @@ -60,6 +60,12 @@ impl std::fmt::Display for PID { } } +impl From<&u8> for PID { + fn from(byte: &u8) -> PID { + PID::from(*byte) + } +} + pub fn validate_packet(packet: &[u8]) -> bool { use PID::*; From ee7d141783f8f779f4e9a130ce4b2962a16a1320 Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Mon, 22 Jul 2024 18:31:35 +0100 Subject: [PATCH 7/8] Change return type of validate_packet to simplify downstream usage. --- src/capture.rs | 86 +++++++++++++++++++++++++------------------------- src/decoder.rs | 10 +++--- src/usb.rs | 81 +++++++++++++++++++++++++++-------------------- 3 files changed, 93 insertions(+), 84 deletions(-) diff --git a/src/capture.rs b/src/capture.rs index 4b0d7dfe..b861fb31 100644 --- a/src/capture.rs +++ b/src/capture.rs @@ -1155,13 +1155,10 @@ impl ItemSource for CaptureReader { Packet(.., packet_id) => { let packet = self.packet(*packet_id)?; let len = packet.len(); - if len == 0 { - return Ok("Malformed 0-byte packet".to_string()) - } - let pid = PID::from(packet[0]); - if !validate_packet(&packet) { - let too_long = len > 1027; - return Ok(format!( + let too_long = len > 1027; + match validate_packet(&packet) { + Err(None) => "Malformed 0-byte packet".to_string(), + Err(Some(pid)) => format!( "Malformed packet{} of {len} {}: {}", match pid { RSVD if too_long => @@ -1203,42 +1200,45 @@ impl ItemSource for CaptureReader { }), }, if len == 1 {"byte"} else {"bytes"}, - Bytes::first(100, &packet[0 .. packet.len()]))) - } - format!("{pid} packet{}", - match PacketFields::from_packet(&packet) { - PacketFields::SOF(sof) => format!( - " with frame number {}, CRC {:02X}", - sof.frame_number(), - sof.crc()), - PacketFields::Token(token) => format!( - " on {}.{}, CRC {:02X}", - token.device_address(), - token.endpoint_number(), - token.crc()), - PacketFields::Data(data) if packet.len() <= 3 => format!( - " with CRC {:04X} and no data", - data.crc), - PacketFields::Data(data) => format!( - " with CRC {:04X} and {} data bytes: {}", - data.crc, - packet.len() - 3, - Bytes::first(100, &packet[1 .. packet.len() - 2])), - PacketFields::Split(split) => format!( - " {} {} speed {} transaction on hub {} port {}", - match split.sc() { - Start => "starting", - Complete => "completing", - }, - format!("{:?}", split.speed()).to_lowercase(), - format!("{:?}", split.endpoint_type()).to_lowercase(), - split.hub_address(), - split.port()), - PacketFields::None => match pid { - PID::Malformed => format!(": {packet:02X?}"), - _ => "".to_string() + Bytes::first(100, &packet[0 .. len]) + ), + Ok(pid) => format!( + "{pid} packet{}", + match PacketFields::from_packet(&packet) { + PacketFields::SOF(sof) => format!( + " with frame number {}, CRC {:02X}", + sof.frame_number(), + sof.crc()), + PacketFields::Token(token) => format!( + " on {}.{}, CRC {:02X}", + token.device_address(), + token.endpoint_number(), + token.crc()), + PacketFields::Data(data) if len <= 3 => format!( + " with CRC {:04X} and no data", + data.crc), + PacketFields::Data(data) => format!( + " with CRC {:04X} and {} data bytes: {}", + data.crc, + len - 3, + Bytes::first(100, &packet[1 .. len - 2])), + PacketFields::Split(split) => format!( + " {} {} speed {} transaction on hub {} port {}", + match split.sc() { + Start => "starting", + Complete => "completing", + }, + format!("{:?}", split.speed()).to_lowercase(), + format!("{:?}", split.endpoint_type()).to_lowercase(), + split.hub_address(), + split.port()), + PacketFields::None => match pid { + PID::Malformed => format!(": {packet:02X?}"), + _ => "".to_string() + } } - }) + ) + } }, Transaction(transfer_id, transaction_id) => { let entry = self.transfer_index.get(*transfer_id)?; @@ -1248,7 +1248,7 @@ impl ItemSource for CaptureReader { *transaction_id, self.packet_index.len())?; let start_packet_id = packet_id_range.start; let start_packet = self.packet(start_packet_id)?; - if validate_packet(&start_packet) { + if validate_packet(&start_packet).is_ok() { let transaction = self.transaction(*transaction_id)?; transaction.description(self, &endpoint)? } else { diff --git a/src/decoder.rs b/src/decoder.rs index 5e65cac2..12e63971 100644 --- a/src/decoder.rs +++ b/src/decoder.rs @@ -103,12 +103,10 @@ fn transaction_status(state: &Option, packet: &[u8]) use StartComplete::*; use usb::EndpointType::*; - // First, check that this is a valid packet at all. - if !validate_packet(packet) { - return Ok(Invalid) - } - - let next = PID::from_packet(packet)?; + let next = match validate_packet(packet) { + Err(_) => return Ok(Invalid), + Ok(pid) => pid, + }; Ok(match state { None => match next { diff --git a/src/usb.rs b/src/usb.rs index 9fd82dab..ab22376c 100644 --- a/src/usb.rs +++ b/src/usb.rs @@ -66,45 +66,56 @@ impl From<&u8> for PID { } } -pub fn validate_packet(packet: &[u8]) -> bool { +pub fn validate_packet(packet: &[u8]) -> Result> { use PID::*; - let len = packet.len(); - - if len == 0 { - return false; - } + match packet.first().map(PID::from) { + // A zero-byte packet is always invalid, and has no PID. + None => Err(None), + + // Otherwise, check validity according to PID. + Some(pid) => { + let len = packet.len(); + let valid = match pid { + + // SOF and tokens must be three bytes, with a valid CRC5. + SOF | SETUP | IN | OUT | PING if len == 3 => { + let data = u32::from_le_bytes( + [packet[1], packet[2] & 0x07, 0, 0]); + let crc = packet[2] >> 3; + crc == crc5(data, 11) + } - match PID::from(packet[0]) { + // SPLIT packets must be four bytes, with a valid CRC5. + SPLIT if len == 4 => { + let data = u32::from_le_bytes( + [packet[1], packet[2], packet[3] & 0x07, 0]); + let crc = packet[3] >> 3; + crc == crc5(data, 19) + }, - // SOF and tokens must be three bytes, with a valid CRC5. - SOF | SETUP | IN | OUT | PING if len == 3 => { - let data = u32::from_le_bytes( - [packet[1], packet[2] & 0x07, 0, 0]); - let crc = packet[2] >> 3; - crc == crc5(data, 11) - } + // Data packets must be 3 to 1027 bytes, with a valid CRC16. + DATA0 | DATA1 | DATA2 | MDATA if (3..=1027).contains(&len) => { + let data = &packet[1..(len - 2)]; + let crc = u16::from_le_bytes([packet[len - 2], packet[len - 1]]); + crc == crc16(data) + } - // SPLIT packets must be four bytes, with a valid CRC5. - SPLIT if len == 4 => { - let data = u32::from_le_bytes( - [packet[1], packet[2], packet[3] & 0x07, 0]); - let crc = packet[3] >> 3; - crc == crc5(data, 19) - }, - - // Data packets must be 3 to 1027 bytes, with a valid CRC16. - DATA0 | DATA1 | DATA2 | MDATA if (3..=1027).contains(&len) => { - let data = &packet[1..(len - 2)]; - let crc = u16::from_le_bytes([packet[len - 2], packet[len - 1]]); - crc == crc16(data) - } + // Handshake packets must be a single byte. + ACK | NAK | NYET | STALL | ERR if len == 1 => true, - // Handshake packets must be a single byte. - ACK | NAK | NYET | STALL | ERR if len == 1 => true, + // Anything else is invalid. + _ => false + }; - // Anything else is invalid. - _ => false + if valid { + // Packet is valid. + Ok(pid) + } else { + // Invalid, but has a (possibly wrong or malformed) PID byte. + Err(Some(pid)) + } + } } } @@ -942,7 +953,7 @@ mod tests { #[test] fn test_parse_setup() { let packet = vec![0x2d, 0x02, 0xa8]; - assert!(validate_packet(&packet)); + assert_eq!(validate_packet(&packet), Ok(PID::SETUP)); let p = PacketFields::from_packet(&packet); if let PacketFields::Token(tok) = p { assert!(tok.device_address() == DeviceAddr(2)); @@ -957,7 +968,7 @@ mod tests { #[test] fn test_parse_in() { let packet = vec![0x69, 0x82, 0x18]; - assert!(validate_packet(&packet)); + assert_eq!(validate_packet(&packet), Ok(PID::IN)); let p = PacketFields::from_packet(&packet); if let PacketFields::Token(tok) = p { assert!(tok.device_address() == DeviceAddr(2)); @@ -972,7 +983,7 @@ mod tests { #[test] fn test_parse_data() { let packet = &vec![0xc3, 0x40, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xd5]; - assert!(validate_packet(&packet)); + assert_eq!(validate_packet(&packet), Ok(PID::DATA0)); let p = PacketFields::from_packet(&packet); if let PacketFields::Data(data) = p { assert!(data.crc == 0xd5aa); From 2850870d9be8f261b5a682c2f22ce09f23cb73e3 Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Mon, 22 Jul 2024 23:41:41 +0100 Subject: [PATCH 8/8] Pass PID from validate_packet along to downstream users. This allows us to remove the PID::from_packet() function, and thereby eliminate any possibility of the "Packet is empty, cannot retrieve PID" error message. --- src/decoder.rs | 51 ++++++++++++++++++++++---------------------------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/src/decoder.rs b/src/decoder.rs index 12e63971..848ab53c 100644 --- a/src/decoder.rs +++ b/src/decoder.rs @@ -8,15 +8,6 @@ use crate::rcu::SingleWriterRcu; use crate::usb::{self, prelude::*, validate_packet}; use crate::vec_map::{VecMap, Key}; -impl PID { - fn from_packet(packet: &[u8]) -> Result { - let first_byte = packet - .first() - .context("Packet is empty, cannot retrieve PID")?; - Ok(PID::from(first_byte)) - } -} - struct EndpointData { device_id: DeviceId, address: EndpointAddr, @@ -95,7 +86,7 @@ struct TransactionState { } fn transaction_status(state: &Option, packet: &[u8]) - -> Result + -> Result<(PID, TransactionStatus), Error> { use PID::*; use TransactionStatus::*; @@ -104,11 +95,11 @@ fn transaction_status(state: &Option, packet: &[u8]) use usb::EndpointType::*; let next = match validate_packet(packet) { - Err(_) => return Ok(Invalid), + Err(_) => return Ok((Malformed, Invalid)), Ok(pid) => pid, }; - Ok(match state { + let status = match state { None => match next { // Tokens may start a new transaction. SOF | SETUP | IN | OUT | PING | SPLIT => New, @@ -224,7 +215,9 @@ fn transaction_status(state: &Option, packet: &[u8]) (..) => Invalid, } }, - }) + }; + + Ok((next, status)) } impl TransactionState { @@ -240,12 +233,12 @@ impl TransactionState { self.endpoint_id.context("Transaction state has no endpoint ID") } - fn extract_payload(&mut self, packet: &[u8]) { + fn extract_payload(&mut self, pid: PID, packet: &[u8]) { use PID::*; use TransactionStyle::*; use usb::EndpointType::*; use StartComplete::*; - match (&self.style, PID::from(packet[0])) { + match (&self.style, pid) { (Simple(SETUP), DATA0) | (Split(Start, Control, Some(SETUP)), DATA0) => { self.setup = Some(SetupFields::from_data_packet(packet)); @@ -627,10 +620,9 @@ impl Decoder { }) } - fn packet_endpoint(&mut self, packet: &[u8]) + fn packet_endpoint(&mut self, pid: PID, packet: &[u8]) -> Result { - let pid = PID::from_packet(packet)?; Ok(match PacketFields::from_packet(packet) { PacketFields::SOF(_) => FRAMING_EP_ID, PacketFields::Token(token) => @@ -645,7 +637,7 @@ impl Decoder { use TransactionStatus::*; use TransactionStyle::*; use StartComplete::*; - let status = transaction_status(&self.transaction_state, packet)?; + let (pid, status) = transaction_status(&self.transaction_state, packet)?; let success = status != Fail; let complete = match &self.transaction_state { None => false, @@ -656,43 +648,45 @@ impl Decoder { }; if status != Invalid { if let Some(state) = &mut self.transaction_state { - state.extract_payload(packet); + state.extract_payload(pid, packet); } } match status { New => { self.transaction_end(false, false)?; - self.transaction_start(packet_id, packet)?; + self.transaction_start(packet_id, pid, packet)?; self.transfer_early_append()?; }, Continue => { - self.transaction_append(packet)?; + self.transaction_append(pid, packet)?; self.transfer_early_append()?; }, Done | Retry | Fail => { - self.transaction_append(packet)?; + self.transaction_append(pid, packet)?; self.transaction_end(success, complete)?; }, Invalid => { - self.transaction_start(packet_id, packet)?; + self.transaction_start(packet_id, pid, packet)?; self.transaction_end(false, false)?; }, }; Ok(()) } - fn transaction_start(&mut self, packet_id: PacketId, packet: &[u8]) + fn transaction_start(&mut self, + packet_id: PacketId, + pid: PID, + packet: &[u8]) -> Result<(), Error> { use PID::*; use TransactionStyle::*; - let pid = PID::from_packet(packet)?; let transaction_id = self.capture.transaction_index.push(packet_id)?; let (style, endpoint_id) = if pid == SPLIT { let split = SplitFields::from_packet(packet); (Split(split.sc(), split.endpoint_type(), None), None) } else { - (Simple(pid), Some(self.packet_endpoint(packet)?)) + (Simple(pid), Some(self.packet_endpoint(pid, packet)?)) }; let mut state = TransactionState { style, @@ -709,15 +703,14 @@ impl Decoder { Ok(()) } - fn transaction_append(&mut self, packet: &[u8]) + fn transaction_append(&mut self, pid: PID, packet: &[u8]) -> Result<(), Error> { use TransactionStyle::*; - let pid = PID::from_packet(packet)?; let update = match &self.transaction_state { Some(TransactionState { style: Split(sc, ep_type, None), ..}) => { let (sc, ep_type) = (*sc, *ep_type); - let endpoint_id = self.packet_endpoint(packet)?; + let endpoint_id = self.packet_endpoint(pid, packet)?; let ep_data = &self.endpoint_data[endpoint_id]; let ep_addr = ep_data.address; let dev_data = self.capture.device_data(ep_data.device_id)?;