Skip to content

Commit

Permalink
DUA.ntf to MTD child implemented (ARMmbed#1735)
Browse files Browse the repository at this point in the history
  • Loading branch information
deepakvenugopal authored Jul 10, 2018
1 parent 3f5c6c1 commit c593e2b
Show file tree
Hide file tree
Showing 8 changed files with 124 additions and 12 deletions.
2 changes: 1 addition & 1 deletion source/6LoWPAN/Thread/thread_bootstrap.c
Original file line number Diff line number Diff line change
Expand Up @@ -2697,7 +2697,7 @@ int thread_bootstrap_network_data_activate(protocol_interface_info_entry_t *cur)
thread_router_bootstrap_anycast_address_register(cur);
// Update joiner router status
thread_management_server_joiner_router_init(cur->id);
thread_extension_joiner_router_init(cur->id);
thread_extension_service_init(cur);

// Update border router relay
thread_bbr_commissioner_proxy_service_update(cur->id);
Expand Down
102 changes: 95 additions & 7 deletions source/6LoWPAN/Thread/thread_extension.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,20 +82,77 @@ typedef struct thread_extension_info {
bool update_needed:1;
} thread_extension_info_t;

#ifdef HAVE_THREAD_ROUTER
static int thread_extension_joiner_router_init(protocol_interface_info_entry_t *cur);
#else
#define thread_extension_joiner_router_init(cur)
#endif

static int thread_extension_dua_registration_cb(int8_t service_id, uint8_t source_address[static 16], uint16_t source_port, sn_coap_hdr_s *response_ptr)
{
(void) service_id;
(void) source_address;
(void) source_port;
(void) response_ptr;

uint16_t addr_len;
uint8_t *bbr_status;
uint8_t *addr_data_ptr = NULL;

protocol_interface_info_entry_t *cur = protocol_stack_interface_info_get_by_id(thread_management_client_get_interface_id_by_service_id(service_id));

if (!cur) {
return -1;
}

if (!response_ptr ) {
tr_warn("DUA.resp failed");
return -2;
}

if (1 > thread_meshcop_tlv_find(response_ptr->payload_ptr, response_ptr->payload_len, TMFCOP_TLV_STATUS, &bbr_status)) {
return -3;
}

if (*bbr_status == 0) {
// registration successful
return 0;
}

addr_len = thread_meshcop_tlv_find(response_ptr->payload_ptr, response_ptr->payload_len, TMFCOP_TLV_TARGET_EID, &addr_data_ptr);

if (addr_len < 16) {
tr_warn("Invalid target eid in DUA.rsp cb message");
return -4;
}

// registration unsuccessful
ipv6_neighbour_t *neighbour_entry;
uint16_t nce_short_addr;
uint8_t payload[16 + 1]; // Target eid + Status
uint8_t *ptr;
uint8_t destination_address[16] = {0};

neighbour_entry = ipv6_neighbour_lookup(&cur->ipv6_neighbour_cache, addr_data_ptr);
if (!neighbour_entry) {
return 0;
}
// TODO update registration information of BBR
// TODO in case of failure Retry the registrations after a certain period;

nce_short_addr = common_read_16_bit(neighbour_entry->ll_address + 2);
if (!thread_addr_is_child(cur->thread_info->routerShortAddress,nce_short_addr)) {
return 0;
}
thread_addr_write_mesh_local_16(destination_address, nce_short_addr, cur->thread_info);

ptr = payload;
ptr = thread_tmfcop_tlv_data_write(ptr, TMFCOP_TLV_TARGET_EID, 16, addr_data_ptr);
ptr = thread_tmfcop_tlv_data_write_uint8(ptr, TMFCOP_TLV_STATUS, *bbr_status);

coap_service_request_send(service_id, COAP_REQUEST_OPTIONS_ADDRESS_SHORT,
destination_address, THREAD_MANAGEMENT_PORT,
COAP_MSG_TYPE_NON_CONFIRMABLE, COAP_MSG_CODE_REQUEST_POST,
THREAD_URI_BBR_DOMAIN_ADDRESS_NOTIFICATION, COAP_CT_OCTET_STREAM,
payload, ptr - payload, NULL);

ipv6_neighbour_entry_remove(&cur->ipv6_neighbour_cache, neighbour_entry);

return 0;
}
Expand All @@ -111,6 +168,17 @@ static int thread_comercial_mlr_cb(int8_t service_id, uint8_t source_address[sta
return 0;
}

static int thread_extension_mtd_dua_ntf_cb(int8_t service_id, uint8_t source_address[static 16], uint16_t source_port, sn_coap_hdr_s *response_ptr)
{
(void) service_id;
(void) source_address;
(void) source_port;
(void) response_ptr;

tr_debug("Thread MTD n/dn callback");

return 0;
}

static int thread_extension_primary_bbr_update_needed(struct protocol_interface_info_entry *cur, uint16_t rloc, uint8_t seq)
{
Expand Down Expand Up @@ -330,6 +398,11 @@ void thread_extension_init(int8_t interface_id, int8_t coap_service_id)
cur->thread_info->extension_info->coap_service_id = coap_service_id;
}

void thread_extension_mtd_service_register(protocol_interface_info_entry_t *cur)
{
coap_service_register_uri(thread_management_client_service_id_get(cur->id), THREAD_URI_BBR_DOMAIN_ADDRESS_NOTIFICATION, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_extension_mtd_dua_ntf_cb);
}

static int thread_extension_mlr_req_send(protocol_interface_info_entry_t *cur, const uint8_t br_addr[16], const uint8_t *address, uint8_t address_len)
{

Expand Down Expand Up @@ -647,6 +720,22 @@ void thread_extension_discover_response_tlv_write(uint16_t *data, uint8_t versio
}
}

int thread_extension_service_init(protocol_interface_info_entry_t *cur)
{
if (!cur->thread_info->extension_info || !cur->thread_info->extension_info->coap_service_id) {
return -1;
}

if (cur->thread_info->thread_device_mode == THREAD_DEVICE_MODE_END_DEVICE ||
cur->thread_info->thread_device_mode == THREAD_DEVICE_MODE_SLEEPY_END_DEVICE) {
thread_extension_mtd_service_register(cur);
} else if (cur->thread_info->thread_device_mode == THREAD_DEVICE_MODE_ROUTER) {
thread_extension_joiner_router_init(cur);
}

return 0;
}

#ifdef HAVE_THREAD_ROUTER
static int thread_extension_relay_tx_cb(int8_t service_id, uint8_t source_address[16], uint16_t source_port, sn_coap_hdr_s *request_ptr)
{
Expand Down Expand Up @@ -772,12 +861,11 @@ static void thread_extension_joiner_router_deinit(protocol_interface_info_entry_
return;
}

int thread_extension_joiner_router_init(int8_t interface_id)
static int thread_extension_joiner_router_init(protocol_interface_info_entry_t *cur)
{
protocol_interface_info_entry_t *cur = protocol_stack_interface_info_get_by_id(interface_id);
int8_t securityLinkLayer = 0;

if (!cur || !cur->thread_info->extension_info) {
if (!cur->thread_info->extension_info) {
return -1;
}

Expand Down
6 changes: 3 additions & 3 deletions source/6LoWPAN/Thread/thread_extension.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ struct discovery_response_list;
void thread_extension_allocate(protocol_interface_info_entry_t *cur);
void thread_extension_free(protocol_interface_info_entry_t *cur);
void thread_extension_init(int8_t interface_id, int8_t coap_service_id);
void thread_extension_mtd_service_register(protocol_interface_info_entry_t *cur);
int thread_extension_network_prefix_get(int8_t interface_id, uint8_t *options_ptr, uint8_t *prefix_ptr, uint8_t *prefix_len);
void thread_extension_network_data_process(struct protocol_interface_info_entry *cur);
int thread_extension_primary_bbr_get(struct protocol_interface_info_entry *cur, uint8_t *addr_ptr, uint8_t *seq_ptr, uint32_t *timer1_ptr, uint32_t *timer2_ptr);
Expand All @@ -60,14 +61,13 @@ bool thread_extension_enabled(protocol_interface_info_entry_t *cur);
bool thread_extension_version_check(uint8_t version);
void thread_extension_discover_response_read(struct discovery_response_list *nwk_info, uint16_t discover_response_tlv, uint8_t *data_ptr, uint16_t data_len);
void thread_extension_discover_response_tlv_write(uint16_t *data, uint8_t version, uint16_t securityPolicy);
int thread_extension_service_init(protocol_interface_info_entry_t *cur);
#ifdef HAVE_THREAD_ROUTER
int thread_extension_joiner_router_init(int8_t interface_id);
bool thread_extension_joining_enabled(int8_t interface_id);
uint8_t thread_extension_discover_response_len(protocol_interface_info_entry_t *cur);
uint8_t *thread_extension_discover_response_write(protocol_interface_info_entry_t *cur, uint8_t *ptr);

#else
#define thread_extension_joiner_router_init(interface_id)
#define thread_extension_joining_enabled(interface_id) false
#define thread_extension_discover_response_len(cur) 0
#define thread_extension_discover_response_write(cur, ptr) (ptr)
Expand All @@ -91,7 +91,7 @@ uint8_t *thread_extension_discover_response_write(protocol_interface_info_entry_
#define thread_extension_version_check(version) (false)
#define thread_extension_discover_response_read(nwk_info, discover_response_tlv, data_ptr, data_len)
#define thread_extension_discover_response_tlv_write(data, version, extension_bit) (data)
#define thread_extension_joiner_router_init(interface_id)
#define thread_extension_service_init(cur) 0
#define thread_extension_joining_enabled(interface_id) false
#define thread_extension_discover_response_len(cur) 0
#define thread_extension_discover_response_write(cur, ptr) (ptr)
Expand Down
1 change: 1 addition & 0 deletions source/6LoWPAN/Thread/thread_extension_constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ typedef struct discovery_additional_info {
#define THREAD_URI_BBR_MCAST_LISTENER_REPORT "n/mr" //<* 1.2 feature
#define THREAD_URI_BBR_BMLR_NTF "n/bmr" //<* 1.2 feature
#define THREAD_URI_BBR_DOMAIN_ADDRESS_REGISTRATION "n/dr" //<* 1.2 feature
#define THREAD_URI_BBR_DOMAIN_ADDRESS_NOTIFICATION "n/dn" //<* 1.2 feature
#define THREAD_URI_BBR_TRI_RX_NTF "c/rxr" //<* Backbone border router
#define THREAD_URI_BBR_NMK_RX_NTF "c/rxb" //<* Backbone border router
#define THREAD_URI_BBR_TRI_TX_NTF "c/txr" //<* Backbone border router
Expand Down
9 changes: 9 additions & 0 deletions source/6LoWPAN/Thread/thread_management_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,15 @@ static int thread_management_client_neighbor_discovery_data_cb(int8_t service_id
return 0;
}

int thread_management_client_get_interface_id_by_service_id(int8_t service_id)
{
thread_management_t *this = thread_management_find_by_service(service_id);
if (!this) {
return -1;
}
return this->interface_id;
}

int thread_management_client_neighbor_discovery_data_request(int8_t interface_id, const uint8_t destination[16], const uint8_t *options, uint8_t options_len, thread_management_client_network_data_set_cb *set_cb)
{
thread_management_t *this = thread_management_find(interface_id);
Expand Down
9 changes: 9 additions & 0 deletions source/6LoWPAN/Thread/thread_management_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,15 @@ int thread_management_client_network_data_unregister(int8_t interface_id, uint16
*/
int thread_management_client_neighbor_discovery_data_request(int8_t interface_id, const uint8_t destination[16], const uint8_t *options, uint8_t options_len, thread_management_client_network_data_set_cb *set_cb);

/** Get interface_id of based on coap service_id
*
*
* /param service_id coap service id.
*
*return interface_id of thread instance if successful and -1 for failure
*/
int thread_management_client_get_interface_id_by_service_id(int8_t service_id);

/** send active configuration dataset get for parent
*
* /param interface_id interface id of this thread instance.
Expand Down
1 change: 0 additions & 1 deletion source/6LoWPAN/Thread/thread_management_server.c
Original file line number Diff line number Diff line change
Expand Up @@ -1159,7 +1159,6 @@ int thread_management_server_init(int8_t interface_id)
}
#endif
thread_extension_init(interface_id, this->coap_service_id);

// All thread devices
coap_service_register_uri(this->coap_service_id, THREAD_URI_MANAGEMENT_GET, COAP_SERVICE_ACCESS_GET_ALLOWED, thread_management_server_get_command_cb);

Expand Down
6 changes: 6 additions & 0 deletions test/nanostack/unittest/stub/thread_extension_stub.c
Original file line number Diff line number Diff line change
Expand Up @@ -168,4 +168,10 @@ uint8_t *thread_extension_discover_response_write(protocol_interface_info_entry_
return ptr;
}

int thread_extension_service_init(protocol_interface_info_entry_t *cur)
{
(void)cur;
return 0;
}

#endif

0 comments on commit c593e2b

Please sign in to comment.