[ovs-dev] incorrect revalidated action for igmp
Huanle Han
hanxueluo at gmail.com
Sat Jul 15 03:11:40 UTC 2017
This patch can slove the problem.
But I think wc->masks.tp_src should not be masked in userspace as igmp type
is not supported in datapath. Otherwise, flow_wildcards_has_extra() in
revalidate_ukey__ always return true for igmp megaflow, and igmp flow is
never kept in datapath.
Thanks,
Huanle
On Wednesday, July 12, 2017, Ben Pfaff <blp at ovn.org> wrote:
> On Thu, Jun 22, 2017 at 01:04:48AM +0800, Huanle Han wrote:
> > In "Normal" action, igmp report packet is expected to processed in slow
> > path.
> > However, the igmp_type(flow->tp_src) is not supported to be masked in
> > datapath.
> > Then ovs-vswitchd revalidate the flow with igmp_type(flow->tp_src) == 0.
> It
> > leads to a "multicast traffic, flooding" action and overwrites the
> > "userspace()" in datapath.
> >
> > This is code segment from function "xlate_normal":
> >
> > if (is_igmp(flow, wc)) {
> > memset(&wc->masks.tp_src, 0xff, sizeof wc->masks.tp_src);
> > if (mcast_snooping_is_membership(flow->tp_src) ||
> > mcast_snooping_is_query(flow->tp_src)) { <<<<<<<<<
> > flow->tp_src is 0
> > if (ctx->xin->allow_side_effects && ctx->xin->packet) {
> > update_mcast_snooping_table(ctx, flow, vlan,
> > in_xbundle,
> > ctx->xin->packet);
> > }
> > /*
> > * IGMP packets need to take the slow path, in order to
> be
> > * processed for mdb updates. That will prevent expires
> > * firing off even after hosts have sent reports.
> > */
> > ctx->xout->slow |= SLOW_ACTION;
> > }
> > .......
> > }
> >
> > To reproduce this bug, you need to ovs-appctl upcall/disable-megaflows
>
> Thanks for the bug report.
>
> Does the following patch fix the problem?
>
> diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
> index 089c7f170d18..5030dafd9f42 100644
> --- a/ofproto/ofproto-dpif-xlate.c
> +++ b/ofproto/ofproto-dpif-xlate.c
> @@ -2720,6 +2720,13 @@ xlate_normal(struct xlate_ctx *ctx)
> struct mcast_group *grp = NULL;
>
> if (is_igmp(flow, wc)) {
> + /*
> + * IGMP packets need to take the slow path, in order to be
> + * processed for mdb updates. That will prevent expires
> + * firing off even after hosts have sent reports.
> + */
> + ctx->xout->slow |= SLOW_ACTION;
> +
> memset(&wc->masks.tp_src, 0xff, sizeof wc->masks.tp_src);
> if (mcast_snooping_is_membership(flow->tp_src) ||
> mcast_snooping_is_query(flow->tp_src)) {
> @@ -2727,12 +2734,6 @@ xlate_normal(struct xlate_ctx *ctx)
> update_mcast_snooping_table(ctx, flow, vlan,
> in_xbundle,
> ctx->xin->packet);
> }
> - /*
> - * IGMP packets need to take the slow path, in order to be
> - * processed for mdb updates. That will prevent expires
> - * firing off even after hosts have sent reports.
> - */
> - ctx->xout->slow |= SLOW_ACTION;
> }
>
> if (mcast_snooping_is_membership(flow->tp_src)) {
>
More information about the dev
mailing list