@@ -47,7 +47,7 @@ struct ActiveRelayActor {
47
47
/// Queue to send received relay datagrams on.
48
48
relay_datagrams_recv : Arc < RelayDatagramsQueue > ,
49
49
/// Channel on which we receive packets to send to the relay.
50
- relay_datagrams_send : mpsc:: Receiver < ( NodeId , Bytes ) > ,
50
+ relay_datagrams_send : mpsc:: Receiver < RelaySendPacket > ,
51
51
url : RelayUrl ,
52
52
relay_client : relay:: client:: Client ,
53
53
relay_client_receiver : relay:: client:: ClientReceiver ,
@@ -79,7 +79,7 @@ impl ActiveRelayActor {
79
79
relay_client : relay:: client:: Client ,
80
80
relay_client_receiver : relay:: client:: ClientReceiver ,
81
81
relay_datagrams_recv : Arc < RelayDatagramsQueue > ,
82
- relay_datagrams_send : mpsc:: Receiver < ( NodeId , Bytes ) > ,
82
+ relay_datagrams_send : mpsc:: Receiver < RelaySendPacket > ,
83
83
) -> Self {
84
84
ActiveRelayActor {
85
85
last_write : Instant :: now ( ) ,
@@ -133,7 +133,7 @@ impl ActiveRelayActor {
133
133
// Only poll for new datagrams if relay_send_fut is not busy.
134
134
Some ( msg) = self . relay_datagrams_send. recv( ) , if relay_send_fut. is_none( ) => {
135
135
relay_send_fut = MaybeFuture :: with_future(
136
- Box :: pin( relay_client. send( msg. 0 , msg. 1 ) )
136
+ Box :: pin( relay_client. send( msg. node_id , msg. packet ) )
137
137
) ;
138
138
self . last_write = Instant :: now( ) ;
139
139
@@ -252,17 +252,13 @@ impl ActiveRelayActor {
252
252
self . node_present . insert ( remote_node_id) ;
253
253
}
254
254
255
- for datagram in PacketSplitIter :: new ( data) {
255
+ for datagram in PacketSplitIter :: new ( self . url . clone ( ) , remote_node_id, data)
256
+ {
256
257
let Ok ( datagram) = datagram else {
257
258
error ! ( "Invalid packet split" ) ;
258
259
break ;
259
260
} ;
260
- let res = RelayRecvDatagram {
261
- url : self . url . clone ( ) ,
262
- src : remote_node_id,
263
- buf : datagram,
264
- } ;
265
- if let Err ( err) = self . relay_datagrams_recv . try_send ( res) {
261
+ if let Err ( err) = self . relay_datagrams_recv . try_send ( datagram) {
266
262
warn ! ( "dropping received relay packet: {err:#}" ) ;
267
263
}
268
264
}
@@ -441,13 +437,9 @@ impl RelayActor {
441
437
// and prefix them with a u16 packet size. They then get sent as a single DISCO
442
438
// frame. However this might still be multiple packets when otherwise the maximum
443
439
// packet size for the relay protocol would be exceeded.
444
- for packet in PacketizeIter :: < _ , PAYLOAD_SIZE > :: new ( contents) {
440
+ for packet in PacketizeIter :: < _ , PAYLOAD_SIZE > :: new ( remote_node , contents) {
445
441
let len = packet. len ( ) ;
446
- match handle
447
- . datagrams_send_queue
448
- . send ( ( remote_node, packet) )
449
- . await
450
- {
442
+ match handle. datagrams_send_queue . send ( packet) . await {
451
443
Ok ( _) => inc_by ! ( MagicsockMetrics , send_relay, len as _) ,
452
444
Err ( err) => {
453
445
warn ! ( ?url, "send failed: {err:#}" ) ;
@@ -799,10 +791,28 @@ impl RelayActor {
799
791
#[ derive( Debug ) ]
800
792
struct ActiveRelayHandle {
801
793
inbox_addr : mpsc:: Sender < ActiveRelayMessage > ,
802
- datagrams_send_queue : mpsc:: Sender < ( NodeId , Bytes ) > ,
794
+ datagrams_send_queue : mpsc:: Sender < RelaySendPacket > ,
803
795
actor_task : JoinHandle < ( ) > ,
804
796
}
805
797
798
+ /// A packet to send over the relay.
799
+ ///
800
+ /// This is nothing but a newtype, it should be constructed using [`PacketizeIter`]. This
801
+ /// is a packet of one or more datagrams, each prefixed with a u16-be length. This is what
802
+ /// the `Frame::SendPacket` of the `DerpCodec` transports and is produced by
803
+ /// [`PacketizeIter`] and transformed back into datagrams using [`PacketSplitIter`].
804
+ #[ derive( Debug , PartialEq , Eq ) ]
805
+ struct RelaySendPacket {
806
+ node_id : NodeId ,
807
+ packet : Bytes ,
808
+ }
809
+
810
+ impl RelaySendPacket {
811
+ fn len ( & self ) -> usize {
812
+ self . packet . len ( )
813
+ }
814
+ }
815
+
806
816
/// A single datagram received from a relay server.
807
817
///
808
818
/// This could be either a QUIC or DISCO packet.
@@ -828,16 +838,18 @@ pub(super) enum ReadResult {
828
838
///
829
839
/// The [`PacketSplitIter`] does the inverse and splits such packets back into individual
830
840
/// datagrams.
831
- pub ( super ) struct PacketizeIter < I : Iterator , const N : usize > {
841
+ struct PacketizeIter < I : Iterator , const N : usize > {
842
+ node_id : NodeId ,
832
843
iter : std:: iter:: Peekable < I > ,
833
844
buffer : BytesMut ,
834
845
}
835
846
836
847
impl < I : Iterator , const N : usize > PacketizeIter < I , N > {
837
848
/// Create a new new PacketizeIter from something that can be turned into an
838
849
/// iterator of slices, like a `Vec<Bytes>`.
839
- pub ( super ) fn new ( iter : impl IntoIterator < IntoIter = I > ) -> Self {
850
+ fn new ( node_id : NodeId , iter : impl IntoIterator < IntoIter = I > ) -> Self {
840
851
Self {
852
+ node_id,
841
853
iter : iter. into_iter ( ) . peekable ( ) ,
842
854
buffer : BytesMut :: with_capacity ( N ) ,
843
855
}
@@ -848,7 +860,7 @@ impl<I: Iterator, const N: usize> Iterator for PacketizeIter<I, N>
848
860
where
849
861
I :: Item : AsRef < [ u8 ] > ,
850
862
{
851
- type Item = Bytes ;
863
+ type Item = RelaySendPacket ;
852
864
853
865
fn next ( & mut self ) -> Option < Self :: Item > {
854
866
use bytes:: BufMut ;
@@ -864,7 +876,10 @@ where
864
876
self . iter . next ( ) ;
865
877
}
866
878
if !self . buffer . is_empty ( ) {
867
- Some ( self . buffer . split ( ) . freeze ( ) )
879
+ Some ( RelaySendPacket {
880
+ node_id : self . node_id ,
881
+ packet : self . buffer . split ( ) . freeze ( ) ,
882
+ } )
868
883
} else {
869
884
None
870
885
}
@@ -877,16 +892,18 @@ where
877
892
/// that struct for more details.
878
893
#[ derive( Debug ) ]
879
894
struct PacketSplitIter {
895
+ url : RelayUrl ,
896
+ src : NodeId ,
880
897
bytes : Bytes ,
881
898
}
882
899
883
900
impl PacketSplitIter {
884
901
/// Create a new PacketSplitIter from a packet.
885
- fn new ( bytes : Bytes ) -> Self {
886
- Self { bytes }
902
+ fn new ( url : RelayUrl , src : NodeId , bytes : Bytes ) -> Self {
903
+ Self { url , src , bytes }
887
904
}
888
905
889
- fn fail ( & mut self ) -> Option < std:: io:: Result < Bytes > > {
906
+ fn fail ( & mut self ) -> Option < std:: io:: Result < RelayRecvDatagram > > {
890
907
self . bytes . clear ( ) ;
891
908
Some ( Err ( std:: io:: Error :: new (
892
909
std:: io:: ErrorKind :: UnexpectedEof ,
@@ -896,7 +913,7 @@ impl PacketSplitIter {
896
913
}
897
914
898
915
impl Iterator for PacketSplitIter {
899
- type Item = std:: io:: Result < Bytes > ;
916
+ type Item = std:: io:: Result < RelayRecvDatagram > ;
900
917
901
918
fn next ( & mut self ) -> Option < Self :: Item > {
902
919
use bytes:: Buf ;
@@ -908,8 +925,12 @@ impl Iterator for PacketSplitIter {
908
925
if self . bytes . remaining ( ) < len {
909
926
return self . fail ( ) ;
910
927
}
911
- let item = self . bytes . split_to ( len) ;
912
- Some ( Ok ( item) )
928
+ let buf = self . bytes . split_to ( len) ;
929
+ Some ( Ok ( RelayRecvDatagram {
930
+ url : self . url . clone ( ) ,
931
+ src : self . src ,
932
+ buf,
933
+ } ) )
913
934
} else {
914
935
None
915
936
}
@@ -918,26 +939,32 @@ impl Iterator for PacketSplitIter {
918
939
919
940
#[ cfg( test) ]
920
941
mod tests {
942
+ use iroh_base:: SecretKey ;
943
+
921
944
use super :: * ;
922
945
923
946
#[ test]
924
947
fn test_packetize_iter ( ) {
948
+ let node_id = SecretKey :: generate ( ) . public ( ) ;
925
949
let empty_vec: Vec < Bytes > = Vec :: new ( ) ;
926
- let mut iter = PacketizeIter :: < _ , MAX_PACKET_SIZE > :: new ( empty_vec) ;
950
+ let mut iter = PacketizeIter :: < _ , MAX_PACKET_SIZE > :: new ( node_id , empty_vec) ;
927
951
assert_eq ! ( None , iter. next( ) ) ;
928
952
929
953
let single_vec = vec ! [ "Hello" ] ;
930
- let iter = PacketizeIter :: < _ , MAX_PACKET_SIZE > :: new ( single_vec) ;
954
+ let iter = PacketizeIter :: < _ , MAX_PACKET_SIZE > :: new ( node_id , single_vec) ;
931
955
let result = iter. collect :: < Vec < _ > > ( ) ;
932
956
assert_eq ! ( 1 , result. len( ) ) ;
933
- assert_eq ! ( & [ 5 , 0 , b'H' , b'e' , b'l' , b'l' , b'o' ] , & result[ 0 ] [ ..] ) ;
957
+ assert_eq ! ( & [ 5 , 0 , b'H' , b'e' , b'l' , b'l' , b'o' ] , & result[ 0 ] . packet [ ..] ) ;
934
958
935
959
let spacer = vec ! [ 0u8 ; MAX_PACKET_SIZE - 10 ] ;
936
960
let multiple_vec = vec ! [ & b"Hello" [ ..] , & spacer, & b"World" [ ..] ] ;
937
- let iter = PacketizeIter :: < _ , MAX_PACKET_SIZE > :: new ( multiple_vec) ;
961
+ let iter = PacketizeIter :: < _ , MAX_PACKET_SIZE > :: new ( node_id , multiple_vec) ;
938
962
let result = iter. collect :: < Vec < _ > > ( ) ;
939
963
assert_eq ! ( 2 , result. len( ) ) ;
940
- assert_eq ! ( & [ 5 , 0 , b'H' , b'e' , b'l' , b'l' , b'o' ] , & result[ 0 ] [ ..7 ] ) ;
941
- assert_eq ! ( & [ 5 , 0 , b'W' , b'o' , b'r' , b'l' , b'd' ] , & result[ 1 ] [ ..] ) ;
964
+ assert_eq ! (
965
+ & [ 5 , 0 , b'H' , b'e' , b'l' , b'l' , b'o' ] ,
966
+ & result[ 0 ] . packet[ ..7 ]
967
+ ) ;
968
+ assert_eq ! ( & [ 5 , 0 , b'W' , b'o' , b'r' , b'l' , b'd' ] , & result[ 1 ] . packet[ ..] ) ;
942
969
}
943
970
}
0 commit comments