@@ -11,7 +11,7 @@ use crate::{
11
11
init_wireguard_config, MixnetExitConnectionInfo , MixnetVpn , SpecificVpn , WireguardVpn ,
12
12
} ;
13
13
use crate :: { routing, MixnetConnectionInfo , NymVpn } ;
14
- use futures:: channel:: oneshot;
14
+ use futures:: channel:: { mpsc , oneshot} ;
15
15
use futures:: StreamExt ;
16
16
use ipnetwork:: IpNetwork ;
17
17
use log:: * ;
@@ -23,7 +23,7 @@ use rand::rngs::OsRng;
23
23
use talpid_core:: dns:: DnsMonitor ;
24
24
use talpid_core:: firewall:: Firewall ;
25
25
use talpid_routing:: RouteManager ;
26
- use talpid_tunnel:: TunnelEvent ;
26
+ use talpid_tunnel:: { TunnelEvent , TunnelMetadata } ;
27
27
use tap:: TapFallible ;
28
28
29
29
pub struct TunnelSetup < T : TunnelSpecifcSetup > {
@@ -108,6 +108,24 @@ async fn init_firewall_dns(
108
108
}
109
109
}
110
110
111
+ async fn wait_interface_up (
112
+ mut event_rx : mpsc:: UnboundedReceiver < ( TunnelEvent , oneshot:: Sender < ( ) > ) > ,
113
+ ) -> Result < TunnelMetadata > {
114
+ loop {
115
+ match event_rx. next ( ) . await {
116
+ Some ( ( TunnelEvent :: InterfaceUp ( _, _) , _) ) => {
117
+ continue ;
118
+ }
119
+ Some ( ( TunnelEvent :: Up ( metadata) , _) ) => {
120
+ break Ok ( metadata) ;
121
+ }
122
+ Some ( ( TunnelEvent :: AuthFailed ( _) , _) ) | Some ( ( TunnelEvent :: Down , _) ) | None => {
123
+ return Err ( Error :: BadWireguardEvent ) ;
124
+ }
125
+ }
126
+ }
127
+ }
128
+
111
129
async fn setup_wg_tunnel (
112
130
nym_vpn : & mut NymVpn < WireguardVpn > ,
113
131
route_manager : RouteManager ,
@@ -153,12 +171,17 @@ async fn setup_wg_tunnel(
153
171
. collect :: < Vec < _ > > ( ) ,
154
172
) ;
155
173
} ) ;
156
- exit_wireguard_config. 0 . peers . iter_mut ( ) . for_each ( |peer| {
157
- peer. allowed_ips
158
- . append ( & mut replace_default_prefixes ( catch_all_ipv4 ( ) ) ) ;
159
- peer. allowed_ips
160
- . append ( & mut replace_default_prefixes ( catch_all_ipv6 ( ) ) ) ;
161
- } ) ;
174
+ // If routing is disabled, we don't append the catch all routing rules
175
+ if !nym_vpn. disable_routing {
176
+ exit_wireguard_config. 0 . peers . iter_mut ( ) . for_each ( |peer| {
177
+ peer. allowed_ips
178
+ . append ( & mut replace_default_prefixes ( catch_all_ipv4 ( ) ) ) ;
179
+ peer. allowed_ips
180
+ . append ( & mut replace_default_prefixes ( catch_all_ipv6 ( ) ) ) ;
181
+ } ) ;
182
+ } else {
183
+ info ! ( "Routing is disabled, skipping adding routes" ) ;
184
+ }
162
185
info ! ( "Entry wireguard config: \n {entry_wireguard_config}" ) ;
163
186
info ! ( "Exit wireguard config: \n {exit_wireguard_config}" ) ;
164
187
let ( firewall, dns_monitor) = init_firewall_dns (
@@ -167,33 +190,32 @@ async fn setup_wg_tunnel(
167
190
)
168
191
. await ?;
169
192
std:: env:: set_var ( "TALPID_FORCE_USERSPACE_WIREGUARD" , "1" ) ;
170
- let ( wireguard_waiting_entry, mut event_rx) = create_wireguard_tunnel (
193
+ let ( wireguard_waiting_entry, event_rx) = create_wireguard_tunnel (
171
194
& route_manager,
172
195
nym_vpn. tun_provider . clone ( ) ,
173
196
entry_wireguard_config,
174
197
)
175
198
. await ?;
176
199
// Wait for entry gateway routes to be finished before moving to exit gateway routes, as the two might race if
177
200
// started one after the other
178
- loop {
179
- match event_rx. next ( ) . await {
180
- Some ( ( TunnelEvent :: InterfaceUp ( _, _) , _) ) => {
181
- continue ;
182
- }
183
- Some ( ( TunnelEvent :: Up ( _) , _) ) => {
184
- break ;
185
- }
186
- Some ( ( TunnelEvent :: AuthFailed ( _) , _) ) | Some ( ( TunnelEvent :: Down , _) ) | None => {
187
- return Err ( Error :: BadWireguardEvent ) ;
188
- }
189
- }
190
- }
191
- let ( wireguard_waiting_exit, _) = create_wireguard_tunnel (
201
+ let metadata = wait_interface_up ( event_rx) . await ?;
202
+ info ! (
203
+ "Created entry tun device {device_name} with ip={device_ip:?}" ,
204
+ device_name = metadata. interface,
205
+ device_ip = metadata. ips
206
+ ) ;
207
+ let ( wireguard_waiting_exit, event_rx) = create_wireguard_tunnel (
192
208
& route_manager,
193
209
nym_vpn. tun_provider . clone ( ) ,
194
210
exit_wireguard_config,
195
211
)
196
212
. await ?;
213
+ let metadata = wait_interface_up ( event_rx) . await ?;
214
+ info ! (
215
+ "Created exit tun device {device_name} with ip={device_ip:?}" ,
216
+ device_name = metadata. interface,
217
+ device_ip = metadata. ips
218
+ ) ;
197
219
let entry = TunnelSetup {
198
220
specific_setup : wireguard_waiting_entry,
199
221
} ;
0 commit comments