Skip to content

Commit afbe906

Browse files
author
Juha Heiuskanen
committed
Adaptation layer update
Added limit for active unicast TX process to MAC to 10. Traffic flow priority support added to buffer queue optimize.
1 parent 13fb2bf commit afbe906

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

source/6LoWPAN/adaptation_interface.c

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#include "MLE/mle.h"
4343
#include "Service_Libs/mle_service/mle_service_api.h"
4444
#include "Common_Protocols/icmpv6.h"
45+
#include "Common_Protocols/ip.h"
4546
#ifdef HAVE_RPL
4647
#include "RPL/rpl_data.h"
4748
#endif
@@ -93,6 +94,7 @@ typedef struct {
9394
fragmenter_tx_list_t activeUnicastList; //Unicast packets waiting data confirmation from MAC
9495
buffer_list_t directTxQueue; //Waiting free tx process
9596
uint16_t directTxQueue_size;
97+
uint16_t activeTxList_size;
9698
uint16_t indirect_big_packet_threshold;
9799
uint16_t max_indirect_big_packets_total;
98100
uint16_t max_indirect_small_packets_per_child;
@@ -103,6 +105,8 @@ typedef struct {
103105
ns_list_link_t link; /*!< List link entry */
104106
} fragmenter_interface_t;
105107

108+
#define LOWPAN_ACTIVE_UNICAST_ONGOING_MAX 10
109+
106110
static NS_LIST_DEFINE(fragmenter_interface_list, fragmenter_interface_t, link);
107111

108112
/* Adaptation interface local functions */
@@ -365,6 +369,8 @@ int8_t lowpan_adaptation_interface_init(int8_t interface_id, uint16_t mac_mtu_si
365369
ns_list_init(&interface_ptr->indirect_tx_queue);
366370
ns_list_init(&interface_ptr->directTxQueue);
367371
ns_list_init(&interface_ptr->activeUnicastList);
372+
interface_ptr->activeTxList_size = 0;
373+
interface_ptr->directTxQueue_size = 0;
368374

369375
ns_list_add_to_end(&fragmenter_interface_list, interface_ptr);
370376

@@ -390,13 +396,14 @@ int8_t lowpan_adaptation_interface_free(int8_t interface_id)
390396
ns_list_remove(&fragmenter_interface_list, interface_ptr);
391397
//free active tx process
392398
lowpan_list_free(&interface_ptr->activeUnicastList, false);
399+
interface_ptr->activeTxList_size = 0;
393400
lowpan_active_buffer_state_reset(&interface_ptr->active_broadcast_tx_buf);
394401

395402
//Free Indirect entry
396403
lowpan_list_free(&interface_ptr->indirect_tx_queue, true);
397404

398405
buffer_free_list(&interface_ptr->directTxQueue);
399-
406+
interface_ptr->directTxQueue_size = 0;
400407
//Free Dynamic allocated entries
401408
ns_dyn_mem_free(interface_ptr->fragment_indirect_tx_buffer);
402409
ns_dyn_mem_free(interface_ptr);
@@ -415,6 +422,7 @@ int8_t lowpan_adaptation_interface_reset(int8_t interface_id)
415422

416423
//free active tx process
417424
lowpan_list_free(&interface_ptr->activeUnicastList, false);
425+
interface_ptr->activeTxList_size = 0;
418426
lowpan_active_buffer_state_reset(&interface_ptr->active_broadcast_tx_buf);
419427
//Clean fragmented message flag
420428
interface_ptr->fragmenter_active = false;
@@ -423,6 +431,7 @@ int8_t lowpan_adaptation_interface_reset(int8_t interface_id)
423431
lowpan_list_free(&interface_ptr->indirect_tx_queue, true);
424432

425433
buffer_free_list(&interface_ptr->directTxQueue);
434+
interface_ptr->directTxQueue_size = 0;
426435

427436
return 0;
428437
}
@@ -597,6 +606,7 @@ static fragmenter_tx_entry_t *lowpan_adaptation_tx_process_init(fragmenter_inter
597606
return NULL;
598607
}
599608
ns_list_add_to_end(&interface_ptr->activeUnicastList, tx_entry);
609+
interface_ptr->activeTxList_size++;
600610
} else {
601611
tx_entry = &interface_ptr->active_broadcast_tx_buf;
602612
}
@@ -969,6 +979,10 @@ static bool lowpan_buffer_tx_allowed(fragmenter_interface_t *interface_ptr, buff
969979
if (!is_unicast && interface_ptr->active_broadcast_tx_buf.buf) {
970980
return false;
971981
}
982+
983+
if (is_unicast && interface_ptr->activeTxList_size >= LOWPAN_ACTIVE_UNICAST_ONGOING_MAX) {
984+
return false;
985+
}
972986
// Do not accept more than one active unicast TX per destination
973987
if (is_unicast && lowpan_adaptation_is_destination_tx_active(&interface_ptr->activeUnicastList, buf)) {
974988
return false;
@@ -992,6 +1006,20 @@ int8_t lowpan_adaptation_interface_tx(protocol_interface_info_entry_t *cur, buff
9921006
goto tx_error_handler;
9931007
}
9941008

1009+
uint8_t traffic_class = buf->options.traffic_class >> IP_TCLASS_DSCP_SHIFT;
1010+
if (traffic_class) {
1011+
tr_debug("TC %u, prority update", traffic_class);
1012+
}
1013+
if (traffic_class == IP_DSCP_EF) {
1014+
buffer_priority_set(buf, QOS_EXPEDITE_FORWARD);
1015+
} else if (traffic_class == IP_DSCP_CS6) {
1016+
//Network Control
1017+
buffer_priority_set(buf, QOS_NETWORK_CTRL);
1018+
} else if (traffic_class) {
1019+
buffer_priority_set(buf, QOS_HIGH);
1020+
}
1021+
1022+
9951023
//Check packet size
9961024
bool fragmented_needed = lowpan_adaptation_request_longer_than_mtu(cur, buf, interface_ptr);
9971025
if (fragmented_needed) {
@@ -1166,6 +1194,7 @@ static void lowpan_adaptation_data_process_clean(fragmenter_interface_t *interfa
11661194
} else if (buf->link_specific.ieee802_15_4.requestAck) {
11671195
ns_list_remove(&interface_ptr->activeUnicastList, tx_ptr);
11681196
ns_dyn_mem_free(tx_ptr);
1197+
interface_ptr->activeTxList_size--;
11691198
}
11701199

11711200
socket_tx_buffer_event_and_free(buf, socket_event);

source/Core/include/ns_buffer.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,9 @@ typedef enum {
180180
typedef enum {
181181
QOS_NORMAL = 0,
182182
QOS_HIGH = 1,
183-
QOS_MAC_BEACON = 2
183+
QOS_NETWORK_CTRL = 2,
184+
QOS_EXPEDITE_FORWARD = 3,
185+
QOS_MAC_BEACON = 4
184186
} buffer_priority_t;
185187

186188
#define B_TO_MAC_MLME_MASK (B_DIR_MASK + B_FROM_MASK + B_TO_MASK )

0 commit comments

Comments
 (0)