X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fnx-match.c;h=4821c62b484be891d56109532fef79a83d90c21f;hb=a2ad9ecdd0d4ac9a641e8cef1f3f4681fd77d6b1;hp=6c8ee13414bdf72fd4b284cf8387c19f2f3573e7;hpb=66642cb40b12594c62f3d3037f1e4efa528416b7;p=openvswitch diff --git a/lib/nx-match.c b/lib/nx-match.c index 6c8ee134..4821c62b 100644 --- a/lib/nx-match.c +++ b/lib/nx-match.c @@ -151,9 +151,9 @@ parse_nx_reg(const struct nxm_field *f, } 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; } @@ -169,7 +169,7 @@ parse_nxm_entry(struct cls_rule *rule, const struct nxm_field *f, 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; } @@ -209,7 +209,7 @@ parse_nxm_entry(struct cls_rule *rule, const struct nxm_field *f, 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. */ @@ -217,15 +217,15 @@ parse_nxm_entry(struct cls_rule *rule, const struct nxm_field *f, 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; } @@ -247,7 +247,7 @@ parse_nxm_entry(struct cls_rule *rule, const struct nxm_field *f, 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: @@ -255,8 +255,8 @@ parse_nxm_entry(struct cls_rule *rule, const struct nxm_field *f, 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; } @@ -267,7 +267,7 @@ parse_nxm_entry(struct cls_rule *rule, const struct nxm_field *f, 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: @@ -275,8 +275,8 @@ parse_nxm_entry(struct cls_rule *rule, const struct nxm_field *f, 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; } @@ -285,18 +285,18 @@ parse_nxm_entry(struct cls_rule *rule, const struct nxm_field *f, /* 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. */ @@ -309,16 +309,16 @@ parse_nxm_entry(struct cls_rule *rule, const struct nxm_field *f, /* 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. */ @@ -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++; }