Skip to content

Commit

Permalink
DHCP client fix's
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Juha Heiskanen committed May 17, 2019
1 parent 6c00aa2 commit 2c4981b
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 32 deletions.
51 changes: 25 additions & 26 deletions source/DHCPv6_client/dhcpv6_client_service.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ typedef struct {

static dhcp_client_class_t dhcp_client;

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


Expand Down Expand Up @@ -193,13 +193,13 @@ int dhcp_solicit_resp_cb(uint16_t instance_id, void *ptr, uint8_t msg_name, uin
srv_data_ptr->serverLinkType = serverId.linkType;
srv_data_ptr->T0 = dhcp_ia_non_temporal_params.T0;
srv_data_ptr->T1 = dhcp_ia_non_temporal_params.T1;
srv_data_ptr->iaNonTemporalStructValid = true;

dhcpv6_client_set_address(dhcp_client.interface, srv_data_ptr);

bool status = dhcpv6_client_set_address(dhcp_client.interface, srv_data_ptr);


if (dhcp_client.global_address_cb) {
dhcp_client.global_address_cb(dhcp_client.interface, srv_data_ptr->server_address, srv_data_ptr->iaNontemporalAddress.addressPrefix, true);
dhcp_client.global_address_cb(dhcp_client.interface, srv_data_ptr->server_address, srv_data_ptr->iaNontemporalAddress.addressPrefix, status);
}
return RET_MSG_ACCEPTED;
error_exit:
Expand Down Expand Up @@ -238,10 +238,9 @@ int dhcp_client_get_global_address(int8_t interface, uint8_t dhcp_addr[static 16
}
return -1;
}
} else if (libdhcpv6_nonTemporal_entry_get_by_prefix(interface, prefix)) {
//Already Created for same prefix
tr_debug("Address REQ started already");
return -1;
} else if (dhcp_client_server_address_update(interface, prefix, dhcp_addr) == 0) {
//No need for allocate new
return 0;
}

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

do {
if (cur == NULL || srv_data_ptr == NULL) {
return;
}
dhcp_service_req_remove(srv_data_ptr->transActionId);// remove all pending retransmissions
if (dhcp_client.one_instance_interface) {
addr_deprecate(cur, srv_data_ptr->iaNontemporalAddress.addressPrefix);
} else {
addr_delete(cur, srv_data_ptr->iaNontemporalAddress.addressPrefix);
}
if (cur == NULL || srv_data_ptr == NULL) {
return;
}

libdhcvp6_nontemporalAddress_server_data_free(srv_data_ptr);
srv_data_ptr = libdhcpv6_nonTemporal_entry_get_by_prefix(interface, prefix);
} while (srv_data_ptr);
dhcp_service_req_remove(srv_data_ptr->transActionId);// remove all pending retransmissions
if (dhcp_client.one_instance_interface) {
addr_deprecate(cur, srv_data_ptr->iaNontemporalAddress.addressPrefix);
} else {
addr_delete(cur, srv_data_ptr->iaNontemporalAddress.addressPrefix);
}

return;
libdhcvp6_nontemporalAddress_server_data_free(srv_data_ptr);
}

void dhcpv6_renew(protocol_interface_info_entry_t *interface, if_address_entry_t *addr, if_address_callback_t reason)
Expand All @@ -381,7 +376,7 @@ void dhcpv6_renew(protocol_interface_info_entry_t *interface, if_address_entry_t
}

if (srv_data_ptr == NULL) {
return ;
return;
}
if (reason == ADDR_CALLBACK_INVALIDATED) {
dhcp_service_req_remove(srv_data_ptr->transActionId);//stop retransmissions of renew
Expand Down Expand Up @@ -451,18 +446,19 @@ void dhcpv6_renew(protocol_interface_info_entry_t *interface, if_address_entry_t
}
}

void dhcpv6_client_set_address(int8_t interface_id, dhcpv6_client_server_data_t *srv_data_ptr)
static bool dhcpv6_client_set_address(int8_t interface_id, dhcpv6_client_server_data_t *srv_data_ptr)
{
protocol_interface_info_entry_t *cur = NULL;
if_address_entry_t *address_entry = NULL;
uint32_t renewTimer;

cur = protocol_stack_interface_info_get_by_id(interface_id);
if (!cur) {
return;
return false;
}
renewTimer = libdhcpv6_renew_time_define(srv_data_ptr);

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

if (address_entry == NULL) {
tr_error("Address add failed");
return;
srv_data_ptr->iaNonTemporalStructValid = false;
return false;
}

if (renewTimer) {
// translate seconds to 100ms ticks
if (renewTimer < 0xffffffff / 10) {
Expand All @@ -486,6 +484,7 @@ void dhcpv6_client_set_address(int8_t interface_id, dhcpv6_client_server_data_t
}
address_entry->state_timer = renewTimer;
address_entry->cb = dhcpv6_renew;
return true;
}

#endif
2 changes: 1 addition & 1 deletion source/libDHCPv6/libDHCPv6.c
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ dhcpv6_client_server_data_t *libdhcpv6_nonTemporal_entry_get_by_transactionId(ui
dhcpv6_client_server_data_t *libdhcpv6_nonTemporal_entry_get_by_prefix(int8_t interfaceId, uint8_t *prefix)
{
ns_list_foreach(dhcpv6_client_server_data_t, cur, &dhcpv6_client_nonTemporal_list) {
if ((cur->interfaceId == interfaceId) && cur->iaNonTemporalStructValid) {
if ((cur->interfaceId == interfaceId)) {
if (memcmp(cur->iaNontemporalAddress.addressPrefix, prefix, 8) == 0) {
return cur;
}
Expand Down
5 changes: 0 additions & 5 deletions test/nanostack/unittest/stub/dhcpv6_client_stub.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ typedef struct {
dhcp_client_class_t dhcp_client;

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


void dhcp_client_init(int8_t interface)
Expand Down Expand Up @@ -80,10 +79,6 @@ void dhcpv6_renew(protocol_interface_info_entry_t *interface, if_address_entry_t
{
}

void dhcpv6_client_set_address(int8_t interface_id, dhcpv6_client_server_data_t *srv_data_ptr)
{
}

uint8_t *dhcpv6_vendor_code_parse_thread_router_id(uint8_t *ptr, uint16_t data_length)
{
return NULL;
Expand Down

0 comments on commit 2c4981b

Please sign in to comment.