X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fmultipath.c;h=f68dafdc43095d495f13b8db6467d7ec856d9340;hb=431d6a6acf6da61ecfeb433cb1fb10e1b39e9773;hp=96845563b908ea55c03571dd34a9be85c703dfad;hpb=43edca5717cf389eb87850abbf30efc738049921;p=openvswitch diff --git a/lib/multipath.c b/lib/multipath.c index 96845563..f68dafdc 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -38,9 +38,11 @@ multipath_check(const struct nx_action_multipath *mp, const struct flow *flow) { uint32_t n_links = ntohs(mp->max_link) + 1; size_t min_n_bits = log_2_floor(n_links) + 1; + int ofs = nxm_decode_ofs(mp->ofs_nbits); + int n_bits = nxm_decode_n_bits(mp->ofs_nbits); int error; - error = nxm_dst_check(mp->dst, mp->ofs_nbits, min_n_bits, flow); + error = nxm_dst_check(mp->dst, ofs, n_bits, flow); if (error) { return error; } @@ -53,6 +55,9 @@ multipath_check(const struct nx_action_multipath *mp, const struct flow *flow) && mp->algorithm != htons(NX_MP_ALG_ITER_HASH)) { VLOG_WARN_RL(&rl, "unsupported algorithm %"PRIu16, ntohs(mp->algorithm)); + } else if (n_bits < min_n_bits) { + VLOG_WARN_RL(&rl, "multipath action requires at least %zu bits for " + "%"PRIu32" links", min_n_bits, n_links); } else { return 0; } @@ -175,11 +180,7 @@ multipath_parse(struct nx_action_multipath *mp, const char *s_) ovs_fatal(0, "%s: not enough arguments to multipath action", s_); } - memset(mp, 0, sizeof *mp); - mp->type = htons(OFPAT_VENDOR); - mp->len = htons(sizeof *mp); - mp->vendor = htonl(NX_VENDOR_ID); - mp->subtype = htons(NXAST_MULTIPATH); + ofputil_init_NXAST_MULTIPATH(mp); if (!strcasecmp(fields, "eth_src")) { mp->fields = htons(NX_HASH_FIELDS_ETH_SRC); } else if (!strcasecmp(fields, "symmetric_l4")) {