Looks good. Ethan
On Thu, Jan 26, 2012 at 15:53, Ben Pfaff <b...@nicira.com> wrote: > This will be useful in upcoming unit tests for ensuring that all > asynchronous messages due to previous actions have arrived. > > Signed-off-by: Ben Pfaff <b...@nicira.com> > --- > utilities/ovs-ofctl.8.in | 5 +++++ > utilities/ovs-ofctl.c | 42 ++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 47 insertions(+), 0 deletions(-) > > diff --git a/utilities/ovs-ofctl.8.in b/utilities/ovs-ofctl.8.in > index afde46c..f8c1957 100644 > --- a/utilities/ovs-ofctl.8.in > +++ b/utilities/ovs-ofctl.8.in > @@ -1147,6 +1147,11 @@ 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. > . > +.IP "\fBofctl/barrier\fR" > +Sends an OpenFlow barrier request on the OpenFlow connection and waits > +for a reply. This command is useful only for 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 4995354..17d367c 100644 > --- a/utilities/ovs-ofctl.c > +++ b/utilities/ovs-ofctl.c > @@ -901,6 +901,37 @@ ofctl_send(struct unixctl_conn *conn, int argc, > ds_destroy(&reply); > } > > +struct barrier_aux { > + struct vconn *vconn; /* OpenFlow connection for sending barrier. > */ > + struct unixctl_conn *conn; /* Connection waiting for barrier response. > */ > +}; > + > +static void > +ofctl_barrier(struct unixctl_conn *conn, int argc OVS_UNUSED, > + const char *argv[] OVS_UNUSED, void *aux_) > +{ > + struct barrier_aux *aux = aux_; > + struct ofpbuf *msg; > + int error; > + > + if (aux->conn) { > + unixctl_command_reply(conn, 501, "already waiting for barrier > reply"); > + return; > + } > + > + msg = ofputil_encode_barrier_request(); > + fprintf(stderr, "send: "); > + ofp_print(stderr, msg->data, msg->size, verbosity); > + > + error = vconn_send_block(aux->vconn, msg); > + if (error) { > + ofpbuf_delete(msg); > + unixctl_command_reply(conn, 501, strerror(error)); > + } else { > + aux->conn = conn; > + } > +} > + > static void > ofctl_set_output_file(struct unixctl_conn *conn, int argc OVS_UNUSED, > const char *argv[], void *aux OVS_UNUSED) > @@ -922,6 +953,7 @@ ofctl_set_output_file(struct unixctl_conn *conn, int argc > OVS_UNUSED, > static void > monitor_vconn(struct vconn *vconn) > { > + struct barrier_aux barrier_aux = { vconn, NULL }; > struct unixctl_server *server; > bool exiting = false; > int error, fd; > @@ -956,6 +988,8 @@ monitor_vconn(struct vconn *vconn) > unixctl_command_register("exit", "", 0, 0, ofctl_exit, &exiting); > unixctl_command_register("ofctl/send", "OFMSG...", 1, INT_MAX, > ofctl_send, vconn); > + unixctl_command_register("ofctl/barrier", "", 0, 0, > + ofctl_barrier, &barrier_aux); > unixctl_command_register("ofctl/set-output-file", "FILE", 1, 1, > ofctl_set_output_file, NULL); > daemonize_complete(); > @@ -970,14 +1004,22 @@ monitor_vconn(struct vconn *vconn) > unixctl_server_run(server); > > for (;;) { > + uint8_t msg_type; > + > retval = vconn_recv(vconn, &b); > if (retval == EAGAIN) { > break; > } > + msg_type = ((const struct ofp_header *) b->data)->type; > > run(retval, "vconn_recv"); > ofp_print(stderr, b->data, b->size, verbosity + 2); > ofpbuf_delete(b); > + > + if (barrier_aux.conn && msg_type == OFPT_BARRIER_REPLY) { > + unixctl_command_reply(barrier_aux.conn, 200, ""); > + barrier_aux.conn = NULL; > + } > } > > if (exiting) { > -- > 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