[ovs-dev] [PATCH] multipath: Correctly calculate number of required destination bits.

Ben Pfaff blp at nicira.com
Fri Jan 13 00:57:01 UTC 2012


Thanks, pushed to master, branch-1.4, branch-1.3.  I think it's also
broken on 1.2, but there are merge conflicts there and it's such a
minor bug that I don't really care enough to resolve them.

On Thu, Jan 12, 2012 at 04:18:33PM -0800, Ethan Jackson wrote:
> Looks good.
> 
> Ethan
> 
> On Tue, Dec 27, 2011 at 13:37, Ben Pfaff <blp at nicira.com> wrote:
> > The previous calculation was wrong when n_links was a power of 2.
> >
> > Reported-by: Paul Ingram <paul at nicira.com>
> > Signed-off-by: Ben Pfaff <blp at nicira.com>
> > ---
> > ?lib/multipath.c | ? ?2 +-
> > ?lib/util.c ? ? ?| ? ?8 ++++++++
> > ?lib/util.h ? ? ?| ? ?1 +
> > ?3 files changed, 10 insertions(+), 1 deletions(-)
> >
> > diff --git a/lib/multipath.c b/lib/multipath.c
> > index f68dafd..adc000d 100644
> > --- a/lib/multipath.c
> > +++ b/lib/multipath.c
> > @@ -37,7 +37,7 @@ int
> > ?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);
> > ? ? int error;
> > diff --git a/lib/util.c b/lib/util.c
> > index e02f59f..8379c9a 100644
> > --- a/lib/util.c
> > +++ b/lib/util.c
> > @@ -664,6 +664,14 @@ log_2_floor(uint32_t n)
> > ?#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)
> > diff --git a/lib/util.h b/lib/util.h
> > index 61039be..b2052f3 100644
> > --- a/lib/util.h
> > +++ b/lib/util.h
> > @@ -203,6 +203,7 @@ char *abs_file_name(const char *dir, const char *file_name);
> >
> > ?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);
> > --
> > 1.7.2.5
> >
> > _______________________________________________
> > dev mailing list
> > dev at openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev



More information about the dev mailing list