summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cesar/cp2/cco/bw/bw.h9
-rw-r--r--cesar/cp2/cco/bw/src/bw.c47
-rw-r--r--cesar/cp2/cco/bw/test/Makefile1
-rw-r--r--cesar/cp2/cco/bw/test/src/bw_list_alloc_test.c1
-rw-r--r--cesar/cp2/cco/bw/test/src/bw_prio_heap_test.c1
-rw-r--r--cesar/cp2/cco/bw/test/src/bw_test.c105
-rw-r--r--cesar/cp2/conn/src/conn_mgr.c7
-rw-r--r--cesar/cp2/conn/src/link.c5
8 files changed, 148 insertions, 28 deletions
diff --git a/cesar/cp2/cco/bw/bw.h b/cesar/cp2/cco/bw/bw.h
index 2e551ceaf8..e83b2a56e8 100644
--- a/cesar/cp2/cco/bw/bw.h
+++ b/cesar/cp2/cco/bw/bw.h
@@ -230,7 +230,14 @@ cp_cco_bw_init (cp_t* ctx);
void
cp_cco_bw_uninit (cp_t* ctx);
-/** Add an allocation
+/** add an allocation to the finalised schedule
+ * \param ctx the control plane context.
+ * \param alloc the allocation.
+ */
+void
+cp_cco_bw_alloc_add_finalised (cp_t *ctx, cp_cco_bw_alloc_t *alloc);
+
+/** add an allocation to the actual schedule
* \param ctx the control plane context.
* \param alloc the allocation.
*/
diff --git a/cesar/cp2/cco/bw/src/bw.c b/cesar/cp2/cco/bw/src/bw.c
index a1285f5110..56971fe7f0 100644
--- a/cesar/cp2/cco/bw/src/bw.c
+++ b/cesar/cp2/cco/bw/src/bw.c
@@ -635,6 +635,34 @@ cp_cco_bw_uninit (cp_t* ctx)
}
void
+cp_cco_bw_alloc_add_finalised (cp_t *ctx, cp_cco_bw_alloc_t *alloc)
+{
+ cp_cco_bw_alloc_t *prev_alloc;
+ cp_cco_bw_alloc_t *next_alloc;
+
+ dbg_assert(ctx);
+ dbg_assert(alloc);
+
+ list_init_node(&alloc->node);
+
+ prev_alloc = cp_cco_bw_get_first_alloc_finalised(ctx);
+ next_alloc = cp_cco_bw_get_next_alloc_finalised(prev_alloc);
+
+ while(next_alloc->et_atu <= alloc->st_atu
+ && next_alloc->et_atu != 0)
+ {
+ prev_alloc = next_alloc;
+ next_alloc = cp_cco_bw_get_next_alloc_finalised(next_alloc);
+ }
+ if (alloc->persistence == CP_CCO_BW_PERSISTENCE_PERSISTENT)
+ ctx->bw.nb_alloc_pers ++;
+ else
+ ctx->bw.nb_alloc_no_pers ++;
+
+ list_insert(&ctx->bw.finalised_schedule, &next_alloc->node, &alloc->node);
+}
+
+void
cp_cco_bw_alloc_add (cp_t *ctx, cp_cco_bw_alloc_t *alloc)
{
cp_cco_bw_alloc_t *prev_alloc;
@@ -731,16 +759,10 @@ cp_cco_bw_alloc_get_next_txop(cp_t *ctx, cp_cco_bw_alloc_t* alloc)
dbg_assert(ctx);
dbg_assert(alloc);
- next_alloc = cp_cco_bw_get_first_alloc_actual(ctx);
-
- /*Reach the previous allocation*/
- while(next_alloc != alloc)
- next_alloc = cp_cco_bw_get_next_alloc_actual(next_alloc);
-
- next_alloc = cp_cco_bw_get_next_alloc_actual(next_alloc);
+ next_alloc = cp_cco_bw_get_next_alloc_actual(alloc);
/*Search for the next allocation*/
- while(cp_cco_bw_get_next_alloc_actual(next_alloc)->cid != alloc->cid)
+ while(next_alloc->cid != alloc->cid)
next_alloc = cp_cco_bw_get_next_alloc_actual(next_alloc);
/*We reached the last alloc and didn't find the one we need*/
@@ -748,7 +770,6 @@ cp_cco_bw_alloc_get_next_txop(cp_t *ctx, cp_cco_bw_alloc_t* alloc)
next_alloc = NULL;
return next_alloc;
-
}
void
@@ -898,7 +919,7 @@ cp_cco_bw_get_first_alloc (cp_t *ctx, cp_cco_bw_persistence_t persistence)
while(&alloc->node != list_rbegin(&ctx->bw.finalised_schedule)
&& alloc->persistence != persistence)
- alloc = cp_cco_bw_get_next_alloc_actual(alloc);
+ alloc = cp_cco_bw_get_next_alloc_finalised(alloc);
if(alloc->persistence != persistence)
alloc = NULL;
@@ -917,11 +938,11 @@ cp_cco_bw_get_next_alloc (cp_t *ctx, cp_cco_bw_alloc_t *prev_alloc)
alloc = PARENT_OF(cp_cco_bw_alloc_t, node,
list_next(&prev_alloc->node));
- while(alloc && &alloc->node != list_rbegin(&ctx->bw.finalised_schedule)
+ while(&alloc->node != list_rbegin(&ctx->bw.finalised_schedule)
&& alloc->persistence != prev_alloc->persistence)
- alloc = cp_cco_bw_get_next_alloc(ctx, alloc);
+ alloc = cp_cco_bw_get_next_alloc_finalised(alloc);
- if(alloc && alloc->persistence != prev_alloc->persistence)
+ if(alloc->persistence != prev_alloc->persistence)
alloc = NULL;
return alloc;
diff --git a/cesar/cp2/cco/bw/test/Makefile b/cesar/cp2/cco/bw/test/Makefile
index 5181af5094..5cd23d015a 100644
--- a/cesar/cp2/cco/bw/test/Makefile
+++ b/cesar/cp2/cco/bw/test/Makefile
@@ -1,6 +1,5 @@
BASE = ../../../..
-COV=y
ECOS=y
INCLUDES = cp2/cco/bw/test/overide/
diff --git a/cesar/cp2/cco/bw/test/src/bw_list_alloc_test.c b/cesar/cp2/cco/bw/test/src/bw_list_alloc_test.c
index f4feb980d7..aa80f52ccc 100644
--- a/cesar/cp2/cco/bw/test/src/bw_list_alloc_test.c
+++ b/cesar/cp2/cco/bw/test/src/bw_list_alloc_test.c
@@ -97,6 +97,7 @@ main (void)
test_end;
test_result (test);
+ HAL_PLATFORM_EXIT(test_nb_failed (test) == 0 ? 0 : 1);
return test_nb_failed (test) == 0 ? 0 : 1;
}
diff --git a/cesar/cp2/cco/bw/test/src/bw_prio_heap_test.c b/cesar/cp2/cco/bw/test/src/bw_prio_heap_test.c
index 5a1c7cab73..e4104baaa5 100644
--- a/cesar/cp2/cco/bw/test/src/bw_prio_heap_test.c
+++ b/cesar/cp2/cco/bw/test/src/bw_prio_heap_test.c
@@ -313,6 +313,7 @@ main (void){
test_case_bw_prio_heap_del_conns (test);
test_result (test);
+ HAL_PLATFORM_EXIT(test_nb_failed (test) == 0 ? 0 : 1);
return test_nb_failed (test) == 0 ? 0 : 1;
}
diff --git a/cesar/cp2/cco/bw/test/src/bw_test.c b/cesar/cp2/cco/bw/test/src/bw_test.c
index 099dbdea22..e781a848c9 100644
--- a/cesar/cp2/cco/bw/test/src/bw_test.c
+++ b/cesar/cp2/cco/bw/test/src/bw_test.c
@@ -768,6 +768,7 @@ test_case_allocate_multiple_txop (test_t test)
cp_t cp;
cp_conn_t *conn[2];
cp_cco_bw_alloc_t *alloc_test[7];
+ cp_cco_bw_alloc_t *txop[2];
u16 j;
test_case_bw_init(test, &cp);
@@ -809,12 +810,22 @@ test_case_allocate_multiple_txop (test_t test)
for(j = 1 ; j < 7 ; j++)
alloc_test[j] = cp_cco_bw_get_next_alloc_actual(alloc_test[j-1]);
+ txop[0] = cp_cco_bw_alloc_get_first_txop(&cp, 200);
+ txop[1] = cp_cco_bw_alloc_get_next_txop(&cp, txop[0]);
+
test_case_begin(test, "Allocation with multiple TXOPs");
test_begin(test, "multiple TXOPs")
{
- test_fail_if(alloc_test[4]->cid != 200,"wrong allocation");
- test_fail_if(alloc_test[5]->cid != 200,"wrong allocation");
- test_fail_if(alloc_test[6]->glid != MAC_LID_LOCAL_CSMA,"wrong allocation");
+ test_fail_if(alloc_test[4]->cid != 200,
+ "wrong allocation");
+ test_fail_if(alloc_test[5]->cid != 200,
+ "wrong allocation");
+ test_fail_if(alloc_test[6]->glid != MAC_LID_LOCAL_CSMA,
+ "wrong allocation");
+ test_fail_if(txop[0]!= alloc_test[4],
+ "Wrong first TXOP");
+ test_fail_if(txop[1]!= alloc_test[5],
+ "Wrong next TXOP");
}
test_end;
@@ -947,7 +958,7 @@ test_case_finalise_sched (test_t test, int test_id)
cp_t cp;
cp_cco_bw_alloc_t *alloc_tmp;
- cp_cco_bw_alloc_t *alloc_test[23];
+ cp_cco_bw_alloc_t *alloc_test[24];
/*Initiate the bw context and conn context*/
test_case_bw_init(test, &cp);
@@ -965,6 +976,11 @@ test_case_finalise_sched (test_t test, int test_id)
alloc_tmp->cid = alloc[i].cid;
cp_cco_bw_alloc_add(&cp, alloc_tmp);
}
+ alloc_tmp = blk_alloc();
+ alloc_tmp->st_atu = 3850;
+ alloc_tmp->et_atu = 3852;
+ alloc_tmp->cid = 0;
+ cp_cco_bw_alloc_add(&cp, alloc_tmp);
test_case_begin(test, "Finalise Schedule");
@@ -972,9 +988,8 @@ test_case_finalise_sched (test_t test, int test_id)
alloc_test[0] = cp_cco_bw_get_first_alloc_finalised(&cp);
- for(i=1;i<23;i++)
+ for(i=1;i<24;i++)
alloc_test[i] = cp_cco_bw_get_next_alloc_finalised(alloc_test[i-1]);
-
test_begin(test, "Finalise Schedule")
{
test_fail_if(alloc_test[3]->st_atu != 678,"wrong start time");
@@ -993,14 +1008,84 @@ test_case_finalise_sched (test_t test, int test_id)
test_fail_if(alloc_test[15]->et_atu != 2925,"wrong end time");
test_fail_if(alloc_test[15]->glid != MAC_LID_LOCAL_CSMA,"wrong GLID");
- test_fail_if(alloc_test[22]->st_atu != 3874,"wrong start time");
- test_fail_if(alloc_test[22]->et_atu != 3906,"wrong end time");
+ test_fail_if(alloc_test[20]->st_atu != 3838,"wrong start time 20");
+ test_fail_if(alloc_test[20]->et_atu != 3850,"wrong end time 20");
+ test_fail_if(alloc_test[20]->glid == MAC_LID_LOCAL_CSMA,"wrong GLID");
+
+ test_fail_if(alloc_test[23]->st_atu != 3874,"wrong start time 22");
+ test_fail_if(alloc_test[23]->et_atu != 3906,"wrong end time 22");
}
test_end;
}
test_case_bw_uninit(test, &cp);
}
+void
+test_case_get_alloc_from_persistence (test_t test)
+{
+ cp_t cp;
+ u16 nb_alloc = 3;
+ u16 i;
+ cp_cco_bw_alloc_t *alloc_persistent;
+ cp_cco_bw_alloc_t *alloc_not_persistent;
+ cp_cco_bw_alloc_t *test_alloc_persistent[3];
+ cp_cco_bw_alloc_t *test_alloc_not_persistent[3];
+ u16 test_nb_alloc_persistent;
+ u16 test_nb_alloc_not_persistent;
+
+ test_case_bw_init(test, &cp);
+
+ test_case_begin(test, "Alloc from persistence");
+
+ for(i=0; i< nb_alloc; i++)
+ {
+ alloc_persistent = blk_alloc();
+ alloc_persistent->st_atu = i*10;
+ alloc_persistent->et_atu = alloc_persistent->st_atu + 1;
+ alloc_persistent->persistence = CP_CCO_BW_PERSISTENCE_PERSISTENT;
+ cp_cco_bw_alloc_add_finalised(&cp, alloc_persistent);
+
+ alloc_not_persistent = blk_alloc();
+ alloc_not_persistent->st_atu = i*100;
+ alloc_not_persistent->et_atu = alloc_not_persistent->st_atu + 1;
+ alloc_not_persistent->persistence = CP_CCO_BW_PERSISTENCE_NOT_PERSISTENT;
+ cp_cco_bw_alloc_add_finalised(&cp, alloc_not_persistent);
+ }
+ test_alloc_persistent[0] = cp_cco_bw_get_first_alloc(&cp, CP_CCO_BW_PERSISTENCE_PERSISTENT);
+ test_alloc_not_persistent[0] = cp_cco_bw_get_first_alloc(&cp, CP_CCO_BW_PERSISTENCE_NOT_PERSISTENT);
+
+ for(i=1 ;i<nb_alloc ;i++)
+ {
+ test_alloc_persistent[i] = cp_cco_bw_get_next_alloc(&cp,
+ test_alloc_persistent[i-1]);
+ test_alloc_not_persistent[i] = cp_cco_bw_get_next_alloc(&cp,
+ test_alloc_not_persistent[i-1]);
+ }
+ test_nb_alloc_persistent = cp_cco_bw_get_nb_alloc(&cp, CP_CCO_BW_PERSISTENCE_PERSISTENT);
+ test_nb_alloc_not_persistent = cp_cco_bw_get_nb_alloc(&cp, CP_CCO_BW_PERSISTENCE_NOT_PERSISTENT);
+
+ test_begin(test,"Alloc from persistence")
+ {
+ test_fail_if(test_alloc_persistent[0]->persistence != CP_CCO_BW_PERSISTENCE_PERSISTENT,
+ "Allocation persistence pb");
+ test_fail_if(test_alloc_persistent[1]->persistence != CP_CCO_BW_PERSISTENCE_PERSISTENT,
+ "Allocation persistence pb");
+ test_fail_if(test_alloc_persistent[2]->persistence != CP_CCO_BW_PERSISTENCE_PERSISTENT,
+ "Allocation persistence pb");
+ test_fail_if(test_alloc_not_persistent[0]->persistence != CP_CCO_BW_PERSISTENCE_NOT_PERSISTENT,
+ "Allocation persistence pb");
+ test_fail_if(test_alloc_not_persistent[1]->persistence != CP_CCO_BW_PERSISTENCE_NOT_PERSISTENT,
+ "Allocation persistence pb");
+ test_fail_if(test_alloc_not_persistent[2]->persistence != CP_CCO_BW_PERSISTENCE_NOT_PERSISTENT,
+ "Allocation persistence pb");
+ test_fail_if(test_nb_alloc_persistent != 3,
+ "Wrong number of allocation persistent");
+ test_fail_if(test_nb_alloc_not_persistent != 3,
+ "Wrong number of allocation not persistent");
+ }
+ test_end;
+ test_case_bw_uninit(test, &cp);
+}
int
main (void){
@@ -1010,6 +1095,8 @@ main (void){
test_init(test, 0, NULL);
+ test_case_get_alloc_from_persistence (test);
+
test_case_allocate_proxy(test);
test_case_alloc_discover(test);
@@ -1035,6 +1122,6 @@ main (void){
}
test_result (test);
+ HAL_PLATFORM_EXIT(test_nb_failed (test) == 0 ? 0 : 1);
return test_nb_failed (test) == 0 ? 0 : 1;
-
}
diff --git a/cesar/cp2/conn/src/conn_mgr.c b/cesar/cp2/conn/src/conn_mgr.c
index 2ffcb25f0f..ae21f1a452 100644
--- a/cesar/cp2/conn/src/conn_mgr.c
+++ b/cesar/cp2/conn/src/conn_mgr.c
@@ -42,10 +42,11 @@ cp_conn_mgr_uninit(cp_t *ctx)
dbg_assert(ctx);
-
while(!list_empty(&ctx->conn_mgr.conns))
{
- conn = PARENT_OF(cp_conn_t, node , list_begin(&ctx->conn_mgr.conns));
+ conn = PARENT_OF(cp_conn_t, node, list_begin(&ctx->conn_mgr.conns));
+ cp_link_uninit(conn->flink);
+ cp_link_uninit(conn->rlink);
list_remove(&ctx->conn_mgr.conns, &conn->node);
blk_release(conn);
}
@@ -135,9 +136,11 @@ cp_conn_mgr_process_cm_conn_new_cnf(cp_t *ctx, cp_mme_rx_t *mme)
cp_msg_apcm_conn_add_cnf_send(ctx,
mme->peer,
&send_data);
+ /* Valid result */
if(!received_data.result)
conn->rlink->llid = received_data.llid_r;
+ /* Unvalid result */
else
cp_conn_del_conn(ctx, received_data.cid);
}
diff --git a/cesar/cp2/conn/src/link.c b/cesar/cp2/conn/src/link.c
index de87e27000..97bccd1aab 100644
--- a/cesar/cp2/conn/src/link.c
+++ b/cesar/cp2/conn/src/link.c
@@ -25,6 +25,8 @@
#include "cp2/conn/link.h"
#include "cp2/conn/inc/link.h"
+#include <stdio.h>
+
cp_link_t*
cp_link_init (void)
{
@@ -45,12 +47,12 @@ cp_link_uninit (cp_link_t *link)
blk_release(link->cinfo);
blk_release(link->qmp);
cp_link_release_ble (link);
+ blk_release(link);
}
void
cp_link_push_ble(cp_link_t *link, u16 ble, u16 et_atu)
{
-
cp_link_ble_interval_t *new;
dbg_assert(link);
@@ -69,7 +71,6 @@ cp_link_release_ble(cp_link_t *link)
dbg_assert(link);
cp_link_ble_interval_t *tmp_ble;
-
while(!list_empty(&link->list_ble))
{
tmp_ble = PARENT_OF(cp_link_ble_interval_t,