]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: Ensure new generation_id is different from previous
authorDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 2 Jul 2015 17:22:49 +0000 (13:22 -0400)
committerDonald Sharp <sharpd@cumulusnetwroks.com>
Thu, 26 May 2016 00:38:33 +0000 (20:38 -0400)
The RFC states that an interfaces generation_id must be changed
if it experiences an if down.  From 4.3.1:

The GenID option contains a randomly generated
32-bit value that is regenerated each time PIM forwarding is started
or restarted on the interface, including when the router itself
restarts.

Since we are only grabbing a new generation_id without comparing
it to the previous generation_id, it is possible that random
can generate the exact same number.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
pimd/pim_pim.c

index 7dcb501997b8df59baf9decad298b93b484fc920..41c26a8883b6af32e706bf19aab0f74f991d8d69 100644 (file)
@@ -698,6 +698,7 @@ int pim_sock_add(struct interface *ifp)
 {
   struct pim_interface *pim_ifp;
   struct in_addr ifaddr;
+  uint32_t old_genid;
 
   pim_ifp = ifp->info;
   zassert(pim_ifp);
@@ -720,7 +721,18 @@ int pim_sock_add(struct interface *ifp)
   pim_ifp->t_pim_sock_read   = 0;
   pim_ifp->pim_sock_creation = pim_time_monotonic_sec();
 
-  pim_ifp->pim_generation_id = random();
+  /*
+   * Just ensure that the new generation id
+   * actually chooses something different.
+   * Actually ran across a case where this
+   * happened, pre-switch to random().
+   * While this is unlikely to happen now
+   * let's make sure it doesn't.
+   */
+  old_genid = pim_ifp->pim_generation_id;
+
+  while (old_genid == pim_ifp->pim_generation_id)
+    pim_ifp->pim_generation_id = random();
 
   zlog_info("PIM INTERFACE UP: on interface %s ifindex=%d",
            ifp->name, ifp->ifindex);