On Thu, Jun 23, 2022 at 10:22 PM Ilya Maximets <[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]>
>
> Hi, Christophe. Thanks for the patch and sorry for the late reply.
> See some comments inline.
Thanks for the complete review (specifically for the added test),
Ilya! I'll submit another patch (with other fixes for the doc part).
Christophe
>
> Best regards, Ilya Maximets.
>
> > ---
> > 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
>
> As Adrian already pointed out that should not be in the
> 'Userspace datapath' section. It may have no section.
> Please, specify that it is 'other_config:all_members_active'.
> And it's better to have a period at the end of a sentence.
>
> >
> >
> > 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;
>
> This field should nt be placed in the 'Legacy compatibility'
> section. It should be in 'Bonding info' instead. And it
> needs some comment.
>
> >
> > 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) {
>
> Please, don't compare with 'false', just use '!'.
>
> > 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. */
>
> Looking at bond_check_admissibility(), it looks like active-backup
> bond will drop packets received on backup interface. So, the 'non LACP'
> part doesn't seem to be correct. Do we want to receive packets on backup
> interface? In this case bond_check_admissibility() needs a corection.
> If not, we need to update comments and docs clarifying that it's only
> for balanced bonding modes.
Ack. The packets being dropped on the backup interface is the intended
behavior, so I'll update the comment to clarify this.
>
> > };
> >
> > /* 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
>
> I'm not sure why we need a separate file for these tests.
> We need to move all existing bonding tests there or just
> keep adding tests to ofproto-dpif.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
>
> Please, use 'dnl' for comments.
> Period at the end of a sentence.
>
> > +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 ])
>
> I know that existing tests written this way, but please,
> use 'dnl' to split lines instead of '\'.
>
> > +
> > +ovs-appctl bond/set-active-member bond0 p1
> > +ovs-ofctl add-flow br0 actions=NORMAL
>
> These should be under AT_CHECK.
>
> > +
> > +AT_CHECK([ovs-appctl bond/show bond0 | STRIP_REBALANCE_TIME |
> > STRIP_ACTIVE_MEMBER_MAC], [0], [dnl
>
> This should be OVS_WAIT_UNTIL_EQUAL.
>
> > +---- 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>
>
> State of the 'all_members_active' config should be printed
> in the above list.
>
> > +
> > +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
>
> Looks inconsistent to have direct check in the first run
> and > stdout and 'cat stdout' in the second one.
>
> > +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])
>
> We should, probably, use the 'all_members_active' in the name somehow.
>
> > +# In some specific deployments, we may want to allow these multicast
> > +# frames on the second interface
>
> 'dnl'
>
> Also, we're not trying to justify the feature, we need to describe
> what we're trying to test. e.g. "Receiving of duplicated multicast
> frames should be allowed with 'all_members_active'."
>
> > +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 ])
>
> dnl
>
> > +
> > +ovs-appctl bond/set-active-member bond0 p1
> > +ovs-ofctl add-flow br0 actions=NORMAL
>
> AT_CHECK
>
> There should be a bond/show check here veifying that
> 'all_members_active' is correctly set.
>
> > +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 */
>
> Not sure if we need this comment. But this comment needs
> a period at the end.
>
> > + s->all_members_active = smap_get_bool(&port->cfg->other_config,
> > + "all_members_active", false);
>
> Please, align to the next character after '('.
>
> > }
> >
> > /* 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>.
>
> We need to mention that this is only for balance-tcp and balance-slb.
> This option will not work with active-backup.
>
> > + </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.
>
> Please, use 2 spaces between sentenses. Sometimes some single-spaced text
> slips in, but it should be 2 according to the coding style document.
>
> > + </p>
> > + </column>
> > +
> > <group title="Link Failure Detection">
> > <p>
> > An important part of link bonding is detecting that links are
> > down so
>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev