pimd: FIXED C14 T32 Detection of interface primary address changes may fail.
diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c
index 820b0ef..f0aa84f 100644
--- a/pimd/pim_zebra.c
+++ b/pimd/pim_zebra.c
@@ -203,10 +203,12 @@
if (p->family != AF_INET)
continue;
- zlog_debug("%s %s: interface %s address %s",
+ zlog_debug("%s %s: interface %s address %s %s",
__FILE__, __PRETTY_FUNCTION__,
ifp->name,
- inet_ntoa(p->u.prefix4));
+ inet_ntoa(p->u.prefix4),
+ CHECK_FLAG(ifc->flags, ZEBRA_IFA_SECONDARY) ?
+ "secondary" : "primary");
}
}
#endif
@@ -238,15 +240,36 @@
if (PIM_DEBUG_ZEBRA) {
char buf[BUFSIZ];
prefix2str(p, buf, BUFSIZ);
- zlog_debug("%s: %s connected IP address %s flags %u",
+ zlog_debug("%s: %s connected IP address %s flags %u %s",
__PRETTY_FUNCTION__,
- c->ifp->name, buf, c->flags);
+ c->ifp->name, buf, c->flags,
+ CHECK_FLAG(c->flags, ZEBRA_IFA_SECONDARY) ? "secondary" : "primary");
#ifdef PIM_DEBUG_IFADDR_DUMP
dump_if_address(c->ifp);
#endif
}
+ if (!CHECK_FLAG(c->flags, ZEBRA_IFA_SECONDARY)) {
+ /* trying to add primary address */
+
+ struct in_addr primary_addr = pim_find_primary_addr(c->ifp);
+ if (primary_addr.s_addr != p->u.prefix4.s_addr) {
+ /* but we had a primary address already */
+
+ char buf[BUFSIZ];
+ char old[100];
+
+ prefix2str(p, buf, BUFSIZ);
+ pim_inet4_dump("<old?>", primary_addr, old, sizeof(old));
+
+ zlog_warn("%s: %s primary addr old=%s: forcing secondary flag on new=%s",
+ __PRETTY_FUNCTION__,
+ c->ifp->name, old, buf);
+ SET_FLAG(c->flags, ZEBRA_IFA_SECONDARY);
+ }
+ }
+
pim_if_addr_add(c);
return 0;
@@ -279,15 +302,16 @@
if (PIM_DEBUG_ZEBRA) {
char buf[BUFSIZ];
prefix2str(p, buf, BUFSIZ);
- zlog_debug("%s: %s disconnected IP address %s flags %u",
+ zlog_debug("%s: %s disconnected IP address %s flags %u %s",
__PRETTY_FUNCTION__,
- c->ifp->name, buf, c->flags);
+ c->ifp->name, buf, c->flags,
+ CHECK_FLAG(c->flags, ZEBRA_IFA_SECONDARY) ? "secondary" : "primary");
#ifdef PIM_DEBUG_IFADDR_DUMP
dump_if_address(c->ifp);
#endif
}
-
+
pim_if_addr_del(c);
return 0;