From: Paul Ingram Date: Sat, 3 Aug 2013 07:12:36 +0000 (+0000) Subject: cfm: update remote opstate only when a CCM is received. X-Git-Tag: sliver-openvswitch-2.0.90-1~33^2~19 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=016953ae96bebb3d3c421757d1f98b9966433bd1;p=sliver-openvswitch.git cfm: update remote opstate only when a CCM is received. 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 Signed-off-by: Ethan Jackson Acked-by: Ethan Jackson --- diff --git a/AUTHORS b/AUTHORS index d11c7c51c..fc665b3db 100644 --- a/AUTHORS +++ b/AUTHORS @@ -67,6 +67,7 @@ Natasha Gude natasha@nicira.com Neil McKee neil.mckee@inmon.com Paraneetharan Chandrasekaran paraneetharanc@gmail.com Paul Fazzone pfazzone@nicira.com +Paul Ingram paul@nicira.com Pavithra Ramesh paramesh@vmware.com Philippe Jung phil.jung@free.fr Pravin B Shelar pshelar@nicira.com @@ -186,7 +187,6 @@ Nagi Reddy Jonnala njonnala@Brocade.com Niklas Andersson nandersson@nicira.com Padmanabhan Krishnan kprad1@yahoo.com Pankaj Thakkar thakkar@nicira.com -Paul Ingram paul@nicira.com Paulo Cravero pcravero@as2594.net Peter Balland peter@nicira.com Peter Phaal peter.phaal@inmon.com diff --git a/lib/cfm.c b/lib/cfm.c index 0277fe623..0bd41bf96 100644 --- a/lib/cfm.c +++ b/lib/cfm.c @@ -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; }