Also, how is this different from ovs-ofctl dump-ports?
On Fri, Apr 29, 2011 at 1:40 PM, Ethan Jackson <[email protected]> wrote: > What tree does this patch series apply too? It references > netdev-linux.h but doesn't include a patch to create it. Should this > be reviewed against next? > > Ethan > > On Thu, Apr 28, 2011 at 13:02, Ben Pfaff <[email protected]> wrote: >> --- >> ChangeLog | 2 + >> lib/dpif-linux.c | 12 +++++++++ >> lib/dpif.c | 1 + >> lib/dpif.h | 3 +- >> utilities/ovs-dpctl.8.in | 9 +++++- >> utilities/ovs-dpctl.c | 62 >> ++++++++++++++++++++++++++++++++++++++++++++++ >> 6 files changed, 86 insertions(+), 3 deletions(-) >> >> diff --git a/ChangeLog b/ChangeLog >> index 18f9228..bd0c40d 100644 >> --- a/ChangeLog >> +++ b/ChangeLog >> @@ -1,5 +1,7 @@ >> post v1.1.0 >> ------------------------ >> + - The new "-s" option for "ovs-dpctl show" prints packet and byte >> + counters for each port. >> - Feature removals: >> - Dropped support for "tun_id_from_cookie" OpenFlow extension. >> (Use the extensible match extensions instead.) >> diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c >> index fa8eea6..fe171bc 100644 >> --- a/lib/dpif-linux.c >> +++ b/lib/dpif-linux.c >> @@ -35,6 +35,7 @@ >> #include "bitmap.h" >> #include "dpif-provider.h" >> #include "netdev.h" >> +#include "netdev-linux.h" >> #include "netdev-vport.h" >> #include "netlink-socket.h" >> #include "netlink.h" >> @@ -431,6 +432,12 @@ dpif_linux_port_query__(const struct dpif *dpif, >> uint32_t port_no, >> dpif_port->name = xstrdup(reply.name); >> dpif_port->type = xstrdup(netdev_vport_get_netdev_type(&reply)); >> dpif_port->port_no = reply.port_no; >> + if (reply.stats) { >> + netdev_stats_from_rtnl_link_stats64(&dpif_port->stats, >> + reply.stats); >> + } else { >> + memset(&dpif_port->stats, 0xff, sizeof dpif_port->stats); >> + } >> ofpbuf_delete(buf); >> } >> return error; >> @@ -517,6 +524,11 @@ dpif_linux_port_dump_next(const struct dpif *dpif >> OVS_UNUSED, void *state_, >> dpif_port->name = (char *) vport.name; >> dpif_port->type = (char *) netdev_vport_get_netdev_type(&vport); >> dpif_port->port_no = vport.port_no; >> + if (vport.stats) { >> + netdev_stats_from_rtnl_link_stats64(&dpif_port->stats, vport.stats); >> + } else { >> + memset(&dpif_port->stats, 0xff, sizeof dpif_port->stats); >> + } >> return 0; >> } >> >> diff --git a/lib/dpif.c b/lib/dpif.c >> index 81e180f..630bcad 100644 >> --- a/lib/dpif.c >> +++ b/lib/dpif.c >> @@ -472,6 +472,7 @@ dpif_port_clone(struct dpif_port *dst, const struct >> dpif_port *src) >> dst->name = xstrdup(src->name); >> dst->type = xstrdup(src->type); >> dst->port_no = src->port_no; >> + dst->stats = src->stats; >> } >> >> /* Frees memory allocated to members of 'dpif_port'. >> diff --git a/lib/dpif.h b/lib/dpif.h >> index 0e0f407..a039f11 100644 >> --- a/lib/dpif.h >> +++ b/lib/dpif.h >> @@ -23,6 +23,7 @@ >> #include <stdint.h> >> #include "openflow/openflow.h" >> #include "openvswitch/datapath-protocol.h" >> +#include "netdev.h" >> #include "util.h" >> >> #ifdef __cplusplus >> @@ -31,7 +32,6 @@ extern "C" { >> >> struct dpif; >> struct ds; >> -struct netdev; >> struct nlattr; >> struct ofpbuf; >> struct sset; >> @@ -71,6 +71,7 @@ struct dpif_port { >> char *name; /* Network device name, e.g. "eth0". */ >> char *type; /* Network device type, e.g. "system". */ >> uint32_t port_no; /* Port number within datapath. */ >> + struct netdev_stats stats; /* Port statistics. */ >> }; >> void dpif_port_clone(struct dpif_port *, const struct dpif_port *); >> void dpif_port_destroy(struct dpif_port *); >> diff --git a/utilities/ovs-dpctl.8.in b/utilities/ovs-dpctl.8.in >> index 58b3ea0..5b5941b 100644 >> --- a/utilities/ovs-dpctl.8.in >> +++ b/utilities/ovs-dpctl.8.in >> @@ -78,10 +78,12 @@ Removes each \fInetdev\fR from the list of network >> devices datapath >> Prints the name of each configured datapath on a separate line. >> . >> .TP >> -\fBshow \fR[\fIdp\fR...] >> +[\fB\-s\fR | \fB\-\-statistics\fR] \fBshow \fR[\fIdp\fR...] >> Prints a summary of configured datapaths, including their datapath >> numbers and a list of ports connected to each datapath. (The local >> -port is identified as port 0.) >> +port is identified as port 0.) If \fB\-s\fR or \fB\-\-statistics\fR >> +is specified, then packet and byte counters are also printed for each >> +port. >> .IP >> If one or more datapaths are specified, information on only those >> datapaths are displayed. Otherwise, \fBovs\-dpctl\fR displays information >> @@ -104,6 +106,9 @@ not OpenFlow flow entries. By deleting them, the >> process that set them >> up may be confused about their disappearance. >> . >> .SH OPTIONS >> +.IP "\fB\-s\fR, \fB\-\-statistics\fR" >> +Causes the \fBshow\fR command to print packet and byte counters for >> +each port within the datapaths that it shows. >> .TP >> \fB\-t\fR, \fB\-\-timeout=\fIsecs\fR >> Limits \fBovs\-dpctl\fR runtime to approximately \fIsecs\fR seconds. If >> diff --git a/utilities/ovs-dpctl.c b/utilities/ovs-dpctl.c >> index 9d6bf98..40048b4 100644 >> --- a/utilities/ovs-dpctl.c >> +++ b/utilities/ovs-dpctl.c >> @@ -45,6 +45,9 @@ >> >> VLOG_DEFINE_THIS_MODULE(dpctl); >> >> +/* -s, --statistics: Print port statistics? */ >> +bool print_statistics; >> + >> static const struct command all_commands[]; >> >> static void usage(void) NO_RETURN; >> @@ -68,6 +71,7 @@ parse_options(int argc, char *argv[]) >> VLOG_OPTION_ENUMS >> }; >> static struct option long_options[] = { >> + {"statistics", no_argument, 0, 's'}, >> {"timeout", required_argument, 0, 't'}, >> {"help", no_argument, 0, 'h'}, >> {"version", no_argument, 0, 'V'}, >> @@ -86,6 +90,10 @@ parse_options(int argc, char *argv[]) >> } >> >> switch (c) { >> + case 's': >> + print_statistics = true; >> + break; >> + >> case 't': >> timeout = strtoul(optarg, NULL, 10); >> if (timeout <= 0) { >> @@ -321,6 +329,33 @@ do_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; >> @@ -371,6 +406,33 @@ show_dpif(struct dpif *dpif) >> putchar(')'); >> } >> putchar('\n'); >> + >> + if (print_statistics) { >> + const struct netdev_stats *s = &dpif_port.stats; >> + >> + 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); >> } >> -- >> 1.7.4.4 >> >> _______________________________________________ >> dev mailing list >> [email protected] >> http://openvswitch.org/mailman/listinfo/dev >> > _______________________________________________ > dev mailing list > [email protected] > http://openvswitch.org/mailman/listinfo/dev > _______________________________________________ dev mailing list [email protected] http://openvswitch.org/mailman/listinfo/dev
