X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ofproto%2Fofproto.c;h=201488de47a8b4500cc9a491dfe7a2a2c6ef501d;hb=8a3d2fef9775498320ca7ea014dbdc4cbb14bbb2;hp=ff5cb0149ee43db7b3a45858bb01590868bf3438;hpb=7ee20df120d4d56df894abc00a60fe1bc43a058d;p=openvswitch diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index ff5cb014..201488de 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -33,13 +33,13 @@ #include "ofp-print.h" #include "ofp-util.h" #include "ofpbuf.h" +#include "ofproto-provider.h" #include "openflow/nicira-ext.h" #include "openflow/openflow.h" #include "packets.h" #include "pinsched.h" #include "pktbuf.h" #include "poll-loop.h" -#include "private.h" #include "shash.h" #include "sset.h" #include "timeval.h" @@ -845,16 +845,7 @@ ofproto_get_ofproto_controller_info(const struct ofproto *ofproto, void ofproto_free_ofproto_controller_info(struct shash *info) { - struct shash_node *node; - - SHASH_FOR_EACH (node, info) { - struct ofproto_controller_info *cinfo = node->data; - while (cinfo->pairs.n) { - free((char *) cinfo->pairs.values[--cinfo->pairs.n]); - } - free(cinfo); - } - shash_destroy(info); + connmgr_free_controller_info(info); } /* Makes a deep copy of 'old' into 'port'. */ @@ -1378,8 +1369,8 @@ ofproto_rule_destroy__(struct rule *rule) /* This function allows an ofproto implementation to destroy any rules that * remain when its ->destruct() function is called. The caller must have * already uninitialized any derived members of 'rule' (step 5 described in the - * large comment in ofproto/private.h titled "Life Cycle"). This function - * implements steps 6 and 7. + * large comment in ofproto/ofproto-provider.h titled "Life Cycle"). + * This function implements steps 6 and 7. * * This function should only be called from an ofproto implementation's * ->destruct() function. It is not suitable elsewhere. */ @@ -1398,13 +1389,12 @@ static bool rule_has_out_port(const struct rule *rule, uint16_t out_port) { const union ofp_action *oa; - struct actions_iterator i; + size_t left; if (out_port == OFPP_NONE) { return true; } - for (oa = actions_first(&i, rule->actions, rule->n_actions); oa; - oa = actions_next(&i)) { + OFPUTIL_ACTION_FOR_EACH_UNSAFE (oa, left, rule->actions, rule->n_actions) { if (action_outputs_to_port(oa, htons(out_port))) { return true; } @@ -1921,7 +1911,6 @@ static void flow_stats_ds(struct rule *rule, struct ds *results) { uint64_t packet_count, byte_count; - size_t act_len = sizeof *rule->actions * rule->n_actions; rule->ofproto->ofproto_class->rule_get_stats(rule, &packet_count, &byte_count); @@ -1936,8 +1925,8 @@ flow_stats_ds(struct rule *rule, struct ds *results) ds_put_format(results, "n_bytes=%"PRIu64", ", byte_count); cls_rule_format(&rule->cr, results); ds_put_char(results, ','); - if (act_len > 0) { - ofp_print_actions(results, &rule->actions->header, act_len); + if (rule->n_actions > 0) { + ofp_print_actions(results, rule->actions, rule->n_actions); } else { ds_put_cstr(results, "drop"); } @@ -1990,6 +1979,7 @@ handle_aggregate_stats_request(struct ofconn *ofconn, struct ofproto *ofproto = ofconn_get_ofproto(ofconn); struct flow_stats_request request; struct ofputil_aggregate_stats stats; + bool unknown_packets, unknown_bytes; struct ofpbuf *reply; struct list rules; struct rule *rule; @@ -2007,6 +1997,7 @@ handle_aggregate_stats_request(struct ofconn *ofconn, } memset(&stats, 0, sizeof stats); + unknown_packets = unknown_bytes = false; LIST_FOR_EACH (rule, ofproto_node, &rules) { uint64_t packet_count; uint64_t byte_count; @@ -2014,10 +2005,26 @@ handle_aggregate_stats_request(struct ofconn *ofconn, ofproto->ofproto_class->rule_get_stats(rule, &packet_count, &byte_count); - stats.packet_count += packet_count; - stats.byte_count += byte_count; + if (packet_count == UINT64_MAX) { + unknown_packets = true; + } else { + stats.packet_count += packet_count; + } + + if (byte_count == UINT64_MAX) { + unknown_bytes = true; + } else { + stats.byte_count += byte_count; + } + stats.flow_count++; } + if (unknown_packets) { + stats.packet_count = UINT64_MAX; + } + if (unknown_bytes) { + stats.byte_count = UINT64_MAX; + } reply = ofputil_encode_aggregate_stats_reply(&stats, osm); ofconn_send_reply(ofconn, reply); @@ -2621,7 +2628,7 @@ handle_openflow__(struct ofconn *ofconn, const struct ofpbuf *msg) case OFPUTIL_OFPST_QUEUE_REQUEST: return handle_queue_stats_request(ofconn, msg->data); - case OFPUTIL_INVALID: + case OFPUTIL_MSG_INVALID: case OFPUTIL_OFPT_HELLO: case OFPUTIL_OFPT_ERROR: case OFPUTIL_OFPT_FEATURES_REPLY: @@ -2793,8 +2800,8 @@ ofoperation_destroy(struct ofoperation *op) * If 'op' is a "delete flow" operation, 'error' must be 0. That is, flow * deletions are not allowed to fail. * - * Please see the large comment in ofproto/private.h titled "Asynchronous - * Operation Support" for more information. */ + * Please see the large comment in ofproto/ofproto-provider.h titled + * "Asynchronous Operation Support" for more information. */ void ofoperation_complete(struct ofoperation *op, int error) {