diff --git a/examples/add_route.rs b/examples/add_route.rs index ab7ff81..f332d55 100644 --- a/examples/add_route.rs +++ b/examples/add_route.rs @@ -42,7 +42,7 @@ async fn add_route( ) -> Result<(), Error> { let route = RouteMessageBuilder::::new() .destination_prefix(dest.ip(), dest.prefix()) - .gateway(gateway.ip()) + .gateway(gateway.ip().into()) .table_id(TEST_TABLE_ID) .build(); handle.route().add(route).execute().await?; diff --git a/src/route/builder.rs b/src/route/builder.rs index 85c3172..9704de2 100644 --- a/src/route/builder.rs +++ b/src/route/builder.rs @@ -8,7 +8,7 @@ use std::{ use netlink_packet_route::{ route::{ RouteAddress, RouteAttribute, RouteHeader, RouteMessage, RouteProtocol, - RouteScope, RouteType, + RouteScope, RouteType, RouteVia, }, AddressFamily, }; @@ -153,10 +153,12 @@ impl RouteMessageBuilder { } /// Sets the gateway (via) address. - pub fn gateway(mut self, addr: Ipv4Addr) -> Self { - self.message - .attributes - .push(RouteAttribute::Gateway(RouteAddress::Inet(addr))); + pub fn gateway(mut self, addr: IpAddr) -> Self { + let attr = match addr { + IpAddr::V4(v4) => RouteAttribute::Gateway(RouteAddress::Inet(v4)), + IpAddr::V6(v6) => RouteAttribute::Via(RouteVia::Inet6(v6)), + }; + self.message.attributes.push(attr); self } } @@ -351,25 +353,15 @@ impl RouteMessageBuilder { mut self, addr: IpAddr, ) -> Result { - self.set_address_family_from_ip_addr(addr); - match self.message.header.address_family { - AddressFamily::Inet => { - if addr.is_ipv6() { - return Err(InvalidRouteMessage::Gateway(addr)); - }; + use AddressFamily::*; + let attr = match (self.message.header.address_family, addr) { + (Inet, addr @ IpAddr::V4(_)) | (Inet6, addr @ IpAddr::V6(_)) => { + RouteAttribute::Gateway(addr.into()) } - AddressFamily::Inet6 => { - if addr.is_ipv4() { - return Err(InvalidRouteMessage::Gateway(addr)); - }; - } - af => { - return Err(InvalidRouteMessage::AddressFamily(af)); - } - } - self.message - .attributes - .push(RouteAttribute::Gateway(addr.into())); + (Inet, IpAddr::V6(v6)) => RouteAttribute::Via(RouteVia::Inet6(v6)), + (af, _) => return Err(InvalidRouteMessage::AddressFamily(af)), + }; + self.message.attributes.push(attr); Ok(self) }