[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