> Hi Lorenzo, Hi Mohammad,
> > i have applied and tested this change and i can confirm that it fixes the > issue. > if you please can rebase on top of the main. > > > Acked-by: Mohammad Heib <[email protected]> thx for reviewing the patch. I will post v1 soon. Regards, Lorenzo > > On Thu, Oct 19, 2023 at 7:47 PM Lorenzo Bianconi < > [email protected]> wrote: > > > Avoid recirculating IGMP/MLD packets more than one time from stage > > ls_out_pre_lb in the egress pipeline to ovn table 37 in order to avoid > > packet looping for ovn-ic deployment. > > > > Signed-off-by: Lorenzo Bianconi <[email protected]> > > --- > > controller/pinctrl.c | 2 ++ > > include/ovn/logical-fields.h | 3 +++ > > lib/logical-fields.c | 4 ++++ > > northd/northd.c | 11 +++++++---- > > 4 files changed, 16 insertions(+), 4 deletions(-) > > > > diff --git a/controller/pinctrl.c b/controller/pinctrl.c > > index 3c1cecfde..d4ae7de46 100644 > > --- a/controller/pinctrl.c > > +++ b/controller/pinctrl.c > > @@ -650,6 +650,8 @@ pinctrl_forward_pkt(struct rconn *swconn, int64_t > > dp_key, > > put_load(dp_key, MFF_LOG_DATAPATH, 0, 64, &ofpacts); > > put_load(in_port_key, MFF_LOG_INPORT, 0, 32, &ofpacts); > > put_load(out_port_key, MFF_LOG_OUTPORT, 0, 32, &ofpacts); > > + /* Avoid re-injecting packet already consumed. */ > > + put_load(1, MFF_LOG_FLAGS, MLF_IGMP_IGMP_SPOOF_INJECT_BIT, 1, > > &ofpacts); > > > > struct ofpact_resubmit *resubmit = ofpact_put_RESUBMIT(&ofpacts); > > resubmit->in_port = OFPP_CONTROLLER; > > diff --git a/include/ovn/logical-fields.h b/include/ovn/logical-fields.h > > index a7b64ef67..0652af380 100644 > > --- a/include/ovn/logical-fields.h > > +++ b/include/ovn/logical-fields.h > > @@ -77,6 +77,7 @@ enum mff_log_flags_bits { > > MLF_CHECK_PORT_SEC_BIT = 12, > > MLF_LOOKUP_COMMIT_ECMP_NH_BIT = 13, > > MLF_USE_LB_AFF_SESSION_BIT = 14, > > + MLF_IGMP_IGMP_SPOOF_INJECT_BIT = 15, > > }; > > > > /* MFF_LOG_FLAGS_REG flag assignments */ > > @@ -124,6 +125,8 @@ enum mff_log_flags { > > MLF_LOOKUP_COMMIT_ECMP_NH = (1 << MLF_LOOKUP_COMMIT_ECMP_NH_BIT), > > > > MLF_USE_LB_AFF_SESSION = (1 << MLF_USE_LB_AFF_SESSION_BIT), > > + > > + MLF_IGMP_IGMP_SPOOF = (1 << MLF_IGMP_IGMP_SPOOF_INJECT_BIT), > > }; > > > > /* OVN logical fields > > diff --git a/lib/logical-fields.c b/lib/logical-fields.c > > index fd509d9ee..3d8d5f950 100644 > > --- a/lib/logical-fields.c > > +++ b/lib/logical-fields.c > > @@ -129,6 +129,10 @@ ovn_init_symtab(struct shash *symtab) > > MLF_USE_SNAT_ZONE); > > expr_symtab_add_subfield(symtab, "flags.use_snat_zone", NULL, > > flags_str); > > + snprintf(flags_str, sizeof flags_str, "flags[%d]", > > + MLF_IGMP_IGMP_SPOOF_INJECT_BIT); > > + expr_symtab_add_subfield(symtab, "flags.igmp_loopback", NULL, > > + flags_str); > > > > /* Connection tracking state. */ > > expr_symtab_add_field_scoped(symtab, "ct_mark", MFF_CT_MARK, NULL, > > false, > > diff --git a/northd/northd.c b/northd/northd.c > > index 916068d44..557fcca72 100644 > > --- a/northd/northd.c > > +++ b/northd/northd.c > > @@ -7323,7 +7323,8 @@ build_interconn_mcast_snoop_flows(struct > > ovn_datapath *od, > > continue; > > } > > /* Punt IGMP traffic to controller. */ > > - char *match = xasprintf("inport == %s && igmp", op->json_key); > > + char *match = xasprintf("inport == %s && igmp && " > > + "flags.igmp_loopback == 0", op->json_key); > > ovn_lflow_metered(lflows, od, S_SWITCH_OUT_PRE_LB, 120, match, > > "clone { igmp; }; next;", > > copp_meter_get(COPP_IGMP, od->nbs->copp, > > @@ -7331,7 +7332,8 @@ build_interconn_mcast_snoop_flows(struct > > ovn_datapath *od, > > free(match); > > > > /* Punt MLD traffic to controller. */ > > - match = xasprintf("inport == %s && (mldv1 || mldv2)", > > op->json_key); > > + match = xasprintf("inport == %s && (mldv1 || mldv2) && " > > + "flags.igmp_loopback == 0", op->json_key); > > ovn_lflow_metered(lflows, od, S_SWITCH_OUT_PRE_LB, 120, match, > > "clone { igmp; }; next;", > > copp_meter_get(COPP_IGMP, od->nbs->copp, > > @@ -10317,13 +10319,14 @@ build_lswitch_destination_lookup_bmcast(struct > > ovn_datapath *od, > > ds_put_cstr(actions, "igmp;"); > > /* Punt IGMP traffic to controller. */ > > ovn_lflow_metered(lflows, od, S_SWITCH_IN_L2_LKUP, 100, > > - "igmp", ds_cstr(actions), > > + "flags.igmp_loopback == 0 && igmp", > > ds_cstr(actions), > > copp_meter_get(COPP_IGMP, od->nbs->copp, > > meter_groups)); > > > > /* Punt MLD traffic to controller. */ > > ovn_lflow_metered(lflows, od, S_SWITCH_IN_L2_LKUP, 100, > > - "mldv1 || mldv2", ds_cstr(actions), > > + "flags.igmp_loopback == 0 && (mldv1 || mldv2)", > > + ds_cstr(actions), > > copp_meter_get(COPP_IGMP, od->nbs->copp, > > meter_groups)); > > > > -- > > 2.41.0 > > > > _______________________________________________ > > 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
