Skip to content

Commit 2c4981b

Browse files
author
Juha Heiskanen
committed
DHCP client fix's
Fixed missing address allocate fail and use proper callback status Simplify Addres get operation prefix compare for use dhcp_client_server_address_update() Removed while loop from address delete function. Change-Id: Id21f50cd20b507a4c7f2339b732d820b3ee664e7
1 parent 6c00aa2 commit 2c4981b

File tree

3 files changed

+26
-32
lines changed

3 files changed

+26
-32
lines changed

source/DHCPv6_client/dhcpv6_client_service.c

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ typedef struct {
4747

4848
static dhcp_client_class_t dhcp_client;
4949

50-
void dhcpv6_client_set_address(int8_t interface_id, dhcpv6_client_server_data_t *srv_data_ptr);
50+
static bool dhcpv6_client_set_address(int8_t interface_id, dhcpv6_client_server_data_t *srv_data_ptr);
5151
void dhcpv6_renew(protocol_interface_info_entry_t *interface, if_address_entry_t *addr, if_address_callback_t reason);
5252

5353

@@ -193,13 +193,13 @@ int dhcp_solicit_resp_cb(uint16_t instance_id, void *ptr, uint8_t msg_name, uin
193193
srv_data_ptr->serverLinkType = serverId.linkType;
194194
srv_data_ptr->T0 = dhcp_ia_non_temporal_params.T0;
195195
srv_data_ptr->T1 = dhcp_ia_non_temporal_params.T1;
196-
srv_data_ptr->iaNonTemporalStructValid = true;
197196

198-
dhcpv6_client_set_address(dhcp_client.interface, srv_data_ptr);
197+
198+
bool status = dhcpv6_client_set_address(dhcp_client.interface, srv_data_ptr);
199199

200200

201201
if (dhcp_client.global_address_cb) {
202-
dhcp_client.global_address_cb(dhcp_client.interface, srv_data_ptr->server_address, srv_data_ptr->iaNontemporalAddress.addressPrefix, true);
202+
dhcp_client.global_address_cb(dhcp_client.interface, srv_data_ptr->server_address, srv_data_ptr->iaNontemporalAddress.addressPrefix, status);
203203
}
204204
return RET_MSG_ACCEPTED;
205205
error_exit:
@@ -238,10 +238,9 @@ int dhcp_client_get_global_address(int8_t interface, uint8_t dhcp_addr[static 16
238238
}
239239
return -1;
240240
}
241-
} else if (libdhcpv6_nonTemporal_entry_get_by_prefix(interface, prefix)) {
242-
//Already Created for same prefix
243-
tr_debug("Address REQ started already");
244-
return -1;
241+
} else if (dhcp_client_server_address_update(interface, prefix, dhcp_addr) == 0) {
242+
//No need for allocate new
243+
return 0;
245244
}
246245

247246
tr_debug("GEN new Dhcpv6 client %u", dhcp_client.libDhcp_instance);
@@ -349,22 +348,18 @@ void dhcp_client_global_address_delete(int8_t interface, uint8_t *dhcp_addr, uin
349348
srv_data_ptr = libdhcpv6_nonTemporal_entry_get_by_prefix(interface, prefix);
350349
cur = protocol_stack_interface_info_get_by_id(interface);
351350

352-
do {
353-
if (cur == NULL || srv_data_ptr == NULL) {
354-
return;
355-
}
356-
dhcp_service_req_remove(srv_data_ptr->transActionId);// remove all pending retransmissions
357-
if (dhcp_client.one_instance_interface) {
358-
addr_deprecate(cur, srv_data_ptr->iaNontemporalAddress.addressPrefix);
359-
} else {
360-
addr_delete(cur, srv_data_ptr->iaNontemporalAddress.addressPrefix);
361-
}
351+
if (cur == NULL || srv_data_ptr == NULL) {
352+
return;
353+
}
362354

363-
libdhcvp6_nontemporalAddress_server_data_free(srv_data_ptr);
364-
srv_data_ptr = libdhcpv6_nonTemporal_entry_get_by_prefix(interface, prefix);
365-
} while (srv_data_ptr);
355+
dhcp_service_req_remove(srv_data_ptr->transActionId);// remove all pending retransmissions
356+
if (dhcp_client.one_instance_interface) {
357+
addr_deprecate(cur, srv_data_ptr->iaNontemporalAddress.addressPrefix);
358+
} else {
359+
addr_delete(cur, srv_data_ptr->iaNontemporalAddress.addressPrefix);
360+
}
366361

367-
return;
362+
libdhcvp6_nontemporalAddress_server_data_free(srv_data_ptr);
368363
}
369364

370365
void dhcpv6_renew(protocol_interface_info_entry_t *interface, if_address_entry_t *addr, if_address_callback_t reason)
@@ -381,7 +376,7 @@ void dhcpv6_renew(protocol_interface_info_entry_t *interface, if_address_entry_t
381376
}
382377

383378
if (srv_data_ptr == NULL) {
384-
return ;
379+
return;
385380
}
386381
if (reason == ADDR_CALLBACK_INVALIDATED) {
387382
dhcp_service_req_remove(srv_data_ptr->transActionId);//stop retransmissions of renew
@@ -451,18 +446,19 @@ void dhcpv6_renew(protocol_interface_info_entry_t *interface, if_address_entry_t
451446
}
452447
}
453448

454-
void dhcpv6_client_set_address(int8_t interface_id, dhcpv6_client_server_data_t *srv_data_ptr)
449+
static bool dhcpv6_client_set_address(int8_t interface_id, dhcpv6_client_server_data_t *srv_data_ptr)
455450
{
456451
protocol_interface_info_entry_t *cur = NULL;
457452
if_address_entry_t *address_entry = NULL;
458453
uint32_t renewTimer;
459454

460455
cur = protocol_stack_interface_info_get_by_id(interface_id);
461456
if (!cur) {
462-
return;
457+
return false;
463458
}
464459
renewTimer = libdhcpv6_renew_time_define(srv_data_ptr);
465460

461+
srv_data_ptr->iaNonTemporalStructValid = true;
466462
address_entry = addr_get_entry(cur, srv_data_ptr->iaNontemporalAddress.addressPrefix);
467463
if (address_entry == NULL) {
468464
// create new
@@ -474,8 +470,10 @@ void dhcpv6_client_set_address(int8_t interface_id, dhcpv6_client_server_data_t
474470

475471
if (address_entry == NULL) {
476472
tr_error("Address add failed");
477-
return;
473+
srv_data_ptr->iaNonTemporalStructValid = false;
474+
return false;
478475
}
476+
479477
if (renewTimer) {
480478
// translate seconds to 100ms ticks
481479
if (renewTimer < 0xffffffff / 10) {
@@ -486,6 +484,7 @@ void dhcpv6_client_set_address(int8_t interface_id, dhcpv6_client_server_data_t
486484
}
487485
address_entry->state_timer = renewTimer;
488486
address_entry->cb = dhcpv6_renew;
487+
return true;
489488
}
490489

491490
#endif

source/libDHCPv6/libDHCPv6.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ dhcpv6_client_server_data_t *libdhcpv6_nonTemporal_entry_get_by_transactionId(ui
208208
dhcpv6_client_server_data_t *libdhcpv6_nonTemporal_entry_get_by_prefix(int8_t interfaceId, uint8_t *prefix)
209209
{
210210
ns_list_foreach(dhcpv6_client_server_data_t, cur, &dhcpv6_client_nonTemporal_list) {
211-
if ((cur->interfaceId == interfaceId) && cur->iaNonTemporalStructValid) {
211+
if ((cur->interfaceId == interfaceId)) {
212212
if (memcmp(cur->iaNontemporalAddress.addressPrefix, prefix, 8) == 0) {
213213
return cur;
214214
}

test/nanostack/unittest/stub/dhcpv6_client_stub.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ typedef struct {
4141
dhcp_client_class_t dhcp_client;
4242

4343
extern uint8_t *dhcpv6_vendor_code_parse_thread_router_id(uint8_t *ptr, uint16_t data_length);
44-
void dhcpv6_client_set_address(int8_t interface_id, dhcpv6_client_server_data_t *srv_data_ptr);
4544

4645

4746
void dhcp_client_init(int8_t interface)
@@ -80,10 +79,6 @@ void dhcpv6_renew(protocol_interface_info_entry_t *interface, if_address_entry_t
8079
{
8180
}
8281

83-
void dhcpv6_client_set_address(int8_t interface_id, dhcpv6_client_server_data_t *srv_data_ptr)
84-
{
85-
}
86-
8782
uint8_t *dhcpv6_vendor_code_parse_thread_router_id(uint8_t *ptr, uint16_t data_length)
8883
{
8984
return NULL;

0 commit comments

Comments
 (0)