support compress for rpc and tun data (#473)

* support compress for rpc and tun data
* add compression layer to easytier-web
This commit is contained in:
Sijie.Sun
2024-11-16 11:23:18 +08:00
committed by GitHub
parent 9d455e22fa
commit 6cdea38284
22 changed files with 623 additions and 82 deletions

View File

@@ -7,6 +7,10 @@ use zerocopy::FromZeroes;
type DefaultEndian = LittleEndian;
const fn max(a: usize, b: usize) -> usize {
[a, b][(a < b) as usize]
}
// TCP TunnelHeader
#[repr(C, packed)]
#[derive(AsBytes, FromBytes, FromZeroes, Clone, Debug, Default)]
@@ -49,11 +53,11 @@ pub enum PacketType {
Invalid = 0,
Data = 1,
HandShake = 2,
RoutePacket = 3,
RoutePacket = 3, // deprecated
Ping = 4,
Pong = 5,
TaRpc = 6,
Route = 7,
TaRpc = 6, // deprecated
Route = 7, // deprecated
RpcReq = 8,
RpcResp = 9,
ForeignNetworkPacket = 10,
@@ -65,6 +69,7 @@ bitflags::bitflags! {
const LATENCY_FIRST = 0b0000_0010;
const EXIT_NODE = 0b0000_0100;
const NO_PROXY = 0b0000_1000;
const COMPRESSED = 0b0001_0000;
const _ = !0;
}
@@ -118,6 +123,12 @@ impl PeerManagerHeader {
.contains(PeerManagerHeaderFlags::NO_PROXY)
}
pub fn is_compressed(&self) -> bool {
PeerManagerHeaderFlags::from_bits(self.flags)
.unwrap()
.contains(PeerManagerHeaderFlags::COMPRESSED)
}
pub fn set_latency_first(&mut self, latency_first: bool) -> &mut Self {
let mut flags = PeerManagerHeaderFlags::from_bits(self.flags).unwrap();
if latency_first {
@@ -150,6 +161,17 @@ impl PeerManagerHeader {
self.flags = flags.bits();
self
}
pub fn set_compressed(&mut self, compressed: bool) -> &mut Self {
let mut flags = PeerManagerHeaderFlags::from_bits(self.flags).unwrap();
if compressed {
flags.insert(PeerManagerHeaderFlags::COMPRESSED);
} else {
flags.remove(PeerManagerHeaderFlags::COMPRESSED);
}
self.flags = flags.bits();
self
}
}
#[repr(C, packed)]
@@ -201,12 +223,35 @@ pub struct AesGcmTail {
}
pub const AES_GCM_ENCRYPTION_RESERVED: usize = std::mem::size_of::<AesGcmTail>();
pub const TAIL_RESERVED_SIZE: usize = AES_GCM_ENCRYPTION_RESERVED;
const fn max(a: usize, b: usize) -> usize {
[a, b][(a < b) as usize]
#[derive(AsBytes, FromZeroes, Clone, Debug, Copy)]
#[repr(u8)]
pub enum CompressorAlgo {
None = 0,
ZstdDefault = 1,
}
#[repr(C, packed)]
#[derive(AsBytes, FromBytes, FromZeroes, Clone, Debug, Default)]
pub struct CompressorTail {
pub algo: u8,
}
pub const COMPRESSOR_TAIL_SIZE: usize = std::mem::size_of::<CompressorTail>();
impl CompressorTail {
pub fn get_algo(&self) -> Option<CompressorAlgo> {
match self.algo {
1 => Some(CompressorAlgo::ZstdDefault),
_ => None,
}
}
pub fn new(algo: CompressorAlgo) -> Self {
Self { algo: algo as u8 }
}
}
pub const TAIL_RESERVED_SIZE: usize = max(AES_GCM_ENCRYPTION_RESERVED, COMPRESSOR_TAIL_SIZE);
#[derive(Default, Debug)]
pub struct ZCPacketOffsets {
pub payload_offset: usize,