Skip to content

Commit

Permalink
Merge pull request ARMmbed#2012 from ARMmbed/dhcp_fix
Browse files Browse the repository at this point in the history
DHCPv6 renew and Address Solicit fix
  • Loading branch information
Juha Heiskanen committed Mar 14, 2019
2 parents 74dc531 + 33cd6bf commit d8cc9b5
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 5 deletions.
10 changes: 10 additions & 0 deletions nanostack/dhcp_service_api.h
Expand Up @@ -133,6 +133,16 @@ uint16_t dhcp_service_init(int8_t interface_id, dhcp_instance_type_e instance_ty
*/
void dhcp_service_relay_instance_enable(uint16_t instance, uint8_t *server_address);

/**
* \brief Get DHCPv6 Relay Agent address pointer.
*
* \param instance The instance ID of the registered server.
*
* \return NULL when address is not available
* {
*/
uint8_t *dhcp_service_relay_global_addres_get(uint16_t instance);


/**
* \brief Deletes a server instance.
Expand Down
12 changes: 11 additions & 1 deletion source/DHCPv6_client/dhcpv6_client_service.c
Expand Up @@ -210,8 +210,13 @@ int dhcp_client_get_global_address(int8_t interface, uint8_t dhcp_addr[static 16
//Already Created to same interface
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;
}

tr_debug("GEN new Dhcpv6 client %u", dhcp_client.libDhcp_instance);
srv_data_ptr = libdhcvp6_nontemporalAddress_server_data_allocate(interface, dhcp_client.libDhcp_instance, mac64, link_type, prefix, dhcp_addr);

if (!srv_data_ptr) {
Expand Down Expand Up @@ -345,7 +350,12 @@ void dhcpv6_renew(protocol_interface_info_entry_t *interface, if_address_entry_t
serverLink.linkType = srv_data_ptr->serverLinkType;
libdhcpv6_generic_nontemporal_address_message_write(payload_ptr, &packetReq, &nonTemporalAddress, &serverLink);
// send solicit
srv_data_ptr->transActionId = dhcp_service_send_req(dhcp_client.service_instance, 0, srv_data_ptr, srv_data_ptr->server_address, payload_ptr, payload_len, dhcp_solicit_resp_cb);
uint8_t *server_address = dhcp_service_relay_global_addres_get(dhcp_client.relay_instance);
if (!server_address) {
server_address = srv_data_ptr->server_address;
}

srv_data_ptr->transActionId = dhcp_service_send_req(dhcp_client.service_instance, 0, srv_data_ptr, server_address, payload_ptr, payload_len, dhcp_solicit_resp_cb);
if (srv_data_ptr->transActionId == 0) {
ns_dyn_mem_free(payload_ptr);
addr->state_timer = 200; //Retry after 20 seconds
Expand Down
18 changes: 14 additions & 4 deletions source/libDHCPv6/dhcp_service_api.c
Expand Up @@ -609,13 +609,23 @@ uint16_t dhcp_service_init(int8_t interface_id, dhcp_instance_type_e instance_ty

void dhcp_service_relay_instance_enable(uint16_t instance, uint8_t *server_address)
{
relay_instance_t *realay_srv = dhcp_service_relay_find(instance);
if (realay_srv) {
realay_srv->relay_activated = true;
memcpy(realay_srv->server_address, server_address, 16);
relay_instance_t *relay_srv = dhcp_service_relay_find(instance);
if (relay_srv) {
relay_srv->relay_activated = true;
memcpy(relay_srv->server_address, server_address, 16);
}
}

uint8_t *dhcp_service_relay_global_addres_get(uint16_t instance)
{
relay_instance_t *relay_srv = dhcp_service_relay_find(instance);
if (!relay_srv || !relay_srv->relay_activated) {
return NULL;
}

return relay_srv->server_address;
}

void dhcp_service_delete(uint16_t instance)
{
server_instance_t *srv_ptr;
Expand Down
5 changes: 5 additions & 0 deletions test/nanostack/unittest/stub/dhcp_service_api_stub.c
Expand Up @@ -174,3 +174,8 @@ void dhcp_service_relay_instance_enable(uint16_t instance, uint8_t *server_addre
{

}

uint8_t *dhcp_service_relay_global_addres_get(uint16_t instance)
{
return NULL;
}

0 comments on commit d8cc9b5

Please sign in to comment.