solana_streamer/
socket.rs

1use std::net::{IpAddr, SocketAddr};
2
3#[derive(Clone, Copy)]
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    #[must_use]
20    pub fn check(&self, addr: &SocketAddr) -> bool {
21        if matches!(self, SocketAddrSpace::Unspecified) {
22            return true;
23        }
24        // TODO: remove these once IpAddr::is_global is stable.
25        match addr.ip() {
26            IpAddr::V4(addr) => {
27                // TODO: Consider excluding:
28                //    addr.is_link_local() || addr.is_broadcast()
29                // || addr.is_documentation() || addr.is_unspecified()
30                !(addr.is_private() || addr.is_loopback())
31            }
32            IpAddr::V6(addr) => {
33                // TODO: Consider excluding:
34                // addr.is_unspecified(),
35                !addr.is_loopback()
36            }
37        }
38    }
39}