Skip to content

Commit 30c538a

Browse files
author
Mika Tervonen
committed
Modified MLR handling
Added support for commissioner to send new messages directly Changed MLR timeout to 3600 changed our Sequence number change default to 24h Added check for primary BBR state for MLR handling Enabled PBBR messages by default if pBBR is initialized
1 parent 02942b0 commit 30c538a

File tree

3 files changed

+51
-22
lines changed

3 files changed

+51
-22
lines changed

source/6LoWPAN/Thread/thread_bbr_api.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -931,6 +931,15 @@ int8_t thread_bbr_init(int8_t interface_id, uint16_t external_commisssioner_port
931931
return 0;
932932
}
933933

934+
int8_t thread_bbr_get_commissioner_service(int8_t interface_id)
935+
{
936+
thread_bbr_t *this = thread_bbr_find_by_interface(interface_id);
937+
if (!this) {
938+
return 0;
939+
}
940+
941+
return this->br_service_id;
942+
}
934943
void thread_bbr_delete(int8_t interface_id)
935944
{
936945
thread_bbr_t *this = thread_bbr_find_by_interface(interface_id);

source/6LoWPAN/Thread/thread_bbr_api_internal.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,13 @@ void thread_bbr_seconds_timer(int8_t interface_id, uint32_t tics);
6666
* \param interface_id current interface id
6767
*/
6868
int thread_bbr_commissioner_proxy_service_update(int8_t interface_id);
69+
/**
70+
* \brief get commissioner service id to add new services
71+
*
72+
* \param interface_id current interface id
73+
* \return service id or 0 if invalid
74+
*/
75+
int8_t thread_bbr_get_commissioner_service(int8_t interface_id);
6976

7077
#else
7178
#define thread_bbr_init(interface_id, external_commisssioner_port)

source/6LoWPAN/Thread/thread_extension_bbr.c

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,8 @@ typedef struct {
105105
static NS_LIST_DEFINE(pbbr_instance_list, thread_pbbr_t, link);
106106
static NS_LIST_DEFINE(duplicate_dua_tr_list, duplicate_dua_tr_t, link);
107107

108-
#define THREAD_BBR_MLR_REGISTRATION_TIMEOUT 600 //<* Default MLR timeout in seconds
109-
#define THREAD_BBR_DUA_REGISTRATION_TIMEOUT 3600
108+
#define THREAD_BBR_MLR_REGISTRATION_TIMEOUT 3600 //<* Default MLR timeout in seconds
109+
#define THREAD_BBR_DUA_REGISTRATION_TIMEOUT 3600*24 //<* 24 hours and we refresh the sequence number
110110
#define THREAD_BBR_DUA_REGISTRATION_DELAY 5000 // 5 seconds in ms
111111
#define THREAD_BBR_BACKBONE_PORT 5683 //<* Backbone border router
112112
#define THREAD_BBR_DUA_DAD_QUERY_TIMEOUT 1 // wait period for Duplicate Address Detection
@@ -762,6 +762,7 @@ static int thread_extension_bbr_mlr_cb(int8_t service_id, uint8_t source_address
762762
uint8_t *addr_data_ptr;
763763
uint8_t *invalid_addr_ptr = NULL;
764764
uint32_t timeout_value;
765+
bool commissioner = false;
765766
uint8_t bbr_rloc_addr[16];
766767
uint8_t bbr_status = THREAD_EXTENSION_ST_DUA_SUCCESS;
767768
uint8_t payload[4 + 18];
@@ -786,14 +787,6 @@ static int thread_extension_bbr_mlr_cb(int8_t service_id, uint8_t source_address
786787

787788
addr_len = thread_meshcop_tlv_find(request_ptr->payload_ptr, request_ptr->payload_len, TMFCOP_TLV_IPV6_ADDRESS, &addr_data_ptr);
788789

789-
// check if we are not primary bbr respond status 5
790-
if (0 != thread_extension_primary_bbr_get(cur, bbr_rloc_addr, NULL, NULL, NULL) ||
791-
!addr_get_entry(cur, bbr_rloc_addr)) {
792-
// Primary BBR not present or I am not BBR
793-
bbr_status = THREAD_EXTENSION_ST_DUA_BBR_NOT_PRIMARY;
794-
goto send_response;
795-
}
796-
797790
//check if commissioner
798791
if (2 <= thread_meshcop_tlv_data_get_uint16(request_ptr->payload_ptr, request_ptr->payload_len, TMFCOP_TLV_COMMISSIONER_SESSION_ID, &session_id)) {
799792
// Session id present must be valid
@@ -804,8 +797,20 @@ static int thread_extension_bbr_mlr_cb(int8_t service_id, uint8_t source_address
804797
goto send_response;
805798
}
806799
thread_meshcop_tlv_data_get_uint32(request_ptr->payload_ptr, request_ptr->payload_len, TMFCOP_TLV_TIMEOUT, &timeout_value);
800+
commissioner = true;
801+
}
802+
803+
if (!commissioner) {
804+
// check if we are not primary bbr respond status 5
805+
if (0 != thread_extension_primary_bbr_get(cur, bbr_rloc_addr, NULL, NULL, NULL) ||
806+
!addr_get_entry(cur, bbr_rloc_addr)) {
807+
// Primary BBR not present or I am not BBR
808+
bbr_status = THREAD_EXTENSION_ST_DUA_BBR_NOT_PRIMARY;
809+
goto send_response;
810+
}
807811
}
808812

813+
809814
int16_t remaining = addr_len;
810815
uint8_t *addr_ptr = addr_data_ptr;
811816

@@ -848,7 +853,6 @@ static int thread_extension_bbr_mlr_cb(int8_t service_id, uint8_t source_address
848853
remaining -= 16;
849854
}
850855

851-
852856
send_response:
853857

854858
if (request_ptr->msg_type == COAP_MSG_TYPE_CONFIRMABLE) {
@@ -1120,9 +1124,6 @@ static int thread_extension_bbr_pbbr_stop(thread_pbbr_t *this)
11201124

11211125
coap_service_unregister_uri(this->coap_service_id, THREAD_URI_BBR_TRI_RX_NTF);
11221126
coap_service_unregister_uri(this->coap_service_id, THREAD_URI_BBR_NMK_RX_NTF);
1123-
coap_service_unregister_uri(this->coap_service_id, THREAD_URI_BBR_DOMAIN_ADDRESS_REGISTRATION);
1124-
coap_service_unregister_uri(this->coap_service_id, THREAD_URI_BBR_MCAST_LISTENER_REPORT);
1125-
coap_service_unregister_uri(this->coap_service_id, THREAD_URI_BBR_DATA_REQ);
11261127

11271128
coap_service_delete(this->br_bb_service_id);
11281129
this->br_bb_service_id = -1;
@@ -1184,17 +1185,9 @@ static int thread_extension_bbr_pbbr_start(thread_pbbr_t *this)
11841185
coap_service_register_uri(this->br_bb_service_id, THREAD_URI_TRI_TX_NTF, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_pbbr_relay_from_tri_cb);
11851186
coap_service_register_uri(this->br_bb_service_id, THREAD_URI_BBR_BMLR_NTF, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_extension_bbr_bmlr_cb);
11861187

1187-
// Register Mesh address registration URI
1188-
coap_service_register_uri(this->coap_service_id, THREAD_URI_BBR_MCAST_LISTENER_REPORT, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_extension_bbr_mlr_cb);
1189-
coap_service_register_uri(this->coap_service_id, THREAD_URI_BBR_DOMAIN_ADDRESS_REGISTRATION, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_extension_bbr_dua_cb);
11901188
// Register Mesh side relay URI
11911189
coap_service_register_uri(this->coap_service_id, THREAD_URI_BBR_TRI_RX_NTF, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_pbbr_relay_to_tri_cb);
11921190
coap_service_register_uri(this->coap_service_id, THREAD_URI_BBR_NMK_RX_NTF, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_pbbr_nmkp_relay_rx_recv_cb);
1193-
// Register BBR data request URI
1194-
coap_service_register_uri(this->coap_service_id, THREAD_URI_BBR_DATA_REQ, COAP_SERVICE_ACCESS_GET_ALLOWED, thread_pbbr_data_req_recv_cb);
1195-
coap_service_register_uri(this->coap_service_id, THREAD_URI_BBR_DATA_SET, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_pbbr_data_set_recv_cb);
1196-
coap_service_register_uri(this->coap_service_id, THREAD_URI_MGMT_SEC_PENDING_SET, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_pbbr_sec_data_set_recv_cb);
1197-
11981191

11991192
// create secure service for Network master key provisioning
12001193
this->coap_nmkp_virtual_service_id = coap_service_initialize(this->interface_id, THREAD_MANAGEMENT_PORT, COAP_SERVICE_OPTIONS_SECURE | COAP_SERVICE_OPTIONS_VIRTUAL_SOCKET, thread_pbbr_pskd_security_start_cb, NULL);
@@ -1249,6 +1242,20 @@ int8_t thread_extension_bbr_init(int8_t interface_id, int8_t backbone_interface_
12491242

12501243
// Set the partition weight to be 72
12511244
thread_management_partition_weighting_set(this->interface_id, 72);
1245+
// Register Mesh address registration URI
1246+
coap_service_register_uri(this->coap_service_id, THREAD_URI_BBR_MCAST_LISTENER_REPORT, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_extension_bbr_mlr_cb);
1247+
coap_service_register_uri(this->coap_service_id, THREAD_URI_BBR_DOMAIN_ADDRESS_REGISTRATION, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_extension_bbr_dua_cb);
1248+
// Register BBR data request URI
1249+
coap_service_register_uri(this->coap_service_id, THREAD_URI_BBR_DATA_REQ, COAP_SERVICE_ACCESS_GET_ALLOWED, thread_pbbr_data_req_recv_cb);
1250+
coap_service_register_uri(this->coap_service_id, THREAD_URI_BBR_DATA_SET, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_pbbr_data_set_recv_cb);
1251+
coap_service_register_uri(this->coap_service_id, THREAD_URI_MGMT_SEC_PENDING_SET, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_pbbr_sec_data_set_recv_cb);
1252+
1253+
// add features to secure commissioner port
1254+
int8_t commissioner_service_id = thread_bbr_get_commissioner_service(this->interface_id);
1255+
coap_service_register_uri(commissioner_service_id, THREAD_URI_BBR_DATA_REQ, COAP_SERVICE_ACCESS_GET_ALLOWED, thread_pbbr_data_req_recv_cb);
1256+
coap_service_register_uri(commissioner_service_id, THREAD_URI_BBR_DATA_SET, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_pbbr_data_set_recv_cb);
1257+
coap_service_register_uri(commissioner_service_id, THREAD_URI_MGMT_SEC_PENDING_SET, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_pbbr_sec_data_set_recv_cb);
1258+
coap_service_register_uri(commissioner_service_id, THREAD_URI_BBR_MCAST_LISTENER_REPORT, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_extension_bbr_mlr_cb);
12521259
return 0;
12531260
}
12541261

@@ -1259,6 +1266,12 @@ void thread_extension_bbr_delete(int8_t interface_id)
12591266
return;
12601267
}
12611268
thread_extension_bbr_pbbr_stop(this);
1269+
int8_t commissioner_service_id = thread_bbr_get_commissioner_service(this->interface_id);
1270+
coap_service_unregister_uri(commissioner_service_id, THREAD_URI_BBR_DATA_REQ);
1271+
coap_service_unregister_uri(commissioner_service_id, THREAD_URI_BBR_DATA_SET);
1272+
coap_service_unregister_uri(commissioner_service_id, THREAD_URI_MGMT_SEC_PENDING_SET);
1273+
coap_service_unregister_uri(commissioner_service_id, THREAD_URI_BBR_MCAST_LISTENER_REPORT);
1274+
12621275
coap_service_delete(this->coap_service_id);
12631276

12641277
ns_list_remove(&pbbr_instance_list, this);

0 commit comments

Comments
 (0)