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