address-pool: fix address increment
authorWim Taymans <wim.taymans@gmail.com>
Tue, 12 Nov 2013 15:52:35 +0000 (16:52 +0100)
committerWim Taymans <wim.taymans@gmail.com>
Tue, 12 Nov 2013 15:54:59 +0000 (16:54 +0100)
Use a guint instead of guint8 to increment the address. It's still not
completely correct because a guint might not be able to hold the complete
address range, but that's an enhacement for later.
Add unit test to test improved behaviour.

https://bugzilla.gnome.org/show_bug.cgi?id=708237

gst/rtsp-server/rtsp-address-pool.c
tests/check/gst/addresspool.c

index e1e9b91..4f433be 100644 (file)
@@ -328,7 +328,7 @@ invalid:
 }
 
 static void
-inc_address (Addr * addr, guint8 count)
+inc_address (Addr * addr, guint count)
 {
   gint i;
   guint carry;
@@ -342,7 +342,6 @@ inc_address (Addr * addr, guint8 count)
 }
 
 /* tells us the number of addresses between min_addr and max_addr */
-
 static guint
 diff_address (Addr * max_addr, Addr * min_addr)
 {
@@ -361,7 +360,6 @@ diff_address (Addr * max_addr, Addr * min_addr)
   return result;
 }
 
-
 static AddrRange *
 split_range (GstRTSPAddressPool * pool, AddrRange * range, guint skip_addr,
     guint skip_port, gint n_ports)
@@ -673,11 +671,13 @@ gst_rtsp_address_pool_reserve_address (GstRTSPAddressPool * pool,
       ttl);
   if (list != NULL) {
     AddrRange *range = list->data;
-    gint skip_port, skip_addr;
+    guint skip_port, skip_addr;
 
     skip_addr = diff_address (&input_addr, &range->min);
     skip_port = port - range->min.port;
 
+    GST_DEBUG_OBJECT (pool, "diff 0x%08x/%u", skip_addr, skip_port);
+
     /* we found a range, remove from the list */
     priv->addresses = g_list_delete_link (priv->addresses, list);
     /* now split and exit our loop */
index b3ca24d..9a0ff54 100644 (file)
@@ -236,6 +236,34 @@ GST_START_TEST (test_pool)
   fail_unless (!strcmp (addr->address, "192.168.1.1"));
   gst_rtsp_address_free (addr);
 
+  fail_unless (gst_rtsp_address_pool_add_range (pool,
+          GST_RTSP_ADDRESS_POOL_ANY_IPV4, GST_RTSP_ADDRESS_POOL_ANY_IPV4, 5000,
+          5001, 0));
+  res =
+      gst_rtsp_address_pool_reserve_address (pool, "192.168.0.1", 5000, 1, 0,
+      &addr);
+  fail_unless (res == GST_RTSP_ADDRESS_POOL_ERANGE);
+  res =
+      gst_rtsp_address_pool_reserve_address (pool, "0.0.0.0", 5000, 1, 0,
+      &addr);
+  fail_unless (res == GST_RTSP_ADDRESS_POOL_OK);
+  gst_rtsp_address_free (addr);
+  gst_rtsp_address_pool_clear (pool);
+
+  /* Error case 2. Using ANY as min address makes it possible to allocate the
+   * same address twice */
+  fail_unless (gst_rtsp_address_pool_add_range (pool,
+          GST_RTSP_ADDRESS_POOL_ANY_IPV4, "255.255.255.255", 5000, 5001, 0));
+  res =
+      gst_rtsp_address_pool_reserve_address (pool, "192.168.0.1", 5000, 1, 0,
+      &addr);
+  fail_unless (res == GST_RTSP_ADDRESS_POOL_OK);
+  res =
+      gst_rtsp_address_pool_reserve_address (pool, "192.168.0.1", 5000, 1, 0,
+      &addr2);
+  fail_unless (res == GST_RTSP_ADDRESS_POOL_ERESERVED);
+  gst_rtsp_address_free (addr);
+  gst_rtsp_address_pool_clear (pool);
 
   g_object_unref (pool);
 }