Skip to content

Commit 9350293

Browse files
author
Juha Heiskanen
committed
DHCPv6 client server address update.
Enabled address update to parent update call for update DHCPv6 client servert address. Change-Id: Ic197b3c6acfe17a3c070ba2e56905a95d9c99ab6
1 parent de00ace commit 9350293

File tree

7 files changed

+45
-8
lines changed

7 files changed

+45
-8
lines changed

nanostack/dhcp_service_api.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,15 @@ uint32_t dhcp_service_send_req(uint16_t instance_id, uint8_t options, void *ptr,
198198
*/
199199
void dhcp_service_set_retry_timers(uint32_t msg_tr_id, uint16_t timeout_init, uint16_t timeout_max, uint8_t retrans_max);
200200

201+
/**
202+
* \brief Update DHCP service server address to active tx process.
203+
*
204+
* \param msg_tr_id The message transaction ID.
205+
* \param server_address New destination address to server / relay Agent.
206+
*
207+
*/
208+
void dhcp_service_update_server_address(uint32_t msg_tr_id, uint8_t *server_address);
209+
201210
/**
202211
* \brief Stops transactions for a message (retransmissions).
203212
*

source/6LoWPAN/ws/ws_bootstrap.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1670,7 +1670,7 @@ int ws_bootstrap_aro_failure(protocol_interface_info_entry_t *cur, const uint8_t
16701670
rpl_control_neighbor_delete(cur, ll_address);
16711671
ws_bootstrap_neighbor_remove(cur, ll_address);
16721672
//Cancel DHCPV6 If it is active but not finished yest
1673-
dhcp_client_address_cancel(cur->id, NULL);
1673+
//dhcp_client_address_cancel(cur->id, NULL);
16741674
return 0;
16751675
}
16761676

@@ -2604,6 +2604,11 @@ void ws_primary_parent_update(protocol_interface_info_entry_t *interface, mac_ne
26042604
neighbor_info.neighbor = neighbor;
26052605
neighbor_info.ws_neighbor = ws_neighbor_class_entry_get(&interface->ws_info->neighbor_storage, neighbor->index);
26062606
ws_bootstrap_primary_parent_set(interface, &neighbor_info, WS_PARENT_HARD_SYNCH);
2607+
uint8_t link_local_address[16];
2608+
memcpy(link_local_address, ADDR_LINK_LOCAL_PREFIX, 8);
2609+
memcpy(link_local_address + 8, neighbor->mac64, 8);
2610+
link_local_address[8] ^= 2;
2611+
dhcp_client_server_address_update(interface->id, NULL, link_local_address);
26072612

26082613
ws_secondary_parent_update(interface);
26092614
}

source/DHCPv6_client/dhcpv6_client_api.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ void dhcp_client_global_address_delete(int8_t interface, uint8_t *dhcp_addr, uin
100100

101101
void dhcp_relay_agent_enable(int8_t interface, uint8_t border_router_address[static 16]);
102102

103-
int dhcp_client_address_cancel(int8_t interface, uint8_t prefix[static 16]);
103+
int dhcp_client_server_address_update(int8_t interface, uint8_t prefix[static 16], uint8_t server_address[static 16]);
104104

105105

106106

source/DHCPv6_client/dhcpv6_client_service.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -303,11 +303,12 @@ int dhcp_client_get_global_address(int8_t interface, uint8_t dhcp_addr[static 16
303303
return 0;
304304
}
305305

306-
int dhcp_client_address_cancel(int8_t interface, uint8_t prefix[static 16])
306+
int dhcp_client_server_address_update(int8_t interface, uint8_t prefix[static 16], uint8_t server_address[static 16])
307307
{
308308
dhcpv6_client_server_data_t *srv_data_ptr = NULL;
309309

310310
if (dhcp_client.interface != interface) {
311+
tr_debug("Interface not match");
311312
return -1;
312313
}
313314

@@ -316,11 +317,17 @@ int dhcp_client_address_cancel(int8_t interface, uint8_t prefix[static 16])
316317
} else if (dhcp_client.one_instance_interface) {
317318
srv_data_ptr = libdhcpv6_nonTemporal_entry_get_by_instance(dhcp_client.libDhcp_instance);
318319
}
320+
if (srv_data_ptr) {
321+
if (memcmp(srv_data_ptr->server_address, server_address, 16) == 0) {
322+
return 0;
323+
}
324+
}
319325

320-
if (srv_data_ptr && !srv_data_ptr->iaNonTemporalStructValid) {
321-
tr_debug("Cancel Address request");
322-
dhcp_service_req_remove(srv_data_ptr->transActionId);// remove all pending retransmissions
323-
libdhcvp6_nontemporalAddress_server_data_free(srv_data_ptr);
326+
if (srv_data_ptr) {
327+
memcpy(srv_data_ptr->server_address, server_address, 16);
328+
if (!srv_data_ptr->iaNonTemporalStructValid) {
329+
dhcp_service_update_server_address(srv_data_ptr->transActionId, server_address);
330+
}
324331
return 0;
325332
}
326333
return -1;

source/libDHCPv6/dhcp_service_api.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -749,6 +749,17 @@ void dhcp_service_set_retry_timers(uint32_t msg_tr_id, uint16_t timeout_init, ui
749749
return;
750750
}
751751

752+
void dhcp_service_update_server_address(uint32_t msg_tr_id, uint8_t *server_address)
753+
{
754+
msg_tr_t *msg_tr_ptr;
755+
msg_tr_ptr = dhcp_tr_find(msg_tr_id);
756+
757+
if (msg_tr_ptr != NULL) {
758+
tr_debug("Set New Server address %s", trace_ipv6(server_address));
759+
memcpy(msg_tr_ptr->addr.address, server_address, 16);
760+
}
761+
}
762+
752763
void dhcp_service_req_remove(uint32_t msg_tr_id)
753764
{
754765
if (dhcp_service) {

test/nanostack/unittest/stub/dhcp_service_api_stub.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,3 +179,8 @@ uint8_t *dhcp_service_relay_global_addres_get(uint16_t instance)
179179
{
180180
return NULL;
181181
}
182+
183+
void dhcp_service_update_server_address(uint32_t msg_tr_id, uint8_t *server_address)
184+
{
185+
186+
}

test/nanostack/unittest/stub/dhcpv6_client_stub.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ void dhcp_client_configure(int8_t interface, bool renew_uses_solicit, bool one_c
9494

9595
}
9696

97-
int dhcp_client_address_cancel(int8_t interface, uint8_t prefix[static 16])
97+
int dhcp_client_server_address_update(int8_t interface, uint8_t prefix[static 16], uint8_t server_address[static 16])
9898
{
9999
return 0;
100100
}

0 commit comments

Comments
 (0)