aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2023-10-14 13:28:52 +0200
committerHimbeerserverDE <himbeerserverde@gmail.com>2023-10-14 13:28:52 +0200
commitac8a6a12108bc1f366dd72f3fcdbd9ba1a9a3eb6 (patch)
tree6fbc80661c7805e9612e0f4ab0fc6ecb6c702187
parent581daea52fac3a88883cb3b18801600920db90e5 (diff)
multicast new prefixes on SIGUSR1
-rw-r--r--Cargo.lock20
-rw-r--r--Cargo.toml1
-rw-r--r--src/main.rs17
3 files changed, 38 insertions, 0 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 316a3fe..6ca3fe9 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -611,6 +611,7 @@ dependencies = [
"linkaddrs",
"pnet_packet",
"rsdsl_netlinkd",
+ "signal-hook",
"socket2 0.5.3",
"thiserror",
]
@@ -686,6 +687,25 @@ dependencies = [
]
[[package]]
+name = "signal-hook"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801"
+dependencies = [
+ "libc",
+ "signal-hook-registry",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
+dependencies = [
+ "libc",
+]
+
+[[package]]
name = "slab"
version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/Cargo.toml b/Cargo.toml
index 1503a32..f91427b 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -8,5 +8,6 @@ ipnet = "2.7.1"
linkaddrs = { git = "https://github.com/HimbeerserverDE/linkaddrs.git", version = "0.1.0" }
pnet_packet = "0.33.0"
rsdsl_netlinkd = { git = "https://github.com/rsdsl/netlinkd.git", version = "0.6.2" }
+signal-hook = "0.3.17"
socket2 = { version = "0.5.2", features = ["all"] }
thiserror = "1.0"
diff --git a/src/main.rs b/src/main.rs
index f5188c2..fe857de 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -8,6 +8,7 @@ use ipnet::Ipv6Net;
use pnet_packet::icmpv6::ndp::{MutableRouterAdvertPacket, NdpOption, NdpOptionType, RouterAdvert};
use pnet_packet::icmpv6::{Icmpv6Code, Icmpv6Type};
use rsdsl_netlinkd::link;
+use signal_hook::{consts::SIGUSR1, iterator::Signals};
use socket2::{Domain, Protocol, SockAddr, Socket, Type};
use thiserror::Error;
@@ -76,6 +77,22 @@ fn run(link: String) -> Result<()> {
thread::sleep(Duration::from_secs(1200));
});
+ // Send NDP RAs when SIGUSR1 is received.
+ // This updates the prefixes whenever netlinkd informs us of a change.
+ let sock2 = sock.try_clone()?;
+ let link2 = link.clone();
+ thread::spawn(move || match Signals::new([SIGUSR1]) {
+ Ok(mut signals) => {
+ for _ in signals.forever() {
+ match send_ra_multicast(&sock2, link2.clone(), ifi) {
+ Ok(_) => {}
+ Err(e) => println!("[warn] sig multicast ra {}: {}", link2, e),
+ }
+ }
+ }
+ Err(e) => println!("[warn] no signal handling on {}: {}", link2, e),
+ });
+
loop {
let mut buf = [MaybeUninit::new(0); 1500];
let (n, raddr) = sock.recv_from(&mut buf)?;