@@ -8,6 +8,7 @@ use aquatic_udp_protocol::ConnectionId;
88
99use crate :: connection_cookie:: { gen_remote_fingerprint, make} ;
1010use crate :: statistics;
11+ use crate :: statistics:: event:: ConnectionContext ;
1112
1213/// The `ConnectService` is responsible for handling the `connect` requests.
1314///
@@ -30,16 +31,30 @@ impl ConnectService {
3031 /// # Panics
3132 ///
3233 /// It will panic if there was an error making the connection cookie.
33- pub async fn handle_connect ( & self , remote_addr : SocketAddr , cookie_issue_time : f64 ) -> ConnectionId {
34- let connection_id = make ( gen_remote_fingerprint ( & remote_addr) , cookie_issue_time) . expect ( "it should be a normal value" ) ;
34+ pub async fn handle_connect (
35+ & self ,
36+ client_socket_addr : SocketAddr ,
37+ server_socket_addr : SocketAddr ,
38+ cookie_issue_time : f64 ,
39+ ) -> ConnectionId {
40+ let connection_id =
41+ make ( gen_remote_fingerprint ( & client_socket_addr) , cookie_issue_time) . expect ( "it should be a normal value" ) ;
3542
3643 if let Some ( udp_stats_event_sender) = self . opt_udp_core_stats_event_sender . as_deref ( ) {
37- match remote_addr {
44+ match client_socket_addr {
3845 SocketAddr :: V4 ( _) => {
39- udp_stats_event_sender. send_event ( statistics:: event:: Event :: Udp4Connect ) . await ;
46+ udp_stats_event_sender
47+ . send_event ( statistics:: event:: Event :: Udp4Connect {
48+ context : ConnectionContext :: new ( client_socket_addr, server_socket_addr) ,
49+ } )
50+ . await ;
4051 }
4152 SocketAddr :: V6 ( _) => {
42- udp_stats_event_sender. send_event ( statistics:: event:: Event :: Udp6Connect ) . await ;
53+ udp_stats_event_sender
54+ . send_event ( statistics:: event:: Event :: Udp6Connect {
55+ context : ConnectionContext :: new ( client_socket_addr, server_socket_addr) ,
56+ } )
57+ . await ;
4358 }
4459 }
4560 }
@@ -54,6 +69,7 @@ mod tests {
5469 mod connect_request {
5570
5671 use std:: future;
72+ use std:: net:: { IpAddr , Ipv4Addr , SocketAddr } ;
5773 use std:: sync:: Arc ;
5874
5975 use mockall:: predicate:: eq;
@@ -65,16 +81,19 @@ mod tests {
6581 sample_ipv6_remote_addr_fingerprint, sample_issue_time, MockUdpCoreStatsEventSender ,
6682 } ;
6783 use crate :: statistics;
84+ use crate :: statistics:: event:: ConnectionContext ;
6885
6986 #[ tokio:: test]
7087 async fn a_connect_response_should_contain_the_same_transaction_id_as_the_connect_request ( ) {
88+ let server_socket_addr = SocketAddr :: new ( IpAddr :: V4 ( Ipv4Addr :: new ( 203 , 0 , 113 , 196 ) ) , 6969 ) ;
89+
7190 let ( udp_core_stats_event_sender, _udp_core_stats_repository) = statistics:: setup:: factory ( false ) ;
7291 let udp_core_stats_event_sender = Arc :: new ( udp_core_stats_event_sender) ;
7392
7493 let connect_service = Arc :: new ( ConnectService :: new ( udp_core_stats_event_sender) ) ;
7594
7695 let response = connect_service
77- . handle_connect ( sample_ipv4_remote_addr ( ) , sample_issue_time ( ) )
96+ . handle_connect ( sample_ipv4_remote_addr ( ) , server_socket_addr , sample_issue_time ( ) )
7897 . await ;
7998
8099 assert_eq ! (
@@ -85,13 +104,15 @@ mod tests {
85104
86105 #[ tokio:: test]
87106 async fn a_connect_response_should_contain_a_new_connection_id ( ) {
107+ let server_socket_addr = SocketAddr :: new ( IpAddr :: V4 ( Ipv4Addr :: new ( 203 , 0 , 113 , 196 ) ) , 6969 ) ;
108+
88109 let ( udp_core_stats_event_sender, _udp_core_stats_repository) = statistics:: setup:: factory ( false ) ;
89110 let udp_core_stats_event_sender = Arc :: new ( udp_core_stats_event_sender) ;
90111
91112 let connect_service = Arc :: new ( ConnectService :: new ( udp_core_stats_event_sender) ) ;
92113
93114 let response = connect_service
94- . handle_connect ( sample_ipv4_remote_addr ( ) , sample_issue_time ( ) )
115+ . handle_connect ( sample_ipv4_remote_addr ( ) , server_socket_addr , sample_issue_time ( ) )
95116 . await ;
96117
97118 assert_eq ! (
@@ -102,13 +123,16 @@ mod tests {
102123
103124 #[ tokio:: test]
104125 async fn a_connect_response_should_contain_a_new_connection_id_ipv6 ( ) {
126+ let client_socket_addr = sample_ipv6_remote_addr ( ) ;
127+ let server_socket_addr = SocketAddr :: new ( IpAddr :: V4 ( Ipv4Addr :: new ( 203 , 0 , 113 , 196 ) ) , 6969 ) ;
128+
105129 let ( udp_core_stats_event_sender, _udp_core_stats_repository) = statistics:: setup:: factory ( false ) ;
106130 let udp_core_stats_event_sender = Arc :: new ( udp_core_stats_event_sender) ;
107131
108132 let connect_service = Arc :: new ( ConnectService :: new ( udp_core_stats_event_sender) ) ;
109133
110134 let response = connect_service
111- . handle_connect ( sample_ipv6_remote_addr ( ) , sample_issue_time ( ) )
135+ . handle_connect ( client_socket_addr , server_socket_addr , sample_issue_time ( ) )
112136 . await ;
113137
114138 assert_eq ! (
@@ -119,30 +143,38 @@ mod tests {
119143
120144 #[ tokio:: test]
121145 async fn it_should_send_the_upd4_connect_event_when_a_client_tries_to_connect_using_a_ip4_socket_address ( ) {
146+ let client_socket_addr = sample_ipv4_socket_address ( ) ;
147+ let server_socket_addr = SocketAddr :: new ( IpAddr :: V4 ( Ipv4Addr :: new ( 203 , 0 , 113 , 196 ) ) , 6969 ) ;
148+
122149 let mut udp_stats_event_sender_mock = MockUdpCoreStatsEventSender :: new ( ) ;
123150 udp_stats_event_sender_mock
124151 . expect_send_event ( )
125- . with ( eq ( statistics:: event:: Event :: Udp4Connect ) )
152+ . with ( eq ( statistics:: event:: Event :: Udp4Connect {
153+ context : ConnectionContext :: new ( client_socket_addr, server_socket_addr) ,
154+ } ) )
126155 . times ( 1 )
127156 . returning ( |_| Box :: pin ( future:: ready ( Some ( Ok ( ( ) ) ) ) ) ) ;
128157 let opt_udp_stats_event_sender: Arc < Option < Box < dyn statistics:: event:: sender:: Sender > > > =
129158 Arc :: new ( Some ( Box :: new ( udp_stats_event_sender_mock) ) ) ;
130159
131- let client_socket_address = sample_ipv4_socket_address ( ) ;
132-
133160 let connect_service = Arc :: new ( ConnectService :: new ( opt_udp_stats_event_sender) ) ;
134161
135162 connect_service
136- . handle_connect ( client_socket_address , sample_issue_time ( ) )
163+ . handle_connect ( client_socket_addr , server_socket_addr , sample_issue_time ( ) )
137164 . await ;
138165 }
139166
140167 #[ tokio:: test]
141168 async fn it_should_send_the_upd6_connect_event_when_a_client_tries_to_connect_using_a_ip6_socket_address ( ) {
169+ let client_socket_addr = sample_ipv6_remote_addr ( ) ;
170+ let server_socket_addr = SocketAddr :: new ( IpAddr :: V4 ( Ipv4Addr :: new ( 203 , 0 , 113 , 196 ) ) , 6969 ) ;
171+
142172 let mut udp_stats_event_sender_mock = MockUdpCoreStatsEventSender :: new ( ) ;
143173 udp_stats_event_sender_mock
144174 . expect_send_event ( )
145- . with ( eq ( statistics:: event:: Event :: Udp6Connect ) )
175+ . with ( eq ( statistics:: event:: Event :: Udp6Connect {
176+ context : ConnectionContext :: new ( client_socket_addr, server_socket_addr) ,
177+ } ) )
146178 . times ( 1 )
147179 . returning ( |_| Box :: pin ( future:: ready ( Some ( Ok ( ( ) ) ) ) ) ) ;
148180 let opt_udp_stats_event_sender: Arc < Option < Box < dyn statistics:: event:: sender:: Sender > > > =
@@ -151,7 +183,7 @@ mod tests {
151183 let connect_service = Arc :: new ( ConnectService :: new ( opt_udp_stats_event_sender) ) ;
152184
153185 connect_service
154- . handle_connect ( sample_ipv6_remote_addr ( ) , sample_issue_time ( ) )
186+ . handle_connect ( client_socket_addr , server_socket_addr , sample_issue_time ( ) )
155187 . await ;
156188 }
157189 }
0 commit comments