Thanks Ethan,

I really should do that.


On Thu, Sep 19, 2013 at 1:27 PM, Ethan Jackson <et...@nicira.com> wrote:

> Why not just modify cfm_fault_interval() to check if demand mode is
> enabled and if so return MAX(cfm->ccm_interval, 500) * 7 / 2?
>
> Ethan
>
> On Thu, Sep 19, 2013 at 11:39 AM, Alex Wang <al...@nicira.com> wrote:
> > This commit prevents cfm from raising 'interval' fault when demand
> > mode is only enabled on one end of link.
> >
> > Signed-off-by: Alex Wang <al...@nicira.com>
> > ---
> >  lib/cfm.c            |   18 +++++++++-------
> >  tests/automake.mk    |    1 +
> >  tests/cfm.at         |   57
> ++++++++++++++++++++++++++++++++++++++++++++++++++
> >  tests/testsuite.at   |    1 +
> >  vswitchd/vswitch.xml |    5 +++--
> >  5 files changed, 73 insertions(+), 9 deletions(-)
> >  create mode 100644 tests/cfm.at
> >
> > diff --git a/lib/cfm.c b/lib/cfm.c
> > index 4a46c05..03dd92d 100644
> > --- a/lib/cfm.c
> > +++ b/lib/cfm.c
> > @@ -105,6 +105,8 @@ struct cfm {
> >      uint32_t seq;          /* The sequence number of our last CCM. */
> >      uint8_t ccm_interval;  /* The CCM transmission interval. */
> >      int ccm_interval_ms;   /* 'ccm_interval' in milliseconds. */
> > +    int ccm_interval_fault_ms;/* Used to compute the fault interval, */
> > +                              /* in milliseconds. */
> >      uint16_t ccm_vlan;     /* Vlan tag of CCM PDUs.  CFM_RANDOM_VLAN if
> >                                random. */
> >      uint8_t ccm_pcp;       /* Priority of CCM PDUs. */
> > @@ -255,9 +257,8 @@ cfm_fault_interval(struct cfm *cfm)
> OVS_REQUIRES(mutex)
> >       * as a fault (likely due to a configuration error).  Thus we can
> check all
> >       * MPs at once making this quite a bit simpler.
> >       *
> > -     * According to the specification we should check when
> (ccm_interval_ms *
> > -     * 3.5)ms have passed. */
> > -    return (cfm->ccm_interval_ms * 7) / 2;
> > +     * We should check when (ccm_interval_fault_ms * 3.5)ms have
> passed. */
> > +    return (cfm->ccm_interval_fault_ms * 7) / 2;
> >  }
> >
> >  static uint8_t
> > @@ -589,6 +590,7 @@ cfm_configure(struct cfm *cfm, const struct
> cfm_settings *s)
> >  {
> >      uint8_t interval;
> >      int interval_ms;
> > +    int interval_fault_ms;
> >
> >      if (!cfm_is_valid_mpid(s->extended, s->mpid) || s->interval <= 0) {
> >          return false;
> > @@ -598,7 +600,7 @@ cfm_configure(struct cfm *cfm, const struct
> cfm_settings *s)
> >      cfm->mpid = s->mpid;
> >      cfm->opup = s->opup;
> >      interval = ms_to_ccm_interval(s->interval);
> > -    interval_ms = ccm_interval_to_ms(interval);
> > +    interval_fault_ms = interval_ms = ccm_interval_to_ms(interval);
> >
> >      atomic_store(&cfm->check_tnl_key, s->check_tnl_key);
> >      atomic_store(&cfm->extended, s->extended);
> > @@ -607,11 +609,11 @@ cfm_configure(struct cfm *cfm, const struct
> cfm_settings *s)
> >      cfm->ccm_pcp = s->ccm_pcp & (VLAN_PCP_MASK >> VLAN_PCP_SHIFT);
> >      if (s->extended && interval_ms != s->interval) {
> >          interval = 0;
> > -        interval_ms = MIN(s->interval, UINT16_MAX);
> > +        interval_fault_ms = interval_ms = MIN(s->interval, UINT16_MAX);
> >      }
> >
> >      if (s->extended && s->demand) {
> > -        interval_ms = MAX(interval_ms, 500);
> > +        interval_fault_ms = MAX(interval_ms, 500);
> >          if (!cfm->demand) {
> >              cfm->demand = true;
> >              cfm->rx_packets = cfm_rx_packets(cfm);
> > @@ -620,9 +622,11 @@ cfm_configure(struct cfm *cfm, const struct
> cfm_settings *s)
> >          cfm->demand = false;
> >      }
> >
> > -    if (interval != cfm->ccm_interval || interval_ms !=
> cfm->ccm_interval_ms) {
> > +    if (interval != cfm->ccm_interval || interval_ms !=
> cfm->ccm_interval_ms
> > +        || interval_fault_ms != cfm->ccm_interval_fault_ms) {
> >          cfm->ccm_interval = interval;
> >          cfm->ccm_interval_ms = interval_ms;
> > +        cfm->ccm_interval_fault_ms = interval_fault_ms;
> >
> >          timer_set_expired(&cfm->tx_timer);
> >          timer_set_duration(&cfm->fault_timer, cfm_fault_interval(cfm));
> > diff --git a/tests/automake.mk b/tests/automake.mk
> > index 60d3640..8f51a65 100644
> > --- a/tests/automake.mk
> > +++ b/tests/automake.mk
> > @@ -22,6 +22,7 @@ TESTSUITE_AT = \
> >         tests/odp.at \
> >         tests/multipath.at \
> >         tests/bfd.at \
> > +       tests/cfm.at \
> >         tests/lacp.at \
> >         tests/learn.at \
> >         tests/vconn.at \
> > diff --git a/tests/cfm.at b/tests/cfm.at
> > new file mode 100644
> > index 0000000..638e03f
> > --- /dev/null
> > +++ b/tests/cfm.at
> > @@ -0,0 +1,57 @@
> > +AT_BANNER([cfm])
> > +
> > +m4_define([CFM_CHECK_EXTENDED], [
> > +AT_CHECK([ovs-appctl cfm/show $1 | sed -e '/next CCM tx:/d' | sed -e
> '/next fault check:/d' | sed -e  '/recv since check:/d'],[0],
> > +[dnl
> > +---- $1 ----
> > +MPID $2: extended
> > +       average health: $3
> > +       opstate: $4
> > +       remote_opstate: $5
> > +       interval: $6
> > +Remote MPID $7
> > +       opstate: $8
> > +])
> > +])
> > +
> > +# test cfm under demand mode.
> > +AT_SETUP([cfm - demand mode])
> > +#Create 2 bridges connected by patch ports and enable BFD
> > +OVS_VSWITCHD_START([add-br br1 -- \
> > +                    set bridge br1 datapath-type=dummy \
> > +                    other-config:hwaddr=aa:55:aa:56:00:00 -- \
> > +                    add-port br1 p1 -- set Interface p1 type=patch \
> > +                    options:peer=p0 -- \
> > +                    add-port br0 p0 -- set Interface p0 type=patch \
> > +                    options:peer=p1 -- \
> > +                    set Interface p0 cfm_mpid=1
> other_config:cfm_interval=300 other_config:cfm_extended=true -- \
> > +                    set Interface p1 cfm_mpid=2
> other_config:cfm_interval=300 other_config:cfm_extended=true ])
> > +
> > +ovs-appctl time/stop
> > +# wait for a while to stablize cfm.
> > +for i in `seq 0 100`; do ovs-appctl time/warp 100; done
> > +CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [300ms], [2], [up])
> > +CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [300ms], [1], [up])
> > +
> > +# turn on demand mode on one end.
> > +AT_CHECK([ovs-vsctl set interface p0 other_config:cfm_demand=true])
> > +
> > +# cfm should never go down.
> > +for i in `seq 0 100`
> > +do
> > +    ovs-appctl time/warp 100
> > +    CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [300ms], [2], [up])
> > +    CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [300ms], [1], [up])
> > +done
> > +
> > +# turn on demand mode on the other end.
> > +AT_CHECK([ovs-vsctl set interface p1 other_config:cfm_demand=true])
> > +for i in `seq 0 100`
> > +do
> > +    ovs-appctl time/warp 100
> > +    CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [300ms], [2], [up])
> > +    CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [300ms], [1], [up])
> > +done
> > +
> > +OVS_VSWITCHD_STOP
> > +AT_CLEANUP
> > diff --git a/tests/testsuite.at b/tests/testsuite.at
> > index 43efc09..9e16f94 100644
> > --- a/tests/testsuite.at
> > +++ b/tests/testsuite.at
> > @@ -68,6 +68,7 @@ m4_include([tests/ovsdb-macros.at])
> >  m4_include([tests/ofproto-macros.at])
> >
> >  m4_include([tests/bfd.at])
> > +m4_include([tests/cfm.at])
> >  m4_include([tests/lacp.at])
> >  m4_include([tests/library.at])
> >  m4_include([tests/heap.at])
> > diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
> > index 4b42ec7..5fd5b3b 100644
> > --- a/vswitchd/vswitch.xml
> > +++ b/vswitchd/vswitch.xml
> > @@ -2142,8 +2142,9 @@
> >            <ul>
> >              <li>
> >                To ensure that ovs-vswitchd has enough time to pull
> statistics
> > -              from the datapath, the minimum
> > -              <ref column="other_config" key="cfm_interval"/> is 500ms.
> > +              from the datapath, the fault detection interval is set to
> > +              3.5 * MAX(<ref column="other_config"
> key="cfm_interval"/>, 500)
> > +              ms.
> >              </li>
> >
> >              <li>
> > --
> > 1.7.9.5
> >
> > _______________________________________________
> > dev mailing list
> > dev@openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev
>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to