// VpnCloud - Peer-to-Peer VPN // Copyright (C) 2015-2019 Dennis Schwerdel // This software is licensed under GPL-3 or newer (see LICENSE.md) #[macro_use] mod helper; mod payload; mod peers; pub use std::net::SocketAddr; use std::sync::atomic::{AtomicUsize, Ordering}; pub use super::{ cloud::GenericCloud, config::Config, crypto::Crypto, device::MockDevice, ethernet::{self, SwitchTable}, ip::{self, RoutingTable}, net::MockSocket, types::{Protocol, Range, Table}, udpmessage::Message, util::MockTimeSource }; type TestNode = GenericCloud; type TapTestNode = TestNode>; #[allow(dead_code)] type TunTestNode = TestNode; thread_local! { static NEXT_PORT: AtomicUsize = AtomicUsize::new(1); } fn create_tap_node() -> TapTestNode { create_tap_node_with_config(Config::default()) } fn create_tap_node_with_config(mut config: Config) -> TapTestNode { config.port = NEXT_PORT.with(|p| p.fetch_add(1, Ordering::Relaxed)) as u16; TestNode::new(&config, MockDevice::new(), SwitchTable::new(1800, 10), true, true, vec![], Crypto::None, None) } #[allow(dead_code)] fn create_tun_node(addresses: Vec) -> TunTestNode { TestNode::new( &Config { port: NEXT_PORT.with(|p| p.fetch_add(1, Ordering::Relaxed)) as u16, ..Config::default() }, MockDevice::new(), RoutingTable::new(), false, false, addresses, Crypto::None, None ) } fn msg4_get(node: &mut TestNode) -> (SocketAddr, Vec) { let msg = node.socket4().pop_outbound(); assert!(msg.is_some()); msg.unwrap() } #[allow(dead_code)] fn msg6_get(node: &mut TestNode) -> (SocketAddr, Vec) { let msg = node.socket6().pop_outbound(); assert!(msg.is_some()); msg.unwrap() } fn msg4_put(node: &mut TestNode, from: SocketAddr, msg: Vec) { node.socket4().put_inbound(from, msg); node.trigger_socket_v4_event(); } fn msg6_put(node: &mut TestNode, from: SocketAddr, msg: Vec) { node.socket6().put_inbound(from, msg); node.trigger_socket_v6_event(); } fn simulate(nodes: &mut [(&mut TestNode, SocketAddr)]) { for (ref mut node, ref _from_addr) in nodes.iter_mut() { while node.device().has_inbound() { node.trigger_device_event(); } } let mut clean = false; while !clean { clean = true; let mut msgs = Vec::new(); for (ref mut node, ref from_addr) in nodes.iter_mut() { while let Some((to_addr, msg)) = node.socket4().pop_outbound() { msgs.push((msg, *from_addr, to_addr)); } } clean &= msgs.is_empty(); for (msg, from_addr, to_addr) in msgs { for (ref mut node, ref addr) in nodes.iter_mut() { if *addr == to_addr { msg4_put(node, from_addr, msg); break } } } let mut msgs = Vec::new(); for (ref mut node, ref from_addr) in nodes.iter_mut() { while let Some((to_addr, msg)) = node.socket6().pop_outbound() { msgs.push((msg, *from_addr, to_addr)); } } clean &= msgs.is_empty(); for (msg, from_addr, to_addr) in msgs { for (ref mut node, ref addr) in nodes.iter_mut() { if *addr == to_addr { msg6_put(node, from_addr, msg); break } } } } }