From 30c538a9c48b01a9c16745af28f563902427114d Mon Sep 17 00:00:00 2001 From: Mika Tervonen Date: Tue, 2 Apr 2019 08:40:06 +0300 Subject: [PATCH] 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 --- source/6LoWPAN/Thread/thread_bbr_api.c | 9 +++ .../6LoWPAN/Thread/thread_bbr_api_internal.h | 7 +++ source/6LoWPAN/Thread/thread_extension_bbr.c | 57 ++++++++++++------- 3 files changed, 51 insertions(+), 22 deletions(-) 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);