aboutsummaryrefslogtreecommitdiff
path: root/src
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 /src
parent581daea52fac3a88883cb3b18801600920db90e5 (diff)
multicast new prefixes on SIGUSR1
Diffstat (limited to 'src')
-rw-r--r--src/main.rs17
1 files changed, 17 insertions, 0 deletions
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)?;