#include <string.h>
#include "byte-order.h"
+#include "connectivity.h"
#include "dynamic-string.h"
#include "flow.h"
#include "hash.h"
#include "packets.h"
#include "poll-loop.h"
#include "random.h"
+#include "seq.h"
#include "timer.h"
#include "timeval.h"
#include "unixctl.h"
ccm_interval_to_ms(uint8_t interval)
{
switch (interval) {
- case 0: NOT_REACHED(); /* Explicitly not supported by 802.1ag. */
+ case 0: OVS_NOT_REACHED(); /* Explicitly not supported by 802.1ag. */
case 1: return 3; /* Not recommended due to timer resolution. */
case 2: return 10; /* Not recommended due to timer resolution. */
case 3: return 100;
case 5: return 10000;
case 6: return 60000;
case 7: return 600000;
- default: NOT_REACHED(); /* Explicitly not supported by 802.1ag. */
+ default: OVS_NOT_REACHED(); /* Explicitly not supported by 802.1ag. */
}
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
static long long int
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;
bool rmp_set_opup = false;
bool rmp_set_opdown = false;
" %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);
}
cfm->fault |= CFM_FAULT_RECV;
}
- if (old_cfm_fault != cfm->fault && !VLOG_DROP_INFO(&rl)) {
- struct ds ds = DS_EMPTY_INITIALIZER;
-
- ds_put_cstr(&ds, "from [");
- ds_put_cfm_fault(&ds, old_cfm_fault);
- ds_put_cstr(&ds, "] to [");
- ds_put_cfm_fault(&ds, cfm->fault);
- ds_put_char(&ds, ']');
- VLOG_INFO("%s: CFM faults changed %s.", cfm->name, ds_cstr(&ds));
- ds_destroy(&ds);
+ if (old_cfm_fault != cfm->fault) {
+ if (!VLOG_DROP_INFO(&rl)) {
+ struct ds ds = DS_EMPTY_INITIALIZER;
+
+ ds_put_cstr(&ds, "from [");
+ ds_put_cfm_fault(&ds, old_cfm_fault);
+ ds_put_cstr(&ds, "] to [");
+ ds_put_cfm_fault(&ds, cfm->fault);
+ ds_put_char(&ds, ']');
+ VLOG_INFO("%s: CFM faults changed %s.", cfm->name, ds_cstr(&ds));
+ ds_destroy(&ds);
+ }
/* If there is a flap, increments the counter. */
if (old_cfm_fault == false || cfm->fault == false) {
}
}
+ /* 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());
+ }
+
cfm->booted = true;
timer_set_duration(&cfm->fault_timer, interval);
VLOG_DBG("%s: new fault interval", cfm->name);
}
}
+ seq_change(connectivity_seq_get());
unixctl_command_reply(conn, "OK");
out: