coap_status_t handle_observe_request(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, uint8_t * fromAddr, size_t fromAddrLen, coap_packet_t * message, coap_packet_t * response) { lwm2m_observed_t * observedP; lwm2m_watcher_t * watcherP; lwm2m_server_t * serverP; LOG("handle_observe_request()\r\n"); if (!LWM2M_URI_IS_SET_INSTANCE(uriP) && LWM2M_URI_IS_SET_RESOURCE(uriP)) return COAP_400_BAD_REQUEST; if (message->token_len == 0) return COAP_400_BAD_REQUEST; serverP = prv_findServer(contextP, fromAddr, fromAddrLen); if (serverP == NULL || serverP->status != STATE_REGISTERED) return COAP_401_UNAUTHORIZED; observedP = prv_findObserved(contextP, uriP); if (observedP == NULL) { observedP = (lwm2m_observed_t *)lwm2m_malloc(sizeof(lwm2m_observed_t)); if (observedP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; memset(observedP, 0, sizeof(lwm2m_observed_t)); memcpy(&(observedP->uri), uriP, sizeof(lwm2m_uri_t)); observedP->next = contextP->observedList; contextP->observedList = observedP; } watcherP = prv_findWatcher(observedP, serverP); if (watcherP == NULL) { watcherP = (lwm2m_watcher_t *)lwm2m_malloc(sizeof(lwm2m_watcher_t)); if (watcherP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; memset(watcherP, 0, sizeof(lwm2m_watcher_t)); watcherP->server = serverP; watcherP->tokenLen = message->token_len; memcpy(watcherP->token, message->token, message->token_len); watcherP->next = observedP->watcherList; observedP->watcherList = watcherP; } coap_set_header_observe(response, watcherP->counter++); return COAP_205_CONTENT; }
static lwm2m_watcher_t * prv_getWatcher(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m_server_t * serverP) { lwm2m_observed_t * observedP; bool allocatedObserver; lwm2m_watcher_t * watcherP; allocatedObserver = false; observedP = prv_findObserved(contextP, uriP); if (observedP == NULL) { observedP = (lwm2m_observed_t *)lwm2m_malloc(sizeof(lwm2m_observed_t)); if (observedP == NULL) return NULL; allocatedObserver = true; memset(observedP, 0, sizeof(lwm2m_observed_t)); memcpy(&(observedP->uri), uriP, sizeof(lwm2m_uri_t)); observedP->next = contextP->observedList; contextP->observedList = observedP; } watcherP = prv_findWatcher(observedP, serverP); if (watcherP == NULL) { watcherP = (lwm2m_watcher_t *)lwm2m_malloc(sizeof(lwm2m_watcher_t)); if (watcherP == NULL) { if (allocatedObserver == true) { lwm2m_free(observedP); } return NULL; } memset(watcherP, 0, sizeof(lwm2m_watcher_t)); watcherP->active = false; watcherP->server = serverP; watcherP->next = observedP->watcherList; observedP->watcherList = watcherP; } return watcherP; }