assert(!rule->cr.wc.wildcards);
super = rule->super ? rule->super : rule;
- rule->tags = 0;
xlate_actions(super->actions, super->n_actions, &rule->cr.flow, p,
packet, &a, &rule->tags, &rule->may_install,
&rule->nf_flow.output_iface);
/* Output. */
struct odp_actions *out; /* Datapath actions. */
- tag_type *tags; /* Tags associated with OFPP_NORMAL actions. */
+ tag_type tags; /* Tags associated with OFPP_NORMAL actions. */
bool may_set_up_flow; /* True ordinarily; false if the actions must
* be reassessed for every packet. */
uint16_t nf_output_iface; /* Output interface index for NetFlow. */
break;
case OFPP_NORMAL:
if (!ctx->ofproto->ofhooks->normal_cb(&ctx->flow, ctx->packet,
- ctx->out, ctx->tags,
+ ctx->out, &ctx->tags,
&ctx->nf_output_iface,
ctx->ofproto->aux)) {
COVERAGE_INC(ofproto_uninstallable);
struct odp_actions *out, tag_type *tags, bool *may_set_up_flow,
uint16_t *nf_output_iface)
{
- tag_type no_tags = 0;
struct action_xlate_ctx ctx;
+
COVERAGE_INC(ofproto_ofp2odp);
odp_actions_init(out);
ctx.flow = *flow;
ctx.ofproto = ofproto;
ctx.packet = packet;
ctx.out = out;
- ctx.tags = tags ? tags : &no_tags;
+ ctx.tags = 0;
ctx.may_set_up_flow = true;
ctx.nf_output_iface = NF_OUT_DROP;
do_xlate_actions(in, n_in, &ctx);
ctx.may_set_up_flow = false;
}
+ if (tags) {
+ *tags = ctx.tags;
+ }
if (may_set_up_flow) {
*may_set_up_flow = ctx.may_set_up_flow;
}