diff options
author | Alex Wang <alexw@nicira.com> | 2013-12-20 14:53:52 -0800 |
---|---|---|
committer | Jarno Rajahalme <jrajahalme@nicira.com> | 2013-12-20 14:53:52 -0800 |
commit | 60d02c72941d5a4aeea85090f120a0cc03e945f2 (patch) | |
tree | e49e34222f69d679098512bcea7c1c0d9fd3e68d /ofproto/ofproto-dpif-monitor.c | |
parent | d1890de500d012d512ac7a680a2a0dc5e8acf444 (diff) | |
download | openvswitch-60d02c72941d5a4aeea85090f120a0cc03e945f2.tar.gz |
bfd: Send FINAL immediately after receiving POLL.
Commit 307464a11 (ofproto-dpif-monitor: Use heap to order the mport
wakeup time.) makes bfd only send packet at specified periodic instant.
This fails to meet the RFC5880 requirement, which requires bfd send
FINAL immediately after receiving POLL.
This commit fixes the above issue by scheduling bfd to send FINAL
within 100 ms after receiving POLL.
Signed-off-by: Alex Wang <alexw@nicira.com>
Diffstat (limited to 'ofproto/ofproto-dpif-monitor.c')
-rw-r--r-- | ofproto/ofproto-dpif-monitor.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/ofproto/ofproto-dpif-monitor.c b/ofproto/ofproto-dpif-monitor.c index af66387b7..f67f0363a 100644 --- a/ofproto/ofproto-dpif-monitor.c +++ b/ofproto/ofproto-dpif-monitor.c @@ -225,8 +225,9 @@ monitor_run(void) bfd_wait(mport->bfd); } /* Computes the next wakeup time for this mport. */ - next_wake_time = MIN(bfd_wake_time(mport->bfd), cfm_wake_time(mport->cfm)); - heap_change(&monitor_heap, heap_max(&monitor_heap), + next_wake_time = MIN(bfd_wake_time(mport->bfd), + cfm_wake_time(mport->cfm)); + heap_change(&monitor_heap, &mport->heap_node, MSEC_TO_PRIO(next_wake_time)); } @@ -275,3 +276,27 @@ ofproto_dpif_monitor_port_update(const struct ofport_dpif *ofport, monitor_running = false; } } + +/* Moves the mport on top of the heap. This is necessary when + * for example, bfd POLL is received and the mport should + * immediately send FINAL back. */ +void +ofproto_dpif_monitor_port_send_soon_safe(const struct ofport_dpif *ofport) +{ + ovs_rwlock_wrlock(&monitor_rwlock); + ofproto_dpif_monitor_port_send_soon(ofport); + ovs_rwlock_unlock(&monitor_rwlock); +} + +void +ofproto_dpif_monitor_port_send_soon(const struct ofport_dpif *ofport) + OVS_REQ_WRLOCK(monitor_rwlock) +{ + struct mport *mport; + + monitor_init(); + mport = mport_find(ofport); + if (mport) { + heap_change(&monitor_heap, &mport->heap_node, LLONG_MAX); + } +} |