优化nat校验

This commit is contained in:
lubeilin
2023-09-18 21:51:08 +08:00
parent bf8397e6e3
commit 9495e39700
3 changed files with 26 additions and 37 deletions
+5 -2
View File
@@ -50,9 +50,12 @@ impl NatInfo {
public_port_range: u16,
local_ipv4_addr: SocketAddrV4,
ipv6_addr: SocketAddrV6,
nat_type: NatType,
mut nat_type: NatType,
) -> Self {
public_ips.retain(|ip| !ip.is_loopback() && !ip.is_private());
public_ips.retain(|ip| !ip.is_loopback() && !ip.is_private() && !ip.is_unspecified());
if public_ips.len() > 1 {
nat_type = NatType::Symmetric;
}
Self {
public_ips,
public_port,
+6 -24
View File
@@ -431,18 +431,9 @@ impl ChannelDataHandler {
}
std::net::IpAddr::V6(_) => {}
},
ControlPacket::AddrResponse(addr_packet) => {
if !addr_packet.ipv4().is_multicast()
&& !addr_packet.ipv4().is_broadcast()
&& !addr_packet.ipv4().is_unspecified()
&& !addr_packet.ipv4().is_loopback()
&& !addr_packet.ipv4().is_private()
&& addr_packet.port() != 0
{
self.nat_test
.update_addr(addr_packet.ipv4(), addr_packet.port())
}
}
ControlPacket::AddrResponse(addr_packet) => self
.nat_test
.update_addr(addr_packet.ipv4(), addr_packet.port()),
}
Ok(())
}
@@ -630,18 +621,9 @@ impl ChannelDataHandler {
)
.await?;
}
ControlPacket::AddrResponse(addr_packet) => {
if addr_packet.port() != 0
&& !addr_packet.ipv4().is_multicast()
&& !addr_packet.ipv4().is_broadcast()
&& !addr_packet.ipv4().is_unspecified()
&& !addr_packet.ipv4().is_loopback()
&& !addr_packet.ipv4().is_private()
{
self.nat_test
.update_addr(addr_packet.ipv4(), addr_packet.port())
}
}
ControlPacket::AddrResponse(addr_packet) => self
.nat_test
.update_addr(addr_packet.ipv4(), addr_packet.port()),
_ => {}
}
Ok(())
+15 -11
View File
@@ -99,10 +99,18 @@ impl NatTest {
self.info.lock().clone()
}
pub fn update_addr(&self, ip: Ipv4Addr, port: u16) {
let mut guard = self.info.lock();
guard.public_port = port;
if !guard.public_ips.contains(&ip) {
guard.public_ips.push(ip);
if !ip.is_multicast()
&& !ip.is_broadcast()
&& !ip.is_unspecified()
&& !ip.is_loopback()
&& !ip.is_private()
&& port != 0
{
let mut guard = self.info.lock();
guard.public_port = port;
if !guard.public_ips.contains(&ip) {
guard.public_ips.push(ip);
}
}
}
pub async fn re_test(
@@ -131,13 +139,9 @@ impl NatTest {
ipv6_addr: SocketAddrV6,
) -> NatInfo {
return match stun_test::stun_test_nat(stun_server.clone()).await {
Ok((nat_type, ips, port_range)) => {
let mut public_ips = Vec::new();
public_ips.push(Ipv4Addr::from(public_ip));
for ip in ips {
if ip != public_ip {
public_ips.push(ip);
}
Ok((nat_type, mut public_ips, port_range)) => {
if !public_ips.contains(&public_ip) {
public_ips.push(public_ip)
}
NatInfo::new(
public_ips,