Commit f954add0 authored by nanamicat's avatar nanamicat

fix

parent 9429ae13
Pipeline #42418 passed with stages
in 6 minutes and 15 seconds
...@@ -502,7 +502,7 @@ dependencies = [ ...@@ -502,7 +502,7 @@ dependencies = [
"idna", "idna",
"ipnet", "ipnet",
"once_cell", "once_cell",
"rand 0.9.2", "rand",
"ring", "ring",
"thiserror 2.0.17", "thiserror 2.0.17",
"tinyvec", "tinyvec",
...@@ -524,7 +524,7 @@ dependencies = [ ...@@ -524,7 +524,7 @@ dependencies = [
"moka", "moka",
"once_cell", "once_cell",
"parking_lot", "parking_lot",
"rand 0.9.2", "rand",
"resolv-conf", "resolv-conf",
"smallvec", "smallvec",
"thiserror 2.0.17", "thiserror 2.0.17",
...@@ -679,6 +679,12 @@ dependencies = [ ...@@ -679,6 +679,12 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "lazy_static"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.178" version = "0.2.178"
...@@ -758,9 +764,9 @@ dependencies = [ ...@@ -758,9 +764,9 @@ dependencies = [
[[package]] [[package]]
name = "netlink-packet-route" name = "netlink-packet-route"
version = "0.26.0" version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ea06a7cec15a9df94c58bddc472b1de04ca53bd32e72da7da2c5dd1c3885edc" checksum = "4ce3636fa715e988114552619582b530481fd5ef176a1e5c1bf024077c2c9445"
dependencies = [ dependencies = [
"bitflags 2.10.0", "bitflags 2.10.0",
"libc", "libc",
...@@ -807,6 +813,15 @@ dependencies = [ ...@@ -807,6 +813,15 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "nu-ansi-term"
version = "0.50.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
dependencies = [
"windows-sys 0.61.2",
]
[[package]] [[package]]
name = "num-traits" name = "num-traits"
version = "0.2.15" version = "0.2.15"
...@@ -990,27 +1005,17 @@ dependencies = [ ...@@ -990,27 +1005,17 @@ dependencies = [
"average", "average",
"bincode", "bincode",
"config", "config",
"futures",
"hickory-resolver", "hickory-resolver",
"netlink-packet-route", "netlink-packet-route",
"netlink-sys", "netlink-sys",
"rand 0.8.5", "rand",
"rtnetlink", "rtnetlink",
"serde", "serde",
"serde_derive", "serde_derive",
"serde_json", "serde_json",
"tokio", "tokio",
] "tracing",
"tracing-subscriber",
[[package]]
name = "rand"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [
"libc",
"rand_chacha 0.3.1",
"rand_core 0.6.4",
] ]
[[package]] [[package]]
...@@ -1019,18 +1024,8 @@ version = "0.9.2" ...@@ -1019,18 +1024,8 @@ version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
dependencies = [ dependencies = [
"rand_chacha 0.9.0", "rand_chacha",
"rand_core 0.9.3", "rand_core",
]
[[package]]
name = "rand_chacha"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
"ppv-lite86",
"rand_core 0.6.4",
] ]
[[package]] [[package]]
...@@ -1040,16 +1035,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" ...@@ -1040,16 +1035,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
dependencies = [ dependencies = [
"ppv-lite86", "ppv-lite86",
"rand_core 0.9.3", "rand_core",
]
[[package]]
name = "rand_core"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
"getrandom 0.2.16",
] ]
[[package]] [[package]]
...@@ -1106,9 +1092,9 @@ dependencies = [ ...@@ -1106,9 +1092,9 @@ dependencies = [
[[package]] [[package]]
name = "rtnetlink" name = "rtnetlink"
version = "0.19.0" version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f3ee907fdcec9200d13b9cdb64dfc8179cb4ac16ead6ae0ac76333dc41981fc" checksum = "4b960d5d873a75b5be9761b1e73b146f52dddcd27bac75263f40fba686d4d7b5"
dependencies = [ dependencies = [
"futures-channel", "futures-channel",
"futures-util", "futures-util",
...@@ -1225,6 +1211,15 @@ dependencies = [ ...@@ -1225,6 +1211,15 @@ dependencies = [
"digest", "digest",
] ]
[[package]]
name = "sharded-slab"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
dependencies = [
"lazy_static",
]
[[package]] [[package]]
name = "shlex" name = "shlex"
version = "1.3.0" version = "1.3.0"
...@@ -1349,6 +1344,15 @@ dependencies = [ ...@@ -1349,6 +1344,15 @@ dependencies = [
"syn", "syn",
] ]
[[package]]
name = "thread_local"
version = "1.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185"
dependencies = [
"cfg-if",
]
[[package]] [[package]]
name = "tiny-keccak" name = "tiny-keccak"
version = "2.0.2" version = "2.0.2"
...@@ -1449,9 +1453,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" ...@@ -1449,9 +1453,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
dependencies = [ dependencies = [
"pin-project-lite", "pin-project-lite",
"tracing-attributes",
"tracing-core", "tracing-core",
] ]
[[package]]
name = "tracing-attributes"
version = "0.1.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "tracing-core" name = "tracing-core"
version = "0.1.36" version = "0.1.36"
...@@ -1459,6 +1475,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" ...@@ -1459,6 +1475,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
dependencies = [ dependencies = [
"once_cell", "once_cell",
"valuable",
]
[[package]]
name = "tracing-log"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
dependencies = [
"log",
"once_cell",
"tracing-core",
]
[[package]]
name = "tracing-subscriber"
version = "0.3.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e"
dependencies = [
"nu-ansi-term",
"sharded-slab",
"smallvec",
"thread_local",
"tracing-core",
"tracing-log",
] ]
[[package]] [[package]]
...@@ -1532,6 +1574,12 @@ dependencies = [ ...@@ -1532,6 +1574,12 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
[[package]]
name = "valuable"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
[[package]] [[package]]
name = "version_check" name = "version_check"
version = "0.9.4" version = "0.9.4"
......
...@@ -15,10 +15,9 @@ tokio = { version = "1.48", features = ["full"] } ...@@ -15,10 +15,9 @@ 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" rtnetlink = "0.20.0"
netlink-packet-route = "0.26.0" netlink-packet-route = "0.28.0"
futures = "0.3.31"
netlink-sys = { version = "0.8.7", features = ["tokio"] } netlink-sys = { version = "0.8.7", features = ["tokio"] }
rand = "0.8" tracing = "0.1.44"
tracing-subscriber = "0.3.22"
rand = "0.9.2"
...@@ -22,10 +22,20 @@ use hickory_resolver::Resolver; ...@@ -22,10 +22,20 @@ use hickory_resolver::Resolver;
#[tokio::main] #[tokio::main]
async fn main() -> anyhow::Result<()> { async fn main() -> anyhow::Result<()> {
let config: Settings = Config::builder().add_source(config::Environment::default()).build()?.try_deserialize()?; tracing_subscriber::fmt::init();
let routers_data = serde_json::from_slice::<Vec<RouterData>>(&fs::read("import/data/Router.json")?)?; let config: Settings = Config::builder()
let mut routers: BTreeMap<u8, Router> = routers_data.iter().map(|r| (r.id, Router::new(r, &config))).collect(); .add_source(config::Environment::default())
let connections = serde_json::from_slice::<BTreeMap<u8, BTreeMap<u8, Connection>>>(&fs::read("import/connections.json")?)?; .build()?
.try_deserialize()?;
let routers_data =
serde_json::from_slice::<Vec<RouterData>>(&fs::read("import/data/Router.json")?)?;
let mut routers: BTreeMap<u8, Router> = routers_data
.iter()
.map(|r| (r.id, Router::new(r, &config)))
.collect();
let connections = serde_json::from_slice::<BTreeMap<u8, BTreeMap<u8, Connection>>>(&fs::read(
"import/connections.json",
)?)?;
// let groups: Vec<GatewayGroup> = serde_json::from_slice(&fs::read("import/GatewayGroup.json")?)?; // let groups: Vec<GatewayGroup> = serde_json::from_slice(&fs::read("import/GatewayGroup.json")?)?;
let mut server = Server::new( let mut server = Server::new(
...@@ -51,11 +61,16 @@ async fn main() -> anyhow::Result<()> { ...@@ -51,11 +61,16 @@ async fn main() -> anyhow::Result<()> {
result = socket.recv_from(&mut buf) => { result = socket.recv_from(&mut buf) => {
let (len, addr) = result?; let (len, addr) = result?;
if let Some(peer) = Router::get(&mut routers, addr) && let Ok((message, _)) = bincode::decode_from_slice(&buf[..len], bincode::config::standard()) { tracing::info!("{:?} {:?}", addr, server_addr);
// from client if addr.port() == config.bind.port()
peer.on_message(&message); && let Some(peer) = Router::get(&mut routers, addr)
} else if addr == server_addr && let Ok((downlink, _)) = bincode::decode_from_slice(&buf[..len], bincode::config::standard()) && let Some(uplink) = server.on_message(&downlink, &routers_data, &connections[&config.id], &config).await { && let Ok((hello, _)) = bincode::decode_from_slice(&buf[..len], bincode::config::standard())
// from server {
peer.on_message(&hello);
} else if addr.port() == config.server.port
&& let Ok((downlink, _)) = bincode::decode_from_slice(&buf[..len], bincode::config::standard())
&& let Some(uplink) = server.on_message(&downlink, &routers_data, &connections[&config.id], &config).await
{
let len = bincode::encode_into_slice(uplink, &mut buf, bincode::config::standard())?; let len = bincode::encode_into_slice(uplink, &mut buf, bincode::config::standard())?;
let _ = socket.send_to(&buf[..len], addr).await; let _ = socket.send_to(&buf[..len], addr).await;
} }
......
...@@ -18,7 +18,10 @@ impl Router { ...@@ -18,7 +18,10 @@ impl Router {
pub fn link_address(from: u8, to: u8) -> Ipv4Addr { pub fn link_address(from: u8, to: u8) -> Ipv4Addr {
Ipv4Addr::from([10, 200, to, from]) Ipv4Addr::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) => {
let id = addr.ip().octets()[2]; let id = addr.ip().octets()[2];
...@@ -29,7 +32,10 @@ impl Router { ...@@ -29,7 +32,10 @@ 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::V4(Router::link_address(config.id, data.id)), config.bind.port()), link_address: SocketAddr::new(
IpAddr::V4(Router::link_address(config.id, data.id)),
config.bind.port(),
),
quality: PeerQuality { quality: PeerQuality {
reliability: 0, reliability: 0,
jitter: 0, jitter: 0,
...@@ -70,7 +76,10 @@ impl Router { ...@@ -70,7 +76,10 @@ impl Router {
} }
self.remote_time = data.time; self.remote_time = data.time;
self.local_time = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis() as u32; self.local_time = SystemTime::now()
.duration_since(SystemTime::UNIX_EPOCH)
.unwrap()
.as_millis() as u32;
let delay = self.local_time.wrapping_sub(self.remote_time) as i32; let delay = self.local_time.wrapping_sub(self.remote_time) as i32;
...@@ -84,8 +93,15 @@ impl Router { ...@@ -84,8 +93,15 @@ impl Router {
assert!(!received.is_empty()); // 因为走到这里一定刚放过一个进去 assert!(!received.is_empty()); // 因为走到这里一定刚放过一个进去
self.quality.reliability = (received.len() * 255 / HISTORY as usize) as u8; self.quality.reliability = (received.len() * 255 / HISTORY as usize) as u8;
self.quality.delay = received.iter().map(|&x| f64::from(x)).collect::<Mean>().mean() as i16; self.quality.delay = received
self.quality.jitter = (1..received.len()).map(|i| f64::from(received[i].abs_diff(received[i - 1]))).collect::<Mean>().mean() as u8; .iter()
.map(|&x| f64::from(x))
.collect::<Mean>()
.mean() as i16;
self.quality.jitter = (1..received.len())
.map(|i| f64::from(received[i].abs_diff(received[i - 1])))
.collect::<Mean>()
.mean() as u8;
} }
pub(crate) fn update(&mut self, local_time: u32) -> PeerQuality { pub(crate) fn update(&mut self, local_time: u32) -> PeerQuality {
......
...@@ -37,6 +37,11 @@ impl Server { ...@@ -37,6 +37,11 @@ impl Server {
config: &Settings, // routers: &mut HashMap<u8, Router>, config: &Settings, // routers: &mut HashMap<u8, Router>,
// self_peer: &Hello, // self_peer: &Hello,
) -> Option<Uplink> { ) -> Option<Uplink> {
tracing::info!(
"server message {:?}, version = {}",
message,
message.version
);
if message.ack != self.version { if message.ack != self.version {
return None; return None;
} }
...@@ -77,7 +82,12 @@ impl Server { ...@@ -77,7 +82,12 @@ impl Server {
} }
} }
pub async fn reset(&self, routers: &Vec<data::Router>, connections: &BTreeMap<u8, Connection>, config: &Settings) { pub async fn reset(
&self,
routers: &Vec<data::Router>,
connections: &BTreeMap<u8, Connection>,
config: &Settings,
) {
println!("reset"); println!("reset");
// let mut routes = self.handle.route().get(RouteMessageBuilder::<Ipv4Addr>::new().protocol(ROUTE_PROTOCOL).build()).execute(); // let mut routes = self.handle.route().get(RouteMessageBuilder::<Ipv4Addr>::new().protocol(ROUTE_PROTOCOL).build()).execute();
// while let Some(route) = routes.try_next().await.unwrap() { // while let Some(route) = routes.try_next().await.unwrap() {
......
...@@ -34,7 +34,9 @@ impl TryFrom<String> for Endpoint { ...@@ -34,7 +34,9 @@ impl TryFrom<String> for Endpoint {
return Err(format!("Invalid endpoint format: {}", value)); return Err(format!("Invalid endpoint format: {}", value));
} }
let port = parts[0].parse::<u16>().map_err(|e| format!("Invalid port: {}", e))?; let port = parts[0]
.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 })
...@@ -42,9 +44,15 @@ impl TryFrom<String> for Endpoint { ...@@ -42,9 +44,15 @@ impl TryFrom<String> for Endpoint {
} }
impl Endpoint { impl Endpoint {
pub async fn to_socket_addrs(&self, resolver: &Resolver<GenericConnector<TokioRuntimeProvider>>) -> anyhow::Result<SocketAddr> { pub async fn to_socket_addrs(
&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.into_iter().next().ok_or_else(|| anyhow::anyhow!("No IP address found for host"))?; let ip = lookup
.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))
} }
} }
......
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