Skip to content

Commit

Permalink
additional thread prefixes in network data (ARMmbed#1833)
Browse files Browse the repository at this point in the history
prefix distribution moved from active dataset to network data.
  • Loading branch information
deepakvenugopal authored Sep 27, 2018
1 parent fb07086 commit 9b14b83
Show file tree
Hide file tree
Showing 10 changed files with 83 additions and 177 deletions.
1 change: 1 addition & 0 deletions nanostack/thread_bbr_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ int thread_bbr_start(int8_t interface_id, int8_t backbone_interface_id);
*
*/
int thread_bbr_timeout_set(int8_t interface_id, uint32_t timeout_a, uint32_t timeout_b, uint32_t delay);

/**
* Set prefix to be used as combining multiple thread networks on backbone.
*
Expand Down
15 changes: 7 additions & 8 deletions source/6LoWPAN/Thread/thread_bootstrap.c
Original file line number Diff line number Diff line change
Expand Up @@ -675,9 +675,6 @@ static void thread_bootstrap_ml_address_update(protocol_interface_info_entry_t *
// Generate new ML64 address
thread_generate_ml64_address(cur);

// Generate new domain address
thread_extension_address_generate(cur);

// Register multicast addresses
thread_bootstrap_all_nodes_multicast_register(cur);

Expand All @@ -697,8 +694,6 @@ int thread_configuration_thread_activate(protocol_interface_info_entry_t *cur, l
//Define Default Contexts
lowpan_context_update(&cur->lowpan_contexts, LOWPAN_CONTEXT_C, 0xFFFF, linkConfiguration->mesh_local_ula_prefix, 64, true);

thread_extension_activate(cur);

thread_extension_bbr_route_update(cur);

blacklist_clear();
Expand Down Expand Up @@ -1634,7 +1629,6 @@ void thread_bootstrap_routing_activate(protocol_interface_info_entry_t *cur)
if (cur->thread_info->thread_device_mode == THREAD_DEVICE_MODE_FULL_END_DEVICE ||
cur->thread_info->thread_device_mode == THREAD_DEVICE_MODE_ROUTER) {
thread_meshlocal_route_set(cur);
thread_extension_route_set(cur);
// FEDs and routers (REEDs) perform their own address resolution
thread_nd_service_activate(cur->id);
} else {
Expand Down Expand Up @@ -1666,8 +1660,6 @@ void thread_bootstrap_attached_finish(protocol_interface_info_entry_t *cur)
thread_generate_ml16_address(cur);
//GENERATE ML-EID64
thread_generate_ml64_address(cur);
// Generate new domain address
thread_extension_address_generate(cur);
thread_bootstrap_routing_activate(cur);
thread_bootstrap_network_data_update(cur);
// After successful attach if there is announcement info present, send announcement back to previous channel
Expand Down Expand Up @@ -2381,6 +2373,7 @@ static int thread_nd_prefix_context_allocate(protocol_interface_info_entry_t *cu
if (cid == 16) {
return -1;
}

context.cid = cid;
context.compression = true;
context.stableData = stableData;
Expand Down Expand Up @@ -2821,6 +2814,8 @@ void thread_bootstrap_network_prefixes_process(protocol_interface_info_entry_t *
if (curBorderRouter->P_dhcp && weHostService && nd_proxy_enabled_for_upstream(cur->id) && nd_proxy_upstream_route_onlink(cur->id,curPrefix->servicesPrefix)) {
// don't add
tr_debug("Suppressing onlink %s for proxy", trace_ipv6_prefix(curPrefix->servicesPrefix, curPrefix->servicesPrefixLen));
} else if (curBorderRouter->P_res1) {
ipv6_route_add(curPrefix->servicesPrefix, curPrefix->servicesPrefixLen, cur->id, NULL, ROUTE_THREAD, 0xffffffff, 0);
} else {
//add
tr_debug("Adding onlink %s", trace_ipv6_prefix(curPrefix->servicesPrefix, curPrefix->servicesPrefixLen));
Expand Down Expand Up @@ -2866,6 +2861,10 @@ void thread_bootstrap_network_prefixes_process(protocol_interface_info_entry_t *
icmpv6_slaac_address_add(cur, curPrefix->servicesPrefix, curPrefix->servicesPrefixLen, 0xffffffff, 0xffffffff, true, SLAAC_IID_DEFAULT);
}
}
// generate address based on res1 bit
if (curBorderRouter->P_res1) {
thread_extension_dua_address_generate(cur,curPrefix->servicesPrefix,64);
}

} // for each borderRouterList

Expand Down
142 changes: 35 additions & 107 deletions source/6LoWPAN/Thread/thread_extension.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,10 @@ typedef struct thread_extension_info {

#ifdef HAVE_THREAD_ROUTER
static int thread_extension_joiner_router_init(protocol_interface_info_entry_t *cur);
static bool thread_extension_is_domain_prefix(protocol_interface_info_entry_t *interface, const uint8_t *addr);
#else
#define thread_extension_joiner_router_init(cur)
#define thread_extension_is_domain_prefix(interface, addr) false
#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)
Expand Down Expand Up @@ -131,7 +133,7 @@ static int thread_extension_dua_registration_cb(int8_t service_id, uint8_t sourc
if_address_entry_t *addr_entry = addr_get_entry(cur, addr_data_ptr);
if (addr_entry) {
cur->dad_failures++;
thread_extension_address_generate(cur);
thread_extension_dua_address_generate(cur,addr_data_ptr, 64);
return 0;
}

Expand Down Expand Up @@ -192,7 +194,7 @@ static int thread_extension_mtd_dua_ntf_cb(int8_t service_id, uint8_t source_add
}
// generate new dua address
cur->dad_failures++;
thread_extension_address_generate(cur);
thread_extension_dua_address_generate(cur, addr_data_ptr, 64);

return 0;
}
Expand Down Expand Up @@ -322,15 +324,12 @@ void thread_extension_addr_ntf_send(struct protocol_interface_info_entry *cur, u
{
uint8_t payload[16 + 1]; // Target eid + Status
uint8_t *ptr;
uint8_t domain_prefix[16];
uint8_t domain_prefix_len;
uint8_t br_ml_addr[16];
uint8_t seq;
uint32_t delay_timer;

if (0 != thread_extension_network_prefix_get(cur->id, NULL, domain_prefix, &domain_prefix_len) ||
!bitsequal(addr_data_ptr, domain_prefix, domain_prefix_len)) {
//Not in commercial Mode

if (!thread_extension_is_domain_prefix(cur, addr_data_ptr)) {
return;
}

Expand All @@ -351,38 +350,6 @@ void thread_extension_addr_ntf_send(struct protocol_interface_info_entry *cur, u
return;
}

int thread_extension_network_prefix_get(int8_t interface_id, uint8_t *options_ptr, uint8_t *domain_prefix_ptr, uint8_t *domain_prefix_len)
{
uint8_t *ptr;
uint16_t tlv_len;
uint8_t *configuration_ptr;
uint16_t configuration_len;
configuration_ptr = thread_joiner_application_active_config_params_get(interface_id, &configuration_len);
if (!configuration_ptr || !configuration_len) {
return -1;
}
tlv_len = thread_meshcop_tlv_find(configuration_ptr,configuration_len, MESHCOP_TLV_DOMAIN_PREFIX, &ptr);
if (tlv_len == 0) {
return -2;
}
if (tlv_len < 9) {
tr_error("domain prefix corrupted len:%d", tlv_len);
return -3;
}

if (domain_prefix_len) {
*domain_prefix_len = 64;
}
if (options_ptr) {
*options_ptr = ptr[0];
}
if (domain_prefix_ptr) {
bitcopy(domain_prefix_ptr, &ptr[1], 64);
}

return 0;
}

static void thread_extension_primary_bbr_update_done(struct protocol_interface_info_entry *cur)
{
// Check if network data changed or bbr info and send proactive an if needed
Expand All @@ -407,8 +374,6 @@ void thread_extension_network_data_process(struct protocol_interface_info_entry
{
// Check if network data changed or bbr info and send proactive an if needed
uint8_t addr[16];
uint8_t domain_prefix[16];
uint8_t domain_prefix_len;
uint8_t sequence_number;
uint32_t delay_timer;
uint32_t mlr_timeout;
Expand All @@ -420,17 +385,8 @@ void thread_extension_network_data_process(struct protocol_interface_info_entry
if (1 == thread_extension_primary_bbr_update_needed(cur,common_read_16_bit(&addr[14]), sequence_number)) {
thread_address_registration_timer_set(cur, 1 + randLIB_get_random_in_range(0, delay_timer/1000), randLIB_get_random_in_range(1,5));
}
// Check if we are the BBR if we are make default route to backend
if (0 == thread_extension_network_prefix_get(cur->id, NULL, domain_prefix, &domain_prefix_len)) {
// Routers and FEDs create on-mesh prefix for domain prefix
if (cur->thread_info->thread_device_mode == THREAD_DEVICE_MODE_ROUTER ||
cur->thread_info->thread_device_mode == THREAD_DEVICE_MODE_FULL_END_DEVICE){
if (ipv6_route_add(domain_prefix, domain_prefix_len, cur->id, NULL, ROUTE_THREAD, 0xffffffff, 0) == NULL) {
tr_error("fail to add domain prefix route");
}
}
}
}

static uint8_t *thread_server_tlv_list_get(uint8_t *service_tlv_ptr, uint16_t service_tlv_len , uint16_t *server_tlv_list_len)
{
uint16_t tlv_length = 0;
Expand Down Expand Up @@ -576,19 +532,14 @@ static int thread_extension_mlr_req_send(protocol_interface_info_entry_t *cur, c
return 0;
}


void thread_extension_address_registration(struct protocol_interface_info_entry *interface, const uint8_t *addr, const uint8_t *child_mac64, bool refresh_child_entry, bool duplicate_child_detected)
{
uint8_t *ml_eid;
uint8_t br_ml_addr[16];
uint8_t seq;
uint32_t delay_timer;
uint8_t domain_prefix[16];
uint8_t domain_prefix_len;

if (0 != thread_extension_network_prefix_get(interface->id, NULL, domain_prefix, &domain_prefix_len) ||
!bitsequal(addr, domain_prefix, domain_prefix_len)) {
//Not in commercial Mode
if (!thread_extension_is_domain_prefix(interface, addr)) {
return;
}
tr_debug("domain prefix address");
Expand Down Expand Up @@ -671,22 +622,13 @@ void thread_extension_address_registration(struct protocol_interface_info_entry
}
#endif
}
void thread_extension_address_generate(protocol_interface_info_entry_t *cur)

void thread_extension_dua_address_generate(protocol_interface_info_entry_t *cur, uint8_t *domain_prefix, uint8_t domain_prefix_len)
{
if_address_entry_t *def_address = NULL;
uint8_t options;
uint8_t domain_prefix_len;
uint8_t domain_address[16];
addr_delete_matching(cur, NULL, 0, ADDR_SOURCE_THREAD_DOMAIN);

if (thread_extension_network_prefix_get(cur->id, &options, domain_address, &domain_prefix_len)) {
return;
}
if (!(options & 0x80)) {
tr_debug("domain prefix does not allow SLAAC address, prefix %s options:%u",trace_ipv6_prefix(domain_address,domain_prefix_len),options);
return;
}

uint8_t domain_address[16];
memcpy(domain_address, domain_prefix, 8);
def_address = icmpv6_slaac_address_add(cur, domain_address, domain_prefix_len, 0xffffffff, 0xffffffff, true, SLAAC_IID_DEFAULT);
if (def_address) {
tr_info("Generated domain address 64: %s", trace_ipv6(def_address->address));
Expand Down Expand Up @@ -814,43 +756,6 @@ void thread_extension_address_registration_trigger(protocol_interface_info_entry
}
}

void thread_extension_route_set(protocol_interface_info_entry_t *cur)
{
uint8_t domain_prefix[16];
uint8_t domain_prefix_len;
if (0 == thread_extension_network_prefix_get(cur->id, NULL, domain_prefix, &domain_prefix_len)) {
tr_info("domain prefix route handling");
// If we are Primary BBR we dont do this, but we dont know when we become it so We must remove this if selected as pBBR
if (ipv6_route_add(domain_prefix, domain_prefix_len, cur->id, NULL, ROUTE_THREAD, 0xffffffff, 0) == NULL) {
tr_error("fail to add domain prefix route");
}
}
}
void thread_extension_activate(protocol_interface_info_entry_t *cur)
{
uint8_t domain_prefix[16];
uint8_t domain_prefix_len;
if (0 == thread_extension_network_prefix_get(cur->id, NULL, domain_prefix, &domain_prefix_len)) {
// Domain prefix available create DUA address.
// Domain prefix is allways context id 1
tr_info("domain prefix Context created");
lowpan_context_update(&cur->lowpan_contexts, LOWPAN_CONTEXT_C | 1, 0xFFFF, domain_prefix, domain_prefix_len, true);

}
}

bool thread_extension_context_can_delete(int8_t id, uint8_t servicesPrefix[16], uint8_t context_prefix_length)
{
uint8_t domain_prefix[16];
uint8_t domain_prefix_len;
if (0 == thread_extension_network_prefix_get(id, NULL,domain_prefix, &domain_prefix_len)) {
if (context_prefix_length == domain_prefix_len && memcmp(domain_prefix, servicesPrefix, context_prefix_length/8) == 0) {
return false;
}
}
return true;
}

bool thread_extension_enabled(protocol_interface_info_entry_t *cur)
{
if (thread_info(cur)->version <= THREAD_PROTOCOL_VERSION) {
Expand Down Expand Up @@ -966,6 +871,29 @@ static int thread_extension_relay_tx_cb(int8_t service_id, uint8_t source_addres
return -1; // OK no response sent
}

static bool thread_extension_is_domain_prefix(protocol_interface_info_entry_t *interface, const uint8_t *addr)
{
uint8_t address[16];
memcpy(address, addr, 16);
thread_prefix_tlv_t prefixTlv;
prefixTlv.domainId = 0;
prefixTlv.Prefix = address;
prefixTlv.PrefixLen = 64;
thread_network_data_prefix_cache_entry_t *prefix_entry = NULL;
thread_network_data_cache_entry_t *networkDataCache = &interface->thread_info->networkDataStorage;
prefix_entry = thread_prefix_entry_find(&networkDataCache->localPrefixList, &prefixTlv);
if (!prefix_entry) {
return false;
}
ns_list_foreach(thread_network_server_data_entry_t, brEntry, &prefix_entry->borderRouterList) {
if (brEntry->P_res1) {
return true;
}
}
return false;

}

static void thread_extension_relay_socket_cb(void *cb_res)
{
socket_callback_t *sckt_data = 0;
Expand Down
12 changes: 2 additions & 10 deletions source/6LoWPAN/Thread/thread_extension.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,19 +46,15 @@ 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);
void thread_extension_address_registration(struct protocol_interface_info_entry *interface, const uint8_t *addr, const uint8_t *child_mac64, bool refresh_child_entry, bool duplicate_child_detected);
void thread_extension_address_generate(protocol_interface_info_entry_t *cur);
void thread_extension_dua_address_generate(protocol_interface_info_entry_t *cur, uint8_t *domain_prefix, uint8_t domain_prefix_len);
void thread_extension_aloc_generate(struct protocol_interface_info_entry *cur);
bool thread_extension_aloc_map(protocol_interface_info_entry_t *cur, uint16_t *addr16);
void thread_extension_mcast_subscrition_change(protocol_interface_info_entry_t *interface);
void thread_extension_address_registration_trigger(protocol_interface_info_entry_t *interface);
void thread_extension_route_set(protocol_interface_info_entry_t *cur);
void thread_extension_activate(protocol_interface_info_entry_t *cur);
bool thread_extension_enabled(protocol_interface_info_entry_t *cur);
bool thread_extension_context_can_delete(int8_t id, uint8_t servicesPrefix[16], uint8_t context_prefix_length);
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);
Expand All @@ -79,16 +75,12 @@ uint8_t *thread_extension_discover_response_write(protocol_interface_info_entry_
#define thread_extension_allocate(cur)
#define thread_extension_free(cur)
#define thread_extension_init(interface_id,coap_service_id)
#define thread_extension_network_prefix_get(interface_id,options_ptr,prefix_ptr,prefix_len) (-1)
#define thread_extension_network_data_process(cur)
#define thread_extension_primary_bbr_get(cur,addr_ptr,seq_ptr,timer1_ptr, timer2_ptr) (-1)
#define thread_extension_address_registration(interface,addr,child_mac64,refresh_child_entry,duplicate_child_detected)
#define thread_extension_address_generate(cur)
#define thread_extension_aloc_generate(cur)
#define thread_extension_aloc_map(cur, addr16) false
#define thread_extension_mcast_subscrition_change(interface)
#define thread_extension_route_set(cur)
#define thread_extension_activate(cur)
#define thread_extension_enabled(cur) (false)
#define thread_extension_version_check(version) (false)
#define thread_extension_discover_response_read(nwk_info, discover_response_tlv, data_ptr, data_len)
Expand All @@ -98,7 +90,7 @@ uint8_t *thread_extension_discover_response_write(protocol_interface_info_entry_
#define thread_extension_discover_response_len(cur) 0
#define thread_extension_discover_response_write(cur, ptr) (ptr)
#define thread_extension_addr_ntf_send(cur,destination_address,addr_data_ptr,bbr_status)
#define thread_extension_context_can_delete(id, servicesPrefix, context_prefix_length) false
#define thread_extension_dua_address_generate(cur, domain_prefix, domain_prefix_len)
#endif

#ifdef __cplusplus
Expand Down
Loading

0 comments on commit 9b14b83

Please sign in to comment.