aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2023-11-17 18:21:48 +0100
committerHimbeerserverDE <himbeerserverde@gmail.com>2023-11-17 18:21:48 +0100
commita11f7c5a0cf3ffa816e433b2c844e0c9abf2ab03 (patch)
tree95b2ace747b1e3148121ac89b4c06f743bc45b09 /src
parentc8e9098e4053deb4d2b6f184ea113afb003f0184 (diff)
move from linkaddrs to netlinklib
Diffstat (limited to 'src')
-rw-r--r--src/error.rs2
-rw-r--r--src/main.rs10
-rw-r--r--src/util.rs21
3 files changed, 20 insertions, 13 deletions
diff --git a/src/error.rs b/src/error.rs
index 1812073..baa97cb 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -35,8 +35,6 @@ pub enum Error {
DhcprotoDecode(#[from] dhcproto::error::DecodeError),
#[error("dhcproto encode error: {0}")]
DhcprotoEncode(#[from] dhcproto::error::EncodeError),
- #[error("linkaddrs error: {0}")]
- LinkAddrs(#[from] linkaddrs::Error),
#[error("netlinklib error: {0}")]
Netlinklib(#[from] rsdsl_netlinklib::Error),
#[error("serde_json error: {0}")]
diff --git a/src/main.rs b/src/main.rs
index adf61d0..5a9ae42 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -112,7 +112,7 @@ fn run(link: String, subnet_id: u8) -> Result<()> {
let remote = remote.as_socket_ipv4().unwrap();
- match handle_request(&sock, lease_mgr.clone(), buf, &link) {
+ match handle_request(&sock, lease_mgr.clone(), buf, link.clone()) {
Ok(_) => {}
Err(e) => println!("[info] pkt from {} on {}: {}", remote, link, e),
}
@@ -123,7 +123,7 @@ fn handle_request<T: LeaseManager>(
sock: &Socket,
lease_mgr: Arc<Mutex<T>>,
buf: &[u8],
- link: &str,
+ link: String,
) -> Result<()> {
let dst: SocketAddrV4 = "255.255.255.255:68".parse().unwrap();
@@ -159,7 +159,7 @@ fn handle_request<T: LeaseManager>(
.persistent_free_address(client_id, hostname)
.ok_or(Error::PoolExhausted)?;
- let own_addr = local_ip(link)?;
+ let own_addr = local_ip(link.clone())?;
let mut resp = Message::default();
let opts = resp
@@ -233,7 +233,7 @@ fn handle_request<T: LeaseManager>(
};
if !lease_mgr.request(requested_addr, client_id, hostname)? {
- let own_addr = local_ip(link)?;
+ let own_addr = local_ip(link.clone())?;
let mut resp = Message::default();
let opts = resp
@@ -271,7 +271,7 @@ fn handle_request<T: LeaseManager>(
}
} else {
let lease_time = lease_mgr.lease_time();
- let own_addr = local_ip(link)?;
+ let own_addr = local_ip(link.clone())?;
let mut resp = Message::default();
let opts = resp
diff --git a/src/util.rs b/src/util.rs
index 687c722..974c273 100644
--- a/src/util.rs
+++ b/src/util.rs
@@ -2,7 +2,9 @@ use crate::{Error, Result};
use std::ffi::{c_char, c_int};
use std::io;
-use std::net::Ipv4Addr;
+use std::net::{IpAddr, Ipv4Addr};
+
+use rsdsl_netlinklib::blocking::addr;
/// Helper macro to execute a system call that returns an `io::Result`.
macro_rules! syscall {
@@ -25,11 +27,18 @@ pub fn format_client_id(client_id: &[u8]) -> Result<String> {
.ok_or(Error::EmptyClientId)
}
-pub fn local_ip(link: &str) -> Result<Ipv4Addr> {
- Ok(linkaddrs::ipv4_addresses(link.to_owned())?
- .first()
- .ok_or(Error::NoIpv4Addr(link.to_owned()))?
- .addr())
+pub fn local_ip(link: String) -> Result<Ipv4Addr> {
+ addr::get(link.clone())?
+ .into_iter()
+ .filter_map(|addr| {
+ if let IpAddr::V4(v4) = addr {
+ Some(v4)
+ } else {
+ None
+ }
+ })
+ .next()
+ .ok_or(Error::NoIpv4Addr(link))
}
#[allow(clippy::missing_safety_doc)]