Skip to content

Commit 7b3b6c2

Browse files
committed
Add setup for different host backends.
1 parent 9fba81e commit 7b3b6c2

File tree

8 files changed

+223
-193
lines changed

8 files changed

+223
-193
lines changed

CMakeLists.txt

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@ find_package(OpenSSL REQUIRED)
77
add_library(Wu
88
CRC32.cpp
99
Wu.cpp
10-
WuEpoll.cpp
1110
WuCert.cpp
1211
WuArena.cpp
1312
WuDataChannel.cpp
14-
WuNetwork.cpp
1513
WuPool.cpp
1614
WuSctp.cpp
1715
WuSdp.cpp
@@ -23,35 +21,60 @@ add_library(Wu
2321
picohttpparser.c
2422
)
2523

24+
add_library(WuHost
25+
WuHost.cpp
26+
WuNetwork.cpp
27+
)
28+
2629
target_include_directories(Wu
2730
PUBLIC
2831
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
2932
$<INSTALL_INTERFACE:include>
3033
PRIVATE OpenSSL::SSL
3134
)
3235

36+
target_include_directories(WuHost
37+
PUBLIC
38+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
39+
$<INSTALL_INTERFACE:include>
40+
)
41+
3342
target_link_libraries(Wu
3443
PRIVATE OpenSSL::SSL
3544
PRIVATE OpenSSL::Crypto
3645
PRIVATE Threads::Threads
3746
)
3847

48+
target_link_libraries(WuHost Wu)
49+
3950
target_compile_options(Wu
4051
PRIVATE
4152
-Wall
4253
$<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions>
4354
$<$<COMPILE_LANGUAGE:CXX>:-fno-rtti>
4455
)
4556

46-
install(TARGETS Wu EXPORT WuTargets
57+
target_compile_options(WuHost
58+
PRIVATE
59+
-Wall
60+
$<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions>
61+
$<$<COMPILE_LANGUAGE:CXX>:-fno-rtti>
62+
)
63+
64+
target_compile_definitions(WuHost
65+
PUBLIC
66+
WU_EPOLL=1
67+
)
68+
69+
install(TARGETS Wu WuHost EXPORT WuTargets
4770
LIBRARY DESTINATION lib
4871
ARCHIVE DESTINATION lib
4972
RUNTIME DESTINATION bin
5073
INCLUDES DESTINATION include
5174
PUBLIC_HEADER DESTINATION include
5275
)
5376

54-
install(FILES Wu.h DESTINATION include)
77+
install(FILES Wu.h WuHost.h DESTINATION include)
5578

5679
install(EXPORT WuTargets
5780
FILE WuTargets.cmake
@@ -60,8 +83,8 @@ install(EXPORT WuTargets
6083
)
6184

6285
add_executable(EchoServer examples/EchoServer.cpp)
63-
target_link_libraries(EchoServer Wu)
86+
target_link_libraries(EchoServer WuHost)
6487

65-
set_target_properties(Wu EchoServer PROPERTIES
88+
set_target_properties(Wu WuHost EchoServer PROPERTIES
6689
CXX_STANDARD 11
6790
)

Wu.cpp

Lines changed: 48 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ static const char* WuClientStateString(WuClientState state) {
4545
}
4646
}
4747

48-
static void WuReportError(WuHost* wu, const char* description) {
48+
void WuReportError(Wu* wu, const char* description) {
4949
wu->errorHandler(description, wu->userData);
5050
}
5151

@@ -83,7 +83,7 @@ static void WuClientFinish(WuClient* client) {
8383
client->state = WuClient_Dead;
8484
}
8585

86-
static void WuClientStart(const WuHost* wu, WuClient* client) {
86+
static void WuClientStart(const Wu* wu, WuClient* client) {
8787
client->state = WuClient_DTLSHandshake;
8888
client->remoteSctpPort = 0;
8989
client->sctpVerificationTag = 0;
@@ -106,11 +106,10 @@ static void WuClientStart(const WuHost* wu, WuClient* client) {
106106
SSL_set_accept_state(client->ssl);
107107
}
108108

109-
static void WuSendSctp(const WuHost* wu, WuClient* client,
110-
const SctpPacket* packet, const SctpChunk* chunks,
111-
int32_t numChunks);
109+
static void WuSendSctp(const Wu* wu, WuClient* client, const SctpPacket* packet,
110+
const SctpChunk* chunks, int32_t numChunks);
112111

113-
static WuClient* WuHostNewClient(WuHost* wu) {
112+
static WuClient* WuNewClient(Wu* wu) {
114113
WuClient* client = (WuClient*)WuPoolAcquire(wu->clientPool);
115114

116115
if (client) {
@@ -123,11 +122,11 @@ static WuClient* WuHostNewClient(WuHost* wu) {
123122
return NULL;
124123
}
125124

126-
static void WuHostPushEvent(WuHost* wu, WuEvent evt) {
125+
static void WuPushEvent(Wu* wu, WuEvent evt) {
127126
WuQueuePush(wu->pendingEvents, &evt);
128127
}
129128

130-
static void WuSendSctpShutdown(WuHost* wu, WuClient* client) {
129+
static void WuSendSctpShutdown(Wu* wu, WuClient* client) {
131130
SctpPacket response;
132131
response.sourcePort = client->localSctpPort;
133132
response.destionationPort = client->remoteSctpPort;
@@ -142,7 +141,7 @@ static void WuSendSctpShutdown(WuHost* wu, WuClient* client) {
142141
WuSendSctp(wu, client, &response, &rc, 1);
143142
}
144143

145-
void WuRemoveClient(WuHost* wu, WuClient* client) {
144+
void WuRemoveClient(Wu* wu, WuClient* client) {
146145
for (int32_t i = 0; i < wu->numClients; i++) {
147146
if (wu->clients[i] == client) {
148147
WuSendSctpShutdown(wu, client);
@@ -155,7 +154,7 @@ void WuRemoveClient(WuHost* wu, WuClient* client) {
155154
}
156155
}
157156

158-
static WuClient* WuHostFindClient(WuHost* wu, const WuAddress* address) {
157+
static WuClient* WuFindClient(Wu* wu, const WuAddress* address) {
159158
for (int32_t i = 0; i < wu->numClients; i++) {
160159
WuClient* client = wu->clients[i];
161160
if (client->address.host == address->host &&
@@ -167,9 +166,8 @@ static WuClient* WuHostFindClient(WuHost* wu, const WuAddress* address) {
167166
return NULL;
168167
}
169168

170-
static WuClient* WuHostFindClientByCreds(WuHost* wu,
171-
const StunUserIdentifier* svUser,
172-
const StunUserIdentifier* clUser) {
169+
static WuClient* WuFindClientByCreds(Wu* wu, const StunUserIdentifier* svUser,
170+
const StunUserIdentifier* clUser) {
173171
for (int32_t i = 0; i < wu->numClients; i++) {
174172
WuClient* client = wu->clients[i];
175173
if (StunUserIdentifierEqual(&client->serverUser, svUser) &&
@@ -181,7 +179,7 @@ static WuClient* WuHostFindClientByCreds(WuHost* wu,
181179
return NULL;
182180
}
183181

184-
static void WuClientSendPendingDTLS(const WuHost* wu, WuClient* client) {
182+
static void WuClientSendPendingDTLS(const Wu* wu, WuClient* client) {
185183
uint8_t sendBuffer[4096];
186184

187185
while (BIO_ctrl_pending(client->outBio) > 0) {
@@ -192,7 +190,7 @@ static void WuClientSendPendingDTLS(const WuHost* wu, WuClient* client) {
192190
}
193191
}
194192

195-
static void TLSSend(const WuHost* wu, WuClient* client, const void* data,
193+
static void TLSSend(const Wu* wu, WuClient* client, const void* data,
196194
int32_t length) {
197195
if (client->state < WuClient_DTLSHandshake ||
198196
!SSL_is_init_finished(client->ssl)) {
@@ -203,18 +201,17 @@ static void TLSSend(const WuHost* wu, WuClient* client, const void* data,
203201
WuClientSendPendingDTLS(wu, client);
204202
}
205203

206-
static void WuSendSctp(const WuHost* wu, WuClient* client,
207-
const SctpPacket* packet, const SctpChunk* chunks,
208-
int32_t numChunks) {
204+
static void WuSendSctp(const Wu* wu, WuClient* client, const SctpPacket* packet,
205+
const SctpChunk* chunks, int32_t numChunks) {
209206
uint8_t outBuffer[4096];
210207
memset(outBuffer, 0, sizeof(outBuffer));
211208
size_t bytesWritten = SerializeSctpPacket(packet, chunks, numChunks,
212209
outBuffer, sizeof(outBuffer));
213210
TLSSend(wu, client, outBuffer, bytesWritten);
214211
}
215212

216-
static void WuHostHandleSctp(WuHost* wu, WuClient* client, const uint8_t* buf,
217-
int32_t len) {
213+
static void WuHandleSctp(Wu* wu, WuClient* client, const uint8_t* buf,
214+
int32_t len) {
218215
const size_t maxChunks = 8;
219216
SctpChunk chunks[maxChunks];
220217
SctpPacket sctpPacket;
@@ -263,7 +260,7 @@ static void WuHostHandleSctp(WuHost* wu, WuClient* client, const uint8_t* buf,
263260
WuEvent event;
264261
event.type = WuEvent_ClientJoin;
265262
event.client = client;
266-
WuHostPushEvent(wu, event);
263+
WuPushEvent(wu, event);
267264
}
268265

269266
WuSendSctp(wu, client, &response, &rc, 1);
@@ -274,14 +271,14 @@ static void WuHostHandleSctp(WuHost* wu, WuClient* client, const uint8_t* buf,
274271
evt.client = client;
275272
evt.data = dataChunk->userData;
276273
evt.length = dataChunk->userDataLength;
277-
WuHostPushEvent(wu, evt);
274+
WuPushEvent(wu, evt);
278275
} else if (dataChunk->protoId == DCProto_Binary) {
279276
WuEvent evt;
280277
evt.type = WuEvent_BinaryData;
281278
evt.client = client;
282279
evt.data = dataChunk->userData;
283280
evt.length = dataChunk->userDataLength;
284-
WuHostPushEvent(wu, evt);
281+
WuPushEvent(wu, evt);
285282
}
286283

287284
SctpPacket sack;
@@ -375,9 +372,9 @@ static void WuHostHandleSctp(WuHost* wu, WuClient* client, const uint8_t* buf,
375372
}
376373
}
377374

378-
static void WuHostReceiveDTLSPacket(WuHost* wu, const uint8_t* data,
379-
size_t length, const WuAddress* address) {
380-
WuClient* client = WuHostFindClient(wu, address);
375+
static void WuReceiveDTLSPacket(Wu* wu, const uint8_t* data, size_t length,
376+
const WuAddress* address) {
377+
WuClient* client = WuFindClient(wu, address);
381378
if (!client) {
382379
return;
383380
}
@@ -403,16 +400,16 @@ static void WuHostReceiveDTLSPacket(WuHost* wu, const uint8_t* data,
403400
if (bytes > 0) {
404401
uint8_t* buf = (uint8_t*)WuArenaAcquire(wu->arena, bytes);
405402
memcpy(buf, receiveBuffer, bytes);
406-
WuHostHandleSctp(wu, client, buf, bytes);
403+
WuHandleSctp(wu, client, buf, bytes);
407404
}
408405
}
409406
}
410407
}
411408

412-
static void WuHostHandleStun(WuHost* wu, const StunPacket* packet,
413-
const WuAddress* remote) {
409+
static void WuHandleStun(Wu* wu, const StunPacket* packet,
410+
const WuAddress* remote) {
414411
WuClient* client =
415-
WuHostFindClientByCreds(wu, &packet->serverUser, &packet->remoteUser);
412+
WuFindClientByCreds(wu, &packet->serverUser, &packet->remoteUser);
416413

417414
if (!client) {
418415
// TODO: Send unauthorized
@@ -439,19 +436,19 @@ static void WuHostHandleStun(WuHost* wu, const StunPacket* packet,
439436
client->address = *remote;
440437
}
441438

442-
static void WuHostPurgeDeadClients(WuHost* wu) {
439+
static void WuPurgeDeadClients(Wu* wu) {
443440
for (int32_t i = 0; i < wu->numClients; i++) {
444441
WuClient* client = wu->clients[i];
445442
if (client->ttl <= 0.0 || client->state == WuClient_WaitingRemoval) {
446443
WuEvent evt;
447444
evt.type = WuEvent_ClientLeave;
448445
evt.client = client;
449-
WuHostPushEvent(wu, evt);
446+
WuPushEvent(wu, evt);
450447
}
451448
}
452449
}
453450

454-
static int32_t WuCryptoInit(WuHost* wu) {
451+
static int32_t WuCryptoInit(Wu* wu) {
455452
static bool initDone = false;
456453

457454
if (!initDone) {
@@ -503,8 +500,8 @@ static int32_t WuCryptoInit(WuHost* wu) {
503500
return 1;
504501
}
505502

506-
int32_t WuInit(WuHost* wu, const WuConf* conf) {
507-
memset(wu, 0, sizeof(WuHost));
503+
int32_t WuInit(Wu* wu, const WuConf* conf) {
504+
memset(wu, 0, sizeof(Wu));
508505
wu->arena = (WuArena*)calloc(1, sizeof(WuArena));
509506
WuArenaInit(wu->arena, 1 << 20);
510507

@@ -531,7 +528,7 @@ int32_t WuInit(WuHost* wu, const WuConf* conf) {
531528
return 1;
532529
}
533530

534-
static void WuSendHeartbeat(WuHost* wu, WuClient* client) {
531+
static void WuSendHeartbeat(Wu* wu, WuClient* client) {
535532
SctpPacket packet;
536533
packet.sourcePort = wu->port;
537534
packet.destionationPort = client->remoteSctpPort;
@@ -547,7 +544,7 @@ static void WuSendHeartbeat(WuHost* wu, WuClient* client) {
547544
WuSendSctp(wu, client, &packet, &rc, 1);
548545
}
549546

550-
static void WuHostUpdateClients(WuHost* wu) {
547+
static void WuUpdateClients(Wu* wu) {
551548
double t = MsNow() * 0.001;
552549
wu->dt = t - wu->time;
553550
wu->time = t;
@@ -566,20 +563,20 @@ static void WuHostUpdateClients(WuHost* wu) {
566563
}
567564
}
568565

569-
int32_t WuHostUpdate(WuHost* wu, WuEvent* evt) {
566+
int32_t WuUpdate(Wu* wu, WuEvent* evt) {
570567
if (WuQueuePop(wu->pendingEvents, evt)) {
571568
return 1;
572569
}
573570

574-
WuHostUpdateClients(wu);
571+
WuUpdateClients(wu);
575572
WuArenaReset(wu->arena);
576573

577-
WuHostPurgeDeadClients(wu);
574+
WuPurgeDeadClients(wu);
578575

579576
return 0;
580577
}
581578

582-
static int32_t WuSendData(WuHost* wu, WuClient* client, const uint8_t* data,
579+
static int32_t WuSendData(Wu* wu, WuClient* client, const uint8_t* data,
583580
int32_t length, DataChanProtoIdentifier proto) {
584581
if (client->state < WuClient_DataChannelOpen) {
585582
return -1;
@@ -607,23 +604,22 @@ static int32_t WuSendData(WuHost* wu, WuClient* client, const uint8_t* data,
607604
return 0;
608605
}
609606

610-
int32_t WuSendText(WuHost* wu, WuClient* client, const char* text,
611-
int32_t length) {
607+
int32_t WuSendText(Wu* wu, WuClient* client, const char* text, int32_t length) {
612608
return WuSendData(wu, client, (const uint8_t*)text, length, DCProto_String);
613609
}
614610

615-
int32_t WuSendBinary(WuHost* wu, WuClient* client, const uint8_t* data,
611+
int32_t WuSendBinary(Wu* wu, WuClient* client, const uint8_t* data,
616612
int32_t length) {
617613
return WuSendData(wu, client, data, length, DCProto_Binary);
618614
}
619615

620-
SDPResult WuExchangeSDP(WuHost* wu, const char* sdp, int32_t length) {
616+
SDPResult WuExchangeSDP(Wu* wu, const char* sdp, int32_t length) {
621617
ICESdpFields iceFields;
622618
if (!ParseSdp(sdp, length, &iceFields)) {
623619
return {WuSDPStatus_InvalidSDP, NULL, NULL, 0};
624620
}
625621

626-
WuClient* client = WuHostNewClient(wu);
622+
WuClient* client = WuNewClient(wu);
627623

628624
if (!client) {
629625
return {WuSDPStatus_MaxClients, NULL, NULL, 0};
@@ -650,24 +646,20 @@ SDPResult WuExchangeSDP(WuHost* wu, const char* sdp, int32_t length) {
650646
return {WuSDPStatus_Success, client, responseSdp, sdpLength};
651647
}
652648

653-
void WuSetUserData(WuHost* wu, void* userData) { wu->userData = userData; }
649+
void WuSetUserData(Wu* wu, void* userData) { wu->userData = userData; }
654650

655-
void WuHandleUDP(WuHost* wu, const WuAddress* remote, const uint8_t* data,
651+
void WuHandleUDP(Wu* wu, const WuAddress* remote, const uint8_t* data,
656652
int32_t length) {
657653
StunPacket stunPacket;
658654
if (ParseStun(data, length, &stunPacket)) {
659-
WuHostHandleStun(wu, &stunPacket, remote);
655+
WuHandleStun(wu, &stunPacket, remote);
660656
} else {
661-
WuHostReceiveDTLSPacket(wu, data, length, remote);
657+
WuReceiveDTLSPacket(wu, data, length, remote);
662658
}
663659
}
664660

665-
void WuHostError(WuHost* wu, const char* error) {
666-
wu->errorHandler(error, wu->userData);
667-
}
668-
669-
void WuHostSetUDPWrite(WuHost* wu, WuWriteFn writer) {
670-
wu->writeUdpData = writer;
661+
void WuSetUDPWriteFunction(Wu* wu, WuWriteFn write) {
662+
wu->writeUdpData = write;
671663
}
672664

673665
WuAddress WuClientGetAddress(const WuClient* client) { return client->address; }

0 commit comments

Comments
 (0)