Skip to content

Commit

Permalink
Modified MLR handling
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Mika Tervonen committed Apr 2, 2019
1 parent 02942b0 commit 30c538a
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 22 deletions.
9 changes: 9 additions & 0 deletions source/6LoWPAN/Thread/thread_bbr_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -931,6 +931,15 @@ int8_t thread_bbr_init(int8_t interface_id, uint16_t external_commisssioner_port
return 0;
}

int8_t thread_bbr_get_commissioner_service(int8_t interface_id)
{
thread_bbr_t *this = thread_bbr_find_by_interface(interface_id);
if (!this) {
return 0;
}

return this->br_service_id;
}
void thread_bbr_delete(int8_t interface_id)
{
thread_bbr_t *this = thread_bbr_find_by_interface(interface_id);
Expand Down
7 changes: 7 additions & 0 deletions source/6LoWPAN/Thread/thread_bbr_api_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,13 @@ void thread_bbr_seconds_timer(int8_t interface_id, uint32_t tics);
* \param interface_id current interface id
*/
int thread_bbr_commissioner_proxy_service_update(int8_t interface_id);
/**
* \brief get commissioner service id to add new services
*
* \param interface_id current interface id
* \return service id or 0 if invalid
*/
int8_t thread_bbr_get_commissioner_service(int8_t interface_id);

#else
#define thread_bbr_init(interface_id, external_commisssioner_port)
Expand Down
57 changes: 35 additions & 22 deletions source/6LoWPAN/Thread/thread_extension_bbr.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,8 @@ typedef struct {
static NS_LIST_DEFINE(pbbr_instance_list, thread_pbbr_t, link);
static NS_LIST_DEFINE(duplicate_dua_tr_list, duplicate_dua_tr_t, link);

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

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

// check if we are not primary bbr respond status 5
if (0 != thread_extension_primary_bbr_get(cur, bbr_rloc_addr, NULL, NULL, NULL) ||
!addr_get_entry(cur, bbr_rloc_addr)) {
// Primary BBR not present or I am not BBR
bbr_status = THREAD_EXTENSION_ST_DUA_BBR_NOT_PRIMARY;
goto send_response;
}

//check if commissioner
if (2 <= thread_meshcop_tlv_data_get_uint16(request_ptr->payload_ptr, request_ptr->payload_len, TMFCOP_TLV_COMMISSIONER_SESSION_ID, &session_id)) {
// Session id present must be valid
Expand All @@ -804,8 +797,20 @@ static int thread_extension_bbr_mlr_cb(int8_t service_id, uint8_t source_address
goto send_response;
}
thread_meshcop_tlv_data_get_uint32(request_ptr->payload_ptr, request_ptr->payload_len, TMFCOP_TLV_TIMEOUT, &timeout_value);
commissioner = true;
}

if (!commissioner) {
// check if we are not primary bbr respond status 5
if (0 != thread_extension_primary_bbr_get(cur, bbr_rloc_addr, NULL, NULL, NULL) ||
!addr_get_entry(cur, bbr_rloc_addr)) {
// Primary BBR not present or I am not BBR
bbr_status = THREAD_EXTENSION_ST_DUA_BBR_NOT_PRIMARY;
goto send_response;
}
}


int16_t remaining = addr_len;
uint8_t *addr_ptr = addr_data_ptr;

Expand Down Expand Up @@ -848,7 +853,6 @@ static int thread_extension_bbr_mlr_cb(int8_t service_id, uint8_t source_address
remaining -= 16;
}


send_response:

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

coap_service_unregister_uri(this->coap_service_id, THREAD_URI_BBR_TRI_RX_NTF);
coap_service_unregister_uri(this->coap_service_id, THREAD_URI_BBR_NMK_RX_NTF);
coap_service_unregister_uri(this->coap_service_id, THREAD_URI_BBR_DOMAIN_ADDRESS_REGISTRATION);
coap_service_unregister_uri(this->coap_service_id, THREAD_URI_BBR_MCAST_LISTENER_REPORT);
coap_service_unregister_uri(this->coap_service_id, THREAD_URI_BBR_DATA_REQ);

coap_service_delete(this->br_bb_service_id);
this->br_bb_service_id = -1;
Expand Down Expand Up @@ -1184,17 +1185,9 @@ static int thread_extension_bbr_pbbr_start(thread_pbbr_t *this)
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);
coap_service_register_uri(this->br_bb_service_id, THREAD_URI_BBR_BMLR_NTF, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_extension_bbr_bmlr_cb);

// Register Mesh address registration URI
coap_service_register_uri(this->coap_service_id, THREAD_URI_BBR_MCAST_LISTENER_REPORT, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_extension_bbr_mlr_cb);
coap_service_register_uri(this->coap_service_id, THREAD_URI_BBR_DOMAIN_ADDRESS_REGISTRATION, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_extension_bbr_dua_cb);
// Register Mesh side relay URI
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);
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);
// Register BBR data request URI
coap_service_register_uri(this->coap_service_id, THREAD_URI_BBR_DATA_REQ, COAP_SERVICE_ACCESS_GET_ALLOWED, thread_pbbr_data_req_recv_cb);
coap_service_register_uri(this->coap_service_id, THREAD_URI_BBR_DATA_SET, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_pbbr_data_set_recv_cb);
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);


// create secure service for Network master key provisioning
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);
Expand Down Expand Up @@ -1249,6 +1242,20 @@ int8_t thread_extension_bbr_init(int8_t interface_id, int8_t backbone_interface_

// Set the partition weight to be 72
thread_management_partition_weighting_set(this->interface_id, 72);
// Register Mesh address registration URI
coap_service_register_uri(this->coap_service_id, THREAD_URI_BBR_MCAST_LISTENER_REPORT, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_extension_bbr_mlr_cb);
coap_service_register_uri(this->coap_service_id, THREAD_URI_BBR_DOMAIN_ADDRESS_REGISTRATION, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_extension_bbr_dua_cb);
// Register BBR data request URI
coap_service_register_uri(this->coap_service_id, THREAD_URI_BBR_DATA_REQ, COAP_SERVICE_ACCESS_GET_ALLOWED, thread_pbbr_data_req_recv_cb);
coap_service_register_uri(this->coap_service_id, THREAD_URI_BBR_DATA_SET, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_pbbr_data_set_recv_cb);
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);

// add features to secure commissioner port
int8_t commissioner_service_id = thread_bbr_get_commissioner_service(this->interface_id);
coap_service_register_uri(commissioner_service_id, THREAD_URI_BBR_DATA_REQ, COAP_SERVICE_ACCESS_GET_ALLOWED, thread_pbbr_data_req_recv_cb);
coap_service_register_uri(commissioner_service_id, THREAD_URI_BBR_DATA_SET, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_pbbr_data_set_recv_cb);
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);
coap_service_register_uri(commissioner_service_id, THREAD_URI_BBR_MCAST_LISTENER_REPORT, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_extension_bbr_mlr_cb);
return 0;
}

Expand All @@ -1259,6 +1266,12 @@ void thread_extension_bbr_delete(int8_t interface_id)
return;
}
thread_extension_bbr_pbbr_stop(this);
int8_t commissioner_service_id = thread_bbr_get_commissioner_service(this->interface_id);
coap_service_unregister_uri(commissioner_service_id, THREAD_URI_BBR_DATA_REQ);
coap_service_unregister_uri(commissioner_service_id, THREAD_URI_BBR_DATA_SET);
coap_service_unregister_uri(commissioner_service_id, THREAD_URI_MGMT_SEC_PENDING_SET);
coap_service_unregister_uri(commissioner_service_id, THREAD_URI_BBR_MCAST_LISTENER_REPORT);

coap_service_delete(this->coap_service_id);

ns_list_remove(&pbbr_instance_list, this);
Expand Down

0 comments on commit 30c538a

Please sign in to comment.