+ struct remote_mp *rmp;
+ uint64_t ccm_mpid;
+ uint32_t ccm_seq;
+ bool ccm_opdown;
+ enum cfm_fault_reason cfm_fault = 0;
+
+ if (cfm->extended) {
+ ccm_mpid = ntohll(ccm->mpid64);
+ ccm_opdown = ccm->opdown;
+ } else {
+ ccm_mpid = ntohs(ccm->mpid);
+ ccm_opdown = false;
+ }
+ ccm_seq = ntohl(ccm->seq);
+
+ if (ccm_interval != cfm->ccm_interval) {
+ cfm_fault |= CFM_FAULT_INTERVAL;
+ VLOG_WARN_RL(&rl, "%s: received a CCM with an unexpected interval"
+ " (%"PRIu8") from RMP %"PRIu64, cfm->name,
+ ccm_interval, ccm_mpid);
+ }
+
+ if (cfm->extended && ccm_interval == 0
+ && ccm_interval_ms_x != cfm->ccm_interval_ms) {
+ cfm_fault |= CFM_FAULT_INTERVAL;
+ VLOG_WARN_RL(&rl, "%s: received a CCM with an unexpected extended"
+ " interval (%"PRIu16"ms) from RMP %"PRIu64, cfm->name,
+ ccm_interval_ms_x, ccm_mpid);
+ }
+
+ rmp = lookup_remote_mp(cfm, ccm_mpid);
+ if (!rmp) {
+ if (hmap_count(&cfm->remote_mps) < CFM_MAX_RMPS) {
+ rmp = xzalloc(sizeof *rmp);
+ hmap_insert(&cfm->remote_mps, &rmp->node, hash_mpid(ccm_mpid));
+ } else {
+ cfm_fault |= CFM_FAULT_OVERFLOW;
+ VLOG_WARN_RL(&rl,
+ "%s: dropped CCM with MPID %"PRIu64" from MAC "
+ ETH_ADDR_FMT, cfm->name, ccm_mpid,
+ ETH_ADDR_ARGS(eth->eth_src));
+ }
+ }
+
+ if (ccm_rdi) {
+ cfm_fault |= CFM_FAULT_RDI;
+ VLOG_DBG("%s: RDI bit flagged from RMP %"PRIu64, cfm->name,
+ ccm_mpid);
+ }
+
+ VLOG_DBG("%s: received CCM (seq %"PRIu32") (mpid %"PRIu64")"
+ " (interval %"PRIu8") (RDI %s)", cfm->name, ccm_seq,
+ ccm_mpid, ccm_interval, ccm_rdi ? "true" : "false");