bfd_main_t *bm = &bfd_main;
if (admin_up_down)
{
+ BFD_DBG ("Session set admin-up, bs-idx=%u", bs->bs_idx);
bfd_set_state (bm, bs, BFD_STATE_down, 0);
+ bfd_set_diag (bs, BFD_DIAG_CODE_no_diag);
}
else
{
- bfd_set_diag (bs, BFD_DIAG_CODE_neighbor_sig_down);
+ BFD_DBG ("Session set admin-down, bs-idx=%u", bs->bs_idx);
+ bfd_set_diag (bs, BFD_DIAG_CODE_admin_down);
bfd_set_state (bm, bs, BFD_STATE_admin_down, 0);
}
}
break;
case BFD_STATE_init:
bfd_set_effective_desired_min_tx (bm, bs, now,
- clib_max
- (bs->config_desired_min_tx_clocks,
- bm->default_desired_min_tx_clocks));
+ bs->config_desired_min_tx_clocks);
bfd_set_timer (bm, bs, now, handling_wakeup);
break;
case BFD_STATE_up:
switch (bs->local_state)
{
case BFD_STATE_admin_down:
- BFD_ERR ("Unexpected timeout when in %s state",
- bfd_state_string (bs->local_state));
- abort ();
+ bfd_send_periodic (vm, rt, bm, bs, now, 1);
break;
case BFD_STATE_down:
bfd_send_periodic (vm, rt, bm, bs, now, 1);
break;
case BFD_STATE_init:
- BFD_ERR ("Unexpected timeout when in %s state",
- bfd_state_string (bs->local_state));
- abort ();
- break;
+ /* fallthrough */
case BFD_STATE_up:
bfd_check_rx_timeout (bm, bs, now, 1);
bfd_send_periodic (vm, rt, bm, bs, now, 1);
}
}
if (BFD_STATE_admin_down == bs->local_state)
- return;
+ {
+ BFD_DBG ("Session is admin-down, ignoring packet, bs_idx=%u",
+ bs->bs_idx);
+ return;
+ }
if (BFD_STATE_admin_down == bs->remote_state)
{
bfd_set_diag (bs, BFD_DIAG_CODE_neighbor_sig_down);
def test_conn_down(self):
""" verify session goes down after inactivity """
bfd_session_up(self)
- for dummy in range(self.test_session.detect_mult):
- wait_for_bfd_packet(self)
- self.assert_equal(len(self.vapi.collect_events()), 0,
- "number of bfd events")
+ detection_time = self.vpp_session.detect_mult *\
+ self.vpp_session.required_min_rx / USEC_IN_SEC
+ self.sleep(detection_time, "waiting for BFD session time-out")
e = self.vapi.wait_for_event(1, "bfd_udp_session_details")
verify_event(self, e, expected_state=BFDState.down)
"time before bfd session goes down")
verify_event(self, e, expected_state=BFDState.down)
- def test_modify_des_min_tx(self):
- """ modify desired min tx interval """
- pass
-
def test_modify_detect_mult(self):
""" modify detect multiplier """
bfd_session_up(self)
self.assert_equal(udp_sport_tx, udp_sport_rx, "UDP source port (== "
"ECHO packet identifier for test purposes)")
+ def test_admin_up_down(self):
+ bfd_session_up(self)
+ self.vpp_session.admin_down()
+ self.pg0.enable_capture()
+ e = self.vapi.wait_for_event(1, "bfd_udp_session_details")
+ verify_event(self, e, expected_state=BFDState.admin_down)
+ for dummy in range(2):
+ p = wait_for_bfd_packet(self)
+ self.assert_equal(BFDState.admin_down, p[BFD].state, BFDState)
+ # try to bring session up - shouldn't be possible
+ self.test_session.update(state=BFDState.init)
+ self.test_session.send_packet()
+ for dummy in range(2):
+ p = wait_for_bfd_packet(self)
+ self.assert_equal(BFDState.admin_down, p[BFD].state, BFDState)
+ self.vpp_session.admin_up()
+ self.test_session.update(state=BFDState.down)
+ e = self.vapi.wait_for_event(1, "bfd_udp_session_details")
+ verify_event(self, e, expected_state=BFDState.down)
+ p = wait_for_bfd_packet(self)
+ self.assert_equal(BFDState.down, p[BFD].state, BFDState)
+ self.test_session.send_packet()
+ p = wait_for_bfd_packet(self)
+ self.assert_equal(BFDState.init, p[BFD].state, BFDState)
+ e = self.vapi.wait_for_event(1, "bfd_udp_session_details")
+ verify_event(self, e, expected_state=BFDState.init)
+ self.test_session.update(state=BFDState.up)
+ self.test_session.send_packet()
+ p = wait_for_bfd_packet(self)
+ self.assert_equal(BFDState.up, p[BFD].state, BFDState)
+ e = self.vapi.wait_for_event(1, "bfd_udp_session_details")
+ verify_event(self, e, expected_state=BFDState.up)
+
class BFD6TestCase(VppTestCase):
"""Bidirectional Forwarding Detection (BFD) (IPv6) """