summaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
authordiogo464 <[email protected]>2026-02-15 22:05:57 +0000
committerdiogo464 <[email protected]>2026-02-15 22:05:57 +0000
commit56ac8740b79e291eabe6427d722921533b3a9837 (patch)
treec244662e382263efec95d6ac445cfc9f987e4758 /src/lib.rs
parent75ccbd675c22fb3275c5763518c3b97819db4c53 (diff)
updated dependencies
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs97
1 files changed, 59 insertions, 38 deletions
diff --git a/src/lib.rs b/src/lib.rs
index c47d618..8ba36eb 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -3,18 +3,18 @@ mod key;
3mod setup; 3mod setup;
4mod view; 4mod view;
5 5
6use std::borrow::Cow; 6use std::{
7 borrow::Cow,
8 net::{Ipv4Addr, Ipv6Addr},
9};
7 10
8use futures::{StreamExt, TryStreamExt}; 11use futures::{StreamExt, TryStreamExt};
9use genetlink::{GenetlinkError, GenetlinkHandle}; 12use genetlink::{GenetlinkError, GenetlinkHandle};
10use netlink_packet_core::{NetlinkMessage, NetlinkPayload, NLM_F_ACK, NLM_F_DUMP, NLM_F_REQUEST}; 13use netlink_packet_core::{NetlinkMessage, NetlinkPayload, NLM_F_ACK, NLM_F_DUMP, NLM_F_REQUEST};
11use netlink_packet_generic::GenlMessage; 14use netlink_packet_generic::GenlMessage;
12use netlink_packet_route::{ 15use netlink_packet_route::{link::LinkAttribute, route::RouteScope};
13 link::{InfoKind, LinkAttribute, LinkInfo}, 16use netlink_packet_wireguard::{WireguardAttribute, WireguardCmd, WireguardMessage};
14 route::RouteScope, 17use rtnetlink::{Handle, LinkMessageBuilder, LinkSetRequest, LinkWireguard, RouteMessageBuilder};
15};
16use netlink_packet_wireguard::{nlas::WgDeviceAttrs, Wireguard, WireguardCmd};
17use rtnetlink::Handle;
18 18
19pub use conf::*; 19pub use conf::*;
20pub use key::*; 20pub use key::*;
@@ -149,9 +149,9 @@ impl WireGuard {
149 } 149 }
150 150
151 pub async fn view_device(&mut self, device_name: &str) -> Result<DeviceView> { 151 pub async fn view_device(&mut self, device_name: &str) -> Result<DeviceView> {
152 let genlmsg: GenlMessage<Wireguard> = GenlMessage::from_payload(Wireguard { 152 let genlmsg: GenlMessage<WireguardMessage> = GenlMessage::from_payload(WireguardMessage {
153 cmd: WireguardCmd::GetDevice, 153 cmd: WireguardCmd::GetDevice,
154 nlas: vec![WgDeviceAttrs::IfName(device_name.to_string())], 154 attributes: vec![WireguardAttribute::IfName(device_name.to_string())],
155 }); 155 });
156 let mut nlmsg = NetlinkMessage::from(genlmsg); 156 let mut nlmsg = NetlinkMessage::from(genlmsg);
157 nlmsg.header.flags = NLM_F_REQUEST | NLM_F_DUMP; 157 nlmsg.header.flags = NLM_F_REQUEST | NLM_F_DUMP;
@@ -213,7 +213,7 @@ impl WireGuard {
213 } 213 }
214 214
215 let message = descriptor.into_wireguard(device_name.to_string()); 215 let message = descriptor.into_wireguard(device_name.to_string());
216 let genlmsg: GenlMessage<Wireguard> = GenlMessage::from_payload(message); 216 let genlmsg: GenlMessage<WireguardMessage> = GenlMessage::from_payload(message);
217 let mut nlmsg = NetlinkMessage::from(genlmsg); 217 let mut nlmsg = NetlinkMessage::from(genlmsg);
218 nlmsg.header.flags = NLM_F_REQUEST | NLM_F_ACK; 218 nlmsg.header.flags = NLM_F_REQUEST | NLM_F_ACK;
219 219
@@ -225,16 +225,12 @@ impl WireGuard {
225 } 225 }
226 226
227 async fn link_create(&self, name: &str) -> Result<()> { 227 async fn link_create(&self, name: &str) -> Result<()> {
228 let mut msg = self.rt_handle.link().add().replace(); 228 self.rt_handle
229 msg.message_mut() 229 .link()
230 .attributes 230 .add(LinkMessageBuilder::<LinkWireguard>::new(name).build())
231 .push(LinkAttribute::LinkInfo(vec![LinkInfo::Kind( 231 .replace()
232 InfoKind::Wireguard, 232 .execute()
233 )])); 233 .await?;
234 msg.message_mut()
235 .attributes
236 .push(LinkAttribute::IfName(name.to_string()));
237 msg.execute().await?;
238 Ok(()) 234 Ok(())
239 } 235 }
240 236
@@ -245,13 +241,31 @@ impl WireGuard {
245 241
246 async fn link_up(&self, ifindex: u32) -> Result<()> { 242 async fn link_up(&self, ifindex: u32) -> Result<()> {
247 tracing::trace!("Bringing up interface {}", ifindex); 243 tracing::trace!("Bringing up interface {}", ifindex);
248 self.rt_handle.link().set(ifindex).up().execute().await?; 244 self.rt_handle
245 .link()
246 .set(
247 LinkMessageBuilder::<LinkSetRequest>::default()
248 .index(ifindex)
249 .up()
250 .build(),
251 )
252 .execute()
253 .await?;
249 Ok(()) 254 Ok(())
250 } 255 }
251 256
252 async fn link_down(&self, ifindex: u32) -> Result<()> { 257 async fn link_down(&self, ifindex: u32) -> Result<()> {
253 tracing::trace!("Bringing down interface {}", ifindex); 258 tracing::trace!("Bringing down interface {}", ifindex);
254 self.rt_handle.link().set(ifindex).down().execute().await?; 259 self.rt_handle
260 .link()
261 .set(
262 LinkMessageBuilder::<LinkSetRequest>::default()
263 .index(ifindex)
264 .down()
265 .build(),
266 )
267 .execute()
268 .await?;
255 Ok(()) 269 Ok(())
256 } 270 }
257 271
@@ -314,30 +328,37 @@ impl WireGuard {
314 #[allow(unused)] 328 #[allow(unused)]
315 async fn route_add(&self, ifindex: u32, net: ipnet::IpNet) -> Result<()> { 329 async fn route_add(&self, ifindex: u32, net: ipnet::IpNet) -> Result<()> {
316 tracing::trace!("Adding route {} to {}", net, ifindex); 330 tracing::trace!("Adding route {} to {}", net, ifindex);
317 let request = self
318 .rt_handle
319 .route()
320 .add()
321 .scope(RouteScope::Link)
322 .output_interface(ifindex)
323 .replace();
324 331
325 match net.addr() { 332 match net.addr() {
326 std::net::IpAddr::V4(ip) => { 333 std::net::IpAddr::V4(ip) => {
327 request 334 self.rt_handle
328 .v4() 335 .route()
329 .destination_prefix(ip, net.prefix_len()) 336 .add(
337 RouteMessageBuilder::<Ipv4Addr>::default()
338 .scope(RouteScope::Link)
339 .output_interface(ifindex)
340 .destination_prefix(ip, net.prefix_len())
341 .build(),
342 )
343 .replace()
330 .execute() 344 .execute()
331 .await 345 .await?;
332 } 346 }
333 std::net::IpAddr::V6(ip) => { 347 std::net::IpAddr::V6(ip) => {
334 request 348 self.rt_handle
335 .v6() 349 .route()
336 .destination_prefix(ip, net.prefix_len()) 350 .add(
351 RouteMessageBuilder::<Ipv6Addr>::default()
352 .scope(RouteScope::Link)
353 .output_interface(ifindex)
354 .destination_prefix(ip, net.prefix_len())
355 .build(),
356 )
357 .replace()
337 .execute() 358 .execute()
338 .await 359 .await?;
339 } 360 }
340 }?; 361 };
341 362
342 Ok(()) 363 Ok(())
343 } 364 }