From de3282453799110621a099302a4479431bc0e0f9 Mon Sep 17 00:00:00 2001 From: Byron Johnson Date: Mon, 16 May 2022 20:56:43 -0400 Subject: [PATCH 1/4] add custom dhcp options --- cores/esp8266/LwipDhcpServer.cpp | 51 ++++++++++++++++++++++++++++++++ cores/esp8266/LwipDhcpServer.h | 5 ++++ 2 files changed, 56 insertions(+) diff --git a/cores/esp8266/LwipDhcpServer.cpp b/cores/esp8266/LwipDhcpServer.cpp index 07270bb6c2..83ab745fd8 100644 --- a/cores/esp8266/LwipDhcpServer.cpp +++ b/cores/esp8266/LwipDhcpServer.cpp @@ -51,6 +51,7 @@ #include "user_interface.h" #include "mem.h" +#include "Arduino.h" typedef struct dhcps_state { @@ -536,6 +537,7 @@ void DhcpServer::send_offer(struct dhcps_msg* m) end = add_msg_type(&m->options[4], DHCPOFFER); end = add_offer_options(end); + end = insert_custom_offer_options(end, &m->options[0]); end = add_end(end); p = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcps_msg), PBUF_RAM); @@ -658,6 +660,7 @@ void DhcpServer::send_ack(struct dhcps_msg* m) end = add_msg_type(&m->options[4], DHCPACK); end = add_offer_options(end); + end = insert_custom_offer_options(end, &m->options[0]); end = add_end(end); p = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcps_msg), PBUF_RAM); @@ -1591,3 +1594,51 @@ uint32 DhcpServer::dhcps_client_update(u8* bssid, struct ipv4_addr* ip) return pdhcps_pool->ip.addr; } + +uint16 DhcpServer::add_dhcps_custom_options(uint8 offerCode, char *offerContent) +{ + Serial.print("OfferCode: "); + Serial.println(String(offerCode)+offerContent); + int sizeOfCustomOptions = strlen(dhcpCustomOffers); + if (sizeOfCustomOptions + strlen(offerContent) + 1 < 100){ + dhcpCustomOffers[sizeOfCustomOptions] = offerCode; + dhcpCustomOffers[sizeOfCustomOptions +1] = strlen(offerContent); + for(int i = 0; i<(strlen(offerContent)); i++){ + dhcpCustomOffers[sizeOfCustomOptions + 2 + i] = offerContent[i]; + } + } else{ + return 0; + } + return strlen(dhcpCustomOffers); +} + +void DhcpServer::remove_dhcps_custom_options() +{ + for(uint16 i = 0; i < 100; i++){ + dhcpCustomOffers[i] = '\0'; + } +} + +uint8_t* DhcpServer::insert_custom_offer_options(uint8_t* optptr, uint8_t* optionsStart) +{ + Serial.println("Adding Options"); + Serial.println(dhcpCustomOffers); + int sizeOfCustomOptions = strlen(dhcpCustomOffers); + Serial.println(sizeOfCustomOptions); + uint16 i = 0; + while (i < sizeOfCustomOptions){ + if((uint16(dhcpCustomOffers[i+1]) +1) < (uint16(312) - uint16(optptr - optionsStart))){ + Serial.println("DHCP: Made it into IF:"); + Serial.println((uint16(312) - uint16(optptr - optionsStart))); + for(int y = 0; y < uint16(dhcpCustomOffers[i+1]) + 2; y++){ + *optptr++ = dhcpCustomOffers[i+y]; + Serial.println(dhcpCustomOffers[i+y]); + } + } + else{ + return optptr; + } + i += uint16(dhcpCustomOffers[i+1]) +2; + } + return optptr; +} diff --git a/cores/esp8266/LwipDhcpServer.h b/cores/esp8266/LwipDhcpServer.h index d5eb6410ef..98d64d000f 100644 --- a/cores/esp8266/LwipDhcpServer.h +++ b/cores/esp8266/LwipDhcpServer.h @@ -60,6 +60,10 @@ class DhcpServer bool reset_dhcps_lease_time(void); uint32 get_dhcps_lease_time(void); bool add_dhcps_lease(uint8* macaddr); + uint16 add_dhcps_custom_options(uint8 offerCode, char *offerContent); + void remove_dhcps_custom_options(void); + char dhcpCustomOffers[312]; + void dhcps_set_dns(int num, const ipv4_addr_t* dns); @@ -76,6 +80,7 @@ class DhcpServer void node_remove_from_list(list_node** phead, list_node* pdelete); uint8_t* add_msg_type(uint8_t* optptr, uint8_t type); uint8_t* add_offer_options(uint8_t* optptr); + uint8_t* insert_custom_offer_options(uint8_t* optptr, uint8_t* optionsStart); uint8_t* add_end(uint8_t* optptr); void create_msg(struct dhcps_msg* m); void send_offer(struct dhcps_msg* m); From 01ef879417d2bc35364b37a20f9cf135187c2a7b Mon Sep 17 00:00:00 2001 From: Byron Johnson Date: Mon, 16 May 2022 21:21:34 -0400 Subject: [PATCH 2/4] revise size of dhcpCustomOffers[] --- cores/esp8266/LwipDhcpServer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp8266/LwipDhcpServer.h b/cores/esp8266/LwipDhcpServer.h index 98d64d000f..7b83f41d65 100644 --- a/cores/esp8266/LwipDhcpServer.h +++ b/cores/esp8266/LwipDhcpServer.h @@ -62,7 +62,7 @@ class DhcpServer bool add_dhcps_lease(uint8* macaddr); uint16 add_dhcps_custom_options(uint8 offerCode, char *offerContent); void remove_dhcps_custom_options(void); - char dhcpCustomOffers[312]; + char dhcpCustomOffers[100]; void dhcps_set_dns(int num, const ipv4_addr_t* dns); From 287c78aadbfd2b7b4b14cdb458664a5bcf79d3db Mon Sep 17 00:00:00 2001 From: Byron Johnson Date: Fri, 20 May 2022 20:11:24 -0500 Subject: [PATCH 3/4] revised to do allocation in user code --- cores/esp8266/LwipDhcpServer.cpp | 45 +++++++------------------------- cores/esp8266/LwipDhcpServer.h | 5 ++-- 2 files changed, 12 insertions(+), 38 deletions(-) diff --git a/cores/esp8266/LwipDhcpServer.cpp b/cores/esp8266/LwipDhcpServer.cpp index 83ab745fd8..f38cfd4e82 100644 --- a/cores/esp8266/LwipDhcpServer.cpp +++ b/cores/esp8266/LwipDhcpServer.cpp @@ -51,7 +51,6 @@ #include "user_interface.h" #include "mem.h" -#include "Arduino.h" typedef struct dhcps_state { @@ -1595,50 +1594,24 @@ uint32 DhcpServer::dhcps_client_update(u8* bssid, struct ipv4_addr* ip) return pdhcps_pool->ip.addr; } -uint16 DhcpServer::add_dhcps_custom_options(uint8 offerCode, char *offerContent) +void DhcpServer::add_dhcps_custom_options(char *offerContent) { - Serial.print("OfferCode: "); - Serial.println(String(offerCode)+offerContent); - int sizeOfCustomOptions = strlen(dhcpCustomOffers); - if (sizeOfCustomOptions + strlen(offerContent) + 1 < 100){ - dhcpCustomOffers[sizeOfCustomOptions] = offerCode; - dhcpCustomOffers[sizeOfCustomOptions +1] = strlen(offerContent); - for(int i = 0; i<(strlen(offerContent)); i++){ - dhcpCustomOffers[sizeOfCustomOptions + 2 + i] = offerContent[i]; - } - } else{ - return 0; - } - return strlen(dhcpCustomOffers); + isSetCustomOptions = true; + customOptionsContent = offerContent; } void DhcpServer::remove_dhcps_custom_options() { - for(uint16 i = 0; i < 100; i++){ - dhcpCustomOffers[i] = '\0'; - } + isSetCustomOptions = false; } uint8_t* DhcpServer::insert_custom_offer_options(uint8_t* optptr, uint8_t* optionsStart) { - Serial.println("Adding Options"); - Serial.println(dhcpCustomOffers); - int sizeOfCustomOptions = strlen(dhcpCustomOffers); - Serial.println(sizeOfCustomOptions); - uint16 i = 0; - while (i < sizeOfCustomOptions){ - if((uint16(dhcpCustomOffers[i+1]) +1) < (uint16(312) - uint16(optptr - optionsStart))){ - Serial.println("DHCP: Made it into IF:"); - Serial.println((uint16(312) - uint16(optptr - optionsStart))); - for(int y = 0; y < uint16(dhcpCustomOffers[i+1]) + 2; y++){ - *optptr++ = dhcpCustomOffers[i+y]; - Serial.println(dhcpCustomOffers[i+y]); - } - } - else{ - return optptr; - } - i += uint16(dhcpCustomOffers[i+1]) +2; + if(isSetCustomOptions){ + uint16 customOptionsSize = strlen(customOptionsContent); + if((optptr + customOptionsSize - optionsStart) >= 311) return optptr; + memcpy(optptr, customOptionsContent, strlen(customOptionsContent)); + optptr += customOptionsSize; } return optptr; } diff --git a/cores/esp8266/LwipDhcpServer.h b/cores/esp8266/LwipDhcpServer.h index 7b83f41d65..80a349501b 100644 --- a/cores/esp8266/LwipDhcpServer.h +++ b/cores/esp8266/LwipDhcpServer.h @@ -60,9 +60,10 @@ class DhcpServer bool reset_dhcps_lease_time(void); uint32 get_dhcps_lease_time(void); bool add_dhcps_lease(uint8* macaddr); - uint16 add_dhcps_custom_options(uint8 offerCode, char *offerContent); + void add_dhcps_custom_options(char *offerContent); void remove_dhcps_custom_options(void); - char dhcpCustomOffers[100]; + bool isSetCustomOptions; + char *customOptionsContent; void dhcps_set_dns(int num, const ipv4_addr_t* dns); From f9778c0441da76eecc22c69b662f0cfaa63fd169 Mon Sep 17 00:00:00 2001 From: Byron Johnson Date: Tue, 24 May 2022 12:18:04 -0400 Subject: [PATCH 4/4] added error msg --- cores/esp8266/LwipDhcpServer.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cores/esp8266/LwipDhcpServer.cpp b/cores/esp8266/LwipDhcpServer.cpp index f38cfd4e82..3eea0ab3ce 100644 --- a/cores/esp8266/LwipDhcpServer.cpp +++ b/cores/esp8266/LwipDhcpServer.cpp @@ -1609,7 +1609,12 @@ uint8_t* DhcpServer::insert_custom_offer_options(uint8_t* optptr, uint8_t* optio { if(isSetCustomOptions){ uint16 customOptionsSize = strlen(customOptionsContent); - if((optptr + customOptionsSize - optionsStart) >= 311) return optptr; + if((optptr + customOptionsSize - optionsStart) >= 311){ + #if DHCPS_DEBUG + os_printf("ERROR: DHCP Custom Options Too Large. Ignoring Custom Options"); + #endif + return optptr; + } memcpy(optptr, customOptionsContent, strlen(customOptionsContent)); optptr += customOptionsSize; }