@@ -15,14 +15,19 @@ use ipnet::IpNet;
15
15
use log:: { debug, error, info, trace, warn} ;
16
16
use shadowsocks:: config:: Mode ;
17
17
use smoltcp:: wire:: { IpProtocol , TcpPacket , UdpPacket } ;
18
- use tokio:: { io:: AsyncReadExt , sync:: mpsc, time} ;
18
+ use tokio:: {
19
+ io:: { AsyncReadExt , AsyncWriteExt } ,
20
+ sync:: mpsc,
21
+ time,
22
+ } ;
19
23
20
24
cfg_if ! {
21
25
if #[ cfg( any( target_os = "ios" ,
22
26
target_os = "macos" ,
23
27
target_os = "linux" ,
24
28
target_os = "android" ,
25
- target_os = "windows" ) ) ] {
29
+ target_os = "windows" ,
30
+ target_os = "freebsd" ) ) ] {
26
31
use tun2:: {
27
32
create_as_async, AsyncDevice , Configuration as TunConfiguration , AbstractDevice , Error as TunError , Layer ,
28
33
} ;
@@ -36,15 +41,9 @@ cfg_if! {
36
41
37
42
use crate :: local:: { context:: ServiceContext , loadbalancing:: PingBalancer } ;
38
43
39
- use self :: {
40
- ip_packet:: IpPacket ,
41
- sys:: { write_packet_with_pi, IFF_PI_PREFIX_LEN } ,
42
- tcp:: TcpTun ,
43
- udp:: UdpTun ,
44
- } ;
44
+ use self :: { ip_packet:: IpPacket , tcp:: TcpTun , udp:: UdpTun } ;
45
45
46
46
mod ip_packet;
47
- mod sys;
48
47
mod tcp;
49
48
mod udp;
50
49
mod virt_device;
@@ -159,10 +158,6 @@ pub struct Tun {
159
158
impl Tun {
160
159
/// Start serving
161
160
pub async fn run ( mut self ) -> io:: Result < ( ) > {
162
- if let Ok ( mtu) = self . device . as_ref ( ) . mtu ( ) {
163
- assert ! ( mtu > 0 && mtu as usize > IFF_PI_PREFIX_LEN ) ;
164
- }
165
-
166
161
info ! (
167
162
"shadowsocks tun device {}, mode {}" ,
168
163
self . device
@@ -204,15 +199,9 @@ impl Tun {
204
199
netmask
205
200
) ;
206
201
207
- // Set default route
208
- // XXX: tun2 already set it by default.
209
- // if let Err(err) = sys::set_route_configuration(self.device.as_mut()).await {
210
- // warn!("[TUN] tun device set route failed, error: {}", err);
211
- // }
212
-
213
202
let address_broadcast = address_net. broadcast ( ) ;
214
203
215
- let mut packet_buffer = vec ! [ 0u8 ; 65536 + IFF_PI_PREFIX_LEN ] . into_boxed_slice ( ) ;
204
+ let mut packet_buffer = vec ! [ 0u8 ; 65536 ] . into_boxed_slice ( ) ;
216
205
let mut udp_cleanup_timer = time:: interval ( self . udp_cleanup_interval ) ;
217
206
218
207
loop {
@@ -221,15 +210,7 @@ impl Tun {
221
210
n = self . device. read( & mut packet_buffer) => {
222
211
let n = n?;
223
212
224
- if n <= IFF_PI_PREFIX_LEN {
225
- error!(
226
- "[TUN] packet too short, packet: {:?}" ,
227
- ByteStr :: new( & packet_buffer[ ..n] )
228
- ) ;
229
- continue ;
230
- }
231
-
232
- let packet = & mut packet_buffer[ IFF_PI_PREFIX_LEN ..n] ;
213
+ let packet = & mut packet_buffer[ ..n] ;
233
214
trace!( "[TUN] received IP packet {:?}" , ByteStr :: new( packet) ) ;
234
215
235
216
if let Err ( err) = self . handle_tun_frame( & address_broadcast, packet) . await {
@@ -239,10 +220,17 @@ impl Tun {
239
220
240
221
// UDP channel sent back
241
222
packet = self . udp. recv_packet( ) => {
242
- if let Err ( err) = write_packet_with_pi( & mut self . device, & packet) . await {
243
- error!( "[TUN] failed to set packet information, error: {}, {:?}" , err, ByteStr :: new( & packet) ) ;
244
- } else {
245
- trace!( "[TUN] sent IP packet (UDP) {:?}" , ByteStr :: new( & packet) ) ;
223
+ match self . device. write( & packet) . await {
224
+ Ok ( n) => {
225
+ if n < packet. len( ) {
226
+ warn!( "[TUN] sent IP packet (UDP), but truncated. sent {} < {}, {:?}" , n, packet. len( ) , ByteStr :: new( & packet) ) ;
227
+ } else {
228
+ trace!( "[TUN] sent IP packet (UDP) {:?}" , ByteStr :: new( & packet) ) ;
229
+ }
230
+ }
231
+ Err ( err) => {
232
+ error!( "[TUN] failed to set packet information, error: {}, {:?}" , err, ByteStr :: new( & packet) ) ;
233
+ }
246
234
}
247
235
}
248
236
@@ -259,10 +247,17 @@ impl Tun {
259
247
260
248
// TCP channel sent back
261
249
packet = self . tcp. recv_packet( ) => {
262
- if let Err ( err) = write_packet_with_pi( & mut self . device, & packet) . await {
263
- error!( "[TUN] failed to set packet information, error: {}, {:?}" , err, ByteStr :: new( & packet) ) ;
264
- } else {
265
- trace!( "[TUN] sent IP packet (TCP) {:?}" , ByteStr :: new( & packet) ) ;
250
+ match self . device. write( & packet) . await {
251
+ Ok ( n) => {
252
+ if n < packet. len( ) {
253
+ warn!( "[TUN] sent IP packet (TCP), but truncated. sent {} < {}, {:?}" , n, packet. len( ) , ByteStr :: new( & packet) ) ;
254
+ } else {
255
+ trace!( "[TUN] sent IP packet (TCP) {:?}" , ByteStr :: new( & packet) ) ;
256
+ }
257
+ }
258
+ Err ( err) => {
259
+ error!( "[TUN] failed to set packet information, error: {}, {:?}" , err, ByteStr :: new( & packet) ) ;
260
+ }
266
261
}
267
262
}
268
263
}
@@ -278,20 +273,20 @@ impl Tun {
278
273
}
279
274
} ;
280
275
276
+ trace ! ( "[TUN] {:?}" , packet) ;
277
+
281
278
let src_ip_addr = packet. src_addr ( ) ;
282
279
let dst_ip_addr = packet. dst_addr ( ) ;
283
- let src_non_unicast = match src_ip_addr {
284
- IpAddr :: V4 ( v4) => {
285
- v4. is_broadcast ( ) || v4. is_multicast ( ) || v4. is_unspecified ( ) || v4 == * device_broadcast_addr
286
- }
287
- IpAddr :: V6 ( v6) => v6. is_multicast ( ) || v6. is_unspecified ( ) ,
288
- } ;
289
- let dst_non_unicast = match dst_ip_addr {
290
- IpAddr :: V4 ( v4) => {
291
- v4. is_broadcast ( ) || v4. is_multicast ( ) || v4. is_unspecified ( ) || v4 == * device_broadcast_addr
292
- }
293
- IpAddr :: V6 ( v6) => v6. is_multicast ( ) || v6. is_unspecified ( ) ,
294
- } ;
280
+ let src_non_unicast = src_ip_addr == * device_broadcast_addr
281
+ || match src_ip_addr {
282
+ IpAddr :: V4 ( v4) => v4. is_broadcast ( ) || v4. is_multicast ( ) || v4. is_unspecified ( ) ,
283
+ IpAddr :: V6 ( v6) => v6. is_multicast ( ) || v6. is_unspecified ( ) ,
284
+ } ;
285
+ let dst_non_unicast = dst_ip_addr == * device_broadcast_addr
286
+ || match dst_ip_addr {
287
+ IpAddr :: V4 ( v4) => v4. is_broadcast ( ) || v4. is_multicast ( ) || v4. is_unspecified ( ) ,
288
+ IpAddr :: V6 ( v6) => v6. is_multicast ( ) || v6. is_unspecified ( ) ,
289
+ } ;
295
290
296
291
if src_non_unicast || dst_non_unicast {
297
292
trace ! (
0 commit comments