68#if LWIP_IPV4 && LWIP_DHCP
86#ifdef LWIP_HOOK_FILENAME
87#include LWIP_HOOK_FILENAME
89#ifndef LWIP_HOOK_DHCP_APPEND_OPTIONS
90#define LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, state, msg, msg_type, options_len_ptr)
92#ifndef LWIP_HOOK_DHCP_PARSE_OPTION
93#define LWIP_HOOK_DHCP_PARSE_OPTION(netif, dhcp, state, msg, msg_type, option, len, pbuf, offset) do { LWIP_UNUSED_ARG(msg); } while(0)
104#ifndef DHCP_ADD_EXTRA_REQUEST_OPTIONS
105#define DHCP_ADD_EXTRA_REQUEST_OPTIONS
115#ifndef DHCP_DEFINE_CUSTOM_TIMEOUTS
116#define SET_TIMEOUT_FROM_OFFERED(result, offered, min, max) do { \
117 u32_t timeout = (offered + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS; \
118 if (timeout > max) { \
121 if (timeout == min) { \
124 result = (dhcp_timeout_t)timeout; \
127#define DHCP_SET_TIMEOUT_FROM_OFFERED_T0_LEASE(res, dhcp) SET_TIMEOUT_FROM_OFFERED(res, (dhcp)->offered_t0_lease, 0, 0xffff)
128#define DHCP_SET_TIMEOUT_FROM_OFFERED_T1_RENEW(res, dhcp) SET_TIMEOUT_FROM_OFFERED(res, (dhcp)->offered_t1_renew, 0, 0xffff)
129#define DHCP_SET_TIMEOUT_FROM_OFFERED_T2_REBIND(res, dhcp) SET_TIMEOUT_FROM_OFFERED(res, (dhcp)->offered_t2_rebind, 0, 0xffff)
131#define DHCP_NEXT_TIMEOUT_THRESHOLD ((60 + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS)
132#define DHCP_REQUEST_BACKOFF_SEQUENCE(tries) (u16_t)(( (tries) < 6 ? 1 << (tries) : 60) * 1000)
139#ifndef DHCP_CREATE_RAND_XID
140#define DHCP_CREATE_RAND_XID 1
148#ifdef DHCP_GLOBAL_XID_HEADER
149#include DHCP_GLOBAL_XID_HEADER
154#define DHCP_MAX_MSG_LEN(netif) (netif->mtu)
155#define DHCP_MAX_MSG_LEN_MIN_REQUIRED 576
157#define DHCP_MIN_REPLY_LEN 44
159#define REBOOT_TRIES 2
161#if LWIP_DNS && LWIP_DHCP_MAX_DNS_SERVERS
162#if DNS_MAX_SERVERS > LWIP_DHCP_MAX_DNS_SERVERS
163#define LWIP_DHCP_PROVIDE_DNS_SERVERS LWIP_DHCP_MAX_DNS_SERVERS
165#define LWIP_DHCP_PROVIDE_DNS_SERVERS DNS_MAX_SERVERS
168#define LWIP_DHCP_PROVIDE_DNS_SERVERS 0
171#ifndef LWIP_DHCP_INPUT_ERROR
172#define LWIP_DHCP_INPUT_ERROR(message, expression, handler) do { if (!(expression)) { \
181enum dhcp_option_idx {
182 DHCP_OPTION_IDX_OVERLOAD = 0,
183 DHCP_OPTION_IDX_MSG_TYPE,
184 DHCP_OPTION_IDX_SERVER_ID,
185 DHCP_OPTION_IDX_LEASE_TIME,
188 DHCP_OPTION_IDX_SUBNET_MASK,
189 DHCP_OPTION_IDX_ROUTER,
190#if LWIP_DHCP_PROVIDE_DNS_SERVERS
191 DHCP_OPTION_IDX_DNS_SERVER,
192 DHCP_OPTION_IDX_DNS_SERVER_LAST = DHCP_OPTION_IDX_DNS_SERVER + LWIP_DHCP_PROVIDE_DNS_SERVERS - 1,
194#if LWIP_DHCP_GET_NTP_SRV
195 DHCP_OPTION_IDX_NTP_SERVER,
203static u32_t dhcp_rx_options_val[DHCP_OPTION_IDX_MAX];
207static u8_t dhcp_rx_options_given[DHCP_OPTION_IDX_MAX];
209static u8_t dhcp_discover_request_options[] = {
210 DHCP_OPTION_SUBNET_MASK,
212 DHCP_OPTION_BROADCAST
213#if LWIP_DHCP_PROVIDE_DNS_SERVERS
214 , DHCP_OPTION_DNS_SERVER
216#if LWIP_DHCP_GET_NTP_SRV
219 DHCP_ADD_EXTRA_REQUEST_OPTIONS
222#ifdef DHCP_GLOBAL_XID
224static u8_t xid_initialised;
227#define dhcp_option_given(dhcp, idx) (dhcp_rx_options_given[idx] != 0)
228#define dhcp_got_option(dhcp, idx) (dhcp_rx_options_given[idx] = 1)
229#define dhcp_clear_option(dhcp, idx) (dhcp_rx_options_given[idx] = 0)
230#define dhcp_clear_all_options(dhcp) (memset(dhcp_rx_options_given, 0, sizeof(dhcp_rx_options_given)))
231#define dhcp_get_option_value(dhcp, idx) (dhcp_rx_options_val[idx])
232#define dhcp_set_option_value(dhcp, idx, val) (dhcp_rx_options_val[idx] = (val))
234static struct udp_pcb *dhcp_pcb;
235static u8_t dhcp_pcb_refcount;
238static err_t dhcp_discover(
struct netif *
netif);
241#if LWIP_DHCP_DOES_ACD_CHECK
242static err_t dhcp_decline(
struct netif *
netif);
246static void dhcp_set_state(
struct dhcp *dhcp, u8_t new_state);
249static void dhcp_recv(
void *arg,
struct udp_pcb *pcb,
struct pbuf *p,
const ip_addr_t *addr, u16_t port);
253static void dhcp_t1_timeout(
struct netif *
netif);
254static void dhcp_t2_timeout(
struct netif *
netif);
258static struct pbuf *dhcp_create_msg(
struct netif *
netif,
struct dhcp *dhcp, u8_t message_type, u16_t *options_out_len);
260static u16_t dhcp_option(u16_t options_out_len, u8_t *options, u8_t option_type, u8_t option_len);
262static u16_t dhcp_option_byte(u16_t options_out_len, u8_t *options, u8_t value);
263static u16_t dhcp_option_short(u16_t options_out_len, u8_t *options, u16_t value);
264static u16_t dhcp_option_long(u16_t options_out_len, u8_t *options, u32_t value);
265#if LWIP_NETIF_HOSTNAME
266static u16_t dhcp_option_hostname(u16_t options_out_len, u8_t *options,
struct netif *
netif);
269static void dhcp_option_trailer(u16_t options_out_len, u8_t *options,
struct pbuf *p_out);
273dhcp_inc_pcb_refcount(
void)
275 if (dhcp_pcb_refcount == 0) {
276 LWIP_ASSERT(
"dhcp_inc_pcb_refcount(): memory leak", dhcp_pcb == NULL);
279 dhcp_pcb = udp_new();
281 if (dhcp_pcb == NULL) {
290 udp_recv(dhcp_pcb, dhcp_recv, NULL);
300dhcp_dec_pcb_refcount(
void)
302 LWIP_ASSERT(
"dhcp_pcb_refcount(): refcount error", (dhcp_pcb_refcount > 0));
305 if (dhcp_pcb_refcount == 0) {
306 udp_remove(dhcp_pcb);
326 struct dhcp *dhcp = netif_dhcp_data(
netif);
332 dhcp_set_state(dhcp, DHCP_STATE_BACKING_OFF);
336 dhcp_discover(
netif);
339#if LWIP_DHCP_DOES_ACD_CHECK
347dhcp_conflict_callback(
struct netif *
netif, acd_callback_enum_t state)
349 struct dhcp *dhcp = netif_dhcp_data(
netif);
352 LWIP_ASSERT(
"DHCP should be enabled at this point, but it is not!",
353 (dhcp != NULL) && (dhcp->state != DHCP_STATE_OFF));
359 case ACD_RESTART_CLIENT:
367 dhcp_set_state(dhcp, DHCP_STATE_BACKING_OFF);
369 dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS);
395 struct dhcp *dhcp = netif_dhcp_data(
netif);
399 dhcp_set_state(dhcp, DHCP_STATE_CHECKING);
402 acd_start(
netif, &dhcp->acd, dhcp->offered_ip_addr);
414 struct dhcp *dhcp = netif_dhcp_data(
netif);
419 if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SERVER_ID)) {
420 dhcp->request_timeout = 0;
422 ip_addr_set_ip4_u32(&dhcp->server_ip_addr, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SERVER_ID)));
433 (
"dhcp_handle_offer(netif=%p) did not get server ID!\n", (
void *)
netif));
453 u16_t options_out_len;
455 LWIP_ERROR(
"dhcp_select: netif != NULL", (
netif != NULL),
return ERR_ARG;);
456 dhcp = netif_dhcp_data(
netif);
457 LWIP_ERROR(
"dhcp_select: dhcp != NULL", (dhcp != NULL),
return ERR_VAL;);
460 dhcp_set_state(dhcp, DHCP_STATE_REQUESTING);
463 p_out = dhcp_create_msg(
netif, dhcp, DHCP_REQUEST, &options_out_len);
466 options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
467 options_out_len = dhcp_option_short(options_out_len, msg_out->options, DHCP_MAX_MSG_LEN(
netif));
470 options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_REQUESTED_IP, 4);
471 options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(
ip4_addr_get_u32(&dhcp->offered_ip_addr)));
473 options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_SERVER_ID, 4);
474 options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(
ip4_addr_get_u32(ip_2_ip4(&dhcp->server_ip_addr))));
476 options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options));
477 for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) {
478 options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]);
481#if LWIP_NETIF_HOSTNAME
482 options_out_len = dhcp_option_hostname(options_out_len, msg_out->options,
netif);
485 LWIP_HOOK_DHCP_APPEND_OPTIONS(
netif, dhcp, DHCP_STATE_REQUESTING, msg_out, DHCP_REQUEST, &options_out_len);
486 dhcp_option_trailer(options_out_len, msg_out->options, p_out);
496 if (dhcp->tries < 255) {
499 msecs = (u16_t)((dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000);
500 dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS);
515 NETIF_FOREACH(
netif) {
517 struct dhcp *dhcp = netif_dhcp_data(
netif);
518 if ((dhcp != NULL) && (dhcp->state != DHCP_STATE_OFF)) {
520 if (dhcp->t0_timeout && (++dhcp->lease_used == dhcp->t0_timeout)) {
523 dhcp_release_and_stop(
netif);
526 }
else if (dhcp->t2_rebind_time && (dhcp->t2_rebind_time-- == 1)) {
529 dhcp_t2_timeout(
netif);
531 }
else if (dhcp->t1_renew_time && (dhcp->t1_renew_time-- == 1)) {
534 dhcp_t1_timeout(
netif);
552 NETIF_FOREACH(
netif) {
553 struct dhcp *dhcp = netif_dhcp_data(
netif);
557 if (dhcp->request_timeout > 1) {
558 dhcp->request_timeout--;
559 }
else if (dhcp->request_timeout == 1) {
560 dhcp->request_timeout--;
581 struct dhcp *dhcp = netif_dhcp_data(
netif);
585 if ((dhcp->state == DHCP_STATE_BACKING_OFF) || (dhcp->state == DHCP_STATE_SELECTING)) {
587 dhcp_discover(
netif);
589 }
else if (dhcp->state == DHCP_STATE_REQUESTING) {
591 if (dhcp->tries <= 5) {
595 dhcp_release_and_stop(
netif);
598 }
else if (dhcp->state == DHCP_STATE_REBOOTING) {
599 if (dhcp->tries < REBOOT_TRIES) {
602 dhcp_discover(
netif);
615 struct dhcp *dhcp = netif_dhcp_data(
netif);
618 if ((dhcp->state == DHCP_STATE_REQUESTING) || (dhcp->state == DHCP_STATE_BOUND) ||
619 (dhcp->state == DHCP_STATE_RENEWING)) {
623 (
"dhcp_t1_timeout(): must renew\n"));
628 if (((dhcp->t2_timeout - dhcp->lease_used) / 2) >= DHCP_NEXT_TIMEOUT_THRESHOLD) {
629 dhcp->t1_renew_time = (dhcp_timeout_t)((dhcp->t2_timeout - dhcp->lease_used) / 2);
642 struct dhcp *dhcp = netif_dhcp_data(
netif);
645 if ((dhcp->state == DHCP_STATE_REQUESTING) || (dhcp->state == DHCP_STATE_BOUND) ||
646 (dhcp->state == DHCP_STATE_RENEWING) || (dhcp->state == DHCP_STATE_REBINDING)) {
649 (
"dhcp_t2_timeout(): must rebind\n"));
654 if (((dhcp->t0_timeout - dhcp->lease_used) / 2) >= DHCP_NEXT_TIMEOUT_THRESHOLD) {
655 dhcp->t2_rebind_time = (dhcp_timeout_t)((dhcp->t0_timeout - dhcp->lease_used) / 2);
668 struct dhcp *dhcp = netif_dhcp_data(
netif);
670#if LWIP_DHCP_PROVIDE_DNS_SERVERS || LWIP_DHCP_GET_NTP_SRV
673#if LWIP_DHCP_GET_NTP_SRV
680#if LWIP_DHCP_BOOTP_FILE
685 if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_LEASE_TIME)) {
687 dhcp->offered_t0_lease = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_LEASE_TIME);
690 if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T1)) {
692 dhcp->offered_t1_renew = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_T1);
695 dhcp->offered_t1_renew = dhcp->offered_t0_lease / 2;
699 if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T2)) {
701 dhcp->offered_t2_rebind = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_T2);
704 dhcp->offered_t2_rebind = (dhcp->offered_t0_lease * 7U) / 8U;
710#if LWIP_DHCP_BOOTP_FILE
717 if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)) {
719 ip4_addr_set_u32(&dhcp->offered_sn_mask, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)));
720 dhcp->flags |= DHCP_FLAG_SUBNET_MASK_GIVEN;
722 dhcp->flags &= ~DHCP_FLAG_SUBNET_MASK_GIVEN;
726 if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_ROUTER)) {
727 ip4_addr_set_u32(&dhcp->offered_gw_addr, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_ROUTER)));
730#if LWIP_DHCP_GET_NTP_SRV
733 ip4_addr_set_u32(&ntp_server_addrs[n], lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_NTP_SERVER + n)));
735 dhcp_set_ntp_servers(n, ntp_server_addrs);
738#if LWIP_DHCP_PROVIDE_DNS_SERVERS
740 for (n = 0; (n < LWIP_DHCP_PROVIDE_DNS_SERVERS) && dhcp_option_given(dhcp, DHCP_OPTION_IDX_DNS_SERVER + n); n++) {
742 ip_addr_set_ip4_u32_val(dns_addr, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_DNS_SERVER + n)));
743 dns_setserver(n, &dns_addr);
757dhcp_set_struct(
struct netif *
netif,
struct dhcp *dhcp)
760 LWIP_ASSERT(
"netif != NULL",
netif != NULL);
761 LWIP_ASSERT(
"dhcp != NULL", dhcp != NULL);
762 LWIP_ASSERT(
"netif already has a struct dhcp set", netif_dhcp_data(
netif) == NULL);
765 memset(dhcp, 0,
sizeof(
struct dhcp));
767 dhcp->flags |= DHCP_FLAG_EXTERNAL_MEM;
785 LWIP_ASSERT(
"netif != NULL",
netif != NULL);
787 dhcp = netif_dhcp_data(
netif);
789 if (!(dhcp->flags & DHCP_FLAG_EXTERNAL_MEM)) {
816 LWIP_ERROR(
"netif != NULL", (
netif != NULL),
return ERR_ARG;);
818 dhcp = netif_dhcp_data(
netif);
822 if (
netif->
mtu < DHCP_MAX_MSG_LEN_MIN_REQUIRED) {
830 dhcp = (
struct dhcp *)
mem_malloc(
sizeof(
struct dhcp));
843 if (dhcp->pcb_allocated != 0) {
844 dhcp_dec_pcb_refcount();
850 memset(dhcp, 0,
sizeof(
struct dhcp));
854#if LWIP_DHCP_DOES_ACD_CHECK
856 acd_add(
netif, &dhcp->acd, dhcp_conflict_callback);
862 if (dhcp_inc_pcb_refcount() !=
ERR_OK) {
865 dhcp->pcb_allocated = 1;
869 dhcp_set_state(dhcp, DHCP_STATE_INIT);
874 result = dhcp_discover(
netif);
877 dhcp_release_and_stop(
netif);
898 u16_t options_out_len;
901 LWIP_ERROR(
"netif != NULL", (
netif != NULL),
return;);
903 if (dhcp_inc_pcb_refcount() !=
ERR_OK) {
907 memset(&dhcp, 0,
sizeof(
struct dhcp));
908 dhcp_set_state(&dhcp, DHCP_STATE_INFORMING);
911 p_out = dhcp_create_msg(
netif, &dhcp, DHCP_INFORM, &options_out_len);
914 options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
915 options_out_len = dhcp_option_short(options_out_len, msg_out->options, DHCP_MAX_MSG_LEN(
netif));
917 LWIP_HOOK_DHCP_APPEND_OPTIONS(
netif, &dhcp, DHCP_STATE_INFORMING, msg_out, DHCP_INFORM, &options_out_len);
918 dhcp_option_trailer(options_out_len, msg_out->options, p_out);
929 dhcp_dec_pcb_refcount();
938dhcp_network_changed_link_up(
struct netif *
netif)
940 struct dhcp *dhcp = netif_dhcp_data(
netif);
945 switch (dhcp->state) {
946 case DHCP_STATE_REBINDING:
947 case DHCP_STATE_RENEWING:
948 case DHCP_STATE_BOUND:
949 case DHCP_STATE_REBOOTING:
957 LWIP_ASSERT(
"invalid dhcp->state", dhcp->state <= DHCP_STATE_BACKING_OFF);
963 dhcp_discover(
netif);
968#if LWIP_DHCP_DOES_ACD_CHECK
981 struct dhcp *dhcp = netif_dhcp_data(
netif);
984 u16_t options_out_len;
987 dhcp_set_state(dhcp, DHCP_STATE_BACKING_OFF);
990 p_out = dhcp_create_msg(
netif, dhcp, DHCP_DECLINE, &options_out_len);
993 options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_REQUESTED_IP, 4);
994 options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(
ip4_addr_get_u32(&dhcp->offered_ip_addr)));
996 LWIP_HOOK_DHCP_APPEND_OPTIONS(
netif, dhcp, DHCP_STATE_BACKING_OFF, msg_out, DHCP_DECLINE, &options_out_len);
997 dhcp_option_trailer(options_out_len, msg_out->options, p_out);
1005 (
"dhcp_decline: could not allocate DHCP request\n"));
1021 struct dhcp *dhcp = netif_dhcp_data(
netif);
1026 u16_t options_out_len;
1030#if LWIP_DHCP_AUTOIP_COOP
1032 autoip_start(
netif);
1037 dhcp_set_state(dhcp, DHCP_STATE_SELECTING);
1039 p_out = dhcp_create_msg(
netif, dhcp, DHCP_DISCOVER, &options_out_len);
1040 if (p_out != NULL) {
1044 options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
1045 options_out_len = dhcp_option_short(options_out_len, msg_out->options, DHCP_MAX_MSG_LEN(
netif));
1047#if LWIP_NETIF_HOSTNAME && LWIP_DHCP_DISCOVER_ADD_HOSTNAME
1048 options_out_len = dhcp_option_hostname(options_out_len, msg_out->options,
netif);
1051 options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options));
1052 for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) {
1053 options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]);
1055 LWIP_HOOK_DHCP_APPEND_OPTIONS(
netif, dhcp, DHCP_STATE_SELECTING, msg_out, DHCP_DISCOVER, &options_out_len);
1056 dhcp_option_trailer(options_out_len, msg_out->options, p_out);
1058 LWIP_DEBUGF(
DHCP_DEBUG |
LWIP_DBG_TRACE, (
"dhcp_discover: sendto(DISCOVER, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER)\n"));
1067 if (dhcp->tries < 255) {
1070 msecs = DHCP_REQUEST_BACKOFF_SEQUENCE(dhcp->tries);
1071 dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS);
1087 LWIP_ERROR(
"dhcp_bind: netif != NULL", (
netif != NULL),
return;);
1088 dhcp = netif_dhcp_data(
netif);
1089 LWIP_ERROR(
"dhcp_bind: dhcp != NULL", (dhcp != NULL),
return;);
1093 dhcp->lease_used = 0;
1095 if (dhcp->offered_t0_lease != 0xffffffffUL) {
1097 LWIP_DEBUGF(
DHCP_DEBUG |
LWIP_DBG_TRACE, (
"dhcp_bind(): t0 renewal timer %"U32_F
" secs\n", dhcp->offered_t0_lease));
1098 DHCP_SET_TIMEOUT_FROM_OFFERED_T0_LEASE(dhcp->t0_timeout, dhcp);
1103 if (dhcp->offered_t1_renew != 0xffffffffUL) {
1105 LWIP_DEBUGF(
DHCP_DEBUG |
LWIP_DBG_TRACE, (
"dhcp_bind(): t1 renewal timer %"U32_F
" secs\n", dhcp->offered_t1_renew));
1106 DHCP_SET_TIMEOUT_FROM_OFFERED_T1_RENEW(dhcp->t1_timeout, dhcp);
1108 dhcp->t1_renew_time = dhcp->t1_timeout;
1111 if (dhcp->offered_t2_rebind != 0xffffffffUL) {
1112 LWIP_DEBUGF(
DHCP_DEBUG |
LWIP_DBG_TRACE, (
"dhcp_bind(): t2 rebind timer %"U32_F
" secs\n", dhcp->offered_t2_rebind));
1113 DHCP_SET_TIMEOUT_FROM_OFFERED_T2_REBIND(dhcp->t2_timeout, dhcp);
1115 dhcp->t2_rebind_time = dhcp->t2_timeout;
1119 if ((dhcp->t1_timeout >= dhcp->t2_timeout) && (dhcp->t2_timeout > 0)) {
1120 dhcp->t1_timeout = 0;
1123 if (dhcp->flags & DHCP_FLAG_SUBNET_MASK_GIVEN) {
1128 u8_t first_octet = ip4_addr1(&dhcp->offered_ip_addr);
1129 if (first_octet <= 127) {
1131 }
else if (first_octet >= 192) {
1144 dhcp_set_state(dhcp, DHCP_STATE_BOUND);
1146 netif_set_addr(
netif, &dhcp->offered_ip_addr, &sn_mask, &gw_addr);
1159 struct dhcp *dhcp = netif_dhcp_data(
netif);
1164 u16_t options_out_len;
1168 dhcp_set_state(dhcp, DHCP_STATE_RENEWING);
1171 p_out = dhcp_create_msg(
netif, dhcp, DHCP_REQUEST, &options_out_len);
1172 if (p_out != NULL) {
1174 options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
1175 options_out_len = dhcp_option_short(options_out_len, msg_out->options, DHCP_MAX_MSG_LEN(
netif));
1177 options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options));
1178 for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) {
1179 options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]);
1182#if LWIP_NETIF_HOSTNAME
1183 options_out_len = dhcp_option_hostname(options_out_len, msg_out->options,
netif);
1186 LWIP_HOOK_DHCP_APPEND_OPTIONS(
netif, dhcp, DHCP_STATE_RENEWING, msg_out, DHCP_REQUEST, &options_out_len);
1187 dhcp_option_trailer(options_out_len, msg_out->options, p_out);
1197 if (dhcp->tries < 255) {
1201 msecs = (u16_t)(dhcp->tries < 10 ? dhcp->tries * 2000 : 20 * 1000);
1202 dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS);
1215 struct dhcp *dhcp = netif_dhcp_data(
netif);
1220 u16_t options_out_len;
1223 dhcp_set_state(dhcp, DHCP_STATE_REBINDING);
1226 p_out = dhcp_create_msg(
netif, dhcp, DHCP_REQUEST, &options_out_len);
1227 if (p_out != NULL) {
1229 options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
1230 options_out_len = dhcp_option_short(options_out_len, msg_out->options, DHCP_MAX_MSG_LEN(
netif));
1232 options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options));
1233 for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) {
1234 options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]);
1237#if LWIP_NETIF_HOSTNAME
1238 options_out_len = dhcp_option_hostname(options_out_len, msg_out->options,
netif);
1241 LWIP_HOOK_DHCP_APPEND_OPTIONS(
netif, dhcp, DHCP_STATE_REBINDING, msg_out, DHCP_DISCOVER, &options_out_len);
1242 dhcp_option_trailer(options_out_len, msg_out->options, p_out);
1252 if (dhcp->tries < 255) {
1255 msecs = (u16_t)(dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000);
1256 dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS);
1269 struct dhcp *dhcp = netif_dhcp_data(
netif);
1274 u16_t options_out_len;
1277 dhcp_set_state(dhcp, DHCP_STATE_REBOOTING);
1280 p_out = dhcp_create_msg(
netif, dhcp, DHCP_REQUEST, &options_out_len);
1281 if (p_out != NULL) {
1283 options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
1284 options_out_len = dhcp_option_short(options_out_len, msg_out->options, DHCP_MAX_MSG_LEN_MIN_REQUIRED);
1286 options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_REQUESTED_IP, 4);
1287 options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(
ip4_addr_get_u32(&dhcp->offered_ip_addr)));
1289 options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options));
1290 for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) {
1291 options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]);
1294#if LWIP_NETIF_HOSTNAME
1295 options_out_len = dhcp_option_hostname(options_out_len, msg_out->options,
netif);
1298 LWIP_HOOK_DHCP_APPEND_OPTIONS(
netif, dhcp, DHCP_STATE_REBOOTING, msg_out, DHCP_REQUEST, &options_out_len);
1299 dhcp_option_trailer(options_out_len, msg_out->options, p_out);
1309 if (dhcp->tries < 255) {
1312 msecs = (u16_t)(dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000);
1313 dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS);
1327 struct dhcp *dhcp = netif_dhcp_data(
netif);
1328 ip_addr_t server_ip_addr;
1337 if (dhcp->state == DHCP_STATE_OFF) {
1341 ip_addr_copy(server_ip_addr, dhcp->server_ip_addr);
1344 ip_addr_set_zero_ip4(&dhcp->server_ip_addr);
1348#if LWIP_DHCP_BOOTP_FILE
1351 dhcp->offered_t0_lease = dhcp->offered_t1_renew = dhcp->offered_t2_rebind = 0;
1352 dhcp->t1_renew_time = dhcp->t2_rebind_time = dhcp->lease_used = dhcp->t0_timeout = 0;
1355 if (dhcp_supplied_address(
netif)) {
1358 u16_t options_out_len;
1359 dhcp_set_state(dhcp, DHCP_STATE_OFF);
1360 p_out = dhcp_create_msg(
netif, dhcp, DHCP_RELEASE, &options_out_len);
1361 if (p_out != NULL) {
1363 options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_SERVER_ID, 4);
1364 options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(
ip4_addr_get_u32(ip_2_ip4(&server_ip_addr))));
1366 LWIP_HOOK_DHCP_APPEND_OPTIONS(
netif, dhcp, dhcp->
state, msg_out, DHCP_RELEASE, &options_out_len);
1367 dhcp_option_trailer(options_out_len, msg_out->options, p_out);
1380 dhcp_set_state(dhcp, DHCP_STATE_OFF);
1383#if LWIP_DHCP_DOES_ACD_CHECK
1385 acd_remove(
netif, &dhcp->acd);
1388 if (dhcp->pcb_allocated != 0) {
1389 dhcp_dec_pcb_refcount();
1390 dhcp->pcb_allocated = 0;
1402 dhcp_release_and_stop(
netif);
1414 dhcp_release_and_stop(
netif);
1423dhcp_set_state(
struct dhcp *dhcp, u8_t new_state)
1425 if (new_state != dhcp->state) {
1426 dhcp->state = new_state;
1428 dhcp->request_timeout = 0;
1438dhcp_option(u16_t options_out_len, u8_t *options, u8_t option_type, u8_t option_len)
1440 LWIP_ASSERT(
"dhcp_option: options_out_len + 2 + option_len <= DHCP_OPTIONS_LEN", options_out_len + 2U + option_len <=
DHCP_OPTIONS_LEN);
1441 options[options_out_len++] = option_type;
1442 options[options_out_len++] = option_len;
1443 return options_out_len;
1450dhcp_option_byte(u16_t options_out_len, u8_t *options, u8_t value)
1452 LWIP_ASSERT(
"dhcp_option_byte: options_out_len < DHCP_OPTIONS_LEN", options_out_len <
DHCP_OPTIONS_LEN);
1453 options[options_out_len++] = value;
1454 return options_out_len;
1458dhcp_option_short(u16_t options_out_len, u8_t *options, u16_t value)
1460 LWIP_ASSERT(
"dhcp_option_short: options_out_len + 2 <= DHCP_OPTIONS_LEN", options_out_len + 2U <=
DHCP_OPTIONS_LEN);
1461 options[options_out_len++] = (u8_t)((value & 0xff00U) >> 8);
1462 options[options_out_len++] = (u8_t) (value & 0x00ffU);
1463 return options_out_len;
1467dhcp_option_long(u16_t options_out_len, u8_t *options, u32_t value)
1469 LWIP_ASSERT(
"dhcp_option_long: options_out_len + 4 <= DHCP_OPTIONS_LEN", options_out_len + 4U <=
DHCP_OPTIONS_LEN);
1470 options[options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24);
1471 options[options_out_len++] = (u8_t)((value & 0x00ff0000UL) >> 16);
1472 options[options_out_len++] = (u8_t)((value & 0x0000ff00UL) >> 8);
1473 options[options_out_len++] = (u8_t)((value & 0x000000ffUL));
1474 return options_out_len;
1477#if LWIP_NETIF_HOSTNAME
1479dhcp_option_hostname(u16_t options_out_len, u8_t *options,
struct netif *
netif)
1481 if (
netif->hostname != NULL) {
1482 size_t namelen = strlen(
netif->hostname);
1485 const char *p =
netif->hostname;
1489 LWIP_ASSERT(
"DHCP: hostname is too long!", namelen <= available);
1490 len = LWIP_MIN(namelen, available);
1491 LWIP_ASSERT(
"DHCP: hostname is too long!", len <= 0xFF);
1492 options_out_len = dhcp_option(options_out_len, options, DHCP_OPTION_HOSTNAME, (u8_t)len);
1494 options_out_len = dhcp_option_byte(options_out_len, options, *p++);
1498 return options_out_len;
1513dhcp_parse_reply(
struct pbuf *p,
struct dhcp *dhcp)
1518 u16_t options_offset;
1520 u16_t options_idx_max;
1522 int parse_file_as_options = 0;
1523 int parse_sname_as_options = 0;
1525#if LWIP_DHCP_BOOTP_FILE
1526 int file_overloaded = 0;
1532 dhcp_clear_all_options(dhcp);
1534 if (p->len < DHCP_SNAME_OFS) {
1537 msg_in = (
struct dhcp_msg *)p->payload;
1538#if LWIP_DHCP_BOOTP_FILE
1540 dhcp->boot_file_name[0] = 0;
1546 options_idx = DHCP_OPTIONS_OFS;
1548 options_idx_max = p->tot_len;
1551 options_offset = options_idx;
1552 while ((q != NULL) && (options_idx >= q->len)) {
1553 options_idx = (u16_t)(options_idx - q->len);
1554 options_idx_max = (u16_t)(options_idx_max - q->len);
1560 offset = options_idx;
1561 offset_max = options_idx_max;
1562 options = (u8_t *)q->payload;
1564 while ((q != NULL) && (offset < offset_max) && (options[offset] != DHCP_OPTION_END)) {
1565 u8_t op = options[offset];
1567 u8_t decode_len = 0;
1568 int decode_idx = -1;
1569 u16_t val_offset = (u16_t)(offset + 2);
1570 if (val_offset < offset) {
1575 if ((offset + 1) < q->len) {
1576 len = options[offset + 1];
1578 len = (q->next != NULL ? ((u8_t *)q->next->payload)[0] : 0);
1584 case (DHCP_OPTION_PAD):
1586 decode_len = len = 0;
1589 case (DHCP_OPTION_SUBNET_MASK):
1590 LWIP_DHCP_INPUT_ERROR(
"len == 4", len == 4,
return ERR_VAL;);
1591 decode_idx = DHCP_OPTION_IDX_SUBNET_MASK;
1593 case (DHCP_OPTION_ROUTER):
1595 LWIP_DHCP_INPUT_ERROR(
"len >= decode_len", len >= decode_len,
return ERR_VAL;);
1596 decode_idx = DHCP_OPTION_IDX_ROUTER;
1598#if LWIP_DHCP_PROVIDE_DNS_SERVERS
1599 case (DHCP_OPTION_DNS_SERVER):
1601 LWIP_DHCP_INPUT_ERROR(
"len %% 4 == 0", len % 4 == 0,
return ERR_VAL;);
1603 decode_len = LWIP_MIN(len, 4 * LWIP_DHCP_PROVIDE_DNS_SERVERS);
1604 LWIP_DHCP_INPUT_ERROR(
"len >= decode_len", len >= decode_len,
return ERR_VAL;);
1605 decode_idx = DHCP_OPTION_IDX_DNS_SERVER;
1608 case (DHCP_OPTION_LEASE_TIME):
1609 LWIP_DHCP_INPUT_ERROR(
"len == 4", len == 4,
return ERR_VAL;);
1610 decode_idx = DHCP_OPTION_IDX_LEASE_TIME;
1612#if LWIP_DHCP_GET_NTP_SRV
1613 case (DHCP_OPTION_NTP):
1615 LWIP_DHCP_INPUT_ERROR(
"len %% 4 == 0", len % 4 == 0,
return ERR_VAL;);
1618 LWIP_DHCP_INPUT_ERROR(
"len >= decode_len", len >= decode_len,
return ERR_VAL;);
1619 decode_idx = DHCP_OPTION_IDX_NTP_SERVER;
1622 case (DHCP_OPTION_OVERLOAD):
1623 LWIP_DHCP_INPUT_ERROR(
"len == 1", len == 1,
return ERR_VAL;);
1625 LWIP_DHCP_INPUT_ERROR(
"overload in file/sname", options_offset == DHCP_OPTIONS_OFS,
return ERR_VAL;);
1626 decode_idx = DHCP_OPTION_IDX_OVERLOAD;
1628 case (DHCP_OPTION_MESSAGE_TYPE):
1629 LWIP_DHCP_INPUT_ERROR(
"len == 1", len == 1,
return ERR_VAL;);
1630 decode_idx = DHCP_OPTION_IDX_MSG_TYPE;
1632 case (DHCP_OPTION_SERVER_ID):
1633 LWIP_DHCP_INPUT_ERROR(
"len == 4", len == 4,
return ERR_VAL;);
1634 decode_idx = DHCP_OPTION_IDX_SERVER_ID;
1636 case (DHCP_OPTION_T1):
1637 LWIP_DHCP_INPUT_ERROR(
"len == 4", len == 4,
return ERR_VAL;);
1638 decode_idx = DHCP_OPTION_IDX_T1;
1640 case (DHCP_OPTION_T2):
1641 LWIP_DHCP_INPUT_ERROR(
"len == 4", len == 4,
return ERR_VAL;);
1642 decode_idx = DHCP_OPTION_IDX_T2;
1646 LWIP_DEBUGF(
DHCP_DEBUG, (
"skipping option %"U16_F
" in options\n", (u16_t)op));
1648 dhcp_option_given(dhcp, DHCP_OPTION_IDX_MSG_TYPE) ? (u8_t)dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_MSG_TYPE) : 0,
1649 op, len, q, val_offset);
1652 if (op == DHCP_OPTION_PAD) {
1655 if (offset + len + 2 > 0xFFFF) {
1659 offset = (u16_t)(offset + len + 2);
1660 if (decode_len > 0) {
1664 LWIP_ASSERT(
"check decode_idx", decode_idx >= 0 && decode_idx < DHCP_OPTION_IDX_MAX);
1665 if (!dhcp_option_given(dhcp, decode_idx)) {
1666 copy_len = LWIP_MIN(decode_len, 4);
1670 if (decode_len > 4) {
1672 u16_t next_val_offset;
1673 LWIP_DHCP_INPUT_ERROR(
"decode_len %% 4 == 0", decode_len % 4 == 0,
return ERR_VAL;);
1674 dhcp_got_option(dhcp, decode_idx);
1675 dhcp_set_option_value(dhcp, decode_idx, lwip_htonl(value));
1676 decode_len = (u8_t)(decode_len - 4);
1677 next_val_offset = (u16_t)(val_offset + 4);
1678 if (next_val_offset < val_offset) {
1682 val_offset = next_val_offset;
1685 }
else if (decode_len == 4) {
1686 value = lwip_ntohl(value);
1688 LWIP_DHCP_INPUT_ERROR(
"invalid decode_len", decode_len == 1,
return ERR_VAL;);
1689 value = ((u8_t *)&value)[0];
1691 dhcp_got_option(dhcp, decode_idx);
1692 dhcp_set_option_value(dhcp, decode_idx, value);
1696 if (offset >= q->len) {
1697 offset = (u16_t)(offset - q->len);
1698 offset_max = (u16_t)(offset_max - q->len);
1699 if (offset < offset_max) {
1701 LWIP_DHCP_INPUT_ERROR(
"next pbuf was null", q != NULL,
return ERR_VAL;);
1702 options = (u8_t *)q->payload;
1710 if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_OVERLOAD)) {
1711 u32_t overload = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_OVERLOAD);
1712 dhcp_clear_option(dhcp, DHCP_OPTION_IDX_OVERLOAD);
1713 if (overload == DHCP_OVERLOAD_FILE) {
1714 parse_file_as_options = 1;
1716 }
else if (overload == DHCP_OVERLOAD_SNAME) {
1717 parse_sname_as_options = 1;
1719 }
else if (overload == DHCP_OVERLOAD_SNAME_FILE) {
1720 parse_sname_as_options = 1;
1721 parse_file_as_options = 1;
1727 if (parse_file_as_options) {
1729 parse_file_as_options = 0;
1730 options_idx = DHCP_FILE_OFS;
1731 options_idx_max = DHCP_FILE_OFS + DHCP_FILE_LEN;
1732#if LWIP_DHCP_BOOTP_FILE
1733 file_overloaded = 1;
1736 }
else if (parse_sname_as_options) {
1737 parse_sname_as_options = 0;
1738 options_idx = DHCP_SNAME_OFS;
1739 options_idx_max = DHCP_SNAME_OFS + DHCP_SNAME_LEN;
1742#if LWIP_DHCP_BOOTP_FILE
1743 if (!file_overloaded) {
1745 if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_MSG_TYPE) &&
1746 (dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_MSG_TYPE) == DHCP_ACK))
1748 if (
pbuf_copy_partial(p, dhcp->boot_file_name, DHCP_FILE_LEN-1, DHCP_FILE_OFS) != (DHCP_FILE_LEN-1)) {
1752 dhcp->boot_file_name[DHCP_FILE_LEN-1] = 0;
1762dhcp_recv(
void *arg,
struct udp_pcb *pcb,
struct pbuf *p,
const ip_addr_t *addr, u16_t port)
1765 struct dhcp *dhcp = netif_dhcp_data(
netif);
1774 if ((dhcp == NULL) || (dhcp->pcb_allocated == 0)) {
1775 goto free_pbuf_and_return;
1778 LWIP_ASSERT(
"invalid server address type", IP_IS_V4(addr));
1780 LWIP_DEBUGF(
DHCP_DEBUG |
LWIP_DBG_TRACE, (
"dhcp_recv(pbuf = %p) from DHCP server %"U16_F
".%"U16_F
".%"U16_F
".%"U16_F
" port %"U16_F
"\n", (
void *)p,
1781 ip4_addr1_16(ip_2_ip4(addr)), ip4_addr2_16(ip_2_ip4(addr)), ip4_addr3_16(ip_2_ip4(addr)), ip4_addr4_16(ip_2_ip4(addr)), port));
1789 if (p->len < DHCP_MIN_REPLY_LEN) {
1791 goto free_pbuf_and_return;
1794 if (reply_msg->op != DHCP_BOOTREPLY) {
1796 goto free_pbuf_and_return;
1802 (
"netif->hwaddr[%"U16_F
"]==%02"X16_F
" != reply_msg->chaddr[%"U16_F
"]==%02"X16_F
"\n",
1803 (u16_t)i, (u16_t)
netif->
hwaddr[i], (u16_t)i, (u16_t)reply_msg->chaddr[i]));
1804 goto free_pbuf_and_return;
1808 if (lwip_ntohl(reply_msg->xid) != dhcp->xid) {
1810 (
"transaction id mismatch reply_msg->xid(%"X32_F
")!=dhcp->xid(%"X32_F
")\n", lwip_ntohl(reply_msg->xid), dhcp->xid));
1811 goto free_pbuf_and_return;
1814 if (dhcp_parse_reply(p, dhcp) !=
ERR_OK) {
1816 (
"problem unfolding DHCP message - too short on memory?\n"));
1817 goto free_pbuf_and_return;
1822 if (!dhcp_option_given(dhcp, DHCP_OPTION_IDX_MSG_TYPE)) {
1824 goto free_pbuf_and_return;
1827 msg_in = (
struct dhcp_msg *)p->payload;
1829 msg_type = (u8_t)dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_MSG_TYPE);
1831 if (msg_type == DHCP_ACK) {
1834 if ((dhcp->state == DHCP_STATE_REQUESTING) ||
1835 (dhcp->state == DHCP_STATE_REBOOTING)) {
1836 dhcp_handle_ack(
netif, msg_in);
1837#if LWIP_DHCP_DOES_ACD_CHECK
1851 else if ((dhcp->state == DHCP_STATE_REBINDING) ||
1852 (dhcp->state == DHCP_STATE_RENEWING)) {
1853 dhcp_handle_ack(
netif, msg_in);
1858 else if ((msg_type == DHCP_NAK) &&
1859 ((dhcp->state == DHCP_STATE_REBOOTING) || (dhcp->state == DHCP_STATE_REQUESTING) ||
1860 (dhcp->state == DHCP_STATE_REBINDING) || (dhcp->state == DHCP_STATE_RENEWING ))) {
1862 dhcp_handle_nak(
netif);
1865 else if ((msg_type == DHCP_OFFER) && (dhcp->state == DHCP_STATE_SELECTING)) {
1868 dhcp_handle_offer(
netif, msg_in);
1871free_pbuf_and_return:
1883dhcp_create_msg(
struct netif *
netif,
struct dhcp *dhcp, u8_t message_type, u16_t *options_out_len)
1888 u16_t options_out_len_loc;
1890#ifndef DHCP_GLOBAL_XID
1895#if DHCP_CREATE_RAND_XID && defined(LWIP_RAND)
1898 static u32_t xid = 0xABCD0000;
1901 if (!xid_initialised) {
1902 xid = DHCP_GLOBAL_XID;
1903 xid_initialised = !xid_initialised;
1906 LWIP_ERROR(
"dhcp_create_msg: netif != NULL", (
netif != NULL),
return NULL;);
1907 LWIP_ERROR(
"dhcp_create_msg: dhcp != NULL", (dhcp != NULL),
return NULL;);
1909 if (p_out == NULL) {
1911 (
"dhcp_create_msg(): could not allocate pbuf\n"));
1914 LWIP_ASSERT(
"dhcp_create_msg: check that first pbuf can hold struct dhcp_msg",
1915 (p_out->len >=
sizeof(
struct dhcp_msg)));
1918 if ((message_type != DHCP_REQUEST) || (dhcp->state == DHCP_STATE_REBOOTING)) {
1920 if (dhcp->tries == 0) {
1921#if DHCP_CREATE_RAND_XID && defined(LWIP_RAND)
1930 (
"transaction id xid(%"X32_F
")\n", xid));
1932 msg_out = (
struct dhcp_msg *)p_out->payload;
1933 memset(msg_out, 0,
sizeof(
struct dhcp_msg));
1935 msg_out->op = DHCP_BOOTREQUEST;
1939 msg_out->xid = lwip_htonl(dhcp->xid);
1943 if ((message_type == DHCP_INFORM) || (message_type == DHCP_DECLINE) || (message_type == DHCP_RELEASE) ||
1944 ((message_type == DHCP_REQUEST) &&
1945 ((dhcp->state == DHCP_STATE_RENEWING) || dhcp->state == DHCP_STATE_REBINDING))) {
1952 msg_out->cookie = PP_HTONL(DHCP_MAGIC_COOKIE);
1954 options_out_len_loc = dhcp_option(0, msg_out->options, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN);
1955 options_out_len_loc = dhcp_option_byte(options_out_len_loc, msg_out->options, message_type);
1956 if (options_out_len) {
1957 *options_out_len = options_out_len_loc;
1969dhcp_option_trailer(u16_t options_out_len, u8_t *options,
struct pbuf *p_out)
1971 options[options_out_len++] = DHCP_OPTION_END;
1973 while (((options_out_len < DHCP_MIN_OPTIONS_LEN) || (options_out_len & 3)) &&
1976 options[options_out_len++] = 0;
1989dhcp_supplied_address(
const struct netif *
netif)
1991 if ((
netif != NULL) && (netif_dhcp_data(
netif) != NULL)) {
1992 struct dhcp *dhcp = netif_dhcp_data(
netif);
1993 return (dhcp->state == DHCP_STATE_BOUND) || (dhcp->state == DHCP_STATE_RENEWING) ||
1994 (dhcp->state == DHCP_STATE_REBINDING);
#define ip4_addr_copy(dest, src)
#define netif_is_link_up(netif)
#define ip4_addr_set_zero(ipaddr)
#define NETIF_MAX_HWADDR_LEN
#define ip4_addr_get_u32(src_ipaddr)
#define ip4_addr_set_u32(dest_ipaddr, src_u32)
#define ip4_addr_set_any(ipaddr)
#define LWIP_UNUSED_ARG(x)
#define LWIP_DBG_LEVEL_SERIOUS
#define LWIP_DBG_LEVEL_WARNING
@ LWIP_IANA_HWTYPE_ETHERNET
@ LWIP_IANA_PORT_DHCP_CLIENT
@ LWIP_IANA_PORT_DHCP_SERVER
#define LWIP_DHCP_AUTOIP_COOP_TRIES
#define LWIP_DHCP_MAX_NTP_SERVERS
#define LWIP_ASSERT_CORE_LOCKED()
#define netif_set_client_data(netif, id, data)
#define NETIF_FLAG_ETHARP
#define netif_is_up(netif)
u8 pbuf_free(struct pbuf *p)
u16_t pbuf_copy_partial(const struct pbuf *p, void *dataptr, u16_t len, u16_t offset)
#define ip_set_option(pcb, opt)
#define ip_current_netif()
#define ip_current_input_netif()
void * mem_malloc(mem_size_t size)
struct ip4_addr ip4_addr_t
u8 hwaddr[NETIF_MAX_HWADDR_LEN]