From 4f564f8dc77a40036b2552902ace44dfb274c36e Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Tue, 23 Nov 2010 14:34:21 -0800 Subject: [PATCH] ovs-ofctl: Add --more option to increase OpenFlow message verbosity. This is useful for seeing the raw NXM data instead of just the parsed cls_rules. --- tests/ovs-ofctl.at | 29 +++++++++++++++++++++++++++++ utilities/ovs-ofctl.8.in | 6 ++++++ utilities/ovs-ofctl.c | 25 +++++++++++++++++-------- 3 files changed, 52 insertions(+), 8 deletions(-) diff --git a/tests/ovs-ofctl.at b/tests/ovs-ofctl.at index 3f39538a..58e88113 100644 --- a/tests/ovs-ofctl.at +++ b/tests/ovs-ofctl.at @@ -76,6 +76,35 @@ NXT_FLOW_MOD: ADD actions=drop ]) AT_CLEANUP +AT_SETUP([ovs-ofctl -F nxm -mmm parse-flows]) +AT_DATA([flows.txt], [ +# comment +tcp,tp_src=123,actions=flood +in_port=LOCAL dl_vlan=9 dl_src=00:0A:E4:25:6B:B0 actions=drop +arp,nw_src=192.168.0.1 actions=drop_spoofed_arp,NORMAL +udp dl_vlan_pcp=7 idle_timeout=5 actions=strip_vlan output:0 +tcp,nw_src=192.168.0.3,tp_dst=80 actions=set_queue:37,output:1 +udp,nw_src=192.168.0.3,tp_dst=53 actions=pop_queue,output:1 +cookie=0x123456789abcdef hard_timeout=10 priority=60000 actions=controller +actions=note:41.42.43,note:00.01.02.03.04.05.06.07,note +tun_id=0x1234,cookie=0x5678,actions=flood +actions=drop +]) +AT_CHECK([ovs-ofctl -F nxm -mmm parse-flows flows.txt], [0], [stdout]) +AT_CHECK([[sed 's/ (xid=0x[0-9a-fA-F]*)//' stdout]], [0], [dnl +NXT_FLOW_MOD: ADD NXM_OF_ETH_TYPE(0800), NXM_OF_IP_PROTO(06), NXM_OF_TCP_SRC(007b) actions=FLOOD +NXT_FLOW_MOD: ADD NXM_OF_IN_PORT(fffe), NXM_OF_ETH_SRC(000ae4256bb0), NXM_OF_VLAN_TCI_W(1009/1fff) actions=drop +NXT_FLOW_MOD: ADD NXM_OF_ETH_TYPE(0806), NXM_OF_ARP_SPA(c0a80001) actions=drop_spoofed_arp,NORMAL +NXT_FLOW_MOD: ADD NXM_OF_ETH_TYPE(0800), NXM_OF_VLAN_TCI_W(f000/f000), NXM_OF_IP_PROTO(11) idle:5 actions=strip_vlan,output:0 +NXT_FLOW_MOD: ADD NXM_OF_ETH_TYPE(0800), NXM_OF_IP_SRC(c0a80003), NXM_OF_IP_PROTO(06), NXM_OF_TCP_DST(0050) actions=set_queue:37,output:1 +NXT_FLOW_MOD: ADD NXM_OF_ETH_TYPE(0800), NXM_OF_IP_SRC(c0a80003), NXM_OF_IP_PROTO(11), NXM_OF_UDP_DST(0035) actions=pop_queue,output:1 +NXT_FLOW_MOD: ADD cookie:0x123456789abcdef hard:10 pri:60000 actions=CONTROLLER:65535 +NXT_FLOW_MOD: ADD actions=note:41.42.43.00.00.00,note:00.01.02.03.04.05.06.07.00.00.00.00.00.00,note:00.00.00.00.00.00 +NXT_FLOW_MOD: ADD NXM_NX_TUN_ID(0000000000001234) cookie:0x5678 actions=FLOOD +NXT_FLOW_MOD: ADD actions=drop +]) +AT_CLEANUP + AT_SETUP([ovs-ofctl parse-nx-match]) AT_KEYWORDS([nx-match]) AT_DATA([nx-match.txt], [dnl diff --git a/utilities/ovs-ofctl.8.in b/utilities/ovs-ofctl.8.in index ebdfc667..bd2a37f7 100644 --- a/utilities/ovs-ofctl.8.in +++ b/utilities/ovs-ofctl.8.in @@ -652,6 +652,12 @@ This option, where \fIformat\fR is one of the formats listed in the above table, overrides \fBovs\-ofctl\fR's default choice of flow format. If a command cannot work as requested using the requested flow format, \fBovs\-ofctl\fR will report a fatal error. +. +.IP "\fB\-m\fR" +.IQ "\fB\-\-more\fR" +Increases the verbosity of OpenFlow messages printed and logged by +\fBovs\-ofctl\fR commands. Specify this option more than once to +increase verbosity further. .SS "Public Key Infrastructure Options" .so lib/ssl.man .so lib/vlog.man diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c index 1865c003..0f1c67e6 100644 --- a/utilities/ovs-ofctl.c +++ b/utilities/ovs-ofctl.c @@ -58,6 +58,9 @@ static bool strict; * particular flow format or -1 to let ovs-ofctl choose intelligently. */ static int preferred_flow_format = -1; +/* -m, --more: Additional verbosity for ofp-print functions. */ +static int verbosity; + static const struct command all_commands[]; static void usage(void) NO_RETURN; @@ -84,6 +87,7 @@ parse_options(int argc, char *argv[]) {"timeout", required_argument, 0, 't'}, {"strict", no_argument, 0, OPT_STRICT}, {"flow-format", required_argument, 0, 'F'}, + {"more", no_argument, 0, 'm'}, {"help", no_argument, 0, 'h'}, {"version", no_argument, 0, 'V'}, VLOG_LONG_OPTIONS, @@ -119,6 +123,10 @@ parse_options(int argc, char *argv[]) } break; + case 'm': + verbosity++; + break; + case 'h': usage(); @@ -176,6 +184,7 @@ usage(void) printf("\nOther options:\n" " --strict use strict match for flow commands\n" " -F, --flow-format=FORMAT force particular flow format\n" + " -m, --more be more verbose printing OpenFlow\n" " -t, --timeout=SECS give up after SECS seconds\n" " -h, --help display this help message\n" " -V, --version display version information\n"); @@ -299,7 +308,7 @@ dump_transaction(const char *vconn_name, struct ofpbuf *request) update_openflow_length(request); open_vconn(vconn_name, &vconn); run(vconn_transact(vconn, request, &reply), "talking to %s", vconn_name); - ofp_print(stdout, reply->data, reply->size, 1); + ofp_print(stdout, reply->data, reply->size, verbosity + 1); vconn_close(vconn); } @@ -329,7 +338,7 @@ dump_stats_transaction(const char *vconn_name, struct ofpbuf *request) if (send_xid == recv_xid) { struct ofp_stats_reply *osr; - ofp_print(stdout, reply->data, reply->size, 1); + ofp_print(stdout, reply->data, reply->size, verbosity + 1); osr = ofpbuf_at(reply, 0, sizeof *osr); done = !osr || !(ntohs(osr->flags) & OFPSF_REPLY_MORE); @@ -365,7 +374,7 @@ transact_multiple_noreply(struct vconn *vconn, struct list *requests) run(vconn_transact_multiple_noreply(vconn, requests, &reply), "talking to %s", vconn_get_name(vconn)); if (reply) { - ofp_print(stderr, reply->data, reply->size, 2); + ofp_print(stderr, reply->data, reply->size, verbosity + 2); exit(1); } ofpbuf_delete(reply); @@ -414,7 +423,7 @@ do_status(int argc, char *argv[]) if (reply->header.type != OFPT_VENDOR || reply->vendor != ntohl(NX_VENDOR_ID) || reply->subtype != ntohl(NXT_STATUS_REPLY)) { - ofp_print(stderr, b->data, b->size, 2); + ofp_print(stderr, b->data, b->size, verbosity + 2); ovs_fatal(0, "bad reply"); } @@ -678,7 +687,7 @@ 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); + ofp_print(stderr, b->data, b->size, verbosity + 2); ofpbuf_delete(b); } } @@ -809,9 +818,9 @@ do_ping(int argc, char *argv[]) || rpy_hdr->xid != rq_hdr->xid || rpy_hdr->type != OFPT_ECHO_REPLY) { printf("Reply does not match request. Request:\n"); - ofp_print(stdout, request, request->size, 2); + ofp_print(stdout, request, request->size, verbosity + 2); printf("Reply:\n"); - ofp_print(stdout, reply, reply->size, 2); + ofp_print(stdout, reply, reply->size, verbosity + 2); } printf("%zu bytes from %s: xid=%08"PRIx32" time=%.1f ms\n", reply->size - sizeof *rpy_hdr, argv[1], ntohl(rpy_hdr->xid), @@ -896,7 +905,7 @@ do_parse_flows(int argc OVS_UNUSED, char *argv[]) struct ofpbuf *packet, *next; LIST_FOR_EACH_SAFE (packet, next, list_node, &packets) { - ofp_print(stdout, packet->data, packet->size, 0); + ofp_print(stdout, packet->data, packet->size, verbosity); list_remove(&packet->list_node); ofpbuf_delete(packet); } -- 2.30.2