Thanks, I'm happy with this.

On Wed, Jan 11, 2012 at 11:27:00AM -0800, Ethan Jackson wrote:
> I agree this is a bit subtle.  Here's an updated version of the patch.
> 
> ---
> A "packet out" ordinarily isn't accounted to any OpenFlow rule,
> because its actions come directly from the controller instead of
> from an OpenFlow rule.  However, any "resubmit" actions or output
> to OFPP_TABLE within the set of actions do bring in actions from a
> rule, and the "packet out" should be accounted to the rule in that
> case.  This commit implements that behavior.
> 
> Reported-by: Jesse Gross <je...@nicira.com>
> Signed-off-by: Ethan Jackson <et...@nicira.com>
> ---
>  ofproto/ofproto-dpif.c |   15 ++++++++++++---
>  1 files changed, 12 insertions(+), 3 deletions(-)
> 
> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
> index f5280ff..e206f43 100644
> --- a/ofproto/ofproto-dpif.c
> +++ b/ofproto/ofproto-dpif.c
> @@ -5534,15 +5534,24 @@ packet_out(struct ofproto *ofproto_, struct ofpbuf 
> *packet,
>                               ofproto->max_ports);
>      if (!error) {
>          struct odputil_keybuf keybuf;
> -        struct action_xlate_ctx ctx;
>          struct ofpbuf *odp_actions;
> +        struct ofproto_push push;
>          struct ofpbuf key;
>  
>          ofpbuf_use_stack(&key, &keybuf, sizeof keybuf);
>          odp_flow_key_from_flow(&key, flow);
>  
> -        action_xlate_ctx_init(&ctx, ofproto, flow, flow->vlan_tci, 0, 
> packet);
> -        odp_actions = xlate_actions(&ctx, ofp_actions, n_ofp_actions);
> +        action_xlate_ctx_init(&push.ctx, ofproto, flow, flow->vlan_tci, 0,
> +                              packet);
> +
> +        /* Ensure that resubmits in 'ofp_actions' get accounted to their
> +         * matching rules. */
> +        push.packets = 1;
> +        push.bytes = packet->size;
> +        push.used = time_msec();
> +        push.ctx.resubmit_hook = push_resubmit;
> +
> +        odp_actions = xlate_actions(&push.ctx, ofp_actions, n_ofp_actions);
>          dpif_execute(ofproto->dpif, key.data, key.size,
>                       odp_actions->data, odp_actions->size, packet);
>          ofpbuf_delete(odp_actions);
> -- 
> 1.7.7.1
> 
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to