Skip to content

Commit a8e3e73

Browse files
Test mode updates for BBR (ARMmbed#2011)
Added possibility to send test backbone messages.
1 parent d8cc9b5 commit a8e3e73

File tree

5 files changed

+86
-6
lines changed

5 files changed

+86
-6
lines changed

nanostack/net_thread_test.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,19 @@ int thread_test_version_set(int8_t interface_id, uint8_t version);
241241
*/
242242
int thread_test_router_selection_jitter_set(int8_t interface_id, uint32_t jitter);
243243

244+
/**
245+
* \brief Set Thread PBBR status response override.
246+
*
247+
* \param interface_id Network Interface
248+
* \param dua_status expected dua response value from PBBR
249+
* \param dua_count number of times dua_response is repeated
250+
* \param ba_failure_count number of times bba failure is repeated
251+
*
252+
* \return 0, OK
253+
* \return <0 Error
254+
*/
255+
int thread_test_pbbr_response_override_set(int8_t interface_id, uint8_t dua_status, uint8_t dua_count, uint8_t ba_failure_count);
256+
244257
/**
245258
* \brief Sets the thread MIN_DELAY_TIMER default value.
246259
*

source/6LoWPAN/Thread/thread_bbr_api.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1125,6 +1125,7 @@ int thread_bbr_timeout_set(int8_t interface_id, uint32_t timeout_a, uint32_t tim
11251125
#endif // HAVE_THREAD_BORDER_ROUTER
11261126
}
11271127

1128+
11281129
int thread_bbr_prefix_set(int8_t interface_id, uint8_t *prefix)
11291130
{
11301131
(void) interface_id;
@@ -1159,8 +1160,6 @@ int thread_bbr_validation_interface_address_set(int8_t interface_id, const uint8
11591160
#endif // HAVE_THREAD_BORDER_ROUTER
11601161
}
11611162

1162-
1163-
11641163
void thread_bbr_stop(int8_t interface_id)
11651164
{
11661165
(void) interface_id;

source/6LoWPAN/Thread/thread_extension_bbr.c

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@
6363
#if defined(HAVE_THREAD_V2) && defined(HAVE_THREAD_BORDER_ROUTER)
6464
#define TRACE_GROUP "pBBR"
6565

66+
static uint8_t dua_response_status = 0xff;
67+
static uint8_t dua_status_count = 1;
68+
static uint8_t ba_response_status_count = 0;
69+
6670
/*
6771
* Border router instance data.
6872
*/
@@ -104,7 +108,7 @@ static NS_LIST_DEFINE(duplicate_dua_tr_list, duplicate_dua_tr_t, link);
104108
#define THREAD_BBR_MLR_REGISTRATION_TIMEOUT 600 //<* Default MLR timeout in seconds
105109
#define THREAD_BBR_DUA_REGISTRATION_TIMEOUT 3600
106110
#define THREAD_BBR_DUA_REGISTRATION_DELAY 5000 // 5 seconds in ms
107-
#define THREAD_BBR_BACKBONE_PORT 61631 //<* Backbone border router
111+
#define THREAD_BBR_BACKBONE_PORT 5683 //<* Backbone border router
108112
#define THREAD_BBR_DUA_DAD_QUERY_TIMEOUT 1 // wait period for Duplicate Address Detection
109113
#define THREAD_BBR_DUA_DAD_REPEATS 2 // multicast repeated as part of DUA
110114

@@ -510,8 +514,10 @@ static int thread_pbbr_bb_qry_cb(int8_t service_id, uint8_t source_address[16],
510514
(void)source_port;
511515
uint16_t addr_len;
512516
uint8_t *addr_data_ptr;
517+
uint8_t *ml_eid_ptr;
513518
uint16_t rloc;
514519
uint16_t *rloc_ptr = NULL;
520+
uint32_t last_transaction_time;
515521
tr_info("Thread BBR BB_QRY.ntf Received");
516522

517523
thread_pbbr_t *this = thread_border_router_find_by_service(service_id);
@@ -537,6 +543,16 @@ static int thread_pbbr_bb_qry_cb(int8_t service_id, uint8_t source_address[16],
537543
tr_warn("Invalid BB_QRY.ntf message");
538544
return -1;
539545
}
546+
547+
// Test code for b/ba response override
548+
if (ba_response_status_count) {
549+
device_configuration_s *device_config = thread_joiner_application_get_device_config(this->interface_id);
550+
ml_eid_ptr = device_config->eui64;
551+
last_transaction_time = protocol_core_monotonic_time;
552+
ba_response_status_count--;
553+
goto send_response;
554+
}
555+
540556
ipv6_route_t *route = ipv6_route_choose_next_hop(addr_data_ptr, this->interface_id, NULL);
541557
if (!route || route->prefix_len < 128 || !route->on_link || route->info.source != ROUTE_THREAD_PROXIED_DUA_HOST || !route->info.info) {
542558
//address not in mesh
@@ -546,9 +562,10 @@ static int thread_pbbr_bb_qry_cb(int8_t service_id, uint8_t source_address[16],
546562
rloc_ptr = &rloc;
547563
}
548564

549-
uint32_t last_transaction_time = protocol_core_monotonic_time - ((thread_pbbr_dua_info_t *)route->info.info)->last_contact_time;
550-
uint8_t *ml_eid_ptr = ((thread_pbbr_dua_info_t *)route->info.info)->mleid_ptr;
565+
last_transaction_time = protocol_core_monotonic_time - ((thread_pbbr_dua_info_t *)route->info.info)->last_contact_time;
566+
ml_eid_ptr = ((thread_pbbr_dua_info_t *)route->info.info)->mleid_ptr;
551567

568+
send_response:
552569
// This address is valid in our MESH
553570
return thread_border_router_bb_ans_send(this, source_address, addr_data_ptr, ml_eid_ptr, last_transaction_time, link_configuration_ptr->name, rloc_ptr);
554571
}
@@ -893,6 +910,7 @@ static int thread_extension_bbr_dua_cb(int8_t service_id, uint8_t source_address
893910
if (!cur) {
894911
return -1;
895912
}
913+
896914
if (0 == thread_extension_primary_bbr_get(cur, bbr_rloc_addr, NULL, NULL, NULL) &&
897915
!addr_get_entry(cur, bbr_rloc_addr)) {
898916
// Primary pBBR present and I am not the pBBR
@@ -918,6 +936,13 @@ static int thread_extension_bbr_dua_cb(int8_t service_id, uint8_t source_address
918936

919937
tr_debug("DUA.req addr:%s ml_eid:%s", trace_array(addr_data_ptr, addr_len), trace_array(ml_eid_ptr, ml_eid_len));
920938

939+
// Test code for dua response override
940+
if (dua_response_status != 0xff && dua_status_count) {
941+
bbr_status = dua_response_status;
942+
dua_status_count--;
943+
goto send_response;
944+
}
945+
921946
entry_keep_alive = false;
922947
ipv6_route_t *route = ipv6_route_lookup_with_info(addr_data_ptr, 128, this->interface_id, NULL, ROUTE_THREAD_PROXIED_DUA_HOST, NULL, 0);
923948

@@ -1481,4 +1506,24 @@ void thread_extension_bbr_old_partition_data_clean(int8_t interface_id)
14811506
}
14821507
}
14831508

1509+
void thread_extension_bbr_status_override_get(uint8_t *dua_status, uint8_t *dua_count, uint8_t *ba_failure_count)
1510+
{
1511+
if (*dua_status) {
1512+
*dua_status = dua_response_status;
1513+
}
1514+
if (*dua_count) {
1515+
*dua_count = dua_status_count;
1516+
}
1517+
if (*ba_failure_count) {
1518+
*ba_failure_count = ba_response_status_count;
1519+
}
1520+
}
1521+
1522+
void thread_extension_bbr_status_override_set(uint8_t dua_status, uint8_t dua_count, uint8_t ba_failure_count)
1523+
{
1524+
dua_response_status = dua_status;
1525+
dua_status_count = dua_count;
1526+
ba_response_status_count = ba_failure_count;
1527+
}
1528+
14841529
#endif //HAVE_THREAD_BORDER_ROUTER && HAVE_THREAD_V2

source/6LoWPAN/Thread/thread_extension_bbr.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ typedef struct thread_pbbr_dua_info {
4747
} thread_pbbr_dua_info_t;
4848

4949
#if defined(HAVE_THREAD_V2) && defined(HAVE_THREAD_BORDER_ROUTER)
50-
5150
int8_t thread_extension_bbr_init(int8_t interface_id, int8_t backbone_interface_id);
5251
void thread_extension_bbr_delete(int8_t interface_id);
5352
bool thread_extension_bbr_nd_query_process(protocol_interface_info_entry_t *cur, const uint8_t *target_addr, uint16_t rloc);
@@ -58,6 +57,9 @@ int thread_extension_bbr_address_set(int8_t interface_id, const uint8_t *addr_pt
5857
void thread_extension_bbr_route_update(protocol_interface_info_entry_t *cur);
5958
int thread_extension_bbr_prefix_set(int8_t interface_id, uint8_t *prefix);
6059
void thread_extension_bbr_old_partition_data_clean(int8_t interface_id);
60+
void thread_extension_bbr_status_override_get(uint8_t *dua_status, uint8_t *dua_count, uint8_t *ba_failure_count);
61+
void thread_extension_bbr_status_override_set(uint8_t dua_status, uint8_t dua_count, uint8_t ba_failure_count);
62+
void thread_extension_status_override_count_set(uint8_t value);
6163

6264

6365
#else
@@ -72,6 +74,9 @@ void thread_extension_bbr_old_partition_data_clean(int8_t interface_id);
7274
#define thread_extension_bbr_sequence_number_set(interface_id, seq_number) (-1)
7375
#define thread_extension_bbr_prefix_set(interface_id, prefix) 0
7476
#define thread_extension_bbr_old_partition_data_clean(interface_id)
77+
#define thread_extension_bbr_status_override_get(dua_status, dua_count, ba_failure_count);
78+
#define thread_extension_bbr_status_override_set(dua_status, dua_count, ba_failure_count);
79+
#define thread_extension_status_override_count_set(value)
7580
#endif
7681

7782
#ifdef __cplusplus

source/6LoWPAN/Thread/thread_test_api.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
#include "6LoWPAN/Thread/thread_discovery.h"
5050
#include "6LoWPAN/Thread/thread_nvm_store.h"
5151
#include "6LoWPAN/Thread/thread_extension_bootstrap.h"
52+
#include "6LoWPAN/Thread/thread_extension_bbr.h"
5253
#include "6LoWPAN/Thread/thread_neighbor_class.h"
5354
#include "MLE/mle.h"
5455
#include "thread_meshcop_lib.h"
@@ -639,6 +640,23 @@ int thread_test_version_set(int8_t interface_id, uint8_t version)
639640
return -1;
640641
#endif
641642
}
643+
644+
int thread_test_pbbr_response_override_set(int8_t interface_id, uint8_t dua_status, uint8_t dua_count, uint8_t ba_failure_count)
645+
{
646+
#ifdef HAVE_THREAD
647+
(void)interface_id;
648+
thread_extension_bbr_status_override_set(dua_status, dua_count, ba_failure_count);
649+
return 0;
650+
651+
#else
652+
(void)interface_id;
653+
(void)dua_status;
654+
(void)dua_count;
655+
(void)ba_failure_count;
656+
return -1;
657+
#endif
658+
}
659+
642660
int thread_test_router_selection_jitter_set(int8_t interface_id, uint32_t jitter)
643661
{
644662
#ifdef HAVE_THREAD

0 commit comments

Comments
 (0)