Skip to content

Commit 0b7bfdc

Browse files
committed
impl CompactEncoding for SocketAddrV4/V6
1 parent c307245 commit 0b7bfdc

1 file changed

Lines changed: 70 additions & 1 deletion

File tree

src/lib.rs

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ mod fixedwidth;
164164
pub use fixedwidth::{FixedWidthEncoding, FixedWidthU32, FixedWidthU64, FixedWidthUint};
165165
use std::{
166166
any::type_name,
167-
net::{Ipv4Addr, Ipv6Addr},
167+
net::{Ipv4Addr, Ipv6Addr, SocketAddrV4, SocketAddrV6},
168168
};
169169

170170
pub use crate::error::{EncodingError, EncodingErrorKind};
@@ -1133,6 +1133,75 @@ impl<T: BoxedSliceEncodable> CompactEncoding for Box<[T]> {
11331133
}
11341134
}
11351135

1136+
/// Encoded size for a [`SocketAddrV4`].
1137+
pub const SOCKET_ADDR_V4_ENCODED_SIZE: usize = 4 + 2;
1138+
/// Encoded size for a [`SocketAddrV6`].
1139+
pub const SOCKET_ADDR_V6_ENCODED_SIZE: usize = 16 + 2;
1140+
1141+
impl CompactEncoding for SocketAddrV4 {
1142+
fn encoded_size(&self) -> Result<usize, EncodingError> {
1143+
Ok(SOCKET_ADDR_V4_ENCODED_SIZE)
1144+
}
1145+
1146+
fn encode<'a>(&self, buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError> {
1147+
let rest = self.ip().encode(buffer)?;
1148+
encode_u16(self.port(), rest)
1149+
}
1150+
1151+
fn decode(buffer: &[u8]) -> Result<(Self, &[u8]), EncodingError>
1152+
where
1153+
Self: Sized,
1154+
{
1155+
let (ip, rest) = Ipv4Addr::decode(buffer)?;
1156+
let (port, rest) = decode_u16(rest)?;
1157+
Ok((SocketAddrV4::new(ip, port), rest))
1158+
}
1159+
}
1160+
impl CompactEncoding for SocketAddrV6 {
1161+
fn encoded_size(&self) -> Result<usize, EncodingError> {
1162+
Ok(SOCKET_ADDR_V6_ENCODED_SIZE)
1163+
}
1164+
1165+
fn encode<'a>(&self, buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError> {
1166+
let rest = self.ip().encode(buffer)?;
1167+
encode_u16(self.port(), rest)
1168+
}
1169+
1170+
fn decode(buffer: &[u8]) -> Result<(Self, &[u8]), EncodingError>
1171+
where
1172+
Self: Sized,
1173+
{
1174+
let (ip, rest) = Ipv6Addr::decode(buffer)?;
1175+
let (port, rest) = decode_u16(rest)?;
1176+
// TODO is this correct for flowinfo and scope_id?
1177+
Ok((SocketAddrV6::new(ip, port, 0, 0), rest))
1178+
}
1179+
}
1180+
1181+
impl VecEncodable for SocketAddrV4 {
1182+
fn vec_encoded_size(vec: &[Self]) -> Result<usize, EncodingError>
1183+
where
1184+
Self: Sized,
1185+
{
1186+
Ok(vec_encoded_size_for_fixed_sized_elements(
1187+
vec,
1188+
SOCKET_ADDR_V4_ENCODED_SIZE,
1189+
))
1190+
}
1191+
}
1192+
1193+
impl VecEncodable for SocketAddrV6 {
1194+
fn vec_encoded_size(vec: &[Self]) -> Result<usize, EncodingError>
1195+
where
1196+
Self: Sized,
1197+
{
1198+
Ok(vec_encoded_size_for_fixed_sized_elements(
1199+
vec,
1200+
SOCKET_ADDR_V6_ENCODED_SIZE,
1201+
))
1202+
}
1203+
}
1204+
11361205
#[cfg(test)]
11371206
mod test {
11381207
use super::*;

0 commit comments

Comments
 (0)