X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=utilities%2Fovs-ofctl.c;h=c0b7628f66956827f73d75cc974c96ed3b09d5b4;hb=c71270b7aefddd967d7dd5446f7701241380b09d;hp=46994823e2a5d229a1668c92466fc6b87ac355d0;hpb=7f1089b5036d9e51b8a9205d8462101bdaf52b95;p=openvswitch diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c index 46994823..c0b7628f 100644 --- a/utilities/ovs-ofctl.c +++ b/utilities/ovs-ofctl.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -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" @@ -214,13 +216,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 +244,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 +265,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 +769,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 +871,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 +1083,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 +1108,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 @@ -1292,6 +1330,7 @@ static const struct command all_commands[] = { { "show", 1, 1, do_show }, { "status", 1, 2, do_status }, { "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 },