ant_quic/discovery/
linux.rs1use std::collections::HashMap;
16use std::net::{IpAddr, SocketAddr};
17use std::time::{Duration, Instant};
18
19use super::{DiscoveryError, NetworkDiscovery, NetworkInterface};
20
21pub struct LinuxDiscovery {
23 cache: Option<InterfaceCache>,
25 cache_refresh_interval: Duration,
27}
28
29struct InterfaceCache {
31 interfaces: Vec<NetworkInterface>,
33 last_refresh: Instant,
35}
36
37impl LinuxDiscovery {
38 pub fn new(cache_refresh_interval: Duration) -> Self {
40 Self {
41 cache: None,
42 cache_refresh_interval,
43 }
44 }
45
46 fn refresh_cache_if_needed(&mut self) -> Result<(), DiscoveryError> {
48 let should_refresh = match &self.cache {
49 Some(cache) => cache.last_refresh.elapsed() >= self.cache_refresh_interval,
50 None => true,
51 };
52
53 if should_refresh {
54 self.refresh_cache()?;
55 }
56
57 Ok(())
58 }
59
60 fn refresh_cache(&mut self) -> Result<(), DiscoveryError> {
62 let interfaces = self.get_interfaces_from_system()?;
64
65 self.cache = Some(InterfaceCache {
66 interfaces,
67 last_refresh: Instant::now(),
68 });
69
70 Ok(())
71 }
72
73 fn get_interfaces_from_system(&self) -> Result<Vec<NetworkInterface>, DiscoveryError> {
75 Ok(Vec::new())
79 }
80}
81
82impl NetworkDiscovery for LinuxDiscovery {
83 fn discover_interfaces(&self) -> Result<Vec<NetworkInterface>, DiscoveryError> {
84 if let Some(cache) = &self.cache {
86 if cache.last_refresh.elapsed() < self.cache_refresh_interval {
87 return Ok(cache.interfaces.clone());
88 }
89 }
90
91 let mut this = self.clone();
93 this.refresh_cache_if_needed()?;
94
95 match &this.cache {
97 Some(cache) => Ok(cache.interfaces.clone()),
98 None => Err(DiscoveryError::InternalError("Cache refresh failed".into())),
99 }
100 }
101
102 fn get_default_route(&self) -> Result<Option<SocketAddr>, DiscoveryError> {
103 Ok(None)
107 }
108}
109
110impl Clone for LinuxDiscovery {
111 fn clone(&self) -> Self {
112 Self {
113 cache: self.cache.clone(),
114 cache_refresh_interval: self.cache_refresh_interval,
115 }
116 }
117}
118
119impl Clone for InterfaceCache {
120 fn clone(&self) -> Self {
121 Self {
122 interfaces: self.interfaces.clone(),
123 last_refresh: self.last_refresh,
124 }
125 }
126}