mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-04-29 04:04:45 +00:00
agent: netlink: Use the grpc IP family field when updating the route
Not all routes have either a gateway or a destination IP. Interface routes, where the source, destination and gateway are undefined, will default to IP v4 with the current is_ipv6() check even when they are v6 routes. We use the provided gRPC Route.Family field instead. This field is built from the host netlink messages, and is a reliable way of finding out a route's IP family. Fixes: #2768 Signed-off-by: Samuel Ortiz <s.ortiz@apple.com>
This commit is contained in:
parent
71ce6cfe9e
commit
a44cde7e8d
@ -312,7 +312,6 @@ impl Handle {
|
|||||||
|
|
||||||
for route in list {
|
for route in list {
|
||||||
let link = self.find_link(LinkFilter::Name(&route.device)).await?;
|
let link = self.find_link(LinkFilter::Name(&route.device)).await?;
|
||||||
let is_v6 = is_ipv6(route.get_gateway()) || is_ipv6(route.get_dest());
|
|
||||||
|
|
||||||
const MAIN_TABLE: u8 = packet::constants::RT_TABLE_MAIN;
|
const MAIN_TABLE: u8 = packet::constants::RT_TABLE_MAIN;
|
||||||
const UNICAST: u8 = packet::constants::RTN_UNICAST;
|
const UNICAST: u8 = packet::constants::RTN_UNICAST;
|
||||||
@ -334,7 +333,7 @@ impl Handle {
|
|||||||
|
|
||||||
// `rtnetlink` offers a separate request builders for different IP versions (IP v4 and v6).
|
// `rtnetlink` offers a separate request builders for different IP versions (IP v4 and v6).
|
||||||
// This if branch is a bit clumsy because it does almost the same.
|
// This if branch is a bit clumsy because it does almost the same.
|
||||||
if is_v6 {
|
if route.get_family() == IPFamily::v6 {
|
||||||
let dest_addr = if !route.dest.is_empty() {
|
let dest_addr = if !route.dest.is_empty() {
|
||||||
Ipv6Network::from_str(&route.dest)?
|
Ipv6Network::from_str(&route.dest)?
|
||||||
} else {
|
} else {
|
||||||
@ -594,10 +593,6 @@ fn format_address(data: &[u8]) -> Result<String> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_ipv6(str: &str) -> bool {
|
|
||||||
Ipv6Addr::from_str(str).is_ok()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn parse_mac_address(addr: &str) -> Result<[u8; 6]> {
|
fn parse_mac_address(addr: &str) -> Result<[u8; 6]> {
|
||||||
let mut split = addr.splitn(6, ':');
|
let mut split = addr.splitn(6, ':');
|
||||||
|
|
||||||
@ -932,16 +927,6 @@ mod tests {
|
|||||||
assert_eq!(bytes, [0xAB, 0x0C, 0xDE, 0x12, 0x34, 0x56]);
|
assert_eq!(bytes, [0xAB, 0x0C, 0xDE, 0x12, 0x34, 0x56]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn check_ipv6() {
|
|
||||||
assert!(is_ipv6("::1"));
|
|
||||||
assert!(is_ipv6("2001:0:3238:DFE1:63::FEFB"));
|
|
||||||
|
|
||||||
assert!(!is_ipv6(""));
|
|
||||||
assert!(!is_ipv6("127.0.0.1"));
|
|
||||||
assert!(!is_ipv6("10.10.10.10"));
|
|
||||||
}
|
|
||||||
|
|
||||||
fn clean_env_for_test_add_one_arp_neighbor(dummy_name: &str, ip: &str) {
|
fn clean_env_for_test_add_one_arp_neighbor(dummy_name: &str, ip: &str) {
|
||||||
// ip link delete dummy
|
// ip link delete dummy
|
||||||
Command::new("ip")
|
Command::new("ip")
|
||||||
|
Loading…
Reference in New Issue
Block a user