ipv6 p2p is ok
This commit is contained in:
parent
c098a3c421
commit
240a3d263e
3
Makefile
3
Makefile
@ -14,6 +14,9 @@ pb:
|
|||||||
cargo run --bin build_pb
|
cargo run --bin build_pb
|
||||||
mv src/pb/_.rs src/pb/message.rs
|
mv src/pb/_.rs src/pb/message.rs
|
||||||
|
|
||||||
|
libtun-so-clang:
|
||||||
|
cd src/network && clang -fPIC -shared -o libtuntap.so tuntap.c && cd -
|
||||||
|
|
||||||
libtun-so:
|
libtun-so:
|
||||||
cd src/network && gcc -fPIC -shared -o libtuntap.so tuntap.c && cd -
|
cd src/network && gcc -fPIC -shared -o libtuntap.so tuntap.c && cd -
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
use sdlan_sn_rs::utils::Mac;
|
use sdlan_sn_rs::utils::Mac;
|
||||||
|
|
||||||
pub const REGISTER_INTERVAL: u8 = 20;
|
pub const REGISTER_INTERVAL: u8 = 3;
|
||||||
pub const REGISTER_SUPER_INTERVAL: u16 = 20;
|
pub const REGISTER_SUPER_INTERVAL: u16 = 20;
|
||||||
|
|
||||||
pub const MULITCAST_V4: [u8; 4] = [224, 0, 0, 69];
|
pub const MULITCAST_V4: [u8; 4] = [224, 0, 0, 69];
|
||||||
|
|||||||
@ -12,7 +12,7 @@ use crate::pb::{
|
|||||||
encode_to_tcp_message, encode_to_udp_message, SdlDevAddr, SdlRegisterSuper,
|
encode_to_tcp_message, encode_to_udp_message, SdlDevAddr, SdlRegisterSuper,
|
||||||
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, NatType, PacketType, SdlanTcp};
|
||||||
use crate::utils::{send_to_sock, CommandLine};
|
use crate::utils::{send_to_sock, CommandLine};
|
||||||
use crate::ConnectionState;
|
use crate::ConnectionState;
|
||||||
use sdlan_sn_rs::config::AF_INET;
|
use sdlan_sn_rs::config::AF_INET;
|
||||||
@ -212,11 +212,18 @@ async fn handle_tcp_event(edge: &'static Node, eventtype: EventType, eventprotob
|
|||||||
Err(_e) => NULL_MAC,
|
Err(_e) => NULL_MAC,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let remote_nat_byte = reg.nat_type as u8;
|
||||||
|
let remote_nat = match remote_nat_byte.try_into() {
|
||||||
|
Ok(t) => t,
|
||||||
|
Err(_) => NatType::NoNat,
|
||||||
|
};
|
||||||
|
|
||||||
check_peer_registration_needed(
|
check_peer_registration_needed(
|
||||||
edge,
|
edge,
|
||||||
true,
|
false,
|
||||||
dst_mac,
|
dst_mac,
|
||||||
// &v6_sock,
|
// &v6_sock,
|
||||||
|
remote_nat,
|
||||||
&v6_sock,
|
&v6_sock,
|
||||||
&SdlanSock {
|
&SdlanSock {
|
||||||
family: AF_INET,
|
family: AF_INET,
|
||||||
@ -493,29 +500,28 @@ pub async fn loop_socket_v4(
|
|||||||
is_multicast_sock: bool,
|
is_multicast_sock: bool,
|
||||||
) {
|
) {
|
||||||
debug!("loop sock v4");
|
debug!("loop sock v4");
|
||||||
|
let cancel_clone = cancel.clone();
|
||||||
|
tokio::spawn(async move {
|
||||||
|
loop {
|
||||||
|
tokio::select! {
|
||||||
|
_ = cancel_clone.cancelled() => {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
_ = tokio::time::sleep(Duration::from_secs(10)) => {
|
||||||
|
if !is_multicast_sock {
|
||||||
|
send_stun_request(eee).await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
loop {
|
loop {
|
||||||
tokio::select! {
|
tokio::select! {
|
||||||
_ = cancel.cancelled() => {
|
_ = cancel.cancelled() => {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
_ = read_and_parse_packet(eee, socket, Some(Duration::from_secs(10)), is_multicast_sock) => { }
|
_ = read_and_parse_packet(eee, socket, Some(Duration::from_secs(10)), is_multicast_sock) => { }
|
||||||
_ = tokio::time::sleep(Duration::from_secs(10)) => {
|
|
||||||
if !is_multicast_sock {
|
|
||||||
send_stun_request(eee).await;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
let req = SdlStunRequest {
|
|
||||||
cookie: 0,
|
|
||||||
client_id: eee.config.node_uuid.clone(),
|
|
||||||
network_id: eee.network_id.load(Ordering::Relaxed),
|
|
||||||
ip: eee.device_config.get_ip(),
|
|
||||||
nat_type: 0,
|
|
||||||
};
|
|
||||||
let msg = encode_to_udp_message(Some(req), PacketType::StunRequest as u8).unwrap();
|
|
||||||
if let Err(e) = send_to_sock(eee, &msg, &eee.config.super_nodes[eee.config.super_node_index.load(Ordering::Relaxed) as usize]).await {
|
|
||||||
error!("failed to send to sock: {:?}", e);
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
debug!("loop_socket_v4 exited");
|
debug!("loop_socket_v4 exited");
|
||||||
@ -633,6 +639,7 @@ async fn find_peer_destination(eee: &'static Node, dst_mac: Mac) -> (SdlanSock,
|
|||||||
let now = get_current_timestamp();
|
let now = get_current_timestamp();
|
||||||
if now - dst.last_p2p.load(Ordering::Relaxed) >= ((dst.timeout / 2) as u64) {
|
if now - dst.last_p2p.load(Ordering::Relaxed) >= ((dst.timeout / 2) as u64) {
|
||||||
// too much time elapsed since we saw the peer, need to register again
|
// too much time elapsed since we saw the peer, need to register again
|
||||||
|
error!("last p2p is too old, deleting from known_peers");
|
||||||
eee.known_peers.delete_peer_with_mac(&dst_mac);
|
eee.known_peers.delete_peer_with_mac(&dst_mac);
|
||||||
result = eee.config.super_nodes
|
result = eee.config.super_nodes
|
||||||
[eee.config.super_node_index.load(Ordering::Relaxed) as usize]
|
[eee.config.super_node_index.load(Ordering::Relaxed) as usize]
|
||||||
|
|||||||
@ -10,10 +10,7 @@ use tokio::{net::UdpSocket, sync::mpsc::Receiver};
|
|||||||
use tokio_util::sync::CancellationToken;
|
use tokio_util::sync::CancellationToken;
|
||||||
use tracing::error;
|
use tracing::error;
|
||||||
|
|
||||||
use crate::{
|
use crate::{network::loop_socket_v6, utils::Socket};
|
||||||
network::{loop_socket_v4, loop_socket_v6},
|
|
||||||
utils::Socket,
|
|
||||||
};
|
|
||||||
|
|
||||||
use super::Node;
|
use super::Node;
|
||||||
|
|
||||||
@ -21,11 +18,16 @@ pub async fn run_ipv6(edge: &'static Node, mut v6_may_change: Receiver<bool>) {
|
|||||||
v6_may_change.recv().await;
|
v6_may_change.recv().await;
|
||||||
loop {
|
loop {
|
||||||
tokio::time::sleep(Duration::from_secs(1)).await;
|
tokio::time::sleep(Duration::from_secs(1)).await;
|
||||||
let ipv6 = get_current_ipv6();
|
let mut ipv6 = get_current_ipv6();
|
||||||
if ipv6.is_none() {
|
if ipv6.is_none() {
|
||||||
v6_may_change.recv().await;
|
tokio::time::sleep(Duration::from_secs(5)).await;
|
||||||
continue;
|
ipv6 = get_current_ipv6();
|
||||||
|
if ipv6.is_none() {
|
||||||
|
v6_may_change.recv().await;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
// ipv6 is not none
|
||||||
let ipv6 = ipv6.unwrap();
|
let ipv6 = ipv6.unwrap();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@ -513,8 +513,8 @@ impl PeerMap {
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn delete_peer_with_mac(&self, mac: &Mac) {
|
pub fn delete_peer_with_mac(&self, mac: &Mac) -> Option<(Mac, Arc<EdgePeer>)> {
|
||||||
self.peers.remove(mac);
|
self.peers.remove(mac)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn insert_peer(&self, mac: Mac, p: Arc<EdgePeer>) {
|
pub fn insert_peer(&self, mac: Mac, p: Arc<EdgePeer>) {
|
||||||
@ -552,7 +552,7 @@ impl NodeStats {
|
|||||||
|
|
||||||
use sdlan_sn_rs::peer::SdlanSock;
|
use sdlan_sn_rs::peer::SdlanSock;
|
||||||
|
|
||||||
use crate::config::{self, MULTICAST_PORT, REGISTER_INTERVAL};
|
use crate::config::{self, MULTICAST_PORT, REGISTER_INTERVAL, REGISTER_SUPER_INTERVAL};
|
||||||
pub struct NodeConfig {
|
pub struct NodeConfig {
|
||||||
// node name
|
// node name
|
||||||
pub name: String,
|
pub name: String,
|
||||||
@ -641,7 +641,7 @@ impl EdgePeer {
|
|||||||
dev_addr: IpSubnet::new(net_addr, net_bit_len),
|
dev_addr: IpSubnet::new(net_addr, net_bit_len),
|
||||||
sock: RwLock::new(sock.deepcopy()),
|
sock: RwLock::new(sock.deepcopy()),
|
||||||
_v6_info: RwLock::new(v6_info),
|
_v6_info: RwLock::new(v6_info),
|
||||||
timeout: REGISTER_INTERVAL,
|
timeout: REGISTER_SUPER_INTERVAL as u8,
|
||||||
last_p2p: AtomicU64::new(0),
|
last_p2p: AtomicU64::new(0),
|
||||||
last_seen: AtomicU64::new(0),
|
last_seen: AtomicU64::new(0),
|
||||||
_last_valid_timestamp: AtomicU64::new(now),
|
_last_valid_timestamp: AtomicU64::new(now),
|
||||||
|
|||||||
@ -13,6 +13,7 @@ use crate::{
|
|||||||
utils::{send_to_sock, Socket},
|
utils::{send_to_sock, Socket},
|
||||||
};
|
};
|
||||||
use etherparse::Ethernet2Header;
|
use etherparse::Ethernet2Header;
|
||||||
|
use num_enum::TryFromPrimitive;
|
||||||
use prost::Message;
|
use prost::Message;
|
||||||
use sdlan_sn_rs::utils::BROADCAST_MAC;
|
use sdlan_sn_rs::utils::BROADCAST_MAC;
|
||||||
use sdlan_sn_rs::{
|
use sdlan_sn_rs::{
|
||||||
@ -123,7 +124,15 @@ pub async fn handle_packet(eee: &'static Node, addr: SocketAddr, buf: &[u8]) ->
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
if data.is_p2p {
|
if data.is_p2p {
|
||||||
check_peer_registration_needed(eee, !data.is_p2p, src_mac, &None, &from_sock).await;
|
check_peer_registration_needed(
|
||||||
|
eee,
|
||||||
|
!data.is_p2p,
|
||||||
|
src_mac,
|
||||||
|
NatType::NoNat,
|
||||||
|
&None,
|
||||||
|
&from_sock,
|
||||||
|
)
|
||||||
|
.await;
|
||||||
}
|
}
|
||||||
handle_tun_packet(eee, &from_sock, !data.is_p2p, data).await;
|
handle_tun_packet(eee, &from_sock, !data.is_p2p, data).await;
|
||||||
}
|
}
|
||||||
@ -293,7 +302,7 @@ pub async fn handle_packet_peer_info(
|
|||||||
if v6_port != 0 {
|
if v6_port != 0 {
|
||||||
v6_info = Some(V6Info { port: v6_port, v6 })
|
v6_info = Some(V6Info { port: v6_port, v6 })
|
||||||
}
|
}
|
||||||
send_register(eee, &sock, dst_mac, &v6_info).await;
|
send_register(eee, remote_nat, &sock, dst_mac, &v6_info).await;
|
||||||
|
|
||||||
// register_with_local_peers(eee).await;
|
// register_with_local_peers(eee).await;
|
||||||
}
|
}
|
||||||
@ -451,10 +460,17 @@ async fn handle_packet_register(
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut remote_nat = NatType::NoNat;
|
||||||
if !from_sn {
|
if !from_sn {
|
||||||
info!("[P2P] Rx REGISTER from {}", sender_sock.to_string());
|
info!(
|
||||||
eee.pending_peers.delete_peer_with_mac(&src_mac);
|
"[P2P] Rx REGISTER from {}, deleting from pending",
|
||||||
|
sender_sock.to_string()
|
||||||
|
);
|
||||||
|
if let Some((_, v)) = eee.pending_peers.delete_peer_with_mac(&src_mac) {
|
||||||
|
remote_nat = v.get_nat_type();
|
||||||
|
}
|
||||||
send_register_ack(eee, origin_sender, ®).await;
|
send_register_ack(eee, origin_sender, ®).await;
|
||||||
|
info!("sent back REGISTERACK");
|
||||||
} else {
|
} else {
|
||||||
info!(
|
info!(
|
||||||
"[PsP] Rx REGISTER from {} [{}] to {} via {}",
|
"[PsP] Rx REGISTER from {} [{}] to {} via {}",
|
||||||
@ -465,7 +481,7 @@ async fn handle_packet_register(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
// check_peer_registration_needed(eee, from_sn, reg.src_ip, &None, origin_sender).await;
|
// check_peer_registration_needed(eee, from_sn, reg.src_ip, &None, origin_sender).await;
|
||||||
check_peer_registration_needed(eee, from_sn, src_mac, &None, origin_sender).await;
|
check_peer_registration_needed(eee, from_sn, src_mac, remote_nat, &None, origin_sender).await;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -523,6 +539,7 @@ pub async fn check_peer_registration_needed(
|
|||||||
eee: &'static Node,
|
eee: &'static Node,
|
||||||
from_sn: bool,
|
from_sn: bool,
|
||||||
src_mac: Mac,
|
src_mac: Mac,
|
||||||
|
remote_nat: NatType,
|
||||||
_v6_info: &Option<V6Info>,
|
_v6_info: &Option<V6Info>,
|
||||||
peer_sock: &SdlanSock,
|
peer_sock: &SdlanSock,
|
||||||
) {
|
) {
|
||||||
@ -535,7 +552,9 @@ pub async fn check_peer_registration_needed(
|
|||||||
}
|
}
|
||||||
match p {
|
match p {
|
||||||
None => {
|
None => {
|
||||||
let _ = register_with_new_peer(eee, from_sn, src_mac, _v6_info, peer_sock).await;
|
debug!("check peer registration needed, not found in known peers");
|
||||||
|
let _ = register_with_new_peer(eee, from_sn, src_mac, _v6_info, remote_nat, peer_sock)
|
||||||
|
.await;
|
||||||
// unimplemented!();
|
// unimplemented!();
|
||||||
}
|
}
|
||||||
Some(k) => {
|
Some(k) => {
|
||||||
@ -553,7 +572,7 @@ pub async fn check_peer_registration_needed(
|
|||||||
}
|
}
|
||||||
let last_seen = k.last_seen.load(Ordering::Relaxed);
|
let last_seen = k.last_seen.load(Ordering::Relaxed);
|
||||||
// more than 3 seconds
|
// more than 3 seconds
|
||||||
if now - last_seen > 1 {
|
if now - last_seen > 3 {
|
||||||
check_known_peer_sock_change(eee, from_sn, src_mac, peer_sock, now, ipv4_to_ipv6)
|
check_known_peer_sock_change(eee, from_sn, src_mac, peer_sock, now, ipv4_to_ipv6)
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
@ -585,7 +604,9 @@ async fn check_known_peer_sock_change(
|
|||||||
peersock.to_string()
|
peersock.to_string()
|
||||||
);
|
);
|
||||||
eee.known_peers.delete_peer_with_mac(&mac);
|
eee.known_peers.delete_peer_with_mac(&mac);
|
||||||
register_with_new_peer(eee, from_sn, mac, &None, peersock).await;
|
error!("known peers is deleted");
|
||||||
|
let remote_nat = p.get_nat_type();
|
||||||
|
register_with_new_peer(eee, from_sn, mac, &None, remote_nat, peersock).await;
|
||||||
} else {
|
} else {
|
||||||
// from sn, sn could see a different sock with us, just ignore it
|
// from sn, sn could see a different sock with us, just ignore it
|
||||||
}
|
}
|
||||||
@ -604,6 +625,7 @@ async fn register_with_new_peer(
|
|||||||
mac: Mac,
|
mac: Mac,
|
||||||
v6_info: &Option<V6Info>,
|
v6_info: &Option<V6Info>,
|
||||||
// dev_addr: &IpSubnet,
|
// dev_addr: &IpSubnet,
|
||||||
|
remote_nat: NatType,
|
||||||
peersock: &SdlanSock,
|
peersock: &SdlanSock,
|
||||||
) {
|
) {
|
||||||
let now = get_current_timestamp();
|
let now = get_current_timestamp();
|
||||||
@ -632,10 +654,11 @@ async fn register_with_new_peer(
|
|||||||
if eee.config.register_ttl == 1 {
|
if eee.config.register_ttl == 1 {
|
||||||
/* We are DMZ host or port is directly accessible. Just let peer to send back the ack */
|
/* We are DMZ host or port is directly accessible. Just let peer to send back the ack */
|
||||||
} else if eee.config.register_ttl > 1 {
|
} else if eee.config.register_ttl > 1 {
|
||||||
|
/*
|
||||||
let mut alter = 16;
|
let mut alter = 16;
|
||||||
if let Ok(ttl) = eee.udp_sock_v4.ttl() {
|
if let Ok(ttl) = eee.udp_sock_v4.ttl() {
|
||||||
let mut temp = peersock.deepcopy();
|
let mut temp = peersock.deepcopy();
|
||||||
send_register(eee, &temp, mac, v6_info).await;
|
send_register(eee, remote_nat, &temp, mac, v6_info).await;
|
||||||
|
|
||||||
let _ = eee.udp_sock_v4.set_ttl(eee.config.register_ttl as u32);
|
let _ = eee.udp_sock_v4.set_ttl(eee.config.register_ttl as u32);
|
||||||
while alter > 0 {
|
while alter > 0 {
|
||||||
@ -645,13 +668,15 @@ async fn register_with_new_peer(
|
|||||||
}
|
}
|
||||||
let _ = eee.udp_sock_v4.set_ttl(ttl);
|
let _ = eee.udp_sock_v4.set_ttl(ttl);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
} else {
|
} else {
|
||||||
// Normal STUN
|
// Normal STUN
|
||||||
send_register(eee, peersock, mac, v6_info).await;
|
send_register(eee, remote_nat, peersock, mac, v6_info).await;
|
||||||
}
|
}
|
||||||
// 发送给sn
|
// 发送给sn
|
||||||
send_register(
|
send_register(
|
||||||
eee,
|
eee,
|
||||||
|
remote_nat,
|
||||||
&eee.config.super_nodes
|
&eee.config.super_nodes
|
||||||
[eee.config.super_node_index.load(Ordering::Relaxed) as usize],
|
[eee.config.super_node_index.load(Ordering::Relaxed) as usize],
|
||||||
mac,
|
mac,
|
||||||
@ -660,7 +685,7 @@ async fn register_with_new_peer(
|
|||||||
.await;
|
.await;
|
||||||
} else {
|
} else {
|
||||||
// P2P register, send directly
|
// P2P register, send directly
|
||||||
send_register(eee, peersock, mac, v6_info).await;
|
send_register(eee, remote_nat, peersock, mac, v6_info).await;
|
||||||
}
|
}
|
||||||
register_with_local_peers(eee).await;
|
register_with_local_peers(eee).await;
|
||||||
} else {
|
} else {
|
||||||
@ -675,10 +700,23 @@ async fn register_with_new_peer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn register_with_local_peers(eee: &'static Node) {
|
async fn register_with_local_peers(eee: &'static Node) {
|
||||||
send_register(eee, &eee.multicast_sock, BROADCAST_MAC, &None).await;
|
send_register(
|
||||||
|
eee,
|
||||||
|
NatType::NoNat,
|
||||||
|
&eee.multicast_sock,
|
||||||
|
BROADCAST_MAC,
|
||||||
|
&None,
|
||||||
|
)
|
||||||
|
.await;
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn send_register(eee: &'static Node, sock: &SdlanSock, mac: Mac, _v6_info: &Option<V6Info>) {
|
async fn send_register(
|
||||||
|
eee: &'static Node,
|
||||||
|
remote_nat: NatType,
|
||||||
|
sock: &SdlanSock,
|
||||||
|
mac: Mac,
|
||||||
|
_v6_info: &Option<V6Info>,
|
||||||
|
) {
|
||||||
if !eee.config.allow_p2p {
|
if !eee.config.allow_p2p {
|
||||||
debug!("skipping register as p2p is disabled");
|
debug!("skipping register as p2p is disabled");
|
||||||
return;
|
return;
|
||||||
@ -715,6 +753,26 @@ async fn send_register(eee: &'static Node, sock: &SdlanSock, mac: Mac, _v6_info:
|
|||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut need_guess_port = false;
|
||||||
|
match self_nat {
|
||||||
|
NatType::PortRestricted => {
|
||||||
|
if let NatType::Symmetric = remote_nat {
|
||||||
|
need_guess_port = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NatType::Symmetric => {
|
||||||
|
if let NatType::PortRestricted = remote_nat {
|
||||||
|
need_guess_port = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_other => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
if need_guess_port {
|
||||||
|
println!("need guess port");
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
let mut target_sock_v4 = sock.deepcopy();
|
let mut target_sock_v4 = sock.deepcopy();
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
@ -1005,8 +1063,8 @@ fn peer_set_p2p_confirmed(eee: &Node, src_mac: Mac, sender_sock: &SdlanSock) {
|
|||||||
"P2P connection established: {} [{}]",
|
"P2P connection established: {} [{}]",
|
||||||
&mac_string, &sock_string,
|
&mac_string, &sock_string,
|
||||||
);
|
);
|
||||||
debug!("==> new peer: {} -> {}", &mac_string, &sock_string,);
|
|
||||||
eee.known_peers.insert_peer(src_mac, scan);
|
eee.known_peers.insert_peer(src_mac, scan);
|
||||||
|
debug!("==> new peer: {} -> {}", &mac_string, &sock_string,);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn check_query_peer_info(eee: &'static Node, mac: Mac) {
|
pub async fn check_query_peer_info(eee: &'static Node, mac: Mac) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user