From d627fffb9419764b99e64dd78f0aa6df00b395df Mon Sep 17 00:00:00 2001 From: Alex Wang Date: Fri, 14 Mar 2014 18:30:39 -0700 Subject: [PATCH] cfm: Notify connectivity_seq on remote maintenance points change. Commit f23d157c ("ofproto-dpif: Don't poll ports when nothing changes") did not ensure the update of the row of remote maintenance points in ovsdb when it changes. This commit makes the update happen by notifying the global connectivity_seq. Bug #1192265 Signed-off-by: Alex Wang Acked-by: Ben Pfaff --- lib/cfm.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/cfm.c b/lib/cfm.c index 5ee94d50f..d31c1aadc 100644 --- a/lib/cfm.c +++ b/lib/cfm.c @@ -397,6 +397,10 @@ cfm_run(struct cfm *cfm) OVS_EXCLUDED(mutex) if (timer_expired(&cfm->fault_timer)) { long long int interval = cfm_fault_interval(cfm); struct remote_mp *rmp, *rmp_next; + uint64_t old_flap_count = cfm->flap_count; + int old_health = cfm->health; + size_t old_rmps_array_len = cfm->rmps_array_len; + bool old_rmps_deleted = false; bool old_cfm_fault = cfm->fault; bool old_rmp_opup = cfm->remote_opup; bool demand_override; @@ -423,7 +427,6 @@ cfm_run(struct cfm *cfm) OVS_EXCLUDED(mutex) cfm->health = 0; } else { int exp_ccm_recvd; - int old_health = cfm->health; rmp = CONTAINER_OF(hmap_first(&cfm->remote_mps), struct remote_mp, node); @@ -438,10 +441,6 @@ cfm_run(struct cfm *cfm) OVS_EXCLUDED(mutex) cfm->health = MIN(cfm->health, 100); rmp->num_health_ccm = 0; ovs_assert(cfm->health >= 0 && cfm->health <= 100); - - if (cfm->health != old_health) { - seq_change(connectivity_seq_get()); - } } cfm->health_interval = 0; } @@ -461,6 +460,7 @@ cfm_run(struct cfm *cfm) OVS_EXCLUDED(mutex) " %lldms", cfm->name, rmp->mpid, time_msec() - rmp->last_rx); if (!demand_override) { + old_rmps_deleted = true; hmap_remove(&cfm->remote_mps, &rmp->node); free(rmp); } @@ -484,10 +484,6 @@ cfm_run(struct cfm *cfm) OVS_EXCLUDED(mutex) cfm->remote_opup = true; } - if (old_rmp_opup != cfm->remote_opup) { - seq_change(connectivity_seq_get()); - } - if (hmap_is_empty(&cfm->remote_mps)) { cfm->fault |= CFM_FAULT_RECV; } @@ -509,7 +505,15 @@ cfm_run(struct cfm *cfm) OVS_EXCLUDED(mutex) if (old_cfm_fault == false || cfm->fault == false) { cfm->flap_count++; } + } + /* These variables represent the cfm session status, it is desirable + * to update them to database immediately after change. */ + if (old_health != cfm->health + || old_rmp_opup != cfm->remote_opup + || (old_rmps_array_len != cfm->rmps_array_len || old_rmps_deleted) + || old_cfm_fault != cfm->fault + || old_flap_count != cfm->flap_count) { seq_change(connectivity_seq_get()); } -- 2.20.1