1use crate::extend::addr::is_ipv6_global;
34use serde::{Deserialize, Serialize};
35use std::net::{Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6};
36
37#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize, Default)]
54pub enum NatType {
55 #[default]
56 Cone,
57 Symmetric,
58}
59
60impl NatType {
61 #[inline]
63 pub fn is_cone(&self) -> bool {
64 self == &NatType::Cone
65 }
66
67 #[inline]
69 pub fn is_symmetric(&self) -> bool {
70 self == &NatType::Symmetric
71 }
72}
73
74#[derive(Clone, Debug, Serialize, Deserialize)]
87pub struct NatInfo {
88 pub nat_type: NatType,
90 pub public_ips: Vec<Ipv4Addr>,
92 pub public_udp_ports: Vec<u16>,
94 pub mapping_tcp_addr: Vec<SocketAddr>,
96 pub mapping_udp_addr: Vec<SocketAddr>,
98 pub public_port_range: u16,
100 pub local_ipv4: Ipv4Addr,
102 #[serde(default)]
103 pub local_ipv4s: Vec<Ipv4Addr>,
104 pub ipv6: Option<Ipv6Addr>,
106 pub local_udp_ports: Vec<u16>,
108 pub local_tcp_port: u16,
110 pub public_tcp_port: u16,
112}
113impl NatInfo {
114 pub(crate) fn flag(&self) -> Option<SocketAddr> {
115 let vec = self.public_ipv4_addr();
116 if let Some(v) = vec.first() {
117 return Some(*v);
118 }
119 let vec = self.public_ipv4_tcp();
120 if let Some(v) = vec.first() {
121 return Some(*v);
122 }
123 let vec = self.local_ipv4_addrs();
124 if let Some(v) = vec.first() {
125 return Some(*v);
126 }
127 let option = self.local_ipv4_tcp();
128 if option.is_some() {
129 return option;
130 }
131 None
132 }
133 pub fn ipv6_udp_addr(&self) -> Vec<SocketAddr> {
134 if let Some(ipv6) = self.ipv6 {
135 if is_ipv6_global(&ipv6) {
136 return self
137 .local_udp_ports
138 .iter()
139 .map(|&port| SocketAddrV6::new(ipv6, port, 0, 0).into())
140 .collect();
141 }
142 }
143 vec![]
144 }
145 pub fn ipv6_tcp_addr(&self) -> Option<SocketAddr> {
146 self.ipv6
147 .map(|ipv6| SocketAddrV6::new(ipv6, self.local_tcp_port, 0, 0).into())
148 }
149 pub fn public_ipv4_addr(&self) -> Vec<SocketAddr> {
150 if self.public_ips.is_empty() || self.public_udp_ports.is_empty() {
151 return vec![];
152 }
153 if self.public_ips.len() == 1 {
154 let ip = self.public_ips[0];
155 return self
156 .public_udp_ports
157 .iter()
158 .map(|&port| SocketAddrV4::new(ip, port).into())
159 .collect();
160 }
161 let port = self.public_udp_ports[0];
162 self.public_ips
163 .iter()
164 .map(|&ip| SocketAddrV4::new(ip, port).into())
165 .collect()
166 }
167 pub fn local_ipv4_addrs(&self) -> Vec<SocketAddr> {
168 if self.local_udp_ports.is_empty() {
169 return vec![];
170 }
171 if !self.local_ipv4s.is_empty() {
172 let mut rs = Vec::with_capacity(self.local_ipv4s.len() * self.local_udp_ports.len());
173 for ip in self.local_ipv4s.iter() {
174 if ip.is_unspecified() || ip.is_multicast() || ip.is_broadcast() {
175 continue;
176 }
177 for port in self.local_udp_ports.iter() {
178 rs.push(SocketAddrV4::new(*ip, *port).into());
179 }
180 }
181 return rs;
182 }
183 if self.local_ipv4.is_unspecified()
184 || self.local_ipv4.is_multicast()
185 || self.local_ipv4.is_broadcast()
186 {
187 return vec![];
188 }
189 self.local_udp_ports
190 .iter()
191 .map(|&port| SocketAddrV4::new(self.local_ipv4, port).into())
192 .collect()
193 }
194 pub fn local_ipv4_tcp(&self) -> Option<SocketAddr> {
195 if self.local_ipv4.is_unspecified()
196 || self.local_ipv4.is_multicast()
197 || self.local_ipv4.is_broadcast()
198 || self.local_tcp_port == 0
199 {
200 return None;
201 }
202 Some(SocketAddrV4::new(self.local_ipv4, self.local_tcp_port).into())
203 }
204 pub fn public_ipv4_tcp(&self) -> Vec<SocketAddr> {
205 if self.public_tcp_port == 0 {
206 return vec![];
207 }
208 self.public_ips
209 .iter()
210 .map(|&ip| SocketAddrV4::new(ip, self.public_tcp_port).into())
211 .collect()
212 }
213}