@@ -71,7 +71,7 @@ typedef struct {
71
71
bool fragmented_data :1 ;
72
72
bool first_fragment :1 ;
73
73
bool indirect_data :1 ;
74
- bool indirect_data_cached :1 ; /* Data cached for delayed transmission as mac request is already active */
74
+ bool indirect_data_cached :1 ; /*!< Data cached for delayed transmission as mac request is already active */
75
75
buffer_t * buf ;
76
76
uint8_t * fragmenter_buf ;
77
77
ns_list_link_t link ; /*!< List link entry */
@@ -131,7 +131,7 @@ static bool lowpan_adaptation_tx_process_ready(fragmenter_tx_entry_t *tx_ptr);
131
131
/* Fragmentation local functions */
132
132
static int8_t lowpan_message_fragmentation_init (buffer_t * buf , fragmenter_tx_entry_t * frag_entry , protocol_interface_info_entry_t * cur , fragmenter_interface_t * interface_ptr );
133
133
static bool lowpan_message_fragmentation_message_write (const fragmenter_tx_entry_t * frag_entry , mcps_data_req_t * dataReq );
134
- static void lowpan_adaptation_indirect_queue_free_message (struct protocol_interface_info_entry * cur , fragmenter_interface_t * interface_ptr , fragmenter_tx_entry_t * tx_ptr );
134
+ static bool lowpan_adaptation_indirect_queue_free_message (struct protocol_interface_info_entry * cur , fragmenter_interface_t * interface_ptr , fragmenter_tx_entry_t * tx_ptr );
135
135
136
136
static fragmenter_tx_entry_t * lowpan_adaptation_indirect_mac_data_request_active (fragmenter_interface_t * interface_ptr , fragmenter_tx_entry_t * tx_ptr );
137
137
@@ -749,7 +749,7 @@ static bool lowpan_adaptation_indirect_cache_trigger(protocol_interface_info_ent
749
749
ns_list_foreach (fragmenter_tx_entry_t , fragmenter_tx_entry , & interface_ptr -> indirect_tx_queue ) {
750
750
if (fragmenter_tx_entry -> indirect_data_cached ) {
751
751
if (addr_ipv6_equal (tx_ptr -> buf -> dst_sa .address , fragmenter_tx_entry -> buf -> dst_sa .address )) {
752
- tr_debug_extra ("pushing seq %d to addr %s" , fragmenter_tx_entry -> buf -> seq , trace_ipv6 (fragmenter_tx_entry -> buf -> dst_sa .address ));
752
+ tr_debug_extra ("Pushing seq %d to addr %s" , fragmenter_tx_entry -> buf -> seq , trace_ipv6 (fragmenter_tx_entry -> buf -> dst_sa .address ));
753
753
fragmenter_tx_entry -> indirect_data_cached = false;
754
754
lowpan_data_request_to_mac (cur , fragmenter_tx_entry -> buf , fragmenter_tx_entry , interface_ptr );
755
755
return true;
@@ -799,7 +799,12 @@ static void lowpan_adaptation_make_room_for_small_packet(protocol_interface_info
799
799
mac_neighbor_table_entry_t * tx_neighbour = mac_neighbor_table_address_discover (mac_neighbor_info (cur ), tx_entry -> buf -> dst_sa .address + 2 , tx_entry -> buf -> dst_sa .addr_type );
800
800
if (tx_neighbour == neighbour_to_count && buffer_data_length (tx_entry -> buf ) <= interface_ptr -> indirect_big_packet_threshold ) {
801
801
if (++ count >= interface_ptr -> max_indirect_small_packets_per_child ) {
802
- lowpan_adaptation_indirect_queue_free_message (cur , interface_ptr , tx_entry );
802
+ tr_debug_extra ("Purge seq: %d" , tx_entry -> buf -> seq );
803
+ if (lowpan_adaptation_indirect_queue_free_message (cur , interface_ptr , tx_entry ) == false) {
804
+ /* entry could not be purged from mac, try next entry */
805
+ tr_debug_extra ("Purge failed, try next" );
806
+ count -- ;
807
+ }
803
808
}
804
809
}
805
810
}
@@ -816,8 +821,12 @@ static void lowpan_adaptation_make_room_for_big_packet(struct protocol_interface
816
821
ns_list_foreach_reverse_safe (fragmenter_tx_entry_t , tx_entry , & interface_ptr -> indirect_tx_queue ) {
817
822
if (buffer_data_length (tx_entry -> buf ) > interface_ptr -> indirect_big_packet_threshold ) {
818
823
if (++ count >= interface_ptr -> max_indirect_big_packets_total ) {
819
- tr_debug_extra ("free seq: %d" , tx_entry -> buf -> seq );
820
- lowpan_adaptation_indirect_queue_free_message (cur , interface_ptr , tx_entry );
824
+ tr_debug_extra ("Purge seq: %d" , tx_entry -> buf -> seq );
825
+ if (lowpan_adaptation_indirect_queue_free_message (cur , interface_ptr , tx_entry ) == false) {
826
+ tr_debug ("Purge failed, try next entry" );
827
+ /* entry could not be purged from mac, try next entry */
828
+ count -- ;
829
+ }
821
830
}
822
831
}
823
832
}
@@ -1275,29 +1284,44 @@ static bool lowpan_tx_buffer_address_compare(sockaddr_t *dst_sa, uint8_t *addres
1275
1284
return true;
1276
1285
}
1277
1286
1278
- static void lowpan_adaptation_purge_from_mac (struct protocol_interface_info_entry * cur , fragmenter_interface_t * interface_ptr , uint8_t msduhandle )
1287
+ static bool lowpan_adaptation_purge_from_mac (struct protocol_interface_info_entry * cur , fragmenter_interface_t * interface_ptr , uint8_t msduhandle )
1279
1288
{
1280
1289
mcps_purge_t purge_req ;
1281
1290
purge_req .msduHandle = msduhandle ;
1291
+ bool mac_purge_success = false;
1282
1292
if (interface_ptr -> mpx_api ) {
1283
- interface_ptr -> mpx_api -> mpx_data_purge (interface_ptr -> mpx_api , & purge_req , interface_ptr -> mpx_user_id );
1293
+ if (interface_ptr -> mpx_api -> mpx_data_purge (interface_ptr -> mpx_api , & purge_req , interface_ptr -> mpx_user_id ) == 0 ) {
1294
+ mac_purge_success = true;
1295
+ }
1284
1296
} else {
1285
1297
if (cur -> mac_api -> mcps_purge_req ) {
1286
- cur -> mac_api -> mcps_purge_req (cur -> mac_api , & purge_req );
1298
+ if (cur -> mac_api -> mcps_purge_req (cur -> mac_api , & purge_req ) == 0 ) {
1299
+ mac_purge_success = true;
1300
+ }
1287
1301
}
1288
1302
}
1303
+
1304
+ return mac_purge_success ;
1289
1305
}
1290
1306
1291
- static void lowpan_adaptation_indirect_queue_free_message (struct protocol_interface_info_entry * cur , fragmenter_interface_t * interface_ptr , fragmenter_tx_entry_t * tx_ptr )
1307
+ static bool lowpan_adaptation_indirect_queue_free_message (struct protocol_interface_info_entry * cur , fragmenter_interface_t * interface_ptr , fragmenter_tx_entry_t * tx_ptr )
1292
1308
{
1293
- tr_debug ("Purge from indirect handle %u" , tx_ptr -> buf -> seq );
1294
- lowpan_adaptation_purge_from_mac (cur , interface_ptr , tx_ptr -> buf -> seq );
1309
+ tr_debug ("Purge from indirect handle %u, cached %d" , tx_ptr -> buf -> seq , tx_ptr -> indirect_data_cached );
1310
+ if (tx_ptr -> indirect_data_cached == false) {
1311
+ if (lowpan_adaptation_purge_from_mac (cur , interface_ptr , tx_ptr -> buf -> seq ) == false) {
1312
+ // MAC purge failed
1313
+ return false;
1314
+ }
1315
+ }
1316
+
1295
1317
lowpan_adaptation_data_process_clean (interface_ptr , tx_ptr , SOCKET_TX_FAIL );
1318
+
1319
+ return true;
1296
1320
}
1297
1321
1298
1322
void lowpan_adaptation_remove_free_indirect_table (protocol_interface_info_entry_t * cur_interface , mac_neighbor_table_entry_t * entry_ptr )
1299
1323
{
1300
- //Free firts by defined short address
1324
+ //Free first by defined short address
1301
1325
if (entry_ptr -> mac16 < 0xfffe ) {
1302
1326
uint8_t temp_address [2 ];
1303
1327
common_write_16_bit (entry_ptr -> mac16 , temp_address );
@@ -1317,15 +1341,13 @@ int8_t lowpan_adaptation_indirect_free_messages_from_queues_by_address(struct pr
1317
1341
1318
1342
//Check first indirect queue
1319
1343
ns_list_foreach_safe (fragmenter_tx_entry_t , entry , & interface_ptr -> indirect_tx_queue ) {
1320
-
1321
1344
if (lowpan_tx_buffer_address_compare (& entry -> buf -> dst_sa , address_ptr , adr_type )) {
1322
1345
//Purge from mac
1323
1346
lowpan_adaptation_indirect_queue_free_message (cur , interface_ptr , entry );
1324
1347
}
1325
1348
}
1326
1349
1327
1350
return 0 ;
1328
-
1329
1351
}
1330
1352
1331
1353
int8_t lowpan_adaptation_indirect_queue_params_set (struct protocol_interface_info_entry * cur , uint16_t indirect_big_packet_threshold , uint16_t max_indirect_big_packets_total , uint16_t max_indirect_small_packets_per_child )
0 commit comments