bridge: Fix interpretation of 'health' member of struct ofproto_cfm_status.
authorBen Pfaff <blp@nicira.com>
Wed, 6 Mar 2013 22:50:26 +0000 (14:50 -0800)
committerBen Pfaff <blp@nicira.com>
Thu, 7 Mar 2013 00:23:28 +0000 (16:23 -0800)
Commit 9a9e3786b3a8 (ofproto: Merge all the CFM query functions into one.)
mistakenly interpreted struct ofproto_cfm_status as always being in the
range [0,100].  It can in fact take the value -1 if the health status is
not currently well-defined.

Signed-off-by: Ben Pfaff <blp@nicira.com>
Acked-by: Ethan Jackson <ethan@nicira.com>
ofproto/ofproto.h
vswitchd/bridge.c

index 3ea56df..5960d7b 100644 (file)
@@ -362,8 +362,8 @@ void ofproto_free_ofproto_controller_info(struct shash *);
 
 /* CFM status query. */
 struct ofproto_cfm_status {
-    enum cfm_fault_reason faults; /* 0 if not faulted. */
-    int health;                   /* Health status in [0,100] range. */
+    /* 0 if not faulted, otherwise a combination of one or more reasons. */
+    enum cfm_fault_reason faults;
 
     /* 0 if the remote CFM endpoint is operationally down,
      * 1 if the remote CFM endpoint is operationally up,
@@ -371,6 +371,11 @@ struct ofproto_cfm_status {
      * mode. */
     int remote_opstate;
 
+    /* Ordinarily a "health status" in the range 0...100 inclusive, with 0
+     * being worst and 100 being best, or -1 if the health status is not
+     * well-defined. */
+    int health;
+
     /* MPIDs of remote maintenance points whose CCMs have been received. */
     const uint64_t *rmps;
     size_t n_rmps;
index 311753d..f7932c7 100644 (file)
@@ -1779,7 +1779,11 @@ iface_refresh_cfm_stats(struct iface *iface)
         ovsrec_interface_set_cfm_remote_mpids(cfg,
                                               (const int64_t *)status.rmps,
                                               status.n_rmps);
-        ovsrec_interface_set_cfm_health(cfg, &cfm_health, 1);
+        if (cfm_health >= 0) {
+            ovsrec_interface_set_cfm_health(cfg, &cfm_health, 1);
+        } else {
+            ovsrec_interface_set_cfm_health(cfg, NULL, 0);
+        }
     }
 }