Add two new commands, fdb/stats-show and fdb/stats-clear, to ovs-appctl to show and clear the new mac_learning statistics.
$ ovs-appctl fdb/stats-show ovs_pvp_br0 Statistics for bridge "ovs_pvp_br0": Current/maximum MAC entries in the table: 4/2048 Total number of learned MAC entries : 4 Total number of expired MAC entries : 1 Total number of evicted MAC entries : 0 Total number of port moved MAC entries : 32 $ ovs-appctl fdb/stats-clear ovs_pvp_br0 statistics successfully cleared Signed-off-by: Eelco Chaudron <[email protected]> --- lib/mac-learning.c | 2 + lib/mac-learning.h | 1 + ofproto/ofproto-dpif.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) diff --git a/lib/mac-learning.c b/lib/mac-learning.c index c13a5fac8..f6183480d 100644 --- a/lib/mac-learning.c +++ b/lib/mac-learning.c @@ -182,7 +182,7 @@ normalize_idle_time(unsigned int idle_time) } /* Clear all the mac_learning statistics */ -static void +void mac_learning_clear_statistics(struct mac_learning *ml) { if (ml != NULL) { diff --git a/lib/mac-learning.h b/lib/mac-learning.h index 29c4bc448..1f7c42335 100644 --- a/lib/mac-learning.h +++ b/lib/mac-learning.h @@ -189,6 +189,7 @@ int mac_entry_age(const struct mac_learning *ml, const struct mac_entry *e) struct mac_learning *mac_learning_create(unsigned int idle_time); struct mac_learning *mac_learning_ref(const struct mac_learning *); void mac_learning_unref(struct mac_learning *); +void mac_learning_clear_statistics(struct mac_learning *ml); bool mac_learning_run(struct mac_learning *ml) OVS_REQ_WRLOCK(ml->rwlock); void mac_learning_wait(struct mac_learning *ml) diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index ca4582cd5..514d51e6d 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -5247,6 +5247,69 @@ ofproto_unixctl_fdb_show(struct unixctl_conn *conn, int argc OVS_UNUSED, ds_destroy(&ds); } +static void +ofproto_unixctl_fdb_stats_clear(struct unixctl_conn *conn, int argc, + const char *argv[], void *aux OVS_UNUSED) +{ + struct ofproto_dpif *ofproto; + + if (argc > 1) { + ofproto = ofproto_dpif_lookup_by_name(argv[1]); + if (!ofproto) { + unixctl_command_reply_error(conn, "no such bridge"); + return; + } + ovs_rwlock_wrlock(&ofproto->ml->rwlock); + mac_learning_clear_statistics(ofproto->ml); + ovs_rwlock_unlock(&ofproto->ml->rwlock); + } else { + HMAP_FOR_EACH (ofproto, all_ofproto_dpifs_by_name_node, + &all_ofproto_dpifs_by_name) { + ovs_rwlock_wrlock(&ofproto->ml->rwlock); + mac_learning_clear_statistics(ofproto->ml); + ovs_rwlock_unlock(&ofproto->ml->rwlock); + } + } + + unixctl_command_reply(conn, "statistics successfully cleared"); +} + +static void +ofproto_unixctl_fdb_stats_show(struct unixctl_conn *conn, int argc OVS_UNUSED, + const char *argv[], void *aux OVS_UNUSED) +{ + struct ds ds = DS_EMPTY_INITIALIZER; + const struct ofproto_dpif *ofproto; + ofproto = ofproto_dpif_lookup_by_name(argv[1]); + if (!ofproto) { + unixctl_command_reply_error(conn, "no such bridge"); + return; + } + + ds_put_format(&ds, "Statistics for bridge \"%s\":\n", argv[1]); + ovs_rwlock_rdlock(&ofproto->ml->rwlock); + + ds_put_format(&ds, " Current/maximum MAC entries in the table: %" + PRIuSIZE"/%"PRIuSIZE"\n", + hmap_count(&ofproto->ml->table), ofproto->ml->max_entries); + ds_put_format(&ds, + " Total number of learned MAC entries : %"PRIu64"\n", + ofproto->ml->total_learned); + ds_put_format(&ds, + " Total number of expired MAC entries : %"PRIu64"\n", + ofproto->ml->total_expired); + ds_put_format(&ds, + " Total number of evicted MAC entries : %"PRIu64"\n", + ofproto->ml->total_evicted); + ds_put_format(&ds, + " Total number of port moved MAC entries : %"PRIu64"\n", + ofproto->ml->total_moved); + + ovs_rwlock_unlock(&ofproto->ml->rwlock); + unixctl_command_reply(conn, ds_cstr(&ds)); + ds_destroy(&ds); +} + static void ofproto_unixctl_mcast_snooping_show(struct unixctl_conn *conn, int argc OVS_UNUSED, @@ -5737,6 +5800,10 @@ ofproto_unixctl_init(void) ofproto_unixctl_fdb_flush, NULL); unixctl_command_register("fdb/show", "bridge", 1, 1, ofproto_unixctl_fdb_show, NULL); + unixctl_command_register("fdb/stats-clear", "[bridge]", 0, 1, + ofproto_unixctl_fdb_stats_clear, NULL); + unixctl_command_register("fdb/stats-show", "bridge", 1, 1, + ofproto_unixctl_fdb_stats_show, NULL); unixctl_command_register("mdb/flush", "[bridge]", 0, 1, ofproto_unixctl_mcast_snooping_flush, NULL); unixctl_command_register("mdb/show", "bridge", 1, 1, _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
