mirror of https://github.com/dswd/vpncloud.git
Fixed tun mode
This commit is contained in:
parent
d9dedcdd0d
commit
64342d1288
18
src/cloud.rs
18
src/cloud.rs
|
@ -123,6 +123,7 @@ pub struct GenericCloud<A: Address, T: Table<Address=A>, M: Protocol<Address=A>,
|
|||
peers: PeerList,
|
||||
addresses: Vec<A>,
|
||||
learning: bool,
|
||||
broadcast: bool,
|
||||
reconnect_peers: Vec<SocketAddr>,
|
||||
table: T,
|
||||
socket: UdpSocket,
|
||||
|
@ -137,7 +138,7 @@ pub struct GenericCloud<A: Address, T: Table<Address=A>, M: Protocol<Address=A>,
|
|||
|
||||
impl<A: Address, T: Table<Address=A>, M: Protocol<Address=A>, I: VirtualInterface> GenericCloud<A, T, M, I> {
|
||||
pub fn new(device: I, listen: String, network_id: Option<NetworkId>, table: T,
|
||||
peer_timeout: Duration, learning: bool, addresses: Vec<A>) -> Self {
|
||||
peer_timeout: Duration, learning: bool, broadcast: bool, addresses: Vec<A>) -> Self {
|
||||
let socket = match UdpSocket::bind(&listen as &str) {
|
||||
Ok(socket) => socket,
|
||||
_ => panic!("Failed to open socket")
|
||||
|
@ -146,6 +147,7 @@ impl<A: Address, T: Table<Address=A>, M: Protocol<Address=A>, I: VirtualInterfac
|
|||
peers: PeerList::new(peer_timeout),
|
||||
addresses: addresses,
|
||||
learning: learning,
|
||||
broadcast: broadcast,
|
||||
reconnect_peers: Vec::new(),
|
||||
table: table,
|
||||
socket: socket,
|
||||
|
@ -192,7 +194,6 @@ impl<A: Address, T: Table<Address=A>, M: Protocol<Address=A>, I: VirtualInterfac
|
|||
}
|
||||
|
||||
fn housekeep(&mut self) -> Result<(), Error> {
|
||||
debug!("Running housekeeping...");
|
||||
self.peers.timeout();
|
||||
self.table.housekeep();
|
||||
if self.next_peerlist <= SteadyTime::now() {
|
||||
|
@ -230,6 +231,10 @@ impl<A: Address, T: Table<Address=A>, M: Protocol<Address=A>, I: VirtualInterfac
|
|||
}
|
||||
},
|
||||
None => {
|
||||
if !self.broadcast {
|
||||
debug!("No destination for {:?} found, dropping", dst);
|
||||
return Ok(());
|
||||
}
|
||||
debug!("No destination for {:?} found, broadcasting", dst);
|
||||
let msg = Message::Data(payload);
|
||||
for addr in &self.peers.as_vec() {
|
||||
|
@ -273,8 +278,13 @@ impl<A: Address, T: Table<Address=A>, M: Protocol<Address=A>, I: VirtualInterfac
|
|||
}
|
||||
},
|
||||
Message::Init(addrs) => {
|
||||
if self.peers.contains(&peer) {
|
||||
return Ok(());
|
||||
}
|
||||
self.peers.add(&peer);
|
||||
let peers = self.peers.as_vec();
|
||||
let own_addrs = self.addresses.clone();
|
||||
try!(self.send_msg(peer, &Message::Init(own_addrs)));
|
||||
try!(self.send_msg(peer, &Message::Peers(peers)));
|
||||
for addr in addrs {
|
||||
self.table.learn(addr, peer.clone());
|
||||
|
@ -344,7 +354,7 @@ impl TapCloud {
|
|||
};
|
||||
info!("Opened tap device {}", device.ifname());
|
||||
let table = MacTable::new(mac_timeout);
|
||||
Self::new(device, listen, network_id, table, peer_timeout, true, vec![])
|
||||
Self::new(device, listen, network_id, table, peer_timeout, true, true, vec![])
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -360,6 +370,6 @@ impl TunCloud {
|
|||
info!("Opened tun device {}", device.ifname());
|
||||
let table = RoutingTable::new();
|
||||
let subnet = IpAddress::from_str(&subnet).expect("Invalid subnet");
|
||||
Self::new(device, listen, network_id, table, peer_timeout, false, vec![subnet])
|
||||
Self::new(device, listen, network_id, table, peer_timeout, false, false, vec![subnet])
|
||||
}
|
||||
}
|
||||
|
|
10
src/ip.rs
10
src/ip.rs
|
@ -186,9 +186,15 @@ impl Table for RoutingTable {
|
|||
fn learn(&mut self, src: Self::Address, addr: SocketAddr) {
|
||||
match src {
|
||||
IpAddress::V4(_) => (),
|
||||
IpAddress::V4Net(base, prefix_len) => self.add(IpAddress::V4(base).to_bytes(), prefix_len, addr),
|
||||
IpAddress::V4Net(base, prefix_len) => {
|
||||
info!("Adding to routing table: {:?} => {}", src, addr);
|
||||
self.add(IpAddress::V4(base).to_bytes(), prefix_len, addr);
|
||||
},
|
||||
IpAddress::V6(_) => (),
|
||||
IpAddress::V6Net(base, prefix_len) => self.add(IpAddress::V6(base).to_bytes(), prefix_len, addr)
|
||||
IpAddress::V6Net(base, prefix_len) => {
|
||||
info!("Adding to routing table: {:?} => {}", src, addr);
|
||||
self.add(IpAddress::V6(base).to_bytes(), prefix_len, addr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ use std::u16;
|
|||
|
||||
use super::cloud::{Error, NetworkId, Address};
|
||||
use super::util::{as_obj, as_bytes};
|
||||
use super::ethernet;
|
||||
#[cfg(test)] use super::ethernet;
|
||||
|
||||
const MAGIC: [u8; 3] = [0x76, 0x70, 0x6e];
|
||||
const VERSION: u8 = 0;
|
||||
|
|
Loading…
Reference in New Issue