@@ -71,7 +71,7 @@ typedef struct {
7171 bool fragmented_data :1 ;
7272 bool first_fragment :1 ;
7373 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 */
7575 buffer_t * buf ;
7676 uint8_t * fragmenter_buf ;
7777 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);
131131/* Fragmentation local functions */
132132static 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 );
133133static 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 );
135135
136136static fragmenter_tx_entry_t * lowpan_adaptation_indirect_mac_data_request_active (fragmenter_interface_t * interface_ptr , fragmenter_tx_entry_t * tx_ptr );
137137
@@ -749,7 +749,7 @@ static bool lowpan_adaptation_indirect_cache_trigger(protocol_interface_info_ent
749749 ns_list_foreach (fragmenter_tx_entry_t , fragmenter_tx_entry , & interface_ptr -> indirect_tx_queue ) {
750750 if (fragmenter_tx_entry -> indirect_data_cached ) {
751751 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 ));
753753 fragmenter_tx_entry -> indirect_data_cached = false;
754754 lowpan_data_request_to_mac (cur , fragmenter_tx_entry -> buf , fragmenter_tx_entry , interface_ptr );
755755 return true;
@@ -799,7 +799,12 @@ static void lowpan_adaptation_make_room_for_small_packet(protocol_interface_info
799799 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 );
800800 if (tx_neighbour == neighbour_to_count && buffer_data_length (tx_entry -> buf ) <= interface_ptr -> indirect_big_packet_threshold ) {
801801 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+ }
803808 }
804809 }
805810 }
@@ -816,8 +821,12 @@ static void lowpan_adaptation_make_room_for_big_packet(struct protocol_interface
816821 ns_list_foreach_reverse_safe (fragmenter_tx_entry_t , tx_entry , & interface_ptr -> indirect_tx_queue ) {
817822 if (buffer_data_length (tx_entry -> buf ) > interface_ptr -> indirect_big_packet_threshold ) {
818823 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+ }
821830 }
822831 }
823832 }
@@ -1275,29 +1284,44 @@ static bool lowpan_tx_buffer_address_compare(sockaddr_t *dst_sa, uint8_t *addres
12751284 return true;
12761285}
12771286
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 )
12791288{
12801289 mcps_purge_t purge_req ;
12811290 purge_req .msduHandle = msduhandle ;
1291+ bool mac_purge_success = false;
12821292 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+ }
12841296 } else {
12851297 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+ }
12871301 }
12881302 }
1303+
1304+ return mac_purge_success ;
12891305}
12901306
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 )
12921308{
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+
12951317 lowpan_adaptation_data_process_clean (interface_ptr , tx_ptr , SOCKET_TX_FAIL );
1318+
1319+ return true;
12961320}
12971321
12981322void lowpan_adaptation_remove_free_indirect_table (protocol_interface_info_entry_t * cur_interface , mac_neighbor_table_entry_t * entry_ptr )
12991323{
1300- //Free firts by defined short address
1324+ //Free first by defined short address
13011325 if (entry_ptr -> mac16 < 0xfffe ) {
13021326 uint8_t temp_address [2 ];
13031327 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
13171341
13181342 //Check first indirect queue
13191343 ns_list_foreach_safe (fragmenter_tx_entry_t , entry , & interface_ptr -> indirect_tx_queue ) {
1320-
13211344 if (lowpan_tx_buffer_address_compare (& entry -> buf -> dst_sa , address_ptr , adr_type )) {
13221345 //Purge from mac
13231346 lowpan_adaptation_indirect_queue_free_message (cur , interface_ptr , entry );
13241347 }
13251348 }
13261349
13271350 return 0 ;
1328-
13291351}
13301352
13311353int8_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