aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2015-10-02 15:56:35 +0200
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2015-10-12 09:11:25 +0200
commit641d387409b6d11f7166784344701438be1a45e1 (patch)
tree2bc7e13369f0b7eef926f10c1397402b03231c8b
parent2aedfbdfe1dfb4df84418af4bb39c40ca1cc5128 (diff)
osmux: Test cid allocation and de-allocation
* 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
-rw-r--r--openbsc/include/openbsc/osmux.h1
-rw-r--r--openbsc/src/libmgcp/mgcp_osmux.c14
-rw-r--r--openbsc/tests/mgcp/mgcp_test.c26
3 files changed, 41 insertions, 0 deletions
diff --git a/openbsc/include/openbsc/osmux.h b/openbsc/include/openbsc/osmux.h
index 8c01fd00..0e727d5c 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 90b73680..b0ef69fd 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 b2cb938c..7b5de31d 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;