diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-11-17 18:31:51 +0100 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-11-17 18:31:51 +0100 |
commit | 89469644f07f3ca9f0f2301fab7883d089865a9c (patch) | |
tree | 10f0bb08cc28bca4fa443a9493c87cf324509810 | |
parent | b29b330ec84c70112d54a4a0e44ab5670e46190d (diff) |
move from linkaddrs to netlinklib
-rw-r--r-- | Cargo.lock | 13 | ||||
-rw-r--r-- | Cargo.toml | 3 | ||||
-rw-r--r-- | src/main.rs | 27 |
3 files changed, 16 insertions, 27 deletions
@@ -206,18 +206,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" [[package]] -name = "linkaddrs" -version = "0.1.0" -source = "git+https://github.com/HimbeerserverDE/linkaddrs.git#df47e5f96a680f8052ab238e985d683df386368b" -dependencies = [ - "futures", - "ipnet", - "netlink-packet-route", - "rtnetlink", - "tokio", -] - -[[package]] name = "log" version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -475,7 +463,6 @@ name = "rsdsl_radvd" version = "0.1.0" dependencies = [ "ipnet", - "linkaddrs", "pnet_packet", "rsdsl_netlinklib", "signal-hook", @@ -5,9 +5,8 @@ edition = "2021" [dependencies] ipnet = "2.7.1" -linkaddrs = { git = "https://github.com/HimbeerserverDE/linkaddrs.git", version = "0.1.0" } pnet_packet = "0.33.0" -rsdsl_netlinklib = { git = "https://github.com/rsdsl/netlinklib.git", version = "0.3.0", features = ["blocking", "status"], default-features = false } +rsdsl_netlinklib = { git = "https://github.com/rsdsl/netlinklib.git", version = "0.3.0", features = ["addr", "blocking", "status"], default-features = false } 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 b4a03ce..ef28dfe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,13 +1,13 @@ use std::io; use std::mem::MaybeUninit; -use std::net::{Ipv6Addr, SocketAddrV6}; +use std::net::{IpAddr, Ipv6Addr, SocketAddrV6}; use std::thread; use std::time::Duration; use ipnet::Ipv6Net; use pnet_packet::icmpv6::ndp::{MutableRouterAdvertPacket, NdpOption, NdpOptionType, RouterAdvert}; use pnet_packet::icmpv6::{Icmpv6Code, Icmpv6Type}; -use rsdsl_netlinklib::blocking::link; +use rsdsl_netlinklib::blocking::{addr, link}; use signal_hook::{consts::SIGUSR1, iterator::Signals}; use socket2::{Domain, Protocol, SockAddr, Socket, Type}; use thiserror::Error; @@ -20,8 +20,6 @@ enum Error { #[error("io: {0}")] Io(#[from] io::Error), - #[error("linkaddrs: {0}")] - LinkAddrs(#[from] linkaddrs::Error), #[error("netlinklib error: {0}")] Netlinklib(#[from] rsdsl_netlinklib::Error), } @@ -119,7 +117,7 @@ fn run(link: String) -> Result<()> { } } -fn create_ra_pkt(link: String) -> Result<(Vec<u8>, Vec<Ipv6Net>)> { +fn create_ra_pkt(link: String) -> Result<(Vec<u8>, Vec<Ipv6Addr>)> { let global = Ipv6Net::new(Ipv6Addr::new(0x2000, 0, 0, 0, 0, 0, 0, 0), 3).unwrap(); let mut rdnss_data = [ @@ -136,10 +134,15 @@ fn create_ra_pkt(link: String) -> Result<(Vec<u8>, Vec<Ipv6Net>)> { }]; let mut prefixes = Vec::new(); - for prefix in linkaddrs::ipv6_addresses(link)? - .into_iter() - .filter(|addr| global.contains(addr)) - { + let ipv6_addrs = addr::get(link)?.into_iter().filter_map(|addr| { + if let IpAddr::V6(v6) = addr { + Some(v6) + } else { + None + } + }); + + for prefix in ipv6_addrs.filter(|addr| global.contains(addr)) { let mut prefix_data = [ 64, // Prefix Length, always /64 0xc0, // Flags: On-Link + SLAAC @@ -148,7 +151,7 @@ fn create_ra_pkt(link: String) -> Result<(Vec<u8>, Vec<Ipv6Net>)> { 0, 0, 0, 0, // Reserved 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Prefix (inserted later) ]; - prefix_data[14..].copy_from_slice(&prefix.trunc().addr().octets()); + prefix_data[14..].copy_from_slice(&prefix.octets()); prefixes.push(prefix); @@ -189,7 +192,7 @@ fn send_ra_multicast(sock: &Socket, link: String, ifi: u32) -> Result<()> { let prefixes = pkt_prefixes .into_iter() - .map(|prefix| format!("{}", prefix)) + .map(|prefix| format!("{}/64", prefix)) .reduce(|acc, prefix| acc + ", " + &prefix) .unwrap_or(String::from("::/64")); @@ -203,7 +206,7 @@ fn send_ra_unicast(sock: &Socket, link: String, raddr: &SockAddr) -> Result<()> let prefixes = pkt_prefixes .into_iter() - .map(|prefix| format!("{}", prefix)) + .map(|prefix| format!("{}/64", prefix)) .reduce(|acc, prefix| acc + ", " + &prefix) .unwrap_or(String::from("::/64")); |