diff --git a/src/benches.rs b/src/benches.rs index 724246b..988cc39 100644 --- a/src/benches.rs +++ b/src/benches.rs @@ -77,7 +77,7 @@ fn message_decode(b: &mut Bencher) { #[bench] fn switch_learn(b: &mut Bencher) { - let mut table = SwitchTable::new(10); + let mut table = SwitchTable::new(10, 0); let addr = Address::from_str("12:34:56:78:90:ab").unwrap(); let peer = "1.2.3.4:5678".to_socket_addrs().unwrap().next().unwrap(); b.iter(|| { @@ -88,7 +88,7 @@ fn switch_learn(b: &mut Bencher) { #[bench] fn switch_lookup(b: &mut Bencher) { - let mut table = SwitchTable::new(10); + let mut table = SwitchTable::new(10, 0); let addr = Address::from_str("12:34:56:78:90:ab").unwrap(); let peer = "1.2.3.4:5678".to_socket_addrs().unwrap().next().unwrap(); table.learn(addr.clone(), None, peer); @@ -152,7 +152,7 @@ fn epoll_wait(b: &mut Bencher) { fn handle_interface_data(b: &mut Bencher) { let mut node = GenericCloud::::new( MAGIC, Device::dummy("vpncloud0", "/dev/null", Type::Tap).unwrap(), 0, - Box::new(SwitchTable::new(300)), 1800, true, true, vec![], Crypto::None, None + Box::new(SwitchTable::new(300, 10)), 1800, true, true, vec![], Crypto::None, None ); let mut data = [0; 1500]; data[105] = 45; @@ -166,7 +166,7 @@ fn handle_interface_data(b: &mut Bencher) { fn handle_net_message(b: &mut Bencher) { let mut node = GenericCloud::::new( MAGIC, Device::dummy("vpncloud0", "/dev/null", Type::Tap).unwrap(), 0, - Box::new(SwitchTable::new(300)), 1800, true, true, vec![], Crypto::None, None + Box::new(SwitchTable::new(300, 10)), 1800, true, true, vec![], Crypto::None, None ); let addr = SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 1)); let mut data = [0; 1500]; diff --git a/src/ethernet.rs b/src/ethernet.rs index de8b8e8..6155442 100644 --- a/src/ethernet.rs +++ b/src/ethernet.rs @@ -71,13 +71,15 @@ pub struct SwitchTable { /// The table storing the actual mapping table: HashMap
, /// Timeout period for forgetting learnt addresses - timeout: Duration + timeout: Duration, + // Timeout period for not overwriting learnt addresses + protection_period: Duration, } impl SwitchTable { /// Creates a new switch table - pub fn new(timeout: Duration) -> Self { - SwitchTable{table: HashMap::default(), timeout: timeout} + pub fn new(timeout: Duration, protection_period: Duration) -> Self { + SwitchTable{table: HashMap::default(), timeout: timeout, protection_period: protection_period} } } @@ -108,7 +110,7 @@ impl Table for SwitchTable { }, Entry::Occupied(mut entry) => { let mut entry = entry.get_mut(); - if entry.timeout + 10 >= deadline { + if entry.timeout + self.protection_period as Time > deadline { // Do not override recently learnt entries return } diff --git a/src/main.rs b/src/main.rs index ee7248c..ec347d9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -150,12 +150,12 @@ fn run