Skip to content

Commit f2be2ca

Browse files
committed
Refactor Signaling sources to make Include_i.h independent of libwebsockets
- This way, one could write a new CMakeLists.txt, with ApiCalls using different websocket implementation - One should simply remove existing Signaling.c and LwsApiCalls.c from compilation and add their own
1 parent cfa96a9 commit f2be2ca

File tree

5 files changed

+69
-45
lines changed

5 files changed

+69
-45
lines changed

src/source/Include_i.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@ extern "C" {
5252
#define INET6 1
5353
#include <usrsctp.h>
5454

55-
#include <libwebsockets.h>
56-
5755
#if !defined __WINDOWS_BUILD__
5856
#include <signal.h>
5957
#include <sys/types.h>
@@ -65,6 +63,7 @@ extern "C" {
6563
#include <arpa/inet.h>
6664
#include <fcntl.h>
6765
#include <netinet/tcp.h>
66+
#include <poll.h>
6867
#endif
6968

7069
// Max uFrag and uPwd length as documented in https://tools.ietf.org/html/rfc5245#section-15.4

src/source/Signaling/LwsApiCalls.c

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
*/
44
#define LOG_CLASS "LwsApiCalls"
55
#include "../Include_i.h"
6+
7+
#include <libwebsockets.h>
8+
#include "Signaling.h"
9+
#include "LwsApiCalls.h"
10+
611
#define WEBRTC_SCHEME_NAME "webrtc"
712

813
static BOOL gInterruptedFlagBySignalHandler;
@@ -12,7 +17,7 @@ VOID lwsSignalHandler(INT32 signal)
1217
gInterruptedFlagBySignalHandler = TRUE;
1318
}
1419

15-
INT32 lwsHttpCallbackRoutine(struct lws* wsi, enum lws_callback_reasons reason, PVOID user, PVOID pDataIn, size_t dataSize)
20+
INT32 lwsHttpCallbackRoutine(PVOID wsi, INT32 reason, PVOID user, PVOID pDataIn, size_t dataSize)
1621
{
1722
UNUSED_PARAM(user);
1823
STATUS retStatus = STATUS_SUCCESS;
@@ -53,12 +58,12 @@ INT32 lwsHttpCallbackRoutine(struct lws* wsi, enum lws_callback_reasons reason,
5358
CHK(FALSE, retStatus);
5459
}
5560

56-
customData = lws_get_opaque_user_data(wsi);
61+
customData = lws_get_opaque_user_data((struct lws*) wsi);
5762
pLwsCallInfo = (PLwsCallInfo) customData;
5863

5964
CHK_STATUS(configureLwsLogging(loggerGetLogLevel()));
6065

61-
CHK(pLwsCallInfo != NULL && pLwsCallInfo->pSignalingClient != NULL && pLwsCallInfo->pSignalingClient->pLwsContext != NULL &&
66+
CHK(pLwsCallInfo != NULL && pLwsCallInfo->pSignalingClient != NULL && pLwsCallInfo->pSignalingClient->pWebsocketContext != NULL &&
6267
pLwsCallInfo->callInfo.pRequestInfo != NULL && pLwsCallInfo->protocolIndex == PROTOCOL_INDEX_HTTPS,
6368
retStatus);
6469

@@ -98,13 +103,13 @@ INT32 lwsHttpCallbackRoutine(struct lws* wsi, enum lws_callback_reasons reason,
98103
break;
99104

100105
case LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:
101-
status = lws_http_client_http_response(wsi);
106+
status = lws_http_client_http_response((struct lws*) wsi);
102107
getStateMachineCurrentState(pSignalingClient->pStateMachine, &pStateMachineState);
103108

104109
DLOGD("Connected with server response: %d", status);
105110
pLwsCallInfo->callInfo.callResult = getServiceCallResultFromHttpStatus((UINT32) status);
106111

107-
len = (SIZE_T) lws_hdr_copy(wsi, &dateHdrBuffer[0], MAX_DATE_HEADER_BUFFER_LENGTH, WSI_TOKEN_HTTP_DATE);
112+
len = (SIZE_T) lws_hdr_copy((struct lws*) wsi, &dateHdrBuffer[0], MAX_DATE_HEADER_BUFFER_LENGTH, WSI_TOKEN_HTTP_DATE);
108113

109114
time(&td);
110115

@@ -141,7 +146,7 @@ INT32 lwsHttpCallbackRoutine(struct lws* wsi, enum lws_callback_reasons reason,
141146
}
142147

143148
// Store the Request ID header
144-
if ((size = lws_hdr_custom_copy(wsi, pBuffer, LWS_SCRATCH_BUFFER_SIZE, SIGNALING_REQUEST_ID_HEADER_NAME,
149+
if ((size = lws_hdr_custom_copy((struct lws*) wsi, pBuffer, LWS_SCRATCH_BUFFER_SIZE, SIGNALING_REQUEST_ID_HEADER_NAME,
145150
(SIZEOF(SIGNALING_REQUEST_ID_HEADER_NAME) - 1) * SIZEOF(CHAR))) > 0) {
146151
pBuffer[size] = '\0';
147152
DLOGI("Request ID: %s", pBuffer);
@@ -182,7 +187,7 @@ INT32 lwsHttpCallbackRoutine(struct lws* wsi, enum lws_callback_reasons reason,
182187
DLOGD("Received client http");
183188
size = LWS_SCRATCH_BUFFER_SIZE;
184189

185-
if (lws_http_client_read(wsi, &pBuffer, &size) < 0) {
190+
if (lws_http_client_read((struct lws*) wsi, &pBuffer, &size) < 0) {
186191
retValue = -1;
187192
}
188193

@@ -217,8 +222,8 @@ INT32 lwsHttpCallbackRoutine(struct lws* wsi, enum lws_callback_reasons reason,
217222

218223
DLOGV("Appending header - %s %s", pRequestHeader->pName, pRequestHeader->pValue);
219224

220-
status = lws_add_http_header_by_name(wsi, (PBYTE) pRequestHeader->pName, (PBYTE) pRequestHeader->pValue, pRequestHeader->valueLen,
221-
ppStartPtr, pEndPtr);
225+
status = lws_add_http_header_by_name((struct lws*) wsi, (PBYTE) pRequestHeader->pName, (PBYTE) pRequestHeader->pValue,
226+
pRequestHeader->valueLen, ppStartPtr, pEndPtr);
222227
if (status != 0) {
223228
retValue = 1;
224229
CHK(FALSE, retStatus);
@@ -232,29 +237,29 @@ INT32 lwsHttpCallbackRoutine(struct lws* wsi, enum lws_callback_reasons reason,
232237
headerCount--;
233238
}
234239

235-
lws_client_http_body_pending(wsi, 1);
236-
lws_callback_on_writable(wsi);
240+
lws_client_http_body_pending((struct lws*) wsi, 1);
241+
lws_callback_on_writable((struct lws*) wsi);
237242

238243
break;
239244

240245
case LWS_CALLBACK_CLIENT_HTTP_WRITEABLE:
241246
DLOGD("Sending the body %.*s, size %d", pRequestInfo->bodySize, pRequestInfo->body, pRequestInfo->bodySize);
242247
MEMCPY(pBuffer, pRequestInfo->body, pRequestInfo->bodySize);
243248

244-
size = lws_write(wsi, (PBYTE) pBuffer, (SIZE_T) pRequestInfo->bodySize, LWS_WRITE_TEXT);
249+
size = lws_write((struct lws*) wsi, (PBYTE) pBuffer, (SIZE_T) pRequestInfo->bodySize, LWS_WRITE_TEXT);
245250

246251
if (size != (INT32) pRequestInfo->bodySize) {
247252
DLOGW("Failed to write out the body of POST request entirely. Expected to write %d, wrote %d", pRequestInfo->bodySize, size);
248253
if (size > 0) {
249254
// Schedule again
250-
lws_client_http_body_pending(wsi, 1);
251-
lws_callback_on_writable(wsi);
255+
lws_client_http_body_pending((struct lws*) wsi, 1);
256+
lws_callback_on_writable((struct lws*) wsi);
252257
} else {
253258
// Quit
254259
retValue = 1;
255260
}
256261
} else {
257-
lws_client_http_body_pending(wsi, 0);
262+
lws_client_http_body_pending((struct lws*) wsi, 0);
258263
}
259264

260265
break;
@@ -271,7 +276,7 @@ INT32 lwsHttpCallbackRoutine(struct lws* wsi, enum lws_callback_reasons reason,
271276
ATOMIC_STORE_BOOL(&pRequestInfo->terminating, TRUE);
272277
}
273278

274-
lws_cancel_service(lws_get_context(wsi));
279+
lws_cancel_service(lws_get_context((struct lws*) wsi));
275280

276281
retValue = -1;
277282
}
@@ -283,7 +288,7 @@ INT32 lwsHttpCallbackRoutine(struct lws* wsi, enum lws_callback_reasons reason,
283288
return retValue;
284289
}
285290

286-
INT32 lwsWssCallbackRoutine(struct lws* wsi, enum lws_callback_reasons reason, PVOID user, PVOID pDataIn, size_t dataSize)
291+
INT32 lwsWssCallbackRoutine(PVOID wsi, INT32 reason, PVOID user, PVOID pDataIn, size_t dataSize)
287292
{
288293
UNUSED_PARAM(user);
289294
STATUS retStatus = STATUS_SUCCESS;
@@ -312,14 +317,14 @@ INT32 lwsWssCallbackRoutine(struct lws* wsi, enum lws_callback_reasons reason, P
312317
CHK(FALSE, retStatus);
313318
}
314319

315-
customData = lws_get_opaque_user_data(wsi);
320+
customData = lws_get_opaque_user_data((struct lws*) wsi);
316321
pLwsCallInfo = (PLwsCallInfo) customData;
317322

318323
CHK_STATUS(configureLwsLogging(loggerGetLogLevel()));
319324

320325
CHK(pLwsCallInfo != NULL && pLwsCallInfo->pSignalingClient != NULL && pLwsCallInfo->pSignalingClient->pOngoingCallInfo != NULL &&
321-
pLwsCallInfo->pSignalingClient->pLwsContext != NULL && pLwsCallInfo->pSignalingClient->pOngoingCallInfo->callInfo.pRequestInfo != NULL &&
322-
pLwsCallInfo->protocolIndex == PROTOCOL_INDEX_WSS,
326+
pLwsCallInfo->pSignalingClient->pWebsocketContext != NULL &&
327+
pLwsCallInfo->pSignalingClient->pOngoingCallInfo->callInfo.pRequestInfo != NULL && pLwsCallInfo->protocolIndex == PROTOCOL_INDEX_WSS,
323328
retStatus);
324329
pSignalingClient = pLwsCallInfo->pSignalingClient;
325330
pLwsCallInfo = pSignalingClient->pOngoingCallInfo;
@@ -564,7 +569,7 @@ STATUS lwsCompleteSync(PLwsCallInfo pCallInfo)
564569
CHK_STATUS(removeRequestHeader(pCallInfo->callInfo.pRequestInfo, AWS_SIG_V4_HEADER_HOST));
565570
}
566571

567-
pContext = pCallInfo->pSignalingClient->pLwsContext;
572+
pContext = (struct lws_context*) pCallInfo->pSignalingClient->pWebsocketContext;
568573

569574
// Execute the LWS REST call
570575
MEMSET(&connectInfo, 0x00, SIZEOF(struct lws_client_connect_info));
@@ -596,7 +601,7 @@ STATUS lwsCompleteSync(PLwsCallInfo pCallInfo)
596601
connectInfo.path = path;
597602
connectInfo.host = connectInfo.address;
598603
connectInfo.method = pVerb;
599-
connectInfo.protocol = pCallInfo->pSignalingClient->signalingProtocols[pCallInfo->protocolIndex].name;
604+
connectInfo.protocol = ((struct lws_protocols*) pCallInfo->pSignalingClient->signalingProtocols[pCallInfo->protocolIndex])->name;
600605
connectInfo.pwsi = &clientLws;
601606

602607
connectInfo.opaque_user_data = pCallInfo;
@@ -2413,7 +2418,7 @@ STATUS wakeLwsServiceEventLoop(PSignalingClient pSignalingClient, UINT32 protoco
24132418
STATUS retStatus = STATUS_SUCCESS;
24142419

24152420
// Early exit in case we don't need to do anything
2416-
CHK(pSignalingClient != NULL && pSignalingClient->pLwsContext != NULL, retStatus);
2421+
CHK(pSignalingClient != NULL && pSignalingClient->pWebsocketContext != NULL, retStatus);
24172422

24182423
if (pSignalingClient->currentWsi[protocolIndex] != NULL) {
24192424
lws_callback_on_writable(pSignalingClient->currentWsi[protocolIndex]);

src/source/Signaling/LwsApiCalls.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,11 +167,14 @@ extern "C" {
167167
// Encoded max ice server infos string len
168168
#define MAX_ENCODED_ICE_SERVER_INFOS_STR_LEN (MAX_ICE_SERVER_INFOS_STR_LEN + ICE_SERVER_INFO_TEMPLATE_BLOAT_SIZE)
169169

170+
// Alignment bytes for libwebsockets (Internally, it might end up using lesser than 16)
171+
#define LWS_ALIGN_BYTES 16
172+
170173
// Scratch buffer size
171-
#define LWS_SCRATCH_BUFFER_SIZE (MAX_JSON_PARAMETER_STRING_LEN + LWS_PRE)
174+
#define LWS_SCRATCH_BUFFER_SIZE (MAX_JSON_PARAMETER_STRING_LEN + LWS_ALIGN_BYTES)
172175

173176
// Send and receive buffer size
174-
#define LWS_MESSAGE_BUFFER_SIZE (SIZEOF(CHAR) * (MAX_SIGNALING_MESSAGE_LEN + LWS_PRE))
177+
#define LWS_MESSAGE_BUFFER_SIZE (SIZEOF(CHAR) * (MAX_SIGNALING_MESSAGE_LEN + LWS_ALIGN_BYTES))
175178

176179
#define AWS_SIG_V4_HEADER_HOST (PCHAR) "host"
177180

@@ -251,8 +254,8 @@ PVOID lwsListenerHandler(PVOID);
251254
PVOID reconnectHandler(PVOID);
252255

253256
// LWS callback routine
254-
INT32 lwsHttpCallbackRoutine(struct lws*, enum lws_callback_reasons, PVOID, PVOID, size_t);
255-
INT32 lwsWssCallbackRoutine(struct lws*, enum lws_callback_reasons, PVOID, PVOID, size_t);
257+
INT32 lwsHttpCallbackRoutine(PVOID, INT32, PVOID, PVOID, size_t);
258+
INT32 lwsWssCallbackRoutine(PVOID, INT32, PVOID, PVOID, size_t);
256259

257260
BOOL isCallResultSignatureExpired(PCallInfo);
258261
BOOL isCallResultSignatureNotYetCurrent(PCallInfo);

src/source/Signaling/Signaling.c

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#define LOG_CLASS "Signaling"
22
#include "../Include_i.h"
3+
#include <libwebsockets.h>
4+
#include "LwsApiCalls.h"
35

46
extern StateMachineState SIGNALING_STATE_MACHINE_STATES[];
57
extern UINT32 SIGNALING_STATE_MACHINE_STATE_COUNT;
@@ -21,6 +23,8 @@ STATUS createSignalingSync(PSignalingClientInfoInternal pClientInfo, PChannelInf
2123
BOOL cacheFound = FALSE;
2224
PSignalingFileCacheEntry pFileCacheEntry = NULL;
2325

26+
struct lws_protocols* pProtocols = NULL;
27+
2428
CHK(pClientInfo != NULL && pChannelInfo != NULL && pCallbacks != NULL && pCredentialProvider != NULL && ppSignalingClient != NULL,
2529
STATUS_NULL_ARG);
2630
CHK(pChannelInfo->version <= CHANNEL_INFO_CURRENT_VERSION, STATUS_SIGNALING_INVALID_CHANNEL_INFO_VERSION);
@@ -33,6 +37,14 @@ STATUS createSignalingSync(PSignalingClientInfoInternal pClientInfo, PChannelInf
3337
CHK_STATUS(initializeThreadTracker(&pSignalingClient->listenerTracker));
3438
CHK_STATUS(initializeThreadTracker(&pSignalingClient->reconnecterTracker));
3539

40+
// Allocate memory for the protocols array (+ 1 for the null terminator protocol)
41+
pProtocols = (struct lws_protocols*) MEMCALLOC(LWS_PROTOCOL_COUNT + 1, SIZEOF(struct lws_protocols));
42+
CHK(pProtocols != NULL, STATUS_NOT_ENOUGH_MEMORY);
43+
44+
// Store the protocols pointer in the signalingProtocols array
45+
pSignalingClient->signalingProtocols[PROTOCOL_INDEX_HTTPS] = pProtocols;
46+
pSignalingClient->signalingProtocols[PROTOCOL_INDEX_WSS] = &pProtocols[PROTOCOL_INDEX_WSS];
47+
3648
// Validate and store the input
3749
CHK_STATUS(createValidateChannelInfo(pChannelInfo, &pSignalingClient->pChannelInfo));
3850
CHK_STATUS(validateSignalingCallbacks(pSignalingClient, pCallbacks));
@@ -93,18 +105,19 @@ STATUS createSignalingSync(PSignalingClientInfoInternal pClientInfo, PChannelInf
93105
&pSignalingClient->pStateMachine));
94106

95107
// Prepare the signaling channel protocols array
96-
pSignalingClient->signalingProtocols[PROTOCOL_INDEX_HTTPS].name = HTTPS_SCHEME_NAME;
97-
pSignalingClient->signalingProtocols[PROTOCOL_INDEX_HTTPS].callback = lwsHttpCallbackRoutine;
98-
pSignalingClient->signalingProtocols[PROTOCOL_INDEX_WSS].name = WSS_SCHEME_NAME;
99-
pSignalingClient->signalingProtocols[PROTOCOL_INDEX_WSS].callback = lwsWssCallbackRoutine;
108+
pProtocols = (struct lws_protocols*) pSignalingClient->signalingProtocols[PROTOCOL_INDEX_HTTPS];
109+
pProtocols[PROTOCOL_INDEX_HTTPS].name = HTTPS_SCHEME_NAME;
110+
pProtocols[PROTOCOL_INDEX_HTTPS].callback = (lws_callback_function*) lwsHttpCallbackRoutine;
111+
pProtocols[PROTOCOL_INDEX_WSS].name = WSS_SCHEME_NAME;
112+
pProtocols[PROTOCOL_INDEX_WSS].callback = (lws_callback_function*) lwsWssCallbackRoutine;
100113

101114
pSignalingClient->currentWsi[PROTOCOL_INDEX_HTTPS] = NULL;
102115
pSignalingClient->currentWsi[PROTOCOL_INDEX_WSS] = NULL;
103116

104117
MEMSET(&creationInfo, 0x00, SIZEOF(struct lws_context_creation_info));
105118
creationInfo.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
106119
creationInfo.port = CONTEXT_PORT_NO_LISTEN;
107-
creationInfo.protocols = pSignalingClient->signalingProtocols;
120+
creationInfo.protocols = pProtocols;
108121
creationInfo.timeout_secs = SIGNALING_SERVICE_API_CALL_TIMEOUT_IN_SECONDS;
109122
creationInfo.gid = -1;
110123
creationInfo.uid = -1;
@@ -165,8 +178,8 @@ STATUS createSignalingSync(PSignalingClientInfoInternal pClientInfo, PChannelInf
165178

166179
CHK_STATUS(configureLwsLogging(loggerGetLogLevel()));
167180

168-
pSignalingClient->pLwsContext = lws_create_context(&creationInfo);
169-
CHK(pSignalingClient->pLwsContext != NULL, STATUS_SIGNALING_LWS_CREATE_CONTEXT_FAILED);
181+
pSignalingClient->pWebsocketContext = lws_create_context(&creationInfo);
182+
CHK(pSignalingClient->pWebsocketContext != NULL, STATUS_SIGNALING_LWS_CREATE_CONTEXT_FAILED);
170183

171184
// Initializing the diagnostics mostly is taken care of by zero-mem in MEMCALLOC
172185
pSignalingClient->diagnostics.createTime = SIGNALING_GET_CURRENT_TIME(pSignalingClient);
@@ -223,13 +236,16 @@ STATUS freeSignaling(PSignalingClient* ppSignalingClient)
223236

224237
terminateOngoingOperations(pSignalingClient);
225238

226-
if (pSignalingClient->pLwsContext != NULL) {
239+
if (pSignalingClient->pWebsocketContext != NULL) {
227240
MUTEX_LOCK(pSignalingClient->lwsServiceLock);
228-
lws_context_destroy(pSignalingClient->pLwsContext);
229-
pSignalingClient->pLwsContext = NULL;
241+
lws_context_destroy((struct lws_context*) pSignalingClient->pWebsocketContext);
242+
pSignalingClient->pWebsocketContext = NULL;
230243
MUTEX_UNLOCK(pSignalingClient->lwsServiceLock);
231244
}
232245

246+
// Frees up the entire structure., both HTTPS and WSS protocols (it was allocated as single block)
247+
SAFE_MEMFREE(pSignalingClient->signalingProtocols[PROTOCOL_INDEX_HTTPS]);
248+
233249
freeStateMachine(pSignalingClient->pStateMachine);
234250

235251
freeClientRetryStrategy(pSignalingClient);

src/source/Signaling/Signaling.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -337,14 +337,15 @@ typedef struct {
337337
// Restarted thread handler
338338
ThreadTracker reconnecterTracker;
339339

340-
// LWS context to use for Restful API
341-
struct lws_context* pLwsContext;
340+
// Generic websocket context - can be used by any implementation
341+
PVOID pWebsocketContext;
342342

343-
// Signaling protocols - one more for the NULL terminator protocol
344-
struct lws_protocols signalingProtocols[LWS_PROTOCOL_COUNT + 1];
343+
// Generic websocket protocols array - can be used by any implementation
344+
// + 1 for the null terminator protocol
345+
PVOID signalingProtocols[LWS_PROTOCOL_COUNT + 1];
345346

346-
// Stored wsi objects
347-
struct lws* currentWsi[LWS_PROTOCOL_COUNT];
347+
// Generic websocket connection objects - can be used by any implementation
348+
PVOID currentWsi[LWS_PROTOCOL_COUNT];
348349

349350
// List of the ongoing messages
350351
PStackQueue pMessageQueue;

0 commit comments

Comments
 (0)