relay for local addr in case in different sub net

This commit is contained in:
open-trade
2020-09-21 15:13:14 +08:00
parent a5b4d8027f
commit f3425044a6
2 changed files with 26 additions and 26 deletions

View File

@@ -196,7 +196,7 @@ impl RendezvousServer {
break; break;
} }
Some(rendezvous_message::Union::local_addr(la)) => { Some(rendezvous_message::Union::local_addr(la)) => {
allow_err!(rs.handle_local_addr(&la, addr, None).await); allow_err!(rs.handle_local_addr(la, addr, None).await);
break; break;
} }
_ => { _ => {
@@ -231,13 +231,11 @@ impl RendezvousServer {
self.update_addr(rp.id, addr, socket).await?; self.update_addr(rp.id, addr, socket).await?;
if self.serial > rp.serial { if self.serial > rp.serial {
let mut msg_out = RendezvousMessage::new(); let mut msg_out = RendezvousMessage::new();
let mut mi = MiscInfo::new(); msg_out.set_configure_update(ConfigUpdate {
mi.set_configure_update(ConfigUpdate {
serial: self.serial, serial: self.serial,
rendezvous_servers: self.rendezvous_servers.clone(), rendezvous_servers: self.rendezvous_servers.clone(),
..Default::default() ..Default::default()
}); });
msg_out.set_misc_info(mi);
socket.send(&msg_out, addr).await?; socket.send(&msg_out, addr).await?;
} }
} }
@@ -286,28 +284,25 @@ impl RendezvousServer {
self.handle_hole_sent(phs, addr, Some(socket)).await?; self.handle_hole_sent(phs, addr, Some(socket)).await?;
} }
Some(rendezvous_message::Union::local_addr(la)) => { Some(rendezvous_message::Union::local_addr(la)) => {
self.handle_local_addr(&la, addr, Some(socket)).await?; self.handle_local_addr(la, addr, Some(socket)).await?;
} }
Some(rendezvous_message::Union::misc_info(mi)) => match mi.union { Some(rendezvous_message::Union::configure_update(mut cu)) => {
Some(misc_info::Union::configure_update(mut cu)) => { if addr.ip() == std::net::IpAddr::V4(std::net::Ipv4Addr::new(127, 0, 0, 1))
if addr.ip() == std::net::IpAddr::V4(std::net::Ipv4Addr::new(127, 0, 0, 1)) && cu.serial > self.serial
&& cu.serial > self.serial {
{ self.serial = cu.serial;
self.serial = cu.serial; self.rendezvous_servers = cu
self.rendezvous_servers = cu .rendezvous_servers
.rendezvous_servers .drain(..)
.drain(..) .filter(|x| test_if_valid_server(x).is_ok())
.filter(|x| test_if_valid_server(x).is_ok()) .collect();
.collect(); log::info!(
log::info!( "configure updated: serial={} rendezvous-servers={:?}",
"configure updated: serial={} rendezvous-servers={:?}", self.serial,
self.serial, self.rendezvous_servers
self.rendezvous_servers );
);
}
} }
_ => {} }
},
_ => {} _ => {}
} }
} }
@@ -408,7 +403,7 @@ impl RendezvousServer {
#[inline] #[inline]
async fn handle_local_addr<'a>( async fn handle_local_addr<'a>(
&mut self, &mut self,
la: &LocalAddr, la: LocalAddr,
addr: SocketAddr, addr: SocketAddr,
socket: Option<&'a mut FramedSocket>, socket: Option<&'a mut FramedSocket>,
) -> ResultType<()> { ) -> ResultType<()> {
@@ -421,8 +416,13 @@ impl RendezvousServer {
&addr &addr
); );
let mut msg_out = RendezvousMessage::new(); let mut msg_out = RendezvousMessage::new();
let mut relay_server = la.relay_server;
if relay_server.is_empty() {
relay_server = self.relay_server.clone();
}
msg_out.set_punch_hole_response(PunchHoleResponse { msg_out.set_punch_hole_response(PunchHoleResponse {
socket_addr: la.local_addr.clone(), socket_addr: la.local_addr.clone(),
relay_server,
..Default::default() ..Default::default()
}); });
if let Some(socket) = socket { if let Some(socket) = socket {