X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ofproto%2Fofproto.c;h=08d80d89ae6334ae80b3ffd49388d427ac67fd41;hb=f7cd0081f525dd1d45fafc68397b5393196e978d;hp=a0dca356dc0979c775d613040e08dcc8ae427a32;hpb=ba25b8f41f4db5ed5c91f53b9b83b57f242a82d6;p=openvswitch diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index a0dca356..08d80d89 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -2308,17 +2308,24 @@ facet_make_actions(struct ofproto *p, struct facet *facet, static int facet_put__(struct ofproto *ofproto, struct facet *facet, - enum dpif_flow_put_flags flags) + const struct nlattr *actions, size_t actions_len, + struct dpif_flow_stats *stats) { uint32_t keybuf[ODPUTIL_FLOW_KEY_U32S]; + enum dpif_flow_put_flags flags; struct ofpbuf key; + flags = DPIF_FP_CREATE | DPIF_FP_MODIFY; + if (stats) { + flags |= DPIF_FP_ZERO_STATS; + } + ofpbuf_use_stack(&key, keybuf, sizeof keybuf); odp_flow_key_from_flow(&key, &facet->flow); assert(key.base == keybuf); return dpif_flow_put(ofproto->dpif, flags, key.data, key.size, - facet->actions, facet->actions_len, NULL); + actions, actions_len, stats); } /* If 'facet' is installable, inserts or re-inserts it into 'p''s datapath. If @@ -2327,14 +2334,12 @@ facet_put__(struct ofproto *ofproto, struct facet *facet, static void facet_install(struct ofproto *p, struct facet *facet, bool zero_stats) { - if (facet->may_install) { - enum dpif_flow_put_flags flags = DPIF_FP_CREATE | DPIF_FP_MODIFY; - if (zero_stats) { - flags |= DPIF_FP_ZERO_STATS; - } - if (!facet_put__(p, facet, flags)) { - facet->installed = true; - } + struct dpif_flow_stats stats; + + if (facet->may_install + && !facet_put__(p, facet, facet->actions, facet->actions_len, + zero_stats ? &stats : NULL)) { + facet->installed = true; } } @@ -2499,20 +2504,12 @@ facet_revalidate(struct ofproto *ofproto, struct facet *facet) /* If the ODP actions changed or the installability changed, then we need * to talk to the datapath. */ - if (actions_changed || facet->may_install != facet->installed) { - if (facet->may_install) { - uint32_t keybuf[ODPUTIL_FLOW_KEY_U32S]; + if (actions_changed || ctx.may_set_up_flow != facet->installed) { + if (ctx.may_set_up_flow) { struct dpif_flow_stats stats; - struct ofpbuf key; - - ofpbuf_use_stack(&key, keybuf, sizeof keybuf); - odp_flow_key_from_flow(&key, &facet->flow); - - dpif_flow_put(ofproto->dpif, - DPIF_FP_CREATE | DPIF_FP_MODIFY | DPIF_FP_ZERO_STATS, - key.data, key.size, - odp_actions->data, odp_actions->size, &stats); + facet_put__(ofproto, facet, + odp_actions->data, odp_actions->size, &stats); facet_update_stats(ofproto, facet, &stats); } else { facet_uninstall(ofproto, facet); @@ -3482,7 +3479,7 @@ query_stats(struct ofproto *p, struct rule *rule, ofpbuf_clear(&key); odp_flow_key_from_flow(&key, &facet->flow); - dpif_flow_get(p->dpif, 0, key.data, key.size, NULL, &stats); + dpif_flow_get(p->dpif, key.data, key.size, NULL, &stats); packet_count += stats.n_packets + facet->packet_count; byte_count += stats.n_bytes + facet->byte_count; @@ -4647,36 +4644,18 @@ facet_active_timeout(struct ofproto *ofproto, struct facet *facet) netflow_active_timeout_expired(ofproto->netflow, &facet->nf_flow)) { struct ofexpired expired; - expired.flow = facet->flow; - expired.packet_count = facet->packet_count; - expired.byte_count = facet->byte_count; - expired.used = facet->used; - - /* Get updated flow stats. - * - * XXX We could avoid this call entirely if (1) ofproto_update_used() - * updated TCP flags and (2) the dpif_flow_list_all() in - * ofproto_update_used() zeroed TCP flags. */ if (facet->installed) { - uint32_t keybuf[ODPUTIL_FLOW_KEY_U32S]; struct dpif_flow_stats stats; - struct ofpbuf key; - - ofpbuf_use_stack(&key, keybuf, sizeof keybuf); - odp_flow_key_from_flow(&key, &facet->flow); - - if (!dpif_flow_get(ofproto->dpif, ODPFF_ZERO_TCP_FLAGS, - key.data, key.size, NULL, &stats)) { - expired.packet_count += stats.n_packets; - expired.byte_count += stats.n_bytes; - if (stats.n_packets) { - facet_update_time(ofproto, facet, &stats); - netflow_flow_update_flags(&facet->nf_flow, - stats.tcp_flags); - } - } + + facet_put__(ofproto, facet, facet->actions, facet->actions_len, + &stats); + facet_update_stats(ofproto, facet, &stats); } + expired.flow = facet->flow; + expired.packet_count = facet->packet_count; + expired.byte_count = facet->byte_count; + expired.used = facet->used; netflow_expire(ofproto->netflow, &facet->nf_flow, &expired); } }