int ofs = nxm_decode_ofs(mp->ofs_nbits);
int n_bits = nxm_decode_n_bits(mp->ofs_nbits);
- if (mp->fields != htons(NX_MP_FIELDS_ETH_SRC)
- && mp->fields != htons(NX_MP_FIELDS_SYMMETRIC_L4)) {
+ if (!flow_hash_fields_valid(ntohs(mp->fields))) {
VLOG_WARN_RL(&rl, "unsupported fields %"PRIu16, ntohs(mp->fields));
} else if (mp->algorithm != htons(NX_MP_ALG_MODULO_N)
&& mp->algorithm != htons(NX_MP_ALG_HASH_THRESHOLD)
\f
/* multipath_execute(). */
-static uint32_t multipath_hash(const struct flow *, enum nx_mp_fields,
- uint16_t basis);
static uint16_t multipath_algorithm(uint32_t hash, enum nx_mp_algorithm,
unsigned int n_links, unsigned int arg);
multipath_execute(const struct nx_action_multipath *mp, struct flow *flow)
{
/* Calculate value to store. */
- uint32_t hash = multipath_hash(flow, ntohs(mp->fields), ntohs(mp->basis));
+ uint32_t hash = flow_hash_fields(flow, ntohs(mp->fields),
+ ntohs(mp->basis));
uint16_t link = multipath_algorithm(hash, ntohs(mp->algorithm),
ntohs(mp->max_link) + 1,
ntohl(mp->arg));
*reg = (*reg & ~(mask << ofs)) | (link << ofs);
}
-static uint32_t
-multipath_hash(const struct flow *flow, enum nx_mp_fields fields,
- uint16_t basis)
-{
- switch (fields) {
- case NX_MP_FIELDS_ETH_SRC:
- return hash_bytes(flow->dl_src, sizeof flow->dl_src, basis);
-
- case NX_MP_FIELDS_SYMMETRIC_L4:
- return flow_hash_symmetric_l4(flow, basis);
- }
-
- NOT_REACHED();
-}
-
static uint16_t
algorithm_hrw(uint32_t hash, unsigned int n_links)
{
mp->vendor = htonl(NX_VENDOR_ID);
mp->subtype = htons(NXAST_MULTIPATH);
if (!strcasecmp(fields, "eth_src")) {
- mp->fields = htons(NX_MP_FIELDS_ETH_SRC);
+ mp->fields = htons(NX_HASH_FIELDS_ETH_SRC);
} else if (!strcasecmp(fields, "symmetric_l4")) {
- mp->fields = htons(NX_MP_FIELDS_SYMMETRIC_L4);
+ mp->fields = htons(NX_HASH_FIELDS_SYMMETRIC_L4);
} else {
ovs_fatal(0, "%s: unknown fields `%s'", s_, fields);
}
uint16_t mp_fields = ntohs(mp->fields);
uint16_t mp_algorithm = ntohs(mp->algorithm);
- switch ((enum nx_mp_fields) mp_fields) {
- case NX_MP_FIELDS_ETH_SRC:
- fields = "eth_src";
- break;
- case NX_MP_FIELDS_SYMMETRIC_L4:
- fields = "symmetric_l4";
- break;
- default:
- fields = "<unknown>";
- }
+ fields = flow_hash_fields_to_str(mp_fields);
switch ((enum nx_mp_algorithm) mp_algorithm) {
case NX_MP_ALG_MODULO_N: