pimd: FIXED C14 T32 Detection of interface primary address changes may fail.
diff --git a/pimd/pim_iface.c b/pimd/pim_iface.c
index 72626ec..3dee751 100644
--- a/pimd/pim_iface.c
+++ b/pimd/pim_iface.c
@@ -286,6 +286,7 @@
{
struct pim_interface *pim_ifp;
struct in_addr new_prim_addr;
+ int changed;
pim_ifp = ifp->info;
if (!pim_ifp)
@@ -293,17 +294,20 @@
new_prim_addr = pim_find_primary_addr(ifp);
+ changed = new_prim_addr.s_addr != pim_ifp->primary_address.s_addr;
+
if (PIM_DEBUG_ZEBRA) {
char new_prim_str[100];
char old_prim_str[100];
pim_inet4_dump("<new?>", new_prim_addr, new_prim_str, sizeof(new_prim_str));
pim_inet4_dump("<old?>", pim_ifp->primary_address, old_prim_str, sizeof(old_prim_str));
- zlog_debug("%s: old primary addr %s, new primary addr %s on interface %s",
+ zlog_debug("%s: old=%s new=%s on interface %s: %s",
__PRETTY_FUNCTION__,
- old_prim_str, new_prim_str, ifp->name);
+ old_prim_str, new_prim_str, ifp->name,
+ changed ? "changed" : "unchanged");
}
- if (new_prim_addr.s_addr != pim_ifp->primary_address.s_addr) {
+ if (changed) {
struct in_addr old_addr = pim_ifp->primary_address;
pim_ifp->primary_address = new_prim_addr;
@@ -328,6 +332,16 @@
if (!if_is_operative(ifp))
return;
+ if (PIM_DEBUG_ZEBRA) {
+ char buf[BUFSIZ];
+ prefix2str(ifc->address, buf, BUFSIZ);
+ zlog_debug("%s: %s connected IP address %s %s",
+ __PRETTY_FUNCTION__,
+ ifp->name, buf,
+ CHECK_FLAG(ifc->flags, ZEBRA_IFA_SECONDARY) ?
+ "secondary" : "primary");
+ }
+
ifaddr = ifc->address->u.prefix4;
detect_primary_address_change(ifp, __PRETTY_FUNCTION__);
@@ -437,6 +451,16 @@
ifp = ifc->ifp;
zassert(ifp);
+ if (PIM_DEBUG_ZEBRA) {
+ char buf[BUFSIZ];
+ prefix2str(ifc->address, buf, BUFSIZ);
+ zlog_debug("%s: %s disconnected IP address %s %s",
+ __PRETTY_FUNCTION__,
+ ifp->name, buf,
+ CHECK_FLAG(ifc->flags, ZEBRA_IFA_SECONDARY) ?
+ "secondary" : "primary");
+ }
+
detect_primary_address_change(ifp, __PRETTY_FUNCTION__);
pim_if_addr_del_igmp(ifc);
@@ -523,7 +547,7 @@
}
}
-static struct in_addr find_first_addr(struct interface *ifp)
+static struct in_addr find_first_nonsec_addr(struct interface *ifp)
{
struct connected *ifc;
struct listnode *node;
@@ -541,6 +565,9 @@
continue;
}
+ if (CHECK_FLAG (ifc->flags, ZEBRA_IFA_SECONDARY))
+ continue;
+
return p->u.prefix4;
}
@@ -551,7 +578,7 @@
struct in_addr pim_find_primary_addr(struct interface *ifp)
{
- return find_first_addr(ifp);
+ return find_first_nonsec_addr(ifp);
}
/*