cfm: Clear RDI on new CFM configurations.
authorEthan Jackson <ethan@nicira.com>
Fri, 20 Jul 2012 20:07:49 +0000 (13:07 -0700)
committerEthan Jackson <ethan@nicira.com>
Fri, 20 Jul 2012 20:07:49 +0000 (13:07 -0700)
When CFM is first configured, it detects no remote endpoints, and
thus sets RDI on its CCMs.  This can cause the receiver of these
CCMs to think there is a problem when really things are simply
initializing.  This patch fixes the issue by not setting the RDI
bit in CCMs until at least one fault interval has passed.

Bug #12610.
Reported-by: Paul Ingram <paul@nicira.com>
Signed-off-by: Ethan Jackson <ethan@nicira.com>
lib/cfm.c

index 65701781a3c8e734e4273ca31b22c4a667d80009..134d8b78bdb767be17f86d8d07ca017aebf84366 100644 (file)
--- a/lib/cfm.c
+++ b/lib/cfm.c
@@ -87,6 +87,7 @@ struct cfm {
 
     uint64_t mpid;
     bool extended;         /* Extended mode. */
+    bool booted;           /* A full fault interval has occured. */
     enum cfm_fault_reason fault;  /* Connectivity fault status. */
     enum cfm_fault_reason recv_fault;  /* Bit mask of faults occuring on
                                           receive. */
@@ -407,6 +408,7 @@ cfm_run(struct cfm *cfm)
             ds_destroy(&ds);
         }
 
+        cfm->booted = true;
         timer_set_duration(&cfm->fault_timer, interval);
         VLOG_DBG("%s: new fault interval", cfm->name);
     }
@@ -469,7 +471,7 @@ cfm_compose_ccm(struct cfm *cfm, struct ofpbuf *packet,
         ccm->interval_ms_x = htons(0);
     }
 
-    if (hmap_is_empty(&cfm->remote_mps)) {
+    if (cfm->booted && hmap_is_empty(&cfm->remote_mps)) {
         ccm->flags |= CCM_RDI_MASK;
     }