[wifi] Eliminate heap allocations in IP address logging (#13017)

This commit is contained in:
J. Nick Koston
2026-01-06 08:21:16 -10:00
committed by GitHub
parent ac42102320
commit d6c2dd3c26
3 changed files with 14 additions and 31 deletions
+2 -2
View File
@@ -639,13 +639,13 @@ void WiFiComponent::setup_ap_config_() {
}
this->ap_setup_ = this->wifi_start_ap_(this->ap_);
auto ip_address = this->wifi_soft_ap_ip().str();
char ip_buf[network::IP_ADDRESS_BUFFER_SIZE];
ESP_LOGCONFIG(TAG,
"Setting up AP:\n"
" AP SSID: '%s'\n"
" AP Password: '%s'\n"
" IP Address: %s",
this->ap_.get_ssid().c_str(), this->ap_.get_password().c_str(), ip_address.c_str());
this->ap_.get_ssid().c_str(), this->ap_.get_password().c_str(), this->wifi_soft_ap_ip().str_to(ip_buf));
#ifdef USE_WIFI_MANUAL_IP
auto manual_ip = this->ap_.get_manual_ip();
@@ -371,7 +371,8 @@ bool WiFiComponent::wifi_sta_connect_(const WiFiAP &ap) {
while (!connected) {
uint8_t ipv6_addr_count = 0;
for (auto addr : addrList) {
ESP_LOGV(TAG, "Address %s", addr.toString().c_str());
char ip_buf[network::IP_ADDRESS_BUFFER_SIZE];
ESP_LOGV(TAG, "Address %s", network::IPAddress(addr.ipFromNetifNum()).str_to(ip_buf));
if (addr.isV6()) {
ipv6_addr_count++;
}
@@ -413,21 +414,6 @@ const LogString *get_auth_mode_str(uint8_t mode) {
return LOG_STR("UNKNOWN");
}
}
#ifdef ipv4_addr
std::string format_ip_addr(struct ipv4_addr ip) {
char buf[20];
sprintf(buf, "%u.%u.%u.%u", uint8_t(ip.addr >> 0), uint8_t(ip.addr >> 8), uint8_t(ip.addr >> 16),
uint8_t(ip.addr >> 24));
return buf;
}
#else
std::string format_ip_addr(struct ip_addr ip) {
char buf[20];
sprintf(buf, "%u.%u.%u.%u", uint8_t(ip.addr >> 0), uint8_t(ip.addr >> 8), uint8_t(ip.addr >> 16),
uint8_t(ip.addr >> 24));
return buf;
}
#endif
const LogString *get_op_mode_str(uint8_t mode) {
switch (mode) {
case WIFI_OFF:
@@ -582,8 +568,10 @@ void WiFiComponent::wifi_event_callback(System_Event_t *event) {
}
case EVENT_STAMODE_GOT_IP: {
auto it = event->event_info.got_ip;
ESP_LOGV(TAG, "static_ip=%s gateway=%s netmask=%s", format_ip_addr(it.ip).c_str(), format_ip_addr(it.gw).c_str(),
format_ip_addr(it.mask).c_str());
char ip_buf[network::IP_ADDRESS_BUFFER_SIZE], gw_buf[network::IP_ADDRESS_BUFFER_SIZE],
mask_buf[network::IP_ADDRESS_BUFFER_SIZE];
ESP_LOGV(TAG, "static_ip=%s gateway=%s netmask=%s", network::IPAddress(&it.ip).str_to(ip_buf),
network::IPAddress(&it.gw).str_to(gw_buf), network::IPAddress(&it.mask).str_to(mask_buf));
s_sta_got_ip = true;
#ifdef USE_WIFI_LISTENERS
for (auto *listener : global_wifi_component->ip_state_listeners_) {
@@ -635,8 +623,10 @@ void WiFiComponent::wifi_event_callback(System_Event_t *event) {
#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE
auto it = event->event_info.distribute_sta_ip;
char mac_buf[MAC_ADDRESS_PRETTY_BUFFER_SIZE];
char ip_buf[network::IP_ADDRESS_BUFFER_SIZE];
format_mac_addr_upper(it.mac, mac_buf);
ESP_LOGV(TAG, "AP Distribute Station IP MAC=%s IP=%s aid=%u", mac_buf, format_ip_addr(it.ip).c_str(), it.aid);
ESP_LOGV(TAG, "AP Distribute Station IP MAC=%s IP=%s aid=%u", mac_buf, network::IPAddress(&it.ip).str_to(ip_buf),
it.aid);
#endif
break;
}
@@ -231,14 +231,6 @@ const char *get_auth_mode_str(uint8_t mode) {
}
}
using esphome_ip4_addr_t = IPAddress;
std::string format_ip4_addr(const esphome_ip4_addr_t &ip) {
char buf[20];
uint32_t addr = ip;
sprintf(buf, "%u.%u.%u.%u", uint8_t(addr >> 0), uint8_t(addr >> 8), uint8_t(addr >> 16), uint8_t(addr >> 24));
return buf;
}
const char *get_op_mode_str(uint8_t mode) {
switch (mode) {
case WIFI_OFF:
@@ -530,8 +522,9 @@ void WiFiComponent::wifi_process_event_(LTWiFiEvent *event) {
break;
}
case ESPHOME_EVENT_ID_WIFI_STA_GOT_IP: {
ESP_LOGV(TAG, "static_ip=%s gateway=%s", format_ip4_addr(WiFi.localIP()).c_str(),
format_ip4_addr(WiFi.gatewayIP()).c_str());
char ip_buf[network::IP_ADDRESS_BUFFER_SIZE], gw_buf[network::IP_ADDRESS_BUFFER_SIZE];
ESP_LOGV(TAG, "static_ip=%s gateway=%s", network::IPAddress(WiFi.localIP()).str_to(ip_buf),
network::IPAddress(WiFi.gatewayIP()).str_to(gw_buf));
s_sta_state = LTWiFiSTAState::CONNECTED;
#ifdef USE_WIFI_LISTENERS
for (auto *listener : this->ip_state_listeners_) {