From b0494687b5a908a65aa39358c170ca07967c09de Mon Sep 17 00:00:00 2001 From: "Sijie.Sun" Date: Wed, 13 Mar 2024 18:09:48 +0800 Subject: [PATCH] simplify packet definition (#30) --- easytier-core/src/gateway/icmp_proxy.rs | 2 +- easytier-core/src/gateway/tcp_proxy.rs | 6 +-- easytier-core/src/gateway/udp_proxy.rs | 2 +- .../src/peers/foreign_network_manager.rs | 4 +- easytier-core/src/peers/packet.rs | 38 +++++-------------- easytier-core/src/peers/peer_conn.rs | 12 +++--- easytier-core/src/peers/peer_manager.rs | 6 +-- easytier-core/src/peers/peer_rip_route.rs | 4 +- easytier-core/src/peers/peer_rpc.rs | 4 +- 9 files changed, 26 insertions(+), 52 deletions(-) diff --git a/easytier-core/src/gateway/icmp_proxy.rs b/easytier-core/src/gateway/icmp_proxy.rs index 920b456..5970e8d 100644 --- a/easytier-core/src/gateway/icmp_proxy.rs +++ b/easytier-core/src/gateway/icmp_proxy.rs @@ -155,7 +155,7 @@ impl PeerPacketFilter for IcmpProxy { return None; }; - let ipv4 = Ipv4Packet::new(&x.data)?; + let ipv4 = Ipv4Packet::new(&x)?; if ipv4.get_version() != 4 || ipv4.get_next_level_protocol() != IpNextHeaderProtocols::Icmp { diff --git a/easytier-core/src/gateway/tcp_proxy.rs b/easytier-core/src/gateway/tcp_proxy.rs index 8802e94..15d1308 100644 --- a/easytier-core/src/gateway/tcp_proxy.rs +++ b/easytier-core/src/gateway/tcp_proxy.rs @@ -88,7 +88,7 @@ impl PeerPacketFilter for TcpProxy { return None; }; - let ipv4 = Ipv4Packet::new(&x.data)?; + let ipv4 = Ipv4Packet::new(&x)?; if ipv4.get_version() != 4 || ipv4.get_next_level_protocol() != IpNextHeaderProtocols::Tcp { return None; } @@ -99,8 +99,8 @@ impl PeerPacketFilter for TcpProxy { tracing::trace!(ipv4 = ?ipv4, cidr_set = ?self.cidr_set, "proxy tcp packet received"); - let mut packet_buffer = BytesMut::with_capacity(x.data.len()); - packet_buffer.extend_from_slice(&x.data.to_vec()); + let mut packet_buffer = BytesMut::with_capacity(x.len()); + packet_buffer.extend_from_slice(&x.to_vec()); let (ip_buffer, tcp_buffer) = packet_buffer.split_at_mut(ipv4.get_header_length() as usize * 4); diff --git a/easytier-core/src/gateway/udp_proxy.rs b/easytier-core/src/gateway/udp_proxy.rs index c896d1a..41e72a3 100644 --- a/easytier-core/src/gateway/udp_proxy.rs +++ b/easytier-core/src/gateway/udp_proxy.rs @@ -246,7 +246,7 @@ impl PeerPacketFilter for UdpProxy { return None; }; - let ipv4 = Ipv4Packet::new(&x.data)?; + let ipv4 = Ipv4Packet::new(&x)?; if ipv4.get_version() != 4 || ipv4.get_next_level_protocol() != IpNextHeaderProtocols::Udp { return None; diff --git a/easytier-core/src/peers/foreign_network_manager.rs b/easytier-core/src/peers/foreign_network_manager.rs index 26e5810..32743b4 100644 --- a/easytier-core/src/peers/foreign_network_manager.rs +++ b/easytier-core/src/peers/foreign_network_manager.rs @@ -245,9 +245,7 @@ impl ForeignNetworkManager { let from_peer_id = packet.from_peer.into(); let to_peer_id = packet.to_peer.into(); if to_peer_id == my_node_id { - if let ArchivedPacketBody::Ctrl(packet::ArchivedCtrlPacketBody::TaRpc(..)) = - &packet.body - { + if let ArchivedPacketBody::TaRpc(..) = &packet.body { rpc_sender.send(packet_bytes.clone()).unwrap(); continue; } diff --git a/easytier-core/src/peers/packet.rs b/easytier-core/src/peers/packet.rs index b5e34d6..6ca3e14 100644 --- a/easytier-core/src/peers/packet.rs +++ b/easytier-core/src/peers/packet.rs @@ -111,7 +111,8 @@ pub struct RoutePacket { #[archive(compare(PartialEq), check_bytes)] // Derives can be passed through to the generated type: #[archive_attr(derive(Debug))] -pub enum CtrlPacketBody { +pub enum PacketBody { + Data(Vec), HandShake(HandShake), RoutePacket(RoutePacket), Ping(u32), @@ -119,23 +120,6 @@ pub enum CtrlPacketBody { TaRpc(u32, bool, Vec), // u32: service_id, bool: is_req, Vec: rpc body } -#[derive(Archive, Deserialize, Serialize, Debug)] -#[archive(compare(PartialEq), check_bytes)] -// Derives can be passed through to the generated type: -#[archive_attr(derive(Debug))] -pub struct DataPacketBody { - pub data: Vec, -} - -#[derive(Archive, Deserialize, Serialize, Debug)] -#[archive(compare(PartialEq), check_bytes)] -// Derives can be passed through to the generated type: -#[archive_attr(derive(Debug))] -pub enum PacketBody { - Ctrl(CtrlPacketBody), - Data(DataPacketBody), -} - #[derive(Archive, Deserialize, Serialize, Debug)] #[archive(compare(PartialEq), check_bytes)] // Derives can be passed through to the generated type: @@ -163,13 +147,13 @@ impl Packet { Packet { from_peer: from_peer.into(), to_peer: 0, - body: PacketBody::Ctrl(CtrlPacketBody::HandShake(HandShake { + body: PacketBody::HandShake(HandShake { magic: MAGIC, my_peer_id: from_peer, version: VERSION, features: Vec::new(), network_identity: network.clone().into(), - })), + }), } } @@ -177,9 +161,7 @@ impl Packet { Packet { from_peer, to_peer, - body: PacketBody::Data(DataPacketBody { - data: data.to_vec(), - }), + body: PacketBody::Data(data.to_vec()), } } @@ -187,10 +169,10 @@ impl Packet { Packet { from_peer, to_peer, - body: PacketBody::Ctrl(CtrlPacketBody::RoutePacket(RoutePacket { + body: PacketBody::RoutePacket(RoutePacket { route_id, body: data.to_vec(), - })), + }), } } @@ -198,7 +180,7 @@ impl Packet { Packet { from_peer, to_peer, - body: PacketBody::Ctrl(CtrlPacketBody::Ping(seq)), + body: PacketBody::Ping(seq), } } @@ -206,7 +188,7 @@ impl Packet { Packet { from_peer, to_peer, - body: PacketBody::Ctrl(CtrlPacketBody::Pong(seq)), + body: PacketBody::Pong(seq), } } @@ -220,7 +202,7 @@ impl Packet { Packet { from_peer, to_peer, - body: PacketBody::Ctrl(CtrlPacketBody::TaRpc(service_id, is_req, body)), + body: PacketBody::TaRpc(service_id, is_req, body), } } } diff --git a/easytier-core/src/peers/peer_conn.rs b/easytier-core/src/peers/peer_conn.rs index 0f6afb8..44a36a1 100644 --- a/easytier-core/src/peers/peer_conn.rs +++ b/easytier-core/src/peers/peer_conn.rs @@ -36,7 +36,7 @@ use crate::{ }, }; -use super::packet::{self, ArchivedCtrlPacketBody, ArchivedHandShake, Packet}; +use super::packet::{self, ArchivedHandShake, Packet}; pub type PacketRecvChan = mpsc::Sender; @@ -167,9 +167,7 @@ impl PeerConnPinger { loop { match receiver.recv().await { Ok(p) => { - if let packet::ArchivedPacketBody::Ctrl( - packet::ArchivedCtrlPacketBody::Pong(resp_seq), - ) = &Packet::decode(&p).body + if let packet::ArchivedPacketBody::Pong(resp_seq) = &Packet::decode(&p).body { if *resp_seq == seq { break; @@ -373,7 +371,7 @@ impl PeerConn { let mut stream = self.tunnel.pin_stream(); let mut sink = self.tunnel.pin_sink(); - wait_response!(stream, hs_req, packet::ArchivedPacketBody::Ctrl(ArchivedCtrlPacketBody::HandShake(x)) => x); + wait_response!(stream, hs_req, packet::ArchivedPacketBody::HandShake(x) => x); self.info = Some(PeerInfo::from(hs_req)); log::info!("handshake request: {:?}", hs_req); @@ -396,7 +394,7 @@ impl PeerConn { .run(|| packet::Packet::new_handshake(self.my_peer_id, &self.global_ctx.network)); sink.send(hs_req.into()).await?; - wait_response!(stream, hs_rsp, packet::ArchivedPacketBody::Ctrl(ArchivedCtrlPacketBody::HandShake(x)) => x); + wait_response!(stream, hs_rsp, packet::ArchivedPacketBody::HandShake(x) => x); self.info = Some(PeerInfo::from(hs_rsp)); log::info!("handshake response: {:?}", hs_rsp); @@ -423,7 +421,7 @@ impl PeerConn { ) -> Result { let packet = Packet::decode(&bytes_item); match packet.body { - packet::ArchivedPacketBody::Ctrl(packet::ArchivedCtrlPacketBody::Ping(seq)) => { + packet::ArchivedPacketBody::Ping(seq) => { log::trace!("recv ping packet: {:?}", packet); Ok(build_ctrl_msg( packet::Packet::new_pong_packet( diff --git a/easytier-core/src/peers/peer_manager.rs b/easytier-core/src/peers/peer_manager.rs index aafc0cd..a37d483 100644 --- a/easytier-core/src/peers/peer_manager.rs +++ b/easytier-core/src/peers/peer_manager.rs @@ -303,7 +303,7 @@ impl PeerManager { if let packet::ArchivedPacketBody::Data(x) = &packet.body { // TODO: use a function to get the body ref directly for zero copy self.nic_channel - .send(extract_bytes_from_archived_vec(&data, &x.data)) + .send(extract_bytes_from_archived_vec(&data, &x)) .await .unwrap(); Some(()) @@ -333,9 +333,7 @@ impl PeerManager { packet: &packet::ArchivedPacket, data: &Bytes, ) -> Option<()> { - if let ArchivedPacketBody::Ctrl(packet::ArchivedCtrlPacketBody::TaRpc(..)) = - &packet.body - { + if let ArchivedPacketBody::TaRpc(..) = &packet.body { self.peer_rpc_tspt_sender.send(data.clone()).unwrap(); Some(()) } else { diff --git a/easytier-core/src/peers/peer_rip_route.rs b/easytier-core/src/peers/peer_rip_route.rs index 72b29e7..a98b5c7 100644 --- a/easytier-core/src/peers/peer_rip_route.rs +++ b/easytier-core/src/peers/peer_rip_route.rs @@ -641,9 +641,7 @@ impl PeerPacketFilter for BasicRoute { packet: &packet::ArchivedPacket, data: &Bytes, ) -> Option<()> { - if let ArchivedPacketBody::Ctrl(packet::ArchivedCtrlPacketBody::RoutePacket(route_packet)) = - &packet.body - { + if let ArchivedPacketBody::RoutePacket(route_packet) = &packet.body { self.handle_route_packet( packet.from_peer.into(), extract_bytes_from_archived_vec(&data, &route_packet.body), diff --git a/easytier-core/src/peers/peer_rpc.rs b/easytier-core/src/peers/peer_rpc.rs index 4ed01cf..b1f1988 100644 --- a/easytier-core/src/peers/peer_rpc.rs +++ b/easytier-core/src/peers/peer_rpc.rs @@ -16,7 +16,7 @@ use crate::{ peers::packet::Packet, }; -use super::packet::{CtrlPacketBody, PacketBody}; +use super::packet::PacketBody; type PeerRpcServiceId = u32; @@ -207,7 +207,7 @@ impl PeerRpcManager { fn parse_rpc_packet(packet: &Packet) -> Result { match &packet.body { - PacketBody::Ctrl(CtrlPacketBody::TaRpc(id, is_req, body)) => Ok(TaRpcPacketInfo { + PacketBody::TaRpc(id, is_req, body) => Ok(TaRpcPacketInfo { from_peer: packet.from_peer.into(), to_peer: packet.to_peer.into(), service_id: *id,