-/* Converts 'nam' into 'mp'. Returns 0 if successful, otherwise an
- * OFPERR_*. */
-enum ofperr
-multipath_from_openflow(const struct nx_action_multipath *nam,
- struct ofpact_multipath *mp)
-{
- uint32_t n_links = ntohs(nam->max_link) + 1;
- size_t min_n_bits = log_2_ceil(n_links);
-
- ofpact_init_MULTIPATH(mp);
- mp->fields = ntohs(nam->fields);
- mp->basis = ntohs(nam->basis);
- mp->algorithm = ntohs(nam->algorithm);
- mp->max_link = ntohs(nam->max_link);
- mp->arg = ntohl(nam->arg);
- mp->dst.field = mf_from_nxm_header(ntohl(nam->dst));
- mp->dst.ofs = nxm_decode_ofs(nam->ofs_nbits);
- mp->dst.n_bits = nxm_decode_n_bits(nam->ofs_nbits);
-
- if (!flow_hash_fields_valid(mp->fields)) {
- VLOG_WARN_RL(&rl, "unsupported fields %d", (int) mp->fields);
- return OFPERR_OFPBAC_BAD_ARGUMENT;
- } else if (mp->algorithm != NX_MP_ALG_MODULO_N
- && mp->algorithm != NX_MP_ALG_HASH_THRESHOLD
- && mp->algorithm != NX_MP_ALG_HRW
- && mp->algorithm != NX_MP_ALG_ITER_HASH) {
- VLOG_WARN_RL(&rl, "unsupported algorithm %d", (int) mp->algorithm);
- return OFPERR_OFPBAC_BAD_ARGUMENT;
- } else if (mp->dst.n_bits < min_n_bits) {
- VLOG_WARN_RL(&rl, "multipath action requires at least %zu bits for "
- "%"PRIu32" links", min_n_bits, n_links);
- return OFPERR_OFPBAC_BAD_ARGUMENT;
- }
-
- return multipath_check(mp, NULL);
-}
-