diff --git a/Cargo.lock b/Cargo.lock index 0ec259b..6c915fe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -315,6 +315,15 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + [[package]] name = "crossbeam-channel" version = "0.5.13" @@ -1434,6 +1443,7 @@ name = "sdlan-rs" version = "0.1.0" dependencies = [ "crc", + "crc32fast", "dashmap 6.1.0", "dns-lookup", "etherparse", diff --git a/Cargo.toml b/Cargo.toml index 54d252d..b19a58d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ edition = "2021" [dependencies] crc = "3.2.1" +crc32fast = "1.4.2" dashmap = "6.0.1" dns-lookup = "2.0.4" etherparse = "0.15.0" diff --git a/Makefile b/Makefile index dfad5c5..3f31ef2 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ linux: RUSTFLAGS="-L ." cargo build --features "tap" --release linux-tun: - RUSTFLAGS="-L ." cargo build --features "tap" --release + RUSTFLAGS="-L ." cargo build --release pb: cargo run --bin build_pb diff --git a/src/network/arp.rs b/src/network/arp.rs index 344dc77..4c918cb 100644 --- a/src/network/arp.rs +++ b/src/network/arp.rs @@ -13,8 +13,6 @@ use tokio::sync::{ oneshot, }; -use crate::utils::CRC_HASH; - use super::{get_edge, get_route_table}; static GLOBAL_ARP: OnceCell = OnceCell::new(); diff --git a/src/network/async_main.rs b/src/network/async_main.rs index 9360156..e556daa 100644 --- a/src/network/async_main.rs +++ b/src/network/async_main.rs @@ -15,7 +15,7 @@ use crate::pb::{ SdlRegisterSuperAck, SdlRegisterSuperNak, SdlSendRegisterEvent, SdlStunRequest, Sdlv6Info, }; use crate::tcp::{init_tcp_conn, EventType, NakMsgCode, PacketType, SdlanTcp}; -use crate::utils::{send_to_sock, CommandLine, CRC_HASH}; +use crate::utils::{send_to_sock, CommandLine}; use crate::ConnectionState; use etherparse::ether_type::ARP; use etherparse::{Ethernet2Header, IpHeaders}; diff --git a/src/network/packet.rs b/src/network/packet.rs index dc26199..4bbb15f 100644 --- a/src/network/packet.rs +++ b/src/network/packet.rs @@ -6,7 +6,7 @@ use std::{ use crate::{ network::{send_packet_to_net, TunTapPacketHandler}, - utils::{mac_to_string, CRC_HASH}, + utils::mac_to_string, }; use crate::{ diff --git a/src/network/tun_linux.rs b/src/network/tun_linux.rs index c48dd94..087daf8 100644 --- a/src/network/tun_linux.rs +++ b/src/network/tun_linux.rs @@ -2,7 +2,8 @@ use etherparse::ether_type::ARP; use etherparse::{Ethernet2Header, IpHeaders}; use sdlan_sn_rs::config::SDLAN_DEFAULT_TTL; use sdlan_sn_rs::utils::{ - aes_encrypt, ip_to_string, is_multi_broadcast, net_bit_len_to_mask, SDLanError, BROADCAST_MAC, + aes_encrypt, ip_to_string, is_ipv6_multicast, is_multi_broadcast, net_bit_len_to_mask, + SDLanError, BROADCAST_MAC, }; use std::error::Error; use std::ffi::CStr; @@ -25,7 +26,7 @@ use crate::network::{ }; use crate::pb::{encode_to_udp_message, SdlData}; use crate::tcp::PacketType; -use crate::utils::{mac_to_string, CRC_HASH}; +use crate::utils::{caculate_crc, mac_to_string}; use super::device::{DeviceConfig, Mode}; use super::TunTapPacketHandler; @@ -172,7 +173,7 @@ impl Iface { #[cfg(feature = "tap")] impl TunTapPacketHandler for Iface { async fn handle_packet_from_net(&self, data: &[u8], _: &[u8]) -> std::io::Result<()> { - debug!("in tap mode"); + debug!("in tap mode, got data: {:?}", data); match self.send(data) { Err(e) => { error!("failed to write to tap: {}", e.to_string()); @@ -188,9 +189,13 @@ impl TunTapPacketHandler for Iface { ) -> std::io::Result<()> { debug!("in tap mode2"); let edge = get_edge(); + match Ethernet2Header::from_slice(data) { Ok((hdr, _)) => { let target = hdr.destination; + if is_ipv6_multicast(&target) { + return Ok(()); + } let size = data.len(); let Ok(encrypted) = aes_encrypt(encrypt_key, data) else { @@ -209,7 +214,9 @@ impl TunTapPacketHandler for Iface { send_packet_to_net(edge, target, &msg, size as u64).await; } - Err(e) => {} + Err(e) => { + error!("failed to parse packet from device"); + } }; Ok(()) } @@ -226,27 +233,25 @@ impl TunTapPacketHandler for Iface { error!("payload length error"); return Ok(()); } - let crc_code = &rest[(rest.len() - 4)..rest.len()]; - let rest = &rest[..(rest.len() - 4)]; + // let crc_code = &rest[(rest.len() - 4)..rest.len()]; + // let rest = &rest[..(rest.len() - 4)]; - let crc_hash: crc::Crc = crc::Crc::::new(&crc::CRC_32_CKSUM); - let ck = CRC_HASH.checksum(&data[..(data.len()) - 4]); - let sent_ck = u32::from_be_bytes(crc_code.try_into().unwrap()); - debug!("ck = {}, sent_ck = {}", ck, sent_ck); + // let crc_hash: crc::Crc = crc::Crc::::new(&crc::CRC_32_CKSUM); + // let ck = caculate_crc(&data[..(data.len() - 4)]); + // let sent_ck = u32::from_be_bytes(crc_code.try_into().unwrap()); + // debug!("ck = {}, sent_ck = {}", ck, sent_ck); debug!("ip size is {}", rest.len()); let edge = get_edge(); let self_mac = edge.device_config.get_mac(); - /* - if hdr.destination != self_mac && hdr.destination != BROADCAST_MAC { + if hdr.destination != self_mac && !is_multi_broadcast(&hdr.destination) { error!( "packet to [{:?}] not direct to us", mac_to_string(&hdr.destination) ); - return; + return Ok(()); } - */ if hdr.ether_type == ARP { let mut arp = ArpHdr::from_slice(&data); @@ -323,7 +328,7 @@ impl TunTapPacketHandler for Iface { .await; } } - other => { + _other => { println!("unknown arp type info"); } } @@ -443,7 +448,7 @@ impl TunTapPacketHandler for Iface { let mut packet = Vec::with_capacity(14 + data.len() + 4); packet.extend_from_slice(ðerheader.to_bytes()[..]); packet.extend_from_slice(&data); - let crc = CRC_HASH.checksum(&packet); + let crc = caculate_crc(&packet); packet.extend_from_slice(&crc.to_be_bytes()); let pkt_size = packet.len(); diff --git a/src/network/tun_win.rs b/src/network/tun_win.rs index 67c2e15..7bd76cb 100644 --- a/src/network/tun_win.rs +++ b/src/network/tun_win.rs @@ -19,7 +19,7 @@ use crate::network::{ }; use crate::pb::{encode_to_udp_message, SdlData}; use crate::tcp::PacketType; -use crate::utils::{mac_to_string, CRC_HASH}; +use crate::utils::mac_to_string; use super::device::{DeviceConfig, Mode}; use super::TunTapPacketHandler; diff --git a/src/utils/mod.rs b/src/utils/mod.rs index daee6f4..d82f3a6 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -1,4 +1,6 @@ mod command; +use std::hash::Hasher; + pub use command::*; mod socks; @@ -9,7 +11,12 @@ pub use socks::*; mod pid_recorder; pub use pid_recorder::PidRecorder; -pub const CRC_HASH: crc::Crc = crc::Crc::::new(&crc::CRC_32_CKSUM); +// pub const CRC_HASH: crc::Crc = crc::Crc::::new(&crc::CRC_32_XFER); + +pub fn caculate_crc(data: &[u8]) -> u32 { + let res = crc32fast::hash(data); + res +} pub fn mac_to_string(mac: &Mac) -> String { format!(