Skip to content

Commit a09ba72

Browse files
committed
route: allow IPv6 gateway in IPv4 route
Linux supports it by using RTA_VIA instead of RTA_GATEWAY. Since it essentially acts as gateway, we extend the current API to allow it.
1 parent 515471f commit a09ba72

File tree

1 file changed

+16
-19
lines changed

1 file changed

+16
-19
lines changed

src/route/builder.rs

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use std::{
88
use netlink_packet_route::{
99
route::{
1010
RouteAddress, RouteAttribute, RouteHeader, RouteMessage, RouteProtocol,
11-
RouteScope, RouteType,
11+
RouteScope, RouteType, RouteVia,
1212
},
1313
AddressFamily,
1414
};
@@ -159,6 +159,13 @@ impl RouteMessageBuilder<Ipv4Addr> {
159159
.push(RouteAttribute::Gateway(RouteAddress::Inet(addr)));
160160
self
161161
}
162+
163+
pub fn gateway6(mut self, addr: Ipv6Addr) -> Self {
164+
self.message
165+
.attributes
166+
.push(RouteAttribute::Via(RouteVia::Inet6(addr)));
167+
self
168+
}
162169
}
163170

164171
impl Default for RouteMessageBuilder<Ipv4Addr> {
@@ -351,25 +358,15 @@ impl RouteMessageBuilder<IpAddr> {
351358
mut self,
352359
addr: IpAddr,
353360
) -> Result<Self, InvalidRouteMessage> {
354-
self.set_address_family_from_ip_addr(addr);
355-
match self.message.header.address_family {
356-
AddressFamily::Inet => {
357-
if addr.is_ipv6() {
358-
return Err(InvalidRouteMessage::Gateway(addr));
359-
};
361+
use AddressFamily::*;
362+
let attr = match (self.message.header.address_family, addr) {
363+
(Inet, addr @ IpAddr::V4(_)) | (Inet6, addr @ IpAddr::V6(_)) => {
364+
RouteAttribute::Gateway(addr.into())
360365
}
361-
AddressFamily::Inet6 => {
362-
if addr.is_ipv4() {
363-
return Err(InvalidRouteMessage::Gateway(addr));
364-
};
365-
}
366-
af => {
367-
return Err(InvalidRouteMessage::AddressFamily(af));
368-
}
369-
}
370-
self.message
371-
.attributes
372-
.push(RouteAttribute::Gateway(addr.into()));
366+
(Inet, IpAddr::V6(v6)) => RouteAttribute::Via(RouteVia::Inet6(v6)),
367+
(af, _) => return Err(InvalidRouteMessage::AddressFamily(af)),
368+
};
369+
self.message.attributes.push(attr);
373370
Ok(self)
374371
}
375372

0 commit comments

Comments
 (0)