Skip to content

Commit 11a1e1d

Browse files
author
Jarkko Paso
authored
Store TX start channel and black list if TX failed (ARMmbed#2261)
1 parent 0494606 commit 11a1e1d

File tree

9 files changed

+26
-20
lines changed

9 files changed

+26
-20
lines changed

nanostack/fhss_api.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,10 @@ typedef void fhss_data_tx_done(const fhss_api_t *api, bool waiting_ack, bool tx_
122122
* @param api FHSS instance.
123123
* @param handle Handle of the data request.
124124
* @param frame_type Frame type of packet (Frames types are defined by FHSS api).
125+
* @param channel Channel wanted to black list temporarily.
125126
* @return true if frame has to be queued for retransmission, false otherwise.
126127
*/
127-
typedef bool fhss_data_tx_fail(const fhss_api_t *api, uint8_t handle, int frame_type);
128+
typedef bool fhss_data_tx_fail(const fhss_api_t *api, uint8_t handle, int frame_type, uint8_t channel);
128129

129130
/**
130131
* @brief Change synchronization state.

source/MAC/IEEE802_15_4/mac_defines.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ typedef struct protocol_interface_rf_mac_setup {
202202
mac_scan_type_t scan_type;
203203

204204
uint8_t mac_channel;
205+
uint8_t mac_tx_start_channel;
205206
//uint8_t cca_failure;
206207

207208
/* MAC TX Queue */

source/MAC/IEEE802_15_4/mac_mcps_sap.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1430,7 +1430,7 @@ static void mcps_data_confirm_handle(protocol_interface_rf_mac_setup_s *rf_ptr,
14301430
if (rf_ptr->fhss_api && !buffer->asynch_request) {
14311431
// FHSS checks if this failed buffer needs to be pushed back to TX queue and retransmitted
14321432
if ((rf_ptr->mac_tx_result == MAC_TX_FAIL) || (rf_ptr->mac_tx_result == MAC_CCA_FAIL)) {
1433-
if (rf_ptr->fhss_api->data_tx_fail(rf_ptr->fhss_api, buffer->msduHandle, mac_convert_frame_type_to_fhss(buffer->fcf_dsn.frametype)) == true) {
1433+
if (rf_ptr->fhss_api->data_tx_fail(rf_ptr->fhss_api, buffer->msduHandle, mac_convert_frame_type_to_fhss(buffer->fcf_dsn.frametype), rf_ptr->mac_tx_start_channel) == true) {
14341434

14351435
if (rf_ptr->mac_tx_result == MAC_TX_FAIL) {
14361436
buffer->fhss_retry_count += 1 + rf_ptr->mac_tx_status.retry;
@@ -1921,6 +1921,7 @@ static int8_t mcps_pd_data_request(protocol_interface_rf_mac_setup_s *rf_ptr, ma
19211921
memset(&(rf_ptr->mac_tx_status), 0, sizeof(mac_tx_status_t));
19221922
rf_ptr->mac_cca_retry = 0;
19231923
rf_ptr->mac_tx_retry = 0;
1924+
rf_ptr->mac_tx_start_channel = rf_ptr->mac_channel;
19241925
mac_csma_param_init(rf_ptr);
19251926
if (mcps_generic_packet_build(rf_ptr, buffer) != 0) {
19261927
return -1;

source/Service_Libs/fhss/fhss.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1123,8 +1123,9 @@ static void fhss_data_tx_done_callback(const fhss_api_t *api, bool waiting_ack,
11231123
}
11241124
}
11251125

1126-
static bool fhss_data_tx_fail_callback(const fhss_api_t *api, uint8_t handle, int frame_type)
1126+
static bool fhss_data_tx_fail_callback(const fhss_api_t *api, uint8_t handle, int frame_type, uint8_t channel)
11271127
{
1128+
(void) channel;
11281129
fhss_structure_t *fhss_structure = fhss_get_object_with_api(api);
11291130
if (!fhss_structure) {
11301131
return false;

source/Service_Libs/fhss/fhss_ws.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -663,7 +663,7 @@ static void fhss_ws_data_tx_done_callback(const fhss_api_t *api, bool waiting_ac
663663
}
664664
}
665665

666-
static bool fhss_ws_data_tx_fail_callback(const fhss_api_t *api, uint8_t handle, int frame_type)
666+
static bool fhss_ws_data_tx_fail_callback(const fhss_api_t *api, uint8_t handle, int frame_type, uint8_t channel)
667667
{
668668
fhss_structure_t *fhss_structure = fhss_get_object_with_api(api);
669669
if (!fhss_structure) {
@@ -687,7 +687,7 @@ static bool fhss_ws_data_tx_fail_callback(const fhss_api_t *api, uint8_t handle,
687687
fhss_failed_handle_remove(fhss_structure, handle);
688688
return false;
689689
}
690-
fhss_failed_tx->bad_channel = fhss_structure->rx_channel;
690+
fhss_failed_tx->bad_channel = channel;
691691
} else {
692692
// Create new failure handle and return true to retransmit
693693
fhss_failed_handle_add(fhss_structure, handle, fhss_structure->rx_channel);

test/nanostack/unittest/service_libs/fhss/test_fhss.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
#define DEFAULT_WAITING_ACK false
4949
#define DEFAULT_TX_COMPLETED true
5050
#define DEFAULT_PHY_MTU_SIZE 255
51+
#define DEFAULT_BAD_CHANNEL 0
5152

5253
static fhss_api_t fhss_api;
5354
static fhss_bs_t bs;
@@ -259,12 +260,12 @@ bool test_fhss_check_tx_conditions_callback()
259260
enable_fhss_struct();
260261
FHSS.fhss_state = FHSS_SYNCHRONIZED;
261262
nsdynmemlib_stub.returnCounter = 1;
262-
FHSS.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE);
263+
FHSS.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE, DEFAULT_BAD_CHANNEL);
263264
if (FHSS.fhss_api->check_tx_conditions(api, DEFAULT_IS_BC_DEST, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE, DEFAULT_FRAME_LENGTH, DEFAULT_PHY_HEAD_LENGTH, DEFAULT_PHY_TAIL_LENGTH) != false) {
264265
return false;
265266
}
266267
// Second call of TX fail should remove the failed handle from list
267-
FHSS.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE);
268+
FHSS.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE, DEFAULT_BAD_CHANNEL);
268269
// Test failing channel type
269270
if (FHSS.fhss_api->check_tx_conditions(api, true, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE, DEFAULT_FRAME_LENGTH, DEFAULT_PHY_HEAD_LENGTH, DEFAULT_PHY_TAIL_LENGTH) != false) {
270271
return false;
@@ -377,7 +378,7 @@ bool test_fhss_data_tx_done_callback()
377378

378379
// Test removing failed handle
379380
nsdynmemlib_stub.returnCounter = 1;
380-
FHSS.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE);
381+
FHSS.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE, DEFAULT_BAD_CHANNEL);
381382
FHSS.fhss_api->data_tx_done(api, true, DEFAULT_TX_COMPLETED, DEFAULT_HANDLE);
382383

383384
return true;
@@ -388,23 +389,23 @@ bool test_fhss_data_tx_fail_callback()
388389
fhss_api_t *api = test_generate_fhss_api();
389390
// Test when FHSS struct not found
390391
disable_fhss_struct();
391-
if (FHSS.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE) != false) {
392+
if (FHSS.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE, DEFAULT_BAD_CHANNEL) != false) {
392393
return false;
393394
}
394395
// Test when FHSS not synchronized
395396
enable_fhss_struct();
396-
if (FHSS.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE) != false) {
397+
if (FHSS.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE, DEFAULT_BAD_CHANNEL) != false) {
397398
return false;
398399
}
399400
// Test when channel retries are disabled
400401
FHSS.fhss_state = FHSS_SYNCHRONIZED;
401402
FHSS.bs->fhss_configuration.fhss_number_of_channel_retries = 0;
402-
if (FHSS.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE) != false) {
403+
if (FHSS.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE, DEFAULT_BAD_CHANNEL) != false) {
403404
return false;
404405
}
405406
// Test incorrect frame type
406407
FHSS.bs->fhss_configuration.fhss_number_of_channel_retries = 1;
407-
if (FHSS.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, FHSS_SYNCH_FRAME) != false) {
408+
if (FHSS.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, FHSS_SYNCH_FRAME, DEFAULT_BAD_CHANNEL) != false) {
408409
return false;
409410
}
410411

test/nanostack/unittest/service_libs/fhss_ws/test_fhss_ws.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
#define DEFAULT_TIMESTAMP 0
4646
#define DEFAULT_WAITING_ACK false
4747
#define DEFAULT_TX_COMPLETED true
48+
#define DEFAULT_BAD_CHANNEL 0
4849

4950
static fhss_api_t fhss_api;
5051
static fhss_ws_t ws;
@@ -399,33 +400,33 @@ bool test_fhss_ws_data_tx_fail_callback()
399400
fhss_api_t *api = test_generate_fhss_api();
400401
// Test when FHSS struct not found
401402
disable_fhss_struct();
402-
if (fhss_common_stub.fhss_struct.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE) != false) {
403+
if (fhss_common_stub.fhss_struct.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE, DEFAULT_BAD_CHANNEL) != false) {
403404
return false;
404405
}
405406
// Test when FHSS is unsynchronized
406407
enable_fhss_struct();
407-
if (fhss_common_stub.fhss_struct.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE) != false) {
408+
if (fhss_common_stub.fhss_struct.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE, DEFAULT_BAD_CHANNEL) != false) {
408409
return false;
409410
}
410411
// Test when not data frame
411412
fhss_common_stub.fhss_struct.fhss_state = FHSS_SYNCHRONIZED;
412-
if (fhss_common_stub.fhss_struct.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, FHSS_SYNCH_FRAME) != false) {
413+
if (fhss_common_stub.fhss_struct.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, FHSS_SYNCH_FRAME, DEFAULT_BAD_CHANNEL) != false) {
413414
return false;
414415
}
415416
// Test adding new failed entry
416417
fhss_common_stub.fhss_failed_tx.handle = DEFAULT_HANDLE + 1;
417418
fhss_common_stub.fhss_failed_tx.retries_done = 0;
418-
if (fhss_common_stub.fhss_struct.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE) != true) {
419+
if (fhss_common_stub.fhss_struct.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE, DEFAULT_BAD_CHANNEL) != true) {
419420
return false;
420421
}
421422
// Test when handle failed again
422423
fhss_common_stub.fhss_failed_tx.handle = DEFAULT_HANDLE;
423-
if (fhss_common_stub.fhss_struct.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE) != true) {
424+
if (fhss_common_stub.fhss_struct.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE, DEFAULT_BAD_CHANNEL) != true) {
424425
return false;
425426
}
426427
// Test last failure
427428
fhss_common_stub.fhss_failed_tx.retries_done = 3;
428-
if (fhss_common_stub.fhss_struct.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE) != false) {
429+
if (fhss_common_stub.fhss_struct.fhss_api->data_tx_fail(api, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE, DEFAULT_BAD_CHANNEL) != false) {
429430
return false;
430431
}
431432

test/nanostack/unittest/stub/fhss_config_stub.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ void fhss_data_tx_done_cb_stub(const fhss_api_t *api, bool waiting_ack, bool tx_
4444
fhss_config_stub.int8_value++;
4545
}
4646

47-
bool fhss_data_tx_fail_cb_stub(const fhss_api_t *api, uint8_t handle, int frame_type)
47+
bool fhss_data_tx_fail_cb_stub(const fhss_api_t *api, uint8_t handle, int frame_type, uint8_t channel)
4848
{
4949
fhss_config_stub.int8_value++;
5050
return true;

test/nanostack/unittest/stub/fhss_config_stub.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ bool fhss_is_broadcast_channel_cb_stub(const fhss_api_t *api);
3535
bool fhss_use_broadcast_queue_cb_stub(const fhss_api_t *api, bool is_broadcast_addr, int frame_type);
3636
void fhss_receive_frame_cb_stub(const fhss_api_t *api, uint16_t pan_id, uint8_t *source_address, uint32_t timestamp, uint8_t *synch_info, int frame_type);
3737
void fhss_data_tx_done_cb_stub(const fhss_api_t *api, bool waiting_ack, bool tx_completed, uint8_t handle);
38-
bool fhss_data_tx_fail_cb_stub(const fhss_api_t *api, uint8_t handle, int frame_type);
38+
bool fhss_data_tx_fail_cb_stub(const fhss_api_t *api, uint8_t handle, int frame_type, uint8_t channel);
3939
void fhss_synch_state_set_cb_stub(const fhss_api_t *api, fhss_states fhss_state, uint16_t pan_id);
4040
uint32_t fhss_read_timestamp_cb_stub(const fhss_api_t *api);
4141
uint16_t fhss_get_retry_period_cb_stub(const fhss_api_t *api, uint8_t *destination_address, uint16_t phy_mtu);

0 commit comments

Comments
 (0)