Skip to content

Commit 283f2ee

Browse files
author
Juha Heiskanen
committed
DHCPv6 update:
DHCPv6 send support delay send. DHCP client support now randomized Solication delay.
1 parent 99be778 commit 283f2ee

File tree

8 files changed

+50
-15
lines changed

8 files changed

+50
-15
lines changed

nanostack/dhcp_service_api.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,11 +197,12 @@ int dhcp_service_send_resp(uint32_t msg_tr_id, uint8_t options, uint8_t *msg_ptr
197197
* \param msg_ptr An allocated message pointer. This pointer is the responsibility of the service after this call.
198198
* \param msg_len The length of the message.
199199
* \param receive_resp_cb Callback pointer
200+
* \param delay_tx Transmit may be delayed and this parameter define that
200201
*
201202
* \return Transaction ID of the DHCP transaction
202203
* \return 0, if error occurred.
203204
*/
204-
uint32_t dhcp_service_send_req(uint16_t instance_id, uint8_t options, void *ptr, const uint8_t addr[static 16], uint8_t *msg_ptr, uint16_t msg_len, dhcp_service_receive_resp_cb *receive_resp_cb);
205+
uint32_t dhcp_service_send_req(uint16_t instance_id, uint8_t options, void *ptr, const uint8_t addr[static 16], uint8_t *msg_ptr, uint16_t msg_len, dhcp_service_receive_resp_cb *receive_resp_cb, uint16_t delay_tx);
205206

206207
/**
207208
* \brief Setting retransmission parameters.

source/6LoWPAN/ws/ws_bootstrap.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1140,7 +1140,8 @@ static int8_t ws_bootstrap_up(protocol_interface_info_entry_t *cur)
11401140
dhcp_client_init(cur->id, DHCPV6_DUID_HARDWARE_IEEE_802_NETWORKS_TYPE);
11411141
dhcp_service_link_local_rx_cb_set(cur->id, ws_bootstrap_dhcp_neighbour_update_cb);
11421142
dhcp_client_configure(cur->id, true, true, true); //RENEW uses SOLICIT, Interface will use 1 instance for address get, IAID address hint is not used.
1143-
dhcp_client_solicit_timeout_set(cur->id, WS_DHCP_SOLICIT_TIMEOUT, WS_DHCP_SOLICIT_MAX_RT, WS_DHCP_SOLICIT_MAX_RC);
1143+
1144+
dhcp_client_solicit_timeout_set(cur->id, WS_DHCP_SOLICIT_TIMEOUT, WS_DHCP_SOLICIT_MAX_RT, WS_DHCP_SOLICIT_MAX_RC, WS_DHCP_SOLICIT_MAX_DELAY);
11441145
dhcp_client_option_notification_cb_set(cur->id, ws_bootstrap_dhcp_info_notify_cb);
11451146

11461147
// Configure memory limits and garbage collection values;

source/6LoWPAN/ws/ws_config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ extern uint8_t DEVICE_MIN_SENS;
173173
#define WS_DHCP_SOLICIT_TIMEOUT 60
174174
#define WS_DHCP_SOLICIT_MAX_RT 900
175175
#define WS_DHCP_SOLICIT_MAX_RC 0
176+
#define WS_DHCP_SOLICIT_MAX_DELAY 5
176177

177178

178179
/* Neighbour table configuration

source/DHCPv6_client/dhcpv6_client_api.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,9 @@ void dhcp_client_configure(int8_t interface, bool renew_uses_solicit, bool one_c
5151
* /param timeout SOLICIT timeout initial value. 0 means use defaults
5252
* /param max_rt SOLICIT timeout max value.
5353
* /param max_rc SOLICIT re-transmission count. 0 means infinite.
54+
* /param max_delay Max delay of first Solicit
5455
*/
55-
void dhcp_client_solicit_timeout_set(int8_t interface, uint16_t timeout, uint16_t max_rt, uint8_t max_rc);
56+
void dhcp_client_solicit_timeout_set(int8_t interface, uint16_t timeout, uint16_t max_rt, uint8_t max_rc, uint8_t max_delay);
5657

5758
/* Delete dhcp client.
5859
*

source/DHCPv6_client/dhcpv6_client_service.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <ns_types.h>
2121
#include <ns_trace.h>
2222
#include "nsdynmemLIB.h"
23+
#include "randLIB.h"
2324
#include "ns_list.h"
2425
#include "common_functions.h"
2526

@@ -36,6 +37,7 @@ typedef struct {
3637
dhcp_client_options_notify_cb *option_information_cb;
3738
uint16_t service_instance;
3839
uint16_t relay_instance;
40+
uint16_t sol_max_delay;
3941
uint16_t sol_timeout;
4042
uint16_t sol_max_rt;
4143
uint8_t sol_max_rc;
@@ -104,6 +106,7 @@ void dhcp_client_init(int8_t interface, uint16_t link_type)
104106
dhcp_client->sol_timeout = 0;
105107
dhcp_client->sol_max_rt = 0;
106108
dhcp_client->sol_max_rc = 0;
109+
dhcp_client->sol_max_delay = 0;
107110
dhcp_client->renew_uses_solicit = false;
108111
dhcp_client->one_instance_interface = false;
109112
dhcp_client->no_address_hint = false;
@@ -139,13 +142,14 @@ void dhcp_client_configure(int8_t interface, bool renew_uses_solicit, bool one_c
139142
dhcp_client->no_address_hint = no_address_hint;
140143
}
141144

142-
void dhcp_client_solicit_timeout_set(int8_t interface, uint16_t timeout, uint16_t max_rt, uint8_t max_rc)
145+
void dhcp_client_solicit_timeout_set(int8_t interface, uint16_t timeout, uint16_t max_rt, uint8_t max_rc, uint8_t max_delay)
143146
{
144147
// Set the default retry values for SOLICIT and RENEW messages.
145148
dhcp_client_class_t *dhcp_client = dhcpv6_client_entry_discover(interface);
146149
if (!dhcp_client) {
147150
return;
148151
}
152+
dhcp_client->sol_max_delay = max_delay * 10; //Convert to ticks
149153
dhcp_client->sol_timeout = timeout;
150154
dhcp_client->sol_max_rt = max_rt;
151155
dhcp_client->sol_max_rc = max_rc;
@@ -498,8 +502,12 @@ int dhcp_client_get_global_address(int8_t interface, uint8_t dhcp_addr[static 16
498502
libdhcpv6_generic_nontemporal_address_message_write(payload_ptr, &solPacket, NULL, NULL);
499503
}
500504

505+
uint16_t delay_tx = 0;
506+
if (dhcp_client->sol_max_delay) {
507+
delay_tx = randLIB_get_random_in_range(0, dhcp_client->sol_max_delay);
508+
}
501509
// send solicit
502-
srv_data_ptr->transActionId = dhcp_service_send_req(dhcp_client->service_instance, 0, srv_data_ptr, dhcp_addr, payload_ptr, payload_len, dhcp_solicit_resp_cb);
510+
srv_data_ptr->transActionId = dhcp_service_send_req(dhcp_client->service_instance, 0, srv_data_ptr, dhcp_addr, payload_ptr, payload_len, dhcp_solicit_resp_cb, delay_tx);
503511
if (srv_data_ptr->transActionId == 0) {
504512
ns_dyn_mem_free(payload_ptr);
505513
libdhcvp6_nontemporalAddress_server_data_free(srv_data_ptr);
@@ -657,7 +665,7 @@ void dhcpv6_renew(protocol_interface_info_entry_t *interface, if_address_entry_t
657665
server_address = srv_data_ptr->server_address;
658666
}
659667

660-
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);
668+
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, 0);
661669
if (srv_data_ptr->transActionId == 0) {
662670
ns_dyn_mem_free(payload_ptr);
663671
if (addr) {

source/libDHCPv6/dhcp_service_api.c

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ typedef struct {
7676
uint32_t msg_tr_id;
7777
uint32_t message_tr_id;
7878
uint32_t first_transmit_time;
79+
uint16_t delayed_tx;
7980
uint16_t timeout;
8081
uint16_t timeout_init;
8182
uint16_t timeout_max;
@@ -768,7 +769,7 @@ int dhcp_service_send_resp(uint32_t msg_tr_id, uint8_t options, uint8_t *msg_ptr
768769
dhcp_tr_delete(msg_tr_ptr);
769770
return 0;
770771
}
771-
uint32_t dhcp_service_send_req(uint16_t instance_id, uint8_t options, void *ptr, const uint8_t addr[static 16], uint8_t *msg_ptr, uint16_t msg_len, dhcp_service_receive_resp_cb *receive_resp_cb)
772+
uint32_t dhcp_service_send_req(uint16_t instance_id, uint8_t options, void *ptr, const uint8_t addr[static 16], uint8_t *msg_ptr, uint16_t msg_len, dhcp_service_receive_resp_cb *receive_resp_cb, uint16_t delay_tx)
772773
{
773774
tr_debug("Send DHCPv6 request");
774775
msg_tr_t *msg_tr_ptr;
@@ -792,7 +793,8 @@ uint32_t dhcp_service_send_req(uint16_t instance_id, uint8_t options, void *ptr,
792793
msg_tr_ptr->instance_id = instance_id;
793794
msg_tr_ptr->socket = dhcp_service->dhcp_client_socket;
794795
msg_tr_ptr->recv_resp_cb = receive_resp_cb;
795-
msg_tr_ptr->first_transmit_time = protocol_core_monotonic_time;
796+
msg_tr_ptr->delayed_tx = delay_tx;
797+
msg_tr_ptr->first_transmit_time = protocol_core_monotonic_time + delay_tx;
796798
dhcp_tr_set_retry_timers(msg_tr_ptr, msg_tr_ptr->msg_ptr[0]);
797799
common_write_24_bit(msg_tr_ptr->msg_tr_id, &msg_tr_ptr->msg_ptr[1]);
798800

@@ -911,12 +913,20 @@ void dhcp_service_send_message(msg_tr_t *msg_tr_ptr)
911913

912914
uint8_t *ptr = msg_tr_ptr->relay_start;
913915
*ptr = DHCPV6_RELAY_REPLY;
914-
retval = socket_sendmsg(msg_tr_ptr->socket, &msghdr, NS_MSG_LEGACY0);
916+
if (msg_tr_ptr->delayed_tx) {
917+
retval = 0;
918+
} else {
919+
retval = socket_sendmsg(msg_tr_ptr->socket, &msghdr, NS_MSG_LEGACY0);
920+
}
915921

916922
} else {
917-
int16_t tc = 0;
918-
socket_setsockopt(msg_tr_ptr->socket, SOCKET_IPPROTO_IPV6, SOCKET_IPV6_TCLASS, &tc, sizeof(tc));
919-
retval = socket_sendto(msg_tr_ptr->socket, &msg_tr_ptr->addr, msg_tr_ptr->msg_ptr, msg_tr_ptr->msg_len);
923+
if (msg_tr_ptr->delayed_tx) {
924+
retval = 0;
925+
} else {
926+
int16_t tc = 0;
927+
socket_setsockopt(msg_tr_ptr->socket, SOCKET_IPPROTO_IPV6, SOCKET_IPV6_TCLASS, &tc, sizeof(tc));
928+
retval = socket_sendto(msg_tr_ptr->socket, &msg_tr_ptr->addr, msg_tr_ptr->msg_ptr, msg_tr_ptr->msg_len);
929+
}
920930
}
921931
if (retval != 0) {
922932
tr_warn("dhcp service socket_sendto fails: %i", retval);
@@ -928,6 +938,18 @@ bool dhcp_service_timer_tick(uint16_t ticks)
928938
{
929939
bool activeTimerNeed = false;
930940
ns_list_foreach_safe(msg_tr_t, cur_ptr, &dhcp_service->tr_list) {
941+
942+
if (cur_ptr->delayed_tx) {
943+
activeTimerNeed = true;
944+
if (cur_ptr->delayed_tx <= ticks) {
945+
cur_ptr->delayed_tx = 0;
946+
dhcp_service_send_message(cur_ptr);
947+
} else {
948+
cur_ptr->delayed_tx -= ticks;
949+
}
950+
continue;
951+
}
952+
931953
if (cur_ptr->timeout == 0) {
932954
continue;
933955
}
@@ -1023,7 +1045,7 @@ int dhcp_service_send_resp(uint32_t msg_tr_id, uint8_t options, uint8_t *msg_ptr
10231045
return -1;
10241046
}
10251047

1026-
uint32_t dhcp_service_send_req(uint16_t instance_id, uint8_t options, void *ptr, const uint8_t addr[static 16], uint8_t *msg_ptr, uint16_t msg_len, dhcp_service_receive_resp_cb *receive_resp_cb)
1048+
uint32_t dhcp_service_send_req(uint16_t instance_id, uint8_t options, void *ptr, const uint8_t addr[static 16], uint8_t *msg_ptr, uint16_t msg_len, dhcp_service_receive_resp_cb *receive_resp_cb, uint16_t delay_tx)
10271049
{
10281050
(void)instance_id;
10291051
(void)options;
@@ -1032,6 +1054,7 @@ uint32_t dhcp_service_send_req(uint16_t instance_id, uint8_t options, void *ptr,
10321054
(void)msg_ptr;
10331055
(void)msg_len;
10341056
(void)receive_resp_cb;
1057+
(void)delay_tx;
10351058
return 0;
10361059
}
10371060

test/nanostack/unittest/stub/dhcp_service_api_stub.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ int dhcp_service_send_resp(uint32_t msg_tr_id, uint8_t options, uint8_t *msg_ptr
147147
return 0;
148148
}
149149

150-
uint32_t dhcp_service_send_req(uint16_t instance_id, uint8_t options, void *ptr, const uint8_t addr[static 16], uint8_t *msg_ptr, uint16_t msg_len, dhcp_service_receive_resp_cb *receive_resp_cb)
150+
uint32_t dhcp_service_send_req(uint16_t instance_id, uint8_t options, void *ptr, const uint8_t addr[static 16], uint8_t *msg_ptr, uint16_t msg_len, dhcp_service_receive_resp_cb *receive_resp_cb, uint16_t delay_tx)
151151
{
152152
return 0;
153153
}

unittest/thread_dhcp_servers/Test.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ void test_service_server_multi_client_test_2(void)
358358
instance1 = dhcp_service_init(1, sim_dhcp_service_receive_req_cb);
359359
instance2 = dhcp_service_init(1, sim_dhcp_service_receive_req_cb);
360360

361-
dhcp_service_send_req(1, 0, (void *)3333, gua_dhcp_addr, router_solicit_req, sizeof(router_solicit_req), test_dhcp_service_receive_resp_cb_a);
361+
dhcp_service_send_req(1, 0, (void *)3333, gua_dhcp_addr, router_solicit_req, sizeof(router_solicit_req), test_dhcp_service_receive_resp_cb_a, 0);
362362
lt_test_socket_sendto(2, gua_dhcp_addr, router_solicit_req, sizeof(router_solicit_req));
363363

364364
lt_test_socket_recv_data(1, 1, clt_addr1, router_solicit_req, sizeof(router_solicit_req));

0 commit comments

Comments
 (0)