From: Holger Hans Peter Freyther <[email protected]>

* Test that one can get an id
* That they are assigned predicatble right now
* That returning them will make the number of used ones go down
* That allocating more will fail
---
 openbsc/include/openbsc/osmux.h  |  1 +
 openbsc/src/libmgcp/mgcp_osmux.c | 14 ++++++++++++++
 openbsc/tests/mgcp/mgcp_test.c   | 26 ++++++++++++++++++++++++++
 3 files changed, 41 insertions(+)

diff --git a/openbsc/include/openbsc/osmux.h b/openbsc/include/openbsc/osmux.h
index 8c01fd0..0e727d5 100644
--- a/openbsc/include/openbsc/osmux.h
+++ b/openbsc/include/openbsc/osmux.h
@@ -22,6 +22,7 @@ int osmux_send_dummy(struct mgcp_endpoint *endp);

 int osmux_get_cid(void);
 void osmux_put_cid(uint8_t osmux_cid);
+int osmux_used_cid(void);

 enum osmux_state {
        OSMUX_STATE_DISABLED = 0,
diff --git a/openbsc/src/libmgcp/mgcp_osmux.c b/openbsc/src/libmgcp/mgcp_osmux.c
index 90b7368..b0ef69f 100644
--- a/openbsc/src/libmgcp/mgcp_osmux.c
+++ b/openbsc/src/libmgcp/mgcp_osmux.c
@@ -532,6 +532,20 @@ int osmux_send_dummy(struct mgcp_endpoint *endp)
 /* bsc-nat allocates/releases the Osmux circuit ID */
 static uint8_t osmux_cid_bitmap[16];

+int osmux_used_cid(void)
+{
+       int i, j, used = 0;
+
+       for (i = 0; i < sizeof(osmux_cid_bitmap) / 8; i++) {
+               for (j = 0; j < 8; j++) {
+                       if (osmux_cid_bitmap[i] & (1 << j))
+                               used += 1;
+               }
+       }
+
+       return used;
+}
+
 int osmux_get_cid(void)
 {
        int i, j;
diff --git a/openbsc/tests/mgcp/mgcp_test.c b/openbsc/tests/mgcp/mgcp_test.c
index b2cb938..7b5de31 100644
--- a/openbsc/tests/mgcp/mgcp_test.c
+++ b/openbsc/tests/mgcp/mgcp_test.c
@@ -1175,6 +1175,31 @@ static void test_no_name(void)
        talloc_free(cfg);
 }

+static void test_osmux_cid(void)
+{
+       int id, i;
+
+       OSMO_ASSERT(osmux_used_cid() == 0);
+       id = osmux_get_cid();
+       OSMO_ASSERT(id == 0);
+       OSMO_ASSERT(osmux_used_cid() == 1);
+       osmux_put_cid(id);
+       OSMO_ASSERT(osmux_used_cid() == 0);
+
+       for (i = 0; i < 16; ++i) {
+               id = osmux_get_cid();
+               OSMO_ASSERT(id == i);
+               OSMO_ASSERT(osmux_used_cid() == i + 1);
+       }
+
+       id = osmux_get_cid();
+       OSMO_ASSERT(id == -1);
+
+       for (i = 0; i < 256; ++i)
+               osmux_put_cid(i);
+       OSMO_ASSERT(osmux_used_cid() == 0);
+}
+
 int main(int argc, char **argv)
 {
        osmo_init_logging(&log_info);
@@ -1193,6 +1218,7 @@ int main(int argc, char **argv)
        test_multilple_codec();
        test_no_cycle();
        test_no_name();
+       test_osmux_cid();

        printf("Done\n");
        return EXIT_SUCCESS;
-- 
2.6.0

Reply via email to