#endif
#if FLOW_N_REGS > 7
MFF_REG7, /* be32 */
-#endif
-#if FLOW_N_REGS > 8
-#error
#endif
/* L2. */
MFF_ETH_TYPE, /* be16 */
MFF_VLAN_TCI, /* be16 */
- MFF_VLAN_VID, /* be16 */
- MFF_VLAN_PCP, /* u8 */
+ MFF_DL_VLAN, /* be16 (OpenFlow 1.0 compatibility) */
+ MFF_VLAN_VID, /* be16 (OpenFlow 1.2 compatibility) */
+ MFF_DL_VLAN_PCP, /* u8 (OpenFlow 1.0 compatibility) */
+ MFF_VLAN_PCP, /* be16 (OpenFlow 1.2 compatibility) */
/* L3. */
MFF_IPV4_SRC, /* be32 */
MFF_N_IDS
};
+/* Use this macro as CASE_MFF_REGS: in a switch statement to choose all of the
+ * MFF_REGx cases. */
+#if FLOW_N_REGS == 1
+# define CASE_MFF_REGS \
+ case MFF_REG0
+#elif FLOW_N_REGS == 2
+# define CASE_MFF_REGS \
+ case MFF_REG0: case MFF_REG1
+#elif FLOW_N_REGS == 3
+# define CASE_MFF_REGS \
+ case MFF_REG0: case MFF_REG1: case MFF_REG2
+#elif FLOW_N_REGS == 4
+# define CASE_MFF_REGS \
+ case MFF_REG0: case MFF_REG1: case MFF_REG2: case MFF_REG3
+#elif FLOW_N_REGS == 5
+# define CASE_MFF_REGS \
+ case MFF_REG0: case MFF_REG1: case MFF_REG2: case MFF_REG3: \
+ case MFF_REG4
+#elif FLOW_N_REGS == 6
+# define CASE_MFF_REGS \
+ case MFF_REG0: case MFF_REG1: case MFF_REG2: case MFF_REG3: \
+ case MFF_REG4: case MFF_REG5
+#elif FLOW_N_REGS == 7
+# define CASE_MFF_REGS \
+ case MFF_REG0: case MFF_REG1: case MFF_REG2: case MFF_REG3: \
+ case MFF_REG4: case MFF_REG5: case MFF_REG6
+#elif FLOW_N_REGS == 8
+# define CASE_MFF_REGS \
+ case MFF_REG0: case MFF_REG1: case MFF_REG2: case MFF_REG3: \
+ case MFF_REG4: case MFF_REG5: case MFF_REG6: case MFF_REG7
+#else
+# error
+#endif
+
/* Prerequisites for matching a field.
*
* A field may only be matched if the correct lower-level protocols are also
/* L2 requirements. */
MFP_ARP,
+ MFP_VLAN_VID,
MFP_IPV4,
MFP_IPV6,
MFP_IP_ANY,
/* Subfields. */
void mf_write_subfield(const struct mf_subfield *, const union mf_subvalue *,
struct cls_rule *);
-void mf_set_subfield(const struct mf_subfield *, uint64_t value,
- struct cls_rule *);
-void mf_set_subfield_value(const struct mf_subfield *, uint64_t value,
- struct flow *);
void mf_read_subfield(const struct mf_subfield *, const struct flow *,
union mf_subvalue *);