From ffeda91a477a62d267696e08103f3ac6ec9a0102 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Wed, 29 Dec 2010 15:20:33 -0800 Subject: [PATCH] ovs-dpctl: Use netdev_get_config() to print vport configurations. This is cleaner than parsing "odp_port"s directly. It takes one step toward eliminating use of odp_port from any userspace code outside of lib/netdev-vport.c and lib/dpif-linux.c. Reviewed by Justin Pettit. --- lib/odp-util.c | 29 ----------------------------- lib/odp-util.h | 1 - utilities/ovs-dpctl.c | 39 +++++++++++++++++++++++++++++++++------ 3 files changed, 33 insertions(+), 36 deletions(-) diff --git a/lib/odp-util.c b/lib/odp-util.c index 193f97be..013a7f18 100644 --- a/lib/odp-util.c +++ b/lib/odp-util.c @@ -201,35 +201,6 @@ format_odp_flow(struct ds *ds, const struct odp_flow *f) ds_put_cstr(ds, ", actions:"); format_odp_actions(ds, f->actions, f->actions_len); } - -void -format_odp_port_type(struct ds *ds, const struct odp_port *p) -{ - if (!strcmp(p->type, "gre") - || !strcmp(p->type, "ipsec_gre") - || !strcmp(p->type, "capwap")) { - const struct tnl_port_config *config; - - config = (struct tnl_port_config *)p->config; - - ds_put_format(ds, " (%s: remote_ip="IP_FMT, - p->type, IP_ARGS(&config->daddr)); - - if (config->saddr) { - ds_put_format(ds, ", local_ip="IP_FMT, IP_ARGS(&config->saddr)); - } - - if (config->in_key) { - ds_put_format(ds, ", in_key=%#"PRIx64, ntohll(config->in_key)); - } - - ds_put_cstr(ds, ")"); - } else if (!strcmp(p->type, "patch")) { - ds_put_format(ds, " (%s: peer=%s)", p->type, (char *)p->config); - } else if (strcmp(p->type, "system")) { - ds_put_format(ds, " (%s)", p->type); - } -} /* Returns the correct length of the payload for a flow key attribute of the * specified 'type', or -1 if 'type' is unknown. */ diff --git a/lib/odp-util.h b/lib/odp-util.h index b5ead840..9486661a 100644 --- a/lib/odp-util.h +++ b/lib/odp-util.h @@ -62,7 +62,6 @@ void format_odp_actions(struct ds *, const struct nlattr *odp_actions, size_t actions_len); void format_odp_flow_stats(struct ds *, const struct odp_flow_stats *); void format_odp_flow(struct ds *, const struct odp_flow *); -void format_odp_port_type(struct ds *, const struct odp_port *); /* By my calculations currently the longest valid nlattr-formatted flow key is * 80 bytes long, so this leaves some safety margin. diff --git a/utilities/ovs-dpctl.c b/utilities/ovs-dpctl.c index 23733fde..c3bfb020 100644 --- a/utilities/ovs-dpctl.c +++ b/utilities/ovs-dpctl.c @@ -351,14 +351,41 @@ show_dpif(struct dpif *dpif) stats.max_miss_queue, stats.max_action_queue); } DPIF_PORT_FOR_EACH (&odp_port, &dump, dpif) { - struct ds ds; - printf("\tport %u: %s", odp_port.port, odp_port.devname); - ds_init(&ds); - format_odp_port_type(&ds, &odp_port); - printf("%s\n", ds_cstr(&ds)); - ds_destroy(&ds); + if (strcmp(odp_port.type, "system")) { + struct netdev_options netdev_options; + struct netdev *netdev; + int error; + + printf (" (%s", odp_port.type); + + netdev_options.name = odp_port.devname; + netdev_options.type = odp_port.type; + netdev_options.args = NULL; + netdev_options.ethertype = NETDEV_ETH_TYPE_NONE; + error = netdev_open(&netdev_options, &netdev); + if (!error) { + const struct shash_node **nodes; + const struct shash *config; + size_t i; + + config = netdev_get_config(netdev); + nodes = shash_sort(config); + for (i = 0; i < shash_count(config); i++) { + const struct shash_node *node = nodes[i]; + printf("%c %s=%s", i ? ',' : ':', + node->name, (char *) node->data); + } + free(nodes); + + netdev_close(netdev); + } else { + printf(": open failed (%s)", strerror(error)); + } + putchar(')'); + } + putchar('\n'); } dpif_close(dpif); } -- 2.30.2