--- lib/vlan-bitmap.c | 26 ++++++++++++++++++-------- lib/vlan-bitmap.h | 3 +++ 2 files changed, 21 insertions(+), 8 deletions(-)
diff --git a/lib/vlan-bitmap.c b/lib/vlan-bitmap.c index 94059c7..4c5c1eb 100644 --- a/lib/vlan-bitmap.c +++ b/lib/vlan-bitmap.c @@ -24,29 +24,39 @@ unsigned long * vlan_bitmap_from_array(const int64_t *vlans, size_t n_vlans) { unsigned long *b; - size_t i, n; if (!n_vlans) { return NULL; } b = bitmap_allocate(4096); + if (!vlan_bitmap_from_array__(vlans, n_vlans, b)) { + free(b); + return NULL; + } + return b; +} + +/* Adds to 4096-bit VLAN bitmap 'b' a 1-bit in each position in the 'n_vlans' + * bits indicated in 'vlans'. Returns the number of 1-bits added to 'b'. */ +int +vlan_bitmap_from_array__(const int64_t *vlans, size_t n_vlans, + unsigned long int *b) +{ + size_t i; + int n; + n = 0; for (i = 0; i < n_vlans; i++) { int64_t vlan = vlans[i]; - if (vlan >= 0 && vlan < 4096) { + if (vlan >= 0 && vlan < 4096 && !bitmap_is_set(b, vlan)) { bitmap_set1(b, vlan); n++; } } - if (!n) { - free(b); - return NULL; - } - - return b; + return n; } /* Returns true if 'a' and 'b' are the same: either both null or both the same diff --git a/lib/vlan-bitmap.h b/lib/vlan-bitmap.h index 092c2ca..fed0ba1 100644 --- a/lib/vlan-bitmap.h +++ b/lib/vlan-bitmap.h @@ -28,6 +28,9 @@ * This is empirically a useful data structure. */ unsigned long *vlan_bitmap_from_array(const int64_t *vlans, size_t n_vlans); +int vlan_bitmap_from_array__(const int64_t *vlans, size_t n_vlans, + unsigned long int *b); + bool vlan_bitmap_equal(const unsigned long *a, const unsigned long *b); /* Returns a new copy of 'vlans'. */ -- 1.7.4.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev