Commit 02909afa authored by nanamicat's avatar nanamicat

learn

parent 35667ab5
Pipeline #42433 passed with stages
in 56 seconds
...@@ -3,7 +3,7 @@ use crate::data::Router as RouterData; ...@@ -3,7 +3,7 @@ use crate::data::Router as RouterData;
use crate::protocol::{Hello, MessageType, Uplink}; use crate::protocol::{Hello, MessageType, Uplink};
use crate::router::Router; use crate::router::Router;
use crate::server::Server; use crate::server::Server;
use crate::settings::{Settings, INTERVAL, TIMEOUT}; use crate::settings::{Settings, INTERVAL, LEARN};
use config::Config; use config::Config;
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::fs; use std::fs;
...@@ -85,7 +85,7 @@ async fn main() -> anyhow::Result<()> { ...@@ -85,7 +85,7 @@ async fn main() -> anyhow::Result<()> {
id: config.id, id: config.id,
action: if server.online {MessageType::Update} else {MessageType::Query}, action: if server.online {MessageType::Update} else {MessageType::Query},
version: server.version, version: server.version,
peers: if now.duration_since(start) < TIMEOUT { Default::default() } else { connections peers: if now.duration_since(start) < LEARN { Default::default() } else { connections
.iter() .iter()
.filter(|(_, to)| to.contains_key(&config.id)) .filter(|(_, to)| to.contains_key(&config.id))
.map(|(from,_)|routers.get_mut(from).unwrap().update(now, start)) .map(|(from,_)|routers.get_mut(from).unwrap().update(now, start))
......
use crate::data::Router as RouterData; use crate::data::Router as RouterData;
use crate::protocol::{Hello, PeerQuality}; use crate::protocol::{Hello, PeerQuality};
use crate::settings::{Settings, INTERVAL, TIMEOUT}; use crate::settings::{Settings, INTERVAL};
use saturating_cast::SaturatingCast; use saturating_cast::SaturatingCast;
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use std::net::{IpAddr, Ipv4Addr, SocketAddr};
...@@ -75,15 +75,15 @@ impl Router { ...@@ -75,15 +75,15 @@ impl Router {
let max = now.duration_since(start).div_duration_f32(INTERVAL) as u32; let max = now.duration_since(start).div_duration_f32(INTERVAL) as u32;
let reliability = if max < 64 { (reliability as u32 * 64 / max) as u8 } else { reliability }; let reliability = if max < 64 { (reliability as u32 * 64 / max) as u8 } else { reliability };
let duration = now.duration_since(self.local_time); let duration = now.duration_since(self.local_time).div_duration_f32(INTERVAL) as u32;
if duration > TIMEOUT { if duration > 64 {
self.receive = 0; self.receive = 0;
Default::default() Default::default()
} else { } else {
PeerQuality { PeerQuality {
delay: self.delay.saturating_cast(), delay: self.delay.saturating_cast(),
jitter: self.jitter.saturating_cast(), jitter: self.jitter.saturating_cast(),
reliability: reliability.saturating_sub((duration.div_duration_f32(INTERVAL) as u8).saturating_sub(1)), reliability: reliability.saturating_sub((duration as u8).saturating_sub(1)),
} }
} }
} else { } else {
......
use hickory_resolver::Resolver;
use hickory_resolver::name_server::GenericConnector; use hickory_resolver::name_server::GenericConnector;
use hickory_resolver::proto::runtime::TokioRuntimeProvider; use hickory_resolver::proto::runtime::TokioRuntimeProvider;
use hickory_resolver::Resolver;
use netlink_packet_route::route::RouteProtocol; use netlink_packet_route::route::RouteProtocol;
use serde::Deserialize; use serde::Deserialize;
use std::net::SocketAddr; use std::net::SocketAddr;
...@@ -11,11 +11,6 @@ pub struct Settings { ...@@ -11,11 +11,6 @@ pub struct Settings {
pub id: u8, pub id: u8,
pub server: Endpoint, pub server: Endpoint,
pub bind: SocketAddr, pub bind: SocketAddr,
// pub TIMEOUT: u32,
// pub history: usize,
// pub INTERVAL: u64,
// pub table: u16,
// pub proto: u16,
} }
#[derive(Deserialize)] #[derive(Deserialize)]
...@@ -34,9 +29,7 @@ impl TryFrom<String> for Endpoint { ...@@ -34,9 +29,7 @@ impl TryFrom<String> for Endpoint {
return Err(format!("Invalid endpoint format: {}", value)); return Err(format!("Invalid endpoint format: {}", value));
} }
let port = parts[0] let port = parts[0].parse::<u16>().map_err(|e| format!("Invalid port: {}", e))?;
.parse::<u16>()
.map_err(|e| format!("Invalid port: {}", e))?;
let host = parts[1].to_string(); let host = parts[1].to_string();
Ok(Endpoint { host, port }) Ok(Endpoint { host, port })
...@@ -44,19 +37,13 @@ impl TryFrom<String> for Endpoint { ...@@ -44,19 +37,13 @@ impl TryFrom<String> for Endpoint {
} }
impl Endpoint { impl Endpoint {
pub async fn to_socket_addrs( pub async fn to_socket_addrs(&self, resolver: &Resolver<GenericConnector<TokioRuntimeProvider>>) -> anyhow::Result<SocketAddr> {
&self,
resolver: &Resolver<GenericConnector<TokioRuntimeProvider>>,
) -> anyhow::Result<SocketAddr> {
let lookup = resolver.lookup_ip(&self.host).await?; let lookup = resolver.lookup_ip(&self.host).await?;
let ip = lookup let ip = lookup.into_iter().next().ok_or_else(|| anyhow::anyhow!("No IP address found for host"))?;
.into_iter()
.next()
.ok_or_else(|| anyhow::anyhow!("No IP address found for host"))?;
Ok(SocketAddr::new(ip, self.port)) Ok(SocketAddr::new(ip, self.port))
} }
} }
pub const INTERVAL: Duration = Duration::from_secs(1); pub const INTERVAL: Duration = Duration::from_secs(1);
pub const TIMEOUT: Duration = Duration::from_secs(60); pub const LEARN: Duration = Duration::from_secs(10);
pub const ROUTE_PROTOCOL: RouteProtocol = RouteProtocol::Other(252); pub const ROUTE_PROTOCOL: RouteProtocol = RouteProtocol::Other(252);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment