|
|
@@ -89,7 +89,12 @@ enum LoopFailure {
|
|
89
|
89
|
|
|
90
|
90
|
impl RendezvousServer {
|
|
91
|
91
|
#[tokio::main(flavor = "multi_thread")]
|
|
92
|
|
- pub async fn start(port: i32, serial: i32, key: &str, rmem: usize) -> ResultType<()> {
|
|
|
92
|
+ pub async fn start(
|
|
|
93
|
+ port: i32,
|
|
|
94
|
+ serial: i32,
|
|
|
95
|
+ key: &str,
|
|
|
96
|
+ rmem: usize,
|
|
|
97
|
+ ) -> ResultType<()> {
|
|
93
|
98
|
let (key, sk) = Self::get_server_sk(key);
|
|
94
|
99
|
let addr = format!("0.0.0.0:{}", port);
|
|
95
|
100
|
let addr2 = format!("0.0.0.0:{}", port - 1);
|
|
|
@@ -138,7 +143,6 @@ impl RendezvousServer {
|
|
138
|
143
|
log::info!("local-ip: {:?}", rs.inner.local_ip);
|
|
139
|
144
|
std::env::set_var("PORT_FOR_API", port.to_string());
|
|
140
|
145
|
rs.parse_relay_servers(&get_arg("relay-servers"));
|
|
141
|
|
- let pm = rs.pm.clone();
|
|
142
|
146
|
let mut listener = new_listener(&addr, false).await?;
|
|
143
|
147
|
let mut listener2 = new_listener(&addr2, false).await?;
|
|
144
|
148
|
let mut listener3 = new_listener(&addr3, false).await?;
|
|
|
@@ -299,7 +303,7 @@ impl RendezvousServer {
|
|
299
|
303
|
) -> ResultType<()> {
|
|
300
|
304
|
if let Ok(msg_in) = RendezvousMessage::parse_from_bytes(&bytes) {
|
|
301
|
305
|
match msg_in.union {
|
|
302
|
|
- Some(rendezvous_message::Union::register_peer(rp)) => {
|
|
|
306
|
+ Some(rendezvous_message::Union::RegisterPeer(rp)) => {
|
|
303
|
307
|
// B registered
|
|
304
|
308
|
if rp.id.len() > 0 {
|
|
305
|
309
|
log::trace!("New peer registered: {:?} {:?}", &rp.id, &addr);
|
|
|
@@ -315,7 +319,7 @@ impl RendezvousServer {
|
|
315
|
319
|
}
|
|
316
|
320
|
}
|
|
317
|
321
|
}
|
|
318
|
|
- Some(rendezvous_message::Union::register_pk(rk)) => {
|
|
|
322
|
+ Some(rendezvous_message::Union::RegisterPk(rk)) => {
|
|
319
|
323
|
if rk.uuid.is_empty() || rk.pk.is_empty() {
|
|
320
|
324
|
return Ok(());
|
|
321
|
325
|
}
|
|
|
@@ -402,7 +406,7 @@ impl RendezvousServer {
|
|
402
|
406
|
});
|
|
403
|
407
|
socket.send(&msg_out, addr).await?
|
|
404
|
408
|
}
|
|
405
|
|
- Some(rendezvous_message::Union::punch_hole_request(ph)) => {
|
|
|
409
|
+ Some(rendezvous_message::Union::PunchHoleRequest(ph)) => {
|
|
406
|
410
|
if self.pm.is_in_memory(&ph.id).await {
|
|
407
|
411
|
self.handle_udp_punch_hole_request(addr, ph, key).await?;
|
|
408
|
412
|
} else {
|
|
|
@@ -414,13 +418,13 @@ impl RendezvousServer {
|
|
414
|
418
|
});
|
|
415
|
419
|
}
|
|
416
|
420
|
}
|
|
417
|
|
- Some(rendezvous_message::Union::punch_hole_sent(phs)) => {
|
|
|
421
|
+ Some(rendezvous_message::Union::PunchHoleSent(phs)) => {
|
|
418
|
422
|
self.handle_hole_sent(phs, addr, Some(socket)).await?;
|
|
419
|
423
|
}
|
|
420
|
|
- Some(rendezvous_message::Union::local_addr(la)) => {
|
|
|
424
|
+ Some(rendezvous_message::Union::LocalAddr(la)) => {
|
|
421
|
425
|
self.handle_local_addr(la, addr, Some(socket)).await?;
|
|
422
|
426
|
}
|
|
423
|
|
- Some(rendezvous_message::Union::configure_update(mut cu)) => {
|
|
|
427
|
+ Some(rendezvous_message::Union::ConfigureUpdate(mut cu)) => {
|
|
424
|
428
|
if addr.ip() == ADDR_127 && cu.serial > self.inner.serial {
|
|
425
|
429
|
let mut inner: Inner = (*self.inner).clone();
|
|
426
|
430
|
inner.serial = cu.serial;
|
|
|
@@ -441,7 +445,7 @@ impl RendezvousServer {
|
|
441
|
445
|
);
|
|
442
|
446
|
}
|
|
443
|
447
|
}
|
|
444
|
|
- Some(rendezvous_message::Union::software_update(su)) => {
|
|
|
448
|
+ Some(rendezvous_message::Union::SoftwareUpdate(su)) => {
|
|
445
|
449
|
if !self.inner.version.is_empty() && su.url != self.inner.version {
|
|
446
|
450
|
let mut msg_out = RendezvousMessage::new();
|
|
447
|
451
|
msg_out.set_software_update(SoftwareUpdate {
|
|
|
@@ -468,7 +472,7 @@ impl RendezvousServer {
|
|
468
|
472
|
) -> bool {
|
|
469
|
473
|
if let Ok(msg_in) = RendezvousMessage::parse_from_bytes(&bytes) {
|
|
470
|
474
|
match msg_in.union {
|
|
471
|
|
- Some(rendezvous_message::Union::punch_hole_request(ph)) => {
|
|
|
475
|
+ Some(rendezvous_message::Union::PunchHoleRequest(ph)) => {
|
|
472
|
476
|
// there maybe several attempt, so sink can be none
|
|
473
|
477
|
if let Some(sink) = sink.take() {
|
|
474
|
478
|
self.tcp_punch.lock().await.insert(addr, sink);
|
|
|
@@ -476,24 +480,24 @@ impl RendezvousServer {
|
|
476
|
480
|
allow_err!(self.handle_tcp_punch_hole_request(addr, ph, &key, ws).await);
|
|
477
|
481
|
return true;
|
|
478
|
482
|
}
|
|
479
|
|
- Some(rendezvous_message::Union::request_relay(mut rf)) => {
|
|
|
483
|
+ Some(rendezvous_message::Union::RequestRelay(mut rf)) => {
|
|
480
|
484
|
// there maybe several attempt, so sink can be none
|
|
481
|
485
|
if let Some(sink) = sink.take() {
|
|
482
|
486
|
self.tcp_punch.lock().await.insert(addr, sink);
|
|
483
|
487
|
}
|
|
484
|
488
|
if let Some(peer) = self.pm.get_in_memory(&rf.id).await {
|
|
485
|
489
|
let mut msg_out = RendezvousMessage::new();
|
|
486
|
|
- rf.socket_addr = AddrMangle::encode(addr);
|
|
|
490
|
+ rf.socket_addr = AddrMangle::encode(addr).into();
|
|
487
|
491
|
msg_out.set_request_relay(rf);
|
|
488
|
492
|
let peer_addr = peer.read().await.socket_addr;
|
|
489
|
493
|
self.tx.send(Data::Msg(msg_out, peer_addr)).ok();
|
|
490
|
494
|
}
|
|
491
|
495
|
return true;
|
|
492
|
496
|
}
|
|
493
|
|
- Some(rendezvous_message::Union::relay_response(mut rr)) => {
|
|
|
497
|
+ Some(rendezvous_message::Union::RelayResponse(mut rr)) => {
|
|
494
|
498
|
let addr_b = AddrMangle::decode(&rr.socket_addr);
|
|
495
|
499
|
rr.socket_addr = Default::default();
|
|
496
|
|
- let id = rr.get_id();
|
|
|
500
|
+ let id = rr.id();
|
|
497
|
501
|
if !id.is_empty() {
|
|
498
|
502
|
let pk = self.get_pk(&rr.version, id.to_owned()).await;
|
|
499
|
503
|
rr.set_pk(pk);
|
|
|
@@ -510,13 +514,13 @@ impl RendezvousServer {
|
|
510
|
514
|
msg_out.set_relay_response(rr);
|
|
511
|
515
|
allow_err!(self.send_to_tcp_sync(msg_out, addr_b).await);
|
|
512
|
516
|
}
|
|
513
|
|
- Some(rendezvous_message::Union::punch_hole_sent(phs)) => {
|
|
|
517
|
+ Some(rendezvous_message::Union::PunchHoleSent(phs)) => {
|
|
514
|
518
|
allow_err!(self.handle_hole_sent(phs, addr, None).await);
|
|
515
|
519
|
}
|
|
516
|
|
- Some(rendezvous_message::Union::local_addr(la)) => {
|
|
|
520
|
+ Some(rendezvous_message::Union::LocalAddr(la)) => {
|
|
517
|
521
|
allow_err!(self.handle_local_addr(la, addr, None).await);
|
|
518
|
522
|
}
|
|
519
|
|
- Some(rendezvous_message::Union::test_nat_request(tar)) => {
|
|
|
523
|
+ Some(rendezvous_message::Union::TestNatRequest(tar)) => {
|
|
520
|
524
|
let mut msg_out = RendezvousMessage::new();
|
|
521
|
525
|
let mut res = TestNatResponse {
|
|
522
|
526
|
port: addr.port() as _,
|
|
|
@@ -531,7 +535,7 @@ impl RendezvousServer {
|
|
531
|
535
|
msg_out.set_test_nat_response(res);
|
|
532
|
536
|
Self::send_to_sink(sink, msg_out).await;
|
|
533
|
537
|
}
|
|
534
|
|
- Some(rendezvous_message::Union::register_pk(_rk)) => {
|
|
|
538
|
+ Some(rendezvous_message::Union::RegisterPk(_)) => {
|
|
535
|
539
|
let res = register_pk_response::Result::NOT_SUPPORT;
|
|
536
|
540
|
let mut msg_out = RendezvousMessage::new();
|
|
537
|
541
|
msg_out.set_register_pk_response(RegisterPkResponse {
|
|
|
@@ -607,7 +611,7 @@ impl RendezvousServer {
|
|
607
|
611
|
);
|
|
608
|
612
|
let mut msg_out = RendezvousMessage::new();
|
|
609
|
613
|
let mut p = PunchHoleResponse {
|
|
610
|
|
- socket_addr: AddrMangle::encode(addr),
|
|
|
614
|
+ socket_addr: AddrMangle::encode(addr).into(),
|
|
611
|
615
|
pk: self.get_pk(&phs.version, phs.id).await,
|
|
612
|
616
|
relay_server: phs.relay_server.clone(),
|
|
613
|
617
|
..Default::default()
|
|
|
@@ -714,7 +718,7 @@ impl RendezvousServer {
|
|
714
|
718
|
_ => false,
|
|
715
|
719
|
},
|
|
716
|
720
|
};
|
|
717
|
|
- let socket_addr = AddrMangle::encode(addr);
|
|
|
721
|
+ let socket_addr = AddrMangle::encode(addr).into();
|
|
718
|
722
|
if same_intranet {
|
|
719
|
723
|
log::debug!(
|
|
720
|
724
|
"Fetch local addr {:?} {:?} request from {:?}",
|
|
|
@@ -858,7 +862,7 @@ impl RendezvousServer {
|
|
858
|
862
|
self.relay_servers = self.relay_servers0.clone();
|
|
859
|
863
|
}
|
|
860
|
864
|
|
|
861
|
|
- fn get_relay_server(&self, pa: IpAddr, pb: IpAddr) -> String {
|
|
|
865
|
+ fn get_relay_server(&self, _pa: IpAddr, _pb: IpAddr) -> String {
|
|
862
|
866
|
if self.relay_servers.is_empty() {
|
|
863
|
867
|
return "".to_owned();
|
|
864
|
868
|
} else if self.relay_servers.len() == 1 {
|
|
|
@@ -1029,7 +1033,7 @@ impl RendezvousServer {
|
|
1029
|
1033
|
let mut stream = stream;
|
|
1030
|
1034
|
if let Some(Ok(bytes)) = stream.next_timeout(30_000).await {
|
|
1031
|
1035
|
if let Ok(msg_in) = RendezvousMessage::parse_from_bytes(&bytes) {
|
|
1032
|
|
- if let Some(rendezvous_message::Union::test_nat_request(_)) = msg_in.union {
|
|
|
1036
|
+ if let Some(rendezvous_message::Union::TestNatRequest(_)) = msg_in.union {
|
|
1033
|
1037
|
let mut msg_out = RendezvousMessage::new();
|
|
1034
|
1038
|
msg_out.set_test_nat_response(TestNatResponse {
|
|
1035
|
1039
|
port: addr.port() as _,
|
|
|
@@ -1042,12 +1046,21 @@ impl RendezvousServer {
|
|
1042
|
1046
|
});
|
|
1043
|
1047
|
}
|
|
1044
|
1048
|
|
|
1045
|
|
- async fn handle_listener(&self, stream: TcpStream, addr: SocketAddr, key: &str, ws: bool) {
|
|
|
1049
|
+ async fn handle_listener(
|
|
|
1050
|
+ &self,
|
|
|
1051
|
+ stream: TcpStream,
|
|
|
1052
|
+ addr: SocketAddr,
|
|
|
1053
|
+ key: &str,
|
|
|
1054
|
+ ws: bool,
|
|
|
1055
|
+ ) {
|
|
1046
|
1056
|
log::debug!("Tcp connection from {:?}, ws: {}", addr, ws);
|
|
1047
|
1057
|
let mut rs = self.clone();
|
|
1048
|
1058
|
let key = key.to_owned();
|
|
1049
|
1059
|
tokio::spawn(async move {
|
|
1050
|
|
- allow_err!(rs.handle_listener_inner(stream, addr, &key, ws).await);
|
|
|
1060
|
+ allow_err!(
|
|
|
1061
|
+ rs.handle_listener_inner(stream, addr, &key, ws)
|
|
|
1062
|
+ .await
|
|
|
1063
|
+ );
|
|
1051
|
1064
|
});
|
|
1052
|
1065
|
}
|
|
1053
|
1066
|
|
|
|
@@ -1067,7 +1080,10 @@ impl RendezvousServer {
|
|
1067
|
1080
|
while let Ok(Some(Ok(msg))) = timeout(30_000, b.next()).await {
|
|
1068
|
1081
|
match msg {
|
|
1069
|
1082
|
tungstenite::Message::Binary(bytes) => {
|
|
1070
|
|
- if !self.handle_tcp(&bytes, &mut sink, addr, key, ws).await {
|
|
|
1083
|
+ if !self
|
|
|
1084
|
+ .handle_tcp(&bytes, &mut sink, addr, key, ws)
|
|
|
1085
|
+ .await
|
|
|
1086
|
+ {
|
|
1071
|
1087
|
break;
|
|
1072
|
1088
|
}
|
|
1073
|
1089
|
}
|
|
|
@@ -1078,7 +1094,10 @@ impl RendezvousServer {
|
|
1078
|
1094
|
let (a, mut b) = Framed::new(stream, BytesCodec::new()).split();
|
|
1079
|
1095
|
sink = Some(Sink::TcpStream(a));
|
|
1080
|
1096
|
while let Ok(Some(Ok(bytes))) = timeout(30_000, b.next()).await {
|
|
1081
|
|
- if !self.handle_tcp(&bytes, &mut sink, addr, key, ws).await {
|
|
|
1097
|
+ if !self
|
|
|
1098
|
+ .handle_tcp(&bytes, &mut sink, addr, key, ws)
|
|
|
1099
|
+ .await
|
|
|
1100
|
+ {
|
|
1082
|
1101
|
break;
|
|
1083
|
1102
|
}
|
|
1084
|
1103
|
}
|
|
|
@@ -1091,13 +1110,13 @@ impl RendezvousServer {
|
|
1091
|
1110
|
}
|
|
1092
|
1111
|
|
|
1093
|
1112
|
#[inline]
|
|
1094
|
|
- async fn get_pk(&mut self, version: &str, id: String) -> Vec<u8> {
|
|
|
1113
|
+ async fn get_pk(&mut self, version: &str, id: String) -> Bytes {
|
|
1095
|
1114
|
if version.is_empty() || self.inner.sk.is_none() {
|
|
1096
|
|
- Vec::new()
|
|
|
1115
|
+ Bytes::new()
|
|
1097
|
1116
|
} else {
|
|
1098
|
1117
|
match self.pm.get(&id).await {
|
|
1099
|
1118
|
Some(peer) => {
|
|
1100
|
|
- let pk = peer.read().await.pk.clone();
|
|
|
1119
|
+ let pk = peer.read().await.pk.clone().into();
|
|
1101
|
1120
|
sign::sign(
|
|
1102
|
1121
|
&hbb_common::message_proto::IdPk {
|
|
1103
|
1122
|
id,
|
|
|
@@ -1108,8 +1127,9 @@ impl RendezvousServer {
|
|
1108
|
1127
|
.unwrap_or_default(),
|
|
1109
|
1128
|
&self.inner.sk.as_ref().unwrap(),
|
|
1110
|
1129
|
)
|
|
|
1130
|
+ .into()
|
|
1111
|
1131
|
}
|
|
1112
|
|
- _ => Vec::new(),
|
|
|
1132
|
+ _ => Bytes::new(),
|
|
1113
|
1133
|
}
|
|
1114
|
1134
|
}
|
|
1115
|
1135
|
}
|
|
|
@@ -1213,13 +1233,6 @@ async fn test_hbbs(addr: SocketAddr) -> ResultType<()> {
|
|
1213
|
1233
|
}
|
|
1214
|
1234
|
}
|
|
1215
|
1235
|
|
|
1216
|
|
-#[inline]
|
|
1217
|
|
-fn distance(a: &(i32, i32), b: &(i32, i32)) -> i32 {
|
|
1218
|
|
- let dx = a.0 - b.0;
|
|
1219
|
|
- let dy = a.1 - b.1;
|
|
1220
|
|
- dx * dx + dy * dy
|
|
1221
|
|
-}
|
|
1222
|
|
-
|
|
1223
|
1236
|
#[inline]
|
|
1224
|
1237
|
async fn send_rk_res(
|
|
1225
|
1238
|
socket: &mut FramedSocket,
|