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
|
- [added] Added more tests
|
||||||
- [changed] Updated dependencies and libsodium
|
- [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)
|
### 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 {
|
for i in len..16 {
|
||||||
group_bytes[i] = 0;
|
group_bytes[i] = 0;
|
||||||
}
|
}
|
||||||
for i in 0..len+1 {
|
for i in (0..len+1).rev() {
|
||||||
group_bytes[len-i] = 0;
|
if i < len {
|
||||||
|
group_bytes[i] = 0;
|
||||||
|
}
|
||||||
if let Some(group) = self.0.get(&group_bytes) {
|
if let Some(group) = self.0.get(&group_bytes) {
|
||||||
// If the group is not empty, check every entry
|
// If the group is not empty, check every entry
|
||||||
for entry in group {
|
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
|
// If the full prefix matches and the match is longer than the longest prefix
|
||||||
// found so far, remember the peer
|
// 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 = 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]
|
#[test]
|
||||||
fn routing_table() {
|
fn routing_table_ipv4() {
|
||||||
let mut table = RoutingTable::new();
|
let mut table = RoutingTable::new();
|
||||||
let peer1 = "1.2.3.4:1".to_socket_addrs().unwrap().next().unwrap();
|
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();
|
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));
|
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]
|
#[test]
|
||||||
fn address_parse_fmt() {
|
fn address_parse_fmt() {
|
||||||
assert_eq!(format!("{}", Address::from_str("120.45.22.5").unwrap()), "120.45.22.5");
|
assert_eq!(format!("{}", Address::from_str("120.45.22.5").unwrap()), "120.45.22.5");
|
||||||
|
|
Loading…
Reference in New Issue