From a1ecd1d65b42e19e910938995f3244d6a710f7da Mon Sep 17 00:00:00 2001 From: h7x4 Date: Tue, 5 Sep 2023 20:35:01 +0200 Subject: [PATCH 1/2] Cargo.toml: rusb 0.9.1 -> 0.9.3 --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index de692d4..732c995 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ tokio = { version = "1.22.0", features = ["rt", "net", "io-util", "sync"] } log = "0.4.17" num-traits = "0.2.15" num-derive = "0.3.3" -rusb = "0.9.1" +rusb = "0.9.3" [dev-dependencies] tokio = { version = "1.22.0", features = ["full"] } From e0542938e6d6b328dc6b28bb47e29ac757eee2d9 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Tue, 5 Sep 2023 20:35:02 +0200 Subject: [PATCH 2/2] Add serde support Add serde serialization/deserialization for most public types --- Cargo.toml | 5 +++++ src/consts.rs | 5 +++++ src/device.rs | 5 +++++ src/endpoint.rs | 1 + src/hid.rs | 4 ++++ src/interface.rs | 3 +++ src/lib.rs | 3 +++ src/setup.rs | 3 +++ 8 files changed, 29 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 732c995..a78bd5c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,12 @@ log = "0.4.17" num-traits = "0.2.15" num-derive = "0.3.3" rusb = "0.9.3" +serde = { version = "1.0", features = ["derive"], optional = true } [dev-dependencies] tokio = { version = "1.22.0", features = ["full"] } env_logger = "0.9.0" + +[features] +default = [] +serde = ["dep:serde", "rusb/serde"] \ No newline at end of file diff --git a/src/consts.rs b/src/consts.rs index 198bee7..0cddd6d 100644 --- a/src/consts.rs +++ b/src/consts.rs @@ -2,6 +2,7 @@ use super::*; /// A list of known USB speeds #[derive(Copy, Clone, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub enum UsbSpeed { Unknown = 0x0, Low, @@ -15,6 +16,7 @@ pub enum UsbSpeed { /// A list of defined USB class codes // https://www.usb.org/defined-class-codes #[derive(Copy, Clone, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub enum ClassCode { SeeInterface = 0, Audio, @@ -42,6 +44,7 @@ pub enum ClassCode { /// A list of defined USB endpoint attributes #[derive(Copy, Clone, Debug, FromPrimitive)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub enum EndpointAttributes { Control = 0, Isochronous, @@ -59,6 +62,7 @@ pub const EP0_MAX_PACKET_SIZE: u16 = 64; /// A list of defined USB standard requests /// from USB 2.0 standard Table 9.4. Standard Request Codes #[derive(Copy, Clone, Debug, FromPrimitive)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub enum StandardRequest { GetStatus = 0, ClearFeature = 1, @@ -76,6 +80,7 @@ pub enum StandardRequest { /// A list of defined USB descriptor types /// from USB 2.0 standard Table 9.5. Descriptor Types #[derive(Copy, Clone, Debug, FromPrimitive)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub enum DescriptorType { Device = 1, Configuration = 2, diff --git a/src/device.rs b/src/device.rs index 45fccee..32ac5b8 100644 --- a/src/device.rs +++ b/src/device.rs @@ -2,6 +2,7 @@ use super::*; use rusb::Version as rusbVersion; #[derive(Clone, Default)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct Version { pub major: u8, pub minor: u8, @@ -26,6 +27,7 @@ impl From for rusbVersion { /// Represent a USB device #[derive(Clone, Default)] +#[cfg_attr(feature = "serde", derive(Serialize))] pub struct UsbDevice { pub path: String, pub bus_id: String, @@ -41,7 +43,10 @@ pub struct UsbDevice { pub configuration_value: u8, pub num_configurations: u8, pub interfaces: Vec, + + #[cfg_attr(feature = "serde", serde(skip))] pub device_handler: Option>>>, + pub usb_version: Version, pub(crate) ep0_in: UsbEndpoint, diff --git a/src/endpoint.rs b/src/endpoint.rs index a2f92cd..19b5c29 100644 --- a/src/endpoint.rs +++ b/src/endpoint.rs @@ -2,6 +2,7 @@ use super::*; /// Represent a USB endpoint #[derive(Clone, Copy, Debug, Default)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct UsbEndpoint { /// bEndpointAddress pub address: u8, diff --git a/src/hid.rs b/src/hid.rs index 52c0eef..c0d9786 100644 --- a/src/hid.rs +++ b/src/hid.rs @@ -6,6 +6,7 @@ use super::*; // HID Usage Tables 1.12: https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf #[derive(Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] enum UsbHidKeyboardHandlerState { Idle, KeyDown, @@ -13,6 +14,7 @@ enum UsbHidKeyboardHandlerState { /// A handler of a HID keyboard #[derive(Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct UsbHidKeyboardHandler { pub report_descriptor: Vec, pub pending_key_events: VecDeque, @@ -23,6 +25,7 @@ pub struct UsbHidKeyboardHandler { /// /// For definition of key codes, see [HID Usage Tables](https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf) #[derive(Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct UsbHidKeyboardReport { /// Key modifier pub modifier: u8, @@ -159,6 +162,7 @@ impl UsbInterfaceHandler for UsbHidKeyboardHandler { /// A list of defined HID descriptor type #[derive(Copy, Clone, Debug, FromPrimitive)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub enum HidDescriptorType { Hid = 0x21, Report = 0x22, diff --git a/src/interface.rs b/src/interface.rs index 829b27d..2d1fcd0 100644 --- a/src/interface.rs +++ b/src/interface.rs @@ -2,6 +2,7 @@ use super::*; /// Represent a USB interface #[derive(Clone)] +#[cfg_attr(feature = "serde", derive(Serialize))] pub struct UsbInterface { pub interface_class: u8, pub interface_subclass: u8, @@ -9,6 +10,8 @@ pub struct UsbInterface { pub endpoints: Vec, pub string_interface: u8, pub class_specific_descriptor: Vec, + + #[cfg_attr(feature = "serde", serde(skip))] pub handler: Arc>>, } diff --git a/src/lib.rs b/src/lib.rs index 56be5b2..818ea1a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -15,6 +15,9 @@ use tokio::net::TcpListener; use tokio::sync::RwLock; use usbip_protocol::UsbIpCommand; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; + pub mod cdc; mod consts; mod device; diff --git a/src/setup.rs b/src/setup.rs index f72958f..6f4001a 100644 --- a/src/setup.rs +++ b/src/setup.rs @@ -1,5 +1,8 @@ +use super::*; + /// Parse the SETUP packet of control transfers #[derive(Clone, Copy, Debug, Default)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct SetupPacket { /// bmRequestType pub request_type: u8,