X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=ofproto%2Fofproto.c;h=fcc76d6cbfee19f9b75d6e1d30f9fccdd3e9ea7d;hb=c69af19fe8f20b5a3333e54310b1592bc3f6dfd0;hp=4d4965dda0c2803aaaff98e8c84f2c71e158f7bb;hpb=5a719c38c219b46a3f9c263ceae268a70071c03c;p=openvswitch diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index 4d4965dd..fcc76d6c 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -760,6 +760,8 @@ ofproto_destroy(struct ofproto *p) free(p->serial_desc); free(p->dp_desc); + port_array_destroy(&p->ports); + free(p); } @@ -806,8 +808,8 @@ ofproto_run1(struct ofproto *p) /* Someone destroyed the datapath behind our back. The caller * better destroy us and give up, because we're just going to * spin from here on out. */ - static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); - VLOG_ERR_RL(&rl, "%s: datapath was destroyed externally", + static struct vlog_rate_limit rl2 = VLOG_RATE_LIMIT_INIT(1, 5); + VLOG_ERR_RL(&rl2, "%s: datapath was destroyed externally", dpif_name(p->dpif)); return ENODEV; } @@ -2211,6 +2213,7 @@ do_xlate_actions(const union ofp_action *in, size_t n_in, case OFPAT_SET_NW_DST: oa = odp_actions_add(ctx->out, ODPAT_SET_NW_DST); oa->nw_addr.nw_addr = ia->nw_addr.nw_addr; + break; case OFPAT_SET_NW_TOS: oa = odp_actions_add(ctx->out, ODPAT_SET_NW_TOS); @@ -2556,6 +2559,9 @@ struct flow_stats_cbdata { struct ofpbuf *msg; }; +/* Obtains statistic counters for 'rule' within 'p' and stores them into + * '*packet_countp' and '*byte_countp'. If 'rule' is a wildcarded rule, the + * returned statistic include statistics for all of 'rule''s subrules. */ static void query_stats(struct ofproto *p, struct rule *rule, uint64_t *packet_countp, uint64_t *byte_countp) @@ -2565,9 +2571,19 @@ query_stats(struct ofproto *p, struct rule *rule, struct odp_flow *odp_flows; size_t n_odp_flows; + /* Start from historical data for 'rule' itself that are no longer tracked + * by the datapath. This counts, for example, subrules that have + * expired. */ packet_count = rule->packet_count; byte_count = rule->byte_count; + /* Prepare to ask the datapath for statistics on 'rule', or if it is + * wildcarded then on all of its subrules. + * + * Also, add any statistics that are not tracked by the datapath for each + * subrule. This includes, for example, statistics for packets that were + * executed "by hand" by ofproto via dpif_execute() but must be accounted + * to a flow. */ n_odp_flows = rule->cr.wc.wildcards ? list_size(&rule->list) : 1; odp_flows = xzalloc(n_odp_flows * sizeof *odp_flows); if (rule->cr.wc.wildcards) { @@ -2581,8 +2597,7 @@ query_stats(struct ofproto *p, struct rule *rule, odp_flows[0].key = rule->cr.flow; } - packet_count = rule->packet_count; - byte_count = rule->byte_count; + /* Fetch up-to-date statistics from the datapath and add them in. */ if (!dpif_flow_get_multiple(p->dpif, odp_flows, n_odp_flows)) { size_t i; for (i = 0; i < n_odp_flows; i++) { @@ -2593,6 +2608,7 @@ query_stats(struct ofproto *p, struct rule *rule, } free(odp_flows); + /* Return the stats to the caller. */ *packet_countp = packet_count; *byte_countp = byte_count; } @@ -3319,7 +3335,7 @@ compose_flow_removed(const struct rule *rule, long long int now, uint8_t reason) { struct ofp_flow_removed *ofr; struct ofpbuf *buf; - long long int tdiff = time_msec() - rule->created; + long long int tdiff = now - rule->created; uint32_t sec = tdiff / 1000; uint32_t msec = tdiff - (sec * 1000);