From 790f38a7d61e8766f3c425a3869126244a9ae046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Wala?= <84684231+LVala@users.noreply.github.com> Date: Sun, 6 Aug 2023 21:45:44 +0200 Subject: [PATCH] Add basic sniffing and L2-3 parsing --- Cargo.lock | 271 +++++++++++++++++++++++++++++++++++++++-- Cargo.toml | 5 + pcap_examples/rtp.pcap | Bin 0 -> 147286 bytes src/lib.rs | 1 + src/main.rs | 24 +++- src/sniffer.rs | 55 +++++++++ src/sniffer/packet.rs | 169 +++++++++++++++++++++++++ src/sniffer/rtcp.rs | 16 +++ src/sniffer/rtp.rs | 38 ++++++ 9 files changed, 567 insertions(+), 12 deletions(-) create mode 100644 pcap_examples/rtp.pcap create mode 100644 src/lib.rs create mode 100644 src/sniffer.rs create mode 100644 src/sniffer/packet.rs create mode 100644 src/sniffer/rtcp.rs create mode 100644 src/sniffer/rtp.rs diff --git a/Cargo.lock b/Cargo.lock index b96aa4a..987209e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,32 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "aho-corasick" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +dependencies = [ + "memchr", +] + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "async-trait" +version = "0.1.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -130,6 +156,36 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "errno" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +dependencies = [ + "errno-dragonfly", + "libc", + "winapi", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "etherparse" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "827292ea592108849932ad8e30218f8b1f21c0dfd0696698a18b5d0aed62d990" +dependencies = [ + "arrayvec", +] + [[package]] name = "fnv" version = "1.0.7" @@ -348,18 +404,40 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "ipnet" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" + [[package]] name = "itoa" version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + [[package]] name = "libc" version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +[[package]] +name = "libloading" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "351a32417a12d5f7e82c368a66781e307834dae04c6ce0cd4456d52989229883" +dependencies = [ + "cfg-if", + "winapi", +] + [[package]] name = "lock_api" version = "0.4.10" @@ -382,6 +460,15 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + [[package]] name = "mime" version = "0.3.17" @@ -415,7 +502,7 @@ checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -436,6 +523,18 @@ dependencies = [ "version_check", ] +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags", + "cfg-if", + "libc", + "memoffset", +] + [[package]] name = "num_cpus" version = "1.16.0" @@ -484,6 +583,21 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "pcap" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbaa01d616eb84eb35cd085fdeaa8671dc8d951bdc4a75bfc414466e76b039ce" +dependencies = [ + "bitflags", + "errno", + "libc", + "libloading", + "pkg-config", + "regex", + "windows-sys 0.36.1", +] + [[package]] name = "percent-encoding" version = "2.3.0" @@ -522,6 +636,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -585,12 +705,71 @@ dependencies = [ "bitflags", ] +[[package]] +name = "regex" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7b6d6190b7594385f61bd3911cd1be99dfddcfc365a4160cc2ab5bff4aed294" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" + +[[package]] +name = "rtcp" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1919efd6d4a6a85d13388f9487549bb8e359f17198cc03ffd72f79b553873691" +dependencies = [ + "bytes", + "thiserror", + "webrtc-util", +] + +[[package]] +name = "rtp" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2a095411ff00eed7b12e4c6a118ba984d113e1079582570d56a5ee723f11f80" +dependencies = [ + "async-trait", + "bytes", + "rand", + "serde", + "thiserror", + "webrtc-util", +] + [[package]] name = "rtpeeker" version = "0.1.0" dependencies = [ + "etherparse", + "pcap", + "rtcp", + "rtp", "tokio", "warp", + "webrtc-util", ] [[package]] @@ -631,6 +810,20 @@ name = "serde" version = "1.0.180" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ea67f183f058fe88a4e3ec6e2788e003840893b91bac4559cabedd00863b3ed" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.180" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24e744d7782b686ab3b73267ef05697159cc0e5abbed3f47f9933165e5219036" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "serde_json" @@ -769,7 +962,7 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -977,6 +1170,27 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "webrtc-util" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f1db1727772c05cf7a2cfece52c3aca8045ca1e176cd517d323489aa3c6d87" +dependencies = [ + "async-trait", + "bitflags", + "bytes", + "cc", + "ipnet", + "lazy_static", + "libc", + "log", + "nix", + "rand", + "thiserror", + "tokio", + "winapi", +] + [[package]] name = "winapi" version = "0.3.9" @@ -999,6 +1213,19 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc 0.36.1", + "windows_i686_gnu 0.36.1", + "windows_i686_msvc 0.36.1", + "windows_x86_64_gnu 0.36.1", + "windows_x86_64_msvc 0.36.1", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -1015,12 +1242,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_x86_64_msvc 0.48.0", ] [[package]] @@ -1029,24 +1256,48 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + [[package]] name = "windows_aarch64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + [[package]] name = "windows_i686_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + [[package]] name = "windows_i686_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + [[package]] name = "windows_x86_64_gnu" version = "0.48.0" @@ -1059,6 +1310,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + [[package]] name = "windows_x86_64_msvc" version = "0.48.0" diff --git a/Cargo.toml b/Cargo.toml index c32b782..7a70d36 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,5 +6,10 @@ edition = "2021" [dependencies] tokio = { version = "1", features = [ "full" ] } warp = "0.3" +pcap = "1.0.0" +etherparse = "0.13.0" +rtp = "0.6.8" +rtcp = "0.7.2" +webrtc-util = "0.7.0" # not using workspaces, as the crates use different targets diff --git a/pcap_examples/rtp.pcap b/pcap_examples/rtp.pcap new file mode 100644 index 0000000000000000000000000000000000000000..f18dded70a7672dc135a2820f2ce654a34f45fb9 GIT binary patch literal 147286 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 z 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 z

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 literal 0 HcmV?d00001 diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..5a01bc9 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1 @@ +pub mod sniffer; diff --git a/src/main.rs b/src/main.rs index 941caa2..bda6ddd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,20 @@ -#[tokio::main] -async fn main() { - warp::serve(warp::fs::dir("client/dist")) - .run(([127, 0, 0, 1], 3550)) - .await; +// #[tokio::main] +// async fn main() { +// warp::serve(warp::fs::dir("client/dist")) +// .run(([127, 0, 0, 1], 3550)) +// .await; +// } + +use rtpeeker::sniffer; + +fn main() { + let Ok(mut sniffer) = sniffer::Sniffer::from_file("./pcap_examples/rtp.pcap") else { + println!("Cannot open file"); + return; + }; + + while let Ok(mut packet) = sniffer.next_packet() { + packet.parse_as(sniffer::packet::PacketType::RtpOverUdp); + println!("{:?}", packet); + } } diff --git a/src/sniffer.rs b/src/sniffer.rs new file mode 100644 index 0000000..a98854c --- /dev/null +++ b/src/sniffer.rs @@ -0,0 +1,55 @@ +use packet::Packet; +use std::result; + +pub mod packet; +pub mod rtcp; +pub mod rtp; + +pub enum Error { + FileNotFound, + DeviceNotFound, + DeviceUnavailable, + CouldntReceivePacket, + UnsupportedPacketType, +} + +type Result = result::Result; + +pub struct Sniffer { + capture: pcap::Capture, +} + +impl Sniffer { + pub fn from_file(file: &str) -> Result { + match pcap::Capture::from_file(file) { + Ok(capture) => Ok(Self { capture }), + Err(_) => Err(Error::FileNotFound), + } + } +} + +impl Sniffer { + pub fn from_device(device: &str) -> Result { + let Ok(capture) = pcap::Capture::from_device(device) else { + return Err(Error::DeviceNotFound); + }; + + match capture.open() { + Ok(capture) => Ok(Self { capture }), + Err(_) => Err(Error::DeviceUnavailable), + } + } +} + +impl Sniffer { + pub fn next_packet(&mut self) -> Result { + let Ok(packet) = self.capture.next_packet() else { + return Err(Error::CouldntReceivePacket); + }; + + match Packet::build(&packet) { + Some(packet) => Ok(packet), + None => Err(Error::UnsupportedPacketType), + } + } +} diff --git a/src/sniffer/packet.rs b/src/sniffer/packet.rs new file mode 100644 index 0000000..f692827 --- /dev/null +++ b/src/sniffer/packet.rs @@ -0,0 +1,169 @@ +use super::{rtcp::RtcpPacket, rtp::RtpPacket}; +use etherparse::{ + IpHeader::{self, Version4, Version6}, + Ipv4Header, Ipv6Header, PacketHeaders, TcpHeader, + TransportHeader::{self, Tcp, Udp}, + UdpHeader, +}; +use std::net::{ + IpAddr::{V4, V6}, + Ipv4Addr, Ipv6Addr, SocketAddr, +}; +use std::ops::Add; +use std::time::Duration; + +#[derive(Debug)] +pub enum PacketType { + RtpOverUdp, + RtcpOverUdp, +} + +#[derive(Debug)] +pub enum TransportProtocol { + Tcp, + Udp, +} + +#[derive(Debug)] +pub enum SessionPacket { + Unknown, + Rtp(RtpPacket), + Rtcp(Vec), +} + +#[derive(Debug)] +pub struct Packet { + pub payload: Vec, + pub timestamp: Duration, + pub length: u32, + pub source_addr: SocketAddr, + pub destination_addr: SocketAddr, + pub transport_protocol: TransportProtocol, + pub contents: SessionPacket, +} + +impl Packet { + pub fn build(raw_packet: &pcap::Packet) -> Option { + let Ok(packet) = PacketHeaders::from_ethernet_slice(raw_packet) else { + return None; + }; + let PacketHeaders { + ip: Some(ip), + transport: Some(transport), + .. + } = packet else { + return None; + }; + + let transport_protocol = get_transport_protocol(&transport)?; + let (source_addr, destination_addr) = convert_addr(&ip, &transport)?; + let duration = get_duration(raw_packet); + + Some(Self { + payload: packet.payload.to_vec(), + length: raw_packet.header.len, + timestamp: duration, + source_addr, + destination_addr, + transport_protocol, + contents: SessionPacket::Unknown, + }) + } + + pub fn parse_as(&mut self, packet_type: PacketType) { + if let PacketType::RtpOverUdp = packet_type { + let Some(rtp) = RtpPacket::build(self) else { + return; + }; + self.contents = SessionPacket::Rtp(rtp); + } + } +} + +fn get_transport_protocol(transport: &TransportHeader) -> Option { + let protocol = match transport { + Udp(_) => TransportProtocol::Udp, + Tcp(_) => TransportProtocol::Tcp, + _ => return None, + }; + + Some(protocol) +} + +fn get_duration(raw_packet: &pcap::Packet) -> Duration { + // i64 -> u64, but seconds should never be negative + let secs = raw_packet.header.ts.tv_sec.try_into().unwrap(); + let micrs = raw_packet.header.ts.tv_usec.try_into().unwrap(); + + let sec_duration = Duration::from_secs(secs); + let micros_duration = Duration::from_micros(micrs); + + sec_duration.add(micros_duration) +} + +fn convert_addr( + ip_header: &IpHeader, + transport: &TransportHeader, +) -> Option<(SocketAddr, SocketAddr)> { + let (source_port, dest_port) = match *transport { + Udp(UdpHeader { + source_port, + destination_port, + .. + }) + | Tcp(TcpHeader { + source_port, + destination_port, + .. + }) => (source_port, destination_port), + _ => return None, + }; + + let (source_ip_addr, dest_ip_addr) = match *ip_header { + Version4( + Ipv4Header { + source: [s0, s1, s2, s3], + destination: [d0, d1, d2, d3], + .. + }, + _, + ) => { + let source = V4(Ipv4Addr::new(s0, s1, s2, s3)); + let destination = V4(Ipv4Addr::new(d0, d1, d2, d3)); + (source, destination) + } + Version6( + Ipv6Header { + source, + destination, + .. + }, + _, + ) => { + let s = to_u16(&source); + let d = to_u16(&destination); + + let source = V6(Ipv6Addr::new( + s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], + )); + let destination = V6(Ipv6Addr::new( + d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], + )); + (source, destination) + } + }; + let source = SocketAddr::new(source_ip_addr, source_port); + let destination = SocketAddr::new(dest_ip_addr, dest_port); + Some((source, destination)) +} + +pub fn to_u16(buf: &[u8; 16]) -> [u16; 8] { + // TODO: tests + buf.iter() + .zip(buf.iter().skip(1)) + .map(|(a, b)| ((*a as u16) << 8) | *b as u16) + .collect::>() + .as_slice() + .try_into() + .unwrap() +} diff --git a/src/sniffer/rtcp.rs b/src/sniffer/rtcp.rs new file mode 100644 index 0000000..65abd06 --- /dev/null +++ b/src/sniffer/rtcp.rs @@ -0,0 +1,16 @@ +use rtcp::packet; + +#[derive(Debug)] +pub struct RtcpPacket {} + +impl RtcpPacket { + pub fn build(packet: &super::Packet) -> Option { + let mut buffer: &[u8] = &packet.payload; + let Ok(_rtcp_packets) = packet::unmarshal(&mut buffer) else { + return None; + }; + + // TODO proper mapping of different RTCP packet types + Some(Self {}) + } +} diff --git a/src/sniffer/rtp.rs b/src/sniffer/rtp.rs new file mode 100644 index 0000000..fa7ac76 --- /dev/null +++ b/src/sniffer/rtp.rs @@ -0,0 +1,38 @@ +use rtp::packet::Packet; +use webrtc_util::marshal::Unmarshal; + +#[derive(Debug)] +pub struct RtpPacket { + pub version: u8, + pub padding: bool, + pub extension: bool, + pub marker: bool, + pub payload_type: u8, + pub sequence_number: u16, + pub timestamp: u32, + pub ssrc: u32, + pub csrc: Vec, + pub payload_length: usize, // extension information skipped +} + +impl RtpPacket { + pub fn build(packet: &super::Packet) -> Option { + let mut buffer: &[u8] = &packet.payload; + let Ok(Packet { header, payload }) = Packet::unmarshal(&mut buffer) else { + return None; + }; + + Some(Self { + version: header.version, + padding: header.padding, + extension: header.extension, + marker: header.marker, + payload_type: header.payload_type, + sequence_number: header.sequence_number, + timestamp: header.timestamp, + ssrc: header.ssrc, + csrc: header.csrc, + payload_length: payload.len(), + }) + } +}