|
|
@@ -15,7 +15,7 @@ use hbb_common::{
|
|
15
|
15
|
register_pk_response::Result::{TOO_FREQUENT, UUID_MISMATCH},
|
|
16
|
16
|
*,
|
|
17
|
17
|
},
|
|
18
|
|
- tcp::{new_listener, FramedStream},
|
|
|
18
|
+ tcp::{listen_any, FramedStream},
|
|
19
|
19
|
timeout,
|
|
20
|
20
|
tokio::{
|
|
21
|
21
|
self,
|
|
|
@@ -32,7 +32,7 @@ use ipnetwork::Ipv4Network;
|
|
32
|
32
|
use sodiumoxide::crypto::sign;
|
|
33
|
33
|
use std::{
|
|
34
|
34
|
collections::HashMap,
|
|
35
|
|
- net::{IpAddr, Ipv4Addr, SocketAddr},
|
|
|
35
|
+ net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr},
|
|
36
|
36
|
sync::Arc,
|
|
37
|
37
|
time::Instant,
|
|
38
|
38
|
};
|
|
|
@@ -92,15 +92,15 @@ impl RendezvousServer {
|
|
92
|
92
|
pub async fn start(port: i32, serial: i32, key: &str, rmem: usize) -> ResultType<()> {
|
|
93
|
93
|
let (key, sk) = Self::get_server_sk(key);
|
|
94
|
94
|
let addr = format!("0.0.0.0:{}", port);
|
|
95
|
|
- let addr2 = format!("0.0.0.0:{}", port - 1);
|
|
96
|
|
- let addr3 = format!("0.0.0.0:{}", port + 2);
|
|
|
95
|
+ let nat_port = port - 1;
|
|
|
96
|
+ let ws_port = port + 2;
|
|
97
|
97
|
let pm = PeerMap::new().await?;
|
|
98
|
98
|
log::info!("serial={}", serial);
|
|
99
|
99
|
let rendezvous_servers = get_servers(&get_arg("rendezvous-servers"), "rendezvous-servers");
|
|
100
|
|
- log::info!("Listening on tcp/udp {}", addr);
|
|
101
|
|
- log::info!("Listening on tcp {}, extra port for NAT test", addr2);
|
|
102
|
|
- log::info!("Listening on websocket {}", addr3);
|
|
103
|
|
- let mut socket = FramedSocket::new_with_buf_size(&addr, rmem).await?;
|
|
|
100
|
+ log::info!("Listening on tcp/udp :{}", port);
|
|
|
101
|
+ log::info!("Listening on tcp :{}, extra port for NAT test", nat_port);
|
|
|
102
|
+ log::info!("Listening on websocket :{}", ws_port);
|
|
|
103
|
+ let mut socket = create_udp_listener(port, rmem).await?;
|
|
104
|
104
|
let (tx, mut rx) = mpsc::unbounded_channel::<Data>();
|
|
105
|
105
|
let software_url = get_arg("software-url");
|
|
106
|
106
|
let version = hbb_common::get_version_from_url(&software_url);
|
|
|
@@ -138,9 +138,9 @@ impl RendezvousServer {
|
|
138
|
138
|
log::info!("local-ip: {:?}", rs.inner.local_ip);
|
|
139
|
139
|
std::env::set_var("PORT_FOR_API", port.to_string());
|
|
140
|
140
|
rs.parse_relay_servers(&get_arg("relay-servers"));
|
|
141
|
|
- let mut listener = new_listener(&addr, false).await?;
|
|
142
|
|
- let mut listener2 = new_listener(&addr2, false).await?;
|
|
143
|
|
- let mut listener3 = new_listener(&addr3, false).await?;
|
|
|
141
|
+ let mut listener = create_tcp_listener(port).await?;
|
|
|
142
|
+ let mut listener2 = create_tcp_listener(nat_port).await?;
|
|
|
143
|
+ let mut listener3 = create_tcp_listener(ws_port).await?;
|
|
144
|
144
|
let test_addr = std::env::var("TEST_HBBS").unwrap_or_default();
|
|
145
|
145
|
if std::env::var("ALWAYS_USE_RELAY")
|
|
146
|
146
|
.unwrap_or_default()
|
|
|
@@ -186,19 +186,19 @@ impl RendezvousServer {
|
|
186
|
186
|
{
|
|
187
|
187
|
LoopFailure::UdpSocket => {
|
|
188
|
188
|
drop(socket);
|
|
189
|
|
- socket = FramedSocket::new_with_buf_size(&addr, rmem).await?;
|
|
|
189
|
+ socket = create_udp_listener(port, rmem).await?;
|
|
190
|
190
|
}
|
|
191
|
191
|
LoopFailure::Listener => {
|
|
192
|
192
|
drop(listener);
|
|
193
|
|
- listener = new_listener(&addr, false).await?;
|
|
|
193
|
+ listener = create_tcp_listener(port).await?;
|
|
194
|
194
|
}
|
|
195
|
195
|
LoopFailure::Listener2 => {
|
|
196
|
196
|
drop(listener2);
|
|
197
|
|
- listener2 = new_listener(&addr2, false).await?;
|
|
|
197
|
+ listener2 = create_tcp_listener(nat_port).await?;
|
|
198
|
198
|
}
|
|
199
|
199
|
LoopFailure::Listener3 => {
|
|
200
|
200
|
drop(listener3);
|
|
201
|
|
- listener3 = new_listener(&addr3, false).await?;
|
|
|
201
|
+ listener3 = create_tcp_listener(ws_port).await?;
|
|
202
|
202
|
}
|
|
203
|
203
|
}
|
|
204
|
204
|
}
|
|
|
@@ -1267,3 +1267,22 @@ async fn send_rk_res(
|
|
1267
|
1267
|
});
|
|
1268
|
1268
|
socket.send(&msg_out, addr).await
|
|
1269
|
1269
|
}
|
|
|
1270
|
+
|
|
|
1271
|
+async fn create_udp_listener(port: i32, rmem: usize) -> ResultType<FramedSocket> {
|
|
|
1272
|
+ let addr = SocketAddr::new(IpAddr::V6(Ipv6Addr::UNSPECIFIED), port as _);
|
|
|
1273
|
+ if let Ok(s) = FramedSocket::new_reuse(&addr, false, rmem).await {
|
|
|
1274
|
+ log::debug!("listen on udp {:?}", s.local_addr());
|
|
|
1275
|
+ return Ok(s);
|
|
|
1276
|
+ }
|
|
|
1277
|
+ let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::UNSPECIFIED), port as _);
|
|
|
1278
|
+ let s = FramedSocket::new_reuse(&addr, false, rmem).await?;
|
|
|
1279
|
+ log::debug!("listen on udp {:?}", s.local_addr());
|
|
|
1280
|
+ return Ok(s);
|
|
|
1281
|
+}
|
|
|
1282
|
+
|
|
|
1283
|
+#[inline]
|
|
|
1284
|
+async fn create_tcp_listener(port: i32) -> ResultType<TcpListener> {
|
|
|
1285
|
+ let s = listen_any(port as _).await?;
|
|
|
1286
|
+ log::debug!("listen on tcp {:?}", s.local_addr());
|
|
|
1287
|
+ Ok(s)
|
|
|
1288
|
+}
|