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