Thanks for pointing out the nits. I fixed them and I'll apply this in a minute.
On Tue, Nov 04, 2014 at 09:41:38AM -0800, Jarno Rajahalme wrote: > With small nits below: > > Acked-by: Jarno Rajahalme <jrajaha...@nicira.com> > > On Nov 3, 2014, at 5:14 PM, Ben Pfaff <b...@nicira.com> wrote: > > > Until now, ofproto/trace has looked up the flow itself. xlate_actions() > > can do the flow lookup internally and, since that is what happens when a > > packet arrives, having it do its own packet lookup makes a lot of sense. > > > > I noticed this in connection with the actset_output field, which > > xlate_actions() should set to OFPP_UNSET at the beginning of translation > > before looking up the flow. ofproto/trace didn't do that, so it looked > > up a rule with actset_output=0 instead. By having xlate_actions() do the > > lookup, the behavior can be consistent and correct. > > > > Signed-off-by: Ben Pfaff <b...@nicira.com> > > --- > > ofproto/ofproto-dpif-xlate.c | 18 +++++++++- > > ofproto/ofproto-dpif.c | 77 > > +++++++++++++++--------------------------- > > 2 files changed, 45 insertions(+), 50 deletions(-) > > > > diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c > > index 8a8eb92..a6bde1d 100644 > > --- a/ofproto/ofproto-dpif-xlate.c > > +++ b/ofproto/ofproto-dpif-xlate.c > > @@ -2747,7 +2747,7 @@ xlate_table_action(struct xlate_ctx *ctx, ofp_port_t > > in_port, uint8_t table_id, > > ctx->xin->flow.in_port.ofp_port = old_in_port; > > > > if (ctx->xin->resubmit_hook) { > > It seems that only trace sets the resubmit hook, so this should be annotated > with OVS_UNLIKELY as well? > > > - ctx->xin->resubmit_hook(ctx->xin, rule, ctx->recurse); > > + ctx->xin->resubmit_hook(ctx->xin, rule, ctx->recurse + 1); > > } > > > > switch (verdict) { > > @@ -4256,6 +4256,18 @@ xlate_actions(struct xlate_in *xin, struct xlate_out > > *xout) > > !xin->skip_wildcards ? wc : NULL, > > &rule, ctx.xin->xcache != NULL, > > ctx.xin->resubmit_stats); > > + if (OVS_UNLIKELY(ctx.xin->report_hook)) { > > + if (rule == ctx.xbridge->miss_rule) { > > + xlate_report(&ctx, "No match, flow generates \"packet > > in\"s."); > > + } else if (rule == ctx.xbridge->no_packet_in_rule) { > > + xlate_report(&ctx, "No match, packets dropped because " > > + "OFPPC_NO_PACKET_IN is set on in_port."); > > + } else if (rule == ctx.xbridge->drop_frags_rule) { > > + xlate_report(&ctx, "Packets dropped because they are IP " > > + "fragments and the fragment handling mode is " > > + "\"drop\"."); > > + } > > + } > > if (ctx.xin->resubmit_stats) { > > rule_dpif_credit_stats(rule, ctx.xin->resubmit_stats); > > } > > @@ -4266,6 +4278,10 @@ xlate_actions(struct xlate_in *xin, struct xlate_out > > *xout) > > entry->u.rule = rule; > > } > > ctx.rule = rule; > > + > > + if (ctx.xin->resubmit_hook) { > > Same here. > > > + ctx.xin->resubmit_hook(ctx.xin, rule, 0); > > + } > > } > > xout->fail_open = ctx.rule && rule_dpif_is_fail_open(ctx.rule); > > > > diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c > > index 744850c..a4f10e4 100644 > > --- a/ofproto/ofproto-dpif.c > > +++ b/ofproto/ofproto-dpif.c > > @@ -4703,7 +4703,6 @@ ofproto_trace(struct ofproto_dpif *ofproto, struct > > flow *flow, > > const struct ofpact ofpacts[], size_t ofpacts_len, > > struct ds *ds) > > { > > - struct rule_dpif *rule; > > struct trace_ctx trace; > > > > ds_put_format(ds, "Bridge: %s\n", ofproto->up.name); > > @@ -4712,65 +4711,45 @@ ofproto_trace(struct ofproto_dpif *ofproto, struct > > flow *flow, > > ds_put_char(ds, '\n'); > > > > flow_wildcards_init_catchall(&trace.wc); > > - if (ofpacts) { > > - rule = NULL; > > - } else { > > - rule_dpif_lookup(ofproto, flow, &trace.wc, &rule, false, NULL); > > - > > - trace_format_rule(ds, 0, rule); > > - if (rule == ofproto->miss_rule) { > > - ds_put_cstr(ds, "\nNo match, flow generates \"packet > > in\"s.\n"); > > - } else if (rule == ofproto->no_packet_in_rule) { > > - ds_put_cstr(ds, "\nNo match, packets dropped because " > > - "OFPPC_NO_PACKET_IN is set on in_port.\n"); > > - } else if (rule == ofproto->drop_frags_rule) { > > - ds_put_cstr(ds, "\nPackets dropped because they are IP > > fragments " > > - "and the fragment handling mode is \"drop\".\n"); > > - } > > - } > > > > - if (rule || ofpacts) { > > - trace.result = ds; > > - trace.key = flow; /* Original flow key, used for megaflow. */ > > - trace.flow = *flow; /* May be modified by actions. */ > > - xlate_in_init(&trace.xin, ofproto, flow, flow->in_port.ofp_port, > > rule, > > - ntohs(flow->tcp_flags), packet); > > - if (ofpacts) { > > - trace.xin.ofpacts = ofpacts; > > - trace.xin.ofpacts_len = ofpacts_len; > > - } > > - trace.xin.resubmit_hook = trace_resubmit; > > - trace.xin.report_hook = trace_report; > > + trace.result = ds; > > + trace.key = flow; /* Original flow key, used for megaflow. */ > > + trace.flow = *flow; /* May be modified by actions. */ > > + xlate_in_init(&trace.xin, ofproto, flow, flow->in_port.ofp_port, NULL, > > + ntohs(flow->tcp_flags), packet); > > + trace.xin.ofpacts = ofpacts; > > + trace.xin.ofpacts_len = ofpacts_len; > > + trace.xin.resubmit_hook = trace_resubmit; > > + trace.xin.report_hook = trace_report; > > > > - xlate_actions(&trace.xin, &trace.xout); > > + xlate_actions(&trace.xin, &trace.xout); > > > > - ds_put_char(ds, '\n'); > > - trace_format_flow(ds, 0, "Final flow", &trace); > > - trace_format_megaflow(ds, 0, "Megaflow", &trace); > > + ds_put_char(ds, '\n'); > > + trace_format_flow(ds, 0, "Final flow", &trace); > > + trace_format_megaflow(ds, 0, "Megaflow", &trace); > > > > - ds_put_cstr(ds, "Datapath actions: "); > > - format_odp_actions(ds, ofpbuf_data(trace.xout.odp_actions), > > - ofpbuf_size(trace.xout.odp_actions)); > > + ds_put_cstr(ds, "Datapath actions: "); > > + format_odp_actions(ds, ofpbuf_data(trace.xout.odp_actions), > > + ofpbuf_size(trace.xout.odp_actions)); > > > > - if (trace.xout.slow) { > > - enum slow_path_reason slow; > > + if (trace.xout.slow) { > > + enum slow_path_reason slow; > > > > - ds_put_cstr(ds, "\nThis flow is handled by the userspace " > > - "slow path because it:"); > > + ds_put_cstr(ds, "\nThis flow is handled by the userspace " > > + "slow path because it:"); > > > > - slow = trace.xout.slow; > > - while (slow) { > > - enum slow_path_reason bit = rightmost_1bit(slow); > > + slow = trace.xout.slow; > > + while (slow) { > > + enum slow_path_reason bit = rightmost_1bit(slow); > > > > - ds_put_format(ds, "\n\t- %s.", > > - slow_path_reason_to_explanation(bit)); > > + ds_put_format(ds, "\n\t- %s.", > > + slow_path_reason_to_explanation(bit)); > > > > - slow &= ~bit; > > - } > > + slow &= ~bit; > > } > > - > > - xlate_out_uninit(&trace.xout); > > } > > + > > + xlate_out_uninit(&trace.xout); > > } > > > > /* Store the current ofprotos in 'ofproto_shash'. Returns a sorted list > > -- > > 1.7.10.4 > > > > _______________________________________________ > > dev mailing list > > dev@openvswitch.org > > http://openvswitch.org/mailman/listinfo/dev > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev