From c29c0f61de9d8ae208aeffe919942b113f3271d4 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Thu, 2 Jul 2015 13:22:49 -0400 Subject: [PATCH] pimd: Ensure new generation_id is different from previous 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 --- pimd/pim_pim.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/pimd/pim_pim.c b/pimd/pim_pim.c index 7dcb501997..41c26a8883 100644 --- a/pimd/pim_pim.c +++ b/pimd/pim_pim.c @@ -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); -- 2.39.5