Adjacency-BFD: assume BFD down on create 88/13488/2
authorNeale Ranns <nranns@cisco.com>
Mon, 16 Jul 2018 13:12:33 +0000 (06:12 -0700)
committerJohn Lo <loj@cisco.com>
Mon, 16 Jul 2018 18:14:00 +0000 (18:14 +0000)
Change-Id: I13279a1a96df457209fb25748a643c01b18ff4e0
Signed-off-by: Neale Ranns <nranns@cisco.com>
src/vnet/adj/adj_bfd.c
src/vnet/fib/fib_test.c

index de7abfe..624d22f 100644 (file)
@@ -29,6 +29,13 @@ typedef enum adj_bfd_state_t_
     ADJ_BFD_STATE_UP,
 } adj_bfd_state_t;
 
+#define ADJ_BFD_STATES {                        \
+    [ADJ_BFD_STATE_DOWN] = "down",              \
+    [ADJ_BFD_STATE_UP]   = "up",                \
+}
+
+static const char *adj_bfd_state_names[] = ADJ_BFD_STATES;
+
 /**
  * BFD delegate daa
  */
@@ -165,16 +172,17 @@ adj_bfd_notify (bfd_listen_event_e event,
             pool_get(abd_pool, abd);
 
             /*
-             * pretend the session is up and skip the walk.
-             * If we set it down then we get traffic loss on new children.
-             * if we walk then we lose traffic for existing children. Wait
-             * for the first BFD UP/DOWN before we let the session's state
-             * influence forwarding.
+             * it would be best here if we could ignore this create and just
+             * wait for the first update, but this is not posible because
+             * BFD sessions are created in the down state, and can remain this
+             * way without transitioning to another state if the peer is
+             * unresponxive. So we have to assuem down and wait for up.
              */
-            abd->abd_state = ADJ_BFD_STATE_UP;
+            abd->abd_state = ADJ_BFD_STATE_DOWN;
             abd->abd_index = session->bs_idx;
 
             adj_delegate_add(adj_get(ai), ADJ_DELEGATE_BFD, abd - abd_pool);
+            adj_bfd_update_walk(ai);
         }
         break;
 
@@ -258,8 +266,8 @@ adj_delegate_fmt_bfd (const adj_delegate_t *aed, u8 *s)
 {
     const adj_bfd_delegate_t *abd = adj_bfd_from_const_base(aed);
 
-    s = format(s, "BFD:[state:%d index:%d]",
-               abd->abd_state,
+    s = format(s, "BFD:[state:%s index:%d]",
+               adj_bfd_state_names[abd->abd_state],
                abd->abd_index);
 
     return (s);
index 9554083..fb268e6 100644 (file)
@@ -8198,7 +8198,7 @@ fib_test_bfd (void)
     /*
      * whilst the BFD session is not signalled, the adj is up
      */
-    FIB_TEST(adj_is_up(ai_10_10_10_1), "Adj state up on uninit session");
+    FIB_TEST(!adj_is_up(ai_10_10_10_1), "Adj state down on uninit session");
 
     /*
      * bring the BFD session up
@@ -8214,7 +8214,6 @@ fib_test_bfd (void)
     adj_bfd_notify(BFD_LISTEN_EVENT_UPDATE, &bfd_10_10_10_1);
     FIB_TEST(!adj_is_up(ai_10_10_10_1), "Adj state down on DOWN session");
 
-
     /*
      * add an attached next hop FIB entry via the down adj
      */