[ovs-dev] [PATCH v2 4/7] actions: Omit table number when possible for formatting "next" action.
Mickey Spiegel
mickeys.dev at gmail.com
Sat Jan 21 00:27:04 UTC 2017
On Fri, Jan 20, 2017 at 2:48 PM, Ben Pfaff <blp at ovn.org> wrote:
> Until now, formatting the "next" action has always required including
> the table number, because the action struct didn't include enough context
> so that the formatter could decide whether the table number was the next
> table or some other table. This is more or less OK, but an upcoming commit
> will add a "pipeline" field to the "next" action, which means that the same
> policy there would require that the pipeline always be printed. That's a
> little obnoxious because 99+% of the time, the pipeline to be printed is
> the same pipeline that the flow is in and printing it would be distracting.
> So it's better to store some context to help with formatting. This commit
> begins adopting that policy for the existing table number field.
>
> Signed-off-by: Ben Pfaff <blp at ovn.org>
>
Acked-by: Mickey Spiegel <mickeys.dev at gmail.com>
One comment inline.
> ---
> include/ovn/actions.h | 8 ++++++++
> ovn/lib/actions.c | 43 +++++++++++++++++++++----------------------
> tests/ovn.at | 8 ++++----
> 3 files changed, 33 insertions(+), 26 deletions(-)
>
> diff --git a/include/ovn/actions.h b/include/ovn/actions.h
> index 92c8888..38764fe 100644
> --- a/include/ovn/actions.h
> +++ b/include/ovn/actions.h
> @@ -143,7 +143,15 @@ struct ovnact_null {
> /* OVNACT_NEXT. */
> struct ovnact_next {
> struct ovnact ovnact;
> +
> + /* Arguments. */
> uint8_t ltable; /* Logical table ID of next table. */
> +
> + /* Information about the flow that the action is in. This does not
> affect
> + * behavior, since the implementation of "next" doesn't depend on the
> + * source table or pipeline. It does affect how ovnacts_format()
> prints
> + * the action. */
> + uint8_t src_ltable; /* Logical table ID of source table. */
> };
>
> /* OVNACT_LOAD. */
> diff --git a/ovn/lib/actions.c b/ovn/lib/actions.c
> index 2162dad..bcc690f 100644
> --- a/ovn/lib/actions.c
> +++ b/ovn/lib/actions.c
> @@ -259,36 +259,35 @@ parse_NEXT(struct action_context *ctx)
> {
> if (!ctx->pp->n_tables) {
> lexer_error(ctx->lexer, "\"next\" action not allowed here.");
> - } else if (lexer_match(ctx->lexer, LEX_T_LPAREN)) {
> - int ltable;
> -
> - if (!lexer_force_int(ctx->lexer, <able) ||
> - !lexer_force_match(ctx->lexer, LEX_T_RPAREN)) {
> - return;
> - }
> + return;
> + }
>
> - if (ltable >= ctx->pp->n_tables) {
> - lexer_error(ctx->lexer,
> - "\"next\" argument must be in range 0 to %d.",
> - ctx->pp->n_tables - 1);
> - return;
> - }
> + int table = ctx->pp->cur_ltable + 1;
> + if (lexer_match(ctx->lexer, LEX_T_LPAREN)
> + && (!lexer_force_int(ctx->lexer, &table) ||
> + !lexer_force_match(ctx->lexer, LEX_T_RPAREN))) {
> + return;
> + }
>
> - ovnact_put_NEXT(ctx->ovnacts)->ltable = ltable;
> - } else {
> - if (ctx->pp->cur_ltable < ctx->pp->n_tables) {
> - ovnact_put_NEXT(ctx->ovnacts)->ltable = ctx->pp->cur_ltable
> + 1;
> - } else {
> - lexer_error(ctx->lexer,
> - "\"next\" action not allowed in last table.");
> - }
> + if (table >= ctx->pp->n_tables) {
> + lexer_error(ctx->lexer,
> + "\"next\" action cannot advance beyond table %d.",
> + ctx->pp->n_tables - 1);
>
Should there be a "return;" here?
Mickey
> }
> +
> + struct ovnact_next *next = ovnact_put_NEXT(ctx->ovnacts);
> + next->ltable = table;
> + next->src_ltable = ctx->pp->cur_ltable;
> }
>
> static void
> format_NEXT(const struct ovnact_next *next, struct ds *s)
> {
> - ds_put_format(s, "next(%d);", next->ltable);
> + if (next->ltable != next->src_ltable + 1) {
> + ds_put_format(s, "next(%d);", next->ltable);
> + } else {
> + ds_put_cstr(s, "next;");
> + }
> }
>
> static void
> diff --git a/tests/ovn.at b/tests/ovn.at
> index 67d73c5..f71a4af 100644
> --- a/tests/ovn.at
> +++ b/tests/ovn.at
> @@ -643,9 +643,9 @@ output;
>
> # next
> next;
> - formats as next(11);
> encodes as resubmit(,27)
> next(11);
> + formats as next;
> encodes as resubmit(,27)
> next(0);
> encodes as resubmit(,16)
> @@ -657,7 +657,7 @@ next();
> next(10;
> Syntax error at `;' expecting `)'.
> next(16);
> - "next" argument must be in range 0 to 15.
> + "next" action cannot advance beyond table 15.
>
> # Loading a constant value.
> tcp.dst=80;
> @@ -678,7 +678,7 @@ ip.ttl=4;
> encodes as set_field:4->nw_ttl
> has prereqs eth.type == 0x800 || eth.type == 0x86dd
> outport="eth0"; next; outport="LOCAL"; next;
> - formats as outport = "eth0"; next(11); outport = "LOCAL"; next(11);
> + formats as outport = "eth0"; next; outport = "LOCAL"; next;
> encodes as set_field:0x5->reg15,resubmit(
> ,27),set_field:0xfffe->reg15,resubmit(,27)
>
> inport[1] = 1;
> @@ -868,7 +868,7 @@ ct_snat();
> Syntax error at `)' expecting IPv4 address.
>
> # clone
> -clone { ip4.dst = 255.255.255.255; output; }; next(11);
> +clone { ip4.dst = 255.255.255.255; output; }; next;
> encodes as clone(set_field:255.255.255.255->ip_dst,resubmit(,64)),
> resubmit(,27)
> has prereqs eth.type == 0x800
>
> --
> 2.10.2
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
More information about the dev
mailing list