vlog: Remove explicit calls to vlog_init().
[sliver-openvswitch.git] / utilities / ovs-ofctl.c
index d9ee607..31b58a6 100644 (file)
@@ -19,6 +19,7 @@
 #include <errno.h>
 #include <getopt.h>
 #include <inttypes.h>
+#include <sys/socket.h>
 #include <net/if.h>
 #include <netinet/in.h>
 #include <signal.h>
@@ -38,6 +39,7 @@
 #include "netlink.h"
 #include "odp-util.h"
 #include "ofp-print.h"
+#include "ofp-util.h"
 #include "ofpbuf.h"
 #include "openflow/nicira-ext.h"
 #include "openflow/openflow.h"
@@ -72,8 +74,6 @@ int
 main(int argc, char *argv[])
 {
     set_program_name(argv[0]);
-    time_init();
-    vlog_init();
     parse_options(argc, argv);
     signal(SIGPIPE, SIG_IGN);
     run_command(argc - optind, argv + optind, all_commands);
@@ -162,7 +162,7 @@ usage(void)
            "  add-flows SWITCH FILE       add flows from FILE\n"
            "  mod-flows SWITCH FLOW       modify actions of matching FLOWs\n"
            "  del-flows SWITCH [FLOW]     delete matching FLOWs\n"
-           "  monitor SWITCH MISSLEN EXP  print packets received from SWITCH\n"
+           "  monitor SWITCH [MISSLEN]    print packets received from SWITCH\n"
            "\nFor OpenFlow switches and controllers:\n"
            "  probe VCONN                 probe whether VCONN is up\n"
            "  ping VCONN [N]              latency of N-byte echos\n"
@@ -214,13 +214,14 @@ open_vconn_socket(const char *name, struct vconn **vconnp)
 }
 
 static void
-open_vconn(const char *name, struct vconn **vconnp)
+open_vconn__(const char *name, const char *default_suffix,
+             struct vconn **vconnp)
 {
     struct dpif *dpif;
     struct stat s;
     char *bridge_path, *datapath_name, *datapath_type;
 
-    bridge_path = xasprintf("%s/%s.mgmt", ovs_rundir, name);
+    bridge_path = xasprintf("%s/%s.%s", ovs_rundir, name, default_suffix);
     dp_parse_name(name, &datapath_name, &datapath_type);
 
     if (strstr(name, ":")) {
@@ -241,7 +242,8 @@ open_vconn(const char *name, struct vconn **vconnp)
             VLOG_INFO("datapath %s is named %s", name, dpif_name);
         }
 
-        socket_name = xasprintf("%s/%s.mgmt", ovs_rundir, dpif_name);
+        socket_name = xasprintf("%s/%s.%s",
+                                ovs_rundir, dpif_name, default_suffix);
         if (stat(socket_name, &s)) {
             ovs_fatal(errno, "cannot connect to %s: stat failed on %s",
                       name, socket_name);
@@ -261,6 +263,12 @@ open_vconn(const char *name, struct vconn **vconnp)
     free(bridge_path);
 }
 
+static void
+open_vconn(const char *name, struct vconn **vconnp)
+{
+    return open_vconn__(name, "mgmt", vconnp);
+}
+
 static void *
 alloc_stats_request(size_t body_len, uint16_t type, struct ofpbuf **bufferp)
 {
@@ -759,6 +767,7 @@ str_to_flow(char *string, struct ofp_match *match, struct ofpbuf *actions,
             uint16_t *idle_timeout, uint16_t *hard_timeout, 
             uint64_t *cookie)
 {
+    struct ofp_match normalized;
     char *save_ptr = NULL;
     char *name;
     uint32_t wildcards;
@@ -860,6 +869,18 @@ str_to_flow(char *string, struct ofp_match *match, struct ofpbuf *actions,
         }
     }
     match->wildcards = htonl(wildcards);
+
+    normalized = *match;
+    normalize_match(&normalized);
+    if (memcmp(match, &normalized, sizeof normalized)) {
+        char *old = ofp_match_to_literal_string(match);
+        char *new = ofp_match_to_literal_string(&normalized);
+        VLOG_WARN("The specified flow is not in normal form:");
+        VLOG_WARN(" as specified: %s", old);
+        VLOG_WARN("as normalized: %s", new);
+        free(old);
+        free(new);
+    }
 }
 
 static void
@@ -1060,7 +1081,18 @@ do_tun_cookie(int argc OVS_UNUSED, char *argv[])
 }
 
 static void
-do_monitor(int argc OVS_UNUSED, char *argv[])
+monitor_vconn(struct vconn *vconn)
+{
+    for (;;) {
+        struct ofpbuf *b;
+        run(vconn_recv_block(vconn, &b), "vconn_recv");
+        ofp_print(stderr, b->data, b->size, 2);
+        ofpbuf_delete(b);
+    }
+}
+
+static void
+do_monitor(int argc, char *argv[])
 {
     struct vconn *vconn;
 
@@ -1074,12 +1106,16 @@ do_monitor(int argc OVS_UNUSED, char *argv[])
         osc->miss_send_len = htons(miss_send_len);
         send_openflow_buffer(vconn, buf);
     }
-    for (;;) {
-        struct ofpbuf *b;
-        run(vconn_recv_block(vconn, &b), "vconn_recv");
-        ofp_print(stderr, b->data, b->size, 2);
-        ofpbuf_delete(b);
-    }
+    monitor_vconn(vconn);
+}
+
+static void
+do_snoop(int argc OVS_UNUSED, char *argv[])
+{
+    struct vconn *vconn;
+
+    open_vconn__(argv[1], "snoop", &vconn);
+    monitor_vconn(vconn);
 }
 
 static void
@@ -1291,7 +1327,8 @@ do_help(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
 static const struct command all_commands[] = {
     { "show", 1, 1, do_show },
     { "status", 1, 2, do_status },
-    { "monitor", 1, 3, do_monitor },
+    { "monitor", 1, 2, do_monitor },
+    { "snoop", 1, 1, do_snoop },
     { "dump-desc", 1, 1, do_dump_desc },
     { "dump-tables", 1, 1, do_dump_tables },
     { "dump-flows", 1, 2, do_dump_flows },