X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=utilities%2Fovs-ofctl.c;h=96d64b3bb417d6abd70ece60a832123dcd5f882e;hb=92df599cb2bc5b04a5c9da3e7002f4c729ba480c;hp=d9ee607b349435b7e9ffdac3c3ae6b13cb637060;hpb=659586efcf6f9539282da9447007897907c41112;p=openvswitch diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c index d9ee607b..96d64b3b 100644 --- a/utilities/ovs-ofctl.c +++ b/utilities/ovs-ofctl.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -162,7 +163,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 +215,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 +243,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 +264,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) { @@ -1060,7 +1069,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 +1094,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 +1315,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 },