summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Zalamena <rzalamena@opensourcerouting.org>2019-02-01 09:50:06 -0200
committerRafael Zalamena <rzalamena@opensourcerouting.org>2019-02-14 14:17:29 -0200
commit843b324ddd620e5b70bf0ac1f5d02e697e986e3d (patch)
treeb647f80fbe0b6d1cba8a0542595b995ab00b312b
parent6f4beb7b300d13c8b84dd31f2c685335c8a5e4a7 (diff)
bfdd: generate random session identificators
This also avoids returning `session_id == 0` which should not happen. Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
-rw-r--r--bfdd/bfd.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/bfdd/bfd.c b/bfdd/bfd.c
index c092b672d3..aa09d0be4a 100644
--- a/bfdd/bfd.c
+++ b/bfdd/bfd.c
@@ -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)