mirror of
https://github.com/EasyTier/EasyTier.git
synced 2026-05-13 17:35:37 +00:00
8f862997eb
* feat: support allocating public IPv6 addresses from a provider Add a provider/leaser architecture for public IPv6 address allocation between nodes in the same network: - A node with `--ipv6-public-addr-provider` advertises a delegable public IPv6 prefix (auto-detected from kernel routes or manually configured via `--ipv6-public-addr-prefix`). - Other nodes with `--ipv6-public-addr-auto` request a /128 lease from the selected provider via a new RPC service (PublicIpv6AddrRpc). - Leases have a 30s TTL, renewed every 10s by the client routine. - The provider allocates addresses deterministically from its prefix using instance-UUID-based hashing to prefer stable assignments. - Routes to peer leases are installed on the TUN device, and each client's own /128 is assigned as its IPv6 address. Also includes netlink IPv6 route table inspection, integration tests, and event-driven route/address reconciliation. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
74 lines
1.9 KiB
Rust
74 lines
1.9 KiB
Rust
mod graph_algo;
|
|
|
|
pub mod acl_filter;
|
|
pub mod credential_manager;
|
|
pub mod peer;
|
|
pub mod peer_conn;
|
|
pub mod peer_conn_ping;
|
|
pub mod peer_manager;
|
|
pub mod peer_map;
|
|
pub mod peer_ospf_route;
|
|
pub mod peer_rpc;
|
|
pub mod peer_rpc_service;
|
|
pub mod peer_session;
|
|
pub(crate) mod public_ipv6;
|
|
pub mod relay_peer_map;
|
|
pub mod route_trait;
|
|
pub mod rpc_service;
|
|
mod traffic_metrics;
|
|
|
|
pub mod foreign_network_client;
|
|
pub mod foreign_network_manager;
|
|
|
|
pub mod encrypt;
|
|
pub(crate) mod secure_datagram;
|
|
|
|
pub mod peer_task;
|
|
|
|
#[cfg(test)]
|
|
pub mod tests;
|
|
|
|
use crate::tunnel::packet_def::ZCPacket;
|
|
|
|
#[async_trait::async_trait]
|
|
#[auto_impl::auto_impl(Arc)]
|
|
pub trait PeerPacketFilter {
|
|
async fn try_process_packet_from_peer(&self, _zc_packet: ZCPacket) -> Option<ZCPacket> {
|
|
Some(_zc_packet)
|
|
}
|
|
}
|
|
|
|
#[async_trait::async_trait]
|
|
#[auto_impl::auto_impl(Arc)]
|
|
pub trait NicPacketFilter {
|
|
async fn try_process_packet_from_nic(&self, data: &mut ZCPacket) -> bool;
|
|
|
|
fn id(&self) -> String {
|
|
format!("{:p}", self)
|
|
}
|
|
}
|
|
|
|
type BoxPeerPacketFilter = Box<dyn PeerPacketFilter + Send + Sync>;
|
|
type BoxNicPacketFilter = Box<dyn NicPacketFilter + Send + Sync>;
|
|
|
|
// pub type PacketRecvChan = tachyonix::Sender<ZCPacket>;
|
|
// pub type PacketRecvChanReceiver = tachyonix::Receiver<ZCPacket>;
|
|
// pub fn create_packet_recv_chan() -> (PacketRecvChan, PacketRecvChanReceiver) {
|
|
// tachyonix::channel(128)
|
|
// }
|
|
pub type PacketRecvChan = tokio::sync::mpsc::Sender<ZCPacket>;
|
|
pub type PacketRecvChanReceiver = tokio::sync::mpsc::Receiver<ZCPacket>;
|
|
pub fn create_packet_recv_chan() -> (PacketRecvChan, PacketRecvChanReceiver) {
|
|
tokio::sync::mpsc::channel(128)
|
|
}
|
|
pub async fn recv_packet_from_chan(
|
|
packet_recv_chan_receiver: &mut PacketRecvChanReceiver,
|
|
) -> Result<ZCPacket, anyhow::Error> {
|
|
packet_recv_chan_receiver
|
|
.recv()
|
|
.await
|
|
.ok_or(anyhow::anyhow!("recv_packet_from_chan failed"))
|
|
}
|
|
|
|
pub const PUBLIC_SERVER_HOSTNAME_PREFIX: &str = "PublicServer_";
|