The previous calculation was wrong when n_links was a power of 2.
Reported-by: Paul Ingram <paul@nicira.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
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;
+ size_t min_n_bits = log_2_ceil(n_links);
int ofs = nxm_decode_ofs(mp->ofs_nbits);
int n_bits = nxm_decode_n_bits(mp->ofs_nbits);
enum ofperr error;
#endif
}
+/* Given a 32 bit word 'n', calculates ceil(log_2('n')). It is an error to
+ * call this function with 'n' == 0. */
+int
+log_2_ceil(uint32_t n)
+{
+ return log_2_floor(n) + !IS_POW2(n);
+}
+
/* Returns the number of trailing 0-bits in 'n', or 32 if 'n' is 0. */
int
ctz(uint32_t n)
void ignore(bool x OVS_UNUSED);
int log_2_floor(uint32_t);
+int log_2_ceil(uint32_t);
int ctz(uint32_t);
bool is_all_zeros(const uint8_t *, size_t);