Hi Mitchell Thanks a lot for the work you are putting into BFD, I'll be able to review this properly over the weekend.
-peter On 2019 Jun 03 (Mon) at 20:37:17 +1000 (+1000), Mitchell Krome wrote: :Hi, : :Testing bfd against frr on linux, their bfd implementation sends polls :as soon as the session is up even if the session timers haven't :changed from what it was advertising while it was in the down state. :Currently openbsd bfd doesn't respond to polls, so this diff adds that :support. tcpdump output during session setup (.9 is openbsd): : :14:56:31.225339 10.10.20.9.58974 > 10.10.20.10.bfd-control: [udp sum ok] BFD v1 length 24 state down flags [] diag none my-discrim 3396727743 your-discrim 0 mintx 1000000 minrx 1000000 minecho 0 multiplier 3 [to s 0xc0] (ttl 255, id 48014, len 52) :14:56:31.533645 10.10.20.10.49143 > 10.10.20.9.bfd-control: [udp sum ok] BFD v1 length 24 state init flags [] diag neighbor-down my-discrim 2 your-discrim 3396727743 mintx 1500000 minrx 1500000 minecho 50000 mul tiplier 3 (DF) [tos 0xc0] (ttl 255, id 36838, len 52) :14:56:32.022601 10.10.20.9.58974 > 10.10.20.10.bfd-control: [udp sum ok] BFD v1 length 24 state up flags [] diag none my-discrim 3396727743 your-discrim 2 mintx 1000000 minrx 1500000 minecho 0 multiplier 3 [tos 0xc0] (ttl 255, id 21474, len 52) :14:56:32.023134 10.10.20.10.49143 > 10.10.20.9.bfd-control: [udp sum ok] BFD v1 length 24 state up flags [P] diag none my-discrim 2 your-discrim 3396727743 mintx 1500000 minrx 1500000 minecho 50000 multiplier 3 (DF) [tos 0xc0] (ttl 255, id 36952, len 52) :14:56:32.023207 10.10.20.9.58974 > 10.10.20.10.bfd-control: [udp sum ok] BFD v1 length 24 state up flags [F] diag none my-discrim 3396727743 your-discrim 2 mintx 1500000 minrx 1500000 minecho 0 multiplier 3 [tos 0xc0] (ttl 255, id 23805, len 52) :14:56:32.997091 10.10.20.10.49143 > 10.10.20.9.bfd-control: [udp sum ok] BFD v1 length 24 state up flags [] diag none my-discrim 2 your-discrim 3396727743 mintx 1500000 minrx 1500000 minecho 50000 multiplier 3 ( DF) [tos 0xc0] (ttl 255, id 36991, len 52) : :I also added some handling for generating polls and receiving finals while :in there, but there isn't any code to actually start our own poll :sequence just yet. : :I only have frr and openbsd peers to test with - if anybody has :something else hooked up would be good to check what they do. : :Mitchell : : :diff --git sys/net/bfd.c sys/net/bfd.c :index 42995531a8a..2ae287a15bb 100644 :--- sys/net/bfd.c :+++ sys/net/bfd.c :@@ -741,6 +741,8 @@ bfd_reset(struct bfd_config *bfd) : : bfd->bc_mode = BFD_MODE_ASYNC; : bfd->bc_state = BFD_STATE_DOWN; :+ bfd->bc_poll_seq = 0; :+ bfd->bc_poll_rcvd = 0; : : /* rfc5880 6.8.18 */ : bfd->bc_neighbor->bn_lstate = BFD_STATE_DOWN; :@@ -825,7 +827,10 @@ bfd_input(struct bfd_config *bfd, struct mbuf *m) : bfd->bc_neighbor->bn_rdiscr = ntohl(peer->bfd_my_discriminator); : bfd->bc_neighbor->bn_rstate = state; : bfd->bc_neighbor->bn_rdemand = (flags & BFD_FLAG_D); :- bfd->bc_poll = (flags & BFD_FLAG_F); :+ :+ if (flags & BFD_FLAG_F && bfd->bc_poll_seq) { :+ bfd->bc_poll_seq = 0; :+ } : : /* Local change to the algorithm, we don't accept below 50ms */ : if (ntohl(peer->bfd_required_min_rx_interval) < BFD_MINIMUM) :@@ -891,6 +896,12 @@ bfd_input(struct bfd_config *bfd, struct mbuf *m) : : bfd->bc_error = 0; : :+ /* Reply to poll if we aren't down */ :+ if (flags & BFD_FLAG_P && bfd->bc_state > BFD_STATE_DOWN) { :+ bfd->bc_poll_rcvd = 1; :+ bfd_send_control(bfd); :+ } :+ : discard: : bfd->bc_neighbor->bn_rdiag = diag; : m_free(m); :@@ -979,6 +990,13 @@ bfd_send_control(void *x) : : h->bfd_ver_diag = ((BFD_VERSION << 5) | (bfd->bc_neighbor->bn_ldiag)); : h->bfd_sta_flags = (bfd->bc_state << 6); :+ /* Can't send a poll and a final in the same packet. */ :+ if (bfd->bc_poll_rcvd) { :+ h->bfd_sta_flags |= BFD_FLAG_F; :+ bfd->bc_poll_rcvd = 0; :+ } else if (bfd->bc_poll_seq) { :+ h->bfd_sta_flags |= BFD_FLAG_P; :+ } : h->bfd_detect_multi = bfd->bc_neighbor->bn_mult; : h->bfd_length = BFD_HDRLEN; : h->bfd_my_discriminator = htonl(bfd->bc_neighbor->bn_ldiscr); :diff --git sys/net/bfd.h sys/net/bfd.h :index 3e8da45086f..8ee372faa5d 100644 :--- sys/net/bfd.h :+++ sys/net/bfd.h :@@ -143,7 +143,8 @@ struct bfd_config { : time_t bc_lastuptime; : unsigned int bc_laststate; : unsigned int bc_state; :- unsigned int bc_poll; :+ unsigned int bc_poll_seq; :+ unsigned int bc_poll_rcvd; : unsigned int bc_error; : uint32_t bc_minrx; : uint32_t bc_mintx; : -- Philosophy will clip an angel's wings. -- John Keats