void observe_cancel(lwm2m_context_t * contextP, uint16_t mid, void * fromSessionH) { lwm2m_observed_t * observedP; LOG_ARG("mid: %d", mid); for (observedP = contextP->observedList; observedP != NULL; observedP = observedP->next) { lwm2m_watcher_t * targetP = NULL; if ((LWM2M_MAX_ID == mid || observedP->watcherList->lastMid == mid) && lwm2m_session_is_equal(observedP->watcherList->server->sessionH, fromSessionH, contextP->userData)) { targetP = observedP->watcherList; observedP->watcherList = observedP->watcherList->next; } else { lwm2m_watcher_t * parentP; parentP = observedP->watcherList; while (parentP->next != NULL && (parentP->next->lastMid != mid || lwm2m_session_is_equal(parentP->next->server->sessionH, fromSessionH, contextP->userData))) { parentP = parentP->next; } if (parentP->next != NULL) { targetP = parentP->next; parentP->next = parentP->next->next; } } if (targetP != NULL) { if (targetP->parameters != NULL) lwm2m_free(targetP->parameters); lwm2m_free(targetP); if (observedP->watcherList == NULL) { prv_unlinkObserved(contextP, observedP); lwm2m_free(observedP); } return; } } }
lwm2m_server_t * prv_findServer(lwm2m_context_t * contextP, void * fromSessionH) { lwm2m_server_t * targetP; targetP = contextP->serverList; while (targetP != NULL && false == lwm2m_session_is_equal(targetP->sessionH, fromSessionH, contextP->userData)) { targetP = targetP->next; } return targetP; }
lwm2m_server_t * utils_findBootstrapServer(lwm2m_context_t * contextP, void * fromSessionH) { #ifdef LWM2M_CLIENT_MODE lwm2m_server_t * targetP; targetP = contextP->bootstrapServerList; while (targetP != NULL && false == lwm2m_session_is_equal(targetP->sessionH, fromSessionH, contextP->userData)) { targetP = targetP->next; } return targetP; #else return NULL; #endif }
bool transaction_handleResponse(lwm2m_context_t * contextP, void * fromSessionH, coap_packet_t * message, coap_packet_t * response) { bool found = false; bool reset = false; lwm2m_transaction_t * transacP; LOG("Entering"); transacP = contextP->transactionList; while (NULL != transacP) { if (lwm2m_session_is_equal(fromSessionH, transacP->peerH, contextP->userData) == true) { if (!transacP->ack_received) { if ((COAP_TYPE_ACK == message->type) || (COAP_TYPE_RST == message->type)) { if (transacP->mID == message->mid) { found = true; transacP->ack_received = true; reset = COAP_TYPE_RST == message->type; } } } if (reset || prv_checkFinished(transacP, message)) { // HACK: If a message is sent from the monitor callback, // it will arrive before the registration ACK. // So we resend transaction that were denied for authentication reason. if (!reset) { if (COAP_TYPE_CON == message->type && NULL != response) { coap_init_message(response, COAP_TYPE_ACK, 0, message->mid); message_send(contextP, response, fromSessionH); } if ((COAP_401_UNAUTHORIZED == message->code) && (COAP_MAX_RETRANSMIT > transacP->retrans_counter)) { transacP->ack_received = false; transacP->retrans_time += COAP_RESPONSE_TIMEOUT; return true; } } if (transacP->callback != NULL) { transacP->callback(transacP, message); } transaction_remove(contextP, transacP); return true; } // if we found our guy, exit if (found) { time_t tv_sec = lwm2m_gettime(); if (0 <= tv_sec) { transacP->retrans_time = tv_sec; } if (transacP->response_timeout) { transacP->retrans_time += transacP->response_timeout; } else { transacP->retrans_time += COAP_RESPONSE_TIMEOUT * transacP->retrans_counter; } return true; } } transacP = transacP->next; } return false; }