nat4-nat4 punch (#388)

this patch optimize the udp hole punch logic:

1. allow start punch hole before stun test complete.
2. add lock to symmetric punch, avoid conflict between concurrent hole punching task.
3. support punching hole for predictable nat4-nat4.
4. make backoff of retry reasonable
This commit is contained in:
Sijie.Sun
2024-10-06 22:49:18 +08:00
committed by GitHub
parent ba3da97ad4
commit 37ceb77bf6
24 changed files with 2748 additions and 1310 deletions
+24 -12
View File
@@ -179,14 +179,16 @@ impl CommandHandler {
async fn list_peers(&self) -> Result<ListPeerResponse, Error> {
let client = self.get_peer_manager_client().await?;
let request = ListPeerRequest::default();
let response = client.list_peer(BaseController {}, request).await?;
let response = client.list_peer(BaseController::default(), request).await?;
Ok(response)
}
async fn list_routes(&self) -> Result<ListRouteResponse, Error> {
let client = self.get_peer_manager_client().await?;
let request = ListRouteRequest::default();
let response = client.list_route(BaseController {}, request).await?;
let response = client
.list_route(BaseController::default(), request)
.await?;
Ok(response)
}
@@ -275,7 +277,7 @@ impl CommandHandler {
let client = self.get_peer_manager_client().await?;
let node_info = client
.show_node_info(BaseController {}, ShowNodeInfoRequest::default())
.show_node_info(BaseController::default(), ShowNodeInfoRequest::default())
.await?
.node_info
.ok_or(anyhow::anyhow!("node info not found"))?;
@@ -296,7 +298,9 @@ impl CommandHandler {
async fn handle_route_dump(&self) -> Result<(), Error> {
let client = self.get_peer_manager_client().await?;
let request = DumpRouteRequest::default();
let response = client.dump_route(BaseController {}, request).await?;
let response = client
.dump_route(BaseController::default(), request)
.await?;
println!("response: {}", response.result);
Ok(())
}
@@ -305,7 +309,7 @@ impl CommandHandler {
let client = self.get_peer_manager_client().await?;
let request = ListForeignNetworkRequest::default();
let response = client
.list_foreign_network(BaseController {}, request)
.list_foreign_network(BaseController::default(), request)
.await?;
let network_map = response;
if self.verbose {
@@ -347,7 +351,7 @@ impl CommandHandler {
let client = self.get_peer_manager_client().await?;
let request = ListGlobalForeignNetworkRequest::default();
let response = client
.list_global_foreign_network(BaseController {}, request)
.list_global_foreign_network(BaseController::default(), request)
.await?;
if self.verbose {
println!("{:#?}", response);
@@ -383,7 +387,7 @@ impl CommandHandler {
let mut items: Vec<RouteTableItem> = vec![];
let client = self.get_peer_manager_client().await?;
let node_info = client
.show_node_info(BaseController {}, ShowNodeInfoRequest::default())
.show_node_info(BaseController::default(), ShowNodeInfoRequest::default())
.await?
.node_info
.ok_or(anyhow::anyhow!("node info not found"))?;
@@ -451,7 +455,9 @@ impl CommandHandler {
async fn handle_connector_list(&self) -> Result<(), Error> {
let client = self.get_connector_manager_client().await?;
let request = ListConnectorRequest::default();
let response = client.list_connector(BaseController {}, request).await?;
let response = client
.list_connector(BaseController::default(), request)
.await?;
println!("response: {:#?}", response);
Ok(())
}
@@ -515,7 +521,7 @@ async fn main() -> Result<(), Error> {
Some(RouteSubCommand::Dump) => handler.handle_route_dump().await?,
},
SubCommand::Stun => {
timeout(Duration::from_secs(5), async move {
timeout(Duration::from_secs(25), async move {
let collector = StunInfoCollector::new_with_default_servers();
loop {
let ret = collector.get_stun_info();
@@ -532,7 +538,10 @@ async fn main() -> Result<(), Error> {
SubCommand::PeerCenter => {
let peer_center_client = handler.get_peer_center_client().await?;
let resp = peer_center_client
.get_global_peer_map(BaseController {}, GetGlobalPeerMapRequest::default())
.get_global_peer_map(
BaseController::default(),
GetGlobalPeerMapRequest::default(),
)
.await?;
#[derive(tabled::Tabled)]
@@ -565,7 +574,10 @@ async fn main() -> Result<(), Error> {
SubCommand::VpnPortal => {
let vpn_portal_client = handler.get_vpn_portal_client().await?;
let resp = vpn_portal_client
.get_vpn_portal_info(BaseController {}, GetVpnPortalInfoRequest::default())
.get_vpn_portal_info(
BaseController::default(),
GetVpnPortalInfoRequest::default(),
)
.await?
.vpn_portal_info
.unwrap_or_default();
@@ -583,7 +595,7 @@ async fn main() -> Result<(), Error> {
SubCommand::Node(sub_cmd) => {
let client = handler.get_peer_manager_client().await?;
let node_info = client
.show_node_info(BaseController {}, ShowNodeInfoRequest::default())
.show_node_info(BaseController::default(), ShowNodeInfoRequest::default())
.await?
.node_info
.ok_or(anyhow::anyhow!("node info not found"))?;