X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=ofproto%2Fofproto-dpif.c;h=a2217340677f71bf923f5e3979b250c69d9de05d;hb=cdc3ab6537be3a568c943169fdf644fb1d2da7f2;hp=a51b60de4317a62802955978b774073d84372c7c;hpb=462abef297c6f536e3f58de565681bcf124ea107;p=sliver-openvswitch.git diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index a51b60de4..a22173406 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -298,6 +298,21 @@ struct dpif_completion { struct ofoperation *op; }; +/* Reasons that we might need to revalidate every facet, and corresponding + * coverage counters. + * + * A value of 0 means that there is no need to revalidate. + * + * It would be nice to have some cleaner way to integrate with coverage + * counters, but with only a few reasons I guess this is good enough for + * now. */ +enum revalidate_reason { + REV_RECONFIGURE = 1, /* Switch configuration changed. */ + REV_STP, /* Spanning tree protocol port status change. */ + REV_PORT_TOGGLED, /* Port enabled or disabled by CFM, LACP, ...*/ + REV_FLOW_TABLE, /* Flow table changed. */ + REV_INCONSISTENCY /* Facet self-check failed. */ +}; COVERAGE_DEFINE(rev_reconfigure); COVERAGE_DEFINE(rev_stp); COVERAGE_DEFINE(rev_port_toggled); @@ -313,6 +328,58 @@ struct drop_key { size_t key_len; }; +struct avg_subfacet_rates { + double add_rate; /* Moving average of new flows created per minute. */ + double del_rate; /* Moving average of flows deleted per minute. */ +}; + +/* All datapaths of a given type share a single dpif backer instance. */ +struct dpif_backer { + char *type; + int refcount; + struct dpif *dpif; + struct timer next_expiration; + struct hmap odp_to_ofport_map; /* ODP port to ofport mapping. */ + + struct simap tnl_backers; /* Set of dpif ports backing tunnels. */ + + /* Facet revalidation flags applying to facets which use this backer. */ + enum revalidate_reason need_revalidate; /* Revalidate every facet. */ + struct tag_set revalidate_set; /* Revalidate only matching facets. */ + + struct hmap drop_keys; /* Set of dropped odp keys. */ + bool recv_set_enable; /* Enables or disables receiving packets. */ + + struct hmap subfacets; + struct governor *governor; + + /* Subfacet statistics. + * + * These keep track of the total number of subfacets added and deleted and + * flow life span. They are useful for computing the flow rates stats + * exposed via "ovs-appctl dpif/show". The goal is to learn about + * traffic patterns in ways that we can use later to improve Open vSwitch + * performance in new situations. */ + long long int created; /* Time when it is created. */ + unsigned max_n_subfacet; /* Maximum number of flows */ + unsigned avg_n_subfacet; /* Average number of flows. */ + long long int avg_subfacet_life; /* Average life span of subfacets. */ + + /* The average number of subfacets... */ + struct avg_subfacet_rates hourly; /* ...over the last hour. */ + struct avg_subfacet_rates daily; /* ...over the last day. */ + struct avg_subfacet_rates lifetime; /* ...over the switch lifetime. */ + long long int last_minute; /* Last time 'hourly' was updated. */ + + /* Number of subfacets added or deleted since 'last_minute'. */ + unsigned subfacet_add_count; + unsigned subfacet_del_count; + + /* Number of subfacets added or deleted from 'created' to 'last_minute.' */ + unsigned long long int total_subfacet_add_count; + unsigned long long int total_subfacet_del_count; +}; + /* All existing ofproto_backer instances, indexed by ofproto->up.type. */ static struct shash all_dpif_backers = SHASH_INITIALIZER(&all_dpif_backers); @@ -1881,6 +1948,13 @@ stp_process_packet(const struct ofport_dpif *ofport, } } +int +ofproto_dpif_queue_to_priority(const struct ofproto_dpif *ofproto, + uint32_t queue_id, uint32_t *priority) +{ + return dpif_queue_to_priority(ofproto->backer->dpif, queue_id, priority); +} + struct priority_to_dscp * get_priority(const struct ofport_dpif *ofport, uint32_t priority) {