ovs-dpctl: Show number of flows
authorSimon Horman <horms@verge.net.au>
Wed, 3 Aug 2011 23:04:10 +0000 (08:04 +0900)
committerJesse Gross <jesse@nicira.com>
Thu, 4 Aug 2011 04:38:03 +0000 (21:38 -0700)
Expose the number of flows present in a datapath to user-space
and to users via ovs-dpctl show.

e.g.:

ovs-dpctl show br3
system@br3:
lookups: frags:0, hit:0, missed:0, lost:0
flows: 0
...

Signed-off-by: Simon Horman <horms@verge.net.au>
[Jesse: Add same logic to userspace datapath.]
Signed-off-by: Jesse Gross <jesse@nicira.com>
datapath/datapath.c
include/openvswitch/datapath-protocol.h
lib/dpif-netdev.c
utilities/ovs-dpctl.c

index 3ec5be4..b191239 100644 (file)
@@ -747,6 +747,9 @@ static struct genl_ops dp_packet_genl_ops[] = {
 static void get_dp_stats(struct datapath *dp, struct odp_stats *stats)
 {
        int i;
+       struct tbl *table = get_table_protected(dp);
+
+       stats->n_flows = tbl_count(table);
 
        stats->n_frags = stats->n_hit = stats->n_missed = stats->n_lost = 0;
        for_each_possible_cpu(i) {
index 0b755e8..426236c 100644 (file)
@@ -133,6 +133,7 @@ struct odp_stats {
     uint64_t n_hit;             /* Number of flow table matches. */
     uint64_t n_missed;          /* Number of flow table misses. */
     uint64_t n_lost;            /* Number of misses not sent to userspace. */
+    uint64_t n_flows;           /* Number of flows present */
 };
 
 /* Logical ports. */
index d48d7ae..14b9192 100644 (file)
@@ -302,6 +302,7 @@ dpif_netdev_get_stats(const struct dpif *dpif, struct odp_stats *stats)
 {
     struct dp_netdev *dp = get_dp_netdev(dpif);
     memset(stats, 0, sizeof *stats);
+    stats->n_flows = hmap_count(&dp->flow_table);
     stats->n_frags = dp->n_frags;
     stats->n_hit = dp->n_hit;
     stats->n_missed = dp->n_missed;
index c7350e5..415d276 100644 (file)
@@ -369,6 +369,7 @@ show_dpif(struct dpif *dpif)
                (unsigned long long int) stats.n_hit,
                (unsigned long long int) stats.n_missed,
                (unsigned long long int) stats.n_lost);
+        printf("\tflows: %llu\n", (unsigned long long int)stats.n_flows);
     }
     DPIF_PORT_FOR_EACH (&dpif_port, &dump, dpif) {
         printf("\tport %u: %s", dpif_port.port_no, dpif_port.name);