#include "flow.h"
#include "nx-match.h"
+#include "ofp-errors.h"
#include "ofp-util.h"
#include "openflow/nicira-ext.h"
#include "vlog.h"
"less than required 65536", s_, n_bits, 1u << n_bits);
}
- memset(ap, 0, sizeof *ap);
- ap->type = htons(OFPAT_VENDOR);
- ap->len = htons(sizeof *ap);
- ap->vendor = htonl(NX_VENDOR_ID);
- ap->subtype = htons(NXAST_AUTOPATH);
+ ofputil_init_NXAST_AUTOPATH(ap);
ap->id = htonl(id_int);
ap->ofs_nbits = nxm_encode_ofs_nbits(ofs, n_bits);
ap->dst = htonl(reg);
free(s);
}
-int
+enum ofperr
autopath_check(const struct nx_action_autopath *ap, const struct flow *flow)
{
- return nxm_dst_check(ap->dst, ap->ofs_nbits, 16, flow);
+ int n_bits = nxm_decode_n_bits(ap->ofs_nbits);
+ int ofs = nxm_decode_ofs(ap->ofs_nbits);
+
+ if (n_bits < 16) {
+ VLOG_WARN("at least 16 bit destination is required for autopath "
+ "action.");
+ return OFPERR_OFPBAC_BAD_ARGUMENT;
+ }
+
+ return nxm_dst_check(ap->dst, ofs, n_bits, flow);
}