diff --git a/source/DHCPv6_client/dhcpv6_client_service.c b/source/DHCPv6_client/dhcpv6_client_service.c index c4ec0cafeb9..79bf59bcab7 100644 --- a/source/DHCPv6_client/dhcpv6_client_service.c +++ b/source/DHCPv6_client/dhcpv6_client_service.c @@ -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); @@ -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: @@ -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); @@ -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) @@ -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 @@ -451,7 +446,7 @@ 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; @@ -459,10 +454,11 @@ void dhcpv6_client_set_address(int8_t interface_id, dhcpv6_client_server_data_t 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 @@ -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) { @@ -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 diff --git a/source/libDHCPv6/libDHCPv6.c b/source/libDHCPv6/libDHCPv6.c index e182866de95..53beaaadc3d 100644 --- a/source/libDHCPv6/libDHCPv6.c +++ b/source/libDHCPv6/libDHCPv6.c @@ -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; } diff --git a/test/nanostack/unittest/stub/dhcpv6_client_stub.c b/test/nanostack/unittest/stub/dhcpv6_client_stub.c index e8840a1220a..ed138da43dc 100644 --- a/test/nanostack/unittest/stub/dhcpv6_client_stub.c +++ b/test/nanostack/unittest/stub/dhcpv6_client_stub.c @@ -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) @@ -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;