solana_streamer/socket.rs
1use std::net::{IpAddr, SocketAddr};
2
3#[derive(Clone, Copy, PartialEq, Eq)]
4pub enum SocketAddrSpace {
5 Unspecified,
6 Global,
7}
8
9impl SocketAddrSpace {
10 pub fn new(allow_private_addr: bool) -> Self {
11 if allow_private_addr {
12 SocketAddrSpace::Unspecified
13 } else {
14 SocketAddrSpace::Global
15 }
16 }
17
18 /// Returns true if the IP address is valid.
19 pub fn check(&self, addr: &SocketAddr) -> bool {
20 if self == &SocketAddrSpace::Unspecified {
21 return true;
22 }
23 // TODO: remove these once IpAddr::is_global is stable.
24 match addr.ip() {
25 IpAddr::V4(addr) => {
26 // TODO: Consider excluding:
27 // addr.is_loopback() || addr.is_link_local()
28 // || addr.is_broadcast() || addr.is_documentation()
29 // || addr.is_unspecified()
30 !addr.is_private()
31 }
32 IpAddr::V6(_) => {
33 // TODO: Consider excluding:
34 // addr.is_loopback() || addr.is_unspecified(),
35 true
36 }
37 }
38 }
39}