On Thu, May 5, 2022 at 12:21 PM Adrian Moreno <[email protected]> wrote:
>
>
>
> On 4/12/22 13:49, Christophe Fontaine wrote:
> > This config param allows the delivery of broadcast and multicast packets
> > to the secondary interface of non-lacp bonds, equivalent to the option
> > "all_slaves_active" for kernel bonds.
> >
> > Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=1720935
> > Signed-off-by: Christophe Fontaine <[email protected]>
> > ---
> >   NEWS                 |   2 +
> >   ofproto/bond.c       |   5 +-
> >   ofproto/bond.h       |   2 +
> >   tests/automake.mk    |   3 +-
> >   tests/bond.at        | 125 +++++++++++++++++++++++++++++++++++++++++++
> >   tests/testsuite.at   |   1 +
> >   vswitchd/bridge.c    |   3 ++
> >   vswitchd/vswitch.xml |  20 +++++++
> >   8 files changed, 159 insertions(+), 2 deletions(-)
> >   create mode 100644 tests/bond.at
> >
> > diff --git a/NEWS b/NEWS
> > index 5074b97aa..38777eea8 100644
> > --- a/NEWS
> > +++ b/NEWS
> > @@ -14,6 +14,8 @@ Post-v2.17.0
> >      - OVSDB:
> >        * 'relay' service model now supports transaction history, i.e. 
> > honors the
> >          'last-txn-id' field in 'monitor_cond_since' requests from clients.
> > +   - Userspace datapath:
> > +     * New configuration knob 'all_members_active' for non lacp bonds
> >
>
> I have not reviewed this patch fully since I seen others already have. But 
> this
> just caught my eyes: Is this userspace-datapath specific? I see all changes 
> are
> done in the common bond code.

Hi Adrian,
This is indeed not userspace-datapath specific as this patch provides
the same tunable
as the kernel bond.
The unit test is using the kernel datapath, and my own tests were run
with the user-space datapath.

So indeed: s/Userspace datapath/bond/

Christophe


>
> >
> >   v2.17.0 - 17 Feb 2022
> > diff --git a/ofproto/bond.c b/ofproto/bond.c
> > index 845f69e21..aee420890 100644
> > --- a/ofproto/bond.c
> > +++ b/ofproto/bond.c
> > @@ -145,6 +145,7 @@ struct bond {
> >       struct eth_addr active_member_mac; /* MAC address of the active 
> > member. */
> >       /* Legacy compatibility. */
> >       bool lacp_fallback_ab; /* Fallback to active-backup on LACP failure. 
> > */
> > +    bool all_members_active;
> >
> >       struct ovs_refcount ref_cnt;
> >   };
> > @@ -448,6 +449,7 @@ bond_reconfigure(struct bond *bond, const struct 
> > bond_settings *s)
> >
> >       bond->updelay = s->up_delay;
> >       bond->downdelay = s->down_delay;
> > +    bond->all_members_active = s->all_members_active;
> >
> >       if (bond->lacp_fallback_ab != s->lacp_fallback_ab_cfg) {
> >           bond->lacp_fallback_ab = s->lacp_fallback_ab_cfg;
> > @@ -893,7 +895,8 @@ bond_check_admissibility(struct bond *bond, const void 
> > *member_,
> >
> >       /* Drop all multicast packets on inactive members. */
> >       if (eth_addr_is_multicast(eth_dst)) {
> > -        if (bond->active_member != member) {
> > +        if (bond->active_member != member &&
> > +            bond->all_members_active == false) {
> >               goto out;
> >           }
> >       }
> > diff --git a/ofproto/bond.h b/ofproto/bond.h
> > index 1683ec878..ce4a25e73 100644
> > --- a/ofproto/bond.h
> > +++ b/ofproto/bond.h
> > @@ -62,6 +62,8 @@ struct bond_settings {
> >                                      ovs run. */
> >       bool use_lb_output_action;  /* Use lb_output action. Only applicable 
> > for
> >                                      bond mode BALANCE TCP. */
> > +    bool all_members_active;    /* For non LACP bond, also accept multicast
> > +                                   packets on secondary interface. */
> >   };
> >
> >   /* Program startup. */
> > diff --git a/tests/automake.mk b/tests/automake.mk
> > index 8a9151f81..5c6400c0d 100644
> > --- a/tests/automake.mk
> > +++ b/tests/automake.mk
> > @@ -109,7 +109,8 @@ TESTSUITE_AT = \
> >       tests/mcast-snooping.at \
> >       tests/packet-type-aware.at \
> >       tests/nsh.at \
> > -     tests/drop-stats.at
> > +     tests/drop-stats.at \
> > +     tests/bond.at
> >
> >   EXTRA_DIST += $(FUZZ_REGRESSION_TESTS)
> >   FUZZ_REGRESSION_TESTS = \
> > diff --git a/tests/bond.at b/tests/bond.at
> > new file mode 100644
> > index 000000000..be0be8433
> > --- /dev/null
> > +++ b/tests/bond.at
> > @@ -0,0 +1,125 @@
> > +AT_BANNER([bond])
> > +
> > +# Strips out Recirculation ID information since it may change over time.
> > +m4_define([STRIP_RECIRC_ID], [[sed '
> > +    s/Recirc-ID.*$/<del>/
> > +' ]])
> > +
> > +# Strips out rebalance time information since it changes over time.
> > +m4_define([STRIP_REBALANCE_TIME], [[sed '
> > +    s/next rebalance.*$/<next rebalance del>/
> > +' ]])
> > +
> > +# Strips out active member mac address since it may change over time.
> > +m4_define([STRIP_ACTIVE_MEMBER_MAC], [[sed '
> > +    s/active member mac.*$/<active member mac del>/
> > +' ]])
> > +
> > +AT_SETUP([bond - discard duplicated frames])
> > +# With an active/active non-lacp bond, the default behaviour
> > +# is to discard multicast frames on the secondary interface
> > +OVS_VSWITCHD_START([dnl
> > +        add-bond br0 bond0 p1 p2 --\
> > +        set Port bond0 bond-mode=balance-slb --\
> > +        set Interface p1 type=dummy ofport_request=1 --\
> > +        set Interface p2 type=dummy ofport_request=2 ])
> > +
> > +ovs-appctl bond/set-active-member bond0 p1
> > +ovs-ofctl add-flow br0 actions=NORMAL
> > +
> > +AT_CHECK([ovs-appctl bond/show bond0 | STRIP_REBALANCE_TIME | 
> > STRIP_ACTIVE_MEMBER_MAC], [0], [dnl
> > +---- bond0 ----
> > +bond_mode: balance-slb
> > +bond may use recirculation: no, Recirc-ID : -1
> > +bond-hash-basis: 0
> > +lb_output action: disabled, bond-id: -1
> > +updelay: 0 ms
> > +downdelay: 0 ms
> > +<next rebalance del>
> > +lacp_status: off
> > +lacp_fallback_ab: false
> > +active-backup primary: <none>
> > +<active member mac del>
> > +
> > +member p1: enabled
> > +  active member
> > +  may_enable: true
> > +
> > +member p2: enabled
> > +  may_enable: true
> > +
> > +])
> > +
> > +AT_CHECK([ovs-appctl ofproto/trace br0 
> > in_port=1,dl_dst=ff:ff:ff:ff:ff:ff], [0], [dnl
> > +Flow: 
> > in_port=1,vlan_tci=0x0000,dl_src=00:00:00:00:00:00,dl_dst=ff:ff:ff:ff:ff:ff,dl_type=0x0000
> > +
> > +bridge("br0")
> > +-------------
> > + 0. priority 32768
> > +    NORMAL
> > +     -> no learned MAC for destination, flooding
> > +
> > +Final flow: unchanged
> > +Megaflow: 
> > recirc_id=0,eth,in_port=1,dl_src=00:00:00:00:00:00,dl_dst=ff:ff:ff:ff:ff:ff,dl_type=0x0000
> > +Datapath actions: 100
> > +])
> > +
> > +AT_CHECK([ovs-appctl ofproto/trace br0 
> > in_port=2,dl_dst=ff:ff:ff:ff:ff:ff], [0], [stdout])
> > +AT_CHECK([cat stdout], [0], [dnl
> > +Flow: 
> > in_port=2,vlan_tci=0x0000,dl_src=00:00:00:00:00:00,dl_dst=ff:ff:ff:ff:ff:ff,dl_type=0x0000
> > +
> > +bridge("br0")
> > +-------------
> > + 0. priority 32768
> > +    NORMAL
> > +     -> bonding refused admissibility, dropping
> > +
> > +Final flow: unchanged
> > +Megaflow: 
> > recirc_id=0,eth,in_port=2,dl_src=00:00:00:00:00:00,dl_dst=ff:ff:ff:ff:ff:ff,dl_type=0x0000
> > +Datapath actions: drop
> > +])
> > +OVS_VSWITCHD_STOP
> > +AT_CLEANUP
> > +
> > +AT_SETUP([bond - allow duplicated frames])
> > +# In some specific deployments, we may want to allow these multicast
> > +# frames on the second interface
> > +OVS_VSWITCHD_START([dnl
> > +        add-bond br0 bond0 p1 p2 --\
> > +        set Port bond0 bond-mode=balance-slb \
> > +                       other_config:all_members_active=true --\
> > +        set Interface p1 type=dummy ofport_request=1 --\
> > +        set Interface p2 type=dummy ofport_request=2 ])
> > +
> > +ovs-appctl bond/set-active-member bond0 p1
> > +ovs-ofctl add-flow br0 actions=NORMAL
> > +AT_CHECK([ovs-appctl ofproto/trace br0 
> > in_port=1,dl_dst=ff:ff:ff:ff:ff:ff], [0], [dnl
> > +Flow: 
> > in_port=1,vlan_tci=0x0000,dl_src=00:00:00:00:00:00,dl_dst=ff:ff:ff:ff:ff:ff,dl_type=0x0000
> > +
> > +bridge("br0")
> > +-------------
> > + 0. priority 32768
> > +    NORMAL
> > +     -> no learned MAC for destination, flooding
> > +
> > +Final flow: unchanged
> > +Megaflow: 
> > recirc_id=0,eth,in_port=1,dl_src=00:00:00:00:00:00,dl_dst=ff:ff:ff:ff:ff:ff,dl_type=0x0000
> > +Datapath actions: 100
> > +])
> > +
> > +AT_CHECK([ovs-appctl ofproto/trace br0 
> > in_port=2,dl_dst=ff:ff:ff:ff:ff:ff], [0], [dnl
> > +Flow: 
> > in_port=2,vlan_tci=0x0000,dl_src=00:00:00:00:00:00,dl_dst=ff:ff:ff:ff:ff:ff,dl_type=0x0000
> > +
> > +bridge("br0")
> > +-------------
> > + 0. priority 32768
> > +    NORMAL
> > +     -> no learned MAC for destination, flooding
> > +
> > +Final flow: unchanged
> > +Megaflow: 
> > recirc_id=0,eth,in_port=2,dl_src=00:00:00:00:00:00,dl_dst=ff:ff:ff:ff:ff:ff,dl_type=0x0000
> > +Datapath actions: 100
> > +])
> > +
> > +OVS_VSWITCHD_STOP
> > +AT_CLEANUP
> > diff --git a/tests/testsuite.at b/tests/testsuite.at
> > index 58adfa09c..b91edc5f2 100644
> > --- a/tests/testsuite.at
> > +++ b/tests/testsuite.at
> > @@ -78,3 +78,4 @@ m4_include([tests/mcast-snooping.at])
> >   m4_include([tests/packet-type-aware.at])
> >   m4_include([tests/nsh.at])
> >   m4_include([tests/drop-stats.at])
> > +m4_include([tests/bond.at])
> > diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
> > index e328d8ead..6034bb032 100644
> > --- a/vswitchd/bridge.c
> > +++ b/vswitchd/bridge.c
> > @@ -4615,6 +4615,9 @@ port_configure_bond(struct port *port, struct 
> > bond_settings *s)
> >       s->use_lb_output_action = (s->balance == BM_TCP)
> >                                 && smap_get_bool(&port->cfg->other_config,
> >                                                  "lb-output-action", false);
> > +    /* all_members_active is disabled by default */
> > +    s->all_members_active = smap_get_bool(&port->cfg->other_config,
> > +                                       "all_members_active", false);
> >   }
> >
> >   /* Returns true if 'port' is synthetic, that is, if we constructed it 
> > locally
> > diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
> > index 0c6632617..fe6d6f3b8 100644
> > --- a/vswitchd/vswitch.xml
> > +++ b/vswitchd/vswitch.xml
> > @@ -2083,6 +2083,26 @@
> >           <code>true</code>).
> >         </column>
> >
> > +      <column name="other_config" key="all_members_active"
> > +              type='{"type": "boolean"}'>
> > +        <p>
> > +          Enable/Disable delivery of broadcast/multicast packets on 
> > secondary
> > +          interface of a bond. Relevant only when <ref column="lacp"/> is
> > +          <code>off</code>.
> > +        </p>
> > +
> > +        <p>
> > +          This parameter is identical to <code>all_slaves_active</code> for
> > +          kernel bonds. This is useful when we need to share 2 physical
> > +          functions between an ovs bond and a linux bond, as 2 LACP 
> > sessions
> > +          can't be negotiated over the same physical link.
> > +          LACP session will be managed by the kernel bond, while an
> > +          active-active bond is used for ovs. In that particular 
> > configuration,
> > +          the physical switch will send a unique copy of broadcast packets 
> > over
> > +          the 2 physical links, eventually to the secondary link of the 
> > bond.
> > +        </p>
> > +      </column>
> > +
> >         <group title="Link Failure Detection">
> >           <p>
> >             An important part of link bonding is detecting that links are 
> > down so
>
> --
> Adrián Moreno
>
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to