wireguard-control: cargo fmt
parent
92b60f535d
commit
68d3b09f3a
|
@ -8,8 +8,9 @@ mod linux {
|
||||||
NLM_F_CREATE, NLM_F_EXCL, NLM_F_REQUEST,
|
NLM_F_CREATE, NLM_F_EXCL, NLM_F_REQUEST,
|
||||||
};
|
};
|
||||||
use netlink_packet_generic::{
|
use netlink_packet_generic::{
|
||||||
|
constants::GENL_HDRLEN,
|
||||||
ctrl::{nlas::GenlCtrlAttrs, GenlCtrl, GenlCtrlCmd},
|
ctrl::{nlas::GenlCtrlAttrs, GenlCtrl, GenlCtrlCmd},
|
||||||
GenlFamily, GenlMessage, constants::GENL_HDRLEN,
|
GenlFamily, GenlMessage,
|
||||||
};
|
};
|
||||||
use netlink_packet_route::RtnlMessage;
|
use netlink_packet_route::RtnlMessage;
|
||||||
use netlink_sys::{constants::NETLINK_GENERIC, protocols::NETLINK_ROUTE, Socket};
|
use netlink_sys::{constants::NETLINK_GENERIC, protocols::NETLINK_ROUTE, Socket};
|
||||||
|
@ -85,7 +86,10 @@ mod linux {
|
||||||
if req.buffer_len() > MAX_NETLINK_BUFFER_LENGTH {
|
if req.buffer_len() > MAX_NETLINK_BUFFER_LENGTH {
|
||||||
return Err(io::Error::new(
|
return Err(io::Error::new(
|
||||||
io::ErrorKind::InvalidInput,
|
io::ErrorKind::InvalidInput,
|
||||||
format!("Serialized netlink packet larger than maximum size {}", MAX_NETLINK_BUFFER_LENGTH),
|
format!(
|
||||||
|
"Serialized netlink packet larger than maximum size {}",
|
||||||
|
MAX_NETLINK_BUFFER_LENGTH
|
||||||
|
),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,4 +137,7 @@ mod linux {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
||||||
pub use linux::{netlink_request, netlink_request_genl, netlink_request_rtnl, MAX_NETLINK_BUFFER_LENGTH, MAX_GENL_PAYLOAD_LENGTH};
|
pub use linux::{
|
||||||
|
netlink_request, netlink_request_genl, netlink_request_rtnl, MAX_GENL_PAYLOAD_LENGTH,
|
||||||
|
MAX_NETLINK_BUFFER_LENGTH,
|
||||||
|
};
|
||||||
|
|
|
@ -12,7 +12,8 @@ use netlink_packet_route::{
|
||||||
self,
|
self,
|
||||||
nlas::{Info, InfoKind},
|
nlas::{Info, InfoKind},
|
||||||
},
|
},
|
||||||
LinkMessage, RtnlMessage, traits::Emitable,
|
traits::Emitable,
|
||||||
|
LinkMessage, RtnlMessage,
|
||||||
};
|
};
|
||||||
use netlink_packet_wireguard::{
|
use netlink_packet_wireguard::{
|
||||||
self,
|
self,
|
||||||
|
@ -230,11 +231,10 @@ pub fn apply(builder: &DeviceUpdate, iface: &InterfaceName) -> io::Result<()> {
|
||||||
payload.push(WgDeviceAttrs::Flags(WGDEVICE_F_REPLACE_PEERS));
|
payload.push(WgDeviceAttrs::Flags(WGDEVICE_F_REPLACE_PEERS));
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.peers
|
builder
|
||||||
|
.peers
|
||||||
.iter()
|
.iter()
|
||||||
.for_each(|peer| {
|
.for_each(|peer| payload.push_peer(peer.to_attrs()));
|
||||||
payload.push_peer(peer.to_attrs())
|
|
||||||
});
|
|
||||||
|
|
||||||
for message in payload.finish() {
|
for message in payload.finish() {
|
||||||
netlink_request_genl(message, Some(NLM_F_REQUEST | NLM_F_ACK))?;
|
netlink_request_genl(message, Some(NLM_F_REQUEST | NLM_F_ACK))?;
|
||||||
|
@ -261,7 +261,8 @@ impl ApplyPayload {
|
||||||
|
|
||||||
fn flush_nlas(&mut self) {
|
fn flush_nlas(&mut self) {
|
||||||
// cleanup: clear out any empty peer lists.
|
// cleanup: clear out any empty peer lists.
|
||||||
self.nlas.retain(|nla| !matches!(nla, WgDeviceAttrs::Peers(peers) if peers.len() == 0));
|
self.nlas
|
||||||
|
.retain(|nla| !matches!(nla, WgDeviceAttrs::Peers(peers) if peers.len() == 0));
|
||||||
|
|
||||||
let name = WgDeviceAttrs::IfName(self.iface.clone());
|
let name = WgDeviceAttrs::IfName(self.iface.clone());
|
||||||
self.current_buffer_len = name.buffer_len();
|
self.current_buffer_len = name.buffer_len();
|
||||||
|
@ -287,9 +288,17 @@ impl ApplyPayload {
|
||||||
/// A helper function to assist in breaking up large peer lists across multiple netlink messages
|
/// A helper function to assist in breaking up large peer lists across multiple netlink messages
|
||||||
pub fn push_peer(&mut self, peer: Vec<WgPeerAttrs>) {
|
pub fn push_peer(&mut self, peer: Vec<WgPeerAttrs>) {
|
||||||
const EMPTY_PEERS: WgDeviceAttrs = WgDeviceAttrs::Peers(vec![]);
|
const EMPTY_PEERS: WgDeviceAttrs = WgDeviceAttrs::Peers(vec![]);
|
||||||
let mut needs_peer_nla = !self.nlas.iter().any(|nla| matches!(nla, WgDeviceAttrs::Peers(_)));
|
let mut needs_peer_nla = !self
|
||||||
|
.nlas
|
||||||
|
.iter()
|
||||||
|
.any(|nla| matches!(nla, WgDeviceAttrs::Peers(_)));
|
||||||
let peer_buffer_len = peer.as_slice().buffer_len() + 4;
|
let peer_buffer_len = peer.as_slice().buffer_len() + 4;
|
||||||
let additional_buffer_len = peer_buffer_len + if needs_peer_nla { EMPTY_PEERS.buffer_len() } else { 0 };
|
let additional_buffer_len = peer_buffer_len
|
||||||
|
+ if needs_peer_nla {
|
||||||
|
EMPTY_PEERS.buffer_len()
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
};
|
||||||
if (self.current_buffer_len + additional_buffer_len) > MAX_GENL_PAYLOAD_LENGTH {
|
if (self.current_buffer_len + additional_buffer_len) > MAX_GENL_PAYLOAD_LENGTH {
|
||||||
self.flush_nlas();
|
self.flush_nlas();
|
||||||
needs_peer_nla = true;
|
needs_peer_nla = true;
|
||||||
|
@ -298,12 +307,14 @@ impl ApplyPayload {
|
||||||
if needs_peer_nla {
|
if needs_peer_nla {
|
||||||
self.push(EMPTY_PEERS);
|
self.push(EMPTY_PEERS);
|
||||||
}
|
}
|
||||||
let peers_nla = self.nlas.iter_mut().find_map(|nla| {
|
let peers_nla = self
|
||||||
match nla {
|
.nlas
|
||||||
|
.iter_mut()
|
||||||
|
.find_map(|nla| match nla {
|
||||||
WgDeviceAttrs::Peers(peers) => Some(peers),
|
WgDeviceAttrs::Peers(peers) => Some(peers),
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
})
|
||||||
}).expect("WgDeviceAttrs::Peers missing from NLAs when it should exist.");
|
.expect("WgDeviceAttrs::Peers missing from NLAs when it should exist.");
|
||||||
|
|
||||||
peers_nla.push(peer);
|
peers_nla.push(peer);
|
||||||
self.current_buffer_len += peer_buffer_len;
|
self.current_buffer_len += peer_buffer_len;
|
||||||
|
@ -358,7 +369,7 @@ mod tests {
|
||||||
WgPeerAttrs::AllowedIps(vec![vec![
|
WgPeerAttrs::AllowedIps(vec![vec![
|
||||||
WgAllowedIpAttrs::Family(AF_INET),
|
WgAllowedIpAttrs::Family(AF_INET),
|
||||||
WgAllowedIpAttrs::IpAddr([10, 1, 1, 1].into()),
|
WgAllowedIpAttrs::IpAddr([10, 1, 1, 1].into()),
|
||||||
WgAllowedIpAttrs::Cidr(24)
|
WgAllowedIpAttrs::Cidr(24),
|
||||||
]]),
|
]]),
|
||||||
]);
|
]);
|
||||||
assert_eq!(payload.finish().len(), 1);
|
assert_eq!(payload.finish().len(), 1);
|
||||||
|
@ -379,7 +390,7 @@ mod tests {
|
||||||
WgPeerAttrs::AllowedIps(vec![vec![
|
WgPeerAttrs::AllowedIps(vec![vec![
|
||||||
WgAllowedIpAttrs::Family(AF_INET),
|
WgAllowedIpAttrs::Family(AF_INET),
|
||||||
WgAllowedIpAttrs::IpAddr([10, 1, 1, 1].into()),
|
WgAllowedIpAttrs::IpAddr([10, 1, 1, 1].into()),
|
||||||
WgAllowedIpAttrs::Cidr(24)
|
WgAllowedIpAttrs::Cidr(24),
|
||||||
]]),
|
]]),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue