X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=utilities%2Fovs-ofctl.c;h=68f2edafff5ee13123aed60129c353386867a523;hb=40a09c8aa9577d0d099eb5bbcb5ef69800e9e6f0;hp=1865c00347d6a0c72af342d2d970b809d9c910f4;hpb=88ca35eed0ce0bc65e45122c24e33f50e8339bb8;p=openvswitch diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c index 1865c003..68f2edaf 100644 --- a/utilities/ovs-ofctl.c +++ b/utilities/ovs-ofctl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010 Nicira Networks. + * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -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"); } @@ -622,7 +631,8 @@ do_flow_mod__(int argc OVS_UNUSED, char *argv[], uint16_t command) list_init(&requests); flow_format = NXFF_OPENFLOW10; - parse_ofp_flow_mod_str(&requests, &flow_format, argv[2], command); + parse_ofp_flow_mod_str(&requests, &flow_format, argc > 2 ? argv[2] : "", + command); open_vconn(argv[1], &vconn); transact_multiple_noreply(vconn, &requests); @@ -678,7 +688,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 +819,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), @@ -874,6 +884,8 @@ do_help(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) /* Undocumented commands for unit testing. */ +/* "parse-flows FILENAME": reads the named file as a sequence of flows (like + * add-flows) and prints each of the flows back to stdout. */ static void do_parse_flows(int argc OVS_UNUSED, char *argv[]) { @@ -896,7 +908,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); } @@ -904,6 +916,9 @@ do_parse_flows(int argc OVS_UNUSED, char *argv[]) fclose(file); } +/* "parse-nx-match": reads a series of nx_match specifications as strings from + * stdin, does some internal fussing with them, and then prints them back as + * strings on stdout. */ static void do_parse_nx_match(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) { @@ -958,6 +973,22 @@ do_parse_nx_match(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) ds_destroy(&in); } +/* "ofp-print HEXSTRING [VERBOSITY]": Converts the hex digits in HEXSTRING into + * binary data, interpreting them as an OpenFlow message, and prints the + * OpenFlow message on stdout, at VERBOSITY (level 2 by default). */ +static void +do_ofp_print(int argc, char *argv[]) +{ + struct ofpbuf packet; + + ofpbuf_init(&packet, strlen(argv[1]) / 2); + if (ofpbuf_put_hex(&packet, argv[1], NULL)[0] != '\0') { + ovs_fatal(0, "trailing garbage following hex bytes"); + } + ofp_print(stdout, packet.data, packet.size, argc > 2 ? atoi(argv[2]) : 2); + ofpbuf_uninit(&packet); +} + static const struct command all_commands[] = { { "show", 1, 1, do_show }, { "status", 1, 2, do_status }, @@ -982,6 +1013,7 @@ static const struct command all_commands[] = { /* Undocumented commands for testing. */ { "parse-flows", 1, 1, do_parse_flows }, { "parse-nx-match", 0, 0, do_parse_nx_match }, + { "ofp-print", 1, 2, do_ofp_print }, { NULL, 0, 0, NULL }, };