Skip to content

Commit

Permalink
Thread network data handling refactored (ARMmbed#1762)
Browse files Browse the repository at this point in the history
  • Loading branch information
deepakvenugopal committed Aug 2, 2018
1 parent 87cc2c9 commit a6f3a0d
Show file tree
Hide file tree
Showing 9 changed files with 104 additions and 33 deletions.
13 changes: 13 additions & 0 deletions nanostack/thread_bbr_api.h
Expand Up @@ -75,6 +75,19 @@ 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.
*
* update prefix value
*
* \param interface_id interface ID of the Thread network.
* \param prefix value must be buffer at the size of 8 bytes
*
* \return 0 on success
* \return <0 in case of errors
*
*/
int thread_bbr_prefix_set(int8_t interface_id, uint8_t *prefix);

/**
* Set the Thread validation interface destination address.
Expand Down
1 change: 1 addition & 0 deletions nanostack/thread_border_router_api.h
Expand Up @@ -54,6 +54,7 @@ typedef struct thread_border_router_info_t {
bool P_default_route: 1; /**< This device provides the default route. */
bool P_on_mesh: 1; /**< This prefix is considered to be on-mesh */
bool P_nd_dns: 1; /**< this border router is able to provide DNS information */
bool P_res1: 1; /**< First reserved bit */
bool stableData: 1; /**< This data is stable and expected to be available at least 48h. */
} thread_border_router_info_t;

Expand Down
12 changes: 12 additions & 0 deletions source/6LoWPAN/Thread/thread_bbr_api.c
Expand Up @@ -1120,6 +1120,18 @@ return 0;
#endif // HAVE_THREAD_BORDER_ROUTER
}

int thread_bbr_prefix_set(int8_t interface_id, uint8_t *prefix)
{
(void) interface_id;
(void) prefix;
#ifdef HAVE_THREAD_BORDER_ROUTER
thread_extension_bbr_prefix_set(interface_id, prefix);
return 0;
#else
return -1;
#endif // HAVE_THREAD_BORDER_ROUTER
}

int thread_bbr_validation_interface_address_set(int8_t interface_id, const uint8_t *addr_ptr, uint16_t port)
{
(void) interface_id;
Expand Down
1 change: 1 addition & 0 deletions source/6LoWPAN/Thread/thread_border_router_api.c
Expand Up @@ -626,6 +626,7 @@ int thread_border_router_prefix_add(int8_t interface_id, uint8_t *prefix_ptr, ui
service.stableData = prefix_info_ptr->stableData;
service.P_on_mesh = prefix_info_ptr->P_on_mesh;
service.P_nd_dns = prefix_info_ptr->P_nd_dns;
service.P_res1 = prefix_info_ptr->P_res1;

return thread_local_server_list_add_on_mesh_server(&cur->thread_info->localServerDataBase, &prefixTlv, &service);
#else
Expand Down
46 changes: 45 additions & 1 deletion source/6LoWPAN/Thread/thread_extension_bbr.c
Expand Up @@ -68,6 +68,7 @@
typedef struct {
uint8_t pbbr_multicast_address[16];
uint8_t tri_address[16];
uint8_t domain_prefix[8];
uint32_t mlr_timeout;
uint32_t delay_timer;
uint32_t dua_timeout;
Expand Down Expand Up @@ -1001,6 +1002,14 @@ static int thread_border_router_pbbr_nw_data_register(thread_pbbr_t *this)
tr_error("Adding service data failed!");
return -1;
}
thread_border_router_info_t br_info = {0};
br_info.P_on_mesh = true;
br_info.stableData = true;
br_info.P_res1 = true;
if (thread_border_router_prefix_add(this->interface_id,this->domain_prefix,64,&br_info)) {
tr_error("Adding domain prefix failed!");
return -1;
}
return 0;
}

Expand All @@ -1011,6 +1020,7 @@ static int thread_extension_bbr_pbbr_stop(thread_pbbr_t *this)

service_data[0] = THREAD_SERVICE_DATA_BBR;
thread_border_router_service_delete(this->interface_id, service_data, 1,THREAD_ENTERPRISE_NUMBER);
thread_border_router_prefix_delete(this->interface_id,this->domain_prefix,64);
multicast_free_address(this->pbbr_multicast_address);
multicast_fwd_full_for_scope(this->interface_id, IPV6_SCOPE_SITE_LOCAL);

Expand Down Expand Up @@ -1129,7 +1139,16 @@ int8_t thread_extension_bbr_init(int8_t interface_id, int8_t backbone_interface_
this->joiner_router_rloc = 0xffff;
this->coap_nmkp_virtual_service_id = -1;
this->br_bb_service_id = -1;

// Default domain prefix for PBBR
this->domain_prefix[0] = 0xfd;
this->domain_prefix[2] = 0x7d;
this->domain_prefix[3] = 0x03;
this->domain_prefix[4] = 0x7d;
this->domain_prefix[5] = 0x03;
this->domain_prefix[6] = 0x7d;
this->domain_prefix[7] = 0x03;

thread_extension_network_prefix_get(interface_id, NULL, this->domain_prefix, NULL);
this->coap_service_id = coap_service_initialize(this->interface_id, THREAD_MANAGEMENT_PORT, COAP_SERVICE_OPTIONS_NONE, NULL, NULL);
if (this->coap_service_id < 0) {
tr_warn("Thread border router coap init failed");
Expand Down Expand Up @@ -1332,6 +1351,31 @@ int thread_extension_bbr_timeout_set(int8_t interface_id, uint32_t timeout_a, ui
return 0;
}

int thread_extension_bbr_prefix_set(int8_t interface_id, uint8_t *prefix)
{
thread_pbbr_t *this = thread_bbr_find_by_interface(interface_id);
if (!this || !prefix) {
return -1;
}
thread_border_router_prefix_delete(this->interface_id,this->domain_prefix,64);
memcpy(this->domain_prefix,prefix,8);
if (!this->pbbr_started) {
return 0;
}

thread_border_router_info_t br_info = {0};
br_info.P_on_mesh = true;
br_info.stableData = true;
br_info.P_res1 = true;
if (thread_border_router_prefix_add(this->interface_id,this->domain_prefix,64, &br_info)) {
tr_error("Adding domain prefix failed!");
return -1;
}
thread_border_router_publish(this->interface_id);

return 0;
}

int thread_extension_bbr_address_set(int8_t interface_id, const uint8_t *addr_ptr, uint16_t port)
{

Expand Down
2 changes: 2 additions & 0 deletions source/6LoWPAN/Thread/thread_extension_bbr.h
Expand Up @@ -55,6 +55,7 @@ void thread_extension_bbr_seconds_timer(int8_t interface_id, uint32_t seconds);
int thread_extension_bbr_timeout_set(int8_t interface_id, uint32_t timeout_a, uint32_t timeout_b, uint32_t delay);
int thread_extension_bbr_address_set(int8_t interface_id, const uint8_t *addr_ptr, uint16_t port);
void thread_extension_bbr_route_update(protocol_interface_info_entry_t *cur);
int thread_extension_bbr_prefix_set(int8_t interface_id, uint8_t *prefix);


#else
Expand All @@ -66,6 +67,7 @@ void thread_extension_bbr_route_update(protocol_interface_info_entry_t *cur);
#define thread_extension_bbr_timeout_set(interface_id, timeout_a, timeout_b, delay)
#define thread_extension_bbr_address_set(interface_id, addr_ptr, port) (-1)
#define thread_extension_bbr_route_update(cur)
#define thread_extension_bbr_prefix_set(interface_id, prefix)
#endif

#ifdef __cplusplus
Expand Down
1 change: 1 addition & 0 deletions source/6LoWPAN/Thread/thread_network_data_lib.h
Expand Up @@ -60,6 +60,7 @@
#define THREAD_P_DEF_ROUTE_BIT_MOVE 9 /* R-bit */
#define THREAD_P_ON_MESH_BIT_MOVE 8 /* O-bit */
#define THREAD_P_ND_DNS_BIT_MOVE 7 /* N-bit */
#define THREAD_P_ND_RES_BIT_MOVE 6 /* First reserved bit */

/* Bit shift for HasRouteTLV preference bit */
#define THREAD_HAS_ROUTE_PRF_BIT_MOVE 6 /* Prf-bits */
Expand Down
54 changes: 24 additions & 30 deletions source/6LoWPAN/Thread/thread_network_data_storage.c
Expand Up @@ -328,9 +328,8 @@ thread_network_local_data_entry_t *thread_local_service_list_allocate(thread_pre
newEntry->servicesPrefixLen = prefixTlv->PrefixLen;
newEntry->domainId = prefixTlv->domainId;
newEntry->dhcpv6ServerActive = false;
newEntry->dhcpv6ServerDataStable = false;
newEntry->brDataStable = false;
newEntry->slaacServerActive = false;
newEntry->slaacServerDataStable = false;
newEntry->slaacPreferred = false;
newEntry->routeActive = false;
newEntry->routeDataStable = false;
Expand All @@ -339,6 +338,8 @@ thread_network_local_data_entry_t *thread_local_service_list_allocate(thread_pre
newEntry->defaultRoute = false;
newEntry->onMesh = false;
newEntry->ndDns = false;
newEntry->brActive = false;
newEntry->res1 = false;
}
return newEntry;
}
Expand Down Expand Up @@ -373,6 +374,7 @@ thread_network_server_data_entry_t *thread_server_entry_allocate(thread_border_r
newEntry->Prf = service->Prf;
newEntry->P_on_mesh = service->P_on_mesh;
newEntry->P_nd_dns = service->P_nd_dns;
newEntry->P_res1 = service->P_res1;
newEntry->canDelete = false;

}
Expand Down Expand Up @@ -1712,21 +1714,21 @@ int thread_local_server_list_add_on_mesh_server(thread_network_local_data_cache_
if (networkDataList) {
thread_network_local_data_entry_t *prefix_entry = thread_local_prefix_entry_get(&networkDataList->prefix_list, prefixTlv);
if (prefix_entry) {
prefix_entry->brDataStable = service->stableData;
prefix_entry->preference = service->Prf;
prefix_entry->configure = service->P_configure;
prefix_entry->defaultRoute = service->P_default_route;
prefix_entry->onMesh = service->P_on_mesh;
prefix_entry->ndDns = service->P_nd_dns;

if (service->P_dhcp) {
prefix_entry->dhcpv6ServerActive = true;
prefix_entry->dhcpv6ServerDataStable = service->stableData;
}

if (service->P_slaac) {
prefix_entry->slaacServerActive = true;
prefix_entry->slaacServerDataStable = service->stableData;
prefix_entry->slaacPreferred = service->P_preferred;
prefix_entry->res1 = service->P_res1;
prefix_entry->dhcpv6ServerActive = service->P_dhcp;
prefix_entry->slaacServerActive = service->P_slaac;
prefix_entry->slaacPreferred = service->P_preferred;

if (service->P_dhcp ||
service->P_slaac ||
service->P_res1) {
prefix_entry->brActive = true;
}

if (prefixTlv->PrefixLen == 0) {
Expand Down Expand Up @@ -1895,9 +1897,7 @@ int thread_local_server_del_route(thread_network_local_data_cache_entry_t *netwo
}

prefix_entry->routeActive = false;
if (prefix_entry->dhcpv6ServerActive) {
return 0;
} else if (prefix_entry->slaacServerActive) {
if (prefix_entry->brActive) {
return 0;
}

Expand Down Expand Up @@ -2027,17 +2027,13 @@ uint8_t thread_server_prefix_length(thread_network_local_data_entry_t *cur)


if (cur->routeActive) {
if (!((cur->slaacServerActive || cur->dhcpv6ServerActive) && cur->defaultRoute)) {
if (!(cur->brActive && cur->defaultRoute)) {
// HasRoute is added if BorderRouter TLV does not have default route bit
tempLength += 5;
}
}

if (cur->dhcpv6ServerActive) {
tempLength += 6;
}

if (cur->slaacServerActive) {
if (cur->brActive) {
tempLength += 6;
}

Expand Down Expand Up @@ -2095,14 +2091,9 @@ uint16_t thread_nd_own_service_list_data_size(thread_network_local_data_cache_en

static bool thread_check_local_data_prefix_stable_boolean(thread_network_local_data_entry_t *dataList)
{
if (dataList->dhcpv6ServerActive && dataList->dhcpv6ServerDataStable) {
return true;
}

if (dataList->slaacServerActive && dataList->slaacServerDataStable) {
if (dataList->brActive && dataList->brDataStable) {
return true;
}

return false;
}

Expand Down Expand Up @@ -2273,7 +2264,7 @@ uint8_t * thread_nd_own_service_list_data_write(thread_network_local_data_cache_
if (servicesLen) {
ptr = thread_nd_hosted_prefix_header_write(ptr,servicesLen, cur);
if (cur->routeActive) {
if (!((cur->slaacServerActive || cur->dhcpv6ServerActive) && cur->defaultRoute)) {
if (!(cur->brActive && cur->defaultRoute)) {
// HasRoute is added if BorderRouter TLV does not have default route bit
uint8_t preference = 0;
tlvType = THREAD_NWK_DATA_TYPE_ROUTE;
Expand All @@ -2287,10 +2278,10 @@ uint8_t * thread_nd_own_service_list_data_write(thread_network_local_data_cache_
}
}

if (cur->slaacServerActive || cur->dhcpv6ServerActive) {
if (cur->brActive) {
uint16_t flags = 0;
tlvType = THREAD_NWK_DATA_TYPE_BORDER_ROUTER;
if (cur->slaacServerDataStable || cur->dhcpv6ServerDataStable) {
if (cur->brDataStable) {
tlvType |= THREAD_NWK_STABLE_DATA;
}
if (cur->slaacServerActive) {
Expand All @@ -2317,6 +2308,9 @@ uint8_t * thread_nd_own_service_list_data_write(thread_network_local_data_cache_
if (cur->ndDns) {
flags |= 1 << THREAD_P_ND_DNS_BIT_MOVE;
}
if (cur->res1) {
flags |= 1 << THREAD_P_ND_RES_BIT_MOVE;
}
ptr = thread_service_border_router_tlv_write(ptr, tlvType, routerID, flags);
} // slaac or dhcp
}
Expand Down
7 changes: 5 additions & 2 deletions source/6LoWPAN/Thread/thread_network_data_storage.h
Expand Up @@ -72,6 +72,7 @@ typedef struct thread_network_data_temporary_route_or_dhcpv6_server_entry_s {
bool stableData: 1;
bool P_on_mesh: 1;
bool P_nd_dns: 1;
bool P_res1: 1;
bool canDelete: 1;
ns_list_link_t link; /*!< List link entry */
} thread_network_server_data_entry_t;
Expand All @@ -87,6 +88,7 @@ typedef struct thread_border_router_tlv_entry_t {
bool stableData: 1; /* P_stable */
bool P_on_mesh: 1; /* P_on_mesh */
bool P_nd_dns: 1; /* P_nd_dns */
bool P_res1: 1; /* P_res1 */
} thread_border_router_tlv_entry_t;

typedef struct thread_prefix_tlv {
Expand Down Expand Up @@ -136,16 +138,17 @@ typedef struct thread_network_local_data_entry_s {
uint8_t servicesPrefixLen; /*!< Prefix length in bits This Can Be 1-128 */
bool routeActive: 1;
bool routeDataStable: 1;
bool brActive: 1;
bool dhcpv6ServerActive: 1;
bool dhcpv6ServerDataStable: 1;
bool brDataStable: 1;
bool slaacServerActive: 1;
bool slaacServerDataStable: 1;
bool slaacPreferred: 1;
unsigned preference: 2;
bool configure: 1;
bool defaultRoute: 1;
bool onMesh: 1;
bool ndDns: 1;
bool res1:1;
ns_list_link_t link; /*!< List link entry */
} thread_network_local_data_entry_t;

Expand Down

0 comments on commit a6f3a0d

Please sign in to comment.