summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorBen Pfaff <blp@nicira.com>2010-12-07 11:04:15 -0800
committerBen Pfaff <blp@nicira.com>2010-12-07 11:04:15 -0800
commit558d80cbfa30f50512dfba23c7bfcb01130a3de8 (patch)
tree2af60bd0244d21e36bb5db9e6a7b742ee763ea38 /lib
parent60d5e0d859c2c04b24cf4283bc764d37911871da (diff)
downloadopenvswitch-558d80cbfa30f50512dfba23c7bfcb01130a3de8.tar.gz
nx-match: Add tests for error return values for unknown NXM fields.
Diffstat (limited to 'lib')
-rw-r--r--lib/nx-match.c41
1 files changed, 27 insertions, 14 deletions
diff --git a/lib/nx-match.c b/lib/nx-match.c
index ea31c79f2..4821c62b4 100644
--- a/lib/nx-match.c
+++ b/lib/nx-match.c
@@ -720,18 +720,28 @@ nx_match_to_string(const uint8_t *p, unsigned int match_len)
return ds_steal_cstr(&s);
}
-static const struct nxm_field *
-lookup_nxm_field(const char *name, int name_len)
+static uint32_t
+parse_nxm_field_name(const char *name, int name_len)
{
const struct nxm_field *f;
+ /* Check whether it's a field name. */
for (f = nxm_fields; f < &nxm_fields[ARRAY_SIZE(nxm_fields)]; f++) {
if (!strncmp(f->name, name, name_len) && f->name[name_len] == '\0') {
- return f;
+ return f->header;
}
}
- return NULL;
+ /* Check whether it's a 32-bit field header value as hex.
+ * (This isn't ordinarily useful except for testing error behavior.) */
+ if (name_len == 8) {
+ uint32_t header = hexits_value(name, name_len, NULL);
+ if (header != UINT_MAX) {
+ return header;
+ }
+ }
+
+ return 0;
}
static const char *
@@ -769,35 +779,38 @@ nx_match_from_string(const char *s, struct ofpbuf *b)
}
for (s += strspn(s, ", "); *s; s += strspn(s, ", ")) {
- const struct nxm_field *f;
+ const char *name;
+ uint32_t header;
int name_len;
+ name = s;
name_len = strcspn(s, "(");
if (s[name_len] != '(') {
ovs_fatal(0, "%s: missing ( at end of nx_match", full_s);
}
- f = lookup_nxm_field(s, name_len);
- if (!f) {
+ header = parse_nxm_field_name(name, name_len);
+ if (!header) {
ovs_fatal(0, "%s: unknown field `%.*s'", full_s, name_len, s);
}
s += name_len + 1;
- nxm_put_header(b, f->header);
- s = parse_hex_bytes(b, s, nxm_field_bytes(f->header));
- if (NXM_HASMASK(f->header)) {
+ nxm_put_header(b, header);
+ s = parse_hex_bytes(b, s, nxm_field_bytes(header));
+ if (NXM_HASMASK(header)) {
s += strspn(s, " ");
if (*s != '/') {
- ovs_fatal(0, "%s: missing / in masked field %s",
- full_s, f->name);
+ ovs_fatal(0, "%s: missing / in masked field %.*s",
+ full_s, name_len, name);
}
- s = parse_hex_bytes(b, s + 1, nxm_field_bytes(f->header));
+ s = parse_hex_bytes(b, s + 1, nxm_field_bytes(header));
}
s += strspn(s, " ");
if (*s != ')') {
- ovs_fatal(0, "%s: missing ) following field %s", full_s, f->name);
+ ovs_fatal(0, "%s: missing ) following field %.*s",
+ full_s, name_len, name);
}
s++;
}