api_msg: fix tcp_abort thread safety

As this tcp_abort could be directly called by application thread without
locking the TCP/TP core.

This commit also reworks and fixes CI:
1) Unit tests build with format-f warnings with GCC-11
2) Reworked to use common shell scripts from both GitLab and GitHub CI
This commit is contained in:
David Cermak
2022-11-04 11:50:42 +01:00
parent 46227e21de
commit 10197b212a
15 changed files with 152 additions and 118 deletions
+4 -43
View File
@@ -26,19 +26,8 @@ jobs:
python -m pip install lxml junit-xml
wget --no-verbose ${WGET_CHECK2JUNIT_PY}
- name: Build and Run unit tests with make
run: |
export LWIPDIR=../../../../src && cd ${CONTRIB}/ports/unix/check
make -j 4 check
make clean
export EXTRA_CFLAGS="-DESP_LWIP=1" && export CC="${CC} $EXTRA_CFLAGS"
make -j 4 check
make clean
export EXTRA_CFLAGS="-DESP_LWIP=1 -DIP_FORWARD=1" && export CC="${CC} $EXTRA_CFLAGS"
make -j 4 check
make clean
export EXTRA_CFLAGS="-DESP_LWIP=1 -DIP_FORWARD=1 -DIP_NAPT=1 -DLWIP_ARCH_CC_H -include cc_esp_platform.h" && export CC="${CC} $EXTRA_CFLAGS"
make -j 4 check
- name: Build and Run unit tests with make and cmake
run: ./test/ci/unit_tests.sh
- name: Run cmake
run: mkdir build && cd build && cmake .. -G Ninja
@@ -48,38 +37,10 @@ jobs:
run: cd build && cmake --build . --target lwipdocs
- name: Validate combinations of options
run: |
cp ${CONTRIB}/examples/example_app/lwipcfg.h.example ${CONTRIB}/examples/example_app/lwipcfg.h
cd ${CONTRIB}/ports/unix/example_app
export CFLAGS="-DESP_LWIP=LWIP_NETCONN_FULLDUPLEX -DESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_IP6_REASSEMBLY_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_DNS_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_IGMP_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_MLD6_TIMERS_ONDEMAND=ESP_LWIP -DESP_DNS=ESP_LWIP -DESP_LWIP_ARP=ESP_LWIP"
export LWIPDIR=../../../../src/
make TESTFLAGS="-Wno-documentation" -j 4
chmod +x iteropts.sh && ./iteropts.sh
- name: Build and run unit tests with cmake
run: |
export LWIP_DIR=`pwd`
cd ${CONTRIB}/ports/unix/check
mkdir build && cd build && cmake -DLWIP_DIR=`pwd`/../../../../.. .. -G Ninja
cmake --build . && ./lwip_unittests
python ${LWIP_DIR}/check2junit.py lwip_unittests.xml > ${LWIP_DIR}/unit_tests.xml
run: ./test/ci/validate_opts.sh
- name: Build and run test apps
run: |
export LWIP_DIR=`pwd` && export LWIP_CONTRIB_DIR=`pwd`/${CONTRIB}
cd test/apps
# Prepare a failing report in case we get stuck (check in no-fork mode)
python socket_linger_stress_test.py failed > ${LWIP_DIR}/socket_linger_stress_test.xml
for cfg in config_no_linger config_linger config_linger_reuse; do
cmake -DCI_BUILD=1 -DTEST_CONFIG=${cfg} -B ${cfg} -G Ninja .
cmake --build ${cfg}/
timeout 10 ./${cfg}/lwip_test_apps
python ${LWIP_DIR}/check2junit.py lwip_test_apps.xml > ${LWIP_DIR}/${cfg}.xml
done
# Run the lingering test multiple times
for run in {1..10000}; do ( timeout 10 ./config_linger/lwip_test_apps ) || exit 1 ; done
# All good, regenerate the stress test-report, since the test succeeded
python socket_linger_stress_test.py > ${LWIP_DIR}/socket_linger_stress_test.xml
run: ./test/ci/test_apps.sh
- name: Upload Test Results
if: always()
+3 -44
View File
@@ -37,36 +37,7 @@ run_unittests:
dependencies: []
script:
- *get_contrib
- export LWIPDIR=../../../../src && cd ${CONTRIB}/ports/unix/check
# build and run default lwip tests (ESP_LWIP=0!)
- make -j 4 check
# retest with ESP_LWIP patches
- make clean
- export EXTRA_CFLAGS="-DESP_LWIP=1" && export CC="${CC} $EXTRA_CFLAGS"
- make -j 4 check
# retest with IP_FORWARD enabled
- make clean
- export EXTRA_CFLAGS="-DESP_LWIP=1 -DIP_FORWARD=1" && export CC="${CC} $EXTRA_CFLAGS"
- make -j 4 check
# retest with IP_FORWARD and IP_NAPT enabled
- make clean
- export EXTRA_CFLAGS="-DESP_LWIP=1 -DIP_FORWARD=1 -DIP_NAPT=1 -DLWIP_ARCH_CC_H -include cc_esp_platform.h" && export CC="${CC} $EXTRA_CFLAGS"
- make -j 4 check
# Please uncomment the below to test IP_FORWARD/IP_NAPT tests with debug output (only ip4_route test suite will be executed)
#- make clean
#- export EXTRA_CFLAGS="-DESP_LWIP=1 -DIP_FORWARD=1 -DESP_TEST_DEBUG=1 -DIP_NAPT=1 -DLWIP_ARCH_CC_H -include cc_esp_platform.h" && export CC="${CC} $EXTRA_CFLAGS"
#- make -j 4 check
run_unittests_cmake:
stage: host_test
tags:
- host_test
script:
- *get_contrib
- *get_cmake
- cd ${CONTRIB}/ports/unix/check
- mkdir build && cd build && cmake -DLWIP_DIR=`pwd`/../../../../.. .. -G Ninja
- cmake --build . && ./lwip_unittests
- ./test/ci/unit_tests.sh
build_all:
stage: host_test
@@ -84,11 +55,7 @@ validate_opts:
- host_test
script:
- *get_contrib
- cp ${CONTRIB}/examples/example_app/lwipcfg.h.example ${CONTRIB}/examples/example_app/lwipcfg.h
- cd ${CONTRIB}/ports/unix/example_app
- export CFLAGS="-DESP_LWIP=LWIP_NETCONN_FULLDUPLEX -DESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_IP6_REASSEMBLY_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_DNS_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_IGMP_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_MLD6_TIMERS_ONDEMAND=ESP_LWIP -DESP_DNS=ESP_LWIP"
- export LWIPDIR=../../../../src/
- chmod +x iteropts.sh && ./iteropts.sh
- ./test/ci/validate_opts.sh
run_test_apps:
stage: host_test
@@ -97,15 +64,7 @@ run_test_apps:
script:
- *get_contrib
- *get_cmake
- export LWIP_DIR=`pwd` && export LWIP_CONTRIB_DIR=`pwd`/${CONTRIB}
- cd test/apps
- for cfg in config_no_linger config_linger config_linger_reuse; do
- cmake -DCI_BUILD=1 -DTEST_CONFIG=${cfg} -B ${cfg} -G Ninja .
- cmake --build ${cfg}/
- timeout 10 ./${cfg}/lwip_test_apps
- mv lwip_test_apps.xml ${cfg}.xml
- done
- for run in {1..10000}; do ( timeout 10 ./config_linger/lwip_test_apps ) || exit 1 ; done
- ./test/ci/test_apps.sh
.add_gh_key_remote: &add_gh_key_remote |
command -v ssh-agent >/dev/null || exit 1
+20
View File
@@ -840,6 +840,20 @@ netconn_free(struct netconn *conn)
memp_free(MEMP_NETCONN, conn);
}
#if ESP_LWIP
struct tcp_psb_msg {
struct tcpip_api_call_data call;
struct tcp_pcb *pcb;
};
static err_t tcp_do_abort(struct tcpip_api_call_data *msg)
{
struct tcp_psb_msg *pcb_msg = __containerof(msg, struct tcp_psb_msg, call);
tcp_abort(pcb_msg->pcb);
return ERR_OK;
}
#endif /* ESP_LWIP */
/**
* Delete rcvmbox and acceptmbox of a netconn and free the left-over data in
* these mboxes
@@ -902,7 +916,13 @@ netconn_drain(struct netconn *conn)
#endif /* ESP_LWIP */
netconn_drain(newconn);
if (newconn->pcb.tcp != NULL) {
#if ESP_LWIP
struct tcp_psb_msg pcb_msg = { 0 };
pcb_msg.pcb = newconn->pcb.tcp;
tcpip_api_call(tcp_do_abort, &pcb_msg.call);
#else
tcp_abort(newconn->pcb.tcp);
#endif /* ESP_LWIP */
newconn->pcb.tcp = NULL;
}
netconn_free(newconn);
+1
View File
@@ -24,6 +24,7 @@ endif()
set (LWIP_DEFINITIONS -DLWIP_DEBUG -DLWIP_NOASSERT_ON_ERROR -DLWIP_OPTTEST_FILE)
set (LWIP_INCLUDE_DIRS
"${LWIP_DIR}/test/apps"
"${LWIP_DIR}/test/unix"
"${LWIP_CONTRIB_DIR}/ports/unix/port/include"
"${LWIP_DIR}/test/unit"
"${LWIP_DIR}/src/include"
+10 -6
View File
@@ -1,7 +1,11 @@
import sys
from junit_xml import TestSuite as ts, TestCase as tc
try:
import sys
from junit_xml import TestSuite as ts, TestCase as tc
t=tc("lingering close stress test")
if len(sys.argv) > 1 and sys.argv[1] == "failed":
t.add_failure_info("test got stuck when closing clients socket")
print(ts.to_xml_string([ts("SOCKET SO_LINGER stress test", [t])]))
t=tc("lingering close stress test")
if len(sys.argv) > 1 and sys.argv[1] == "failed":
t.add_failure_info("test got stuck when closing clients socket")
print(ts.to_xml_string([ts("SOCKET SO_LINGER stress test", [t])]))
except ImportError:
print()
+20
View File
@@ -0,0 +1,20 @@
#!/bin/bash
set -e
export LWIP_DIR=`pwd`
export LWIP_CONTRIB_DIR=`pwd`/${CONTRIB}
cd test/apps
# Prepare a failing report in case we get stuck (check in no-fork mode)
python socket_linger_stress_test.py failed > ${LWIP_DIR}/socket_linger_stress_test.xml
for cfg in config_no_linger config_linger config_linger_reuse; do
cmake -DCI_BUILD=1 -DTEST_CONFIG=${cfg} -B ${cfg} -G Ninja .
cmake --build ${cfg}/
timeout 10 ./${cfg}/lwip_test_apps
[ -f check2junit.py ] &&
python ${LWIP_DIR}/check2junit.py lwip_test_apps.xml > ${LWIP_DIR}/${cfg}.xml
done
# Run the lingering test multiple times
for run in {1..10000}; do ( timeout 10 ./config_linger/lwip_test_apps ) || exit 1 ; done
# All good, regenerate the stress test-report, since the test succeeded
python socket_linger_stress_test.py > ${LWIP_DIR}/socket_linger_stress_test.xml
+43
View File
@@ -0,0 +1,43 @@
#!/bin/bash
set -e
export CI_ROOT_DIR=`pwd`
export LWIPDIR=../../../../src
export ORIG_CC=${CC}
pushd `pwd`
cd ${CONTRIB}/ports/unix/check
### with GNU Make
# build and run default lwip tests (ESP_LWIP=0!)
make clean
make -j 4 check
# retest with ESP_LWIP patches
make clean
export EXTRA_CFLAGS="-DESP_LWIP=1" && export CC="${ORIG_CC} ${EXTRA_CFLAGS}"
make -j 4 check
# retest with IP_FORWARD enabled
make clean
export EXTRA_CFLAGS="-DESP_LWIP=1 -DIP_FORWARD=1" && export CC="${ORIG_CC} ${EXTRA_CFLAGS}"
make -j 4 check
# retest with IP_FORWARD and IP_NAPT enabled
make clean
export EXTRA_CFLAGS="-DESP_LWIP=1 -DIP_FORWARD=1 -DIP_NAPT=1" && export CC="${ORIG_CC} ${EXTRA_CFLAGS}"
make -j 4 check
# Please uncomment the below to test IP_FORWARD/IP_NAPT tests with debug output (only ip4_route test suite will be executed)
make clean
export EXTRA_CFLAGS="-DESP_LWIP=1 -DIP_FORWARD=1 -DESP_TEST_DEBUG=1 -DIP_NAPT=1" && export CC="${ORIG_CC} ${EXTRA_CFLAGS}"
make -j 4 check
### with CMake
cd ${CI_ROOT_DIR}/${CONTRIB}/ports/unix/check
rm -rf build
export EXTRA_CFLAGS=""
export CC="${ORIG_CC}"
mkdir build && cd build && cmake -DLWIP_DIR=`pwd`/../../../../.. .. -G Ninja
cmake --build . && ./lwip_unittests
[ -f ${CI_ROOT_DIR}/check2junit.py ] &&
python ${CI_ROOT_DIR}/check2junit.py lwip_unittests.xml > ${CI_ROOT_DIR}/unit_tests.xml
popd
+11
View File
@@ -0,0 +1,11 @@
#!/bin/bash
set -e
export CFLAGS="-I../../../../test/unix -include esp_lwipopts.h"
export LWIPDIR=../../../../src/
cp ${CONTRIB}/examples/example_app/lwipcfg.h.example ${CONTRIB}/examples/example_app/lwipcfg.h
cd ${CONTRIB}/ports/unix/example_app
make TESTFLAGS="-Wno-documentation" -j 4
chmod +x iteropts.sh
./iteropts.sh
@@ -56,10 +56,6 @@
#define LWIP_ERRNO_STDINCLUDE 1
#endif
#ifdef LWIP_RAND
#define LWIP_RAND() ((u32_t)rand())
#endif
/* different handling for unit test, normally not needed */
#ifdef LWIP_NOASSERT_ON_ERROR
#define LWIP_ERROR(message, expression, handler) do { if (!(expression)) { \
@@ -85,4 +81,8 @@ typedef struct sio_status_s sio_status_t;
typedef unsigned int sys_prot_t;
#ifndef __containerof
#define __containerof(ptr, type, member) ((type *)(void *)((char *)ptr - offsetof(type, member)))
#endif
#endif /* LWIP_ARCH_CC_ESP_H */
+6 -6
View File
@@ -195,7 +195,7 @@ START_TEST(test_pbuf_take_at_edge)
out = (u8_t*)p->payload;
for (i = 0; i < (int)sizeof(testdata); i++) {
fail_unless(out[i] == testdata[i],
ck_assert_msg(out[i] == testdata[i],
"Bad data at pos %d, was %02X, expected %02X", i, out[i], testdata[i]);
}
@@ -204,11 +204,11 @@ START_TEST(test_pbuf_take_at_edge)
fail_unless(res == ERR_OK);
out = (u8_t*)p->payload;
fail_unless(out[p->len - 1] == testdata[0],
ck_assert_msg(out[p->len - 1] == testdata[0],
"Bad data at pos %d, was %02X, expected %02X", p->len - 1, out[p->len - 1], testdata[0]);
out = (u8_t*)q->payload;
for (i = 1; i < (int)sizeof(testdata); i++) {
fail_unless(out[i-1] == testdata[i],
ck_assert_msg(out[i-1] == testdata[i],
"Bad data at pos %d, was %02X, expected %02X", p->len - 1 + i, out[i-1], testdata[i]);
}
@@ -218,7 +218,7 @@ START_TEST(test_pbuf_take_at_edge)
out = (u8_t*)p->payload;
for (i = 0; i < (int)sizeof(testdata); i++) {
fail_unless(out[i] == testdata[i],
ck_assert_msg(out[i] == testdata[i],
"Bad data at pos %d, was %02X, expected %02X", p->len+i, out[i], testdata[i]);
}
pbuf_free(p);
@@ -245,11 +245,11 @@ START_TEST(test_pbuf_get_put_at_edge)
pbuf_put_at(p, p->len, testdata);
out = (u8_t*)q->payload;
fail_unless(*out == testdata,
ck_assert_msg(*out == testdata,
"Bad data at pos %d, was %02X, expected %02X", p->len, *out, testdata);
getdata = pbuf_get_at(p, p->len);
fail_unless(*out == getdata,
ck_assert_msg(*out == getdata,
"pbuf_get_at() returned bad data at pos %d, was %02X, expected %02X", p->len, getdata, *out);
pbuf_free(p);
}
+13 -13
View File
@@ -225,7 +225,7 @@ static void check_pkt(struct pbuf *p, u32_t pos, const u8_t *mem, u32_t len)
fail_unless(pos + len <= p->len); /* All data we seek within same pbuf */
data = (u8_t*)p->payload;
fail_if(memcmp(&data[pos], mem, len), "data at pos %d, len %d in packet %d did not match", pos, len, txpacket);
ck_assert_msg(!memcmp(&data[pos], mem, len), "data at pos %d, len %d in packet %d did not match", pos, len, txpacket);
}
static u32_t get_opt(u8_t opt, struct pbuf *p, u8_t *mem, u32_t max_len)
@@ -541,17 +541,17 @@ START_TEST(test_dhcp)
fail_if(memcmp(&netmask, &net_test.netmask, sizeof(ip4_addr_t)));
fail_if(memcmp(&gw, &net_test.gw, sizeof(ip4_addr_t)));
fail_unless(txpacket == 1, "TX %d packets, expected 1", txpacket); /* Nothing more sent */
ck_assert_msg(txpacket == 1, "TX %d packets, expected 1", txpacket); /* Nothing more sent */
xid = htonl(netif_dhcp_data(&net_test)->xid);
memcpy(&dhcp_offer[46], &xid, 4); /* insert correct transaction id */
send_pkt(&net_test, dhcp_offer, sizeof(dhcp_offer));
fail_unless(txpacket == 2, "TX %d packets, expected 2", txpacket); /* DHCP request sent */
ck_assert_msg(txpacket == 2, "TX %d packets, expected 2", txpacket); /* DHCP request sent */
xid = netif_dhcp_data(&net_test)->xid; /* Write bad xid, not using htonl! */
memcpy(&dhcp_ack[46], &xid, 4);
send_pkt(&net_test, dhcp_ack, sizeof(dhcp_ack));
fail_unless(txpacket == 2, "TX %d packets, still expected 2", txpacket); /* No more sent */
ck_assert_msg(txpacket == 2, "TX %d packets, still expected 2", txpacket); /* No more sent */
xid = htonl(netif_dhcp_data(&net_test)->xid); /* xid updated */
memcpy(&dhcp_ack[46], &xid, 4); /* insert transaction id */
send_pkt(&net_test, dhcp_ack, sizeof(dhcp_ack));
@@ -559,7 +559,7 @@ START_TEST(test_dhcp)
for (i = 0; i < 20; i++) {
tick_lwip();
}
fail_unless(txpacket == 5, "TX %d packets, expected 5", txpacket); /* ARP requests sent */
ck_assert_msg(txpacket == 5, "TX %d packets, expected 5", txpacket); /* ARP requests sent */
/* Interface up */
fail_unless(netif_is_up(&net_test));
@@ -839,7 +839,7 @@ START_TEST(test_dhcp_relayed)
send_pkt(&net_test, relay_offer, sizeof(relay_offer));
/* request sent? */
fail_unless(txpacket == 2, "txpkt = %d, should be 2", txpacket);
ck_assert_msg(txpacket == 2, "txpkt = %d, should be 2", txpacket);
xid = htonl(netif_dhcp_data(&net_test)->xid); /* xid updated */
memcpy(&relay_ack1[46], &xid, 4); /* insert transaction id */
send_pkt(&net_test, relay_ack1, sizeof(relay_ack1));
@@ -847,7 +847,7 @@ START_TEST(test_dhcp_relayed)
for (i = 0; i < 25; i++) {
tick_lwip();
}
fail_unless(txpacket == 5, "txpkt should be 5, is %d", txpacket); /* ARP requests sent */
ck_assert_msg(txpacket == 5, "txpkt should be 5, is %d", txpacket); /* ARP requests sent */
/* Interface up */
fail_unless(netif_is_up(&net_test));
@@ -860,20 +860,20 @@ START_TEST(test_dhcp_relayed)
fail_if(memcmp(&netmask, &net_test.netmask, sizeof(ip4_addr_t)));
fail_if(memcmp(&gw, &net_test.gw, sizeof(ip4_addr_t)));
fail_unless(txpacket == 5, "txpacket = %d", txpacket);
ck_assert_msg(txpacket == 5, "txpacket = %d", txpacket);
for (i = 0; i < 108000 - 25; i++) {
tick_lwip();
}
fail_unless(netif_is_up(&net_test));
fail_unless(txpacket == 6, "txpacket = %d", txpacket);
ck_assert_msg(txpacket == 6, "txpacket = %d", txpacket);
/* We need to send arp response here.. */
send_pkt(&net_test, arp_resp, sizeof(arp_resp));
fail_unless(txpacket == 7, "txpacket = %d", txpacket);
ck_assert_msg(txpacket == 7, "txpacket = %d", txpacket);
fail_unless(netif_is_up(&net_test));
xid = htonl(netif_dhcp_data(&net_test)->xid); /* xid updated */
@@ -884,7 +884,7 @@ START_TEST(test_dhcp_relayed)
tick_lwip();
}
fail_unless(txpacket == 7, "txpacket = %d", txpacket);
ck_assert_msg(txpacket == 7, "txpacket = %d", txpacket);
tcase = TEST_NONE;
dhcp_stop(&net_test);
@@ -1181,7 +1181,7 @@ START_TEST(test_options)
fail_unless(memcmp(vsi, &vsi_expect, 4) == 0);
};
#endif
fail_unless(txpacket == 2, "TX %d packets, expected 2", txpacket); /* DHCP request sent */
ck_assert_msg(txpacket == 2, "TX %d packets, expected 2", txpacket); /* DHCP request sent */
fail_unless(last_message_type == DHCP_REQUEST);
memcpy(dhcp_with_opts, dhcp_ack, sizeof(dhcp_ack));
optptr = &dhcp_with_opts[309]; /* point to the END marker of the original packet */
@@ -1211,7 +1211,7 @@ START_TEST(test_options)
if (last_message_type == DHCP_REQUEST)
break;
}
fail_unless(txpacket == 7, "TX %d packets, expected 7", txpacket); /* DHCP renewal */
ck_assert_msg(txpacket == 7, "TX %d packets, expected 7", txpacket); /* DHCP renewal */
#if ESP_LWIP && LWIP_DHCP_ENABLE_VENDOR_SPEC_IDS
dhcp_free_vendor_class_identifier();
+1 -1
View File
@@ -146,7 +146,7 @@ START_TEST(test_etharp_table)
LWIP_UNUSED_ARG(_i);
if (netif_default != &test_netif) {
fail("This test needs a default netif");
ck_abort_msg("This test needs a default netif");
}
linkoutput_ctr = 0;
+2 -1
View File
@@ -145,7 +145,6 @@ void dhcp_free_vendor_class_identifier(void);
/* NAPT options */
#ifdef IP_NAPT
#define IP_NAPT_MAX 16
#undef LWIP_RAND
#define LWIP_RAND() (esp_random())
#include "lwip/arch.h"
u32_t esp_random(void);
@@ -166,6 +165,8 @@ u32_t esp_random(void);
#define ESP_LWIP_IP6_REASSEMBLY_TIMERS_ONDEMAND 1
#else
#define LWIP_RAND() ((u32_t)rand())
#define ESP_LWIP 0
#define ESP_DNS 0
#define ESP_LWIP_IGMP_TIMERS_ONDEMAND 0
+5
View File
@@ -0,0 +1,5 @@
#include "../../unit/arch/cc.h"
#ifndef LWIP_RAND
#define LWIP_RAND() ((u32_t)rand())
#endif
+9
View File
@@ -0,0 +1,9 @@
#define ESP_LWIP LWIP_NETCONN_FULLDUPLEX
#define ESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND ESP_LWIP
#define ESP_LWIP_IP6_REASSEMBLY_TIMERS_ONDEMAND ESP_LWIP
#define ESP_LWIP_DNS_TIMERS_ONDEMAND ESP_LWIP
#define ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND ESP_LWIP
#define ESP_LWIP_IGMP_TIMERS_ONDEMAND ESP_LWIP
#define ESP_LWIP_MLD6_TIMERS_ONDEMAND ESP_LWIP
#define ESP_DNS ESP_LWIP
#define ESP_LWIP_ARP ESP_LWIP