void
bfd_wait(const struct bfd *bfd) OVS_EXCLUDED(mutex)
{
- ovs_mutex_lock(&mutex);
- if (bfd->flags & FLAG_FINAL) {
- poll_immediate_wake();
+ poll_timer_wait_until(bfd_wake_time(bfd));
+}
+
+/* Returns the next wake up time. */
+long long int
+bfd_wake_time(const struct bfd *bfd) OVS_EXCLUDED(mutex)
+{
+ long long int retval;
+
+ if (!bfd) {
+ return LLONG_MAX;
}
- poll_timer_wait_until(bfd->next_tx);
- if (bfd->state > STATE_DOWN) {
- poll_timer_wait_until(bfd->detect_time);
+ ovs_mutex_lock(&mutex);
+ if (bfd->flags & FLAG_FINAL) {
+ retval = 0;
+ } else {
+ retval = bfd->next_tx;
+ if (bfd->state > STATE_DOWN) {
+ retval = MIN(bfd->detect_time, retval);
+ }
}
ovs_mutex_unlock(&mutex);
+ return retval;
}
void
msg = ofpbuf_at(p, (uint8_t *)p->l7 - (uint8_t *)p->data, BFD_PACKET_LEN);
if (!msg) {
- VLOG_INFO_RL(&rl, "%s: Received unparseable BFD control message.",
- bfd->name);
+ VLOG_INFO_RL(&rl, "%s: Received too-short BFD control message (only "
+ "%td bytes long, at least %d required).",
+ bfd->name, (uint8_t *) ofpbuf_tail(p) - (uint8_t *) p->l7,
+ BFD_PACKET_LEN);
goto out;
}