open-trade лет назад: 5
Родитель
Сommit
983486d0ed
2 измененных файлов с 63 добавлено и 23 удалено
  1. 1 1
      libs/hbb_common
  2. 62 22
      src/rendezvous_server.rs

+ 1 - 1
libs/hbb_common

@@ -1 +1 @@
1
-Subproject commit 489ff100300235ef3b9e7820f1b13dadc75be5f8
1
+Subproject commit 56d07b3457150de0caa0d08d17b99ec3d267ef61

+ 62 - 22
src/rendezvous_server.rs

@@ -1,5 +1,5 @@
1 1
 use hbb_common::{
2
-    bytes::BytesMut, log, message_proto::*, protobuf::parse_from_bytes, udp::FramedSocket,
2
+    bytes::BytesMut, log, protobuf::parse_from_bytes, rendezvous_proto::*, udp::FramedSocket,
3 3
     AddrMangle, ResultType,
4 4
 };
5 5
 use std::{collections::HashMap, net::SocketAddr};
@@ -41,43 +41,83 @@ impl RendezvousServer {
41 41
         addr: SocketAddr,
42 42
         socket: &mut FramedSocket,
43 43
     ) -> ResultType<()> {
44
-        if let Ok(msg_in) = parse_from_bytes::<Message>(&bytes) {
44
+        if let Ok(msg_in) = parse_from_bytes::<RendezvousMessage>(&bytes) {
45 45
             match msg_in.union {
46
-                Some(Message_oneof_union::register_peer(rp)) => {
46
+                Some(RendezvousMessage_oneof_union::register_peer(rp)) => {
47
+                    // B registered
47 48
                     if rp.hbb_addr.len() > 0 {
48 49
                         log::debug!("New peer registered: {:?} {:?}", &rp.hbb_addr, &addr);
49 50
                         self.peer_map
50 51
                             .insert(rp.hbb_addr, Peer { socket_addr: addr });
51 52
                     }
52 53
                 }
53
-                Some(Message_oneof_union::punch_hole_request(ph)) => {
54
-                    // punch hole request from A, forward to B
54
+                Some(RendezvousMessage_oneof_union::punch_hole_request(ph)) => {
55
+                    // punch hole request from A, forward to B,
56
+                    // check if in same intranet first,
57
+                    // fetch local addrs if in same intranet.
58
+                    // because punch hole won't work if in the same intranet,
59
+                    // all routers will drop such self-connections.
55 60
                     if let Some(peer) = self.peer_map.get(&ph.hbb_addr) {
56
-                        log::debug!(
57
-                            "Punch hole {:?} {:?} request from {:?}",
58
-                            &ph.hbb_addr,
59
-                            &peer.socket_addr,
60
-                            &addr
61
-                        );
62
-                        let mut msg_out = Message::new();
63
-                        msg_out.set_punch_hole(PunchHole {
64
-                            socket_addr: AddrMangle::encode(&addr),
65
-                            ..Default::default()
66
-                        });
61
+                        let mut msg_out = RendezvousMessage::new();
62
+                        let same_intranet = match peer.socket_addr {
63
+                            SocketAddr::V4(a) => match addr {
64
+                                SocketAddr::V4(b) => a.ip() == b.ip(),
65
+                                _ => false,
66
+                            },
67
+                            SocketAddr::V6(a) => match addr {
68
+                                SocketAddr::V6(b) => a.ip() == b.ip(),
69
+                                _ => false,
70
+                            },
71
+                        };
72
+                        let socket_addr = AddrMangle::encode(&addr);
73
+                        if same_intranet {
74
+                            log::debug!(
75
+                                "Fetch local addrs {:?} {:?} request from {:?}",
76
+                                &ph.hbb_addr,
77
+                                &peer.socket_addr,
78
+                                &addr
79
+                            );
80
+                            msg_out.set_fetch_local_addrs(FetchLocalAddrs {
81
+                                socket_addr,
82
+                                ..Default::default()
83
+                            });
84
+                        } else {
85
+                            log::debug!(
86
+                                "Punch hole {:?} {:?} request from {:?}",
87
+                                &ph.hbb_addr,
88
+                                &peer.socket_addr,
89
+                                &addr
90
+                            );
91
+                            msg_out.set_punch_hole(PunchHole {
92
+                                socket_addr,
93
+                                ..Default::default()
94
+                            });
95
+                        }
67 96
                         socket.send(&msg_out, peer.socket_addr).await?;
68 97
                     }
69 98
                 }
70
-                Some(Message_oneof_union::punch_hole_sent(phs)) => {
71
-                    // punch hole sent from B, tell A that B ready
99
+                Some(RendezvousMessage_oneof_union::punch_hole_sent(phs)) => {
100
+                    // punch hole sent from B, tell A that B is ready to be connected
72 101
                     let addr_a = AddrMangle::decode(&phs.socket_addr);
73 102
                     log::debug!("Punch hole response to {:?} from {:?}", &addr_a, &addr);
74
-                    let mut msg_out = Message::new();
103
+                    let mut msg_out = RendezvousMessage::new();
75 104
                     msg_out.set_punch_hole_response(PunchHoleResponse {
76 105
                         socket_addr: AddrMangle::encode(&addr),
77 106
                         ..Default::default()
78 107
                     });
79 108
                     socket.send(&msg_out, addr_a).await?;
80 109
                 }
110
+                Some(RendezvousMessage_oneof_union::local_addrs(la)) => {
111
+                    // forward local addrs of B to A
112
+                    let addr_a = AddrMangle::decode(&la.socket_addr);
113
+                    log::debug!("Local addrs response to {:?} from {:?}", &addr_a, &addr);
114
+                    let mut msg_out = RendezvousMessage::new();
115
+                    msg_out.set_local_addrs_response(LocalAddrsResponse {
116
+                        socket_addrs: la.local_addrs,
117
+                        ..Default::default()
118
+                    });
119
+                    socket.send(&msg_out, addr_a).await?;
120
+                }
81 121
                 _ => {}
82 122
             }
83 123
         }
@@ -110,7 +150,7 @@ mod tests {
110 150
         // B register it to server
111 151
         let mut socket_b = FramedSocket::new("127.0.0.1:0").await?;
112 152
         let local_addr_b = socket_b.get_ref().local_addr().unwrap();
113
-        let mut msg_out = Message::new();
153
+        let mut msg_out = RendezvousMessage::new();
114 154
         msg_out.set_register_peer(RegisterPeer {
115 155
             hbb_addr: "123".to_string(),
116 156
             ..Default::default()
@@ -134,7 +174,7 @@ mod tests {
134 174
         // on B side, responsed to A's punch request forwarded from server
135 175
         if let Some(Ok((bytes, addr))) = socket_b.next_timeout(1000).await {
136 176
             assert_eq!(addr_server, addr);
137
-            let msg_in = parse_from_bytes::<Message>(&bytes)?;
177
+            let msg_in = parse_from_bytes::<RendezvousMessage>(&bytes)?;
138 178
             let remote_addr_a = AddrMangle::decode(&msg_in.get_punch_hole().socket_addr);
139 179
             assert_eq!(local_addr_a, remote_addr_a);
140 180
 
@@ -157,7 +197,7 @@ mod tests {
157 197
         socket_a.next().await; // skip "SYN"
158 198
         if let Some(Ok((bytes, addr))) = socket_a.next_timeout(1000).await {
159 199
             assert_eq!(addr_server, addr);
160
-            let msg_in = parse_from_bytes::<Message>(&bytes)?;
200
+            let msg_in = parse_from_bytes::<RendezvousMessage>(&bytes)?;
161 201
             let remote_addr_b = AddrMangle::decode(&msg_in.get_punch_hole_response().socket_addr);
162 202
             assert_eq!(local_addr_b, remote_addr_b);
163 203
         } else {