Commit 40d50415 authored by nanamicat's avatar nanamicat

last no route

parent ab927363
Pipeline #42139 failed with stages
in 4 minutes and 23 seconds
...@@ -114,6 +114,12 @@ version = "1.0.0" ...@@ -114,6 +114,12 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "cfg_aliases"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
[[package]] [[package]]
name = "config" name = "config"
version = "0.15.19" version = "0.15.19"
...@@ -328,41 +334,90 @@ dependencies = [ ...@@ -328,41 +334,90 @@ dependencies = [
"percent-encoding", "percent-encoding",
] ]
[[package]]
name = "futures"
version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876"
dependencies = [
"futures-channel",
"futures-core",
"futures-executor",
"futures-io",
"futures-sink",
"futures-task",
"futures-util",
]
[[package]] [[package]]
name = "futures-channel" name = "futures-channel"
version = "0.3.28" version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
dependencies = [ dependencies = [
"futures-core", "futures-core",
"futures-sink",
] ]
[[package]] [[package]]
name = "futures-core" name = "futures-core"
version = "0.3.28" version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
[[package]]
name = "futures-executor"
version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f"
dependencies = [
"futures-core",
"futures-task",
"futures-util",
]
[[package]] [[package]]
name = "futures-io" name = "futures-io"
version = "0.3.28" version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
[[package]]
name = "futures-macro"
version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "futures-sink"
version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"
[[package]] [[package]]
name = "futures-task" name = "futures-task"
version = "0.3.28" version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
[[package]] [[package]]
name = "futures-util" name = "futures-util"
version = "0.3.28" version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
dependencies = [ dependencies = [
"futures-channel",
"futures-core", "futures-core",
"futures-io",
"futures-macro",
"futures-sink",
"futures-task", "futures-task",
"memchr",
"pin-project-lite", "pin-project-lite",
"pin-utils", "pin-utils",
"slab", "slab",
...@@ -652,6 +707,12 @@ dependencies = [ ...@@ -652,6 +707,12 @@ dependencies = [
"scopeguard", "scopeguard",
] ]
[[package]]
name = "log"
version = "0.4.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
[[package]] [[package]]
name = "memchr" name = "memchr"
version = "2.7.6" version = "2.7.6"
...@@ -686,6 +747,66 @@ dependencies = [ ...@@ -686,6 +747,66 @@ dependencies = [
"uuid", "uuid",
] ]
[[package]]
name = "netlink-packet-core"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3463cbb78394cb0141e2c926b93fc2197e473394b761986eca3b9da2c63ae0f4"
dependencies = [
"paste",
]
[[package]]
name = "netlink-packet-route"
version = "0.26.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ea06a7cec15a9df94c58bddc472b1de04ca53bd32e72da7da2c5dd1c3885edc"
dependencies = [
"bitflags 2.10.0",
"libc",
"log",
"netlink-packet-core",
]
[[package]]
name = "netlink-proto"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b65d130ee111430e47eed7896ea43ca693c387f097dd97376bffafbf25812128"
dependencies = [
"bytes",
"futures",
"log",
"netlink-packet-core",
"netlink-sys",
"thiserror 2.0.17",
]
[[package]]
name = "netlink-sys"
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "416060d346fbaf1f23f9512963e3e878f1a78e707cb699ba9215761754244307"
dependencies = [
"bytes",
"futures",
"libc",
"log",
"tokio",
]
[[package]]
name = "nix"
version = "0.30.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6"
dependencies = [
"bitflags 2.10.0",
"cfg-if",
"cfg_aliases",
"libc",
]
[[package]] [[package]]
name = "num-traits" name = "num-traits"
version = "0.2.15" version = "0.2.15"
...@@ -739,6 +860,12 @@ dependencies = [ ...@@ -739,6 +860,12 @@ dependencies = [
"windows-sys 0.45.0", "windows-sys 0.45.0",
] ]
[[package]]
name = "paste"
version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
[[package]] [[package]]
name = "pathdiff" name = "pathdiff"
version = "0.2.3" version = "0.2.3"
...@@ -863,7 +990,10 @@ dependencies = [ ...@@ -863,7 +990,10 @@ dependencies = [
"average", "average",
"bincode", "bincode",
"config", "config",
"futures",
"hickory-resolver", "hickory-resolver",
"netlink-packet-route",
"rtnetlink",
"serde", "serde",
"serde_derive", "serde_derive",
"serde_json", "serde_json",
...@@ -942,6 +1072,24 @@ dependencies = [ ...@@ -942,6 +1072,24 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "rtnetlink"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f3ee907fdcec9200d13b9cdb64dfc8179cb4ac16ead6ae0ac76333dc41981fc"
dependencies = [
"futures-channel",
"futures-util",
"log",
"netlink-packet-core",
"netlink-packet-route",
"netlink-proto",
"netlink-sys",
"nix",
"thiserror 1.0.40",
"tokio",
]
[[package]] [[package]]
name = "rust-ini" name = "rust-ini"
version = "0.21.3" version = "0.21.3"
......
...@@ -15,3 +15,6 @@ tokio = { version = "1.48", features = ["full"] } ...@@ -15,3 +15,6 @@ tokio = { version = "1.48", features = ["full"] }
anyhow = "1.0.100" anyhow = "1.0.100"
bincode = { version = "2.0.1", features = ["derive"] } bincode = { version = "2.0.1", features = ["derive"] }
hickory-resolver = "0.26.0-alpha.1" hickory-resolver = "0.26.0-alpha.1"
rtnetlink = "0.19.0"
netlink-packet-route = "0.26.0"
futures = "0.3.31"
...@@ -3,7 +3,7 @@ use crate::data::Router as RouterData; ...@@ -3,7 +3,7 @@ use crate::data::Router as RouterData;
use crate::protocol::{Change, Hello, Report}; use crate::protocol::{Change, Hello, Report};
use crate::router::Router; use crate::router::Router;
use crate::server::Server; use crate::server::Server;
use crate::settings::{Settings, INTERVAL}; use crate::settings::{INTERVAL, Settings};
use config::Config; use config::Config;
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::fs; use std::fs;
...@@ -59,7 +59,7 @@ async fn main() -> anyhow::Result<()> { ...@@ -59,7 +59,7 @@ async fn main() -> anyhow::Result<()> {
if addr == server_addr { if addr == server_addr {
// from server // from server
let (message, _): (Change, usize) = bincode::decode_from_slice(&buf[..len], bincode::config::standard())?; let (message, _): (Change, usize) = bincode::decode_from_slice(&buf[..len], bincode::config::standard())?;
server.on_message(&message); server.on_message(&message, &routers_data, &connections[&config.id]).await;
syn = false; syn = false;
let report = Report { let report = Report {
id: config.id, id: config.id,
......
use std::collections::BTreeMap;
use bincode::{Decode, Encode}; use bincode::{Decode, Encode};
use std::collections::BTreeMap;
#[derive(Encode, Decode)] #[derive(Encode, Decode)]
pub struct Hello { pub struct Hello {
......
// use rtnetlink::{new_connection, Error, Handle};
// use std::collections::HashMap;
//
// struct RouteWriter {
// via: HashMap<u8, u8>,
// plan: HashMap<u16, u8>,
// }
//
// impl RouteWriter {
// fn new() -> Self {
// let (connection, handle, _) = new_connection().unwrap();
// tokio::spawn(connection);
//
// Self {
// via: HashMap::new(),
// plan: HashMap::new(),
// };
// }
//
// fn set_via(&mut self, to: u8, via: u8) {
// self.via.insert(to, via);
// }
//
// fn set_plan(&mut self, group: u16, to: u8) {
// self.plan.insert(group, to);
// }
//
// fn commit(&mut self) {
// // self.via.clear();
// // self.plan.clear();
// }
// }
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::{HISTORY, INTERVAL, Settings, TIMEOUT}; use crate::settings::{Settings, HISTORY, INTERVAL, TIMEOUT};
use average::Mean; use average::Mean;
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::net::{IpAddr, SocketAddr}; use std::net::{IpAddr, SocketAddr};
...@@ -15,6 +15,9 @@ pub struct Router { ...@@ -15,6 +15,9 @@ pub struct Router {
} }
impl Router { impl Router {
pub fn link_address(from: u8, to: u8) -> IpAddr {
IpAddr::from([10, 200, to, from])
}
pub fn get(routers: &mut BTreeMap<u8, Router>, link_address: SocketAddr) -> Option<&mut Router> { pub fn get(routers: &mut BTreeMap<u8, Router>, link_address: SocketAddr) -> Option<&mut Router> {
match link_address { match link_address {
SocketAddr::V4(addr) => { SocketAddr::V4(addr) => {
...@@ -26,7 +29,7 @@ impl Router { ...@@ -26,7 +29,7 @@ impl Router {
} }
pub fn new(data: &RouterData, config: &Settings) -> Router { pub fn new(data: &RouterData, config: &Settings) -> Router {
Router { Router {
link_address: SocketAddr::new(IpAddr::from([10, 200, data.id, config.id]), config.bind.port()), link_address: SocketAddr::new(Router::link_address(config.id, data.id), config.bind.port()),
quality: PeerQuality { quality: PeerQuality {
reliability: 0, reliability: 0,
jitter: 0, jitter: 0,
......
use crate::protocol::Change; use crate::router::Router;
use crate::settings::ROUTE_PROTOCOL;
use crate::{connection::Connection, data, protocol::Change};
use futures::TryStreamExt;
use rtnetlink::RouteMessageBuilder;
use std::collections::BTreeMap;
use std::net::Ipv4Addr;
pub struct Server { pub struct Server {
pub(crate) ack: u8, pub(crate) ack: u8,
pub(crate) handle: rtnetlink::Handle,
} }
impl Server { impl Server {
pub fn new() -> Self { pub fn new() -> Self {
Server { ack: 0 } let (connection, handle, _) = rtnetlink::new_connection().unwrap();
tokio::spawn(connection);
Server { ack: 0, handle }
} }
pub fn on_message( pub async fn on_message(
&mut self, &mut self,
message: &Change, message: &Change,
routers: &Vec<data::Router>,
connections: &BTreeMap<u8, Connection>,
// routers: &mut HashMap<u8, Router>, // routers: &mut HashMap<u8, Router>,
// self_peer: &Hello, // self_peer: &Hello,
) { ) {
if message.rst { if message.rst {
self.ack = message.seq; self.ack = message.seq;
// RouteWriter::reset(); self.reset(routers, connections).await;
} }
if self.ack != message.seq { if self.ack != message.seq {
...@@ -42,4 +53,14 @@ impl Server { ...@@ -42,4 +53,14 @@ impl Server {
// pub fn update(&mut self, socket: &UdpSocket, routers: &mut HashMap<u8, Router>, hello: &Hello) { // pub fn update(&mut self, socket: &UdpSocket, routers: &mut HashMap<u8, Router>, hello: &Hello) {
// } // }
pub async fn reset(&self, routers: &Vec<data::Router>, connections: &BTreeMap<u8, Connection>) -> anyhow::Result<()> {
let mut routes = self.handle.route().get(RouteMessageBuilder::<Ipv4Addr>::new().protocol(ROUTE_PROTOCOL).build()).execute();
while let Some(route) = routes.try_next().await? {
self.handle.route().del(route).execute().await?;
}
// for router in routers.iter() {
// if()
// }
Ok(())
}
} }
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 serde::Deserialize; use serde::Deserialize;
use std::net::SocketAddr; use std::net::SocketAddr;
use std::time::Duration; use std::time::Duration;
...@@ -51,3 +52,4 @@ impl Endpoint { ...@@ -51,3 +52,4 @@ impl Endpoint {
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 TIMEOUT: Duration = Duration::from_secs(60);
pub const HISTORY: u8 = 100; pub const HISTORY: u8 = 100;
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