]> git.puffer.fish Git - matthieu/frr.git/commitdiff
pimd: Receive incoming v6 addresses and place in pim_ifp list
authorDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 30 Mar 2017 13:10:05 +0000 (09:10 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 30 Mar 2017 13:34:03 +0000 (09:34 -0400)
Add code to properly receive v6 addresses up from zebra and to
properly place them into our interface secondary address list.

Additionally cleanup some code in pim_cmd.c that was broken
by these changes.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
pimd/pim_cmd.c
pimd/pim_iface.c
pimd/pim_iface.h
pimd/pim_zebra.c

index 66fc8185d0f39f028a6f8622f0e89cf7683f1f89..91d870fb1edcde32995bb1bc9f75dbc0695f2100 100644 (file)
@@ -816,6 +816,7 @@ static void pim_show_interfaces_single(struct vty *vty, const char *ifname, u_ch
     mloop = pim_socket_mcastloop_get(pim_ifp->pim_sock_fd);
 
     if (uj) {
+      char pbuf[PREFIX2STR_BUFFER];
       json_row = json_object_new_object();
       json_object_pim_ifp_add(json_row, ifp);
 
@@ -827,7 +828,8 @@ static void pim_show_interfaces_single(struct vty *vty, const char *ifname, u_ch
 
         sec_list = json_object_new_array();
         for (ALL_LIST_ELEMENTS_RO(pim_ifp->sec_addr_list, sec_node, sec_addr)) {
-          json_object_array_add(sec_list, json_object_new_string(inet_ntoa(sec_addr->addr)));
+          json_object_array_add(sec_list,
+                                json_object_new_string(prefix2str(&sec_addr->addr, pbuf, PREFIX2STR_BUFFER)));
         }
         json_object_object_add(json_row, "secondaryAddressList", sec_list);
       }
@@ -918,11 +920,12 @@ static void pim_show_interfaces_single(struct vty *vty, const char *ifname, u_ch
         vty_out(vty, "Use Source : %s%s", inet_ntoa(pim_ifp->update_source), VTY_NEWLINE);
       }
       if (pim_ifp->sec_addr_list) {
+        char pbuf[PREFIX2STR_BUFFER];
         vty_out(vty, "Address    : %s (primary)%s",
-                                    inet_ntoa(ifaddr), VTY_NEWLINE);
+                inet_ntoa(ifaddr), VTY_NEWLINE);
         for (ALL_LIST_ELEMENTS_RO(pim_ifp->sec_addr_list, sec_node, sec_addr)) {
           vty_out(vty, "             %s%s",
-                                    inet_ntoa(sec_addr->addr), VTY_NEWLINE);
+                  prefix2str(&sec_addr->addr, pbuf, PREFIX2STR_BUFFER), VTY_NEWLINE);
         }
       } else {
         vty_out(vty, "Address    : %s%s", inet_ntoa(ifaddr), VTY_NEWLINE);
@@ -1607,13 +1610,9 @@ static void pim_show_neighbors_secondary(struct vty *vty)
                     neigh_src_str, sizeof(neigh_src_str));
 
       for (ALL_LIST_ELEMENTS_RO(neigh->prefix_list, prefix_node, p)) {
-       char neigh_sec_str[INET_ADDRSTRLEN];
+       char neigh_sec_str[100];
 
-       if (p->family != AF_INET)
-         continue;
-
-       pim_inet4_dump("<src?>", p->u.prefix4,
-                      neigh_sec_str, sizeof(neigh_sec_str));
+       prefix2str(p, neigh_sec_str, 100);
 
        vty_out(vty, "%-9s %-15s %-15s %-15s%s",
                ifp->name,
index a753cc4affc316f9e1dd54f8a921db9e72b85aca..f038acab8f6b1ca3b139a9916b3075b4edc49865 100644 (file)
@@ -324,12 +324,29 @@ static int pim_sec_addr_comp(const void *p1, const void *p2)
   const struct pim_secondary_addr *sec1 = p1;
   const struct pim_secondary_addr *sec2 = p2;
 
-  if (ntohl(sec1->addr.s_addr) < ntohl(sec2->addr.s_addr))
+  if (sec1->addr.family == AF_INET &&
+      sec2->addr.family == AF_INET6)
     return -1;
 
-  if (ntohl(sec1->addr.s_addr) > ntohl(sec2->addr.s_addr))
+  if (sec1->addr.family == AF_INET6 &&
+      sec2->addr.family == AF_INET)
     return 1;
 
+  if (sec1->addr.family == AF_INET)
+    {
+      if (ntohl(sec1->addr.u.prefix4.s_addr) < ntohl(sec2->addr.u.prefix4.s_addr))
+        return -1;
+
+      if (ntohl(sec1->addr.u.prefix4.s_addr) > ntohl(sec2->addr.u.prefix4.s_addr))
+        return 1;
+    }
+  else
+    {
+      return memcmp (&sec1->addr.u.prefix6,
+                     &sec2->addr.u.prefix6,
+                     sizeof (struct in6_addr));
+    }
+
   return 0;
 }
 
@@ -339,7 +356,7 @@ static void pim_sec_addr_free(struct pim_secondary_addr *sec_addr)
 }
 
 static struct pim_secondary_addr *
-pim_sec_addr_find(struct pim_interface *pim_ifp, struct in_addr addr)
+pim_sec_addr_find(struct pim_interface *pim_ifp, struct prefix *addr)
 {
   struct pim_secondary_addr *sec_addr;
   struct listnode *node;
@@ -349,7 +366,7 @@ pim_sec_addr_find(struct pim_interface *pim_ifp, struct in_addr addr)
   }
 
   for (ALL_LIST_ELEMENTS_RO(pim_ifp->sec_addr_list, node, sec_addr)) {
-    if (sec_addr->addr.s_addr == addr.s_addr) {
+    if (prefix_cmp(&sec_addr->addr, addr)) {
       return sec_addr;
     }
   }
@@ -364,7 +381,7 @@ static void pim_sec_addr_del(struct pim_interface *pim_ifp,
   pim_sec_addr_free(sec_addr);
 }
 
-static int pim_sec_addr_add(struct pim_interface *pim_ifp, struct in_addr addr)
+static int pim_sec_addr_add(struct pim_interface *pim_ifp, struct prefix *addr)
 {
   int changed = 0;
   struct pim_secondary_addr *sec_addr;
@@ -391,7 +408,7 @@ static int pim_sec_addr_add(struct pim_interface *pim_ifp, struct in_addr addr)
   }
 
   changed = 1;
-  sec_addr->addr = addr;
+  sec_addr->addr = *addr;
   listnode_add_sort(pim_ifp->sec_addr_list, sec_addr);
 
   return changed;
@@ -433,10 +450,6 @@ static int pim_sec_addr_update(struct interface *ifp)
   for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, ifc)) {
     struct prefix *p = ifc->address;
 
-    if (p->family != AF_INET) {
-      continue;
-    }
-
     if (PIM_INADDR_IS_ANY(p->u.prefix4)) {
       continue;
     }
@@ -446,7 +459,7 @@ static int pim_sec_addr_update(struct interface *ifp)
       continue;
     }
 
-    if (pim_sec_addr_add(pim_ifp, p->u.prefix4)) {
+    if (pim_sec_addr_add(pim_ifp, p)) {
       changed = 1;
     }
   }
@@ -571,12 +584,15 @@ void pim_if_addr_add(struct connected *ifc)
 
   detect_address_change(ifp, 0, __PRETTY_FUNCTION__);
 
+  if (ifc->address->family != AF_INET)
+    return;
+
   if (PIM_IF_TEST_IGMP(pim_ifp->options)) {
     struct igmp_sock *igmp;
 
     /* lookup IGMP socket */
     igmp = pim_igmp_sock_lookup_ifaddr(pim_ifp->igmp_socket_list,
-                                      ifaddr);
+                                       ifaddr);
     if (!igmp) {
       /* if addr new, add IGMP socket */
       pim_igmp_sock_add(pim_ifp->igmp_socket_list, ifaddr, ifp);
@@ -675,14 +691,17 @@ void pim_if_addr_del(struct connected *ifc, int force_prim_as_any)
   ifp = ifc->ifp;
   zassert(ifp);
 
+  if (ifc->address->family != AF_INET)
+    return;
+
   if (PIM_DEBUG_ZEBRA) {
     char buf[BUFSIZ];
     prefix2str(ifc->address, buf, BUFSIZ);
     zlog_debug("%s: %s ifindex=%d disconnected IP address %s %s",
-              __PRETTY_FUNCTION__,
-              ifp->name, ifp->ifindex, buf,
-              CHECK_FLAG(ifc->flags, ZEBRA_IFA_SECONDARY) ?
-              "secondary" : "primary");
+               __PRETTY_FUNCTION__,
+               ifp->name, ifp->ifindex, buf,
+               CHECK_FLAG(ifc->flags, ZEBRA_IFA_SECONDARY) ?
+               "secondary" : "primary");
   }
 
   detect_address_change(ifp, force_prim_as_any, __PRETTY_FUNCTION__);
@@ -709,12 +728,9 @@ void pim_if_addr_add_all(struct interface *ifp)
     struct prefix *p = ifc->address;
     
     if (p->family != AF_INET)
-      {
-        v6_addrs++;
-        continue;
-      }
-
-    v4_addrs++;
+      v6_addrs++;
+    else
+      v4_addrs++;
     pim_if_addr_add(ifc);
   }
 
index 8d332c70b08a333458c85df7bdf26241f6b72133..f4d7518d7afe5328eb00bc17a4e1e87b13b70077 100644 (file)
@@ -69,7 +69,7 @@ enum pim_secondary_addr_flags {
 };
 
 struct pim_secondary_addr {
-  struct in_addr addr;
+  struct prefix addr;
   enum pim_secondary_addr_flags flags;
 };
 
index d02560bfc2d6ed1a4c914506b369c035ad2b13f5..bbee95bddd7dab50c509dc60dc2c9feca91490b9 100644 (file)
@@ -257,31 +257,11 @@ static int pim_zebra_if_address_add(int command, struct zclient *zclient,
 #endif
   }
 
-  if (p->family != AF_INET)
-    {
-      struct listnode *cnode;
-      struct connected *conn;
-      int v4addrs = 0;
-
-      for (ALL_LIST_ELEMENTS_RO (c->ifp->connected, cnode, conn))
-        {
-          if (conn->address->family == AF_INET)
-           v4addrs++;
-        }
-      if (!v4addrs && pim_ifp) 
-       {
-         pim_ifp->primary_address = pim_find_primary_addr (c->ifp);
-         pim_if_addr_add_all (c->ifp);
-          pim_if_add_vif (c->ifp);
-       }
-      return 0;
-    }
-
   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) {
+    if (p->family != AF_INET || primary_addr.s_addr != p->u.prefix4.s_addr) {
       if (PIM_DEBUG_ZEBRA) {
        /* but we had a primary address already */