Files
Easytier_lkddi/easytier-core/src/peers/packet.rs
T

229 lines
5.9 KiB
Rust
Raw Normal View History

2024-03-06 20:59:17 +08:00
use std::fmt::Debug;
2023-09-23 01:53:45 +00:00
use rkyv::{Archive, Deserialize, Serialize};
use tokio_util::bytes::Bytes;
2024-03-06 20:59:17 +08:00
use crate::common::{
global_ctx::NetworkIdentity,
rkyv_util::{decode_from_bytes, encode_to_bytes},
2024-03-13 00:15:22 +08:00
PeerId,
2024-03-06 20:59:17 +08:00
};
2023-09-23 01:53:45 +00:00
const MAGIC: u32 = 0xd1e1a5e1;
const VERSION: u32 = 1;
#[derive(Archive, Deserialize, Serialize, PartialEq, Clone)]
#[archive(compare(PartialEq), check_bytes)]
// Derives can be passed through to the generated type:
#[archive_attr(derive(Debug))]
pub struct UUID(uuid::Bytes);
// impl Debug for UUID
impl std::fmt::Debug for UUID {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let uuid = uuid::Uuid::from_bytes(self.0);
write!(f, "{}", uuid)
}
}
impl From<uuid::Uuid> for UUID {
fn from(uuid: uuid::Uuid) -> Self {
UUID(*uuid.as_bytes())
}
}
impl From<UUID> for uuid::Uuid {
fn from(uuid: UUID) -> Self {
uuid::Uuid::from_bytes(uuid.0)
}
}
impl ArchivedUUID {
pub fn to_uuid(&self) -> uuid::Uuid {
uuid::Uuid::from_bytes(self.0)
}
}
impl From<&ArchivedUUID> for UUID {
fn from(uuid: &ArchivedUUID) -> Self {
UUID(uuid.0)
}
}
2024-03-06 20:59:17 +08:00
#[derive(Archive, Deserialize, Serialize)]
#[archive(compare(PartialEq), check_bytes)]
// Derives can be passed through to the generated type:
pub struct NetworkIdentityForPacket(Vec<u8>);
impl From<NetworkIdentity> for NetworkIdentityForPacket {
fn from(network: NetworkIdentity) -> Self {
Self(bincode::serialize(&network).unwrap())
}
}
impl From<NetworkIdentityForPacket> for NetworkIdentity {
fn from(network: NetworkIdentityForPacket) -> Self {
bincode::deserialize(&network.0).unwrap()
}
}
impl From<&ArchivedNetworkIdentityForPacket> for NetworkIdentity {
fn from(network: &ArchivedNetworkIdentityForPacket) -> Self {
NetworkIdentityForPacket(network.0.to_vec()).into()
}
}
impl Debug for NetworkIdentityForPacket {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let network: NetworkIdentity = bincode::deserialize(&self.0).unwrap();
write!(f, "{:?}", network)
}
}
impl Debug for ArchivedNetworkIdentityForPacket {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let network: NetworkIdentity = bincode::deserialize(&self.0).unwrap();
write!(f, "{:?}", network)
}
}
2023-09-23 01:53:45 +00:00
#[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 HandShake {
pub magic: u32,
2024-03-13 00:15:22 +08:00
pub my_peer_id: PeerId,
2023-09-23 01:53:45 +00:00
pub version: u32,
pub features: Vec<String>,
2024-03-06 20:59:17 +08:00
pub network_identity: NetworkIdentityForPacket,
2023-09-23 01:53:45 +00:00
}
#[derive(Archive, Deserialize, Serialize, Debug)]
#[archive(compare(PartialEq), check_bytes)]
#[archive_attr(derive(Debug))]
pub struct RoutePacket {
pub route_id: u8,
pub body: Vec<u8>,
}
#[derive(Archive, Deserialize, Serialize, Debug)]
#[archive(compare(PartialEq), check_bytes)]
// Derives can be passed through to the generated type:
#[archive_attr(derive(Debug))]
2024-03-13 18:09:48 +08:00
pub enum PacketBody {
Data(Vec<u8>),
2023-09-23 01:53:45 +00:00
HandShake(HandShake),
RoutePacket(RoutePacket),
Ping(u32),
Pong(u32),
2023-09-23 01:53:45 +00:00
TaRpc(u32, bool, Vec<u8>), // u32: service_id, bool: is_req, Vec<u8>: 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 Packet {
2024-03-13 00:15:22 +08:00
pub from_peer: PeerId,
pub to_peer: PeerId,
2023-09-23 01:53:45 +00:00
pub body: PacketBody,
}
impl Packet {
pub fn decode(v: &[u8]) -> &ArchivedPacket {
decode_from_bytes::<Packet>(v).unwrap()
}
}
impl From<Packet> for Bytes {
fn from(val: Packet) -> Self {
encode_to_bytes::<_, 4096>(&val)
}
}
impl Packet {
2024-03-13 00:15:22 +08:00
pub fn new_handshake(from_peer: PeerId, network: &NetworkIdentity) -> Self {
2023-09-23 01:53:45 +00:00
Packet {
from_peer: from_peer.into(),
2024-03-13 00:15:22 +08:00
to_peer: 0,
2024-03-13 18:09:48 +08:00
body: PacketBody::HandShake(HandShake {
2023-09-23 01:53:45 +00:00
magic: MAGIC,
2024-03-13 00:15:22 +08:00
my_peer_id: from_peer,
2023-09-23 01:53:45 +00:00
version: VERSION,
features: Vec::new(),
2024-03-06 20:59:17 +08:00
network_identity: network.clone().into(),
2024-03-13 18:09:48 +08:00
}),
2023-09-23 01:53:45 +00:00
}
}
2024-03-13 00:15:22 +08:00
pub fn new_data_packet(from_peer: PeerId, to_peer: PeerId, data: &[u8]) -> Self {
2023-09-23 01:53:45 +00:00
Packet {
2024-03-13 00:15:22 +08:00
from_peer,
to_peer,
2024-03-13 18:09:48 +08:00
body: PacketBody::Data(data.to_vec()),
2023-09-23 01:53:45 +00:00
}
}
2024-03-13 00:15:22 +08:00
pub fn new_route_packet(from_peer: PeerId, to_peer: PeerId, route_id: u8, data: &[u8]) -> Self {
2023-09-23 01:53:45 +00:00
Packet {
2024-03-13 00:15:22 +08:00
from_peer,
to_peer,
2024-03-13 18:09:48 +08:00
body: PacketBody::RoutePacket(RoutePacket {
2023-09-23 01:53:45 +00:00
route_id,
body: data.to_vec(),
2024-03-13 18:09:48 +08:00
}),
2023-09-23 01:53:45 +00:00
}
}
2024-03-13 00:15:22 +08:00
pub fn new_ping_packet(from_peer: PeerId, to_peer: PeerId, seq: u32) -> Self {
2023-09-23 01:53:45 +00:00
Packet {
2024-03-13 00:15:22 +08:00
from_peer,
to_peer,
2024-03-13 18:09:48 +08:00
body: PacketBody::Ping(seq),
2023-09-23 01:53:45 +00:00
}
}
2024-03-13 00:15:22 +08:00
pub fn new_pong_packet(from_peer: PeerId, to_peer: PeerId, seq: u32) -> Self {
2023-09-23 01:53:45 +00:00
Packet {
2024-03-13 00:15:22 +08:00
from_peer,
to_peer,
2024-03-13 18:09:48 +08:00
body: PacketBody::Pong(seq),
2023-09-23 01:53:45 +00:00
}
}
pub fn new_tarpc_packet(
2024-03-13 00:15:22 +08:00
from_peer: PeerId,
to_peer: PeerId,
2023-09-23 01:53:45 +00:00
service_id: u32,
is_req: bool,
body: Vec<u8>,
) -> Self {
Packet {
2024-03-13 00:15:22 +08:00
from_peer,
to_peer,
2024-03-13 18:09:48 +08:00
body: PacketBody::TaRpc(service_id, is_req, body),
2023-09-23 01:53:45 +00:00
}
}
}
#[cfg(test)]
mod tests {
2024-03-13 00:15:22 +08:00
use crate::common::new_peer_id;
2023-09-23 01:53:45 +00:00
use super::*;
#[tokio::test]
async fn serialize() {
let a = "abcde";
2024-03-13 00:15:22 +08:00
let out = Packet::new_data_packet(new_peer_id(), new_peer_id(), a.as_bytes());
2023-09-23 01:53:45 +00:00
// let out = T::new(a.as_bytes());
let out_bytes: Bytes = out.into();
println!("out str: {:?}", a.as_bytes());
println!("out bytes: {:?}", out_bytes);
let archived = Packet::decode(&out_bytes[..]);
println!("in packet: {:?}", archived);
}
}