Looks good to me, tested with the ofp log snooped from controller.


On Tue, Jul 23, 2013 at 11:13 AM, Ben Pfaff <[email protected]> wrote:

> Signed-off-by: Ben Pfaff <[email protected]
> ---
>  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
> [email protected]
> http://openvswitch.org/mailman/listinfo/dev
>
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev

Reply via email to