ant_quic/discovery/
linux.rs1use netlink_packet_route::address::AddressMessage;
7use netlink_packet_route::link::LinkMessage;
8use netlink_sys::Socket;
9use std::collections::HashMap;
10use std::net::{IpAddr, SocketAddr};
11use std::time::{Duration, Instant};
12
13use super::{DiscoveryError, NetworkDiscovery, NetworkInterface};
14
15pub struct LinuxDiscovery {
17 cache: Option<InterfaceCache>,
19 cache_refresh_interval: Duration,
21}
22
23struct InterfaceCache {
25 interfaces: Vec<NetworkInterface>,
27 last_refresh: Instant,
29}
30
31impl LinuxDiscovery {
32 pub fn new(cache_refresh_interval: Duration) -> Self {
34 Self {
35 cache: None,
36 cache_refresh_interval,
37 }
38 }
39
40 fn refresh_cache_if_needed(&mut self) -> Result<(), DiscoveryError> {
42 let should_refresh = match &self.cache {
43 Some(cache) => cache.last_refresh.elapsed() >= self.cache_refresh_interval,
44 None => true,
45 };
46
47 if should_refresh {
48 self.refresh_cache()?;
49 }
50
51 Ok(())
52 }
53
54 fn refresh_cache(&mut self) -> Result<(), DiscoveryError> {
56 let interfaces = self.get_interfaces_from_system()?;
58
59 self.cache = Some(InterfaceCache {
60 interfaces,
61 last_refresh: Instant::now(),
62 });
63
64 Ok(())
65 }
66
67 fn get_interfaces_from_system(&self) -> Result<Vec<NetworkInterface>, DiscoveryError> {
69 Ok(Vec::new())
73 }
74}
75
76impl NetworkDiscovery for LinuxDiscovery {
77 fn discover_interfaces(&self) -> Result<Vec<NetworkInterface>, DiscoveryError> {
78 if let Some(cache) = &self.cache {
80 if cache.last_refresh.elapsed() < self.cache_refresh_interval {
81 return Ok(cache.interfaces.clone());
82 }
83 }
84
85 let mut this = self.clone();
87 this.refresh_cache()?;
88
89 match &this.cache {
91 Some(cache) => Ok(cache.interfaces.clone()),
92 None => Err(DiscoveryError::InternalError("Cache refresh failed".into())),
93 }
94 }
95
96 fn get_default_route(&self) -> Result<Option<SocketAddr>, DiscoveryError> {
97 Ok(None)
101 }
102}
103
104impl Clone for LinuxDiscovery {
105 fn clone(&self) -> Self {
106 Self {
107 cache: self.cache.clone(),
108 cache_refresh_interval: self.cache_refresh_interval,
109 }
110 }
111}
112
113impl Clone for InterfaceCache {
114 fn clone(&self) -> Self {
115 Self {
116 interfaces: self.interfaces.clone(),
117 last_refresh: self.last_refresh,
118 }
119 }
120}