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;