refactor: network - harden TCP/IP and unify HTTP clients
This commit is contained in:
+20
-4
@@ -11,6 +11,7 @@
|
||||
#include <Libraries/Memory.hpp>
|
||||
#include <Terminal/Terminal.hpp>
|
||||
#include <CppLib/Stream.hpp>
|
||||
#include <CppLib/Spinlock.hpp>
|
||||
|
||||
using namespace Kt;
|
||||
|
||||
@@ -22,8 +23,9 @@ namespace Net::Udp {
|
||||
bool Active;
|
||||
};
|
||||
|
||||
static constexpr uint32_t MAX_BINDINGS = 16;
|
||||
static constexpr uint32_t MAX_BINDINGS = 64;
|
||||
static PortBinding g_bindings[MAX_BINDINGS] = {};
|
||||
static kcp::Spinlock g_bindingsLock;
|
||||
|
||||
void Initialize() {
|
||||
for (uint32_t i = 0; i < MAX_BINDINGS; i++) {
|
||||
@@ -58,13 +60,18 @@ namespace Net::Udp {
|
||||
const uint8_t* payload = data + HEADER_SIZE;
|
||||
uint16_t payloadLen = udpLen - HEADER_SIZE;
|
||||
|
||||
// Dispatch to bound callback
|
||||
// Snapshot the callback under the binding lock, then invoke it after
|
||||
// releasing the lock so callbacks may safely bind/unbind other ports.
|
||||
RecvCallback callback = nullptr;
|
||||
g_bindingsLock.Acquire();
|
||||
for (uint32_t i = 0; i < MAX_BINDINGS; i++) {
|
||||
if (g_bindings[i].Active && g_bindings[i].Port == dstPort) {
|
||||
g_bindings[i].Callback(srcIp, srcPort, dstPort, payload, payloadLen);
|
||||
return;
|
||||
callback = g_bindings[i].Callback;
|
||||
break;
|
||||
}
|
||||
}
|
||||
g_bindingsLock.Release();
|
||||
if (callback) callback(srcIp, srcPort, dstPort, payload, payloadLen);
|
||||
}
|
||||
|
||||
bool Send(uint32_t destIp, uint16_t srcPort, uint16_t destPort,
|
||||
@@ -96,9 +103,12 @@ namespace Net::Udp {
|
||||
}
|
||||
|
||||
bool Bind(uint16_t port, RecvCallback callback) {
|
||||
if (port == 0 || callback == nullptr) return false;
|
||||
g_bindingsLock.Acquire();
|
||||
// Check for duplicate
|
||||
for (uint32_t i = 0; i < MAX_BINDINGS; i++) {
|
||||
if (g_bindings[i].Active && g_bindings[i].Port == port) {
|
||||
g_bindingsLock.Release();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -109,19 +119,25 @@ namespace Net::Udp {
|
||||
g_bindings[i].Port = port;
|
||||
g_bindings[i].Callback = callback;
|
||||
g_bindings[i].Active = true;
|
||||
g_bindingsLock.Release();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
g_bindingsLock.Release();
|
||||
return false;
|
||||
}
|
||||
|
||||
void Unbind(uint16_t port) {
|
||||
g_bindingsLock.Acquire();
|
||||
for (uint32_t i = 0; i < MAX_BINDINGS; i++) {
|
||||
if (g_bindings[i].Active && g_bindings[i].Port == port) {
|
||||
g_bindings[i].Active = false;
|
||||
g_bindings[i].Callback = nullptr;
|
||||
g_bindingsLock.Release();
|
||||
return;
|
||||
}
|
||||
}
|
||||
g_bindingsLock.Release();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user