Based on the logs and code analysis, the ping failure is happening because although packets are being received by the Ethernet driver (`Rx: len=60`), they are not reaching the application's socket, causing `recvfrom` to timeout (returning -1). The likely causes are: 1. **Packet Dropping**: The lwIP stack might be dropping the packet due to: * **Checksum Mismatch**: If the received packet's checksum is invalid (or if the driver/stack is calculating it incorrectly). * **IP/ICMP Filter**: If the destination IP of the reply doesn't match the device IP, or if it's not a valid ICMP Echo Reply. 2. **Timeout**: `recvfrom` is returning -1, which typically indicates a timeout (`EAGAIN`) given `SO_RCVTIMEO` is set. To pinpoint the exact cause, we need to enable lwIP's internal debug logging and improve the application error reporting. ### Plan 1. **Enable lwIP Debugging in `lwip/port/lwipopts.h`**: * Change `LWIP_DBG_TYPES_ON` from `LWIP_DBG_OFF` to `LWIP_DBG_ON`. * This will activate the `ICMP_DEBUG` and `IP_DEBUG` flags already set in the file, allowing us to see if lwIP is dropping the packet and why (e.g., "icmp_input: checksum failed"). 2. **Enhance Error Logging in `app/main.c`**: * Update the `ping_check` function to print the `errno` global variable when `recvfrom` returns -1. This confirms if the error is indeed a timeout (`EAGAIN`) or another socket error. 3. **Verify Execution**: * Rebuild and run. * The new logs will show detailed IP/ICMP processing steps. I will perform these edits to help diagnose the issue.