summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorLinus Färnstrand <linus@mullvad.net>2017-05-23 14:25:47 +0200
committerLinus Färnstrand <linus@mullvad.net>2017-05-23 14:28:43 +0200
commit5c30d7757d295e280626173e33cf2ff3f9ad5550 (patch)
treea7771661b963e8ff857d508f9a0981d0f2389936
parent830a4c95ebc0fd7c051529b43e7cad972ba4dd2d (diff)
downloadmullvadvpn-5c30d7757d295e280626173e33cf2ff3f9ad5550.tar.xz
mullvadvpn-5c30d7757d295e280626173e33cf2ff3f9ad5550.zip
Change to safe conversion from OpenVpnEvent
-rw-r--r--talpid_core/src/tunnel/mod.rs37
-rw-r--r--talpid_core/src/tunnel/openvpn.rs1
2 files changed, 24 insertions, 14 deletions
diff --git a/talpid_core/src/tunnel/mod.rs b/talpid_core/src/tunnel/mod.rs
index 27ce11c1f6..5de530746d 100644
--- a/talpid_core/src/tunnel/mod.rs
+++ b/talpid_core/src/tunnel/mod.rs
@@ -34,23 +34,26 @@ pub enum TunnelEvent {
Shutdown,
}
-impl From<OpenVpnEvent> for TunnelEvent {
- /// TODO(linus): When we know better which events we need and what data they must carry
- /// this can be implemented in a better way.
- fn from(openvpn_event: OpenVpnEvent) -> Self {
- match openvpn_event {
- OpenVpnEvent::PluginEvent(event, _) => {
- match event {
- OpenVpnPluginEvent::Up => TunnelEvent::Up,
- OpenVpnPluginEvent::RoutePredown => TunnelEvent::Down,
- _ => panic!("Unsupported event. This should not happen"),
- }
- }
- OpenVpnEvent::Shutdown(_) => TunnelEvent::Shutdown,
+impl TunnelEvent {
+ /// Converts an `OpenVpnEvent` to a `TunnelEvent`.
+ /// Returns `None` if there is no corresponding `TunnelEvent`.
+ pub fn from_openvpn_event(event: &OpenVpnEvent) -> Option<TunnelEvent> {
+ match *event {
+ OpenVpnEvent::PluginEvent(ref event, _) => Self::from_openvpn_plugin_event(event),
+ OpenVpnEvent::Shutdown(_) => Some(TunnelEvent::Shutdown),
+ }
+ }
+
+ fn from_openvpn_plugin_event(event: &OpenVpnPluginEvent) -> Option<TunnelEvent> {
+ match *event {
+ OpenVpnPluginEvent::Up => Some(TunnelEvent::Up),
+ OpenVpnPluginEvent::RoutePredown => Some(TunnelEvent::Down),
+ _ => None,
}
}
}
+
/// Abstraction for monitoring a generic VPN tunnel.
pub struct TunnelMonitor {
monitor: OpenVpnMonitor,
@@ -61,7 +64,13 @@ impl TunnelMonitor {
pub fn new<L>(on_event: L) -> Result<Self>
where L: Fn(TunnelEvent) + Send + Sync + 'static
{
- let openvpn_on_event = move |openvpn_event| on_event(TunnelEvent::from(openvpn_event));
+ let openvpn_on_event = move |openvpn_event| {
+ if let Some(tunnel_event) = TunnelEvent::from_openvpn_event(&openvpn_event) {
+ on_event(tunnel_event);
+ } else {
+ debug!("Ignoring OpenVpnEvent {:?}", openvpn_event);
+ }
+ };
let monitor = openvpn::OpenVpnMonitor::new(openvpn_on_event, get_plugin_path())
.chain_err(|| ErrorKind::TunnelMonitoringError)?;
Ok(TunnelMonitor { monitor })
diff --git a/talpid_core/src/tunnel/openvpn.rs b/talpid_core/src/tunnel/openvpn.rs
index bcf89e3eb0..9d366ebb4a 100644
--- a/talpid_core/src/tunnel/openvpn.rs
+++ b/talpid_core/src/tunnel/openvpn.rs
@@ -33,6 +33,7 @@ pub use self::errors::*;
/// Possible events from OpenVPN
+#[derive(Debug)]
pub enum OpenVpnEvent {
/// An event from the plugin loaded into OpenVPN.
PluginEvent(openvpn_ffi::OpenVpnPluginEvent, openvpn_ffi::OpenVpnEnv),