Skip to content

Commit

Permalink
Use link layer routing
Browse files Browse the repository at this point in the history
  • Loading branch information
moubctez committed Sep 11, 2024
1 parent d42cdc5 commit 4326eb4
Show file tree
Hide file tree
Showing 5 changed files with 11 additions and 33 deletions.
6 changes: 3 additions & 3 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "defguard_wireguard_rs"
version = "0.4.8"
version = "0.4.9"
edition = "2021"
description = "A unified multi-platform high-level API for managing WireGuard interfaces"
license = "Apache-2.0"
Expand Down
6 changes: 3 additions & 3 deletions src/bsd/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,7 @@ pub fn get_gateway(ip_version: IpVersion) -> Result<Option<IpAddr>, IoError> {
}
}

/// Add link layaer address gateway.
/// Add link layer address gateway.
pub fn add_gateway(dest: &IpAddrMask, if_name: &str) -> Result<(), IoError> {
let name = CString::new(if_name).unwrap();
let if_index = unsafe { libc::if_nametoindex(name.as_ptr()) as u16 };
Expand All @@ -379,13 +379,13 @@ pub fn add_gateway(dest: &IpAddrMask, if_name: &str) -> Result<(), IoError> {
(IpAddr::V4(ip), IpAddr::V4(mask)) => {
let link = SockAddrDl::new(if_index);
let payload = GatewayLink::<SockAddrIn>::new(ip.into(), mask.into(), link);
let rtmsg = RtMessage::new_for_gateway_link(if_index, payload);
let rtmsg = RtMessage::new_for_add(if_index, payload);
return rtmsg.execute();
}
(IpAddr::V6(ip), IpAddr::V6(mask)) => {
let link = SockAddrDl::new(if_index);
let payload = GatewayLink::<SockAddrIn6>::new(ip.into(), mask.into(), link);
let rtmsg = RtMessage::new_for_gateway_link(if_index, payload);
let rtmsg = RtMessage::new_for_add(if_index, payload);
return rtmsg.execute();
}
_ => error!("Unsupported address for add route"),
Expand Down
17 changes: 2 additions & 15 deletions src/bsd/route.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use std::{
mem::size_of,
mem::{size_of, MaybeUninit},
net::IpAddr,
os::fd::{AsFd, AsRawFd},
};
Expand Down Expand Up @@ -214,7 +214,7 @@ pub(super) struct GatewayLink<S> {

/// Get an address for a given interface. First address is returned.
fn if_addr<S: SocketFromRaw>(if_name: &str) -> Option<S> {
let mut addrs = std::mem::MaybeUninit::<*mut libc::ifaddrs>::uninit();
let mut addrs = MaybeUninit::<*mut libc::ifaddrs>::uninit();
let errno = unsafe { libc::getifaddrs(addrs.as_mut_ptr()) };
if errno == 0 {
let addrs = unsafe { addrs.assume_init() };
Expand Down Expand Up @@ -277,19 +277,6 @@ impl<Payload: Default> RtMessage<Payload> {
}

impl<Payload> RtMessage<Payload> {
#[must_use]
pub(super) fn new_for_gateway_link(if_index: u16, payload: Payload) -> Self {
let header = RtMsgHdr::new(
size_of::<Self>() as u16,
MessageType::Add,
if_index,
RTF_UP | RTF_STATIC | RTF_CLONING,
RTA_DST | RTA_GATEWAY | RTA_NETMASK,
);

Self { header, payload }
}

#[must_use]
pub(super) fn new_for_add(if_index: u16, payload: Payload) -> Self {
let header = RtMsgHdr::new(
Expand Down
13 changes: 2 additions & 11 deletions src/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use std::{
};

#[cfg(any(target_os = "macos", target_os = "freebsd", target_os = "netbsd"))]
use crate::bsd::add_route;
use crate::bsd::add_gateway;
#[cfg(target_os = "linux")]
use crate::{check_command_output_status, netlink, IpVersion};
use crate::{Peer, WireguardInterfaceError};
Expand Down Expand Up @@ -197,7 +197,7 @@ pub(crate) fn add_peer_routing(
new_addr.cidr = 1;
}
// Equivalent to `route -qn add -inet[6] <allowed_ip> -interface <ifname>`.
match add_route(&new_addr, ifname) {
match add_gateway(&new_addr, ifname) {
Ok(()) => debug!("Route to {addr} has been added for interface {ifname}"),
Err(err) => error!("Failed to add route to {addr} for interface {ifname}: {err}"),
}
Expand All @@ -208,15 +208,6 @@ pub(crate) fn add_peer_routing(
Ok(())
}

/// Helper function to add routing.
#[cfg(target_os = "windows")]
pub(crate) fn add_peer_routing(
peers: &[Peer],
ifname: &str,
) -> Result<(), WireguardInterfaceError> {
Ok(())
}

/// Clean fwmark rules while removing interface same as in wg-quick
#[cfg(target_os = "linux")]
pub(crate) fn clean_fwmark_rules(fwmark: u32) -> Result<(), WireguardInterfaceError> {
Expand Down

0 comments on commit 4326eb4

Please sign in to comment.