From 18f08f995424cb41cffe41ff2f4fd3a604b8b7ab Mon Sep 17 00:00:00 2001 From: Marc Lasch Date: Wed, 15 Jun 2022 08:28:37 +0200 Subject: [PATCH] server: Make client context available in de-registration callback 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 --- core/registration.c | 58 ++++++++++++++++------------------- examples/server/lwm2mserver.c | 16 +++------- 2 files changed, 32 insertions(+), 42 deletions(-) diff --git a/core/registration.c b/core/registration.c index 777154625..9e4547531 100644 --- a/core/registration.c +++ b/core/registration.c @@ -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; @@ -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; } @@ -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; @@ -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 - } - diff --git a/examples/server/lwm2mserver.c b/examples/server/lwm2mserver.c index d7b718fd3..3fb2d2f5f 100644 --- a/examples/server/lwm2mserver.c +++ b/examples/server/lwm2mserver.c @@ -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: @@ -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);