@@ -29,23 +29,41 @@ pub fn start_all_servers(ctx: Arc<ClientContext>) {
2929 let qos = qos:: start_qos_server ( ) ;
3030 run_server ( qos, "qos" ) ;
3131
32+ // Spawn tunnel server
33+ let tunnel = start_tunnel_server ( ctx. clone ( ) ) ;
34+ run_server ( tunnel, "tunnel" ) ;
35+
36+ // Spawn telemetry server
37+ let telemetry = telemetry:: start_telemetry_server ( ctx) ;
38+ run_server ( telemetry, "telemetry" ) ;
39+ }
40+
41+ /// Runs the tunnel server, if a tunnel port is available a UDP tunnel will be
42+ /// attempted, if that fails or a tunnel port is unavailable an HTTP tunnel
43+ /// will be attempted instead
44+ async fn start_tunnel_server ( ctx : Arc < ClientContext > ) -> std:: io:: Result < ( ) > {
3245 // Spawn tunnel server
3346 match ctx. tunnel_port {
3447 // When UDP tunnel server port is available use the faster UDP tunnel server
3548 Some ( tunnel_port) => {
36- let tunnel = udp_tunnel:: start_udp_tunnel_server ( ctx. clone ( ) , tunnel_port) ;
37- run_server ( tunnel, "tunnel" ) ;
49+ let err = match udp_tunnel:: start_udp_tunnel_server ( ctx. clone ( ) , tunnel_port) . await {
50+ // Encountered error with UDP tunnel
51+ Err ( err) => err,
52+ // Server exited normally
53+ Ok ( _) => return Ok ( ( ) ) ,
54+ } ;
55+
56+ error ! (
57+ "error using UDP tunnel, falling back to HTTP tunnel: {}" ,
58+ err
59+ ) ;
60+
61+ // Error while connecting UDP tunnel, fallback to HTTP upgrade tunnel
62+ tunnel:: start_tunnel_server ( ctx) . await
3863 }
3964 // When unavailable fallback to the HTTP upgrade tunnel
40- None => {
41- let tunnel = tunnel:: start_tunnel_server ( ctx. clone ( ) ) ;
42- run_server ( tunnel, "tunnel" ) ;
43- }
44- } ;
45-
46- // Spawn telemetry server
47- let telemetry = telemetry:: start_telemetry_server ( ctx) ;
48- run_server ( telemetry, "telemetry" ) ;
65+ None => tunnel:: start_tunnel_server ( ctx) . await ,
66+ }
4967}
5068
5169/// Runs the provided server `future` in a background task displaying
0 commit comments