summaryrefslogtreecommitdiff
path: root/zebra/if_netlink.c
diff options
context:
space:
mode:
authorYuan Yuan <yyuanam@amazon.com>2021-09-22 20:02:40 +0000
committerYuan Yuan <yyuanam@amazon.com>2021-10-06 02:00:39 +0000
commit8eec31ef564dcf4e096e700a648570973ca4e96b (patch)
tree468f4bb4ae5f9797e15337cd739001075b7fa70b /zebra/if_netlink.c
parenta8a5b215148a1b5857085e4318a6e9af876453df (diff)
Zebra: Ignore the failure of startup intf lookup.
In startup, zebra would dump interface information from Kernel in 3 steps w/o lock: step1, get interface information; step2, get interface ipv4 address; step3, get interface ipv6 address. If any interface gets added after step1, but before step2/3, zebra would get extra interface addresses in step2/3 that has not been added into zebra in step1. Returning error in the referenced interface lookup would cause the startup interface retrieval to be incomplete. Signed-off-by: Yuan Yuan <yyuanam@amazon.com>
Diffstat (limited to 'zebra/if_netlink.c')
-rw-r--r--zebra/if_netlink.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c
index acd6697b65..8e52ef4047 100644
--- a/zebra/if_netlink.c
+++ b/zebra/if_netlink.c
@@ -1302,11 +1302,22 @@ int netlink_interface_addr(struct nlmsghdr *h, ns_id_t ns_id, int startup)
ifp = if_lookup_by_index_per_ns(zns, ifa->ifa_index);
if (ifp == NULL) {
- flog_err(
- EC_LIB_INTERFACE,
- "netlink_interface_addr can't find interface by index %d",
- ifa->ifa_index);
- return -1;
+ if (startup) {
+ /* During startup, failure to lookup the referenced
+ * interface should not be an error, so we have
+ * downgraded this condition to warning, and we permit
+ * the startup interface state retrieval to continue.
+ */
+ flog_warn(EC_LIB_INTERFACE,
+ "%s: can't find interface by index %d",
+ __func__, ifa->ifa_index);
+ return 0;
+ } else {
+ flog_err(EC_LIB_INTERFACE,
+ "%s: can't find interface by index %d",
+ __func__, ifa->ifa_index);
+ return -1;
+ }
}
/* Flags passed through */