X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fcfm.c;h=e56ccab75eea36295fd4c0b52c244b8b102f04ec;hb=be86ea7aa98b87079e266c91d139612fa8543edd;hp=f4c0e8e34dae5569b16f3446bb495d6d3091fa30;hpb=aa62994cbd99d4538e2b22fade4bd9835037dca0;p=openvswitch diff --git a/lib/cfm.c b/lib/cfm.c index f4c0e8e3..e56ccab7 100644 --- a/lib/cfm.c +++ b/lib/cfm.c @@ -61,12 +61,12 @@ struct ccm { BUILD_ASSERT_DECL(CCM_LEN == sizeof(struct ccm)); struct cfm { - uint16_t mpid; - struct list list_node; /* Node in all_cfms list. */ + char *name; /* Name of this CFM object. */ + struct hmap_node hmap_node; /* Node in all_cfms list. */ + uint16_t mpid; bool fault; /* Indicates connectivity fault. */ bool recv_fault; /* Indicates an inability to receive CCMs. */ - char *name; /* Name of this CFM object. */ uint32_t seq; /* The sequence number of our last CCM. */ uint8_t ccm_interval; /* The CCM transmission interval. */ @@ -92,7 +92,7 @@ struct remote_mp { }; static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20); -static struct list all_cfms = LIST_INITIALIZER(&all_cfms); +static struct hmap all_cfms = HMAP_INITIALIZER(&all_cfms); static void cfm_unixctl_show(struct unixctl_conn *, const char *args, void *aux); @@ -100,8 +100,8 @@ static void cfm_unixctl_show(struct unixctl_conn *, const char *args, static void cfm_generate_maid(struct cfm *cfm) { - const char *ovs_md_name = "ovs_md"; - const char *ovs_ma_name = "ovs_ma"; + const char *ovs_md_name = "ovs"; + const char *ovs_ma_name = "ovs"; uint8_t *ma_p; size_t md_len, ma_len; @@ -201,19 +201,18 @@ cfm_init(void) unixctl_command_register("cfm/show", cfm_unixctl_show, NULL); } -/* Allocates a 'cfm' object. This object should have its 'mpid', 'maid', - * 'eth_src', and 'interval' filled out. cfm_configure() should be called - * whenever changes are made to 'cfm', and before cfm_run() is called for the - * first time. */ +/* Allocates a 'cfm' object called 'name'. 'cfm' should be initialized by + * cfm_configure() before use. */ struct cfm * -cfm_create(void) +cfm_create(const char *name) { struct cfm *cfm; cfm = xzalloc(sizeof *cfm); + cfm->name = xstrdup(name); hmap_init(&cfm->remote_mps); cfm_generate_maid(cfm); - list_push_back(&all_cfms, &cfm->list_node); + hmap_insert(&all_cfms, &cfm->hmap_node, hash_string(cfm->name, 0)); return cfm; } @@ -232,7 +231,8 @@ cfm_destroy(struct cfm *cfm) } hmap_destroy(&cfm->remote_mps); - list_remove(&cfm->list_node); + hmap_remove(&all_cfms, &cfm->hmap_node); + free(cfm->name); free(cfm); } @@ -252,18 +252,20 @@ cfm_run(struct cfm *cfm) if (rmp->fault) { cfm->recv_fault = true; - VLOG_DBG("No CCM from RMP %"PRIu16" in the last %lldms", - rmp->mpid, interval); + VLOG_DBG("%s: No CCM from RMP %"PRIu16" in the last %lldms", + cfm->name, rmp->mpid, interval); } else if (rmp->rdi) { cfm->fault = true; - VLOG_DBG("RDI bit flagged from RMP %"PRIu16, rmp->mpid); + VLOG_DBG("%s: RDI bit flagged from RMP %"PRIu16, cfm->name, + rmp->mpid); } } if (cfm->recv_fault) { cfm->fault = true; } else { - VLOG_DBG("All RMPs received CCMs in the last %lldms", interval); + VLOG_DBG("%s: All RMPs received CCMs in the last %lldms", + cfm->name, interval); } timer_set_duration(&cfm->fault_timer, interval); @@ -328,11 +330,6 @@ cfm_configure(struct cfm *cfm, const struct cfm_settings *s) cfm->mpid = s->mpid; interval = ms_to_ccm_interval(s->interval); - if (!cfm->name || strcmp(s->name, cfm->name)) { - free(cfm->name); - cfm->name = xstrdup(s->name); - } - if (interval != cfm->ccm_interval) { cfm->ccm_interval = interval; cfm->ccm_interval_ms = ccm_interval_to_ms(interval); @@ -395,13 +392,14 @@ cfm_process_heartbeat(struct cfm *cfm, const struct ofpbuf *p) ccm = ofpbuf_at(p, (uint8_t *)p->l3 - (uint8_t *)p->data, CCM_LEN); if (!ccm) { - VLOG_INFO_RL(&rl, "Received an un-parseable 802.1ag CCM heartbeat."); + VLOG_INFO_RL(&rl, "%s: Received an unparseable 802.1ag CCM heartbeat.", + cfm->name); return; } if (ccm->opcode != CCM_OPCODE) { - VLOG_INFO_RL(&rl, "Received an unsupported 802.1ag message. " - "(opcode %u)", ccm->opcode); + VLOG_INFO_RL(&rl, "%s: Received an unsupported 802.1ag message. " + "(opcode %u)", cfm->name, ccm->opcode); return; } @@ -415,8 +413,8 @@ cfm_process_heartbeat(struct cfm *cfm, const struct ofpbuf *p) * bonds. Furthermore, faults can be maliciously triggered by crafting * invalid CCMs. */ if (memcmp(ccm->maid, cfm->maid, sizeof ccm->maid)) { - VLOG_WARN_RL(&rl, "Received unexpected remote MAID from MAC " - ETH_ADDR_FMT, ETH_ADDR_ARGS(eth->eth_src)); + VLOG_WARN_RL(&rl, "%s: Received unexpected remote MAID from MAC " + ETH_ADDR_FMT, cfm->name, ETH_ADDR_ARGS(eth->eth_src)); } else { ccm_mpid = ntohs(ccm->mpid); ccm_interval = ccm->flags & 0x7; @@ -429,16 +427,18 @@ cfm_process_heartbeat(struct cfm *cfm, const struct ofpbuf *p) rmp->rdi = ccm_rdi; if (ccm_interval != cfm->ccm_interval) { - VLOG_WARN_RL(&rl, "received a CCM with an invalid interval" - " (%"PRIu8") from RMP %"PRIu16, ccm_interval, - rmp->mpid); + VLOG_WARN_RL(&rl, "%s: received a CCM with an invalid interval" + " (%"PRIu8") from RMP %"PRIu16, cfm->name, + ccm_interval, rmp->mpid); } } else { - VLOG_WARN_RL(&rl, "Received unexpected remote MPID %d from MAC " - ETH_ADDR_FMT, ccm_mpid, ETH_ADDR_ARGS(eth->eth_src)); + VLOG_WARN_RL(&rl, "%s: Received unexpected remote MPID %d from" + " MAC " ETH_ADDR_FMT, cfm->name, ccm_mpid, + ETH_ADDR_ARGS(eth->eth_src)); } - VLOG_DBG("Received CCM (mpid %"PRIu16") (interval %"PRIu8") (RDI %s)", + VLOG_DBG("%s: Received CCM (seq %"PRIu32") (mpid %"PRIu16")" + " (interval %"PRIu8") (RDI %s)", cfm->name, ntohl(ccm->seq), ccm_mpid, ccm_interval, ccm_rdi ? "true" : "false"); } } @@ -456,8 +456,8 @@ cfm_find(const char *name) { struct cfm *cfm; - LIST_FOR_EACH (cfm, list_node, &all_cfms) { - if (cfm->name && !strcmp(cfm->name, name)) { + HMAP_FOR_EACH_WITH_HASH (cfm, hmap_node, hash_string(name, 0), &all_cfms) { + if (!strcmp(cfm->name, name)) { return cfm; } }