1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-04-19 23:22:16 +03:00

Fix DHCP server pbuf handling and allow to change netif address (#8602)

* Fix sending NACK, use helper function to fill pbuf

As noticed in https://github.com/esp8266/Arduino/pull/8582#issuecomment-1153331408
Plus, handle the case when `pbuf->len` is less than struct size

* Make sure to call SDK functions to start and stop DHCP server

As noticed in https://github.com/esp8266/Arduino/pull/8582#issuecomment-1153331408
Can't really use `server.begin()` and `server.end()` directly, only
default static IP is applied to the interface since DHCP server is
deemed 'running' (see `wifi_softap_dhcps_status()` return value)

* s

Co-authored-by: david gauchard <gauchard@laas.fr>
This commit is contained in:
Max Prokhorov 2022-06-27 03:26:05 +03:00 committed by GitHub
parent 0bff52fe55
commit 7e5520c23e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 34 deletions

View File

@ -414,7 +414,7 @@ DhcpServer::OptionsBuffer DhcpServer::create_msg(struct dhcps_msg* m)
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
void DhcpServer::send_offer(struct dhcps_msg* m) void DhcpServer::send_offer(struct dhcps_msg* m)
{ {
struct pbuf *p, *q; struct pbuf* p;
auto options = create_msg(m); auto options = create_msg(m);
options.add(DHCP_OPTION_MSG_TYPE, DHCPOFFER); options.add(DHCP_OPTION_MSG_TYPE, DHCPOFFER);
@ -438,12 +438,7 @@ void DhcpServer::send_offer(struct dhcps_msg* m)
os_printf("dhcps: send_offer>>p->tot_len = %d\n", p->tot_len); os_printf("dhcps: send_offer>>p->tot_len = %d\n", p->tot_len);
os_printf("dhcps: send_offer>>p->len = %d\n", p->len); os_printf("dhcps: send_offer>>p->len = %d\n", p->len);
#endif #endif
q = p; pbuf_take(p, m, sizeof(struct dhcps_msg));
while (q != nullptr)
{
std::memcpy((u8_t*)q->payload, reinterpret_cast<u8_t*>(&m), q->len);
q = q->next;
}
} }
else else
{ {
@ -475,7 +470,7 @@ void DhcpServer::send_offer(struct dhcps_msg* m)
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
void DhcpServer::send_nak(struct dhcps_msg* m) void DhcpServer::send_nak(struct dhcps_msg* m)
{ {
struct pbuf *p, *q; struct pbuf* p;
auto options = create_msg(m); auto options = create_msg(m);
options.add(DHCP_OPTION_MSG_TYPE, DHCPNAK); options.add(DHCP_OPTION_MSG_TYPE, DHCPNAK);
@ -492,12 +487,7 @@ void DhcpServer::send_nak(struct dhcps_msg* m)
os_printf("dhcps: send_nak>>p->tot_len = %d\n", p->tot_len); os_printf("dhcps: send_nak>>p->tot_len = %d\n", p->tot_len);
os_printf("dhcps: send_nak>>p->len = %d\n", p->len); os_printf("dhcps: send_nak>>p->len = %d\n", p->len);
#endif #endif
q = p; pbuf_take(p, m, sizeof(struct dhcps_msg));
while (q != nullptr)
{
std::memcpy((u8_t*)q->payload, (u8_t*)m, q->len);
q = q->next;
}
} }
else else
{ {
@ -524,7 +514,7 @@ void DhcpServer::send_nak(struct dhcps_msg* m)
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
void DhcpServer::send_ack(struct dhcps_msg* m) void DhcpServer::send_ack(struct dhcps_msg* m)
{ {
struct pbuf *p, *q; struct pbuf* p;
auto options = create_msg(m); auto options = create_msg(m);
options.add(DHCP_OPTION_MSG_TYPE, DHCPACK); options.add(DHCP_OPTION_MSG_TYPE, DHCPACK);
@ -548,12 +538,7 @@ void DhcpServer::send_ack(struct dhcps_msg* m)
os_printf("dhcps: send_ack>>p->tot_len = %d\n", p->tot_len); os_printf("dhcps: send_ack>>p->tot_len = %d\n", p->tot_len);
os_printf("dhcps: send_ack>>p->len = %d\n", p->len); os_printf("dhcps: send_ack>>p->len = %d\n", p->len);
#endif #endif
q = p; pbuf_take(p, m, sizeof(struct dhcps_msg));
while (q != nullptr)
{
std::memcpy((u8_t*)q->payload, (u8_t*)m, q->len);
q = q->next;
}
} }
else else
{ {

View File

@ -167,8 +167,7 @@ bool ESP8266WiFiAPClass::softAP(const char* ssid, const char* psk, int channel,
DEBUG_WIFI("[AP] softap config unchanged\n"); DEBUG_WIFI("[AP] softap config unchanged\n");
} }
auto& server = softAPDhcpServer(); wifi_softap_dhcps_stop();
server.end();
// check IP config // check IP config
struct ip_info ip; struct ip_info ip;
@ -179,17 +178,13 @@ bool ESP8266WiFiAPClass::softAP(const char* ssid, const char* psk, int channel,
IPAddress(192, 168, 4, 1), IPAddress(192, 168, 4, 1),
IPAddress(192, 168, 4, 1), IPAddress(192, 168, 4, 1),
IPAddress(255, 255, 255, 0)); IPAddress(255, 255, 255, 0));
if(!ret) {
DEBUG_WIFI("[AP] softAPConfig failed!\n");
ret = false;
}
} }
} else { } else {
DEBUG_WIFI("[AP] wifi_get_ip_info failed!\n"); DEBUG_WIFI("[AP] wifi_get_ip_info failed!\n");
ret = false; ret = false;
} }
server.begin(); wifi_softap_dhcps_start();
return ret; return ret;
} }
@ -227,9 +222,10 @@ bool ESP8266WiFiAPClass::softAPConfig(IPAddress local_ip, IPAddress gateway, IPA
info.gw.addr = gateway.v4(); info.gw.addr = gateway.v4();
info.netmask.addr = subnet.v4(); info.netmask.addr = subnet.v4();
auto& server = softAPDhcpServer(); // use SDK function for dhcps, not just server.begin()
server.end(); // setting info with static IPs will fail otherwise
// (TODO: dhcps_flag seems to store 'SDK' DHCPs status)
wifi_softap_dhcps_stop();
if(!wifi_set_ip_info(SOFTAP_IF, &info)) { if(!wifi_set_ip_info(SOFTAP_IF, &info)) {
DEBUG_WIFI("[APConfig] wifi_set_ip_info failed!\n"); DEBUG_WIFI("[APConfig] wifi_set_ip_info failed!\n");
ret = false; ret = false;
@ -246,14 +242,17 @@ bool ESP8266WiFiAPClass::softAPConfig(IPAddress local_ip, IPAddress gateway, IPA
dhcp_lease.end_ip.addr = ip.v4(); dhcp_lease.end_ip.addr = ip.v4();
DEBUG_WIFI("[APConfig] DHCP IP end: %s\n", ip.toString().c_str()); DEBUG_WIFI("[APConfig] DHCP IP end: %s\n", ip.toString().c_str());
auto& server = softAPDhcpServer();
if(!server.set_dhcps_lease(&dhcp_lease)) if(!server.set_dhcps_lease(&dhcp_lease))
{ {
DEBUG_WIFI("[APConfig] wifi_set_ip_info failed!\n"); DEBUG_WIFI("[APConfig] server set_dhcps_lease failed!\n");
ret = false; ret = false;
} }
server.setRouter(true); // send ROUTER option with netif's gateway IP // send ROUTER option with netif's gateway IP
server.begin(); server.setRouter(true);
wifi_softap_dhcps_start();
// check config // check config
if(wifi_get_ip_info(SOFTAP_IF, &info)) { if(wifi_get_ip_info(SOFTAP_IF, &info)) {