22//!
33//! Preferred on Linux systems. No special privileges required for regular UDP sockets.
44
5- use std:: { io:: IoSliceMut , net:: SocketAddr , os:: fd:: AsRawFd } ;
5+ use std:: { io:: IoSliceMut , net:: SocketAddr , os:: fd:: AsRawFd , sync :: Arc } ;
66
77use nix:: {
88 libc,
@@ -15,7 +15,7 @@ use crate::{
1515 crypto:: HmacKey ,
1616 error_estimate:: ErrorEstimate ,
1717 packets:: { PacketAuthenticated , PacketUnauthenticated } ,
18- session:: Session ,
18+ session:: SessionManager ,
1919 time:: generate_timestamp,
2020} ;
2121
@@ -109,10 +109,15 @@ pub async fn run_receiver(conf: &Configuration) {
109109 log:: info!( "HMAC authentication enabled" ) ;
110110 }
111111
112- // Create session for stateful reflector mode (RFC 8972)
113- let reflector_session = if conf. stateful_reflector {
112+ // Create session manager for stateful reflector mode (RFC 8972)
113+ let session_manager: Option < Arc < SessionManager > > = if conf. stateful_reflector {
114+ let timeout = if conf. session_timeout > 0 {
115+ Some ( std:: time:: Duration :: from_secs ( conf. session_timeout ) )
116+ } else {
117+ None
118+ } ;
114119 log:: info!( "Stateful reflector mode enabled (RFC 8972)" ) ;
115- Some ( Session :: new ( 0 ) )
120+ Some ( Arc :: new ( SessionManager :: new ( timeout ) ) )
116121 } else {
117122 None
118123 } ;
@@ -143,7 +148,7 @@ pub async fn run_receiver(conf: &Configuration) {
143148 ) {
144149 Ok ( msg) => {
145150 let len = msg. bytes ;
146- let src_addr = msg. address ;
151+ let src_storage = msg. address ;
147152
148153 // Extract TTL from control messages
149154 let ttl = match extract_ttl_from_cmsgs ( & msg) {
@@ -153,6 +158,25 @@ pub async fn run_receiver(conf: &Configuration) {
153158 continue ;
154159 }
155160 } ;
161+
162+ // Convert source address for session lookup and response
163+ let src_addr: SocketAddr = match src_storage {
164+ Some ( ref src) => {
165+ if let Some ( v4) = src. as_sockaddr_in ( ) {
166+ std:: net:: SocketAddrV4 :: new ( v4. ip ( ) , v4. port ( ) ) . into ( )
167+ } else if let Some ( v6) = src. as_sockaddr_in6 ( ) {
168+ std:: net:: SocketAddrV6 :: new ( v6. ip ( ) , v6. port ( ) , 0 , 0 ) . into ( )
169+ } else {
170+ eprintln ! ( "Unknown source address type" ) ;
171+ continue ;
172+ }
173+ }
174+ None => {
175+ eprintln ! ( "No source address available" ) ;
176+ continue ;
177+ }
178+ } ;
179+
156180 let rcvt = generate_timestamp ( conf. clock_source ) ;
157181
158182 let response = if use_auth {
@@ -179,9 +203,9 @@ pub async fn run_receiver(conf: &Configuration) {
179203 }
180204
181205 // Generate reflector sequence number only after successful validation
182- let reflector_seq = reflector_session
206+ let reflector_seq = session_manager
183207 . as_ref ( )
184- . map ( |s| s . generate_sequence_number ( ) ) ;
208+ . map ( |mgr| mgr . generate_sequence_number ( src_addr ) ) ;
185209
186210 // Use symmetric assembly to preserve original packet length (RFC 8762 Section 4.3)
187211 Some ( assemble_auth_answer_symmetric (
@@ -209,9 +233,9 @@ pub async fn run_receiver(conf: &Configuration) {
209233 match packet_result {
210234 Ok ( packet) => {
211235 // Generate reflector sequence number only after successful validation
212- let reflector_seq = reflector_session
236+ let reflector_seq = session_manager
213237 . as_ref ( )
214- . map ( |s| s . generate_sequence_number ( ) ) ;
238+ . map ( |mgr| mgr . generate_sequence_number ( src_addr ) ) ;
215239
216240 // Use symmetric assembly to preserve original packet length (RFC 8762 Section 4.3)
217241 Some ( assemble_unauth_answer_symmetric (
@@ -232,20 +256,8 @@ pub async fn run_receiver(conf: &Configuration) {
232256 } ;
233257
234258 if let Some ( response_buf) = response {
235- if let Some ( src) = src_addr {
236- // Convert SockaddrStorage back to SocketAddr
237- let dest: SocketAddr = if let Some ( v4) = src. as_sockaddr_in ( ) {
238- std:: net:: SocketAddrV4 :: new ( v4. ip ( ) , v4. port ( ) ) . into ( )
239- } else if let Some ( v6) = src. as_sockaddr_in6 ( ) {
240- std:: net:: SocketAddrV6 :: new ( v6. ip ( ) , v6. port ( ) , 0 , 0 ) . into ( )
241- } else {
242- eprintln ! ( "Unknown source address type" ) ;
243- continue ;
244- } ;
245-
246- if let Err ( e) = tokio_socket. send_to ( & response_buf, dest) . await {
247- eprintln ! ( "Failed to send response: {}" , e) ;
248- }
259+ if let Err ( e) = tokio_socket. send_to ( & response_buf, src_addr) . await {
260+ eprintln ! ( "Failed to send response: {}" , e) ;
249261 }
250262 }
251263 }
0 commit comments