A multicast flood installs one OpenFlow flow holding one set of actions
per destination.  OVS turns one OpenFlow flow into one datapath flow,
following resubmit as it goes, so the whole flood becomes a single
datapath action list.  Two 16-bit length fields bound that list:

  - The FLOW_MOD that carries the flow, which leaves about 65,440 bytes
    for actions.  A type=remote destination costs about 80 bytes, so
    some 817 fit.  Past that ofctrl discards the flow and logs "The
    FLOW_MOD message is too big", and the flood reaches nobody.

  - The datapath action list, capped at 65,531 bytes by the nested
    OVS_FLOW_ATTR_ACTIONS attribute wrapping it.  Each tunnelled
    destination costs 92 bytes, so some 712 fit.  Past that the rest
    are never reached and nothing is logged: an 800-port group quietly
    delivers to 712.

resubmit cannot get around either limit, because it does not end the
datapath flow being built.  Only recirculation does.  This series
therefore splits an oversized flood into several OpenFlow flows joined
by a new OVS "recirc" action, sizing each slice against both limits and
against OVS's resubmit count.

Both patches need that OVS action, which is not upstream yet; it is on
ovs-dev as "ofp-actions: Add "recirc" action.".  Nothing here can build
until that lands and OVN's submodule pin is bumped, hence RFC.  Patch
1/2 probes ovs-vswitchd for the action at runtime, so an OVN built
against an OVS without it keeps today's single-flow behaviour and warns
when a group is too large.

This applies on top of "controller: Drop a dead outport load in
multicast groups.", sent separately, which is what brings the
per-destination cost down to the 80 bytes above.

One known limit: a datapath caps recirculation depth at nine slices and
truncates a longer chain silently.  Sharpening the deliberately
conservative per-slice budgets would push that ceiling well out of
reach, and is left for a follow-up.

Han Zhou (2):
  features: Detect the OVS "recirc" action.
  controller: Split oversized multicast floods.

 controller/physical.c        | 250 +++++++++++++++++++++++++++++++-
 include/ovn/features.h       |   2 +
 include/ovn/logical-fields.h |   5 +
 lib/features.c               |  84 +++++++----
 ovn-architecture.7.xml       |  10 ++
 tests/ovn.at                 | 267 +++++++++++++++++++++++++++++++++++
 6 files changed, 588 insertions(+), 30 deletions(-)

-- 
2.38.1

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

Reply via email to