diff --git a/src/packet/common.rs b/src/packet/common.rs index 07522f2..b6fdbe9 100644 --- a/src/packet/common.rs +++ b/src/packet/common.rs @@ -73,7 +73,7 @@ impl<'a> Common<'a> { } } -#[derive(Debug, PartialEq, Serialize_repr, Deserialize_repr)] +#[derive(Debug, PartialEq, Serialize_repr, Deserialize_repr, Copy, Clone)] #[repr(u8)] pub enum PacketType { PKTInvalid, diff --git a/src/peer.rs b/src/peer.rs index f624a85..d97f969 100644 --- a/src/peer.rs +++ b/src/peer.rs @@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize}; use sqlx::prelude::FromRow; use std::default::Default; use std::sync::atomic::{AtomicU32, AtomicU64, AtomicU8, Ordering}; -use std::sync::Mutex; +use std::sync::RwLock; #[derive(Debug)] pub struct Peer { @@ -13,8 +13,8 @@ pub struct Peer { // 对端阶段的udp信息,包括ipv4地址和子网掩码位数 pub dev_addr: IpSubnet, // 对端对外开放的ip和端口信息 - pub sock: Mutex, - pub pub_key: Mutex>, + pub sock: RwLock, + pub pub_key: RwLock>, pub timeout: isize, @@ -27,10 +27,10 @@ pub struct Peer { // 最近一次合法时间 pub last_valid_timestamp: AtomicU64, - pub v6_info: Mutex, + pub v6_info: RwLock, // 该节点锁属的网络 - pub network_id: Mutex, + pub network_id: RwLock, } impl Peer { @@ -38,25 +38,25 @@ impl Peer { Self { // id: Mutex::new(id.to_string()), dev_addr: IpSubnet::new(0, 0), - sock: Mutex::new(SdlanSock { - family: 0, + sock: RwLock::new(SdlanSock { + family: AF_INET, port: 0, // has_v6: false, // v6_port: 0, v4: [0; 4], v6: [0; 16], }), - v6_info: Mutex::new(V6Info { + v6_info: RwLock::new(V6Info { port: 0, v6: [0; 16], }), - pub_key: Mutex::new(vec![]), + pub_key: RwLock::new(vec![]), timeout: 0, last_seen: AtomicU64::new(0), last_p2p: AtomicU64::new(0), last_send_query: AtomicU64::new(0), last_valid_timestamp: AtomicU64::new(0), - network_id: Mutex::new(String::new()), + network_id: RwLock::new(String::new()), } } } @@ -152,6 +152,7 @@ pub struct SdlanSock { use std::borrow::Cow; use std::sync::Arc; +use crate::config::AF_INET; use crate::utils::SDLanError; pub struct PeerMap { pub peers: DashMap>, @@ -207,7 +208,7 @@ impl PeerMap { pub fn find_peer_by_sock(&self, sock: &SdlanSock) -> Option> { for k in self.peers.iter() { - let itersock = k.value().sock.lock().unwrap(); + let itersock = k.value().sock.read().unwrap(); if itersock.family == sock.family && itersock.port == sock.port && itersock.v4 == sock.v4 @@ -233,14 +234,14 @@ mod test { let pm = PeerMap::new(); let mut p = Peer::new(); { - let mut sl = p.sock.lock().unwrap(); + let mut sl = p.sock.write().unwrap(); sl.family = AF_INET; sl.v4 = [1; 4]; sl.port = 20; } pm.insert_peer(&id, Arc::new(p)); if let Some(p2) = pm.find_peer_by_id(&id) { - let pl = p2.sock.lock().unwrap(); + let pl = p2.sock.read().unwrap(); assert_eq!(pl.family, crate::config::AF_INET); assert_eq!(pl.port, 20); assert_eq!(pl.v4, [1; 4]); @@ -256,7 +257,7 @@ mod test { v4: [1; 4], v6: [1; 16], }) { - let pl = p3.sock.lock().unwrap(); + let pl = p3.sock.read().unwrap(); assert_eq!(pl.family, AF_INET); assert_eq!(pl.port, 20); assert_eq!(pl.v4, [1; 4]);