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}