fixed bug #38203: DHCP options are not recorded in all DHCP ack messages (patch by Florent Matignon)

This commit is contained in:
sg 2016-03-23 21:06:52 +01:00
parent 85d5fbdc7f
commit c6b742812d
2 changed files with 29 additions and 7 deletions

View File

@ -302,6 +302,9 @@ HISTORY
++ Bugfixes: ++ Bugfixes:
2016-03-23: Florent Matignon
* dhcp.c: fixed bug #38203: DHCP options are not recorded in all DHCP ack messages
2016-03-22: Simon Goldschmidt 2016-03-22: Simon Goldschmidt
* tcp: changed accept handling to be done internally: the application does not * tcp: changed accept handling to be done internally: the application does not
have to call tcp_accepted() any more. Instead, when delaying accept (e.g. sockets have to call tcp_accepted() any more. Instead, when delaying accept (e.g. sockets

View File

@ -136,7 +136,7 @@ u32_t dhcp_rx_options_val[DHCP_OPTION_IDX_MAX];
@todo: move this into struct dhcp? */ @todo: move this into struct dhcp? */
u8_t dhcp_rx_options_given[DHCP_OPTION_IDX_MAX]; u8_t dhcp_rx_options_given[DHCP_OPTION_IDX_MAX];
static u8_t dhcp_discover_select_options[] = { static u8_t dhcp_discover_request_options[] = {
DHCP_OPTION_SUBNET_MASK, DHCP_OPTION_SUBNET_MASK,
DHCP_OPTION_ROUTER, DHCP_OPTION_ROUTER,
DHCP_OPTION_BROADCAST, DHCP_OPTION_BROADCAST,
@ -357,9 +357,9 @@ dhcp_select(struct netif *netif)
dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4); dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4);
dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(ip_2_ip4(&dhcp->server_ip_addr)))); dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(ip_2_ip4(&dhcp->server_ip_addr))));
dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, sizeof(dhcp_discover_select_options)); dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, sizeof(dhcp_discover_request_options));
for (i = 0; i < sizeof(dhcp_discover_select_options); i++) { for (i = 0; i < sizeof(dhcp_discover_request_options); i++) {
dhcp_option_byte(dhcp, dhcp_discover_select_options[i]); dhcp_option_byte(dhcp, dhcp_discover_request_options[i]);
} }
#if LWIP_NETIF_HOSTNAME #if LWIP_NETIF_HOSTNAME
@ -947,9 +947,9 @@ dhcp_discover(struct netif *netif)
dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif)); dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));
dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, sizeof(dhcp_discover_select_options)); dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, sizeof(dhcp_discover_request_options));
for (i = 0; i < sizeof(dhcp_discover_select_options); i++) { for (i = 0; i < sizeof(dhcp_discover_request_options); i++) {
dhcp_option_byte(dhcp, dhcp_discover_select_options[i]); dhcp_option_byte(dhcp, dhcp_discover_request_options[i]);
} }
dhcp_option_trailer(dhcp); dhcp_option_trailer(dhcp);
@ -1099,6 +1099,7 @@ dhcp_renew(struct netif *netif)
struct dhcp *dhcp = netif->dhcp; struct dhcp *dhcp = netif->dhcp;
err_t result; err_t result;
u16_t msecs; u16_t msecs;
u8_t i;
LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_renew()\n")); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_renew()\n"));
dhcp_set_state(dhcp, DHCP_STATE_RENEWING); dhcp_set_state(dhcp, DHCP_STATE_RENEWING);
@ -1108,6 +1109,11 @@ dhcp_renew(struct netif *netif)
dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif)); dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));
dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, sizeof(dhcp_discover_request_options));
for (i = 0; i < sizeof(dhcp_discover_request_options); i++) {
dhcp_option_byte(dhcp, dhcp_discover_request_options[i]);
}
#if LWIP_NETIF_HOSTNAME #if LWIP_NETIF_HOSTNAME
dhcp_option_hostname(dhcp, netif); dhcp_option_hostname(dhcp, netif);
#endif /* LWIP_NETIF_HOSTNAME */ #endif /* LWIP_NETIF_HOSTNAME */
@ -1145,6 +1151,7 @@ dhcp_rebind(struct netif *netif)
struct dhcp *dhcp = netif->dhcp; struct dhcp *dhcp = netif->dhcp;
err_t result; err_t result;
u16_t msecs; u16_t msecs;
u8_t i;
LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind()\n")); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind()\n"));
dhcp_set_state(dhcp, DHCP_STATE_REBINDING); dhcp_set_state(dhcp, DHCP_STATE_REBINDING);
@ -1154,6 +1161,11 @@ dhcp_rebind(struct netif *netif)
dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif)); dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));
dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, sizeof(dhcp_discover_request_options));
for (i = 0; i < sizeof(dhcp_discover_request_options); i++) {
dhcp_option_byte(dhcp, dhcp_discover_request_options[i]);
}
#if LWIP_NETIF_HOSTNAME #if LWIP_NETIF_HOSTNAME
dhcp_option_hostname(dhcp, netif); dhcp_option_hostname(dhcp, netif);
#endif /* LWIP_NETIF_HOSTNAME */ #endif /* LWIP_NETIF_HOSTNAME */
@ -1189,6 +1201,7 @@ dhcp_reboot(struct netif *netif)
struct dhcp *dhcp = netif->dhcp; struct dhcp *dhcp = netif->dhcp;
err_t result; err_t result;
u16_t msecs; u16_t msecs;
u8_t i;
LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot()\n")); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot()\n"));
dhcp_set_state(dhcp, DHCP_STATE_REBOOTING); dhcp_set_state(dhcp, DHCP_STATE_REBOOTING);
@ -1201,6 +1214,11 @@ dhcp_reboot(struct netif *netif)
dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4); dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4);
dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr))); dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));
dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, sizeof(dhcp_discover_request_options));
for (i = 0; i < sizeof(dhcp_discover_request_options); i++) {
dhcp_option_byte(dhcp, dhcp_discover_request_options[i]);
}
dhcp_option_trailer(dhcp); dhcp_option_trailer(dhcp);
pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
@ -1701,6 +1719,7 @@ dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr,
/* already bound to the given lease address? */ /* already bound to the given lease address? */
else if ((dhcp->state == DHCP_STATE_REBOOTING) || (dhcp->state == DHCP_STATE_REBINDING) || else if ((dhcp->state == DHCP_STATE_REBOOTING) || (dhcp->state == DHCP_STATE_REBINDING) ||
(dhcp->state == DHCP_STATE_RENEWING)) { (dhcp->state == DHCP_STATE_RENEWING)) {
dhcp_handle_ack(netif);
dhcp_bind(netif); dhcp_bind(netif);
} }
} }