Merged thanks. Like an idiot I forgot to put my signed-off-by so I'll put it here.
Signed-off-by: Ethan Jackson <et...@nicira.com> Ethan On Tue, Aug 20, 2013 at 11:45 AM, Alex Wang <al...@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 <al...@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@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev