Looks Good. Ethan
On Tue, Apr 26, 2011 at 09:24, Ben Pfaff <b...@nicira.com> wrote: > These new semantics are less efficient in the case where the flood_vlans > actually changed, but that should be very rare. > > There are no advantages to this change on its own, but upcoming commits > will add multiple layers between the code supplying the flood_vlans and > actually calling mac_learning_set_flood_vlans(). Consistency in this > multilayered interface seems valuable, and the rest of it does not transfer > ownership from the caller to the callee. > --- > lib/bitmap.h | 8 +++++++- > lib/mac-learning.c | 20 +++++++++++--------- > lib/mac-learning.h | 2 +- > lib/vlan-bitmap.h | 7 +++++++ > vswitchd/bridge.c | 1 + > 5 files changed, 27 insertions(+), 11 deletions(-) > > diff --git a/lib/bitmap.h b/lib/bitmap.h > index fd05d3d..f6feff0 100644 > --- a/lib/bitmap.h > +++ b/lib/bitmap.h > @@ -1,5 +1,5 @@ > /* > - * Copyright (c) 2008, 2009, 2010 Nicira Networks. > + * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks. > * > * Licensed under the Apache License, Version 2.0 (the "License"); > * you may not use this file except in compliance with the License. > @@ -53,6 +53,12 @@ bitmap_allocate(size_t n_bits) > return xzalloc(bitmap_n_bytes(n_bits)); > } > > +static inline unsigned long * > +bitmap_clone(const unsigned long *bitmap, size_t n_bits) > +{ > + return xmemdup(bitmap, bitmap_n_bytes(n_bits)); > +} > + > static inline void > bitmap_free(unsigned long *bitmap) > { > diff --git a/lib/mac-learning.c b/lib/mac-learning.c > index a57bbc7..981578d 100644 > --- a/lib/mac-learning.c > +++ b/lib/mac-learning.c > @@ -139,17 +139,19 @@ mac_learning_destroy(struct mac_learning *ml) > } > > /* Provides a bitmap of VLANs which have learning disabled, that is, VLANs on > - * which all packets are flooded. It takes ownership of the bitmap. Returns > - * true if the set has changed from the previous value. */ > + * which all packets are flooded. Returns true if the set has changed from > the > + * previous value. */ > bool > -mac_learning_set_flood_vlans(struct mac_learning *ml, unsigned long *bitmap) > +mac_learning_set_flood_vlans(struct mac_learning *ml, > + const unsigned long *bitmap) > { > - bool ret = vlan_bitmap_equal(ml->flood_vlans, bitmap); > - > - bitmap_free(ml->flood_vlans); > - ml->flood_vlans = bitmap; > - > - return ret; > + if (vlan_bitmap_equal(ml->flood_vlans, bitmap)) { > + return false; > + } else { > + bitmap_free(ml->flood_vlans); > + ml->flood_vlans = vlan_bitmap_clone(bitmap); > + return true; > + } > } > > static bool > diff --git a/lib/mac-learning.h b/lib/mac-learning.h > index 51a7ac7..d9fa433 100644 > --- a/lib/mac-learning.h > +++ b/lib/mac-learning.h > @@ -96,7 +96,7 @@ void mac_learning_wait(struct mac_learning *); > > /* Configuration. */ > bool mac_learning_set_flood_vlans(struct mac_learning *, > - unsigned long *bitmap); > + const unsigned long *bitmap); > > /* Learning. */ > bool mac_learning_may_learn(const struct mac_learning *, > diff --git a/lib/vlan-bitmap.h b/lib/vlan-bitmap.h > index eca42fe..6d74d40 100644 > --- a/lib/vlan-bitmap.h > +++ b/lib/vlan-bitmap.h > @@ -37,4 +37,11 @@ vlan_bitmap_contains(const unsigned long *vlans, uint16_t > vid) > return !vlans || bitmap_is_set(vlans, vid); > } > > +/* Returns a new copy of 'vlans'. */ > +static inline unsigned long * > +vlan_bitmap_clone(const unsigned long *vlans) > +{ > + return vlans ? bitmap_clone(vlans, 4096) : NULL; > +} > + > #endif /* lib/vlan-bitmap.h */ > diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c > index e3e5a4c..9e9566c 100644 > --- a/vswitchd/bridge.c > +++ b/vswitchd/bridge.c > @@ -3621,6 +3621,7 @@ mirror_reconfigure(struct bridge *br) > bridge_flush(br); > mac_learning_flush(br->ml); > } > + free(rspan_vlans); > } > > static void > -- > 1.7.4.4 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev