From b3d55d38d5b997218fb2c7f11663224be77cc53f Mon Sep 17 00:00:00 2001 From: Adam Capparelli Date: Mon, 24 Mar 2025 13:28:59 -0400 Subject: [PATCH 1/3] Fixes for galgus issue. Signed-off-by: Adam Capparelli --- src/AP_WS_Connection.cpp | 26 ++++++++++++++++++++------ src/AP_WS_Server.cpp | 5 +++-- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/AP_WS_Connection.cpp b/src/AP_WS_Connection.cpp index bf1979ee..c428584d 100644 --- a/src/AP_WS_Connection.cpp +++ b/src/AP_WS_Connection.cpp @@ -561,14 +561,14 @@ namespace OpenWifi { void AP_WS_Connection::OnSocketShutdown( [[maybe_unused]] const Poco::AutoPtr &pNf) { poco_trace(Logger_, fmt::format("SOCKET-SHUTDOWN({}): Closing.", CId_)); -// std::lock_guard G(ConnectionMutex_); + std::lock_guard G(ConnectionMutex_); return EndConnection(); } void AP_WS_Connection::OnSocketError( [[maybe_unused]] const Poco::AutoPtr &pNf) { poco_trace(Logger_, fmt::format("SOCKET-ERROR({}): Closing.", CId_)); -// std::lock_guard G(ConnectionMutex_); + std::lock_guard G(ConnectionMutex_); return EndConnection(); } @@ -651,10 +651,18 @@ namespace OpenWifi { } break; case Poco::Net::WebSocket::FRAME_OP_TEXT: { - poco_trace(Logger_, - fmt::format("FRAME({}): Frame received (length={}, flags={}). Msg={}", - CId_, IncomingSize, flags, IncomingFrame.begin())); - + if (SerialNumber_ == "e046ee9fed1f") { + // Temporary hack for Galgus device + poco_information(Logger_, + fmt::format("FRAME({}): Frame received (length={}, flags={}). Msg={}", + CId_, IncomingSize, flags, IncomingFrame.begin())); + } + else{ + poco_trace(Logger_, + fmt::format("FRAME({}): Frame received (length={}, flags={}). Msg={}", + CId_, IncomingSize, flags, IncomingFrame.begin())); + } + Poco::JSON::Parser parser; auto ParsedMessage = parser.parse(IncomingFrame.begin()); auto IncomingJSON = ParsedMessage.extract(); @@ -694,6 +702,12 @@ namespace OpenWifi { } break; default: { + if (SerialNumber_ == "e046ee9fed1f") { + // Temporary hack for Galgus device + poco_warning(Logger_, + fmt::format("FRAME({}): Illegal Frame received (length={}, flags={}). Msg={}", + CId_, IncomingSize, flags, IncomingFrame.begin())); + } poco_warning(Logger_, fmt::format("UNKNOWN({}): unknown WS Frame operation: {}", CId_, std::to_string(Op))); Errors_++; diff --git a/src/AP_WS_Server.cpp b/src/AP_WS_Server.cpp index d4fa73dc..2392b053 100644 --- a/src/AP_WS_Server.cpp +++ b/src/AP_WS_Server.cpp @@ -57,8 +57,9 @@ namespace OpenWifi { if (request.find("Upgrade") != request.end() && Poco::icompare(request["Upgrade"], "websocket") == 0) { Utils::SetThreadName("ws:conn-init"); - session_id_++; - return new AP_WS_RequestHandler(Logger_, session_id_); + //session_id_++; + auto new_session_id = session_id_.fetch_add(1, std::memory_order_seq_cst) + 1; + return new AP_WS_RequestHandler(Logger_, new_session_id); } else { return nullptr; } From 8e5eebec67a4e4092ec16f7a706e7b3a31416b2a Mon Sep 17 00:00:00 2001 From: Adam Capparelli Date: Wed, 26 Mar 2025 08:44:37 -0400 Subject: [PATCH 2/3] Add extra check to prevent early deletion of duplicate connection. Signed-off-by: Adam Capparelli --- src/AP_WS_Server.cpp | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/AP_WS_Server.cpp b/src/AP_WS_Server.cpp index 2392b053..796472b8 100644 --- a/src/AP_WS_Server.cpp +++ b/src/AP_WS_Server.cpp @@ -515,10 +515,27 @@ namespace OpenWifi { Connection = SessionHint->second; Sessions_[sessionHash].erase(SessionHint); } - - auto deviceHash = MACHash::Hash(SerialNumber); - std::lock_guard DeviceLock(SerialNumbersMutex_[deviceHash]); - SerialNumbers_[deviceHash][SerialNumber] = Connection; + std::atomic_bool duplicate_session = false; + { + auto deviceHash = MACHash::Hash(SerialNumber); + std::lock_guard DeviceLock(SerialNumbersMutex_[deviceHash]); + auto DeviceHint = SerialNumbers_[deviceHash].find(SerialNumber); + if (DeviceHint == SerialNumbers_[deviceHash].end()) { + // No duplicate connection go ahead and add new connection + SerialNumbers_[deviceHash][SerialNumber] = Connection; + } + else { + // Mark a duplicate session + duplicate_session = true; + poco_information(Logger(), fmt::format("[session ID: {}] Found a duplicate connection for device serial: {}", session_id, Utils::IntToSerialNumber(SerialNumber))); + } + } + if (duplicate_session.load()){ + // This is only called if we have a duplicate session + // We remove the new incoming session that we just added a few lines above, forcing the destructor for this new session while not impacting the pointers to the old session. + std::lock_guard SessionLock(SessionMutex_[sessionHash]); + Sessions_[sessionHash].erase(session_id); + } } bool AP_WS_Server::EndSession(uint64_t session_id, uint64_t SerialNumber) { From 115f8c1df9668434c6e7f59adaff3f877a197092 Mon Sep 17 00:00:00 2001 From: Adam Capparelli Date: Wed, 26 Mar 2025 11:01:11 -0400 Subject: [PATCH 3/3] Remove extra logging. Signed-off-by: Adam Capparelli --- src/AP_WS_Connection.cpp | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/src/AP_WS_Connection.cpp b/src/AP_WS_Connection.cpp index c428584d..d682fbd4 100644 --- a/src/AP_WS_Connection.cpp +++ b/src/AP_WS_Connection.cpp @@ -651,17 +651,10 @@ namespace OpenWifi { } break; case Poco::Net::WebSocket::FRAME_OP_TEXT: { - if (SerialNumber_ == "e046ee9fed1f") { - // Temporary hack for Galgus device - poco_information(Logger_, - fmt::format("FRAME({}): Frame received (length={}, flags={}). Msg={}", - CId_, IncomingSize, flags, IncomingFrame.begin())); - } - else{ - poco_trace(Logger_, - fmt::format("FRAME({}): Frame received (length={}, flags={}). Msg={}", - CId_, IncomingSize, flags, IncomingFrame.begin())); - } + poco_trace(Logger_, + fmt::format("FRAME({}): Frame received (length={}, flags={}). Msg={}", + CId_, IncomingSize, flags, IncomingFrame.begin())); + Poco::JSON::Parser parser; auto ParsedMessage = parser.parse(IncomingFrame.begin()); @@ -702,12 +695,6 @@ namespace OpenWifi { } break; default: { - if (SerialNumber_ == "e046ee9fed1f") { - // Temporary hack for Galgus device - poco_warning(Logger_, - fmt::format("FRAME({}): Illegal Frame received (length={}, flags={}). Msg={}", - CId_, IncomingSize, flags, IncomingFrame.begin())); - } poco_warning(Logger_, fmt::format("UNKNOWN({}): unknown WS Frame operation: {}", CId_, std::to_string(Op))); Errors_++;