---
 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

Reply via email to