[ovs-dev] [PATCH] ovs-ofctl: Add "ofp-parse" command for printing OpenFlow from a file.

Alex Wang alexw at nicira.com
Mon Aug 5 21:50:53 UTC 2013


Also, here is a test, if it is needed, ;D

+
+AT_SETUP([ovs-ofctl ofp-parse])
+
+# Test the echo request/reply messages (0 payload).
+AT_CHECK([echo -n -e
\\x1\\x2\\x0\\x8\\x0\\x0\\x0\\x0\\x1\\x3\\x0\\x8\\x0\\x0\\x0\\x0 >
binary_ofp_msg])
+
+AT_CHECK([ovs-ofctl ofp-parse binary_ofp_msg], [0], [dnl
+OFPT_ECHO_REQUEST (xid=0x0): 0 bytes of payload
+OFPT_ECHO_REPLY (xid=0x0): 0 bytes of payload
+])
+
+# Test the hello (xid:1 3-byte payload).
+AT_CHECK([echo -n -e \\x1\\x0\\x0\\x0B\\x0\\x0\\x0\\x1\\x41\\x42\\x43 >
binary_ofp_msg])
+
+AT_CHECK([ovs-ofctl ofp-parse - < binary_ofp_msg], [0], [dnl
+OFPT_HELLO (xid=0x1):
+ version bitmap: 0x01
+ unknown data in hello:
+00000000  01 00 00 0b 00 00 00 01-41 42 43                |........ABC
|
+])
+
+AT_CLEANUP


On Mon, Aug 5, 2013 at 11:36 AM, Alex Wang <alexw at nicira.com> wrote:

> Looks good to me, tested with the ofp log snooped from controller.
>
>
>
> On Tue, Jul 23, 2013 at 11:13 AM, Ben Pfaff <blp at nicira.com> wrote:
>
>> Signed-off-by: Ben Pfaff <blp at nicira.com
>> ---
>>  NEWS                     |    2 +
>>  utilities/ovs-ofctl.8.in |    8 ++++++
>>  utilities/ovs-ofctl.c    |   55
>> +++++++++++++++++++++++++++++++++++++++++++++-
>>  3 files changed, 64 insertions(+), 1 deletions(-)
>>
>> diff --git a/NEWS b/NEWS
>> index b46fc43..bb174ed 100644
>> --- a/NEWS
>> +++ b/NEWS
>> @@ -15,6 +15,8 @@ post-v1.11.0
>>        through database paths (e.g. Private key option with the database
>> name
>>        should look like "--private-key=db:Open_vSwitch,SSL,private_key").
>>      - Added ovs-dev.py, a utility script helpful for Open vSwitch
>> developers.
>> +    - ovs-ofctl:
>> +      * New "ofp-parse" for printing OpenFlow messages read from a file.
>>
>>
>>  v1.11.0 - xx xxx xxxx
>> diff --git a/utilities/ovs-ofctl.8.in b/utilities/ovs-ofctl.8.in
>> index e66c605..3e6c7fe 100644
>> --- a/utilities/ovs-ofctl.8.in
>> +++ b/utilities/ovs-ofctl.8.in
>> @@ -370,6 +370,14 @@ response.  Reports the total time required.  This is
>> a measure of the
>>  maximum bandwidth to \fItarget\fR for round-trips of \fIn\fR-byte
>>  messages.
>>  .
>> +.SS "Other Commands"
>> +.
>> +.IP "\fBofp\-parse\fR \fIfile\fR"
>> +Reads \fIfile\fR (or \fBstdin\fR if \fIfile\fR is \fB\-\fR) as a
>> +series of OpenFlow messages in the binary format used on an OpenFlow
>> +connection, and prints them to the console.  This can be useful for
>> +printing OpenFlow messages captured from a TCP stream.
>> +.
>>  .SS "Flow Syntax"
>>  .PP
>>  Some \fBovs\-ofctl\fR commands accept an argument that describes a flow
>> or
>> diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c
>> index 2622255..577c4ce 100644
>> --- a/utilities/ovs-ofctl.c
>> +++ b/utilities/ovs-ofctl.c
>> @@ -305,7 +305,9 @@ usage(void)
>>             "  probe TARGET                probe whether TARGET is up\n"
>>             "  ping TARGET [N]             latency of N-byte echos\n"
>>             "  benchmark TARGET N COUNT    bandwidth of COUNT N-byte
>> echos\n"
>> -           "where SWITCH or TARGET is an active OpenFlow connection
>> method.\n",
>> +           "SWITCH or TARGET is an active OpenFlow connection method.\n"
>> +           "\nOther commands:\n"
>> +           "  ofp-parse FILE              print messages read from
>> FILE\n",
>>             program_name, program_name);
>>      vconn_usage(true, false, false);
>>      daemon_usage();
>> @@ -1697,6 +1699,56 @@ ofctl_set_frags(int argc OVS_UNUSED, char *argv[])
>>  }
>>
>>  static void
>> +ofctl_ofp_parse(int argc OVS_UNUSED, char *argv[])
>> +{
>> +    const char *filename = argv[1];
>> +    struct ofpbuf b;
>> +    FILE *file;
>> +
>> +    file = !strcmp(filename, "-") ? stdin : fopen(filename, "r");
>> +    if (file == NULL) {
>> +        ovs_fatal(errno, "%s: open", filename);
>> +    }
>> +
>> +    ofpbuf_init(&b, 65536);
>> +    for (;;) {
>> +        struct ofp_header *oh;
>> +        size_t length, tail_len;
>> +        void *tail;
>> +        size_t n;
>> +
>> +        ofpbuf_clear(&b);
>> +        oh = ofpbuf_put_uninit(&b, sizeof *oh);
>> +        n = fread(oh, 1, sizeof *oh, file);
>> +        if (n == 0) {
>> +            break;
>> +        } else if (n < sizeof *oh) {
>> +            ovs_fatal(0, "%s: unexpected end of file mid-message",
>> filename);
>> +        }
>> +
>> +        length = ntohs(oh->length);
>> +        if (length < sizeof *oh) {
>> +            ovs_fatal(0, "%s: %zu-byte message is too short for
>> OpenFlow",
>> +                      filename, length);
>> +        }
>> +
>> +        tail_len = length - sizeof *oh;
>> +        tail = ofpbuf_put_uninit(&b, tail_len);
>> +        n = fread(tail, 1, tail_len, file);
>> +        if (n < tail_len) {
>> +            ovs_fatal(0, "%s: unexpected end of file mid-message",
>> filename);
>> +        }
>> +
>> +        ofp_print(stdout, b.data, b.size, verbosity + 2);
>> +    }
>> +    ofpbuf_uninit(&b);
>> +
>> +    if (file != stdin) {
>> +        fclose(file);
>> +    }
>> +}
>> +
>> +static void
>>  ofctl_ping(int argc, char *argv[])
>>  {
>>      size_t max_payload = 65535 - sizeof(struct ofp_header);
>> @@ -2932,6 +2984,7 @@ static const struct command all_commands[] = {
>>      { "mod-port", 3, 3, ofctl_mod_port },
>>      { "get-frags", 1, 1, ofctl_get_frags },
>>      { "set-frags", 2, 2, ofctl_set_frags },
>> +    { "ofp-parse", 1, 1, ofctl_ofp_parse },
>>      { "probe", 1, 1, ofctl_probe },
>>      { "ping", 1, 2, ofctl_ping },
>>      { "benchmark", 3, 3, ofctl_benchmark },
>> --
>> 1.7.2.5
>>
>> _______________________________________________
>> dev mailing list
>> dev at openvswitch.org
>> http://openvswitch.org/mailman/listinfo/dev
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openvswitch.org/pipermail/ovs-dev/attachments/20130805/770a2c9b/attachment-0003.html>


More information about the dev mailing list