@@ -11,6 +11,7 @@ use shadowsocks::{
11
11
config:: { ServerConfig , ServerType } ,
12
12
context:: Context ,
13
13
crypto:: CipherKind ,
14
+ net:: { ConnectOpts , UdpSocket } ,
14
15
relay:: {
15
16
udprelay:: proxy_socket:: { ProxySocketError , UdpSocketType } ,
16
17
Address ,
@@ -20,7 +21,7 @@ use shadowsocks::{
20
21
#[ cfg( any( target_os = "android" , target_os = "linux" ) ) ]
21
22
use std:: os:: fd:: AsRawFd ;
22
23
use std:: { io, net:: SocketAddr , sync:: Arc } ;
23
- use tokio:: { net :: UdpSocket , sync:: oneshot} ;
24
+ use tokio:: sync:: oneshot;
24
25
25
26
const SHADOWSOCKS_CIPHER : CipherKind = CipherKind :: AES_256_GCM ;
26
27
const SHADOWSOCKS_PASSWORD : & str = "mullvad" ;
@@ -157,7 +158,10 @@ async fn run_forwarding(
157
158
Ok ( ( ) )
158
159
}
159
160
160
- fn connect_shadowsocks ( remote_socket : UdpSocket , shadowsocks_endpoint : SocketAddr ) -> ProxySocket {
161
+ fn connect_shadowsocks (
162
+ remote_socket : UdpSocket ,
163
+ shadowsocks_endpoint : SocketAddr ,
164
+ ) -> ProxySocket < UdpSocket > {
161
165
let ss_context = Context :: new_shared ( ServerType :: Local ) ;
162
166
let ss_config: ServerConfig = ServerConfig :: new (
163
167
shadowsocks_endpoint,
@@ -176,7 +180,7 @@ async fn create_shadowsocks_socket(
176
180
} else {
177
181
SocketAddr :: new ( "::" . parse ( ) . unwrap ( ) , 0 )
178
182
} ;
179
- let socket = UdpSocket :: bind ( random_bind_addr)
183
+ let socket = UdpSocket :: bind_with_opts ( & random_bind_addr, & ConnectOpts :: default ( ) )
180
184
. await
181
185
. map_err ( Error :: BindRemoteUdp ) ?;
182
186
#[ cfg( target_os = "linux" ) ]
@@ -193,7 +197,7 @@ async fn create_local_udp_socket(ipv4: bool) -> Result<(UdpSocket, SocketAddr)>
193
197
} else {
194
198
SocketAddr :: new ( "::1" . parse ( ) . unwrap ( ) , 0 )
195
199
} ;
196
- let local_udp_socket = UdpSocket :: bind ( random_bind_addr)
200
+ let local_udp_socket = UdpSocket :: bind_with_opts ( & random_bind_addr, & ConnectOpts :: default ( ) )
197
201
. await
198
202
. map_err ( Error :: BindUdp ) ?;
199
203
let udp_client_addr = local_udp_socket
@@ -213,7 +217,7 @@ async fn wait_for_local_udp_client(udp_listener: &UdpSocket) -> io::Result<()> {
213
217
}
214
218
215
219
async fn handle_outgoing (
216
- ss_write : Arc < ProxySocket > ,
220
+ ss_write : Arc < ProxySocket < UdpSocket > > ,
217
221
local_udp_read : Arc < UdpSocket > ,
218
222
ss_addr : SocketAddr ,
219
223
wg_addr : Address ,
@@ -243,7 +247,7 @@ async fn handle_outgoing(
243
247
}
244
248
245
249
async fn handle_incoming (
246
- ss_read : Arc < ProxySocket > ,
250
+ ss_read : Arc < ProxySocket < UdpSocket > > ,
247
251
local_udp_write : Arc < UdpSocket > ,
248
252
ss_addr : SocketAddr ,
249
253
wg_addr : Address ,
0 commit comments