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
