mirror of
https://github.com/espressif/ESP8266_RTOS_SDK.git
synced 2025-05-20 00:27:19 +08:00
Merge branch 'feature/add_dhcp_option' into 'release/v3.3'
feat(dhcp): Add DHCP option12, option60 and option61 in DHCP discovery and request state See merge request sdk/ESP8266_RTOS_SDK!1432
This commit is contained in:
@ -260,6 +260,12 @@ config LWIP_DHCP_DISCOVER_RETRANSMISSION_INTERVAL
|
||||
help
|
||||
Set time interval of retransmissions of DHCP discover.
|
||||
|
||||
config LWIP_ESP_DHCP_OPTION
|
||||
bool "Enable DHCP option60 and option61 in discovery and request state"
|
||||
default n
|
||||
help
|
||||
Maybe some routers need add those option to get IP address.
|
||||
Enable this config to add option60 and option61 in discovery and request state
|
||||
endmenu #DHCP
|
||||
|
||||
menuconfig LWIP_AUTOIP
|
||||
|
@ -209,6 +209,12 @@ static void dhcp_option_hostname(struct dhcp *dhcp, struct netif *netif);
|
||||
/* always add the DHCP options trailer to end and pad */
|
||||
static void dhcp_option_trailer(struct dhcp *dhcp);
|
||||
|
||||
#if ESP_DHCP_OPTION
|
||||
/* set dhcp option61 */
|
||||
static void dhcp_option_clientid(struct dhcp *dhcp, struct netif *netif);
|
||||
/* set dhcp option60 */
|
||||
static void dhcp_option_vendor(struct dhcp *dhcp, struct netif *netif);
|
||||
#endif
|
||||
/** Ensure DHCP PCB is allocated and bound */
|
||||
static err_t
|
||||
dhcp_inc_pcb_refcount(void)
|
||||
@ -362,6 +368,10 @@ dhcp_select(struct netif *netif)
|
||||
/* create and initialize the DHCP message header */
|
||||
result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);
|
||||
if (result == ERR_OK) {
|
||||
#if ESP_DHCP_OPTION
|
||||
dhcp_option_clientid(dhcp, netif);
|
||||
dhcp_option_vendor(dhcp, netif);
|
||||
#endif
|
||||
dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
|
||||
dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));
|
||||
|
||||
@ -980,6 +990,10 @@ dhcp_discover(struct netif *netif)
|
||||
if (result == ERR_OK) {
|
||||
LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: making request\n"));
|
||||
|
||||
#if ESP_DHCP_OPTION
|
||||
dhcp_option_clientid(dhcp, netif);
|
||||
dhcp_option_vendor(dhcp, netif);
|
||||
#endif
|
||||
dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
|
||||
dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));
|
||||
|
||||
@ -987,6 +1001,11 @@ dhcp_discover(struct netif *netif)
|
||||
for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) {
|
||||
dhcp_option_byte(dhcp, dhcp_discover_request_options[i]);
|
||||
}
|
||||
|
||||
#if LWIP_NETIF_HOSTNAME
|
||||
dhcp_option_hostname(dhcp, netif);
|
||||
#endif /* LWIP_NETIF_HOSTNAME */
|
||||
|
||||
dhcp_option_trailer(dhcp);
|
||||
|
||||
LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: realloc()ing\n"));
|
||||
@ -1153,6 +1172,10 @@ dhcp_renew(struct netif *netif)
|
||||
/* create and initialize the DHCP message header */
|
||||
result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);
|
||||
if (result == ERR_OK) {
|
||||
#if ESP_DHCP_OPTION
|
||||
dhcp_option_clientid(dhcp, netif);
|
||||
dhcp_option_vendor(dhcp, netif);
|
||||
#endif
|
||||
dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
|
||||
dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));
|
||||
|
||||
@ -1205,6 +1228,10 @@ dhcp_rebind(struct netif *netif)
|
||||
/* create and initialize the DHCP message header */
|
||||
result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);
|
||||
if (result == ERR_OK) {
|
||||
#if ESP_DHCP_OPTION
|
||||
dhcp_option_clientid(dhcp, netif);
|
||||
dhcp_option_vendor(dhcp, netif);
|
||||
#endif
|
||||
dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
|
||||
dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));
|
||||
|
||||
@ -1255,6 +1282,10 @@ dhcp_reboot(struct netif *netif)
|
||||
/* create and initialize the DHCP message header */
|
||||
result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);
|
||||
if (result == ERR_OK) {
|
||||
#if ESP_DHCP_OPTION
|
||||
dhcp_option_clientid(dhcp, netif);
|
||||
dhcp_option_vendor(dhcp, netif);
|
||||
#endif
|
||||
dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
|
||||
dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN_MIN_REQUIRED);
|
||||
|
||||
@ -1266,6 +1297,10 @@ dhcp_reboot(struct netif *netif)
|
||||
dhcp_option_byte(dhcp, dhcp_discover_request_options[i]);
|
||||
}
|
||||
|
||||
#if LWIP_NETIF_HOSTNAME
|
||||
dhcp_option_hostname(dhcp, netif);
|
||||
#endif /* LWIP_NETIF_HOSTNAME */
|
||||
|
||||
dhcp_option_trailer(dhcp);
|
||||
|
||||
pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
|
||||
@ -1463,6 +1498,76 @@ dhcp_option_hostname(struct dhcp *dhcp, struct netif *netif)
|
||||
}
|
||||
#endif /* LWIP_NETIF_HOSTNAME */
|
||||
|
||||
#if ESP_DHCP_OPTION
|
||||
static void dhcp_option_clientid(struct dhcp *dhcp, struct netif *netif)
|
||||
{
|
||||
if (netif) {
|
||||
u8_t id_len = NETIF_MAX_HWADDR_LEN + 1;
|
||||
dhcp_option(dhcp, DHCP_OPTION_CLIENT_ID, id_len);
|
||||
dhcp_option_byte(dhcp, DHCP_HTYPE_ETH);
|
||||
for (u8_t i = 0; i < NETIF_MAX_HWADDR_LEN; i++) {
|
||||
dhcp_option_byte(dhcp, netif->hwaddr[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static u8_t vendor_class_len = 0;
|
||||
static char *vendor_class_buf = NULL;
|
||||
err_t dhcp_set_vendor_class_identifier(u8_t len, char *str)
|
||||
{
|
||||
if (len == 0 || str == NULL) {
|
||||
return ERR_ARG;
|
||||
}
|
||||
|
||||
if (vendor_class_buf) {
|
||||
mem_free(vendor_class_buf);
|
||||
vendor_class_buf = NULL;
|
||||
}
|
||||
|
||||
vendor_class_buf = (char *)mem_malloc(len + 1);
|
||||
|
||||
if (vendor_class_buf == NULL) {
|
||||
return ERR_MEM;
|
||||
}
|
||||
|
||||
vendor_class_len = len;
|
||||
memcpy(vendor_class_buf, str, len);
|
||||
return ERR_OK;
|
||||
}
|
||||
|
||||
static void dhcp_option_vendor(struct dhcp *dhcp, struct netif *netif)
|
||||
{
|
||||
const char *p = NULL;
|
||||
u8_t len = 0;
|
||||
/* Shrink len to available bytes (need 2 bytes for OPTION_HOSTNAME
|
||||
and 1 byte for trailer) */
|
||||
size_t available = DHCP_OPTIONS_LEN - dhcp->options_out_len - 3;
|
||||
if (vendor_class_buf && vendor_class_len) {
|
||||
p = vendor_class_buf;
|
||||
LWIP_ASSERT("DHCP: vendor_class_len is too long!", vendor_class_len <= available);
|
||||
len = vendor_class_len;
|
||||
} else { //use hostname as vendor
|
||||
#if LWIP_NETIF_HOSTNAME
|
||||
if (netif->hostname != NULL) {
|
||||
size_t namelen = strlen(netif->hostname);
|
||||
if ((namelen > 0) && (namelen < 0xFF)) {
|
||||
p = netif->hostname;
|
||||
LWIP_ASSERT("DHCP: hostname is too long!", namelen <= available);
|
||||
len = (u8_t) namelen;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
if (p) {
|
||||
dhcp_option(dhcp, DHCP_OPTION_US, (u8_t)len);
|
||||
while (len--) {
|
||||
dhcp_option_byte(dhcp, *p++);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Extract the DHCP message and the DHCP options.
|
||||
*
|
||||
|
@ -175,6 +175,9 @@ typedef enum {
|
||||
#define DHCP_OVERLOAD_SNAME 2
|
||||
#define DHCP_OVERLOAD_SNAME_FILE 3
|
||||
|
||||
#if ESP_DHCP_OPTION
|
||||
err_t dhcp_set_vendor_class_identifier(u8_t len, char *str);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -2314,4 +2314,5 @@ void tcp_print_status(int status, void* p, uint32_t tmp1, uint32_t tmp2, uint32_
|
||||
#define ESP_GRATUITOUS_ARP CONFIG_LWIP_ESP_GRATUITOUS_ARP
|
||||
#define ESP_PING 1
|
||||
|
||||
#define ESP_DHCP_OPTION CONFIG_LWIP_ESP_DHCP_OPTION
|
||||
#endif /* __LWIP_HDR_LWIPOPTS_H__ */
|
||||
|
Reference in New Issue
Block a user