diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-10-14 13:28:52 +0200 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-10-14 13:28:52 +0200 |
commit | ac8a6a12108bc1f366dd72f3fcdbd9ba1a9a3eb6 (patch) | |
tree | 6fbc80661c7805e9612e0f4ab0fc6ecb6c702187 | |
parent | 581daea52fac3a88883cb3b18801600920db90e5 (diff) |
multicast new prefixes on SIGUSR1
-rw-r--r-- | Cargo.lock | 20 | ||||
-rw-r--r-- | Cargo.toml | 1 | ||||
-rw-r--r-- | src/main.rs | 17 |
3 files changed, 38 insertions, 0 deletions
@@ -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" @@ -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)?; |