Looks good to me. Ethan
On Mon, Jun 13, 2011 at 13:21, Ben Pfaff <b...@nicira.com> wrote: > Suggested-by: Hao Zheng <hzh...@nicira.com> > --- > ofproto/private.h | 79 > +++++++++++++++++++++++++++++++++++++++++------------ > 1 files changed, 61 insertions(+), 18 deletions(-) > > diff --git a/ofproto/private.h b/ofproto/private.h > index 80c59e4..06e8223 100644 > --- a/ofproto/private.h > +++ b/ofproto/private.h > @@ -427,27 +427,70 @@ struct ofproto_class { > * convenient. */ > int (*port_del)(struct ofproto *ofproto, uint16_t ofp_port); > > - /* Attempts to begin dumping the ports in 'ofproto'. On success, > returns 0 > - * and initializes '*statep' with any data needed for iteration. On > - * failure, returns a positive errno value. */ > + /* Port iteration functions. > + * > + * The client might not be entirely in control of the ports within an > + * ofproto. Some hardware implementations, for example, might have a > fixed > + * set of ports in a datapath, and the Linux datapath allows the system > + * administrator to externally add and remove ports with ovs-dpctl. For > + * this reason, the client needs a way to iterate through all the ports > + * that are actually in a datapath. These functions provide that > + * functionality. > + * > + * The 'state' pointer provides the implementation a place to > + * keep track of its position. Its format is opaque to the caller. > + * > + * The ofproto provider retains ownership of the data that it stores into > + * ->port_dump_next()'s 'port' argument. The data must remain valid > until > + * at least the next call to ->port_dump_next() or ->port_dump_done() for > + * 'state'. The caller will not modify or free it. > + * > + * Details > + * ======= > + * > + * ->port_dump_start() attempts to begin dumping the ports in 'ofproto'. > + * On success, it should return 0 and initialize '*statep' with any data > + * needed for iteration. On failure, returns a positive errno value, and > + * the client will not call ->port_dump_next() or ->port_dump_done(). > + * > + * ->port_dump_next() attempts to retrieve another port from 'ofproto' > for > + * 'state'. If there is another port, it should store the port's > + * information into 'port' and return 0. It should return EOF if all > ports > + * have already been iterated. Otherwise, on error, it should return a > + * positive errno value. This function will not be called again once it > + * returns nonzero once for a given iteration (but the 'port_dump_done' > + * function will be called afterward). > + * > + * ->port_dump_done() allows the implementation to release resources used > + * for iteration. The caller might decide to stop iteration in the > middle > + * by calling this function before ->port_dump_next() returns nonzero. > + * > + * Usage Example > + * ============= > + * > + * int error; > + * void *state; > + * > + * error = ofproto->ofproto_class->port_dump_start(ofproto, &state); > + * if (!error) { > + * for (;;) { > + * struct ofproto_port port; > + * > + * error = ofproto->ofproto_class->port_dump_next( > + * ofproto, state, &port); > + * if (error) { > + * break; > + * } > + * // Do something with 'port' here (without modifying or freeing > + * // any of its data). > + * } > + * ofproto->ofproto_class->port_dump_done(ofproto, state); > + * } > + * // 'error' is now EOF (success) or a positive errno value (failure). > + */ > int (*port_dump_start)(const struct ofproto *ofproto, void **statep); > - > - /* Attempts to retrieve another port from 'ofproto' for 'state', which > was > - * initialized by a successful call to the 'port_dump_start' function for > - * 'ofproto'. On success, stores a new ofproto_port into 'port' and > - * returns 0. Returns EOF if the end of the port table has been reached, > - * or a positive errno value on error. This function will not be called > - * again once it returns nonzero once for a given iteration (but the > - * 'port_dump_done' function will be called afterward). > - * > - * The ofproto provider retains ownership of the data stored in 'port'. > It > - * must remain valid until at least the next call to 'port_dump_next' or > - * 'port_dump_done' for 'state'. */ > int (*port_dump_next)(const struct ofproto *ofproto, void *state, > struct ofproto_port *port); > - > - /* Releases resources from 'ofproto' for 'state', which was initialized > by > - * a successful call to the 'port_dump_start' function for 'ofproto'. */ > int (*port_dump_done)(const struct ofproto *ofproto, void *state); > > /* Polls for changes in the set of ports in 'ofproto'. If the set of > ports > -- > 1.7.4.4 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev