[ovs-dev] [PATCH] ofproto-dpif: Enable smooth transition between CFM and BFD.

Alex Wang alexw at nicira.com
Tue Aug 20 22:14:25 UTC 2013


Thanks a lot! ;D


On Tue, Aug 20, 2013 at 3:12 PM, Ethan Jackson <ethan at nicira.com> wrote:

> Merged thanks.
>
> Like an idiot I forgot to put my signed-off-by so I'll put it here.
>
> Signed-off-by: Ethan Jackson <ethan at nicira.com>
>
> Ethan
>
> On Tue, Aug 20, 2013 at 11:45 AM, Alex Wang <alexw at nicira.com> wrote:
> > When user switches between using CFM and BFD, there will be a short
> > down time before the new protocol goes up.  This can unintentionally
> > change the traffic pattern of the bundled ports.  To prevent this,
> > it is proposed that user can enable both CFM and BFD before transition,
> > wait for the new protocol to go up, and then disable the old protocol.
> >
> > To make this scheme work, this commit modifies the port_run() in
> > ofproto-dpif.c, so that when both CFM and BFD are used, if either shows
> > correct status, the port is considered usable in the bundle.
> >
> > Signed-off-by: Alex Wang <alexw at nicira.com>
> > ---
> >  ofproto/ofproto-dpif.c |   12 +++++--
> >  tests/ofproto-dpif.at  |   81
> ++++++++++++++++++++++++++++++++++++++++++++++++
> >  2 files changed, 90 insertions(+), 3 deletions(-)
> >
> > diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
> > index 4690215..9fe91c1 100644
> > --- a/ofproto/ofproto-dpif.c
> > +++ b/ofproto/ofproto-dpif.c
> > @@ -2952,6 +2952,8 @@ port_run(struct ofport_dpif *ofport)
> >      long long int carrier_seq =
> netdev_get_carrier_resets(ofport->up.netdev);
> >      bool carrier_changed = carrier_seq != ofport->carrier_seq;
> >      bool enable = netdev_get_carrier(ofport->up.netdev);
> > +    bool cfm_enable = false;
> > +    bool bfd_enable = false;
> >
> >      ofport->carrier_seq = carrier_seq;
> >
> > @@ -2961,16 +2963,20 @@ port_run(struct ofport_dpif *ofport)
> >          int cfm_opup = cfm_get_opup(ofport->cfm);
> >
> >          cfm_run(ofport->cfm);
> > -        enable = enable && !cfm_get_fault(ofport->cfm);
> > +        cfm_enable = !cfm_get_fault(ofport->cfm);
> >
> >          if (cfm_opup >= 0) {
> > -            enable = enable && cfm_opup;
> > +            cfm_enable = cfm_enable && cfm_opup;
> >          }
> >      }
> >
> >      if (ofport->bfd) {
> >          bfd_run(ofport->bfd);
> > -        enable = enable && bfd_forwarding(ofport->bfd);
> > +        bfd_enable = bfd_forwarding(ofport->bfd);
> > +    }
> > +
> > +    if (ofport->bfd || ofport->cfm) {
> > +        enable = enable && (cfm_enable || bfd_enable);
> >      }
> >
> >      if (ofport->bundle) {
> > diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at
> > index b093998..4772416 100644
> > --- a/tests/ofproto-dpif.at
> > +++ b/tests/ofproto-dpif.at
> > @@ -2689,3 +2689,84 @@ AT_CHECK([tail -1 stdout], [0], [Datapath
> actions: 5
> >  ])
> >  OVS_VSWITCHD_STOP
> >  AT_CLEANUP
> > +
> > +# Tests the bundling with various bfd and cfm configurations.
> > +AT_SETUP([ofproto - bundle with variable bfd/cfm config])
> > +OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy --
> \
> > +                    add-bond br0 br0bond p0 p2 bond-mode=active-backup
> -- \
> > +                    add-bond br1 br1bond p1 p3 bond-mode=active-backup
> -- \
> > +                    set Interface p1 type=patch options:peer=p0
> ofport_request=2 -- \
> > +                    set Interface p3 type=patch options:peer=p2
> ofport_request=4 -- \
> > +                    set Interface p0 type=patch options:peer=p1
> ofport_request=1 -- \
> > +                    set Interface p2 type=patch options:peer=p3
> ofport_request=3 -- \
> > +                    set Interface p0 bfd:enable=true bfd:min_tx=300
> bfd:min_rx=300 -- \
> > +                    set Interface p0 cfm_mpid=1 -- \
> > +                    set Interface p1 bfd:enable=true bfd:min_tx=500
> bfd:min_rx=500])
> > +
> > +ovs-appctl time/stop
> > +# advance the clock to stablize everything.
> > +for i in `seq 0 49`; do ovs-appctl time/warp 100; done
> > +# cfm/show should show 'recv' fault.
> > +AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
> > +       fault: recv
> > +])
> > +# bfd/show should show 'up'.
> > +AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0],
> [dnl
> > +       Local Session State: up
> > +       Remote Session State: up
> > +       Local Session State: up
> > +       Remote Session State: up
> > +])
> > +# bond/show should show 'may-enable: true' for all slaves.
> > +AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0],
> [dnl
> > +       may_enable: true
> > +       may_enable: true
> > +       may_enable: true
> > +       may_enable: true
> > +])
> > +
> > +# now disable the bfd on p1.
> > +AT_CHECK([ovs-vsctl set Interface p1 bfd:enable=false])
> > +# advance the clock to stablize everything.
> > +for i in `seq 0 49`; do ovs-appctl time/warp 100; done
> > +# cfm/show should show 'recv' fault.
> > +AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
> > +       fault: recv
> > +])
> > +# bfd/show should show 'down'.
> > +AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0],
> [dnl
> > +       Local Session State: down
> > +       Remote Session State: down
> > +])
> > +# bond/show should show 'may-enable: false' for p0.
> > +AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0],
> [dnl
> > +       may_enable: false
> > +       may_enable: true
> > +       may_enable: true
> > +       may_enable: true
> > +])
> > +
> > +# now enable the bfd on p1 and disable bfd on p0.
> > +AT_CHECK([ovs-vsctl set Interface p1 bfd:enable=true])
> > +AT_CHECK([ovs-vsctl set Interface p0 bfd:enable=false])
> > +# advance the clock to stablize everything.
> > +for i in `seq 0 49`; do ovs-appctl time/warp 100; done
> > +# cfm/show should show 'recv' fault.
> > +AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
> > +       fault: recv
> > +])
> > +# bfd/show should show 'down'.
> > +AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0],
> [dnl
> > +       Local Session State: down
> > +       Remote Session State: down
> > +])
> > +# bond/show should show 'may-enable: false' for p0 and p1.
> > +AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0],
> [dnl
> > +       may_enable: false
> > +       may_enable: true
> > +       may_enable: false
> > +       may_enable: true
> > +])
> > +
> > +OVS_VSWITCHD_STOP
> > +AT_CLEANUP
> > \ No newline at end of file
> > --
> > 1.7.9.5
> >
> > _______________________________________________
> > dev mailing list
> > dev at openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openvswitch.org/pipermail/ovs-dev/attachments/20130820/40a048f0/attachment-0003.html>


More information about the dev mailing list