diff --git a/CHANGELOG.md b/CHANGELOG.md index d655978..483e490 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ This project follows [semantic versioning](http://semver.org). - [added] Added more tests - [changed] Updated dependencies and libsodium +- [changed] Small fixes to make clippy happy +- [fixed] Fixed two problems with routing table ### v0.8.0 (2016-11-25) diff --git a/src/ip.rs b/src/ip.rs index 0cd53e0..a9fd3f6 100644 --- a/src/ip.rs +++ b/src/ip.rs @@ -110,8 +110,10 @@ impl Table for RoutingTable { for i in len..16 { group_bytes[i] = 0; } - for i in 0..len+1 { - group_bytes[len-i] = 0; + for i in (0..len+1).rev() { + if i < len { + group_bytes[i] = 0; + } if let Some(group) = self.0.get(&group_bytes) { // If the group is not empty, check every entry for entry in group { @@ -128,9 +130,9 @@ impl Table for RoutingTable { } // If the full prefix matches and the match is longer than the longest prefix // found so far, remember the peer - if match_len as u8 >= entry.prefix_len && match_len as isize > found_len { + if match_len as u8 >= entry.prefix_len && entry.prefix_len as isize > found_len { found = Some(entry.address); - found_len = match_len as isize; + found_len = entry.prefix_len as isize; } } } diff --git a/src/tests.rs b/src/tests.rs index 0b191eb..4331abe 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -255,7 +255,7 @@ fn switch() { } #[test] -fn routing_table() { +fn routing_table_ipv4() { let mut table = RoutingTable::new(); let peer1 = "1.2.3.4:1".to_socket_addrs().unwrap().next().unwrap(); let peer2 = "1.2.3.4:2".to_socket_addrs().unwrap().next().unwrap(); @@ -288,6 +288,42 @@ fn routing_table() { assert_eq!(table.lookup(&Address::from_str("192.168.2.1").unwrap()), Some(peer3)); } +#[test] +fn routing_table_ipv6() { + let mut table = RoutingTable::new(); + let peer1 = "::1:1".to_socket_addrs().unwrap().next().unwrap(); + let peer2 = "::1:2".to_socket_addrs().unwrap().next().unwrap(); + let peer3 = "::1:3".to_socket_addrs().unwrap().next().unwrap(); + assert!(table.lookup(&Address::from_str("::1").unwrap()).is_none()); + table.learn(Address::from_str("dead:beef:dead:beef:dead:beef:dead:1").unwrap(), Some(128), peer1.clone()); + assert_eq!(table.lookup(&Address::from_str("dead:beef:dead:beef:dead:beef:dead:1").unwrap()), Some(peer1)); + table.learn(Address::from_str("dead:beef:dead:beef:dead:beef:dead:2").unwrap(), None, peer2.clone()); + assert_eq!(table.lookup(&Address::from_str("dead:beef:dead:beef:dead:beef:dead:1").unwrap()), Some(peer1)); + assert_eq!(table.lookup(&Address::from_str("dead:beef:dead:beef:dead:beef:dead:2").unwrap()), Some(peer2)); + table.learn(Address::from_str("dead:beef:dead:beef::").unwrap(), Some(64), peer3.clone()); + assert_eq!(table.lookup(&Address::from_str("dead:beef:dead:beef:dead:beef:dead:1").unwrap()), Some(peer1)); + assert_eq!(table.lookup(&Address::from_str("dead:beef:dead:beef:dead:beef:dead:2").unwrap()), Some(peer2)); + assert_eq!(table.lookup(&Address::from_str("dead:beef:dead:beef:dead:beef:dead:3").unwrap()), Some(peer3)); + table.learn(Address::from_str("dead:beef:dead:be00::").unwrap(), Some(56), peer1.clone()); + assert_eq!(table.lookup(&Address::from_str("dead:beef:dead:beef:dead:beef:1::").unwrap()), Some(peer3)); + assert_eq!(table.lookup(&Address::from_str("dead:beef:dead:be01::").unwrap()), Some(peer1)); + assert_eq!(table.lookup(&Address::from_str("dead:beef:dead:beef:dead:beef:dead:1").unwrap()), Some(peer1)); + assert_eq!(table.lookup(&Address::from_str("dead:beef:dead:beef:dead:beef:dead:2").unwrap()), Some(peer2)); + assert_eq!(table.lookup(&Address::from_str("dead:beef:dead:beef:dead:beef:dead:3").unwrap()), Some(peer3)); + table.learn(Address::from_str("::").unwrap(), Some(0), peer2.clone()); + assert_eq!(table.lookup(&Address::from_str("dead:beef:dead:beef:dead:beef:1::").unwrap()), Some(peer3)); + assert_eq!(table.lookup(&Address::from_str("dead:beef:dead:be01::").unwrap()), Some(peer1)); + assert_eq!(table.lookup(&Address::from_str("dead:beef:dead:beef:dead:beef:dead:1").unwrap()), Some(peer1)); + assert_eq!(table.lookup(&Address::from_str("dead:beef:dead:beef:dead:beef:dead:2").unwrap()), Some(peer2)); + assert_eq!(table.lookup(&Address::from_str("dead:beef:dead:beef:dead:beef:dead:3").unwrap()), Some(peer3)); + assert_eq!(table.lookup(&Address::from_str("::1").unwrap()), Some(peer2)); + table.learn(Address::from_str("dead:beef:dead:beef:dead:beef:dead::be00").unwrap(), Some(123), peer2.clone()); + assert_eq!(table.lookup(&Address::from_str("dead:beef:dead:beef:dead:beef:dead:be1f").unwrap()), Some(peer2)); + assert_eq!(table.lookup(&Address::from_str("dead:beef:dead:beef:dead:beef:dead:be20").unwrap()), Some(peer3)); + table.learn(Address::from_str("dead:beef:dead:beef:dead:beef:dead::be00").unwrap(), Some(124), peer3.clone()); + assert_eq!(table.lookup(&Address::from_str("dead:beef:dead:beef:dead:beef:dead:be01").unwrap()), Some(peer3)); +} + #[test] fn address_parse_fmt() { assert_eq!(format!("{}", Address::from_str("120.45.22.5").unwrap()), "120.45.22.5");