ofp-print: Print OFPUTIL_NXST_AGGREGATE_REPLY.
[openvswitch] / lib / nx-match.c
index 6c8ee13414bdf72fd4b284cf8387c19f2f3573e7..4821c62b484be891d56109532fef79a83d90c21f 100644 (file)
@@ -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++;
     }