From 47993cd33fb3db2c949774c7a74abe96b7dd1cad Mon Sep 17 00:00:00 2001 From: Chris Dailey Date: Thu, 25 Jul 2024 15:02:42 -0400 Subject: [PATCH 1/2] fix(lwip): Add early out in `NetworkUDP::parsePacket()` when socket has no data Previously, `NetworkUDP::parsePacket()` would take the time to allocate a 1460 byte buffer to call `recvfrom()` with, immediately freeing it if there was no data read. This change has it check if there is available data via `ioctl()` with `FIONREAD` first, saving the allocation and thus significantly increasing performance in no data situations. --- libraries/Network/src/NetworkUdp.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libraries/Network/src/NetworkUdp.cpp b/libraries/Network/src/NetworkUdp.cpp index 6134ba49967..9e374d4533b 100644 --- a/libraries/Network/src/NetworkUdp.cpp +++ b/libraries/Network/src/NetworkUdp.cpp @@ -297,6 +297,13 @@ int NetworkUDP::parsePacket() { struct sockaddr_storage si_other_storage; // enough storage for v4 and v6 socklen_t slen = sizeof(sockaddr_storage); int len; + if (ioctl(udp_server, FIONREAD, &len) == -1) { + log_e("could not check for data in buffer length: %d", errno); + return 0; + } + if (!len) { + return 0; + } char *buf = (char *)malloc(1460); if (!buf) { return 0; From 0e5f420ac29390e034fad1be7af3aaaea06ee99c Mon Sep 17 00:00:00 2001 From: Chris Dailey Date: Mon, 29 Jul 2024 07:41:26 -0400 Subject: [PATCH 2/2] fix(lwip): Initialize `len` to ensure it's set before check --- libraries/Network/src/NetworkUdp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/Network/src/NetworkUdp.cpp b/libraries/Network/src/NetworkUdp.cpp index 9e374d4533b..21f568f65b0 100644 --- a/libraries/Network/src/NetworkUdp.cpp +++ b/libraries/Network/src/NetworkUdp.cpp @@ -296,7 +296,7 @@ int NetworkUDP::parsePacket() { } struct sockaddr_storage si_other_storage; // enough storage for v4 and v6 socklen_t slen = sizeof(sockaddr_storage); - int len; + int len = 0; if (ioctl(udp_server, FIONREAD, &len) == -1) { log_e("could not check for data in buffer length: %d", errno); return 0;