X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fcfm.c;h=7503ad5818957e5c57334e5f6304cd11bcb5e9e8;hb=945cad7fb1f37dcf68cab62ccf72970bcd12fa50;hp=66bca75c67d58361fe7e65b1fd73c2f3f27ee942;hpb=906bb3d008877607cea048d299aefd13c2f11b04;p=openvswitch diff --git a/lib/cfm.c b/lib/cfm.c index 66bca75c..7503ad58 100644 --- a/lib/cfm.c +++ b/lib/cfm.c @@ -1,5 +1,5 @@ /* - * 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. @@ -62,19 +62,19 @@ static const uint8_t eth_addr_ccm_x[6] = { #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; @@ -118,7 +118,7 @@ struct cfm { 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 @@ -299,6 +299,7 @@ cfm_create(const char *name) cfm->remote_opup = true; cfm->fault_override = -1; cfm->health = -1; + cfm->last_tx = 0; return cfm; } @@ -394,16 +395,17 @@ cfm_run(struct cfm *cfm) cfm->fault |= CFM_FAULT_RECV; } - if (old_cfm_fault != cfm->fault) { + if (old_cfm_fault != cfm->fault && !VLOG_DROP_INFO(&rl)) { struct ds ds = DS_EMPTY_INITIALIZER; ds_put_cfm_fault(&ds, old_cfm_fault, cfm->fault); - VLOG_INFO_RL(&rl, "%s: CFM fault status changed:%s", cfm->name, - ds_cstr_ro(&ds)); + VLOG_INFO("%s: CFM fault status changed:%s", cfm->name, + ds_cstr_ro(&ds)); ds_destroy(&ds); } timer_set_duration(&cfm->fault_timer, interval); + VLOG_DBG("%s: new fault interval", cfm->name); } } @@ -460,11 +462,23 @@ cfm_compose_ccm(struct cfm *cfm, struct ofpbuf *packet, 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 @@ -606,7 +620,7 @@ cfm_process_heartbeat(struct cfm *cfm, const struct ofpbuf *p) 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")" @@ -621,7 +635,6 @@ cfm_process_heartbeat(struct cfm *cfm, const struct ofpbuf *p) } 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