+ ccm_mpid = ntohs(ccm->mpid);
+ ccm_opdown = false;
+ }
+ ccm_seq = ntohl(ccm->seq);
+
+ if (ccm_interval != cfm->ccm_interval) {
+ VLOG_WARN_RL(&rl, "%s: received a CCM with an invalid 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) {
+ VLOG_WARN_RL(&rl, "%s: received a CCM with an invalid 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->unexpected_recv = true;
+ 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));
+ }
+ }
+
+ 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");
+
+ if (rmp) {
+ if (rmp->seq && ccm_seq != (rmp->seq + 1)) {
+ VLOG_WARN_RL(&rl, "%s: (mpid %"PRIu64") detected sequence"
+ " numbers which indicate possible connectivity"
+ " problems (previous %"PRIu32") (current %"PRIu32
+ ")", cfm->name, ccm_mpid, rmp->seq, ccm_seq);
+ }
+
+ rmp->mpid = ccm_mpid;
+ rmp->recv = true;
+ rmp->seq = ccm_seq;
+ rmp->rdi = ccm_rdi;
+ rmp->opup = !ccm_opdown;