@@ -89,49 +89,23 @@ pub async fn latency_test(
89
89
. map_err ( |_| RuntimeError :: LatencyTest ( "Failed to resolve test host" ) ) ?,
90
90
}
91
91
. to_owned ( ) ;
92
+
93
+ let iface = iface. unwrap_or ( dispatcher. get_iface_name ( ) ) ;
94
+
92
95
let mut rng = rand:: rngs:: SmallRng :: seed_from_u64 (
93
96
SystemTime :: now ( )
94
97
. duration_since ( SystemTime :: UNIX_EPOCH )
95
98
. unwrap_or_else ( |_| Duration :: default ( ) )
96
99
. as_secs ( ) ,
97
100
) ;
98
- let iface = iface. unwrap_or ( dispatcher. get_iface_name ( ) ) ;
99
-
101
+ let src_addr = get_random_local_addr ( & dst_addr, rng. gen_range ( 32768 ..65535 ) ) ;
100
102
// create outbound
101
- let creator: Box < dyn Outbound > = match proxy. get_impl ( ) . as_ref ( ) {
102
- ProxyImpl :: Chain ( vec) => {
103
- match dispatcher. create_chain (
104
- & proxy. get_name ( ) ,
105
- vec,
106
- get_random_local_addr ( & dst_addr, rng. gen_range ( 32768 ..65535 ) ) ,
107
- & dst_addr,
108
- iface. as_str ( ) ,
109
- ) {
110
- Ok ( o) => Box :: new ( o) ,
111
- Err ( _) => {
112
- proxy. set_latency ( Latency :: Failed ) ;
113
- return Err ( RuntimeError :: LatencyTest ( "Create outbound failed" ) ) ;
114
- }
115
- }
116
- }
117
- proxy_config => {
118
- let creator = match dispatcher. build_normal_outbound (
119
- & proxy. get_name ( ) ,
120
- iface. as_str ( ) ,
121
- proxy_config,
122
- get_random_local_addr ( & dst_addr, rng. gen_range ( 32768 ..65535 ) ) ,
123
- & dst_addr,
124
- None ,
125
- ) {
126
- Ok ( ( o, _) ) => o,
127
- Err ( _) => {
128
- proxy. set_latency ( Latency :: Failed ) ;
129
- return Err ( RuntimeError :: LatencyTest ( "Create outbound failed" ) ) ;
130
- }
131
- } ;
132
- creator
133
- }
134
- } ;
103
+ let creator = construct_outbound ( dispatcher, & proxy, src_addr, & dst_addr, & iface)
104
+ . await
105
+ . ok_or_else ( || {
106
+ proxy. set_latency ( Latency :: Failed ) ;
107
+ RuntimeError :: LatencyTest ( "Create outbound failed" )
108
+ } ) ?;
135
109
136
110
let proxy_handle = creator. spawn_tcp ( inbound, ConnAbortHandle :: placeholder ( ) ) ;
137
111
@@ -171,3 +145,33 @@ pub async fn latency_test(
171
145
} ) ;
172
146
Ok ( timeout_future)
173
147
}
148
+
149
+ async fn construct_outbound (
150
+ dispatcher : & Dispatcher ,
151
+ proxy : & Proxy ,
152
+ src_addr : SocketAddr ,
153
+ dst_addr : & NetworkAddr ,
154
+ iface : & str ,
155
+ ) -> Option < Box < dyn Outbound > > {
156
+ match proxy. get_impl ( ) . as_ref ( ) {
157
+ ProxyImpl :: Chain ( vec) => {
158
+ match dispatcher. create_chain ( & proxy. get_name ( ) , vec, src_addr, dst_addr, iface) {
159
+ Ok ( o) => Some ( Box :: new ( o) ) ,
160
+ Err ( _) => None ,
161
+ }
162
+ }
163
+ proxy_config => {
164
+ match dispatcher. build_normal_outbound (
165
+ & proxy. get_name ( ) ,
166
+ iface,
167
+ proxy_config,
168
+ src_addr,
169
+ dst_addr,
170
+ None ,
171
+ ) {
172
+ Ok ( ( o, _) ) => Some ( o) ,
173
+ Err ( _) => None ,
174
+ }
175
+ }
176
+ }
177
+ }
0 commit comments