diff options
| author | Emīls <emils@mullvad.net> | 2023-08-30 15:49:40 +0200 |
|---|---|---|
| committer | Emīls <emils@mullvad.net> | 2023-08-30 15:49:40 +0200 |
| commit | 06745dd5403743ab4cef23bdf25c0acec41448fe (patch) | |
| tree | a14031702a6d1d24b442dfd4f89ee07f81ba38ec | |
| parent | 49e1bf7a68acb81235db80aed967d5c02112379c (diff) | |
| parent | 58243b3dc4590402f5a1a4c2cb8a61af13597961 (diff) | |
| download | mullvadvpn-06745dd5403743ab4cef23bdf25c0acec41448fe.tar.xz mullvadvpn-06745dd5403743ab4cef23bdf25c0acec41448fe.zip | |
Merge branch 'cannot-connect-over-bridges-on-windows-des-337'
| -rw-r--r-- | talpid-openvpn/src/proxy/shadowsocks.rs | 33 |
1 files changed, 15 insertions, 18 deletions
diff --git a/talpid-openvpn/src/proxy/shadowsocks.rs b/talpid-openvpn/src/proxy/shadowsocks.rs index 231af7b660..654f44e874 100644 --- a/talpid-openvpn/src/proxy/shadowsocks.rs +++ b/talpid-openvpn/src/proxy/shadowsocks.rs @@ -35,28 +35,16 @@ impl ShadowsocksProxyMonitor { } async fn start_inner(settings: &ShadowsocksProxySettings) -> io::Result<Self> { - // TODO: Patch shadowsocks so the bound address can be obtained afterwards. - let addr = SocketAddrV4::new(Ipv4Addr::LOCALHOST, 0); - let sock = Socket::new( - Domain::IPV4, - socket2::Type::STREAM, - Some(socket2::Protocol::TCP), - )?; - sock.set_reuse_address(true)?; - sock.bind(&SockAddr::from(addr))?; - - let bound_addr = sock - .local_addr()? - .as_socket_ipv4() - .ok_or_else(|| io::Error::new(io::ErrorKind::Other, "missing IPv4 address"))?; - let mut config = Config::new(ConfigType::Local); config.fast_open = true; let mut local = LocalConfig::new(ProtocolType::Socks); local.mode = Mode::TcpOnly; - local.addr = Some(ServerAddr::SocketAddr(SocketAddr::from(bound_addr))); + local.addr = Some(ServerAddr::SocketAddr(SocketAddr::from(( + Ipv4Addr::LOCALHOST, + 0, + )))); config .local @@ -83,9 +71,9 @@ impl ShadowsocksProxyMonitor { } let srv = local::Server::new(config).await?; + let listener_addr = Self::get_listener_addr(&srv)?; let (fut, server_abort_handle) = abortable(async move { - let _ = sock; let result = srv.run().await; if let Err(error) = &result { log::error!( @@ -98,11 +86,20 @@ impl ShadowsocksProxyMonitor { let server_join_handle = tokio::spawn(fut); Ok(Self { - port: bound_addr.port(), + port: listener_addr.port(), server_join_handle: Some(server_join_handle), server_abort_handle, }) } + + fn get_listener_addr(srv: &local::Server) -> io::Result<SocketAddr> { + let no_addr_err = || io::Error::new(io::ErrorKind::Other, "Missing listener address"); + let socks_server = srv.socks_servers().get(0).ok_or_else(no_addr_err)?; + socks_server + .tcp_server() + .ok_or_else(no_addr_err)? + .local_addr() + } } impl Drop for ShadowsocksProxyMonitor { |
