[ovs-dev] [of1.1 rollup 12/20] Introduce ofpacts, an abstraction of OpenFlow actions.

Simon Horman horms at verge.net.au
Thu Jun 14 00:58:08 UTC 2012


On Tue, Jun 12, 2012 at 12:32:16AM -0700, Ben Pfaff wrote:
> OpenFlow actions have always been somewhat awkward to handle.
> Moreover, over time we've started creating actions that require more
> complicated parsing.  When we maintain those actions internally in
> their wire format, we end up parsing them multiple times, whenever
> we have to look at the set of actions.
> 
> When we add support for OpenFlow 1.1 or later protocols, the situation
> will get worse, because these newer protocols support many of the same
> actions but with different representations.  It becomes unrealistic to
> handle each protocol in its wire format.
> 
> This commit adopts a new strategy, by converting OpenFlow actions into
> an internal form from the wire format when they are read, and converting
> them back to the wire format when flows are dumped.  I believe that this
> will be more maintainable over time.
> 
> Signed-off-by: Ben Pfaff <blp at nicira.com>

This is a pretty big patch and I'm not going to pretend to have reviewed it
completely. But I did notice one thing.

[snip]

> diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c
> index 7413455..630e457 100644
> --- a/utilities/ovs-ofctl.c
> +++ b/utilities/ovs-ofctl.c

[snip]

> @@ -1232,22 +1232,23 @@ do_probe(int argc OVS_UNUSED, char *argv[])
>  static void
>  do_packet_out(int argc, char *argv[])
>  {
> +    enum ofputil_protocol protocol;
>      struct ofputil_packet_out po;
> -    struct ofpbuf actions;
> +    struct ofpbuf ofpacts;
>      struct vconn *vconn;
>      int i;
>  
> -    ofpbuf_init(&actions, sizeof(union ofp_action));
> -    parse_ofp_actions(argv[3], &actions);
> +    ofpbuf_init(&ofpacts, 64);
> +    parse_ofpacts(argv[3], &ofpacts);
>  
>      po.buffer_id = UINT32_MAX;
>      po.in_port = (!strcasecmp(argv[2], "none") ? OFPP_NONE
>                    : !strcasecmp(argv[2], "local") ? OFPP_LOCAL
>                    : str_to_port_no(argv[1], argv[2]));
> -    po.actions = actions.data;
> -    po.n_actions = actions.size / sizeof(union ofp_action);
> +    po.ofpacts = ofpacts.data;
> +    po.ofpacts_len = ofpacts.size;
>  
> -    open_vconn(argv[1], &vconn);
> +    protocol = open_vconn(argv[1], &vconn);
>      for (i = 4; i < argc; i++) {
>          struct ofpbuf *packet, *opo;
>          const char *error_msg;

GCC tells me that protocol is set by not used in do_packet_out().
Perhaps it could be removed?




More information about the dev mailing list