summaryrefslogtreecommitdiff
path: root/ovn
diff options
context:
space:
mode:
authorNuman Siddique <nusiddiq@redhat.com>2016-07-15 20:33:59 +0530
committerBen Pfaff <blp@ovn.org>2016-07-18 11:08:35 -0700
commit354b8f27251bda9b766e95f0cb48799008d6f4fb (patch)
tree2383c448df7b284c4dad76c7aa7bb0530b18e3d4 /ovn
parente74d157aa6f9898f3884f1a3b69da1a248a5790e (diff)
downloadopenvswitch-354b8f27251bda9b766e95f0cb48799008d6f4fb.tar.gz
ovn: Add 128-bit support for ct_label
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 <nusiddiq@redhat.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
Diffstat (limited to 'ovn')
-rw-r--r--ovn/TODO6
-rw-r--r--ovn/lib/actions.c18
-rw-r--r--ovn/ovn-sb.xml5
3 files changed, 12 insertions, 17 deletions
diff --git a/ovn/TODO b/ovn/TODO
index 4f134a4b3..0a6225dbb 100644
--- a/ovn/TODO
+++ b/ovn/TODO
@@ -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
diff --git a/ovn/lib/actions.c b/ovn/lib/actions.c
index 3d10d611e..dda895935 100644
--- a/ovn/lib/actions.c
+++ b/ovn/lib/actions.c
@@ -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;
diff --git a/ovn/ovn-sb.xml b/ovn/ovn-sb.xml
index 7b45bbbcf..1b5bf9e4d 100644
--- a/ovn/ovn-sb.xml
+++ b/ovn/ovn-sb.xml
@@ -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>