This code in odp-util is basically unmaintainable. I've never been able to figure out how to properly test or reason about it. It's a huge reason that I want to get rid of the kernel module.
On Mon, Oct 04, 2021 at 11:49:41AM +0200, Eelco Chaudron wrote: > 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