void
ofputil_wildcard_from_openflow(uint32_t ofpfw, struct flow_wildcards *wc)
{
+ BUILD_ASSERT_DECL(FLOW_WC_SEQ == 1);
+
/* Initialize most of rule->wc. */
flow_wildcards_init_catchall(wc);
wc->wildcards = (OVS_FORCE flow_wildcards_t) ofpfw & WC_INVARIANTS;
{
const struct flow_wildcards *wc = &rule->wc;
+ BUILD_ASSERT_DECL(FLOW_WC_SEQ == 1);
+
/* Only NXM supports separately wildcards the Ethernet multicast bit. */
if (!(wc->wildcards & FWW_DL_DST) != !(wc->wildcards & FWW_ETH_MCAST)) {
return NXFF_NXM;
return 0;
}
+static int
+check_output_reg(const struct nx_action_output_reg *naor,
+ const struct flow *flow)
+{
+ size_t i;
+
+ for (i = 0; i < sizeof naor->zero; i++) {
+ if (naor->zero[i]) {
+ return ofp_mkerr(OFPET_BAD_ACTION, OFPBAC_BAD_ARGUMENT);
+ }
+ }
+
+ return nxm_src_check(naor->src, nxm_decode_ofs(naor->ofs_nbits),
+ nxm_decode_n_bits(naor->ofs_nbits), flow);
+}
+
int
validate_actions(const union ofp_action *actions, size_t n_actions,
const struct flow *flow, int max_ports)
max_ports, flow);
break;
+ case OFPUTIL_NXAST_OUTPUT_REG:
+ error = check_output_reg((const struct nx_action_output_reg *) a,
+ flow);
+ break;
+
case OFPUTIL_NXAST_RESUBMIT_TABLE:
error = check_resubmit_table(
(const struct nx_action_resubmit *) a);
NXAST_ACTION(NXAST_BUNDLE, struct nx_action_bundle, true);
NXAST_ACTION(NXAST_BUNDLE_LOAD, struct nx_action_bundle, true);
NXAST_ACTION(NXAST_RESUBMIT_TABLE, struct nx_action_resubmit, false);
+ NXAST_ACTION(NXAST_OUTPUT_REG, struct nx_action_output_reg, false);
#undef NXAST_ACTION
case NXAST_SNAT__OBSOLETE: