Skip to content

Commit

Permalink
Adaptation layer MCPS confirmation handle update
Browse files Browse the repository at this point in the history
Revert earlier added feature:
Adaptatio layer push MAC buffer back to direct access queue when status is MLME_TRANSACTION_OVERFLOW.
  • Loading branch information
Juha Heiuskanen committed Dec 11, 2020
1 parent e483a07 commit f68126b
Show file tree
Hide file tree
Showing 5 changed files with 9 additions and 226 deletions.
1 change: 0 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
* Prevent sending broadcast frames on unicast channel
* Delay sending of the first DIO message until parent selection is made and DAO target is published. Fix is made to avoid sending of DIO messages to the unstable network.
* Accept only next possible BSI for detect BR reboot. This fix a bug when PAN timeout happen and node join correctly to new but hear old BSI after that.
* Adaptation layer push buffer back to queue when confirmation status is MLME_TRANSACTION_OVERFLOW and block new MAC data request until it got proper confirmation status.
* Corrected radius message memory allocation by adding NULL check to recover from memory exhaustion.


Expand Down
45 changes: 9 additions & 36 deletions source/6LoWPAN/adaptation_interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,6 @@ typedef NS_LIST_HEAD(fragmenter_tx_entry_t, link) fragmenter_tx_list_t;

typedef struct {
int8_t interface_id;
bool mac_tx_overflow_reported;
uint16_t local_frag_tag;
uint8_t msduHandle;
fragmenter_tx_list_t indirect_tx_queue;
Expand Down Expand Up @@ -117,7 +116,7 @@ static NS_LIST_DEFINE(fragmenter_interface_list, fragmenter_interface_t, link);
static fragmenter_interface_t *lowpan_adaptation_interface_discover(int8_t interfaceId);

/* Interface direct message pending queue functions */
static void lowpan_adaptation_tx_queue_write(fragmenter_interface_t *interface_ptr, buffer_t *buf, bool push_to_first);
static void lowpan_adaptation_tx_queue_write(fragmenter_interface_t *interface_ptr, buffer_t *buf);
static buffer_t *lowpan_adaptation_tx_queue_read(fragmenter_interface_t *interface_ptr);

/* Data direction and message length validation */
Expand Down Expand Up @@ -221,17 +220,13 @@ static void lowpan_adaptation_tx_queue_level_update(fragmenter_interface_t *inte
}


static void lowpan_adaptation_tx_queue_write(fragmenter_interface_t *interface_ptr, buffer_t *buf, bool push_to_first)
static void lowpan_adaptation_tx_queue_write(fragmenter_interface_t *interface_ptr, buffer_t *buf)
{
buffer_t *lower_priority_buf = NULL;

ns_list_foreach(buffer_t, cur, &interface_ptr->directTxQueue) {

if (cur->priority <= buf->priority) {
if (!push_to_first && cur->priority == buf->priority) {
//We need to add after same similar priority
continue;
}
if (cur->priority < buf->priority) {
lower_priority_buf = cur;
break;
}
Expand Down Expand Up @@ -393,7 +388,6 @@ int8_t lowpan_adaptation_interface_init(int8_t interface_id, uint16_t mac_mtu_si
interface_ptr->activeTxList_size = 0;
interface_ptr->directTxQueue_size = 0;
interface_ptr->directTxQueue_level = 0;
interface_ptr->mac_tx_overflow_reported = false;

ns_list_add_to_end(&fragmenter_interface_list, interface_ptr);

Expand All @@ -420,7 +414,6 @@ int8_t lowpan_adaptation_interface_free(int8_t interface_id)
//free active tx process
lowpan_list_free(&interface_ptr->activeUnicastList, false);
interface_ptr->activeTxList_size = 0;
interface_ptr->mac_tx_overflow_reported = false;
lowpan_active_buffer_state_reset(&interface_ptr->active_broadcast_tx_buf);

//Free Indirect entry
Expand Down Expand Up @@ -448,7 +441,6 @@ int8_t lowpan_adaptation_interface_reset(int8_t interface_id)
//free active tx process
lowpan_list_free(&interface_ptr->activeUnicastList, false);
interface_ptr->activeTxList_size = 0;
interface_ptr->mac_tx_overflow_reported = false;
lowpan_active_buffer_state_reset(&interface_ptr->active_broadcast_tx_buf);
//Clean fragmented message flag
interface_ptr->fragmenter_active = false;
Expand Down Expand Up @@ -1007,12 +999,9 @@ static bool lowpan_buffer_tx_allowed(fragmenter_interface_t *interface_ptr, buff
return false;
}

if (is_unicast && interface_ptr->activeTxList_size) {
if (interface_ptr->mac_tx_overflow_reported ||
interface_ptr->activeTxList_size >= LOWPAN_ACTIVE_UNICAST_ONGOING_MAX) {
//New TX is not possible if last confirmation was overflow and there is already active connecting
return false;
}
if (is_unicast && interface_ptr->activeTxList_size >= LOWPAN_ACTIVE_UNICAST_ONGOING_MAX) {
//New TX is not possible there is already too manyactive connecting
return false;
}


Expand Down Expand Up @@ -1079,7 +1068,7 @@ int8_t lowpan_adaptation_interface_tx(protocol_interface_info_entry_t *cur, buff
}
}

lowpan_adaptation_tx_queue_write(interface_ptr, buf, false);
lowpan_adaptation_tx_queue_write(interface_ptr, buf);
random_early_detetction_aq_calc(cur->random_early_detection, interface_ptr->directTxQueue_size);
return 0;
}
Expand Down Expand Up @@ -1276,8 +1265,6 @@ int8_t lowpan_adaptation_interface_tx_confirm(protocol_interface_info_entry_t *c
tr_error("No data request for this confirmation %u", confirm->msduHandle);
return -1;
}
//Clear overflow status when got confirmation
interface_ptr->mac_tx_overflow_reported = false;
//Check status for
buffer_t *buf = tx_ptr->buf;

Expand Down Expand Up @@ -1325,23 +1312,9 @@ int8_t lowpan_adaptation_interface_tx_confirm(protocol_interface_info_entry_t *c
lowpan_data_request_to_mac(cur, buf, tx_ptr, interface_ptr);
} else {

//Accept only unicast packet back to queue
if (confirm->status == MLME_TRANSACTION_OVERFLOW && buf->link_specific.ieee802_15_4.requestAck) {
if (interface_ptr->activeTxList_size > 1) {
//We still have more than this packet

if (tx_ptr->fragmented_data && active_direct_confirm) {
interface_ptr->fragmenter_active = false;
}
interface_ptr->mac_tx_overflow_reported = true;
//Push Buffer to Direct TX queue front by used priority
lowpan_adaptation_tx_queue_write(interface_ptr, buf, true);
random_early_detetction_aq_calc(cur->random_early_detection, interface_ptr->directTxQueue_size);
ns_list_remove(&interface_ptr->activeUnicastList, tx_ptr);
ns_dyn_mem_free(tx_ptr);
interface_ptr->activeTxList_size--;
return 0;
}
if (confirm->status == MLME_TRANSACTION_OVERFLOW) {
tr_error("MCPS Data fail by MLME_TRANSACTION_OVERFLOW");
}

tr_error("MCPS Data fail by status %u", confirm->status);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,11 +85,6 @@ TEST(adaptation_interface, test_lowpan_adaptation_interface_mpx_register)
}


TEST(adaptation_interface, test_lowpan_adaptation_interface_tx_queue)
{
CHECK(test_lowpan_adaptation_interface_tx_queue());
}




Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1423,187 +1423,4 @@ bool test_lowpan_adaptation_interface_mpx_register()
return true;
}

bool test_lowpan_adaptation_interface_tx_queue()
{
mac_api_t api;
mcps_data_conf_t data_confirm;
protocol_interface_info_entry_t entry;
arm_15_4_mac_parameters_t params;
params.mac_next_key_index = 1;
params.mac_channel = 11;
memset(&entry, 0, sizeof(entry));
entry.mac_parameters = &params;
entry.mac_api = &api;
entry.id = 0;
api.mcps_data_req = &mcps_data_req_cb;
api.phyMTU = 127;
mac_neighbor_table_stub.test_neigh = NULL;

mac_helper_stub.uint16_value = 110;
mac_helper_stub.uint8_value = 4;

memset(&data_confirm, 0, sizeof(mcps_data_conf_t));

buffer_t *test_buf = malloc(sizeof(buffer_t) + 2100);
memset(test_buf, 0, sizeof(buffer_t) + 2100);

entry.mac_parameters->mac_in_direct_entry_timeout = 14000;
test_buf->link_specific.ieee802_15_4.useDefaultPanId = true;
test_buf->dst_sa.addr_type = ADDR_802_15_4_SHORT;
protocol_core_stub.entry_ptr = &entry;
buffer_dyn_stub.buffer_ptr = test_buf;
test_buf->buf_ptr = 10;
test_buf->buf_end = 70;
test_buf->link_specific.ieee802_15_4.requestAck = true;
test_buf->link_specific.ieee802_15_4.rf_channel_switch = true;
test_buf->link_specific.ieee802_15_4.selected_channel = 11;

buffer_t *test_buf2 = malloc(sizeof(buffer_t) + 2100);
memset(test_buf2, 0, sizeof(buffer_t) + 2100);
test_buf2->dst_sa.addr_type = ADDR_802_15_4_SHORT;
test_buf2->dst_sa.address[2] = 1;
test_buf2->buf_ptr = 10;
test_buf2->buf_end = 70;
test_buf2->link_specific.ieee802_15_4.requestAck = true;
test_buf2->link_specific.ieee802_15_4.rf_channel_switch = true;
test_buf2->link_specific.ieee802_15_4.selected_channel = 12;

buffer_t *test_buf3 = malloc(sizeof(buffer_t) + 2100);
memset(test_buf3, 0, sizeof(buffer_t) + 2100);
test_buf3->dst_sa.addr_type = ADDR_802_15_4_LONG;
test_buf3->dst_sa.address[2] = 2;
test_buf3->buf_ptr = 10;
test_buf3->buf_end = 70;
test_buf3->link_specific.ieee802_15_4.requestAck = true;

entry.mac_api = &api;

entry.id = 0;
api.mcps_data_req = &mcps_data_req_cb;

nsdynmemlib_stub.returnCounter = 2;
lowpan_adaptation_interface_init(0, 127);

test_buf2->ip_routed_up = true;
nsdynmemlib_stub.returnCounter = 2;
lowpan_adaptation_interface_tx(&entry, test_buf);
nsdynmemlib_stub.returnCounter = 2;
lowpan_adaptation_interface_tx(&entry, test_buf2);
nsdynmemlib_stub.returnCounter = 2;
lowpan_adaptation_interface_tx(&entry, test_buf3);

//This Must be go back to queue
data_confirm.msduHandle = 0;
data_confirm.status = MLME_TRANSACTION_OVERFLOW;
if (0 != lowpan_adaptation_interface_tx_confirm(&entry, &data_confirm)) {
lowpan_adaptation_interface_free(0);
free(test_buf);
free(test_buf2);
free(test_buf3);
return false;
}
if (-1 != lowpan_adaptation_interface_tx_confirm(&entry, &data_confirm)) {
lowpan_adaptation_interface_free(0);
free(test_buf);
free(test_buf2);
free(test_buf3);
return false;
}

data_confirm.msduHandle = 1;
data_confirm.status = MLME_SUCCESS;
if (0 != lowpan_adaptation_interface_tx_confirm(&entry, &data_confirm)) {
lowpan_adaptation_interface_free(0);
free(test_buf);
free(test_buf2);
free(test_buf3);
return false;
}

//Test That Buffer is at active queue again
data_confirm.msduHandle = 2;
data_confirm.status = MLME_SUCCESS;
if (0 != lowpan_adaptation_interface_tx_confirm(&entry, &data_confirm)) {
lowpan_adaptation_interface_free(0);
free(test_buf);
free(test_buf2);
free(test_buf3);
return false;
}

data_confirm.msduHandle = 3;
data_confirm.status = MLME_SUCCESS;
if (0 != lowpan_adaptation_interface_tx_confirm(&entry, &data_confirm)) {
lowpan_adaptation_interface_free(0);
free(test_buf);
free(test_buf2);
free(test_buf3);
return false;
}
//Test Write 2 buffers and 1 return error and 3 is writed after that
nsdynmemlib_stub.returnCounter = 2;
lowpan_adaptation_interface_tx(&entry, test_buf); //4
nsdynmemlib_stub.returnCounter = 2;
lowpan_adaptation_interface_tx(&entry, test_buf2); // 5
data_confirm.msduHandle = 4;
data_confirm.status = MLME_TRANSACTION_OVERFLOW;
if (0 != lowpan_adaptation_interface_tx_confirm(&entry, &data_confirm)) {
lowpan_adaptation_interface_free(0);
free(test_buf);
free(test_buf2);
free(test_buf3);
return false;
}
//Test That we are not accept new request until we got normal confirmation
nsdynmemlib_stub.returnCounter = 2;
lowpan_adaptation_interface_tx(&entry, test_buf3);
data_confirm.msduHandle = 5;
data_confirm.status = MLME_SUCCESS;
if (0 != lowpan_adaptation_interface_tx_confirm(&entry, &data_confirm)) {
lowpan_adaptation_interface_free(0);
free(test_buf);
free(test_buf2);
free(test_buf3);
return false;
}
data_confirm.msduHandle = 6;
data_confirm.status = MLME_SUCCESS;
if (0 != lowpan_adaptation_interface_tx_confirm(&entry, &data_confirm)) {
lowpan_adaptation_interface_free(0);
free(test_buf);
free(test_buf2);
free(test_buf3);
return false;
}
data_confirm.msduHandle = 7;
data_confirm.status = MLME_SUCCESS;
if (0 != lowpan_adaptation_interface_tx_confirm(&entry, &data_confirm)) {
lowpan_adaptation_interface_free(0);
free(test_buf);
free(test_buf2);
free(test_buf3);
return false;
}

//Test That we are not pushing packet to queue anymore
nsdynmemlib_stub.returnCounter = 2;
lowpan_adaptation_interface_tx(&entry, test_buf3);
data_confirm.msduHandle = 8;
data_confirm.status = MLME_TRANSACTION_OVERFLOW;
if (0 != lowpan_adaptation_interface_tx_confirm(&entry, &data_confirm)) {
lowpan_adaptation_interface_free(0);
free(test_buf);
free(test_buf2);
free(test_buf3);
return false;
}

lowpan_adaptation_interface_free(0);
free(test_buf);
free(test_buf2);
free(test_buf3);
return true;

}


Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ bool test_lowpan_adaptation_interface_data_ind();

bool test_lowpan_adaptation_interface_mpx_register();

bool test_lowpan_adaptation_interface_tx_queue();

#ifdef __cplusplus
}
Expand Down

0 comments on commit f68126b

Please sign in to comment.