> openflow_from_hex(), you mean?  Thanks, I fixed that up.

Yes, sorry.

Ethan

>
> On Wed, Feb 08, 2012 at 01:44:38PM -0800, Ethan Jackson wrote:
>> In the comments for ofctl_send() you document the argument as being
>> named ohp when it's really named msgp.
>>
>> Otherwise looks good,
>> Ethan
>>
>> On Thu, Jan 26, 2012 at 15:53, Ben Pfaff <b...@nicira.com> wrote:
>> > I intend to use this in upcoming unit tests.
>> >
>> > Signed-off-by: Ben Pfaff <b...@nicira.com>
>> > ---
>> >  utilities/ovs-ofctl.8.in |   15 +++++++--
>> >  utilities/ovs-ofctl.c    |   75 
>> > +++++++++++++++++++++++++++++++++++++++++++++-
>> >  2 files changed, 85 insertions(+), 5 deletions(-)
>> >
>> > diff --git a/utilities/ovs-ofctl.8.in b/utilities/ovs-ofctl.8.in
>> > index adc895f..415dddc 100644
>> > --- a/utilities/ovs-ofctl.8.in
>> > +++ b/utilities/ovs-ofctl.8.in
>> > @@ -1130,11 +1130,18 @@ increase verbosity further.
>> >  .so lib/common.man
>> >  .
>> >  .SH "RUNTIME MANAGEMENT COMMANDS"
>> > -\fBovs\-appctl\fR(8) can send commands to a running \fBovs\-ofctl\fR 
>> > process.
>> > -The currently supported commands only apply when executing the 
>> > \fBmonitor\fR or
>> > -\fBsnoop\fR commands and are described below.
>> > +\fBovs\-appctl\fR(8) can send commands to a running \fBovs\-ofctl\fR
>> > +process.  The supported commands are listed below.
>> > +.
>> >  .IP "\fBexit\fR"
>> > -Causes \fBovs\-ofctl\fR to gracefully terminate.
>> > +Causes \fBovs\-ofctl\fR to gracefully terminate.  This command applies
>> > +only when executing the \fBmonitor\fR or \fBsnoop\fR commands.
>> > +.
>> > +.IP "\fBofctl/send \fIofmsg\fR..."
>> > +Sends each \fIofmsg\fR, specified as a sequence of hex digits that
>> > +express an OpenFlow message, on the OpenFlow connection.  This command
>> > +is useful only when executing the \fBmonitor\fR command.
>> > +.
>> >  .SH EXAMPLES
>> >  .
>> >  The following examples assume that \fBovs\-vswitchd\fR has a bridge
>> > diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c
>> > index 204d340..0006bd6 100644
>> > --- a/utilities/ovs-ofctl.c
>> > +++ b/utilities/ovs-ofctl.c
>> > @@ -1,5 +1,5 @@
>> >  /*
>> > - * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks.
>> > + * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira Networks.
>> >  *
>> >  * Licensed under the Apache License, Version 2.0 (the "License");
>> >  * you may not use this file except in compliance with the License.
>> > @@ -829,6 +829,77 @@ monitor_set_invalid_ttl_to_controller(struct vconn 
>> > *vconn)
>> >     return 0;
>> >  }
>> >
>> > +/* Converts hex digits in 'hex' to an OpenFlow message in '*ohp'.  The
>> > + * caller must free '*ohp'.  On success, returns NULL.  On failure, 
>> > returns
>> > + * an error message and stores NULL in '*ohp'. */
>> > +static const char *
>> > +openflow_from_hex(const char *hex, struct ofpbuf **msgp)
>> > +{
>> > +    struct ofp_header *oh;
>> > +    struct ofpbuf *msg;
>> > +
>> > +    msg = ofpbuf_new(strlen(hex) / 2);
>> > +    *msgp = NULL;
>> > +
>> > +    if (ofpbuf_put_hex(msg, hex, NULL)[0] != '\0') {
>> > +        ofpbuf_delete(msg);
>> > +        return "Trailing garbage in hex data";
>> > +    }
>> > +
>> > +    if (msg->size < sizeof(struct ofp_header)) {
>> > +        ofpbuf_delete(msg);
>> > +        return "Message too short for OpenFlow";
>> > +    }
>> > +
>> > +    oh = msg->data;
>> > +    if (msg->size != ntohs(oh->length)) {
>> > +        ofpbuf_delete(msg);
>> > +        return "Message size does not match length in OpenFlow header";
>> > +    }
>> > +
>> > +    *msgp = msg;
>> > +    return NULL;
>> > +}
>> > +
>> > +static void
>> > +ofctl_send(struct unixctl_conn *conn, int argc,
>> > +           const char *argv[], void *vconn_)
>> > +{
>> > +    struct vconn *vconn = vconn_;
>> > +    struct ds reply;
>> > +    bool ok;
>> > +    int i;
>> > +
>> > +    ok = true;
>> > +    ds_init(&reply);
>> > +    for (i = 1; i < argc; i++) {
>> > +        const char *error_msg;
>> > +        struct ofpbuf *msg;
>> > +        int error;
>> > +
>> > +        error_msg = openflow_from_hex(argv[i], &msg);
>> > +        if (error_msg) {
>> > +            ds_put_format(&reply, "%s\n", error_msg);
>> > +            ok = false;
>> > +            continue;
>> > +        }
>> > +
>> > +        fprintf(stderr, "send: ");
>> > +        ofp_print(stderr, msg->data, msg->size, verbosity);
>> > +
>> > +        error = vconn_send_block(vconn, msg);
>> > +        if (error) {
>> > +            ofpbuf_delete(msg);
>> > +            ds_put_format(&reply, "%s\n", strerror(error));
>> > +            ok = false;
>> > +        } else {
>> > +            ds_put_cstr(&reply, "sent\n");
>> > +        }
>> > +    }
>> > +    unixctl_command_reply(conn, ok ? 200 : 501, ds_cstr(&reply));
>> > +    ds_destroy(&reply);
>> > +}
>> > +
>> >  static void
>> >  monitor_vconn(struct vconn *vconn)
>> >  {
>> > @@ -864,6 +935,8 @@ monitor_vconn(struct vconn *vconn)
>> >         ovs_fatal(error, "failed to create unixctl server");
>> >     }
>> >     unixctl_command_register("exit", "", 0, 0, ofctl_exit, &exiting);
>> > +    unixctl_command_register("ofctl/send", "OFMSG...", 1, INT_MAX,
>> > +                             ofctl_send, vconn);
>> >     daemonize_complete();
>> >
>> >     /* Now get stderr back. */
>> > --
>> > 1.7.2.5
>> >
>> > _______________________________________________
>> > dev mailing list
>> > dev@openvswitch.org
>> > http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to