diff --git a/source/6LoWPAN/Thread/thread_bbr_api.c b/source/6LoWPAN/Thread/thread_bbr_api.c index 88ec7898c88..c6473f8718d 100644 --- a/source/6LoWPAN/Thread/thread_bbr_api.c +++ b/source/6LoWPAN/Thread/thread_bbr_api.c @@ -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); diff --git a/source/6LoWPAN/Thread/thread_bbr_api_internal.h b/source/6LoWPAN/Thread/thread_bbr_api_internal.h index 9c26ccc41f4..e9074ebd67b 100644 --- a/source/6LoWPAN/Thread/thread_bbr_api_internal.h +++ b/source/6LoWPAN/Thread/thread_bbr_api_internal.h @@ -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) diff --git a/source/6LoWPAN/Thread/thread_extension_bbr.c b/source/6LoWPAN/Thread/thread_extension_bbr.c index 94b464d0378..099307fe58f 100644 --- a/source/6LoWPAN/Thread/thread_extension_bbr.c +++ b/source/6LoWPAN/Thread/thread_extension_bbr.c @@ -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 @@ -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]; @@ -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 @@ -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; @@ -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) { @@ -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; @@ -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); @@ -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; } @@ -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);