Browse Source

refacor relay_response to support initiate relay from server side

open-trade 5 years ago
parent
commit
77b1072c7d
2 changed files with 26 additions and 25 deletions
  1. 1 1
      libs/hbb_common
  2. 25 24
      src/rendezvous_server.rs

+ 1 - 1
libs/hbb_common

@@ -1 +1 @@
1
-Subproject commit ef0bf8e43ad9017d5b7851ad0f261b6503554e65
1
+Subproject commit 661e7303cc4ce14cc2a8e812200e2464a4da1c32

+ 25 - 24
src/rendezvous_server.rs

@@ -181,7 +181,7 @@ impl RendezvousServer {
181 181
                                         } else {
182 182
                                             break;
183 183
                                         }
184
-                                        allow_err!(rs.handle_tcp_punch_hole_request(addr, ph.id).await);
184
+                                        allow_err!(rs.handle_tcp_punch_hole_request(addr, ph).await);
185 185
                                     }
186 186
                                     Some(rendezvous_message::Union::request_relay(mut rf)) => {
187 187
                                         if let Some(sender) = sender.take() {
@@ -196,11 +196,17 @@ impl RendezvousServer {
196 196
                                             rs.tx.send((msg_out, peer.socket_addr)).ok();
197 197
                                         }
198 198
                                     }
199
-                                    Some(rendezvous_message::Union::request_relay_response(mut rfr)) => {
200
-                                        let addr_b = AddrMangle::decode(&rfr.socket_addr);
201
-                                        rfr.socket_addr = Default::default();
199
+                                    Some(rendezvous_message::Union::relay_response(mut rr)) => {
200
+                                        let addr_b = AddrMangle::decode(&rr.socket_addr);
201
+                                        rr.socket_addr = Default::default();
202
+                                        let id = rr.get_id();
203
+                                        if !id.is_empty() {
204
+                                            if let Some(peer) = rs.pm.get(&id).await {
205
+                                                rr.set_pk(peer.pk.clone());
206
+                                            }
207
+                                        }
202 208
                                         let mut msg_out = RendezvousMessage::new();
203
-                                        msg_out.set_request_relay_response(rfr);
209
+                                        msg_out.set_relay_response(rr);
204 210
                                         allow_err!(rs.send_to_tcp_sync(&msg_out, addr_b).await);
205 211
                                         break;
206 212
                                     }
@@ -297,14 +303,13 @@ impl RendezvousServer {
297 303
                     socket.send(&msg_out, addr).await?
298 304
                 }
299 305
                 Some(rendezvous_message::Union::punch_hole_request(ph)) => {
300
-                    let id = ph.id;
301
-                    if self.pm.is_in_memory(&id) {
302
-                        self.handle_udp_punch_hole_request(addr, id).await?;
306
+                    if self.pm.is_in_memory(&ph.id) {
307
+                        self.handle_udp_punch_hole_request(addr, ph).await?;
303 308
                     } else {
304 309
                         // not in memory, fetch from db with spawn in case blocking me
305 310
                         let mut me = self.clone();
306 311
                         tokio::spawn(async move {
307
-                            allow_err!(me.handle_udp_punch_hole_request(addr, id).await);
312
+                            allow_err!(me.handle_udp_punch_hole_request(addr, ph).await);
308 313
                         });
309 314
                     }
310 315
                 }
@@ -420,14 +425,10 @@ impl RendezvousServer {
420 425
             Some(peer) => peer.pk,
421 426
             _ => Vec::new(),
422 427
         };
423
-        let mut relay_server = phs.relay_server;
424
-        if relay_server.is_empty() {
425
-            relay_server = self.relay_server.clone();
426
-        }
427 428
         let mut p = PunchHoleResponse {
428 429
             socket_addr: AddrMangle::encode(addr),
429 430
             pk,
430
-            relay_server,
431
+            relay_server: phs.relay_server.clone(),
431 432
             ..Default::default()
432 433
         };
433 434
         if let Ok(t) = phs.nat_type.enum_value() {
@@ -458,13 +459,9 @@ impl RendezvousServer {
458 459
             &addr
459 460
         );
460 461
         let mut msg_out = RendezvousMessage::new();
461
-        let mut relay_server = la.relay_server;
462
-        if relay_server.is_empty() {
463
-            relay_server = self.relay_server.clone();
464
-        }
465 462
         let mut p = PunchHoleResponse {
466 463
             socket_addr: la.local_addr.clone(),
467
-            relay_server,
464
+            relay_server: la.relay_server,
468 465
             ..Default::default()
469 466
         };
470 467
         p.set_is_local(true);
@@ -481,8 +478,9 @@ impl RendezvousServer {
481 478
     async fn handle_punch_hole_request(
482 479
         &mut self,
483 480
         addr: SocketAddr,
484
-        id: String,
481
+        ph: PunchHoleRequest,
485 482
     ) -> ResultType<(RendezvousMessage, Option<SocketAddr>)> {
483
+        let id = ph.id;
486 484
         // punch hole request from A, relay to B,
487 485
         // check if in same intranet first,
488 486
         // fetch local addrs if in same intranet.
@@ -518,6 +516,7 @@ impl RendezvousServer {
518 516
                 );
519 517
                 msg_out.set_fetch_local_addr(FetchLocalAddr {
520 518
                     socket_addr,
519
+                    relay_server: self.relay_server.clone(),
521 520
                     ..Default::default()
522 521
                 });
523 522
             } else {
@@ -529,6 +528,8 @@ impl RendezvousServer {
529 528
                 );
530 529
                 msg_out.set_punch_hole(PunchHole {
531 530
                     socket_addr,
531
+                    nat_type: ph.nat_type,
532
+                    relay_server: self.relay_server.clone(),
532 533
                     ..Default::default()
533 534
                 });
534 535
             }
@@ -574,9 +575,9 @@ impl RendezvousServer {
574 575
     async fn handle_tcp_punch_hole_request(
575 576
         &mut self,
576 577
         addr: SocketAddr,
577
-        id: String,
578
+        ph: PunchHoleRequest,
578 579
     ) -> ResultType<()> {
579
-        let (msg, to_addr) = self.handle_punch_hole_request(addr, id).await?;
580
+        let (msg, to_addr) = self.handle_punch_hole_request(addr, ph).await?;
580 581
         if let Some(addr) = to_addr {
581 582
             self.tx.send((msg, addr))?;
582 583
         } else {
@@ -589,9 +590,9 @@ impl RendezvousServer {
589 590
     async fn handle_udp_punch_hole_request(
590 591
         &mut self,
591 592
         addr: SocketAddr,
592
-        id: String,
593
+        ph: PunchHoleRequest,
593 594
     ) -> ResultType<()> {
594
-        let (msg, to_addr) = self.handle_punch_hole_request(addr, id).await?;
595
+        let (msg, to_addr) = self.handle_punch_hole_request(addr, ph).await?;
595 596
         self.tx.send((
596 597
             msg,
597 598
             match to_addr {