The remote opstate for a CFM interface is presumed to be up unless a CCM is received which signals opstate down. This means than an interface configured for CFM demand mode may incorrectly appear to be opstate up if it has not received a CCM within the last fault interval.
We should remember the last remote opstate for a CFM interface and only change it when a CCM arrives signaling a change. Bug #18806 Signed-off-by: Paul Ingram <ping...@nicira.com> --- lib/cfm.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/cfm.c b/lib/cfm.c index 235d121..a7cc890 100644 --- a/lib/cfm.c +++ b/lib/cfm.c @@ -350,6 +350,8 @@ cfm_run(struct cfm *cfm) 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; @@ -359,7 +361,6 @@ cfm_run(struct cfm *cfm) 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 @@ -411,14 +412,23 @@ cfm_run(struct cfm *cfm) } 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; } -- 1.7.9.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev