From: Ethan Jackson Date: Wed, 11 Jan 2012 03:01:04 +0000 (-0800) Subject: ofproto-dpif: Honor statistics in packet_out(). X-Git-Tag: sliver-openvswitch-0.1-1~480 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;ds=sidebyside;h=2284188b69fc8d935ae1ecf9d1b939e3efbbe10b;p=sliver-openvswitch.git ofproto-dpif: Honor statistics in packet_out(). 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 Signed-off-by: Ethan Jackson --- diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index f5280ff28..e206f4316 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);