Full Code of cesanta/mongoose for AI

master 60fe56784546 cached
3936 files
95.8 MB
4.3M tokens
1 requests
Copy disabled (too large) Download .txt
Showing preview only (16,888K chars total). Download the full file to get everything.
Repository: cesanta/mongoose
Branch: master
Commit: 60fe56784546
Files: 3936
Total size: 95.8 MB

Directory structure:
gitextract_74yoxmoz/

├── .clang-format
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── config.yml
│   │   └── issue.md
│   └── workflows/
│       ├── cifuzz.yml
│       ├── codeql.yml
│       ├── fuzz.yml
│       ├── nightly.yml
│       ├── nightly_tests.yml
│       ├── on_demand.yml
│       ├── quicktest.yml
│       ├── test.yml
│       └── zephyr.yml
├── LICENSE
├── README.md
├── mongoose.c
├── mongoose.h
├── src/
│   ├── arch.h
│   ├── arch_armcgt.h
│   ├── arch_armgcc.h
│   ├── arch_cube.h
│   ├── arch_esp32.h
│   ├── arch_esp8266.h
│   ├── arch_freertos.h
│   ├── arch_picosdk.h
│   ├── arch_rtthread.h
│   ├── arch_rtx.h
│   ├── arch_threadx.h
│   ├── arch_tirtos.h
│   ├── arch_unix.h
│   ├── arch_win32.h
│   ├── arch_zephyr.h
│   ├── base64.c
│   ├── base64.h
│   ├── config.h
│   ├── dns.c
│   ├── dns.h
│   ├── drivers/
│   │   ├── cmsis.c
│   │   ├── cmsis.h
│   │   ├── cyw.c
│   │   ├── cyw.h
│   │   ├── imxrt.c
│   │   ├── imxrt.h
│   │   ├── nxp_wifi.c
│   │   ├── nxp_wifi.h
│   │   ├── phy.c
│   │   ├── phy.h
│   │   ├── pico-w.c
│   │   ├── pico-w.h
│   │   ├── ppp.c
│   │   ├── ppp.h
│   │   ├── ra.c
│   │   ├── ra.h
│   │   ├── rw612.c
│   │   ├── rw612.h
│   │   ├── same54.c
│   │   ├── same54.h
│   │   ├── sdio.c
│   │   ├── sdio.h
│   │   ├── st67w6.c
│   │   ├── st67w6.h
│   │   ├── stm32f.c
│   │   ├── stm32f.h
│   │   ├── stm32h.c
│   │   ├── stm32h.h
│   │   ├── tm4c.c
│   │   ├── tm4c.h
│   │   ├── tms570.c
│   │   ├── tms570.h
│   │   ├── w5100.c
│   │   ├── w5500.c
│   │   ├── xmc.c
│   │   ├── xmc.h
│   │   ├── xmc7.c
│   │   └── xmc7.h
│   ├── event.c
│   ├── event.h
│   ├── flash.c
│   ├── flash.h
│   ├── fmt.c
│   ├── fmt.h
│   ├── fs.c
│   ├── fs.h
│   ├── fs_fat.c
│   ├── fs_packed.c
│   ├── fs_posix.c
│   ├── http.c
│   ├── http.h
│   ├── iobuf.c
│   ├── iobuf.h
│   ├── json.c
│   ├── json.h
│   ├── l2.c
│   ├── l2.h
│   ├── l2_eth.c
│   ├── l2_ppp.c
│   ├── license.h
│   ├── log.c
│   ├── log.h
│   ├── md5.c
│   ├── md5.h
│   ├── mqtt.c
│   ├── mqtt.h
│   ├── net.c
│   ├── net.h
│   ├── net_builtin.c
│   ├── net_builtin.h
│   ├── net_ft.h
│   ├── net_lwip.h
│   ├── net_rl.h
│   ├── ota.h
│   ├── ota_ch32v307.c
│   ├── ota_dummy.c
│   ├── ota_esp32.c
│   ├── ota_imxrt.c
│   ├── ota_mcxn.c
│   ├── ota_picosdk.c
│   ├── ota_rw612.c
│   ├── ota_stm32f.c
│   ├── ota_stm32h5.c
│   ├── ota_stm32h7.c
│   ├── printf.c
│   ├── printf.h
│   ├── profile.h
│   ├── queue.c
│   ├── queue.h
│   ├── rpc.c
│   ├── rpc.h
│   ├── sha1.c
│   ├── sha1.h
│   ├── sha256.c
│   ├── sha256.h
│   ├── sntp.c
│   ├── sntp.h
│   ├── sock.c
│   ├── ssi.c
│   ├── ssi.h
│   ├── str.c
│   ├── str.h
│   ├── timer.c
│   ├── timer.h
│   ├── tls.h
│   ├── tls_aes128.c
│   ├── tls_aes128.h
│   ├── tls_builtin.c
│   ├── tls_chacha20.c
│   ├── tls_chacha20.h
│   ├── tls_dummy.c
│   ├── tls_mbed.c
│   ├── tls_mbed.h
│   ├── tls_openssl.c
│   ├── tls_openssl.h
│   ├── tls_rsa.c
│   ├── tls_rsa.h
│   ├── tls_uecc.c
│   ├── tls_uecc.h
│   ├── tls_x25519.c
│   ├── tls_x25519.h
│   ├── url.c
│   ├── url.h
│   ├── util.c
│   ├── util.h
│   ├── version.h
│   ├── wifi.h
│   ├── wifi_dummy.c
│   ├── ws.c
│   └── ws.h
├── test/
│   ├── Makefile
│   ├── arduino/
│   │   └── Makefile
│   ├── certs/
│   │   ├── ca.crt
│   │   ├── ca.key
│   │   ├── ca.srl
│   │   ├── client.crt
│   │   ├── client.csr
│   │   ├── client.key
│   │   ├── generate.sh
│   │   ├── server.crt
│   │   ├── server.csr
│   │   └── server.key
│   ├── cgt+make/
│   │   └── Makefile
│   ├── configs/
│   │   └── mongoose_config_full.h
│   ├── cube/
│   │   └── Makefile
│   ├── data/
│   │   ├── ..ddot/
│   │   │   └── index.html
│   │   ├── 404.html
│   │   ├── a.txt
│   │   ├── ca.pem
│   │   ├── dredir/
│   │   │   └── index.html
│   │   ├── e8.crt
│   │   ├── empty.js
│   │   ├── gzip.txt
│   │   ├── index.html
│   │   ├── range.txt
│   │   ├── secret/
│   │   │   └── secret.txt
│   │   ├── ss_ca.pem
│   │   ├── ss_client.pem
│   │   ├── ss_server.pem
│   │   ├── ssi/
│   │   │   ├── f1.txt
│   │   │   ├── index.shtml
│   │   │   ├── nested.shtml
│   │   │   └── recurse.shtml
│   │   ├── ws.hex
│   │   └── київ.txt
│   ├── dhcpd.conf
│   ├── driver_mock.c
│   ├── esp-idf/
│   │   └── Makefile
│   ├── fuzz.c
│   ├── fuzz_tls.c
│   ├── ga_docker_daemon.json
│   ├── gcc+make/
│   │   └── Makefile
│   ├── health.awk
│   ├── health.sh
│   ├── keil/
│   │   ├── Clean
│   │   ├── Makefile
│   │   ├── uniclean.bat
│   │   └── unitest.bat
│   ├── match_changed_files.sh
│   ├── mip_curl.sh
│   ├── mip_port_test.c
│   ├── mip_tap_test.c
│   ├── mip_test.c
│   ├── mip_x_test.c
│   ├── mongoose_custom.c
│   ├── mosquitto.conf
│   ├── mosquitto.conf.macos
│   ├── pack.c
│   ├── pack.js
│   ├── pico-sdk/
│   │   └── Makefile
│   ├── port_tap_bridge.c
│   ├── setup_ga_docker_filesystem.sh
│   ├── setup_ga_network.sh
│   ├── setup_mqtt_server.sh
│   ├── tls_multirec/
│   │   ├── Makefile
│   │   ├── main.c
│   │   ├── mongoose.h
│   │   ├── patched_mongoose.c
│   │   └── tls_multirec.diff
│   ├── unit_test.c
│   ├── wizard/
│   │   ├── Makefile
│   │   └── test.sh
│   ├── xpresso/
│   │   └── Makefile
│   └── zephyr/
│       └── Makefile
└── tutorials/
    ├── README.md
    ├── core/
    │   ├── README.md
    │   ├── embedded-filesystem/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   ├── packed_fs.c
    │   │   └── web_root/
    │   │       ├── index.html
    │   │       ├── main.js
    │   │       └── style.css
    │   ├── memory/
    │   │   └── o1heap/
    │   │       ├── Makefile
    │   │       └── main.c
    │   ├── multi-threaded/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── multi-threaded-12m/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   └── timers/
    │       ├── Makefile
    │       ├── README.md
    │       ├── main.c
    │       └── web_root/
    │           └── index.html
    ├── http/
    │   ├── README.md
    │   ├── device-dashboard/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── certs/
    │   │   │   ├── server_cert.pem
    │   │   │   └── server_key.pem
    │   │   ├── esp32/
    │   │   │   ├── CMakeLists.txt
    │   │   │   ├── Makefile
    │   │   │   ├── README.md
    │   │   │   ├── main/
    │   │   │   │   ├── CMakeLists.txt
    │   │   │   │   ├── main.c
    │   │   │   │   ├── mongoose_config.h
    │   │   │   │   └── wifi.c
    │   │   │   ├── partitions.csv
    │   │   │   └── sdkconfig.defaults
    │   │   ├── main.c
    │   │   ├── mbedtls_config.h
    │   │   ├── microchip/
    │   │   │   └── same54-xpro/
    │   │   │       ├── Makefile
    │   │   │       ├── hal.h
    │   │   │       ├── link.ld
    │   │   │       ├── main.c
    │   │   │       ├── startup.c
    │   │   │       └── syscalls.c
    │   │   ├── net.c
    │   │   ├── net.h
    │   │   ├── pack.js
    │   │   ├── packed_fs.c
    │   │   ├── tailwind.config.js
    │   │   └── web_root/
    │   │       ├── bundle.js
    │   │       ├── components.js
    │   │       ├── index.html
    │   │       └── main.js
    │   ├── file-transfer/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── client.c
    │   │   ├── server.c
    │   │   ├── upload/
    │   │   │   └── README.md
    │   │   └── web_root/
    │   │       └── index.html
    │   ├── file-upload-html-form/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── web_root/
    │   │       └── index.html
    │   ├── file-upload-multiple-posts/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── web_root/
    │   │       ├── app.js
    │   │       └── index.html
    │   ├── file-upload-single-post/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── web_root/
    │   │       └── index.html
    │   ├── http-client/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── esp8266/
    │   │   │   └── http-client-server/
    │   │   │       ├── Makefile
    │   │   │       ├── README.md
    │   │   │       └── src/
    │   │   │           ├── Makefile
    │   │   │           ├── main/
    │   │   │           │   ├── component.mk
    │   │   │           │   ├── main.c
    │   │   │           │   ├── mongoose_config.h
    │   │   │           │   └── wifi.c
    │   │   │           └── sdkconfig
    │   │   ├── main.c
    │   │   └── packed_fs.c
    │   ├── http-proxy-client/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── http-restful-server/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── server.pem
    │   ├── http-reverse-proxy/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── http-server/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── arduino/
    │   │   │   ├── esp32-http/
    │   │   │   │   ├── esp32-http.ino
    │   │   │   │   └── mongoose_config.h
    │   │   │   ├── teensy41-http/
    │   │   │   │   ├── mongoose_config.h
    │   │   │   │   └── teensy41-http.ino
    │   │   │   └── w5500-http/
    │   │   │       ├── mongoose_config.h
    │   │   │       └── w5500-http.ino
    │   │   ├── ca.pem
    │   │   ├── crt.pem
    │   │   ├── key.pem
    │   │   └── main.c
    │   ├── http-streaming-client/
    │   │   ├── Makefile
    │   │   └── main.c
    │   ├── huge-response/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── web_root/
    │   │       └── index.html
    │   ├── redirect-to-https/
    │   │   ├── Makefile
    │   │   └── main.c
    │   ├── singleton-client/
    │   │   ├── Makefile
    │   │   └── main.c
    │   ├── uart-bridge/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── esp32/
    │   │   │   ├── CMakeLists.txt
    │   │   │   ├── Makefile
    │   │   │   ├── README.md
    │   │   │   ├── main/
    │   │   │   │   ├── CMakeLists.txt
    │   │   │   │   ├── cli.c
    │   │   │   │   ├── main.c
    │   │   │   │   ├── main.h
    │   │   │   │   ├── mongoose_config.h
    │   │   │   │   ├── uart.c
    │   │   │   │   └── wifi.c
    │   │   │   ├── make
    │   │   │   ├── partitions.csv
    │   │   │   └── sdkconfig.defaults
    │   │   ├── main.c
    │   │   ├── net.c
    │   │   ├── packed_fs.c
    │   │   └── web_root/
    │   │       ├── index.html
    │   │       ├── main.js
    │   │       └── style.css
    │   ├── video-stream/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── web_root/
    │   │       └── index.html
    │   └── wifi-router-dashboard/
    │       ├── Makefile
    │       ├── README.md
    │       ├── main.c
    │       ├── net.c
    │       ├── net.h
    │       ├── packed_fs.c
    │       ├── tailwind.config.js
    │       └── web_root/
    │           └── main.js
    ├── infineon/
    │   ├── xmc47_relax-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── xmc72_evk-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   └── xmc_plt2go_4400-make-baremetal-builtin/
    │       ├── Makefile
    │       └── README.md
    ├── micropython/
    │   ├── Makefile
    │   ├── README.md
    │   ├── esp32/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── mongoose/
    │   │       ├── main.c
    │   │       └── mongoose_config.h
    │   ├── main.py
    │   └── mongoose/
    │       ├── main.c
    │       ├── micropython.cmake
    │       ├── micropython.mk
    │       └── module.c
    ├── mqtt/
    │   ├── README.md
    │   ├── mqtt-client/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── arduino/
    │   │   │   ├── esp32-mqtt/
    │   │   │   │   ├── esp32-mqtt.ino
    │   │   │   │   └── mongoose_config.h
    │   │   │   ├── nano-w5500-mqtt/
    │   │   │   │   ├── mongoose_config.h
    │   │   │   │   └── w5500-mqtt.ino
    │   │   │   ├── sim800-mqtt/
    │   │   │   │   ├── mongoose_config.h
    │   │   │   │   └── sim800-mqtt.ino
    │   │   │   └── w5500-mqtt/
    │   │   │       ├── mongoose_config.h
    │   │   │       └── w5500-mqtt.ino
    │   │   ├── main.c
    │   │   └── microchip/
    │   │       └── same54-xpro/
    │   │           ├── Makefile
    │   │           ├── hal.h
    │   │           ├── link.ld
    │   │           ├── main.c
    │   │           ├── startup.c
    │   │           └── syscalls.c
    │   ├── mqtt-client-aws-iot/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── mqtt-dashboard/
    │   │   ├── Makefile
    │   │   ├── dashboard/
    │   │   │   ├── Makefile
    │   │   │   ├── bundle.js
    │   │   │   ├── index.html
    │   │   │   ├── main.js
    │   │   │   └── tailwind.config.js
    │   │   └── device/
    │   │       ├── Makefile
    │   │       ├── README.md
    │   │       ├── hal.c
    │   │       ├── hal.h
    │   │       ├── main.c
    │   │       ├── net.c
    │   │       └── net.h
    │   ├── mqtt-over-ws-client/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── mqtt-server/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   └── ota-over-mqtt/
    │       ├── Makefile
    │       └── main.c
    ├── nxp/
    │   ├── frdm-mcxn947-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── frdm-mcxn947-make-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── frdm-mcxn947-xpresso-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── frdm-mcxn947-xpresso-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── frdm-rw612-xpresso-freertos-builtin-wifi/
    │   │   ├── .cproject
    │   │   ├── .default_mex
    │   │   ├── .project
    │   │   ├── .settings/
    │   │   │   ├── language.settings.xml
    │   │   │   └── org.eclipse.core.resources.prefs
    │   │   ├── CMSIS/
    │   │   │   ├── cmsis_compiler.h
    │   │   │   ├── cmsis_gcc.h
    │   │   │   ├── cmsis_version.h
    │   │   │   ├── core_cm33.h
    │   │   │   ├── mpu_armv8.h
    │   │   │   └── tz_context.h
    │   │   ├── Debug/
    │   │   │   ├── frdm-rw612-xpresso-freertos-builtin_Debug.ld
    │   │   │   ├── frdm-rw612-xpresso-freertos-builtin_Debug_library.ld
    │   │   │   └── frdm-rw612-xpresso-freertos-builtin_Debug_memory.ld
    │   │   ├── README.md
    │   │   ├── board/
    │   │   │   ├── board.c
    │   │   │   ├── board.h
    │   │   │   ├── clock_config.c
    │   │   │   ├── clock_config.h
    │   │   │   ├── pin_mux.c
    │   │   │   └── pin_mux.h
    │   │   ├── component/
    │   │   │   ├── conn_fwloader/
    │   │   │   │   ├── fsl_loader.c
    │   │   │   │   ├── fsl_loader_utils.c
    │   │   │   │   ├── include/
    │   │   │   │   │   ├── api_tree_root.h
    │   │   │   │   │   ├── fsl_loader.h
    │   │   │   │   │   ├── fsl_loader_utils.h
    │   │   │   │   │   ├── fusemap.h
    │   │   │   │   │   ├── life_cycle.h
    │   │   │   │   │   └── nboot_rom_api_table.h
    │   │   │   │   ├── life_cycle.c
    │   │   │   │   ├── nboot_hal.c
    │   │   │   │   └── readme.txt
    │   │   │   ├── els_pkc/
    │   │   │   │   └── src/
    │   │   │   │       ├── compiler/
    │   │   │   │       │   └── mcuxClToolchain.h
    │   │   │   │       ├── comps/
    │   │   │   │       │   ├── mcuxClBuffer/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   ├── mcuxClBuffer_Internal.h
    │   │   │   │       │   │   │   │   └── mcuxClBuffer_Internal_Pointer.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer_Cfg.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer_Constants.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer_Impl.h
    │   │   │   │       │   │   │   └── mcuxClBuffer_Pointer.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       └── mcuxClBuffer.c
    │   │   │   │       │   ├── mcuxClCore/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxClCore_Examples.h
    │   │   │   │       │   │       ├── mcuxClCore_FunctionIdentifiers.h
    │   │   │   │       │   │       ├── mcuxClCore_Macros.h
    │   │   │   │       │   │       ├── mcuxClCore_Platform.h
    │   │   │   │       │   │       └── mcuxClCore_Toolchain.h
    │   │   │   │       │   ├── mcuxClEls/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   ├── mcuxClEls_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClEls_Internal_Common.h
    │   │   │   │       │   │   │   │   ├── mcuxClEls_Internal_mapping.h
    │   │   │   │       │   │   │   │   └── mcuxClEls_SfrAccess.h
    │   │   │   │       │   │   │   ├── mcuxClEls.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Aead.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Cipher.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Cmac.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Common.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Crc.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Ecc.h
    │   │   │   │       │   │   │   ├── mcuxClEls_GlitchDetector.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Hash.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Hmac.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Kdf.h
    │   │   │   │       │   │   │   ├── mcuxClEls_KeyManagement.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Rng.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Types.h
    │   │   │   │       │   │   │   └── mcuxClEls_mapping.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       ├── mcuxClEls_Common.c
    │   │   │   │       │   │       └── mcuxClEls_GlitchDetector.c
    │   │   │   │       │   ├── mcuxClMemory/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_ClearSecure_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_Clear_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CompareDPASecure_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CompareSecure_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_Compare_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CopySecurePow2_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CopySecure_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CopySecure_Reversed_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CopyWords_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_Copy_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_Copy_Reversed_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_SetSecure_Internal.h
    │   │   │   │       │   │   │   │   └── mcuxClMemory_Set_Internal.h
    │   │   │   │       │   │   │   ├── mcuxClMemory.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Clear.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Constants.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Copy.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Copy_Reversed.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Endianness.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Set.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Types.h
    │   │   │   │       │   │   │   └── mcuxClMemory_Xor.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       └── mcuxClMemory.c
    │   │   │   │       │   ├── mcuxCsslCPreProcessor/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxCsslAnalysis.h
    │   │   │   │       │   │       └── mcuxCsslCPreProcessor.h
    │   │   │   │       │   ├── mcuxCsslDataIntegrity/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxCsslDataIntegrity.h
    │   │   │   │       │   │       ├── mcuxCsslDataIntegrity_Cfg.h
    │   │   │   │       │   │       ├── mcuxCsslDataIntegrity_Impl.h
    │   │   │   │       │   │       └── mcuxCsslDataIntegrity_None.h
    │   │   │   │       │   ├── mcuxCsslFlowProtection/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_Cfg.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_FunctionIdentifiers.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_Impl.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_SecureCounter_Common.h
    │   │   │   │       │   │       └── mcuxCsslFlowProtection_SecureCounter_Local.h
    │   │   │   │       │   ├── mcuxCsslMemory/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   ├── mcuxCsslMemory_Internal_Compare_asm.h
    │   │   │   │       │   │   │   │   ├── mcuxCsslMemory_Internal_Copy_asm.h
    │   │   │   │       │   │   │   │   └── mcuxCsslMemory_Internal_SecureCompare.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Clear.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Compare.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Constants.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Copy.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Set.h
    │   │   │   │       │   │   │   └── mcuxCsslMemory_Types.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       ├── mcuxCsslMemory_Clear.c
    │   │   │   │       │   │       ├── mcuxCsslMemory_Compare.c
    │   │   │   │       │   │       ├── mcuxCsslMemory_Copy.c
    │   │   │   │       │   │       ├── mcuxCsslMemory_Internal_SecureCompare_Stub.c
    │   │   │   │       │   │       └── mcuxCsslMemory_Set.c
    │   │   │   │       │   ├── mcuxCsslParamIntegrity/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   └── mcuxCsslParamIntegrity.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       └── mcuxCsslParamIntegrity.c
    │   │   │   │       │   └── mcuxCsslSecureCounter/
    │   │   │   │       │       └── inc/
    │   │   │   │       │           ├── mcuxCsslSecureCounter.h
    │   │   │   │       │           ├── mcuxCsslSecureCounter_Cfg.h
    │   │   │   │       │           ├── mcuxCsslSecureCounter_Impl.h
    │   │   │   │       │           ├── mcuxCsslSecureCounter_None.h
    │   │   │   │       │           └── mcuxCsslSecureCounter_SW_Local.h
    │   │   │   │       └── platforms/
    │   │   │   │           └── rw61x/
    │   │   │   │               ├── inc/
    │   │   │   │               │   ├── ip_css_constants.h
    │   │   │   │               │   ├── ip_css_design_configuration.h
    │   │   │   │               │   └── ip_platform.h
    │   │   │   │               ├── mcuxClConfig.h
    │   │   │   │               ├── platform_specific_headers.h
    │   │   │   │               └── readme.txt
    │   │   │   ├── imu_adapter/
    │   │   │   │   ├── fsl_adapter_imu.c
    │   │   │   │   ├── fsl_adapter_imu.h
    │   │   │   │   └── fsl_adapter_imu_common.h
    │   │   │   ├── lists/
    │   │   │   │   ├── fsl_component_generic_list.c
    │   │   │   │   └── fsl_component_generic_list.h
    │   │   │   ├── osa/
    │   │   │   │   ├── fsl_os_abstraction.h
    │   │   │   │   ├── fsl_os_abstraction_config.h
    │   │   │   │   ├── fsl_os_abstraction_free_rtos.c
    │   │   │   │   └── fsl_os_abstraction_free_rtos.h
    │   │   │   ├── serial_manager/
    │   │   │   │   ├── fsl_component_serial_manager.c
    │   │   │   │   ├── fsl_component_serial_manager.h
    │   │   │   │   ├── fsl_component_serial_port_internal.h
    │   │   │   │   ├── fsl_component_serial_port_uart.c
    │   │   │   │   └── fsl_component_serial_port_uart.h
    │   │   │   ├── uart/
    │   │   │   │   ├── fsl_adapter_uart.h
    │   │   │   │   └── fsl_adapter_usart.c
    │   │   │   └── wifi_bt_module/
    │   │   │       └── AzureWave/
    │   │   │           └── tx_pwr_limits/
    │   │   │               └── wlan_txpwrlimit_cfg_WW_rw610.h
    │   │   ├── device/
    │   │   │   ├── RW612.h
    │   │   │   ├── RW612_features.h
    │   │   │   ├── fsl_device_registers.h
    │   │   │   ├── system_RW612.c
    │   │   │   └── system_RW612.h
    │   │   ├── drivers/
    │   │   │   ├── freertos/
    │   │   │   │   ├── fsl_usart_freertos.c
    │   │   │   │   └── fsl_usart_freertos.h
    │   │   │   ├── fsl_cache.c
    │   │   │   ├── fsl_cache.h
    │   │   │   ├── fsl_clock.c
    │   │   │   ├── fsl_clock.h
    │   │   │   ├── fsl_common.c
    │   │   │   ├── fsl_common.h
    │   │   │   ├── fsl_common_arm.c
    │   │   │   ├── fsl_common_arm.h
    │   │   │   ├── fsl_flexcomm.c
    │   │   │   ├── fsl_flexcomm.h
    │   │   │   ├── fsl_flexspi.c
    │   │   │   ├── fsl_flexspi.h
    │   │   │   ├── fsl_gdma.c
    │   │   │   ├── fsl_gdma.h
    │   │   │   ├── fsl_gpio.c
    │   │   │   ├── fsl_gpio.h
    │   │   │   ├── fsl_imu.c
    │   │   │   ├── fsl_imu.h
    │   │   │   ├── fsl_io_mux.h
    │   │   │   ├── fsl_ocotp.c
    │   │   │   ├── fsl_ocotp.h
    │   │   │   ├── fsl_power.c
    │   │   │   ├── fsl_power.h
    │   │   │   ├── fsl_reset.c
    │   │   │   ├── fsl_reset.h
    │   │   │   ├── fsl_usart.c
    │   │   │   └── fsl_usart.h
    │   │   ├── flash/
    │   │   │   └── mflash/
    │   │   │       ├── frdmrw612/
    │   │   │       │   ├── mflash_drv.c
    │   │   │       │   └── mflash_drv.h
    │   │   │       ├── mflash_common.h
    │   │   │       ├── mflash_file.c
    │   │   │       ├── mflash_file.h
    │   │   │       └── readme.txt
    │   │   ├── flash_config/
    │   │   │   ├── flash_config.c
    │   │   │   └── flash_config.h
    │   │   ├── frdm-rw612-xpresso-freertos-builtin JLink Debug.launch
    │   │   ├── frdm-rw612-xpresso-freertos-builtin.mex
    │   │   ├── freertos/
    │   │   │   └── freertos-kernel/
    │   │   │       ├── croutine.c
    │   │   │       ├── event_groups.c
    │   │   │       ├── include/
    │   │   │       │   ├── FreeRTOS.h
    │   │   │       │   ├── StackMacros.h
    │   │   │       │   ├── atomic.h
    │   │   │       │   ├── croutine.h
    │   │   │       │   ├── deprecated_definitions.h
    │   │   │       │   ├── event_groups.h
    │   │   │       │   ├── freertos_tasks_c_additions.h
    │   │   │       │   ├── list.h
    │   │   │       │   ├── message_buffer.h
    │   │   │       │   ├── mpu_prototypes.h
    │   │   │       │   ├── mpu_syscall_numbers.h
    │   │   │       │   ├── mpu_wrappers.h
    │   │   │       │   ├── newlib-freertos.h
    │   │   │       │   ├── picolibc-freertos.h
    │   │   │       │   ├── portable.h
    │   │   │       │   ├── projdefs.h
    │   │   │       │   ├── queue.h
    │   │   │       │   ├── semphr.h
    │   │   │       │   ├── stack_macros.h
    │   │   │       │   ├── stdint.readme
    │   │   │       │   ├── stream_buffer.h
    │   │   │       │   ├── task.h
    │   │   │       │   └── timers.h
    │   │   │       ├── list.c
    │   │   │       ├── portable/
    │   │   │       │   ├── GCC/
    │   │   │       │   │   └── ARM_CM33_NTZ/
    │   │   │       │   │       └── non_secure/
    │   │   │       │   │           ├── mpu_wrappers_v2_asm.c
    │   │   │       │   │           ├── port.c
    │   │   │       │   │           ├── portasm.c
    │   │   │       │   │           ├── portasm.h
    │   │   │       │   │           ├── portmacro.h
    │   │   │       │   │           └── portmacrocommon.h
    │   │   │       │   ├── MemMang/
    │   │   │       │   │   ├── ReadMe.url
    │   │   │       │   │   ├── heap_3.c
    │   │   │       │   │   └── heap_4.c
    │   │   │       │   └── readme.txt
    │   │   │       ├── queue.c
    │   │   │       ├── stream_buffer.c
    │   │   │       ├── tasks.c
    │   │   │       └── timers.c
    │   │   ├── linkscripts/
    │   │   │   ├── main_data.ldt
    │   │   │   ├── main_rodata.ldt
    │   │   │   ├── main_text.ldt
    │   │   │   └── noinit_noload_section.ldt
    │   │   ├── source/
    │   │   │   ├── FreeRTOSConfig.h
    │   │   │   ├── app_config.h
    │   │   │   ├── main.c
    │   │   │   ├── mongoose_config.h
    │   │   │   ├── semihost_hardfault.c
    │   │   │   └── wifi_config.h
    │   │   ├── startup/
    │   │   │   └── startup_rw612.c
    │   │   ├── utilities/
    │   │   │   ├── fsl_assert.c
    │   │   │   ├── fsl_assert.h
    │   │   │   ├── fsl_debug_console.c
    │   │   │   ├── fsl_debug_console.h
    │   │   │   ├── fsl_debug_console_conf.h
    │   │   │   ├── fsl_memcpy.S
    │   │   │   ├── fsl_str.c
    │   │   │   └── fsl_str.h
    │   │   └── wifi/
    │   │       ├── CMakeLists.txt
    │   │       ├── ChangeLogKSDK.txt
    │   │       ├── certs/
    │   │       │   ├── ca-cert.h
    │   │       │   ├── client-cert.h
    │   │       │   ├── client-key.h
    │   │       │   ├── dh-param.h
    │   │       │   ├── server-cert.h
    │   │       │   └── server-key.h
    │   │       ├── incl/
    │   │       │   ├── dhcp-server.h
    │   │       │   ├── nxp_wifi.h
    │   │       │   ├── port/
    │   │       │   │   ├── net/
    │   │       │   │   │   └── wm_net.h
    │   │       │   │   └── osa/
    │   │       │   │       ├── mem_pool.h
    │   │       │   │       ├── mem_pool_config.h
    │   │       │   │       ├── osa.h
    │   │       │   │       ├── slist.h
    │   │       │   │       └── stack_simple.h
    │   │       │   ├── wifi_cal_data_ext.h
    │   │       │   ├── wifi_config_default.h
    │   │       │   ├── wifidriver/
    │   │       │   │   ├── wifi-decl.h
    │   │       │   │   ├── wifi.h
    │   │       │   │   ├── wifi_events.h
    │   │       │   │   └── wifi_nxp.h
    │   │       │   ├── wlcmgr/
    │   │       │   │   ├── wlan.h
    │   │       │   │   └── wlan_11d.h
    │   │       │   ├── wm_utils.h
    │   │       │   ├── wmerrno.h
    │   │       │   ├── wmlog.h
    │   │       │   ├── wmstats.h
    │   │       │   └── wmtypes.h
    │   │       ├── port/
    │   │       │   ├── net/
    │   │       │   │   ├── net.c
    │   │       │   │   ├── netif_decl.h
    │   │       │   │   └── netif_mongoose.c
    │   │       │   └── osa/
    │   │       │       ├── mem_pool.c
    │   │       │       ├── mem_pool_config.c
    │   │       │       ├── osa.c
    │   │       │       ├── osa_freertos.c
    │   │       │       ├── osa_freertos.h
    │   │       │       ├── slist.c
    │   │       │       └── stack_simple.c
    │   │       ├── wifi_bt_firmware/
    │   │       │   └── wlan_bt_fw.h
    │   │       ├── wifidriver/
    │   │       │   ├── incl/
    │   │       │   │   ├── mlan.h
    │   │       │   │   ├── mlan_11ac.h
    │   │       │   │   ├── mlan_11ax.h
    │   │       │   │   ├── mlan_11h.h
    │   │       │   │   ├── mlan_11k.h
    │   │       │   │   ├── mlan_11n.h
    │   │       │   │   ├── mlan_11n_aggr.h
    │   │       │   │   ├── mlan_11n_rxreorder.h
    │   │       │   │   ├── mlan_11v.h
    │   │       │   │   ├── mlan_action.h
    │   │       │   │   ├── mlan_api.h
    │   │       │   │   ├── mlan_decl.h
    │   │       │   │   ├── mlan_fw.h
    │   │       │   │   ├── mlan_ieee.h
    │   │       │   │   ├── mlan_init.h
    │   │       │   │   ├── mlan_ioctl.h
    │   │       │   │   ├── mlan_join.h
    │   │       │   │   ├── mlan_main.h
    │   │       │   │   ├── mlan_mbo.h
    │   │       │   │   ├── mlan_meas.h
    │   │       │   │   ├── mlan_remap_mem_operations.h
    │   │       │   │   ├── mlan_uap.h
    │   │       │   │   ├── mlan_util.h
    │   │       │   │   ├── mlan_wmm.h
    │   │       │   │   └── type_decls.h
    │   │       │   ├── mlan_11ac.c
    │   │       │   ├── mlan_11ax.c
    │   │       │   ├── mlan_11d.c
    │   │       │   ├── mlan_11h.c
    │   │       │   ├── mlan_11k.c
    │   │       │   ├── mlan_11n.c
    │   │       │   ├── mlan_11n_aggr.c
    │   │       │   ├── mlan_11n_rxreorder.c
    │   │       │   ├── mlan_11v.c
    │   │       │   ├── mlan_action.c
    │   │       │   ├── mlan_api.c
    │   │       │   ├── mlan_cfp.c
    │   │       │   ├── mlan_cmdevt.c
    │   │       │   ├── mlan_glue.c
    │   │       │   ├── mlan_init.c
    │   │       │   ├── mlan_join.c
    │   │       │   ├── mlan_mbo.c
    │   │       │   ├── mlan_misc.c
    │   │       │   ├── mlan_scan.c
    │   │       │   ├── mlan_shim.c
    │   │       │   ├── mlan_sta_cmd.c
    │   │       │   ├── mlan_sta_cmdresp.c
    │   │       │   ├── mlan_sta_event.c
    │   │       │   ├── mlan_sta_ioctl.c
    │   │       │   ├── mlan_sta_rx.c
    │   │       │   ├── mlan_txrx.c
    │   │       │   ├── mlan_uap_cmdevent.c
    │   │       │   ├── mlan_uap_ioctl.c
    │   │       │   ├── mlan_wmm.c
    │   │       │   ├── wifi-debug.c
    │   │       │   ├── wifi-debug.h
    │   │       │   ├── wifi-imu.c
    │   │       │   ├── wifi-imu.h
    │   │       │   ├── wifi-internal.h
    │   │       │   ├── wifi-mem.c
    │   │       │   ├── wifi-uap.c
    │   │       │   ├── wifi-wps.c
    │   │       │   ├── wifi.c
    │   │       │   ├── wifi_common.h
    │   │       │   ├── wifi_pwrmgr.c
    │   │       │   └── wpa_supp_if/
    │   │       │       ├── incl/
    │   │       │       │   ├── rtos_wpa_supp_if.h
    │   │       │       │   └── wifi_nxp_internal.h
    │   │       │       ├── rtos_wpa_supp_if.c
    │   │       │       ├── wifi_nxp.c
    │   │       │       └── wifi_nxp_internal.c
    │   │       └── wlcmgr/
    │   │           ├── wlan.c
    │   │           └── wlan_txpwrlimit_cfg.c
    │   ├── frdm-rw612-xpresso-freertos-lwip/
    │   │   ├── .cproject
    │   │   ├── .project
    │   │   ├── .settings/
    │   │   │   ├── language.settings.xml
    │   │   │   └── org.eclipse.core.resources.prefs
    │   │   ├── CMSIS/
    │   │   │   ├── cmsis_compiler.h
    │   │   │   ├── cmsis_gcc.h
    │   │   │   ├── cmsis_version.h
    │   │   │   ├── core_cm33.h
    │   │   │   ├── m-profile/
    │   │   │   │   ├── armv8m_mpu.h
    │   │   │   │   └── cmsis_gcc_m.h
    │   │   │   └── tz_context.h
    │   │   ├── board/
    │   │   │   ├── board.c
    │   │   │   ├── board.h
    │   │   │   ├── clock_config.c
    │   │   │   └── clock_config.h
    │   │   ├── component/
    │   │   │   ├── els_pkc/
    │   │   │   │   ├── includes/
    │   │   │   │   │   ├── mcuxClEls_GlitchDetector.h
    │   │   │   │   │   └── platform/
    │   │   │   │   │       └── rw61x/
    │   │   │   │   │           ├── mcuxClAeadModes_MemoryConsumption.h
    │   │   │   │   │           ├── mcuxClCipherModes_MemoryConsumption.h
    │   │   │   │   │           ├── mcuxClEcc_MemoryConsumption.h
    │   │   │   │   │           ├── mcuxClHashModes_MemoryConsumption.h
    │   │   │   │   │           ├── mcuxClHash_MemoryConsumption.h
    │   │   │   │   │           ├── mcuxClHmac_MemoryConsumption.h
    │   │   │   │   │           ├── mcuxClKey_MemoryConsumption.h
    │   │   │   │   │           ├── mcuxClMacModes_MemoryConsumption.h
    │   │   │   │   │           ├── mcuxClRandomModes_MemoryConsumption.h
    │   │   │   │   │           ├── mcuxClRsa_MemoryConsumption.h
    │   │   │   │   │           └── mcuxClSession_MemoryConsumption.h
    │   │   │   │   └── src/
    │   │   │   │       ├── compiler/
    │   │   │   │       │   └── mcuxClToolchain.h
    │   │   │   │       ├── comps/
    │   │   │   │       │   ├── mcuxClBuffer/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   ├── mcuxClBuffer_Internal.h
    │   │   │   │       │   │   │   │   └── mcuxClBuffer_Internal_Pointer.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer_Cfg.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer_Constants.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer_Impl.h
    │   │   │   │       │   │   │   └── mcuxClBuffer_Pointer.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       └── mcuxClBuffer.c
    │   │   │   │       │   ├── mcuxClCore/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxClCore_Examples.h
    │   │   │   │       │   │       ├── mcuxClCore_FunctionIdentifiers.h
    │   │   │   │       │   │       ├── mcuxClCore_Macros.h
    │   │   │   │       │   │       ├── mcuxClCore_Platform.h
    │   │   │   │       │   │       └── mcuxClCore_Toolchain.h
    │   │   │   │       │   ├── mcuxClEls/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   ├── mcuxClEls_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClEls_Internal_Common.h
    │   │   │   │       │   │   │   │   ├── mcuxClEls_Internal_mapping.h
    │   │   │   │       │   │   │   │   └── mcuxClEls_SfrAccess.h
    │   │   │   │       │   │   │   ├── mcuxClEls.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Aead.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Cipher.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Cmac.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Common.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Crc.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Ecc.h
    │   │   │   │       │   │   │   ├── mcuxClEls_GlitchDetector.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Hash.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Hmac.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Kdf.h
    │   │   │   │       │   │   │   ├── mcuxClEls_KeyManagement.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Rng.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Types.h
    │   │   │   │       │   │   │   └── mcuxClEls_mapping.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       ├── mcuxClEls_Common.c
    │   │   │   │       │   │       └── mcuxClEls_GlitchDetector.c
    │   │   │   │       │   ├── mcuxClMemory/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   └── mcuxClMemory_Internal.h
    │   │   │   │       │   │   │   ├── mcuxClMemory.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Clear.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Constants.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Copy.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Copy_Reversed.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Endianness.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Set.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Types.h
    │   │   │   │       │   │   │   └── mcuxClMemory_Xor.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       └── mcuxClMemory.c
    │   │   │   │       │   ├── mcuxCsslCPreProcessor/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxCsslAnalysis.h
    │   │   │   │       │   │       └── mcuxCsslCPreProcessor.h
    │   │   │   │       │   ├── mcuxCsslDataIntegrity/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxCsslDataIntegrity.h
    │   │   │   │       │   │       ├── mcuxCsslDataIntegrity_Cfg.h
    │   │   │   │       │   │       ├── mcuxCsslDataIntegrity_Impl.h
    │   │   │   │       │   │       └── mcuxCsslDataIntegrity_None.h
    │   │   │   │       │   ├── mcuxCsslFlowProtection/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_Cfg.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_FunctionIdentifiers.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_Impl.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_SecureCounter_Common.h
    │   │   │   │       │   │       └── mcuxCsslFlowProtection_SecureCounter_Local.h
    │   │   │   │       │   ├── mcuxCsslMemory/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   ├── mcuxCsslMemory_Internal_Compare_asm.h
    │   │   │   │       │   │   │   │   └── mcuxCsslMemory_Internal_Copy_asm.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Clear.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Compare.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Constants.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Copy.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Set.h
    │   │   │   │       │   │   │   └── mcuxCsslMemory_Types.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       ├── mcuxCsslMemory_Clear.c
    │   │   │   │       │   │       ├── mcuxCsslMemory_Compare.c
    │   │   │   │       │   │       ├── mcuxCsslMemory_Copy.c
    │   │   │   │       │   │       └── mcuxCsslMemory_Set.c
    │   │   │   │       │   ├── mcuxCsslParamIntegrity/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   └── mcuxCsslParamIntegrity.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       └── mcuxCsslParamIntegrity32.c
    │   │   │   │       │   └── mcuxCsslSecureCounter/
    │   │   │   │       │       └── inc/
    │   │   │   │       │           ├── mcuxCsslSecureCounter.h
    │   │   │   │       │           ├── mcuxCsslSecureCounter_Cfg.h
    │   │   │   │       │           ├── mcuxCsslSecureCounter_Impl.h
    │   │   │   │       │           ├── mcuxCsslSecureCounter_None.h
    │   │   │   │       │           └── mcuxCsslSecureCounter_SW_Local.h
    │   │   │   │       └── platforms/
    │   │   │   │           └── rw61x/
    │   │   │   │               ├── inc/
    │   │   │   │               │   ├── ip_css_constants.h
    │   │   │   │               │   ├── ip_css_design_configuration.h
    │   │   │   │               │   └── ip_platform.h
    │   │   │   │               ├── mcuxClConfig.h
    │   │   │   │               └── platform_specific_headers.h
    │   │   │   ├── imu_adapter/
    │   │   │   │   ├── fsl_adapter_imu.c
    │   │   │   │   ├── fsl_adapter_imu.h
    │   │   │   │   └── fsl_adapter_imu_common.h
    │   │   │   ├── lists/
    │   │   │   │   ├── fsl_component_generic_list.c
    │   │   │   │   └── fsl_component_generic_list.h
    │   │   │   ├── osa/
    │   │   │   │   ├── fsl_os_abstraction.h
    │   │   │   │   ├── fsl_os_abstraction_free_rtos.c
    │   │   │   │   └── fsl_os_abstraction_free_rtos.h
    │   │   │   ├── serial_manager/
    │   │   │   │   ├── fsl_component_serial_manager.c
    │   │   │   │   ├── fsl_component_serial_manager.h
    │   │   │   │   ├── fsl_component_serial_port_internal.h
    │   │   │   │   ├── fsl_component_serial_port_uart.c
    │   │   │   │   └── fsl_component_serial_port_uart.h
    │   │   │   ├── uart/
    │   │   │   │   ├── fsl_adapter_uart.h
    │   │   │   │   └── fsl_adapter_usart.c
    │   │   │   └── wifi_bt_module/
    │   │   │       ├── AzureWave/
    │   │   │       │   └── tx_pwr_limits/
    │   │   │       │       ├── wlan_txpwrlimit_cfg_WW.h
    │   │   │       │       └── wlan_txpwrlimit_cfg_WW_rw610.h
    │   │   │       ├── Murata/
    │   │   │       │   └── tx_pwr_limits/
    │   │   │       │       ├── wlan_txpwrlimit_cfg_murata_1XK_WW.h
    │   │   │       │       ├── wlan_txpwrlimit_cfg_murata_1ZM_WW.h
    │   │   │       │       ├── wlan_txpwrlimit_cfg_murata_2DS_WW.h
    │   │   │       │       ├── wlan_txpwrlimit_cfg_murata_2EL_WW.h
    │   │   │       │       └── wlan_txpwrlimit_cfg_murata_NH_FCC.h
    │   │   │       ├── incl/
    │   │   │       │   └── wifi_bt_module_config.h
    │   │   │       └── u-blox/
    │   │   │           └── tx_pwr_limits/
    │   │   │               └── wlan_txpwrlimit_cfg_jody_w5_WW.h
    │   │   ├── device/
    │   │   │   ├── RW612.h
    │   │   │   ├── RW612_COMMON.h
    │   │   │   ├── RW612_features.h
    │   │   │   ├── fsl_device_registers.h
    │   │   │   ├── periph/
    │   │   │   │   ├── PERI_ACOMP.h
    │   │   │   │   ├── PERI_ADC.h
    │   │   │   │   ├── PERI_AHB_SECURE_CTRL.h
    │   │   │   │   ├── PERI_AON_SOC_CIU.h
    │   │   │   │   ├── PERI_APU.h
    │   │   │   │   ├── PERI_BG.h
    │   │   │   │   ├── PERI_BLEAPU.h
    │   │   │   │   ├── PERI_BUCK11.h
    │   │   │   │   ├── PERI_BUCK18.h
    │   │   │   │   ├── PERI_CACHE64_CTRL.h
    │   │   │   │   ├── PERI_CACHE64_POLSEL.h
    │   │   │   │   ├── PERI_CAU.h
    │   │   │   │   ├── PERI_CDOG.h
    │   │   │   │   ├── PERI_CIU1.h
    │   │   │   │   ├── PERI_CIU2.h
    │   │   │   │   ├── PERI_CLKCTL0.h
    │   │   │   │   ├── PERI_CLKCTL1.h
    │   │   │   │   ├── PERI_CRC.h
    │   │   │   │   ├── PERI_CTIMER.h
    │   │   │   │   ├── PERI_DAC.h
    │   │   │   │   ├── PERI_DBGMAILBOX.h
    │   │   │   │   ├── PERI_DMA.h
    │   │   │   │   ├── PERI_DMIC.h
    │   │   │   │   ├── PERI_ELS.h
    │   │   │   │   ├── PERI_ENET.h
    │   │   │   │   ├── PERI_FLEXCOMM.h
    │   │   │   │   ├── PERI_FLEXSPI.h
    │   │   │   │   ├── PERI_FREQME.h
    │   │   │   │   ├── PERI_GDMA.h
    │   │   │   │   ├── PERI_GPIO.h
    │   │   │   │   ├── PERI_I2C.h
    │   │   │   │   ├── PERI_I2S.h
    │   │   │   │   ├── PERI_INPUTMUX.h
    │   │   │   │   ├── PERI_ITRC.h
    │   │   │   │   ├── PERI_LCDIC.h
    │   │   │   │   ├── PERI_MCI_IO_MUX.h
    │   │   │   │   ├── PERI_MRT.h
    │   │   │   │   ├── PERI_OCOTP.h
    │   │   │   │   ├── PERI_OSTIMER.h
    │   │   │   │   ├── PERI_PINT.h
    │   │   │   │   ├── PERI_PKC.h
    │   │   │   │   ├── PERI_PMU.h
    │   │   │   │   ├── PERI_POWERQUAD.h
    │   │   │   │   ├── PERI_PUF.h
    │   │   │   │   ├── PERI_RF_SYSCON.h
    │   │   │   │   ├── PERI_ROMCP.h
    │   │   │   │   ├── PERI_RSTCTL0.h
    │   │   │   │   ├── PERI_RSTCTL1.h
    │   │   │   │   ├── PERI_RTC.h
    │   │   │   │   ├── PERI_SCT.h
    │   │   │   │   ├── PERI_SDU_FBR_CARD.h
    │   │   │   │   ├── PERI_SDU_FN0_CARD.h
    │   │   │   │   ├── PERI_SDU_FN_CARD.h
    │   │   │   │   ├── PERI_SENSOR_CTRL.h
    │   │   │   │   ├── PERI_SOCCIU.h
    │   │   │   │   ├── PERI_SOC_OTP_CTRL.h
    │   │   │   │   ├── PERI_SPI.h
    │   │   │   │   ├── PERI_SYSCTL0.h
    │   │   │   │   ├── PERI_SYSCTL1.h
    │   │   │   │   ├── PERI_SYSCTL2.h
    │   │   │   │   ├── PERI_SYSPLL_T3.h
    │   │   │   │   ├── PERI_SYSPLL_TCPU.h
    │   │   │   │   ├── PERI_SYSPLL_TDDR.h
    │   │   │   │   ├── PERI_TRNG.h
    │   │   │   │   ├── PERI_USART.h
    │   │   │   │   ├── PERI_USBC.h
    │   │   │   │   ├── PERI_USIM.h
    │   │   │   │   ├── PERI_UTICK.h
    │   │   │   │   ├── PERI_WLAPU.h
    │   │   │   │   └── PERI_WWDT.h
    │   │   │   ├── system_RW612.c
    │   │   │   └── system_RW612.h
    │   │   ├── doc/
    │   │   │   ├── readme.md
    │   │   │   └── wifi_examples_readme.md
    │   │   ├── drivers/
    │   │   │   ├── freertos/
    │   │   │   │   ├── fsl_usart_freertos.c
    │   │   │   │   └── fsl_usart_freertos.h
    │   │   │   ├── fsl_cache.c
    │   │   │   ├── fsl_cache.h
    │   │   │   ├── fsl_clock.c
    │   │   │   ├── fsl_clock.h
    │   │   │   ├── fsl_common.c
    │   │   │   ├── fsl_common.h
    │   │   │   ├── fsl_common_arm.c
    │   │   │   ├── fsl_common_arm.h
    │   │   │   ├── fsl_flexcomm.c
    │   │   │   ├── fsl_flexcomm.h
    │   │   │   ├── fsl_flexspi.c
    │   │   │   ├── fsl_flexspi.h
    │   │   │   ├── fsl_gdma.c
    │   │   │   ├── fsl_gdma.h
    │   │   │   ├── fsl_gpio.c
    │   │   │   ├── fsl_gpio.h
    │   │   │   ├── fsl_i2s_bridge.c
    │   │   │   ├── fsl_i2s_bridge.h
    │   │   │   ├── fsl_imu.c
    │   │   │   ├── fsl_imu.h
    │   │   │   ├── fsl_inputmux_connections.h
    │   │   │   ├── fsl_io_mux.h
    │   │   │   ├── fsl_iped.c
    │   │   │   ├── fsl_iped.h
    │   │   │   ├── fsl_memory.h
    │   │   │   ├── fsl_ocotp.c
    │   │   │   ├── fsl_ocotp.h
    │   │   │   ├── fsl_power.c
    │   │   │   ├── fsl_power.h
    │   │   │   ├── fsl_reset.c
    │   │   │   ├── fsl_reset.h
    │   │   │   ├── fsl_usart.c
    │   │   │   └── fsl_usart.h
    │   │   ├── edgefast_wifi/
    │   │   │   ├── include/
    │   │   │   │   └── wpl.h
    │   │   │   └── source/
    │   │   │       └── wpl_nxp.c
    │   │   ├── flash/
    │   │   │   └── mflash/
    │   │   │       ├── frdmrw612/
    │   │   │       │   ├── mflash_drv.c
    │   │   │       │   └── mflash_drv.h
    │   │   │       ├── mflash_common.h
    │   │   │       ├── mflash_file.c
    │   │   │       └── mflash_file.h
    │   │   ├── flash_config/
    │   │   │   ├── flash_config.c
    │   │   │   └── flash_config.h
    │   │   ├── frdm-rw612-xpresso-lwip-freertos JLink Debug.launch
    │   │   ├── freertos/
    │   │   │   └── freertos-kernel/
    │   │   │       ├── croutine.c
    │   │   │       ├── event_groups.c
    │   │   │       ├── include/
    │   │   │       │   ├── FreeRTOS.h
    │   │   │       │   ├── StackMacros.h
    │   │   │       │   ├── atomic.h
    │   │   │       │   ├── croutine.h
    │   │   │       │   ├── deprecated_definitions.h
    │   │   │       │   ├── event_groups.h
    │   │   │       │   ├── freertos_tasks_c_additions.h
    │   │   │       │   ├── list.h
    │   │   │       │   ├── message_buffer.h
    │   │   │       │   ├── mpu_prototypes.h
    │   │   │       │   ├── mpu_syscall_numbers.h
    │   │   │       │   ├── mpu_wrappers.h
    │   │   │       │   ├── portable.h
    │   │   │       │   ├── projdefs.h
    │   │   │       │   ├── queue.h
    │   │   │       │   ├── semphr.h
    │   │   │       │   ├── stack_macros.h
    │   │   │       │   ├── stdint.readme
    │   │   │       │   ├── stream_buffer.h
    │   │   │       │   ├── task.h
    │   │   │       │   └── timers.h
    │   │   │       ├── list.c
    │   │   │       ├── portable/
    │   │   │       │   ├── GCC/
    │   │   │       │   │   └── ARM_CM33_NTZ/
    │   │   │       │   │       └── non_secure/
    │   │   │       │   │           ├── mpu_wrappers_v2_asm.c
    │   │   │       │   │           ├── port.c
    │   │   │       │   │           ├── portasm.c
    │   │   │       │   │           ├── portasm.h
    │   │   │       │   │           ├── portmacro.h
    │   │   │       │   │           └── portmacrocommon.h
    │   │   │       │   ├── MemMang/
    │   │   │       │   │   ├── ReadMe.url
    │   │   │       │   │   └── heap_4.c
    │   │   │       │   └── readme.txt
    │   │   │       ├── queue.c
    │   │   │       ├── stream_buffer.c
    │   │   │       ├── tasks.c
    │   │   │       ├── template/
    │   │   │       │   └── ARM_CM33_3_priority_bits/
    │   │   │       │       └── FreeRTOSConfig_Gen.h
    │   │   │       └── timers.c
    │   │   ├── linkscripts/
    │   │   │   ├── main_data.ldt
    │   │   │   ├── main_text.ldt
    │   │   │   └── noinit_noload_section.ldt
    │   │   ├── lwip/
    │   │   │   ├── BUILDING
    │   │   │   ├── CHANGELOG
    │   │   │   ├── CMakeLists_upstream.txt
    │   │   │   ├── COPYING
    │   │   │   ├── ChangeLogKSDK.txt
    │   │   │   ├── FEATURES
    │   │   │   ├── FILES
    │   │   │   ├── README
    │   │   │   ├── UPGRADING
    │   │   │   ├── codespell_changed_files.sh
    │   │   │   ├── codespell_check.sh
    │   │   │   ├── doc/
    │   │   │   │   ├── FILES
    │   │   │   │   ├── NO_SYS_SampleCode.c
    │   │   │   │   ├── ZeroCopyRx.c
    │   │   │   │   ├── contrib.txt
    │   │   │   │   ├── doxygen/
    │   │   │   │   │   ├── generate.bat
    │   │   │   │   │   ├── generate.sh
    │   │   │   │   │   ├── lwip.Doxyfile
    │   │   │   │   │   ├── lwip.Doxyfile.cmake.in
    │   │   │   │   │   ├── main_page.h
    │   │   │   │   │   └── output/
    │   │   │   │   │       └── index.html
    │   │   │   │   ├── mdns.txt
    │   │   │   │   ├── mqtt_client.txt
    │   │   │   │   ├── ppp.txt
    │   │   │   │   └── savannah.txt
    │   │   │   ├── port/
    │   │   │   │   ├── README.md
    │   │   │   │   ├── arch/
    │   │   │   │   │   ├── cc.h
    │   │   │   │   │   └── perf.h
    │   │   │   │   └── sys_arch/
    │   │   │   │       └── dynamic/
    │   │   │   │           ├── arch/
    │   │   │   │           │   └── sys_arch.h
    │   │   │   │           └── sys_arch.c
    │   │   │   └── src/
    │   │   │       ├── FILES
    │   │   │       ├── api/
    │   │   │       │   ├── api_lib.c
    │   │   │       │   ├── api_msg.c
    │   │   │       │   ├── err.c
    │   │   │       │   ├── if_api.c
    │   │   │       │   ├── netbuf.c
    │   │   │       │   ├── netdb.c
    │   │   │       │   ├── netifapi.c
    │   │   │       │   ├── sockets.c
    │   │   │       │   └── tcpip.c
    │   │   │       ├── apps/
    │   │   │       │   ├── httpsrv/
    │   │   │       │   │   ├── httpsrv.c
    │   │   │       │   │   ├── httpsrv.h
    │   │   │       │   │   ├── httpsrv_base64.c
    │   │   │       │   │   ├── httpsrv_base64.h
    │   │   │       │   │   ├── httpsrv_config.h
    │   │   │       │   │   ├── httpsrv_fs.c
    │   │   │       │   │   ├── httpsrv_fs.h
    │   │   │       │   │   ├── httpsrv_port.h
    │   │   │       │   │   ├── httpsrv_prv.h
    │   │   │       │   │   ├── httpsrv_script.c
    │   │   │       │   │   ├── httpsrv_script.h
    │   │   │       │   │   ├── httpsrv_sha1.c
    │   │   │       │   │   ├── httpsrv_sha1.h
    │   │   │       │   │   ├── httpsrv_supp.c
    │   │   │       │   │   ├── httpsrv_supp.h
    │   │   │       │   │   ├── httpsrv_task.c
    │   │   │       │   │   ├── httpsrv_tls.c
    │   │   │       │   │   ├── httpsrv_tls.h
    │   │   │       │   │   ├── httpsrv_utf8.c
    │   │   │       │   │   ├── httpsrv_utf8.h
    │   │   │       │   │   ├── httpsrv_ws.c
    │   │   │       │   │   ├── httpsrv_ws.h
    │   │   │       │   │   ├── httpsrv_ws_api.c
    │   │   │       │   │   ├── httpsrv_ws_prv.h
    │   │   │       │   │   └── mkfs/
    │   │   │       │   │       └── mkfs.pl
    │   │   │       │   └── mdns/
    │   │   │       │       ├── mdns.c
    │   │   │       │       ├── mdns_domain.c
    │   │   │       │       └── mdns_out.c
    │   │   │       ├── core/
    │   │   │       │   ├── altcp.c
    │   │   │       │   ├── altcp_alloc.c
    │   │   │       │   ├── altcp_tcp.c
    │   │   │       │   ├── def.c
    │   │   │       │   ├── dns.c
    │   │   │       │   ├── inet_chksum.c
    │   │   │       │   ├── init.c
    │   │   │       │   ├── ip.c
    │   │   │       │   ├── ipv4/
    │   │   │       │   │   ├── acd.c
    │   │   │       │   │   ├── autoip.c
    │   │   │       │   │   ├── dhcp.c
    │   │   │       │   │   ├── etharp.c
    │   │   │       │   │   ├── icmp.c
    │   │   │       │   │   ├── igmp.c
    │   │   │       │   │   ├── ip4.c
    │   │   │       │   │   ├── ip4_addr.c
    │   │   │       │   │   └── ip4_frag.c
    │   │   │       │   ├── ipv6/
    │   │   │       │   │   ├── dhcp6.c
    │   │   │       │   │   ├── ethip6.c
    │   │   │       │   │   ├── icmp6.c
    │   │   │       │   │   ├── inet6.c
    │   │   │       │   │   ├── ip6.c
    │   │   │       │   │   ├── ip6_addr.c
    │   │   │       │   │   ├── ip6_frag.c
    │   │   │       │   │   ├── mld6.c
    │   │   │       │   │   └── nd6.c
    │   │   │       │   ├── mem.c
    │   │   │       │   ├── memp.c
    │   │   │       │   ├── netif.c
    │   │   │       │   ├── pbuf.c
    │   │   │       │   ├── raw.c
    │   │   │       │   ├── stats.c
    │   │   │       │   ├── sys.c
    │   │   │       │   ├── tcp.c
    │   │   │       │   ├── tcp_in.c
    │   │   │       │   ├── tcp_out.c
    │   │   │       │   ├── timeouts.c
    │   │   │       │   └── udp.c
    │   │   │       ├── include/
    │   │   │       │   ├── compat/
    │   │   │       │   │   ├── posix/
    │   │   │       │   │   │   ├── arpa/
    │   │   │       │   │   │   │   └── inet.h
    │   │   │       │   │   │   ├── net/
    │   │   │       │   │   │   │   └── if.h
    │   │   │       │   │   │   ├── netdb.h
    │   │   │       │   │   │   └── sys/
    │   │   │       │   │   │       └── socket.h
    │   │   │       │   │   └── stdc/
    │   │   │       │   │       └── errno.h
    │   │   │       │   ├── lwip/
    │   │   │       │   │   ├── acd.h
    │   │   │       │   │   ├── altcp.h
    │   │   │       │   │   ├── altcp_tcp.h
    │   │   │       │   │   ├── altcp_tls.h
    │   │   │       │   │   ├── api.h
    │   │   │       │   │   ├── apps/
    │   │   │       │   │   │   ├── mdns.h
    │   │   │       │   │   │   ├── mdns_domain.h
    │   │   │       │   │   │   ├── mdns_opts.h
    │   │   │       │   │   │   ├── mdns_out.h
    │   │   │       │   │   │   └── mdns_priv.h
    │   │   │       │   │   ├── arch.h
    │   │   │       │   │   ├── autoip.h
    │   │   │       │   │   ├── debug.h
    │   │   │       │   │   ├── def.h
    │   │   │       │   │   ├── dhcp.h
    │   │   │       │   │   ├── dhcp6.h
    │   │   │       │   │   ├── dns.h
    │   │   │       │   │   ├── err.h
    │   │   │       │   │   ├── errno.h
    │   │   │       │   │   ├── etharp.h
    │   │   │       │   │   ├── ethip6.h
    │   │   │       │   │   ├── icmp.h
    │   │   │       │   │   ├── icmp6.h
    │   │   │       │   │   ├── if_api.h
    │   │   │       │   │   ├── igmp.h
    │   │   │       │   │   ├── inet.h
    │   │   │       │   │   ├── inet_chksum.h
    │   │   │       │   │   ├── init.h
    │   │   │       │   │   ├── ip.h
    │   │   │       │   │   ├── ip4.h
    │   │   │       │   │   ├── ip4_addr.h
    │   │   │       │   │   ├── ip4_frag.h
    │   │   │       │   │   ├── ip6.h
    │   │   │       │   │   ├── ip6_addr.h
    │   │   │       │   │   ├── ip6_frag.h
    │   │   │       │   │   ├── ip6_zone.h
    │   │   │       │   │   ├── ip_addr.h
    │   │   │       │   │   ├── mem.h
    │   │   │       │   │   ├── memp.h
    │   │   │       │   │   ├── mld6.h
    │   │   │       │   │   ├── nd6.h
    │   │   │       │   │   ├── netbuf.h
    │   │   │       │   │   ├── netdb.h
    │   │   │       │   │   ├── netif.h
    │   │   │       │   │   ├── netifapi.h
    │   │   │       │   │   ├── opt.h
    │   │   │       │   │   ├── pbuf.h
    │   │   │       │   │   ├── priv/
    │   │   │       │   │   │   ├── altcp_priv.h
    │   │   │       │   │   │   ├── api_msg.h
    │   │   │       │   │   │   ├── mem_priv.h
    │   │   │       │   │   │   ├── memp_priv.h
    │   │   │       │   │   │   ├── memp_std.h
    │   │   │       │   │   │   ├── nd6_priv.h
    │   │   │       │   │   │   ├── raw_priv.h
    │   │   │       │   │   │   ├── sockets_priv.h
    │   │   │       │   │   │   ├── tcp_priv.h
    │   │   │       │   │   │   └── tcpip_priv.h
    │   │   │       │   │   ├── prot/
    │   │   │       │   │   │   ├── acd.h
    │   │   │       │   │   │   ├── autoip.h
    │   │   │       │   │   │   ├── dhcp.h
    │   │   │       │   │   │   ├── dhcp6.h
    │   │   │       │   │   │   ├── dns.h
    │   │   │       │   │   │   ├── etharp.h
    │   │   │       │   │   │   ├── ethernet.h
    │   │   │       │   │   │   ├── iana.h
    │   │   │       │   │   │   ├── icmp.h
    │   │   │       │   │   │   ├── icmp6.h
    │   │   │       │   │   │   ├── ieee.h
    │   │   │       │   │   │   ├── igmp.h
    │   │   │       │   │   │   ├── ip.h
    │   │   │       │   │   │   ├── ip4.h
    │   │   │       │   │   │   ├── ip6.h
    │   │   │       │   │   │   ├── mld6.h
    │   │   │       │   │   │   ├── nd6.h
    │   │   │       │   │   │   ├── tcp.h
    │   │   │       │   │   │   └── udp.h
    │   │   │       │   │   ├── raw.h
    │   │   │       │   │   ├── sio.h
    │   │   │       │   │   ├── snmp.h
    │   │   │       │   │   ├── sockets.h
    │   │   │       │   │   ├── stats.h
    │   │   │       │   │   ├── sys.h
    │   │   │       │   │   ├── tcp.h
    │   │   │       │   │   ├── tcpbase.h
    │   │   │       │   │   ├── tcpip.h
    │   │   │       │   │   ├── timeouts.h
    │   │   │       │   │   └── udp.h
    │   │   │       │   └── netif/
    │   │   │       │       ├── bridgeif.h
    │   │   │       │       ├── bridgeif_opts.h
    │   │   │       │       ├── etharp.h
    │   │   │       │       ├── ethernet.h
    │   │   │       │       ├── ieee802154.h
    │   │   │       │       ├── lowpan6.h
    │   │   │       │       ├── lowpan6_ble.h
    │   │   │       │       ├── lowpan6_common.h
    │   │   │       │       ├── lowpan6_opts.h
    │   │   │       │       ├── ppp/
    │   │   │       │       │   ├── ccp.h
    │   │   │       │       │   ├── chap-md5.h
    │   │   │       │       │   ├── chap-new.h
    │   │   │       │       │   ├── chap_ms.h
    │   │   │       │       │   ├── eap.h
    │   │   │       │       │   ├── ecp.h
    │   │   │       │       │   ├── eui64.h
    │   │   │       │       │   ├── fsm.h
    │   │   │       │       │   ├── ipcp.h
    │   │   │       │       │   ├── ipv6cp.h
    │   │   │       │       │   ├── lcp.h
    │   │   │       │       │   ├── magic.h
    │   │   │       │       │   ├── mppe.h
    │   │   │       │       │   ├── polarssl/
    │   │   │       │       │   │   ├── arc4.h
    │   │   │       │       │   │   ├── des.h
    │   │   │       │       │   │   ├── md4.h
    │   │   │       │       │   │   ├── md5.h
    │   │   │       │       │   │   └── sha1.h
    │   │   │       │       │   ├── ppp.h
    │   │   │       │       │   ├── ppp_impl.h
    │   │   │       │       │   ├── ppp_opts.h
    │   │   │       │       │   ├── pppapi.h
    │   │   │       │       │   ├── pppcrypt.h
    │   │   │       │       │   ├── pppdebug.h
    │   │   │       │       │   ├── pppoe.h
    │   │   │       │       │   ├── pppol2tp.h
    │   │   │       │       │   ├── pppos.h
    │   │   │       │       │   ├── upap.h
    │   │   │       │       │   └── vj.h
    │   │   │       │       ├── slipif.h
    │   │   │       │       └── zepif.h
    │   │   │       └── netif/
    │   │   │           ├── FILES
    │   │   │           ├── bridgeif.c
    │   │   │           ├── bridgeif_fdb.c
    │   │   │           ├── ethernet.c
    │   │   │           ├── lowpan6.c
    │   │   │           ├── lowpan6_ble.c
    │   │   │           ├── lowpan6_common.c
    │   │   │           ├── ppp/
    │   │   │           │   ├── PPPD_FOLLOWUP
    │   │   │           │   ├── auth.c
    │   │   │           │   ├── ccp.c
    │   │   │           │   ├── chap-md5.c
    │   │   │           │   ├── chap-new.c
    │   │   │           │   ├── chap_ms.c
    │   │   │           │   ├── demand.c
    │   │   │           │   ├── eap.c
    │   │   │           │   ├── ecp.c
    │   │   │           │   ├── eui64.c
    │   │   │           │   ├── fsm.c
    │   │   │           │   ├── ipcp.c
    │   │   │           │   ├── ipv6cp.c
    │   │   │           │   ├── lcp.c
    │   │   │           │   ├── magic.c
    │   │   │           │   ├── mppe.c
    │   │   │           │   ├── multilink.c
    │   │   │           │   ├── polarssl/
    │   │   │           │   │   ├── README
    │   │   │           │   │   ├── arc4.c
    │   │   │           │   │   ├── des.c
    │   │   │           │   │   ├── md4.c
    │   │   │           │   │   ├── md5.c
    │   │   │           │   │   └── sha1.c
    │   │   │           │   ├── ppp.c
    │   │   │           │   ├── pppapi.c
    │   │   │           │   ├── pppcrypt.c
    │   │   │           │   ├── pppoe.c
    │   │   │           │   ├── pppol2tp.c
    │   │   │           │   ├── pppos.c
    │   │   │           │   ├── upap.c
    │   │   │           │   ├── utils.c
    │   │   │           │   └── vj.c
    │   │   │           ├── slipif.c
    │   │   │           └── zepif.c
    │   │   ├── source/
    │   │   │   ├── FreeRTOSConfig.h
    │   │   │   ├── FreeRTOSConfigBoard.h
    │   │   │   ├── app.h
    │   │   │   ├── app_config.h
    │   │   │   ├── fsl_debug_console_conf.h
    │   │   │   ├── fsl_os_abstraction_config.h
    │   │   │   ├── hardware_init.c
    │   │   │   ├── lwipopts.h
    │   │   │   ├── lwippools.h
    │   │   │   ├── main.c
    │   │   │   ├── mcux_config.h
    │   │   │   ├── mongoose_config.h
    │   │   │   ├── pin_mux.c
    │   │   │   ├── pin_mux.h
    │   │   │   ├── semihost_hardfault.c
    │   │   │   └── wifi_config.h
    │   │   ├── startup/
    │   │   │   └── startup_rw612.c
    │   │   ├── utilities/
    │   │   │   ├── debug_console/
    │   │   │   │   ├── fsl_debug_console.c
    │   │   │   │   └── fsl_debug_console.h
    │   │   │   ├── fsl_assert.c
    │   │   │   ├── fsl_assert.h
    │   │   │   ├── fsl_memcpy.S
    │   │   │   └── str/
    │   │   │       ├── fsl_str.c
    │   │   │       └── fsl_str.h
    │   │   └── wifi/
    │   │       ├── CMakeLists.txt
    │   │       ├── ChangeLogKSDK.txt
    │   │       ├── certs/
    │   │       │   ├── ca-cert.h
    │   │       │   ├── client-cert.h
    │   │       │   ├── client-key.h
    │   │       │   ├── dh-param.h
    │   │       │   ├── server-cert.h
    │   │       │   └── server-key.h
    │   │       ├── dhcpd/
    │   │       │   ├── dhcp-bootp.h
    │   │       │   ├── dhcp-priv.h
    │   │       │   ├── dhcp-server-main.c
    │   │       │   ├── dhcp-server.c
    │   │       │   ├── dns-server.c
    │   │       │   └── dns.h
    │   │       ├── incl/
    │   │       │   ├── dhcp-server.h
    │   │       │   ├── nxp_wifi.h
    │   │       │   ├── port/
    │   │       │   │   ├── net/
    │   │       │   │   │   └── wm_net.h
    │   │       │   │   └── osa/
    │   │       │   │       ├── mem_pool.h
    │   │       │   │       ├── mem_pool_config.h
    │   │       │   │       ├── osa.h
    │   │       │   │       ├── slist.h
    │   │       │   │       └── stack_simple.h
    │   │       │   ├── wifi_cal_data_ext.h
    │   │       │   ├── wifi_cal_data_frdmrw61x_1ant.h
    │   │       │   ├── wifi_cal_data_rw61x_1ant.h
    │   │       │   ├── wifi_cal_data_rw61x_1ant_diversity.h
    │   │       │   ├── wifi_cal_data_rw61x_2ant.h
    │   │       │   ├── wifi_cal_data_rw61x_3ant_diversity.h
    │   │       │   ├── wifi_cal_data_rw61x_override.h
    │   │       │   ├── wifi_config_default.h
    │   │       │   ├── wifidriver/
    │   │       │   │   ├── wifi-decl.h
    │   │       │   │   ├── wifi.h
    │   │       │   │   ├── wifi_events.h
    │   │       │   │   └── wifi_nxp.h
    │   │       │   ├── wlcmgr/
    │   │       │   │   ├── wlan.h
    │   │       │   │   └── wlan_11d.h
    │   │       │   ├── wm_utils.h
    │   │       │   ├── wmerrno.h
    │   │       │   ├── wmlog.h
    │   │       │   ├── wmstats.h
    │   │       │   └── wmtypes.h
    │   │       ├── port/
    │   │       │   ├── net/
    │   │       │   │   ├── net.c
    │   │       │   │   ├── netif_decl.h
    │   │       │   │   └── wifi_netif.c
    │   │       │   └── osa/
    │   │       │       ├── mem_pool.c
    │   │       │       ├── mem_pool_config.c
    │   │       │       ├── osa.c
    │   │       │       ├── osa_freertos.c
    │   │       │       ├── osa_freertos.h
    │   │       │       ├── slist.c
    │   │       │       └── stack_simple.c
    │   │       ├── wifi_bt_firmware/
    │   │       │   └── wlan_bt_fw.h
    │   │       ├── wifidriver/
    │   │       │   ├── incl/
    │   │       │   │   ├── mlan.h
    │   │       │   │   ├── mlan_11ac.h
    │   │       │   │   ├── mlan_11ax.h
    │   │       │   │   ├── mlan_11h.h
    │   │       │   │   ├── mlan_11k.h
    │   │       │   │   ├── mlan_11n.h
    │   │       │   │   ├── mlan_11n_aggr.h
    │   │       │   │   ├── mlan_11n_rxreorder.h
    │   │       │   │   ├── mlan_11v.h
    │   │       │   │   ├── mlan_action.h
    │   │       │   │   ├── mlan_api.h
    │   │       │   │   ├── mlan_decl.h
    │   │       │   │   ├── mlan_fw.h
    │   │       │   │   ├── mlan_ieee.h
    │   │       │   │   ├── mlan_init.h
    │   │       │   │   ├── mlan_ioctl.h
    │   │       │   │   ├── mlan_join.h
    │   │       │   │   ├── mlan_main.h
    │   │       │   │   ├── mlan_mbo.h
    │   │       │   │   ├── mlan_meas.h
    │   │       │   │   ├── mlan_remap_mem_operations.h
    │   │       │   │   ├── mlan_uap.h
    │   │       │   │   ├── mlan_util.h
    │   │       │   │   ├── mlan_wmm.h
    │   │       │   │   └── type_decls.h
    │   │       │   ├── mlan_11ac.c
    │   │       │   ├── mlan_11ax.c
    │   │       │   ├── mlan_11d.c
    │   │       │   ├── mlan_11h.c
    │   │       │   ├── mlan_11k.c
    │   │       │   ├── mlan_11n.c
    │   │       │   ├── mlan_11n_aggr.c
    │   │       │   ├── mlan_11n_rxreorder.c
    │   │       │   ├── mlan_11v.c
    │   │       │   ├── mlan_action.c
    │   │       │   ├── mlan_api.c
    │   │       │   ├── mlan_cfp.c
    │   │       │   ├── mlan_cmdevt.c
    │   │       │   ├── mlan_glue.c
    │   │       │   ├── mlan_init.c
    │   │       │   ├── mlan_join.c
    │   │       │   ├── mlan_mbo.c
    │   │       │   ├── mlan_misc.c
    │   │       │   ├── mlan_scan.c
    │   │       │   ├── mlan_shim.c
    │   │       │   ├── mlan_sta_cmd.c
    │   │       │   ├── mlan_sta_cmdresp.c
    │   │       │   ├── mlan_sta_event.c
    │   │       │   ├── mlan_sta_ioctl.c
    │   │       │   ├── mlan_sta_rx.c
    │   │       │   ├── mlan_txrx.c
    │   │       │   ├── mlan_uap_cmdevent.c
    │   │       │   ├── mlan_uap_ioctl.c
    │   │       │   ├── mlan_wmm.c
    │   │       │   ├── wifi-debug.c
    │   │       │   ├── wifi-debug.h
    │   │       │   ├── wifi-imu.c
    │   │       │   ├── wifi-imu.h
    │   │       │   ├── wifi-internal.h
    │   │       │   ├── wifi-mem.c
    │   │       │   ├── wifi-uap.c
    │   │       │   ├── wifi-wps.c
    │   │       │   ├── wifi.c
    │   │       │   ├── wifi_common.h
    │   │       │   ├── wifi_pwrmgr.c
    │   │       │   └── wpa_supp_if/
    │   │       │       ├── incl/
    │   │       │       │   ├── rtos_wpa_supp_if.h
    │   │       │       │   └── wifi_nxp_internal.h
    │   │       │       ├── rtos_wpa_supp_if.c
    │   │       │       ├── wifi_nxp.c
    │   │       │       └── wifi_nxp_internal.c
    │   │       └── wlcmgr/
    │   │           ├── wlan.c
    │   │           └── wlan_txpwrlimit_cfg.c
    │   ├── frdm-rw612-xpresso-freertos-lwip-wifi/
    │   │   ├── .cproject
    │   │   ├── .project
    │   │   ├── .settings/
    │   │   │   ├── language.settings.xml
    │   │   │   └── org.eclipse.core.resources.prefs
    │   │   ├── CMSIS/
    │   │   │   ├── cmsis_compiler.h
    │   │   │   ├── cmsis_gcc.h
    │   │   │   ├── cmsis_version.h
    │   │   │   ├── core_cm33.h
    │   │   │   ├── mpu_armv8.h
    │   │   │   └── tz_context.h
    │   │   ├── Debug/
    │   │   │   ├── frdm-rw612-xpresso-freertos-lwip_Debug.ld
    │   │   │   ├── frdm-rw612-xpresso-freertos-lwip_Debug_library.ld
    │   │   │   └── frdm-rw612-xpresso-freertos-lwip_Debug_memory.ld
    │   │   ├── README.md
    │   │   ├── board/
    │   │   │   ├── board.c
    │   │   │   ├── board.h
    │   │   │   ├── clock_config.c
    │   │   │   ├── clock_config.h
    │   │   │   ├── pin_mux.c
    │   │   │   └── pin_mux.h
    │   │   ├── component/
    │   │   │   ├── conn_fwloader/
    │   │   │   │   ├── fsl_loader.c
    │   │   │   │   ├── fsl_loader_utils.c
    │   │   │   │   ├── include/
    │   │   │   │   │   ├── api_tree_root.h
    │   │   │   │   │   ├── fsl_loader.h
    │   │   │   │   │   ├── fsl_loader_utils.h
    │   │   │   │   │   ├── fusemap.h
    │   │   │   │   │   ├── life_cycle.h
    │   │   │   │   │   └── nboot_rom_api_table.h
    │   │   │   │   ├── life_cycle.c
    │   │   │   │   ├── nboot_hal.c
    │   │   │   │   └── readme.txt
    │   │   │   ├── els_pkc/
    │   │   │   │   └── src/
    │   │   │   │       ├── compiler/
    │   │   │   │       │   └── mcuxClToolchain.h
    │   │   │   │       ├── comps/
    │   │   │   │       │   ├── mcuxClBuffer/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   ├── mcuxClBuffer_Internal.h
    │   │   │   │       │   │   │   │   └── mcuxClBuffer_Internal_Pointer.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer_Cfg.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer_Constants.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer_Impl.h
    │   │   │   │       │   │   │   └── mcuxClBuffer_Pointer.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       └── mcuxClBuffer.c
    │   │   │   │       │   ├── mcuxClCore/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxClCore_Examples.h
    │   │   │   │       │   │       ├── mcuxClCore_FunctionIdentifiers.h
    │   │   │   │       │   │       ├── mcuxClCore_Macros.h
    │   │   │   │       │   │       ├── mcuxClCore_Platform.h
    │   │   │   │       │   │       └── mcuxClCore_Toolchain.h
    │   │   │   │       │   ├── mcuxClEls/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   ├── mcuxClEls_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClEls_Internal_Common.h
    │   │   │   │       │   │   │   │   ├── mcuxClEls_Internal_mapping.h
    │   │   │   │       │   │   │   │   └── mcuxClEls_SfrAccess.h
    │   │   │   │       │   │   │   ├── mcuxClEls.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Aead.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Cipher.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Cmac.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Common.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Crc.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Ecc.h
    │   │   │   │       │   │   │   ├── mcuxClEls_GlitchDetector.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Hash.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Hmac.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Kdf.h
    │   │   │   │       │   │   │   ├── mcuxClEls_KeyManagement.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Rng.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Types.h
    │   │   │   │       │   │   │   └── mcuxClEls_mapping.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       ├── mcuxClEls_Common.c
    │   │   │   │       │   │       └── mcuxClEls_GlitchDetector.c
    │   │   │   │       │   ├── mcuxClMemory/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_ClearSecure_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_Clear_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CompareDPASecure_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CompareSecure_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_Compare_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CopySecurePow2_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CopySecure_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CopySecure_Reversed_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CopyWords_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_Copy_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_Copy_Reversed_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_SetSecure_Internal.h
    │   │   │   │       │   │   │   │   └── mcuxClMemory_Set_Internal.h
    │   │   │   │       │   │   │   ├── mcuxClMemory.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Clear.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Constants.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Copy.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Copy_Reversed.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Endianness.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Set.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Types.h
    │   │   │   │       │   │   │   └── mcuxClMemory_Xor.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       └── mcuxClMemory.c
    │   │   │   │       │   ├── mcuxCsslCPreProcessor/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxCsslAnalysis.h
    │   │   │   │       │   │       └── mcuxCsslCPreProcessor.h
    │   │   │   │       │   ├── mcuxCsslDataIntegrity/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxCsslDataIntegrity.h
    │   │   │   │       │   │       ├── mcuxCsslDataIntegrity_Cfg.h
    │   │   │   │       │   │       ├── mcuxCsslDataIntegrity_Impl.h
    │   │   │   │       │   │       └── mcuxCsslDataIntegrity_None.h
    │   │   │   │       │   ├── mcuxCsslFlowProtection/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_Cfg.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_FunctionIdentifiers.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_Impl.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_SecureCounter_Common.h
    │   │   │   │       │   │       └── mcuxCsslFlowProtection_SecureCounter_Local.h
    │   │   │   │       │   ├── mcuxCsslMemory/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   ├── mcuxCsslMemory_Internal_Compare_asm.h
    │   │   │   │       │   │   │   │   ├── mcuxCsslMemory_Internal_Copy_asm.h
    │   │   │   │       │   │   │   │   └── mcuxCsslMemory_Internal_SecureCompare.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Clear.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Compare.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Constants.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Copy.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Set.h
    │   │   │   │       │   │   │   └── mcuxCsslMemory_Types.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       ├── mcuxCsslMemory_Clear.c
    │   │   │   │       │   │       ├── mcuxCsslMemory_Compare.c
    │   │   │   │       │   │       ├── mcuxCsslMemory_Copy.c
    │   │   │   │       │   │       ├── mcuxCsslMemory_Internal_SecureCompare_Stub.c
    │   │   │   │       │   │       └── mcuxCsslMemory_Set.c
    │   │   │   │       │   ├── mcuxCsslParamIntegrity/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   └── mcuxCsslParamIntegrity.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       └── mcuxCsslParamIntegrity.c
    │   │   │   │       │   └── mcuxCsslSecureCounter/
    │   │   │   │       │       └── inc/
    │   │   │   │       │           ├── mcuxCsslSecureCounter.h
    │   │   │   │       │           ├── mcuxCsslSecureCounter_Cfg.h
    │   │   │   │       │           ├── mcuxCsslSecureCounter_Impl.h
    │   │   │   │       │           ├── mcuxCsslSecureCounter_None.h
    │   │   │   │       │           └── mcuxCsslSecureCounter_SW_Local.h
    │   │   │   │       └── platforms/
    │   │   │   │           └── rw61x/
    │   │   │   │               ├── inc/
    │   │   │   │               │   ├── ip_css_constants.h
    │   │   │   │               │   ├── ip_css_design_configuration.h
    │   │   │   │               │   └── ip_platform.h
    │   │   │   │               ├── mcuxClConfig.h
    │   │   │   │               ├── platform_specific_headers.h
    │   │   │   │               └── readme.txt
    │   │   │   ├── imu_adapter/
    │   │   │   │   ├── fsl_adapter_imu.c
    │   │   │   │   ├── fsl_adapter_imu.h
    │   │   │   │   └── fsl_adapter_imu_common.h
    │   │   │   ├── lists/
    │   │   │   │   ├── fsl_component_generic_list.c
    │   │   │   │   └── fsl_component_generic_list.h
    │   │   │   ├── osa/
    │   │   │   │   ├── fsl_os_abstraction.h
    │   │   │   │   ├── fsl_os_abstraction_config.h
    │   │   │   │   ├── fsl_os_abstraction_free_rtos.c
    │   │   │   │   └── fsl_os_abstraction_free_rtos.h
    │   │   │   ├── serial_manager/
    │   │   │   │   ├── fsl_component_serial_manager.c
    │   │   │   │   ├── fsl_component_serial_manager.h
    │   │   │   │   ├── fsl_component_serial_port_internal.h
    │   │   │   │   ├── fsl_component_serial_port_uart.c
    │   │   │   │   └── fsl_component_serial_port_uart.h
    │   │   │   ├── uart/
    │   │   │   │   ├── fsl_adapter_uart.h
    │   │   │   │   └── fsl_adapter_usart.c
    │   │   │   └── wifi_bt_module/
    │   │   │       └── AzureWave/
    │   │   │           └── tx_pwr_limits/
    │   │   │               └── wlan_txpwrlimit_cfg_WW_rw610.h
    │   │   ├── device/
    │   │   │   ├── RW612.h
    │   │   │   ├── RW612_features.h
    │   │   │   ├── fsl_device_registers.h
    │   │   │   ├── system_RW612.c
    │   │   │   └── system_RW612.h
    │   │   ├── drivers/
    │   │   │   ├── freertos/
    │   │   │   │   ├── fsl_usart_freertos.c
    │   │   │   │   └── fsl_usart_freertos.h
    │   │   │   ├── fsl_cache.c
    │   │   │   ├── fsl_cache.h
    │   │   │   ├── fsl_clock.c
    │   │   │   ├── fsl_clock.h
    │   │   │   ├── fsl_common.c
    │   │   │   ├── fsl_common.h
    │   │   │   ├── fsl_common_arm.c
    │   │   │   ├── fsl_common_arm.h
    │   │   │   ├── fsl_flexcomm.c
    │   │   │   ├── fsl_flexcomm.h
    │   │   │   ├── fsl_flexspi.c
    │   │   │   ├── fsl_flexspi.h
    │   │   │   ├── fsl_gdma.c
    │   │   │   ├── fsl_gdma.h
    │   │   │   ├── fsl_gpio.c
    │   │   │   ├── fsl_gpio.h
    │   │   │   ├── fsl_imu.c
    │   │   │   ├── fsl_imu.h
    │   │   │   ├── fsl_io_mux.h
    │   │   │   ├── fsl_ocotp.c
    │   │   │   ├── fsl_ocotp.h
    │   │   │   ├── fsl_power.c
    │   │   │   ├── fsl_power.h
    │   │   │   ├── fsl_reset.c
    │   │   │   ├── fsl_reset.h
    │   │   │   ├── fsl_usart.c
    │   │   │   └── fsl_usart.h
    │   │   ├── edgefast_wifi/
    │   │   │   ├── include/
    │   │   │   │   └── wpl.h
    │   │   │   └── source/
    │   │   │       └── wpl_nxp.c
    │   │   ├── flash/
    │   │   │   └── mflash/
    │   │   │       ├── frdmrw612/
    │   │   │       │   ├── mflash_drv.c
    │   │   │       │   └── mflash_drv.h
    │   │   │       ├── mflash_common.h
    │   │   │       ├── mflash_file.c
    │   │   │       ├── mflash_file.h
    │   │   │       └── readme.txt
    │   │   ├── flash_config/
    │   │   │   ├── flash_config.c
    │   │   │   └── flash_config.h
    │   │   ├── freertos/
    │   │   │   └── freertos-kernel/
    │   │   │       ├── croutine.c
    │   │   │       ├── event_groups.c
    │   │   │       ├── include/
    │   │   │       │   ├── FreeRTOS.h
    │   │   │       │   ├── StackMacros.h
    │   │   │       │   ├── atomic.h
    │   │   │       │   ├── croutine.h
    │   │   │       │   ├── deprecated_definitions.h
    │   │   │       │   ├── event_groups.h
    │   │   │       │   ├── freertos_tasks_c_additions.h
    │   │   │       │   ├── list.h
    │   │   │       │   ├── message_buffer.h
    │   │   │       │   ├── mpu_prototypes.h
    │   │   │       │   ├── mpu_syscall_numbers.h
    │   │   │       │   ├── mpu_wrappers.h
    │   │   │       │   ├── newlib-freertos.h
    │   │   │       │   ├── picolibc-freertos.h
    │   │   │       │   ├── portable.h
    │   │   │       │   ├── projdefs.h
    │   │   │       │   ├── queue.h
    │   │   │       │   ├── semphr.h
    │   │   │       │   ├── stack_macros.h
    │   │   │       │   ├── stdint.readme
    │   │   │       │   ├── stream_buffer.h
    │   │   │       │   ├── task.h
    │   │   │       │   └── timers.h
    │   │   │       ├── list.c
    │   │   │       ├── portable/
    │   │   │       │   ├── GCC/
    │   │   │       │   │   └── ARM_CM33_NTZ/
    │   │   │       │   │       └── non_secure/
    │   │   │       │   │           ├── mpu_wrappers_v2_asm.c
    │   │   │       │   │           ├── port.c
    │   │   │       │   │           ├── portasm.c
    │   │   │       │   │           ├── portasm.h
    │   │   │       │   │           ├── portmacro.h
    │   │   │       │   │           └── portmacrocommon.h
    │   │   │       │   ├── MemMang/
    │   │   │       │   │   ├── ReadMe.url
    │   │   │       │   │   └── heap_3.c
    │   │   │       │   └── readme.txt
    │   │   │       ├── queue.c
    │   │   │       ├── stream_buffer.c
    │   │   │       ├── tasks.c
    │   │   │       └── timers.c
    │   │   ├── linkscripts/
    │   │   │   ├── main_data.ldt
    │   │   │   ├── main_rodata.ldt
    │   │   │   ├── main_text.ldt
    │   │   │   └── noinit_noload_section.ldt
    │   │   ├── lwip/
    │   │   │   ├── BUILDING
    │   │   │   ├── CHANGELOG
    │   │   │   ├── COPYING
    │   │   │   ├── ChangeLogKSDK.txt
    │   │   │   ├── FEATURES
    │   │   │   ├── FILES
    │   │   │   ├── README
    │   │   │   ├── UPGRADING
    │   │   │   ├── doc/
    │   │   │   │   ├── FILES
    │   │   │   │   ├── NO_SYS_SampleCode.c
    │   │   │   │   ├── ZeroCopyRx.c
    │   │   │   │   ├── contrib.txt
    │   │   │   │   ├── doxygen/
    │   │   │   │   │   ├── generate.bat
    │   │   │   │   │   ├── generate.sh
    │   │   │   │   │   ├── lwip.Doxyfile
    │   │   │   │   │   ├── lwip.Doxyfile.cmake.in
    │   │   │   │   │   ├── main_page.h
    │   │   │   │   │   └── output/
    │   │   │   │   │       └── index.html
    │   │   │   │   ├── mdns.txt
    │   │   │   │   ├── mqtt_client.txt
    │   │   │   │   ├── ppp.txt
    │   │   │   │   └── savannah.txt
    │   │   │   ├── port/
    │   │   │   │   ├── arch/
    │   │   │   │   │   ├── cc.h
    │   │   │   │   │   └── perf.h
    │   │   │   │   └── sys_arch/
    │   │   │   │       └── dynamic/
    │   │   │   │           ├── arch/
    │   │   │   │           │   └── sys_arch.h
    │   │   │   │           └── sys_arch.c
    │   │   │   └── src/
    │   │   │       ├── FILES
    │   │   │       ├── api/
    │   │   │       │   ├── api_lib.c
    │   │   │       │   ├── api_msg.c
    │   │   │       │   ├── err.c
    │   │   │       │   ├── if_api.c
    │   │   │       │   ├── netbuf.c
    │   │   │       │   ├── netdb.c
    │   │   │       │   ├── netifapi.c
    │   │   │       │   ├── sockets.c
    │   │   │       │   └── tcpip.c
    │   │   │       ├── core/
    │   │   │       │   ├── altcp.c
    │   │   │       │   ├── altcp_alloc.c
    │   │   │       │   ├── altcp_tcp.c
    │   │   │       │   ├── def.c
    │   │   │       │   ├── dns.c
    │   │   │       │   ├── inet_chksum.c
    │   │   │       │   ├── init.c
    │   │   │       │   ├── ip.c
    │   │   │       │   ├── ipv4/
    │   │   │       │   │   ├── acd.c
    │   │   │       │   │   ├── autoip.c
    │   │   │       │   │   ├── dhcp.c
    │   │   │       │   │   ├── etharp.c
    │   │   │       │   │   ├── icmp.c
    │   │   │       │   │   ├── igmp.c
    │   │   │       │   │   ├── ip4.c
    │   │   │       │   │   ├── ip4_addr.c
    │   │   │       │   │   └── ip4_frag.c
    │   │   │       │   ├── ipv6/
    │   │   │       │   │   ├── dhcp6.c
    │   │   │       │   │   ├── ethip6.c
    │   │   │       │   │   ├── icmp6.c
    │   │   │       │   │   ├── inet6.c
    │   │   │       │   │   ├── ip6.c
    │   │   │       │   │   ├── ip6_addr.c
    │   │   │       │   │   ├── ip6_frag.c
    │   │   │       │   │   ├── mld6.c
    │   │   │       │   │   └── nd6.c
    │   │   │       │   ├── mem.c
    │   │   │       │   ├── memp.c
    │   │   │       │   ├── netif.c
    │   │   │       │   ├── pbuf.c
    │   │   │       │   ├── raw.c
    │   │   │       │   ├── stats.c
    │   │   │       │   ├── sys.c
    │   │   │       │   ├── tcp.c
    │   │   │       │   ├── tcp_in.c
    │   │   │       │   ├── tcp_out.c
    │   │   │       │   ├── timeouts.c
    │   │   │       │   └── udp.c
    │   │   │       ├── include/
    │   │   │       │   ├── compat/
    │   │   │       │   │   ├── posix/
    │   │   │       │   │   │   ├── arpa/
    │   │   │       │   │   │   │   └── inet.h
    │   │   │       │   │   │   ├── net/
    │   │   │       │   │   │   │   └── if.h
    │   │   │       │   │   │   ├── netdb.h
    │   │   │       │   │   │   └── sys/
    │   │   │       │   │   │       └── socket.h
    │   │   │       │   │   └── stdc/
    │   │   │       │   │       └── errno.h
    │   │   │       │   ├── lwip/
    │   │   │       │   │   ├── acd.h
    │   │   │       │   │   ├── altcp.h
    │   │   │       │   │   ├── altcp_tcp.h
    │   │   │       │   │   ├── altcp_tls.h
    │   │   │       │   │   ├── api.h
    │   │   │       │   │   ├── apps/
    │   │   │       │   │   │   └── lwiperf.h
    │   │   │       │   │   ├── arch.h
    │   │   │       │   │   ├── autoip.h
    │   │   │       │   │   ├── debug.h
    │   │   │       │   │   ├── def.h
    │   │   │       │   │   ├── dhcp.h
    │   │   │       │   │   ├── dhcp6.h
    │   │   │       │   │   ├── dns.h
    │   │   │       │   │   ├── err.h
    │   │   │       │   │   ├── errno.h
    │   │   │       │   │   ├── etharp.h
    │   │   │       │   │   ├── ethip6.h
    │   │   │       │   │   ├── icmp.h
    │   │   │       │   │   ├── icmp6.h
    │   │   │       │   │   ├── if_api.h
    │   │   │       │   │   ├── igmp.h
    │   │   │       │   │   ├── inet.h
    │   │   │       │   │   ├── inet_chksum.h
    │   │   │       │   │   ├── init.h
    │   │   │       │   │   ├── ip.h
    │   │   │       │   │   ├── ip4.h
    │   │   │       │   │   ├── ip4_addr.h
    │   │   │       │   │   ├── ip4_frag.h
    │   │   │       │   │   ├── ip6.h
    │   │   │       │   │   ├── ip6_addr.h
    │   │   │       │   │   ├── ip6_frag.h
    │   │   │       │   │   ├── ip6_zone.h
    │   │   │       │   │   ├── ip_addr.h
    │   │   │       │   │   ├── mem.h
    │   │   │       │   │   ├── memp.h
    │   │   │       │   │   ├── mld6.h
    │   │   │       │   │   ├── nd6.h
    │   │   │       │   │   ├── netbuf.h
    │   │   │       │   │   ├── netdb.h
    │   │   │       │   │   ├── netif.h
    │   │   │       │   │   ├── netifapi.h
    │   │   │       │   │   ├── opt.h
    │   │   │       │   │   ├── pbuf.h
    │   │   │       │   │   ├── priv/
    │   │   │       │   │   │   ├── altcp_priv.h
    │   │   │       │   │   │   ├── api_msg.h
    │   │   │       │   │   │   ├── mem_priv.h
    │   │   │       │   │   │   ├── memp_priv.h
    │   │   │       │   │   │   ├── memp_std.h
    │   │   │       │   │   │   ├── nd6_priv.h
    │   │   │       │   │   │   ├── raw_priv.h
    │   │   │       │   │   │   ├── sockets_priv.h
    │   │   │       │   │   │   ├── tcp_priv.h
    │   │   │       │   │   │   └── tcpip_priv.h
    │   │   │       │   │   ├── prot/
    │   │   │       │   │   │   ├── acd.h
    │   │   │       │   │   │   ├── autoip.h
    │   │   │       │   │   │   ├── dhcp.h
    │   │   │       │   │   │   ├── dhcp6.h
    │   │   │       │   │   │   ├── dns.h
    │   │   │       │   │   │   ├── etharp.h
    │   │   │       │   │   │   ├── ethernet.h
    │   │   │       │   │   │   ├── iana.h
    │   │   │       │   │   │   ├── icmp.h
    │   │   │       │   │   │   ├── icmp6.h
    │   │   │       │   │   │   ├── ieee.h
    │   │   │       │   │   │   ├── igmp.h
    │   │   │       │   │   │   ├── ip.h
    │   │   │       │   │   │   ├── ip4.h
    │   │   │       │   │   │   ├── ip6.h
    │   │   │       │   │   │   ├── mld6.h
    │   │   │       │   │   │   ├── nd6.h
    │   │   │       │   │   │   ├── tcp.h
    │   │   │       │   │   │   └── udp.h
    │   │   │       │   │   ├── raw.h
    │   │   │       │   │   ├── sio.h
    │   │   │       │   │   ├── snmp.h
    │   │   │       │   │   ├── sockets.h
    │   │   │       │   │   ├── stats.h
    │   │   │       │   │   ├── sys.h
    │   │   │       │   │   ├── tcp.h
    │   │   │       │   │   ├── tcpbase.h
    │   │   │       │   │   ├── tcpip.h
    │   │   │       │   │   ├── timeouts.h
    │   │   │       │   │   └── udp.h
    │   │   │       │   └── netif/
    │   │   │       │       ├── bridgeif.h
    │   │   │       │       ├── bridgeif_opts.h
    │   │   │       │       ├── etharp.h
    │   │   │       │       ├── ethernet.h
    │   │   │       │       ├── ieee802154.h
    │   │   │       │       ├── lowpan6.h
    │   │   │       │       ├── lowpan6_ble.h
    │   │   │       │       ├── lowpan6_common.h
    │   │   │       │       ├── lowpan6_opts.h
    │   │   │       │       ├── ppp/
    │   │   │       │       │   ├── ccp.h
    │   │   │       │       │   ├── chap-md5.h
    │   │   │       │       │   ├── chap-new.h
    │   │   │       │       │   ├── chap_ms.h
    │   │   │       │       │   ├── eap.h
    │   │   │       │       │   ├── ecp.h
    │   │   │       │       │   ├── eui64.h
    │   │   │       │       │   ├── fsm.h
    │   │   │       │       │   ├── ipcp.h
    │   │   │       │       │   ├── ipv6cp.h
    │   │   │       │       │   ├── lcp.h
    │   │   │       │       │   ├── magic.h
    │   │   │       │       │   ├── mppe.h
    │   │   │       │       │   ├── polarssl/
    │   │   │       │       │   │   ├── arc4.h
    │   │   │       │       │   │   ├── des.h
    │   │   │       │       │   │   ├── md4.h
    │   │   │       │       │   │   ├── md5.h
    │   │   │       │       │   │   └── sha1.h
    │   │   │       │       │   ├── ppp.h
    │   │   │       │       │   ├── ppp_impl.h
    │   │   │       │       │   ├── ppp_opts.h
    │   │   │       │       │   ├── pppapi.h
    │   │   │       │       │   ├── pppcrypt.h
    │   │   │       │       │   ├── pppdebug.h
    │   │   │       │       │   ├── pppoe.h
    │   │   │       │       │   ├── pppol2tp.h
    │   │   │       │       │   ├── pppos.h
    │   │   │       │       │   ├── upap.h
    │   │   │       │       │   └── vj.h
    │   │   │       │       ├── slipif.h
    │   │   │       │       └── zepif.h
    │   │   │       └── netif/
    │   │   │           ├── FILES
    │   │   │           ├── bridgeif.c
    │   │   │           ├── bridgeif_fdb.c
    │   │   │           ├── ethernet.c
    │   │   │           ├── lowpan6.c
    │   │   │           ├── lowpan6_ble.c
    │   │   │           ├── lowpan6_common.c
    │   │   │           ├── ppp/
    │   │   │           │   ├── PPPD_FOLLOWUP
    │   │   │           │   ├── auth.c
    │   │   │           │   ├── ccp.c
    │   │   │           │   ├── chap-md5.c
    │   │   │           │   ├── chap-new.c
    │   │   │           │   ├── chap_ms.c
    │   │   │           │   ├── demand.c
    │   │   │           │   ├── eap.c
    │   │   │           │   ├── ecp.c
    │   │   │           │   ├── eui64.c
    │   │   │           │   ├── fsm.c
    │   │   │           │   ├── ipcp.c
    │   │   │           │   ├── ipv6cp.c
    │   │   │           │   ├── lcp.c
    │   │   │           │   ├── magic.c
    │   │   │           │   ├── mppe.c
    │   │   │           │   ├── multilink.c
    │   │   │           │   ├── polarssl/
    │   │   │           │   │   ├── README
    │   │   │           │   │   ├── arc4.c
    │   │   │           │   │   ├── des.c
    │   │   │           │   │   ├── md4.c
    │   │   │           │   │   ├── md5.c
    │   │   │           │   │   └── sha1.c
    │   │   │           │   ├── ppp.c
    │   │   │           │   ├── pppapi.c
    │   │   │           │   ├── pppcrypt.c
    │   │   │           │   ├── pppoe.c
    │   │   │           │   ├── pppol2tp.c
    │   │   │           │   ├── pppos.c
    │   │   │           │   ├── upap.c
    │   │   │           │   ├── utils.c
    │   │   │           │   └── vj.c
    │   │   │           ├── slipif.c
    │   │   │           └── zepif.c
    │   │   ├── source/
    │   │   │   ├── FreeRTOSConfig.h
    │   │   │   ├── app_config.h
    │   │   │   ├── lwipopts.h
    │   │   │   ├── lwippools.h
    │   │   │   ├── main.c
    │   │   │   ├── main.c_mg_wifi-style
    │   │   │   ├── mongoose_config.h
    │   │   │   ├── semihost_hardfault.c
    │   │   │   └── wifi_config.h
    │   │   ├── startup/
    │   │   │   └── startup_rw612.c
    │   │   ├── utilities/
    │   │   │   ├── fsl_assert.c
    │   │   │   ├── fsl_assert.h
    │   │   │   ├── fsl_debug_console.c
    │   │   │   ├── fsl_debug_console.h
    │   │   │   ├── fsl_debug_console_conf.h
    │   │   │   ├── fsl_memcpy.S
    │   │   │   ├── fsl_str.c
    │   │   │   └── fsl_str.h
    │   │   └── wifi/
    │   │       ├── CMakeLists.txt
    │   │       ├── ChangeLogKSDK.txt
    │   │       ├── certs/
    │   │       │   ├── ca-cert.h
    │   │       │   ├── client-cert.h
    │   │       │   ├── client-key.h
    │   │       │   ├── dh-param.h
    │   │       │   ├── server-cert.h
    │   │       │   └── server-key.h
    │   │       ├── dhcpd/
    │   │       │   ├── dhcp-bootp.h
    │   │       │   ├── dhcp-priv.h
    │   │       │   ├── dhcp-server-main.c
    │   │       │   ├── dhcp-server.c
    │   │       │   ├── dns-server.c
    │   │       │   └── dns.h
    │   │       ├── incl/
    │   │       │   ├── dhcp-server.h
    │   │       │   ├── nxp_wifi.h
    │   │       │   ├── port/
    │   │       │   │   ├── net/
    │   │       │   │   │   ├── hooks/
    │   │       │   │   │   │   └── lwip_default_hooks.h
    │   │       │   │   │   └── wm_net.h
    │   │       │   │   └── osa/
    │   │       │   │       ├── mem_pool.h
    │   │       │   │       ├── mem_pool_config.h
    │   │       │   │       ├── osa.h
    │   │       │   │       ├── slist.h
    │   │       │   │       └── stack_simple.h
    │   │       │   ├── wifi_cal_data_ext.h
    │   │       │   ├── wifi_config_default.h
    │   │       │   ├── wifidriver/
    │   │       │   │   ├── wifi-decl.h
    │   │       │   │   ├── wifi.h
    │   │       │   │   ├── wifi_events.h
    │   │       │   │   └── wifi_nxp.h
    │   │       │   ├── wlcmgr/
    │   │       │   │   ├── wlan.h
    │   │       │   │   └── wlan_11d.h
    │   │       │   ├── wm_utils.h
    │   │       │   ├── wmerrno.h
    │   │       │   ├── wmlog.h
    │   │       │   ├── wmstats.h
    │   │       │   └── wmtypes.h
    │   │       ├── port/
    │   │       │   ├── net/
    │   │       │   │   ├── hooks/
    │   │       │   │   │   └── lwip_default_hooks.c
    │   │       │   │   ├── net.c
    │   │       │   │   ├── netif_decl.h
    │   │       │   │   └── wifi_netif.c
    │   │       │   └── osa/
    │   │       │       ├── mem_pool.c
    │   │       │       ├── mem_pool_config.c
    │   │       │       ├── osa.c
    │   │       │       ├── osa_freertos.c
    │   │       │       ├── osa_freertos.h
    │   │       │       ├── slist.c
    │   │       │       └── stack_simple.c
    │   │       ├── wifi_bt_firmware/
    │   │       │   └── wlan_bt_fw.h
    │   │       ├── wifidriver/
    │   │       │   ├── incl/
    │   │       │   │   ├── mlan.h
    │   │       │   │   ├── mlan_11ac.h
    │   │       │   │   ├── mlan_11ax.h
    │   │       │   │   ├── mlan_11h.h
    │   │       │   │   ├── mlan_11k.h
    │   │       │   │   ├── mlan_11n.h
    │   │       │   │   ├── mlan_11n_aggr.h
    │   │       │   │   ├── mlan_11n_rxreorder.h
    │   │       │   │   ├── mlan_11v.h
    │   │       │   │   ├── mlan_action.h
    │   │       │   │   ├── mlan_api.h
    │   │       │   │   ├── mlan_decl.h
    │   │       │   │   ├── mlan_fw.h
    │   │       │   │   ├── mlan_ieee.h
    │   │       │   │   ├── mlan_init.h
    │   │       │   │   ├── mlan_ioctl.h
    │   │       │   │   ├── mlan_join.h
    │   │       │   │   ├── mlan_main.h
    │   │       │   │   ├── mlan_mbo.h
    │   │       │   │   ├── mlan_meas.h
    │   │       │   │   ├── mlan_remap_mem_operations.h
    │   │       │   │   ├── mlan_uap.h
    │   │       │   │   ├── mlan_util.h
    │   │       │   │   ├── mlan_wmm.h
    │   │       │   │   └── type_decls.h
    │   │       │   ├── mlan_11ac.c
    │   │       │   ├── mlan_11ax.c
    │   │       │   ├── mlan_11d.c
    │   │       │   ├── mlan_11h.c
    │   │       │   ├── mlan_11k.c
    │   │       │   ├── mlan_11n.c
    │   │       │   ├── mlan_11n_aggr.c
    │   │       │   ├── mlan_11n_rxreorder.c
    │   │       │   ├── mlan_11v.c
    │   │       │   ├── mlan_action.c
    │   │       │   ├── mlan_api.c
    │   │       │   ├── mlan_cfp.c
    │   │       │   ├── mlan_cmdevt.c
    │   │       │   ├── mlan_glue.c
    │   │       │   ├── mlan_init.c
    │   │       │   ├── mlan_join.c
    │   │       │   ├── mlan_mbo.c
    │   │       │   ├── mlan_misc.c
    │   │       │   ├── mlan_scan.c
    │   │       │   ├── mlan_shim.c
    │   │       │   ├── mlan_sta_cmd.c
    │   │       │   ├── mlan_sta_cmdresp.c
    │   │       │   ├── mlan_sta_event.c
    │   │       │   ├── mlan_sta_ioctl.c
    │   │       │   ├── mlan_sta_rx.c
    │   │       │   ├── mlan_txrx.c
    │   │       │   ├── mlan_uap_cmdevent.c
    │   │       │   ├── mlan_uap_ioctl.c
    │   │       │   ├── mlan_wmm.c
    │   │       │   ├── wifi-debug.c
    │   │       │   ├── wifi-debug.h
    │   │       │   ├── wifi-imu.c
    │   │       │   ├── wifi-imu.h
    │   │       │   ├── wifi-internal.h
    │   │       │   ├── wifi-mem.c
    │   │       │   ├── wifi-uap.c
    │   │       │   ├── wifi-wps.c
    │   │       │   ├── wifi.c
    │   │       │   ├── wifi_common.h
    │   │       │   ├── wifi_pwrmgr.c
    │   │       │   └── wpa_supp_if/
    │   │       │       ├── incl/
    │   │       │       │   ├── rtos_wpa_supp_if.h
    │   │       │       │   └── wifi_nxp_internal.h
    │   │       │       ├── rtos_wpa_supp_if.c
    │   │       │       ├── wifi_nxp.c
    │   │       │       └── wifi_nxp_internal.c
    │   │       └── wlcmgr/
    │   │           ├── wlan.c
    │   │           └── wlan_txpwrlimit_cfg.c
    │   ├── nxp-evkbimxrt1050-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-evkmimxrt1020-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-evkmimxrt1024-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-evkmimxrt1060-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-evkmimxrt1064-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-evkmimxrt1160-cm7-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-evkmimxrt1170-cm4-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-evkmimxrt1170-cm7-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-frdmk64f-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-frdmk66f-freertos/
    │   │   └── Makefile
    │   ├── nxp-frdmk66f-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-lpcxpresso54018-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-lpcxpresso54608-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-lpcxpresso54618-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-lpcxpresso54628-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-lpcxpresso54s018m-freertos/
    │   │   └── Makefile
    │   ├── nxp-mimxrt1020-freertos/
    │   │   └── Makefile
    │   ├── nxp-twrk65f180m-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-twrkv58f220m-lwip-freertos/
    │   │   └── Makefile
    │   ├── rt1020-evk-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── link_ram.ld
    │   ├── rt1020-evk-make-freertos-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── link_ram.ld
    │   ├── rt1060-evk-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── link_ram.ld
    │   ├── rt1060-evk-make-freertos-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── link_ram.ld
    │   ├── rt1060-evk-xpresso-baremetal-builtin/
    │   │   ├── .cproject
    │   │   ├── .project
    │   │   ├── .settings/
    │   │   │   ├── language.settings.xml
    │   │   │   └── org.eclipse.core.resources.prefs
    │   │   ├── CMSIS/
    │   │   │   ├── cachel1_armv7.h
    │   │   │   ├── cmsis_compiler.h
    │   │   │   ├── cmsis_gcc.h
    │   │   │   ├── cmsis_version.h
    │   │   │   ├── core_cm7.h
    │   │   │   └── mpu_armv7.h
    │   │   ├── Debug/
    │   │   │   ├── board/
    │   │   │   │   ├── board.su
    │   │   │   │   ├── clock_config.su
    │   │   │   │   ├── dcd.su
    │   │   │   │   ├── peripherals.su
    │   │   │   │   ├── pin_mux.su
    │   │   │   │   └── subdir.mk
    │   │   │   ├── component/
    │   │   │   │   ├── lists/
    │   │   │   │   │   ├── fsl_component_generic_list.su
    │   │   │   │   │   └── subdir.mk
    │   │   │   │   ├── serial_manager/
    │   │   │   │   │   ├── fsl_component_serial_manager.su
    │   │   │   │   │   ├── fsl_component_serial_port_uart.su
    │   │   │   │   │   └── subdir.mk
    │   │   │   │   └── uart/
    │   │   │   │       ├── fsl_adapter_lpuart.su
    │   │   │   │       └── subdir.mk
    │   │   │   ├── device/
    │   │   │   │   ├── subdir.mk
    │   │   │   │   └── system_MIMXRT1062.su
    │   │   │   ├── drivers/
    │   │   │   │   ├── fsl_clock.su
    │   │   │   │   ├── fsl_common.su
    │   │   │   │   ├── fsl_common_arm.su
    │   │   │   │   ├── fsl_gpio.su
    │   │   │   │   ├── fsl_lpuart.su
    │   │   │   │   ├── fsl_trng.su
    │   │   │   │   └── subdir.mk
    │   │   │   ├── makefile
    │   │   │   ├── rt1060-evk-xpresso-baremetal-builtin_Debug.ld
    │   │   │   ├── rt1060-evk-xpresso-baremetal-builtin_Debug_library.ld
    │   │   │   ├── rt1060-evk-xpresso-baremetal-builtin_Debug_memory.ld
    │   │   │   ├── sources.mk
    │   │   │   ├── startup/
    │   │   │   │   ├── startup_mimxrt1062.su
    │   │   │   │   └── subdir.mk
    │   │   │   ├── utilities/
    │   │   │   │   ├── fsl_assert.su
    │   │   │   │   ├── fsl_debug_console.su
    │   │   │   │   ├── fsl_str.su
    │   │   │   │   └── subdir.mk
    │   │   │   └── xip/
    │   │   │       ├── evkbmimxrt1060_flexspi_nor_config.su
    │   │   │       ├── fsl_flexspi_nor_boot.su
    │   │   │       └── subdir.mk
    │   │   ├── Test/
    │   │   │   ├── board/
    │   │   │   │   ├── board.su
    │   │   │   │   ├── clock_config.su
    │   │   │   │   ├── dcd.su
    │   │   │   │   ├── peripherals.su
    │   │   │   │   ├── pin_mux.su
    │   │   │   │   └── subdir.mk
    │   │   │   ├── component/
    │   │   │   │   ├── lists/
    │   │   │   │   │   ├── fsl_component_generic_list.su
    │   │   │   │   │   └── subdir.mk
    │   │   │   │   ├── serial_manager/
    │   │   │   │   │   ├── fsl_component_serial_manager.su
    │   │   │   │   │   ├── fsl_component_serial_port_uart.su
    │   │   │   │   │   └── subdir.mk
    │   │   │   │   └── uart/
    │   │   │   │       ├── fsl_adapter_lpuart.su
    │   │   │   │       └── subdir.mk
    │   │   │   ├── device/
    │   │   │   │   ├── subdir.mk
    │   │   │   │   └── system_MIMXRT1062.su
    │   │   │   ├── drivers/
    │   │   │   │   ├── fsl_clock.su
    │   │   │   │   ├── fsl_common.su
    │   │   │   │   ├── fsl_common_arm.su
    │   │   │   │   ├── fsl_gpio.su
    │   │   │   │   ├── fsl_lpuart.su
    │   │   │   │   ├── fsl_trng.su
    │   │   │   │   └── subdir.mk
    │   │   │   ├── makefile
    │   │   │   ├── rt1060-evk-xpresso-baremetal-builtin_Debug.ld
    │   │   │   ├── rt1060-evk-xpresso-baremetal-builtin_Debug_library.ld
    │   │   │   ├── rt1060-evk-xpresso-baremetal-builtin_Debug_memory.ld
    │   │   │   ├── sources.mk
    │   │   │   ├── startup/
    │   │   │   │   ├── startup_mimxrt1062.su
    │   │   │   │   └── subdir.mk
    │   │   │   ├── utilities/
    │   │   │   │   ├── fsl_assert.su
    │   │   │   │   ├── fsl_debug_console.su
    │   │   │   │   ├── fsl_str.su
    │   │   │   │   └── subdir.mk
    │   │   │   └── xip/
    │   │   │       ├── evkbmimxrt1060_flexspi_nor_config.su
    │   │   │       ├── fsl_flexspi_nor_boot.su
    │   │   │       └── subdir.mk
    │   │   ├── board/
    │   │   │   ├── board.c
    │   │   │   ├── board.h
    │   │   │   ├── clock_config.c
    │   │   │   ├── clock_config.h
    │   │   │   ├── dcd.c
    │   │   │   ├── dcd.h
    │   │   │   ├── peripherals.c
    │   │   │   ├── peripherals.h
    │   │   │   ├── pin_mux.c
    │   │   │   └── pin_mux.h
    │   │   ├── component/
    │   │   │   ├── lists/
    │   │   │   │   ├── fsl_component_generic_list.c
    │   │   │   │   └── fsl_component_generic_list.h
    │   │   │   ├── serial_manager/
    │   │   │   │   ├── fsl_component_serial_manager.c
    │   │   │   │   ├── fsl_component_serial_manager.h
    │   │   │   │   ├── fsl_component_serial_port_internal.h
    │   │   │   │   ├── fsl_component_serial_port_uart.c
    │   │   │   │   └── fsl_component_serial_port_uart.h
    │   │   │   └── uart/
    │   │   │       ├── fsl_adapter_lpuart.c
    │   │   │       └── fsl_adapter_uart.h
    │   │   ├── device/
    │   │   │   ├── MIMXRT1062.h
    │   │   │   ├── MIMXRT1062_features.h
    │   │   │   ├── fsl_device_registers.h
    │   │   │   ├── system_MIMXRT1062.c
    │   │   │   └── system_MIMXRT1062.h
    │   │   ├── drivers/
    │   │   │   ├── fsl_clock.c
    │   │   │   ├── fsl_clock.h
    │   │   │   ├── fsl_common.c
    │   │   │   ├── fsl_common.h
    │   │   │   ├── fsl_common_arm.c
    │   │   │   ├── fsl_common_arm.h
    │   │   │   ├── fsl_gpio.c
    │   │   │   ├── fsl_gpio.h
    │   │   │   ├── fsl_iomuxc.h
    │   │   │   ├── fsl_lpuart.c
    │   │   │   ├── fsl_lpuart.h
    │   │   │   ├── fsl_nic301.h
    │   │   │   ├── fsl_trng.c
    │   │   │   └── fsl_trng.h
    │   │   ├── middleware/
    │   │   │   └── bm/
    │   │   │       └── readme.txt
    │   │   ├── rt1060-evk-xpresso-baremetal-builtin.mex
    │   │   ├── source/
    │   │   │   ├── hal.h
    │   │   │   ├── main.c
    │   │   │   ├── mongoose_config.h
    │   │   │   └── syscalls.c
    │   │   ├── startup/
    │   │   │   └── startup_mimxrt1062.c
    │   │   ├── utilities/
    │   │   │   ├── fsl_assert.c
    │   │   │   ├── fsl_debug_console.c
    │   │   │   ├── fsl_debug_console.h
    │   │   │   ├── fsl_debug_console_conf.h
    │   │   │   ├── fsl_str.c
    │   │   │   └── fsl_str.h
    │   │   └── xip/
    │   │       ├── evkbmimxrt1060_flexspi_nor_config.c
    │   │       ├── evkbmimxrt1060_flexspi_nor_config.h
    │   │       ├── fsl_flexspi_nor_boot.c
    │   │       └── fsl_flexspi_nor_boot.h
    │   ├── rt1170-evk-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── link_ram.ld
    │   │   └── mbedtls_config.h
    │   └── rt1170-evk-make-freertos-builtin/
    │       ├── Makefile
    │       ├── README.md
    │       └── link_ram.ld
    ├── pico-sdk/
    │   ├── pico-2-w-picosdk-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── pico-2-w-picosdk-baremetal-builtin-ap/
    │   │   ├── CMakeLists.txt
    │   │   ├── Makefile
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── pico_sdk_import.cmake
    │   ├── pico-2-w-picosdk-freertos-lwip/
    │   │   ├── CMakeLists.txt
    │   │   ├── FreeRTOSConfig.h
    │   │   ├── FreeRTOS_Kernel_import.cmake
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── lwipopts.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── pico_sdk_import.cmake
    │   ├── pico-rmii/
    │   │   ├── CMakeLists.txt
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── driver_rp2040_rmii.c
    │   │   ├── driver_rp2040_rmii.h
    │   │   ├── main.c
    │   │   └── mongoose_config.h
    │   ├── pico-rndis-dashboard/
    │   │   ├── CMakeLists.txt
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   ├── msc_disk.c
    │   │   ├── netif/
    │   │   │   └── ethernet.h
    │   │   ├── tusb_config.h
    │   │   └── usb_descriptors.c
    │   ├── pico-rndis-device/
    │   │   ├── CMakeLists.txt
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   ├── netif/
    │   │   │   └── ethernet.h
    │   │   ├── tusb_config.h
    │   │   └── usb_descriptors.c
    │   ├── pico-w-picosdk-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── pico-w-picosdk-freertos-lwip/
    │   │   ├── CMakeLists.txt
    │   │   ├── FreeRTOSConfig.h
    │   │   ├── FreeRTOS_Kernel_import.cmake
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── lwipopts.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── pico_sdk_import.cmake
    │   ├── rm2-pico-picosdk-baremetal-builtin/
    │   │   ├── CMakeLists.txt
    │   │   ├── Makefile
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── pico_sdk_import.cmake
    │   ├── w5500-evb-pico-picosdk-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── w5500-evb-pico2-picosdk-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   └── w55rp20-evb-pico-picosdk-baremetal-builtin/
    │       ├── CMakeLists.txt
    │       ├── Makefile
    │       ├── hal.h
    │       ├── main.c
    │       ├── mongoose_config.h
    │       └── pico_sdk_import.cmake
    ├── renesas/
    │   └── ek-ra6m4-make-baremetal-builtin/
    │       ├── Makefile
    │       ├── hal.c
    │       ├── hal.h
    │       ├── link.ld
    │       ├── main.c
    │       └── mongoose_config.h
    ├── smtp/
    │   ├── README.md
    │   └── smtp-client/
    │       ├── Makefile
    │       ├── README.md
    │       └── main.c
    ├── stm32/
    │   ├── nucleo-f429zi-cube-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── nucleo-f429zi-cube-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── nucleo-f429zi-cube-freertos-lwip/
    │   │   ├── .cproject
    │   │   ├── .mxproject
    │   │   ├── .project
    │   │   ├── .settings/
    │   │   │   ├── com.st.stm32cube.ide.mcu.sfrview.prefs
    │   │   │   ├── language.settings.xml
    │   │   │   ├── org.eclipse.cdt.core.prefs
    │   │   │   └── stm32cubeide.project.prefs
    │   │   ├── Core/
    │   │   │   ├── Inc/
    │   │   │   │   ├── FreeRTOSConfig.h
    │   │   │   │   ├── hal.h
    │   │   │   │   ├── main.h
    │   │   │   │   ├── mongoose_config.h
    │   │   │   │   ├── stm32f4xx_hal_conf.h
    │   │   │   │   └── stm32f4xx_it.h
    │   │   │   ├── Src/
    │   │   │   │   ├── freertos.c
    │   │   │   │   ├── main.c
    │   │   │   │   ├── stm32f4xx_hal_msp.c
    │   │   │   │   ├── stm32f4xx_hal_timebase_tim.c
    │   │   │   │   ├── stm32f4xx_it.c
    │   │   │   │   ├── syscalls.c
    │   │   │   │   ├── sysmem.c
    │   │   │   │   └── system_stm32f4xx.c
    │   │   │   └── Startup/
    │   │   │       └── startup_stm32f429zitx.s
    │   │   ├── Drivers/
    │   │   │   ├── BSP/
    │   │   │   │   └── Components/
    │   │   │   │       └── lan8742/
    │   │   │   │           ├── lan8742.c
    │   │   │   │           └── lan8742.h
    │   │   │   ├── CMSIS/
    │   │   │   │   ├── Device/
    │   │   │   │   │   └── ST/
    │   │   │   │   │       └── STM32F4xx/
    │   │   │   │   │           ├── Include/
    │   │   │   │   │           │   ├── stm32f429xx.h
    │   │   │   │   │           │   ├── stm32f4xx.h
    │   │   │   │   │           │   └── system_stm32f4xx.h
    │   │   │   │   │           └── LICENSE.txt
    │   │   │   │   ├── Include/
    │   │   │   │   │   ├── cmsis_armcc.h
    │   │   │   │   │   ├── cmsis_armclang.h
    │   │   │   │   │   ├── cmsis_compiler.h
    │   │   │   │   │   ├── cmsis_gcc.h
    │   │   │   │   │   ├── cmsis_iccarm.h
    │   │   │   │   │   ├── cmsis_version.h
    │   │   │   │   │   ├── core_armv8mbl.h
    │   │   │   │   │   ├── core_armv8mml.h
    │   │   │   │   │   ├── core_cm0.h
    │   │   │   │   │   ├── core_cm0plus.h
    │   │   │   │   │   ├── core_cm1.h
    │   │   │   │   │   ├── core_cm23.h
    │   │   │   │   │   ├── core_cm3.h
    │   │   │   │   │   ├── core_cm33.h
    │   │   │   │   │   ├── core_cm4.h
    │   │   │   │   │   ├── core_cm7.h
    │   │   │   │   │   ├── core_sc000.h
    │   │   │   │   │   ├── core_sc300.h
    │   │   │   │   │   ├── mpu_armv7.h
    │   │   │   │   │   ├── mpu_armv8.h
    │   │   │   │   │   └── tz_context.h
    │   │   │   │   └── LICENSE.txt
    │   │   │   └── STM32F4xx_HAL_Driver/
    │   │   │       ├── Inc/
    │   │   │       │   ├── Legacy/
    │   │   │       │   │   └── stm32_hal_legacy.h
    │   │   │       │   ├── stm32f4xx_hal.h
    │   │   │       │   ├── stm32f4xx_hal_cortex.h
    │   │   │       │   ├── stm32f4xx_hal_def.h
    │   │   │       │   ├── stm32f4xx_hal_dma.h
    │   │   │       │   ├── stm32f4xx_hal_dma_ex.h
    │   │   │       │   ├── stm32f4xx_hal_eth.h
    │   │   │       │   ├── stm32f4xx_hal_exti.h
    │   │   │       │   ├── stm32f4xx_hal_flash.h
    │   │   │       │   ├── stm32f4xx_hal_flash_ex.h
    │   │   │       │   ├── stm32f4xx_hal_flash_ramfunc.h
    │   │   │       │   ├── stm32f4xx_hal_gpio.h
    │   │   │       │   ├── stm32f4xx_hal_gpio_ex.h
    │   │   │       │   ├── stm32f4xx_hal_pwr.h
    │   │   │       │   ├── stm32f4xx_hal_pwr_ex.h
    │   │   │       │   ├── stm32f4xx_hal_rcc.h
    │   │   │       │   ├── stm32f4xx_hal_rcc_ex.h
    │   │   │       │   ├── stm32f4xx_hal_rng.h
    │   │   │       │   ├── stm32f4xx_hal_tim.h
    │   │   │       │   ├── stm32f4xx_hal_tim_ex.h
    │   │   │       │   ├── stm32f4xx_hal_uart.h
    │   │   │       │   ├── stm32f4xx_ll_bus.h
    │   │   │       │   ├── stm32f4xx_ll_cortex.h
    │   │   │       │   ├── stm32f4xx_ll_dma.h
    │   │   │       │   ├── stm32f4xx_ll_exti.h
    │   │   │       │   ├── stm32f4xx_ll_gpio.h
    │   │   │       │   ├── stm32f4xx_ll_pwr.h
    │   │   │       │   ├── stm32f4xx_ll_rcc.h
    │   │   │       │   ├── stm32f4xx_ll_rng.h
    │   │   │       │   ├── stm32f4xx_ll_system.h
    │   │   │       │   ├── stm32f4xx_ll_usart.h
    │   │   │       │   └── stm32f4xx_ll_utils.h
    │   │   │       ├── LICENSE.txt
    │   │   │       └── Src/
    │   │   │           ├── stm32f4xx_hal.c
    │   │   │           ├── stm32f4xx_hal_cortex.c
    │   │   │           ├── stm32f4xx_hal_dma.c
    │   │   │           ├── stm32f4xx_hal_dma_ex.c
    │   │   │           ├── stm32f4xx_hal_eth.c
    │   │   │           ├── stm32f4xx_hal_exti.c
    │   │   │           ├── stm32f4xx_hal_flash.c
    │   │   │           ├── stm32f4xx_hal_flash_ex.c
    │   │   │           ├── stm32f4xx_hal_flash_ramfunc.c
    │   │   │           ├── stm32f4xx_hal_gpio.c
    │   │   │           ├── stm32f4xx_hal_pwr.c
    │   │   │           ├── stm32f4xx_hal_pwr_ex.c
    │   │   │           ├── stm32f4xx_hal_rcc.c
    │   │   │           ├── stm32f4xx_hal_rcc_ex.c
    │   │   │           ├── stm32f4xx_hal_rng.c
    │   │   │           ├── stm32f4xx_hal_tim.c
    │   │   │           ├── stm32f4xx_hal_tim_ex.c
    │   │   │           └── stm32f4xx_hal_uart.c
    │   │   ├── LWIP/
    │   │   │   ├── App/
    │   │   │   │   ├── lwip.c
    │   │   │   │   └── lwip.h
    │   │   │   └── Target/
    │   │   │       ├── ethernetif.c
    │   │   │       ├── ethernetif.h
    │   │   │       └── lwipopts.h
    │   │   ├── Middlewares/
    │   │   │   └── Third_Party/
    │   │   │       ├── FreeRTOS/
    │   │   │       │   └── Source/
    │   │   │       │       ├── CMSIS_RTOS/
    │   │   │       │       │   ├── cmsis_os.c
    │   │   │       │       │   └── cmsis_os.h
    │   │   │       │       ├── LICENSE
    │   │   │       │       ├── croutine.c
    │   │   │       │       ├── event_groups.c
    │   │   │       │       ├── include/
    │   │   │       │       │   ├── FreeRTOS.h
    │   │   │       │       │   ├── StackMacros.h
    │   │   │       │       │   ├── atomic.h
    │   │   │       │       │   ├── croutine.h
    │   │   │       │       │   ├── deprecated_definitions.h
    │   │   │       │       │   ├── event_groups.h
    │   │   │       │       │   ├── list.h
    │   │   │       │       │   ├── message_buffer.h
    │   │   │       │       │   ├── mpu_prototypes.h
    │   │   │       │       │   ├── mpu_wrappers.h
    │   │   │       │       │   ├── portable.h
    │   │   │       │       │   ├── projdefs.h
    │   │   │       │       │   ├── queue.h
    │   │   │       │       │   ├── semphr.h
    │   │   │       │       │   ├── stack_macros.h
    │   │   │       │       │   ├── stream_buffer.h
    │   │   │       │       │   ├── task.h
    │   │   │       │       │   └── timers.h
    │   │   │       │       ├── list.c
    │   │   │       │       ├── portable/
    │   │   │       │       │   ├── GCC/
    │   │   │       │       │   │   └── ARM_CM4F/
    │   │   │       │       │   │       ├── port.c
    │   │   │       │       │   │       └── portmacro.h
    │   │   │       │       │   └── MemMang/
    │   │   │       │       │       └── heap_4.c
    │   │   │       │       ├── queue.c
    │   │   │       │       ├── stream_buffer.c
    │   │   │       │       ├── tasks.c
    │   │   │       │       └── timers.c
    │   │   │       └── LwIP/
    │   │   │           ├── src/
    │   │   │           │   ├── api/
    │   │   │           │   │   ├── api_lib.c
    │   │   │           │   │   ├── api_msg.c
    │   │   │           │   │   ├── err.c
    │   │   │           │   │   ├── if_api.c
    │   │   │           │   │   ├── netbuf.c
    │   │   │           │   │   ├── netdb.c
    │   │   │           │   │   ├── netifapi.c
    │   │   │           │   │   ├── sockets.c
    │   │   │           │   │   └── tcpip.c
    │   │   │           │   ├── apps/
    │   │   │           │   │   └── mqtt/
    │   │   │           │   │       └── mqtt.c
    │   │   │           │   ├── core/
    │   │   │           │   │   ├── altcp.c
    │   │   │           │   │   ├── altcp_alloc.c
    │   │   │           │   │   ├── altcp_tcp.c
    │   │   │           │   │   ├── def.c
    │   │   │           │   │   ├── dns.c
    │   │   │           │   │   ├── inet_chksum.c
    │   │   │           │   │   ├── init.c
    │   │   │           │   │   ├── ip.c
    │   │   │           │   │   ├── ipv4/
    │   │   │           │   │   │   ├── autoip.c
    │   │   │           │   │   │   ├── dhcp.c
    │   │   │           │   │   │   ├── etharp.c
    │   │   │           │   │   │   ├── icmp.c
    │   │   │           │   │   │   ├── igmp.c
    │   │   │           │   │   │   ├── ip4.c
    │   │   │           │   │   │   ├── ip4_addr.c
    │   │   │           │   │   │   └── ip4_frag.c
    │   │   │           │   │   ├── ipv6/
    │   │   │           │   │   │   ├── dhcp6.c
    │   │   │           │   │   │   ├── ethip6.c
    │   │   │           │   │   │   ├── icmp6.c
    │   │   │           │   │   │   ├── inet6.c
    │   │   │           │   │   │   ├── ip6.c
    │   │   │           │   │   │   ├── ip6_addr.c
    │   │   │           │   │   │   ├── ip6_frag.c
    │   │   │           │   │   │   ├── mld6.c
    │   │   │           │   │   │   └── nd6.c
    │   │   │           │   │   ├── mem.c
    │   │   │           │   │   ├── memp.c
    │   │   │           │   │   ├── netif.c
    │   │   │           │   │   ├── pbuf.c
    │   │   │           │   │   ├── raw.c
    │   │   │           │   │   ├── stats.c
    │   │   │           │   │   ├── sys.c
    │   │   │           │   │   ├── tcp.c
    │   │   │           │   │   ├── tcp_in.c
    │   │   │           │   │   ├── tcp_out.c
    │   │   │           │   │   ├── timeouts.c
    │   │   │           │   │   └── udp.c
    │   │   │           │   ├── include/
    │   │   │           │   │   ├── compat/
    │   │   │           │   │   │   ├── posix/
    │   │   │           │   │   │   │   ├── arpa/
    │   │   │           │   │   │   │   │   └── inet.h
    │   │   │           │   │   │   │   ├── net/
    │   │   │           │   │   │   │   │   └── if.h
    │   │   │           │   │   │   │   ├── netdb.h
    │   │   │           │   │   │   │   └── sys/
    │   │   │           │   │   │   │       └── socket.h
    │   │   │           │   │   │   └── stdc/
    │   │   │           │   │   │       └── errno.h
    │   │   │           │   │   ├── lwip/
    │   │   │           │   │   │   ├── altcp.h
    │   │   │           │   │   │   ├── altcp_tcp.h
    │   │   │           │   │   │   ├── altcp_tls.h
    │   │   │           │   │   │   ├── api.h
    │   │   │           │   │   │   ├── apps/
    │   │   │           │   │   │   │   ├── altcp_proxyconnect.h
    │   │   │           │   │   │   │   ├── altcp_tls_mbedtls_opts.h
    │   │   │           │   │   │   │   ├── fs.h
    │   │   │           │   │   │   │   ├── http_client.h
    │   │   │           │   │   │   │   ├── httpd.h
    │   │   │           │   │   │   │   ├── httpd_opts.h
    │   │   │           │   │   │   │   ├── lwiperf.h
    │   │   │           │   │   │   │   ├── mdns.h
    │   │   │           │   │   │   │   ├── mdns_opts.h
    │   │   │           │   │   │   │   ├── mdns_priv.h
    │   │   │           │   │   │   │   ├── mqtt.h
    │   │   │           │   │   │   │   ├── mqtt_opts.h
    │   │   │           │   │   │   │   ├── mqtt_priv.h
    │   │   │           │   │   │   │   ├── netbiosns.h
    │   │   │           │   │   │   │   ├── netbiosns_opts.h
    │   │   │           │   │   │   │   ├── smtp.h
    │   │   │           │   │   │   │   ├── smtp_opts.h
    │   │   │           │   │   │   │   ├── snmp.h
    │   │   │           │   │   │   │   ├── snmp_core.h
    │   │   │           │   │   │   │   ├── snmp_mib2.h
    │   │   │           │   │   │   │   ├── snmp_opts.h
    │   │   │           │   │   │   │   ├── snmp_scalar.h
    │   │   │           │   │   │   │   ├── snmp_snmpv2_framework.h
    │   │   │           │   │   │   │   ├── snmp_snmpv2_usm.h
    │   │   │           │   │   │   │   ├── snmp_table.h
    │   │   │           │   │   │   │   ├── snmp_threadsync.h
    │   │   │           │   │   │   │   ├── snmpv3.h
    │   │   │           │   │   │   │   ├── sntp.h
    │   │   │           │   │   │   │   ├── sntp_opts.h
    │   │   │           │   │   │   │   ├── tftp_opts.h
    │   │   │           │   │   │   │   └── tftp_server.h
    │   │   │           │   │   │   ├── arch.h
    │   │   │           │   │   │   ├── autoip.h
    │   │   │           │   │   │   ├── debug.h
    │   │   │           │   │   │   ├── def.h
    │   │   │           │   │   │   ├── dhcp.h
    │   │   │           │   │   │   ├── dhcp6.h
    │   │   │           │   │   │   ├── dns.h
    │   │   │           │   │   │   ├── err.h
    │   │   │           │   │   │   ├── errno.h
    │   │   │           │   │   │   ├── etharp.h
    │   │   │           │   │   │   ├── ethip6.h
    │   │   │           │   │   │   ├── icmp.h
    │   │   │           │   │   │   ├── icmp6.h
    │   │   │           │   │   │   ├── if_api.h
    │   │   │           │   │   │   ├── igmp.h
    │   │   │           │   │   │   ├── inet.h
    │   │   │           │   │   │   ├── inet_chksum.h
    │   │   │           │   │   │   ├── init.h
    │   │   │           │   │   │   ├── ip.h
    │   │   │           │   │   │   ├── ip4.h
    │   │   │           │   │   │   ├── ip4_addr.h
    │   │   │           │   │   │   ├── ip4_frag.h
    │   │   │           │   │   │   ├── ip6.h
    │   │   │           │   │   │   ├── ip6_addr.h
    │   │   │           │   │   │   ├── ip6_frag.h
    │   │   │           │   │   │   ├── ip6_zone.h
    │   │   │           │   │   │   ├── ip_addr.h
    │   │   │           │   │   │   ├── mem.h
    │   │   │           │   │   │   ├── memp.h
    │   │   │           │   │   │   ├── mld6.h
    │   │   │           │   │   │   ├── nd6.h
    │   │   │           │   │   │   ├── netbuf.h
    │   │   │           │   │   │   ├── netdb.h
    │   │   │           │   │   │   ├── netif.h
    │   │   │           │   │   │   ├── netifapi.h
    │   │   │           │   │   │   ├── opt.h
    │   │   │           │   │   │   ├── pbuf.h
    │   │   │           │   │   │   ├── priv/
    │   │   │           │   │   │   │   ├── altcp_priv.h
    │   │   │           │   │   │   │   ├── api_msg.h
    │   │   │           │   │   │   │   ├── mem_priv.h
    │   │   │           │   │   │   │   ├── memp_priv.h
    │   │   │           │   │   │   │   ├── memp_std.h
    │   │   │           │   │   │   │   ├── nd6_priv.h
    │   │   │           │   │   │   │   ├── raw_priv.h
    │   │   │           │   │   │   │   ├── sockets_priv.h
    │   │   │           │   │   │   │   ├── tcp_priv.h
    │   │   │           │   │   │   │   └── tcpip_priv.h
    │   │   │           │   │   │   ├── prot/
    │   │   │           │   │   │   │   ├── autoip.h
    │   │   │           │   │   │   │   ├── dhcp.h
    │   │   │           │   │   │   │   ├── dhcp6.h
    │   │   │           │   │   │   │   ├── dns.h
    │   │   │           │   │   │   │   ├── etharp.h
    │   │   │           │   │   │   │   ├── ethernet.h
    │   │   │           │   │   │   │   ├── iana.h
    │   │   │           │   │   │   │   ├── icmp.h
    │   │   │           │   │   │   │   ├── icmp6.h
    │   │   │           │   │   │   │   ├── ieee.h
    │   │   │           │   │   │   │   ├── igmp.h
    │   │   │           │   │   │   │   ├── ip.h
    │   │   │           │   │   │   │   ├── ip4.h
    │   │   │           │   │   │   │   ├── ip6.h
    │   │   │           │   │   │   │   ├── mld6.h
    │   │   │           │   │   │   │   ├── nd6.h
    │   │   │           │   │   │   │   ├── tcp.h
    │   │   │           │   │   │   │   └── udp.h
    │   │   │           │   │   │   ├── raw.h
    │   │   │           │   │   │   ├── sio.h
    │   │   │           │   │   │   ├── snmp.h
    │   │   │           │   │   │   ├── sockets.h
    │   │   │           │   │   │   ├── stats.h
    │   │   │           │   │   │   ├── sys.h
    │   │   │           │   │   │   ├── tcp.h
    │   │   │           │   │   │   ├── tcpbase.h
    │   │   │           │   │   │   ├── tcpip.h
    │   │   │           │   │   │   ├── timeouts.h
    │   │   │           │   │   │   └── udp.h
    │   │   │           │   │   └── netif/
    │   │   │           │   │       ├── bridgeif.h
    │   │   │           │   │       ├── bridgeif_opts.h
    │   │   │           │   │       ├── etharp.h
    │   │   │           │   │       ├── ethernet.h
    │   │   │           │   │       ├── ieee802154.h
    │   │   │           │   │       ├── lowpan6.h
    │   │   │           │   │       ├── lowpan6_ble.h
    │   │   │           │   │       ├── lowpan6_common.h
    │   │   │           │   │       ├── lowpan6_opts.h
    │   │   │           │   │       ├── ppp/
    │   │   │           │   │       │   ├── ccp.h
    │   │   │           │   │       │   ├── chap-md5.h
    │   │   │           │   │       │   ├── chap-new.h
    │   │   │           │   │       │   ├── chap_ms.h
    │   │   │           │   │       │   ├── eap.h
    │   │   │           │   │       │   ├── ecp.h
    │   │   │           │   │       │   ├── eui64.h
    │   │   │           │   │       │   ├── fsm.h
    │   │   │           │   │       │   ├── ipcp.h
    │   │   │           │   │       │   ├── ipv6cp.h
    │   │   │           │   │       │   ├── lcp.h
    │   │   │           │   │       │   ├── magic.h
    │   │   │           │   │       │   ├── mppe.h
    │   │   │           │   │       │   ├── ppp.h
    │   │   │           │   │       │   ├── ppp_impl.h
    │   │   │           │   │       │   ├── ppp_opts.h
    │   │   │           │   │       │   ├── pppapi.h
    │   │   │           │   │       │   ├── pppcrypt.h
    │   │   │           │   │       │   ├── pppdebug.h
    │   │   │           │   │       │   ├── pppoe.h
    │   │   │           │   │       │   ├── pppol2tp.h
    │   │   │           │   │       │   ├── pppos.h
    │   │   │           │   │       │   ├── upap.h
    │   │   │           │   │       │   └── vj.h
    │   │   │           │   │       ├── slipif.h
    │   │   │           │   │       └── zepif.h
    │   │   │           │   └── netif/
    │   │   │           │       ├── bridgeif.c
    │   │   │           │       ├── bridgeif_fdb.c
    │   │   │           │       ├── ethernet.c
    │   │   │           │       ├── lowpan6.c
    │   │   │           │       ├── lowpan6_ble.c
    │   │   │           │       ├── lowpan6_common.c
    │   │   │           │       ├── ppp/
    │   │   │           │       │   ├── auth.c
    │   │   │           │       │   ├── ccp.c
    │   │   │           │       │   ├── chap-md5.c
    │   │   │           │       │   ├── chap-new.c
    │   │   │           │       │   ├── chap_ms.c
    │   │   │           │       │   ├── demand.c
    │   │   │           │       │   ├── eap.c
    │   │   │           │       │   ├── ecp.c
    │   │   │           │       │   ├── eui64.c
    │   │   │           │       │   ├── fsm.c
    │   │   │           │       │   ├── ipcp.c
    │   │   │           │       │   ├── ipv6cp.c
    │   │   │           │       │   ├── lcp.c
    │   │   │           │       │   ├── magic.c
    │   │   │           │       │   ├── mppe.c
    │   │   │           │       │   ├── multilink.c
    │   │   │           │       │   ├── ppp.c
    │   │   │           │       │   ├── pppapi.c
    │   │   │           │       │   ├── pppcrypt.c
    │   │   │           │       │   ├── pppoe.c
    │   │   │           │       │   ├── pppol2tp.c
    │   │   │           │       │   ├── pppos.c
    │   │   │           │       │   ├── upap.c
    │   │   │           │       │   ├── utils.c
    │   │   │           │       │   └── vj.c
    │   │   │           │       ├── slipif.c
    │   │   │           │       └── zepif.c
    │   │   │           └── system/
    │   │   │               ├── OS/
    │   │   │               │   └── sys_arch.c
    │   │   │               └── arch/
    │   │   │                   ├── bpstruct.h
    │   │   │                   ├── cc.h
    │   │   │                   ├── cpu.h
    │   │   │                   ├── epstruct.h
    │   │   │                   ├── init.h
    │   │   │                   ├── lib.h
    │   │   │                   ├── perf.h
    │   │   │                   └── sys_arch.h
    │   │   ├── README.md
    │   │   ├── STM32F429ZITX_FLASH.ld
    │   │   ├── STM32F429ZITX_RAM.ld
    │   │   ├── nucleo-f429zi-cube-freertos-lwip.ioc
    │   │   └── nucleo-f429zi-cube-freertos-lwip.launch
    │   ├── nucleo-f429zi-keil-baremetal/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F429ZITx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f4xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f4xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f4xx_hal_msp.c
    │   │   │   │   │   │       └── stm32f4xx_it.c
    │   │   │   │   │   ├── startup_stm32f429xx.s
    │   │   │   │   │   └── system_stm32f4xx.c
    │   │   │   │   └── project.script
    │   │   │   ├── _Target_1/
    │   │   │   │   ├── Pre_Include_Global.h
    │   │   │   │   └── RTE_Components.h
    │   │   │   └── _Test/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f429zi-keil-freertos/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F429ZITx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f4xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f4xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f4xx_hal_msp.c
    │   │   │   │   │   │       └── stm32f4xx_it.c
    │   │   │   │   │   ├── startup_stm32f429xx.s
    │   │   │   │   │   └── system_stm32f4xx.c
    │   │   │   │   └── project.script
    │   │   │   ├── RTOS/
    │   │   │   │   └── FreeRTOSConfig.h
    │   │   │   ├── _Target_1/
    │   │   │   │   ├── Pre_Include_Global.h
    │   │   │   │   └── RTE_Components.h
    │   │   │   └── _Test/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f429zi-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── nucleo-f429zi-make-baremetal-builtin-rndis/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── hal.h
    │   │   ├── link.ld
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   ├── netif/
    │   │   │   └── ethernet.h
    │   │   ├── syscalls.c
    │   │   ├── sysinit.c
    │   │   ├── tusb_config.h
    │   │   └── usb_descriptors.c
    │   ├── nucleo-f429zi-make-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── nucleo-f746zg-cube-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── nucleo-f746zg-cube-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── nucleo-f746zg-cube-freertos-lwip/
    │   │   ├── .cproject
    │   │   ├── .mxproject
    │   │   ├── .project
    │   │   ├── .settings/
    │   │   │   ├── com.st.stm32cube.ide.mcu.sfrview.prefs
    │   │   │   ├── language.settings.xml
    │   │   │   └── stm32cubeide.project.prefs
    │   │   ├── Core/
    │   │   │   ├── Inc/
    │   │   │   │   ├── FreeRTOSConfig.h
    │   │   │   │   ├── hal.h
    │   │   │   │   ├── main.h
    │   │   │   │   ├── mongoose_config.h
    │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   └── stm32f7xx_it.h
    │   │   │   ├── Src/
    │   │   │   │   ├── freertos.c
    │   │   │   │   ├── main.c
    │   │   │   │   ├── stm32f7xx_hal_msp.c
    │   │   │   │   ├── stm32f7xx_hal_timebase_tim.c
    │   │   │   │   ├── stm32f7xx_it.c
    │   │   │   │   ├── syscalls.c
    │   │   │   │   ├── sysmem.c
    │   │   │   │   └── system_stm32f7xx.c
    │   │   │   └── Startup/
    │   │   │       └── startup_stm32f746zgtx.s
    │   │   ├── Drivers/
    │   │   │   ├── BSP/
    │   │   │   │   └── Components/
    │   │   │   │       └── lan8742/
    │   │   │   │           ├── lan8742.c
    │   │   │   │           └── lan8742.h
    │   │   │   ├── CMSIS/
    │   │   │   │   ├── Device/
    │   │   │   │   │   └── ST/
    │   │   │   │   │       └── STM32F7xx/
    │   │   │   │   │           ├── Include/
    │   │   │   │   │           │   ├── stm32f746xx.h
    │   │   │   │   │           │   ├── stm32f7xx.h
    │   │   │   │   │           │   └── system_stm32f7xx.h
    │   │   │   │   │           └── LICENSE.txt
    │   │   │   │   ├── Include/
    │   │   │   │   │   ├── cmsis_armcc.h
    │   │   │   │   │   ├── cmsis_armclang.h
    │   │   │   │   │   ├── cmsis_compiler.h
    │   │   │   │   │   ├── cmsis_gcc.h
    │   │   │   │   │   ├── cmsis_iccarm.h
    │   │   │   │   │   ├── cmsis_version.h
    │   │   │   │   │   ├── core_armv8mbl.h
    │   │   │   │   │   ├── core_armv8mml.h
    │   │   │   │   │   ├── core_cm0.h
    │   │   │   │   │   ├── core_cm0plus.h
    │   │   │   │   │   ├── core_cm1.h
    │   │   │   │   │   ├── core_cm23.h
    │   │   │   │   │   ├── core_cm3.h
    │   │   │   │   │   ├── core_cm33.h
    │   │   │   │   │   ├── core_cm4.h
    │   │   │   │   │   ├── core_cm7.h
    │   │   │   │   │   ├── core_sc000.h
    │   │   │   │   │   ├── core_sc300.h
    │   │   │   │   │   ├── mpu_armv7.h
    │   │   │   │   │   ├── mpu_armv8.h
    │   │   │   │   │   └── tz_context.h
    │   │   │   │   └── LICENSE.txt
    │   │   │   └── STM32F7xx_HAL_Driver/
    │   │   │       ├── Inc/
    │   │   │       │   ├── Legacy/
    │   │   │       │   │   └── stm32_hal_legacy.h
    │   │   │       │   ├── stm32f7xx_hal.h
    │   │   │       │   ├── stm32f7xx_hal_cortex.h
    │   │   │       │   ├── stm32f7xx_hal_def.h
    │   │   │       │   ├── stm32f7xx_hal_dma.h
    │   │   │       │   ├── stm32f7xx_hal_dma_ex.h
    │   │   │       │   ├── stm32f7xx_hal_eth.h
    │   │   │       │   ├── stm32f7xx_hal_exti.h
    │   │   │       │   ├── stm32f7xx_hal_flash.h
    │   │   │       │   ├── stm32f7xx_hal_flash_ex.h
    │   │   │       │   ├── stm32f7xx_hal_gpio.h
    │   │   │       │   ├── stm32f7xx_hal_gpio_ex.h
    │   │   │       │   ├── stm32f7xx_hal_i2c.h
    │   │   │       │   ├── stm32f7xx_hal_i2c_ex.h
    │   │   │       │   ├── stm32f7xx_hal_pwr.h
    │   │   │       │   ├── stm32f7xx_hal_pwr_ex.h
    │   │   │       │   ├── stm32f7xx_hal_rcc.h
    │   │   │       │   ├── stm32f7xx_hal_rcc_ex.h
    │   │   │       │   ├── stm32f7xx_hal_rng.h
    │   │   │       │   ├── stm32f7xx_hal_tim.h
    │   │   │       │   ├── stm32f7xx_hal_tim_ex.h
    │   │   │       │   ├── stm32f7xx_hal_uart.h
    │   │   │       │   ├── stm32f7xx_hal_uart_ex.h
    │   │   │       │   ├── stm32f7xx_ll_bus.h
    │   │   │       │   ├── stm32f7xx_ll_cortex.h
    │   │   │       │   ├── stm32f7xx_ll_dma.h
    │   │   │       │   ├── stm32f7xx_ll_exti.h
    │   │   │       │   ├── stm32f7xx_ll_gpio.h
    │   │   │       │   ├── stm32f7xx_ll_pwr.h
    │   │   │       │   ├── stm32f7xx_ll_rcc.h
    │   │   │       │   ├── stm32f7xx_ll_rng.h
    │   │   │       │   ├── stm32f7xx_ll_system.h
    │   │   │       │   ├── stm32f7xx_ll_usart.h
    │   │   │       │   └── stm32f7xx_ll_utils.h
    │   │   │       ├── LICENSE.txt
    │   │   │       └── Src/
    │   │   │           ├── stm32f7xx_hal.c
    │   │   │           ├── stm32f7xx_hal_cortex.c
    │   │   │           ├── stm32f7xx_hal_dma.c
    │   │   │           ├── stm32f7xx_hal_dma_ex.c
    │   │   │           ├── stm32f7xx_hal_eth.c
    │   │   │           ├── stm32f7xx_hal_exti.c
    │   │   │           ├── stm32f7xx_hal_flash.c
    │   │   │           ├── stm32f7xx_hal_flash_ex.c
    │   │   │           ├── stm32f7xx_hal_gpio.c
    │   │   │           ├── stm32f7xx_hal_i2c.c
    │   │   │           ├── stm32f7xx_hal_i2c_ex.c
    │   │   │           ├── stm32f7xx_hal_pwr.c
    │   │   │           ├── stm32f7xx_hal_pwr_ex.c
    │   │   │           ├── stm32f7xx_hal_rcc.c
    │   │   │           ├── stm32f7xx_hal_rcc_ex.c
    │   │   │           ├── stm32f7xx_hal_rng.c
    │   │   │           ├── stm32f7xx_hal_tim.c
    │   │   │           ├── stm32f7xx_hal_tim_ex.c
    │   │   │           ├── stm32f7xx_hal_uart.c
    │   │   │           └── stm32f7xx_hal_uart_ex.c
    │   │   ├── LWIP/
    │   │   │   ├── App/
    │   │   │   │   ├── lwip.c
    │   │   │   │   └── lwip.h
    │   │   │   └── Target/
    │   │   │       ├── ethernetif.c
    │   │   │       ├── ethernetif.h
    │   │   │       └── lwipopts.h
    │   │   ├── Middlewares/
    │   │   │   └── Third_Party/
    │   │   │       ├── FreeRTOS/
    │   │   │       │   └── Source/
    │   │   │       │       ├── CMSIS_RTOS/
    │   │   │       │       │   ├── cmsis_os.c
    │   │   │       │       │   └── cmsis_os.h
    │   │   │       │       ├── croutine.c
    │   │   │       │       ├── event_groups.c
    │   │   │       │       ├── include/
    │   │   │       │       │   ├── FreeRTOS.h
    │   │   │       │       │   ├── StackMacros.h
    │   │   │       │       │   ├── croutine.h
    │   │   │       │       │   ├── deprecated_definitions.h
    │   │   │       │       │   ├── event_groups.h
    │   │   │       │       │   ├── list.h
    │   │   │       │       │   ├── message_buffer.h
    │   │   │       │       │   ├── mpu_prototypes.h
    │   │   │       │       │   ├── mpu_wrappers.h
    │   │   │       │       │   ├── portable.h
    │   │   │       │       │   ├── projdefs.h
    │   │   │       │       │   ├── queue.h
    │   │   │       │       │   ├── semphr.h
    │   │   │       │       │   ├── stack_macros.h
    │   │   │       │       │   ├── stream_buffer.h
    │   │   │       │       │   ├── task.h
    │   │   │       │       │   └── timers.h
    │   │   │       │       ├── list.c
    │   │   │       │       ├── portable/
    │   │   │       │       │   ├── GCC/
    │   │   │       │       │   │   └── ARM_CM7/
    │   │   │       │       │   │       └── r0p1/
    │   │   │       │       │   │           ├── port.c
    │   │   │       │       │   │           └── portmacro.h
    │   │   │       │       │   └── MemMang/
    │   │   │       │       │       └── heap_4.c
    │   │   │       │       ├── queue.c
    │   │   │       │       ├── stream_buffer.c
    │   │   │       │       ├── tasks.c
    │   │   │       │       └── timers.c
    │   │   │       └── LwIP/
    │   │   │           ├── src/
    │   │   │           │   ├── api/
    │   │   │           │   │   ├── api_lib.c
    │   │   │           │   │   ├── api_msg.c
    │   │   │           │   │   ├── err.c
    │   │   │           │   │   ├── if_api.c
    │   │   │           │   │   ├── netbuf.c
    │   │   │           │   │   ├── netdb.c
    │   │   │           │   │   ├── netifapi.c
    │   │   │           │   │   ├── sockets.c
    │   │   │           │   │   └── tcpip.c
    │   │   │           │   ├── apps/
    │   │   │           │   │   └── mqtt/
    │   │   │           │   │       └── mqtt.c
    │   │   │           │   ├── core/
    │   │   │           │   │   ├── altcp.c
    │   │   │           │   │   ├── altcp_alloc.c
    │   │   │           │   │   ├── altcp_tcp.c
    │   │   │           │   │   ├── def.c
    │   │   │           │   │   ├── dns.c
    │   │   │           │   │   ├── inet_chksum.c
    │   │   │           │   │   ├── init.c
    │   │   │           │   │   ├── ip.c
    │   │   │           │   │   ├── ipv4/
    │   │   │           │   │   │   ├── autoip.c
    │   │   │           │   │   │   ├── dhcp.c
    │   │   │           │   │   │   ├── etharp.c
    │   │   │           │   │   │   ├── icmp.c
    │   │   │           │   │   │   ├── igmp.c
    │   │   │           │   │   │   ├── ip4.c
    │   │   │           │   │   │   ├── ip4_addr.c
    │   │   │           │   │   │   └── ip4_frag.c
    │   │   │           │   │   ├── ipv6/
    │   │   │           │   │   │   ├── dhcp6.c
    │   │   │           │   │   │   ├── ethip6.c
    │   │   │           │   │   │   ├── icmp6.c
    │   │   │           │   │   │   ├── inet6.c
    │   │   │           │   │   │   ├── ip6.c
    │   │   │           │   │   │   ├── ip6_addr.c
    │   │   │           │   │   │   ├── ip6_frag.c
    │   │   │           │   │   │   ├── mld6.c
    │   │   │           │   │   │   └── nd6.c
    │   │   │           │   │   ├── mem.c
    │   │   │           │   │   ├── memp.c
    │   │   │           │   │   ├── netif.c
    │   │   │           │   │   ├── pbuf.c
    │   │   │           │   │   ├── raw.c
    │   │   │           │   │   ├── stats.c
    │   │   │           │   │   ├── sys.c
    │   │   │           │   │   ├── tcp.c
    │   │   │           │   │   ├── tcp_in.c
    │   │   │           │   │   ├── tcp_out.c
    │   │   │           │   │   ├── timeouts.c
    │   │   │           │   │   └── udp.c
    │   │   │           │   ├── include/
    │   │   │           │   │   ├── compat/
    │   │   │           │   │   │   ├── posix/
    │   │   │           │   │   │   │   ├── arpa/
    │   │   │           │   │   │   │   │   └── inet.h
    │   │   │           │   │   │   │   ├── net/
    │   │   │           │   │   │   │   │   └── if.h
    │   │   │           │   │   │   │   ├── netdb.h
    │   │   │           │   │   │   │   └── sys/
    │   │   │           │   │   │   │       └── socket.h
    │   │   │           │   │   │   └── stdc/
    │   │   │           │   │   │       └── errno.h
    │   │   │           │   │   ├── lwip/
    │   │   │           │   │   │   ├── altcp.h
    │   │   │           │   │   │   ├── altcp_tcp.h
    │   │   │           │   │   │   ├── altcp_tls.h
    │   │   │           │   │   │   ├── api.h
    │   │   │           │   │   │   ├── apps/
    │   │   │           │   │   │   │   ├── altcp_proxyconnect.h
    │   │   │           │   │   │   │   ├── altcp_tls_mbedtls_opts.h
    │   │   │           │   │   │   │   ├── fs.h
    │   │   │           │   │   │   │   ├── http_client.h
    │   │   │           │   │   │   │   ├── httpd.h
    │   │   │           │   │   │   │   ├── httpd_opts.h
    │   │   │           │   │   │   │   ├── lwiperf.h
    │   │   │           │   │   │   │   ├── mdns.h
    │   │   │           │   │   │   │   ├── mdns_opts.h
    │   │   │           │   │   │   │   ├── mdns_priv.h
    │   │   │           │   │   │   │   ├── mqtt.h
    │   │   │           │   │   │   │   ├── mqtt_opts.h
    │   │   │           │   │   │   │   ├── mqtt_priv.h
    │   │   │           │   │   │   │   ├── netbiosns.h
    │   │   │           │   │   │   │   ├── netbiosns_opts.h
    │   │   │           │   │   │   │   ├── smtp.h
    │   │   │           │   │   │   │   ├── smtp_opts.h
    │   │   │           │   │   │   │   ├── snmp.h
    │   │   │           │   │   │   │   ├── snmp_core.h
    │   │   │           │   │   │   │   ├── snmp_mib2.h
    │   │   │           │   │   │   │   ├── snmp_opts.h
    │   │   │           │   │   │   │   ├── snmp_scalar.h
    │   │   │           │   │   │   │   ├── snmp_snmpv2_framework.h
    │   │   │           │   │   │   │   ├── snmp_snmpv2_usm.h
    │   │   │           │   │   │   │   ├── snmp_table.h
    │   │   │           │   │   │   │   ├── snmp_threadsync.h
    │   │   │           │   │   │   │   ├── snmpv3.h
    │   │   │           │   │   │   │   ├── sntp.h
    │   │   │           │   │   │   │   ├── sntp_opts.h
    │   │   │           │   │   │   │   ├── tftp_opts.h
    │   │   │           │   │   │   │   └── tftp_server.h
    │   │   │           │   │   │   ├── arch.h
    │   │   │           │   │   │   ├── autoip.h
    │   │   │           │   │   │   ├── debug.h
    │   │   │           │   │   │   ├── def.h
    │   │   │           │   │   │   ├── dhcp.h
    │   │   │           │   │   │   ├── dhcp6.h
    │   │   │           │   │   │   ├── dns.h
    │   │   │           │   │   │   ├── err.h
    │   │   │           │   │   │   ├── errno.h
    │   │   │           │   │   │   ├── etharp.h
    │   │   │           │   │   │   ├── ethip6.h
    │   │   │           │   │   │   ├── icmp.h
    │   │   │           │   │   │   ├── icmp6.h
    │   │   │           │   │   │   ├── if_api.h
    │   │   │           │   │   │   ├── igmp.h
    │   │   │           │   │   │   ├── inet.h
    │   │   │           │   │   │   ├── inet_chksum.h
    │   │   │           │   │   │   ├── init.h
    │   │   │           │   │   │   ├── ip.h
    │   │   │           │   │   │   ├── ip4.h
    │   │   │           │   │   │   ├── ip4_addr.h
    │   │   │           │   │   │   ├── ip4_frag.h
    │   │   │           │   │   │   ├── ip6.h
    │   │   │           │   │   │   ├── ip6_addr.h
    │   │   │           │   │   │   ├── ip6_frag.h
    │   │   │           │   │   │   ├── ip6_zone.h
    │   │   │           │   │   │   ├── ip_addr.h
    │   │   │           │   │   │   ├── mem.h
    │   │   │           │   │   │   ├── memp.h
    │   │   │           │   │   │   ├── mld6.h
    │   │   │           │   │   │   ├── nd6.h
    │   │   │           │   │   │   ├── netbuf.h
    │   │   │           │   │   │   ├── netdb.h
    │   │   │           │   │   │   ├── netif.h
    │   │   │           │   │   │   ├── netifapi.h
    │   │   │           │   │   │   ├── opt.h
    │   │   │           │   │   │   ├── pbuf.h
    │   │   │           │   │   │   ├── priv/
    │   │   │           │   │   │   │   ├── altcp_priv.h
    │   │   │           │   │   │   │   ├── api_msg.h
    │   │   │           │   │   │   │   ├── mem_priv.h
    │   │   │           │   │   │   │   ├── memp_priv.h
    │   │   │           │   │   │   │   ├── memp_std.h
    │   │   │           │   │   │   │   ├── nd6_priv.h
    │   │   │           │   │   │   │   ├── raw_priv.h
    │   │   │           │   │   │   │   ├── sockets_priv.h
    │   │   │           │   │   │   │   ├── tcp_priv.h
    │   │   │           │   │   │   │   └── tcpip_priv.h
    │   │   │           │   │   │   ├── prot/
    │   │   │           │   │   │   │   ├── autoip.h
    │   │   │           │   │   │   │   ├── dhcp.h
    │   │   │           │   │   │   │   ├── dhcp6.h
    │   │   │           │   │   │   │   ├── dns.h
    │   │   │           │   │   │   │   ├── etharp.h
    │   │   │           │   │   │   │   ├── ethernet.h
    │   │   │           │   │   │   │   ├── iana.h
    │   │   │           │   │   │   │   ├── icmp.h
    │   │   │           │   │   │   │   ├── icmp6.h
    │   │   │           │   │   │   │   ├── ieee.h
    │   │   │           │   │   │   │   ├── igmp.h
    │   │   │           │   │   │   │   ├── ip.h
    │   │   │           │   │   │   │   ├── ip4.h
    │   │   │           │   │   │   │   ├── ip6.h
    │   │   │           │   │   │   │   ├── mld6.h
    │   │   │           │   │   │   │   ├── nd6.h
    │   │   │           │   │   │   │   ├── tcp.h
    │   │   │           │   │   │   │   └── udp.h
    │   │   │           │   │   │   ├── raw.h
    │   │   │           │   │   │   ├── sio.h
    │   │   │           │   │   │   ├── snmp.h
    │   │   │           │   │   │   ├── sockets.h
    │   │   │           │   │   │   ├── stats.h
    │   │   │           │   │   │   ├── sys.h
    │   │   │           │   │   │   ├── tcp.h
    │   │   │           │   │   │   ├── tcpbase.h
    │   │   │           │   │   │   ├── tcpip.h
    │   │   │           │   │   │   ├── timeouts.h
    │   │   │           │   │   │   └── udp.h
    │   │   │           │   │   └── netif/
    │   │   │           │   │       ├── bridgeif.h
    │   │   │           │   │       ├── bridgeif_opts.h
    │   │   │           │   │       ├── etharp.h
    │   │   │           │   │       ├── ethernet.h
    │   │   │           │   │       ├── ieee802154.h
    │   │   │           │   │       ├── lowpan6.h
    │   │   │           │   │       ├── lowpan6_ble.h
    │   │   │           │   │       ├── lowpan6_common.h
    │   │   │           │   │       ├── lowpan6_opts.h
    │   │   │           │   │       ├── ppp/
    │   │   │           │   │       │   ├── ccp.h
    │   │   │           │   │       │   ├── chap-md5.h
    │   │   │           │   │       │   ├── chap-new.h
    │   │   │           │   │       │   ├── chap_ms.h
    │   │   │           │   │       │   ├── eap.h
    │   │   │           │   │       │   ├── ecp.h
    │   │   │           │   │       │   ├── eui64.h
    │   │   │           │   │       │   ├── fsm.h
    │   │   │           │   │       │   ├── ipcp.h
    │   │   │           │   │       │   ├── ipv6cp.h
    │   │   │           │   │       │   ├── lcp.h
    │   │   │           │   │       │   ├── magic.h
    │   │   │           │   │       │   ├── mppe.h
    │   │   │           │   │       │   ├── ppp.h
    │   │   │           │   │       │   ├── ppp_impl.h
    │   │   │           │   │       │   ├── ppp_opts.h
    │   │   │           │   │       │   ├── pppapi.h
    │   │   │           │   │       │   ├── pppcrypt.h
    │   │   │           │   │       │   ├── pppdebug.h
    │   │   │           │   │       │   ├── pppoe.h
    │   │   │           │   │       │   ├── pppol2tp.h
    │   │   │           │   │       │   ├── pppos.h
    │   │   │           │   │       │   ├── upap.h
    │   │   │           │   │       │   └── vj.h
    │   │   │           │   │       ├── slipif.h
    │   │   │           │   │       └── zepif.h
    │   │   │           │   └── netif/
    │   │   │           │       ├── bridgeif.c
    │   │   │           │       ├── bridgeif_fdb.c
    │   │   │           │       ├── ethernet.c
    │   │   │           │       ├── lowpan6.c
    │   │   │           │       ├── lowpan6_ble.c
    │   │   │           │       ├── lowpan6_common.c
    │   │   │           │       ├── ppp/
    │   │   │           │       │   ├── auth.c
    │   │   │           │       │   ├── ccp.c
    │   │   │           │       │   ├── chap-md5.c
    │   │   │           │       │   ├── chap-new.c
    │   │   │           │       │   ├── chap_ms.c
    │   │   │           │       │   ├── demand.c
    │   │   │           │       │   ├── eap.c
    │   │   │           │       │   ├── ecp.c
    │   │   │           │       │   ├── eui64.c
    │   │   │           │       │   ├── fsm.c
    │   │   │           │       │   ├── ipcp.c
    │   │   │           │       │   ├── ipv6cp.c
    │   │   │           │       │   ├── lcp.c
    │   │   │           │       │   ├── magic.c
    │   │   │           │       │   ├── mppe.c
    │   │   │           │       │   ├── multilink.c
    │   │   │           │       │   ├── ppp.c
    │   │   │           │       │   ├── pppapi.c
    │   │   │           │       │   ├── pppcrypt.c
    │   │   │           │       │   ├── pppoe.c
    │   │   │           │       │   ├── pppol2tp.c
    │   │   │           │       │   ├── pppos.c
    │   │   │           │       │   ├── upap.c
    │   │   │           │       │   ├── utils.c
    │   │   │           │       │   └── vj.c
    │   │   │           │       ├── slipif.c
    │   │   │           │       └── zepif.c
    │   │   │           └── system/
    │   │   │               ├── OS/
    │   │   │               │   └── sys_arch.c
    │   │   │               └── arch/
    │   │   │                   ├── bpstruct.h
    │   │   │                   ├── cc.h
    │   │   │                   ├── cpu.h
    │   │   │                   ├── epstruct.h
    │   │   │                   ├── init.h
    │   │   │                   ├── lib.h
    │   │   │                   ├── perf.h
    │   │   │                   └── sys_arch.h
    │   │   ├── README.md
    │   │   ├── STM32F746ZGTX_FLASH.ld
    │   │   ├── STM32F746ZGTX_RAM.ld
    │   │   ├── nucleo-f746zg-cube-freertos-lwip Debug.launch
    │   │   └── nucleo-f746zg-cube-freertos-lwip.ioc
    │   ├── nucleo-f746zg-keil-baremetal/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F746ZGTx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f7xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_msp.c
    │   │   │   │   │   │       └── stm32f7xx_it.c
    │   │   │   │   │   ├── startup_stm32f746xx.s
    │   │   │   │   │   └── system_stm32f7xx.c
    │   │   │   │   └── project.script
    │   │   │   ├── _Target_1/
    │   │   │   │   ├── Pre_Include_Global.h
    │   │   │   │   └── RTE_Components.h
    │   │   │   └── _Test/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f746zg-keil-freertos/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F746ZGTx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f7xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_msp.c
    │   │   │   │   │   │       └── stm32f7xx_it.c
    │   │   │   │   │   ├── startup_stm32f746xx.s
    │   │   │   │   │   └── system_stm32f7xx.c
    │   │   │   │   └── project.script
    │   │   │   ├── RTOS/
    │   │   │   │   └── FreeRTOSConfig.h
    │   │   │   └── _Target_1/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f746zg-keil-freertos-lwip/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F746ZGTx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f7xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_msp.c
    │   │   │   │   │   │       └── stm32f7xx_it.c
    │   │   │   │   │   ├── startup_stm32f746xx.s
    │   │   │   │   │   └── system_stm32f7xx.c
    │   │   │   │   └── project.script
    │   │   │   ├── Network/
    │   │   │   │   ├── ethif_config.h
    │   │   │   │   └── lwipopts.h
    │   │   │   ├── RTOS/
    │   │   │   │   └── FreeRTOSConfig.h
    │   │   │   └── _Target_1/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f746zg-keil-freertos-tcp/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── FreeRTOSIPConfig.h
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F746ZGTx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f7xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_msp.c
    │   │   │   │   │   │       └── stm32f7xx_it.c
    │   │   │   │   │   ├── startup_stm32f746xx.s
    │   │   │   │   │   └── system_stm32f7xx.c
    │   │   │   │   └── project.script
    │   │   │   ├── RTOS/
    │   │   │   │   └── FreeRTOSConfig.h
    │   │   │   └── _Target_1/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   ├── phyHandling.c
    │   │   ├── phyHandling.h
    │   │   └── syscalls.c
    │   ├── nucleo-f746zg-keil-freertos_cmsis2/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F746ZGTx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f7xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_msp.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_timebase_tim.c
    │   │   │   │   │   │       └── stm32f7xx_it.c
    │   │   │   │   │   ├── startup_stm32f746xx.s
    │   │   │   │   │   └── system_stm32f7xx.c
    │   │   │   │   └── project.script
    │   │   │   ├── RTOS/
    │   │   │   │   └── FreeRTOSConfig.h
    │   │   │   └── _Target_1/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f746zg-keil-freertos_cmsis2-lwip/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F746ZGTx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f7xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_msp.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_timebase_tim.c
    │   │   │   │   │   │       └── stm32f7xx_it.c
    │   │   │   │   │   ├── startup_stm32f746xx.s
    │   │   │   │   │   └── system_stm32f7xx.c
    │   │   │   │   └── project.script
    │   │   │   ├── Network/
    │   │   │   │   ├── ethif_config.h
    │   │   │   │   └── lwipopts.h
    │   │   │   ├── RTOS/
    │   │   │   │   └── FreeRTOSConfig.h
    │   │   │   └── _Target_1/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f746zg-keil-rtx/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── CMSIS/
    │   │   │   │   └── RTX_Conf_CM.c
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F746ZGTx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f7xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_msp.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_timebase_tim.c
    │   │   │   │   │   │       └── stm32f7xx_it.c
    │   │   │   │   │   ├── startup_stm32f746xx.s
    │   │   │   │   │   └── system_stm32f7xx.c
    │   │   │   │   └── project.script
    │   │   │   └── _Target_1/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f746zg-keil-rtx-mdk/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── CMSIS/
    │   │   │   │   └── RTX_Conf_CM.c
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F746ZGTx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f7xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_msp.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_timebase_tim.c
    │   │   │   │   │   │       └── stm32f7xx_it.c
    │   │   │   │   │   ├── startup_stm32f746xx.s
    │   │   │   │   │   └── system_stm32f7xx.c
    │   │   │   │   └── project.script
    │   │   │   ├── Network/
    │   │   │   │   ├── Net_Config.c
    │   │   │   │   ├── Net_Config_BSD.h
    │   │   │   │   ├── Net_Config_ETH_0.h
    │   │   │   │   ├── Net_Config_TCP.h
    │   │   │   │   └── Net_Config_UDP.h
    │   │   │   └── _Target_1/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f746zg-keil-rtx5/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── CMSIS/
    │   │   │   │   ├── RTX_Config.c
    │   │   │   │   └── RTX_Config.h
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F746ZGTx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f7xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_msp.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_timebase_tim.c
    │   │   │   │   │   │       └── stm32f7xx_it.c
    │   │   │   │   │   ├── startup_stm32f746xx.s
    │   │   │   │   │   └── system_stm32f7xx.c
    │   │   │   │   └── project.script
    │   │   │   └── _Target_1/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f746zg-keil-rtx5-lwip/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── CMSIS/
    │   │   │   │   ├── RTX_Config.c
    │   │   │   │   └── RTX_Config.h
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F746ZGTx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f7xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_msp.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_timebase_tim.c
    │   │   │   │   │   │       └── stm32f7xx_it.c
    │   │   │   │   │   ├── startup_stm32f746xx.s
    │   │   │   │   │   └── system_stm32f7xx.c
    │   │   │   │   └── project.script
    │   │   │   ├── Network/
    │   │   │   │   ├── ethif_config.h
    │   │   │   │   └── lwipopts.h
    │   │   │   └── _Target_1/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f746zg-keil-rtx5-mdk/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── CMSIS/
    │   │   │   │   ├── RTX_Config.c
    │   │   │   │   └── RTX_Config.h
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F746ZGTx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f7xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_msp.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_timebase_tim.c
    │   │   │   │   │   │       └── stm32f7xx_it.c
    │   │   │   │   │   ├── startup_stm32f746xx.s
    │   │   │   │   │   └── system_stm32f7xx.c
    │   │   │   │   └── project.script
    │   │   │   ├── Network/
    │   │   │   │   ├── Net_Config.c
    │   │   │   │   ├── Net_Config_BSD.h
    │   │   │   │   ├── Net_Config_ETH_0.h
    │   │   │   │   ├── Net_Config_TCP.h
    │   │   │   │   └── Net_Config_UDP.h
    │   │   │   └── _Target_1/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f746zg-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── mbedtls_config.h
    │   ├── nucleo-f746zg-make-baremetal-builtin-cmsis_driver/
    │   │   ├── MX_Device.h
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── RTE_Components.h
    │   │   ├── hal.h
    │   │   ├── link.ld
    │   │   ├── main.c
    │   │   ├── mbedtls_config.h
    │   │   ├── mongoose_config.h
    │   │   ├── syscalls.c
    │   │   └── sysinit.c
    │   ├── nucleo-f746zg-make-baremetal-builtin-rndis/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── hal.h
    │   │   ├── link.ld
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   ├── netif/
    │   │   │   └── ethernet.h
    │   │   ├── syscalls.c
    │   │   ├── sysinit.c
    │   │   ├── tusb_config.h
    │   │   └── usb_descriptors.c
    │   ├── nucleo-f746zg-make-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── nucleo-f746zg-make-freertos-tcp/
    │   │   ├── FreeRTOSConfig.h
    │   │   ├── FreeRTOSIPConfig.h
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── hal.h
    │   │   ├── link.ld
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   ├── stm32f7xx_hal.h
    │   │   ├── syscalls.c
    │   │   └── sysinit.c
    │   ├── nucleo-g031-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── hal.h
    │   │   ├── link.ld
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-h563zi-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── mbedtls_config.h
    │   ├── nucleo-h563zi-make-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── nucleo-h723zg-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── mbedtls_config.h
    │   ├── nucleo-h723zg-make-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── nucleo-h743zi-cube-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── nucleo-h743zi-cube-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── nucleo-h743zi-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── mbedtls_config.h
    │   ├── nucleo-h743zi-make-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── portenta-h7-cube-baremetal-builtin/
    │   │   ├── .mxproject
    │   │   ├── .project
    │   │   ├── .settings/
    │   │   │   └── com.st.stm32cube.ide.mcu.sfrview.prefs
    │   │   ├── CM4/
    │   │   │   ├── .cproject
    │   │   │   ├── .project
    │   │   │   ├── .settings/
    │   │   │   │   ├── com.st.stm32cube.ide.mcu.sfrview.prefs
    │   │   │   │   ├── language.settings.xml
    │   │   │   │   └── stm32cubeide.project.prefs
    │   │   │   ├── Core/
    │   │   │   │   ├── Inc/
    │   │   │   │   │   ├── main.h
    │   │   │   │   │   ├── stm32h7xx_hal_conf.h
    │   │   │   │   │   └── stm32h7xx_it.h
    │   │   │   │   ├── Src/
    │   │   │   │   │   ├── main.c
    │   │   │   │   │   ├── stm32h7xx_hal_msp.c
    │   │   │   │   │   ├── stm32h7xx_it.c
    │   │   │   │   │   ├── syscalls.c
    │   │   │   │   │   └── sysmem.c
    │   │   │   │   └── Startup/
    │   │   │   │       └── startup_stm32h747xihx.s
    │   │   │   └── STM32H747XIHX_FLASH.ld
    │   │   ├── CM7/
    │   │   │   ├── .cproject
    │   │   │   ├── .project
    │   │   │   ├── .settings/
    │   │   │   │   ├── com.st.stm32cube.ide.mcu.sfrview.prefs
    │   │   │   │   ├── language.settings.xml
    │   │   │   │   └── stm32cubeide.project.prefs
    │   │   │   ├── Core/
    │   │   │   │   ├── Inc/
    │   │   │   │   │   ├── main.h
    │   │   │   │   │   ├── mongoose_config.h
    │   │   │   │   │   ├── stm32h7xx_hal_conf.h
    │   │   │   │   │   └── stm32h7xx_it.h
    │   │   │   │   ├── Src/
    │   │   │   │   │   ├── main.c
    │   │   │   │   │   ├── stm32h7xx_hal_msp.c
    │   │   │   │   │   ├── stm32h7xx_it.c
    │   │   │   │   │   ├── syscalls.c
    │   │   │   │   │   └── sysmem.c
    │   │   │   │   └── Startup/
    │   │   │   │       └── startup_stm32h747xihx.s
    │   │   │   └── STM32H747XIHX_FLASH.ld
    │   │   ├── Common/
    │   │   │   └── Src/
    │   │   │       └── system_stm32h7xx_dualcore_boot_cm4_cm7.c
    │   │   ├── Drivers/
    │   │   │   ├── CMSIS/
    │   │   │   │   ├── Device/
    │   │   │   │   │   └── ST/
    │   │   │   │   │       └── STM32H7xx/
    │   │   │   │   │           ├── Include/
    │   │   │   │   │           │   ├── stm32h747xx.h
    │   │   │   │   │           │   ├── stm32h7xx.h
    │   │   │   │   │           │   └── system_stm32h7xx.h
    │   │   │   │   │           └── LICENSE.txt
    │   │   │   │   ├── Include/
    │   │   │   │   │   ├── cmsis_armcc.h
    │   │   │   │   │   ├── cmsis_armclang.h
    │   │   │   │   │   ├── cmsis_armclang_ltm.h
    │   │   │   │   │   ├── cmsis_compiler.h
    │   │   │   │   │   ├── cmsis_gcc.h
    │   │   │   │   │   ├── cmsis_iccarm.h
    │   │   │   │   │   ├── cmsis_version.h
    │   │   │   │   │   ├── core_armv81mml.h
    │   │   │   │   │   ├── core_armv8mbl.h
    │   │   │   │   │   ├── core_armv8mml.h
    │   │   │   │   │   ├── core_cm0.h
    │   │   │   │   │   ├── core_cm0plus.h
    │   │   │   │   │   ├── core_cm1.h
    │   │   │   │   │   ├── core_cm23.h
    │   │   │   │   │   ├── core_cm3.h
    │   │   │   │   │   ├── core_cm33.h
    │   │   │   │   │   ├── core_cm35p.h
    │   │   │   │   │   ├── core_cm4.h
    │   │   │   │   │   ├── core_cm7.h
    │   │   │   │   │   ├── core_sc000.h
    │   │   │   │   │   ├── core_sc300.h
    │   │   │   │   │   ├── mpu_armv7.h
    │   │   │   │   │   ├── mpu_armv8.h
    │   │   │   │   │   └── tz_context.h
    │   │   │   │   └── LICENSE.txt
    │   │   │   └── STM32H7xx_HAL_Driver/
    │   │   │       ├── Inc/
    │   │   │       │   ├── Legacy/
    │   │   │       │   │   └── stm32_hal_legacy.h
    │   │   │       │   ├── stm32h7xx_hal.h
    │   │   │       │   ├── stm32h7xx_hal_cortex.h
    │   │   │       │   ├── stm32h7xx_hal_def.h
    │   │   │       │   ├── stm32h7xx_hal_dma.h
    │   │   │       │   ├── stm32h7xx_hal_dma_ex.h
    │   │   │       │   ├── stm32h7xx_hal_exti.h
    │   │   │       │   ├── stm32h7xx_hal_flash.h
    │   │   │       │   ├── stm32h7xx_hal_flash_ex.h
    │   │   │       │   ├── stm32h7xx_hal_gpio.h
    │   │   │       │   ├── stm32h7xx_hal_gpio_ex.h
    │   │   │       │   ├── stm32h7xx_hal_hsem.h
    │   │   │       │   ├── stm32h7xx_hal_i2c.h
    │   │   │       │   ├── stm32h7xx_hal_i2c_ex.h
    │   │   │       │   ├── stm32h7xx_hal_mdma.h
    │   │   │       │   ├── stm32h7xx_hal_pwr.h
    │   │   │       │   ├── stm32h7xx_hal_pwr_ex.h
    │   │   │       │   ├── stm32h7xx_hal_rcc.h
    │   │   │       │   ├── stm32h7xx_hal_rcc_ex.h
    │   │   │       │   ├── stm32h7xx_hal_rng.h
    │   │   │       │   ├── stm32h7xx_hal_rng_ex.h
    │   │   │       │   ├── stm32h7xx_hal_tim.h
    │   │   │       │   ├── stm32h7xx_hal_tim_ex.h
    │   │   │       │   ├── stm32h7xx_hal_uart.h
    │   │   │       │   ├── stm32h7xx_hal_uart_ex.h
    │   │   │       │   ├── stm32h7xx_ll_bus.h
    │   │   │       │   ├── stm32h7xx_ll_cortex.h
    │   │   │       │   ├── stm32h7xx_ll_crs.h
    │   │   │       │   ├── stm32h7xx_ll_dma.h
    │   │   │       │   ├── stm32h7xx_ll_dmamux.h
    │   │   │       │   ├── stm32h7xx_ll_exti.h
    │   │   │       │   ├── stm32h7xx_ll_gpio.h
    │   │   │       │   ├── stm32h7xx_ll_hsem.h
    │   │   │       │   ├── stm32h7xx_ll_lpuart.h
    │   │   │       │   ├── stm32h7xx_ll_pwr.h
    │   │   │       │   ├── stm32h7xx_ll_rcc.h
    │   │   │       │   ├── stm32h7xx_ll_rng.h
    │   │   │       │   ├── stm32h7xx_ll_system.h
    │   │   │       │   ├── stm32h7xx_ll_usart.h
    │   │   │       │   └── stm32h7xx_ll_utils.h
    │   │   │       ├── LICENSE.txt
    │   │   │       └── Src/
    │   │   │           ├── stm32h7xx_hal.c
    │   │   │           ├── stm32h7xx_hal_cortex.c
    │   │   │           ├── stm32h7xx_hal_dma.c
    │   │   │           ├── stm32h7xx_hal_dma_ex.c
    │   │   │           ├── stm32h7xx_hal_exti.c
    │   │   │           ├── stm32h7xx_hal_flash.c
    │   │   │           ├── stm32h7xx_hal_flash_ex.c
    │   │   │           ├── stm32h7xx_hal_gpio.c
    │   │   │           ├── stm32h7xx_hal_hsem.c
    │   │   │           ├── stm32h7xx_hal_i2c.c
    │   │   │           ├── stm32h7xx_hal_i2c_ex.c
    │   │   │           ├── stm32h7xx_hal_mdma.c
    │   │   │           ├── stm32h7xx_hal_pwr.c
    │   │   │           ├── stm32h7xx_hal_pwr_ex.c
    │   │   │           ├── stm32h7xx_hal_rcc.c
    │   │   │           ├── stm32h7xx_hal_rcc_ex.c
    │   │   │           ├── stm32h7xx_hal_rng.c
    │   │   │           ├── stm32h7xx_hal_rng_ex.c
    │   │   │           ├── stm32h7xx_hal_tim.c
    │   │   │           ├── stm32h7xx_hal_tim_ex.c
    │   │   │           ├── stm32h7xx_hal_uart.c
    │   │   │           └── stm32h7xx_hal_uart_ex.c
    │   │   ├── Portenta_H7.ioc
    │   │   ├── README.md
    │   │   └── getfirmware.mk
    │   ├── portenta-h7-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── hal.c
    │   │   ├── hal.h
    │   │   ├── link.ld
    │   │   ├── main.c
    │   │   └── mongoose_config.h
    │   ├── rm2-nucleo-f429zi-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── hal.h
    │   │   ├── link.ld
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   ├── syscalls.c
    │   │   └── sysinit.c
    │   ├── rm2-nucleo-f746zg-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── hal.h
    │   │   ├── link.ld
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   ├── syscalls.c
    │   │   └── sysinit.c
    │   ├── stm32h573i-dk-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── mbedtls_config.h
    │   ├── stm32h573i-dk-make-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   └── stm32h747i-disco-make-baremetal-builtin/
    │       ├── Makefile
    │       ├── README.md
    │       └── mbedtls_config.h
    ├── tcp/
    │   ├── README.md
    │   ├── modbus-dashboard/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   ├── net.c
    │   │   ├── net.h
    │   │   ├── packed_fs.c
    │   │   ├── tailwind.config.js
    │   │   └── web_root/
    │   │       ├── bundle.js
    │   │       ├── index.html
    │   │       └── main.js
    │   ├── socks5-server/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   └── tcp/
    │       ├── Makefile
    │       ├── README.md
    │       └── main.c
    ├── tcpip/
    │   ├── README.md
    │   ├── pcap-driver/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   └── tap-driver/
    │       ├── Makefile
    │       ├── README.md
    │       └── main.c
    ├── ti/
    │   ├── ek-tm4c1294xl-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── ek-tm4c1294xl-make-baremetal-builtin-rndis/
    │   │   ├── Makefile
    │   │   ├── cmsis_tm4c.patch
    │   │   ├── hal.h
    │   │   ├── link.ld
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   ├── netif/
    │   │   │   └── ethernet.h
    │   │   ├── startup.c
    │   │   ├── syscalls.c
    │   │   ├── sysinit.c
    │   │   ├── tinyusb.patch
    │   │   ├── tusb_config.h
    │   │   └── usb_descriptors.c
    │   ├── ek-tm4c1294xl-make-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   └── ti-ek-tm4c1294xl-http-server/
    │       └── Makefile
    ├── tls/
    │   └── README.md
    ├── udp/
    │   ├── README.md
    │   ├── captive-dns-server/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── mdns-client/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── mdns-sd-server/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── mdns-server/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── sntp-time-sync/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   └── ssdp-search/
    │       ├── Makefile
    │       ├── README.md
    │       └── main.c
    ├── wch/
    │   └── ch32v307-make-baremetal-builtin/
    │       ├── Makefile
    │       ├── hal.c
    │       ├── hal.h
    │       ├── main.c
    │       ├── mongoose_config.h
    │       └── vendor/
    │           ├── ch32v30x.h
    │           ├── core_riscv.c
    │           ├── core_riscv.h
    │           ├── link.ld
    │           ├── startup_ch32v30x_D8C.S
    │           └── system_ch32v30x.c
    ├── websocket/
    │   ├── README.md
    │   ├── json-rpc-over-websocket/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── web_root/
    │   │       ├── index.html
    │   │       └── rpc-over-websocket.js
    │   ├── websocket-client/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   └── websocket-server/
    │       ├── Makefile
    │       ├── README.md
    │       ├── main.c
    │       └── test.html
    ├── webui/
    │   ├── README.md
    │   ├── live-log/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── web_root/
    │   │       └── index.html
    │   ├── webui-login/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── web_root/
    │   │       ├── index.html
    │   │       ├── main.js
    │   │       └── style.css
    │   ├── webui-plain/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── web_root/
    │   │       ├── index.html
    │   │       └── style.css
    │   ├── webui-preact/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── web_root/
    │   │       ├── index.html
    │   │       ├── main.js
    │   │       └── style.css
    │   ├── webui-push-rest/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── web_root/
    │   │       └── index.html
    │   ├── webui-push-ws/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── web_root/
    │   │       └── index.html
    │   └── webui-rest/
    │       ├── Makefile
    │       ├── README.md
    │       ├── main.c
    │       └── web_root/
    │           └── index.html
    └── zephyr/
        ├── Makefile
        ├── README.md
        ├── device-dashboard/
        │   ├── CMakeLists.txt
        │   ├── Makefile
        │   ├── overlay-e1000.conf
        │   ├── prj.conf
        │   └── src/
        │       ├── main.c
        │       └── mongoose_config.h
        ├── http-client/
        │   ├── CMakeLists.txt
        │   ├── Makefile
        │   ├── overlay-e1000.conf
        │   ├── prj.conf
        │   └── src/
        │       ├── certs.h
        │       ├── main.c
        │       └── mongoose_config.h
        ├── http-server/
        │   ├── CMakeLists.txt
        │   ├── Makefile
        │   ├── overlay-e1000.conf
        │   ├── prj.conf
        │   └── src/
        │       ├── certs.h
        │       ├── main.c
        │       └── mongoose_config.h
        ├── mqtt-aws-client/
        │   ├── CMakeLists.txt
        │   ├── Makefile
        │   ├── overlay-e1000.conf
        │   ├── prj.conf
        │   └── src/
        │       ├── certs.h
        │       ├── main.c
        │       └── mongoose_config.h
        └── websocket-server/
            ├── CMakeLists.txt
            ├── Makefile
            ├── overlay-e1000.conf
            ├── prj.conf
            └── src/
                ├── certs.h
                ├── main.c
                └── mongoose_config.h

================================================
FILE CONTENTS
================================================

================================================
FILE: .clang-format
================================================
BasedOnStyle: Google
AllowShortFunctionsOnASingleLine: false
SpaceAfterCStyleCast: true
PointerBindsToType: false
DerivePointerBinding: false
IncludeBlocks: Preserve


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false


================================================
FILE: .github/ISSUE_TEMPLATE/issue.md
================================================
---
name: Issue template
about: Please fill this issue template for reporting Mongoose issues
#title: 
#labels: 
#assignees: 
---

- My goal is: _describe_
- My actions were: _describe_
- My expectation was: _describe_
- The result I saw: _provide logs or description_
- My question is: _your question_

# Environment

- mongoose version: _X.Y_
- Compiler/IDE and SDK: ZZZ version _X.Y_
- Target hardware/board: _?_
- Connectivity chip/module: _?_
- Target RTOS/OS (if applicable): _?_


================================================
FILE: .github/workflows/cifuzz.yml
================================================
name: CIFuzz
on:
  schedule:
    - cron: '0 2 * * *' # run at 2 AM UTC
  # Allow manual runs
  workflow_dispatch:

jobs:
  Fuzzing:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - name: Build Fuzzers
      id: build
      uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master
      with:
        oss-fuzz-project-name: 'mongoose'
        dry-run: false
        language: c++
    - name: Run Fuzzers
      uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master
      with:
        oss-fuzz-project-name: 'mongoose'
        fuzz-seconds: 600
        dry-run: false
        language: c++
    - name: Upload Crash
      uses: actions/upload-artifact@v4
      if: failure() && steps.build.outcome == 'success'
      with:
        name: artifacts
        path: ./out/artifacts


================================================
FILE: .github/workflows/codeql.yml
================================================
name: "CodeQL Scanning"
# https://github.com/github/codeql-action

on:
  #schedule:
  #  - cron: '30 23 * * *' # run at 11:30 PM UTC
  # Allow manual runs
  workflow_dispatch:

env:
  IPV6: 0
jobs:
  CodeQL-Build:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
    permissions:
      security-events: write
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }

    - name: Initialize CodeQL
      uses: github/codeql-action/init@v3
      with:
        languages: cpp
    - run: |
        make -C test test CC=gcc ASAN= ASAN_OPTIONS=
        ./test/setup_ga_network.sh && make -C test mip_test CC=gcc ASAN= ASAN_OPTIONS=

    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v3


================================================
FILE: .github/workflows/fuzz.yml
================================================
name: Fuzz
on:
  schedule:
    - cron: '0 21 * * *' # run at 9 PM UTC
  # Allow manual runs
  workflow_dispatch:
env:
  CC: clang
jobs:
  fuzz:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        target: [fuzz, fuzz_tls]
    name: ${{ matrix.target }}
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - run: make -C test ${{ matrix.target }} ARGS="-max_total_time=14400"

# as we're not getting access to test units causing a problem, convert from the log:
# base64 -d > dataofdeath
# then paste the base64 data, enter, Ctrl-D; maybe check with hexdump -C dataofdeath


================================================
FILE: .github/workflows/nightly.yml
================================================
name: Full build
on:
  schedule:
    - cron: '0 22 * * *' # run at 10 PM UTC
  # Allow manual runs
  workflow_dispatch:
env:
  IPV6: 0
jobs:
  linux:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        cc: [gcc, clang, g++, clang++]
        target: [test]
        ssl: ["", BUILTIN, MBEDTLS, OPENSSL, WOLFSSL]
        select: ["-DMG_ENABLE_POLL=0 -DMG_ENABLE_EPOLL=0", "-DMG_ENABLE_POLL=1 -DMG_ENABLE_EPOLL=0", "-DMG_ENABLE_POLL=0 -DMG_ENABLE_EPOLL=1"]
        exclude:
        - ssl: MBEDTLS
          select: "-DMG_ENABLE_POLL=0 -DMG_ENABLE_EPOLL=0"
        - ssl: MBEDTLS
          select: "-DMG_ENABLE_POLL=1 -DMG_ENABLE_EPOLL=0"
        - ssl: OPENSSL
          select: "-DMG_ENABLE_POLL=0 -DMG_ENABLE_EPOLL=0"
        - ssl: OPENSSL
          select: "-DMG_ENABLE_POLL=1 -DMG_ENABLE_EPOLL=0"
        - ssl: WOLFSSL
          select: "-DMG_ENABLE_POLL=0 -DMG_ENABLE_EPOLL=0"
        - ssl: WOLFSSL
          select: "-DMG_ENABLE_POLL=1 -DMG_ENABLE_EPOLL=0"
        include:
        - ssl: BUILTIN
          cc: gcc
          target: test
          select: "-DMG_ENABLE_POLL=0 -DMG_ENABLE_EPOLL=1 -DMG_ENABLE_CHACHA20=0"
    name: linux ${{ matrix.target }} CC=${{ matrix.cc }} SSL=${{ matrix.ssl }} TFLAGS=${{ matrix.select }}
    env:
      CC: ${{ matrix.cc }}
      SSL: ${{ matrix.ssl }}
      TFLAGS: ${{ matrix.select }} -DMQTT_LOCALHOST -DNO_ABORT
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - uses: webfactory/ssh-agent@v0.9.1
      with:
            ssh-private-key: ${{ secrets.HEALTH_TESTS_SSH_KEY }}
    - run: sudo apt -y update ; sudo apt -y install libmbedtls-dev libwolfssl-dev && test/setup_mqtt_server.sh && make -C test ${{ matrix.target }} > log
    - if: success() || failure()
      run: |
        cat log
        test/health.awk < log > json
        scp -o "StrictHostKeyChecking=no" json "root@176.9.217.245:/data/downloads/health/linux_${{ matrix.target }}_${{ matrix.cc }}_${{ matrix.ssl }}_${{ matrix.select }}_$(date +"%Y%m%d").json"
  mip:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        cc: [gcc, clang, g++, clang++]
        target: [mip_test, mip_tap_test]
        ssl: ["", BUILTIN, MBEDTLS, OPENSSL, WOLFSSL]
        # #3226: built-in TCP is currently not working with WolfSSL (builds fine)
        exclude:
        - ssl: WOLFSSL
          target: mip_tap_test
    name: ${{ matrix.target }} CC=${{ matrix.cc }} SSL=${{ matrix.ssl }}
    env:
      CC: ${{ matrix.cc }}
      SSL: ${{ matrix.ssl }}
      TFLAGS: -DMQTT_LOCALHOST -DNO_ABORT
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - uses: webfactory/ssh-agent@v0.9.1
      with:
            ssh-private-key: ${{ secrets.HEALTH_TESTS_SSH_KEY }}
    - run: if [ "${{ matrix.target }}" == "mip_tap_test" ]; then ./test/setup_ga_network.sh ; export IPV6=0; else export IPV6=1 ; fi && sudo apt -y update ; sudo apt -y install libmbedtls-dev libwolfssl-dev && make -C test ${{ matrix.target }} > log
    - if: success() || failure()
      run: |
        cat log
        test/health.awk < log > json
        scp -o "StrictHostKeyChecking=no" json "root@176.9.217.245:/data/downloads/health/${{ matrix.target }}_${{ matrix.cc }}_${{ matrix.ssl }}_$(date +"%Y%m%d").json"

  mip89:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      max-parallel: 1   # no parallel runs, to minimize MQTT errors
      matrix:
        target: [mip_vc98]
    name: mip89 ${{ matrix.target }}
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - run: make -C test ${{ matrix.target }} IPV6=1
  s390:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        ssl: ["", BUILTIN]
    name: S390 SSL=${{ matrix.ssl }}
    env:
      TFLAGS: -DMQTT_LOCALHOST
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - run: sudo apt -y update ; sudo apt -y install binfmt-support qemu-user-static && ./test/setup_mqtt_server.sh && docker run --rm --privileged multiarch/qemu-user-static --reset -p yes && make -C test s390 SSL=${{ matrix.ssl }} MULTIREC=NO
  armhf:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        ssl: ["", BUILTIN]
    name: ArmHF SSL=${{ matrix.ssl }}
    env:
      TFLAGS: -DMQTT_LOCALHOST
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - run: sudo apt -y update ; sudo apt -y install binfmt-support qemu-user-static && ./test/setup_mqtt_server.sh && docker run --rm --privileged multiarch/qemu-user-static --reset -p yes && make -C test armhf SSL=${{ matrix.ssl }} MULTIREC=NO
  unamalgamated-mg_prefix:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        ssl: ["", BUILTIN, MBEDTLS, OPENSSL, WOLFSSL]
    name: unamalgamated-mg_prefix SSL=${{ matrix.ssl }}
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - run: sudo apt -y update ; sudo apt -y install libmbedtls-dev libwolfssl-dev
    - run: make -C test unamalgamated SSL=${{ matrix.ssl }} && make -C test mg_prefix
  valgrind:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        ssl: ["", BUILTIN, MBEDTLS, OPENSSL, WOLFSSL]
    name: Valgrind SSL=${{ matrix.ssl }}
    env:
      TFLAGS: -DMQTT_LOCALHOST
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - run: sudo apt -y update ; sudo apt -y install libmbedtls-dev libwolfssl-dev valgrind
    - run: ./test/setup_mqtt_server.sh && make -C test valgrind SSL=${{ matrix.ssl }}
  macos:
    runs-on: macos-latest
    strategy:
      fail-fast: false
      matrix:
        ssl: ["", BUILTIN, MBEDTLS, OPENSSL, WOLFSSL]
        select: [-DMG_ENABLE_POLL=0, -DMG_ENABLE_POLL=1]
        exclude:
        - ssl: MBEDTLS
          select: -DMG_ENABLE_POLL=0
        - ssl: MBEDTLS                # see issue#2694
          select: -DMG_ENABLE_POLL=1
        - ssl: OPENSSL
          select: -DMG_ENABLE_POLL=0
        - ssl: WOLFSSL
          select: -DMG_ENABLE_POLL=0
    name: macos SSL=${{ matrix.ssl }} TFLAGS=${{ matrix.select }}
    env:
      SSL: ${{ matrix.ssl }}
      TFLAGS: ${{ matrix.select }} -DMQTT_LOCALHOST ${{ matrix.env.tflags }} -DNO_ABORT -Wno-sign-conversion -Wno-undef # Workarounds for MbedTLS
      HOMEBREW_NO_AUTO_UPDATE: 1
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - uses: webfactory/ssh-agent@v0.9.1
      with:
            ssh-private-key: ${{ secrets.HEALTH_TESTS_SSH_KEY }}
    - run: brew install mbedtls wolfssl mosquitto gawk # jq openssl already pre-installed
    - run: /opt/homebrew/opt/mosquitto/sbin/mosquitto -c /Users/runner/work/mongoose/mongoose/test/mosquitto.conf.macos &
    - run: make -C test test ASAN_OPTIONS= MBEDTLS=$(echo $(brew --cellar)/mbedtls*/*) OPENSSL=$(echo $(brew --cellar)/openssl*/*) WOLFSSL=$(echo $(brew --cellar)/wolfssl*/*) > log
    - if: success() || failure()
      run: |
        cat log
        test/health.awk < log > json
        scp -o "StrictHostKeyChecking=no" json "root@176.9.217.245:/data/downloads/health/macos_test_cc_${{ matrix.ssl }}_${{ matrix.select }}_$(date +"%Y%m%d").json"

  windows:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      max-parallel: 1   # no parallel runs, to minimize MQTT errors
      matrix:
        target: [vc98, vc17, vc22, mingw, mingw++]
        ssl: ["", BUILTIN]
        select: [-DMG_ENABLE_POLL=0, -DMG_ENABLE_POLL=1]
        exclude:
        - target: vc98
          select: -DMG_ENABLE_POLL=1
    name: windows ${{ matrix.target }} SSL=${{ matrix.ssl }} TFLAGS=${{ matrix.select }}
    env:
      SSL: ${{ matrix.ssl }}
      TFLAGS: ${{ matrix.select }} -DMQTT_LOCALHOST -DNO_ABORT
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - uses: webfactory/ssh-agent@v0.9.1
      with:
            ssh-private-key: ${{ secrets.HEALTH_TESTS_SSH_KEY }}
    - run: ./test/setup_mqtt_server.sh && make -C test ${{ matrix.target }} > log
    - if: success() || failure()
      run: |
        cat log
        test/health.awk < log > json
        scp -o "StrictHostKeyChecking=no" json "root@176.9.217.245:/data/downloads/health/windows_${{ matrix.target }}_${{ matrix.cc }}_${{ matrix.ssl }}_${{ matrix.select }}_$(date +"%Y%m%d").json"
 
  arm:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        ssl: ["", BUILTIN]
    name: Arm SSL=${{ matrix.ssl }}
    steps:
    - uses: actions/checkout@v4
    - run: make -C test arm SSL=${{ matrix.ssl }}
  riscv:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        ssl: ["", BUILTIN]
    name: RISC-V SSL=${{ matrix.ssl }}
    steps:
    - uses: actions/checkout@v4
    - run: make -C test riscv SSL=${{ matrix.ssl }}

  tutorials:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        ssl: [-DMG_TLS=MG_TLS_NONE, -DMG_TLS=MG_TLS_BUILTIN]
    name: tutorials ${{ matrix.ssl }}
    steps:
    - uses: actions/checkout@v4
    - uses: webfactory/ssh-agent@v0.9.1
      with:
            ssh-private-key: ${{ secrets.HEALTH_TESTS_SSH_KEY }}
    - run: sudo apt -y install libpcap-dev
    - run: make -C test tutorials CFLAGS_EXTRA="${{ matrix.ssl }}" > log
    - if: success() || failure()
      run: |
        cat log
        test/health.awk < log > json
        scp -o "StrictHostKeyChecking=no" json "root@176.9.217.245:/data/downloads/health/tutorials_${{ matrix.ssl }}_$(date +"%Y%m%d").json"
    - run: make -C test clean_tutorials

  tutorials_win:
    runs-on: windows-latest
    strategy:
      fail-fast: false
      matrix:
        ssl: [-DMG_TLS=MG_TLS_NONE, -DMG_TLS=MG_TLS_BUILTIN]
    name: tutorials_win ${{ matrix.ssl }}
    steps:
    - uses: actions/checkout@v4
#    - uses: egor-tensin/setup-mingw@v2
#      with:
#        platform: x64
    - name: test they build
      run: make -C test tutorials_win CFLAGS_EXTRA="${{ matrix.ssl }}"
      shell: cmd
    - name: test they clean
      run: make -C test clean_tutorials_win
      shell: cmd
  tutorials_mac:
    runs-on: macos-latest
    env: { HOMEBREW_NO_AUTO_UPDATE: 1 }
    strategy:
      fail-fast: false
      matrix:
        ssl: [-DMG_TLS=MG_TLS_NONE, -DMG_TLS=MG_TLS_BUILTIN]
    name: tutorials_mac ${{ matrix.ssl }}
    steps:
    - uses: actions/checkout@v4
    - run: make -C test tutorials_mac CFLAGS_EXTRA="${{ matrix.ssl }}"
    - run: make -C test clean_tutorials_mac


  arduino:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - run: echo # nothing specific to install or do
    - run: make -C test/arduino
    - run: make -C test/arduino cleanall


#  wizard_examples:
#    runs-on: ubuntu-latest
#    strategy:
#      fail-fast: false
#      matrix:
#        example:
#          - path: esp32/esp32-idf
#    name: ${{ matrix.example.path }}
#    env:
#      GO: 0
#    steps:
#      - uses: actions/checkout@v4
#        with: { fetch-depth: 2 }
#      - run: echo # nothing specific to install or do
#          fi
#      - run: make -C tutorials/${{ matrix.example.path }} build

  wizard_examples_arm:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        example:
          - path: infineon/xmc47_relax-make-baremetal-builtin
          - path: infineon/xmc_plt2go_4400-make-baremetal-builtin
          - path: infineon/xmc72_evk-make-baremetal-builtin
          - path: nxp/frdm-mcxn947-make-baremetal-builtin
          - path: nxp/frdm-mcxn947-make-freertos-builtin
          - path: nxp/rt1020-evk-make-baremetal-builtin
          - path: nxp/rt1060-evk-make-baremetal-builtin
          - path: nxp/rt1170-evk-make-baremetal-builtin
          - path: pico-sdk/pico-w-picosdk-baremetal-builtin
          - path: pico-sdk/pico-2-w-picosdk-baremetal-builtin
          - path: pico-sdk/w5500-evb-pico-picosdk-baremetal-builtin
          - path: pico-sdk/w5500-evb-pico2-picosdk-baremetal-builtin
          - path: stm32/nucleo-f429zi-make-baremetal-builtin
          - path: stm32/nucleo-f429zi-make-freertos-builtin
          - path: stm32/nucleo-f746zg-make-baremetal-builtin
          - path: stm32/nucleo-f746zg-make-freertos-builtin
          - path: stm32/nucleo-h563zi-make-baremetal-builtin
          - path: stm32/nucleo-h563zi-make-freertos-builtin
          - path: stm32/nucleo-h723zg-make-baremetal-builtin
          - path: stm32/nucleo-h723zg-make-freertos-builtin
          - path: stm32/nucleo-h743zi-make-baremetal-builtin
          - path: stm32/nucleo-h743zi-make-freertos-builtin
          - path: stm32/stm32h573i-dk-make-baremetal-builtin
          - path: stm32/stm32h573i-dk-make-freertos-builtin
          - path: ti/ek-tm4c1294xl-make-baremetal-builtin
          - path: ti/ek-tm4c1294xl-make-freertos-builtin
    name: ${{ matrix.example.path }}
    env:
      GO: 0
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 2 }
      - run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
      - run: make -C tutorials/${{ matrix.example.path }} build


  generic_examples:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        example:
          - path: micropython/esp32
          - path: http/uart-bridge/esp32
          - path: http/http-client/esp8266/http-client-server
    name: ${{ matrix.example.path }}
    env:
      GO: 0
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 2 }
      - run: echo # nothing specific to install or do
      - run: make -C tutorials/${{ matrix.example.path }} build
  
  generic_examples_arm:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        example:
          - path: mqtt/mqtt-client/microchip/same54-xpro
          - path: nxp/nxp-frdmk66f-freertos
          - path: nxp/nxp-lpcxpresso54s018m-freertos
          - path: nxp/nxp-mimxrt1020-freertos
          - path: nxp/nxp-evkbimxrt1050-lwip-freertos
          - path: nxp/nxp-evkmimxrt1020-lwip-freertos
          - path: nxp/nxp-evkmimxrt1024-lwip-freertos
          - path: nxp/nxp-evkmimxrt1060-lwip-freertos
          - path: nxp/nxp-evkmimxrt1064-lwip-freertos
          - path: nxp/nxp-evkmimxrt1160-cm7-lwip-freertos
          - path: nxp/nxp-evkmimxrt1170-cm7-lwip-freertos
          - path: nxp/nxp-frdmk64f-lwip-freertos
          - path: nxp/nxp-frdmk66f-lwip-freertos
          - path: nxp/nxp-lpcxpresso54018-lwip-freertos
          - path: nxp/nxp-lpcxpresso54608-lwip-freertos
          - path: nxp/nxp-lpcxpresso54618-lwip-freertos
          - path: nxp/nxp-lpcxpresso54628-lwip-freertos
          - path: nxp/nxp-twrk65f180m-lwip-freertos
          - path: nxp/nxp-twrkv58f220m-lwip-freertos
          - path: pico-sdk/pico-rmii
          - path: stm32/nucleo-f429zi-make-baremetal-builtin-rndis
          - path: stm32/nucleo-f746zg-make-baremetal-builtin-rndis
          - path: stm32/nucleo-g031-make-baremetal-builtin
          - path: ti/ti-ek-tm4c1294xl-http-server
          - path: ti/ek-tm4c1294xl-make-baremetal-builtin-rndis
    name: ${{ matrix.example.path }}
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 2 }
      - run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
      - run: make -C tutorials/${{ matrix.example.path }} build

  device_dashboard_examples:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        example:
          - path: esp32
    name: ${{ matrix.example.path }}
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 2 }
      - run: echo # nothing specific to install or do
      - run: make -C tutorials/http/device-dashboard/${{ matrix.example.path }} build


  device_dashboard_examples_arm:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        ssl: ["", -DMG_TLS=MG_TLS_BUILTIN]
        example:
          - path: http/device-dashboard/microchip/same54-xpro
          - path: nxp/rt1020-evk-make-freertos-builtin
          - path: nxp/rt1060-evk-make-freertos-builtin
          - path: nxp/rt1170-evk-make-freertos-builtin
          - path: renesas/ek-ra6m4-make-baremetal-builtin
          - path: pico-sdk/pico-rndis-dashboard
          - path: pico-sdk/pico-w-picosdk-freertos-lwip
          - path: pico-sdk/pico-2-w-picosdk-freertos-lwip
          - path: stm32/nucleo-f746zg-make-freertos-tcp
          - path: stm32/nucleo-f746zg-make-baremetal-builtin-cmsis_driver
    name: ${{ matrix.example.path }} ${{ matrix.ssl }}
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 2 }
      - run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
      - run: make -C tutorials/${{ matrix.example.path }} build CFLAGS_EXTRA="${{ matrix.ssl }}"

#  mqtt_dashboard_examples:
#    runs-on: ubuntu-latest
#    strategy:
#      fail-fast: false
#      matrix:
#        example:
#          - path: 
#    name: ${{ matrix.example.path }}
#    steps:
#      - uses: actions/checkout@v4
#        with: { fetch-depth: 2 }
#      - run: echo # nothing specific to install or do
#      - run: make -C tutorials/${{ matrix.example.path }} build
      
  mqtt_dashboard_examples_arm:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        example:
          - path: pico-sdk/pico-rndis-device
    name: ${{ matrix.example.path }}
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 2 }
      - run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
      - run: make -C tutorials/${{ matrix.example.path }} build
      
#  dual_examples:
#    runs-on: ubuntu-latest
#    strategy:
#      fail-fast: false
#      matrix:
#        example:
#          - path: 
#    name: ${{ matrix.example.path }}
#    steps:
#      - uses: actions/checkout@v4
#        with: { fetch-depth: 2 }
#      - run: echo # nothing specific to install or do
#      - run: make -C tutorials/${{ matrix.example.path }} device_dashboard
#      - run: make -C tutorials/${{ matrix.example.path }} mqtt_dashboard

  cube_examples:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 2 }
      - run: sudo pip install yq
      - run: cd test/cube && make


================================================
FILE: .github/workflows/nightly_tests.yml
================================================
name: Full test
on:
  schedule:
    - cron: '0 23 * * *' # run at 11 PM UTC
  # Allow manual runs
  workflow_dispatch:
env:
  IPV6: 0
jobs:

  test_f7:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - name: baremetal
      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
    - run: make -C tutorials/stm32/nucleo-f746zg-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
    - run: make -C tutorials/stm32/nucleo-f746zg-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
    - run: make -C tutorials/stm32/nucleo-f746zg-make-freertos-tcp test VCON_API_KEY=${{secrets.VCON_API_KEY}}
    - name: Cube
      run: sudo pip install yq
#    - run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-f746zg-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5
#    - run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-f746zg-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5    
    - run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-f746zg-cube-freertos-lwip VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5

  test_f4:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - name: baremetal
      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
    - run: make -C tutorials/stm32/nucleo-f429zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
    - run: make -C tutorials/stm32/nucleo-f429zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
    - name: Cube
      run: sudo pip install yq
#    - run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-f429zi-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2
#    - run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-f429zi-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2
    - run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-f429zi-cube-freertos-lwip VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2

  test_h743:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 3 }
    - name: baremetal
      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
    - run: make -C tutorials/stm32/nucleo-h743zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
    - run: make -C tutorials/stm32/nucleo-h743zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#    - name: Cube
#      run: echo # nothing specific to install or do
#    - run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-h743zi-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=6
#    - run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-h743zi-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=6

  test_h723:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 3 }
    - name: baremetal
      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
    - run: make -C tutorials/stm32/nucleo-h723zg-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
    - run: make -C tutorials/stm32/nucleo-h723zg-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
    
  test_h5:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 3 }
    - name: baremetal
      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
    - run: make -C tutorials/stm32/nucleo-h563zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
    - run: make -C tutorials/stm32/nucleo-h563zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}

  test_rt1020:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 3 }
    - name: baremetal
      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
    - run: make -C tutorials/nxp/rt1020-evk-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
    - run: make -C tutorials/nxp/rt1020-evk-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}

  test_rt1060:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 3 }
    - name: baremetal
      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
    - run: make -C tutorials/nxp/rt1060-evk-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
    - run: make -C tutorials/nxp/rt1060-evk-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}

  test_rt1170:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 3 }
    - name: baremetal
      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
    - run: make -C tutorials/nxp/rt1170-evk-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
    - run: make -C tutorials/nxp/rt1170-evk-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}

  test_ra6m4:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 3 }
    - name: baremetal
      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
    - run: make -C tutorials/renesas/ek-ra6m4-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#    - run: make -C tutorials/renesas/ek-ra6m4-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}

  test_tm4c:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - name: baremetal
      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
    - run:  make -C tutorials/ti/ek-tm4c1294xl-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
    - run:  make -C tutorials/ti/ek-tm4c1294xl-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}

  test_same54:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - name: baremetal
      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
    - run:  make -C tutorials/http/device-dashboard/microchip/same54-xpro test VCON_API_KEY=${{secrets.VCON_API_KEY}}
    - run:  make -C tutorials/mqtt/mqtt-client/microchip/same54-xpro test VCON_API_KEY=${{secrets.VCON_API_KEY}}

  test_pico_w5500:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - name: SDK
      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
    - run:  make -C tutorials/pico-sdk/w5500-evb-pico-picosdk-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}


================================================
FILE: .github/workflows/on_demand.yml
================================================
name: On demand ad hoc test
on:
  workflow_dispatch:
env:
  IPV6: 0
jobs:
  macos:
    runs-on: macos-latest
    strategy:
      fail-fast: false
      matrix:
        ssl: [MBEDTLS, WOLFSSL]
        select: [-DMG_ENABLE_POLL=1]
    name: macos SSL=${{ matrix.ssl }} TFLAGS=${{ matrix.select }}
    env:
      SSL: ${{ matrix.ssl }}
      TFLAGS: ${{ matrix.select }} -DMQTT_LOCALHOST -DNO_ABORT -Wno-sign-conversion -Wno-undef # Workarounds for MbedTLS
      HOMEBREW_NO_AUTO_UPDATE: 1
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - uses: webfactory/ssh-agent@v0.9.1
      with:
            ssh-private-key: ${{ secrets.HEALTH_TESTS_SSH_KEY }}
    - run: brew install mbedtls wolfssl mosquitto gawk # jq openssl already pre-installed
    - run: /opt/homebrew/opt/mosquitto/sbin/mosquitto -c /Users/runner/work/mongoose/mongoose/test/mosquitto.conf.macos &
    - run: make -C test test ASAN_OPTIONS= MBEDTLS=$(echo $(brew --cellar)/mbedtls*/*) OPENSSL=$(echo $(brew --cellar)/openssl*/*) WOLFSSL=$(echo $(brew --cellar)/wolfssl*/*) > log
    - if: success() || failure()
      run: |
        cat log
        test/health.awk < log > json
        scp -o "StrictHostKeyChecking=no" json "root@176.9.217.245:/data/downloads/health/macos_test_cc_${{ matrix.ssl }}_${{ matrix.select }}_$(date +"%Y%m%d").json"


================================================
FILE: .github/workflows/quicktest.yml
================================================
name: Build and test - essentials
on:
  push:
    paths:
      - "**Makefile"
      - "**.c"
      - "**.h"
  # Allow manual runs
  workflow_dispatch:
env:
  IPV6: 0
jobs:
  linux:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        cc: [gcc, clang++]
        target: [test, mip_test]
        ssl: ["", BUILTIN]
    name: linux ${{ matrix.target }} CC=${{ matrix.cc }} SSL=${{ matrix.ssl }}
    env:
      CC: ${{ matrix.cc }}
      SSL: ${{ matrix.ssl }}
      TFLAGS: -DMQTT_LOCALHOST
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi
    - if: ${{ env.GO == 1 }}
      run: if [ "${{ matrix.target }}" == "test" ]; then ./test/setup_mqtt_server.sh ; fi && make -C test ${{ matrix.target }}
  s390:
    runs-on: ubuntu-latest
    env:
      TFLAGS: -DMQTT_LOCALHOST
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi
    - if: ${{ env.GO == 1 }}
      run: sudo apt -y update ; sudo apt -y install binfmt-support qemu-user-static && ./test/setup_mqtt_server.sh && docker run --rm --privileged multiarch/qemu-user-static --reset -p yes && make -C test s390
  armhf:
    runs-on: ubuntu-latest
    env:
      TFLAGS: -DMQTT_LOCALHOST
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi
    - if: ${{ env.GO == 1 }}
      run: sudo apt -y update ; sudo apt -y install binfmt-support qemu-user-static && ./test/setup_mqtt_server.sh && docker run --rm --privileged multiarch/qemu-user-static --reset -p yes && make -C test armhf
  unamalgamated-mg_prefix:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi
    - if: ${{ env.GO == 1 }}
      run: make -C test unamalgamated && make -C test mg_prefix
  macos:
    runs-on: macos-latest
    strategy:
      fail-fast: false
      matrix:
        ssl: ["", BUILTIN]
    name: macos SSL=${{ matrix.ssl }}
    env:
      SSL: ${{ matrix.ssl }}
      TFLAGS: -DMQTT_LOCALHOST # -DNO_SNTP_CHECK
      HOMEBREW_NO_AUTO_UPDATE: 1
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi
    - if: ${{ env.GO == 1 }}
      run: |
        brew install mosquitto
        /opt/homebrew/opt/mosquitto/sbin/mosquitto -c /Users/runner/work/mongoose/mongoose/test/mosquitto.conf.macos &
        make -C test test ASAN_OPTIONS=
  windows:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        target: [vc98, vc22, mingw++]
    name: windows ${{ matrix.target }}
    env:
      TFLAGS: -DMQTT_LOCALHOST
    steps:
    - uses: actions/checkout@v4
      with: { fetch-depth: 2 }
    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi
    - if: ${{ env.GO == 1 }}
      run: ./test/setup_mqtt_server.sh && make -C test ${{ matrix.target }} 
  arm:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - run: make -C test arm
  riscv:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - run: make -C test riscv

  tutorials:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - run: make -C test tutorials_essential
    - run: make -C test clean_tutorials_essential
  tutorials_win:
    runs-on: windows-latest
    steps:
    - uses: actions/checkout@v4
#    - uses: egor-tensin/setup-mingw@v2
#      with:
#        platform: x64
    - name: test they build
      run: make -C test tutorials_win
      shell: cmd
    - name: test they clean
      run: make -C test clean_tutorials_win
      shell: cmd
  tutorials_mac:
    runs-on: macos-latest
    env: { HOMEBREW_NO_AUTO_UPDATE: 1 }
    steps:
    - uses: actions/checkout@v4
    - run: make -C test tutorials_mac
    - run: make -C test clean_tutorials_mac


#  wizard_examples:
#    runs-on: ubuntu-latest
#    strategy:
#      fail-fast: false
#      matrix:
#        example:
#          - path: esp32/esp32-idf
#    name: ${{ matrix.example.path }}
#    env:
#      GO: 0
#    steps:
#      - uses: actions/checkout@v4
#        with: { fetch-depth: 2 }
#      - run: |
#          if ./test/match_changed_files.sh '^src'; then
#            echo GO=1 >> $GITHUB_ENV
#            # nothing specific to install or do
#          fi
#      - if: ${{ env.GO == 1 }}
#        run: make -C tutorials/${{ matrix.example.path }} build

  wizard_examples_arm:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        example:
          - path: infineon/xmc47_relax-make-baremetal-builtin
          - path: infineon/xmc_plt2go_4400-make-baremetal-builtin
          - path: infineon/xmc72_evk-make-baremetal-builtin
          - path: nxp/frdm-mcxn947-make-baremetal-builtin
          - path: nxp/frdm-mcxn947-make-freertos-builtin
          - path: nxp/rt1020-evk-make-baremetal-builtin
          - path: nxp/rt1060-evk-make-baremetal-builtin
          - path: nxp/rt1170-evk-make-baremetal-builtin
          - path: pico-sdk/pico-w-picosdk-baremetal-builtin
          - path: pico-sdk/pico-2-w-picosdk-baremetal-builtin
          - path: pico-sdk/w5500-evb-pico-picosdk-baremetal-builtin
          - path: pico-sdk/w5500-evb-pico2-picosdk-baremetal-builtin
          - path: stm32/nucleo-f429zi-make-baremetal-builtin
          - path: stm32/nucleo-f429zi-make-freertos-builtin
          - path: stm32/nucleo-f746zg-make-baremetal-builtin
          - path: stm32/nucleo-f746zg-make-freertos-builtin
          - path: stm32/nucleo-h563zi-make-baremetal-builtin
          - path: stm32/nucleo-h563zi-make-freertos-builtin
          - path: stm32/nucleo-h723zg-make-baremetal-builtin
          - path: stm32/nucleo-h723zg-make-freertos-builtin
          - path: stm32/nucleo-h743zi-make-baremetal-builtin
          - path: stm32/nucleo-h743zi-make-freertos-builtin
          - path: stm32/stm32h573i-dk-make-baremetal-builtin
          - path: stm32/stm32h573i-dk-make-freertos-builtin
          - path: ti/ek-tm4c1294xl-make-baremetal-builtin
          - path: ti/ek-tm4c1294xl-make-freertos-builtin
    name: ${{ matrix.example.path }}
    env:
      GO: 0
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 2 }
      - run: |
          if ./test/match_changed_files.sh '^src'; then
            echo GO=1 >> $GITHUB_ENV
            sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
          fi
      - if: ${{ env.GO == 1 }}
        run: make -C tutorials/${{ matrix.example.path }} build


  generic_examples:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        example:
          - path: http/uart-bridge/esp32
          - path: http/http-client/esp8266/http-client-server
    name: ${{ matrix.example.path }}
    env:
      GO: 0
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 2 }
      - run: if ./test/match_changed_files.sh '^src|^tutorials/http/uart-bridge|^tutorials/${{ matrix.example.path }}'; then echo GO=1 >> $GITHUB_ENV ; fi
      - if: ${{ env.GO == 1 }}
        run: |
          # nothing specific to install or do
      - if: ${{ env.GO == 1 }}
        run: make -C tutorials/${{ matrix.example.path }} build
  
  generic_examples_arm:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        example:
          - path: stm32/nucleo-g031-make-baremetal-builtin
    name: ${{ matrix.example.path }}
    env:
      GO: 0
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 2 }
      - run: if ./test/match_changed_files.sh '^src|^tutorials/${{ matrix.example.path }}'; then echo GO=1 >> $GITHUB_ENV ; fi
      - if: ${{ env.GO == 1 }}
        run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
      - if: ${{ env.GO == 1 }}
        run: make -C tutorials/${{ matrix.example.path }} build

  device_dashboard_examples:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        example:
          - path: esp32
    name: ${{ matrix.example.path }}
    env:
      GO: 0
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 2 }
      - run: |
          if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard'; then
            echo GO=1 >> $GITHUB_ENV
            # nothing specific to install or do
          fi
      - if: ${{ env.GO == 1 }}
        run: make -C tutorials/http/device-dashboard/${{ matrix.example.path }} build

  device_dashboard_examples_arm:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        example:
          - path: http/device-dashboard/microchip/same54-xpro
          - path: nxp/rt1020-evk-make-freertos-builtin
          - path: nxp/rt1060-evk-make-freertos-builtin
          - path: nxp/rt1170-evk-make-freertos-builtin
          - path: renesas/ek-ra6m4-make-baremetal-builtin
          - path: pico-sdk/pico-rndis-dashboard
          - path: pico-sdk/pico-w-picosdk-freertos-lwip
          - path: pico-sdk/pico-2-w-picosdk-freertos-lwip
          - path: stm32/nucleo-f746zg-make-freertos-tcp
          - path: stm32/nucleo-f746zg-make-baremetal-builtin-cmsis_driver
    name: ${{ matrix.example.path }}
    env:
      GO: 0
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 2 }
      - run: |
          if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard|^tutorials/${{ matrix.example.path }}'; then
            echo GO=1 >> $GITHUB_ENV
            sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
          fi
      - if: ${{ env.GO == 1 }}
        run: make -C tutorials/${{ matrix.example.path }} build

#  mqtt_dashboard_examples:
#    runs-on: ubuntu-latest
#    strategy:
#      fail-fast: false
#      matrix:
#        example:
#          - path: 
#    name: ${{ matrix.example.path }}
#    env:
#      GO: 0
#    steps:
#      - uses: actions/checkout@v4
#        with: { fetch-depth: 2 }
#      - run: |
#          if ./test/match_changed_files.sh '^src|tutorials/mqtt/mqtt-dashboard/device|^tutorials/${{ matrix.example.path }}'; then
#            echo GO=1 >> $GITHUB_ENV
#            # nothing specific to install or do
#          fi
#      - if: ${{ env.GO == 1 }}
#        run: make -C tutorials/${{ matrix.example.path }} build
      
  mqtt_dashboard_examples_arm:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        example:
          - path: pico-sdk/pico-rndis-device
    name: ${{ matrix.example.path }}
    env:
      GO: 0
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 2 }
      - run: |
          if ./test/match_changed_files.sh '^src|tutorials/mqtt/mqtt-dashboard/device|^tutorials/${{ matrix.example.path }}'; then
            echo GO=1 >> $GITHUB_ENV
            sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
          fi
      - if: ${{ env.GO == 1 }}
        run: make -C tutorials/${{ matrix.example.path }} build
      
  cube_examples:
    runs-on: ubuntu-latest
    env:
      GO: 0
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 2 }
      - run: |
          if ./test/match_changed_files.sh '^src|tutorials/stm32/nucleo-*-cube-*'; then
            echo GO=1 >> $GITHUB_ENV
            sudo pip install yq
          fi
      - if: ${{ env.GO == 1 }}
        run: cd test/cube && make

#  test_f7:
#    runs-on: ubuntu-latest
#    env:
#      GO: 0
#    steps:
#    - uses: actions/checkout@v4
#      with: { fetch-depth: 2 }
#    - name: baremetal
#      run: |
#        if ./test/match_changed_files.sh "^src|tutorials/http/device-dashboard|tutorials/stm32/nucleo-f7.*-make-" ; then
#          echo GO=1 >> $GITHUB_ENV
#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
#        fi
#    # always run baremetal on core or dashboard or specific example changes; other examples only on specific example changes
#    - if: ${{ env.GO == 1 }}
#      continue-on-error: true   # continue so next test has a chance to re-flash and exit from collisions and flash failures
#      run: |
#        if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard|tutorials/stm32/nucleo-f746zg-make-baremetal-builtin'; then
#          make -C tutorials/stm32/nucleo-f746zg-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#        fi
#    - if: ${{ env.GO == 1 }}
#      run: |
#        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-f746zg-make-freertos-builtin'; then
#          make -C tutorials/stm32/nucleo-f746zg-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#        fi
#    - if: ${{ env.GO == 1 }}
#      run: |
#        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-f746zg-make-freertos-tcp'; then
#          make -C tutorials/stm32/nucleo-f746zg-make-freertos-tcp test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#        fi
#    - name: Cube
#      run: |
#        echo GO=0 >> $GITHUB_ENV
#        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-f7.*-cube-'; then
#          echo GO=1 >> $GITHUB_ENV
#          # nothing specific to install or do
#        fi
##    - if: ${{ env.GO == 1 }}
##      run: |
##        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-f746zg-cube-baremetal-builtin'; then
##          make -C test/cube test PROJECTS=../../tutorials/stm32/nucleo-f746zg-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5
##        fi
##    - if: ${{ env.GO == 1 }}
##      run: |
##        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-f746zg-cube-freertos-builtin'; then
##          make -C test/cube test PROJECTS=../../tutorials/stm32/nucleo-f746zg-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5    
##        fi
#    - if: ${{ env.GO == 1 }}
#      run: |
#        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-f746zg-cube-freertos-lwip'; then
#          make -C test/cube test PROJECTS=../../tutorials/stm32/nucleo-f746zg-cube-freertos-lwip VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5
#        fi
#
#
#  test_f4:
#    runs-on: ubuntu-latest
#    env:
#      GO: 0
#    steps:
#    - uses: actions/checkout@v4
#      with: { fetch-depth: 2 }
#    - name: baremetal
#      run: |
#        if ./test/match_changed_files.sh "^src|tutorials/http/device-dashboard|tutorials/stm32/nucleo-f4.*-make-" ; then
#          echo GO=1 >> $GITHUB_ENV
#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
#        fi
#    - if: ${{ env.GO == 1 }}
#      continue-on-error: true
#      run: |
#        if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard|tutorials/stm32/nucleo-f429zi-make-baremetal-builtin'; then
#          make -C tutorials/stm32/nucleo-f429zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#        fi
#    - if: ${{ env.GO == 1 }}
#      run: |
#        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-f429zi-make-freertos-builtin'; then
#          make -C tutorials/stm32/nucleo-f429zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#        fi
#    - name: Cube
#      run: |
#        echo GO=0 >> $GITHUB_ENV
#        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-f4.*-cube-'; then
#          echo GO=1 >> $GITHUB_ENV
#          # nothing specific to install or do
#        fi
##    - if: ${{ env.GO == 1 }}
##      run: |
##        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-f429zi-cube-baremetal-builtin'; then
##          make -C test/cube test PROJECTS=../../tutorials/stm32/nucleo-f429zi-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2
##        fi
##    - if: ${{ env.GO == 1 }}
##      run: |
##        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-f429zi-cube-freertos-builtin'; then
##          make -C test/cube test PROJECTS=../../tutorials/stm32/nucleo-f429zi-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2
##        fi
#    - if: ${{ env.GO == 1 }}
#      run: |
#        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-f429zi-cube-freertos-lwip'; then
#          make -C test/cube test PROJECTS=../../tutorials/stm32/nucleo-f429zi-cube-freertos-lwip VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2
#        fi
#
#  test_h743:
#    runs-on: ubuntu-latest
#    env:
#      GO: 0
#    steps:
#    - uses: actions/checkout@v4
#      with: { fetch-depth: 3 }
#    - name: baremetal
#      run: |
#        if ./test/match_changed_files.sh "^src|tutorials/http/device-dashboard|tutorials/stm32/nucleo-h74.*-make-" ; then
#          echo GO=1 >> $GITHUB_ENV
#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
#        fi
#    - if: ${{ env.GO == 1 }}
#      continue-on-error: true
#      run: |
#        if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard|tutorials/stm32/nucleo-h743zi-make-baremetal-builtin'; then
#        make -C tutorials/stm32/nucleo-h743zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#        fi
#    - if: ${{ env.GO == 1 }}
#      run: |
#        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-h743zi-make-freertos-builtin'; then
#          make -C tutorials/stm32/nucleo-h743zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#        fi
##    - name: Cube
##      run: |
##        echo GO=0 >> $GITHUB_ENV
##        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-h74.*-cube-'; then
##          echo GO=1 >> $GITHUB_ENV
##          # nothing specific to install or do
##        fi
##    - if: ${{ env.GO == 1 }}
##      run: |
##        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-h743zi-cube-baremetal-builtin'; then
##          make -C test/cube test PROJECTS=../../tutorials/stm32/nucleo-h743zi-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=6
##        fi
##    - if: ${{ env.GO == 1 }}
##      run: |
##        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-h743zi-cube-freertos-builtin'; then
##          make -C test/cube test PROJECTS=../../tutorials/stm32/nucleo-h743zi-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=6
##        fi
#
#  test_h723:
#    runs-on: ubuntu-latest
#    env:
#      GO: 0
#    steps:
#    - uses: actions/checkout@v4
#      with: { fetch-depth: 3 }
#    - name: baremetal
#      run: |
#        if ./test/match_changed_files.sh "^src|tutorials/http/device-dashboard|tutorials/stm32/nucleo-h72.*-make-" ; then
#          echo GO=1 >> $GITHUB_ENV
#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
#        fi
#    - if: ${{ env.GO == 1 }}
#      continue-on-error: true
#      run: |
#        if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard|tutorials/stm32/nucleo-h723zg-make-baremetal-builtin'; then
#          make -C tutorials/stm32/nucleo-h723zg-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#        fi
#    - if: ${{ env.GO == 1 }}
#      run: |
#        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-h723zg-make-freertos-builtin'; then
#          make -C tutorials/stm32/nucleo-h723zg-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#        fi
#    
#  test_h5:
#    runs-on: ubuntu-latest
#    env:
#      GO: 0
#    steps:
#    - uses: actions/checkout@v4
#      with: { fetch-depth: 3 }
#    - name: baremetal
#      run: |
#        if ./test/match_changed_files.sh "^src|tutorials/http/device-dashboard|tutorials/stm32/nucleo-h5.*-make-" ; then
#          echo GO=1 >> $GITHUB_ENV
#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
#        fi
#    - if: ${{ env.GO == 1 }}
#      continue-on-error: true
#      run: |
#        if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard|tutorials/stm32/nucleo-h563zi-make-baremetal-builtin'; then
#          make -C tutorials/stm32/nucleo-h563zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#        fi
#    - if: ${{ env.GO == 1 }}
#      run: |
#        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-h563zi-make-freertos-builtin'; then
#          make -C tutorials/stm32/nucleo-h563zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#        fi
#
#  test_rt1020:
#    runs-on: ubuntu-latest
#    env:
#      GO: 0
#    steps:
#    - uses: actions/checkout@v4
#      with: { fetch-depth: 3 }
#    - name: baremetal
#      run: |
#        if ./test/match_changed_files.sh "^src|tutorials/http/device-dashboard|tutorials/nxp/rt1020.*-make-" ; then
#          echo GO=1 >> $GITHUB_ENV
#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
#        fi
#    - if: ${{ env.GO == 1 }}
#      continue-on-error: true
#      run: |
#        if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard|tutorials/nxp/rt1020-evk-make-baremetal-builtin'; then
#          make -C tutorials/nxp/rt1020-evk-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#        fi
#    - if: ${{ env.GO == 1 }}
#      run: |
#        if ./test/match_changed_files.sh 'tutorials/nxp/rt1020-evk-make-freertos-builtin'; then
#          make -C tutorials/nxp/rt1020-evk-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#        fi
#
#  test_rt1060:
#    runs-on: ubuntu-latest
#    env:
#      GO: 0
#    steps:
#    - uses: actions/checkout@v4
#      with: { fetch-depth: 3 }
#    - name: baremetal
#      run: |
#        if ./test/match_changed_files.sh "^src|tutorials/http/device-dashboard|tutorials/nxp/rt1060.*-make-" ; then
#          echo GO=1 >> $GITHUB_ENV
#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
#        fi
#    - if: ${{ env.GO == 1 }}
#      continue-on-error: true
#      run: |
#        if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard|tutorials/nxp/rt1060-evk-make-baremetal-builtin'; then
#          make -C tutorials/nxp/rt1060-evk-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#        fi
#    - if: ${{ env.GO == 1 }}
#      run: |
#        if ./test/match_changed_files.sh 'tutorials/nxp/rt1060-evk-make-freertos-builtin'; then
#          make -C tutorials/nxp/rt1060-evk-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#        fi
#
#  test_rt1170:
#    runs-on: ubuntu-latest
#    env:
#      GO: 0
#    steps:
#    - uses: actions/checkout@v4
#      with: { fetch-depth: 3 }
#    - name: baremetal
#      run: |
#        if ./test/match_changed_files.sh "^src|tutorials/http/device-dashboard|tutorials/nxp/rt1170.*-make-" ; then
#          echo GO=1 >> $GITHUB_ENV
#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
#        fi
#    - if: ${{ env.GO == 1 }}
#      continue-on-error: true
#      run: |
#        if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard|tutorials/nxp/rt1170-evk-make-baremetal-builtin'; then
#          make -C tutorials/nxp/rt1170-evk-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#        fi
#    - if: ${{ env.GO == 1 }}
#      run: |
#        if ./test/match_changed_files.sh 'tutorials/nxp/rt1170-evk-make-freertos-builtin'; then
#          make -C tutorials/nxp/rt1170-evk-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#        fi
#
#  test_ra6m4:
#    runs-on: ubuntu-latest
#    env:
#      GO: 0
#    steps:
#    - uses: actions/checkout@v4
#      with: { fetch-depth: 3 }
#    - name: baremetal
#      run: |
#        if ./test/match_changed_files.sh "^src|tutorials/http/device-dashboard|tutorials/renesas/ek-ra6m4.*-make-" ; then
#          echo GO=1 >> $GITHUB_ENV
#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
#        fi
#    - if: ${{ env.GO == 1 }}
#      continue-on-error: true
#      run: |
#        if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard|tutorials/renesas/ek-ra6m4-make-baremetal-builtin'; then
#          make -C tutorials/renesas/ek-ra6m4-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#        fi
##    - if: ${{ env.GO == 1 }}
##      run: |
##        if ./test/match_changed_files.sh 'tutorials/renesas/ek-ra6m4-make-freertos-builtin'; then
##          make -C tutorials/renesas/ek-ra6m4-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
##        fi
#
#  test_tm4c:
#    runs-on: ubuntu-latest
#    env:
#      GO: 0
#    steps:
#    - uses: actions/checkout@v4
#      with: { fetch-depth: 2 }
#    - name: baremetal
#      run: |
#        if ./test/match_changed_files.sh "^src|tutorials/http/device-dashboard|tutorials/ti/ek-tm4c.*-make-" ; then
#          echo GO=1 >> $GITHUB_ENV
#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
#        fi
#    - if: ${{ env.GO == 1 }}
#      run: |
#        if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard|tutorials/ti/ek-tm4c1294xl-make-baremetal-builtin'; then
#          make -C tutorials/ti/ek-tm4c1294xl-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#        fi
#    - if: ${{ env.GO == 1 }}
#      run: |
#        if ./test/match_changed_files.sh 'tutorials/ti/ek-tm4c1294xl-make-freertos-builtin'; then
#          make -C tutorials/ti/ek-tm4c1294xl-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#        fi
#
#  test_same54:
#    runs-on: ubuntu-latest
#    env:
#      GO: 0
#    steps:
#    - uses: actions/checkout@v4
#      with: { fetch-depth: 2 }
#    - name: baremetal
#      run: |
#        if ./test/match_changed_files.sh "^src|tutorials/http/device-dashboard|tutorials/mqtt/mqtt-client" ; then
#          echo GO=1 >> $GITHUB_ENV
#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
#        fi
#    - if: ${{ env.GO == 1 }}
#      run: |
#        if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard'; then
#          make -C tutorials/http/device-dashboard/microchip/same54-xpro test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#        fi
#    - if: ${{ env.GO == 1 }}
#      run: |
#        if ./test/match_changed_files.sh '^src|tutorials/mqtt/mqtt-client'; then
#          make -C tutorials/mqtt/mqtt-client/microchip/same54-xpro test VCON_API_KEY=${{secrets.VCON_API_KEY}}
#        fi
#
#  test_pico_w5500:
#    runs-on: ubuntu-latest
#    env:
#      GO: 0
#    steps:
#    - uses: actions/checkout@v4
#      with: { fetch-depth: 2 }
#    - name: SDK
#      run: |
#        if ./test/match_changed_files.sh "^src" ; then
#          echo GO=1 >> $GITHUB_ENV
#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
#        fi
#    - if: ${{ env.GO == 1 }}
#      run:  make -C tutorials/pico-sdk/w5500-evb-pico-picosdk-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}



================================================
FILE: .github/workflows/test.yml
================================================
name: original workflow, outdated # *** YES, OUTDATED *** kept for hystorical/reference purposes, attachment, etc.
on:
  workflow_dispatch:
env:
  IPV6: 0
jobs:
  linux:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        cc: [gcc, clang, g++, clang++]
        target: [test, mip_test]
        ssl: ["", MBEDTLS, OPENSSL]
        select: ["-DMG_ENABLE_POLL=0 -DMG_ENABLE_EPOLL=0", "-DMG_ENABLE_POLL=1 -DMG_ENABLE_EPOLL=0", "-DMG_ENABLE_POLL=0 -DMG_ENABLE_EPOLL=1"]
        exclude:
        - ssl: MBEDTLS
          select: "-DMG_ENABLE_POLL=0 -DMG_ENABLE_EPOLL=0"
        - ssl: MBEDTLS
          select: "-DMG_ENABLE_POLL=1 -DMG_ENABLE_EPOLL=0"
        - ssl: OPENSSL
          select: "-DMG_ENABLE_POLL=0 -DMG_ENABLE_EPOLL=0"
        - ssl: OPENSSL
          select: "-DMG_ENABLE_POLL=1 -DMG_ENABLE_EPOLL=0"
    name: linux ${{ matrix.target }} CC=${{ matrix.cc }} SSL=${{ matrix.ssl }} TFLAGS=${{ matrix.select }}
    env:
      CC: ${{ matrix.cc }}
      SSL: ${{ matrix.ssl }}
      TFLAGS: ${{ matrix.select }}
    steps:
    - uses: actions/checkout@v3
      with: { fetch-depth: 2 }
    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi
    - if: ${{ env.GO == 1 }}
      run: ./test/setup_ga_network.sh && sudo apt -y update ; sudo apt -y install libmbedtls-dev && make ${{ matrix.target }}
  s390:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
      with: { fetch-depth: 2 }
    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi
    - if: ${{ env.GO == 1 }}
      run: sudo apt -y update ; sudo apt -y install qemu binfmt-support qemu-user-static && docker run --rm --privileged multiarch/qemu-user-static --reset -p yes && make s390
  armhf:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
      with: { fetch-depth: 2 }
    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi
    - if: ${{ env.GO == 1 }}
      run: sudo apt -y update ; sudo apt -y install qemu binfmt-support qemu-user-static && docker run --rm --privileged multiarch/qemu-user-static --reset -p yes && make armhf
  linux2:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
      with: { fetch-depth: 2 }
    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi
    - if: ${{ env.GO == 1 }}
      run: sudo apt -y update ; sudo apt -y install libmbedtls-dev valgrind
    - if: ${{ env.GO == 1 }}
      run: make unamalgamated && make valgrind && make mg_prefix
  macos:
    runs-on: macos-latest
    strategy:
      fail-fast: false
      matrix:
        ssl: ["", MBEDTLS, OPENSSL]
        select: [-DMG_ENABLE_POLL=0, -DMG_ENABLE_POLL=1]
        exclude:
        - ssl: MBEDTLS
          select: -DMG_ENABLE_POLL=0
        - ssl: OPENSSL
          select: -DMG_ENABLE_POLL=0
    name: macos SSL=${{ matrix.ssl }} TFLAGS=${{ matrix.select }}
    env:
      SSL: ${{ matrix.ssl }}
      TFLAGS: ${{ matrix.select }} -DNO_SNTP_CHECK -Wno-sign-conversion # Workaround for MbedTLS 3.5.0
      HOMEBREW_NO_AUTO_UPDATE: 1
    steps:
    - uses: actions/checkout@v3
      with: { fetch-depth: 2 }
    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi
    - if: ${{ env.GO == 1 }}
      run: brew install jq mbedtls openssl
    - if: ${{ env.GO == 1 }}
      run:  make test ASAN_OPTIONS= MBEDTLS=`echo /usr/local/Cellar/mbedtls*/*` OPENSSL=`echo /usr/local/Cellar/openssl*/*`
    - if: ${{ env.GO == 1 }}
      run: make mg_prefix
  windows:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        target: [vc98, vc17, vc22, mingw, mingw++]
        select: [-DMG_ENABLE_POLL=0, -DMG_ENABLE_POLL=1]
        exclude:
        - target: vc98
          select: -DMG_ENABLE_POLL=1
    name: windows ${{ matrix.target }} TFLAGS=${{ matrix.select }}
    env:
      TFLAGS: ${{ matrix.select }}
    steps:
    - uses: actions/checkout@v3
      with: { fetch-depth: 2 }
    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi
    - if: ${{ env.GO == 1 }}
      run: make ${{ matrix.target }} 
  arm:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - run: make arm
  riscv:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - run: make riscv

  examples:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - run: sudo apt -y install libmbedtls-dev libpcap-dev
    - run: make examples
    - run: make clean
  examples_win:
    runs-on: windows-latest
    steps:
    - uses: actions/checkout@v3
#    - uses: egor-tensin/setup-mingw@v2
#      with:
#        platform: x64
    - name: test they build
      run: make examples_win
      shell: cmd
    - name: test they clean
      run: make clean_examples_win
      shell: cmd
  examples_mac:
    runs-on: macos-latest
    env: { HOMEBREW_NO_AUTO_UPDATE: 1 }
    steps:
    - uses: actions/checkout@v3
    - run: make examples_mac
    - run: make clean_examples_mac


  arduino:
    runs-on: ubuntu-latest
    env:
      GO: 0
    steps:
    - uses: actions/checkout@v3
      with: { fetch-depth: 2 }
    - run: |
        if ./test/match_changed_files.sh "^src|examples/device-dashboard|examples/arduino" ; then
          echo GO=1 >> $GITHUB_ENV
          # nothing specific to install or do
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        if ./test/match_changed_files.sh '^src|examples/arduino'; then
          make -C examples/arduino arduino-xiao
        fi
#    - if: ${{ env.GO == 1 }}
#      run: |
#        if ./test/match_changed_files.sh '^src|examples/arduino'; then
#          make -C examples/arduino arduino-nano
#        fi
    - if: ${{ env.GO == 1 }}
      run: make -C examples/arduino clean


  generic_examples:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        example:
          - path: esp32/uart-bridge
          - path: esp32/micropython
          - path: esp8266/http-client-server
    name: ${{ matrix.example.path }}
    env:
      GO: 0
    steps:
      - uses: actions/checkout@v3
        with: { fetch-depth: 2 }
      - run: if ./test/match_changed_files.sh '^src|^examples/${{ matrix.example.path }}'; then echo GO=1 >> $GITHUB_ENV ; fi
      - if: ${{ env.GO == 1 }}
        run: |
          # nothing specific to install or do
      - if: ${{ env.GO == 1 }}
        run: make -C examples/${{ matrix.example.path }} build
  
  generic_examples_arm:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        example:
          - path: microchip/same54-xpro/mqtt-client
          - path: infineon/infineon-xmc4700_4800-lwip-rtx-rtos
          - path: nxp/nxp-mimxrt1020-azurertos
          - path: nxp/nxp-frdmk66f-freertos
          - path: nxp/nxp-lpcxpresso54s018m-freertos
          - path: nxp/nxp-mimxrt1020-freertos
          - path: nxp/nxp-evkbimxrt1050-lwip-freertos
          - path: nxp/nxp-evkmimxrt1020-lwip-freertos
          - path: nxp/nxp-evkmimxrt1024-lwip-freertos
          - path: nxp/nxp-evkmimxrt1060-lwip-freertos
          - path: nxp/nxp-evkmimxrt1064-lwip-freertos
          - path: nxp/nxp-evkmimxrt1160-cm7-lwip-freertos
          - path: nxp/nxp-evkmimxrt1170-cm7-lwip-freertos
          - path: nxp/nxp-frdmk64f-lwip-freertos
          - path: nxp/nxp-frdmk66f-lwip-freertos
          - path: nxp/nxp-lpcxpresso54018-lwip-freertos
          - path: nxp/nxp-lpcxpresso54608-lwip-freertos
          - path: nxp/nxp-lpcxpresso54618-lwip-freertos
          - path: nxp/nxp-lpcxpresso54628-lwip-freertos
          - path: nxp/nxp-twrk65f180m-lwip-freertos
          - path: nxp/nxp-twrkv58f220m-lwip-freertos
          - path: rp2040/pico-rmii
          - path: stm32/nucleo-f429zi-make-baremetal-builtin-rndis
          - path: stm32/nucleo-f746zg-make-baremetal-builtin-rndis
          - path: stm32/nucleo-g031-make-baremetal-builtin
          - path: ti/ti-ek-tm4c1294xl-http-server
          - path: ti/ek-tm4c1294xl-make-baremetal-builtin-rndis
    name: ${{ matrix.example.path }}
    env:
      GO: 0
    steps:
      - uses: actions/checkout@v3
        with: { fetch-depth: 2 }
      - run: if ./test/match_changed_files.sh '^src|^examples/${{ matrix.example.path }}'; then echo GO=1 >> $GITHUB_ENV ; fi
      - if: ${{ env.GO == 1 }}
        run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
      - if: ${{ env.GO == 1 }}
        run: make -C examples/${{ matrix.example.path }} build

  device_dashboard_examples:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        example:
          - path: esp32/device-dashboard
    name: ${{ matrix.example.path }}
    env:
      GO: 0
    steps:
      - uses: actions/checkout@v3
        with: { fetch-depth: 2 }
      - run: |
          if ./test/match_changed_files.sh '^src|examples/device-dashboard|^examples/${{ matrix.example.path }}'; then
            echo GO=1 >> $GITHUB_ENV
            # nothing specific to install or do
          fi
      - if: ${{ env.GO == 1 }}
        run: make -C examples/${{ matrix.example.path }} build

  device_dashboard_examples_arm:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        example:
          - path: microchip/same54-xpro/device-dashboard
          - path: nxp/rt1020-evk-make-baremetal-builtin
          - path: nxp/rt1020-evk-make-freertos-builtin
          - path: nxp/rt1060-evk-make-baremetal-builtin
          - path: nxp/rt1060-evk-make-freertos-builtin
          - path: rp2040/pico-rndis-dashboard
          - path: rp2040/pico-w
          - path: rp2040/pico-w5500
          - path: stm32/nucleo-f429zi-make-baremetal-builtin
          - path: stm32/nucleo-f429zi-make-freertos-builtin
          - path: stm32/nucleo-f746zg-make-baremetal-builtin
          - path: stm32/nucleo-f746zg-make-freertos-builtin
          - path: stm32/nucleo-f746zg-make-freertos-tcp
          - path: stm32/nucleo-f746zg-make-baremetal-builtin-cmsis_driver
          - path: stm32/nucleo-h563zi-make-baremetal-builtin
          - path: stm32/nucleo-h563zi-make-freertos-builtin
          - path: stm32/nucleo-h723zg-make-freertos-builtin
          - path: stm32/nucleo-h743zi-make-baremetal-builtin
          - path: stm32/nucleo-h743zi-make-freertos-builtin
          - path: stm32/stm32h573i-dk-make-baremetal-builtin
          - path: stm32/stm32h573i-dk-make-freertos-builtin
          - path: ti/ek-tm4c1294xl-make-baremetal-builtin
          - path: ti/ek-tm4c1294xl-make-freertos-builtin
    name: ${{ matrix.example.path }}
    env:
      GO: 0
    steps:
      - uses: actions/checkout@v3
        with: { fetch-depth: 2 }
      - run: |
          if ./test/match_changed_files.sh '^src|examples/device-dashboard|^examples/${{ matrix.example.path }}'; then
            echo GO=1 >> $GITHUB_ENV
            sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
          fi
      - if: ${{ env.GO == 1 }}
        run: make -C examples/${{ matrix.example.path }} build

#  mqtt_dashboard_examples:
#    runs-on: ubuntu-latest
#    strategy:
#      fail-fast: false
#      matrix:
#        example:
#          - path: 
#    name: ${{ matrix.example.path }}
#    env:
#      GO: 0
#    steps:
#      - uses: actions/checkout@v3
#        with: { fetch-depth: 2 }
#      - run: |
#          if ./test/match_changed_files.sh '^src|examples/mqtt-dashboard/device|^examples/${{ matrix.example.path }}'; then
#            echo GO=1 >> $GITHUB_ENV
#            # nothing specific to install or do
#          fi
#      - if: ${{ env.GO == 1 }}
#        run: make -C examples/${{ matrix.example.path }} build
      
  mqtt_dashboard_examples_arm:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        example:
          - path: rp2040/pico-rndis-device
    name: ${{ matrix.example.path }}
    env:
      GO: 0
    steps:
      - uses: actions/checkout@v3
        with: { fetch-depth: 2 }
      - run: |
          if ./test/match_changed_files.sh '^src|examples/mqtt-dashboard/device|^examples/${{ matrix.example.path }}'; then
            echo GO=1 >> $GITHUB_ENV
            sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
          fi
      - if: ${{ env.GO == 1 }}
        run: make -C examples/${{ matrix.example.path }} build
      
#  dual_examples:
#    runs-on: ubuntu-latest
#    strategy:
#      fail-fast: false
#      matrix:
#        example:
#          - path: 
#    name: ${{ matrix.example.path }}
#    env:
#      GO: 0
#    steps:
#      - uses: actions/checkout@v3
#        with: { fetch-depth: 2 }
#      - run: |
#          if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/mqtt-dashboard/device|^examples/${{ matrix.example.path }}'; then
#            echo GO=1 >> $GITHUB_ENV
#            # nothing specific to install or do
#          fi
#      - if: ${{ env.GO == 1 }}
#        run: |
#          if ./test/match_changed_files.sh '^src|examples/device-dashboard|^examples/${{ matrix.example.path }}'; then
#            make -C examples/${{ matrix.example.path }} device_dashboard
#          fi
#      - if: ${{ env.GO == 1 }}
#        run: |
#          if ./test/match_changed_files.sh '^src|examples/mqtt-dashboard/device|^examples/${{ matrix.example.path }}'; then
#            make -C examples/${{ matrix.example.path }} mqtt_dashboard
#          fi

  dual_examples_arm:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        example:
          - path: stm32/nucleo-h723zg-make-baremetal-builtin
    name: ${{ matrix.example.path }}
    env:
      GO: 0
    steps:
      - uses: actions/checkout@v3
        with: { fetch-depth: 2 }
      - run: |
          if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/mqtt-dashboard/device|^examples/${{ matrix.example.path }}'; then
            echo GO=1 >> $GITHUB_ENV
            sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
          fi
      - if: ${{ env.GO == 1 }}
        run: |
          if ./test/match_changed_files.sh '^src|examples/device-dashboard|^examples/${{ matrix.example.path }}'; then
            make -C examples/${{ matrix.example.path }} device_dashboard
          fi
      - if: ${{ env.GO == 1 }}
        run: |
          if ./test/match_changed_files.sh '^src|examples/mqtt-dashboard/device|^examples/${{ matrix.example.path }}'; then
            make -C examples/${{ matrix.example.path }} mqtt_dashboard
          fi

  cube_examples:
    runs-on: ubuntu-latest
    env:
      GO: 0
    steps:
      - uses: actions/checkout@v3
        with: { fetch-depth: 2 }
      - run: |
          if ./test/match_changed_files.sh '^src|examples/stm32/nucleo-*-cube-*'; then
            echo GO=1 >> $GITHUB_ENV
            # nothing specific to install or do
          fi
      - if: ${{ env.GO == 1 }}
        run: cd test/cube && make

  zephyr_examples:
    runs-on: ubuntu-latest
    env:
      GO: 0
    steps:
      - uses: actions/checkout@v3
        with: { fetch-depth: 2 }
      - run: |
          if ./test/match_changed_files.sh '^src/.*.[ch]|^examples/zephyr'; then
            echo GO=1 >> $GITHUB_ENV
            sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
            fi
      - if: ${{ env.GO == 1 }}
        run: make -C examples/zephyr init
      - name: minify manifest
        if: ${{ env.GO == 1 }}
        uses: mikefarah/yq@master
        with:
          cmd: yq -i eval '(.manifest.defaults, .manifest.remotes, .manifest.projects[] | select(.name == "cmsis" or .name == "hal_stm32" or .name == "mbedtls" or .name == "mcuboot" or .name == "picolibc" | del(.null) ), .manifest.self) as $i ireduce({};setpath($i | path; $i)) | del(.manifest.projects.[].null) | del(..|select(length==0))' examples/zephyr/zephyrproject/zephyr/west.yml
      - if: ${{ env.GO == 1 }}
        run: make -C examples/zephyr update
      - if: ${{ env.GO == 1 }}
        run: make -C examples/zephyr/device-dashboard build
      - if: ${{ env.GO == 1 }}
        run: make -C examples/zephyr/http-client build
      - if: ${{ env.GO == 1 }}
        run: make -C examples/zephyr/http-server build
      - if: ${{ env.GO == 1 }}
        run: make -C examples/zephyr/mqtt-aws-client build
      - if: ${{ env.GO == 1 }}
        run: make -C examples/zephyr/websocket-server build

  test_f7:
    runs-on: ubuntu-latest
    env:
      GO: 0
    steps:
    - uses: actions/checkout@v3
      with: { fetch-depth: 2 }
    - name: baremetal
      run: |
        if ./test/match_changed_files.sh "^src|examples/device-dashboard|examples/stm32/nucleo-f7.*-make-" ; then
          echo GO=1 >> $GITHUB_ENV
          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f746zg-make-baremetal-builtin'; then
          make -C examples/stm32/nucleo-f746zg-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f746zg-make-freertos-builtin'; then
          make -C examples/stm32/nucleo-f746zg-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f746zg-make-freertos-tcp'; then
          make -C examples/stm32/nucleo-f746zg-make-freertos-tcp test VCON_API_KEY=${{secrets.VCON_API_KEY}}
        fi
    - name: Cube
      run: |
        echo GO=0 >> $GITHUB_ENV
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f7.*-cube-'; then
          echo GO=1 >> $GITHUB_ENV
          # nothing specific to install or do
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f746zg-cube-baremetal-builtin'; then
          make -C test/cube test PROJECTS=../../examples/stm32/nucleo-f746zg-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f746zg-cube-freertos-builtin'; then
          make -C test/cube test PROJECTS=../../examples/stm32/nucleo-f746zg-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5    
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f746zg-cube-freertos-lwip'; then
          make -C test/cube test PROJECTS=../../examples/stm32/nucleo-f746zg-cube-freertos-lwip VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5
        fi


  test_f4:
    runs-on: ubuntu-latest
    env:
      GO: 0
    steps:
    - uses: actions/checkout@v3
      with: { fetch-depth: 2 }
    - name: baremetal
      run: |
        if ./test/match_changed_files.sh "^src|examples/device-dashboard|examples/stm32/nucleo-f4.*-make-" ; then
          echo GO=1 >> $GITHUB_ENV
          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f429zi-make-baremetal-builtin'; then
          make -C examples/stm32/nucleo-f429zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f429zi-make-freertos-builtin'; then
          make -C examples/stm32/nucleo-f429zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
        fi
    - name: Cube
      run: |
        echo GO=0 >> $GITHUB_ENV
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f4.*-cube-'; then
          echo GO=1 >> $GITHUB_ENV
          # nothing specific to install or do
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f429zi-cube-baremetal-builtin'; then
          make -C test/cube test PROJECTS=../../examples/stm32/nucleo-f429zi-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f429zi-cube-freertos-builtin'; then
          make -C test/cube test PROJECTS=../../examples/stm32/nucleo-f429zi-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f429zi-cube-freertos-lwip'; then
          make -C test/cube test PROJECTS=../../examples/stm32/nucleo-f429zi-cube-freertos-lwip VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2
        fi

  test_h743:
    runs-on: ubuntu-latest
    env:
      GO: 0
    steps:
    - uses: actions/checkout@v3
      with: { fetch-depth: 3 }
    - name: baremetal
      run: |
        if ./test/match_changed_files.sh "^src|examples/device-dashboard|examples/stm32/nucleo-h74.*-make-" ; then
          echo GO=1 >> $GITHUB_ENV
          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-h743zi-make-baremetal-builtin'; then
        make -C examples/stm32/nucleo-h743zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-h743zi-make-freertos-builtin'; then
          make -C examples/stm32/nucleo-h743zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
        fi
    - name: Cube
      run: |
        echo GO=0 >> $GITHUB_ENV
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-h74.*-cube-'; then
          echo GO=1 >> $GITHUB_ENV
          # nothing specific to install or do
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-h743zi-cube-baremetal-builtin'; then
          make -C test/cube test PROJECTS=../../examples/stm32/nucleo-h743zi-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=6
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-h743zi-cube-freertos-builtin'; then
          make -C test/cube test PROJECTS=../../examples/stm32/nucleo-h743zi-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=6
        fi

  test_h723:
    runs-on: ubuntu-latest
    env:
      GO: 0
    steps:
    - uses: actions/checkout@v3
      with: { fetch-depth: 3 }
    - name: baremetal
      run: |
        if ./test/match_changed_files.sh "^src|examples/device-dashboard|examples/stm32/nucleo-h72.*-make-" ; then
          echo GO=1 >> $GITHUB_ENV
          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-h723zg-make-baremetal-builtin'; then
          make -C examples/stm32/nucleo-h723zg-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-h723zg-make-freertos-builtin'; then
          make -C examples/stm32/nucleo-h723zg-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
        fi
    
  test_h5:
    runs-on: ubuntu-latest
    env:
      GO: 0
    steps:
    - uses: actions/checkout@v3
      with: { fetch-depth: 3 }
    - name: baremetal
      run: |
        if ./test/match_changed_files.sh "^src|examples/device-dashboard|examples/stm32/nucleo-h5.*-make-" ; then
          echo GO=1 >> $GITHUB_ENV
          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-h563zi-make-baremetal-builtin'; then
          make -C examples/stm32/nucleo-h563zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-h563zi-make-freertos-builtin'; then
          make -C examples/stm32/nucleo-h563zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
        fi

  test_rt1020:
    runs-on: ubuntu-latest
    env:
      GO: 0
    steps:
    - uses: actions/checkout@v3
      with: { fetch-depth: 3 }
    - name: baremetal
      run: |
        if ./test/match_changed_files.sh "^src|examples/device-dashboard|examples/nxp/rt1020.*-make-" ; then
          echo GO=1 >> $GITHUB_ENV
          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        #if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/nxp/rt1020-evk-make-baremetal-builtin'; then
        if ./test/match_changed_files.sh '^src|examples/nxp/rt1020-evk-make-baremetal-builtin'; then
          make -C examples/nxp/rt1020-evk-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        #if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/nxp/rt1020-evk-make-freertos-builtin'; then
        if ./test/match_changed_files.sh '^src|examples/nxp/rt1020-evk-make-freertos-builtin'; then
          make -C examples/nxp/rt1020-evk-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
        fi

  test_rt1060:
    runs-on: ubuntu-latest
    env:
      GO: 0
    steps:
    - uses: actions/checkout@v3
      with: { fetch-depth: 3 }
    - name: baremetal
      run: |
        if ./test/match_changed_files.sh "^src|examples/device-dashboard|examples/nxp/rt1060.*-make-" ; then
          echo GO=1 >> $GITHUB_ENV
          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/nxp/rt1060-evk-make-baremetal-builtin'; then
          make -C examples/nxp/rt1060-evk-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
        fi
    - if: ${{ env.GO == 1 }}
      run: |
        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/nxp/rt1060-evk-make-freertos-builtin'; then
          make -C examples/nxp/rt1060-evk-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
        fi

  test_tm4c:
    runs-on: ubuntu-latest
    env:
      GO: 0
    steps:
    - uses: actions/checkout@v3
      with: { fetch-depth: 2 }
    - name: baremetal
      run: |
        if ./test/match_changed_files.sh "^src|examples/device-dashboard|examples/ti/ek-tm4c.*-make-" ; then
          echo GO=1 >> $GITHUB_ENV
          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
        fi
    - if: ${{ env.GO == 1 }}
      run:  make -C examples/ti/ek-tm4c1294xl-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
    - if: ${{ env.GO == 1 }}
      run:  make -C examples/ti/ek-tm4c1294xl-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}

  test_same54:
    runs-on: ubuntu-latest
    env:
      GO: 0
    steps:
    - uses: actions/checkout@v3
      with: { fetch-depth: 2 }
    - name: baremetal
      run: |
        if ./test/match_changed_files.sh "^src|examples/device-dashboard|examples/microchip/same54-xpro" ; then
          echo GO=1 >> $GITHUB_ENV
          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
        fi
    - if: ${{ env.GO == 1 }}
      run:  make -C examples/microchip/same54-xpro/device-dashboard test VCON_API_KEY=${{secrets.VCON_API_KEY}}
    - if: ${{ env.GO == 1 }}
      run:  make -C examples/microchip/same54-xpro/mqtt-client test VCON_API_KEY=${{secrets.VCON_API_KEY}}

  test_pico_w5500:
    runs-on: ubuntu-latest
    env:
      GO: 0
    steps:
    - uses: actions/checkout@v3
      with: { fetch-depth: 2 }
    - name: SDK
      run: |
        if ./test/match_changed_files.sh "^src|examples/device-dashboard|examples/rp2040/pico-w5500" ; then
          echo GO=1 >> $GITHUB_ENV
          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
        fi
    - if: ${{ env.GO == 1 }}
      run:  make -C examples/rp2040/pico-w5500 test VCON_API_KEY=${{secrets.VCON_API_KEY}}



================================================
FILE: .github/workflows/zephyr.yml
================================================
name: Zephyr
on:
  schedule:
    - cron: '0 0 * * *' # run at 12 AM UTC
  # Allow manual runs
  workflow_dispatch:
jobs:
  zephyr_examples:
    runs-on: ubuntu-24.04
    strategy:
      fail-fast: false
      matrix:
        revno: ["--mr v3.7-branch", "--mr v4.2.0", "--mr v4.3.0"] # LTS, latest stable
    name: Zephyr ${{ matrix.revno }}
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 2 }
      - run: test/setup_ga_docker_filesystem.sh
      - run: make -C tutorials/zephyr init REPO=zephyrprojectrtos/ci:v0.28.8 REVNO="${{ matrix.revno }}"
      - run: make -C tutorials/zephyr minify REVNO="${{ matrix.revno }}"
      - run: make -C tutorials/zephyr update
      - run: make -C tutorials/zephyr/device-dashboard build REPO=zephyrprojectrtos/ci:v0.28.8
      - run: make -C tutorials/zephyr/http-client build REPO=zephyrprojectrtos/ci:v0.28.8
      - run: make -C tutorials/zephyr/http-server build REPO=zephyrprojectrtos/ci:v0.28.8
      - run: make -C tutorials/zephyr/mqtt-aws-client build REPO=zephyrprojectrtos/ci:v0.28.8
      - run: make -C tutorials/zephyr/websocket-server build REPO=zephyrprojectrtos/ci:v0.28.8
# Latest CI image does not work with pre 4.4, they changed some SDK paths


================================================
FILE: LICENSE
================================================
Copyright (c) 2004-2013 Sergey Lyubka
Copyright (c) 2013-2026 Cesanta Software Limited
All rights reserved

This software is dual-licensed: you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2 as
published by the Free Software Foundation. For the terms of this
license, see <http://www.gnu.org/licenses/>.

You are free to use this software under the terms of the GNU General
Public License, but WITHOUT ANY WARRANTY; without even the implied
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.

Alternatively, you can license this software under a commercial
license, as set out in <https://mongoose.ws/licensing/>.


================================================
FILE: README.md
================================================
# Mongoose - Embedded Web Server / Embedded Network Library

[![License: GPLv2/Commercial](https://img.shields.io/badge/License-GPLv2%20or%20Commercial-green.svg)](https://opensource.org/licenses/gpl-2.0.php)
[![Build Status]( https://github.com/cesanta/mongoose/actions/workflows/quicktest.yml/badge.svg)](https://github.com/cesanta/mongoose/actions)
[![Code Coverage](https://codecov.io/gh/cesanta/mongoose/branch/master/graph/badge.svg)](https://codecov.io/gh/cesanta/mongoose)
[![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/mongoose.svg)](https://issues.oss-fuzz.com/issues?sort=-opened&can=1&q=proj:mongoose)

<img src="https://mongoose.ws/images/logo.svg" width="48" height="48" align="left" style="float:left;" /> Mongoose is a network library for C/C++.  It provides event-driven non-blocking
APIs for TCP, UDP, HTTP, WebSocket, MQTT, and other protocols.  It is designed
for connecting devices and bringing them online. On the market since 2004, used
by vast number of open source and commercial products - it even runs on the
International Space Station!  Mongoose makes embedded network programming fast,
robust, and easy. Features include:

- Cross-platform:
  - works on Linux/UNIX, MacOS, Windows, Android
  - works on ST, NXP, ESP32, Nordic, TI, Microchip, Infineon, Renesas and other chips
  - write code once - and it'll work everywhere
  - ideal for the unification of the network infrastructure code across company
- Built-in protocols: plain TCP/UDP, SNTP, HTTP, MQTT, Websocket, and other
- Asynchronous DNS resolver
- Tiny static and run-time footprint
- Source code is both ISO C and ISO C++ compliant
- Easy to integrate: just copy [mongoose.c](https://raw.githubusercontent.com/cesanta/mongoose/master/mongoose.c)
  and [mongoose.h](https://raw.githubusercontent.com/cesanta/mongoose/master/mongoose.h) files to your source tree
- Built-in TCP/IP stack with drivers for bare metal or RTOS systems
   - Available drivers: STM32F, STM32H; NXP RT1xxx; TI TM4C; Microchip SAME54; Wiznet W5500
   - A complete Web device dashboard on bare metal ST Nucleo boards is only 6 files
   - For comparison, a CubeIDE generated HTTP example is 400+ files
- Can run on top of an existing TCP/IP stack with BSD API, e.g. lwIP, Zephyr, Azure, etc
- Built-in TLS 1.3 ECC stack. Also can use external TLS libraries - mbedTLS, OpenSSL, or other
- Does not depend on any other software to implement networking
- Built-in firmware updates for STM32 H5, STM32 H7

See https://mongoose.ws/ for complete documentation, videos, case studies, etc.

## Supported platforms

Mongoose can work on top of any TCP/IP stack that supports BSD sockets API.
Platforms supported by the 3rd party TCP/IP stacks:

| TCP/IP stack    | Notes |
| :-------------- | :------- |
| **lwIP**        | All devices running lwIP, for example ESP32, ESP32S3, ESP32C3, ESP32C6, etc |
| **Zephyr**      | All devices supported by Zephyr |
| **Other**       | Any other TCP/IP stack that supports BSD socket API, for example Amazon FreeRTOS-TCP |
| **Linux, Mac, Windows**   | Workstations, server, single board computers, embedded Linux devices running on MPUs or FPGAs |

Optionally, Mongoose provides its own built-in TCP/IP stack, eliminating the
need for additional software to implement networking functionality. The
built-in stack supports operation in both bare-metal and RTOS environments.
Platforms supported by the Mongoose built-in TCP/IP stack:

| Hardware       | Notes |
| :------------- | :------- |
| **STM32**      | All STM32 MCUs with built-in Ethernet: STM32Fxx, STM32H5xx, STM32H7xx |
| **NXP**        |  All NXP MCUs with built-in Ethernet: IMXRT102x, IMXRT104x, IMXRT105x, IMXRT106x, IMXRT117x, RW612, MCXN94x   |
| **Microchip**  | ATSAME54 MCUs with built-int Ethernet  |
| **Renesas**    | RA5M, RA6M, RA8M MCUs with built-in Ethernet    |
| **Infineon**   | XMC4, XMC7 MCUs with built-in Ethernet    |
| **Texas Instruments**  |  TM4C, TMS570 MCUs with built-in Ethernet   |
| **Cypress WiFi**  | Any MCU with CY43xx WiFi chips, like RP2040 Pico-W, RP2350 Pico2-W, Arduino Portenta    |
| **Wiznet Ethernet**  | Any MCU that use Wiznet W5500 or Wiznet 5100 MAC+PHY chips    |
| **Cellular**   | NRF9160, SIM800    |

## Usage Examples

Below are quick snippets that should give an idea how simple the API is and
how easy it is to create applications with it.

Create a simple web server that serves a directory. The behavior of the
HTTP server is specified by its event handler function:

```c
#include "mongoose.h"   // To build, run: cc main.c mongoose.c

// HTTP server event handler function
void ev_handler(struct mg_connection *c, int ev, void *ev_data) {
  if (ev == MG_EV_HTTP_MSG) {
    struct mg_http_message *hm = (struct mg_http_message *) ev_data;
    struct mg_http_serve_opts opts = { .root_dir = "./web_root/" };
    mg_http_serve_dir(c, hm, &opts);
  }
}

int main(void) {
  struct mg_mgr mgr;  // Declare event manager
  mg_mgr_init(&mgr);  // Initialise event manager
  mg_http_listen(&mgr, "http://0.0.0.0:8000", ev_handler, NULL);  // Setup listener
  for (;;) {          // Run an infinite event loop
    mg_mgr_poll(&mgr, 1000);
  }
  return 0;
}
```

HTTP server implements a REST API that returns current time. JSON formatting:
```c
static void ev_handler(struct mg_connection *c, int ev, void *ev_data) {
  if (ev == MG_EV_HTTP_MSG) {
    struct mg_http_message *hm = (struct mg_http_message *) ev_data;
    if (mg_match(hm->uri, mg_str("/api/time/get"), NULL)) {
      mg_http_reply(c, 200, "", "{%m:%lu}\n", MG_ESC("time"), time(NULL));
    } else {
      mg_http_reply(c, 500, "", "{%m:%m}\n", MG_ESC("error"), MG_ESC("Unsupported URI")); 
    }
  }
}
```

MQTT client that subscribes to a topic `device1/rx` and
echoes incoming messages to `device1/tx`:

```c
#include "mongoose.h"

static const char *s_mqtt_url = "mqtt://broker.hivemq.com:1883";
static struct mg_connection *s_mqtt_conn = NULL;

// MQTT connection event handler function
static void ev_handler(struct mg_connection *c, int ev, void *ev_data) {
  if (ev == MG_EV_OPEN) {
    MG_INFO(("%lu created, connecting to %s ...", c->id, s_mqtt_url));
  } else if (ev == MG_EV_MQTT_OPEN) {
    struct mg_mqtt_opts opts = {.qos = 1, .topic = mg_str("device1/rx")};
    mg_mqtt_sub(c, &opts);
    MG_INFO(("%lu connected, subscribing to %s", c->id, opts.topic.buf));
  } else if (ev == MG_EV_MQTT_MSG) {
    char response[100];
    struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;
    struct mg_mqtt_opts opts = {.qos = 1, .topic = mg_str("device1/tx")};
    mg_snprintf(response, sizeof(response), "Received [%.*s] / [%.*s]",
                mm->topic.len, mm->topic.buf, mm->data.len, mm->data.buf);
    opts.message = mg_str(response);
    mg_mqtt_pub(c, &opts);
  } else if (ev == MG_EV_CLOSE) {
    MG_INFO(("%u closing", c->id));
    s_mqtt_conn = NULL;
  }
}

// Reconnection timer function. If we get disconnected, reconnect again
static void timer_fn(void *arg) {
  struct mg_mgr *mgr = (struct mg_mgr *) arg;
  if (s_mqtt_conn == NULL) {
    struct mg_mqtt_opts opts = {.clean = true};
    s_mqtt_conn = mg_mqtt_connect(mgr, s_mqtt_url, &opts, ev_handler, NULL);
  }
}

int main() {
  struct mg_mgr mgr;  // Mongoose event manager. Holds all connections
  mg_mgr_init(&mgr);  // Initialise event manager
  mg_timer_add(&mgr, 3000, MG_TIMER_REPEAT | MG_TIMER_RUN_NOW, timer_fn, &mgr);
  for (;;) {
    mg_mgr_poll(&mgr, 1000);  // Infinite event loop
  }
  return 0;
}
```

## Commercial use
- Mongoose is used by hundreds of businesses, from Fortune500 giants like
  Siemens, Schneider Electric, Broadcom, Bosch, Google, Samsung, Qualcomm, Caterpillar to the small businesses
- Used to solve a wide range of business needs, like implementing Web UI
  interface on devices, RESTful API services, telemetry data exchange, remote
  control for a product, remote software updates, remote monitoring, and others
- Deployed to hundreds of millions devices in production environment worldwide
- See [Case Studies](https://mongoose.ws/case-studies/) from our respected
  customers like [Schneider Electric](https://mongoose.ws/case-studies/schneider-electric/) (industrial automation), [Broadcom](https://mongoose.ws/case-studies/broadcom/) (semiconductors), [Pilz](https://mongoose.ws/case-studies/pilz/) (industrial automation), and others
- See [Testimonials](https://mongoose.ws/testimonials/) from engineers that integrated Mongoose in their commercial products
- We provide [Evaluation and Commercial licensing](https://mongoose.ws/licensing/), [support](https://mongoose.ws/support/), consultancy and [integration
  services](https://mongoose.ws/integration/) - don't hesitate to [contact us](https://mongoose.ws/contact/)


## Security

We take security seriously:
1. Mongoose repository runs a
  [continuous integration test powered by GitHub](https://github.com/cesanta/mongoose/actions),
  which runs through hundreds of unit tests on every commit to the repository.
  Our [unit tests](https://github.com/cesanta/mongoose/tree/master/test)
  are built with modern address sanitizer technologies, which help to find
  security vulnerabilities early
2. Mongoose repository is integrated into Google's
  [oss-fuzz continuous fuzzer](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:mongoose)
  which scans for potential vulnerabilities continuously
3.  We receive periodic vulnerability reports from the independent security
  groups like
  [Cisco Talos](https://www.cisco.com/c/en/us/products/security/talos.html),
  [Microsoft Security Response Center](https://www.microsoft.com/en-us/msrc),
  [MITRE Corporation](https://www.mitre.org/),
  [Compass Security](https://www.compass-security.com/en/) and others.
  In case of the vulnerability found, we act according to the industry best
  practice: hold on to the publication, fix the software and notify all our
  customers that have an appropriate subscription
4. Some of our customers (for example NASA)
  have specific security requirements and run independent security audits,
  of which we get notified and in case of any issue, act similar to (3).

## How to report security vulnerabilities

Please send an email to support@cesanta.com, with the full information.
Do NOT create a github issue.

## Articles

Technical guides and deep dives into embedded web servers, WebUI integration and embedded networking technologies:
- [Embedded Web Server: A Comprehensive Guide for Modern Connected Devices](https://mongoose.ws/articles/embedded-web-server-a-comprehensive-guide-for-modern-connected-devices/)
- [Building Embedded Web Device Dashboards](https://mongoose.ws/articles/building-embedded-web-device-dashboard/)
- [ESP32 Device Dashboard: A Step-by-Step Guide for Developers](https://mongoose.ws/articles/esp32-device-dashboard/)
- [How to build an STM32 Web Dashboard](https://mongoose.ws/articles/stm32-device-dashboard/)
- [STM32 WebSocket Guide](https://mongoose.ws/articles/stm32-websocket-guide/)
- [Web File Manager on STM32, ESP32 and Embedded Linux](https://mongoose.ws/articles/building-a-web-file-manager-on-stm32-esp32-embedded-linux/)
- [Web dashboard on Zephyr RTOS](https://mongoose.ws/articles/web-dashboard-on-zephyr-rtos/)
- [Limiting TCP/IP RAM usage on STM32](https://mongoose.ws/articles/limiting-tcpip-ram-usage-on-stm32/)
- [STM32 Ethernet explained](https://mongoose.ws/articles/stm32-ethernet-explained/)
- [MQTT on a Microcontroller](https://mongoose.ws/articles/mqtt-on-a-microcontroller/)
- [STM32 OTA Firmware Update](https://mongoose.ws/articles/stm32-ota-firmware-update/)
- [RP2350 OTA Firmware Update](https://mongoose.ws/articles/rp2350-ota-firmware-update/)
- [STM32 Ethernet and caches](https://mongoose.ws/articles/stm32-ethernet-and-cache/)
- [NXP RW612 OTA Firmware Update](https://mongoose.ws/articles/rw612-ota-firmware-update/)
- [lwIP vs Mongoose - TCP/IP Stack Integration Benchmark](https://mongoose.ws/articles/lwip-vs-mongoose-tcpip-stack-integration/)


## Contributions

Contributions are welcome! Please follow the guidelines below:

- Sign [Cesanta CLA](https://cesanta.com/cla.html) and send GitHub pull request
- Make sure that PRs have only one commit, and deal with one issue only


================================================
FILE: mongoose.c
================================================
// Copyright (c) 2004-2013 Sergey Lyubka
// Copyright (c) 2013-2025 Cesanta Software Limited
// All rights reserved
//
// This software is dual-licensed: you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
// published by the Free Software Foundation. For the terms of this
// license, see http://www.gnu.org/licenses/
//
// You are free to use this software under the terms of the GNU General
// Public License, but WITHOUT ANY WARRANTY; without even the implied
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// Alternatively, you can license this software under a commercial
// license, as set out in https://www.mongoose.ws/licensing/
//
// SPDX-License-Identifier: GPL-2.0-only or commercial

#include "mongoose.h"

#ifdef MG_ENABLE_LINES
#line 1 "src/base64.c"
#endif


static int mg_base64_encode_single(int c) {
  if (c < 26) {
    return c + 'A';
  } else if (c < 52) {
    return c - 26 + 'a';
  } else if (c < 62) {
    return c - 52 + '0';
  } else {
    return c == 62 ? '+' : '/';
  }
}

static int mg_base64_decode_single(int c) {
  if (c >= 'A' && c <= 'Z') {
    return c - 'A';
  } else if (c >= 'a' && c <= 'z') {
    return c + 26 - 'a';
  } else if (c >= '0' && c <= '9') {
    return c + 52 - '0';
  } else if (c == '+') {
    return 62;
  } else if (c == '/') {
    return 63;
  } else if (c == '=') {
    return 64;
  } else {
    return -1;
  }
}

size_t mg_base64_update(unsigned char ch, char *to, size_t n) {
  unsigned long rem = (n & 3) % 3;
  if (rem == 0) {
    to[n] = (char) mg_base64_encode_single(ch >> 2);
    to[++n] = (char) ((ch & 3) << 4);
  } else if (rem == 1) {
    to[n] = (char) mg_base64_encode_single(to[n] | (ch >> 4));
    to[++n] = (char) ((ch & 15) << 2);
  } else {
    to[n] = (char) mg_base64_encode_single(to[n] | (ch >> 6));
    to[++n] = (char) mg_base64_encode_single(ch & 63);
    n++;
  }
  return n;
}

size_t mg_base64_final(char *to, size_t n) {
  size_t saved = n;
  // printf("---[%.*s]\n", n, to);
  if (n & 3) n = mg_base64_update(0, to, n);
  if ((saved & 3) == 2) n--;
  // printf("    %d[%.*s]\n", n, n, to);
  while (n & 3) to[n++] = '=';
  to[n] = '\0';
  return n;
}

size_t mg_base64_encode(const unsigned char *p, size_t n, char *to, size_t dl) {
  size_t i, len = 0;
  if (dl > 0) to[0] = '\0';
  if (dl < ((n / 3) + (n % 3 ? 1 : 0)) * 4 + 1) return 0;
  for (i = 0; i < n; i++) len = mg_base64_update(p[i], to, len);
  len = mg_base64_final(to, len);
  return len;
}

size_t mg_base64_decode(const char *src, size_t n, char *dst, size_t dl) {
  const char *end = src == NULL ? NULL : src + n;  // Cannot add to NULL
  size_t len = 0;
  if (dl < n / 4 * 3 + 1) goto fail;
  while (src != NULL && src + 3 < end) {
    int a = mg_base64_decode_single(src[0]),
        b = mg_base64_decode_single(src[1]),
        c = mg_base64_decode_single(src[2]),
        d = mg_base64_decode_single(src[3]);
    if (a == 64 || a < 0 || b == 64 || b < 0 || c < 0 || d < 0) {
      goto fail;
    }
    dst[len++] = (char) ((a << 2) | (b >> 4));
    if (src[2] != '=') {
      dst[len++] = (char) ((b << 4) | (c >> 2));
      if (src[3] != '=') dst[len++] = (char) ((c << 6) | d);
    }
    src += 4;
  }
  dst[len] = '\0';
  return len;
fail:
  if (dl > 0) dst[0] = '\0';
  return 0;
}

#ifdef MG_ENABLE_LINES
#line 1 "src/dns.c"
#endif








struct dns_data {
  struct dns_data *next;
  struct mg_connection *c;
  uint64_t expire;
  uint16_t txnid;
};

static void mg_sendnsreq(struct mg_connection *, struct mg_str *, int,
                         struct mg_dns *, bool);

static void mg_dns_free(struct dns_data **head, struct dns_data *d) {
  LIST_DELETE(struct dns_data, head, d);
  mg_free(d);
}

void mg_resolve_cancel(struct mg_connection *c) {
  struct dns_data *tmp, *d;
  struct dns_data **head = (struct dns_data **) &c->mgr->active_dns_requests;
  for (d = *head; d != NULL; d = tmp) {
    tmp = d->next;
    if (d->c == c) mg_dns_free(head, d);
  }
}

static size_t mg_dns_parse_name_depth(const uint8_t *s, size_t len, size_t ofs,
                                      char *to, size_t tolen, size_t j,
                                      int depth) {
  size_t i = 0;
  if (tolen > 0 && depth == 0) to[0] = '\0';
  if (depth > 5) return 0;
  // MG_INFO(("ofs %lx %x %x", (unsigned long) ofs, s[ofs], s[ofs + 1]));
  while (ofs + i + 1 < len) {
    size_t n = s[ofs + i];
    if (n == 0) {
      i++;
      break;
    }
    if (n & 0xc0) {
      size_t ptr = (((n & 0x3f) << 8) | s[ofs + i + 1]);  // 12 is hdr len
      // MG_INFO(("PTR %lx", (unsigned long) ptr));
      if (ptr + 1 < len && (s[ptr] & 0xc0) == 0 &&
          mg_dns_parse_name_depth(s, len, ptr, to, tolen, j, depth + 1) == 0)
        return 0;
      i += 2;
      break;
    }
    if (ofs + i + n + 1 >= len) return 0;
    if (j > 0) {
      if (j < tolen) to[j] = '.';
      j++;
    }
    if (j + n < tolen) memcpy(&to[j], &s[ofs + i + 1], n);
    j += n;
    i += n + 1;
    if (j < tolen) to[j] = '\0';  // Zero-terminate this chunk
    // MG_INFO(("--> [%s]", to));
  }
  if (tolen > 0) to[tolen - 1] = '\0';  // Make sure it is nul-term
  return i;
}

static size_t mg_dns_parse_name(const uint8_t *s, size_t n, size_t ofs,
                                char *dst, size_t dstlen) {
  return mg_dns_parse_name_depth(s, n, ofs, dst, dstlen, 0, 0);
}

size_t mg_dns_parse_rr(const uint8_t *buf, size_t len, size_t ofs,
                       bool is_question, struct mg_dns_rr *rr) {
  const uint8_t *s = buf + ofs, *e = &buf[len];

  memset(rr, 0, sizeof(*rr));
  if (len < sizeof(struct mg_dns_header)) return 0;  // Too small
  if (len > 512) return 0;  //  Too large, we don't expect that
  if (s >= e) return 0;     //  Overflow

  if ((rr->nlen = (uint16_t) mg_dns_parse_name(buf, len, ofs, NULL, 0)) == 0)
    return 0;
  s += rr->nlen + 4;
  if (s > e) return 0;
  rr->atype = (uint16_t) (((uint16_t) s[-4] << 8) | s[-3]);
  rr->aclass = (uint16_t) (((uint16_t) s[-2] << 8) | s[-1]);
  if (is_question) return (size_t) (rr->nlen + 4);

  s += 6;
  if (s > e) return 0;
  rr->alen = (uint16_t) (((uint16_t) s[-2] << 8) | s[-1]);
  if (s + rr->alen > e) return 0;
  return (size_t) (rr->nlen + rr->alen + 10);
}

bool mg_dns_parse(const uint8_t *buf, size_t len, struct mg_dns_message *dm) {
  const struct mg_dns_header *h = (struct mg_dns_header *) buf;
  struct mg_dns_rr rr;
  size_t i, n, num_answers, ofs = sizeof(*h);
  bool is_response;
  memset(dm, 0, sizeof(*dm));

  if (len < sizeof(*h)) return 0;                // Too small, headers dont fit
  if (mg_ntohs(h->num_questions) > 1) return 0;  // Sanity
  num_answers = mg_ntohs(h->num_answers);
  if (num_answers > 10) {
    MG_DEBUG(("Got %u answers, ignoring beyond 10th one", num_answers));
    num_answers = 10;  // Sanity cap
  }
  dm->txnid = mg_ntohs(h->txnid);
  is_response = mg_ntohs(h->flags) & 0x8000;

  for (i = 0; i < mg_ntohs(h->num_questions); i++) {
    if ((n = mg_dns_parse_rr(buf, len, ofs, true, &rr)) == 0) return false;
    // MG_INFO(("Q %lu %lu %hu/%hu", ofs, n, rr.atype, rr.aclass));
    mg_dns_parse_name(buf, len, ofs, dm->name, sizeof(dm->name));
    ofs += n;
  }

  if (!is_response) {
    // For queries, there is no need to parse the answers. In this way,
    // we also ensure the domain name (dm->name) is parsed from
    // the question field.
    return true;
  }

  for (i = 0; i < num_answers; i++) {
    if ((n = mg_dns_parse_rr(buf, len, ofs, false, &rr)) == 0) return false;
    // MG_INFO(("A -- %lu %lu %hu/%hu %s", ofs, n, rr.atype, rr.aclass,
    // dm->name));
    mg_dns_parse_name(buf, len, ofs, dm->name, sizeof(dm->name));
    ofs += n;

    if (rr.alen == 4 && rr.atype == MG_DNS_RTYPE_A && rr.aclass == 1) {
      dm->addr.is_ip6 = false;
      memcpy(&dm->addr.addr.ip, &buf[ofs - 4], 4);
      dm->resolved = true;
      break;  // Return success
    } else if (rr.alen == 16 && rr.atype == MG_DNS_RTYPE_AAAA &&
               rr.aclass == 1) {
      dm->addr.is_ip6 = true;
      memcpy(&dm->addr.addr.ip, &buf[ofs - 16], 16);
      dm->resolved = true;
      break;  // Return success
    }
  }
  return true;
}

static void dns_cb(struct mg_connection *c, int ev, void *ev_data) {
  struct dns_data *d, *tmp;
  struct dns_data **head = (struct dns_data **) &c->mgr->active_dns_requests;
  if (ev == MG_EV_POLL) {
    uint64_t now = *(uint64_t *) ev_data;
    for (d = *head; d != NULL; d = tmp) {
      tmp = d->next;
      // MG_DEBUG ("%lu %lu dns poll", d->expire, now));
      if (now > d->expire) mg_error(d->c, "DNS timeout");
    }
  } else if (ev == MG_EV_READ) {
    struct mg_dns_message dm;
    int resolved = 0;
    if (mg_dns_parse(c->recv.buf, c->recv.len, &dm) == false) {
      MG_ERROR(("Unexpected DNS response:"));
      mg_hexdump(c->recv.buf, c->recv.len);
    } else {
      // MG_VERBOSE(("%s %d", dm.name, dm.resolved));
      for (d = *head; d != NULL; d = tmp) {
        tmp = d->next;
        // MG_INFO(("d %p %hu %hu", d, d->txnid, dm.txnid));
        if (dm.txnid != d->txnid) continue;
        if (d->c->is_resolving) {
          if (dm.resolved) {
            dm.addr.port = d->c->rem.port;  // Save port
            d->c->rem = dm.addr;            // Copy resolved address
            MG_DEBUG(
                ("%lu %s is %M", d->c->id, dm.name, mg_print_ip, &d->c->rem));
            mg_connect_resolved(d->c);
#if MG_ENABLE_IPV6
          } else if (dm.addr.is_ip6 == false && dm.name[0] != '\0' &&
                     c->mgr->use_dns6 == false) {
            struct mg_str x = mg_str(dm.name);
            mg_sendnsreq(d->c, &x, c->mgr->dnstimeout, &c->mgr->dns6, true);
#endif
          } else {
            mg_error(d->c, "%s DNS lookup failed", dm.name);
          }
        } else {
          MG_ERROR(("%lu already resolved", d->c->id));
        }
        mg_dns_free(head, d);
        resolved = 1;
      }
    }
    if (!resolved) MG_ERROR(("stray DNS reply"));
    c->recv.len = 0;
  } else if (ev == MG_EV_CLOSE) {
    for (d = *head; d != NULL; d = tmp) {
      tmp = d->next;
      mg_error(d->c, "DNS error");
      mg_dns_free(head, d);
    }
  }
}

static bool mg_dns_send(struct mg_connection *c, const struct mg_str *name,
                        uint16_t txnid, bool ipv6) {
  struct {
    struct mg_dns_header header;
    uint8_t data[256];
  } pkt;
  size_t i, n;
  memset(&pkt, 0, sizeof(pkt));
  pkt.header.txnid = mg_htons(txnid);
  pkt.header.flags = mg_htons(0x100);
  pkt.header.num_questions = mg_htons(1);
  for (i = n = 0; i < sizeof(pkt.data) - 5; i++) {
    if (name->buf[i] == '.' || i >= name->len) {
      pkt.data[n] = (uint8_t) (i - n);
      memcpy(&pkt.data[n + 1], name->buf + n, i - n);
      n = i + 1;
    }
    if (i >= name->len) break;
  }
  memcpy(&pkt.data[n], "\x00\x00\x01\x00\x01", 5);  // A query
  n += 5;
  if (ipv6) pkt.data[n - 3] = 0x1c;  // AAAA query
  // memcpy(&pkt.data[n], "\xc0\x0c\x00\x1c\x00\x01", 6);  // AAAA query
  // n += 6;
  return mg_send(c, &pkt, sizeof(pkt.header) + n);
}

bool mg_dnsc_init(struct mg_mgr *mgr, struct mg_dns *dnsc);
bool mg_dnsc_init(struct mg_mgr *mgr, struct mg_dns *dnsc) {
  if (dnsc->url == NULL) {
    mg_error(0, "DNS server URL is NULL. Call mg_mgr_init()");
    return false;
  }
  if (dnsc->c == NULL) {
    dnsc->c = mg_connect(mgr, dnsc->url, NULL, NULL);
    if (dnsc->c == NULL) return false;
    dnsc->c->pfn = dns_cb;
  }
  return true;
}

static void mg_sendnsreq(struct mg_connection *c, struct mg_str *name, int ms,
                         struct mg_dns *dnsc, bool ipv6) {
  struct dns_data *d = NULL;
  if (!mg_dnsc_init(c->mgr, dnsc)) {
    mg_error(c, "resolver");
  } else if ((d = (struct dns_data *) mg_calloc(1, sizeof(*d))) == NULL) {
    mg_error(c, "resolve OOM");
  } else {
    struct dns_data *reqs = (struct dns_data *) c->mgr->active_dns_requests;
    uint16_t id;
    mg_random(&id, sizeof(uint16_t));
    // TODO(): traverse reqs and check id != reqs->txnid; repeat otherwise
    if (reqs != NULL) id = (uint16_t) (reqs->txnid + 1);  // no collision
    d->txnid = id;
    d->next = reqs;
    c->mgr->active_dns_requests = d;
    d->expire = mg_millis() + (uint64_t) ms;
    d->c = c;
    c->is_resolving = 1;
    MG_VERBOSE(("%lu resolving %.*s @ %s, txnid %hu", c->id, (int) name->len,
                name->buf, dnsc->url, d->txnid));
    if (!mg_dns_send(dnsc->c, name, d->txnid, ipv6)) {
      mg_error(dnsc->c, "DNS send");
    }
  }
}

void mg_resolve(struct mg_connection *c, const char *url) {
  struct mg_str host = mg_url_host(url);
  c->rem.port = mg_htons(mg_url_port(url));
  if (mg_aton(host, &c->rem)) {
    // host is an IP address, do not fire name resolution
    mg_connect_resolved(c);
  } else {
    // host is not an IP, send DNS resolution request
    struct mg_dns *dns = c->mgr->use_dns6 ? &c->mgr->dns6 : &c->mgr->dns4;
    mg_sendnsreq(c, &host, c->mgr->dnstimeout, dns, c->mgr->use_dns6);
  }
}

static const uint8_t mdns_answer[] = {
    0, 1,          // 2 bytes - record type, A
    0, 1,          // 2 bytes - address class, INET
    0, 0, 0, 120,  // 4 bytes - TTL
    0, 4           // 2 bytes - address length
};

static uint8_t *build_name(struct mg_str *name, uint8_t *p) {
  *p++ = (uint8_t) name->len;  // label 1
  memcpy(p, name->buf, name->len), p += name->len;
  *p++ = 5;  // label 2
  memcpy(p, "local", 5), p += 5;
  *p++ = 0;  // no more labels
  return p;
}

void mg_getlocaddr(struct mg_connection *, struct mg_addr *, struct mg_addr *);

static uint8_t *build_a_record(struct mg_connection *c, uint8_t *p,
                               struct mg_addr *addr) {
  memcpy(p, mdns_answer, sizeof(mdns_answer)), p += sizeof(mdns_answer);
  if (addr != NULL && !addr->is_ip6) {
    memcpy(p, &addr->addr.ip4, 4), p += 4;
  } else {
#if MG_ENABLE_TCPIP
    memcpy(p, &c->mgr->ifp->ip, 4), p += 4;
#else
    struct mg_addr loc, to;
    memset(&loc, 0, sizeof(loc));
    to.is_ip6 = false;
    to.port = mg_htons(5353);
    to.addr.ip4 = MG_IPV4(224, 0, 0, 51);
    mg_getlocaddr(c, &to, &loc);
    memcpy(p, &loc.addr.ip4, 4), p += 4;
#endif
  }
  return p;
}

static uint8_t *build_srv_name(uint8_t *p, struct mg_dnssd_record *r) {
  *p++ = (uint8_t) r->srvcproto.len - 5;  // label 1, up to '._tcp'
  memcpy(p, r->srvcproto.buf, r->srvcproto.len), p += r->srvcproto.len;
  p[-5] = 4;  // label 2, '_tcp', overwrite '.'
  *p++ = 5;   // label 3
  memcpy(p, "local", 5), p += 5;
  *p++ = 0;  // no more labels
  return p;
}

#if 0
// TODO(): for listing
static uint8_t *build_mysrv_name(struct mg_str *name, uint8_t *p,
                                 struct mg_dnssd_record *r) {
  *p++ = name->len;  // label 1
  memcpy(p, name->buf, name->len), p += name->len;
  return build_srv_name(p, r);
}
#endif

static uint8_t *build_ptr_record(struct mg_str *name, uint8_t *p, uint16_t o) {
  uint16_t offset = mg_htons(o);
  memcpy(p, mdns_answer, sizeof(mdns_answer));
  p[1] = MG_DNS_RTYPE_PTR;  // overwrite record type
  p += sizeof(mdns_answer);
  p[-1] = (uint8_t) name->len +
          3;  // overwrite response length, label length + label + offset
  *p++ = (uint8_t) name->len;                       // response: label 1
  memcpy(p, name->buf, name->len), p += name->len;  // copy label
  memcpy(p, &offset, 2);
  *p |= 0xC0, p += 2;
  return p;
}

static uint8_t *build_srv_record(struct mg_str *name, uint8_t *p,
                                 struct mg_dnssd_record *r, uint16_t o) {
  uint16_t port = mg_htons(r->port);
  uint16_t offset = mg_htons(o);
  memcpy(p, mdns_answer, sizeof(mdns_answer));
  p[1] = MG_DNS_RTYPE_SRV;  // overwrite record type
  p += sizeof(mdns_answer);
  p[-1] = (uint8_t) name->len + 9;  // overwrite response length (4+2+1+2)
  *p++ = 0;                         // priority
  *p++ = 0;
  *p++ = 0;  // weight
  *p++ = 0;
  memcpy(p, &port, 2), p += 2;  // port
  *p++ = (uint8_t) name->len;   // label 1
  memcpy(p, name->buf, name->len), p += name->len;
  memcpy(p, &offset, 2);
  *p |= 0xC0, p += 2;
  return p;
}

static uint8_t *build_txt_record(uint8_t *p, struct mg_dnssd_record *r) {
  uint16_t len = mg_htons((uint16_t) r->txt.len);
  memcpy(p, mdns_answer, sizeof(mdns_answer));
  p[1] = MG_DNS_RTYPE_TXT;  // overwrite record type
  p += sizeof(mdns_answer);
  memcpy(p - 2, &len, 2);  // overwrite response length
  memcpy(p, r->txt.buf, r->txt.len), p += r->txt.len;  // copy record verbatim
  return p;
}

// RFC-6762 16: case-insensitivity --> RFC-1034, 1035

static void handle_mdns_query(struct mg_connection *c) {
  struct mg_dns_header *qh = (struct mg_dns_header *) c->recv.buf;
  struct mg_dns_rr rr;
  size_t n;
  // Parse first question, offset 12 is header size
  n = mg_dns_parse_rr(c->recv.buf, c->recv.len, 12, true, &rr);
  MG_VERBOSE(("mDNS request parsed, result=%d", (int) n));
  if (n > 0) {
    // RFC-6762 Appendix C, RFC2181 11: m(n + 1-63), max 255 + 0x0
    uint8_t buf[sizeof(struct mg_dns_header) + 256 + sizeof(mdns_answer) + 4];
    struct mg_dns_header *h = (struct mg_dns_header *) buf;
    uint8_t *p = &buf[sizeof(*h)];
    char name[256];
    uint8_t name_len;
    // uint16_t q = mg_ntohs(qh->num_questions);
    struct mg_str defname = mg_str((const char *) c->fn_data);
    struct mg_str *respname;
    struct mg_mdns_req req;
    memset(&req, 0, sizeof(req));
    req.is_unicast = (rr.aclass & MG_BIT(15)) != 0;  // QU
    rr.aclass &= (uint16_t) ~MG_BIT(15);  // remove "QU" (unicast response)
    qh->num_questions = mg_htons(1);      // parser sanity
    mg_dns_parse_name(c->recv.buf, c->recv.len, 12, name, sizeof(name));
    name_len = (uint8_t) strlen(name);  // verify it ends in .local
    if (name_len <= 6 || strcmp(".local", &name[name_len - 6]) != 0 ||
        (rr.aclass != 1 && rr.aclass != 0xff))
      return;
    name[name_len -= 6] = '\0';  // remove .local
    MG_VERBOSE(("RR %u %u %s", (unsigned int) rr.atype,
                (unsigned int) rr.aclass, name));
    if (rr.atype == MG_DNS_RTYPE_A) {
      // TODO(): ensure c->fn_data ends in \0
      // if we have a name to match, go; otherwise users will match and fill
      // req.r.name and set req.is_resp
      if (c->fn_data != NULL && mg_casecmp((char *) c->fn_data, name) != 0)
        return;
      req.is_resp = (c->fn_data != NULL);
      req.reqname = mg_str_n(name, name_len);
    } else  // users have to match the request to something in their db, then
            // fill req.r and set req.is_resp
      if (rr.atype == MG_DNS_RTYPE_PTR) {
        if (strcmp("_services._dns-sd._udp", name) == 0) req.is_listing = true;
        MG_DEBUG(
            ("PTR request for %s", req.is_listing ? "services listing" : name));
        req.reqname = mg_str_n(name, name_len);
      } else if (rr.atype == MG_DNS_RTYPE_SRV || rr.atype == MG_DNS_RTYPE_TXT) {
        MG_DEBUG(("%s request for %s",
                  rr.atype == MG_DNS_RTYPE_SRV ? "SRV" : "TXT", name));
        // if possible, check it starts with our name, users will check it ends
        // in a service name they handle
        if (c->fn_data != NULL) {
          if (mg_strcasecmp(defname, mg_str_n(name, defname.len)) != 0 ||
              name[defname.len] != '.')
            return;
          req.reqname =
              mg_str_n(name + defname.len + 1, name_len - defname.len - 1);
          MG_DEBUG(
              ("That's us, handing %.*s", req.reqname.len, req.reqname.buf));
        } else {
          req.reqname = mg_str_n(name, name_len);
        }
      } else {  // unhandled record
        return;
      }
    req.rr = &rr;
    mg_call(c, MG_EV_MDNS_REQ, &req);
    if (!req.is_resp) return;
    respname = req.respname.buf != NULL ? &req.respname : &defname;

    memset(h, 0, sizeof(*h));                   // clear header
    h->txnid = req.is_unicast ? qh->txnid : 0;  // RFC-6762 18.1
    h->num_answers = mg_htons(1);  // RFC-6762 6: 0 questions, 1 Answer
    h->flags = mg_htons(0x8400);   // Authoritative response
    if (req.is_listing) {
      // TODO(): RFC-6762 6: each responder SHOULD delay its response by a
      // random amount of time selected with uniform random distribution in the
      // range 20-120 ms.
      // TODO():
      return;
    } else if (rr.atype == MG_DNS_RTYPE_PTR) {  // serve PTR + SRV + TXT + A
      // TODO(): RFC-6762 6: each responder SHOULD delay its response by a
      // random amount of time selected with uniform random distribution in the
      // range 20-120 ms. Response to PTR is local_name._myservice._tcp.local
      uint8_t *o = p, *aux;
      uint16_t offset;
      if (respname->buf == NULL || respname->len == 0) return;
      h->num_other_prs = mg_htons(3);  // 3 additional records
      p = build_srv_name(p, req.r);
      aux = build_ptr_record(respname, p, (uint16_t) (o - buf));
      o = p + sizeof(mdns_answer);  // point to PTR response (full srvc name)
      offset = mg_htons((uint16_t) (o - buf));
      o = p - 7;  // point to '.local' label (\x05local\x00)
      p = aux;
      memcpy(p, &offset, 2);  // point to full srvc name, in record
      *p |= 0xC0, p += 2;
      aux = p;
      p = build_srv_record(respname, p, req.r, (uint16_t) (o - buf));
      o = aux + sizeof(mdns_answer) + 6;  // point to target in SRV
      memcpy(p, &offset, 2);              // point to full srvc name, in record
      *p |= 0xC0, p += 2;
      p = build_txt_record(p, req.r);
      offset = mg_htons((uint16_t) (o - buf));
      memcpy(p, &offset, 2);  // point to target name, in record
      *p |= 0xC0, p += 2;
      p = build_a_record(c, p, req.addr);
    } else if (rr.atype == MG_DNS_RTYPE_TXT) {
      p = build_srv_name(p, req.r);
      p = build_txt_record(p, req.r);
    } else if (rr.atype == MG_DNS_RTYPE_SRV) {  // serve SRV + A
      uint8_t *o, *aux;
      uint16_t offset;
      if (respname->buf == NULL || respname->len == 0) return;
      h->num_other_prs = mg_htons(1);  // 1 additional record
      p = build_srv_name(p, req.r);
      o = p - 7;  // point to '.local' label (\x05local\x00)
      aux = p;
      p = build_srv_record(respname, p, req.r, (uint16_t) (o - buf));
      o = aux + sizeof(mdns_answer) + 6;  // point to target in SRV
      offset = mg_htons((uint16_t) (o - buf));
      memcpy(p, &offset, 2);  // point to target name, in record
      *p |= 0xC0, p += 2;
      p = build_a_record(c, p, req.addr);
    } else {  // A requested
      // RFC-6762 6: 0 Auth, 0 Additional RRs
      if (respname->buf == NULL || respname->len == 0) return;
      p = build_name(respname, p);
      p = build_a_record(c, p, req.addr);
    }
    if (!req.is_unicast) mg_multicast_restore(c, (uint8_t *) &c->loc);
    mg_send(c, buf, (size_t) (p - buf));  // And send it!
    MG_DEBUG(("%M > %M", mg_print_ip_port, &c->loc, mg_print_ip_port, &c->rem));
    MG_DEBUG(("mDNS %s response sent", req.is_unicast ? "unicast" : "mcast"));
  }
}

static void handle_mdns_response(struct mg_connection *c) {
  struct mg_dns_header *rh = (struct mg_dns_header *) c->recv.buf;
  struct mg_dns_rr rr;
  size_t n;
  // Parse first response, offset 12 is header size
  n = mg_dns_parse_rr(c->recv.buf, c->recv.len, 12, false, &rr);
  MG_VERBOSE(("mDNS response parsed, result=%d", (int) n));
  if (n > 0) {
    // RFC-6762 Appendix C, RFC2181 11: m(n + 1-63), max 255 + 0x0
    char name[256];
    uint8_t name_len;
    struct mg_mdns_resp resp;
    memset(&resp, 0, sizeof(resp));
    if (rh->num_answers > mg_htons(1)) MG_DEBUG(("ignoring > 1 answers"));
    mg_dns_parse_name(c->recv.buf, c->recv.len, 12, name, sizeof(name));
    name_len = (uint8_t) strlen(name);  // verify it ends in .local
    MG_VERBOSE(("RR %u %u %s", (unsigned int) rr.atype,
                (unsigned int) rr.aclass, name));
    if (rr.alen == 4 && rr.atype == MG_DNS_RTYPE_A &&
        (rr.aclass & 0x7FFF) == 1) {
      resp.addr.is_ip6 = false;
      memcpy(resp.addr.addr.ip, (char *) (rh + 1) + n - 4, 4);
      MG_DEBUG(("A response from %.*s = %M", name_len, name, mg_print_ip,
                &resp.addr));
      //    } else if (rr.alen == 16 && rr.atype == MG_DNS_RTYPE_AAAA &&
      //    (rr.aclass & 0x7FFF) == 1) {
      //      resp.addr.is_ip6 = true;
      //      memcpy(resp.addr.addr.ip, (char *)(rh + 1) + n - 16], 16);
      //      MG_DEBUG(("AAAA response from %.*s = %M", name_len, name,
      //      mg_print_ip, &resp.addr));
    } else {
      return;
    }
    resp.name = mg_str_n(name, name_len);
    resp.rr = &rr;
    mg_call(c, MG_EV_MDNS_RESP, &resp);
  }
}

static void handle_mdns_record(struct mg_connection *c) {
  struct mg_dns_header *h = (struct mg_dns_header *) c->recv.buf;
  if (c->recv.len <= 12) return;
  if ((h->flags & mg_htons(0xF800)) == 0) {
    // flags -> !resp, opcode=0 => query; ignore other opcodes
    handle_mdns_query(c);
  } else if ((h->flags & mg_htons(0xF800)) == mg_htons(0x8000)) {
    // flags -> resp, opcode=0 => response; ignore other opcodes
    handle_mdns_response(c);
  }
}

static void mdns_cb(struct mg_connection *c, int ev, void *ev_data) {
  if (ev == MG_EV_READ) {
    handle_mdns_record(c);
    mg_iobuf_del(&c->recv, 0, c->recv.len);
  }
  (void) ev_data;
}

void mg_multicast_add(struct mg_connection *c, char *ip);
struct mg_connection *mg_mdns_listen(struct mg_mgr *mgr, mg_event_handler_t fn,
                                     void *fn_data) {
  struct mg_connection *c =
      mg_listen(mgr, "udp://224.0.0.251:5353", fn, fn_data);
  if (c == NULL) return NULL;
  c->pfn = mdns_cb, c->pfn_data = fn_data;
  mg_multicast_add(c, (char *) "224.0.0.251");
  return c;
}

bool mg_mdns_query(struct mg_connection *c, const char *name,
                   unsigned int rtype) {
  struct mg_str name_;
  name_.buf = (char *) name, name_.len = strlen(name);
  mg_multicast_restore(c, (uint8_t *) &c->loc);
  (void) rtype;
  return mg_dns_send(c, &name_, 0, false);
}

#ifdef MG_ENABLE_LINES
#line 1 "src/event.c"
#endif






void mg_call(struct mg_connection *c, int ev, void *ev_data) {
#if MG_ENABLE_PROFILE
  const char *names[] = {
      "EV_ERROR",    "EV_OPEN",      "EV_POLL",      "EV_RESOLVE",
      "EV_CONNECT",  "EV_ACCEPT",    "EV_TLS_HS",    "EV_READ",
      "EV_WRITE",    "EV_CLOSE",     "EV_HTTP_MSG",  "EV_HTTP_CHUNK",
      "EV_WS_OPEN",  "EV_WS_MSG",    "EV_WS_CTL",    "EV_MQTT_CMD",
      "EV_MQTT_MSG", "EV_MQTT_OPEN", "EV_SNTP_TIME", "EV_USER"};
  if (ev != MG_EV_POLL && ev < (int) (sizeof(names) / sizeof(names[0]))) {
    MG_PROF_ADD(c, names[ev]);
  }
#endif
  // Fire protocol handler first, user handler second. See #2559
  if (c->pfn != NULL) c->pfn(c, ev, ev_data);
  if (c->fn != NULL) c->fn(c, ev, ev_data);
}

void mg_error(struct mg_connection *c, const char *fmt, ...) {
  char buf[64];
  va_list ap;
  va_start(ap, fmt);
  mg_vsnprintf(buf, sizeof(buf), fmt, &ap);
  va_end(ap);
  MG_ERROR(("%lu %ld %s", c->id, c->fd, buf));
  c->is_closing = 1;             // Set is_closing before sending MG_EV_CALL
  mg_call(c, MG_EV_ERROR, buf);  // Let user handler override it
}

#ifdef MG_ENABLE_LINES
#line 1 "src/flash.c"
#endif





#if MG_OTA != MG_OTA_NONE && MG_OTA != MG_OTA_CUSTOM

static char *s_addr;      // Current address to write to
static size_t s_size;     // Firmware size to flash. In-progress indicator
static uint32_t s_crc32;  // Firmware checksum

bool mg_ota_flash_begin(size_t new_firmware_size, struct mg_flash *flash) {
  bool ok = false;
  if (s_size) {
    MG_ERROR(("OTA already in progress. Call mg_ota_end()"));
  } else {
    size_t half = flash->size / 2;
    s_crc32 = 0;
    s_addr = (char *) flash->start + half;
    MG_DEBUG(("FW %lu bytes, max %lu", new_firmware_size, half));
    if (new_firmware_size < half) {
      ok = true;
      s_size = new_firmware_size;
      MG_INFO(("Starting OTA, firmware size %lu", s_size));
    } else {
      MG_ERROR(("Firmware %lu is too big to fit %lu", new_firmware_size, half));
    }
  }
  return ok;
}

bool mg_ota_flash_write(const void *buf, size_t len, struct mg_flash *flash) {
  bool ok = false;
  if (s_size == 0) {
    MG_ERROR(("OTA is not started, call mg_ota_begin()"));
  } else {
    size_t len_aligned_down = MG_ROUND_DOWN(len, flash->align);
    if (len_aligned_down) ok = flash->write_fn(s_addr, buf, len_aligned_down);
    if (len_aligned_down < len) {
      size_t left = len - len_aligned_down;
      char tmp[flash->align];
      memset(tmp, 0xff, sizeof(tmp));
      memcpy(tmp, (char *) buf + len_aligned_down, left);
      ok = flash->write_fn(s_addr + len_aligned_down, tmp, sizeof(tmp));
    }
    s_crc32 = mg_crc32(s_crc32, (char *) buf, len);  // Update CRC
    MG_DEBUG(("%#x %p %lu -> %d", s_addr - len, buf, len, ok));
    s_addr += len;
  }
  return ok;
}

bool mg_ota_flash_end(struct mg_flash *flash) {
  char *base = (char *) flash->start + flash->size / 2;
  bool ok = false;
  if (s_size) {
    size_t size = (size_t) (s_addr - base);
    uint32_t crc32 = mg_crc32(0, base, s_size);
    if (size == s_size && crc32 == s_crc32) ok = true;
    MG_DEBUG(("CRC: %x/%x, size: %lu/%lu, status: %s", s_crc32, crc32, s_size,
              size, ok ? "ok" : "fail"));
    s_size = 0;
    if (ok) ok = flash->swap_fn();
  }
  MG_INFO(("Finishing OTA: %s", ok ? "ok" : "fail"));
  return ok;
}

#endif

#ifdef MG_ENABLE_LINES
#line 1 "src/fmt.c"
#endif




static bool is_digit(int c) {
  return c >= '0' && c <= '9';
}

static int addexp(char *buf, int e, int sign) {
  int n = 0;
  buf[n++] = 'e';
  buf[n++] = (char) sign;
  if (e > 400) return 0;
  if (e < 10) buf[n++] = '0';
  if (e >= 100) buf[n++] = (char) (e / 100 + '0'), e -= 100 * (e / 100);
  if (e >= 10) buf[n++] = (char) (e / 10 + '0'), e -= 10 * (e / 10);
  buf[n++] = (char) (e + '0');
  return n;
}

static int xisinf(double x) {
  union {
    double f;
    uint64_t u;
  } ieee754;
  ieee754.f = x;
  return ((unsigned) (ieee754.u >> 32) & 0x7fffffff) == 0x7ff00000 &&
         ((unsigned) ieee754.u == 0);
}

static int xisnan(double x) {
  union {
    double f;
    uint64_t u;
  } ieee754;
  ieee754.f = x;
  return ((unsigned) (ieee754.u >> 32) & 0x7fffffff) +
             ((unsigned) ieee754.u != 0) >
         0x7ff00000;
}

static size_t mg_dtoa(char *dst, size_t dstlen, double d, int width, bool tz) {
  char buf[40];
  int i, s = 0, n = 0, e = 0;
  double t, mul, saved;
  if (d == 0.0) return mg_snprintf(dst, dstlen, "%s", "0");
  if (xisinf(d)) return mg_snprintf(dst, dstlen, "%s", d > 0 ? "inf" : "-inf");
  if (xisnan(d)) return mg_snprintf(dst, dstlen, "%s", "nan");
  if (d < 0.0) d = -d, buf[s++] = '-';

  // Round
  saved = d;
  if (tz) {
    mul = 1.0;
    while (d >= 10.0 && d / mul >= 10.0) mul *= 10.0;
  } else {
    mul = 0.1;
  }

  while (d <= 1.0 && d / mul <= 1.0) mul /= 10.0;
  for (i = 0, t = mul * 5; i < width; i++) t /= 10.0;

  d += t;

  // Calculate exponent, and 'mul' for scientific representation
  mul = 1.0;
  while (d >= 10.0 && d / mul >= 10.0) mul *= 10.0, e++;
  while (d < 1.0 && d / mul < 1.0) mul /= 10.0, e--;
  // printf(" --> %g %d %g %g\n", saved, e, t, mul);

  if (tz && e >= width && width > 1) {
    n = (int) mg_dtoa(buf, sizeof(buf), saved / mul, width, tz);
    // printf(" --> %.*g %d [%.*s]\n", 10, d / t, e, n, buf);
    n += addexp(buf + s + n, e, '+');
    return mg_snprintf(dst, dstlen, "%.*s", n, buf);
  } else if (tz && e <= -width && width > 1) {
    n = (int) mg_dtoa(buf, sizeof(buf), saved / mul, width, tz);
    // printf(" --> %.*g %d [%.*s]\n", 10, d / mul, e, n, buf);
    n += addexp(buf + s + n, -e, '-');
    return mg_snprintf(dst, dstlen, "%.*s", n, buf);
  } else {
    int targ_width = width;
    for (i = 0, t = mul; t >= 1.0 && s + n < (int) sizeof(buf); i++) {
      int ch = (int) (d / t);
      if (n > 0 || ch > 0) buf[s + n++] = (char) (ch + '0');
      d -= ch * t;
      t /= 10.0;
    }
    // printf(" --> [%g] -> %g %g (%d) [%.*s]\n", saved, d, t, n, s + n, buf);
    if (n == 0) buf[s++] = '0';
    while (t >= 1.0 && n + s < (int) sizeof(buf)) buf[n++] = '0', t /= 10.0;
    if (s + n < (int) sizeof(buf)) buf[n + s++] = '.';
    // printf(" 1--> [%g] -> [%.*s]\n", saved, s + n, buf);
    if (!tz && n > 0) targ_width = width + n;
    for (i = 0, t = 0.1; s + n < (int) sizeof(buf) && n < targ_width; i++) {
      int ch = (int) (d / t);
      buf[s + n++] = (char) (ch + '0');
      d -= ch * t;
      t /= 10.0;
    }
  }

  while (tz && n > 0 && buf[s + n - 1] == '0') n--;  // Trim trailing zeroes
  if (tz && n > 0 && buf[s + n - 1] == '.') n--;     // Trim trailing dot
  n += s;
  if (n >= (int) sizeof(buf)) n = (int) sizeof(buf) - 1;
  buf[n] = '\0';
  return mg_snprintf(dst, dstlen, "%s", buf);
}

static size_t mg_lld(char *buf, int64_t val, bool is_signed, bool is_hex) {
  const char *letters = "0123456789abcdef";
  uint64_t v = (uint64_t) val;
  size_t s = 0, n, i;
  if (is_signed && val < 0) buf[s++] = '-', v = (uint64_t) (-val);
  // This loop prints a number in reverse order. I guess this is because we
  // write numbers from right to left: least significant digit comes last.
  // Maybe because we use Arabic numbers, and Arabs write RTL?
  if (is_hex) {
    for (n = 0; v; v >>= 4) buf[s + n++] = letters[v & 15];
  } else {
    for (n = 0; v; v /= 10) buf[s + n++] = letters[v % 10];
  }
  // Reverse a string
  for (i = 0; i < n / 2; i++) {
    char t = buf[s + i];
    buf[s + i] = buf[s + n - i - 1], buf[s + n - i - 1] = t;
  }
  if (val == 0) buf[n++] = '0';  // Handle special case
  return n + s;
}

static size_t scpy(void (*out)(char, void *), void *ptr, char *buf,
                   size_t len) {
  size_t i = 0;
  while (i < len && buf[i] != '\0') out(buf[i++], ptr);
  return i;
}

size_t mg_xprintf(void (*out)(char, void *), void *ptr, const char *fmt, ...) {
  size_t len = 0;
  va_list ap;
  va_start(ap, fmt);
  len = mg_vxprintf(out, ptr, fmt, &ap);
  va_end(ap);
  return len;
}

size_t mg_vxprintf(void (*out)(char, void *), void *param, const char *fmt,
                   va_list *ap) {
  size_t i = 0, n = 0;
  while (fmt[i] != '\0') {
    if (fmt[i] == '%') {
      size_t j, k, x = 0, is_long = 0, w = 0 /* width */, pr = ~0U /* prec */;
      char pad = ' ', minus = 0, c = fmt[++i];
      if (c == '#') x++, c = fmt[++i];
      if (c == '-') minus++, c = fmt[++i];
      if (c == '0') pad = '0', c = fmt[++i];
      while (is_digit(c)) w *= 10, w += (size_t) (c - '0'), c = fmt[++i];
      if (c == '.') {
        c = fmt[++i];
        if (c == '*') {
          pr = (size_t) va_arg(*ap, int);
          c = fmt[++i];
        } else {
          pr = 0;
          while (is_digit(c)) pr *= 10, pr += (size_t) (c - '0'), c = fmt[++i];
        }
      }
      while (c == 'h') c = fmt[++i];  // Treat h and hh as int
      if (c == 'l') {
        is_long++, c = fmt[++i];
        if (c == 'l') is_long++, c = fmt[++i];
      }
      if (c == 'p') x = 1, is_long = 1;
      if (c == 'd' || c == 'u' || c == 'x' || c == 'X' || c == 'p' ||
          c == 'g' || c == 'f') {
        bool s = (c == 'd'), h = (c == 'x' || c == 'X' || c == 'p');
        char tmp[40];
        size_t xl = x ? 2 : 0;
        if (c == 'g' || c == 'f') {
          double v = va_arg(*ap, double);
          if (pr == ~0U) pr = 6;
          k = mg_dtoa(tmp, sizeof(tmp), v, (int) pr, c == 'g');
        } else if (is_long == 2) {
          int64_t v = va_arg(*ap, int64_t);
          k = mg_lld(tmp, v, s, h);
        } else if (is_long == 1) {
          long v = va_arg(*ap, long);
          k = mg_lld(tmp, s ? (int64_t) v : (int64_t) (unsigned long) v, s, h);
        } else {
          int v = va_arg(*ap, int);
          k = mg_lld(tmp, s ? (int64_t) v : (int64_t) (unsigned) v, s, h);
        }
        for (j = 0; j < xl && w > 0; j++) w--;
        for (j = 0; pad == ' ' && !minus && k < w && j + k < w; j++)
          n += scpy(out, param, &pad, 1);
        n += scpy(out, param, (char *) "0x", xl);
        for (j = 0; pad == '0' && k < w && j + k < w; j++)
          n += scpy(out, param, &pad, 1);
        n += scpy(out, param, tmp, k);
        for (j = 0; pad == ' ' && minus && k < w && j + k < w; j++)
          n += scpy(out, param, &pad, 1);
      } else if (c == 'm' || c == 'M') {
        mg_pm_t f = va_arg(*ap, mg_pm_t);
        if (c == 'm') out('"', param);
        n += f(out, param, ap);
        if (c == 'm') n += 2, out('"', param);
      } else if (c == 'c') {
        int ch = va_arg(*ap, int);
        out((char) ch, param);
        n++;
      } else if (c == 's') {
        char *p = va_arg(*ap, char *);
        if (pr == ~0U) pr = p == NULL ? 0 : strlen(p);
        for (j = 0; !minus && pr < w && j + pr < w; j++)
          n += scpy(out, param, &pad, 1);
        n += scpy(out, param, p, pr);
        for (j = 0; minus && pr < w && j + pr < w; j++)
          n += scpy(out, param, &pad, 1);
      } else if (c == '%') {
        out('%', param);
        n++;
      } else {
        out('%', param);
        out(c, param);
        n += 2;
      }
      i++;
    } else {
      out(fmt[i], param), n++, i++;
    }
  }
  return n;
}

#ifdef MG_ENABLE_LINES
#line 1 "src/fs.c"
#endif





struct mg_fd *mg_fs_open(struct mg_fs *fs, const char *path, int flags) {
  struct mg_fd *fd = (struct mg_fd *) mg_calloc(1, sizeof(*fd));
  if (fd != NULL) {
    fd->fd = fs->op(path, flags);
    fd->fs = fs;
    if (fd->fd == NULL) {
      mg_free(fd);
      fd = NULL;
    }
  }
  return fd;
}

void mg_fs_close(struct mg_fd *fd) {
  if (fd != NULL) {
    fd->fs->cl(fd->fd);
    mg_free(fd);
  }
}

struct mg_str mg_file_read(struct mg_fs *fs, const char *path) {
  struct mg_str result = {NULL, 0};
  void *fp;
  fs->st(path, &result.len, NULL);
  if ((fp = fs->op(path, MG_FS_READ)) != NULL) {
    result.buf = (char *) mg_calloc(1, result.len + 1);
    if (result.buf != NULL &&
        fs->rd(fp, (void *) result.buf, result.len) != result.len) {
      mg_free((void *) result.buf);
      result.buf = NULL;
    }
    fs->cl(fp);
  }
  if (result.buf == NULL) result.len = 0;
  return result;
}

bool mg_file_write(struct mg_fs *fs, const char *path, const void *buf,
                   size_t len) {
  bool result = false;
  struct mg_fd *fd;
  char tmp[MG_PATH_MAX];
  mg_snprintf(tmp, sizeof(tmp), "%s..%d", path, rand());
  if ((fd = mg_fs_open(fs, tmp, MG_FS_WRITE)) != NULL) {
    result = fs->wr(fd->fd, buf, len) == len;
    mg_fs_close(fd);
    if (result) {
      fs->rm(path);
      fs->mv(tmp, path);
    } else {
      fs->rm(tmp);
    }
  }
  return result;
}

bool mg_file_printf(struct mg_fs *fs, const char *path, const char *fmt, ...) {
  va_list ap;
  char *data;
  bool result = false;
  va_start(ap, fmt);
  data = mg_vmprintf(fmt, &ap);
  va_end(ap);
  result = mg_file_write(fs, path, data, strlen(data));
  mg_free(data);
  return result;
}

// This helper function allows to scan a filesystem in a sequential way,
// without using callback function:
//      char buf[100] = "";
//      while (mg_fs_ls(&mg_fs_posix, "./", buf, sizeof(buf))) {
//        ...
static void mg_fs_ls_fn(const char *filename, void *param) {
  struct mg_str *s = (struct mg_str *) param;
  if (s->buf[0] == '\0') {
    mg_snprintf((char *) s->buf, s->len, "%s", filename);
  } else if (strcmp(s->buf, filename) == 0) {
    ((char *) s->buf)[0] = '\0';  // Fetch next file
  }
}

bool mg_fs_ls(struct mg_fs *fs, const char *path, char *buf, size_t len) {
  struct mg_str s;
  s.buf = buf, s.len = len;
  fs->ls(path, mg_fs_ls_fn, &s);
  return buf[0] != '\0';
}

#ifdef MG_ENABLE_LINES
#line 1 "src/fs_fat.c"
#endif



#if MG_ENABLE_FATFS
#include <ff.h>

static int mg_days_from_epoch(int y, int m, int d) {
  y -= m <= 2;
  int era = y / 400;
  int yoe = y - era * 400;
  int doy = (153 * (m + (m > 2 ? -3 : 9)) + 2) / 5 + d - 1;
  int doe = yoe * 365 + yoe / 4 - yoe / 100 + doy;
  return era * 146097 + doe - 719468;
}

static time_t mg_timegm(const struct tm *t) {
  int year = t->tm_year + 1900;
  int month = t->tm_mon;  // 0-11
  if (month > 11) {
    year += month / 12;
    month %= 12;
  } else if (month < 0) {
    int years_diff = (11 - month) / 12;
    year -= years_diff;
    month += 12 * years_diff;
  }
  int x = mg_days_from_epoch(year, month + 1, t->tm_mday);
  return 60 * (60 * (24L * x + t->tm_hour) + t->tm_min) + t->tm_sec;
}

static time_t ff_time_to_epoch(uint16_t fdate, uint16_t ftime) {
  struct tm tm;
  memset(&tm, 0, sizeof(struct tm));
  tm.tm_sec = (ftime << 1) & 0x3e;
  tm.tm_min = ((ftime >> 5) & 0x3f);
  tm.tm_hour = ((ftime >> 11) & 0x1f);
  tm.tm_mday = (fdate & 0x1f);
  tm.tm_mon = ((fdate >> 5) & 0x0f) - 1;
  tm.tm_year = ((fdate >> 9) & 0x7f) + 80;
  return mg_timegm(&tm);
}

static int ff_stat(const char *path, size_t *size, time_t *mtime) {
  FILINFO fi;
  if (path[0] == '\0') {
    if (size) *size = 0;
    if (mtime) *mtime = 0;
    return MG_FS_DIR;
  } else if (f_stat(path, &fi) == 0) {
    if (size) *size = (size_t) fi.fsize;
    if (mtime) *mtime = ff_time_to_epoch(fi.fdate, fi.ftime);
    return MG_FS_READ | MG_FS_WRITE | ((fi.fattrib & AM_DIR) ? MG_FS_DIR : 0);
  } else {
    return 0;
  }
}

static void ff_list(const char *dir, void (*fn)(const char *, void *),
                    void *userdata) {
  DIR d;
  FILINFO fi;
  if (f_opendir(&d, dir) == FR_OK) {
    while (f_readdir(&d, &fi) == FR_OK && fi.fname[0] != '\0') {
      if (!strcmp(fi.fname, ".") || !strcmp(fi.fname, "..")) continue;
      fn(fi.fname, userdata);
    }
    f_closedir(&d);
  }
}

static void *ff_open(const char *path, int flags) {
  FIL f;
  unsigned char mode = FA_READ;
  if (flags & MG_FS_WRITE) mode |= FA_WRITE | FA_OPEN_ALWAYS | FA_OPEN_APPEND;
  if (f_open(&f, path, mode) == 0) {
    FIL *fp;
    if ((fp = mg_calloc(1, sizeof(*fp))) != NULL) {
      memcpy(fp, &f, sizeof(*fp));
      return fp;
    }
  }
  return NULL;
}

static void ff_close(void *fp) {
  if (fp != NULL) {
    f_close((FIL *) fp);
    mg_free(fp);
  }
}

static size_t ff_read(void *fp, void *buf, size_t len) {
  UINT n = 0, misalign = ((size_t) buf) & 3;
  if (misalign) {
    char aligned[4];
    f_read((FIL *) fp, aligned, len > misalign ? misalign : len, &n);
    memcpy(buf, aligned, n);
  } else {
    f_read((FIL *) fp, buf, len, &n);
  }
  return n;
}

static size_t ff_write(void *fp, const void *buf, size_t len) {
  UINT n = 0;
  return f_write((FIL *) fp, (char *) buf, len, &n) == FR_OK ? n : 0;
}

static size_t ff_seek(void *fp, size_t offset) {
  f_lseek((FIL *) fp, offset);
  return offset;
}

static bool ff_rename(const char *from, const char *to) {
  return f_rename(from, to) == FR_OK;
}

static bool ff_remove(const char *path) {
  return f_unlink(path) == FR_OK;
}

static bool ff_mkdir(const char *path) {
  return f_mkdir(path) == FR_OK;
}

struct mg_fs mg_fs_fat = {ff_stat,  ff_list, ff_open,   ff_close,  ff_read,
                          ff_write, ff_seek, ff_rename, ff_remove, ff_mkdir};
#endif

#ifdef MG_ENABLE_LINES
#line 1 "src/fs_packed.c"
#endif





struct packed_file {
  const char *data;
  size_t size;
  size_t pos;
};

#if MG_ENABLE_PACKED_FS
#else
const char *mg_unpack(const char *path, size_t *size, time_t *mtime) {
  if (size != NULL) *size = 0;
  if (mtime != NULL) *mtime = 0;
  (void) path;
  return NULL;
}
const char *mg_unlist(size_t no) {
  (void) no;
  return NULL;
}
#endif

struct mg_str mg_unpacked(const char *path) {
  size_t len = 0;
  const char *buf = mg_unpack(path, &len, NULL);
  return mg_str_n(buf, len);
}

static int is_dir_prefix(const char *prefix, size_t n, const char *path) {
  // MG_INFO(("[%.*s] [%s] %c", (int) n, prefix, path, path[n]));
  return n < strlen(path) && strncmp(prefix, path, n) == 0 &&
         (n == 0 || path[n] == '/' || path[n - 1] == '/');
}

static int packed_stat(const char *path, size_t *size, time_t *mtime) {
  const char *p;
  size_t i, n = strlen(path);
  if (mg_unpack(path, size, mtime)) return MG_FS_READ;  // Regular file
  // Scan all files. If `path` is a dir prefix for any of them, it's a dir
  for (i = 0; (p = mg_unlist(i)) != NULL; i++) {
    if (is_dir_prefix(path, n, p)) return MG_FS_DIR;
  }
  return 0;
}

static void packed_list(const char *dir, void (*fn)(const char *, void *),
                        void *userdata) {
  char buf[MG_PATH_MAX], tmp[sizeof(buf)];
  const char *path, *begin, *end;
  size_t i, n = strlen(dir);
  tmp[0] = '\0';  // Previously listed entry
  for (i = 0; (path = mg_unlist(i)) != NULL; i++) {
    if (!is_dir_prefix(dir, n, path)) continue;
    begin = &path[n + 1];
    end = strchr(begin, '/');
    if (end == NULL) end = begin + strlen(begin);
    mg_snprintf(buf, sizeof(buf), "%.*s", (int) (end - begin), begin);
    buf[sizeof(buf) - 1] = '\0';
    // If this entry has been already listed, skip
    // NOTE: we're assuming that file list is sorted alphabetically
    if (strcmp(buf, tmp) == 0) continue;
    fn(buf, userdata);  // Not yet listed, call user function
    strcpy(tmp, buf);   // And save this entry as listed
  }
}

static void *packed_open(const char *path, int flags) {
  size_t size = 0;
  const char *data = mg_unpack(path, &size, NULL);
  struct packed_file *fp = NULL;
  if (data == NULL) return NULL;
  if (flags & MG_FS_WRITE) return NULL;
  if ((fp = (struct packed_file *) mg_calloc(1, sizeof(*fp))) != NULL) {
    fp->size = size;
    fp->data = data;
  }
  return (void *) fp;
}

static void packed_close(void *fp) {
  if (fp != NULL) mg_free(fp);
}

static size_t packed_read(void *fd, void *buf, size_t len) {
  struct packed_file *fp = (struct packed_file *) fd;
  if (fp->pos + len > fp->size) len = fp->size - fp->pos;
  memcpy(buf, &fp->data[fp->pos], len);
  fp->pos += len;
  return len;
}

static size_t packed_write(void *fd, const void *buf, size_t len) {
  (void) fd, (void) buf, (void) len;
  return 0;
}

static size_t packed_seek(void *fd, size_t offset) {
  struct packed_file *fp = (struct packed_file *) fd;
  fp->pos = offset;
  if (fp->pos > fp->size) fp->pos = fp->size;
  return fp->pos;
}

static bool packed_rename(const char *from, const char *to) {
  (void) from, (void) to;
  return false;
}

static bool packed_remove(const char *path) {
  (void) path;
  return false;
}

static bool packed_mkdir(const char *path) {
  (void) path;
  return false;
}

struct mg_fs mg_fs_packed = {
    packed_stat,  packed_list, packed_open,   packed_close,  packed_read,
    packed_write, packed_seek, packed_rename, packed_remove, packed_mkdir};

#ifdef MG_ENABLE_LINES
#line 1 "src/fs_posix.c"
#endif


#if MG_ENABLE_POSIX_FS

#ifndef MG_STAT_STRUCT
#define MG_STAT_STRUCT stat
#endif

#ifndef MG_STAT_FUNC
#define MG_STAT_FUNC stat
#endif

static int p_stat(const char *path, size_t *size, time_t *mtime) {
#if !defined(S_ISDIR)
  MG_ERROR(("stat() API is not supported. %p %p %p", path, size, mtime));
  return 0;
#else
#if MG_ARCH == MG_ARCH_WIN32
  struct _stati64 st;
  wchar_t tmp[MG_PATH_MAX];
  MultiByteToWideChar(CP_UTF8, 0, path, -1, tmp, sizeof(tmp) / sizeof(tmp[0]));
  if (_wstati64(tmp, &st) != 0) return 0;
  // If path is a symlink, windows reports 0 in st.st_size.
  // Get a real file size by opening it and jumping to the end
  if (st.st_size == 0 && (st.st_mode & _S_IFREG)) {
    FILE *fp = _wfopen(tmp, L"rb");
    if (fp != NULL) {
      fseek(fp, 0, SEEK_END);
      if (ftell(fp) > 0) st.st_size = ftell(fp);  // Use _ftelli64 on win10+
      fclose(fp);
    }
  }
#else
  struct MG_STAT_STRUCT st;
  if (MG_STAT_FUNC(path, &st) != 0) return 0;
#endif
  if (size) *size = (size_t) st.st_size;
  if (mtime) *mtime = st.st_mtime;
  return MG_FS_READ | MG_FS_WRITE | (S_ISDIR(st.st_mode) ? MG_FS_DIR : 0);
#endif
}

#if MG_ARCH == MG_ARCH_WIN32
struct dirent {
  char d_name[MAX_PATH];
};

typedef struct win32_dir {
  HANDLE handle;
  WIN32_FIND_DATAW info;
  struct dirent result;
} DIR;

#if 0
int gettimeofday(struct timeval *tv, void *tz) {
  FILETIME ft;
  unsigned __int64 tmpres = 0;

  if (tv != NULL) {
    GetSystemTimeAsFileTime(&ft);
    tmpres |= ft.dwHighDateTime;
    tmpres <<= 32;
    tmpres |= ft.dwLowDateTime;
    tmpres /= 10;  // convert into microseconds
    tmpres -= (int64_t) 11644473600000000;
    tv->tv_sec = (long) (tmpres / 1000000UL);
    tv->tv_usec = (long) (tmpres % 1000000UL);
  }
  (void) tz;
  return 0;
}
#endif

static int to_wchar(const char *path, wchar_t *wbuf, size_t wbuf_len) {
  int ret;
  char buf[MAX_PATH * 2], buf2[MAX_PATH * 2], *p;
  strncpy(buf, path, sizeof(buf));
  buf[sizeof(buf) - 1] = '\0';
  // Trim trailing slashes. Leave backslash for paths like "X:\"
  p = buf + strlen(buf) - 1;
  while (p > buf && p[-1] != ':' && (p[0] == '\\' || p[0] == '/')) *p-- = '\0';
  memset(wbuf, 0, wbuf_len * sizeof(wchar_t));
  ret = MultiByteToWideChar(CP_UTF8, 0, buf, -1, wbuf, (int) wbuf_len);
  // Convert back to Unicode. If doubly-converted string does not match the
  // original, something is fishy, reject.
  WideCharToMultiByte(CP_UTF8, 0, wbuf, (int) wbuf_len, buf2, sizeof(buf2),
                      NULL, NULL);
  if (strcmp(buf, buf2) != 0) {
    wbuf[0] = L'\0';
    ret = 0;
  }
  return ret;
}

DIR *opendir(const char *name) {
  DIR *d = NULL;
  wchar_t wpath[MAX_PATH];
  DWORD attrs;

  if (name == NULL) {
    SetLastError(ERROR_BAD_ARGUMENTS);
  } else if ((d = (DIR *) mg_calloc(1, sizeof(*d))) == NULL) {
    SetLastError(ERROR_NOT_ENOUGH_MEMORY);
  } else {
    to_wchar(name, wpath, sizeof(wpath) / sizeof(wpath[0]));
    attrs = GetFileAttributesW(wpath);
    if (attrs != 0Xffffffff && (attrs & FILE_ATTRIBUTE_DIRECTORY)) {
      (void) wcscat(wpath, L"\\*");
      d->handle = FindFirstFileW(wpath, &d->info);
      d->result.d_name[0] = '\0';
    } else {
      mg_free(d);
      d = NULL;
    }
  }
  return d;
}

int closedir(DIR *d) {
  int result = 0;
  if (d != NULL) {
    if (d->handle != INVALID_HANDLE_VALUE)
      result = FindClose(d->handle) ? 0 : -1;
    mg_free(d);
  } else {
    result = -1;
    SetLastError(ERROR_BAD_ARGUMENTS);
  }
  return result;
}

struct dirent *readdir(DIR *d) {
  struct dirent *result = NULL;
  if (d != NULL) {
    memset(&d->result, 0, sizeof(d->result));
    if (d->handle != INVALID_HANDLE_VALUE) {
      result = &d->result;
      WideCharToMultiByte(CP_UTF8, 0, d->info.cFileName, -1, result->d_name,
                          sizeof(result->d_name), NULL, NULL);
      if (!FindNextFileW(d->handle, &d->info)) {
        FindClose(d->handle);
        d->handle = INVALID_HANDLE_VALUE;
      }
    } else {
      SetLastError(ERROR_FILE_NOT_FOUND);
    }
  } else {
    SetLastError(ERROR_BAD_ARGUMENTS);
  }
  return result;
}
#endif

static void p_list(const char *dir, void (*fn)(const char *, void *),
                   void *userdata) {
#if MG_ENABLE_DIRLIST
  struct dirent *dp;
  DIR *dirp;
  if ((dirp = (opendir(dir))) == NULL) return;
  while ((dp = readdir(dirp)) != NULL) {
    if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) continue;
    fn(dp->d_name, userdata);
  }
  closedir(dirp);
#else
  (void) dir, (void) fn, (void) userdata;
#endif
}

static void *p_open(const char *path, int flags) {
#if MG_ARCH == MG_ARCH_WIN32
  const char *mode = flags == MG_FS_READ ? "rb" : "a+b";
  wchar_t b1[MG_PATH_MAX], b2[10];
  MultiByteToWideChar(CP_UTF8, 0, path, -1, b1, sizeof(b1) / sizeof(b1[0]));
  MultiByteToWideChar(CP_UTF8, 0, mode, -1, b2, sizeof(b2) / sizeof(b2[0]));
  return (void *) _wfopen(b1, b2);
#else
  const char *mode = flags == MG_FS_READ ? "rbe" : "a+be";  // e for CLOEXEC
  return (void *) fopen(path, mode);
#endif
}

static void p_close(void *fp) {
  fclose((FILE *) fp);
}

static size_t p_read(void *fp, void *buf, size_t len) {
  return fread(buf, 1, len, (FILE *) fp);
}

static size_t p_write(void *fp, const void *buf, size_t len) {
  return fwrite(buf, 1, len, (FILE *) fp);
}

static size_t p_seek(void *fp, size_t offset) {
#if (defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64) ||  \
    (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L) || \
    (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 600)
  if (fseeko((FILE *) fp, (off_t) offset, SEEK_SET) != 0) (void) 0;
#else
  if (fseek((FILE *) fp, (long) offset, SEEK_SET) != 0) (void) 0;
#endif
  return (size_t) ftell((FILE *) fp);
}

static bool p_rename(const char *from, const char *to) {
  return rename(from, to) == 0;
}

static bool p_remove(const char *path) {
  return remove(path) == 0;
}

static bool p_mkdir(const char *path) {
  return mkdir(path, 0775) == 0;
}

#else

static int p_stat(const char *path, size_t *size, time_t *mtime) {
  (void) path, (void) size, (void) mtime;
  return 0;
}
static void p_list(const char *path, void (*fn)(const char *, void *),
                   void *userdata) {
  (void) path, (void) fn, (void) userdata;
}
static void *p_open(const char *path, int flags) {
  (void) path, (void) flags;
  return NULL;
}
static void p_close(void *fp) {
  (void) fp;
}
static size_t p_read(void *fd, void *buf, size_t len) {
  (void) fd, (void) buf, (void) len;
  return 0;
}
static size_t p_write(void *fd, const void *buf, size_t len) {
  (void) fd, (void) buf, (void) len;
  return 0;
}
static size_t p_seek(void *fd, size_t offset) {
  (void) fd, (void) offset;
  return (size_t) ~0;
}
static bool p_rename(const char *from, const char *to) {
  (void) from, (void) to;
  return false;
}
static bool p_remove(const char *path) {
  (void) path;
  return false;
}
static bool p_mkdir(const char *path) {
  (void) path;
  return false;
}
#endif

struct mg_fs mg_fs_posix = {p_stat,  p_list, p_open,   p_close,  p_read,
                            p_write, p_seek, p_rename, p_remove, p_mkdir};

#ifdef MG_ENABLE_LINES
#line 1 "src/http.c"
#endif













static int mg_ncasecmp(const char *s1, const char *s2, size_t len) {
  int diff = 0;
  if (len > 0) do {
      int c = *s1++, d = *s2++;
      if (c >= 'A' && c <= 'Z') c += 'a' - 'A';
      if (d >= 'A' && d <= 'Z') d += 'a' - 'A';
      diff = c - d;
    } while (diff == 0 && s1[-1] != '\0' && --len > 0);
  return diff;
}

bool mg_to_size_t(struct mg_str str, size_t *val);
bool mg_to_size_t(struct mg_str str, size_t *val) {
  size_t i = 0, max = (size_t) -1, max2 = max / 10, result = 0, ndigits = 0;
  while (i < str.len && (str.buf[i] == ' ' || str.buf[i] == '\t')) i++;
  if (i < str.len && str.buf[i] == '-') return false;
  while (i < str.len && str.buf[i] >= '0' && str.buf[i] <= '9') {
    size_t digit = (size_t) (str.buf[i] - '0');
    if (result > max2) return false;  // Overflow
    result *= 10;
    if (result > max - digit) return false;  // Overflow
    result += digit;
    i++, ndigits++;
  }
  while (i < str.len && (str.buf[i] == ' ' || str.buf[i] == '\t')) i++;
  if (ndigits == 0) return false;  // #2322: Content-Length = 1 * DIGIT
  if (i != str.len) return false;  // Ditto
  *val = (size_t) result;
  return true;
}

// Chunk deletion marker is the MSB in the "processed" counter
#define MG_DMARK ((size_t) 1 << (sizeof(size_t) * 8 - 1))

// Multipart POST example:
// --xyz
// Content-Disposition: form-data; name="val"
//
// abcdef
// --xyz
// Content-Disposition: form-data; name="foo"; filename="a.txt"
// Content-Type: text/plain
//
// hello world
//
// --xyz--
size_t mg_http_next_multipart(struct mg_str body, size_t ofs,
                              struct mg_http_part *part) {
  struct mg_str cd = mg_str_n("Content-Disposition", 19);
  const char *s = body.buf;
  size_t b = ofs, h1, h2, b1, b2, max = body.len;

  // Init part params
  if (part != NULL) part->name = part->filename = part->body = mg_str_n(0, 0);

  // Skip boundary
  while (b + 2 < max && s[b] != '\r' && s[b + 1] != '\n') b++;
  if (b <= ofs || b + 2 >= max) return 0;
  // MG_INFO(("B: %zu %zu [%.*s]", ofs, b - ofs, (int) (b - ofs), s));

  // Skip headers
  h1 = h2 = b + 2;
  for (;;) {
    while (h2 + 2 < max && s[h2] != '\r' && s[h2 + 1] != '\n') h2++;
    if (h2 == h1) break;
    if (h2 + 2 >= max) return 0;
    // MG_INFO(("Header: [%.*s]", (int) (h2 - h1), &s[h1]));
    if (part != NULL && h1 + cd.len + 2 < h2 && s[h1 + cd.len] == ':' &&
        mg_ncasecmp(&s[h1], cd.buf, cd.len) == 0) {
      struct mg_str v = mg_str_n(&s[h1 + cd.len + 2], h2 - (h1 + cd.len + 2));
      part->name = mg_http_get_header_var(v, mg_str_n("name", 4));
      part->filename = mg_http_get_header_var(v, mg_str_n("filename", 8));
    }
    h1 = h2 = h2 + 2;
  }
  b1 = b2 = h2 + 2;
  while (b2 + 2 + (b - ofs) + 2 < max && !(s[b2] == '\r' && s[b2 + 1] == '\n' &&
                                           memcmp(&s[b2 + 2], s, b - ofs) == 0))
    b2++;

  if (b2 + 2 >= max) return 0;
  if (part != NULL) part->body = mg_str_n(&s[b1], b2 - b1);
  // MG_INFO(("Body: [%.*s]", (int) (b2 - b1), &s[b1]));
  return b2 + 2;
}

void mg_http_bauth(struct mg_connection *c, const char *user,
                   const char *pass) {
  struct mg_str u = mg_str(user), p = mg_str(pass);
  size_t need = c->send.len + 36 + (u.len + p.len) * 2;
  if (c->send.size < need) mg_iobuf_resize(&c->send, need);
  if (c->send.size >= need) {
    size_t i, n = 0;
    char *buf = (char *) &c->send.buf[c->send.len];
    memcpy(buf, "Authorization: Basic ", 21);  // DON'T use mg_send!
    for (i = 0; i < u.len; i++) {
      n = mg_base64_update(((unsigned char *) u.buf)[i], buf + 21, n);
    }
    if (p.len > 0) {
      n = mg_base64_update(':', buf + 21, n);
      for (i = 0; i < p.len; i++) {
        n = mg_base64_update(((unsigned char *) p.buf)[i], buf + 21, n);
      }
    }
    n = mg_base64_final(buf + 21, n);
    c->send.len += 21 + (size_t) n + 2;
    memcpy(&c->send.buf[c->send.len - 2], "\r\n", 2);
  } else {
    MG_ERROR(("%lu oom %d->%d ", c->id, (int) c->send.size, (int) need));
  }
}

struct mg_str mg_http_var(struct mg_str buf, struct mg_str name) {
  struct mg_str entry, k, v, result = mg_str_n(NULL, 0);
  while (mg_span(buf, &entry, &buf, '&')) {
    if (mg_span(entry, &k, &v, '=') && name.len == k.len &&
        mg_ncasecmp(name.buf, k.buf, k.len) == 0) {
      result = v;
      break;
    }
  }
  return result;
}

int mg_http_get_var(const struct mg_str *buf, const char *name, char *dst,
                    size_t dst_len) {
  int len;
  if (dst != NULL && dst_len > 0) {
    dst[0] = '\0';  // If destination buffer is valid, always nul-terminate it
  }
  if (dst == NULL || dst_len == 0) {
    len = -2;  // Bad destination
  } else if (buf->buf == NULL || name == NULL || buf->len == 0) {
    len = -1;  // Bad source
  } else {
    struct mg_str v = mg_http_var(*buf, mg_str(name));
    if (v.buf == NULL) {
      len = -4;  // Name does not exist
    } else {
      len = mg_url_decode(v.buf, v.len, dst, dst_len, 1);
      if (len < 0) len = -3;  // Failed to decode
    }
  }
  return len;
}

static bool isx(int c) {
  return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') ||
         (c >= 'A' && c <= 'F');
}

int mg_url_decode(const char *src, size_t src_len, char *dst, size_t dst_len,
                  int is_form_url_encoded) {
  size_t i, j;
  for (i = j = 0; i < src_len && j + 1 < dst_len; i++, j++) {
    if (src[i] == '%') {
      // Use `i + 2 < src_len`, not `i < src_len - 2`, note small src_len
      if (i + 2 < src_len && isx(src[i + 1]) && isx(src[i + 2])) {
        mg_str_to_num(mg_str_n(src + i + 1, 2), 16, &dst[j], sizeof(uint8_t));
        i += 2;
      } else {
        return -1;
      }
    } else if (is_form_url_encoded && src[i] == '+') {
      dst[j] = ' ';
    } else {
      dst[j] = src[i];
    }
  }
  if (j < dst_len) dst[j] = '\0';  // Null-terminate the destination
  return i >= src_len && j < dst_len ? (int) j : -1;
}

static bool isok(uint8_t c) {
  return c == '\n' || c == '\r' || c == '\t' || c >= ' ';
}

int mg_http_get_request_len(const unsigned char *buf, size_t buf_len) {
  size_t i;
  for (i = 0; i < buf_len; i++) {
    if (!isok(buf[i])) return -1;
    if ((i > 0 && buf[i] == '\n' && buf[i - 1] == '\n') ||
        (i > 3 && buf[i] == '\n' && buf[i - 1] == '\r' && buf[i - 2] == '\n'))
      return (int) i + 1;
  }
  return 0;
}
struct mg_str *mg_http_get_header(struct mg_http_message *h, const char *name) {
  size_t i, n = strlen(name), max = sizeof(h->headers) / sizeof(h->headers[0]);
  for (i = 0; i < max && h->headers[i].name.len > 0; i++) {
    struct mg_str *k = &h->headers[i].name, *v = &h->headers[i].value;
    if (n == k->len && mg_ncasecmp(k->buf, name, n) == 0) return v;
  }
  return NULL;
}

// Is it a valid utf-8 continuation byte
static bool vcb(uint8_t c) {
  return (c & 0xc0) == 0x80;
}

// Get character length (valid utf-8). Used to parse method, URI, headers
static size_t clen(const char *s, const char *end) {
  const unsigned char *u = (unsigned char *) s, c = *u;
  long n = (long) (end - s);
  if (c > ' ' && c <= '~') return 1;  // Usual ascii printed char
  if ((c & 0xe0) == 0xc0 && n > 1 && vcb(u[1])) return 2;  // 2-byte UTF8
  if ((c & 0xf0) == 0xe0 && n > 2 && vcb(u[1]) && vcb(u[2])) return 3;
  if ((c & 0xf8) == 0xf0 && n > 3 && vcb(u[1]) && vcb(u[2]) && vcb(u[3]))
    return 4;
  return 0;
}

// Skip until the newline. Return advanced `s`, or NULL on error
static const char *skiptorn(const char *s, const char *end, struct mg_str *v) {
  v->buf = (char *) s;
  while (s < end && s[0] != '\n' && s[0] != '\r') s++, v->len++;  // To newline
  if (s >= end || (s[0] == '\r' && s[1] != '\n')) return NULL;    // Stray \r
  if (s < end && s[0] == '\r') s++;                               // Skip \r
  if (s >= end || *s++ != '\n') return NULL;                      // Skip \n
  return s;
}

static bool mg_http_parse_headers(const char *s, const char *end,
                                  struct mg_http_header *h, size_t max_hdrs) {
  size_t i, n;
  for (i = 0; i < max_hdrs; i++) {
    struct mg_str k = {NULL, 0}, v = {NULL, 0};
    if (s >= end) return false;
    if (s[0] == '\n' || (s[0] == '\r' && s[1] == '\n')) break;
    k.buf = (char *) s;
    while (s < end && s[0] != ':' && (n = clen(s, end)) > 0) s += n, k.len += n;
    if (k.len == 0) return false;                     // Empty name
    if (s >= end || clen(s, end) == 0) return false;  // Invalid UTF-8
    if (*s++ != ':') return false;  // Invalid, not followed by :
    // if (clen(s, end) == 0) return false;        // Invalid UTF-8
    while (s < end && (s[0] == ' ' || s[0] == '\t')) s++;  // Skip spaces
    if ((s = skiptorn(s, end, &v)) == NULL) return false;
    while (v.len > 0 && (v.buf[v.len - 1] == ' ' || v.buf[v.len - 1] == '\t')) {
      v.len--;  // Trim spaces
    }
    // MG_INFO(("--HH [%.*s] [%.*s]", (int) k.len, k.buf, (int) v.len, v.buf));
    h[i].name = k, h[i].value = v;  // Success. Assign values
  }
  return true;
}

int mg_http_parse(const char *s, size_t len, struct mg_http_message *hm) {
  int is_response, req_len = mg_http_get_request_len((unsigned char *) s, len);
  const char *end = s == NULL ? NULL : s + req_len, *qs;  // Cannot add to NULL
  const struct mg_str *cl;
  size_t n;
  bool version_prefix_valid;

  memset(hm, 0, sizeof(*hm));
  if (req_len <= 0) return req_len;

  hm->message.buf = hm->head.buf = (char *) s;
  hm->body.buf = (char *) end;
  hm->head.len = (size_t) req_len;
  hm->message.len = hm->body.len = (size_t) -1;  // Set body length to infinite

  // Parse request line
  hm->method.buf = (char *) s;
  while (s < end && (n = clen(s, end)) > 0) s += n, hm->method.len += n;
  while (s < end && s[0] == ' ') s++;  // Skip spaces
  hm->uri.buf = (char *) s;
  while (s < end && (n = clen(s, end)) > 0) s += n, hm->uri.len += n;
  while (s < end && s[0] == ' ') s++;  // Skip spaces
  is_response =
      hm->method.len > 5 && (mg_ncasecmp(hm->method.buf, "HTTP/", 5) == 0);
  if ((s = skiptorn(s, end, &hm->proto)) == NULL) return false;
  // If we're given a version, check that it is HTTP/x.x
  version_prefix_valid =
      hm->proto.len > 5 && (mg_ncasecmp(hm->proto.buf, "HTTP/", 5) == 0);
  if (!is_response && hm->proto.len > 0 &&
      (!version_prefix_valid || hm->proto.len != 8 ||
       (hm->proto.buf[5] < '0' || hm->proto.buf[5] > '9') ||
       (hm->proto.buf[6] != '.') ||
       (hm->proto.buf[7] < '0' || hm->proto.buf[7] > '9'))) {
    return -1;
  }

  // If URI contains '?' character, setup query string
  if ((qs = (const char *) memchr(hm->uri.buf, '?', hm->uri.len)) != NULL) {
    hm->query.buf = (char *) qs + 1;
    hm->query.len = (size_t) (&hm->uri.buf[hm->uri.len] - (qs + 1));
    hm->uri.len = (size_t) (qs - hm->uri.buf);
  }

  // Sanity check. Allow protocol/reason to be empty
  // Do this check after hm->method.len and hm->uri.len are finalised
  if (hm->method.len == 0 || hm->uri.len == 0) return -1;

  if (!mg_http_parse_headers(s, end, hm->headers,
                             sizeof(hm->headers) / sizeof(hm->headers[0])))
    return -1;  // error when parsing
  if ((cl = mg_http_get_header(hm, "Content-Length")) != NULL) {
    if (mg_to_size_t(*cl, &hm->body.len) == false) return -1;
    hm->message.len = (size_t) req_len + hm->body.len;
  }

  // mg_http_parse() is used to parse both HTTP requests and HTTP
  // responses. If HTTP response does not have Content-Length set, then
  // body is read until socket is closed, i.e. body.len is infinite (~0).
  //
  // For HTTP requests though, if Content-Length is not specified
  // set body length to 0.
  if (hm->body.len == (size_t) ~0 && !is_response) {
    hm->body.len = 0;
    hm->message.len = (size_t) req_len;
  }

  // The 204 (No content) responses also have 0 body length
  if (hm->body.len == (size_t) ~0 && is_response &&
      mg_strcasecmp(hm->uri, mg_str("204")) == 0) {
    hm->body.len = 0;
    hm->message.len = (size_t) req_len;
  }
  if (hm->message.len < (size_t) req_len) return -1;  // Overflow protection

  return req_len;
}

static void mg_http_vprintf_chunk(struct mg_connection *c, const char *fmt,
                                  va_list *ap) {
  size_t len = c->send.len;
  if (!mg_send(c, "        \r\n", 10)) mg_error(c, "OOM");
  mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, ap);
  if (c->send.len >= len + 10) {
    mg_snprintf((char *) c->send.buf + len, 9, "%08lx", c->send.len - len - 10);
    c->send.buf[len + 8] = '\r';
    if (c->send.len == len + 10) c->is_resp = 0;  // Last chunk, reset marker
  }
  if (!mg_send(c, "\r\n", 2)) mg_error(c, "OOM");
}

void mg_http_printf_chunk(struct mg_connection *c, const char *fmt, ...) {
  va_list ap;
  va_start(ap, fmt);
  mg_http_vprintf_chunk(c, fmt, &ap);
  va_end(ap);
}

void mg_http_write_chunk(struct mg_connection *c, const char *buf, size_t len) {
  mg_printf(c, "%lx\r\n", (unsigned long) len);
  if (!mg_send(c, buf, len) || !mg_send(c, "\r\n", 2)) mg_error(c, "OOM");
  if (len == 0) c->is_resp = 0;
}

// clang-format off
static const char *mg_http_status_code_str(int status_code) {
  switch (status_code) {
    case 100: return "Continue";
    case 101: return "Switching Protocols";
    case 102: return "Processing";
    case 200: return "OK";
    case 201: return "Created";
    case 202: return "Accepted";
    case 203: return "Non-authoritative Information";
    case 204: return "No Content";
    case 205: return "Reset Content";
    case 206: return "Partial Content";
    case 207: return "Multi-Status";
    case 208: return "Already Reported";
    case 226: return "IM Used";
    case 300: return "Multiple Choices";
    case 301: return "Moved Permanently";
    case 302: return "Found";
    case 303: return "See Other";
    case 304: return "Not Modified";
    case 305: return "Use Proxy";
    case 307: return "Temporary Redirect";
    case 308: return "Permanent Redirect";
    case 400: return "Bad Request";
    case 401: return "Unauthorized";
    case 402: return "Payment Required";
    case 403: return "Forbidden";
    case 404: return "Not Found";
    case 405: return "Method Not Allowed";
    case 406: return "Not Acceptable";
    case 407: return "Proxy Authentication Required";
    case 408: return "Request Timeout";
    case 409: return "Conflict";
    case 410: return "Gone";
    case 411: return "Length Required";
    case 412: return "Precondition Failed";
    case 413: return "Payload Too Large";
    case 414: return "Request-URI Too Long";
    case 415: return "Unsupported Media Type";
    case 416: return "Requested Range Not Satisfiable";
    case 417: return "Expectation Failed";
    case 418: return "I'm a teapot";
    case 421: return "Misdirected Request";
    case 422: return "Unprocessable Entity";
    case 423: return "Locked";
    case 424: return "Failed Dependency";
    case 426: return "Upgrade Required";
    case 428: return "Precondition Required";
    case 429: return "Too Many Requests";
    case 431: return "Request Header Fields Too Large";
    case 444: return "Connection Closed Without Response";
    case 451: return "Unavailable For Legal Reasons";
    case 499: return "Client Closed Request";
    case 500: return "Internal Server Error";
    case 501: return "Not Implemented";
    case 502: return "Bad Gateway";
    case 503: return "Service Unavailable";
    case 504: return "Gateway Timeout";
    case 505: return "HTTP Version Not Supported";
    case 506: return "Variant Also Negotiates";
    case 507: return "Insufficient Storage";
    case 508: return "Loop Detected";
    case 510: return "Not Extended";
    case 511: return "Network Authentication Required";
    case 599: return "Network Connect Timeout Error";
    default: return "";
  }
}
// clang-format on

void mg_http_reply(struct mg_connection *c, int code, const char *headers,
                   const char *fmt, ...) {
  va_list ap;
  size_t len;
  mg_printf(c, "HTTP/1.1 %d %s\r\n%sContent-Length:            \r\n\r\n", code,
            mg_http_status_code_str(code), headers == NULL ? "" : headers);
  len = c->send.len;
  va_start(ap, fmt);
  mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, &ap);
  va_end(ap);
  if (c->send.len > 16) {
    size_t n = mg_snprintf((char *) &c->send.buf[len - 15], 11, "%-10lu",
                           (unsigned long) (c->send.len - len));
    c->send.buf[len - 15 + n] = ' ';  // Change ending 0 to space
  }
  c->is_resp = 0;
}

static void http_cb(struct mg_connection *, int, void *);
static void restore_http_cb(struct mg_connection *c) {
  mg_fs_close((struct mg_fd *) c->pfn_data);
  c->pfn_data = NULL;
  c->pfn = http_cb;
  c->is_resp = 0;
}

char *mg_http_etag(char *buf, size_t len, size_t size, time_t mtime);
char *mg_http_etag(char *buf, size_t len, size_t size, time_t mtime) {
  mg_snprintf(buf, len, "\"%lld.%lld\"", (int64_t) mtime, (int64_t) size);
  return buf;
}

static void static_cb(struct mg_connection *c, int ev, void *ev_data) {
  if (ev == MG_EV_WRITE || ev == MG_EV_POLL) {
    struct mg_fd *fd = (struct mg_fd *) c->pfn_data;
    // Read to send IO buffer directly, avoid extra on-stack buffer
    size_t n, max = MG_IO_SIZE, space;
    size_t *cl = (size_t *) &c->data[(sizeof(c->data) - sizeof(size_t)) /
                                     sizeof(size_t) * sizeof(size_t)];
    if (c->send.size < max) mg_iobuf_resize(&c->send, max);
    if (c->send.len >= c->send.size) return;  // Rate limit
    if ((space = c->send.size - c->send.len) > *cl) space = *cl;
    n = fd->fs->rd(fd->fd, c->send.buf + c->send.len, space);
    c->send.len += n;
    *cl -= n;
    if (n == 0) restore_http_cb(c);
  } else if (ev == MG_EV_CLOSE) {
    restore_http_cb(c);
  }
  (void) ev_data;
}

// Known mime types. Keep it outside guess_content_type() function, since
// some environments don't like it defined there.
// clang-format off
#define MG_C_STR(a) { (char *) (a), sizeof(a) - 1 }
static struct mg_str s_known_types[] = {
    MG_C_STR("html"), MG_C_STR("text/html; charset=utf-8"),
    MG_C_STR("htm"), MG_C_STR("text/html; charset=utf-8"),
    MG_C_STR("css"), MG_C_STR("text/css; charset=utf-8"),
    MG_C_STR("js"), MG_C_STR("text/javascript; charset=utf-8"),
    MG_C_STR("mjs"), MG_C_STR("text/javascript; charset=utf-8"),
    MG_C_STR("gif"), MG_C_STR("image/gif"),
    MG_C_STR("png"), MG_C_STR("image/png"),
    MG_C_STR("jpg"), MG_C_STR("image/jpeg"),
    MG_C_STR("jpeg"), MG_C_STR("image/jpeg"),
    MG_C_STR("woff"), MG_C_STR("font/woff"),
    MG_C_STR("ttf"), MG_C_STR("font/ttf"),
    MG_C_STR("svg"), MG_C_STR("image/svg+xml"),
    MG_C_STR("txt"), MG_C_STR("text/plain; charset=utf-8"),
    MG_C_STR("avi"), MG_C_STR("video/x-msvideo"),
    MG_C_STR("csv"), MG_C_STR("text/csv"),
    MG_C_STR("doc"), MG_C_STR("application/msword"),
    MG_C_STR("exe"), MG_C_STR("application/octet-stream"),
    MG_C_STR("gz"), MG_C_STR("application/gzip"),
    MG_C_STR("ico"), MG_C_STR("image/x-icon"),
    MG_C_STR("json"), MG_C_STR("application/json"),
    MG_C_STR("mov"), MG_C_STR("video/quicktime"),
    MG_C_STR("mp3"), MG_C_STR("audio/mpeg"),
    MG_C_STR("mp4"), MG_C_STR("video/mp4"),
    MG_C_STR("mpeg"), MG_C_STR("video/mpeg"),
    MG_C_STR("pdf"), MG_C_STR("application/pdf"),
    MG_C_STR("shtml"), MG_C_STR("text/html; charset=utf-8"),
    MG_C_STR("tgz"), MG_C_STR("application/tar-gz"),
    MG_C_STR("wav"), MG_C_STR("audio/wav"),
    MG_C_STR("webp"), MG_C_STR("image/webp"),
    MG_C_STR("zip"), MG_C_STR("application/zip"),
    MG_C_STR("3gp"), MG_C_STR("video/3gpp"),
    {0, 0},
};
// clang-format on

static struct mg_str guess_content_type(struct mg_str path, const char *extra) {
  struct mg_str entry, k, v, s = mg_str(extra), asterisk = mg_str_n("*", 1);
  size_t i = 0;

  // Shrink path to its extension only
  while (i < path.len && path.buf[path.len - i - 1] != '.') i++;
  path.buf += path.len - i;
  path.len = i;

  // Process user-provided mime type overrides, if any
  while (mg_span(s, &entry, &s, ',')) {
    if (mg_span(entry, &k, &v, '=') &&
        (mg_strcmp(asterisk, k) == 0 || mg_strcmp(path, k) == 0))
      return v;
  }

  // Process built-in mime types
  for (i = 0; s_known_types[i].buf != NULL; i += 2) {
    if (mg_strcmp(path, s_known_types[i]) == 0) return s_known_types[i + 1];
  }

  return mg_str("text/plain; charset=utf-8");
}

static int getrange(struct mg_str *s, size_t *a, size_t *b) {
  size_t i, numparsed = 0;
  for (i = 0; i + 6 < s->len; i++) {
    struct mg_str k, v = mg_str_n(s->buf + i + 6, s->len - i - 6);
    if (memcmp(&s->buf[i], "bytes=", 6) != 0) continue;
    if (mg_span(v, &k, &v, '-')) {
      if (mg_to_size_t(k, a)) numparsed++;
      if (v.len > 0 && mg_to_size_t(v, b)) numparsed++;
    } else {
      if (mg_to_size_t(v, a)) numparsed++;
    }
    break;
  }
  return (int) numparsed;
}

void mg_http_serve_file(struct mg_connection *c, struct mg_http_message *hm,
                        const char *path,
                        const struct mg_http_serve_opts *opts) {
  char etag[64], tmp[MG_PATH_MAX];
  struct mg_fs *fs = opts->fs == NULL ? &mg_fs_posix : opts->fs;
  struct mg_fd *fd = NULL;
  size_t size = 0;
  time_t mtime = 0;
  struct mg_str *inm = NULL;
  struct mg_str mime = guess_content_type(mg_str(path), opts->mime_types);
  bool gzip = false;

  if (path != NULL) {
    // If a browser sends us "Accept-Encoding: gzip", try to open .gz first
    struct mg_str *ae = mg_http_get_header(hm, "Accept-Encoding");
    if (ae != NULL) {
      if (mg_match(*ae, mg_str("*gzip*"), NULL)) {
        mg_snprintf(tmp, sizeof(tmp), "%s.gz", path);
        fd = mg_fs_open(fs, tmp, MG_FS_READ);
        if (fd != NULL) gzip = true, path = tmp;
      }
    }
    // No luck opening .gz? Open what we've told to open
    if (fd == NULL) fd = mg_fs_open(fs, path, MG_FS_READ);
  }

  // Failed to open, and page404 is configured? Open it, then
  if (fd == NULL && opts->page404 != NULL) {
    fd = mg_fs_open(fs, opts->page404, MG_FS_READ);
    path = opts->page404;
    mime = guess_content_type(mg_str(path), opts->mime_types);
  }

  if (fd == NULL || fs->st(path, &size, &mtime) == 0) {
    mg_http_reply(c, 404, opts->extra_headers, "Not found\n");
    mg_fs_close(fd);
    // NOTE: mg_http_etag() call should go first!
  } else if (mg_http_etag(etag, sizeof(etag), size, mtime) != NULL &&
             (inm = mg_http_get_header(hm, "If-None-Match")) != NULL &&
             mg_strcasecmp(*inm, mg_str(etag)) == 0) {
    mg_fs_close(fd);
    mg_http_reply(c, 304, opts->extra_headers, "");
  } else {
    int n, status = 200;
    char range[100];
    size_t r1 = 0, r2 = 0, cl = size;

    // Handle Range header
    struct mg_str *rh = mg_http_get_header(hm, "Range");
    range[0] = '\0';
    if (rh != NULL && (n = getrange(rh, &r1, &r2)) > 0) {
      // If range is specified like "400-", set second limit to content len
      if (n == 1) r2 = cl - 1;
      if (r1 > r2 || r2 >= cl) {
        status = 416;
        cl = 0;
        mg_snprintf(range, sizeof(range), "Content-Range: bytes */%lld\r\n",
                    (int64_t) size);
      } else {
        status = 206;
        cl = r2 - r1 + 1;
        mg_snprintf(range, sizeof(range),
                    "Content-Range: bytes %llu-%llu/%llu\r\n", (uint64_t) r1,
                    (uint64_t) (r1 + cl - 1), (uint64_t) size);
        fs->sk(fd->fd, r1);
      }
    }
    mg_printf(c,
              "HTTP/1.1 %d %s\r\n"
              "Content-Type: %.*s\r\n"
              "Etag: %s\r\n"
              "Content-Length: %llu\r\n"
              "%s%s%s\r\n",
              status, mg_http_status_code_str(status), (int) mime.len, mime.buf,
              etag, (uint64_t) cl, gzip ? "Content-Encoding: gzip\r\n" : "",
              range, opts->extra_headers ? opts->extra_headers : "");
    if (mg_strcasecmp(hm->method, mg_str("HEAD")) == 0 || c->is_closing) {
      c->is_resp = 0;
      mg_fs_close(fd);
    } else { // start serving static content only if not closing, see #3354
      // Track to-be-sent content length at the end of c->data, aligned
      size_t *clp = (size_t *) &c->data[(sizeof(c->data) - sizeof(size_t)) /
                                        sizeof(size_t) * sizeof(size_t)];
      c->pfn = static_cb;
      c->pfn_data = fd;
      *clp = cl;
    }
  }
}

struct printdirentrydata {
  struct mg_connection *c;
  struct mg_http_message *hm;
  const struct mg_http_serve_opts *opts;
  const char *dir;
};

#if MG_ENABLE_DIRLIST
static void printdirentry(const char *name, void *userdata) {
  struct printdirentrydata *d = (struct printdirentrydata *) userdata;
  struct mg_fs *fs = d->opts->fs == NULL ? &mg_fs_posix : d->opts->fs;
  size_t size = 0;
  time_t t = 0;
  char path[MG_PATH_MAX], sz[40], mod[40];
  int flags, n = 0;

  // MG_DEBUG(("[%s] [%s]", d->dir, name));
  if (mg_snprintf(path, sizeof(path), "%s%c%s", d->dir, '/', name) >
      sizeof(path)) {
    MG_ERROR(("%s truncated", name));
  } else if ((flags = fs->st(path, &size, &t)) == 0) {
    MG_ERROR(("%lu stat(%s)", d->c->id, path));
  } else {
    const char *slash = flags & MG_FS_DIR ? "/" : "";
    if (flags & MG_FS_DIR) {
      mg_snprintf(sz, sizeof(sz), "%s", "[DIR]");
    } else {
      mg_snprintf(sz, sizeof(sz), "%lld", (uint64_t) size);
    }
#if defined(MG_HTTP_DIRLIST_TIME_FMT)
    {
      char time_str[40];
      struct tm *time_info = localtime(&t);
      strftime(time_str, sizeof time_str, "%Y/%m/%d %H:%M:%S", time_info);
      mg_snprintf(mod, sizeof(mod), "%s", time_str);
    }
#else
    mg_snprintf(mod, sizeof(mod), "%lu", (unsigned long) t);
#endif
    n = (int) mg_url_encode(name, strlen(name), path, sizeof(path));
    mg_printf(d->c,
              "  <tr><td><a href=\"%.*s%s\">%s%s</a></td>"
              "<td name=%lu>%s</td><td name=%lld>%s</td></tr>\n",
              n, path, slash, name, slash, (unsigned long) t, mod,
              flags & MG_FS_DIR ? (int64_t) -1 : (int64_t) size, sz);
  }
}

static void listdir(struct mg_connection *c, struct mg_http_message *hm,
                    const struct mg_http_serve_opts *opts, char *dir) {
  const char *sort_js_code =
      "<script>function srt(tb, sc, so, d) {"
      "var tr = Array.prototype.slice.call(tb.rows, 0),"
      "tr = tr.sort(function (a, b) { var c1 = a.cells[sc], c2 = b.cells[sc],"
      "n1 = c1.getAttribute('name'), n2 = c2.getAttribute('name'), "
      "t1 = a.cells[2].getAttribute('name'), "
      "t2 = b.cells[2].getAttribute('name'); "
      "return so * (t1 < 0 && t2 >= 0 ? -1 : t2 < 0 && t1 >= 0 ? 1 : "
      "n1 ? parseInt(n2) - parseInt(n1) : "
      "c1.textContent.trim().localeCompare(c2.textContent.trim())); });";
  const char *sort_js_code2 =
      "for (var i = 0; i < tr.length; i++) tb.appendChild(tr[i]); "
      "if (!d) window.location.hash = ('sc=' + sc + '&so=' + so); "
      "};"
      "window.onload = function() {"
      "var tb = document.getElementById('tb');"
      "var m = /sc=([012]).so=(1|-1)/.exec(window.location.hash) || [0, 2, 1];"
      "var sc = m[1], so = m[2]; document.onclick = function(ev) { "
      "var c = ev.target.rel; if (c) {if (c == sc) so *= -1; srt(tb, c, so); "
      "sc = c; ev.preventDefault();}};"
      "srt(tb, sc, so, true);"
      "}"
      "</script>";
  struct mg_fs *fs = opts->fs == NULL ? &mg_fs_posix : opts->fs;
  struct printdirentrydata d = {c, hm, opts, dir};
  char tmp[10], buf[MG_PATH_MAX];
  size_t off, n;
  int len = mg_url_decode(hm->uri.buf, hm->uri.len, buf, sizeof(buf), 0);
  struct mg_str uri = len > 0 ? mg_str_n(buf, (size_t) len) : hm->uri;

  mg_printf(c,
            "HTTP/1.1 200 OK\r\n"
            "Content-Type: text/html; charset=utf-8\r\n"
            "%s"
            "Content-Length:         \r\n\r\n",
            opts->extra_headers == NULL ? "" : opts->extra_headers);
  off = c->send.len;  // Start of body
  mg_printf(c,
            "<!DOCTYPE html><html><head><title>Index of %.*s</title>%s%s"
            "<style>th,td {text-align: left; padding-right: 1em; "
            "font-family: monospace; }</style></head>"
            "<body><h1>Index of %.*s</h1><table cellpadding=\"0\"><thead>"
            "<tr><th><a href=\"#\" rel=\"0\">Name</a></th><th>"
            "<a href=\"#\" rel=\"1\">Modified</a></th>"
            "<th><a href=\"#\" rel=\"2\">Size</a></th></tr>"
            "<tr><td colspan=\"3\"><hr></td></tr>"
            "</thead>"
            "<tbody id=\"tb\">\n",
            (int) uri.len, uri.buf, sort_js_code, sort_js_code2, (int) uri.len,
            uri.buf);
  mg_printf(c, "%s",
            "  <tr><td><a href=\"..\">..</a></td>"
            "<td name=-1></td><td name=-1>[DIR]</td></tr>\n");

  fs->ls(dir, printdirentry, &d);
  mg_printf(c,
            "</tbody><tfoot><tr><td colspan=\"3\"><hr></td></tr></tfoot>"
            "</table><address>Mongoose v.%s</address></body></html>\n",
            MG_VERSION);
  n = mg_snprintf(tmp, sizeof(tmp), "%lu", (unsigned long) (c->send.len - off));
  if (n > sizeof(tmp)) n = 0;
  memcpy(c->send.buf + off - 12, tmp, n);  // Set content length
  c->is_resp = 0;                          // Mark response end
}
#endif

// Resolve requested file into `path` and return its fs->st() result
static int uri_to_path2(struct mg_connection *c, struct mg_http_message *hm,
                        struct mg_fs *fs, struct mg_str url, struct mg_str dir,
                        char *path, size_t path_size) {
  int flags, tmp;
  // Append URI to the root_dir, and sanitize it
  size_t n = mg_snprintf(path, path_size, "%.*s", (int) dir.len, dir.buf);
  if (n + 2 >= path_size) {
    mg_http_reply(c, 400, "", "Exceeded path size");
    return -1;
  }
  path[path_size - 1] = '\0';
  // Terminate root dir with slash
  if (n > 0 && path[n - 1] != '/') path[n++] = '/', path[n] = '\0';
  if (url.len < hm->uri.len) {
    mg_url_decode(hm->uri.buf + url.len, hm->uri.len - url.len, path + n,
                  path_size - n, 0);
  }
  path[path_size - 1] = '\0';  // Double-check
  if (!mg_path_is_sane(mg_str_n(path, path_size))) {
    mg_http_reply(c, 400, "", "Invalid path");
    return -1;
  }
  n = strlen(path);
  while (n > 1 && path[n - 1] == '/') path[--n] = 0;  // Trim trailing slashes
  flags = mg_strcmp(hm->uri, mg_str("/")) == 0 ? MG_FS_DIR
                                               : fs->st(path, NULL, NULL);
  MG_VERBOSE(("%lu %.*s -> %s %d", c->id, (int) hm->uri.len, hm->uri.buf, path,
              flags));
  if (flags == 0) {
    // Do nothing - let's caller decide
  } else if ((flags & MG_FS_DIR) && hm->uri.len > 0 &&
             hm->uri.buf[hm->uri.len - 1] != '/') {
    mg_printf(c,
              "HTTP/1.1 301 Moved\r\n"
              "Location: %.*s/\r\n"
              "Content-Length: 0\r\n"
              "\r\n",
              (int) hm->uri.len, hm->uri.buf);
    c->is_resp = 0;
    flags = -1;
  } else if (flags & MG_FS_DIR) {
    if (((mg_snprintf(path + n, path_size - n, "/" MG_HTTP_INDEX) > 0 &&
          (tmp = fs->st(path, NULL, NULL)) != 0) ||
         (mg_snprintf(path + n, path_size - n, "/index.shtml") > 0 &&
          (tmp = fs->st(path, NULL, NULL)) != 0))) {
      flags = tmp;
    } else if ((mg_snprintf(path + n, path_size - n, "/" MG_HTTP_INDEX ".gz") >
                    0 &&
                (tmp = fs->st(path, NULL, NULL)) !=
                    0)) {  // check for gzipped index
      flags = tmp;
      path[n + 1 + strlen(MG_HTTP_INDEX)] =
          '\0';  // Remove appended .gz in index file name
    } else {
      path[n] = '\0';  // Remove appended index file name
    }
  }
  return flags;
}

static int uri_to_path(struct mg_connection *c, struct mg_http_message *hm,
                       const struct mg_http_serve_opts *opts, char *path,
                       size_t path_size) {
  struct mg_fs *fs = opts->fs == NULL ? &mg_fs_posix : opts->fs;
  struct mg_str k, v, part, s = mg_str(opts->root_dir), u = {NULL, 0}, p = u;
  while (mg_span(s, &part, &s, ',')) {
    if (!mg_span(part, &k, &v, '=')) k = part, v = mg_str_n(NULL, 0);
    if (v.len == 0) v = k, k = mg_str("/"), u = k, p = v;
    if (hm->uri.len < k.len) continue;
    if (mg_strcmp(k, mg_str_n(hm->uri.buf, k.len)) != 0) continue;
    u = k, p = v;
  }
  return uri_to_path2(c, hm, fs, u, p, path, path_size);
}

void mg_http_serve_dir(struct mg_connection *c, struct mg_http_message *hm,
                       const struct mg_http_serve_opts *opts) {
  char path[MG_PATH_MAX];
  const char *sp = opts->ssi_pattern;
  int flags = uri_to_path(c, hm, opts, path, sizeof(path));
  if (flags < 0) {
    // Do nothing: the response has already been sent by uri_to_path()
  } else if (flags & MG_FS_DIR) {
#if MG_ENABLE_DIRLIST
    listdir(c, hm, opts, path);
#else
    mg_http_reply(c, 403, "", "Forbidden\n");
#endif
  } else if (flags && sp != NULL && mg_match(mg_str(path), mg_str(sp), NULL)) {
    mg_http_serve_ssi(c, opts->root_dir, path);
  } else {
    mg_http_serve_file(c, hm, path, opts);
  }
}

static bool mg_is_url_safe(int c) {
  return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') ||
         (c >= 'A' && c <= 'Z') || c == '.' || c == '_' || c == '-' || c == '~';
}

size_t mg_url_encode(const char *s, size_t sl, char *buf, size_t len) {
  size_t i, n = 0;
  for (i = 0; i < sl; i++) {
    int c = *(unsigned char *) &s[i];
    if (n + 4 >= len) return 0;
    if (mg_is_url_safe(c)) {
      buf[n++] = s[i];
    } else {
      mg_snprintf(&buf[n], 4, "%%%M", mg_print_hex, 1, &s[i]);
      n += 3;
    }
  }
  if (len > 0 && n < len - 1) buf[n] = '\0';  // Null-terminate the destination
  if (len > 0) buf[len - 1] = '\0';           // Always.
  return n;
}

void mg_http_creds(struct mg_http_message *hm, char *user, size_t userlen,
                   char *pass, size_t passlen) {
  struct mg_str *v = mg_http_get_header(hm, "Authorization");
  user[0] = pass[0] = '\0';
  if (v != NULL && v->len > 6 && memcmp(v->buf, "Basic ", 6) == 0) {
    char buf[256];
    size_t n = mg_base64_decode(v->buf + 6, v->len - 6, buf, sizeof(buf));
    const char *p = (const char *) memchr(buf, ':', n > 0 ? n : 0);
    if (p != NULL) {
      mg_snprintf(user, userlen, "%.*s", p - buf, buf);
      mg_snprintf(pass, passlen, "%.*s", n - (size_t) (p - buf) - 1, p + 1);
    }
  } else if (v != NULL && v->len > 7 && memcmp(v->buf, "Bearer ", 7) == 0) {
    mg_snprintf(pass, passlen, "%.*s", (int) v->len - 7, v->buf + 7);
  } else if ((v = mg_http_get_header(hm, "Cookie")) != NULL) {
    struct mg_str t = mg_http_get_header_var(*v, mg_str_n("access_token", 12));
    if (t.len > 0) mg_snprintf(pass, passlen, "%.*s", (int) t.len, t.buf);
  } else {
    mg_http_get_var(&hm->query, "access_token", pass, passlen);
  }
}

static struct mg_str stripquotes(struct mg_str s) {
  return s.len > 1 && s.buf[0] == '"' && s.buf[s.len - 1] == '"'
             ? mg_str_n(s.buf + 1, s.len - 2)
             : s;
}

struct mg_str mg_http_get_header_var(struct mg_str s, struct mg_str v) {
  size_t i;
  for (i = 0; v.len > 0 && i + v.len + 2 < s.len; i++) {
    if (s.buf[i + v.len] == '=' && memcmp(&s.buf[i], v.buf, v.len) == 0) {
      const char *p = &s.buf[i + v.len + 1], *b = p, *x = &s.buf[s.len];
      int q = p < x && *p == '"' ? 1 : 0;
      while (p < x &&
             (q ? p == b || *p != '"' : *p != ';' && *p != ' ' && *p != ','))
        p++;
      // MG_INFO(("[%.*s] [%.*s] [%.*s]", (int) s.len, s.buf, (int) v.len,
      // v.buf, (int) (p - b), b));
      return stripquotes(mg_str_n(b, (size_t) (p - b + q)));
    }
  }
  return mg_str_n(NULL, 0);
}

long mg_http_upload(struct mg_connection *c, struct mg_http_message *hm,
                    struct mg_fs *fs, const char *dir, size_t max_size) {
  char buf[20] = "0", file[MG_PATH_MAX], path[MG_PATH_MAX];
  long res = 0, offset;
  mg_http_get_var(&hm->query, "offset", buf, sizeof(buf));
  mg_http_get_var(&hm->query, "file", file, sizeof(file));
  offset = strtol(buf, NULL, 0);
  mg_snprintf(path, sizeof(path), "%s%c%s", dir, MG_DIRSEP, file);
  if (hm->body.len == 0) {
    mg_http_reply(c, 200, "", "%ld", res);  // Nothing to write
  } else if (file[0] == '\0') {
    mg_http_reply(c, 400, "", "file required");
    res = -1;
  } else if (mg_path_is_sane(mg_str(file)) == false) {
    mg_http_reply(c, 400, "", "%s: invalid file", file);
    res = -2;
  } else if (offset < 0) {
    mg_http_reply(c, 400, "", "offset required");
    res = -3;
  } else if ((size_t) offset + hm->body.len > max_size) {
    mg_http_reply(c, 400, "", "%s: over max size of %lu", path,
                  (unsigned long) max_size);
    res = -4;
  } else {
    struct mg_fd *fd;
    size_t current_size = 0;
    MG_DEBUG(("%s -> %lu bytes @ %ld", path, hm->body.len, offset));
    if (offset == 0) fs->rm(path);  // If offset if 0, truncate file
    fs->st(path, &current_size, NULL);
    if (offset > 0 && current_size != (size_t) offset) {
      mg_http_reply(c, 400, "", "%s: offset mismatch", path);
      res = -5;
    } else if ((fd = mg_fs_open(fs, path, MG_FS_WRITE)) == NULL) {
      mg_http_reply(c, 400, "", "open(%s)", path);
      res = -6;
    } else {
      res = offset + (long) fs->wr(fd->fd, hm->body.buf, hm->body.len);
      mg_fs_close(fd);
      mg_http_reply(c, 200, "", "%ld", res);
    }
  }
  return res;
}

int mg_http_status(const struct mg_http_message *hm) {
  return atoi(hm->uri.buf);
}

static bool is_hex_digit(int c) {
  return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') ||
         (c >= 'A' && c <= 'F');
}

static int skip_chunk(const char *buf, int len, int *pl, int *dl) {
  int i = 0, n = 0;
  if (len < 3) return 0;
  while (i < len && is_hex_digit(buf[i])) i++;
  if (i == 0) return -1;                     // Error, no length specified
  if (i > (int) sizeof(int) * 2) return -1;  // Chunk length is too big
  if (len < i + 1 || buf[i] != '\r' || buf[i + 1] != '\n') return -1;  // Error
  if (mg_str_to_num(mg_str_n(buf, (size_t) i), 16, &n, sizeof(int)) == false)
    return -1;                    // Decode chunk length, overflow
  if (n < 0) return -1;           // Error. TODO(): some checks now redundant
  if (n > len - i - 4) return 0;  // Chunk not yet fully buffered
  if (buf[i + n + 2] != '\r' || buf[i + n + 3] != '\n') return -1;  // Error
  *pl = i + 2, *dl = n;
  return i + 2 + n + 2;
}

static void http_cb(struct mg_connection *c, int ev, void *ev_data) {
  if (ev == MG_EV_READ || ev == MG_EV_CLOSE ||
      (ev == MG_EV_POLL && c->is_accepted && !c->is_draining &&
       c->recv.len > 0)) {  // see #2796
    struct mg_http_message hm;
    size_t ofs = 0;  // Parsing offset
    while (c->is_resp == 0 && ofs < c->recv.len) {
      const char *buf = (char *) c->recv.buf + ofs;
      int n = mg_http_parse(buf, c->recv.len - ofs, &hm);
      struct mg_str *te;  // Transfer - encoding header
      bool is_chunked = false;
      size_t old_len = c->recv.len;
      if (n < 0) {
        // We don't use mg_error() here, to avoid closing pipelined requests
        // prematurely, see #2592
        MG_ERROR(("HTTP parse, %lu bytes", c->recv.len));
        c->is_draining = 1;
        mg_hexdump(buf, c->recv.len - ofs > 16 ? 16 : c->recv.len - ofs);
        c->recv.len = 0;
        return;
      }
      if (n == 0) break;                 // Request is not buffered yet
      mg_call(c, MG_EV_HTTP_HDRS, &hm);  // Got all HTTP headers
      if (c->recv.len != old_len) {
        // User manipulated received data. Wash our hands
        MG_DEBUG(("%lu detaching HTTP handler", c->id));
        c->pfn = NULL;
        return;
      }
      if (ev == MG_EV_CLOSE) {  // If client did not set Content-Length
        hm.message.len = c->recv.len - ofs;  // and closes now, deliver MSG
        hm.body.len = hm.message.len - (size_t) (hm.body.buf - hm.message.buf);
      }
      if ((te = mg_http_get_header(&hm, "Transfer-Encoding")) != NULL) {
        if (mg_strcasecmp(*te, mg_str("chunked")) == 0) {
          is_chunked = true;
        } else {
          mg_error(c, "Invalid Transfer-Encoding");  // See #2460
          return;
        }
      } else if (mg_http_get_header(&hm, "Content-length") == NULL) {
        // #2593: HTTP packets must contain either Transfer-Encoding or
        // Content-length
        bool is_response = mg_ncasecmp(hm.method.buf, "HTTP/", 5) == 0;
        bool require_content_len = false;
        if (!is_response && (mg_strcasecmp(hm.method, mg_str("POST")) == 0 ||
                             mg_strcasecmp(hm.method, mg_str("PUT")) == 0)) {
          // POST and PUT should include an entity body. Therefore, they should
          // contain a Content-length header (unless the body length is 0, in
          // which case it can be omitted). Other requests can also contain a
          // body, but their content has no defined semantics (RFC 7231)
          if (hm.body.len != 0) require_content_len = true;
          ofs += (size_t) n;  // this request has been processed
        } else if (is_response) {
          // HTTP spec 7.2 Entity body: All other responses must include a body
          // or Content-Length header field defined with a value of 0.
          int status = mg_http_status(&hm);
          require_content_len = status >= 200 && status != 204 && status != 304;
        }
        if (require_content_len) {
          if (!c->is_client) mg_http_reply(c, 411, "", "");
          MG_ERROR(("Content length missing from %s",
                    is_response ? "response" : "request"));
        }
      }

      if (is_chunked) {
        // For chunked data, strip off prefixes and suffixes from chunks
        // and relocate them right after the headers, then report a message
        char *s = (char *) c->recv.buf + ofs + n;
        int o = 0, pl, dl, cl, len = (int) (c->recv.len - ofs - (size_t) n);

        // Find zero-length chunk (the end of the body)
        while ((cl = skip_chunk(s + o, len - o, &pl, &dl)) > 0 && dl) o += cl;
        if (cl == 0) break;  // No zero-len chunk, buffer more data
        if (cl < 0) {
          mg_error(c, "Invalid chunk");
          break;
        }

        // Zero chunk found. Second pass: strip + relocate
        o = 0, hm.body.len = 0, hm.message.len = (size_t) n;
        while ((cl = skip_chunk(s + o, len - o, &pl, &dl)) > 0) {
          memmove(s + hm.body.len, s + o + pl, (size_t) dl);
          o += cl, hm.body.len += (size_t) dl, hm.message.len += (size_t) dl;
          if (dl == 0) break;
        }
        ofs += (size_t) (n + o);
      } else {  // Normal, non-chunked data
        size_t len = c->recv.len - ofs - (size_t) n;
        if (hm.body.len > len) break;  // Buffer more data
        ofs += (size_t) n + hm.body.len;
      }

      if (c->is_accepted) c->is_resp = 1;  // Start generating response
      mg_call(c, MG_EV_HTTP_MSG, &hm);     // User handler can clear is_resp
      if (c->is_accepted && !c->is_resp) {
        struct mg_str *cc = mg_http_get_header(&hm, "Connection");
        if (cc != NULL && mg_strcasecmp(*cc, mg_str("close")) == 0) {
          c->is_draining = 1;  // honor "Connection: close"
          break;
        }
      }
    }
    if (ofs > 0) mg_iobuf_del(&c->recv, 0, ofs);  // Delete processed data
  }
  (void) ev_data;
}

struct mg_connection *mg_http_connect(struct mg_mgr *mgr, const char *url,
                                      mg_event_handler_t fn, void *fn_data) {
  return mg_connect_svc(mgr, url, fn, fn_data, http_cb, NULL);
}

struct mg_connection *mg_http_listen(struct mg_mgr *mgr, const char *url,
                                     mg_event_handler_t fn, void *fn_data) {
  struct mg_connection *c = mg_listen(mgr, url, fn, fn_data);
  if (c != NULL) c->pfn = http_cb;
  return c;
}

#ifdef MG_ENABLE_LINES
#line 1 "src/iobuf.c"
#endif





static size_t roundup(size_t size, size_t align) {
  return align == 0 ? size : (size + align - 1) / align * align;
}

bool mg_iobuf_resize(struct mg_iobuf *io, size_t new_size) {
  bool ok = true;
  new_size = roundup(new_size, io->align);
  if (new_size == 0) {
    mg_bzero(io->buf, io->size);
    mg_free(io->buf);
    io->buf = NULL;
    io->len = io->size = 0;
  } else if (new_size != io->size) {
    // NOTE(lsm): do not use realloc here. Use mg_calloc/mg_free only
    void *p = mg_calloc(1, new_size);
    if (p != NULL) {
      size_t len = new_size < io->len ? new_size : io->len;
      if (len > 0 && io->buf != NULL) memmove(p, io->buf, len);
      mg_bzero(io->buf, io->size);
      mg_free(io->buf);
      io->buf = (unsigned char *) p;
      io->size = new_size;
      io->len = len;
    } else {
      ok = false;
      MG_ERROR(("%lld->%lld", (ui
Download .txt
gitextract_74yoxmoz/

├── .clang-format
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── config.yml
│   │   └── issue.md
│   └── workflows/
│       ├── cifuzz.yml
│       ├── codeql.yml
│       ├── fuzz.yml
│       ├── nightly.yml
│       ├── nightly_tests.yml
│       ├── on_demand.yml
│       ├── quicktest.yml
│       ├── test.yml
│       └── zephyr.yml
├── LICENSE
├── README.md
├── mongoose.c
├── mongoose.h
├── src/
│   ├── arch.h
│   ├── arch_armcgt.h
│   ├── arch_armgcc.h
│   ├── arch_cube.h
│   ├── arch_esp32.h
│   ├── arch_esp8266.h
│   ├── arch_freertos.h
│   ├── arch_picosdk.h
│   ├── arch_rtthread.h
│   ├── arch_rtx.h
│   ├── arch_threadx.h
│   ├── arch_tirtos.h
│   ├── arch_unix.h
│   ├── arch_win32.h
│   ├── arch_zephyr.h
│   ├── base64.c
│   ├── base64.h
│   ├── config.h
│   ├── dns.c
│   ├── dns.h
│   ├── drivers/
│   │   ├── cmsis.c
│   │   ├── cmsis.h
│   │   ├── cyw.c
│   │   ├── cyw.h
│   │   ├── imxrt.c
│   │   ├── imxrt.h
│   │   ├── nxp_wifi.c
│   │   ├── nxp_wifi.h
│   │   ├── phy.c
│   │   ├── phy.h
│   │   ├── pico-w.c
│   │   ├── pico-w.h
│   │   ├── ppp.c
│   │   ├── ppp.h
│   │   ├── ra.c
│   │   ├── ra.h
│   │   ├── rw612.c
│   │   ├── rw612.h
│   │   ├── same54.c
│   │   ├── same54.h
│   │   ├── sdio.c
│   │   ├── sdio.h
│   │   ├── st67w6.c
│   │   ├── st67w6.h
│   │   ├── stm32f.c
│   │   ├── stm32f.h
│   │   ├── stm32h.c
│   │   ├── stm32h.h
│   │   ├── tm4c.c
│   │   ├── tm4c.h
│   │   ├── tms570.c
│   │   ├── tms570.h
│   │   ├── w5100.c
│   │   ├── w5500.c
│   │   ├── xmc.c
│   │   ├── xmc.h
│   │   ├── xmc7.c
│   │   └── xmc7.h
│   ├── event.c
│   ├── event.h
│   ├── flash.c
│   ├── flash.h
│   ├── fmt.c
│   ├── fmt.h
│   ├── fs.c
│   ├── fs.h
│   ├── fs_fat.c
│   ├── fs_packed.c
│   ├── fs_posix.c
│   ├── http.c
│   ├── http.h
│   ├── iobuf.c
│   ├── iobuf.h
│   ├── json.c
│   ├── json.h
│   ├── l2.c
│   ├── l2.h
│   ├── l2_eth.c
│   ├── l2_ppp.c
│   ├── license.h
│   ├── log.c
│   ├── log.h
│   ├── md5.c
│   ├── md5.h
│   ├── mqtt.c
│   ├── mqtt.h
│   ├── net.c
│   ├── net.h
│   ├── net_builtin.c
│   ├── net_builtin.h
│   ├── net_ft.h
│   ├── net_lwip.h
│   ├── net_rl.h
│   ├── ota.h
│   ├── ota_ch32v307.c
│   ├── ota_dummy.c
│   ├── ota_esp32.c
│   ├── ota_imxrt.c
│   ├── ota_mcxn.c
│   ├── ota_picosdk.c
│   ├── ota_rw612.c
│   ├── ota_stm32f.c
│   ├── ota_stm32h5.c
│   ├── ota_stm32h7.c
│   ├── printf.c
│   ├── printf.h
│   ├── profile.h
│   ├── queue.c
│   ├── queue.h
│   ├── rpc.c
│   ├── rpc.h
│   ├── sha1.c
│   ├── sha1.h
│   ├── sha256.c
│   ├── sha256.h
│   ├── sntp.c
│   ├── sntp.h
│   ├── sock.c
│   ├── ssi.c
│   ├── ssi.h
│   ├── str.c
│   ├── str.h
│   ├── timer.c
│   ├── timer.h
│   ├── tls.h
│   ├── tls_aes128.c
│   ├── tls_aes128.h
│   ├── tls_builtin.c
│   ├── tls_chacha20.c
│   ├── tls_chacha20.h
│   ├── tls_dummy.c
│   ├── tls_mbed.c
│   ├── tls_mbed.h
│   ├── tls_openssl.c
│   ├── tls_openssl.h
│   ├── tls_rsa.c
│   ├── tls_rsa.h
│   ├── tls_uecc.c
│   ├── tls_uecc.h
│   ├── tls_x25519.c
│   ├── tls_x25519.h
│   ├── url.c
│   ├── url.h
│   ├── util.c
│   ├── util.h
│   ├── version.h
│   ├── wifi.h
│   ├── wifi_dummy.c
│   ├── ws.c
│   └── ws.h
├── test/
│   ├── Makefile
│   ├── arduino/
│   │   └── Makefile
│   ├── certs/
│   │   ├── ca.crt
│   │   ├── ca.key
│   │   ├── ca.srl
│   │   ├── client.crt
│   │   ├── client.csr
│   │   ├── client.key
│   │   ├── generate.sh
│   │   ├── server.crt
│   │   ├── server.csr
│   │   └── server.key
│   ├── cgt+make/
│   │   └── Makefile
│   ├── configs/
│   │   └── mongoose_config_full.h
│   ├── cube/
│   │   └── Makefile
│   ├── data/
│   │   ├── ..ddot/
│   │   │   └── index.html
│   │   ├── 404.html
│   │   ├── a.txt
│   │   ├── ca.pem
│   │   ├── dredir/
│   │   │   └── index.html
│   │   ├── e8.crt
│   │   ├── empty.js
│   │   ├── gzip.txt
│   │   ├── index.html
│   │   ├── range.txt
│   │   ├── secret/
│   │   │   └── secret.txt
│   │   ├── ss_ca.pem
│   │   ├── ss_client.pem
│   │   ├── ss_server.pem
│   │   ├── ssi/
│   │   │   ├── f1.txt
│   │   │   ├── index.shtml
│   │   │   ├── nested.shtml
│   │   │   └── recurse.shtml
│   │   ├── ws.hex
│   │   └── київ.txt
│   ├── dhcpd.conf
│   ├── driver_mock.c
│   ├── esp-idf/
│   │   └── Makefile
│   ├── fuzz.c
│   ├── fuzz_tls.c
│   ├── ga_docker_daemon.json
│   ├── gcc+make/
│   │   └── Makefile
│   ├── health.awk
│   ├── health.sh
│   ├── keil/
│   │   ├── Clean
│   │   ├── Makefile
│   │   ├── uniclean.bat
│   │   └── unitest.bat
│   ├── match_changed_files.sh
│   ├── mip_curl.sh
│   ├── mip_port_test.c
│   ├── mip_tap_test.c
│   ├── mip_test.c
│   ├── mip_x_test.c
│   ├── mongoose_custom.c
│   ├── mosquitto.conf
│   ├── mosquitto.conf.macos
│   ├── pack.c
│   ├── pack.js
│   ├── pico-sdk/
│   │   └── Makefile
│   ├── port_tap_bridge.c
│   ├── setup_ga_docker_filesystem.sh
│   ├── setup_ga_network.sh
│   ├── setup_mqtt_server.sh
│   ├── tls_multirec/
│   │   ├── Makefile
│   │   ├── main.c
│   │   ├── mongoose.h
│   │   ├── patched_mongoose.c
│   │   └── tls_multirec.diff
│   ├── unit_test.c
│   ├── wizard/
│   │   ├── Makefile
│   │   └── test.sh
│   ├── xpresso/
│   │   └── Makefile
│   └── zephyr/
│       └── Makefile
└── tutorials/
    ├── README.md
    ├── core/
    │   ├── README.md
    │   ├── embedded-filesystem/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   ├── packed_fs.c
    │   │   └── web_root/
    │   │       ├── index.html
    │   │       ├── main.js
    │   │       └── style.css
    │   ├── memory/
    │   │   └── o1heap/
    │   │       ├── Makefile
    │   │       └── main.c
    │   ├── multi-threaded/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── multi-threaded-12m/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   └── timers/
    │       ├── Makefile
    │       ├── README.md
    │       ├── main.c
    │       └── web_root/
    │           └── index.html
    ├── http/
    │   ├── README.md
    │   ├── device-dashboard/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── certs/
    │   │   │   ├── server_cert.pem
    │   │   │   └── server_key.pem
    │   │   ├── esp32/
    │   │   │   ├── CMakeLists.txt
    │   │   │   ├── Makefile
    │   │   │   ├── README.md
    │   │   │   ├── main/
    │   │   │   │   ├── CMakeLists.txt
    │   │   │   │   ├── main.c
    │   │   │   │   ├── mongoose_config.h
    │   │   │   │   └── wifi.c
    │   │   │   ├── partitions.csv
    │   │   │   └── sdkconfig.defaults
    │   │   ├── main.c
    │   │   ├── mbedtls_config.h
    │   │   ├── microchip/
    │   │   │   └── same54-xpro/
    │   │   │       ├── Makefile
    │   │   │       ├── hal.h
    │   │   │       ├── link.ld
    │   │   │       ├── main.c
    │   │   │       ├── startup.c
    │   │   │       └── syscalls.c
    │   │   ├── net.c
    │   │   ├── net.h
    │   │   ├── pack.js
    │   │   ├── packed_fs.c
    │   │   ├── tailwind.config.js
    │   │   └── web_root/
    │   │       ├── bundle.js
    │   │       ├── components.js
    │   │       ├── index.html
    │   │       └── main.js
    │   ├── file-transfer/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── client.c
    │   │   ├── server.c
    │   │   ├── upload/
    │   │   │   └── README.md
    │   │   └── web_root/
    │   │       └── index.html
    │   ├── file-upload-html-form/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── web_root/
    │   │       └── index.html
    │   ├── file-upload-multiple-posts/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── web_root/
    │   │       ├── app.js
    │   │       └── index.html
    │   ├── file-upload-single-post/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── web_root/
    │   │       └── index.html
    │   ├── http-client/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── esp8266/
    │   │   │   └── http-client-server/
    │   │   │       ├── Makefile
    │   │   │       ├── README.md
    │   │   │       └── src/
    │   │   │           ├── Makefile
    │   │   │           ├── main/
    │   │   │           │   ├── component.mk
    │   │   │           │   ├── main.c
    │   │   │           │   ├── mongoose_config.h
    │   │   │           │   └── wifi.c
    │   │   │           └── sdkconfig
    │   │   ├── main.c
    │   │   └── packed_fs.c
    │   ├── http-proxy-client/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── http-restful-server/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── server.pem
    │   ├── http-reverse-proxy/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── http-server/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── arduino/
    │   │   │   ├── esp32-http/
    │   │   │   │   ├── esp32-http.ino
    │   │   │   │   └── mongoose_config.h
    │   │   │   ├── teensy41-http/
    │   │   │   │   ├── mongoose_config.h
    │   │   │   │   └── teensy41-http.ino
    │   │   │   └── w5500-http/
    │   │   │       ├── mongoose_config.h
    │   │   │       └── w5500-http.ino
    │   │   ├── ca.pem
    │   │   ├── crt.pem
    │   │   ├── key.pem
    │   │   └── main.c
    │   ├── http-streaming-client/
    │   │   ├── Makefile
    │   │   └── main.c
    │   ├── huge-response/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── web_root/
    │   │       └── index.html
    │   ├── redirect-to-https/
    │   │   ├── Makefile
    │   │   └── main.c
    │   ├── singleton-client/
    │   │   ├── Makefile
    │   │   └── main.c
    │   ├── uart-bridge/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── esp32/
    │   │   │   ├── CMakeLists.txt
    │   │   │   ├── Makefile
    │   │   │   ├── README.md
    │   │   │   ├── main/
    │   │   │   │   ├── CMakeLists.txt
    │   │   │   │   ├── cli.c
    │   │   │   │   ├── main.c
    │   │   │   │   ├── main.h
    │   │   │   │   ├── mongoose_config.h
    │   │   │   │   ├── uart.c
    │   │   │   │   └── wifi.c
    │   │   │   ├── make
    │   │   │   ├── partitions.csv
    │   │   │   └── sdkconfig.defaults
    │   │   ├── main.c
    │   │   ├── net.c
    │   │   ├── packed_fs.c
    │   │   └── web_root/
    │   │       ├── index.html
    │   │       ├── main.js
    │   │       └── style.css
    │   ├── video-stream/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── web_root/
    │   │       └── index.html
    │   └── wifi-router-dashboard/
    │       ├── Makefile
    │       ├── README.md
    │       ├── main.c
    │       ├── net.c
    │       ├── net.h
    │       ├── packed_fs.c
    │       ├── tailwind.config.js
    │       └── web_root/
    │           └── main.js
    ├── infineon/
    │   ├── xmc47_relax-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── xmc72_evk-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   └── xmc_plt2go_4400-make-baremetal-builtin/
    │       ├── Makefile
    │       └── README.md
    ├── micropython/
    │   ├── Makefile
    │   ├── README.md
    │   ├── esp32/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── mongoose/
    │   │       ├── main.c
    │   │       └── mongoose_config.h
    │   ├── main.py
    │   └── mongoose/
    │       ├── main.c
    │       ├── micropython.cmake
    │       ├── micropython.mk
    │       └── module.c
    ├── mqtt/
    │   ├── README.md
    │   ├── mqtt-client/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── arduino/
    │   │   │   ├── esp32-mqtt/
    │   │   │   │   ├── esp32-mqtt.ino
    │   │   │   │   └── mongoose_config.h
    │   │   │   ├── nano-w5500-mqtt/
    │   │   │   │   ├── mongoose_config.h
    │   │   │   │   └── w5500-mqtt.ino
    │   │   │   ├── sim800-mqtt/
    │   │   │   │   ├── mongoose_config.h
    │   │   │   │   └── sim800-mqtt.ino
    │   │   │   └── w5500-mqtt/
    │   │   │       ├── mongoose_config.h
    │   │   │       └── w5500-mqtt.ino
    │   │   ├── main.c
    │   │   └── microchip/
    │   │       └── same54-xpro/
    │   │           ├── Makefile
    │   │           ├── hal.h
    │   │           ├── link.ld
    │   │           ├── main.c
    │   │           ├── startup.c
    │   │           └── syscalls.c
    │   ├── mqtt-client-aws-iot/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── mqtt-dashboard/
    │   │   ├── Makefile
    │   │   ├── dashboard/
    │   │   │   ├── Makefile
    │   │   │   ├── bundle.js
    │   │   │   ├── index.html
    │   │   │   ├── main.js
    │   │   │   └── tailwind.config.js
    │   │   └── device/
    │   │       ├── Makefile
    │   │       ├── README.md
    │   │       ├── hal.c
    │   │       ├── hal.h
    │   │       ├── main.c
    │   │       ├── net.c
    │   │       └── net.h
    │   ├── mqtt-over-ws-client/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── mqtt-server/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   └── ota-over-mqtt/
    │       ├── Makefile
    │       └── main.c
    ├── nxp/
    │   ├── frdm-mcxn947-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── frdm-mcxn947-make-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── frdm-mcxn947-xpresso-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── frdm-mcxn947-xpresso-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── frdm-rw612-xpresso-freertos-builtin-wifi/
    │   │   ├── .cproject
    │   │   ├── .default_mex
    │   │   ├── .project
    │   │   ├── .settings/
    │   │   │   ├── language.settings.xml
    │   │   │   └── org.eclipse.core.resources.prefs
    │   │   ├── CMSIS/
    │   │   │   ├── cmsis_compiler.h
    │   │   │   ├── cmsis_gcc.h
    │   │   │   ├── cmsis_version.h
    │   │   │   ├── core_cm33.h
    │   │   │   ├── mpu_armv8.h
    │   │   │   └── tz_context.h
    │   │   ├── Debug/
    │   │   │   ├── frdm-rw612-xpresso-freertos-builtin_Debug.ld
    │   │   │   ├── frdm-rw612-xpresso-freertos-builtin_Debug_library.ld
    │   │   │   └── frdm-rw612-xpresso-freertos-builtin_Debug_memory.ld
    │   │   ├── README.md
    │   │   ├── board/
    │   │   │   ├── board.c
    │   │   │   ├── board.h
    │   │   │   ├── clock_config.c
    │   │   │   ├── clock_config.h
    │   │   │   ├── pin_mux.c
    │   │   │   └── pin_mux.h
    │   │   ├── component/
    │   │   │   ├── conn_fwloader/
    │   │   │   │   ├── fsl_loader.c
    │   │   │   │   ├── fsl_loader_utils.c
    │   │   │   │   ├── include/
    │   │   │   │   │   ├── api_tree_root.h
    │   │   │   │   │   ├── fsl_loader.h
    │   │   │   │   │   ├── fsl_loader_utils.h
    │   │   │   │   │   ├── fusemap.h
    │   │   │   │   │   ├── life_cycle.h
    │   │   │   │   │   └── nboot_rom_api_table.h
    │   │   │   │   ├── life_cycle.c
    │   │   │   │   ├── nboot_hal.c
    │   │   │   │   └── readme.txt
    │   │   │   ├── els_pkc/
    │   │   │   │   └── src/
    │   │   │   │       ├── compiler/
    │   │   │   │       │   └── mcuxClToolchain.h
    │   │   │   │       ├── comps/
    │   │   │   │       │   ├── mcuxClBuffer/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   ├── mcuxClBuffer_Internal.h
    │   │   │   │       │   │   │   │   └── mcuxClBuffer_Internal_Pointer.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer_Cfg.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer_Constants.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer_Impl.h
    │   │   │   │       │   │   │   └── mcuxClBuffer_Pointer.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       └── mcuxClBuffer.c
    │   │   │   │       │   ├── mcuxClCore/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxClCore_Examples.h
    │   │   │   │       │   │       ├── mcuxClCore_FunctionIdentifiers.h
    │   │   │   │       │   │       ├── mcuxClCore_Macros.h
    │   │   │   │       │   │       ├── mcuxClCore_Platform.h
    │   │   │   │       │   │       └── mcuxClCore_Toolchain.h
    │   │   │   │       │   ├── mcuxClEls/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   ├── mcuxClEls_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClEls_Internal_Common.h
    │   │   │   │       │   │   │   │   ├── mcuxClEls_Internal_mapping.h
    │   │   │   │       │   │   │   │   └── mcuxClEls_SfrAccess.h
    │   │   │   │       │   │   │   ├── mcuxClEls.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Aead.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Cipher.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Cmac.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Common.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Crc.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Ecc.h
    │   │   │   │       │   │   │   ├── mcuxClEls_GlitchDetector.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Hash.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Hmac.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Kdf.h
    │   │   │   │       │   │   │   ├── mcuxClEls_KeyManagement.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Rng.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Types.h
    │   │   │   │       │   │   │   └── mcuxClEls_mapping.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       ├── mcuxClEls_Common.c
    │   │   │   │       │   │       └── mcuxClEls_GlitchDetector.c
    │   │   │   │       │   ├── mcuxClMemory/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_ClearSecure_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_Clear_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CompareDPASecure_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CompareSecure_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_Compare_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CopySecurePow2_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CopySecure_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CopySecure_Reversed_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CopyWords_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_Copy_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_Copy_Reversed_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_SetSecure_Internal.h
    │   │   │   │       │   │   │   │   └── mcuxClMemory_Set_Internal.h
    │   │   │   │       │   │   │   ├── mcuxClMemory.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Clear.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Constants.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Copy.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Copy_Reversed.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Endianness.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Set.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Types.h
    │   │   │   │       │   │   │   └── mcuxClMemory_Xor.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       └── mcuxClMemory.c
    │   │   │   │       │   ├── mcuxCsslCPreProcessor/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxCsslAnalysis.h
    │   │   │   │       │   │       └── mcuxCsslCPreProcessor.h
    │   │   │   │       │   ├── mcuxCsslDataIntegrity/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxCsslDataIntegrity.h
    │   │   │   │       │   │       ├── mcuxCsslDataIntegrity_Cfg.h
    │   │   │   │       │   │       ├── mcuxCsslDataIntegrity_Impl.h
    │   │   │   │       │   │       └── mcuxCsslDataIntegrity_None.h
    │   │   │   │       │   ├── mcuxCsslFlowProtection/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_Cfg.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_FunctionIdentifiers.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_Impl.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_SecureCounter_Common.h
    │   │   │   │       │   │       └── mcuxCsslFlowProtection_SecureCounter_Local.h
    │   │   │   │       │   ├── mcuxCsslMemory/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   ├── mcuxCsslMemory_Internal_Compare_asm.h
    │   │   │   │       │   │   │   │   ├── mcuxCsslMemory_Internal_Copy_asm.h
    │   │   │   │       │   │   │   │   └── mcuxCsslMemory_Internal_SecureCompare.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Clear.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Compare.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Constants.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Copy.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Set.h
    │   │   │   │       │   │   │   └── mcuxCsslMemory_Types.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       ├── mcuxCsslMemory_Clear.c
    │   │   │   │       │   │       ├── mcuxCsslMemory_Compare.c
    │   │   │   │       │   │       ├── mcuxCsslMemory_Copy.c
    │   │   │   │       │   │       ├── mcuxCsslMemory_Internal_SecureCompare_Stub.c
    │   │   │   │       │   │       └── mcuxCsslMemory_Set.c
    │   │   │   │       │   ├── mcuxCsslParamIntegrity/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   └── mcuxCsslParamIntegrity.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       └── mcuxCsslParamIntegrity.c
    │   │   │   │       │   └── mcuxCsslSecureCounter/
    │   │   │   │       │       └── inc/
    │   │   │   │       │           ├── mcuxCsslSecureCounter.h
    │   │   │   │       │           ├── mcuxCsslSecureCounter_Cfg.h
    │   │   │   │       │           ├── mcuxCsslSecureCounter_Impl.h
    │   │   │   │       │           ├── mcuxCsslSecureCounter_None.h
    │   │   │   │       │           └── mcuxCsslSecureCounter_SW_Local.h
    │   │   │   │       └── platforms/
    │   │   │   │           └── rw61x/
    │   │   │   │               ├── inc/
    │   │   │   │               │   ├── ip_css_constants.h
    │   │   │   │               │   ├── ip_css_design_configuration.h
    │   │   │   │               │   └── ip_platform.h
    │   │   │   │               ├── mcuxClConfig.h
    │   │   │   │               ├── platform_specific_headers.h
    │   │   │   │               └── readme.txt
    │   │   │   ├── imu_adapter/
    │   │   │   │   ├── fsl_adapter_imu.c
    │   │   │   │   ├── fsl_adapter_imu.h
    │   │   │   │   └── fsl_adapter_imu_common.h
    │   │   │   ├── lists/
    │   │   │   │   ├── fsl_component_generic_list.c
    │   │   │   │   └── fsl_component_generic_list.h
    │   │   │   ├── osa/
    │   │   │   │   ├── fsl_os_abstraction.h
    │   │   │   │   ├── fsl_os_abstraction_config.h
    │   │   │   │   ├── fsl_os_abstraction_free_rtos.c
    │   │   │   │   └── fsl_os_abstraction_free_rtos.h
    │   │   │   ├── serial_manager/
    │   │   │   │   ├── fsl_component_serial_manager.c
    │   │   │   │   ├── fsl_component_serial_manager.h
    │   │   │   │   ├── fsl_component_serial_port_internal.h
    │   │   │   │   ├── fsl_component_serial_port_uart.c
    │   │   │   │   └── fsl_component_serial_port_uart.h
    │   │   │   ├── uart/
    │   │   │   │   ├── fsl_adapter_uart.h
    │   │   │   │   └── fsl_adapter_usart.c
    │   │   │   └── wifi_bt_module/
    │   │   │       └── AzureWave/
    │   │   │           └── tx_pwr_limits/
    │   │   │               └── wlan_txpwrlimit_cfg_WW_rw610.h
    │   │   ├── device/
    │   │   │   ├── RW612.h
    │   │   │   ├── RW612_features.h
    │   │   │   ├── fsl_device_registers.h
    │   │   │   ├── system_RW612.c
    │   │   │   └── system_RW612.h
    │   │   ├── drivers/
    │   │   │   ├── freertos/
    │   │   │   │   ├── fsl_usart_freertos.c
    │   │   │   │   └── fsl_usart_freertos.h
    │   │   │   ├── fsl_cache.c
    │   │   │   ├── fsl_cache.h
    │   │   │   ├── fsl_clock.c
    │   │   │   ├── fsl_clock.h
    │   │   │   ├── fsl_common.c
    │   │   │   ├── fsl_common.h
    │   │   │   ├── fsl_common_arm.c
    │   │   │   ├── fsl_common_arm.h
    │   │   │   ├── fsl_flexcomm.c
    │   │   │   ├── fsl_flexcomm.h
    │   │   │   ├── fsl_flexspi.c
    │   │   │   ├── fsl_flexspi.h
    │   │   │   ├── fsl_gdma.c
    │   │   │   ├── fsl_gdma.h
    │   │   │   ├── fsl_gpio.c
    │   │   │   ├── fsl_gpio.h
    │   │   │   ├── fsl_imu.c
    │   │   │   ├── fsl_imu.h
    │   │   │   ├── fsl_io_mux.h
    │   │   │   ├── fsl_ocotp.c
    │   │   │   ├── fsl_ocotp.h
    │   │   │   ├── fsl_power.c
    │   │   │   ├── fsl_power.h
    │   │   │   ├── fsl_reset.c
    │   │   │   ├── fsl_reset.h
    │   │   │   ├── fsl_usart.c
    │   │   │   └── fsl_usart.h
    │   │   ├── flash/
    │   │   │   └── mflash/
    │   │   │       ├── frdmrw612/
    │   │   │       │   ├── mflash_drv.c
    │   │   │       │   └── mflash_drv.h
    │   │   │       ├── mflash_common.h
    │   │   │       ├── mflash_file.c
    │   │   │       ├── mflash_file.h
    │   │   │       └── readme.txt
    │   │   ├── flash_config/
    │   │   │   ├── flash_config.c
    │   │   │   └── flash_config.h
    │   │   ├── frdm-rw612-xpresso-freertos-builtin JLink Debug.launch
    │   │   ├── frdm-rw612-xpresso-freertos-builtin.mex
    │   │   ├── freertos/
    │   │   │   └── freertos-kernel/
    │   │   │       ├── croutine.c
    │   │   │       ├── event_groups.c
    │   │   │       ├── include/
    │   │   │       │   ├── FreeRTOS.h
    │   │   │       │   ├── StackMacros.h
    │   │   │       │   ├── atomic.h
    │   │   │       │   ├── croutine.h
    │   │   │       │   ├── deprecated_definitions.h
    │   │   │       │   ├── event_groups.h
    │   │   │       │   ├── freertos_tasks_c_additions.h
    │   │   │       │   ├── list.h
    │   │   │       │   ├── message_buffer.h
    │   │   │       │   ├── mpu_prototypes.h
    │   │   │       │   ├── mpu_syscall_numbers.h
    │   │   │       │   ├── mpu_wrappers.h
    │   │   │       │   ├── newlib-freertos.h
    │   │   │       │   ├── picolibc-freertos.h
    │   │   │       │   ├── portable.h
    │   │   │       │   ├── projdefs.h
    │   │   │       │   ├── queue.h
    │   │   │       │   ├── semphr.h
    │   │   │       │   ├── stack_macros.h
    │   │   │       │   ├── stdint.readme
    │   │   │       │   ├── stream_buffer.h
    │   │   │       │   ├── task.h
    │   │   │       │   └── timers.h
    │   │   │       ├── list.c
    │   │   │       ├── portable/
    │   │   │       │   ├── GCC/
    │   │   │       │   │   └── ARM_CM33_NTZ/
    │   │   │       │   │       └── non_secure/
    │   │   │       │   │           ├── mpu_wrappers_v2_asm.c
    │   │   │       │   │           ├── port.c
    │   │   │       │   │           ├── portasm.c
    │   │   │       │   │           ├── portasm.h
    │   │   │       │   │           ├── portmacro.h
    │   │   │       │   │           └── portmacrocommon.h
    │   │   │       │   ├── MemMang/
    │   │   │       │   │   ├── ReadMe.url
    │   │   │       │   │   ├── heap_3.c
    │   │   │       │   │   └── heap_4.c
    │   │   │       │   └── readme.txt
    │   │   │       ├── queue.c
    │   │   │       ├── stream_buffer.c
    │   │   │       ├── tasks.c
    │   │   │       └── timers.c
    │   │   ├── linkscripts/
    │   │   │   ├── main_data.ldt
    │   │   │   ├── main_rodata.ldt
    │   │   │   ├── main_text.ldt
    │   │   │   └── noinit_noload_section.ldt
    │   │   ├── source/
    │   │   │   ├── FreeRTOSConfig.h
    │   │   │   ├── app_config.h
    │   │   │   ├── main.c
    │   │   │   ├── mongoose_config.h
    │   │   │   ├── semihost_hardfault.c
    │   │   │   └── wifi_config.h
    │   │   ├── startup/
    │   │   │   └── startup_rw612.c
    │   │   ├── utilities/
    │   │   │   ├── fsl_assert.c
    │   │   │   ├── fsl_assert.h
    │   │   │   ├── fsl_debug_console.c
    │   │   │   ├── fsl_debug_console.h
    │   │   │   ├── fsl_debug_console_conf.h
    │   │   │   ├── fsl_memcpy.S
    │   │   │   ├── fsl_str.c
    │   │   │   └── fsl_str.h
    │   │   └── wifi/
    │   │       ├── CMakeLists.txt
    │   │       ├── ChangeLogKSDK.txt
    │   │       ├── certs/
    │   │       │   ├── ca-cert.h
    │   │       │   ├── client-cert.h
    │   │       │   ├── client-key.h
    │   │       │   ├── dh-param.h
    │   │       │   ├── server-cert.h
    │   │       │   └── server-key.h
    │   │       ├── incl/
    │   │       │   ├── dhcp-server.h
    │   │       │   ├── nxp_wifi.h
    │   │       │   ├── port/
    │   │       │   │   ├── net/
    │   │       │   │   │   └── wm_net.h
    │   │       │   │   └── osa/
    │   │       │   │       ├── mem_pool.h
    │   │       │   │       ├── mem_pool_config.h
    │   │       │   │       ├── osa.h
    │   │       │   │       ├── slist.h
    │   │       │   │       └── stack_simple.h
    │   │       │   ├── wifi_cal_data_ext.h
    │   │       │   ├── wifi_config_default.h
    │   │       │   ├── wifidriver/
    │   │       │   │   ├── wifi-decl.h
    │   │       │   │   ├── wifi.h
    │   │       │   │   ├── wifi_events.h
    │   │       │   │   └── wifi_nxp.h
    │   │       │   ├── wlcmgr/
    │   │       │   │   ├── wlan.h
    │   │       │   │   └── wlan_11d.h
    │   │       │   ├── wm_utils.h
    │   │       │   ├── wmerrno.h
    │   │       │   ├── wmlog.h
    │   │       │   ├── wmstats.h
    │   │       │   └── wmtypes.h
    │   │       ├── port/
    │   │       │   ├── net/
    │   │       │   │   ├── net.c
    │   │       │   │   ├── netif_decl.h
    │   │       │   │   └── netif_mongoose.c
    │   │       │   └── osa/
    │   │       │       ├── mem_pool.c
    │   │       │       ├── mem_pool_config.c
    │   │       │       ├── osa.c
    │   │       │       ├── osa_freertos.c
    │   │       │       ├── osa_freertos.h
    │   │       │       ├── slist.c
    │   │       │       └── stack_simple.c
    │   │       ├── wifi_bt_firmware/
    │   │       │   └── wlan_bt_fw.h
    │   │       ├── wifidriver/
    │   │       │   ├── incl/
    │   │       │   │   ├── mlan.h
    │   │       │   │   ├── mlan_11ac.h
    │   │       │   │   ├── mlan_11ax.h
    │   │       │   │   ├── mlan_11h.h
    │   │       │   │   ├── mlan_11k.h
    │   │       │   │   ├── mlan_11n.h
    │   │       │   │   ├── mlan_11n_aggr.h
    │   │       │   │   ├── mlan_11n_rxreorder.h
    │   │       │   │   ├── mlan_11v.h
    │   │       │   │   ├── mlan_action.h
    │   │       │   │   ├── mlan_api.h
    │   │       │   │   ├── mlan_decl.h
    │   │       │   │   ├── mlan_fw.h
    │   │       │   │   ├── mlan_ieee.h
    │   │       │   │   ├── mlan_init.h
    │   │       │   │   ├── mlan_ioctl.h
    │   │       │   │   ├── mlan_join.h
    │   │       │   │   ├── mlan_main.h
    │   │       │   │   ├── mlan_mbo.h
    │   │       │   │   ├── mlan_meas.h
    │   │       │   │   ├── mlan_remap_mem_operations.h
    │   │       │   │   ├── mlan_uap.h
    │   │       │   │   ├── mlan_util.h
    │   │       │   │   ├── mlan_wmm.h
    │   │       │   │   └── type_decls.h
    │   │       │   ├── mlan_11ac.c
    │   │       │   ├── mlan_11ax.c
    │   │       │   ├── mlan_11d.c
    │   │       │   ├── mlan_11h.c
    │   │       │   ├── mlan_11k.c
    │   │       │   ├── mlan_11n.c
    │   │       │   ├── mlan_11n_aggr.c
    │   │       │   ├── mlan_11n_rxreorder.c
    │   │       │   ├── mlan_11v.c
    │   │       │   ├── mlan_action.c
    │   │       │   ├── mlan_api.c
    │   │       │   ├── mlan_cfp.c
    │   │       │   ├── mlan_cmdevt.c
    │   │       │   ├── mlan_glue.c
    │   │       │   ├── mlan_init.c
    │   │       │   ├── mlan_join.c
    │   │       │   ├── mlan_mbo.c
    │   │       │   ├── mlan_misc.c
    │   │       │   ├── mlan_scan.c
    │   │       │   ├── mlan_shim.c
    │   │       │   ├── mlan_sta_cmd.c
    │   │       │   ├── mlan_sta_cmdresp.c
    │   │       │   ├── mlan_sta_event.c
    │   │       │   ├── mlan_sta_ioctl.c
    │   │       │   ├── mlan_sta_rx.c
    │   │       │   ├── mlan_txrx.c
    │   │       │   ├── mlan_uap_cmdevent.c
    │   │       │   ├── mlan_uap_ioctl.c
    │   │       │   ├── mlan_wmm.c
    │   │       │   ├── wifi-debug.c
    │   │       │   ├── wifi-debug.h
    │   │       │   ├── wifi-imu.c
    │   │       │   ├── wifi-imu.h
    │   │       │   ├── wifi-internal.h
    │   │       │   ├── wifi-mem.c
    │   │       │   ├── wifi-uap.c
    │   │       │   ├── wifi-wps.c
    │   │       │   ├── wifi.c
    │   │       │   ├── wifi_common.h
    │   │       │   ├── wifi_pwrmgr.c
    │   │       │   └── wpa_supp_if/
    │   │       │       ├── incl/
    │   │       │       │   ├── rtos_wpa_supp_if.h
    │   │       │       │   └── wifi_nxp_internal.h
    │   │       │       ├── rtos_wpa_supp_if.c
    │   │       │       ├── wifi_nxp.c
    │   │       │       └── wifi_nxp_internal.c
    │   │       └── wlcmgr/
    │   │           ├── wlan.c
    │   │           └── wlan_txpwrlimit_cfg.c
    │   ├── frdm-rw612-xpresso-freertos-lwip/
    │   │   ├── .cproject
    │   │   ├── .project
    │   │   ├── .settings/
    │   │   │   ├── language.settings.xml
    │   │   │   └── org.eclipse.core.resources.prefs
    │   │   ├── CMSIS/
    │   │   │   ├── cmsis_compiler.h
    │   │   │   ├── cmsis_gcc.h
    │   │   │   ├── cmsis_version.h
    │   │   │   ├── core_cm33.h
    │   │   │   ├── m-profile/
    │   │   │   │   ├── armv8m_mpu.h
    │   │   │   │   └── cmsis_gcc_m.h
    │   │   │   └── tz_context.h
    │   │   ├── board/
    │   │   │   ├── board.c
    │   │   │   ├── board.h
    │   │   │   ├── clock_config.c
    │   │   │   └── clock_config.h
    │   │   ├── component/
    │   │   │   ├── els_pkc/
    │   │   │   │   ├── includes/
    │   │   │   │   │   ├── mcuxClEls_GlitchDetector.h
    │   │   │   │   │   └── platform/
    │   │   │   │   │       └── rw61x/
    │   │   │   │   │           ├── mcuxClAeadModes_MemoryConsumption.h
    │   │   │   │   │           ├── mcuxClCipherModes_MemoryConsumption.h
    │   │   │   │   │           ├── mcuxClEcc_MemoryConsumption.h
    │   │   │   │   │           ├── mcuxClHashModes_MemoryConsumption.h
    │   │   │   │   │           ├── mcuxClHash_MemoryConsumption.h
    │   │   │   │   │           ├── mcuxClHmac_MemoryConsumption.h
    │   │   │   │   │           ├── mcuxClKey_MemoryConsumption.h
    │   │   │   │   │           ├── mcuxClMacModes_MemoryConsumption.h
    │   │   │   │   │           ├── mcuxClRandomModes_MemoryConsumption.h
    │   │   │   │   │           ├── mcuxClRsa_MemoryConsumption.h
    │   │   │   │   │           └── mcuxClSession_MemoryConsumption.h
    │   │   │   │   └── src/
    │   │   │   │       ├── compiler/
    │   │   │   │       │   └── mcuxClToolchain.h
    │   │   │   │       ├── comps/
    │   │   │   │       │   ├── mcuxClBuffer/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   ├── mcuxClBuffer_Internal.h
    │   │   │   │       │   │   │   │   └── mcuxClBuffer_Internal_Pointer.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer_Cfg.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer_Constants.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer_Impl.h
    │   │   │   │       │   │   │   └── mcuxClBuffer_Pointer.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       └── mcuxClBuffer.c
    │   │   │   │       │   ├── mcuxClCore/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxClCore_Examples.h
    │   │   │   │       │   │       ├── mcuxClCore_FunctionIdentifiers.h
    │   │   │   │       │   │       ├── mcuxClCore_Macros.h
    │   │   │   │       │   │       ├── mcuxClCore_Platform.h
    │   │   │   │       │   │       └── mcuxClCore_Toolchain.h
    │   │   │   │       │   ├── mcuxClEls/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   ├── mcuxClEls_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClEls_Internal_Common.h
    │   │   │   │       │   │   │   │   ├── mcuxClEls_Internal_mapping.h
    │   │   │   │       │   │   │   │   └── mcuxClEls_SfrAccess.h
    │   │   │   │       │   │   │   ├── mcuxClEls.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Aead.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Cipher.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Cmac.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Common.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Crc.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Ecc.h
    │   │   │   │       │   │   │   ├── mcuxClEls_GlitchDetector.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Hash.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Hmac.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Kdf.h
    │   │   │   │       │   │   │   ├── mcuxClEls_KeyManagement.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Rng.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Types.h
    │   │   │   │       │   │   │   └── mcuxClEls_mapping.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       ├── mcuxClEls_Common.c
    │   │   │   │       │   │       └── mcuxClEls_GlitchDetector.c
    │   │   │   │       │   ├── mcuxClMemory/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   └── mcuxClMemory_Internal.h
    │   │   │   │       │   │   │   ├── mcuxClMemory.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Clear.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Constants.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Copy.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Copy_Reversed.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Endianness.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Set.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Types.h
    │   │   │   │       │   │   │   └── mcuxClMemory_Xor.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       └── mcuxClMemory.c
    │   │   │   │       │   ├── mcuxCsslCPreProcessor/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxCsslAnalysis.h
    │   │   │   │       │   │       └── mcuxCsslCPreProcessor.h
    │   │   │   │       │   ├── mcuxCsslDataIntegrity/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxCsslDataIntegrity.h
    │   │   │   │       │   │       ├── mcuxCsslDataIntegrity_Cfg.h
    │   │   │   │       │   │       ├── mcuxCsslDataIntegrity_Impl.h
    │   │   │   │       │   │       └── mcuxCsslDataIntegrity_None.h
    │   │   │   │       │   ├── mcuxCsslFlowProtection/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_Cfg.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_FunctionIdentifiers.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_Impl.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_SecureCounter_Common.h
    │   │   │   │       │   │       └── mcuxCsslFlowProtection_SecureCounter_Local.h
    │   │   │   │       │   ├── mcuxCsslMemory/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   ├── mcuxCsslMemory_Internal_Compare_asm.h
    │   │   │   │       │   │   │   │   └── mcuxCsslMemory_Internal_Copy_asm.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Clear.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Compare.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Constants.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Copy.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Set.h
    │   │   │   │       │   │   │   └── mcuxCsslMemory_Types.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       ├── mcuxCsslMemory_Clear.c
    │   │   │   │       │   │       ├── mcuxCsslMemory_Compare.c
    │   │   │   │       │   │       ├── mcuxCsslMemory_Copy.c
    │   │   │   │       │   │       └── mcuxCsslMemory_Set.c
    │   │   │   │       │   ├── mcuxCsslParamIntegrity/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   └── mcuxCsslParamIntegrity.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       └── mcuxCsslParamIntegrity32.c
    │   │   │   │       │   └── mcuxCsslSecureCounter/
    │   │   │   │       │       └── inc/
    │   │   │   │       │           ├── mcuxCsslSecureCounter.h
    │   │   │   │       │           ├── mcuxCsslSecureCounter_Cfg.h
    │   │   │   │       │           ├── mcuxCsslSecureCounter_Impl.h
    │   │   │   │       │           ├── mcuxCsslSecureCounter_None.h
    │   │   │   │       │           └── mcuxCsslSecureCounter_SW_Local.h
    │   │   │   │       └── platforms/
    │   │   │   │           └── rw61x/
    │   │   │   │               ├── inc/
    │   │   │   │               │   ├── ip_css_constants.h
    │   │   │   │               │   ├── ip_css_design_configuration.h
    │   │   │   │               │   └── ip_platform.h
    │   │   │   │               ├── mcuxClConfig.h
    │   │   │   │               └── platform_specific_headers.h
    │   │   │   ├── imu_adapter/
    │   │   │   │   ├── fsl_adapter_imu.c
    │   │   │   │   ├── fsl_adapter_imu.h
    │   │   │   │   └── fsl_adapter_imu_common.h
    │   │   │   ├── lists/
    │   │   │   │   ├── fsl_component_generic_list.c
    │   │   │   │   └── fsl_component_generic_list.h
    │   │   │   ├── osa/
    │   │   │   │   ├── fsl_os_abstraction.h
    │   │   │   │   ├── fsl_os_abstraction_free_rtos.c
    │   │   │   │   └── fsl_os_abstraction_free_rtos.h
    │   │   │   ├── serial_manager/
    │   │   │   │   ├── fsl_component_serial_manager.c
    │   │   │   │   ├── fsl_component_serial_manager.h
    │   │   │   │   ├── fsl_component_serial_port_internal.h
    │   │   │   │   ├── fsl_component_serial_port_uart.c
    │   │   │   │   └── fsl_component_serial_port_uart.h
    │   │   │   ├── uart/
    │   │   │   │   ├── fsl_adapter_uart.h
    │   │   │   │   └── fsl_adapter_usart.c
    │   │   │   └── wifi_bt_module/
    │   │   │       ├── AzureWave/
    │   │   │       │   └── tx_pwr_limits/
    │   │   │       │       ├── wlan_txpwrlimit_cfg_WW.h
    │   │   │       │       └── wlan_txpwrlimit_cfg_WW_rw610.h
    │   │   │       ├── Murata/
    │   │   │       │   └── tx_pwr_limits/
    │   │   │       │       ├── wlan_txpwrlimit_cfg_murata_1XK_WW.h
    │   │   │       │       ├── wlan_txpwrlimit_cfg_murata_1ZM_WW.h
    │   │   │       │       ├── wlan_txpwrlimit_cfg_murata_2DS_WW.h
    │   │   │       │       ├── wlan_txpwrlimit_cfg_murata_2EL_WW.h
    │   │   │       │       └── wlan_txpwrlimit_cfg_murata_NH_FCC.h
    │   │   │       ├── incl/
    │   │   │       │   └── wifi_bt_module_config.h
    │   │   │       └── u-blox/
    │   │   │           └── tx_pwr_limits/
    │   │   │               └── wlan_txpwrlimit_cfg_jody_w5_WW.h
    │   │   ├── device/
    │   │   │   ├── RW612.h
    │   │   │   ├── RW612_COMMON.h
    │   │   │   ├── RW612_features.h
    │   │   │   ├── fsl_device_registers.h
    │   │   │   ├── periph/
    │   │   │   │   ├── PERI_ACOMP.h
    │   │   │   │   ├── PERI_ADC.h
    │   │   │   │   ├── PERI_AHB_SECURE_CTRL.h
    │   │   │   │   ├── PERI_AON_SOC_CIU.h
    │   │   │   │   ├── PERI_APU.h
    │   │   │   │   ├── PERI_BG.h
    │   │   │   │   ├── PERI_BLEAPU.h
    │   │   │   │   ├── PERI_BUCK11.h
    │   │   │   │   ├── PERI_BUCK18.h
    │   │   │   │   ├── PERI_CACHE64_CTRL.h
    │   │   │   │   ├── PERI_CACHE64_POLSEL.h
    │   │   │   │   ├── PERI_CAU.h
    │   │   │   │   ├── PERI_CDOG.h
    │   │   │   │   ├── PERI_CIU1.h
    │   │   │   │   ├── PERI_CIU2.h
    │   │   │   │   ├── PERI_CLKCTL0.h
    │   │   │   │   ├── PERI_CLKCTL1.h
    │   │   │   │   ├── PERI_CRC.h
    │   │   │   │   ├── PERI_CTIMER.h
    │   │   │   │   ├── PERI_DAC.h
    │   │   │   │   ├── PERI_DBGMAILBOX.h
    │   │   │   │   ├── PERI_DMA.h
    │   │   │   │   ├── PERI_DMIC.h
    │   │   │   │   ├── PERI_ELS.h
    │   │   │   │   ├── PERI_ENET.h
    │   │   │   │   ├── PERI_FLEXCOMM.h
    │   │   │   │   ├── PERI_FLEXSPI.h
    │   │   │   │   ├── PERI_FREQME.h
    │   │   │   │   ├── PERI_GDMA.h
    │   │   │   │   ├── PERI_GPIO.h
    │   │   │   │   ├── PERI_I2C.h
    │   │   │   │   ├── PERI_I2S.h
    │   │   │   │   ├── PERI_INPUTMUX.h
    │   │   │   │   ├── PERI_ITRC.h
    │   │   │   │   ├── PERI_LCDIC.h
    │   │   │   │   ├── PERI_MCI_IO_MUX.h
    │   │   │   │   ├── PERI_MRT.h
    │   │   │   │   ├── PERI_OCOTP.h
    │   │   │   │   ├── PERI_OSTIMER.h
    │   │   │   │   ├── PERI_PINT.h
    │   │   │   │   ├── PERI_PKC.h
    │   │   │   │   ├── PERI_PMU.h
    │   │   │   │   ├── PERI_POWERQUAD.h
    │   │   │   │   ├── PERI_PUF.h
    │   │   │   │   ├── PERI_RF_SYSCON.h
    │   │   │   │   ├── PERI_ROMCP.h
    │   │   │   │   ├── PERI_RSTCTL0.h
    │   │   │   │   ├── PERI_RSTCTL1.h
    │   │   │   │   ├── PERI_RTC.h
    │   │   │   │   ├── PERI_SCT.h
    │   │   │   │   ├── PERI_SDU_FBR_CARD.h
    │   │   │   │   ├── PERI_SDU_FN0_CARD.h
    │   │   │   │   ├── PERI_SDU_FN_CARD.h
    │   │   │   │   ├── PERI_SENSOR_CTRL.h
    │   │   │   │   ├── PERI_SOCCIU.h
    │   │   │   │   ├── PERI_SOC_OTP_CTRL.h
    │   │   │   │   ├── PERI_SPI.h
    │   │   │   │   ├── PERI_SYSCTL0.h
    │   │   │   │   ├── PERI_SYSCTL1.h
    │   │   │   │   ├── PERI_SYSCTL2.h
    │   │   │   │   ├── PERI_SYSPLL_T3.h
    │   │   │   │   ├── PERI_SYSPLL_TCPU.h
    │   │   │   │   ├── PERI_SYSPLL_TDDR.h
    │   │   │   │   ├── PERI_TRNG.h
    │   │   │   │   ├── PERI_USART.h
    │   │   │   │   ├── PERI_USBC.h
    │   │   │   │   ├── PERI_USIM.h
    │   │   │   │   ├── PERI_UTICK.h
    │   │   │   │   ├── PERI_WLAPU.h
    │   │   │   │   └── PERI_WWDT.h
    │   │   │   ├── system_RW612.c
    │   │   │   └── system_RW612.h
    │   │   ├── doc/
    │   │   │   ├── readme.md
    │   │   │   └── wifi_examples_readme.md
    │   │   ├── drivers/
    │   │   │   ├── freertos/
    │   │   │   │   ├── fsl_usart_freertos.c
    │   │   │   │   └── fsl_usart_freertos.h
    │   │   │   ├── fsl_cache.c
    │   │   │   ├── fsl_cache.h
    │   │   │   ├── fsl_clock.c
    │   │   │   ├── fsl_clock.h
    │   │   │   ├── fsl_common.c
    │   │   │   ├── fsl_common.h
    │   │   │   ├── fsl_common_arm.c
    │   │   │   ├── fsl_common_arm.h
    │   │   │   ├── fsl_flexcomm.c
    │   │   │   ├── fsl_flexcomm.h
    │   │   │   ├── fsl_flexspi.c
    │   │   │   ├── fsl_flexspi.h
    │   │   │   ├── fsl_gdma.c
    │   │   │   ├── fsl_gdma.h
    │   │   │   ├── fsl_gpio.c
    │   │   │   ├── fsl_gpio.h
    │   │   │   ├── fsl_i2s_bridge.c
    │   │   │   ├── fsl_i2s_bridge.h
    │   │   │   ├── fsl_imu.c
    │   │   │   ├── fsl_imu.h
    │   │   │   ├── fsl_inputmux_connections.h
    │   │   │   ├── fsl_io_mux.h
    │   │   │   ├── fsl_iped.c
    │   │   │   ├── fsl_iped.h
    │   │   │   ├── fsl_memory.h
    │   │   │   ├── fsl_ocotp.c
    │   │   │   ├── fsl_ocotp.h
    │   │   │   ├── fsl_power.c
    │   │   │   ├── fsl_power.h
    │   │   │   ├── fsl_reset.c
    │   │   │   ├── fsl_reset.h
    │   │   │   ├── fsl_usart.c
    │   │   │   └── fsl_usart.h
    │   │   ├── edgefast_wifi/
    │   │   │   ├── include/
    │   │   │   │   └── wpl.h
    │   │   │   └── source/
    │   │   │       └── wpl_nxp.c
    │   │   ├── flash/
    │   │   │   └── mflash/
    │   │   │       ├── frdmrw612/
    │   │   │       │   ├── mflash_drv.c
    │   │   │       │   └── mflash_drv.h
    │   │   │       ├── mflash_common.h
    │   │   │       ├── mflash_file.c
    │   │   │       └── mflash_file.h
    │   │   ├── flash_config/
    │   │   │   ├── flash_config.c
    │   │   │   └── flash_config.h
    │   │   ├── frdm-rw612-xpresso-lwip-freertos JLink Debug.launch
    │   │   ├── freertos/
    │   │   │   └── freertos-kernel/
    │   │   │       ├── croutine.c
    │   │   │       ├── event_groups.c
    │   │   │       ├── include/
    │   │   │       │   ├── FreeRTOS.h
    │   │   │       │   ├── StackMacros.h
    │   │   │       │   ├── atomic.h
    │   │   │       │   ├── croutine.h
    │   │   │       │   ├── deprecated_definitions.h
    │   │   │       │   ├── event_groups.h
    │   │   │       │   ├── freertos_tasks_c_additions.h
    │   │   │       │   ├── list.h
    │   │   │       │   ├── message_buffer.h
    │   │   │       │   ├── mpu_prototypes.h
    │   │   │       │   ├── mpu_syscall_numbers.h
    │   │   │       │   ├── mpu_wrappers.h
    │   │   │       │   ├── portable.h
    │   │   │       │   ├── projdefs.h
    │   │   │       │   ├── queue.h
    │   │   │       │   ├── semphr.h
    │   │   │       │   ├── stack_macros.h
    │   │   │       │   ├── stdint.readme
    │   │   │       │   ├── stream_buffer.h
    │   │   │       │   ├── task.h
    │   │   │       │   └── timers.h
    │   │   │       ├── list.c
    │   │   │       ├── portable/
    │   │   │       │   ├── GCC/
    │   │   │       │   │   └── ARM_CM33_NTZ/
    │   │   │       │   │       └── non_secure/
    │   │   │       │   │           ├── mpu_wrappers_v2_asm.c
    │   │   │       │   │           ├── port.c
    │   │   │       │   │           ├── portasm.c
    │   │   │       │   │           ├── portasm.h
    │   │   │       │   │           ├── portmacro.h
    │   │   │       │   │           └── portmacrocommon.h
    │   │   │       │   ├── MemMang/
    │   │   │       │   │   ├── ReadMe.url
    │   │   │       │   │   └── heap_4.c
    │   │   │       │   └── readme.txt
    │   │   │       ├── queue.c
    │   │   │       ├── stream_buffer.c
    │   │   │       ├── tasks.c
    │   │   │       ├── template/
    │   │   │       │   └── ARM_CM33_3_priority_bits/
    │   │   │       │       └── FreeRTOSConfig_Gen.h
    │   │   │       └── timers.c
    │   │   ├── linkscripts/
    │   │   │   ├── main_data.ldt
    │   │   │   ├── main_text.ldt
    │   │   │   └── noinit_noload_section.ldt
    │   │   ├── lwip/
    │   │   │   ├── BUILDING
    │   │   │   ├── CHANGELOG
    │   │   │   ├── CMakeLists_upstream.txt
    │   │   │   ├── COPYING
    │   │   │   ├── ChangeLogKSDK.txt
    │   │   │   ├── FEATURES
    │   │   │   ├── FILES
    │   │   │   ├── README
    │   │   │   ├── UPGRADING
    │   │   │   ├── codespell_changed_files.sh
    │   │   │   ├── codespell_check.sh
    │   │   │   ├── doc/
    │   │   │   │   ├── FILES
    │   │   │   │   ├── NO_SYS_SampleCode.c
    │   │   │   │   ├── ZeroCopyRx.c
    │   │   │   │   ├── contrib.txt
    │   │   │   │   ├── doxygen/
    │   │   │   │   │   ├── generate.bat
    │   │   │   │   │   ├── generate.sh
    │   │   │   │   │   ├── lwip.Doxyfile
    │   │   │   │   │   ├── lwip.Doxyfile.cmake.in
    │   │   │   │   │   ├── main_page.h
    │   │   │   │   │   └── output/
    │   │   │   │   │       └── index.html
    │   │   │   │   ├── mdns.txt
    │   │   │   │   ├── mqtt_client.txt
    │   │   │   │   ├── ppp.txt
    │   │   │   │   └── savannah.txt
    │   │   │   ├── port/
    │   │   │   │   ├── README.md
    │   │   │   │   ├── arch/
    │   │   │   │   │   ├── cc.h
    │   │   │   │   │   └── perf.h
    │   │   │   │   └── sys_arch/
    │   │   │   │       └── dynamic/
    │   │   │   │           ├── arch/
    │   │   │   │           │   └── sys_arch.h
    │   │   │   │           └── sys_arch.c
    │   │   │   └── src/
    │   │   │       ├── FILES
    │   │   │       ├── api/
    │   │   │       │   ├── api_lib.c
    │   │   │       │   ├── api_msg.c
    │   │   │       │   ├── err.c
    │   │   │       │   ├── if_api.c
    │   │   │       │   ├── netbuf.c
    │   │   │       │   ├── netdb.c
    │   │   │       │   ├── netifapi.c
    │   │   │       │   ├── sockets.c
    │   │   │       │   └── tcpip.c
    │   │   │       ├── apps/
    │   │   │       │   ├── httpsrv/
    │   │   │       │   │   ├── httpsrv.c
    │   │   │       │   │   ├── httpsrv.h
    │   │   │       │   │   ├── httpsrv_base64.c
    │   │   │       │   │   ├── httpsrv_base64.h
    │   │   │       │   │   ├── httpsrv_config.h
    │   │   │       │   │   ├── httpsrv_fs.c
    │   │   │       │   │   ├── httpsrv_fs.h
    │   │   │       │   │   ├── httpsrv_port.h
    │   │   │       │   │   ├── httpsrv_prv.h
    │   │   │       │   │   ├── httpsrv_script.c
    │   │   │       │   │   ├── httpsrv_script.h
    │   │   │       │   │   ├── httpsrv_sha1.c
    │   │   │       │   │   ├── httpsrv_sha1.h
    │   │   │       │   │   ├── httpsrv_supp.c
    │   │   │       │   │   ├── httpsrv_supp.h
    │   │   │       │   │   ├── httpsrv_task.c
    │   │   │       │   │   ├── httpsrv_tls.c
    │   │   │       │   │   ├── httpsrv_tls.h
    │   │   │       │   │   ├── httpsrv_utf8.c
    │   │   │       │   │   ├── httpsrv_utf8.h
    │   │   │       │   │   ├── httpsrv_ws.c
    │   │   │       │   │   ├── httpsrv_ws.h
    │   │   │       │   │   ├── httpsrv_ws_api.c
    │   │   │       │   │   ├── httpsrv_ws_prv.h
    │   │   │       │   │   └── mkfs/
    │   │   │       │   │       └── mkfs.pl
    │   │   │       │   └── mdns/
    │   │   │       │       ├── mdns.c
    │   │   │       │       ├── mdns_domain.c
    │   │   │       │       └── mdns_out.c
    │   │   │       ├── core/
    │   │   │       │   ├── altcp.c
    │   │   │       │   ├── altcp_alloc.c
    │   │   │       │   ├── altcp_tcp.c
    │   │   │       │   ├── def.c
    │   │   │       │   ├── dns.c
    │   │   │       │   ├── inet_chksum.c
    │   │   │       │   ├── init.c
    │   │   │       │   ├── ip.c
    │   │   │       │   ├── ipv4/
    │   │   │       │   │   ├── acd.c
    │   │   │       │   │   ├── autoip.c
    │   │   │       │   │   ├── dhcp.c
    │   │   │       │   │   ├── etharp.c
    │   │   │       │   │   ├── icmp.c
    │   │   │       │   │   ├── igmp.c
    │   │   │       │   │   ├── ip4.c
    │   │   │       │   │   ├── ip4_addr.c
    │   │   │       │   │   └── ip4_frag.c
    │   │   │       │   ├── ipv6/
    │   │   │       │   │   ├── dhcp6.c
    │   │   │       │   │   ├── ethip6.c
    │   │   │       │   │   ├── icmp6.c
    │   │   │       │   │   ├── inet6.c
    │   │   │       │   │   ├── ip6.c
    │   │   │       │   │   ├── ip6_addr.c
    │   │   │       │   │   ├── ip6_frag.c
    │   │   │       │   │   ├── mld6.c
    │   │   │       │   │   └── nd6.c
    │   │   │       │   ├── mem.c
    │   │   │       │   ├── memp.c
    │   │   │       │   ├── netif.c
    │   │   │       │   ├── pbuf.c
    │   │   │       │   ├── raw.c
    │   │   │       │   ├── stats.c
    │   │   │       │   ├── sys.c
    │   │   │       │   ├── tcp.c
    │   │   │       │   ├── tcp_in.c
    │   │   │       │   ├── tcp_out.c
    │   │   │       │   ├── timeouts.c
    │   │   │       │   └── udp.c
    │   │   │       ├── include/
    │   │   │       │   ├── compat/
    │   │   │       │   │   ├── posix/
    │   │   │       │   │   │   ├── arpa/
    │   │   │       │   │   │   │   └── inet.h
    │   │   │       │   │   │   ├── net/
    │   │   │       │   │   │   │   └── if.h
    │   │   │       │   │   │   ├── netdb.h
    │   │   │       │   │   │   └── sys/
    │   │   │       │   │   │       └── socket.h
    │   │   │       │   │   └── stdc/
    │   │   │       │   │       └── errno.h
    │   │   │       │   ├── lwip/
    │   │   │       │   │   ├── acd.h
    │   │   │       │   │   ├── altcp.h
    │   │   │       │   │   ├── altcp_tcp.h
    │   │   │       │   │   ├── altcp_tls.h
    │   │   │       │   │   ├── api.h
    │   │   │       │   │   ├── apps/
    │   │   │       │   │   │   ├── mdns.h
    │   │   │       │   │   │   ├── mdns_domain.h
    │   │   │       │   │   │   ├── mdns_opts.h
    │   │   │       │   │   │   ├── mdns_out.h
    │   │   │       │   │   │   └── mdns_priv.h
    │   │   │       │   │   ├── arch.h
    │   │   │       │   │   ├── autoip.h
    │   │   │       │   │   ├── debug.h
    │   │   │       │   │   ├── def.h
    │   │   │       │   │   ├── dhcp.h
    │   │   │       │   │   ├── dhcp6.h
    │   │   │       │   │   ├── dns.h
    │   │   │       │   │   ├── err.h
    │   │   │       │   │   ├── errno.h
    │   │   │       │   │   ├── etharp.h
    │   │   │       │   │   ├── ethip6.h
    │   │   │       │   │   ├── icmp.h
    │   │   │       │   │   ├── icmp6.h
    │   │   │       │   │   ├── if_api.h
    │   │   │       │   │   ├── igmp.h
    │   │   │       │   │   ├── inet.h
    │   │   │       │   │   ├── inet_chksum.h
    │   │   │       │   │   ├── init.h
    │   │   │       │   │   ├── ip.h
    │   │   │       │   │   ├── ip4.h
    │   │   │       │   │   ├── ip4_addr.h
    │   │   │       │   │   ├── ip4_frag.h
    │   │   │       │   │   ├── ip6.h
    │   │   │       │   │   ├── ip6_addr.h
    │   │   │       │   │   ├── ip6_frag.h
    │   │   │       │   │   ├── ip6_zone.h
    │   │   │       │   │   ├── ip_addr.h
    │   │   │       │   │   ├── mem.h
    │   │   │       │   │   ├── memp.h
    │   │   │       │   │   ├── mld6.h
    │   │   │       │   │   ├── nd6.h
    │   │   │       │   │   ├── netbuf.h
    │   │   │       │   │   ├── netdb.h
    │   │   │       │   │   ├── netif.h
    │   │   │       │   │   ├── netifapi.h
    │   │   │       │   │   ├── opt.h
    │   │   │       │   │   ├── pbuf.h
    │   │   │       │   │   ├── priv/
    │   │   │       │   │   │   ├── altcp_priv.h
    │   │   │       │   │   │   ├── api_msg.h
    │   │   │       │   │   │   ├── mem_priv.h
    │   │   │       │   │   │   ├── memp_priv.h
    │   │   │       │   │   │   ├── memp_std.h
    │   │   │       │   │   │   ├── nd6_priv.h
    │   │   │       │   │   │   ├── raw_priv.h
    │   │   │       │   │   │   ├── sockets_priv.h
    │   │   │       │   │   │   ├── tcp_priv.h
    │   │   │       │   │   │   └── tcpip_priv.h
    │   │   │       │   │   ├── prot/
    │   │   │       │   │   │   ├── acd.h
    │   │   │       │   │   │   ├── autoip.h
    │   │   │       │   │   │   ├── dhcp.h
    │   │   │       │   │   │   ├── dhcp6.h
    │   │   │       │   │   │   ├── dns.h
    │   │   │       │   │   │   ├── etharp.h
    │   │   │       │   │   │   ├── ethernet.h
    │   │   │       │   │   │   ├── iana.h
    │   │   │       │   │   │   ├── icmp.h
    │   │   │       │   │   │   ├── icmp6.h
    │   │   │       │   │   │   ├── ieee.h
    │   │   │       │   │   │   ├── igmp.h
    │   │   │       │   │   │   ├── ip.h
    │   │   │       │   │   │   ├── ip4.h
    │   │   │       │   │   │   ├── ip6.h
    │   │   │       │   │   │   ├── mld6.h
    │   │   │       │   │   │   ├── nd6.h
    │   │   │       │   │   │   ├── tcp.h
    │   │   │       │   │   │   └── udp.h
    │   │   │       │   │   ├── raw.h
    │   │   │       │   │   ├── sio.h
    │   │   │       │   │   ├── snmp.h
    │   │   │       │   │   ├── sockets.h
    │   │   │       │   │   ├── stats.h
    │   │   │       │   │   ├── sys.h
    │   │   │       │   │   ├── tcp.h
    │   │   │       │   │   ├── tcpbase.h
    │   │   │       │   │   ├── tcpip.h
    │   │   │       │   │   ├── timeouts.h
    │   │   │       │   │   └── udp.h
    │   │   │       │   └── netif/
    │   │   │       │       ├── bridgeif.h
    │   │   │       │       ├── bridgeif_opts.h
    │   │   │       │       ├── etharp.h
    │   │   │       │       ├── ethernet.h
    │   │   │       │       ├── ieee802154.h
    │   │   │       │       ├── lowpan6.h
    │   │   │       │       ├── lowpan6_ble.h
    │   │   │       │       ├── lowpan6_common.h
    │   │   │       │       ├── lowpan6_opts.h
    │   │   │       │       ├── ppp/
    │   │   │       │       │   ├── ccp.h
    │   │   │       │       │   ├── chap-md5.h
    │   │   │       │       │   ├── chap-new.h
    │   │   │       │       │   ├── chap_ms.h
    │   │   │       │       │   ├── eap.h
    │   │   │       │       │   ├── ecp.h
    │   │   │       │       │   ├── eui64.h
    │   │   │       │       │   ├── fsm.h
    │   │   │       │       │   ├── ipcp.h
    │   │   │       │       │   ├── ipv6cp.h
    │   │   │       │       │   ├── lcp.h
    │   │   │       │       │   ├── magic.h
    │   │   │       │       │   ├── mppe.h
    │   │   │       │       │   ├── polarssl/
    │   │   │       │       │   │   ├── arc4.h
    │   │   │       │       │   │   ├── des.h
    │   │   │       │       │   │   ├── md4.h
    │   │   │       │       │   │   ├── md5.h
    │   │   │       │       │   │   └── sha1.h
    │   │   │       │       │   ├── ppp.h
    │   │   │       │       │   ├── ppp_impl.h
    │   │   │       │       │   ├── ppp_opts.h
    │   │   │       │       │   ├── pppapi.h
    │   │   │       │       │   ├── pppcrypt.h
    │   │   │       │       │   ├── pppdebug.h
    │   │   │       │       │   ├── pppoe.h
    │   │   │       │       │   ├── pppol2tp.h
    │   │   │       │       │   ├── pppos.h
    │   │   │       │       │   ├── upap.h
    │   │   │       │       │   └── vj.h
    │   │   │       │       ├── slipif.h
    │   │   │       │       └── zepif.h
    │   │   │       └── netif/
    │   │   │           ├── FILES
    │   │   │           ├── bridgeif.c
    │   │   │           ├── bridgeif_fdb.c
    │   │   │           ├── ethernet.c
    │   │   │           ├── lowpan6.c
    │   │   │           ├── lowpan6_ble.c
    │   │   │           ├── lowpan6_common.c
    │   │   │           ├── ppp/
    │   │   │           │   ├── PPPD_FOLLOWUP
    │   │   │           │   ├── auth.c
    │   │   │           │   ├── ccp.c
    │   │   │           │   ├── chap-md5.c
    │   │   │           │   ├── chap-new.c
    │   │   │           │   ├── chap_ms.c
    │   │   │           │   ├── demand.c
    │   │   │           │   ├── eap.c
    │   │   │           │   ├── ecp.c
    │   │   │           │   ├── eui64.c
    │   │   │           │   ├── fsm.c
    │   │   │           │   ├── ipcp.c
    │   │   │           │   ├── ipv6cp.c
    │   │   │           │   ├── lcp.c
    │   │   │           │   ├── magic.c
    │   │   │           │   ├── mppe.c
    │   │   │           │   ├── multilink.c
    │   │   │           │   ├── polarssl/
    │   │   │           │   │   ├── README
    │   │   │           │   │   ├── arc4.c
    │   │   │           │   │   ├── des.c
    │   │   │           │   │   ├── md4.c
    │   │   │           │   │   ├── md5.c
    │   │   │           │   │   └── sha1.c
    │   │   │           │   ├── ppp.c
    │   │   │           │   ├── pppapi.c
    │   │   │           │   ├── pppcrypt.c
    │   │   │           │   ├── pppoe.c
    │   │   │           │   ├── pppol2tp.c
    │   │   │           │   ├── pppos.c
    │   │   │           │   ├── upap.c
    │   │   │           │   ├── utils.c
    │   │   │           │   └── vj.c
    │   │   │           ├── slipif.c
    │   │   │           └── zepif.c
    │   │   ├── source/
    │   │   │   ├── FreeRTOSConfig.h
    │   │   │   ├── FreeRTOSConfigBoard.h
    │   │   │   ├── app.h
    │   │   │   ├── app_config.h
    │   │   │   ├── fsl_debug_console_conf.h
    │   │   │   ├── fsl_os_abstraction_config.h
    │   │   │   ├── hardware_init.c
    │   │   │   ├── lwipopts.h
    │   │   │   ├── lwippools.h
    │   │   │   ├── main.c
    │   │   │   ├── mcux_config.h
    │   │   │   ├── mongoose_config.h
    │   │   │   ├── pin_mux.c
    │   │   │   ├── pin_mux.h
    │   │   │   ├── semihost_hardfault.c
    │   │   │   └── wifi_config.h
    │   │   ├── startup/
    │   │   │   └── startup_rw612.c
    │   │   ├── utilities/
    │   │   │   ├── debug_console/
    │   │   │   │   ├── fsl_debug_console.c
    │   │   │   │   └── fsl_debug_console.h
    │   │   │   ├── fsl_assert.c
    │   │   │   ├── fsl_assert.h
    │   │   │   ├── fsl_memcpy.S
    │   │   │   └── str/
    │   │   │       ├── fsl_str.c
    │   │   │       └── fsl_str.h
    │   │   └── wifi/
    │   │       ├── CMakeLists.txt
    │   │       ├── ChangeLogKSDK.txt
    │   │       ├── certs/
    │   │       │   ├── ca-cert.h
    │   │       │   ├── client-cert.h
    │   │       │   ├── client-key.h
    │   │       │   ├── dh-param.h
    │   │       │   ├── server-cert.h
    │   │       │   └── server-key.h
    │   │       ├── dhcpd/
    │   │       │   ├── dhcp-bootp.h
    │   │       │   ├── dhcp-priv.h
    │   │       │   ├── dhcp-server-main.c
    │   │       │   ├── dhcp-server.c
    │   │       │   ├── dns-server.c
    │   │       │   └── dns.h
    │   │       ├── incl/
    │   │       │   ├── dhcp-server.h
    │   │       │   ├── nxp_wifi.h
    │   │       │   ├── port/
    │   │       │   │   ├── net/
    │   │       │   │   │   └── wm_net.h
    │   │       │   │   └── osa/
    │   │       │   │       ├── mem_pool.h
    │   │       │   │       ├── mem_pool_config.h
    │   │       │   │       ├── osa.h
    │   │       │   │       ├── slist.h
    │   │       │   │       └── stack_simple.h
    │   │       │   ├── wifi_cal_data_ext.h
    │   │       │   ├── wifi_cal_data_frdmrw61x_1ant.h
    │   │       │   ├── wifi_cal_data_rw61x_1ant.h
    │   │       │   ├── wifi_cal_data_rw61x_1ant_diversity.h
    │   │       │   ├── wifi_cal_data_rw61x_2ant.h
    │   │       │   ├── wifi_cal_data_rw61x_3ant_diversity.h
    │   │       │   ├── wifi_cal_data_rw61x_override.h
    │   │       │   ├── wifi_config_default.h
    │   │       │   ├── wifidriver/
    │   │       │   │   ├── wifi-decl.h
    │   │       │   │   ├── wifi.h
    │   │       │   │   ├── wifi_events.h
    │   │       │   │   └── wifi_nxp.h
    │   │       │   ├── wlcmgr/
    │   │       │   │   ├── wlan.h
    │   │       │   │   └── wlan_11d.h
    │   │       │   ├── wm_utils.h
    │   │       │   ├── wmerrno.h
    │   │       │   ├── wmlog.h
    │   │       │   ├── wmstats.h
    │   │       │   └── wmtypes.h
    │   │       ├── port/
    │   │       │   ├── net/
    │   │       │   │   ├── net.c
    │   │       │   │   ├── netif_decl.h
    │   │       │   │   └── wifi_netif.c
    │   │       │   └── osa/
    │   │       │       ├── mem_pool.c
    │   │       │       ├── mem_pool_config.c
    │   │       │       ├── osa.c
    │   │       │       ├── osa_freertos.c
    │   │       │       ├── osa_freertos.h
    │   │       │       ├── slist.c
    │   │       │       └── stack_simple.c
    │   │       ├── wifi_bt_firmware/
    │   │       │   └── wlan_bt_fw.h
    │   │       ├── wifidriver/
    │   │       │   ├── incl/
    │   │       │   │   ├── mlan.h
    │   │       │   │   ├── mlan_11ac.h
    │   │       │   │   ├── mlan_11ax.h
    │   │       │   │   ├── mlan_11h.h
    │   │       │   │   ├── mlan_11k.h
    │   │       │   │   ├── mlan_11n.h
    │   │       │   │   ├── mlan_11n_aggr.h
    │   │       │   │   ├── mlan_11n_rxreorder.h
    │   │       │   │   ├── mlan_11v.h
    │   │       │   │   ├── mlan_action.h
    │   │       │   │   ├── mlan_api.h
    │   │       │   │   ├── mlan_decl.h
    │   │       │   │   ├── mlan_fw.h
    │   │       │   │   ├── mlan_ieee.h
    │   │       │   │   ├── mlan_init.h
    │   │       │   │   ├── mlan_ioctl.h
    │   │       │   │   ├── mlan_join.h
    │   │       │   │   ├── mlan_main.h
    │   │       │   │   ├── mlan_mbo.h
    │   │       │   │   ├── mlan_meas.h
    │   │       │   │   ├── mlan_remap_mem_operations.h
    │   │       │   │   ├── mlan_uap.h
    │   │       │   │   ├── mlan_util.h
    │   │       │   │   ├── mlan_wmm.h
    │   │       │   │   └── type_decls.h
    │   │       │   ├── mlan_11ac.c
    │   │       │   ├── mlan_11ax.c
    │   │       │   ├── mlan_11d.c
    │   │       │   ├── mlan_11h.c
    │   │       │   ├── mlan_11k.c
    │   │       │   ├── mlan_11n.c
    │   │       │   ├── mlan_11n_aggr.c
    │   │       │   ├── mlan_11n_rxreorder.c
    │   │       │   ├── mlan_11v.c
    │   │       │   ├── mlan_action.c
    │   │       │   ├── mlan_api.c
    │   │       │   ├── mlan_cfp.c
    │   │       │   ├── mlan_cmdevt.c
    │   │       │   ├── mlan_glue.c
    │   │       │   ├── mlan_init.c
    │   │       │   ├── mlan_join.c
    │   │       │   ├── mlan_mbo.c
    │   │       │   ├── mlan_misc.c
    │   │       │   ├── mlan_scan.c
    │   │       │   ├── mlan_shim.c
    │   │       │   ├── mlan_sta_cmd.c
    │   │       │   ├── mlan_sta_cmdresp.c
    │   │       │   ├── mlan_sta_event.c
    │   │       │   ├── mlan_sta_ioctl.c
    │   │       │   ├── mlan_sta_rx.c
    │   │       │   ├── mlan_txrx.c
    │   │       │   ├── mlan_uap_cmdevent.c
    │   │       │   ├── mlan_uap_ioctl.c
    │   │       │   ├── mlan_wmm.c
    │   │       │   ├── wifi-debug.c
    │   │       │   ├── wifi-debug.h
    │   │       │   ├── wifi-imu.c
    │   │       │   ├── wifi-imu.h
    │   │       │   ├── wifi-internal.h
    │   │       │   ├── wifi-mem.c
    │   │       │   ├── wifi-uap.c
    │   │       │   ├── wifi-wps.c
    │   │       │   ├── wifi.c
    │   │       │   ├── wifi_common.h
    │   │       │   ├── wifi_pwrmgr.c
    │   │       │   └── wpa_supp_if/
    │   │       │       ├── incl/
    │   │       │       │   ├── rtos_wpa_supp_if.h
    │   │       │       │   └── wifi_nxp_internal.h
    │   │       │       ├── rtos_wpa_supp_if.c
    │   │       │       ├── wifi_nxp.c
    │   │       │       └── wifi_nxp_internal.c
    │   │       └── wlcmgr/
    │   │           ├── wlan.c
    │   │           └── wlan_txpwrlimit_cfg.c
    │   ├── frdm-rw612-xpresso-freertos-lwip-wifi/
    │   │   ├── .cproject
    │   │   ├── .project
    │   │   ├── .settings/
    │   │   │   ├── language.settings.xml
    │   │   │   └── org.eclipse.core.resources.prefs
    │   │   ├── CMSIS/
    │   │   │   ├── cmsis_compiler.h
    │   │   │   ├── cmsis_gcc.h
    │   │   │   ├── cmsis_version.h
    │   │   │   ├── core_cm33.h
    │   │   │   ├── mpu_armv8.h
    │   │   │   └── tz_context.h
    │   │   ├── Debug/
    │   │   │   ├── frdm-rw612-xpresso-freertos-lwip_Debug.ld
    │   │   │   ├── frdm-rw612-xpresso-freertos-lwip_Debug_library.ld
    │   │   │   └── frdm-rw612-xpresso-freertos-lwip_Debug_memory.ld
    │   │   ├── README.md
    │   │   ├── board/
    │   │   │   ├── board.c
    │   │   │   ├── board.h
    │   │   │   ├── clock_config.c
    │   │   │   ├── clock_config.h
    │   │   │   ├── pin_mux.c
    │   │   │   └── pin_mux.h
    │   │   ├── component/
    │   │   │   ├── conn_fwloader/
    │   │   │   │   ├── fsl_loader.c
    │   │   │   │   ├── fsl_loader_utils.c
    │   │   │   │   ├── include/
    │   │   │   │   │   ├── api_tree_root.h
    │   │   │   │   │   ├── fsl_loader.h
    │   │   │   │   │   ├── fsl_loader_utils.h
    │   │   │   │   │   ├── fusemap.h
    │   │   │   │   │   ├── life_cycle.h
    │   │   │   │   │   └── nboot_rom_api_table.h
    │   │   │   │   ├── life_cycle.c
    │   │   │   │   ├── nboot_hal.c
    │   │   │   │   └── readme.txt
    │   │   │   ├── els_pkc/
    │   │   │   │   └── src/
    │   │   │   │       ├── compiler/
    │   │   │   │       │   └── mcuxClToolchain.h
    │   │   │   │       ├── comps/
    │   │   │   │       │   ├── mcuxClBuffer/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   ├── mcuxClBuffer_Internal.h
    │   │   │   │       │   │   │   │   └── mcuxClBuffer_Internal_Pointer.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer_Cfg.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer_Constants.h
    │   │   │   │       │   │   │   ├── mcuxClBuffer_Impl.h
    │   │   │   │       │   │   │   └── mcuxClBuffer_Pointer.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       └── mcuxClBuffer.c
    │   │   │   │       │   ├── mcuxClCore/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxClCore_Examples.h
    │   │   │   │       │   │       ├── mcuxClCore_FunctionIdentifiers.h
    │   │   │   │       │   │       ├── mcuxClCore_Macros.h
    │   │   │   │       │   │       ├── mcuxClCore_Platform.h
    │   │   │   │       │   │       └── mcuxClCore_Toolchain.h
    │   │   │   │       │   ├── mcuxClEls/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   ├── mcuxClEls_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClEls_Internal_Common.h
    │   │   │   │       │   │   │   │   ├── mcuxClEls_Internal_mapping.h
    │   │   │   │       │   │   │   │   └── mcuxClEls_SfrAccess.h
    │   │   │   │       │   │   │   ├── mcuxClEls.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Aead.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Cipher.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Cmac.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Common.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Crc.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Ecc.h
    │   │   │   │       │   │   │   ├── mcuxClEls_GlitchDetector.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Hash.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Hmac.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Kdf.h
    │   │   │   │       │   │   │   ├── mcuxClEls_KeyManagement.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Rng.h
    │   │   │   │       │   │   │   ├── mcuxClEls_Types.h
    │   │   │   │       │   │   │   └── mcuxClEls_mapping.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       ├── mcuxClEls_Common.c
    │   │   │   │       │   │       └── mcuxClEls_GlitchDetector.c
    │   │   │   │       │   ├── mcuxClMemory/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_ClearSecure_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_Clear_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CompareDPASecure_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CompareSecure_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_Compare_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CopySecurePow2_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CopySecure_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CopySecure_Reversed_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_CopyWords_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_Copy_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_Copy_Reversed_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_Internal.h
    │   │   │   │       │   │   │   │   ├── mcuxClMemory_SetSecure_Internal.h
    │   │   │   │       │   │   │   │   └── mcuxClMemory_Set_Internal.h
    │   │   │   │       │   │   │   ├── mcuxClMemory.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Clear.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Constants.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Copy.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Copy_Reversed.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Endianness.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Set.h
    │   │   │   │       │   │   │   ├── mcuxClMemory_Types.h
    │   │   │   │       │   │   │   └── mcuxClMemory_Xor.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       └── mcuxClMemory.c
    │   │   │   │       │   ├── mcuxCsslCPreProcessor/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxCsslAnalysis.h
    │   │   │   │       │   │       └── mcuxCsslCPreProcessor.h
    │   │   │   │       │   ├── mcuxCsslDataIntegrity/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxCsslDataIntegrity.h
    │   │   │   │       │   │       ├── mcuxCsslDataIntegrity_Cfg.h
    │   │   │   │       │   │       ├── mcuxCsslDataIntegrity_Impl.h
    │   │   │   │       │   │       └── mcuxCsslDataIntegrity_None.h
    │   │   │   │       │   ├── mcuxCsslFlowProtection/
    │   │   │   │       │   │   └── inc/
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_Cfg.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_FunctionIdentifiers.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_Impl.h
    │   │   │   │       │   │       ├── mcuxCsslFlowProtection_SecureCounter_Common.h
    │   │   │   │       │   │       └── mcuxCsslFlowProtection_SecureCounter_Local.h
    │   │   │   │       │   ├── mcuxCsslMemory/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   ├── internal/
    │   │   │   │       │   │   │   │   ├── mcuxCsslMemory_Internal_Compare_asm.h
    │   │   │   │       │   │   │   │   ├── mcuxCsslMemory_Internal_Copy_asm.h
    │   │   │   │       │   │   │   │   └── mcuxCsslMemory_Internal_SecureCompare.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Clear.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Compare.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Constants.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Copy.h
    │   │   │   │       │   │   │   ├── mcuxCsslMemory_Set.h
    │   │   │   │       │   │   │   └── mcuxCsslMemory_Types.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       ├── mcuxCsslMemory_Clear.c
    │   │   │   │       │   │       ├── mcuxCsslMemory_Compare.c
    │   │   │   │       │   │       ├── mcuxCsslMemory_Copy.c
    │   │   │   │       │   │       ├── mcuxCsslMemory_Internal_SecureCompare_Stub.c
    │   │   │   │       │   │       └── mcuxCsslMemory_Set.c
    │   │   │   │       │   ├── mcuxCsslParamIntegrity/
    │   │   │   │       │   │   ├── inc/
    │   │   │   │       │   │   │   └── mcuxCsslParamIntegrity.h
    │   │   │   │       │   │   └── src/
    │   │   │   │       │   │       └── mcuxCsslParamIntegrity.c
    │   │   │   │       │   └── mcuxCsslSecureCounter/
    │   │   │   │       │       └── inc/
    │   │   │   │       │           ├── mcuxCsslSecureCounter.h
    │   │   │   │       │           ├── mcuxCsslSecureCounter_Cfg.h
    │   │   │   │       │           ├── mcuxCsslSecureCounter_Impl.h
    │   │   │   │       │           ├── mcuxCsslSecureCounter_None.h
    │   │   │   │       │           └── mcuxCsslSecureCounter_SW_Local.h
    │   │   │   │       └── platforms/
    │   │   │   │           └── rw61x/
    │   │   │   │               ├── inc/
    │   │   │   │               │   ├── ip_css_constants.h
    │   │   │   │               │   ├── ip_css_design_configuration.h
    │   │   │   │               │   └── ip_platform.h
    │   │   │   │               ├── mcuxClConfig.h
    │   │   │   │               ├── platform_specific_headers.h
    │   │   │   │               └── readme.txt
    │   │   │   ├── imu_adapter/
    │   │   │   │   ├── fsl_adapter_imu.c
    │   │   │   │   ├── fsl_adapter_imu.h
    │   │   │   │   └── fsl_adapter_imu_common.h
    │   │   │   ├── lists/
    │   │   │   │   ├── fsl_component_generic_list.c
    │   │   │   │   └── fsl_component_generic_list.h
    │   │   │   ├── osa/
    │   │   │   │   ├── fsl_os_abstraction.h
    │   │   │   │   ├── fsl_os_abstraction_config.h
    │   │   │   │   ├── fsl_os_abstraction_free_rtos.c
    │   │   │   │   └── fsl_os_abstraction_free_rtos.h
    │   │   │   ├── serial_manager/
    │   │   │   │   ├── fsl_component_serial_manager.c
    │   │   │   │   ├── fsl_component_serial_manager.h
    │   │   │   │   ├── fsl_component_serial_port_internal.h
    │   │   │   │   ├── fsl_component_serial_port_uart.c
    │   │   │   │   └── fsl_component_serial_port_uart.h
    │   │   │   ├── uart/
    │   │   │   │   ├── fsl_adapter_uart.h
    │   │   │   │   └── fsl_adapter_usart.c
    │   │   │   └── wifi_bt_module/
    │   │   │       └── AzureWave/
    │   │   │           └── tx_pwr_limits/
    │   │   │               └── wlan_txpwrlimit_cfg_WW_rw610.h
    │   │   ├── device/
    │   │   │   ├── RW612.h
    │   │   │   ├── RW612_features.h
    │   │   │   ├── fsl_device_registers.h
    │   │   │   ├── system_RW612.c
    │   │   │   └── system_RW612.h
    │   │   ├── drivers/
    │   │   │   ├── freertos/
    │   │   │   │   ├── fsl_usart_freertos.c
    │   │   │   │   └── fsl_usart_freertos.h
    │   │   │   ├── fsl_cache.c
    │   │   │   ├── fsl_cache.h
    │   │   │   ├── fsl_clock.c
    │   │   │   ├── fsl_clock.h
    │   │   │   ├── fsl_common.c
    │   │   │   ├── fsl_common.h
    │   │   │   ├── fsl_common_arm.c
    │   │   │   ├── fsl_common_arm.h
    │   │   │   ├── fsl_flexcomm.c
    │   │   │   ├── fsl_flexcomm.h
    │   │   │   ├── fsl_flexspi.c
    │   │   │   ├── fsl_flexspi.h
    │   │   │   ├── fsl_gdma.c
    │   │   │   ├── fsl_gdma.h
    │   │   │   ├── fsl_gpio.c
    │   │   │   ├── fsl_gpio.h
    │   │   │   ├── fsl_imu.c
    │   │   │   ├── fsl_imu.h
    │   │   │   ├── fsl_io_mux.h
    │   │   │   ├── fsl_ocotp.c
    │   │   │   ├── fsl_ocotp.h
    │   │   │   ├── fsl_power.c
    │   │   │   ├── fsl_power.h
    │   │   │   ├── fsl_reset.c
    │   │   │   ├── fsl_reset.h
    │   │   │   ├── fsl_usart.c
    │   │   │   └── fsl_usart.h
    │   │   ├── edgefast_wifi/
    │   │   │   ├── include/
    │   │   │   │   └── wpl.h
    │   │   │   └── source/
    │   │   │       └── wpl_nxp.c
    │   │   ├── flash/
    │   │   │   └── mflash/
    │   │   │       ├── frdmrw612/
    │   │   │       │   ├── mflash_drv.c
    │   │   │       │   └── mflash_drv.h
    │   │   │       ├── mflash_common.h
    │   │   │       ├── mflash_file.c
    │   │   │       ├── mflash_file.h
    │   │   │       └── readme.txt
    │   │   ├── flash_config/
    │   │   │   ├── flash_config.c
    │   │   │   └── flash_config.h
    │   │   ├── freertos/
    │   │   │   └── freertos-kernel/
    │   │   │       ├── croutine.c
    │   │   │       ├── event_groups.c
    │   │   │       ├── include/
    │   │   │       │   ├── FreeRTOS.h
    │   │   │       │   ├── StackMacros.h
    │   │   │       │   ├── atomic.h
    │   │   │       │   ├── croutine.h
    │   │   │       │   ├── deprecated_definitions.h
    │   │   │       │   ├── event_groups.h
    │   │   │       │   ├── freertos_tasks_c_additions.h
    │   │   │       │   ├── list.h
    │   │   │       │   ├── message_buffer.h
    │   │   │       │   ├── mpu_prototypes.h
    │   │   │       │   ├── mpu_syscall_numbers.h
    │   │   │       │   ├── mpu_wrappers.h
    │   │   │       │   ├── newlib-freertos.h
    │   │   │       │   ├── picolibc-freertos.h
    │   │   │       │   ├── portable.h
    │   │   │       │   ├── projdefs.h
    │   │   │       │   ├── queue.h
    │   │   │       │   ├── semphr.h
    │   │   │       │   ├── stack_macros.h
    │   │   │       │   ├── stdint.readme
    │   │   │       │   ├── stream_buffer.h
    │   │   │       │   ├── task.h
    │   │   │       │   └── timers.h
    │   │   │       ├── list.c
    │   │   │       ├── portable/
    │   │   │       │   ├── GCC/
    │   │   │       │   │   └── ARM_CM33_NTZ/
    │   │   │       │   │       └── non_secure/
    │   │   │       │   │           ├── mpu_wrappers_v2_asm.c
    │   │   │       │   │           ├── port.c
    │   │   │       │   │           ├── portasm.c
    │   │   │       │   │           ├── portasm.h
    │   │   │       │   │           ├── portmacro.h
    │   │   │       │   │           └── portmacrocommon.h
    │   │   │       │   ├── MemMang/
    │   │   │       │   │   ├── ReadMe.url
    │   │   │       │   │   └── heap_3.c
    │   │   │       │   └── readme.txt
    │   │   │       ├── queue.c
    │   │   │       ├── stream_buffer.c
    │   │   │       ├── tasks.c
    │   │   │       └── timers.c
    │   │   ├── linkscripts/
    │   │   │   ├── main_data.ldt
    │   │   │   ├── main_rodata.ldt
    │   │   │   ├── main_text.ldt
    │   │   │   └── noinit_noload_section.ldt
    │   │   ├── lwip/
    │   │   │   ├── BUILDING
    │   │   │   ├── CHANGELOG
    │   │   │   ├── COPYING
    │   │   │   ├── ChangeLogKSDK.txt
    │   │   │   ├── FEATURES
    │   │   │   ├── FILES
    │   │   │   ├── README
    │   │   │   ├── UPGRADING
    │   │   │   ├── doc/
    │   │   │   │   ├── FILES
    │   │   │   │   ├── NO_SYS_SampleCode.c
    │   │   │   │   ├── ZeroCopyRx.c
    │   │   │   │   ├── contrib.txt
    │   │   │   │   ├── doxygen/
    │   │   │   │   │   ├── generate.bat
    │   │   │   │   │   ├── generate.sh
    │   │   │   │   │   ├── lwip.Doxyfile
    │   │   │   │   │   ├── lwip.Doxyfile.cmake.in
    │   │   │   │   │   ├── main_page.h
    │   │   │   │   │   └── output/
    │   │   │   │   │       └── index.html
    │   │   │   │   ├── mdns.txt
    │   │   │   │   ├── mqtt_client.txt
    │   │   │   │   ├── ppp.txt
    │   │   │   │   └── savannah.txt
    │   │   │   ├── port/
    │   │   │   │   ├── arch/
    │   │   │   │   │   ├── cc.h
    │   │   │   │   │   └── perf.h
    │   │   │   │   └── sys_arch/
    │   │   │   │       └── dynamic/
    │   │   │   │           ├── arch/
    │   │   │   │           │   └── sys_arch.h
    │   │   │   │           └── sys_arch.c
    │   │   │   └── src/
    │   │   │       ├── FILES
    │   │   │       ├── api/
    │   │   │       │   ├── api_lib.c
    │   │   │       │   ├── api_msg.c
    │   │   │       │   ├── err.c
    │   │   │       │   ├── if_api.c
    │   │   │       │   ├── netbuf.c
    │   │   │       │   ├── netdb.c
    │   │   │       │   ├── netifapi.c
    │   │   │       │   ├── sockets.c
    │   │   │       │   └── tcpip.c
    │   │   │       ├── core/
    │   │   │       │   ├── altcp.c
    │   │   │       │   ├── altcp_alloc.c
    │   │   │       │   ├── altcp_tcp.c
    │   │   │       │   ├── def.c
    │   │   │       │   ├── dns.c
    │   │   │       │   ├── inet_chksum.c
    │   │   │       │   ├── init.c
    │   │   │       │   ├── ip.c
    │   │   │       │   ├── ipv4/
    │   │   │       │   │   ├── acd.c
    │   │   │       │   │   ├── autoip.c
    │   │   │       │   │   ├── dhcp.c
    │   │   │       │   │   ├── etharp.c
    │   │   │       │   │   ├── icmp.c
    │   │   │       │   │   ├── igmp.c
    │   │   │       │   │   ├── ip4.c
    │   │   │       │   │   ├── ip4_addr.c
    │   │   │       │   │   └── ip4_frag.c
    │   │   │       │   ├── ipv6/
    │   │   │       │   │   ├── dhcp6.c
    │   │   │       │   │   ├── ethip6.c
    │   │   │       │   │   ├── icmp6.c
    │   │   │       │   │   ├── inet6.c
    │   │   │       │   │   ├── ip6.c
    │   │   │       │   │   ├── ip6_addr.c
    │   │   │       │   │   ├── ip6_frag.c
    │   │   │       │   │   ├── mld6.c
    │   │   │       │   │   └── nd6.c
    │   │   │       │   ├── mem.c
    │   │   │       │   ├── memp.c
    │   │   │       │   ├── netif.c
    │   │   │       │   ├── pbuf.c
    │   │   │       │   ├── raw.c
    │   │   │       │   ├── stats.c
    │   │   │       │   ├── sys.c
    │   │   │       │   ├── tcp.c
    │   │   │       │   ├── tcp_in.c
    │   │   │       │   ├── tcp_out.c
    │   │   │       │   ├── timeouts.c
    │   │   │       │   └── udp.c
    │   │   │       ├── include/
    │   │   │       │   ├── compat/
    │   │   │       │   │   ├── posix/
    │   │   │       │   │   │   ├── arpa/
    │   │   │       │   │   │   │   └── inet.h
    │   │   │       │   │   │   ├── net/
    │   │   │       │   │   │   │   └── if.h
    │   │   │       │   │   │   ├── netdb.h
    │   │   │       │   │   │   └── sys/
    │   │   │       │   │   │       └── socket.h
    │   │   │       │   │   └── stdc/
    │   │   │       │   │       └── errno.h
    │   │   │       │   ├── lwip/
    │   │   │       │   │   ├── acd.h
    │   │   │       │   │   ├── altcp.h
    │   │   │       │   │   ├── altcp_tcp.h
    │   │   │       │   │   ├── altcp_tls.h
    │   │   │       │   │   ├── api.h
    │   │   │       │   │   ├── apps/
    │   │   │       │   │   │   └── lwiperf.h
    │   │   │       │   │   ├── arch.h
    │   │   │       │   │   ├── autoip.h
    │   │   │       │   │   ├── debug.h
    │   │   │       │   │   ├── def.h
    │   │   │       │   │   ├── dhcp.h
    │   │   │       │   │   ├── dhcp6.h
    │   │   │       │   │   ├── dns.h
    │   │   │       │   │   ├── err.h
    │   │   │       │   │   ├── errno.h
    │   │   │       │   │   ├── etharp.h
    │   │   │       │   │   ├── ethip6.h
    │   │   │       │   │   ├── icmp.h
    │   │   │       │   │   ├── icmp6.h
    │   │   │       │   │   ├── if_api.h
    │   │   │       │   │   ├── igmp.h
    │   │   │       │   │   ├── inet.h
    │   │   │       │   │   ├── inet_chksum.h
    │   │   │       │   │   ├── init.h
    │   │   │       │   │   ├── ip.h
    │   │   │       │   │   ├── ip4.h
    │   │   │       │   │   ├── ip4_addr.h
    │   │   │       │   │   ├── ip4_frag.h
    │   │   │       │   │   ├── ip6.h
    │   │   │       │   │   ├── ip6_addr.h
    │   │   │       │   │   ├── ip6_frag.h
    │   │   │       │   │   ├── ip6_zone.h
    │   │   │       │   │   ├── ip_addr.h
    │   │   │       │   │   ├── mem.h
    │   │   │       │   │   ├── memp.h
    │   │   │       │   │   ├── mld6.h
    │   │   │       │   │   ├── nd6.h
    │   │   │       │   │   ├── netbuf.h
    │   │   │       │   │   ├── netdb.h
    │   │   │       │   │   ├── netif.h
    │   │   │       │   │   ├── netifapi.h
    │   │   │       │   │   ├── opt.h
    │   │   │       │   │   ├── pbuf.h
    │   │   │       │   │   ├── priv/
    │   │   │       │   │   │   ├── altcp_priv.h
    │   │   │       │   │   │   ├── api_msg.h
    │   │   │       │   │   │   ├── mem_priv.h
    │   │   │       │   │   │   ├── memp_priv.h
    │   │   │       │   │   │   ├── memp_std.h
    │   │   │       │   │   │   ├── nd6_priv.h
    │   │   │       │   │   │   ├── raw_priv.h
    │   │   │       │   │   │   ├── sockets_priv.h
    │   │   │       │   │   │   ├── tcp_priv.h
    │   │   │       │   │   │   └── tcpip_priv.h
    │   │   │       │   │   ├── prot/
    │   │   │       │   │   │   ├── acd.h
    │   │   │       │   │   │   ├── autoip.h
    │   │   │       │   │   │   ├── dhcp.h
    │   │   │       │   │   │   ├── dhcp6.h
    │   │   │       │   │   │   ├── dns.h
    │   │   │       │   │   │   ├── etharp.h
    │   │   │       │   │   │   ├── ethernet.h
    │   │   │       │   │   │   ├── iana.h
    │   │   │       │   │   │   ├── icmp.h
    │   │   │       │   │   │   ├── icmp6.h
    │   │   │       │   │   │   ├── ieee.h
    │   │   │       │   │   │   ├── igmp.h
    │   │   │       │   │   │   ├── ip.h
    │   │   │       │   │   │   ├── ip4.h
    │   │   │       │   │   │   ├── ip6.h
    │   │   │       │   │   │   ├── mld6.h
    │   │   │       │   │   │   ├── nd6.h
    │   │   │       │   │   │   ├── tcp.h
    │   │   │       │   │   │   └── udp.h
    │   │   │       │   │   ├── raw.h
    │   │   │       │   │   ├── sio.h
    │   │   │       │   │   ├── snmp.h
    │   │   │       │   │   ├── sockets.h
    │   │   │       │   │   ├── stats.h
    │   │   │       │   │   ├── sys.h
    │   │   │       │   │   ├── tcp.h
    │   │   │       │   │   ├── tcpbase.h
    │   │   │       │   │   ├── tcpip.h
    │   │   │       │   │   ├── timeouts.h
    │   │   │       │   │   └── udp.h
    │   │   │       │   └── netif/
    │   │   │       │       ├── bridgeif.h
    │   │   │       │       ├── bridgeif_opts.h
    │   │   │       │       ├── etharp.h
    │   │   │       │       ├── ethernet.h
    │   │   │       │       ├── ieee802154.h
    │   │   │       │       ├── lowpan6.h
    │   │   │       │       ├── lowpan6_ble.h
    │   │   │       │       ├── lowpan6_common.h
    │   │   │       │       ├── lowpan6_opts.h
    │   │   │       │       ├── ppp/
    │   │   │       │       │   ├── ccp.h
    │   │   │       │       │   ├── chap-md5.h
    │   │   │       │       │   ├── chap-new.h
    │   │   │       │       │   ├── chap_ms.h
    │   │   │       │       │   ├── eap.h
    │   │   │       │       │   ├── ecp.h
    │   │   │       │       │   ├── eui64.h
    │   │   │       │       │   ├── fsm.h
    │   │   │       │       │   ├── ipcp.h
    │   │   │       │       │   ├── ipv6cp.h
    │   │   │       │       │   ├── lcp.h
    │   │   │       │       │   ├── magic.h
    │   │   │       │       │   ├── mppe.h
    │   │   │       │       │   ├── polarssl/
    │   │   │       │       │   │   ├── arc4.h
    │   │   │       │       │   │   ├── des.h
    │   │   │       │       │   │   ├── md4.h
    │   │   │       │       │   │   ├── md5.h
    │   │   │       │       │   │   └── sha1.h
    │   │   │       │       │   ├── ppp.h
    │   │   │       │       │   ├── ppp_impl.h
    │   │   │       │       │   ├── ppp_opts.h
    │   │   │       │       │   ├── pppapi.h
    │   │   │       │       │   ├── pppcrypt.h
    │   │   │       │       │   ├── pppdebug.h
    │   │   │       │       │   ├── pppoe.h
    │   │   │       │       │   ├── pppol2tp.h
    │   │   │       │       │   ├── pppos.h
    │   │   │       │       │   ├── upap.h
    │   │   │       │       │   └── vj.h
    │   │   │       │       ├── slipif.h
    │   │   │       │       └── zepif.h
    │   │   │       └── netif/
    │   │   │           ├── FILES
    │   │   │           ├── bridgeif.c
    │   │   │           ├── bridgeif_fdb.c
    │   │   │           ├── ethernet.c
    │   │   │           ├── lowpan6.c
    │   │   │           ├── lowpan6_ble.c
    │   │   │           ├── lowpan6_common.c
    │   │   │           ├── ppp/
    │   │   │           │   ├── PPPD_FOLLOWUP
    │   │   │           │   ├── auth.c
    │   │   │           │   ├── ccp.c
    │   │   │           │   ├── chap-md5.c
    │   │   │           │   ├── chap-new.c
    │   │   │           │   ├── chap_ms.c
    │   │   │           │   ├── demand.c
    │   │   │           │   ├── eap.c
    │   │   │           │   ├── ecp.c
    │   │   │           │   ├── eui64.c
    │   │   │           │   ├── fsm.c
    │   │   │           │   ├── ipcp.c
    │   │   │           │   ├── ipv6cp.c
    │   │   │           │   ├── lcp.c
    │   │   │           │   ├── magic.c
    │   │   │           │   ├── mppe.c
    │   │   │           │   ├── multilink.c
    │   │   │           │   ├── polarssl/
    │   │   │           │   │   ├── README
    │   │   │           │   │   ├── arc4.c
    │   │   │           │   │   ├── des.c
    │   │   │           │   │   ├── md4.c
    │   │   │           │   │   ├── md5.c
    │   │   │           │   │   └── sha1.c
    │   │   │           │   ├── ppp.c
    │   │   │           │   ├── pppapi.c
    │   │   │           │   ├── pppcrypt.c
    │   │   │           │   ├── pppoe.c
    │   │   │           │   ├── pppol2tp.c
    │   │   │           │   ├── pppos.c
    │   │   │           │   ├── upap.c
    │   │   │           │   ├── utils.c
    │   │   │           │   └── vj.c
    │   │   │           ├── slipif.c
    │   │   │           └── zepif.c
    │   │   ├── source/
    │   │   │   ├── FreeRTOSConfig.h
    │   │   │   ├── app_config.h
    │   │   │   ├── lwipopts.h
    │   │   │   ├── lwippools.h
    │   │   │   ├── main.c
    │   │   │   ├── main.c_mg_wifi-style
    │   │   │   ├── mongoose_config.h
    │   │   │   ├── semihost_hardfault.c
    │   │   │   └── wifi_config.h
    │   │   ├── startup/
    │   │   │   └── startup_rw612.c
    │   │   ├── utilities/
    │   │   │   ├── fsl_assert.c
    │   │   │   ├── fsl_assert.h
    │   │   │   ├── fsl_debug_console.c
    │   │   │   ├── fsl_debug_console.h
    │   │   │   ├── fsl_debug_console_conf.h
    │   │   │   ├── fsl_memcpy.S
    │   │   │   ├── fsl_str.c
    │   │   │   └── fsl_str.h
    │   │   └── wifi/
    │   │       ├── CMakeLists.txt
    │   │       ├── ChangeLogKSDK.txt
    │   │       ├── certs/
    │   │       │   ├── ca-cert.h
    │   │       │   ├── client-cert.h
    │   │       │   ├── client-key.h
    │   │       │   ├── dh-param.h
    │   │       │   ├── server-cert.h
    │   │       │   └── server-key.h
    │   │       ├── dhcpd/
    │   │       │   ├── dhcp-bootp.h
    │   │       │   ├── dhcp-priv.h
    │   │       │   ├── dhcp-server-main.c
    │   │       │   ├── dhcp-server.c
    │   │       │   ├── dns-server.c
    │   │       │   └── dns.h
    │   │       ├── incl/
    │   │       │   ├── dhcp-server.h
    │   │       │   ├── nxp_wifi.h
    │   │       │   ├── port/
    │   │       │   │   ├── net/
    │   │       │   │   │   ├── hooks/
    │   │       │   │   │   │   └── lwip_default_hooks.h
    │   │       │   │   │   └── wm_net.h
    │   │       │   │   └── osa/
    │   │       │   │       ├── mem_pool.h
    │   │       │   │       ├── mem_pool_config.h
    │   │       │   │       ├── osa.h
    │   │       │   │       ├── slist.h
    │   │       │   │       └── stack_simple.h
    │   │       │   ├── wifi_cal_data_ext.h
    │   │       │   ├── wifi_config_default.h
    │   │       │   ├── wifidriver/
    │   │       │   │   ├── wifi-decl.h
    │   │       │   │   ├── wifi.h
    │   │       │   │   ├── wifi_events.h
    │   │       │   │   └── wifi_nxp.h
    │   │       │   ├── wlcmgr/
    │   │       │   │   ├── wlan.h
    │   │       │   │   └── wlan_11d.h
    │   │       │   ├── wm_utils.h
    │   │       │   ├── wmerrno.h
    │   │       │   ├── wmlog.h
    │   │       │   ├── wmstats.h
    │   │       │   └── wmtypes.h
    │   │       ├── port/
    │   │       │   ├── net/
    │   │       │   │   ├── hooks/
    │   │       │   │   │   └── lwip_default_hooks.c
    │   │       │   │   ├── net.c
    │   │       │   │   ├── netif_decl.h
    │   │       │   │   └── wifi_netif.c
    │   │       │   └── osa/
    │   │       │       ├── mem_pool.c
    │   │       │       ├── mem_pool_config.c
    │   │       │       ├── osa.c
    │   │       │       ├── osa_freertos.c
    │   │       │       ├── osa_freertos.h
    │   │       │       ├── slist.c
    │   │       │       └── stack_simple.c
    │   │       ├── wifi_bt_firmware/
    │   │       │   └── wlan_bt_fw.h
    │   │       ├── wifidriver/
    │   │       │   ├── incl/
    │   │       │   │   ├── mlan.h
    │   │       │   │   ├── mlan_11ac.h
    │   │       │   │   ├── mlan_11ax.h
    │   │       │   │   ├── mlan_11h.h
    │   │       │   │   ├── mlan_11k.h
    │   │       │   │   ├── mlan_11n.h
    │   │       │   │   ├── mlan_11n_aggr.h
    │   │       │   │   ├── mlan_11n_rxreorder.h
    │   │       │   │   ├── mlan_11v.h
    │   │       │   │   ├── mlan_action.h
    │   │       │   │   ├── mlan_api.h
    │   │       │   │   ├── mlan_decl.h
    │   │       │   │   ├── mlan_fw.h
    │   │       │   │   ├── mlan_ieee.h
    │   │       │   │   ├── mlan_init.h
    │   │       │   │   ├── mlan_ioctl.h
    │   │       │   │   ├── mlan_join.h
    │   │       │   │   ├── mlan_main.h
    │   │       │   │   ├── mlan_mbo.h
    │   │       │   │   ├── mlan_meas.h
    │   │       │   │   ├── mlan_remap_mem_operations.h
    │   │       │   │   ├── mlan_uap.h
    │   │       │   │   ├── mlan_util.h
    │   │       │   │   ├── mlan_wmm.h
    │   │       │   │   └── type_decls.h
    │   │       │   ├── mlan_11ac.c
    │   │       │   ├── mlan_11ax.c
    │   │       │   ├── mlan_11d.c
    │   │       │   ├── mlan_11h.c
    │   │       │   ├── mlan_11k.c
    │   │       │   ├── mlan_11n.c
    │   │       │   ├── mlan_11n_aggr.c
    │   │       │   ├── mlan_11n_rxreorder.c
    │   │       │   ├── mlan_11v.c
    │   │       │   ├── mlan_action.c
    │   │       │   ├── mlan_api.c
    │   │       │   ├── mlan_cfp.c
    │   │       │   ├── mlan_cmdevt.c
    │   │       │   ├── mlan_glue.c
    │   │       │   ├── mlan_init.c
    │   │       │   ├── mlan_join.c
    │   │       │   ├── mlan_mbo.c
    │   │       │   ├── mlan_misc.c
    │   │       │   ├── mlan_scan.c
    │   │       │   ├── mlan_shim.c
    │   │       │   ├── mlan_sta_cmd.c
    │   │       │   ├── mlan_sta_cmdresp.c
    │   │       │   ├── mlan_sta_event.c
    │   │       │   ├── mlan_sta_ioctl.c
    │   │       │   ├── mlan_sta_rx.c
    │   │       │   ├── mlan_txrx.c
    │   │       │   ├── mlan_uap_cmdevent.c
    │   │       │   ├── mlan_uap_ioctl.c
    │   │       │   ├── mlan_wmm.c
    │   │       │   ├── wifi-debug.c
    │   │       │   ├── wifi-debug.h
    │   │       │   ├── wifi-imu.c
    │   │       │   ├── wifi-imu.h
    │   │       │   ├── wifi-internal.h
    │   │       │   ├── wifi-mem.c
    │   │       │   ├── wifi-uap.c
    │   │       │   ├── wifi-wps.c
    │   │       │   ├── wifi.c
    │   │       │   ├── wifi_common.h
    │   │       │   ├── wifi_pwrmgr.c
    │   │       │   └── wpa_supp_if/
    │   │       │       ├── incl/
    │   │       │       │   ├── rtos_wpa_supp_if.h
    │   │       │       │   └── wifi_nxp_internal.h
    │   │       │       ├── rtos_wpa_supp_if.c
    │   │       │       ├── wifi_nxp.c
    │   │       │       └── wifi_nxp_internal.c
    │   │       └── wlcmgr/
    │   │           ├── wlan.c
    │   │           └── wlan_txpwrlimit_cfg.c
    │   ├── nxp-evkbimxrt1050-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-evkmimxrt1020-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-evkmimxrt1024-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-evkmimxrt1060-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-evkmimxrt1064-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-evkmimxrt1160-cm7-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-evkmimxrt1170-cm4-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-evkmimxrt1170-cm7-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-frdmk64f-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-frdmk66f-freertos/
    │   │   └── Makefile
    │   ├── nxp-frdmk66f-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-lpcxpresso54018-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-lpcxpresso54608-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-lpcxpresso54618-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-lpcxpresso54628-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-lpcxpresso54s018m-freertos/
    │   │   └── Makefile
    │   ├── nxp-mimxrt1020-freertos/
    │   │   └── Makefile
    │   ├── nxp-twrk65f180m-lwip-freertos/
    │   │   └── Makefile
    │   ├── nxp-twrkv58f220m-lwip-freertos/
    │   │   └── Makefile
    │   ├── rt1020-evk-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── link_ram.ld
    │   ├── rt1020-evk-make-freertos-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── link_ram.ld
    │   ├── rt1060-evk-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── link_ram.ld
    │   ├── rt1060-evk-make-freertos-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── link_ram.ld
    │   ├── rt1060-evk-xpresso-baremetal-builtin/
    │   │   ├── .cproject
    │   │   ├── .project
    │   │   ├── .settings/
    │   │   │   ├── language.settings.xml
    │   │   │   └── org.eclipse.core.resources.prefs
    │   │   ├── CMSIS/
    │   │   │   ├── cachel1_armv7.h
    │   │   │   ├── cmsis_compiler.h
    │   │   │   ├── cmsis_gcc.h
    │   │   │   ├── cmsis_version.h
    │   │   │   ├── core_cm7.h
    │   │   │   └── mpu_armv7.h
    │   │   ├── Debug/
    │   │   │   ├── board/
    │   │   │   │   ├── board.su
    │   │   │   │   ├── clock_config.su
    │   │   │   │   ├── dcd.su
    │   │   │   │   ├── peripherals.su
    │   │   │   │   ├── pin_mux.su
    │   │   │   │   └── subdir.mk
    │   │   │   ├── component/
    │   │   │   │   ├── lists/
    │   │   │   │   │   ├── fsl_component_generic_list.su
    │   │   │   │   │   └── subdir.mk
    │   │   │   │   ├── serial_manager/
    │   │   │   │   │   ├── fsl_component_serial_manager.su
    │   │   │   │   │   ├── fsl_component_serial_port_uart.su
    │   │   │   │   │   └── subdir.mk
    │   │   │   │   └── uart/
    │   │   │   │       ├── fsl_adapter_lpuart.su
    │   │   │   │       └── subdir.mk
    │   │   │   ├── device/
    │   │   │   │   ├── subdir.mk
    │   │   │   │   └── system_MIMXRT1062.su
    │   │   │   ├── drivers/
    │   │   │   │   ├── fsl_clock.su
    │   │   │   │   ├── fsl_common.su
    │   │   │   │   ├── fsl_common_arm.su
    │   │   │   │   ├── fsl_gpio.su
    │   │   │   │   ├── fsl_lpuart.su
    │   │   │   │   ├── fsl_trng.su
    │   │   │   │   └── subdir.mk
    │   │   │   ├── makefile
    │   │   │   ├── rt1060-evk-xpresso-baremetal-builtin_Debug.ld
    │   │   │   ├── rt1060-evk-xpresso-baremetal-builtin_Debug_library.ld
    │   │   │   ├── rt1060-evk-xpresso-baremetal-builtin_Debug_memory.ld
    │   │   │   ├── sources.mk
    │   │   │   ├── startup/
    │   │   │   │   ├── startup_mimxrt1062.su
    │   │   │   │   └── subdir.mk
    │   │   │   ├── utilities/
    │   │   │   │   ├── fsl_assert.su
    │   │   │   │   ├── fsl_debug_console.su
    │   │   │   │   ├── fsl_str.su
    │   │   │   │   └── subdir.mk
    │   │   │   └── xip/
    │   │   │       ├── evkbmimxrt1060_flexspi_nor_config.su
    │   │   │       ├── fsl_flexspi_nor_boot.su
    │   │   │       └── subdir.mk
    │   │   ├── Test/
    │   │   │   ├── board/
    │   │   │   │   ├── board.su
    │   │   │   │   ├── clock_config.su
    │   │   │   │   ├── dcd.su
    │   │   │   │   ├── peripherals.su
    │   │   │   │   ├── pin_mux.su
    │   │   │   │   └── subdir.mk
    │   │   │   ├── component/
    │   │   │   │   ├── lists/
    │   │   │   │   │   ├── fsl_component_generic_list.su
    │   │   │   │   │   └── subdir.mk
    │   │   │   │   ├── serial_manager/
    │   │   │   │   │   ├── fsl_component_serial_manager.su
    │   │   │   │   │   ├── fsl_component_serial_port_uart.su
    │   │   │   │   │   └── subdir.mk
    │   │   │   │   └── uart/
    │   │   │   │       ├── fsl_adapter_lpuart.su
    │   │   │   │       └── subdir.mk
    │   │   │   ├── device/
    │   │   │   │   ├── subdir.mk
    │   │   │   │   └── system_MIMXRT1062.su
    │   │   │   ├── drivers/
    │   │   │   │   ├── fsl_clock.su
    │   │   │   │   ├── fsl_common.su
    │   │   │   │   ├── fsl_common_arm.su
    │   │   │   │   ├── fsl_gpio.su
    │   │   │   │   ├── fsl_lpuart.su
    │   │   │   │   ├── fsl_trng.su
    │   │   │   │   └── subdir.mk
    │   │   │   ├── makefile
    │   │   │   ├── rt1060-evk-xpresso-baremetal-builtin_Debug.ld
    │   │   │   ├── rt1060-evk-xpresso-baremetal-builtin_Debug_library.ld
    │   │   │   ├── rt1060-evk-xpresso-baremetal-builtin_Debug_memory.ld
    │   │   │   ├── sources.mk
    │   │   │   ├── startup/
    │   │   │   │   ├── startup_mimxrt1062.su
    │   │   │   │   └── subdir.mk
    │   │   │   ├── utilities/
    │   │   │   │   ├── fsl_assert.su
    │   │   │   │   ├── fsl_debug_console.su
    │   │   │   │   ├── fsl_str.su
    │   │   │   │   └── subdir.mk
    │   │   │   └── xip/
    │   │   │       ├── evkbmimxrt1060_flexspi_nor_config.su
    │   │   │       ├── fsl_flexspi_nor_boot.su
    │   │   │       └── subdir.mk
    │   │   ├── board/
    │   │   │   ├── board.c
    │   │   │   ├── board.h
    │   │   │   ├── clock_config.c
    │   │   │   ├── clock_config.h
    │   │   │   ├── dcd.c
    │   │   │   ├── dcd.h
    │   │   │   ├── peripherals.c
    │   │   │   ├── peripherals.h
    │   │   │   ├── pin_mux.c
    │   │   │   └── pin_mux.h
    │   │   ├── component/
    │   │   │   ├── lists/
    │   │   │   │   ├── fsl_component_generic_list.c
    │   │   │   │   └── fsl_component_generic_list.h
    │   │   │   ├── serial_manager/
    │   │   │   │   ├── fsl_component_serial_manager.c
    │   │   │   │   ├── fsl_component_serial_manager.h
    │   │   │   │   ├── fsl_component_serial_port_internal.h
    │   │   │   │   ├── fsl_component_serial_port_uart.c
    │   │   │   │   └── fsl_component_serial_port_uart.h
    │   │   │   └── uart/
    │   │   │       ├── fsl_adapter_lpuart.c
    │   │   │       └── fsl_adapter_uart.h
    │   │   ├── device/
    │   │   │   ├── MIMXRT1062.h
    │   │   │   ├── MIMXRT1062_features.h
    │   │   │   ├── fsl_device_registers.h
    │   │   │   ├── system_MIMXRT1062.c
    │   │   │   └── system_MIMXRT1062.h
    │   │   ├── drivers/
    │   │   │   ├── fsl_clock.c
    │   │   │   ├── fsl_clock.h
    │   │   │   ├── fsl_common.c
    │   │   │   ├── fsl_common.h
    │   │   │   ├── fsl_common_arm.c
    │   │   │   ├── fsl_common_arm.h
    │   │   │   ├── fsl_gpio.c
    │   │   │   ├── fsl_gpio.h
    │   │   │   ├── fsl_iomuxc.h
    │   │   │   ├── fsl_lpuart.c
    │   │   │   ├── fsl_lpuart.h
    │   │   │   ├── fsl_nic301.h
    │   │   │   ├── fsl_trng.c
    │   │   │   └── fsl_trng.h
    │   │   ├── middleware/
    │   │   │   └── bm/
    │   │   │       └── readme.txt
    │   │   ├── rt1060-evk-xpresso-baremetal-builtin.mex
    │   │   ├── source/
    │   │   │   ├── hal.h
    │   │   │   ├── main.c
    │   │   │   ├── mongoose_config.h
    │   │   │   └── syscalls.c
    │   │   ├── startup/
    │   │   │   └── startup_mimxrt1062.c
    │   │   ├── utilities/
    │   │   │   ├── fsl_assert.c
    │   │   │   ├── fsl_debug_console.c
    │   │   │   ├── fsl_debug_console.h
    │   │   │   ├── fsl_debug_console_conf.h
    │   │   │   ├── fsl_str.c
    │   │   │   └── fsl_str.h
    │   │   └── xip/
    │   │       ├── evkbmimxrt1060_flexspi_nor_config.c
    │   │       ├── evkbmimxrt1060_flexspi_nor_config.h
    │   │       ├── fsl_flexspi_nor_boot.c
    │   │       └── fsl_flexspi_nor_boot.h
    │   ├── rt1170-evk-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── link_ram.ld
    │   │   └── mbedtls_config.h
    │   └── rt1170-evk-make-freertos-builtin/
    │       ├── Makefile
    │       ├── README.md
    │       └── link_ram.ld
    ├── pico-sdk/
    │   ├── pico-2-w-picosdk-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── pico-2-w-picosdk-baremetal-builtin-ap/
    │   │   ├── CMakeLists.txt
    │   │   ├── Makefile
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── pico_sdk_import.cmake
    │   ├── pico-2-w-picosdk-freertos-lwip/
    │   │   ├── CMakeLists.txt
    │   │   ├── FreeRTOSConfig.h
    │   │   ├── FreeRTOS_Kernel_import.cmake
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── lwipopts.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── pico_sdk_import.cmake
    │   ├── pico-rmii/
    │   │   ├── CMakeLists.txt
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── driver_rp2040_rmii.c
    │   │   ├── driver_rp2040_rmii.h
    │   │   ├── main.c
    │   │   └── mongoose_config.h
    │   ├── pico-rndis-dashboard/
    │   │   ├── CMakeLists.txt
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   ├── msc_disk.c
    │   │   ├── netif/
    │   │   │   └── ethernet.h
    │   │   ├── tusb_config.h
    │   │   └── usb_descriptors.c
    │   ├── pico-rndis-device/
    │   │   ├── CMakeLists.txt
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   ├── netif/
    │   │   │   └── ethernet.h
    │   │   ├── tusb_config.h
    │   │   └── usb_descriptors.c
    │   ├── pico-w-picosdk-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── pico-w-picosdk-freertos-lwip/
    │   │   ├── CMakeLists.txt
    │   │   ├── FreeRTOSConfig.h
    │   │   ├── FreeRTOS_Kernel_import.cmake
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── lwipopts.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── pico_sdk_import.cmake
    │   ├── rm2-pico-picosdk-baremetal-builtin/
    │   │   ├── CMakeLists.txt
    │   │   ├── Makefile
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── pico_sdk_import.cmake
    │   ├── w5500-evb-pico-picosdk-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── w5500-evb-pico2-picosdk-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   └── w55rp20-evb-pico-picosdk-baremetal-builtin/
    │       ├── CMakeLists.txt
    │       ├── Makefile
    │       ├── hal.h
    │       ├── main.c
    │       ├── mongoose_config.h
    │       └── pico_sdk_import.cmake
    ├── renesas/
    │   └── ek-ra6m4-make-baremetal-builtin/
    │       ├── Makefile
    │       ├── hal.c
    │       ├── hal.h
    │       ├── link.ld
    │       ├── main.c
    │       └── mongoose_config.h
    ├── smtp/
    │   ├── README.md
    │   └── smtp-client/
    │       ├── Makefile
    │       ├── README.md
    │       └── main.c
    ├── stm32/
    │   ├── nucleo-f429zi-cube-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── nucleo-f429zi-cube-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── nucleo-f429zi-cube-freertos-lwip/
    │   │   ├── .cproject
    │   │   ├── .mxproject
    │   │   ├── .project
    │   │   ├── .settings/
    │   │   │   ├── com.st.stm32cube.ide.mcu.sfrview.prefs
    │   │   │   ├── language.settings.xml
    │   │   │   ├── org.eclipse.cdt.core.prefs
    │   │   │   └── stm32cubeide.project.prefs
    │   │   ├── Core/
    │   │   │   ├── Inc/
    │   │   │   │   ├── FreeRTOSConfig.h
    │   │   │   │   ├── hal.h
    │   │   │   │   ├── main.h
    │   │   │   │   ├── mongoose_config.h
    │   │   │   │   ├── stm32f4xx_hal_conf.h
    │   │   │   │   └── stm32f4xx_it.h
    │   │   │   ├── Src/
    │   │   │   │   ├── freertos.c
    │   │   │   │   ├── main.c
    │   │   │   │   ├── stm32f4xx_hal_msp.c
    │   │   │   │   ├── stm32f4xx_hal_timebase_tim.c
    │   │   │   │   ├── stm32f4xx_it.c
    │   │   │   │   ├── syscalls.c
    │   │   │   │   ├── sysmem.c
    │   │   │   │   └── system_stm32f4xx.c
    │   │   │   └── Startup/
    │   │   │       └── startup_stm32f429zitx.s
    │   │   ├── Drivers/
    │   │   │   ├── BSP/
    │   │   │   │   └── Components/
    │   │   │   │       └── lan8742/
    │   │   │   │           ├── lan8742.c
    │   │   │   │           └── lan8742.h
    │   │   │   ├── CMSIS/
    │   │   │   │   ├── Device/
    │   │   │   │   │   └── ST/
    │   │   │   │   │       └── STM32F4xx/
    │   │   │   │   │           ├── Include/
    │   │   │   │   │           │   ├── stm32f429xx.h
    │   │   │   │   │           │   ├── stm32f4xx.h
    │   │   │   │   │           │   └── system_stm32f4xx.h
    │   │   │   │   │           └── LICENSE.txt
    │   │   │   │   ├── Include/
    │   │   │   │   │   ├── cmsis_armcc.h
    │   │   │   │   │   ├── cmsis_armclang.h
    │   │   │   │   │   ├── cmsis_compiler.h
    │   │   │   │   │   ├── cmsis_gcc.h
    │   │   │   │   │   ├── cmsis_iccarm.h
    │   │   │   │   │   ├── cmsis_version.h
    │   │   │   │   │   ├── core_armv8mbl.h
    │   │   │   │   │   ├── core_armv8mml.h
    │   │   │   │   │   ├── core_cm0.h
    │   │   │   │   │   ├── core_cm0plus.h
    │   │   │   │   │   ├── core_cm1.h
    │   │   │   │   │   ├── core_cm23.h
    │   │   │   │   │   ├── core_cm3.h
    │   │   │   │   │   ├── core_cm33.h
    │   │   │   │   │   ├── core_cm4.h
    │   │   │   │   │   ├── core_cm7.h
    │   │   │   │   │   ├── core_sc000.h
    │   │   │   │   │   ├── core_sc300.h
    │   │   │   │   │   ├── mpu_armv7.h
    │   │   │   │   │   ├── mpu_armv8.h
    │   │   │   │   │   └── tz_context.h
    │   │   │   │   └── LICENSE.txt
    │   │   │   └── STM32F4xx_HAL_Driver/
    │   │   │       ├── Inc/
    │   │   │       │   ├── Legacy/
    │   │   │       │   │   └── stm32_hal_legacy.h
    │   │   │       │   ├── stm32f4xx_hal.h
    │   │   │       │   ├── stm32f4xx_hal_cortex.h
    │   │   │       │   ├── stm32f4xx_hal_def.h
    │   │   │       │   ├── stm32f4xx_hal_dma.h
    │   │   │       │   ├── stm32f4xx_hal_dma_ex.h
    │   │   │       │   ├── stm32f4xx_hal_eth.h
    │   │   │       │   ├── stm32f4xx_hal_exti.h
    │   │   │       │   ├── stm32f4xx_hal_flash.h
    │   │   │       │   ├── stm32f4xx_hal_flash_ex.h
    │   │   │       │   ├── stm32f4xx_hal_flash_ramfunc.h
    │   │   │       │   ├── stm32f4xx_hal_gpio.h
    │   │   │       │   ├── stm32f4xx_hal_gpio_ex.h
    │   │   │       │   ├── stm32f4xx_hal_pwr.h
    │   │   │       │   ├── stm32f4xx_hal_pwr_ex.h
    │   │   │       │   ├── stm32f4xx_hal_rcc.h
    │   │   │       │   ├── stm32f4xx_hal_rcc_ex.h
    │   │   │       │   ├── stm32f4xx_hal_rng.h
    │   │   │       │   ├── stm32f4xx_hal_tim.h
    │   │   │       │   ├── stm32f4xx_hal_tim_ex.h
    │   │   │       │   ├── stm32f4xx_hal_uart.h
    │   │   │       │   ├── stm32f4xx_ll_bus.h
    │   │   │       │   ├── stm32f4xx_ll_cortex.h
    │   │   │       │   ├── stm32f4xx_ll_dma.h
    │   │   │       │   ├── stm32f4xx_ll_exti.h
    │   │   │       │   ├── stm32f4xx_ll_gpio.h
    │   │   │       │   ├── stm32f4xx_ll_pwr.h
    │   │   │       │   ├── stm32f4xx_ll_rcc.h
    │   │   │       │   ├── stm32f4xx_ll_rng.h
    │   │   │       │   ├── stm32f4xx_ll_system.h
    │   │   │       │   ├── stm32f4xx_ll_usart.h
    │   │   │       │   └── stm32f4xx_ll_utils.h
    │   │   │       ├── LICENSE.txt
    │   │   │       └── Src/
    │   │   │           ├── stm32f4xx_hal.c
    │   │   │           ├── stm32f4xx_hal_cortex.c
    │   │   │           ├── stm32f4xx_hal_dma.c
    │   │   │           ├── stm32f4xx_hal_dma_ex.c
    │   │   │           ├── stm32f4xx_hal_eth.c
    │   │   │           ├── stm32f4xx_hal_exti.c
    │   │   │           ├── stm32f4xx_hal_flash.c
    │   │   │           ├── stm32f4xx_hal_flash_ex.c
    │   │   │           ├── stm32f4xx_hal_flash_ramfunc.c
    │   │   │           ├── stm32f4xx_hal_gpio.c
    │   │   │           ├── stm32f4xx_hal_pwr.c
    │   │   │           ├── stm32f4xx_hal_pwr_ex.c
    │   │   │           ├── stm32f4xx_hal_rcc.c
    │   │   │           ├── stm32f4xx_hal_rcc_ex.c
    │   │   │           ├── stm32f4xx_hal_rng.c
    │   │   │           ├── stm32f4xx_hal_tim.c
    │   │   │           ├── stm32f4xx_hal_tim_ex.c
    │   │   │           └── stm32f4xx_hal_uart.c
    │   │   ├── LWIP/
    │   │   │   ├── App/
    │   │   │   │   ├── lwip.c
    │   │   │   │   └── lwip.h
    │   │   │   └── Target/
    │   │   │       ├── ethernetif.c
    │   │   │       ├── ethernetif.h
    │   │   │       └── lwipopts.h
    │   │   ├── Middlewares/
    │   │   │   └── Third_Party/
    │   │   │       ├── FreeRTOS/
    │   │   │       │   └── Source/
    │   │   │       │       ├── CMSIS_RTOS/
    │   │   │       │       │   ├── cmsis_os.c
    │   │   │       │       │   └── cmsis_os.h
    │   │   │       │       ├── LICENSE
    │   │   │       │       ├── croutine.c
    │   │   │       │       ├── event_groups.c
    │   │   │       │       ├── include/
    │   │   │       │       │   ├── FreeRTOS.h
    │   │   │       │       │   ├── StackMacros.h
    │   │   │       │       │   ├── atomic.h
    │   │   │       │       │   ├── croutine.h
    │   │   │       │       │   ├── deprecated_definitions.h
    │   │   │       │       │   ├── event_groups.h
    │   │   │       │       │   ├── list.h
    │   │   │       │       │   ├── message_buffer.h
    │   │   │       │       │   ├── mpu_prototypes.h
    │   │   │       │       │   ├── mpu_wrappers.h
    │   │   │       │       │   ├── portable.h
    │   │   │       │       │   ├── projdefs.h
    │   │   │       │       │   ├── queue.h
    │   │   │       │       │   ├── semphr.h
    │   │   │       │       │   ├── stack_macros.h
    │   │   │       │       │   ├── stream_buffer.h
    │   │   │       │       │   ├── task.h
    │   │   │       │       │   └── timers.h
    │   │   │       │       ├── list.c
    │   │   │       │       ├── portable/
    │   │   │       │       │   ├── GCC/
    │   │   │       │       │   │   └── ARM_CM4F/
    │   │   │       │       │   │       ├── port.c
    │   │   │       │       │   │       └── portmacro.h
    │   │   │       │       │   └── MemMang/
    │   │   │       │       │       └── heap_4.c
    │   │   │       │       ├── queue.c
    │   │   │       │       ├── stream_buffer.c
    │   │   │       │       ├── tasks.c
    │   │   │       │       └── timers.c
    │   │   │       └── LwIP/
    │   │   │           ├── src/
    │   │   │           │   ├── api/
    │   │   │           │   │   ├── api_lib.c
    │   │   │           │   │   ├── api_msg.c
    │   │   │           │   │   ├── err.c
    │   │   │           │   │   ├── if_api.c
    │   │   │           │   │   ├── netbuf.c
    │   │   │           │   │   ├── netdb.c
    │   │   │           │   │   ├── netifapi.c
    │   │   │           │   │   ├── sockets.c
    │   │   │           │   │   └── tcpip.c
    │   │   │           │   ├── apps/
    │   │   │           │   │   └── mqtt/
    │   │   │           │   │       └── mqtt.c
    │   │   │           │   ├── core/
    │   │   │           │   │   ├── altcp.c
    │   │   │           │   │   ├── altcp_alloc.c
    │   │   │           │   │   ├── altcp_tcp.c
    │   │   │           │   │   ├── def.c
    │   │   │           │   │   ├── dns.c
    │   │   │           │   │   ├── inet_chksum.c
    │   │   │           │   │   ├── init.c
    │   │   │           │   │   ├── ip.c
    │   │   │           │   │   ├── ipv4/
    │   │   │           │   │   │   ├── autoip.c
    │   │   │           │   │   │   ├── dhcp.c
    │   │   │           │   │   │   ├── etharp.c
    │   │   │           │   │   │   ├── icmp.c
    │   │   │           │   │   │   ├── igmp.c
    │   │   │           │   │   │   ├── ip4.c
    │   │   │           │   │   │   ├── ip4_addr.c
    │   │   │           │   │   │   └── ip4_frag.c
    │   │   │           │   │   ├── ipv6/
    │   │   │           │   │   │   ├── dhcp6.c
    │   │   │           │   │   │   ├── ethip6.c
    │   │   │           │   │   │   ├── icmp6.c
    │   │   │           │   │   │   ├── inet6.c
    │   │   │           │   │   │   ├── ip6.c
    │   │   │           │   │   │   ├── ip6_addr.c
    │   │   │           │   │   │   ├── ip6_frag.c
    │   │   │           │   │   │   ├── mld6.c
    │   │   │           │   │   │   └── nd6.c
    │   │   │           │   │   ├── mem.c
    │   │   │           │   │   ├── memp.c
    │   │   │           │   │   ├── netif.c
    │   │   │           │   │   ├── pbuf.c
    │   │   │           │   │   ├── raw.c
    │   │   │           │   │   ├── stats.c
    │   │   │           │   │   ├── sys.c
    │   │   │           │   │   ├── tcp.c
    │   │   │           │   │   ├── tcp_in.c
    │   │   │           │   │   ├── tcp_out.c
    │   │   │           │   │   ├── timeouts.c
    │   │   │           │   │   └── udp.c
    │   │   │           │   ├── include/
    │   │   │           │   │   ├── compat/
    │   │   │           │   │   │   ├── posix/
    │   │   │           │   │   │   │   ├── arpa/
    │   │   │           │   │   │   │   │   └── inet.h
    │   │   │           │   │   │   │   ├── net/
    │   │   │           │   │   │   │   │   └── if.h
    │   │   │           │   │   │   │   ├── netdb.h
    │   │   │           │   │   │   │   └── sys/
    │   │   │           │   │   │   │       └── socket.h
    │   │   │           │   │   │   └── stdc/
    │   │   │           │   │   │       └── errno.h
    │   │   │           │   │   ├── lwip/
    │   │   │           │   │   │   ├── altcp.h
    │   │   │           │   │   │   ├── altcp_tcp.h
    │   │   │           │   │   │   ├── altcp_tls.h
    │   │   │           │   │   │   ├── api.h
    │   │   │           │   │   │   ├── apps/
    │   │   │           │   │   │   │   ├── altcp_proxyconnect.h
    │   │   │           │   │   │   │   ├── altcp_tls_mbedtls_opts.h
    │   │   │           │   │   │   │   ├── fs.h
    │   │   │           │   │   │   │   ├── http_client.h
    │   │   │           │   │   │   │   ├── httpd.h
    │   │   │           │   │   │   │   ├── httpd_opts.h
    │   │   │           │   │   │   │   ├── lwiperf.h
    │   │   │           │   │   │   │   ├── mdns.h
    │   │   │           │   │   │   │   ├── mdns_opts.h
    │   │   │           │   │   │   │   ├── mdns_priv.h
    │   │   │           │   │   │   │   ├── mqtt.h
    │   │   │           │   │   │   │   ├── mqtt_opts.h
    │   │   │           │   │   │   │   ├── mqtt_priv.h
    │   │   │           │   │   │   │   ├── netbiosns.h
    │   │   │           │   │   │   │   ├── netbiosns_opts.h
    │   │   │           │   │   │   │   ├── smtp.h
    │   │   │           │   │   │   │   ├── smtp_opts.h
    │   │   │           │   │   │   │   ├── snmp.h
    │   │   │           │   │   │   │   ├── snmp_core.h
    │   │   │           │   │   │   │   ├── snmp_mib2.h
    │   │   │           │   │   │   │   ├── snmp_opts.h
    │   │   │           │   │   │   │   ├── snmp_scalar.h
    │   │   │           │   │   │   │   ├── snmp_snmpv2_framework.h
    │   │   │           │   │   │   │   ├── snmp_snmpv2_usm.h
    │   │   │           │   │   │   │   ├── snmp_table.h
    │   │   │           │   │   │   │   ├── snmp_threadsync.h
    │   │   │           │   │   │   │   ├── snmpv3.h
    │   │   │           │   │   │   │   ├── sntp.h
    │   │   │           │   │   │   │   ├── sntp_opts.h
    │   │   │           │   │   │   │   ├── tftp_opts.h
    │   │   │           │   │   │   │   └── tftp_server.h
    │   │   │           │   │   │   ├── arch.h
    │   │   │           │   │   │   ├── autoip.h
    │   │   │           │   │   │   ├── debug.h
    │   │   │           │   │   │   ├── def.h
    │   │   │           │   │   │   ├── dhcp.h
    │   │   │           │   │   │   ├── dhcp6.h
    │   │   │           │   │   │   ├── dns.h
    │   │   │           │   │   │   ├── err.h
    │   │   │           │   │   │   ├── errno.h
    │   │   │           │   │   │   ├── etharp.h
    │   │   │           │   │   │   ├── ethip6.h
    │   │   │           │   │   │   ├── icmp.h
    │   │   │           │   │   │   ├── icmp6.h
    │   │   │           │   │   │   ├── if_api.h
    │   │   │           │   │   │   ├── igmp.h
    │   │   │           │   │   │   ├── inet.h
    │   │   │           │   │   │   ├── inet_chksum.h
    │   │   │           │   │   │   ├── init.h
    │   │   │           │   │   │   ├── ip.h
    │   │   │           │   │   │   ├── ip4.h
    │   │   │           │   │   │   ├── ip4_addr.h
    │   │   │           │   │   │   ├── ip4_frag.h
    │   │   │           │   │   │   ├── ip6.h
    │   │   │           │   │   │   ├── ip6_addr.h
    │   │   │           │   │   │   ├── ip6_frag.h
    │   │   │           │   │   │   ├── ip6_zone.h
    │   │   │           │   │   │   ├── ip_addr.h
    │   │   │           │   │   │   ├── mem.h
    │   │   │           │   │   │   ├── memp.h
    │   │   │           │   │   │   ├── mld6.h
    │   │   │           │   │   │   ├── nd6.h
    │   │   │           │   │   │   ├── netbuf.h
    │   │   │           │   │   │   ├── netdb.h
    │   │   │           │   │   │   ├── netif.h
    │   │   │           │   │   │   ├── netifapi.h
    │   │   │           │   │   │   ├── opt.h
    │   │   │           │   │   │   ├── pbuf.h
    │   │   │           │   │   │   ├── priv/
    │   │   │           │   │   │   │   ├── altcp_priv.h
    │   │   │           │   │   │   │   ├── api_msg.h
    │   │   │           │   │   │   │   ├── mem_priv.h
    │   │   │           │   │   │   │   ├── memp_priv.h
    │   │   │           │   │   │   │   ├── memp_std.h
    │   │   │           │   │   │   │   ├── nd6_priv.h
    │   │   │           │   │   │   │   ├── raw_priv.h
    │   │   │           │   │   │   │   ├── sockets_priv.h
    │   │   │           │   │   │   │   ├── tcp_priv.h
    │   │   │           │   │   │   │   └── tcpip_priv.h
    │   │   │           │   │   │   ├── prot/
    │   │   │           │   │   │   │   ├── autoip.h
    │   │   │           │   │   │   │   ├── dhcp.h
    │   │   │           │   │   │   │   ├── dhcp6.h
    │   │   │           │   │   │   │   ├── dns.h
    │   │   │           │   │   │   │   ├── etharp.h
    │   │   │           │   │   │   │   ├── ethernet.h
    │   │   │           │   │   │   │   ├── iana.h
    │   │   │           │   │   │   │   ├── icmp.h
    │   │   │           │   │   │   │   ├── icmp6.h
    │   │   │           │   │   │   │   ├── ieee.h
    │   │   │           │   │   │   │   ├── igmp.h
    │   │   │           │   │   │   │   ├── ip.h
    │   │   │           │   │   │   │   ├── ip4.h
    │   │   │           │   │   │   │   ├── ip6.h
    │   │   │           │   │   │   │   ├── mld6.h
    │   │   │           │   │   │   │   ├── nd6.h
    │   │   │           │   │   │   │   ├── tcp.h
    │   │   │           │   │   │   │   └── udp.h
    │   │   │           │   │   │   ├── raw.h
    │   │   │           │   │   │   ├── sio.h
    │   │   │           │   │   │   ├── snmp.h
    │   │   │           │   │   │   ├── sockets.h
    │   │   │           │   │   │   ├── stats.h
    │   │   │           │   │   │   ├── sys.h
    │   │   │           │   │   │   ├── tcp.h
    │   │   │           │   │   │   ├── tcpbase.h
    │   │   │           │   │   │   ├── tcpip.h
    │   │   │           │   │   │   ├── timeouts.h
    │   │   │           │   │   │   └── udp.h
    │   │   │           │   │   └── netif/
    │   │   │           │   │       ├── bridgeif.h
    │   │   │           │   │       ├── bridgeif_opts.h
    │   │   │           │   │       ├── etharp.h
    │   │   │           │   │       ├── ethernet.h
    │   │   │           │   │       ├── ieee802154.h
    │   │   │           │   │       ├── lowpan6.h
    │   │   │           │   │       ├── lowpan6_ble.h
    │   │   │           │   │       ├── lowpan6_common.h
    │   │   │           │   │       ├── lowpan6_opts.h
    │   │   │           │   │       ├── ppp/
    │   │   │           │   │       │   ├── ccp.h
    │   │   │           │   │       │   ├── chap-md5.h
    │   │   │           │   │       │   ├── chap-new.h
    │   │   │           │   │       │   ├── chap_ms.h
    │   │   │           │   │       │   ├── eap.h
    │   │   │           │   │       │   ├── ecp.h
    │   │   │           │   │       │   ├── eui64.h
    │   │   │           │   │       │   ├── fsm.h
    │   │   │           │   │       │   ├── ipcp.h
    │   │   │           │   │       │   ├── ipv6cp.h
    │   │   │           │   │       │   ├── lcp.h
    │   │   │           │   │       │   ├── magic.h
    │   │   │           │   │       │   ├── mppe.h
    │   │   │           │   │       │   ├── ppp.h
    │   │   │           │   │       │   ├── ppp_impl.h
    │   │   │           │   │       │   ├── ppp_opts.h
    │   │   │           │   │       │   ├── pppapi.h
    │   │   │           │   │       │   ├── pppcrypt.h
    │   │   │           │   │       │   ├── pppdebug.h
    │   │   │           │   │       │   ├── pppoe.h
    │   │   │           │   │       │   ├── pppol2tp.h
    │   │   │           │   │       │   ├── pppos.h
    │   │   │           │   │       │   ├── upap.h
    │   │   │           │   │       │   └── vj.h
    │   │   │           │   │       ├── slipif.h
    │   │   │           │   │       └── zepif.h
    │   │   │           │   └── netif/
    │   │   │           │       ├── bridgeif.c
    │   │   │           │       ├── bridgeif_fdb.c
    │   │   │           │       ├── ethernet.c
    │   │   │           │       ├── lowpan6.c
    │   │   │           │       ├── lowpan6_ble.c
    │   │   │           │       ├── lowpan6_common.c
    │   │   │           │       ├── ppp/
    │   │   │           │       │   ├── auth.c
    │   │   │           │       │   ├── ccp.c
    │   │   │           │       │   ├── chap-md5.c
    │   │   │           │       │   ├── chap-new.c
    │   │   │           │       │   ├── chap_ms.c
    │   │   │           │       │   ├── demand.c
    │   │   │           │       │   ├── eap.c
    │   │   │           │       │   ├── ecp.c
    │   │   │           │       │   ├── eui64.c
    │   │   │           │       │   ├── fsm.c
    │   │   │           │       │   ├── ipcp.c
    │   │   │           │       │   ├── ipv6cp.c
    │   │   │           │       │   ├── lcp.c
    │   │   │           │       │   ├── magic.c
    │   │   │           │       │   ├── mppe.c
    │   │   │           │       │   ├── multilink.c
    │   │   │           │       │   ├── ppp.c
    │   │   │           │       │   ├── pppapi.c
    │   │   │           │       │   ├── pppcrypt.c
    │   │   │           │       │   ├── pppoe.c
    │   │   │           │       │   ├── pppol2tp.c
    │   │   │           │       │   ├── pppos.c
    │   │   │           │       │   ├── upap.c
    │   │   │           │       │   ├── utils.c
    │   │   │           │       │   └── vj.c
    │   │   │           │       ├── slipif.c
    │   │   │           │       └── zepif.c
    │   │   │           └── system/
    │   │   │               ├── OS/
    │   │   │               │   └── sys_arch.c
    │   │   │               └── arch/
    │   │   │                   ├── bpstruct.h
    │   │   │                   ├── cc.h
    │   │   │                   ├── cpu.h
    │   │   │                   ├── epstruct.h
    │   │   │                   ├── init.h
    │   │   │                   ├── lib.h
    │   │   │                   ├── perf.h
    │   │   │                   └── sys_arch.h
    │   │   ├── README.md
    │   │   ├── STM32F429ZITX_FLASH.ld
    │   │   ├── STM32F429ZITX_RAM.ld
    │   │   ├── nucleo-f429zi-cube-freertos-lwip.ioc
    │   │   └── nucleo-f429zi-cube-freertos-lwip.launch
    │   ├── nucleo-f429zi-keil-baremetal/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F429ZITx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f4xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f4xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f4xx_hal_msp.c
    │   │   │   │   │   │       └── stm32f4xx_it.c
    │   │   │   │   │   ├── startup_stm32f429xx.s
    │   │   │   │   │   └── system_stm32f4xx.c
    │   │   │   │   └── project.script
    │   │   │   ├── _Target_1/
    │   │   │   │   ├── Pre_Include_Global.h
    │   │   │   │   └── RTE_Components.h
    │   │   │   └── _Test/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f429zi-keil-freertos/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F429ZITx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f4xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f4xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f4xx_hal_msp.c
    │   │   │   │   │   │       └── stm32f4xx_it.c
    │   │   │   │   │   ├── startup_stm32f429xx.s
    │   │   │   │   │   └── system_stm32f4xx.c
    │   │   │   │   └── project.script
    │   │   │   ├── RTOS/
    │   │   │   │   └── FreeRTOSConfig.h
    │   │   │   ├── _Target_1/
    │   │   │   │   ├── Pre_Include_Global.h
    │   │   │   │   └── RTE_Components.h
    │   │   │   └── _Test/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f429zi-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── nucleo-f429zi-make-baremetal-builtin-rndis/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── hal.h
    │   │   ├── link.ld
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   ├── netif/
    │   │   │   └── ethernet.h
    │   │   ├── syscalls.c
    │   │   ├── sysinit.c
    │   │   ├── tusb_config.h
    │   │   └── usb_descriptors.c
    │   ├── nucleo-f429zi-make-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── nucleo-f746zg-cube-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── nucleo-f746zg-cube-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── nucleo-f746zg-cube-freertos-lwip/
    │   │   ├── .cproject
    │   │   ├── .mxproject
    │   │   ├── .project
    │   │   ├── .settings/
    │   │   │   ├── com.st.stm32cube.ide.mcu.sfrview.prefs
    │   │   │   ├── language.settings.xml
    │   │   │   └── stm32cubeide.project.prefs
    │   │   ├── Core/
    │   │   │   ├── Inc/
    │   │   │   │   ├── FreeRTOSConfig.h
    │   │   │   │   ├── hal.h
    │   │   │   │   ├── main.h
    │   │   │   │   ├── mongoose_config.h
    │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   └── stm32f7xx_it.h
    │   │   │   ├── Src/
    │   │   │   │   ├── freertos.c
    │   │   │   │   ├── main.c
    │   │   │   │   ├── stm32f7xx_hal_msp.c
    │   │   │   │   ├── stm32f7xx_hal_timebase_tim.c
    │   │   │   │   ├── stm32f7xx_it.c
    │   │   │   │   ├── syscalls.c
    │   │   │   │   ├── sysmem.c
    │   │   │   │   └── system_stm32f7xx.c
    │   │   │   └── Startup/
    │   │   │       └── startup_stm32f746zgtx.s
    │   │   ├── Drivers/
    │   │   │   ├── BSP/
    │   │   │   │   └── Components/
    │   │   │   │       └── lan8742/
    │   │   │   │           ├── lan8742.c
    │   │   │   │           └── lan8742.h
    │   │   │   ├── CMSIS/
    │   │   │   │   ├── Device/
    │   │   │   │   │   └── ST/
    │   │   │   │   │       └── STM32F7xx/
    │   │   │   │   │           ├── Include/
    │   │   │   │   │           │   ├── stm32f746xx.h
    │   │   │   │   │           │   ├── stm32f7xx.h
    │   │   │   │   │           │   └── system_stm32f7xx.h
    │   │   │   │   │           └── LICENSE.txt
    │   │   │   │   ├── Include/
    │   │   │   │   │   ├── cmsis_armcc.h
    │   │   │   │   │   ├── cmsis_armclang.h
    │   │   │   │   │   ├── cmsis_compiler.h
    │   │   │   │   │   ├── cmsis_gcc.h
    │   │   │   │   │   ├── cmsis_iccarm.h
    │   │   │   │   │   ├── cmsis_version.h
    │   │   │   │   │   ├── core_armv8mbl.h
    │   │   │   │   │   ├── core_armv8mml.h
    │   │   │   │   │   ├── core_cm0.h
    │   │   │   │   │   ├── core_cm0plus.h
    │   │   │   │   │   ├── core_cm1.h
    │   │   │   │   │   ├── core_cm23.h
    │   │   │   │   │   ├── core_cm3.h
    │   │   │   │   │   ├── core_cm33.h
    │   │   │   │   │   ├── core_cm4.h
    │   │   │   │   │   ├── core_cm7.h
    │   │   │   │   │   ├── core_sc000.h
    │   │   │   │   │   ├── core_sc300.h
    │   │   │   │   │   ├── mpu_armv7.h
    │   │   │   │   │   ├── mpu_armv8.h
    │   │   │   │   │   └── tz_context.h
    │   │   │   │   └── LICENSE.txt
    │   │   │   └── STM32F7xx_HAL_Driver/
    │   │   │       ├── Inc/
    │   │   │       │   ├── Legacy/
    │   │   │       │   │   └── stm32_hal_legacy.h
    │   │   │       │   ├── stm32f7xx_hal.h
    │   │   │       │   ├── stm32f7xx_hal_cortex.h
    │   │   │       │   ├── stm32f7xx_hal_def.h
    │   │   │       │   ├── stm32f7xx_hal_dma.h
    │   │   │       │   ├── stm32f7xx_hal_dma_ex.h
    │   │   │       │   ├── stm32f7xx_hal_eth.h
    │   │   │       │   ├── stm32f7xx_hal_exti.h
    │   │   │       │   ├── stm32f7xx_hal_flash.h
    │   │   │       │   ├── stm32f7xx_hal_flash_ex.h
    │   │   │       │   ├── stm32f7xx_hal_gpio.h
    │   │   │       │   ├── stm32f7xx_hal_gpio_ex.h
    │   │   │       │   ├── stm32f7xx_hal_i2c.h
    │   │   │       │   ├── stm32f7xx_hal_i2c_ex.h
    │   │   │       │   ├── stm32f7xx_hal_pwr.h
    │   │   │       │   ├── stm32f7xx_hal_pwr_ex.h
    │   │   │       │   ├── stm32f7xx_hal_rcc.h
    │   │   │       │   ├── stm32f7xx_hal_rcc_ex.h
    │   │   │       │   ├── stm32f7xx_hal_rng.h
    │   │   │       │   ├── stm32f7xx_hal_tim.h
    │   │   │       │   ├── stm32f7xx_hal_tim_ex.h
    │   │   │       │   ├── stm32f7xx_hal_uart.h
    │   │   │       │   ├── stm32f7xx_hal_uart_ex.h
    │   │   │       │   ├── stm32f7xx_ll_bus.h
    │   │   │       │   ├── stm32f7xx_ll_cortex.h
    │   │   │       │   ├── stm32f7xx_ll_dma.h
    │   │   │       │   ├── stm32f7xx_ll_exti.h
    │   │   │       │   ├── stm32f7xx_ll_gpio.h
    │   │   │       │   ├── stm32f7xx_ll_pwr.h
    │   │   │       │   ├── stm32f7xx_ll_rcc.h
    │   │   │       │   ├── stm32f7xx_ll_rng.h
    │   │   │       │   ├── stm32f7xx_ll_system.h
    │   │   │       │   ├── stm32f7xx_ll_usart.h
    │   │   │       │   └── stm32f7xx_ll_utils.h
    │   │   │       ├── LICENSE.txt
    │   │   │       └── Src/
    │   │   │           ├── stm32f7xx_hal.c
    │   │   │           ├── stm32f7xx_hal_cortex.c
    │   │   │           ├── stm32f7xx_hal_dma.c
    │   │   │           ├── stm32f7xx_hal_dma_ex.c
    │   │   │           ├── stm32f7xx_hal_eth.c
    │   │   │           ├── stm32f7xx_hal_exti.c
    │   │   │           ├── stm32f7xx_hal_flash.c
    │   │   │           ├── stm32f7xx_hal_flash_ex.c
    │   │   │           ├── stm32f7xx_hal_gpio.c
    │   │   │           ├── stm32f7xx_hal_i2c.c
    │   │   │           ├── stm32f7xx_hal_i2c_ex.c
    │   │   │           ├── stm32f7xx_hal_pwr.c
    │   │   │           ├── stm32f7xx_hal_pwr_ex.c
    │   │   │           ├── stm32f7xx_hal_rcc.c
    │   │   │           ├── stm32f7xx_hal_rcc_ex.c
    │   │   │           ├── stm32f7xx_hal_rng.c
    │   │   │           ├── stm32f7xx_hal_tim.c
    │   │   │           ├── stm32f7xx_hal_tim_ex.c
    │   │   │           ├── stm32f7xx_hal_uart.c
    │   │   │           └── stm32f7xx_hal_uart_ex.c
    │   │   ├── LWIP/
    │   │   │   ├── App/
    │   │   │   │   ├── lwip.c
    │   │   │   │   └── lwip.h
    │   │   │   └── Target/
    │   │   │       ├── ethernetif.c
    │   │   │       ├── ethernetif.h
    │   │   │       └── lwipopts.h
    │   │   ├── Middlewares/
    │   │   │   └── Third_Party/
    │   │   │       ├── FreeRTOS/
    │   │   │       │   └── Source/
    │   │   │       │       ├── CMSIS_RTOS/
    │   │   │       │       │   ├── cmsis_os.c
    │   │   │       │       │   └── cmsis_os.h
    │   │   │       │       ├── croutine.c
    │   │   │       │       ├── event_groups.c
    │   │   │       │       ├── include/
    │   │   │       │       │   ├── FreeRTOS.h
    │   │   │       │       │   ├── StackMacros.h
    │   │   │       │       │   ├── croutine.h
    │   │   │       │       │   ├── deprecated_definitions.h
    │   │   │       │       │   ├── event_groups.h
    │   │   │       │       │   ├── list.h
    │   │   │       │       │   ├── message_buffer.h
    │   │   │       │       │   ├── mpu_prototypes.h
    │   │   │       │       │   ├── mpu_wrappers.h
    │   │   │       │       │   ├── portable.h
    │   │   │       │       │   ├── projdefs.h
    │   │   │       │       │   ├── queue.h
    │   │   │       │       │   ├── semphr.h
    │   │   │       │       │   ├── stack_macros.h
    │   │   │       │       │   ├── stream_buffer.h
    │   │   │       │       │   ├── task.h
    │   │   │       │       │   └── timers.h
    │   │   │       │       ├── list.c
    │   │   │       │       ├── portable/
    │   │   │       │       │   ├── GCC/
    │   │   │       │       │   │   └── ARM_CM7/
    │   │   │       │       │   │       └── r0p1/
    │   │   │       │       │   │           ├── port.c
    │   │   │       │       │   │           └── portmacro.h
    │   │   │       │       │   └── MemMang/
    │   │   │       │       │       └── heap_4.c
    │   │   │       │       ├── queue.c
    │   │   │       │       ├── stream_buffer.c
    │   │   │       │       ├── tasks.c
    │   │   │       │       └── timers.c
    │   │   │       └── LwIP/
    │   │   │           ├── src/
    │   │   │           │   ├── api/
    │   │   │           │   │   ├── api_lib.c
    │   │   │           │   │   ├── api_msg.c
    │   │   │           │   │   ├── err.c
    │   │   │           │   │   ├── if_api.c
    │   │   │           │   │   ├── netbuf.c
    │   │   │           │   │   ├── netdb.c
    │   │   │           │   │   ├── netifapi.c
    │   │   │           │   │   ├── sockets.c
    │   │   │           │   │   └── tcpip.c
    │   │   │           │   ├── apps/
    │   │   │           │   │   └── mqtt/
    │   │   │           │   │       └── mqtt.c
    │   │   │           │   ├── core/
    │   │   │           │   │   ├── altcp.c
    │   │   │           │   │   ├── altcp_alloc.c
    │   │   │           │   │   ├── altcp_tcp.c
    │   │   │           │   │   ├── def.c
    │   │   │           │   │   ├── dns.c
    │   │   │           │   │   ├── inet_chksum.c
    │   │   │           │   │   ├── init.c
    │   │   │           │   │   ├── ip.c
    │   │   │           │   │   ├── ipv4/
    │   │   │           │   │   │   ├── autoip.c
    │   │   │           │   │   │   ├── dhcp.c
    │   │   │           │   │   │   ├── etharp.c
    │   │   │           │   │   │   ├── icmp.c
    │   │   │           │   │   │   ├── igmp.c
    │   │   │           │   │   │   ├── ip4.c
    │   │   │           │   │   │   ├── ip4_addr.c
    │   │   │           │   │   │   └── ip4_frag.c
    │   │   │           │   │   ├── ipv6/
    │   │   │           │   │   │   ├── dhcp6.c
    │   │   │           │   │   │   ├── ethip6.c
    │   │   │           │   │   │   ├── icmp6.c
    │   │   │           │   │   │   ├── inet6.c
    │   │   │           │   │   │   ├── ip6.c
    │   │   │           │   │   │   ├── ip6_addr.c
    │   │   │           │   │   │   ├── ip6_frag.c
    │   │   │           │   │   │   ├── mld6.c
    │   │   │           │   │   │   └── nd6.c
    │   │   │           │   │   ├── mem.c
    │   │   │           │   │   ├── memp.c
    │   │   │           │   │   ├── netif.c
    │   │   │           │   │   ├── pbuf.c
    │   │   │           │   │   ├── raw.c
    │   │   │           │   │   ├── stats.c
    │   │   │           │   │   ├── sys.c
    │   │   │           │   │   ├── tcp.c
    │   │   │           │   │   ├── tcp_in.c
    │   │   │           │   │   ├── tcp_out.c
    │   │   │           │   │   ├── timeouts.c
    │   │   │           │   │   └── udp.c
    │   │   │           │   ├── include/
    │   │   │           │   │   ├── compat/
    │   │   │           │   │   │   ├── posix/
    │   │   │           │   │   │   │   ├── arpa/
    │   │   │           │   │   │   │   │   └── inet.h
    │   │   │           │   │   │   │   ├── net/
    │   │   │           │   │   │   │   │   └── if.h
    │   │   │           │   │   │   │   ├── netdb.h
    │   │   │           │   │   │   │   └── sys/
    │   │   │           │   │   │   │       └── socket.h
    │   │   │           │   │   │   └── stdc/
    │   │   │           │   │   │       └── errno.h
    │   │   │           │   │   ├── lwip/
    │   │   │           │   │   │   ├── altcp.h
    │   │   │           │   │   │   ├── altcp_tcp.h
    │   │   │           │   │   │   ├── altcp_tls.h
    │   │   │           │   │   │   ├── api.h
    │   │   │           │   │   │   ├── apps/
    │   │   │           │   │   │   │   ├── altcp_proxyconnect.h
    │   │   │           │   │   │   │   ├── altcp_tls_mbedtls_opts.h
    │   │   │           │   │   │   │   ├── fs.h
    │   │   │           │   │   │   │   ├── http_client.h
    │   │   │           │   │   │   │   ├── httpd.h
    │   │   │           │   │   │   │   ├── httpd_opts.h
    │   │   │           │   │   │   │   ├── lwiperf.h
    │   │   │           │   │   │   │   ├── mdns.h
    │   │   │           │   │   │   │   ├── mdns_opts.h
    │   │   │           │   │   │   │   ├── mdns_priv.h
    │   │   │           │   │   │   │   ├── mqtt.h
    │   │   │           │   │   │   │   ├── mqtt_opts.h
    │   │   │           │   │   │   │   ├── mqtt_priv.h
    │   │   │           │   │   │   │   ├── netbiosns.h
    │   │   │           │   │   │   │   ├── netbiosns_opts.h
    │   │   │           │   │   │   │   ├── smtp.h
    │   │   │           │   │   │   │   ├── smtp_opts.h
    │   │   │           │   │   │   │   ├── snmp.h
    │   │   │           │   │   │   │   ├── snmp_core.h
    │   │   │           │   │   │   │   ├── snmp_mib2.h
    │   │   │           │   │   │   │   ├── snmp_opts.h
    │   │   │           │   │   │   │   ├── snmp_scalar.h
    │   │   │           │   │   │   │   ├── snmp_snmpv2_framework.h
    │   │   │           │   │   │   │   ├── snmp_snmpv2_usm.h
    │   │   │           │   │   │   │   ├── snmp_table.h
    │   │   │           │   │   │   │   ├── snmp_threadsync.h
    │   │   │           │   │   │   │   ├── snmpv3.h
    │   │   │           │   │   │   │   ├── sntp.h
    │   │   │           │   │   │   │   ├── sntp_opts.h
    │   │   │           │   │   │   │   ├── tftp_opts.h
    │   │   │           │   │   │   │   └── tftp_server.h
    │   │   │           │   │   │   ├── arch.h
    │   │   │           │   │   │   ├── autoip.h
    │   │   │           │   │   │   ├── debug.h
    │   │   │           │   │   │   ├── def.h
    │   │   │           │   │   │   ├── dhcp.h
    │   │   │           │   │   │   ├── dhcp6.h
    │   │   │           │   │   │   ├── dns.h
    │   │   │           │   │   │   ├── err.h
    │   │   │           │   │   │   ├── errno.h
    │   │   │           │   │   │   ├── etharp.h
    │   │   │           │   │   │   ├── ethip6.h
    │   │   │           │   │   │   ├── icmp.h
    │   │   │           │   │   │   ├── icmp6.h
    │   │   │           │   │   │   ├── if_api.h
    │   │   │           │   │   │   ├── igmp.h
    │   │   │           │   │   │   ├── inet.h
    │   │   │           │   │   │   ├── inet_chksum.h
    │   │   │           │   │   │   ├── init.h
    │   │   │           │   │   │   ├── ip.h
    │   │   │           │   │   │   ├── ip4.h
    │   │   │           │   │   │   ├── ip4_addr.h
    │   │   │           │   │   │   ├── ip4_frag.h
    │   │   │           │   │   │   ├── ip6.h
    │   │   │           │   │   │   ├── ip6_addr.h
    │   │   │           │   │   │   ├── ip6_frag.h
    │   │   │           │   │   │   ├── ip6_zone.h
    │   │   │           │   │   │   ├── ip_addr.h
    │   │   │           │   │   │   ├── mem.h
    │   │   │           │   │   │   ├── memp.h
    │   │   │           │   │   │   ├── mld6.h
    │   │   │           │   │   │   ├── nd6.h
    │   │   │           │   │   │   ├── netbuf.h
    │   │   │           │   │   │   ├── netdb.h
    │   │   │           │   │   │   ├── netif.h
    │   │   │           │   │   │   ├── netifapi.h
    │   │   │           │   │   │   ├── opt.h
    │   │   │           │   │   │   ├── pbuf.h
    │   │   │           │   │   │   ├── priv/
    │   │   │           │   │   │   │   ├── altcp_priv.h
    │   │   │           │   │   │   │   ├── api_msg.h
    │   │   │           │   │   │   │   ├── mem_priv.h
    │   │   │           │   │   │   │   ├── memp_priv.h
    │   │   │           │   │   │   │   ├── memp_std.h
    │   │   │           │   │   │   │   ├── nd6_priv.h
    │   │   │           │   │   │   │   ├── raw_priv.h
    │   │   │           │   │   │   │   ├── sockets_priv.h
    │   │   │           │   │   │   │   ├── tcp_priv.h
    │   │   │           │   │   │   │   └── tcpip_priv.h
    │   │   │           │   │   │   ├── prot/
    │   │   │           │   │   │   │   ├── autoip.h
    │   │   │           │   │   │   │   ├── dhcp.h
    │   │   │           │   │   │   │   ├── dhcp6.h
    │   │   │           │   │   │   │   ├── dns.h
    │   │   │           │   │   │   │   ├── etharp.h
    │   │   │           │   │   │   │   ├── ethernet.h
    │   │   │           │   │   │   │   ├── iana.h
    │   │   │           │   │   │   │   ├── icmp.h
    │   │   │           │   │   │   │   ├── icmp6.h
    │   │   │           │   │   │   │   ├── ieee.h
    │   │   │           │   │   │   │   ├── igmp.h
    │   │   │           │   │   │   │   ├── ip.h
    │   │   │           │   │   │   │   ├── ip4.h
    │   │   │           │   │   │   │   ├── ip6.h
    │   │   │           │   │   │   │   ├── mld6.h
    │   │   │           │   │   │   │   ├── nd6.h
    │   │   │           │   │   │   │   ├── tcp.h
    │   │   │           │   │   │   │   └── udp.h
    │   │   │           │   │   │   ├── raw.h
    │   │   │           │   │   │   ├── sio.h
    │   │   │           │   │   │   ├── snmp.h
    │   │   │           │   │   │   ├── sockets.h
    │   │   │           │   │   │   ├── stats.h
    │   │   │           │   │   │   ├── sys.h
    │   │   │           │   │   │   ├── tcp.h
    │   │   │           │   │   │   ├── tcpbase.h
    │   │   │           │   │   │   ├── tcpip.h
    │   │   │           │   │   │   ├── timeouts.h
    │   │   │           │   │   │   └── udp.h
    │   │   │           │   │   └── netif/
    │   │   │           │   │       ├── bridgeif.h
    │   │   │           │   │       ├── bridgeif_opts.h
    │   │   │           │   │       ├── etharp.h
    │   │   │           │   │       ├── ethernet.h
    │   │   │           │   │       ├── ieee802154.h
    │   │   │           │   │       ├── lowpan6.h
    │   │   │           │   │       ├── lowpan6_ble.h
    │   │   │           │   │       ├── lowpan6_common.h
    │   │   │           │   │       ├── lowpan6_opts.h
    │   │   │           │   │       ├── ppp/
    │   │   │           │   │       │   ├── ccp.h
    │   │   │           │   │       │   ├── chap-md5.h
    │   │   │           │   │       │   ├── chap-new.h
    │   │   │           │   │       │   ├── chap_ms.h
    │   │   │           │   │       │   ├── eap.h
    │   │   │           │   │       │   ├── ecp.h
    │   │   │           │   │       │   ├── eui64.h
    │   │   │           │   │       │   ├── fsm.h
    │   │   │           │   │       │   ├── ipcp.h
    │   │   │           │   │       │   ├── ipv6cp.h
    │   │   │           │   │       │   ├── lcp.h
    │   │   │           │   │       │   ├── magic.h
    │   │   │           │   │       │   ├── mppe.h
    │   │   │           │   │       │   ├── ppp.h
    │   │   │           │   │       │   ├── ppp_impl.h
    │   │   │           │   │       │   ├── ppp_opts.h
    │   │   │           │   │       │   ├── pppapi.h
    │   │   │           │   │       │   ├── pppcrypt.h
    │   │   │           │   │       │   ├── pppdebug.h
    │   │   │           │   │       │   ├── pppoe.h
    │   │   │           │   │       │   ├── pppol2tp.h
    │   │   │           │   │       │   ├── pppos.h
    │   │   │           │   │       │   ├── upap.h
    │   │   │           │   │       │   └── vj.h
    │   │   │           │   │       ├── slipif.h
    │   │   │           │   │       └── zepif.h
    │   │   │           │   └── netif/
    │   │   │           │       ├── bridgeif.c
    │   │   │           │       ├── bridgeif_fdb.c
    │   │   │           │       ├── ethernet.c
    │   │   │           │       ├── lowpan6.c
    │   │   │           │       ├── lowpan6_ble.c
    │   │   │           │       ├── lowpan6_common.c
    │   │   │           │       ├── ppp/
    │   │   │           │       │   ├── auth.c
    │   │   │           │       │   ├── ccp.c
    │   │   │           │       │   ├── chap-md5.c
    │   │   │           │       │   ├── chap-new.c
    │   │   │           │       │   ├── chap_ms.c
    │   │   │           │       │   ├── demand.c
    │   │   │           │       │   ├── eap.c
    │   │   │           │       │   ├── ecp.c
    │   │   │           │       │   ├── eui64.c
    │   │   │           │       │   ├── fsm.c
    │   │   │           │       │   ├── ipcp.c
    │   │   │           │       │   ├── ipv6cp.c
    │   │   │           │       │   ├── lcp.c
    │   │   │           │       │   ├── magic.c
    │   │   │           │       │   ├── mppe.c
    │   │   │           │       │   ├── multilink.c
    │   │   │           │       │   ├── ppp.c
    │   │   │           │       │   ├── pppapi.c
    │   │   │           │       │   ├── pppcrypt.c
    │   │   │           │       │   ├── pppoe.c
    │   │   │           │       │   ├── pppol2tp.c
    │   │   │           │       │   ├── pppos.c
    │   │   │           │       │   ├── upap.c
    │   │   │           │       │   ├── utils.c
    │   │   │           │       │   └── vj.c
    │   │   │           │       ├── slipif.c
    │   │   │           │       └── zepif.c
    │   │   │           └── system/
    │   │   │               ├── OS/
    │   │   │               │   └── sys_arch.c
    │   │   │               └── arch/
    │   │   │                   ├── bpstruct.h
    │   │   │                   ├── cc.h
    │   │   │                   ├── cpu.h
    │   │   │                   ├── epstruct.h
    │   │   │                   ├── init.h
    │   │   │                   ├── lib.h
    │   │   │                   ├── perf.h
    │   │   │                   └── sys_arch.h
    │   │   ├── README.md
    │   │   ├── STM32F746ZGTX_FLASH.ld
    │   │   ├── STM32F746ZGTX_RAM.ld
    │   │   ├── nucleo-f746zg-cube-freertos-lwip Debug.launch
    │   │   └── nucleo-f746zg-cube-freertos-lwip.ioc
    │   ├── nucleo-f746zg-keil-baremetal/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F746ZGTx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f7xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_msp.c
    │   │   │   │   │   │       └── stm32f7xx_it.c
    │   │   │   │   │   ├── startup_stm32f746xx.s
    │   │   │   │   │   └── system_stm32f7xx.c
    │   │   │   │   └── project.script
    │   │   │   ├── _Target_1/
    │   │   │   │   ├── Pre_Include_Global.h
    │   │   │   │   └── RTE_Components.h
    │   │   │   └── _Test/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f746zg-keil-freertos/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F746ZGTx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f7xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_msp.c
    │   │   │   │   │   │       └── stm32f7xx_it.c
    │   │   │   │   │   ├── startup_stm32f746xx.s
    │   │   │   │   │   └── system_stm32f7xx.c
    │   │   │   │   └── project.script
    │   │   │   ├── RTOS/
    │   │   │   │   └── FreeRTOSConfig.h
    │   │   │   └── _Target_1/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f746zg-keil-freertos-lwip/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F746ZGTx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f7xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_msp.c
    │   │   │   │   │   │       └── stm32f7xx_it.c
    │   │   │   │   │   ├── startup_stm32f746xx.s
    │   │   │   │   │   └── system_stm32f7xx.c
    │   │   │   │   └── project.script
    │   │   │   ├── Network/
    │   │   │   │   ├── ethif_config.h
    │   │   │   │   └── lwipopts.h
    │   │   │   ├── RTOS/
    │   │   │   │   └── FreeRTOSConfig.h
    │   │   │   └── _Target_1/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f746zg-keil-freertos-tcp/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── FreeRTOSIPConfig.h
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F746ZGTx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f7xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_msp.c
    │   │   │   │   │   │       └── stm32f7xx_it.c
    │   │   │   │   │   ├── startup_stm32f746xx.s
    │   │   │   │   │   └── system_stm32f7xx.c
    │   │   │   │   └── project.script
    │   │   │   ├── RTOS/
    │   │   │   │   └── FreeRTOSConfig.h
    │   │   │   └── _Target_1/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   ├── phyHandling.c
    │   │   ├── phyHandling.h
    │   │   └── syscalls.c
    │   ├── nucleo-f746zg-keil-freertos_cmsis2/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F746ZGTx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f7xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_msp.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_timebase_tim.c
    │   │   │   │   │   │       └── stm32f7xx_it.c
    │   │   │   │   │   ├── startup_stm32f746xx.s
    │   │   │   │   │   └── system_stm32f7xx.c
    │   │   │   │   └── project.script
    │   │   │   ├── RTOS/
    │   │   │   │   └── FreeRTOSConfig.h
    │   │   │   └── _Target_1/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f746zg-keil-freertos_cmsis2-lwip/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F746ZGTx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f7xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_msp.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_timebase_tim.c
    │   │   │   │   │   │       └── stm32f7xx_it.c
    │   │   │   │   │   ├── startup_stm32f746xx.s
    │   │   │   │   │   └── system_stm32f7xx.c
    │   │   │   │   └── project.script
    │   │   │   ├── Network/
    │   │   │   │   ├── ethif_config.h
    │   │   │   │   └── lwipopts.h
    │   │   │   ├── RTOS/
    │   │   │   │   └── FreeRTOSConfig.h
    │   │   │   └── _Target_1/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f746zg-keil-rtx/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── CMSIS/
    │   │   │   │   └── RTX_Conf_CM.c
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F746ZGTx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f7xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_msp.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_timebase_tim.c
    │   │   │   │   │   │       └── stm32f7xx_it.c
    │   │   │   │   │   ├── startup_stm32f746xx.s
    │   │   │   │   │   └── system_stm32f7xx.c
    │   │   │   │   └── project.script
    │   │   │   └── _Target_1/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f746zg-keil-rtx-mdk/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── CMSIS/
    │   │   │   │   └── RTX_Conf_CM.c
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F746ZGTx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f7xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_msp.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_timebase_tim.c
    │   │   │   │   │   │       └── stm32f7xx_it.c
    │   │   │   │   │   ├── startup_stm32f746xx.s
    │   │   │   │   │   └── system_stm32f7xx.c
    │   │   │   │   └── project.script
    │   │   │   ├── Network/
    │   │   │   │   ├── Net_Config.c
    │   │   │   │   ├── Net_Config_BSD.h
    │   │   │   │   ├── Net_Config_ETH_0.h
    │   │   │   │   ├── Net_Config_TCP.h
    │   │   │   │   └── Net_Config_UDP.h
    │   │   │   └── _Target_1/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f746zg-keil-rtx5/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── CMSIS/
    │   │   │   │   ├── RTX_Config.c
    │   │   │   │   └── RTX_Config.h
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F746ZGTx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f7xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_msp.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_timebase_tim.c
    │   │   │   │   │   │       └── stm32f7xx_it.c
    │   │   │   │   │   ├── startup_stm32f746xx.s
    │   │   │   │   │   └── system_stm32f7xx.c
    │   │   │   │   └── project.script
    │   │   │   └── _Target_1/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f746zg-keil-rtx5-lwip/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── CMSIS/
    │   │   │   │   ├── RTX_Config.c
    │   │   │   │   └── RTX_Config.h
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F746ZGTx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f7xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_msp.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_timebase_tim.c
    │   │   │   │   │   │       └── stm32f7xx_it.c
    │   │   │   │   │   ├── startup_stm32f746xx.s
    │   │   │   │   │   └── system_stm32f7xx.c
    │   │   │   │   └── project.script
    │   │   │   ├── Network/
    │   │   │   │   ├── ethif_config.h
    │   │   │   │   └── lwipopts.h
    │   │   │   └── _Target_1/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f746zg-keil-rtx5-mdk/
    │   │   ├── EventRecorderStub.scvd
    │   │   ├── README.md
    │   │   ├── RTE/
    │   │   │   ├── CMSIS/
    │   │   │   │   ├── RTX_Config.c
    │   │   │   │   └── RTX_Config.h
    │   │   │   ├── Device/
    │   │   │   │   ├── STM32F746ZGTx/
    │   │   │   │   │   ├── FrameworkCubeMX.gpdsc
    │   │   │   │   │   ├── MX_Device.h
    │   │   │   │   │   ├── STCubeGenerated/
    │   │   │   │   │   │   ├── .mxproject
    │   │   │   │   │   │   ├── Inc/
    │   │   │   │   │   │   │   ├── main.h
    │   │   │   │   │   │   │   ├── stm32f7xx_hal_conf.h
    │   │   │   │   │   │   │   └── stm32f7xx_it.h
    │   │   │   │   │   │   ├── STCubeGenerated.ioc
    │   │   │   │   │   │   └── Src/
    │   │   │   │   │   │       ├── main.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_msp.c
    │   │   │   │   │   │       ├── stm32f7xx_hal_timebase_tim.c
    │   │   │   │   │   │       └── stm32f7xx_it.c
    │   │   │   │   │   ├── startup_stm32f746xx.s
    │   │   │   │   │   └── system_stm32f7xx.c
    │   │   │   │   └── project.script
    │   │   │   ├── Network/
    │   │   │   │   ├── Net_Config.c
    │   │   │   │   ├── Net_Config_BSD.h
    │   │   │   │   ├── Net_Config_ETH_0.h
    │   │   │   │   ├── Net_Config_TCP.h
    │   │   │   │   └── Net_Config_UDP.h
    │   │   │   └── _Target_1/
    │   │   │       ├── Pre_Include_Global.h
    │   │   │       └── RTE_Components.h
    │   │   ├── device-dashboard.uvguix
    │   │   ├── device-dashboard.uvoptx
    │   │   ├── device-dashboard.uvprojx
    │   │   ├── hal.h
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-f746zg-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── mbedtls_config.h
    │   ├── nucleo-f746zg-make-baremetal-builtin-cmsis_driver/
    │   │   ├── MX_Device.h
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── RTE_Components.h
    │   │   ├── hal.h
    │   │   ├── link.ld
    │   │   ├── main.c
    │   │   ├── mbedtls_config.h
    │   │   ├── mongoose_config.h
    │   │   ├── syscalls.c
    │   │   └── sysinit.c
    │   ├── nucleo-f746zg-make-baremetal-builtin-rndis/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── hal.h
    │   │   ├── link.ld
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   ├── netif/
    │   │   │   └── ethernet.h
    │   │   ├── syscalls.c
    │   │   ├── sysinit.c
    │   │   ├── tusb_config.h
    │   │   └── usb_descriptors.c
    │   ├── nucleo-f746zg-make-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── nucleo-f746zg-make-freertos-tcp/
    │   │   ├── FreeRTOSConfig.h
    │   │   ├── FreeRTOSIPConfig.h
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── hal.h
    │   │   ├── link.ld
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   ├── stm32f7xx_hal.h
    │   │   ├── syscalls.c
    │   │   └── sysinit.c
    │   ├── nucleo-g031-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── hal.h
    │   │   ├── link.ld
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   └── syscalls.c
    │   ├── nucleo-h563zi-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── mbedtls_config.h
    │   ├── nucleo-h563zi-make-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── nucleo-h723zg-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── mbedtls_config.h
    │   ├── nucleo-h723zg-make-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── nucleo-h743zi-cube-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── nucleo-h743zi-cube-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── nucleo-h743zi-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── mbedtls_config.h
    │   ├── nucleo-h743zi-make-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── portenta-h7-cube-baremetal-builtin/
    │   │   ├── .mxproject
    │   │   ├── .project
    │   │   ├── .settings/
    │   │   │   └── com.st.stm32cube.ide.mcu.sfrview.prefs
    │   │   ├── CM4/
    │   │   │   ├── .cproject
    │   │   │   ├── .project
    │   │   │   ├── .settings/
    │   │   │   │   ├── com.st.stm32cube.ide.mcu.sfrview.prefs
    │   │   │   │   ├── language.settings.xml
    │   │   │   │   └── stm32cubeide.project.prefs
    │   │   │   ├── Core/
    │   │   │   │   ├── Inc/
    │   │   │   │   │   ├── main.h
    │   │   │   │   │   ├── stm32h7xx_hal_conf.h
    │   │   │   │   │   └── stm32h7xx_it.h
    │   │   │   │   ├── Src/
    │   │   │   │   │   ├── main.c
    │   │   │   │   │   ├── stm32h7xx_hal_msp.c
    │   │   │   │   │   ├── stm32h7xx_it.c
    │   │   │   │   │   ├── syscalls.c
    │   │   │   │   │   └── sysmem.c
    │   │   │   │   └── Startup/
    │   │   │   │       └── startup_stm32h747xihx.s
    │   │   │   └── STM32H747XIHX_FLASH.ld
    │   │   ├── CM7/
    │   │   │   ├── .cproject
    │   │   │   ├── .project
    │   │   │   ├── .settings/
    │   │   │   │   ├── com.st.stm32cube.ide.mcu.sfrview.prefs
    │   │   │   │   ├── language.settings.xml
    │   │   │   │   └── stm32cubeide.project.prefs
    │   │   │   ├── Core/
    │   │   │   │   ├── Inc/
    │   │   │   │   │   ├── main.h
    │   │   │   │   │   ├── mongoose_config.h
    │   │   │   │   │   ├── stm32h7xx_hal_conf.h
    │   │   │   │   │   └── stm32h7xx_it.h
    │   │   │   │   ├── Src/
    │   │   │   │   │   ├── main.c
    │   │   │   │   │   ├── stm32h7xx_hal_msp.c
    │   │   │   │   │   ├── stm32h7xx_it.c
    │   │   │   │   │   ├── syscalls.c
    │   │   │   │   │   └── sysmem.c
    │   │   │   │   └── Startup/
    │   │   │   │       └── startup_stm32h747xihx.s
    │   │   │   └── STM32H747XIHX_FLASH.ld
    │   │   ├── Common/
    │   │   │   └── Src/
    │   │   │       └── system_stm32h7xx_dualcore_boot_cm4_cm7.c
    │   │   ├── Drivers/
    │   │   │   ├── CMSIS/
    │   │   │   │   ├── Device/
    │   │   │   │   │   └── ST/
    │   │   │   │   │       └── STM32H7xx/
    │   │   │   │   │           ├── Include/
    │   │   │   │   │           │   ├── stm32h747xx.h
    │   │   │   │   │           │   ├── stm32h7xx.h
    │   │   │   │   │           │   └── system_stm32h7xx.h
    │   │   │   │   │           └── LICENSE.txt
    │   │   │   │   ├── Include/
    │   │   │   │   │   ├── cmsis_armcc.h
    │   │   │   │   │   ├── cmsis_armclang.h
    │   │   │   │   │   ├── cmsis_armclang_ltm.h
    │   │   │   │   │   ├── cmsis_compiler.h
    │   │   │   │   │   ├── cmsis_gcc.h
    │   │   │   │   │   ├── cmsis_iccarm.h
    │   │   │   │   │   ├── cmsis_version.h
    │   │   │   │   │   ├── core_armv81mml.h
    │   │   │   │   │   ├── core_armv8mbl.h
    │   │   │   │   │   ├── core_armv8mml.h
    │   │   │   │   │   ├── core_cm0.h
    │   │   │   │   │   ├── core_cm0plus.h
    │   │   │   │   │   ├── core_cm1.h
    │   │   │   │   │   ├── core_cm23.h
    │   │   │   │   │   ├── core_cm3.h
    │   │   │   │   │   ├── core_cm33.h
    │   │   │   │   │   ├── core_cm35p.h
    │   │   │   │   │   ├── core_cm4.h
    │   │   │   │   │   ├── core_cm7.h
    │   │   │   │   │   ├── core_sc000.h
    │   │   │   │   │   ├── core_sc300.h
    │   │   │   │   │   ├── mpu_armv7.h
    │   │   │   │   │   ├── mpu_armv8.h
    │   │   │   │   │   └── tz_context.h
    │   │   │   │   └── LICENSE.txt
    │   │   │   └── STM32H7xx_HAL_Driver/
    │   │   │       ├── Inc/
    │   │   │       │   ├── Legacy/
    │   │   │       │   │   └── stm32_hal_legacy.h
    │   │   │       │   ├── stm32h7xx_hal.h
    │   │   │       │   ├── stm32h7xx_hal_cortex.h
    │   │   │       │   ├── stm32h7xx_hal_def.h
    │   │   │       │   ├── stm32h7xx_hal_dma.h
    │   │   │       │   ├── stm32h7xx_hal_dma_ex.h
    │   │   │       │   ├── stm32h7xx_hal_exti.h
    │   │   │       │   ├── stm32h7xx_hal_flash.h
    │   │   │       │   ├── stm32h7xx_hal_flash_ex.h
    │   │   │       │   ├── stm32h7xx_hal_gpio.h
    │   │   │       │   ├── stm32h7xx_hal_gpio_ex.h
    │   │   │       │   ├── stm32h7xx_hal_hsem.h
    │   │   │       │   ├── stm32h7xx_hal_i2c.h
    │   │   │       │   ├── stm32h7xx_hal_i2c_ex.h
    │   │   │       │   ├── stm32h7xx_hal_mdma.h
    │   │   │       │   ├── stm32h7xx_hal_pwr.h
    │   │   │       │   ├── stm32h7xx_hal_pwr_ex.h
    │   │   │       │   ├── stm32h7xx_hal_rcc.h
    │   │   │       │   ├── stm32h7xx_hal_rcc_ex.h
    │   │   │       │   ├── stm32h7xx_hal_rng.h
    │   │   │       │   ├── stm32h7xx_hal_rng_ex.h
    │   │   │       │   ├── stm32h7xx_hal_tim.h
    │   │   │       │   ├── stm32h7xx_hal_tim_ex.h
    │   │   │       │   ├── stm32h7xx_hal_uart.h
    │   │   │       │   ├── stm32h7xx_hal_uart_ex.h
    │   │   │       │   ├── stm32h7xx_ll_bus.h
    │   │   │       │   ├── stm32h7xx_ll_cortex.h
    │   │   │       │   ├── stm32h7xx_ll_crs.h
    │   │   │       │   ├── stm32h7xx_ll_dma.h
    │   │   │       │   ├── stm32h7xx_ll_dmamux.h
    │   │   │       │   ├── stm32h7xx_ll_exti.h
    │   │   │       │   ├── stm32h7xx_ll_gpio.h
    │   │   │       │   ├── stm32h7xx_ll_hsem.h
    │   │   │       │   ├── stm32h7xx_ll_lpuart.h
    │   │   │       │   ├── stm32h7xx_ll_pwr.h
    │   │   │       │   ├── stm32h7xx_ll_rcc.h
    │   │   │       │   ├── stm32h7xx_ll_rng.h
    │   │   │       │   ├── stm32h7xx_ll_system.h
    │   │   │       │   ├── stm32h7xx_ll_usart.h
    │   │   │       │   └── stm32h7xx_ll_utils.h
    │   │   │       ├── LICENSE.txt
    │   │   │       └── Src/
    │   │   │           ├── stm32h7xx_hal.c
    │   │   │           ├── stm32h7xx_hal_cortex.c
    │   │   │           ├── stm32h7xx_hal_dma.c
    │   │   │           ├── stm32h7xx_hal_dma_ex.c
    │   │   │           ├── stm32h7xx_hal_exti.c
    │   │   │           ├── stm32h7xx_hal_flash.c
    │   │   │           ├── stm32h7xx_hal_flash_ex.c
    │   │   │           ├── stm32h7xx_hal_gpio.c
    │   │   │           ├── stm32h7xx_hal_hsem.c
    │   │   │           ├── stm32h7xx_hal_i2c.c
    │   │   │           ├── stm32h7xx_hal_i2c_ex.c
    │   │   │           ├── stm32h7xx_hal_mdma.c
    │   │   │           ├── stm32h7xx_hal_pwr.c
    │   │   │           ├── stm32h7xx_hal_pwr_ex.c
    │   │   │           ├── stm32h7xx_hal_rcc.c
    │   │   │           ├── stm32h7xx_hal_rcc_ex.c
    │   │   │           ├── stm32h7xx_hal_rng.c
    │   │   │           ├── stm32h7xx_hal_rng_ex.c
    │   │   │           ├── stm32h7xx_hal_tim.c
    │   │   │           ├── stm32h7xx_hal_tim_ex.c
    │   │   │           ├── stm32h7xx_hal_uart.c
    │   │   │           └── stm32h7xx_hal_uart_ex.c
    │   │   ├── Portenta_H7.ioc
    │   │   ├── README.md
    │   │   └── getfirmware.mk
    │   ├── portenta-h7-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── hal.c
    │   │   ├── hal.h
    │   │   ├── link.ld
    │   │   ├── main.c
    │   │   └── mongoose_config.h
    │   ├── rm2-nucleo-f429zi-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── hal.h
    │   │   ├── link.ld
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   ├── syscalls.c
    │   │   └── sysinit.c
    │   ├── rm2-nucleo-f746zg-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── hal.h
    │   │   ├── link.ld
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   ├── syscalls.c
    │   │   └── sysinit.c
    │   ├── stm32h573i-dk-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── mbedtls_config.h
    │   ├── stm32h573i-dk-make-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   └── stm32h747i-disco-make-baremetal-builtin/
    │       ├── Makefile
    │       ├── README.md
    │       └── mbedtls_config.h
    ├── tcp/
    │   ├── README.md
    │   ├── modbus-dashboard/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   ├── net.c
    │   │   ├── net.h
    │   │   ├── packed_fs.c
    │   │   ├── tailwind.config.js
    │   │   └── web_root/
    │   │       ├── bundle.js
    │   │       ├── index.html
    │   │       └── main.js
    │   ├── socks5-server/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   └── tcp/
    │       ├── Makefile
    │       ├── README.md
    │       └── main.c
    ├── tcpip/
    │   ├── README.md
    │   ├── pcap-driver/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   └── tap-driver/
    │       ├── Makefile
    │       ├── README.md
    │       └── main.c
    ├── ti/
    │   ├── ek-tm4c1294xl-make-baremetal-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   ├── ek-tm4c1294xl-make-baremetal-builtin-rndis/
    │   │   ├── Makefile
    │   │   ├── cmsis_tm4c.patch
    │   │   ├── hal.h
    │   │   ├── link.ld
    │   │   ├── main.c
    │   │   ├── mongoose_config.h
    │   │   ├── netif/
    │   │   │   └── ethernet.h
    │   │   ├── startup.c
    │   │   ├── syscalls.c
    │   │   ├── sysinit.c
    │   │   ├── tinyusb.patch
    │   │   ├── tusb_config.h
    │   │   └── usb_descriptors.c
    │   ├── ek-tm4c1294xl-make-freertos-builtin/
    │   │   ├── Makefile
    │   │   └── README.md
    │   └── ti-ek-tm4c1294xl-http-server/
    │       └── Makefile
    ├── tls/
    │   └── README.md
    ├── udp/
    │   ├── README.md
    │   ├── captive-dns-server/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── mdns-client/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── mdns-sd-server/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── mdns-server/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── sntp-time-sync/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   └── ssdp-search/
    │       ├── Makefile
    │       ├── README.md
    │       └── main.c
    ├── wch/
    │   └── ch32v307-make-baremetal-builtin/
    │       ├── Makefile
    │       ├── hal.c
    │       ├── hal.h
    │       ├── main.c
    │       ├── mongoose_config.h
    │       └── vendor/
    │           ├── ch32v30x.h
    │           ├── core_riscv.c
    │           ├── core_riscv.h
    │           ├── link.ld
    │           ├── startup_ch32v30x_D8C.S
    │           └── system_ch32v30x.c
    ├── websocket/
    │   ├── README.md
    │   ├── json-rpc-over-websocket/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── web_root/
    │   │       ├── index.html
    │   │       └── rpc-over-websocket.js
    │   ├── websocket-client/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   └── websocket-server/
    │       ├── Makefile
    │       ├── README.md
    │       ├── main.c
    │       └── test.html
    ├── webui/
    │   ├── README.md
    │   ├── live-log/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── web_root/
    │   │       └── index.html
    │   ├── webui-login/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── web_root/
    │   │       ├── index.html
    │   │       ├── main.js
    │   │       └── style.css
    │   ├── webui-plain/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── web_root/
    │   │       ├── index.html
    │   │       └── style.css
    │   ├── webui-preact/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── web_root/
    │   │       ├── index.html
    │   │       ├── main.js
    │   │       └── style.css
    │   ├── webui-push-rest/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── web_root/
    │   │       └── index.html
    │   ├── webui-push-ws/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── web_root/
    │   │       └── index.html
    │   └── webui-rest/
    │       ├── Makefile
    │       ├── README.md
    │       ├── main.c
    │       └── web_root/
    │           └── index.html
    └── zephyr/
        ├── Makefile
        ├── README.md
        ├── device-dashboard/
        │   ├── CMakeLists.txt
        │   ├── Makefile
        │   ├── overlay-e1000.conf
        │   ├── prj.conf
        │   └── src/
        │       ├── main.c
        │       └── mongoose_config.h
        ├── http-client/
        │   ├── CMakeLists.txt
        │   ├── Makefile
        │   ├── overlay-e1000.conf
        │   ├── prj.conf
        │   └── src/
        │       ├── certs.h
        │       ├── main.c
        │       └── mongoose_config.h
        ├── http-server/
        │   ├── CMakeLists.txt
        │   ├── Makefile
        │   ├── overlay-e1000.conf
        │   ├── prj.conf
        │   └── src/
        │       ├── certs.h
        │       ├── main.c
        │       └── mongoose_config.h
        ├── mqtt-aws-client/
        │   ├── CMakeLists.txt
        │   ├── Makefile
        │   ├── overlay-e1000.conf
        │   ├── prj.conf
        │   └── src/
        │       ├── certs.h
        │       ├── main.c
        │       └── mongoose_config.h
        └── websocket-server/
            ├── CMakeLists.txt
            ├── Makefile
            ├── overlay-e1000.conf
            ├── prj.conf
            └── src/
                ├── certs.h
                ├── main.c
                └── mongoose_config.h
Copy disabled (too large) Download .json
Condensed preview — 3936 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (16,526K chars).
[
  {
    "path": ".clang-format",
    "chars": 166,
    "preview": "BasedOnStyle: Google\nAllowShortFunctionsOnASingleLine: false\nSpaceAfterCStyleCast: true\nPointerBindsToType: false\nDerive"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 28,
    "preview": "blank_issues_enabled: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/issue.md",
    "chars": 486,
    "preview": "---\nname: Issue template\nabout: Please fill this issue template for reporting Mongoose issues\n#title: \n#labels: \n#assign"
  },
  {
    "path": ".github/workflows/cifuzz.yml",
    "chars": 847,
    "preview": "name: CIFuzz\non:\n  schedule:\n    - cron: '0 2 * * *' # run at 2 AM UTC\n  # Allow manual runs\n  workflow_dispatch:\n\njobs:"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "chars": 739,
    "preview": "name: \"CodeQL Scanning\"\n# https://github.com/github/codeql-action\n\non:\n  #schedule:\n  #  - cron: '30 23 * * *' # run at "
  },
  {
    "path": ".github/workflows/fuzz.yml",
    "chars": 631,
    "preview": "name: Fuzz\non:\n  schedule:\n    - cron: '0 21 * * *' # run at 9 PM UTC\n  # Allow manual runs\n  workflow_dispatch:\nenv:\n  "
  },
  {
    "path": ".github/workflows/nightly.yml",
    "chars": 18313,
    "preview": "name: Full build\non:\n  schedule:\n    - cron: '0 22 * * *' # run at 10 PM UTC\n  # Allow manual runs\n  workflow_dispatch:\n"
  },
  {
    "path": ".github/workflows/nightly_tests.yml",
    "chars": 6706,
    "preview": "name: Full test\non:\n  schedule:\n    - cron: '0 23 * * *' # run at 11 PM UTC\n  # Allow manual runs\n  workflow_dispatch:\ne"
  },
  {
    "path": ".github/workflows/on_demand.yml",
    "chars": 1337,
    "preview": "name: On demand ad hoc test\non:\n  workflow_dispatch:\nenv:\n  IPV6: 0\njobs:\n  macos:\n    runs-on: macos-latest\n    strateg"
  },
  {
    "path": ".github/workflows/quicktest.yml",
    "chars": 27212,
    "preview": "name: Build and test - essentials\non:\n  push:\n    paths:\n      - \"**Makefile\"\n      - \"**.c\"\n      - \"**.h\"\n  # Allow ma"
  },
  {
    "path": ".github/workflows/test.yml",
    "chars": 29271,
    "preview": "name: original workflow, outdated # *** YES, OUTDATED *** kept for hystorical/reference purposes, attachment, etc.\non:\n "
  },
  {
    "path": ".github/workflows/zephyr.yml",
    "chars": 1228,
    "preview": "name: Zephyr\non:\n  schedule:\n    - cron: '0 0 * * *' # run at 12 AM UTC\n  # Allow manual runs\n  workflow_dispatch:\njobs:"
  },
  {
    "path": "LICENSE",
    "chars": 731,
    "preview": "Copyright (c) 2004-2013 Sergey Lyubka\nCopyright (c) 2013-2026 Cesanta Software Limited\nAll rights reserved\n\nThis softwar"
  },
  {
    "path": "README.md",
    "chars": 12264,
    "preview": "# Mongoose - Embedded Web Server / Embedded Network Library\n\n[![License: GPLv2/Commercial](https://img.shields.io/badge/"
  },
  {
    "path": "mongoose.c",
    "chars": 1013556,
    "preview": "// Copyright (c) 2004-2013 Sergey Lyubka\n// Copyright (c) 2013-2025 Cesanta Software Limited\n// All rights reserved\n//\n/"
  },
  {
    "path": "mongoose.h",
    "chars": 138204,
    "preview": "// Copyright (c) 2004-2013 Sergey Lyubka\n// Copyright (c) 2013-2025 Cesanta Software Limited\n// All rights reserved\n//\n/"
  },
  {
    "path": "src/arch.h",
    "chars": 1881,
    "preview": "#pragma once\n\n#define MG_ARCH_CUSTOM 0        // User creates its own mongoose_config.h\n#define MG_ARCH_UNIX 1          "
  },
  {
    "path": "src/arch_armcgt.h",
    "chars": 312,
    "preview": "#pragma once\n\n#if MG_ARCH == MG_ARCH_ARMCGT\n\n#include <ctype.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stdbool"
  },
  {
    "path": "src/arch_armgcc.h",
    "chars": 398,
    "preview": "#pragma once\n\n#if MG_ARCH == MG_ARCH_ARMGCC\n#define _POSIX_TIMERS\n\n#include <ctype.h>\n#include <errno.h>\n#include <stdar"
  },
  {
    "path": "src/arch_cube.h",
    "chars": 2623,
    "preview": "#pragma once\n\n#if MG_ARCH == MG_ARCH_CUBE\n\n#include <ctype.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stdbool.h"
  },
  {
    "path": "src/arch_esp32.h",
    "chars": 595,
    "preview": "#pragma once\n\n#if MG_ARCH == MG_ARCH_ESP32\n\n#include <ctype.h>\n#include <dirent.h>\n#include <errno.h>\n#include <fcntl.h>"
  },
  {
    "path": "src/arch_esp8266.h",
    "chars": 425,
    "preview": "#pragma once\n\n#if MG_ARCH == MG_ARCH_ESP8266\n\n#include <ctype.h>\n#include <dirent.h>\n#include <errno.h>\n#include <fcntl."
  },
  {
    "path": "src/arch_freertos.h",
    "chars": 1119,
    "preview": "#pragma once\n\n#if MG_ARCH == MG_ARCH_FREERTOS\n\n#include <ctype.h>\n#if !defined(MG_ENABLE_LWIP) || !MG_ENABLE_LWIP\n#inclu"
  },
  {
    "path": "src/arch_picosdk.h",
    "chars": 438,
    "preview": "#pragma once\n\n#if MG_ARCH == MG_ARCH_PICOSDK\n#if !defined(MG_ENABLE_LWIP) || !MG_ENABLE_LWIP\n#include <errno.h>\n#endif\n#"
  },
  {
    "path": "src/arch_rtthread.h",
    "chars": 425,
    "preview": "#pragma once\n\n#if MG_ARCH == MG_ARCH_RTTHREAD\n\n#include <rtthread.h>\n#include <ctype.h>\n#include <errno.h>\n#include <fcn"
  },
  {
    "path": "src/arch_rtx.h",
    "chars": 1180,
    "preview": "#pragma once\n\n#if MG_ARCH == MG_ARCH_ARMCC || MG_ARCH == MG_ARCH_CMSIS_RTOS1 || \\\n    MG_ARCH == MG_ARCH_CMSIS_RTOS2\n\n#i"
  },
  {
    "path": "src/arch_threadx.h",
    "chars": 1134,
    "preview": "#pragma once\n\n#if MG_ARCH == MG_ARCH_THREADX\n\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdint.h>\n#include <str"
  },
  {
    "path": "src/arch_tirtos.h",
    "chars": 290,
    "preview": "#pragma once\n\n#if MG_ARCH == MG_ARCH_TIRTOS\n\n#include <stdlib.h>\n#include <ctype.h>\n#include <stdarg.h>\n#include <stdboo"
  },
  {
    "path": "src/arch_unix.h",
    "chars": 1235,
    "preview": "#pragma once\n\n#if MG_ARCH == MG_ARCH_UNIX\n\n#define _DARWIN_UNLIMITED_SELECT 1  // No limit on file descriptors\n\n#if defi"
  },
  {
    "path": "src/arch_win32.h",
    "chars": 4028,
    "preview": "#pragma once\n\n#if MG_ARCH == MG_ARCH_WIN32\n\n// Avoid name clashing; (macro expansion producing 'defined' has undefined\n/"
  },
  {
    "path": "src/arch_zephyr.h",
    "chars": 812,
    "preview": "#pragma once\n\n#if MG_ARCH == MG_ARCH_ZEPHYR\n\n#include <zephyr/kernel.h>\n#include <zephyr/net/socket.h>\n// #include <zeph"
  },
  {
    "path": "src/base64.c",
    "chars": 2492,
    "preview": "#include \"base64.h\"\n\nstatic int mg_base64_encode_single(int c) {\n  if (c < 26) {\n    return c + 'A';\n  } else if (c < 52"
  },
  {
    "path": "src/base64.h",
    "chars": 301,
    "preview": "#pragma once\n#include \"arch.h\"\nsize_t mg_base64_update(unsigned char input_byte, char *buf, size_t len);\nsize_t mg_base6"
  },
  {
    "path": "src/config.h",
    "chars": 4825,
    "preview": "#pragma once\n\n#ifndef MG_ENABLE_LOG\n#define MG_ENABLE_LOG 1\n#endif\n\n#ifndef MG_ENABLE_CUSTOM_CALLOC\n#define MG_ENABLE_CU"
  },
  {
    "path": "src/dns.c",
    "chars": 22572,
    "preview": "#include \"dns.h\"\n#include \"log.h\"\n#include \"printf.h\"\n#include \"str.h\"\n#include \"timer.h\"\n#include \"url.h\"\n#include \"uti"
  },
  {
    "path": "src/dns.h",
    "chars": 2380,
    "preview": "#pragma once\n\n#include \"net.h\"\n#include \"str.h\"\n\n#define MG_DNS_RTYPE_A 1\n#define MG_DNS_RTYPE_PTR 12\n#define MG_DNS_RTY"
  },
  {
    "path": "src/drivers/cmsis.c",
    "chars": 4447,
    "preview": "// https://arm-software.github.io/CMSIS_5/Driver/html/index.html\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_CMSIS)"
  },
  {
    "path": "src/drivers/cmsis.h",
    "chars": 204,
    "preview": "#pragma once\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_CMSIS) && MG_ENABLE_DRIVER_CMSIS\n\n#include \"Driver_ETH_MAC"
  },
  {
    "path": "src/drivers/cyw.c",
    "chars": 59036,
    "preview": "#include \"cyw.h\"\n#include \"net.h\"\n\n#if MG_ENABLE_TCPIP &&                                          \\\n    ((defined(MG_EN"
  },
  {
    "path": "src/drivers/cyw.h",
    "chars": 1852,
    "preview": "#pragma once\n\n#if MG_ENABLE_TCPIP &&                                          \\\n    ((defined(MG_ENABLE_DRIVER_CYW) && M"
  },
  {
    "path": "src/drivers/imxrt.c",
    "chars": 9814,
    "preview": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && \\\n  (defined(MG_ENABLE_DRIVER_IMXRT10) && MG_ENABLE_DRIVER_IMXRT10) || "
  },
  {
    "path": "src/drivers/imxrt.h",
    "chars": 1915,
    "preview": "#pragma once\n\n#if MG_ENABLE_TCPIP && \\\n  (defined(MG_ENABLE_DRIVER_IMXRT10) && MG_ENABLE_DRIVER_IMXRT10) || \\\n  (defined"
  },
  {
    "path": "src/drivers/nxp_wifi.c",
    "chars": 2541,
    "preview": "#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_NXP_WIFI) && \\\n    MG_ENABLE_DRIVER_NXP_WIFI\n\n#include \"drivers/nxp_wifi"
  },
  {
    "path": "src/drivers/nxp_wifi.h",
    "chars": 1184,
    "preview": "#pragma once\n\n#if MG_ENABLE_TCPIP  && \\\n    defined(MG_ENABLE_DRIVER_NXP_WIFI) && MG_ENABLE_DRIVER_NXP_WIFI\n\n\nstruct mg_"
  },
  {
    "path": "src/drivers/phy.c",
    "chars": 6862,
    "preview": "#include \"phy.h\"\n\nenum {                  // ID1  ID2\n  MG_PHY_KSZ8x = 0x22,  // 0022 156x - KSZ8081RNB, KSZ8091RNB\n  MG"
  },
  {
    "path": "src/drivers/phy.h",
    "chars": 624,
    "preview": "#pragma once\n\n#include \"net_builtin.h\"\n\nstruct mg_phy {\n  uint16_t (*read_reg)(uint8_t addr, uint8_t reg);\n  void (*writ"
  },
  {
    "path": "src/drivers/pico-w.c",
    "chars": 6188,
    "preview": "#if MG_ENABLE_TCPIP && MG_ARCH == MG_ARCH_PICOSDK && \\\n    defined(MG_ENABLE_DRIVER_PICO_W) && MG_ENABLE_DRIVER_PICO_W\n\n"
  },
  {
    "path": "src/drivers/pico-w.h",
    "chars": 1337,
    "preview": "#pragma once\n\n#if MG_ENABLE_TCPIP && MG_ARCH == MG_ARCH_PICOSDK && \\\n    defined(MG_ENABLE_DRIVER_PICO_W) && MG_ENABLE_D"
  },
  {
    "path": "src/drivers/ppp.c",
    "chars": 10487,
    "preview": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_PPP) && MG_ENABLE_DRIVER_PPP\n\n#define MG_PPP_F"
  },
  {
    "path": "src/drivers/ppp.h",
    "chars": 506,
    "preview": "#pragma once\n\nstruct mg_tcpip_driver_ppp_data {\n  void *uart;                   // Opaque UART bus descriptor\n  void (*r"
  },
  {
    "path": "src/drivers/ra.c",
    "chars": 10180,
    "preview": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && \\\n  (defined(MG_ENABLE_DRIVER_RA6) && MG_ENABLE_DRIVER_RA6) || \\\n  (def"
  },
  {
    "path": "src/drivers/ra.h",
    "chars": 1572,
    "preview": "#pragma once\n\n#if MG_ENABLE_TCPIP && \\\n  (defined(MG_ENABLE_DRIVER_RA6) && MG_ENABLE_DRIVER_RA6) || \\\n  (defined(MG_ENAB"
  },
  {
    "path": "src/drivers/rw612.c",
    "chars": 8114,
    "preview": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_RW612) && MG_ENABLE_DRIVER_RW612\n\nstruct ENET_"
  },
  {
    "path": "src/drivers/rw612.h",
    "chars": 1773,
    "preview": "#pragma once\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_RW612) && MG_ENABLE_DRIVER_RW612\n\nstruct mg_tcpip_driver_r"
  },
  {
    "path": "src/drivers/same54.c",
    "chars": 10104,
    "preview": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_SAME54) && \\\n    MG_ENABLE_DRIVER_SAME54\n\nstru"
  },
  {
    "path": "src/drivers/same54.h",
    "chars": 1277,
    "preview": "#pragma once\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_SAME54) && \\\n    MG_ENABLE_DRIVER_SAME54\n\n#ifndef MG_DRIVE"
  },
  {
    "path": "src/drivers/sdio.c",
    "chars": 6758,
    "preview": "#include \"sdio.h\"\n\n#if MG_ENABLE_TCPIP && \\\n    (defined(MG_ENABLE_DRIVER_CYW_SDIO) && MG_ENABLE_DRIVER_CYW_SDIO)\n\n// SD"
  },
  {
    "path": "src/drivers/sdio.h",
    "chars": 1824,
    "preview": "#pragma once\n\n#if MG_ENABLE_TCPIP && \\\n    (defined(MG_ENABLE_DRIVER_CYW_SDIO) && MG_ENABLE_DRIVER_CYW_SDIO)\n\n// Specifi"
  },
  {
    "path": "src/drivers/st67w6.c",
    "chars": 18121,
    "preview": "#include \"st67w6.h\"\n#include \"net.h\"\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_ST67W6) && \\\n    MG_ENABLE_DRIVER_"
  },
  {
    "path": "src/drivers/st67w6.h",
    "chars": 1601,
    "preview": "#pragma once\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_ST67W6) && \\\n    MG_ENABLE_DRIVER_ST67W6\n\nstruct mg_tcpip_"
  },
  {
    "path": "src/drivers/stm32f.c",
    "chars": 10741,
    "preview": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_STM32F) && \\\n    MG_ENABLE_DRIVER_STM32F\nstruc"
  },
  {
    "path": "src/drivers/stm32f.h",
    "chars": 2066,
    "preview": "#pragma once\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_STM32F) && \\\n    MG_ENABLE_DRIVER_STM32F\n\nstruct mg_tcpip_"
  },
  {
    "path": "src/drivers/stm32h.c",
    "chars": 14929,
    "preview": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && (MG_ENABLE_DRIVER_STM32H || MG_ENABLE_DRIVER_MCXN || \\\n                "
  },
  {
    "path": "src/drivers/stm32h.h",
    "chars": 3151,
    "preview": "#pragma once\n\n#if MG_ENABLE_TCPIP\n#if !defined(MG_ENABLE_DRIVER_STM32H)\n#define MG_ENABLE_DRIVER_STM32H 0\n#endif\n#if !de"
  },
  {
    "path": "src/drivers/tm4c.c",
    "chars": 11623,
    "preview": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_TM4C) && MG_ENABLE_DRIVER_TM4C\nstruct tm4c_ema"
  },
  {
    "path": "src/drivers/tm4c.h",
    "chars": 1589,
    "preview": "#pragma once\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_TM4C) && MG_ENABLE_DRIVER_TM4C\n\nstruct mg_tcpip_driver_tm4"
  },
  {
    "path": "src/drivers/tms570.c",
    "chars": 10310,
    "preview": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_TMS570) && MG_ENABLE_DRIVER_TMS570\nstruct tms5"
  },
  {
    "path": "src/drivers/tms570.h",
    "chars": 1237,
    "preview": "#pragma once\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_TMS570) && MG_ENABLE_DRIVER_TMS570\nstruct mg_tcpip_driver_"
  },
  {
    "path": "src/drivers/w5100.c",
    "chars": 4958,
    "preview": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_W5100) && MG_ENABLE_DRIVER_W5100\n\nstatic void "
  },
  {
    "path": "src/drivers/w5500.c",
    "chars": 4655,
    "preview": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_W5500) && MG_ENABLE_DRIVER_W5500\n\nenum { W5500"
  },
  {
    "path": "src/drivers/xmc.c",
    "chars": 9020,
    "preview": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_XMC) && MG_ENABLE_DRIVER_XMC\n\nstruct ETH_GLOBA"
  },
  {
    "path": "src/drivers/xmc.h",
    "chars": 1897,
    "preview": "#pragma once\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_XMC) && MG_ENABLE_DRIVER_XMC\n\nstruct mg_tcpip_driver_xmc_d"
  },
  {
    "path": "src/drivers/xmc7.c",
    "chars": 10712,
    "preview": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_XMC7) && MG_ENABLE_DRIVER_XMC7\n\nstruct ETH_Typ"
  },
  {
    "path": "src/drivers/xmc7.h",
    "chars": 1297,
    "preview": "#pragma once\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_XMC7) && MG_ENABLE_DRIVER_XMC7\n\nstruct mg_tcpip_driver_xmc"
  },
  {
    "path": "src/event.c",
    "chars": 1178,
    "preview": "#include \"event.h\"\n#include \"log.h\"\n#include \"net.h\"\n#include \"printf.h\"\n#include \"profile.h\"\n\nvoid mg_call(struct mg_co"
  },
  {
    "path": "src/event.h",
    "chars": 1877,
    "preview": "#pragma once\n\nstruct mg_connection;\ntypedef void (*mg_event_handler_t)(struct mg_connection *, int ev,\n                 "
  },
  {
    "path": "src/flash.c",
    "chars": 2242,
    "preview": "#include \"arch.h\"\n#include \"flash.h\"\n#include \"log.h\"\n#include \"ota.h\"\n\n#if MG_OTA != MG_OTA_NONE && MG_OTA != MG_OTA_CU"
  },
  {
    "path": "src/flash.h",
    "chars": 612,
    "preview": "#include \"arch.h\"\n#include \"ota.h\"\n\n#if MG_OTA != MG_OTA_NONE && MG_OTA != MG_OTA_CUSTOM\n\nstruct mg_flash {\n  void *star"
  },
  {
    "path": "src/fmt.c",
    "chars": 7762,
    "preview": "#include \"fmt.h\"\n#include \"printf.h\"\n#include \"util.h\"\n\nstatic bool is_digit(int c) {\n  return c >= '0' && c <= '9';\n}\n\n"
  },
  {
    "path": "src/fmt.h",
    "chars": 336,
    "preview": "#pragma once\n\n#include \"arch.h\"\n\ntypedef void (*mg_pfn_t)(char, void *);                  // Output function\ntypedef siz"
  },
  {
    "path": "src/fs.c",
    "chars": 2442,
    "preview": "#include \"fs.h\"\n#include \"printf.h\"\n#include \"str.h\"\n#include \"util.h\"\n\nstruct mg_fd *mg_fs_open(struct mg_fs *fs, const"
  },
  {
    "path": "src/fs.h",
    "chars": 2236,
    "preview": "#pragma once\n\n#include \"arch.h\"\n#include \"config.h\"\n\nenum { MG_FS_READ = 1, MG_FS_WRITE = 2, MG_FS_DIR = 4 };\n\n// Filesy"
  },
  {
    "path": "src/fs_fat.c",
    "chars": 3373,
    "preview": "#include \"arch.h\"\n#include \"fs.h\"\n\n#if MG_ENABLE_FATFS\n#include <ff.h>\n\nstatic int mg_days_from_epoch(int y, int m, int "
  },
  {
    "path": "src/fs_packed.c",
    "chars": 3532,
    "preview": "#include \"fs.h\"\n#include \"printf.h\"\n#include \"str.h\"\n#include \"util.h\"\n\nstruct packed_file {\n  const char *data;\n  size_"
  },
  {
    "path": "src/fs_posix.c",
    "chars": 7108,
    "preview": "#include \"fs.h\"\n\n#if MG_ENABLE_POSIX_FS\n\n#ifndef MG_STAT_STRUCT\n#define MG_STAT_STRUCT stat\n#endif\n\n#ifndef MG_STAT_FUNC"
  },
  {
    "path": "src/http.c",
    "chars": 43794,
    "preview": "#include \"http.h\"\n#include \"arch.h\"\n#include \"base64.h\"\n#include \"fmt.h\"\n#include \"json.h\"\n#include \"log.h\"\n#include \"ne"
  },
  {
    "path": "src/http.h",
    "chars": 3189,
    "preview": "#pragma once\n\n#include \"arch.h\"\n#include \"config.h\"\n#include \"fs.h\"\n#include \"net.h\"\n#include \"str.h\"\n\nstruct mg_http_he"
  },
  {
    "path": "src/iobuf.c",
    "chars": 2076,
    "preview": "#include \"iobuf.h\"\n#include \"arch.h\"\n#include \"log.h\"\n#include \"util.h\"\n\nstatic size_t roundup(size_t size, size_t align"
  },
  {
    "path": "src/iobuf.h",
    "chars": 532,
    "preview": "#pragma once\n\n#include \"arch.h\"\n\nstruct mg_iobuf {\n  unsigned char *buf;  // Pointer to stored data\n  size_t size;      "
  },
  {
    "path": "src/json.c",
    "chars": 12399,
    "preview": "#include \"json.h\"\n#include \"base64.h\"\n#include \"fmt.h\"\n#include \"util.h\"\n\nstatic const char *escapeseq(int esc) {\n  retu"
  },
  {
    "path": "src/json.h",
    "chars": 986,
    "preview": "#pragma once\n\n#include \"arch.h\"\n#include \"str.h\"\n\n#ifndef MG_JSON_MAX_DEPTH\n#define MG_JSON_MAX_DEPTH 30\n#endif\n\n// Erro"
  },
  {
    "path": "src/l2.c",
    "chars": 5507,
    "preview": "#include \"l2.h\"\n#include \"net.h\"\n#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP\n\n// L2 API\nvoid mg_l2_init(enum mg_l2type"
  },
  {
    "path": "src/l2.h",
    "chars": 917,
    "preview": "#pragma once\n\n#include \"arch.h\"\n#include \"config.h\"\n\n#if MG_ENABLE_TCPIP\n\n// no config defaults to 0 => Ethernet\nenum mg"
  },
  {
    "path": "src/l2_eth.c",
    "chars": 5227,
    "preview": "#include \"l2.h\"\n#include \"log.h\"\n#include \"net.h\"\n#include \"net_builtin.h\"\n#include \"printf.h\"\n#include \"util.h\"\n\n#if MG"
  },
  {
    "path": "src/l2_ppp.c",
    "chars": 2310,
    "preview": "#include \"l2.h\"\n#include \"log.h\"\n#include \"net.h\"\n#include \"net_builtin.h\"\n#include \"printf.h\"\n#include \"util.h\"\n\n#if MG"
  },
  {
    "path": "src/license.h",
    "chars": 832,
    "preview": "// Copyright (c) 2004-2013 Sergey Lyubka\n// Copyright (c) 2013-2025 Cesanta Software Limited\n// All rights reserved\n//\n/"
  },
  {
    "path": "src/log.c",
    "chars": 2202,
    "preview": "#include \"log.h\"\n#include \"printf.h\"\n#include \"str.h\"\n#include \"util.h\"\n\nint mg_log_level = MG_LL_DEBUG;\nstatic mg_pfn_t"
  },
  {
    "path": "src/log.h",
    "chars": 1454,
    "preview": "#pragma once\n\n#include \"arch.h\"\n#include \"config.h\"\n#include \"fmt.h\"\n\nenum { MG_LL_NONE, MG_LL_ERROR, MG_LL_INFO, MG_LL_"
  },
  {
    "path": "src/md5.c",
    "chars": 6657,
    "preview": "#include \"arch.h\"\n#include \"md5.h\"\n\n//  This code implements the MD5 message-digest algorithm.\n//  The algorithm is due "
  },
  {
    "path": "src/md5.h",
    "chars": 288,
    "preview": "#pragma once\n\n#include \"arch.h\"\n\ntypedef struct {\n  uint32_t buf[4];\n  uint32_t bits[2];\n  unsigned char in[64];\n} mg_md"
  },
  {
    "path": "src/mqtt.c",
    "chars": 21150,
    "preview": "#include \"arch.h\"\n#include \"base64.h\"\n#include \"event.h\"\n#include \"log.h\"\n#include \"mqtt.h\"\n#include \"url.h\"\n#include \"u"
  },
  {
    "path": "src/mqtt.h",
    "chars": 4864,
    "preview": "#pragma once\n\n#include \"net.h\"\n#include \"str.h\"\n\n#define MQTT_CMD_CONNECT 1\n#define MQTT_CMD_CONNACK 2\n#define MQTT_CMD_"
  },
  {
    "path": "src/net.c",
    "chars": 10448,
    "preview": "#include \"net.h\"\n#include \"dns.h\"\n#include \"fmt.h\"\n#include \"log.h\"\n#include \"printf.h\"\n#include \"profile.h\"\n#include \"t"
  },
  {
    "path": "src/net.h",
    "chars": 5638,
    "preview": "#pragma once\n\n#include \"arch.h\"\n#include \"config.h\"\n#include \"event.h\"\n#include \"iobuf.h\"\n#include \"net_builtin.h\"\n#incl"
  },
  {
    "path": "src/net_builtin.c",
    "chars": 85222,
    "preview": "#include \"net_builtin.h\"\n#include \"profile.h\"\n\n#if MG_ENABLE_TCPIP\n#define MG_EPHEMERAL_PORT_BASE 32768\n#define PDIFF(a,"
  },
  {
    "path": "src/net_builtin.h",
    "chars": 7300,
    "preview": "#pragma once\n\n#include \"arch.h\"\n#include \"l2.h\"\n#include \"net.h\"\n#include \"queue.h\"\n#include \"str.h\"\n\n#if MG_ENABLE_TCPI"
  },
  {
    "path": "src/net_ft.h",
    "chars": 2388,
    "preview": "#pragma once\n\n#if defined(MG_ENABLE_FREERTOS_TCP) && MG_ENABLE_FREERTOS_TCP\n\n#include <limits.h>\n#include <list.h>\n\n#inc"
  },
  {
    "path": "src/net_lwip.h",
    "chars": 516,
    "preview": "#pragma once\n\n#if defined(MG_ENABLE_LWIP) && MG_ENABLE_LWIP\n\n#if defined(__GNUC__) && !defined(__ARMCC_VERSION)\n#include"
  },
  {
    "path": "src/net_rl.h",
    "chars": 751,
    "preview": "#pragma once\n\n#if defined(MG_ENABLE_RL) && MG_ENABLE_RL\n#include <rl_net.h>\n\n#define closesocket(x) closesocket(x)\n\n#def"
  },
  {
    "path": "src/ota.h",
    "chars": 1407,
    "preview": "// Copyright (c) 2023 Cesanta Software Limited\n// All rights reserved\n\n#pragma once\n\n#include \"arch.h\"\n\n#define MG_OTA_N"
  },
  {
    "path": "src/ota_ch32v307.c",
    "chars": 3372,
    "preview": "#include \"flash.h\"\n#include \"log.h\"\n#include \"ota.h\"\n\n#if MG_OTA == MG_OTA_CH32V307\n// RM: https://www.wch-ic.com/downlo"
  },
  {
    "path": "src/ota_dummy.c",
    "chars": 292,
    "preview": "#include \"log.h\"\n#include \"ota.h\"\n\n#if MG_OTA == MG_OTA_NONE\nbool mg_ota_begin(size_t new_firmware_size) {\n  (void) new_"
  },
  {
    "path": "src/ota_esp32.c",
    "chars": 1612,
    "preview": "#include \"arch.h\"\n\n#if MG_ARCH == MG_ARCH_ESP32 && MG_OTA == MG_OTA_ESP32\n\nstatic const esp_partition_t *s_ota_update_pa"
  },
  {
    "path": "src/ota_imxrt.c",
    "chars": 26556,
    "preview": "#include \"flash.h\"\n#include \"log.h\"\n#include \"ota.h\"\n\n#if MG_OTA >= MG_OTA_RT1020 && MG_OTA <= MG_OTA_RT1170\n\nstatic boo"
  },
  {
    "path": "src/ota_mcxn.c",
    "chars": 7149,
    "preview": "#include \"flash.h\"\n#include \"log.h\"\n#include \"ota.h\"\n\n#if MG_OTA == MG_OTA_MCXN\n\n// - Flash phrase: 16 bytes; smallest p"
  },
  {
    "path": "src/ota_picosdk.c",
    "chars": 6422,
    "preview": "#include \"flash.h\"\n#include \"log.h\"\n#include \"ota.h\"\n\n#if MG_OTA == MG_OTA_PICOSDK\n\n// Both RP2040 and RP2350 have no fl"
  },
  {
    "path": "src/ota_rw612.c",
    "chars": 13172,
    "preview": "#include \"flash.h\"\n#include \"log.h\"\n#include \"ota.h\"\n\n#if MG_OTA == MG_OTA_RW612\n\nMG_IRAM static bool mg_frdm_write(void"
  },
  {
    "path": "src/ota_stm32f.c",
    "chars": 7583,
    "preview": "#include \"flash.h\"\n#include \"log.h\"\n#include \"ota.h\"\n\n#if MG_OTA == MG_OTA_STM32F\n\nstatic bool mg_stm32f_write(void *, c"
  },
  {
    "path": "src/ota_stm32h5.c",
    "chars": 5099,
    "preview": "#include \"flash.h\"\n#include \"log.h\"\n#include \"ota.h\"\n\n#if MG_OTA == MG_OTA_STM32H5\n\nstatic bool mg_stm32h5_write(void *,"
  },
  {
    "path": "src/ota_stm32h7.c",
    "chars": 7893,
    "preview": "#include \"flash.h\"\n#include \"log.h\"\n#include \"ota.h\"\n\n#if MG_OTA == MG_OTA_STM32H7 || MG_OTA == MG_OTA_STM32H7_DUAL_CORE"
  },
  {
    "path": "src/printf.c",
    "chars": 5817,
    "preview": "#include \"fmt.h\"\n#include \"printf.h\"\n#include \"util.h\"\n\nsize_t mg_queue_printf(struct mg_queue *q, const char *fmt, ...)"
  },
  {
    "path": "src/printf.h",
    "chars": 1465,
    "preview": "#pragma once\n\n#include \"arch.h\"\n#include \"iobuf.h\"\n#include \"queue.h\"\n\n// Convenience wrappers around mg_xprintf\nsize_t "
  },
  {
    "path": "src/profile.h",
    "chars": 3477,
    "preview": "#pragma once\n#include \"iobuf.h\"\n\n// Macros to record timestamped events that happens with a connection.\n// They are save"
  },
  {
    "path": "src/queue.c",
    "chars": 2941,
    "preview": "#include \"queue.h\"\n#include \"util.h\"\n\n#if (defined(__GNUC__) && (__GNUC__ > 4) ||                                \\\n     "
  },
  {
    "path": "src/queue.h",
    "chars": 587,
    "preview": "#pragma once\n\n#include \"arch.h\"  // For size_t\n\n// Single producer, single consumer non-blocking queue\n\nstruct mg_queue "
  },
  {
    "path": "src/rpc.c",
    "chars": 3422,
    "preview": "#include \"rpc.h\"\n#include \"printf.h\"\n#include \"util.h\"\n\nvoid mg_rpc_add(struct mg_rpc **head, struct mg_str method,\n    "
  },
  {
    "path": "src/rpc.h",
    "chars": 1357,
    "preview": "#pragma once\n#include \"fmt.h\"\n#include \"json.h\"\n\n// JSON-RPC request descriptor\nstruct mg_rpc_req {\n  struct mg_rpc **he"
  },
  {
    "path": "src/sha1.c",
    "chars": 5824,
    "preview": "/* Copyright(c) By Steve Reid <steve@edmweb.com> */\n/* 100% Public Domain */\n#include \"arch.h\"\n#include \"sha1.h\"\n\nunion "
  },
  {
    "path": "src/sha1.h",
    "chars": 306,
    "preview": "#pragma once\n\n#include \"arch.h\"\n\ntypedef struct {\n  uint32_t state[5];\n  uint32_t count[2];\n  unsigned char buffer[64];\n"
  },
  {
    "path": "src/sha256.c",
    "chars": 14212,
    "preview": "// https://github.com/B-Con/crypto-algorithms\n// Author:     Brad Conte (brad AT bradconte.com)\n// Disclaimer: This code"
  },
  {
    "path": "src/sha256.h",
    "chars": 1154,
    "preview": "// https://github.com/B-Con/crypto-algorithms\n// Author:     Brad Conte (brad AT bradconte.com)\n// Disclaimer: This code"
  },
  {
    "path": "src/sntp.c",
    "chars": 3257,
    "preview": "#include \"sntp.h\"\n#include \"arch.h\"\n#include \"event.h\"\n#include \"log.h\"\n#include \"util.h\"\n\n#define SNTP_TIME_OFFSET 2208"
  },
  {
    "path": "src/sntp.h",
    "chars": 355,
    "preview": "#pragma once\n\n#include \"net.h\"\n\nstruct mg_connection *mg_sntp_connect(struct mg_mgr *mgr, const char *url,\n             "
  },
  {
    "path": "src/sock.c",
    "chars": 27218,
    "preview": "#include \"dns.h\"\n#include \"event.h\"\n#include \"log.h\"\n#include \"net.h\"\n#include \"printf.h\"\n#include \"str.h\"\n#include \"tim"
  },
  {
    "path": "src/ssi.c",
    "chars": 3802,
    "preview": "#include \"ssi.h\"\n#include \"log.h\"\n#include \"printf.h\"\n#include \"util.h\"\n\n#ifndef MG_MAX_SSI_DEPTH\n#define MG_MAX_SSI_DEP"
  },
  {
    "path": "src/ssi.h",
    "chars": 143,
    "preview": "#pragma once\n#include \"http.h\"\nvoid mg_http_serve_ssi(struct mg_connection *c, const char *root,\n                       "
  },
  {
    "path": "src/str.c",
    "chars": 5751,
    "preview": "#include \"str.h\"\n#include \"util.h\"\n\nstruct mg_str mg_str_s(const char *s) {\n  struct mg_str str;\n  str.buf = (char *) s,"
  },
  {
    "path": "src/str.h",
    "chars": 806,
    "preview": "#pragma once\n\n#include \"arch.h\"\n\n// Describes an arbitrary chunk of memory\nstruct mg_str {\n  char *buf;   // String data"
  },
  {
    "path": "src/timer.c",
    "chars": 1737,
    "preview": "#include \"arch.h\"\n#include \"timer.h\"\n#include \"util.h\"\n\nvoid mg_timer_init(struct mg_timer **head, struct mg_timer *t, u"
  },
  {
    "path": "src/timer.h",
    "chars": 1089,
    "preview": "#pragma once\n\n#include \"arch.h\"\n\nstruct mg_timer {\n  uint64_t period_ms;          // Timer period in milliseconds\n  uint"
  },
  {
    "path": "src/tls.h",
    "chars": 1484,
    "preview": "#pragma once\n\n#define MG_TLS_NONE 0     // No TLS support\n#define MG_TLS_MBED 1     // mbedTLS\n#define MG_TLS_OPENSSL 2 "
  },
  {
    "path": "src/tls_aes128.c",
    "chars": 45751,
    "preview": "/******************************************************************************\n *\n * THIS SOURCE CODE IS HEREBY PLACED "
  },
  {
    "path": "src/tls_aes128.h",
    "chars": 2807,
    "preview": "/******************************************************************************\n *\n * THIS SOURCE CODE IS HEREBY PLACED "
  },
  {
    "path": "src/tls_builtin.c",
    "chars": 88715,
    "preview": "#include \"base64.h\"\n#include \"config.h\"\n#include \"printf.h\"\n#include \"sha256.h\"\n#include \"tls.h\"\n#include \"tls_aes128.h\""
  },
  {
    "path": "src/tls_chacha20.c",
    "chars": 38870,
    "preview": "// portable8439 v1.0.1\n// Source: https://github.com/DavyLandman/portable8439\n// Licensed under CC0-1.0\n// Contains poly"
  },
  {
    "path": "src/tls_chacha20.h",
    "chars": 3895,
    "preview": "// portable8439 v1.0.1\n// Source: https://github.com/DavyLandman/portable8439\n// Licensed under CC0-1.0\n// Contains poly"
  },
  {
    "path": "src/tls_dummy.c",
    "chars": 810,
    "preview": "#include \"tls.h\"\n\n#if MG_TLS == MG_TLS_NONE\nvoid mg_tls_init(struct mg_connection *c, const struct mg_tls_opts *opts) {\n"
  },
  {
    "path": "src/tls_mbed.c",
    "chars": 10070,
    "preview": "#include \"log.h\"\n#include \"printf.h\"\n#include \"profile.h\"\n#include \"tls.h\"\n#include \"util.h\"\n\n#if MG_TLS == MG_TLS_MBED\n"
  },
  {
    "path": "src/tls_mbed.h",
    "chars": 920,
    "preview": "#pragma once\n\n#include \"config.h\"\n#include \"log.h\"\n#include \"url.h\"\n#include \"util.h\"\n\n#if MG_TLS == MG_TLS_MBED\n#includ"
  },
  {
    "path": "src/tls_openssl.c",
    "chars": 9571,
    "preview": "#include \"printf.h\"\n#include \"tls.h\"\n#include \"util.h\"\n\n#if MG_TLS == MG_TLS_OPENSSL || MG_TLS == MG_TLS_WOLFSSL\n\nstatic"
  },
  {
    "path": "src/tls_openssl.h",
    "chars": 195,
    "preview": "#pragma once\n\n#if MG_TLS == MG_TLS_OPENSSL || MG_TLS == MG_TLS_WOLFSSL\n\n#include <openssl/err.h>\n#include <openssl/ssl.h"
  },
  {
    "path": "src/tls_rsa.c",
    "chars": 47657,
    "preview": "#include \"tls.h\"\n#include \"tls_rsa.h\"\n#include \"util.h\"\n\n#if MG_TLS == MG_TLS_BUILTIN\n\n#define NS_INTERNAL static\ntypede"
  },
  {
    "path": "src/tls_rsa.h",
    "chars": 606,
    "preview": "#ifndef TLS_RSA_H\n#define TLS_RSA_H\n\n#include \"arch.h\"\nint mg_rsa_mod_pow(const uint8_t *mod, size_t modsz, const uint8_"
  },
  {
    "path": "src/tls_uecc.c",
    "chars": 110150,
    "preview": "/* Copyright 2014, Kenneth MacKay. Licensed under the BSD 2-clause license. */\n\n#include \"tls_uecc.h\"\n#include \"tls.h\"\n\n"
  },
  {
    "path": "src/tls_uecc.h",
    "chars": 24172,
    "preview": "#pragma once\n#include \"arch.h\"\n\n#define MG_UECC_SUPPORTS_secp256r1 1\n/* Copyright 2014, Kenneth MacKay. Licensed under t"
  },
  {
    "path": "src/tls_x25519.c",
    "chars": 7628,
    "preview": "/**\n * Adapted from STROBE: https://strobe.sourceforge.io/\n * Copyright (c) 2015-2016 Cryptography Research, Inc.\n * Aut"
  },
  {
    "path": "src/tls_x25519.h",
    "chars": 312,
    "preview": "#ifndef TLS_X15519_H\n#define TLS_X15519_H\n\n#include \"arch.h\"\n\n#define X25519_BYTES 32\nextern const uint8_t X25519_BASE_P"
  },
  {
    "path": "src/url.c",
    "chars": 2447,
    "preview": "#include \"url.h\"\n\nstruct url {\n  size_t key, user, pass, host, port, uri, end;\n};\n\nint mg_url_is_ssl(const char *url) {\n"
  },
  {
    "path": "src/url.h",
    "chars": 285,
    "preview": "#pragma once\n#include \"str.h\"\n\nunsigned short mg_url_port(const char *url);\nint mg_url_is_ssl(const char *url);\nstruct m"
  },
  {
    "path": "src/util.c",
    "chars": 7663,
    "preview": "#include \"util.h\"\n#include \"log.h\"\n\n// Not using memset for zeroing memory, cause it can be dropped by compiler\n// See h"
  },
  {
    "path": "src/util.h",
    "chars": 5633,
    "preview": "#pragma once\n\n#include \"arch.h\"\n#include \"config.h\"\n#include \"net.h\"\n#include \"str.h\"\n\n#if MG_ENABLE_ASSERT\n#include <as"
  },
  {
    "path": "src/version.h",
    "chars": 26,
    "preview": "#define MG_VERSION \"7.20\"\n"
  },
  {
    "path": "src/wifi.h",
    "chars": 1059,
    "preview": "#pragma once\n\n#include \"arch.h\"\n#include \"log.h\"\n#include \"str.h\"\n\nstruct mg_wifi_data {\n  char *ssid, *pass;      // ST"
  },
  {
    "path": "src/wifi_dummy.c",
    "chars": 780,
    "preview": "#include \"wifi.h\"\n\n#if (!defined(MG_ENABLE_DRIVER_PICO_W) || !MG_ENABLE_DRIVER_PICO_W) && \\\n    (!defined(MG_ENABLE_DRIV"
  },
  {
    "path": "src/ws.c",
    "chars": 10154,
    "preview": "#include \"ws.h\"\n\n#include \"base64.h\"\n#include \"fmt.h\"\n#include \"http.h\"\n#include \"log.h\"\n#include \"printf.h\"\n#include \"s"
  },
  {
    "path": "src/ws.h",
    "chars": 973,
    "preview": "#pragma once\n\n#define WEBSOCKET_OP_CONTINUE 0\n#define WEBSOCKET_OP_TEXT 1\n#define WEBSOCKET_OP_BINARY 2\n#define WEBSOCKE"
  },
  {
    "path": "test/Makefile",
    "chars": 13768,
    "preview": "SRCS = mongoose.c unit_test.c packed_fs.c\nHDRS = $(wildcard ../src/*.h) $(wildcard ../src/drivers/*.h)\nDEFS ?= -DMG_MAX_"
  },
  {
    "path": "test/arduino/Makefile",
    "chars": 2917,
    "preview": "# arduino-nano fails on the flash size department, need to reduce unused function footprint (sha256, sha384 ?)\n# teensy4"
  },
  {
    "path": "test/certs/ca.crt",
    "chars": 436,
    "preview": "-----BEGIN CERTIFICATE-----\nMIIBFTCBvAIJAMNTFtpfcq8NMAoGCCqGSM49BAMCMBMxETAPBgNVBAMMCE1vbmdv\nb3NlMB4XDTI0MDUwNzE0MzczNlo"
  },
  {
    "path": "test/certs/ca.key",
    "chars": 227,
    "preview": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIJqrhcIKC5dk0omuRJRnzCXdfxevxnabQEnOWlL6P6x1oAoGCCqGSM49\nAwEHoUQDQgAErj/vOk/6zlpx"
  },
  {
    "path": "test/certs/ca.srl",
    "chars": 17,
    "preview": "96EAA481EB95FF36\n"
  },
  {
    "path": "test/certs/client.crt",
    "chars": 477,
    "preview": "-----BEGIN CERTIFICATE-----\nMIIBMjCB2aADAgECAgkAluqkgeuV/zYwCgYIKoZIzj0EAwIwEzERMA8GA1UEAwwI\nTW9uZ29vc2UwHhcNMjQwNTA3MTQ"
  },
  {
    "path": "test/certs/client.csr",
    "chars": 351,
    "preview": "-----BEGIN CERTIFICATE REQUEST-----\nMIHKMHMCAQAwETEPMA0GA1UEAwwGY2xpZW50MFkwEwYHKoZIzj0CAQYIKoZIzj0D\nAQcDQgAElzVqc606GSU"
  },
  {
    "path": "test/certs/client.key",
    "chars": 227,
    "preview": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIGzf9AgYx3RfhzMGwv5EWgzoQh/EDfFpieFgfpTisWbAoAoGCCqGSM49\nAwEHoUQDQgAElzVqc606GSUF"
  },
  {
    "path": "test/certs/generate.sh",
    "chars": 1341,
    "preview": "#/bin/sh\n#\n# Geneate self-signed ECC certificates\n\ncd `dirname $0`\n\n# Create cnf for adding SAN DNS:localhost\n# See http"
  },
  {
    "path": "test/certs/server.crt",
    "chars": 473,
    "preview": "-----BEGIN CERTIFICATE-----\nMIIBMTCB2aADAgECAgkAluqkgeuV/zUwCgYIKoZIzj0EAwIwEzERMA8GA1UEAwwI\nTW9uZ29vc2UwHhcNMjQwNTA3MTQ"
  },
  {
    "path": "test/certs/server.csr",
    "chars": 351,
    "preview": "-----BEGIN CERTIFICATE REQUEST-----\nMIHMMHMCAQAwETEPMA0GA1UEAwwGc2VydmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0D\nAQcDQgAEqN6BIhvgbk7"
  },
  {
    "path": "test/certs/server.key",
    "chars": 227,
    "preview": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIAVdo8UAScxG7jiuNY2UZESNX/KPH8qJ0u0gOMMsAzYWoAoGCCqGSM49\nAwEHoUQDQgAEqN6BIhvgbk7e"
  },
  {
    "path": "test/cgt+make/Makefile",
    "chars": 234,
    "preview": "ROOT ?= $(realpath $(CURDIR)/../..)\nTARGET ?= Debug\nDOCKER = docker run --rm -v $(ROOT):$(ROOT) -v $(CURDIR):/root -w $("
  },
  {
    "path": "test/configs/mongoose_config_full.h",
    "chars": 3087,
    "preview": "#pragma once\n\n// Build environment. Possible options are at https://github.com/cesanta/mongoose/blob/master/src/arch.h\n/"
  },
  {
    "path": "test/cube/Makefile",
    "chars": 1447,
    "preview": "ROOT ?= $(realpath $(CURDIR)/../..)\nPROJECTS ?= $(wildcard ../../tutorials/stm32/nucleo-*-cube-*)\nTARGET ?= Debug\nDOCKER"
  },
  {
    "path": "test/data/..ddot/index.html",
    "chars": 3,
    "preview": "hi\n"
  },
  {
    "path": "test/data/404.html",
    "chars": 4,
    "preview": "boo\n"
  },
  {
    "path": "test/data/a.txt",
    "chars": 6,
    "preview": "hello\n"
  },
  {
    "path": "test/data/ca.pem",
    "chars": 37587,
    "preview": "Issuer: C=US, O=Internet Security Research Group, CN=ISRG Root X1\nNot Before: Mar 13 00:00:00 2024 GMT\nNot After : Mar 1"
  },
  {
    "path": "test/data/dredir/index.html",
    "chars": 3,
    "preview": "hi\n"
  },
  {
    "path": "test/data/e8.crt",
    "chars": 1799,
    "preview": "\n 1 s:C=US, O=Let's Encrypt, CN=E8\n   i:C=US, O=Internet Security Research Group, CN=ISRG Root X1\n   a:PKEY: id-ecPublic"
  },
  {
    "path": "test/data/empty.js",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "test/data/gzip.txt",
    "chars": 3,
    "preview": "hi\n"
  },
  {
    "path": "test/data/index.html",
    "chars": 3,
    "preview": "hi\n"
  },
  {
    "path": "test/data/range.txt",
    "chars": 312,
    "preview": "Faith of consciousness is freedom\nFaith of feeling is weakness\nFaith of body is stupidity.\nLove of consciousness evokes "
  },
  {
    "path": "test/data/secret/secret.txt",
    "chars": 7,
    "preview": "secret\n"
  },
  {
    "path": "test/data/ss_ca.pem",
    "chars": 2098,
    "preview": "Certificate:\n    Data:\n        Version: 3 (0x2)\n        Serial Number:\n            11:2a:0e:3c:6a:8c:85:ff:6e:6a:bc:db:9"
  },
  {
    "path": "test/data/ss_client.pem",
    "chars": 2314,
    "preview": "Certificate:\n    Data:\n        Version: 3 (0x2)\n        Serial Number:\n            03:d8:95:71:ba:5f:70:c8:4d:6a:e8:a6:0"
  },
  {
    "path": "test/data/ss_server.pem",
    "chars": 2314,
    "preview": "Certificate:\n    Data:\n        Version: 3 (0x2)\n        Serial Number:\n            6e:73:28:55:df:13:b5:61:f5:4f:4f:5d:0"
  },
  {
    "path": "test/data/ssi/f1.txt",
    "chars": 11,
    "preview": "this is f1\n"
  },
  {
    "path": "test/data/ssi/index.shtml",
    "chars": 89,
    "preview": "this is index\n<!--#include file=\"nested.shtml\" -->\n<!--#include file=\"recurse.shtml\" -->\n"
  },
  {
    "path": "test/data/ssi/nested.shtml",
    "chars": 93,
    "preview": "this is nested\n<!--#include virtual=\"/notexist.txt\"-->\n<!--#include virtual=\"/ssi/f1.txt\"-->\n"
  },
  {
    "path": "test/data/ssi/recurse.shtml",
    "chars": 45,
    "preview": "<!--#include file=\"recurse.shtml\"-->\nrecurse\n"
  },
  {
    "path": "test/data/ws.hex",
    "chars": 67745,
    "preview": "0000  82 7e 00 b3 7b 22 6d 65 74 68 6f 64 22 3a 22 62  .~..{\"method\":\"b\n0010  6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d "
  }
]

// ... and 3736 more files (download for full content)

About this extraction

This page contains the full source code of the cesanta/mongoose GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 3936 files (95.8 MB), approximately 4.3M tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!