ciniml/WireGuard-ESP32-Arduino

The device with esphome.io firmware reboots approximately every 10 minutes

vsurkov opened this issue · 1 comments

Hi, i use library with esphome firmware on ESP32 nodemcu 38 pin board (esphome/feature-requests#1444 (comment)) everything is great, but controller reboots approximately every 10 minutes. I found the error on ESP log and here is it:

[21:28:17][D][sntp:075]: Synchronized time: 2021-12-19 21:28:17
[21:28:17][W][MyModule:020]: _________________________________________
[21:28:17][W][MyModule:021]: START wirenguard
[21:28:17][W][MyModule:023]: END wirenguard
[21:28:17][W][MyModule:024]: _________________________________________
[21:28:27]Guru Meditation Error: Core  0 panic'ed (LoadProhibited). Exception was unhandled.
[21:28:27]Core 0 register dump:
[21:28:27]PC      : 0x400e1177  PS      : 0x00060830  A0      : 0x800e1320  A1      : 0x3ffb5680  
WARNING Decoded 0x400e1177: wireguardif_peer_output at /data/my_awesome_controller_two/.piolibdeps/my_awesome_controller_two/WireGuard-ESP32/src/wireguardif.c:912
 (inlined by) wireguardif_output_to_peer at /data/my_awesome_controller_two/.piolibdeps/my_awesome_controller_two/WireGuard-ESP32/src/wireguardif.c:162
[21:28:27]A2      : 0x00000000  A3      : 0x3ffc1970  A4      : 0x3ffd4c34  A5      : 0x3ffd4d24  
[21:28:27]A6      : 0x3ffd5a34  A7      : 0x00000000  A8      : 0x800e116c  A9      : 0x3ffb5650  
[21:28:27]A10     : 0x3ffd5aa8  A11     : 0x3ffd5aa8  A12     : 0x3ffd4c50  A13     : 0x0000ca6c  
[21:28:28]A14     : 0xfffffffc  A15     : 0x00000002  SAR     : 0x00000019  EXCCAUSE: 0x0000001c  
[21:28:28]EXCVADDR: 0x00000008  LBEG    : 0x400e3e4a  LEND    : 0x400e3e5a  LCOUNT  : 0x00000000  
[21:28:28]
[21:28:28]ELF file SHA256: 0000000000000000
[21:28:28]
[21:28:28]Backtrace: 0x400e1177:0x3ffb5680 0x400e131d:0x3ffb56b0 0x40139e65:0x3ffb5780 0x4013a06c:0x3ffb57a0 0x4013462c:0x3ffb57c0 0x40089dca:0x3ffb57f0
WARNING Found stack trace! Trying to decode it
WARNING Decoded 0x400e1177: wireguardif_peer_output at /data/my_awesome_controller_two/.piolibdeps/my_awesome_controller_two/WireGuard-ESP32/src/wireguardif.c:912
 (inlined by) wireguardif_output_to_peer at /data/my_awesome_controller_two/.piolibdeps/my_awesome_controller_two/WireGuard-ESP32/src/wireguardif.c:162
WARNING Decoded 0x400e131d: wireguardif_send_keepalive at /data/my_awesome_controller_two/.piolibdeps/my_awesome_controller_two/WireGuard-ESP32/src/wireguardif.c:912
 (inlined by) wireguardif_tmr at /data/my_awesome_controller_two/.piolibdeps/my_awesome_controller_two/WireGuard-ESP32/src/wireguardif.c:879
WARNING Decoded 0x40139e65: sys_check_timeouts at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/lwip/lwip/src/core/timeouts.c:381
WARNING Decoded 0x4013a06c: sys_timeouts_mbox_fetch at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/lwip/lwip/src/core/timeouts.c:433
WARNING Decoded 0x4013462c: tcpip_thread at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/lwip/lwip/src/api/tcpip.c:483
WARNING Decoded 0x40089dca: vPortTaskWrapper at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c:355 (discriminator 1)
[21:28:28]
[21:28:28]Rebooting...

All recommendations like disabling logging do not help, I have consistently tried disabling everything else, the problem is in WireGuard. One more thing. I think this is due to the period of sntp time synchronization, perhaps at this moment the initialization is called again and crash
"[21:28:17][D][sntp:075]: Synchronized time: 2021-12-19 21:28:17"

Hi there, I found a solution to this problem. In the esphome config file, wg initialization inside lambda cannot be specified without checking, because when the sntp are sync next time, the
wg.begin(local_ip,private_key,endpoint_address,public_key,endpoint_port);
function is called again and this leads to a crash application and reboot.

the correct configuration should be like this:

time:
  - platform: sntp
    on_time_sync:
        then:
        - lambda: |
            static const char* TAG = "wireguard";
            ESP_LOGD(TAG, "Starting...");
            if( !wg.is_initialized() ) {
                        ESP_LOGD(TAG, "Initializing WG interface...");
                        if( !wg.begin(
                                local_ip,
                                private_key,
                                endpoint_address,
                                public_key,
                                endpoint_port) ) {
                            ESP_LOGD(TAG, "Failed to initialize WG interface.");
                        }
                    }