]> git.proxmox.com Git - mirror_frr.git/commitdiff
bfdd: generate random session identificators
authorRafael Zalamena <rzalamena@opensourcerouting.org>
Fri, 1 Feb 2019 11:50:06 +0000 (09:50 -0200)
committerRafael Zalamena <rzalamena@opensourcerouting.org>
Thu, 14 Feb 2019 16:17:29 +0000 (14:17 -0200)
This also avoids returning `session_id == 0` which should not happen.

Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
bfdd/bfd.c

index c092b672d30684e89b269557f5798a1ad43d07ca..aa09d0be4ac26a8be9fb5cb1fbe56cdd2a9a0e39 100644 (file)
@@ -100,9 +100,18 @@ struct bfd_session *bs_peer_find(struct bfd_peer_cfg *bpc)
 
 static uint32_t ptm_bfd_gen_ID(void)
 {
-       static uint32_t sessionID = 1;
+       uint32_t session_id;
 
-       return (sessionID++);
+       /*
+        * RFC 5880, Section 6.8.1. recommends that we should generate
+        * random session identification numbers.
+        */
+       do {
+               session_id = ((random() << 16) & 0xFFFF0000)
+                            | (random() & 0x0000FFFF);
+       } while (session_id == 0 || bfd_id_lookup(session_id) != NULL);
+
+       return session_id;
 }
 
 void ptm_bfd_start_xmt_timer(struct bfd_session *bfd, bool is_echo)