diff options
Diffstat (limited to 'src/lib.rs')
| -rw-r--r-- | src/lib.rs | 97 |
1 files changed, 59 insertions, 38 deletions
| @@ -3,18 +3,18 @@ mod key; | |||
| 3 | mod setup; | 3 | mod setup; |
| 4 | mod view; | 4 | mod view; |
| 5 | 5 | ||
| 6 | use std::borrow::Cow; | 6 | use std::{ |
| 7 | borrow::Cow, | ||
| 8 | net::{Ipv4Addr, Ipv6Addr}, | ||
| 9 | }; | ||
| 7 | 10 | ||
| 8 | use futures::{StreamExt, TryStreamExt}; | 11 | use futures::{StreamExt, TryStreamExt}; |
| 9 | use genetlink::{GenetlinkError, GenetlinkHandle}; | 12 | use genetlink::{GenetlinkError, GenetlinkHandle}; |
| 10 | use netlink_packet_core::{NetlinkMessage, NetlinkPayload, NLM_F_ACK, NLM_F_DUMP, NLM_F_REQUEST}; | 13 | use netlink_packet_core::{NetlinkMessage, NetlinkPayload, NLM_F_ACK, NLM_F_DUMP, NLM_F_REQUEST}; |
| 11 | use netlink_packet_generic::GenlMessage; | 14 | use netlink_packet_generic::GenlMessage; |
| 12 | use netlink_packet_route::{ | 15 | use netlink_packet_route::{link::LinkAttribute, route::RouteScope}; |
| 13 | link::{InfoKind, LinkAttribute, LinkInfo}, | 16 | use netlink_packet_wireguard::{WireguardAttribute, WireguardCmd, WireguardMessage}; |
| 14 | route::RouteScope, | 17 | use rtnetlink::{Handle, LinkMessageBuilder, LinkSetRequest, LinkWireguard, RouteMessageBuilder}; |
| 15 | }; | ||
| 16 | use netlink_packet_wireguard::{nlas::WgDeviceAttrs, Wireguard, WireguardCmd}; | ||
| 17 | use rtnetlink::Handle; | ||
| 18 | 18 | ||
| 19 | pub use conf::*; | 19 | pub use conf::*; |
| 20 | pub use key::*; | 20 | pub 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 | } |
