linux
This commit is contained in:
parent
220cee4a89
commit
06d7819fd1
10
Cargo.lock
generated
10
Cargo.lock
generated
@ -315,6 +315,15 @@ version = "2.4.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
|
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]]
|
[[package]]
|
||||||
name = "crossbeam-channel"
|
name = "crossbeam-channel"
|
||||||
version = "0.5.13"
|
version = "0.5.13"
|
||||||
@ -1434,6 +1443,7 @@ name = "sdlan-rs"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"crc",
|
"crc",
|
||||||
|
"crc32fast",
|
||||||
"dashmap 6.1.0",
|
"dashmap 6.1.0",
|
||||||
"dns-lookup",
|
"dns-lookup",
|
||||||
"etherparse",
|
"etherparse",
|
||||||
|
|||||||
@ -5,6 +5,7 @@ edition = "2021"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
crc = "3.2.1"
|
crc = "3.2.1"
|
||||||
|
crc32fast = "1.4.2"
|
||||||
dashmap = "6.0.1"
|
dashmap = "6.0.1"
|
||||||
dns-lookup = "2.0.4"
|
dns-lookup = "2.0.4"
|
||||||
etherparse = "0.15.0"
|
etherparse = "0.15.0"
|
||||||
|
|||||||
2
Makefile
2
Makefile
@ -2,7 +2,7 @@ linux:
|
|||||||
RUSTFLAGS="-L ." cargo build --features "tap" --release
|
RUSTFLAGS="-L ." cargo build --features "tap" --release
|
||||||
|
|
||||||
linux-tun:
|
linux-tun:
|
||||||
RUSTFLAGS="-L ." cargo build --features "tap" --release
|
RUSTFLAGS="-L ." cargo build --release
|
||||||
|
|
||||||
pb:
|
pb:
|
||||||
cargo run --bin build_pb
|
cargo run --bin build_pb
|
||||||
|
|||||||
@ -13,8 +13,6 @@ use tokio::sync::{
|
|||||||
oneshot,
|
oneshot,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::utils::CRC_HASH;
|
|
||||||
|
|
||||||
use super::{get_edge, get_route_table};
|
use super::{get_edge, get_route_table};
|
||||||
|
|
||||||
static GLOBAL_ARP: OnceCell<ArpActor> = OnceCell::new();
|
static GLOBAL_ARP: OnceCell<ArpActor> = OnceCell::new();
|
||||||
|
|||||||
@ -15,7 +15,7 @@ use crate::pb::{
|
|||||||
SdlRegisterSuperAck, SdlRegisterSuperNak, SdlSendRegisterEvent, SdlStunRequest, Sdlv6Info,
|
SdlRegisterSuperAck, SdlRegisterSuperNak, SdlSendRegisterEvent, SdlStunRequest, Sdlv6Info,
|
||||||
};
|
};
|
||||||
use crate::tcp::{init_tcp_conn, EventType, NakMsgCode, PacketType, SdlanTcp};
|
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 crate::ConnectionState;
|
||||||
use etherparse::ether_type::ARP;
|
use etherparse::ether_type::ARP;
|
||||||
use etherparse::{Ethernet2Header, IpHeaders};
|
use etherparse::{Ethernet2Header, IpHeaders};
|
||||||
|
|||||||
@ -6,7 +6,7 @@ use std::{
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
network::{send_packet_to_net, TunTapPacketHandler},
|
network::{send_packet_to_net, TunTapPacketHandler},
|
||||||
utils::{mac_to_string, CRC_HASH},
|
utils::mac_to_string,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
|||||||
@ -2,7 +2,8 @@ use etherparse::ether_type::ARP;
|
|||||||
use etherparse::{Ethernet2Header, IpHeaders};
|
use etherparse::{Ethernet2Header, IpHeaders};
|
||||||
use sdlan_sn_rs::config::SDLAN_DEFAULT_TTL;
|
use sdlan_sn_rs::config::SDLAN_DEFAULT_TTL;
|
||||||
use sdlan_sn_rs::utils::{
|
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::error::Error;
|
||||||
use std::ffi::CStr;
|
use std::ffi::CStr;
|
||||||
@ -25,7 +26,7 @@ use crate::network::{
|
|||||||
};
|
};
|
||||||
use crate::pb::{encode_to_udp_message, SdlData};
|
use crate::pb::{encode_to_udp_message, SdlData};
|
||||||
use crate::tcp::PacketType;
|
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::device::{DeviceConfig, Mode};
|
||||||
use super::TunTapPacketHandler;
|
use super::TunTapPacketHandler;
|
||||||
@ -172,7 +173,7 @@ impl Iface {
|
|||||||
#[cfg(feature = "tap")]
|
#[cfg(feature = "tap")]
|
||||||
impl TunTapPacketHandler for Iface {
|
impl TunTapPacketHandler for Iface {
|
||||||
async fn handle_packet_from_net(&self, data: &[u8], _: &[u8]) -> std::io::Result<()> {
|
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) {
|
match self.send(data) {
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
error!("failed to write to tap: {}", e.to_string());
|
error!("failed to write to tap: {}", e.to_string());
|
||||||
@ -188,9 +189,13 @@ impl TunTapPacketHandler for Iface {
|
|||||||
) -> std::io::Result<()> {
|
) -> std::io::Result<()> {
|
||||||
debug!("in tap mode2");
|
debug!("in tap mode2");
|
||||||
let edge = get_edge();
|
let edge = get_edge();
|
||||||
|
|
||||||
match Ethernet2Header::from_slice(data) {
|
match Ethernet2Header::from_slice(data) {
|
||||||
Ok((hdr, _)) => {
|
Ok((hdr, _)) => {
|
||||||
let target = hdr.destination;
|
let target = hdr.destination;
|
||||||
|
if is_ipv6_multicast(&target) {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
let size = data.len();
|
let size = data.len();
|
||||||
|
|
||||||
let Ok(encrypted) = aes_encrypt(encrypt_key, data) else {
|
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;
|
send_packet_to_net(edge, target, &msg, size as u64).await;
|
||||||
}
|
}
|
||||||
Err(e) => {}
|
Err(e) => {
|
||||||
|
error!("failed to parse packet from device");
|
||||||
|
}
|
||||||
};
|
};
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -226,27 +233,25 @@ impl TunTapPacketHandler for Iface {
|
|||||||
error!("payload length error");
|
error!("payload length error");
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
let crc_code = &rest[(rest.len() - 4)..rest.len()];
|
// let crc_code = &rest[(rest.len() - 4)..rest.len()];
|
||||||
let rest = &rest[..(rest.len() - 4)];
|
// let rest = &rest[..(rest.len() - 4)];
|
||||||
|
|
||||||
let crc_hash: crc::Crc<u32> = crc::Crc::<u32>::new(&crc::CRC_32_CKSUM);
|
// let crc_hash: crc::Crc<u32> = crc::Crc::<u32>::new(&crc::CRC_32_CKSUM);
|
||||||
let ck = CRC_HASH.checksum(&data[..(data.len()) - 4]);
|
// let ck = caculate_crc(&data[..(data.len() - 4)]);
|
||||||
let sent_ck = u32::from_be_bytes(crc_code.try_into().unwrap());
|
// let sent_ck = u32::from_be_bytes(crc_code.try_into().unwrap());
|
||||||
debug!("ck = {}, sent_ck = {}", ck, sent_ck);
|
// debug!("ck = {}, sent_ck = {}", ck, sent_ck);
|
||||||
|
|
||||||
debug!("ip size is {}", rest.len());
|
debug!("ip size is {}", rest.len());
|
||||||
let edge = get_edge();
|
let edge = get_edge();
|
||||||
let self_mac = edge.device_config.get_mac();
|
let self_mac = edge.device_config.get_mac();
|
||||||
|
|
||||||
/*
|
if hdr.destination != self_mac && !is_multi_broadcast(&hdr.destination) {
|
||||||
if hdr.destination != self_mac && hdr.destination != BROADCAST_MAC {
|
|
||||||
error!(
|
error!(
|
||||||
"packet to [{:?}] not direct to us",
|
"packet to [{:?}] not direct to us",
|
||||||
mac_to_string(&hdr.destination)
|
mac_to_string(&hdr.destination)
|
||||||
);
|
);
|
||||||
return;
|
return Ok(());
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
if hdr.ether_type == ARP {
|
if hdr.ether_type == ARP {
|
||||||
let mut arp = ArpHdr::from_slice(&data);
|
let mut arp = ArpHdr::from_slice(&data);
|
||||||
@ -323,7 +328,7 @@ impl TunTapPacketHandler for Iface {
|
|||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
other => {
|
_other => {
|
||||||
println!("unknown arp type info");
|
println!("unknown arp type info");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -443,7 +448,7 @@ impl TunTapPacketHandler for Iface {
|
|||||||
let mut packet = Vec::with_capacity(14 + data.len() + 4);
|
let mut packet = Vec::with_capacity(14 + data.len() + 4);
|
||||||
packet.extend_from_slice(ðerheader.to_bytes()[..]);
|
packet.extend_from_slice(ðerheader.to_bytes()[..]);
|
||||||
packet.extend_from_slice(&data);
|
packet.extend_from_slice(&data);
|
||||||
let crc = CRC_HASH.checksum(&packet);
|
let crc = caculate_crc(&packet);
|
||||||
packet.extend_from_slice(&crc.to_be_bytes());
|
packet.extend_from_slice(&crc.to_be_bytes());
|
||||||
|
|
||||||
let pkt_size = packet.len();
|
let pkt_size = packet.len();
|
||||||
|
|||||||
@ -19,7 +19,7 @@ use crate::network::{
|
|||||||
};
|
};
|
||||||
use crate::pb::{encode_to_udp_message, SdlData};
|
use crate::pb::{encode_to_udp_message, SdlData};
|
||||||
use crate::tcp::PacketType;
|
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::device::{DeviceConfig, Mode};
|
||||||
use super::TunTapPacketHandler;
|
use super::TunTapPacketHandler;
|
||||||
|
|||||||
@ -1,4 +1,6 @@
|
|||||||
mod command;
|
mod command;
|
||||||
|
use std::hash::Hasher;
|
||||||
|
|
||||||
pub use command::*;
|
pub use command::*;
|
||||||
|
|
||||||
mod socks;
|
mod socks;
|
||||||
@ -9,7 +11,12 @@ pub use socks::*;
|
|||||||
mod pid_recorder;
|
mod pid_recorder;
|
||||||
pub use pid_recorder::PidRecorder;
|
pub use pid_recorder::PidRecorder;
|
||||||
|
|
||||||
pub const CRC_HASH: crc::Crc<u32> = crc::Crc::<u32>::new(&crc::CRC_32_CKSUM);
|
// pub const CRC_HASH: crc::Crc<u32> = crc::Crc::<u32>::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 {
|
pub fn mac_to_string(mac: &Mac) -> String {
|
||||||
format!(
|
format!(
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user