From 6d6889d0f6dad1ecf0d0606f8638fedb3617ba59 Mon Sep 17 00:00:00 2001 From: Johnathan Corgan Date: Sat, 11 Jul 2026 20:19:08 +0000 Subject: [PATCH] transport: give ethernet a canonical addr.rs home for MAC parsing Moves parse_mac_string into ethernet/addr.rs and re-exports it at the ethernet module root so the ethernet::parse_mac_string path stays byte-identical for its one external consumer (zero churn there). Its unit tests stay in mod.rs, calling through the re-export. Pure relocation; no logic change. --- src/transport/ethernet/addr.rs | 21 +++++++++++++++++++++ src/transport/ethernet/mod.rs | 21 +++------------------ 2 files changed, 24 insertions(+), 18 deletions(-) create mode 100644 src/transport/ethernet/addr.rs diff --git a/src/transport/ethernet/addr.rs b/src/transport/ethernet/addr.rs new file mode 100644 index 0000000..677fe68 --- /dev/null +++ b/src/transport/ethernet/addr.rs @@ -0,0 +1,21 @@ +//! Ethernet address parsing. + +use crate::transport::TransportError; + +/// Parse a colon-separated MAC string (e.g., "aa:bb:cc:dd:ee:ff") into bytes. +pub fn parse_mac_string(s: &str) -> Result<[u8; 6], TransportError> { + let parts: Vec<&str> = s.split(':').collect(); + if parts.len() != 6 { + return Err(TransportError::InvalidAddress(format!( + "invalid MAC format: expected 6 colon-separated hex bytes, got '{}'", + s + ))); + } + let mut mac = [0u8; 6]; + for (i, part) in parts.iter().enumerate() { + mac[i] = u8::from_str_radix(part, 16).map_err(|_| { + TransportError::InvalidAddress(format!("invalid hex byte '{}' in MAC address", part)) + })?; + } + Ok(mac) +} diff --git a/src/transport/ethernet/mod.rs b/src/transport/ethernet/mod.rs index 1856669..b5862a2 100644 --- a/src/transport/ethernet/mod.rs +++ b/src/transport/ethernet/mod.rs @@ -5,10 +5,13 @@ //! Works on wired Ethernet and WiFi interfaces (kernel mac80211 abstracts //! 802.11 transparently on Linux). +pub mod addr; pub mod discovery; pub mod io; pub mod stats; +pub use addr::parse_mac_string; + use super::{ DiscoveredPeer, PacketTx, ReceivedPacket, Transport, TransportAddr, TransportError, TransportId, TransportState, TransportType, @@ -632,24 +635,6 @@ pub fn format_mac(mac: &[u8; 6]) -> String { ) } -/// Parse a colon-separated MAC string (e.g., "aa:bb:cc:dd:ee:ff") into bytes. -pub fn parse_mac_string(s: &str) -> Result<[u8; 6], TransportError> { - let parts: Vec<&str> = s.split(':').collect(); - if parts.len() != 6 { - return Err(TransportError::InvalidAddress(format!( - "invalid MAC format: expected 6 colon-separated hex bytes, got '{}'", - s - ))); - } - let mut mac = [0u8; 6]; - for (i, part) in parts.iter().enumerate() { - mac[i] = u8::from_str_radix(part, 16).map_err(|_| { - TransportError::InvalidAddress(format!("invalid hex byte '{}' in MAC address", part)) - })?; - } - Ok(mac) -} - // ============================================================================ // Tests // ============================================================================