Skip to content
This repository was archived by the owner on May 23, 2023. It is now read-only.

Commit b691b78

Browse files
context id update (ARMmbed#1753)
context id not deleted if domain prefix exists for the context id that is being deleted.
1 parent 5635089 commit b691b78

File tree

6 files changed

+26
-8
lines changed

6 files changed

+26
-8
lines changed

source/6LoWPAN/Thread/thread_extension.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,18 @@ void thread_extension_activate(protocol_interface_info_entry_t *cur)
668668
}
669669
}
670670

671+
bool thread_extension_context_can_delete(int8_t id, uint8_t servicesPrefix[16], uint8_t context_prefix_length)
672+
{
673+
uint8_t domain_prefix[16];
674+
uint8_t domain_prefix_len;
675+
if (0 == thread_extension_network_prefix_get(id, NULL,domain_prefix, &domain_prefix_len)) {
676+
if (context_prefix_length == domain_prefix_len && memcmp(domain_prefix, servicesPrefix, context_prefix_length/8) == 0) {
677+
return false;
678+
}
679+
}
680+
return true;
681+
}
682+
671683
bool thread_extension_enabled(protocol_interface_info_entry_t *cur)
672684
{
673685
if (thread_info(cur)->version <= THREAD_PROTOCOL_VERSION) {

source/6LoWPAN/Thread/thread_extension.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ void thread_extension_address_registration_trigger(protocol_interface_info_entry
5858
void thread_extension_route_set(protocol_interface_info_entry_t *cur);
5959
void thread_extension_activate(protocol_interface_info_entry_t *cur);
6060
bool thread_extension_enabled(protocol_interface_info_entry_t *cur);
61+
bool thread_extension_context_can_delete(int8_t id, uint8_t servicesPrefix[16], uint8_t context_prefix_length);
6162
bool thread_extension_version_check(uint8_t version);
6263
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);
6364
void thread_extension_discover_response_tlv_write(uint16_t *data, uint8_t version, uint16_t securityPolicy);
@@ -95,6 +96,7 @@ uint8_t *thread_extension_discover_response_write(protocol_interface_info_entry_
9596
#define thread_extension_joining_enabled(interface_id) false
9697
#define thread_extension_discover_response_len(cur) 0
9798
#define thread_extension_discover_response_write(cur, ptr) (ptr)
99+
#define thread_extension_context_can_delete(id, servicesPrefix, context_prefix_length) false
98100
#endif
99101

100102
#ifdef __cplusplus

source/6LoWPAN/Thread/thread_leader_service.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1526,7 +1526,7 @@ void thread_leader_service_timer(protocol_interface_info_entry_t *cur, uint32_t
15261526
cur->thread_info->leader_private_data->leader_id_seq_timer = ID_SEQUENCE_PERIOD;
15271527

15281528
thread_leader_service_update_id_set(cur);
1529-
thread_network_data_context_re_use_timer_update(&cur->thread_info->networkDataStorage, 10, &cur->lowpan_contexts);
1529+
thread_network_data_context_re_use_timer_update(cur->id, &cur->thread_info->networkDataStorage, 10, &cur->lowpan_contexts);
15301530
// Send update to network data if needed
15311531
thread_leader_service_network_data_changed(cur, false, false);
15321532
}

source/6LoWPAN/Thread/thread_network_data_storage.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -868,7 +868,7 @@ static int thread_service_data_delete_mark_by_router_id(thread_network_data_serv
868868
return retVal;
869869
}
870870

871-
static int thread_server_context_clean(thread_network_data_cache_entry_t *cachePtr, thread_data_context_list_t *listPtr, thread_network_data_prefix_cache_entry_t *prefixEntry, lowpan_context_list_t *context_list)
871+
static int thread_server_context_clean(int8_t id, thread_network_data_cache_entry_t *cachePtr, thread_data_context_list_t *listPtr, thread_network_data_prefix_cache_entry_t *prefixEntry, lowpan_context_list_t *context_list)
872872
{
873873
int retVal = -1;
874874
(void) prefixEntry;
@@ -879,7 +879,9 @@ static int thread_server_context_clean(thread_network_data_cache_entry_t *cacheP
879879
cachePtr->stableUpdatePushed = true;
880880
}
881881
// Set context lifetime to 0 to delete
882-
lowpan_context_update(context_list, cur->cid, 0, NULL, 0, true);
882+
if (thread_extension_context_can_delete(id, prefixEntry->servicesPrefix, cur->contextPrefixLength)) {
883+
lowpan_context_update(context_list, cur->cid, 0, NULL, 0, true);
884+
}
883885
ns_list_remove(listPtr, cur);
884886
ns_dyn_mem_free(cur);
885887
retVal = 0;
@@ -1019,7 +1021,7 @@ bool thread_network_data_router_id_free(thread_network_data_cache_entry_t *cache
10191021
}
10201022
thread_server_data_clean_by_router_id(cachePtr, &cur->routeList, cur, true, curInterface);
10211023
if (!is_leader) {
1022-
thread_server_context_clean(cachePtr, &cur->contextList, cur, &curInterface->lowpan_contexts);
1024+
thread_server_context_clean(curInterface->id, cachePtr, &cur->contextList, cur, &curInterface->lowpan_contexts);
10231025
}
10241026

10251027
if (ns_list_is_empty(&cur->borderRouterList)) {
@@ -1071,7 +1073,7 @@ bool thread_network_data_router_id_free(thread_network_data_cache_entry_t *cache
10711073
return address_removed;
10721074
}
10731075

1074-
void thread_network_data_context_re_use_timer_update(thread_network_data_cache_entry_t *cachePtr, uint32_t ticks, lowpan_context_list_t *context_list)
1076+
void thread_network_data_context_re_use_timer_update(int8_t id, thread_network_data_cache_entry_t *cachePtr, uint32_t ticks, lowpan_context_list_t *context_list)
10751077
{
10761078
ns_list_foreach_safe(thread_network_data_prefix_cache_entry_t, cur, &cachePtr->localPrefixList) {
10771079
ns_list_foreach_safe(thread_network_data_context_entry_t, curContext, &cur->contextList) {
@@ -1086,7 +1088,9 @@ void thread_network_data_context_re_use_timer_update(thread_network_data_cache_e
10861088
cachePtr->temporaryUpdatePushed = true;
10871089
}
10881090
// Set context lifetime to 0 to delete
1089-
lowpan_context_update(context_list, curContext->cid, 0, NULL, 0, true);
1091+
if (thread_extension_context_can_delete(id, cur->servicesPrefix,curContext->contextPrefixLength)) {
1092+
lowpan_context_update(context_list, curContext->cid, 0, NULL, 0, true);
1093+
}
10901094
ns_dyn_mem_free(curContext);
10911095
}
10921096
}

source/6LoWPAN/Thread/thread_network_data_storage.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ bool thread_network_data_router_id_free(thread_network_data_cache_entry_t *cache
207207

208208
void thread_network_local_data_free_and_clean(thread_network_local_data_cache_entry_t *cachePtr, int8_t interface_id);
209209

210-
void thread_network_data_context_re_use_timer_update(thread_network_data_cache_entry_t *cachePtr, uint32_t ticks, lowpan_context_list_t *context_list);
210+
void thread_network_data_context_re_use_timer_update(int8_t id, thread_network_data_cache_entry_t *cachePtr, uint32_t ticks, lowpan_context_list_t *context_list);
211211

212212
/**
213213
* Add new route information to route List

test/nanostack/unittest/stub/thread_network_data_storage_stub.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ bool thread_network_data_router_id_free(thread_network_data_cache_entry_t *cache
193193
return false;
194194
}
195195

196-
void thread_network_data_context_re_use_timer_update(thread_network_data_cache_entry_t *cachePtr, uint32_t ticks, lowpan_context_list_t *context_list)
196+
void thread_network_data_context_re_use_timer_update(int8_t id, thread_network_data_cache_entry_t *cachePtr, uint32_t ticks, lowpan_context_list_t *context_list)
197197
{
198198

199199
}

0 commit comments

Comments
 (0)