44
55use futures_util:: TryFutureExt ;
66use local_async_utils:: sec;
7- use mtorrent_utils:: ip:: bind_to_interface ;
7+ use mtorrent_utils:: ip;
88use mtorrent_utils:: peer_id:: PeerId ;
99use std:: collections:: HashMap ;
1010use std:: net:: { Ipv4Addr , Ipv6Addr , SocketAddr } ;
@@ -183,7 +183,10 @@ impl Manager {
183183 } } ;
184184 }
185185
186- let http_client = http:: TrackerClient :: new ( self . config . bind_interface . as_deref ( ) )
186+ let interface = self . config . bind_interface . as_deref ( ) ;
187+ let local_ipv4 = ip:: get_bind_addr_v4 ( interface) ;
188+ let local_ipv6 = ip:: get_bind_addr_v6 ( interface) ;
189+ let http_client = http:: TrackerClient :: new ( local_ipv4. into ( ) , interface)
187190 . inspect_err ( |e| log:: error!( "Failed to create HTTP tracker client: {e}" ) )
188191 . ok ( ) ;
189192
@@ -206,8 +209,14 @@ impl Manager {
206209 TrackerUrl :: Udp ( addr) => {
207210 let interface = self . config . bind_interface . clone ( ) ;
208211 spawn_child_task ! ( async move {
209- let result =
210- do_udp_announce( & addr, request. data, interface. as_deref( ) ) . await ;
212+ let result = do_udp_announce(
213+ & addr,
214+ request. data,
215+ interface. as_deref( ) ,
216+ local_ipv4,
217+ local_ipv6,
218+ )
219+ . await ;
211220 _ = request. responder. send( result) . inspect_err( |_| {
212221 log:: warn!( "Failed to send back udp announce result" )
213222 } ) ;
@@ -231,8 +240,14 @@ impl Manager {
231240 TrackerUrl :: Udp ( addr) => {
232241 let interface = self . config . bind_interface . clone ( ) ;
233242 spawn_child_task ! ( async move {
234- let result =
235- do_udp_scrape( & addr, request. data, interface. as_deref( ) ) . await ;
243+ let result = do_udp_scrape(
244+ & addr,
245+ request. data,
246+ interface. as_deref( ) ,
247+ local_ipv4,
248+ local_ipv6,
249+ )
250+ . await ;
236251 _ = request. responder. send( result) . inspect_err( |_| {
237252 log:: warn!( "Failed to send back udp scrape result" )
238253 } ) ;
@@ -318,6 +333,8 @@ async fn do_http_scrape(
318333async fn new_udp_client (
319334 tracker_addr_str : & str ,
320335 interface : Option < & str > ,
336+ local_ipv4 : Ipv4Addr ,
337+ local_ipv6 : Ipv6Addr ,
321338) -> io:: Result < udp:: TrackerConnection > {
322339 async fn bind_and_connect_socket (
323340 bind_addr : & SocketAddr ,
@@ -326,16 +343,16 @@ async fn new_udp_client(
326343 ) -> io:: Result < UdpSocket > {
327344 let socket = UdpSocket :: bind ( bind_addr) . await ?;
328345 if let Some ( iface) = interface {
329- bind_to_interface ( & socket, iface) ?;
346+ ip :: bind_to_interface ( & socket, iface) ?;
330347 }
331348 socket. connect ( & remote_addr) . await ?;
332349 Ok ( socket)
333350 }
334351
335352 for tracker_addr in net:: lookup_host ( tracker_addr_str) . await ? {
336353 let local_ip = match & tracker_addr {
337- SocketAddr :: V4 ( _) => Ipv4Addr :: UNSPECIFIED . into ( ) ,
338- SocketAddr :: V6 ( _) => Ipv6Addr :: UNSPECIFIED . into ( ) ,
354+ SocketAddr :: V4 ( _) => local_ipv4 . into ( ) ,
355+ SocketAddr :: V6 ( _) => local_ipv6 . into ( ) ,
339356 } ;
340357 let local_addr = SocketAddr :: new ( local_ip, 0 ) ;
341358 if let Ok ( client) = bind_and_connect_socket ( & local_addr, & tracker_addr, interface)
@@ -352,8 +369,10 @@ async fn do_udp_announce(
352369 tracker_addr : & str ,
353370 data : AnnounceRequest ,
354371 interface : Option < & str > ,
372+ local_ipv4 : Ipv4Addr ,
373+ local_ipv6 : Ipv6Addr ,
355374) -> io:: Result < AnnounceResponse > {
356- let mut client = new_udp_client ( tracker_addr, interface) . await ?;
375+ let mut client = new_udp_client ( tracker_addr, interface, local_ipv4 , local_ipv6 ) . await ?;
357376
358377 let request = udp:: AnnounceRequest {
359378 info_hash : data. info_hash ,
@@ -379,8 +398,10 @@ async fn do_udp_scrape(
379398 tracker_addr : & str ,
380399 data : ScrapeRequest ,
381400 interface : Option < & str > ,
401+ local_ipv4 : Ipv4Addr ,
402+ local_ipv6 : Ipv6Addr ,
382403) -> io:: Result < ScrapeResponse > {
383- let mut client = new_udp_client ( tracker_addr, interface) . await ?;
404+ let mut client = new_udp_client ( tracker_addr, interface, local_ipv4 , local_ipv6 ) . await ?;
384405
385406 let request = udp:: ScrapeRequest {
386407 info_hashes : data. info_hashes . clone ( ) ,
0 commit comments