ovs-dpctl: Print extended information about vports.
authorJustin Pettit <jpettit@nicira.com>
Sat, 18 Dec 2010 09:07:06 +0000 (01:07 -0800)
committerJustin Pettit <jpettit@nicira.com>
Tue, 28 Dec 2010 22:30:35 +0000 (14:30 -0800)
When "ovs-dpctl show" is run, return additional information about the
port.  For example, tunnel ports will print the remote_ip, local_ip, and
in_key when defined.

lib/odp-util.c
lib/odp-util.h
utilities/ovs-dpctl.c

index 09f8b8384d7c75b299daf37ae4c2a7da807a3c79..1f6d93e9a38c144e1a331105eeaeec44bed600af 100644 (file)
@@ -24,6 +24,7 @@
 #include "dynamic-string.h"
 #include "flow.h"
 #include "netlink.h"
+#include "openvswitch/tunnel.h"
 #include "packets.h"
 #include "timeval.h"
 #include "util.h"
@@ -216,6 +217,34 @@ 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, "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);
+    }
+}
 \f
 void
 odp_flow_key_from_flow(struct odp_flow_key *key, const struct flow *flow)
index 6051c52d8709732db4138d441833c175e727ab2c..c8333be0a15eec8615fb0055458af05ce6c08469 100644 (file)
@@ -62,6 +62,7 @@ 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 *);
 
 void odp_flow_key_from_flow(struct odp_flow_key *, const struct flow *);
 void odp_flow_key_to_flow(const struct odp_flow_key *, struct flow *);
index 8f2a2bc651312a0de512a670bce47249dc552920..b12ceb7586cc5f8c7452b424b357a35c2af9651e 100644 (file)
@@ -375,12 +375,14 @@ show_dpif(struct dpif *dpif)
     query_ports(dpif, &ports, &n_ports);
     for (i = 0; i < n_ports; i++) {
         const struct odp_port *p = &ports[i];
+        struct ds ds;
 
         printf("\tport %u: %s", p->port, p->devname);
-        if (strcmp(p->type, "system")) {
-            printf(" (%s)", p->type);
-        }
-        printf("\n");
+
+        ds_init(&ds);
+        format_odp_port_type(&ds, p);
+        printf("%s\n", ds_cstr(&ds));
+        ds_destroy(&ds);
     }
     free(ports);
     dpif_close(dpif);