From 7d0b616cf30e8c88dac604b13c4fec116a9ed082 Mon Sep 17 00:00:00 2001 From: zhaojizhuang <571130360@qq.com> Date: Fri, 15 Oct 2021 11:28:45 +0800 Subject: [PATCH] agent: Do not fail when trying to adding existing routes Adding a route that already exists should not be a reason for the agent to fail booting and thus preventing the sandbox to start. Fixes #2712 Signed-off-by: zhaojizhuang <571130360@qq.com> --- src/agent/src/netlink.rs | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/src/agent/src/netlink.rs b/src/agent/src/netlink.rs index 1d488b3880..730c2ff212 100644 --- a/src/agent/src/netlink.rs +++ b/src/agent/src/netlink.rs @@ -6,6 +6,7 @@ use anyhow::{anyhow, Context, Result}; use futures::{future, StreamExt, TryStreamExt}; use ipnetwork::{IpNetwork, Ipv4Network, Ipv6Network}; +use nix::errno::Errno; use protobuf::RepeatedField; use protocols::types::{ARPNeighbor, IPAddress, IPFamily, Interface, Route}; use rtnetlink::{new_connection, packet, IpVersion}; @@ -363,14 +364,17 @@ impl Handle { request = request.gateway(ip); } - request.execute().await.with_context(|| { - format!( - "Failed to add IP v6 route (src: {}, dst: {}, gtw: {})", - route.get_source(), - route.get_dest(), - route.get_gateway() - ) - })?; + if let Err(rtnetlink::Error::NetlinkError(message)) = request.execute().await { + if Errno::from_i32(message.code.abs()) != Errno::EEXIST { + return Err(anyhow!( + "Failed to add IP v6 route (src: {}, dst: {}, gtw: {},Err: {})", + route.get_source(), + route.get_dest(), + route.get_gateway(), + message + )); + } + } } else { let dest_addr = if !route.dest.is_empty() { Ipv4Network::from_str(&route.dest)? @@ -401,7 +405,17 @@ impl Handle { request = request.gateway(ip); } - request.execute().await?; + if let Err(rtnetlink::Error::NetlinkError(message)) = request.execute().await { + if Errno::from_i32(message.code.abs()) != Errno::EEXIST { + return Err(anyhow!( + "Failed to add IP v4 route (src: {}, dst: {}, gtw: {},Err: {})", + route.get_source(), + route.get_dest(), + route.get_gateway(), + message + )); + } + } } }