Hi Ben, Any chance you can take a peek at the email below? I hope you can remember this from 2018 :)
Thanks, Eelco On 15 Sep 2021, at 15:30, Eelco Chaudron wrote: > Hi Ben, > > The mentioned fix below is causing a regression, actually two related ones: > > 1) If IGMP snooping is disabled, IGMP related traffic is still sent slow path > for processing with the NORMAL rule. In addition, even without the NORMAL > rule, the DP rule gets modified. > > Here are some examples: > > a) default config, one bridge (kernel dp), two ports (i.e. only a single > NORMAL rule, and mcast_snooping_enable: false), send an IGMP join: > > - With your fix the dp rule looks like this: > > > recirc_id(0),in_port(2),eth(src=04:f4:bc:28:57:01,dst=01:00:5e:00:00:16),eth_type(0x0800),ipv4(frag=no), > packets:8, bytes:576, used:0.169s, > actions:userspace(pid=4220974525,slow_path(match)) > > - Without the fix, which is correct: > > > recirc_id(0),in_port(2),eth(src=04:f4:bc:28:57:01,dst=01:00:5e:00:00:16),eth_type(0x0800),ipv4(frag=no), > packets:8, bytes:576, used:0.004s, actions:1 > > > b) with a more specific OpenFlow entry, no DP entry gets created: > > ovs-ofctl del-flows ovs_pvp_br0 && ovs-ofctl add-flow ovs_pvp_br0 > "in_port=enp5s0f0,eth_type(0x800),ip_proto=2,action=drop" > ovs-ofctl del-flows ovs_pvp_br0 && ovs-ofctl add-flow ovs_pvp_br0 > "in_port=enp5s0f0,eth_type(0x800),ip_proto=2,action=vnet6" > > > 2) With the netdev (DPDK) interface all seems to work as expected, i.e., the > flow gets installed correctly without the userspace upcall in both cases > above. However, the verifier generates an error as it would like to update > the dp rule with a slow_path variant. Which is failing as netdev is using the > odp_flow_key_to_flow() utility function, which has the IGMP check. > > Looking at the change it assumes you filter on igmp type/code when you filter > on the protocol type igmp. But this is not true, you can just filter on the > protocol type only, and this is what is actually causing the problems above. > So I think your patch needs to be reversed! > > However, looking at fixing Huanle's original problem, > https://mail.openvswitch.org/pipermail/ovs-dev/2018-January/343665.html, > looking at his patch, this might be the right solution. All IGMP packets > independent of their type need to be processed by a SLOW_ACTION upcall. > > > I've copied in Flavio, who worked on the IGMP snooping part before, as he > might still remember what I argue above is true :) > > > If you have any other ideas, thoughts please let me know. > > > Cheers, > > Eelco > > ============================================================ > > commit c645550bb2498fb3816b6a39b22bffeb3154dca3 > Author: Ben Pfaff <b...@ovn.org> > Date: Wed Jan 24 11:40:20 2018 -0800 > > odp-util: Always report ODP_FIT_TOO_LITTLE for IGMP. > > OVS datapaths don't understand or parse IGMP fields, but OVS userspace > does, so this commit updates odp_flow_key_to_flow() to report that > properly > to the caller. > > Reported-by: Huanle Han <hanxue...@gmail.com> > Reported-at: > https://mail.openvswitch.org/pipermail/ovs-dev/2018-January/343665.html > Signed-off-by: Ben Pfaff <b...@ovn.org> > > diff --git a/lib/odp-util.c b/lib/odp-util.c > index 14d5af097..5da83b4c6 100644 > --- a/lib/odp-util.c > +++ b/lib/odp-util.c > @@ -6210,6 +6210,11 @@ parse_l2_5_onward(const struct nlattr > *attrs[OVS_KEY_ATTR_MAX + 1], > } > } > } > + } else if (src_flow->nw_proto == IPPROTO_IGMP > + && src_flow->dl_type == htons(ETH_TYPE_IP)) { > + /* OVS userspace parses the IGMP type, code, and group, but its > + * datapaths do not, so there is always missing information. */ > + return ODP_FIT_TOO_LITTLE; > } > if (is_mask && expected_bit != OVS_KEY_ATTR_UNSPEC) { > if ((flow->tp_src || flow->tp_dst) && flow->nw_proto != 0xff) { _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev