-enum {
- NXM_INVALID = OFP_MKERR_NICIRA(OFPET_BAD_REQUEST, NXBRC_NXM_INVALID),
- NXM_BAD_TYPE = OFP_MKERR_NICIRA(OFPET_BAD_REQUEST, NXBRC_NXM_BAD_TYPE),
- NXM_BAD_VALUE = OFP_MKERR_NICIRA(OFPET_BAD_REQUEST, NXBRC_NXM_BAD_VALUE),
- NXM_BAD_MASK = OFP_MKERR_NICIRA(OFPET_BAD_REQUEST, NXBRC_NXM_BAD_MASK),
- NXM_BAD_PREREQ = OFP_MKERR_NICIRA(OFPET_BAD_REQUEST, NXBRC_NXM_BAD_PREREQ),
- NXM_DUP_TYPE = OFP_MKERR_NICIRA(OFPET_BAD_REQUEST, NXBRC_NXM_DUP_TYPE),
- BAD_ARGUMENT = OFP_MKERR(OFPET_BAD_ACTION, OFPBAC_BAD_ARGUMENT)
-};
-
-/* For each NXM_* field, define NFI_NXM_* as consecutive integers starting from
- * zero. */
-enum nxm_field_index {
-#define DEFINE_FIELD(HEADER, MFF_ID, WRITABLE) \
- NFI_NXM_##HEADER,
-#include "nx-match.def"
- N_NXM_FIELDS
-};
-
-struct nxm_field {
- struct hmap_node hmap_node;
- enum nxm_field_index index; /* NFI_* value. */
- uint32_t header; /* NXM_* value. */
- enum mf_field_id mf_id; /* MFF_* value. */
- const struct mf_field *mf;
- const char *name; /* "NXM_*" string. */
- bool writable; /* Writable with NXAST_REG_{MOVE,LOAD}? */
-};
-
-/* All the known fields. */
-static struct nxm_field nxm_fields[N_NXM_FIELDS] = {
-#define DEFINE_FIELD(HEADER, MFF_ID, WRITABLE) \
- { HMAP_NODE_NULL_INITIALIZER, NFI_NXM_##HEADER, NXM_##HEADER, \
- MFF_ID, NULL, "NXM_" #HEADER, WRITABLE },
-#include "nx-match.def"
-};
-
-/* Hash table of 'nxm_fields'. */
-static struct hmap all_nxm_fields = HMAP_INITIALIZER(&all_nxm_fields);
-
-static void
-nxm_init(void)
-{
- if (hmap_is_empty(&all_nxm_fields)) {
- int i;
-
- for (i = 0; i < N_NXM_FIELDS; i++) {
- struct nxm_field *f = &nxm_fields[i];
- hmap_insert(&all_nxm_fields, &f->hmap_node,
- hash_int(f->header, 0));
- f->mf = mf_from_id(f->mf_id);
- }
-
- /* Verify that the header values are unique (duplicate "case" values
- * cause a compile error). */
- switch (0) {
-#define DEFINE_FIELD(HEADER, MFF_ID, WRITABLE) \
- case NXM_##HEADER: break;
-#include "nx-match.def"
- }
- }
-}
-
-static const struct nxm_field *
-nxm_field_lookup(uint32_t header)
-{
- struct nxm_field *f;
-
- nxm_init();
-
- HMAP_FOR_EACH_WITH_HASH (f, hmap_node, hash_int(header, 0),
- &all_nxm_fields) {
- if (f->header == header) {
- return f;
- }
- }
-
- return NULL;
-}
-