Skip to content

Commit d8cc9b5

Browse files
author
Juha Heiskanen
authored
Merge pull request #2012 from ARMmbed/dhcp_fix
DHCPv6 renew and Address Solicit fix
2 parents 74dc531 + 33cd6bf commit d8cc9b5

File tree

4 files changed

+40
-5
lines changed

4 files changed

+40
-5
lines changed

nanostack/dhcp_service_api.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,16 @@ uint16_t dhcp_service_init(int8_t interface_id, dhcp_instance_type_e instance_ty
133133
*/
134134
void dhcp_service_relay_instance_enable(uint16_t instance, uint8_t *server_address);
135135

136+
/**
137+
* \brief Get DHCPv6 Relay Agent address pointer.
138+
*
139+
* \param instance The instance ID of the registered server.
140+
*
141+
* \return NULL when address is not available
142+
* {
143+
*/
144+
uint8_t *dhcp_service_relay_global_addres_get(uint16_t instance);
145+
136146

137147
/**
138148
* \brief Deletes a server instance.

source/DHCPv6_client/dhcpv6_client_service.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,13 @@ int dhcp_client_get_global_address(int8_t interface, uint8_t dhcp_addr[static 16
210210
//Already Created to same interface
211211
return -1;
212212
}
213+
} else if (libdhcpv6_nonTemporal_entry_get_by_prefix(interface, prefix)) {
214+
//Already Created for same prefix
215+
tr_debug("Address REQ started already");
216+
return -1;
213217
}
214218

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

217222
if (!srv_data_ptr) {
@@ -345,7 +350,12 @@ void dhcpv6_renew(protocol_interface_info_entry_t *interface, if_address_entry_t
345350
serverLink.linkType = srv_data_ptr->serverLinkType;
346351
libdhcpv6_generic_nontemporal_address_message_write(payload_ptr, &packetReq, &nonTemporalAddress, &serverLink);
347352
// send solicit
348-
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);
353+
uint8_t *server_address = dhcp_service_relay_global_addres_get(dhcp_client.relay_instance);
354+
if (!server_address) {
355+
server_address = srv_data_ptr->server_address;
356+
}
357+
358+
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);
349359
if (srv_data_ptr->transActionId == 0) {
350360
ns_dyn_mem_free(payload_ptr);
351361
addr->state_timer = 200; //Retry after 20 seconds

source/libDHCPv6/dhcp_service_api.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -609,13 +609,23 @@ uint16_t dhcp_service_init(int8_t interface_id, dhcp_instance_type_e instance_ty
609609

610610
void dhcp_service_relay_instance_enable(uint16_t instance, uint8_t *server_address)
611611
{
612-
relay_instance_t *realay_srv = dhcp_service_relay_find(instance);
613-
if (realay_srv) {
614-
realay_srv->relay_activated = true;
615-
memcpy(realay_srv->server_address, server_address, 16);
612+
relay_instance_t *relay_srv = dhcp_service_relay_find(instance);
613+
if (relay_srv) {
614+
relay_srv->relay_activated = true;
615+
memcpy(relay_srv->server_address, server_address, 16);
616616
}
617617
}
618618

619+
uint8_t *dhcp_service_relay_global_addres_get(uint16_t instance)
620+
{
621+
relay_instance_t *relay_srv = dhcp_service_relay_find(instance);
622+
if (!relay_srv || !relay_srv->relay_activated) {
623+
return NULL;
624+
}
625+
626+
return relay_srv->server_address;
627+
}
628+
619629
void dhcp_service_delete(uint16_t instance)
620630
{
621631
server_instance_t *srv_ptr;

test/nanostack/unittest/stub/dhcp_service_api_stub.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,3 +174,8 @@ void dhcp_service_relay_instance_enable(uint16_t instance, uint8_t *server_addre
174174
{
175175

176176
}
177+
178+
uint8_t *dhcp_service_relay_global_addres_get(uint16_t instance)
179+
{
180+
return NULL;
181+
}

0 commit comments

Comments
 (0)