netsim 0.3.0

Run tests in network-isolated threads. Intercept and meddle with their packets.
Documentation
use crate::priv_prelude::*;

pub enum Restrictions {
    Unrestricted,
    RestrictIpAddr {
        sent_to: HashMap<u16, HashSet<Ipv4Addr>>,
    },
    RestrictSocketAddr {
        sent_to: HashMap<u16, HashSet<SocketAddrV4>>,
    },
}

impl Restrictions {
    pub fn sending(&mut self, external_port: u16, destination_addr: SocketAddrV4) {
        match self {
            Restrictions::Unrestricted => (),
            Restrictions::RestrictIpAddr { sent_to } => {
                sent_to.entry(external_port).or_default().insert(*destination_addr.ip());
            },
            Restrictions::RestrictSocketAddr { sent_to } => {
                sent_to.entry(external_port).or_default().insert(destination_addr);
            },
        }
    }

    pub fn incoming_allowed(&self, external_port: u16, source_addr: SocketAddrV4) -> bool {
        match self {
            Restrictions::Unrestricted => true,
            Restrictions::RestrictIpAddr { sent_to } => {
                match sent_to.get(&external_port) {
                    None => false,
                    Some(ipv4_addrs) => ipv4_addrs.contains(source_addr.ip()),
                }
            },
            Restrictions::RestrictSocketAddr { sent_to } => {
                match sent_to.get(&external_port) {
                    None => false,
                    Some(socket_addrs) => socket_addrs.contains(&source_addr),
                }
            },
        }
    }
}