mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-05 13:21:22 +00:00
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 <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
f6f9c0094a
commit
c29c0f61de
@ -698,6 +698,7 @@ int pim_sock_add(struct interface *ifp)
|
|||||||
{
|
{
|
||||||
struct pim_interface *pim_ifp;
|
struct pim_interface *pim_ifp;
|
||||||
struct in_addr ifaddr;
|
struct in_addr ifaddr;
|
||||||
|
uint32_t old_genid;
|
||||||
|
|
||||||
pim_ifp = ifp->info;
|
pim_ifp = ifp->info;
|
||||||
zassert(pim_ifp);
|
zassert(pim_ifp);
|
||||||
@ -720,7 +721,18 @@ int pim_sock_add(struct interface *ifp)
|
|||||||
pim_ifp->t_pim_sock_read = 0;
|
pim_ifp->t_pim_sock_read = 0;
|
||||||
pim_ifp->pim_sock_creation = pim_time_monotonic_sec();
|
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",
|
zlog_info("PIM INTERFACE UP: on interface %s ifindex=%d",
|
||||||
ifp->name, ifp->ifindex);
|
ifp->name, ifp->ifindex);
|
||||||
|
Loading…
Reference in New Issue
Block a user