diff options
author | Ethan Jackson <ethan@nicira.com> | 2011-04-06 17:23:40 -0700 |
---|---|---|
committer | Ethan Jackson <ethan@nicira.com> | 2011-04-07 09:30:04 -0700 |
commit | 76c9c4231400245864addfc7a8aabaa79843b4bd (patch) | |
tree | 1bce63d7635c74640762971b1bf6aaff2b22582d /lib/cfm.c | |
parent | 392730c42bbd5abe30e7c2d1fcffb136a29334e0 (diff) |
cfm: Fix broken fault logic.
If the last receive time for a remote MP was before the last fault
check, the CFM code would not declare a fault. This is, of course,
exactly the wrong response.
Bug #5303.
Diffstat (limited to 'lib/cfm.c')
-rw-r--r-- | lib/cfm.c | 9 |
1 files changed, 6 insertions, 3 deletions
@@ -174,11 +174,14 @@ cfm_run(struct cfm *cfm) if (timer_expired(&cfmi->fault_timer)) { bool fault; struct remote_mp *rmp; + long long int interval; - fault = now < cfmi->x_recv_time + cfm_fault_interval(cfmi); + interval = cfm_fault_interval(cfmi); + fault = now < cfmi->x_recv_time + interval; HMAP_FOR_EACH (rmp, node, &cfm->remote_mps) { - if (timer_expired_at(&cfmi->fault_timer, rmp->recv_time)) { + if (rmp->recv_time < timer_enabled_at(&cfmi->fault_timer, interval) + || timer_expired_at(&cfmi->fault_timer, rmp->recv_time)) { rmp->fault = true; } @@ -188,7 +191,7 @@ cfm_run(struct cfm *cfm) } cfm->fault = fault; - timer_set_duration(&cfmi->fault_timer, cfm_fault_interval(cfmi)); + timer_set_duration(&cfmi->fault_timer, interval); } } |