mirror of https://github.com/dswd/vpncloud.git
Fixed two problems in routing table (re #18)
This commit is contained in:
parent
2d11454316
commit
87097cc59f
|
@ -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)
|
||||
|
||||
|
|
10
src/ip.rs
10
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
38
src/tests.rs
38
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");
|
||||
|
|
Loading…
Reference in New Issue