Thanks. I applied the series up to this point to master.
On Fri, Jul 31, 2015 at 01:46:58PM -0700, Jarno Rajahalme wrote: > Acked-by: Jarno Rajahalme <jrajaha...@nicira.com> > > > On Jul 29, 2015, at 11:42 PM, Ben Pfaff <b...@nicira.com> wrote: > > > > This moves the calculation of 'ofpacts' closer to its actual use, which > > in my opinion makes the code easier to read. > > > > This commit also expands the circumstances in which OVS omits sending > > NetFlow records from those where there is exactly one OpenFlow action that > > sends to controller, to those where any OpenFlow action sends to > > controller. I doubt that this is a big deal. > > > > Signed-off-by: Ben Pfaff <b...@nicira.com> > > --- > > ofproto/ofproto-dpif-xlate.c | 68 > > ++++++++++++++++++++------------------------ > > 1 file changed, 31 insertions(+), 37 deletions(-) > > > > diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c > > index eb1e17a..e39e46f 100644 > > --- a/ofproto/ofproto-dpif-xlate.c > > +++ b/ofproto/ofproto-dpif-xlate.c > > @@ -4781,10 +4781,8 @@ xlate_actions(struct xlate_in *xin, struct xlate_out > > *xout) > > ofpbuf_reserve(ctx.odp_actions, NL_A_U32_SIZE); > > > > enum slow_path_reason special; > > - const struct ofpact *ofpacts; > > struct xport *in_port; > > struct flow orig_flow; > > - size_t ofpacts_len; > > bool tnl_may_send; > > bool is_icmp; > > > > @@ -4932,20 +4930,6 @@ xlate_actions(struct xlate_in *xin, struct xlate_out > > *xout) > > } > > xout->fail_open = ctx.rule && rule_dpif_is_fail_open(ctx.rule); > > > > - if (xin->ofpacts) { > > - ofpacts = xin->ofpacts; > > - ofpacts_len = xin->ofpacts_len; > > - } else if (ctx.rule) { > > - const struct rule_actions *actions = > > rule_dpif_get_actions(ctx.rule); > > - > > - ofpacts = actions->ofpacts; > > - ofpacts_len = actions->ofpacts_len; > > - > > - ctx.rule_cookie = rule_dpif_get_flow_cookie(ctx.rule); > > - } else { > > - OVS_NOT_REACHED(); > > - } > > - > > if (mbridge_has_mirrors(xbridge->mbridge)) { > > /* Do this conditionally because the copy is expensive enough that > > it > > * shows up in profiles. */ > > @@ -4994,6 +4978,22 @@ xlate_actions(struct xlate_in *xin, struct xlate_out > > *xout) > > } > > > > if (tnl_may_send && (!in_port || may_receive(in_port, &ctx))) { > > + const struct ofpact *ofpacts; > > + size_t ofpacts_len; > > + > > + if (xin->ofpacts) { > > + ofpacts = xin->ofpacts; > > + ofpacts_len = xin->ofpacts_len; > > + } else if (ctx.rule) { > > + const struct rule_actions *actions > > + = rule_dpif_get_actions(ctx.rule); > > + ofpacts = actions->ofpacts; > > + ofpacts_len = actions->ofpacts_len; > > + ctx.rule_cookie = rule_dpif_get_flow_cookie(ctx.rule); > > + } else { > > + OVS_NOT_REACHED(); > > + } > > + > > do_xlate_actions(ofpacts, ofpacts_len, &ctx); > > > > /* We've let OFPP_NORMAL and the learning action look at the > > @@ -5068,28 +5068,22 @@ xlate_actions(struct xlate_in *xin, struct > > xlate_out *xout) > > } > > } > > > > - /* Do netflow only for packets really received by the bridge. */ > > - if (!xin->recirc && xbridge->netflow) { > > - /* Only update netflow if we don't have controller flow. We don't > > - * report NetFlow expiration messages for such facets because they > > - * are just part of the control logic for the network, not real > > - * traffic. */ > > - if (ofpacts_len == 0 > > - || ofpacts->type != OFPACT_CONTROLLER > > - || ofpact_next(ofpacts) < ofpact_end(ofpacts, ofpacts_len)) { > > - if (ctx.xin->resubmit_stats) { > > - netflow_flow_update(xbridge->netflow, flow, > > - xout->nf_output_iface, > > - ctx.xin->resubmit_stats); > > - } > > - if (ctx.xin->xcache) { > > - struct xc_entry *entry; > > + /* Do netflow only for packets really received by the bridge and not > > sent > > + * to the controller. We consider packets sent to the controller to be > > + * part of the control plane rather than the data plane. */ > > + if (!xin->recirc && xbridge->netflow && !(xout->slow & > > SLOW_CONTROLLER)) { > > + if (ctx.xin->resubmit_stats) { > > + netflow_flow_update(xbridge->netflow, flow, > > + xout->nf_output_iface, > > + ctx.xin->resubmit_stats); > > + } > > + if (ctx.xin->xcache) { > > + struct xc_entry *entry; > > > > - entry = xlate_cache_add_entry(ctx.xin->xcache, XC_NETFLOW); > > - entry->u.nf.netflow = netflow_ref(xbridge->netflow); > > - entry->u.nf.flow = xmemdup(flow, sizeof *flow); > > - entry->u.nf.iface = xout->nf_output_iface; > > - } > > + entry = xlate_cache_add_entry(ctx.xin->xcache, XC_NETFLOW); > > + entry->u.nf.netflow = netflow_ref(xbridge->netflow); > > + entry->u.nf.flow = xmemdup(flow, sizeof *flow); > > + entry->u.nf.iface = xout->nf_output_iface; > > } > > } > > > > -- > > 2.1.3 > > > > _______________________________________________ > > dev mailing list > > dev@openvswitch.org > > http://openvswitch.org/mailman/listinfo/dev > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev