Skip to content

Commit

Permalink
ovn: Add 128-bit support for ct_label
Browse files Browse the repository at this point in the history
To support 128-bits in ct_label, the value of the ct_label is expected
as a hex string in the 'ct_commit' action.

Added a new accessor in the 'mf_subvalue' struct to access ovs_be128
values.

Signed-off-by: Numan Siddique <[email protected]>
Signed-off-by: Ben Pfaff <[email protected]>
  • Loading branch information
numansiddique authored and blp committed Jul 18, 2016
1 parent e74d157 commit 354b8f2
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 17 deletions.
4 changes: 4 additions & 0 deletions include/openvswitch/meta-flow.h
Original file line number Diff line number Diff line change
Expand Up @@ -2005,6 +2005,10 @@ union mf_subvalue {
ovs_be64 dummy_integer[15];
ovs_be64 integer;
};
struct {
ovs_be128 dummy_be128[7];
ovs_be128 be128_int;
};
struct {
uint8_t dummy_mac[122];
struct eth_addr mac;
Expand Down
6 changes: 0 additions & 6 deletions ovn/TODO
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,6 @@ ovn-sb.xml includes a tentative specification for this action.
IPv6 will probably need an action or actions for ND that is similar to
the "arp" action, and an action for generating

*** ct_label 128-bit support.

We only support 64-bits for the ct_label argument to ct_commit(), but ct_label
is a 128-bit field. The OVN lexer only supports parsing 64-bit integers, but
we can use parse_int_string() to support larger integers.

** IPv6

*** ND versus ARP
Expand Down
18 changes: 10 additions & 8 deletions ovn/lib/actions.c
Original file line number Diff line number Diff line change
Expand Up @@ -879,16 +879,18 @@ parse_ct_commit_arg(struct action_context *ctx,
action_error(ctx, "Expected '=' after argument to ct_commit");
return false;
}

/* ct_label is a 128-bit field. The lexer supports 128-bit
* integers if its a hex string. The ct_label value should be specified
* in hex string if > 64-bits are to be used */
if (ctx->lexer->token.type == LEX_T_INTEGER) {
label_value->be64.lo = ctx->lexer->token.value.integer;
label_value->be64.lo = ctx->lexer->token.value.be128_int.be64.lo;
label_value->be64.hi = ctx->lexer->token.value.be128_int.be64.hi;
} else if (ctx->lexer->token.type == LEX_T_MASKED_INTEGER) {
/* XXX Technically, ct_label is a 128-bit field. The lexer
* only supports 64-bit integers, so that's all we support
* here. More work is needed to use parse_int_string()
* to support the full 128-bits. */
label_value->be64.lo = ctx->lexer->token.value.integer;
label_mask->be64.hi = 0;
label_mask->be64.lo = ctx->lexer->token.mask.integer;
label_value->be64.lo = ctx->lexer->token.value.be128_int.be64.lo;
label_value->be64.hi = ctx->lexer->token.value.be128_int.be64.hi;
label_mask->be64.lo = ctx->lexer->token.mask.be128_int.be64.lo;
label_mask->be64.hi = ctx->lexer->token.mask.be128_int.be64.hi;
} else {
action_error(ctx, "Expected integer after 'ct_label='");
return false;
Expand Down
5 changes: 2 additions & 3 deletions ovn/ovn-sb.xml
Original file line number Diff line number Diff line change
Expand Up @@ -982,9 +982,8 @@
<code>ct_mark</code> and/or <code>ct_label</code> will be set to the
values indicated by <var>value[/mask]</var> on the connection
tracking entry. <code>ct_mark</code> is a 32-bit field.
<code>ct_label</code> is technically a 128-bit field, though OVN
currently only supports 64-bits and will later be extended to
support the full 128-bits.
<code>ct_label</code> is a 128-bit field. The <var>value[/mask]</var>
should be specified in hex string if more than 64bits are to be used.
</p>

<p>
Expand Down
5 changes: 5 additions & 0 deletions tests/ovn.at
Original file line number Diff line number Diff line change
Expand Up @@ -585,6 +585,11 @@ ct_commit(ct_mark=1); => actions=ct(commit,zone=NXM_NX_REG13[0..15],exec(set_fie
ct_commit(ct_mark=1/1); => actions=ct(commit,zone=NXM_NX_REG13[0..15],exec(set_field:0x1/0x1->ct_mark)), prereqs=ip
ct_commit(ct_label=1); => actions=ct(commit,zone=NXM_NX_REG13[0..15],exec(set_field:0x1->ct_label)), prereqs=ip
ct_commit(ct_label=1/1); => actions=ct(commit,zone=NXM_NX_REG13[0..15],exec(set_field:0x1/0x1->ct_label)), prereqs=ip
ct_commit(ct_label=0x01020304050607080910111213141516); => actions=ct(commit,zone=NXM_NX_REG13[0..15],exec(set_field:0x1020304050607080910111213141516->ct_label)), prereqs=ip
ct_commit(ct_label=0x181716151413121110090807060504030201); => actions=ct(commit,zone=NXM_NX_REG13[0..15],exec(set_field:0x16151413121110090807060504030201->ct_label)), prereqs=ip
ct_commit(ct_label=0x01000000000000000000000000000000/0x01000000000000000000000000000000); => actions=ct(commit,zone=NXM_NX_REG13[0..15],exec(set_field:0x1000000000000000000000000000000/0x1000000000000000000000000000000->ct_label)), prereqs=ip
ct_commit(ct_label=18446744073709551615); => actions=ct(commit,zone=NXM_NX_REG13[0..15],exec(set_field:0xffffffffffffffff->ct_label)), prereqs=ip
ct_commit(ct_label=18446744073709551616); => Decimal constants must be less than 2**64.
ct_commit(ct_mark=1, ct_label=2); => actions=ct(commit,zone=NXM_NX_REG13[0..15],exec(set_field:0x1->ct_mark,set_field:0x2->ct_label)), prereqs=ip

# dnat
Expand Down

0 comments on commit 354b8f2

Please sign in to comment.