void copy_security_object(lwm2m_object_t * objectDest, lwm2m_object_t * objectSrc) { memcpy(objectDest, objectSrc, sizeof(lwm2m_object_t)); objectDest->instanceList = NULL; objectDest->userData = NULL; security_instance_t * instanceSrc = (security_instance_t *)objectSrc->instanceList; security_instance_t * previousInstanceDest = NULL; while (instanceSrc != NULL) { security_instance_t * instanceDest = (security_instance_t *)lwm2m_malloc(sizeof(security_instance_t)); if (NULL == instanceDest) { return; } memcpy(instanceDest, instanceSrc, sizeof(security_instance_t)); instanceDest->uri = (char*)lwm2m_malloc(strlen(instanceSrc->uri) + 1); strcpy(instanceDest->uri, instanceSrc->uri); if (instanceSrc->securityMode == LWM2M_SECURITY_MODE_PRE_SHARED_KEY) { instanceDest->publicIdentity = lwm2m_strdup(instanceSrc->publicIdentity); instanceDest->secretKey = lwm2m_strdup(instanceSrc->secretKey); } instanceSrc = (security_instance_t *)instanceSrc->next; if (previousInstanceDest == NULL) { objectDest->instanceList = (lwm2m_list_t *)instanceDest; } else { previousInstanceDest->next = instanceDest; } previousInstanceDest = instanceDest; } }
char * get_server_uri(lwm2m_object_t * objectP, uint16_t secObjInstID) { security_instance_t * targetP = (security_instance_t *)LWM2M_LIST_FIND(objectP->instanceList, secObjInstID); if (NULL != targetP) { return lwm2m_strdup(targetP->uri); } return NULL; }
static lwm2m_client_object_t * prv_decodeRegisterPayload(uint8_t * payload, uint16_t payloadLength, char ** altPath) { lwm2m_client_object_t * objList; uint16_t id; uint16_t instance; uint16_t start; uint16_t end; int result; uint16_t altPathStart; uint16_t altPathEnd; uint16_t altPathLen; objList = NULL; start = 0; altPathStart = 0; altPathEnd = 0; altPathLen = 0; *altPath = NULL; // Does the registration payload begin with an alternative path ? while (start < payloadLength && payload[start] == ' ') start++; if (start != payloadLength) { if (payload[start] == '<') { altPathStart = start + 1; } while (start < payloadLength - 1 && payload[start] != '>') start++; if (start != payloadLength - 1) { altPathEnd = start - 1; if ((payloadLength > altPathEnd + REG_LWM2M_RESOURCE_TYPE_LEN) && (0 == lwm2m_strncmp(REG_LWM2M_RESOURCE_TYPE, (char *) payload + altPathEnd + 1, REG_LWM2M_RESOURCE_TYPE_LEN))) { payload[altPathEnd + 1] = 0; *altPath = lwm2m_strdup((char *)payload + altPathStart); if (*altPath == NULL) return NULL; if (0 == prv_isAltPathValid(*altPath)) { return NULL; } altPathLen = altPathEnd - altPathStart + 1; } } } if (altPathLen != 0) { start = altPathEnd + 1 + REG_LWM2M_RESOURCE_TYPE_LEN; // If declared alternative path is "/", use NULL instead if (altPathLen == 1) { lwm2m_free(*altPath); *altPath = NULL; } } else { start = 0; } while (start < payloadLength) { while (start < payloadLength && payload[start] == ' ') start++; if (start == payloadLength) return objList; end = start; while (end < payloadLength && payload[end] != ',') end++; result = prv_getId(payload + start, end - start, *altPath, altPathLen, &id, &instance); if (result != 0) { lwm2m_client_object_t * objectP; objectP = (lwm2m_client_object_t *)lwm2m_list_find((lwm2m_list_t *)objList, id); if (objectP == NULL) { objectP = (lwm2m_client_object_t *)lwm2m_malloc(sizeof(lwm2m_client_object_t)); memset(objectP, 0, sizeof(lwm2m_client_object_t)); if (objectP == NULL) return objList; objectP->id = id; objList = (lwm2m_client_object_t *)LWM2M_LIST_ADD(objList, objectP); } if (result == 2) { lwm2m_list_t * instanceP; instanceP = lwm2m_list_find(objectP->instanceList, instance); if (instanceP == NULL) { instanceP = (lwm2m_list_t *)lwm2m_malloc(sizeof(lwm2m_list_t)); memset(instanceP, 0, sizeof(lwm2m_list_t)); instanceP->id = instance; objectP->instanceList = LWM2M_LIST_ADD(objectP->instanceList, instanceP); } } } start = end + 1; } return objList; }
int lwm2m_configure(lwm2m_context_t * contextP, const char * endpointName, const char * msisdn, const char * altPath, uint16_t numObject, lwm2m_object_t * objectList[]) { int i; uint8_t found; LOG_ARG("endpointName: \"%s\", msisdn: \"%s\", altPath: \"%s\", numObject: %d", endpointName, msisdn, altPath, numObject); // This API can be called only once for now if (contextP->endpointName != NULL || contextP->objectList != NULL) return COAP_400_BAD_REQUEST; if (endpointName == NULL) return COAP_400_BAD_REQUEST; if (numObject < 3) return COAP_400_BAD_REQUEST; // Check that mandatory objects are present found = 0; for (i = 0 ; i < numObject ; i++) { if (objectList[i]->objID == LWM2M_SECURITY_OBJECT_ID) found |= 0x01; if (objectList[i]->objID == LWM2M_SERVER_OBJECT_ID) found |= 0x02; if (objectList[i]->objID == LWM2M_DEVICE_OBJECT_ID) found |= 0x04; } if (found != 0x07) return COAP_400_BAD_REQUEST; if (altPath != NULL) { if (0 == utils_isAltPathValid(altPath)) { return COAP_400_BAD_REQUEST; } if (altPath[1] == 0) { altPath = NULL; } } contextP->endpointName = lwm2m_strdup(endpointName); if (contextP->endpointName == NULL) { return COAP_500_INTERNAL_SERVER_ERROR; } if (msisdn != NULL) { contextP->msisdn = lwm2m_strdup(msisdn); if (contextP->msisdn == NULL) { return COAP_500_INTERNAL_SERVER_ERROR; } } if (altPath != NULL) { contextP->altPath = lwm2m_strdup(altPath); if (contextP->altPath == NULL) { return COAP_500_INTERNAL_SERVER_ERROR; } } for (i = 0; i < numObject; i++) { objectList[i]->next = NULL; contextP->objectList = (lwm2m_object_t *)LWM2M_LIST_ADD(contextP->objectList, objectList[i]); } return COAP_NO_ERROR; }
int lwm2m_configure(lwm2m_context_t * contextP, const char * endpointName, const char * msisdn, const char * altPath, uint16_t numObject, lwm2m_object_t * objectList[]) { int i; uint8_t found; // This API can be called only once for now if (contextP->endpointName != NULL) return COAP_400_BAD_REQUEST; if (endpointName == NULL) return COAP_400_BAD_REQUEST; if (numObject < 3) return COAP_400_BAD_REQUEST; // Check that mandatory objects are present found = 0; for (i = 0 ; i < numObject ; i++) { if (objectList[i]->objID == LWM2M_SECURITY_OBJECT_ID) found |= 0x01; if (objectList[i]->objID == LWM2M_SERVER_OBJECT_ID) found |= 0x02; if (objectList[i]->objID == LWM2M_DEVICE_OBJECT_ID) found |= 0x04; } if (found != 0x07) return COAP_400_BAD_REQUEST; if (altPath != NULL) { if (0 == prv_isAltPathValid(altPath)) { return COAP_400_BAD_REQUEST; } if (altPath[1] == 0) { altPath = NULL; } } contextP->endpointName = lwm2m_strdup(endpointName); if (contextP->endpointName == NULL) { return COAP_500_INTERNAL_SERVER_ERROR; } if (msisdn != NULL) { contextP->msisdn = lwm2m_strdup(msisdn); if (contextP->msisdn == NULL) { return COAP_500_INTERNAL_SERVER_ERROR; } } if (altPath != NULL) { contextP->altPath = lwm2m_strdup(altPath); if (contextP->altPath == NULL) { return COAP_500_INTERNAL_SERVER_ERROR; } } contextP->objectList = (lwm2m_object_t **)lwm2m_malloc(numObject * sizeof(lwm2m_object_t *)); if (NULL != contextP->objectList) { memcpy(contextP->objectList, objectList, numObject * sizeof(lwm2m_object_t *)); contextP->numObject = numObject; } else { lwm2m_free(contextP->endpointName); contextP->endpointName = NULL; return COAP_500_INTERNAL_SERVER_ERROR; } return COAP_NO_ERROR; }