Currently, with 'ovs-dpctl show', we call show_dpif(). Move this functionality to lib/dpif.c so that it can be used by an upcoming commit.
Signed-off-by: Gurucharan Shetty <gshe...@nicira.com> --- lib/dpif.c | 136 +++++++++++++++++++++++++++++++++++++++++++++++ lib/dpif.h | 1 + utilities/ovs-dpctl.c | 141 +++---------------------------------------------- 3 files changed, 145 insertions(+), 133 deletions(-) diff --git a/lib/dpif.c b/lib/dpif.c index b284e13..6275570 100644 --- a/lib/dpif.c +++ b/lib/dpif.c @@ -37,6 +37,7 @@ #include "packets.h" #include "poll-loop.h" #include "shash.h" +#include "smap.h" #include "sset.h" #include "timeval.h" #include "util.h" @@ -474,6 +475,141 @@ dpif_get_dp_stats(const struct dpif *dpif, struct dpif_dp_stats *stats) return error; } +static void +print_stat(struct ds *ds, const char *leader, uint64_t value) +{ + ds_put_cstr(ds, leader); + if (value != UINT64_MAX) { + ds_put_format(ds, "%"PRIu64, value); + } else { + ds_put_cstr(ds, "?"); + } +} + +static void +print_human_size(struct ds *ds, uint64_t value) +{ + if (value == UINT64_MAX) { + /* Nothing to do. */ + } else if (value >= 1024ULL * 1024 * 1024 * 1024) { + ds_put_format(ds, " (%.1f TiB)", + value / (1024.0 * 1024 * 1024 * 1024)); + } else if (value >= 1024ULL * 1024 * 1024) { + ds_put_format(ds, " (%.1f GiB)", value / (1024.0 * 1024 * 1024)); + } else if (value >= 1024ULL * 1024) { + ds_put_format(ds, " (%.1f MiB)", value / (1024.0 * 1024)); + } else if (value >= 1024) { + ds_put_format(ds, " (%.1f KiB)", value / 1024.0); + } +} + +void +dpif_show(struct dpif *dpif, struct ds *ds, bool print_statistics) +{ + struct dpif_port_dump dump; + struct dpif_port dpif_port; + struct dpif_dp_stats stats; + struct netdev *netdev; + + ds_put_format(ds, "%s:\n", dpif_name(dpif)); + if (!dpif_get_dp_stats(dpif, &stats)) { + ds_put_format(ds, "\tlookups: hit:%"PRIu64" missed:%"PRIu64"" + " lost:%"PRIu64"\n\tflows: %"PRIu64"\n", + stats.n_hit, stats.n_missed, stats.n_lost, + stats.n_flows); + if (stats.n_masks != UINT64_MAX) { + uint64_t n_pkts = stats.n_hit + stats.n_missed; + double avg = n_pkts ? (double) stats.n_mask_hit / n_pkts : 0.0; + + ds_put_format(ds, "\tmasks: hit:%"PRIu64" total:%"PRIu64" " + "hit/pkt:%.2f\n", + stats.n_mask_hit, stats.n_masks, avg); + } + } + + DPIF_PORT_FOR_EACH (&dpif_port, &dump, dpif) { + ds_put_format(ds, "\tport %u: %s", dpif_port.port_no, dpif_port.name); + + if (strcmp(dpif_port.type, "system")) { + int error; + + ds_put_format(ds, " (%s", dpif_port.type); + + error = netdev_open(dpif_port.name, dpif_port.type, &netdev); + if (!error) { + struct smap config; + + smap_init(&config); + error = netdev_get_config(netdev, &config); + if (!error) { + const struct smap_node **nodes; + size_t i; + + nodes = smap_sort(&config); + for (i = 0; i < smap_count(&config); i++) { + const struct smap_node *node = nodes[i]; + ds_put_format(ds, "%c %s=%s", i ? ',' : ':', + node->key, node->value); + } + free(nodes); + } else { + ds_put_format(ds, ", could not retrieve configuration" + " (%s)", ovs_strerror(error)); + } + smap_destroy(&config); + + netdev_close(netdev); + } else { + ds_put_format(ds, ": open failed (%s)", ovs_strerror(error)); + } + ds_put_cstr(ds, ")"); + } + ds_put_cstr(ds, "\n"); + + if (print_statistics) { + struct netdev_stats s; + int error; + + error = netdev_open(dpif_port.name, dpif_port.type, &netdev); + if (error) { + ds_put_format(ds, ", open failed (%s)", ovs_strerror(error)); + continue; + } + error = netdev_get_stats(netdev, &s); + if (error) { + ds_put_format(ds, ", could not retrieve stats (%s)", + ovs_strerror(error)); + continue; + } + + netdev_close(netdev); + print_stat(ds, "\t\tRX packets:", s.rx_packets); + print_stat(ds, " errors:", s.rx_errors); + print_stat(ds, " dropped:", s.rx_dropped); + print_stat(ds, " overruns:", s.rx_over_errors); + print_stat(ds, " frame:", s.rx_frame_errors); + ds_put_cstr(ds, "\n"); + + print_stat(ds, "\t\tTX packets:", s.tx_packets); + print_stat(ds, " errors:", s.tx_errors); + print_stat(ds, " dropped:", s.tx_dropped); + print_stat(ds, " aborted:", s.tx_aborted_errors); + print_stat(ds, " carrier:", s.tx_carrier_errors); + ds_put_cstr(ds, "\n"); + + print_stat(ds, "\t\tcollisions:", s.collisions); + ds_put_cstr(ds, "\n"); + + print_stat(ds, "\t\tRX bytes:", s.rx_bytes); + print_human_size(ds, s.rx_bytes); + print_stat(ds, " TX bytes:", s.tx_bytes); + print_human_size(ds, s.tx_bytes); + ds_put_cstr(ds, "\n"); + } + } + dpif_close(dpif); +} + const char * dpif_port_open_type(const char *datapath_type, const char *port_type) { diff --git a/lib/dpif.h b/lib/dpif.h index de7450a..1bbc0d7 100644 --- a/lib/dpif.h +++ b/lib/dpif.h @@ -396,6 +396,7 @@ int dpif_get_dp_stats(const struct dpif *, struct dpif_dp_stats *); /* Port operations. */ +void dpif_show(struct dpif *, struct ds *, bool print_statistics); const char *dpif_port_open_type(const char *datapath_type, const char *port_type); int dpif_port_add(struct dpif *, struct netdev *, odp_port_t *port_nop); diff --git a/utilities/ovs-dpctl.c b/utilities/ovs-dpctl.c index 78475e7..526a158 100644 --- a/utilities/ovs-dpctl.c +++ b/utilities/ovs-dpctl.c @@ -524,140 +524,12 @@ dpctl_del_if(int argc OVS_UNUSED, char *argv[]) } static void -print_stat(const char *leader, uint64_t value) -{ - fputs(leader, stdout); - if (value != UINT64_MAX) { - printf("%"PRIu64, value); - } else { - putchar('?'); - } -} - -static void -print_human_size(uint64_t value) -{ - if (value == UINT64_MAX) { - /* Nothing to do. */ - } else if (value >= 1024ULL * 1024 * 1024 * 1024) { - printf(" (%.1f TiB)", value / (1024.0 * 1024 * 1024 * 1024)); - } else if (value >= 1024ULL * 1024 * 1024) { - printf(" (%.1f GiB)", value / (1024.0 * 1024 * 1024)); - } else if (value >= 1024ULL * 1024) { - printf(" (%.1f MiB)", value / (1024.0 * 1024)); - } else if (value >= 1024) { - printf(" (%.1f KiB)", value / 1024.0); - } -} - -static void -show_dpif(struct dpif *dpif) -{ - struct dpif_port_dump dump; - struct dpif_port dpif_port; - struct dpif_dp_stats stats; - struct netdev *netdev; - - printf("%s:\n", dpif_name(dpif)); - if (!dpif_get_dp_stats(dpif, &stats)) { - printf("\tlookups: hit:%"PRIu64" missed:%"PRIu64" lost:%"PRIu64"\n" - "\tflows: %"PRIu64"\n", - stats.n_hit, stats.n_missed, stats.n_lost, stats.n_flows); - if (stats.n_masks != UINT64_MAX) { - uint64_t n_pkts = stats.n_hit + stats.n_missed; - double avg = n_pkts ? (double) stats.n_mask_hit / n_pkts : 0.0; - - printf("\tmasks: hit:%"PRIu64" total:%"PRIu64" hit/pkt:%.2f\n", - stats.n_mask_hit, stats.n_masks, avg); - } - } - - DPIF_PORT_FOR_EACH (&dpif_port, &dump, dpif) { - printf("\tport %u: %s", dpif_port.port_no, dpif_port.name); - - if (strcmp(dpif_port.type, "system")) { - int error; - - printf (" (%s", dpif_port.type); - - error = netdev_open(dpif_port.name, dpif_port.type, &netdev); - if (!error) { - struct smap config; - - smap_init(&config); - error = netdev_get_config(netdev, &config); - if (!error) { - const struct smap_node **nodes; - size_t i; - - nodes = smap_sort(&config); - for (i = 0; i < smap_count(&config); i++) { - const struct smap_node *node = nodes[i]; - printf("%c %s=%s", i ? ',' : ':', node->key, - node->value); - } - free(nodes); - } else { - printf(", could not retrieve configuration (%s)", - ovs_strerror(error)); - } - smap_destroy(&config); - - netdev_close(netdev); - } else { - printf(": open failed (%s)", ovs_strerror(error)); - } - putchar(')'); - } - putchar('\n'); - - if (print_statistics) { - struct netdev_stats s; - int error; - - error = netdev_open(dpif_port.name, dpif_port.type, &netdev); - if (error) { - printf(", open failed (%s)", ovs_strerror(error)); - continue; - } - error = netdev_get_stats(netdev, &s); - if (error) { - printf(", could not retrieve stats (%s)", ovs_strerror(error)); - continue; - } - - netdev_close(netdev); - print_stat("\t\tRX packets:", s.rx_packets); - print_stat(" errors:", s.rx_errors); - print_stat(" dropped:", s.rx_dropped); - print_stat(" overruns:", s.rx_over_errors); - print_stat(" frame:", s.rx_frame_errors); - printf("\n"); - - print_stat("\t\tTX packets:", s.tx_packets); - print_stat(" errors:", s.tx_errors); - print_stat(" dropped:", s.tx_dropped); - print_stat(" aborted:", s.tx_aborted_errors); - print_stat(" carrier:", s.tx_carrier_errors); - printf("\n"); - - print_stat("\t\tcollisions:", s.collisions); - printf("\n"); - - print_stat("\t\tRX bytes:", s.rx_bytes); - print_human_size(s.rx_bytes); - print_stat(" TX bytes:", s.tx_bytes); - print_human_size(s.tx_bytes); - printf("\n"); - } - } - dpif_close(dpif); -} - -static void dpctl_show(int argc, char *argv[]) { bool failure = false; + struct ds ds; + + ds_init(&ds); if (argc > 1) { int i; for (i = 1; i < argc; i++) { @@ -667,7 +539,8 @@ dpctl_show(int argc, char *argv[]) error = parsed_dpif_open(name, false, &dpif); if (!error) { - show_dpif(dpif); + dpif_show(dpif, &ds, print_statistics); + printf("%s\n", ds_cstr(&ds)); } else { ovs_error(error, "opening datapath %s failed", name); failure = true; @@ -694,7 +567,8 @@ dpctl_show(int argc, char *argv[]) error = dpif_open(name, type, &dpif); if (!error) { - show_dpif(dpif); + dpif_show(dpif, &ds, print_statistics); + printf("%s\n", ds_cstr(&ds)); } else { ovs_error(error, "opening datapath %s failed", name); failure = true; @@ -704,6 +578,7 @@ dpctl_show(int argc, char *argv[]) } sset_destroy(&types); } + ds_destroy(&ds); if (failure) { exit(EXIT_FAILURE); } -- 1.7.9.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev