use crate::proto::node::TlsDomain;
use citadel_types::proto::SessionSecuritySettings;
use citadel_types::proto::UdpMode;
use citadel_wire::nat_identification::NatType;
use serde::{Deserialize, Serialize};
use std::net::SocketAddr;
#[derive(Clone, Serialize, Deserialize, Debug)]
pub enum KeyExchangeProcess {
Stage0(Vec<u8>, SessionSecuritySettings, UdpMode),
Stage1(Vec<u8>, Option<PeerNatInfo>, bool),
Stage2(i64, Option<PeerNatInfo>, bool),
HolePunchFailed,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct PeerNatInfo {
pub peer_remote_addr_visible_from_server: SocketAddr,
pub peer_nat: NatType,
pub tls_domain: TlsDomain,
}
impl PeerNatInfo {
pub fn generate_proper_listener_connect_addr(
&self,
local_nat_type: &NatType,
) -> (bool, SocketAddr) {
let predicted_addr = self.peer_remote_addr_visible_from_server;
let needs_turn = !self.peer_nat.stun_compatible(local_nat_type);
(needs_turn, predicted_addr)
}
}