Skip to content

Commit

Permalink
server: Make client context available in de-registration callback
Browse files Browse the repository at this point in the history
Remove the client context from server only after calling the monitoring
callback when handling a de-registration. A as result, the client
information is still available in the server context during the callback.

Signed-off-by: Marc Lasch <[email protected]>
  • Loading branch information
mlasch committed Jun 15, 2022
1 parent 8533386 commit 18f08f9
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 42 deletions.
58 changes: 27 additions & 31 deletions core/registration.c
Original file line number Diff line number Diff line change
Expand Up @@ -803,7 +803,7 @@ static uint8_t prv_register(lwm2m_context_t * contextP,
dataP->payload = payload;
dataP->query = query;
dataP->server = server;

transaction->callback = prv_handleRegistrationReply;
transaction->userData = (void *) dataP;

Expand Down Expand Up @@ -926,7 +926,7 @@ static int prv_updateRegistration(lwm2m_context_t * contextP,
if (transaction_send(contextP, transaction) == 0) {
server->status = STATE_REG_UPDATE_PENDING;
}

return COAP_NO_ERROR;
}

Expand Down Expand Up @@ -2007,23 +2007,26 @@ uint8_t registration_handleRequest(lwm2m_context_t * contextP,
}
break;

case COAP_DELETE:
{
lwm2m_client_t * clientP;
case COAP_DELETE: {
lwm2m_client_t *clientP;

if (!LWM2M_URI_IS_SET_OBJECT(uriP))
return COAP_400_BAD_REQUEST;
if (LWM2M_URI_IS_SET_INSTANCE(uriP))
return COAP_400_BAD_REQUEST;

if (!LWM2M_URI_IS_SET_OBJECT(uriP)) return COAP_400_BAD_REQUEST;
if (LWM2M_URI_IS_SET_INSTANCE(uriP)) return COAP_400_BAD_REQUEST;
clientP = (lwm2m_client_t *)LWM2M_LIST_FIND(contextP->clientList, uriP->objectId);

contextP->clientList = (lwm2m_client_t *)LWM2M_LIST_RM(contextP->clientList, uriP->objectId, &clientP);
if (clientP == NULL) return COAP_400_BAD_REQUEST;
if (contextP->monitorCallback != NULL)
{
contextP->monitorCallback(contextP, clientP->internalID, NULL, COAP_202_DELETED, NULL, LWM2M_CONTENT_TEXT, NULL, 0, contextP->monitorUserData);
if (clientP == NULL)
return COAP_400_BAD_REQUEST;
if (contextP->monitorCallback != NULL) {
contextP->monitorCallback(contextP, clientP->internalID, NULL, COAP_202_DELETED, NULL, LWM2M_CONTENT_TEXT,
NULL, 0, contextP->monitorUserData);
}
contextP->clientList = (lwm2m_client_t *)LWM2M_LIST_RM(contextP->clientList, clientP->internalID, NULL);
registration_freeClient(clientP);
result = COAP_202_DELETED;
}
break;
} break;

default:
return COAP_400_BAD_REQUEST;
Expand Down Expand Up @@ -2124,38 +2127,31 @@ void registration_step(lwm2m_context_t * contextP,

#endif
#ifdef LWM2M_SERVER_MODE
lwm2m_client_t * clientP;
lwm2m_client_t *clientP;

LOG("Entering");
// monitor clients lifetime
clientP = contextP->clientList;
while (clientP != NULL)
{
lwm2m_client_t * nextP = clientP->next;
while (clientP != NULL) {
lwm2m_client_t *nextP = clientP->next;

if (clientP->endOfLife <= currentTime)
{
contextP->clientList = (lwm2m_client_t *)LWM2M_LIST_RM(contextP->clientList, clientP->internalID, NULL);
if (contextP->monitorCallback != NULL)
{
contextP->monitorCallback(contextP, clientP->internalID, NULL, COAP_202_DELETED, NULL, LWM2M_CONTENT_TEXT, NULL, 0, contextP->monitorUserData);
if (clientP->endOfLife <= currentTime) {
if (contextP->monitorCallback != NULL) {
contextP->monitorCallback(contextP, clientP->internalID, NULL, COAP_202_DELETED, NULL,
LWM2M_CONTENT_TEXT, NULL, 0, contextP->monitorUserData);
}
contextP->clientList = (lwm2m_client_t *)LWM2M_LIST_RM(contextP->clientList, clientP->internalID, NULL);
registration_freeClient(clientP);
}
else
{
} else {
time_t interval;

interval = clientP->endOfLife - currentTime;

if (*timeoutP > interval)
{
if (*timeoutP > interval) {
*timeoutP = interval;
}
}
clientP = nextP;
}
#endif

}

16 changes: 5 additions & 11 deletions examples/server/lwm2mserver.c
Original file line number Diff line number Diff line change
Expand Up @@ -953,19 +953,16 @@ static void prv_cancel_client(lwm2m_context_t *lwm2mH,
static void prv_monitor_callback(lwm2m_context_t *lwm2mH, uint16_t clientID, lwm2m_uri_t *uriP, int status,
block_info_t *block_info, lwm2m_media_type_t format, uint8_t *data, size_t dataLength,
void *userData) {
lwm2m_client_t * targetP;
lwm2m_client_t *clientP;

/* unused parameter */
(void)userData;

switch (status)
{
clientP = (lwm2m_client_t *)LWM2M_LIST_FIND(lwm2mH->clientList, clientID);

switch (status) {
case COAP_201_CREATED:
fprintf(stdout, "\r\nNew client #%d registered.\r\n", clientID);

targetP = (lwm2m_client_t *)lwm2m_list_find((lwm2m_list_t *)lwm2mH->clientList, clientID);

prv_dump_client(targetP);
break;

case COAP_202_DELETED:
Expand All @@ -974,16 +971,13 @@ static void prv_monitor_callback(lwm2m_context_t *lwm2mH, uint16_t clientID, lwm

case COAP_204_CHANGED:
fprintf(stdout, "\r\nClient #%d updated.\r\n", clientID);

targetP = (lwm2m_client_t *)lwm2m_list_find((lwm2m_list_t *)lwm2mH->clientList, clientID);

prv_dump_client(targetP);
break;

default:
fprintf(stdout, "\r\nMonitor callback called with an unknown status: %d.\r\n", status);
break;
}
prv_dump_client(clientP);

fprintf(stdout, "\r\n> ");
fflush(stdout);
Expand Down

0 comments on commit 18f08f9

Please sign in to comment.