On Wed, Oct 8, 2025 at 12:10 PM Dumitru Ceara <[email protected]> wrote:
> On 10/8/25 12:08 PM, Ales Musil wrote: > > On Wed, Oct 8, 2025 at 11:51 AM Dumitru Ceara <[email protected]> wrote: > > > >> On 10/7/25 8:37 AM, Ales Musil wrote: > >>> The split buf was causing issues with overloaded ovn-controller. That > >>> would happen when there was a lof of multicast traffic, due to the > >>> split nature the traffic could hit ovn-controller pinctrl thread > >>> multiple times. The original commit aimed to workaround limitation > >>> within Linux kernel, which would reject too long actions. The > limitation > >>> should be fixed [0] so there isn't a need for the workaround anymore. > >>> > >>> This partially reverts [1] and [2] both of them used the split buf > >> action. > >>> > >>> Note that this should solve the ovn-controller overload issues, however > >>> if the multicast group is big enough there might be still an issue > >>> with resubmit limit. > >>> > >>> [0] > >> > https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/commit/?id=a1e64addf3ff > >>> [1] 325c7b203d8b ("controller: split mg action in table 39 and 40 to > fit > >> kernel netlink buffer size") > >>> [2] 7c3f7f415f1d ("northd, controller: Flood ARP and NA packet on > >> transit router.") > >>> Reported-at: > >> > https://mail.openvswitch.org/pipermail/ovs-discuss/2025-February/053455.html > >>> Reported-at: https://issues.redhat.com/browse/FDP-1636 > >>> Signed-off-by: Ales Musil <[email protected]> > >>> --- > >> > >> Hi Ales, > >> > >> Thanks for the follow up! > >> > >> I only have one question below. Once that is cleared up I'm OK with > >> acking the patch. > >> > > > > Hi Dumitru, > > > > thank you for the review. > > > > > >> > >>> TODO.rst | 1 + > >>> controller/lflow.h | 3 - > >>> controller/physical.c | 131 +++++++++------------------------------- > >>> controller/pinctrl.c | 7 ++- > >>> include/ovn/actions.h | 2 +- > >>> lib/actions.c | 1 - > >>> tests/ovn-controller.at | 55 ----------------- > >>> tests/ovn.at | 61 +------------------ > >>> 8 files changed, 36 insertions(+), 225 deletions(-) > >>> > >>> diff --git a/TODO.rst b/TODO.rst > >>> index 741ac6027..abcf6c526 100644 > >>> --- a/TODO.rst > >>> +++ b/TODO.rst > >>> @@ -200,6 +200,7 @@ when the feature/action will move from > >> ``Deprecated`` to ``Removed``. > >>> * 26.03 Deprecated > >>> > >>> * ``ct_lb`` action, should be removed in 26.09. > >>> + * ``SPLIT_BUF_ACTION`` action, should be removed in 28.09. > >>> > >>> * 26.03 Removed > >>> > >>> diff --git a/controller/lflow.h b/controller/lflow.h > >>> index a97abd824..d82acc0d8 100644 > >>> --- a/controller/lflow.h > >>> +++ b/controller/lflow.h > >>> @@ -105,9 +105,6 @@ struct uuid; > >>> #define OFTABLE_GET_REMOTE_FDB 87 > >>> #define OFTABLE_LEARN_REMOTE_FDB 88 > >>> > >>> -/* Common defines shared between some controller components. */ > >>> -#define CHASSIS_FLOOD_INDEX_START 0x8000 > >>> - > >>> > >>> struct lflow_ctx_in { > >>> struct ovsdb_idl_index *sbrec_multicast_group_by_name_datapath; > >>> diff --git a/controller/physical.c b/controller/physical.c > >>> index d161dc437..c055e664b 100644 > >>> --- a/controller/physical.c > >>> +++ b/controller/physical.c > >>> @@ -225,18 +225,6 @@ match_set_chassis_flood_outport(struct match > *match, > >>> } > >>> } > >>> > >>> -static void > >>> -match_set_chassis_flood_remote(struct match *match, uint32_t index) > >>> -{ > >>> - match_init_catchall(match); > >>> - match_set_reg(match, MFF_REG6 - MFF_REG0, index); > >>> - /* Match if the packet wasn't already received from tunnel. > >>> - * This prevents from looping it back to the tunnel again. */ > >>> - match_set_reg_masked(match, MFF_LOG_FLAGS - MFF_REG0, 0, > >>> - MLF_RX_FROM_TUNNEL); > >>> -} > >>> - > >>> - > >>> static void > >>> put_stack(enum mf_field_id field, struct ofpact_stack *stack) > >>> { > >>> @@ -245,27 +233,6 @@ put_stack(enum mf_field_id field, struct > >> ofpact_stack *stack) > >>> stack->subfield.n_bits = stack->subfield.field->n_bits; > >>> } > >>> > >>> -/* Split the ofpacts buffer to prevent overflow of the > >>> - * MAX_ACTIONS_BUFSIZE netlink buffer size supported by the kernel. > >>> - * In order to avoid all the action buffers to be squashed together by > >>> - * ovs, add a controller action for each configured openflow. > >>> - */ > >>> -static void > >>> -put_split_buf_function(uint32_t index, uint32_t outport, uint8_t > stage, > >>> - struct ofpbuf *ofpacts) > >>> -{ > >>> - ovs_be32 values[2] = { > >>> - htonl(index), > >>> - htonl(outport) > >>> - }; > >>> - size_t oc_offset = > >>> - encode_start_controller_op(ACTION_OPCODE_SPLIT_BUF_ACTION, > >> false, > >>> - NX_CTLR_NO_METER, ofpacts); > >>> - ofpbuf_put(ofpacts, values, sizeof values); > >>> - ofpbuf_put(ofpacts, &stage, sizeof stage); > >>> - encode_finish_controller_op(oc_offset, ofpacts); > >>> -} > >>> - > >>> static const struct sbrec_port_binding * > >>> get_localnet_port(const struct hmap *local_datapaths, int64_t > >> tunnel_key) > >>> { > >>> @@ -2600,11 +2567,7 @@ local_set_ct_zone_and_output_pb(int tunnel_key, > >> int64_t zone_id, > >>> put_resubmit(OFTABLE_CHECK_LOOPBACK, ofpacts); > >>> } > >>> > >>> -#define MC_OFPACTS_MAX_MSG_SIZE 8192 > >>> -#define MC_BUF_START_ID 0x9000 > >>> - > >>> -struct mc_buf_split_ctx { > >>> - uint8_t index; > >>> +struct mc_flow_ctx { > >>> uint8_t stage; > >>> uint16_t prio; > >>> uint32_t flags; > >>> @@ -2612,18 +2575,17 @@ struct mc_buf_split_ctx { > >>> struct ofpbuf ofpacts; > >>> }; > >>> > >>> -enum mc_buf_split_type { > >>> - MC_BUF_SPLIT_LOCAL, > >>> - MC_BUF_SPLIT_REMOTE, > >>> - MC_BUF_SPLIT_REMOTE_RAMP, > >>> - MC_BUF_SPLIT_MAX, > >>> +enum mc_flows_type { > >>> + MC_FLOWS_LOCAL, > >>> + MC_FLOWS_REMOTE, > >>> + MC_FLOWS_REMOTE_RAMP, > >>> + MC_FLOWS_MAX, > >>> }; > >>> > >>> static void > >>> mc_ofctrl_add_flow(const struct sbrec_multicast_group *mc, > >>> - struct mc_buf_split_ctx *ctx, bool split, > >>> + struct mc_flow_ctx *ctx, > >>> struct ovn_desired_flow_table *flow_table) > >>> - > >>> { > >>> struct match match = MATCH_CATCHALL_INITIALIZER; > >>> > >>> @@ -2631,24 +2593,10 @@ mc_ofctrl_add_flow(const struct > >> sbrec_multicast_group *mc, > >>> mc->tunnel_key); > >>> match_set_reg_masked(&match, MFF_LOG_FLAGS - MFF_REG0, > >>> ctx->flags, ctx->flags_mask); > >>> - > >>> - uint16_t prio = ctx->prio; > >>> - if (ctx->index) { > >>> - match_set_reg(&match, MFF_REG6 - MFF_REG0, > >>> - MC_BUF_START_ID + ctx->index); > >>> - prio += 10; > >>> - } > >>> - > >>> - if (split) { > >>> - put_split_buf_function(MC_BUF_START_ID + ctx->index + 1, > >>> - mc->tunnel_key, ctx->stage, > >> &ctx->ofpacts); > >>> - } > >>> - > >>> - ofctrl_add_flow(flow_table, ctx->stage, prio, > >> mc->header_.uuid.parts[0], > >>> - &match, &ctx->ofpacts, &mc->header_.uuid); > >>> + ofctrl_add_flow(flow_table, ctx->stage, ctx->prio, > >>> + mc->header_.uuid.parts[0], &match, &ctx->ofpacts, > >>> + &mc->header_.uuid); > >>> ofpbuf_clear(&ctx->ofpacts); > >>> - /* reset MFF_REG6. */ > >>> - put_load(0, MFF_REG6, 0, 32, &ctx->ofpacts); > >>> } > >>> > >>> static void > >>> @@ -2687,7 +2635,7 @@ consider_mc_group(const struct physical_ctx *ctx, > >>> */ > >>> bool has_vtep = has_vtep_port(ctx->local_datapaths, > >>> mc->datapath->tunnel_key); > >>> - struct mc_buf_split_ctx mc_split[MC_BUF_SPLIT_MAX] = { > >>> + struct mc_flow_ctx mc_flows[MC_FLOWS_MAX] = { > >>> { > >>> .stage = OFTABLE_LOCAL_OUTPUT, > >>> .prio = 100, > >>> @@ -2704,15 +2652,14 @@ consider_mc_group(const struct physical_ctx > *ctx, > >>> .flags_mask = MLF_RCV_FROM_RAMP | MLF_ALLOW_LOOPBACK, > >>> }, > >>> }; > >>> - for (size_t i = 0; i < MC_BUF_SPLIT_MAX; i++) { > >>> - struct mc_buf_split_ctx *split_ctx = &mc_split[i]; > >>> - ofpbuf_init(&split_ctx->ofpacts, 0); > >>> - put_load(0, MFF_REG6, 0, 32, &split_ctx->ofpacts); > >>> + for (size_t i = 0; i < MC_FLOWS_MAX; i++) { > >>> + struct mc_flow_ctx *flow_ctx = &mc_flows[i]; > >>> + ofpbuf_init(&flow_ctx->ofpacts, 0); > >>> } > >>> > >>> - struct mc_buf_split_ctx *local_ctx = > &mc_split[MC_BUF_SPLIT_LOCAL]; > >>> - struct mc_buf_split_ctx *remote_ctx = > >> &mc_split[MC_BUF_SPLIT_REMOTE]; > >>> - struct mc_buf_split_ctx *ramp_ctx = > >> &mc_split[MC_BUF_SPLIT_REMOTE_RAMP]; > >>> + struct mc_flow_ctx *local_ctx = &mc_flows[MC_FLOWS_LOCAL]; > >>> + struct mc_flow_ctx *remote_ctx = &mc_flows[MC_FLOWS_REMOTE]; > >>> + struct mc_flow_ctx *ramp_ctx = &mc_flows[MC_FLOWS_REMOTE_RAMP]; > >>> > >>> for (size_t i = 0; i < mc->n_ports; i++) { > >>> struct sbrec_port_binding *port = mc->ports[i]; > >>> @@ -2796,17 +2743,6 @@ consider_mc_group(const struct physical_ctx > *ctx, > >>> } > >>> } > >>> } > >>> - > >>> - for (size_t n = 0; n < MC_BUF_SPLIT_MAX; n++) { > >>> - struct mc_buf_split_ctx *split_ctx = &mc_split[n]; > >>> - if (!has_vtep && n == MC_BUF_SPLIT_REMOTE_RAMP) { > >>> - continue; > >>> - } > >>> - if (split_ctx->ofpacts.size >= MC_OFPACTS_MAX_MSG_SIZE) { > >>> - mc_ofctrl_add_flow(mc, split_ctx, true, flow_table); > >>> - split_ctx->index++; > >>> - } > >>> - } > >>> } > >>> > >>> bool local_lports = local_ctx->ofpacts.size > 0; > >>> @@ -2815,7 +2751,7 @@ consider_mc_group(const struct physical_ctx *ctx, > >>> > >>> if (local_lports) { > >>> put_load(mc->tunnel_key, MFF_LOG_OUTPORT, 0, 32, > >> &local_ctx->ofpacts); > >>> - mc_ofctrl_add_flow(mc, local_ctx, false, flow_table); > >>> + mc_ofctrl_add_flow(mc, local_ctx, flow_table); > >>> } > >>> > >>> if (remote_ports) { > >>> @@ -2831,31 +2767,28 @@ consider_mc_group(const struct physical_ctx > *ctx, > >>> remote_ports = remote_ctx->ofpacts.size > 0; > >>> if (remote_ports) { > >>> put_resubmit(OFTABLE_REMOTE_VTEP_OUTPUT, > &remote_ctx->ofpacts); > >>> - mc_ofctrl_add_flow(mc, remote_ctx, false, flow_table); > >>> + mc_ofctrl_add_flow(mc, remote_ctx, flow_table); > >>> } > >>> > >>> if (ramp_ports && has_vtep) { > >>> put_load(mc->tunnel_key, MFF_LOG_OUTPORT, 0, 32, > >> &ramp_ctx->ofpacts); > >>> put_resubmit(OFTABLE_REMOTE_VTEP_OUTPUT, &ramp_ctx->ofpacts); > >>> - mc_ofctrl_add_flow(mc, ramp_ctx, false, flow_table); > >>> + mc_ofctrl_add_flow(mc, ramp_ctx, flow_table); > >>> } > >>> > >>> - for (size_t i = 0; i < MC_BUF_SPLIT_MAX; i++) { > >>> - ofpbuf_uninit(&mc_split[i].ofpacts); > >>> + for (size_t i = 0; i < MC_FLOWS_MAX; i++) { > >>> + ofpbuf_uninit(&mc_flows[i].ofpacts); > >>> } > >>> sset_destroy(&remote_chassis); > >>> sset_destroy(&vtep_chassis); > >>> } > >>> > >>> -#define CHASSIS_FLOOD_MAX_MSG_SIZE MC_OFPACTS_MAX_MSG_SIZE > >>> - > >>> static void > >>> physical_eval_remote_chassis_flows(const struct physical_ctx *ctx, > >>> struct ofpbuf *egress_ofpacts, > >>> struct ovn_desired_flow_table > >> *flow_table) > >>> { > >>> struct match match = MATCH_CATCHALL_INITIALIZER; > >>> - uint32_t index = CHASSIS_FLOOD_INDEX_START; > >>> struct chassis_tunnel *prev = NULL; > >>> > >>> uint8_t actions_stub[256]; > >>> @@ -2892,18 +2825,6 @@ physical_eval_remote_chassis_flows(const struct > >> physical_ctx *ctx, > >>> ofpact_put_OUTPUT(egress_ofpacts)->port = tun->ofport; > >>> prev = tun; > >>> > >>> - if (egress_ofpacts->size > CHASSIS_FLOOD_MAX_MSG_SIZE) { > >>> - match_set_chassis_flood_remote(&match, index++); > >>> - put_split_buf_function(index, 0, > >> OFTABLE_FLOOD_REMOTE_CHASSIS, > >>> - egress_ofpacts); > >>> - > >>> - ofctrl_add_flow(flow_table, OFTABLE_FLOOD_REMOTE_CHASSIS, > >> 100, 0, > >>> - &match, egress_ofpacts, hc_uuid); > >>> - > >>> - ofpbuf_clear(egress_ofpacts); > >>> - prev = NULL; > >>> - } > >>> - > >>> > >>> ofpbuf_clear(&ingress_ofpacts); > >>> put_load(1, MFF_LOG_FLAGS, MLF_RX_FROM_TUNNEL_BIT, 1, > >>> @@ -2944,12 +2865,14 @@ physical_eval_remote_chassis_flows(const struct > >> physical_ctx *ctx, > >>> } > >>> > >>> if (egress_ofpacts->size > 0) { > >>> - match_set_chassis_flood_remote(&match, index++); > >>> - > >>> + match_init_catchall(&match); > >>> + /* Match if the packet wasn't already received from tunnel. > >>> + * This prevents from looping it back to the tunnel again. */ > >>> + match_set_reg_masked(&match, MFF_LOG_FLAGS - MFF_REG0, 0, > >>> + MLF_RX_FROM_TUNNEL); > >>> ofctrl_add_flow(flow_table, OFTABLE_FLOOD_REMOTE_CHASSIS, 100, > >> 0, > >>> &match, egress_ofpacts, hc_uuid); > >>> } > >>> - > >> > >> Nit: I think I'd keep this empty line. > >> > > > > Ack. > > > > > >> > >>> ofpbuf_uninit(&ingress_ofpacts); > >>> } > >>> > >>> diff --git a/controller/pinctrl.c b/controller/pinctrl.c > >>> index 8c4561374..2370fa5fe 100644 > >>> --- a/controller/pinctrl.c > >>> +++ b/controller/pinctrl.c > >>> @@ -3781,10 +3781,15 @@ process_packet_in(struct rconn *swconn, const > >> struct ofp_header *msg) > >>> ovs_mutex_unlock(&pinctrl_mutex); > >>> break; > >>> > >>> - case ACTION_OPCODE_SPLIT_BUF_ACTION: > >> > >> We should probably move the /* Deprecated actions. */ comment here. > >> > >>> + case ACTION_OPCODE_SPLIT_BUF_ACTION: { > >>> + char *opc_str = ovnact_op_to_string(ntohl(ah->opcode)); > >>> + VLOG_WARN_RL(&rl, "pinctrl received deprecated packet-in | > >> opcode=%s", > >>> + opc_str); > >>> + free(opc_str); > >>> pinctrl_split_buf_action_handler(swconn, &packet, > >> &pin.flow_metadata, > >>> &userdata); > >> > >> I'm wondering whether we should just remove the handler completely. > >> > >> The handler will reinject the packet with "index" loaded in REG6. But > >> we are removing all the openflow rules that match on REG6. > >> > >> While typing this though I was thinking that maybe the case you're > >> trying to cover is when ovn-controller hasn't updated the openflow rules > >> yet (e.g., waiting for the first full SB update to be received) but > >> pinctrl is already running (ofctrl_put() returns early). Was that the > >> case you were handling here? > >> > > > > Yes, that is the reason why I left it there. > > > > Cool, thanks for the confirmation! With the other small nits addressed: > > Acked-by: Dumitru Ceara <[email protected]> > > > > >> > >>> break; > >>> + } > >>> > >>> /* Deprecated actions. */ > >>> case ACTION_OPCODE_PUT_ICMP4_FRAG_MTU: > >>> diff --git a/include/ovn/actions.h b/include/ovn/actions.h > >>> index 78c2e8ebe..d3f0bfd04 100644 > >>> --- a/include/ovn/actions.h > >>> +++ b/include/ovn/actions.h > >>> @@ -804,7 +804,7 @@ OVNACTS > >>> /* activation_strategy() */ > >> \ > >>> ACTION_OPCODE(ACTIVATION_STRATEGY) > >> \ > >>> > >> \ > >>> - /* split buffer action. */ > >> \ > >>> + /* DEPRECATED: split buffer action. */ > >> \ > >>> ACTION_OPCODE(SPLIT_BUF_ACTION) > >> \ > >>> > >> \ > >>> /* "dhcp_relay_req_chk(relay_ip, server_ip)". > >>> diff --git a/lib/actions.c b/lib/actions.c > >>> index f0758752f..53f4d20a9 100644 > >>> --- a/lib/actions.c > >>> +++ b/lib/actions.c > >>> @@ -5637,7 +5637,6 @@ encode_FLOOD_REMOTE(const struct ovnact_null > *null > >> OVS_UNUSED, > >>> const struct ovnact_encode_params *ep, > >>> struct ofpbuf *ofpacts) > >>> { > >>> - put_load(CHASSIS_FLOOD_INDEX_START, MFF_REG6, 0, 32, ofpacts); > >>> emit_resubmit(ofpacts, ep->flood_remote_table); > >>> } > >>> > >>> diff --git a/tests/ovn-controller.at b/tests/ovn-controller.at > >>> index 6a7ffa5fe..c734e0413 100644 > >>> --- a/tests/ovn-controller.at > >>> +++ b/tests/ovn-controller.at > >>> @@ -2847,57 +2847,6 @@ OVN_CLEANUP([hv1]) > >>> AT_CLEANUP > >>> ]) > >>> > >>> -OVN_FOR_EACH_NORTHD([ > >>> -AT_SETUP([ovn-controller - multicast group buffer split]) > >>> -AT_KEYWORDS([ovn]) > >>> -ovn_start > >>> - > >>> -net_add n1 > >>> - > >>> -sim_add hv1 > >>> -as hv1 > >>> -ovs-vsctl add-br br-phys > >>> -ovn_attach n1 br-phys 192.168.0.1 > >>> - > >>> -for i in $(seq 1 320); do > >>> - OVS_VSCTL(add-port br-int hv1-vif$i -- \ > >>> - set interface hv1-vif$i external-ids:iface-id=sw0-p$i \ > >>> - options:tx_pcap=hv1/vif${i}-tx.pcap \ > >>> - options:rxq_pcap=hv1/vif${i}-rx.pcap \ > >>> - ofport-request=$i) > >>> -done > >>> -RUN_OVS_VSCTL > >>> - > >>> -check ovn-nbctl ls-add sw0 > >>> -for i in $(seq 1 320); do > >>> - OVN_NBCTL(lsp-add sw0 sw0-p$i) > >>> - OVN_NBCTL(lsp-set-addresses sw0-p$i "unknown") > >>> -done > >>> -RUN_OVN_NBCTL > >>> - > >>> -wait_for_ports_up > >>> -check ovn-nbctl --wait=hv sync > >>> - > >>> -OVS_WAIT_FOR_OUTPUT([as hv1 ovs-ofctl dump-flows br-int > >> table=OFTABLE_LOCAL_OUTPUT | grep reg15=0x8000,metadata=0x1 | grep -c > >> "controller(userdata=00.00.00.1b"], [0],[dnl > >>> -3 > >>> -]) > >>> - > >>> -for i in $(seq 1 280); do > >>> - OVN_NBCTL(lsp-del sw0-p$i) > >>> -done > >>> -RUN_OVN_NBCTL > >>> -check ovn-nbctl --wait=hv sync > >>> - > >>> -AT_CHECK([as hv1 ovs-ofctl dump-flows br-int > table=OFTABLE_LOCAL_OUTPUT > >> | grep -q controller], [1]) > >>> - > >>> -# Since we add many ports in one nbctl command, we might get some > >> warnings on slow systems. > >>> -OVN_CLEANUP([hv1 > >>> -/Unreasonably long/d > >>> -/faults:/d > >>> -/context switches/d]) > >>> -AT_CLEANUP > >>> -]) > >>> - > >>> AT_SETUP([ovn-controller - ssl/tls ciphers using command line > options]) > >>> AT_KEYWORDS([ovn]) > >>> AT_SKIP_IF([test "$HAVE_OPENSSL" = no]) > >>> @@ -3706,10 +3655,6 @@ AT_CHECK([grep -c > >> 'move:NXM_NX_REG14\[[0..11\]]->NXM_NX_TUN_ID\[[12..23\]],move: > >>> 1 > >>> ]) > >>> > >>> -AT_CHECK([grep -c "reg6=0x8000" flood_flows], [0], [dnl > >>> -1 > >>> -]) > >>> - > >>> AT_CHECK([grep -c "reg10=0/0x10000" flood_flows], [0], [dnl > >>> 1 > >>> ]) > >>> diff --git a/tests/ovn.at b/tests/ovn.at > >>> index 0a4c7c6db..060305662 100644 > >>> --- a/tests/ovn.at > >>> +++ b/tests/ovn.at > >>> @@ -2319,7 +2319,7 @@ ct_proto(); > >>> Syntax error at `ct_proto' expecting action. > >>> > >>> flood_remote; > >>> - encodes as > >> set_field:0x8000->reg6,resubmit(,OFTABLE_FLOOD_REMOTE_CHASSIS) > >>> + encodes as resubmit(,OFTABLE_FLOOD_REMOTE_CHASSIS) > >>> > >>> flood_remote(); > >>> Syntax error at `(' expecting `;'. > >>> @@ -39578,65 +39578,6 @@ OVN_CLEANUP([hv1]) > >>> AT_CLEANUP > >>> ]) > >>> > >>> -OVN_FOR_EACH_NORTHD([ > >>> -AT_SETUP([multicast group buffer split]) > >>> -AT_KEYWORDS([ovn-mc-split]) > >>> -AT_SKIP_IF([test $HAVE_SCAPY = no]) > >>> -ovn_start > >>> - > >>> -net_add n > >>> -sim_add hv1 > >>> - > >>> -as hv1 > >>> -check ovs-vsctl add-br br-phys > >>> -ovn_attach n br-phys 192.168.0.1 > >>> -check ovs-vsctl set open . > external-ids:ovn-bridge-mappings=phys:br-phys > >>> - > >>> -for i in $(seq 1 320); do > >>> - OVS_VSCTL( add-port br-int hv1-vif$i -- \ > >>> - set interface hv1-vif$i external-ids:iface-id=sw0-port$i \ > >>> - options:tx_pcap=hv1/vif$i-tx.pcap \ > >>> - options:rxq_pcap=hv1/vif$i-rx.pcap) > >>> -done > >>> -RUN_OVS_VSCTL > >>> - > >>> -check ovn-nbctl ls-add sw0 > >>> - > >>> -check ovn-nbctl lsp-add sw0 sw0-port1 > >>> -check ovn-nbctl lsp-set-addresses sw0-port1 "50:54:00:00:00:01 > 10.0.0.2" > >>> -for i in $(seq 2 320); do > >>> - OVN_NBCTL(lsp-add sw0 sw0-port$i -- lsp-set-addresses sw0-port$i > >> "unknown") > >>> -done > >>> -RUN_OVN_NBCTL > >>> - > >>> -check ovn-nbctl --wait=hv sync > >>> -wait_for_ports_up > >>> -OVN_POPULATE_ARP > >>> - > >>> -AT_CHECK([as hv1 ovs-ofctl dump-flows br-int > table=OFTABLE_LOCAL_OUTPUT > >> | grep -c controller], [0],[dnl > >>> -9 > >>> -]) > >>> - > >>> -arp_req=$(fmt_pkt "Ether(dst='ff:ff:ff:ff:ff:ff', > >> src='50:54:00:00:00:01')/ARP(pdst='10.0.0.254', psrc='10.0.0.1')") > >>> -echo $arp_req > expected > >>> -as hv1 ovs-appctl netdev-dummy/receive hv1-vif1 $arp_req > >>> - > >>> -OVS_WAIT_UNTIL([test $($PYTHON "$ovs_srcdir/utilities/ovs-pcap.in" > >> hv1/vif2-tx.pcap | wc -l) -ge 1]) > >>> -OVN_CHECK_PACKETS([hv1/vif2-tx.pcap], [expected]) > >>> - > >>> -OVS_WAIT_UNTIL([test $($PYTHON "$ovs_srcdir/utilities/ovs-pcap.in" > >> hv1/vif100-tx.pcap | wc -l) -ge 1]) > >>> -OVN_CHECK_PACKETS([hv1/vif100-tx.pcap], [expected]) > >>> - > >>> -OVS_WAIT_UNTIL([test $($PYTHON "$ovs_srcdir/utilities/ovs-pcap.in" > >> hv1/vif150-tx.pcap | wc -l) -ge 1]) > >>> -OVN_CHECK_PACKETS([hv1/vif150-tx.pcap], [expected]) > >>> - > >>> -OVS_WAIT_UNTIL([test $($PYTHON "$ovs_srcdir/utilities/ovs-pcap.in" > >> hv1/vif300-tx.pcap | wc -l) -ge 1]) > >>> -OVN_CHECK_PACKETS([hv1/vif150-tx.pcap], [expected]) > >>> - > >>> -OVN_CLEANUP([hv1]) > >>> -AT_CLEANUP > >>> -]) > >>> - > >>> OVN_FOR_EACH_NORTHD([ > >>> AT_SETUP([virtual port claim race condition]) > >>> AT_KEYWORDS([virtual ports]) > >> > >> Regards, > >> Dumitru > >> > >> > >> > > Regards, > > Ales > > > > Regards, > Dumitru > > Thank you Dumitru, I have addressed the nits, went ahead and merged this into main and backported all the way down to 24.03. Thanks, Ales _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
