diff options
Diffstat (limited to 'lib/cfm.c')
-rw-r--r-- | lib/cfm.c | 16 |
1 files changed, 13 insertions, 3 deletions
@@ -390,6 +390,8 @@ cfm_run(struct cfm *cfm) OVS_EXCLUDED(mutex) struct remote_mp *rmp, *rmp_next; bool old_cfm_fault = cfm->fault; bool demand_override; + bool rmp_set_opup = false; + bool rmp_set_opdown = false; cfm->fault = cfm->recv_fault; cfm->recv_fault = 0; @@ -399,7 +401,6 @@ cfm_run(struct cfm *cfm) OVS_EXCLUDED(mutex) cfm->rmps_array = xmalloc(hmap_count(&cfm->remote_mps) * sizeof *cfm->rmps_array); - cfm->remote_opup = true; if (cfm->health_interval == CFM_HEALTH_INTERVAL) { /* Calculate the cfm health of the interface. If the number of * remote_mpids of a cfm interface is > 1, the cfm health is @@ -451,14 +452,23 @@ cfm_run(struct cfm *cfm) OVS_EXCLUDED(mutex) } else { rmp->recv = false; - if (!rmp->opup) { - cfm->remote_opup = rmp->opup; + if (rmp->opup) { + rmp_set_opup = true; + } else { + rmp_set_opdown = true; } cfm->rmps_array[cfm->rmps_array_len++] = rmp->mpid; } } + if (rmp_set_opdown) { + cfm->remote_opup = false; + } + else if (rmp_set_opup) { + cfm->remote_opup = true; + } + if (hmap_is_empty(&cfm->remote_mps)) { cfm->fault |= CFM_FAULT_RECV; } |