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 = [
"idna",
"ipnet",
"once_cell",
"rand 0.9.2",
"rand",
"ring",
"thiserror 2.0.17",
"tinyvec",
......@@ -524,7 +524,7 @@ dependencies = [
"moka",
"once_cell",
"parking_lot",
"rand 0.9.2",
"rand",
"resolv-conf",
"smallvec",
"thiserror 2.0.17",
......@@ -679,6 +679,12 @@ dependencies = [
"serde",
]
[[package]]
name = "lazy_static"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]]
name = "libc"
version = "0.2.178"
......@@ -758,9 +764,9 @@ dependencies = [
[[package]]
name = "netlink-packet-route"
version = "0.26.0"
version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ea06a7cec15a9df94c58bddc472b1de04ca53bd32e72da7da2c5dd1c3885edc"
checksum = "4ce3636fa715e988114552619582b530481fd5ef176a1e5c1bf024077c2c9445"
dependencies = [
"bitflags 2.10.0",
"libc",
......@@ -807,6 +813,15 @@ dependencies = [
"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]]
name = "num-traits"
version = "0.2.15"
......@@ -990,27 +1005,17 @@ dependencies = [
"average",
"bincode",
"config",
"futures",
"hickory-resolver",
"netlink-packet-route",
"netlink-sys",
"rand 0.8.5",
"rand",
"rtnetlink",
"serde",
"serde_derive",
"serde_json",
"tokio",
]
[[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",
"tracing",
"tracing-subscriber",
]
[[package]]
......@@ -1019,18 +1024,8 @@ version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
dependencies = [
"rand_chacha 0.9.0",
"rand_core 0.9.3",
]
[[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",
"rand_chacha",
"rand_core",
]
[[package]]
......@@ -1040,16 +1035,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
dependencies = [
"ppv-lite86",
"rand_core 0.9.3",
]
[[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",
"rand_core",
]
[[package]]
......@@ -1106,9 +1092,9 @@ dependencies = [
[[package]]
name = "rtnetlink"
version = "0.19.0"
version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f3ee907fdcec9200d13b9cdb64dfc8179cb4ac16ead6ae0ac76333dc41981fc"
checksum = "4b960d5d873a75b5be9761b1e73b146f52dddcd27bac75263f40fba686d4d7b5"
dependencies = [
"futures-channel",
"futures-util",
......@@ -1225,6 +1211,15 @@ dependencies = [
"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]]
name = "shlex"
version = "1.3.0"
......@@ -1349,6 +1344,15 @@ dependencies = [
"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]]
name = "tiny-keccak"
version = "2.0.2"
......@@ -1449,9 +1453,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
dependencies = [
"pin-project-lite",
"tracing-attributes",
"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]]
name = "tracing-core"
version = "0.1.36"
......@@ -1459,6 +1475,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
dependencies = [
"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]]
......@@ -1532,6 +1574,12 @@ dependencies = [
"wasm-bindgen",
]
[[package]]
name = "valuable"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
[[package]]
name = "version_check"
version = "0.9.4"
......
......@@ -15,10 +15,9 @@ tokio = { version = "1.48", features = ["full"] }
anyhow = "1.0.100"
bincode = { version = "2.0.1", features = ["derive"] }
hickory-resolver = "0.26.0-alpha.1"
rtnetlink = "0.19.0"
netlink-packet-route = "0.26.0"
futures = "0.3.31"
rtnetlink = "0.20.0"
netlink-packet-route = "0.28.0"
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;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let config: Settings = Config::builder().add_source(config::Environment::default()).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")?)?;
tracing_subscriber::fmt::init();
let config: Settings = Config::builder()
.add_source(config::Environment::default())
.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 mut server = Server::new(
......@@ -51,11 +61,16 @@ async fn main() -> anyhow::Result<()> {
result = socket.recv_from(&mut buf) => {
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()) {
// from client
peer.on_message(&message);
} 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 {
// from server
tracing::info!("{:?} {:?}", addr, server_addr);
if addr.port() == config.bind.port()
&& let Some(peer) = Router::get(&mut routers, addr)
&& let Ok((hello, _)) = bincode::decode_from_slice(&buf[..len], bincode::config::standard())
{
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 _ = socket.send_to(&buf[..len], addr).await;
}
......
......@@ -18,7 +18,10 @@ impl Router {
pub fn link_address(from: u8, to: u8) -> Ipv4Addr {
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 {
SocketAddr::V4(addr) => {
let id = addr.ip().octets()[2];
......@@ -29,7 +32,10 @@ impl Router {
}
pub fn new(data: &RouterData, config: &Settings) -> 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 {
reliability: 0,
jitter: 0,
......@@ -70,7 +76,10 @@ impl Router {
}
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;
......@@ -84,8 +93,15 @@ impl Router {
assert!(!received.is_empty()); // 因为走到这里一定刚放过一个进去
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.jitter = (1..received.len()).map(|i| f64::from(received[i].abs_diff(received[i - 1]))).collect::<Mean>().mean() as u8;
self.quality.delay = received
.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 {
......
......@@ -37,6 +37,11 @@ impl Server {
config: &Settings, // routers: &mut HashMap<u8, Router>,
// self_peer: &Hello,
) -> Option<Uplink> {
tracing::info!(
"server message {:?}, version = {}",
message,
message.version
);
if message.ack != self.version {
return None;
}
......@@ -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");
// let mut routes = self.handle.route().get(RouteMessageBuilder::<Ipv4Addr>::new().protocol(ROUTE_PROTOCOL).build()).execute();
// while let Some(route) = routes.try_next().await.unwrap() {
......
......@@ -34,7 +34,9 @@ impl TryFrom<String> for Endpoint {
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();
Ok(Endpoint { host, port })
......@@ -42,9 +44,15 @@ impl TryFrom<String> for 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 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))
}
}
......
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