2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-29 15:28:56 +00:00

nx-match: Enable parsing string representations of variable fields.

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 <jesse@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
Jesse Gross
2015-05-07 20:11:57 -07:00
parent 4ede8c79eb
commit 00fe22f85b

View File

@@ -1415,6 +1415,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;
@@ -1431,11 +1433,31 @@ 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) {
if (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, "expected to read at most %d bytes but got "
"%"PRIuSIZE, field->n_bytes, n);
}
} else {
ovs_fatal(0, "expected to read %d bytes but got %"PRIuSIZE,
nxm_field_bytes(header), n);
}
}
nw_header = htonll(header);
memcpy(header_ptr, &nw_header, nxm_header_len(header));
if (nxm_hasmask(header)) {
s += strspn(s, " ");
if (*s != '/') {