cfm: cfm_configure() only update when necessary.
authorEthan Jackson <ethan@nicira.com>
Fri, 1 Apr 2011 20:22:44 +0000 (13:22 -0700)
committerEthan Jackson <ethan@nicira.com>
Fri, 1 Apr 2011 20:36:38 +0000 (13:36 -0700)
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.

lib/cfm.c

index f6cfb2e675ef2edfa5d2bf94cbf055e7312561a9..f9b3488636f36c19b8311d4e3358c390e55bec97 100644 (file)
--- 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;
 }