} else {
flow_wildcards_set_reg_mask(wc, idx,
(NXM_HASMASK(f->header)
- ? ntohl(get_unaligned_u32(maskp))
+ ? ntohl(get_unaligned_be32(maskp))
: UINT32_MAX));
- flow->regs[idx] = ntohl(get_unaligned_u32(value));
+ flow->regs[idx] = ntohl(get_unaligned_be32(value));
flow->regs[idx] &= wc->reg_masks[idx];
return 0;
}
switch (f->index) {
/* Metadata. */
case NFI_NXM_OF_IN_PORT:
- flow->in_port = ntohs(get_unaligned_u16(value));
+ flow->in_port = ntohs(get_unaligned_be16(value));
if (flow->in_port == OFPP_LOCAL) {
flow->in_port = ODPP_LOCAL;
}
memcpy(flow->dl_src, value, ETH_ADDR_LEN);
return 0;
case NFI_NXM_OF_ETH_TYPE:
- flow->dl_type = get_unaligned_u16(value);
+ flow->dl_type = get_unaligned_be16(value);
return 0;
/* 802.1Q header. */
if (wc->vlan_tci_mask) {
return NXM_DUP_TYPE;
} else {
- cls_rule_set_dl_tci(rule, get_unaligned_u16(value));
+ cls_rule_set_dl_tci(rule, get_unaligned_be16(value));
return 0;
}
case NFI_NXM_OF_VLAN_TCI_W:
if (wc->vlan_tci_mask) {
return NXM_DUP_TYPE;
} else {
- cls_rule_set_dl_tci_masked(rule, get_unaligned_u16(value),
- get_unaligned_u16(mask));
+ cls_rule_set_dl_tci_masked(rule, get_unaligned_be16(value),
+ get_unaligned_be16(mask));
return 0;
}
if (wc->nw_src_mask) {
return NXM_DUP_TYPE;
} else {
- cls_rule_set_nw_src(rule, get_unaligned_u32(value));
+ cls_rule_set_nw_src(rule, get_unaligned_be32(value));
return 0;
}
case NFI_NXM_OF_IP_SRC_W:
if (wc->nw_src_mask) {
return NXM_DUP_TYPE;
} else {
- ovs_be32 ip = get_unaligned_u32(value);
- ovs_be32 netmask = get_unaligned_u32(mask);
+ ovs_be32 ip = get_unaligned_be32(value);
+ ovs_be32 netmask = get_unaligned_be32(mask);
if (!cls_rule_set_nw_src_masked(rule, ip, netmask)) {
return NXM_BAD_MASK;
}
if (wc->nw_dst_mask) {
return NXM_DUP_TYPE;
} else {
- cls_rule_set_nw_dst(rule, get_unaligned_u32(value));
+ cls_rule_set_nw_dst(rule, get_unaligned_be32(value));
return 0;
}
case NFI_NXM_OF_IP_DST_W:
if (wc->nw_dst_mask) {
return NXM_DUP_TYPE;
} else {
- ovs_be32 ip = get_unaligned_u32(value);
- ovs_be32 netmask = get_unaligned_u32(mask);
+ ovs_be32 ip = get_unaligned_be32(value);
+ ovs_be32 netmask = get_unaligned_be32(mask);
if (!cls_rule_set_nw_dst_masked(rule, ip, netmask)) {
return NXM_BAD_MASK;
}
/* TCP header. */
case NFI_NXM_OF_TCP_SRC:
- flow->tp_src = get_unaligned_u16(value);
+ flow->tp_src = get_unaligned_be16(value);
return 0;
case NFI_NXM_OF_TCP_DST:
- flow->tp_dst = get_unaligned_u16(value);
+ flow->tp_dst = get_unaligned_be16(value);
return 0;
/* UDP header. */
case NFI_NXM_OF_UDP_SRC:
- flow->tp_src = get_unaligned_u16(value);
+ flow->tp_src = get_unaligned_be16(value);
return 0;
case NFI_NXM_OF_UDP_DST:
- flow->tp_dst = get_unaligned_u16(value);
+ flow->tp_dst = get_unaligned_be16(value);
return 0;
/* ICMP header. */
/* ARP header. */
case NFI_NXM_OF_ARP_OP:
- if (ntohs(get_unaligned_u16(value)) > 255) {
+ if (ntohs(get_unaligned_be16(value)) > 255) {
return NXM_BAD_VALUE;
} else {
- flow->nw_proto = ntohs(get_unaligned_u16(value));
+ flow->nw_proto = ntohs(get_unaligned_be16(value));
return 0;
}
/* Tunnel ID. */
case NFI_NXM_NX_TUN_ID:
- flow->tun_id = htonl(ntohll(get_unaligned_u64(value)));
+ flow->tun_id = htonl(ntohll(get_unaligned_be64(value)));
return 0;
/* Registers. */
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 *
}
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++;
}