Skip to content

Commit 7fba4ec

Browse files
committed
ICMP handled by smoltcp stack. Disable rx checksum verification
1 parent bb156b5 commit 7fba4ec

File tree

2 files changed

+13
-24
lines changed

2 files changed

+13
-24
lines changed

crates/shadowsocks-service/src/local/tun/mod.rs

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use byte_string::ByteStr;
1313
use ipnet::IpNet;
1414
use log::{debug, error, info, trace, warn};
1515
use shadowsocks::config::Mode;
16-
use smoltcp::wire::{Icmpv4Packet, Icmpv6Packet, IpProtocol, TcpPacket, UdpPacket};
16+
use smoltcp::wire::{IpProtocol, TcpPacket, UdpPacket};
1717
use tokio::io::AsyncReadExt;
1818
use tun::{AsyncDevice, Configuration as TunConfiguration, Device as TunDevice, Error as TunError, Layer};
1919

@@ -267,7 +267,9 @@ impl Tun {
267267
}
268268
}
269269
IpProtocol::Icmp | IpProtocol::Icmpv6 => {
270-
self.handle_icmp_packet(&packet).await?;
270+
// ICMP is handled by TCP's Interface.
271+
// smoltcp's interface will always send replies to EchoRequest
272+
self.tcp.drive_interface_state(frame).await;
271273
}
272274
_ => {
273275
debug!("IP packet ignored (protocol: {:?})", packet.protocol());
@@ -277,25 +279,4 @@ impl Tun {
277279

278280
Ok(())
279281
}
280-
281-
async fn handle_icmp_packet(&self, packet: &IpPacket<&[u8]>) -> smoltcp::Result<()> {
282-
match *packet {
283-
IpPacket::Ipv4(ref ipv4) => {
284-
let icmp = Icmpv4Packet::new_checked(ipv4.payload())?;
285-
trace!("[TUN] received {}", icmp);
286-
}
287-
IpPacket::Ipv6(ref ipv6) => {
288-
let icmp = Icmpv6Packet::new_checked(ipv6.payload())?;
289-
trace!(
290-
"[TUN] received ICMPv6 {:?} code={} echo_ident={} echo_seq_no={}",
291-
icmp.msg_type(),
292-
icmp.msg_code(),
293-
icmp.echo_ident(),
294-
icmp.echo_seq_no()
295-
);
296-
}
297-
}
298-
299-
Ok(())
300-
}
301282
}

crates/shadowsocks-service/src/local/tun/tcp.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use parking_lot::Mutex as ParkingMutex;
1414
use shadowsocks::{net::TcpSocketOpts, relay::socks5::Address};
1515
use smoltcp::{
1616
iface::{Interface, InterfaceBuilder, Routes, SocketHandle},
17-
phy::{DeviceCapabilities, Medium},
17+
phy::{Checksum, ChecksumCapabilities, DeviceCapabilities, Medium},
1818
socket::{TcpSocket, TcpSocketBuffer, TcpState},
1919
storage::RingBuffer,
2020
time::{Duration, Instant},
@@ -198,6 +198,14 @@ impl TcpTun {
198198
capabilities.medium = Medium::Ip;
199199
capabilities.max_transmission_unit = mtu as usize;
200200

201+
// Disable Checksum verification for improving performance.
202+
capabilities.checksum = ChecksumCapabilities::default();
203+
capabilities.checksum.ipv4 = Checksum::Tx;
204+
capabilities.checksum.tcp = Checksum::Tx;
205+
capabilities.checksum.udp = Checksum::Tx;
206+
capabilities.checksum.icmpv4 = Checksum::Tx;
207+
capabilities.checksum.icmpv6 = Checksum::Tx;
208+
201209
let (virt, iface_rx, iface_tx) = VirtTunDevice::new(capabilities);
202210

203211
let iface_builder = InterfaceBuilder::new(virt, vec![]);

0 commit comments

Comments
 (0)