@@ -47,7 +47,7 @@ typedef struct {
47
47
48
48
static dhcp_client_class_t dhcp_client ;
49
49
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 );
51
51
void dhcpv6_renew (protocol_interface_info_entry_t * interface , if_address_entry_t * addr , if_address_callback_t reason );
52
52
53
53
@@ -193,13 +193,13 @@ int dhcp_solicit_resp_cb(uint16_t instance_id, void *ptr, uint8_t msg_name, uin
193
193
srv_data_ptr -> serverLinkType = serverId .linkType ;
194
194
srv_data_ptr -> T0 = dhcp_ia_non_temporal_params .T0 ;
195
195
srv_data_ptr -> T1 = dhcp_ia_non_temporal_params .T1 ;
196
- srv_data_ptr -> iaNonTemporalStructValid = true;
197
196
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 );
199
199
200
200
201
201
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 );
203
203
}
204
204
return RET_MSG_ACCEPTED ;
205
205
error_exit :
@@ -238,10 +238,9 @@ int dhcp_client_get_global_address(int8_t interface, uint8_t dhcp_addr[static 16
238
238
}
239
239
return -1 ;
240
240
}
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 ;
245
244
}
246
245
247
246
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
349
348
srv_data_ptr = libdhcpv6_nonTemporal_entry_get_by_prefix (interface , prefix );
350
349
cur = protocol_stack_interface_info_get_by_id (interface );
351
350
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
+ }
362
354
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
+ }
366
361
367
- return ;
362
+ libdhcvp6_nontemporalAddress_server_data_free ( srv_data_ptr ) ;
368
363
}
369
364
370
365
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
381
376
}
382
377
383
378
if (srv_data_ptr == NULL ) {
384
- return ;
379
+ return ;
385
380
}
386
381
if (reason == ADDR_CALLBACK_INVALIDATED ) {
387
382
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
451
446
}
452
447
}
453
448
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 )
455
450
{
456
451
protocol_interface_info_entry_t * cur = NULL ;
457
452
if_address_entry_t * address_entry = NULL ;
458
453
uint32_t renewTimer ;
459
454
460
455
cur = protocol_stack_interface_info_get_by_id (interface_id );
461
456
if (!cur ) {
462
- return ;
457
+ return false ;
463
458
}
464
459
renewTimer = libdhcpv6_renew_time_define (srv_data_ptr );
465
460
461
+ srv_data_ptr -> iaNonTemporalStructValid = true;
466
462
address_entry = addr_get_entry (cur , srv_data_ptr -> iaNontemporalAddress .addressPrefix );
467
463
if (address_entry == NULL ) {
468
464
// create new
@@ -474,8 +470,10 @@ void dhcpv6_client_set_address(int8_t interface_id, dhcpv6_client_server_data_t
474
470
475
471
if (address_entry == NULL ) {
476
472
tr_error ("Address add failed" );
477
- return ;
473
+ srv_data_ptr -> iaNonTemporalStructValid = false;
474
+ return false;
478
475
}
476
+
479
477
if (renewTimer ) {
480
478
// translate seconds to 100ms ticks
481
479
if (renewTimer < 0xffffffff / 10 ) {
@@ -486,6 +484,7 @@ void dhcpv6_client_set_address(int8_t interface_id, dhcpv6_client_server_data_t
486
484
}
487
485
address_entry -> state_timer = renewTimer ;
488
486
address_entry -> cb = dhcpv6_renew ;
487
+ return true;
489
488
}
490
489
491
490
#endif
0 commit comments