/*
- * Copyright (c) 2010, 2011, 2012 Nicira Networks.
+ * Copyright (c) 2010, 2011, 2012 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#define CCM_RDI_MASK 0x80
#define CFM_HEALTH_INTERVAL 6
struct ccm {
- uint8_t mdlevel_version; /* MD Level and Version */
- uint8_t opcode;
- uint8_t flags;
- uint8_t tlv_offset;
+ uint8_t mdlevel_version; /* MD Level and Version */
+ uint8_t opcode;
+ uint8_t flags;
+ uint8_t tlv_offset;
ovs_be32 seq;
ovs_be16 mpid;
- uint8_t maid[CCM_MAID_LEN];
+ uint8_t maid[CCM_MAID_LEN];
/* Defined by ITU-T Y.1731 should be zero */
ovs_be16 interval_ms_x; /* Transmission interval in ms. */
ovs_be64 mpid64; /* MPID in extended mode. */
uint8_t opdown; /* Operationally down. */
- uint8_t zero[5];
+ uint8_t zero[5];
/* TLV space. */
uint8_t end_tlv;
received. */
int health_interval; /* Number of fault_intervals since health was
recomputed. */
-
+ long long int last_tx; /* Last CCM transmission time. */
};
/* Remote MPs represent foreign network entities that are configured to have
cfm->remote_opup = true;
cfm->fault_override = -1;
cfm->health = -1;
+ cfm->last_tx = 0;
return cfm;
}
}
timer_set_duration(&cfm->fault_timer, interval);
+ VLOG_DBG("%s: new fault interval", cfm->name);
}
}
if (cfm->ccm_interval == 0) {
assert(cfm->extended);
ccm->interval_ms_x = htons(cfm->ccm_interval_ms);
+ } else {
+ ccm->interval_ms_x = htons(0);
}
if (hmap_is_empty(&cfm->remote_mps)) {
ccm->flags |= CCM_RDI_MASK;
}
+
+ if (cfm->last_tx) {
+ long long int delay = time_msec() - cfm->last_tx;
+ if (delay > (cfm->ccm_interval_ms * 3 / 2)) {
+ VLOG_WARN("%s: long delay of %lldms (expected %dms) sending CCM"
+ " seq %"PRIu32, cfm->name, delay, cfm->ccm_interval_ms,
+ cfm->seq);
+ }
+ }
+ cfm->last_tx = time_msec();
}
void
if (ccm_rdi) {
cfm_fault |= CFM_FAULT_RDI;
VLOG_DBG("%s: RDI bit flagged from RMP %"PRIu64, cfm->name,
- rmp->mpid);
+ ccm_mpid);
}
VLOG_DBG("%s: received CCM (seq %"PRIu32") (mpid %"PRIu64")"
}
if (rmp->seq && ccm_seq != (rmp->seq + 1)) {
- cfm_fault |= CFM_FAULT_SEQUENCE;
VLOG_WARN_RL(&rl, "%s: (mpid %"PRIu64") detected sequence"
" numbers which indicate possible connectivity"
" problems (previous %"PRIu32") (current %"PRIu32