@@ -164,7 +164,7 @@ mod fixedwidth;
164164pub use fixedwidth:: { FixedWidthEncoding , FixedWidthU32 , FixedWidthU64 , FixedWidthUint } ;
165165use std:: {
166166 any:: type_name,
167- net:: { Ipv4Addr , Ipv6Addr } ,
167+ net:: { Ipv4Addr , Ipv6Addr , SocketAddrV4 , SocketAddrV6 } ,
168168} ;
169169
170170pub 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) ]
11371206mod test {
11381207 use super :: * ;
0 commit comments