When reading in hex strings that form NXM fields, we don't need to
enforce size constraints if the fields are variable length.
Instead, we can set the header size based on the string length.

Signed-off-by: Jesse Gross <je...@nicira.com>
---
 lib/nx-match.c | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/lib/nx-match.c b/lib/nx-match.c
index 3dcee5d..f768dac 100644
--- a/lib/nx-match.c
+++ b/lib/nx-match.c
@@ -1411,6 +1411,8 @@ nx_match_from_string_raw(const char *s, struct ofpbuf *b)
     for (s += strspn(s, ", "); *s; s += strspn(s, ", ")) {
         const char *name;
         uint64_t header;
+        ovs_be64 nw_header;
+        ovs_be64 *header_ptr;
         int name_len;
         size_t n;
 
@@ -1427,11 +1429,25 @@ nx_match_from_string_raw(const char *s, struct ofpbuf 
*b)
 
         s += name_len + 1;
 
-        nx_put_header__(b, header, false);
+        header_ptr = ofpbuf_put_uninit(b, nxm_header_len(header));
         s = ofpbuf_put_hex(b, s, &n);
         if (n != nxm_field_bytes(header)) {
-            ovs_fatal(0, "%.2s: hex digits expected", s);
+            const struct mf_field *field = mf_from_oxm_header(header);
+
+            if (field && field->variable_len && n <= field->n_bytes) {
+                int len = (nxm_hasmask(header) ? n * 2 : n) +
+                          nxm_experimenter_len(header);
+
+                header = NXM_HEADER(nxm_vendor(header), nxm_class(header),
+                                    nxm_field(header),
+                                    nxm_hasmask(header) ? 1 : 0, len);
+            } else {
+                ovs_fatal(0, "%.2s: hex digits expected", s);
+            }
         }
+        nw_header = htonll(header);
+        memcpy(header_ptr, &nw_header, nxm_header_len(header));
+
         if (nxm_hasmask(header)) {
             s += strspn(s, " ");
             if (*s != '/') {
-- 
2.1.0

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to