From 2284188b69fc8d935ae1ecf9d1b939e3efbbe10b Mon Sep 17 00:00:00 2001 From: Ethan Jackson Date: Tue, 10 Jan 2012 19:01:04 -0800 Subject: [PATCH] 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 --- ofproto/ofproto-dpif.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) 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); -- 2.43.0