From: Ethan Jackson <ethan@nicira.com>
Date: Fri, 1 Apr 2011 20:22:44 +0000 (-0700)
Subject: cfm: cfm_configure() only update when necessary.
X-Git-Tag: v1.1.0~8
X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=9aa952b2dd7c091c63dbfc7becb3b3dcc9f7bfce;p=sliver-openvswitch.git

cfm: cfm_configure() only update when necessary.

Calling cfm_configure often could cause timers to be reset
resulting in unexpected behavior.  This commit only updates when
cfm configuration actually changed.

Bug #5244.
---

diff --git a/lib/cfm.c b/lib/cfm.c
index f6cfb2e67..f9b348863 100644
--- a/lib/cfm.c
+++ b/lib/cfm.c
@@ -230,19 +230,24 @@ cfm_wait(struct cfm *cfm)
 bool
 cfm_configure(struct cfm *cfm)
 {
-    struct cfm_internal *cfmi;
+    struct cfm_internal *cfmi = cfm_to_internal(cfm);
+    uint8_t interval;
 
     if (!cfm_is_valid_mpid(cfm->mpid) || !cfm->interval) {
         return false;
     }
 
-    cfmi                  = cfm_to_internal(cfm);
-    cfmi->ccm_interval    = ms_to_ccm_interval(cfm->interval);
-    cfmi->ccm_interval_ms = ccm_interval_to_ms(cfmi->ccm_interval);
+    interval = ms_to_ccm_interval(cfm->interval);
+
+    if (interval != cfmi->ccm_interval) {
+        cfmi->ccm_interval = interval;
+        cfmi->ccm_interval_ms = ccm_interval_to_ms(interval);
+
+        /* Force a resend and check in case anything changed. */
+        timer_set_expired(&cfmi->tx_timer);
+        timer_set_expired(&cfmi->fault_timer);
+    }
 
-    /* Force a resend and check in case anything changed. */
-    timer_set_expired(&cfmi->tx_timer);
-    timer_set_expired(&cfmi->fault_timer);
     return true;
 }