rust_p2p_core/route/
mod.rs1use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4};
2
3pub mod route_table;
4
5pub const DEFAULT_RTT: u32 = 9999;
6
7use crate::tunnel::udp::UDPIndex;
8#[non_exhaustive]
9#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug)]
10pub enum Index {
11 Udp(UDPIndex),
12 Tcp(usize),
13}
14impl Index {
15 pub fn index(&self) -> usize {
16 match self {
17 Index::Udp(index) => index.index(),
18 Index::Tcp(index) => *index,
19 }
20 }
21 pub fn protocol(&self) -> ConnectProtocol {
22 match self {
23 Index::Tcp(_) => ConnectProtocol::TCP,
24 Index::Udp(_) => ConnectProtocol::UDP,
25 }
26 }
27}
28#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug)]
29pub struct RouteKey {
30 index: Index,
31 addr: SocketAddr,
32}
33impl Default for RouteKey {
34 fn default() -> Self {
35 Self {
36 index: Index::Tcp(0),
37 addr: SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, 0)),
38 }
39 }
40}
41impl RouteKey {
42 pub(crate) const fn new(index: Index, addr: SocketAddr) -> Self {
43 Self { index, addr }
44 }
45 #[inline]
46 pub fn protocol(&self) -> ConnectProtocol {
47 self.index.protocol()
48 }
49 #[inline]
50 pub fn index(&self) -> Index {
51 self.index
52 }
53 #[inline]
54 pub fn index_usize(&self) -> usize {
55 self.index.index()
56 }
57 #[inline]
58 pub fn addr(&self) -> SocketAddr {
59 self.addr
60 }
61}
62#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug)]
63pub struct RouteSortKey {
64 metric: u8,
65 rtt: u32,
66}
67
68#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
69pub enum ConnectProtocol {
70 UDP,
71 TCP,
72}
73impl ConnectProtocol {
74 #[inline]
75 pub fn is_tcp(&self) -> bool {
76 self == &ConnectProtocol::TCP
77 }
78 #[inline]
79 pub fn is_udp(&self) -> bool {
80 self == &ConnectProtocol::UDP
81 }
82}