Ejemplo n.º 1
0
/**
implementation for all read-able resources
*/
static uint8_t prv_res2tlv(lwm2m_tlv_t* tlvP,
                           location_data_t* locDataP)
{
    //-------------------------------------------------------------------- JH --
    uint8_t ret = COAP_205_CONTENT;
    switch (tlvP->id)     // location resourceId
    {
    case RES_M_LATITUDE:
        tlvP->value  = (uint8_t*)locDataP->latitude;
        tlvP->length = strlen(locDataP->latitude);
        tlvP->flags  = LWM2M_TLV_FLAG_STATIC_DATA;
        tlvP->type   = LWM2M_TYPE_RESOURCE;
        tlvP->dataType = LWM2M_TYPE_STRING;
        break;
    case RES_M_LONGITUDE:
        tlvP->value  = (uint8_t*)locDataP->longitude;
        tlvP->length = strlen(locDataP->latitude);
        tlvP->flags  = LWM2M_TLV_FLAG_STATIC_DATA;
        tlvP->type   = LWM2M_TYPE_RESOURCE;
        tlvP->dataType = LWM2M_TYPE_STRING;
        break;
    case RES_O_ALTITUDE:
        tlvP->value  = (uint8_t*)locDataP->altitude;
        tlvP->length = strlen(locDataP->altitude);
        tlvP->flags  = LWM2M_TLV_FLAG_STATIC_DATA;
        tlvP->type   = LWM2M_TYPE_RESOURCE;
        tlvP->dataType = LWM2M_TYPE_STRING;
        break;
    case RES_O_UNCERTAINTY:
        tlvP->value  = (uint8_t*)locDataP->uncertainty;
        tlvP->length = strlen(locDataP->uncertainty);
        tlvP->flags  = LWM2M_TLV_FLAG_STATIC_DATA;
        tlvP->type   = LWM2M_TYPE_RESOURCE;
        tlvP->dataType = LWM2M_TYPE_STRING;
        break;
    case RES_O_VELOCITY:
        tlvP->value  = locDataP->velocity;
        tlvP->length = VELOCITY_OCTETS;
        tlvP->flags  = LWM2M_TLV_FLAG_STATIC_DATA;
        tlvP->type   = LWM2M_TYPE_RESOURCE;
        tlvP->dataType = LWM2M_TYPE_OPAQUE;
        break;
    case RES_M_TIMESTAMP:
        lwm2m_tlv_encode_int(locDataP->timestamp, tlvP);
        tlvP->type   = LWM2M_TYPE_RESOURCE;
        tlvP->dataType = LWM2M_TYPE_TIME;
        break;
    default:
        ret = COAP_404_NOT_FOUND;
        break;
    }

    return ret;
}
Ejemplo n.º 2
0
static uint8_t prv_get_value(lwm2m_tlv_t * tlvP,
                             server_instance_t * targetP)
{
    // There are no multiple instance resources
    tlvP->type = LWM2M_TYPE_RESOURCE;

    switch (tlvP->id)
    {
    case LWM2M_SERVER_SHORT_ID_ID:
        lwm2m_tlv_encode_int(targetP->shortServerId, tlvP);
        if (0 != tlvP->length) return COAP_205_CONTENT;
        else return COAP_500_INTERNAL_SERVER_ERROR;

    case LWM2M_SERVER_LIFETIME_ID:
        lwm2m_tlv_encode_int(targetP->lifetime, tlvP);
        if (0 != tlvP->length) return COAP_205_CONTENT;
        else return COAP_500_INTERNAL_SERVER_ERROR;

    case LWM2M_SERVER_DISABLE_ID:
        return COAP_405_METHOD_NOT_ALLOWED;

    case LWM2M_SERVER_STORING_ID:
        lwm2m_tlv_encode_bool(targetP->storing, tlvP);
        if (0 != tlvP->length) return COAP_205_CONTENT;
        else return COAP_500_INTERNAL_SERVER_ERROR;

    case LWM2M_SERVER_BINDING_ID:
        tlvP->value = (uint8_t*)targetP->binding;
        tlvP->length = strlen(targetP->binding);
        tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA;
        tlvP->dataType = LWM2M_TYPE_STRING;
        return COAP_205_CONTENT;

    case LWM2M_SERVER_UPDATE_ID:
        return COAP_405_METHOD_NOT_ALLOWED;

    default:
        return COAP_404_NOT_FOUND;
    }
}
Ejemplo n.º 3
0
static uint8_t prv_get_value(lwm2m_tlv_t * tlvP,
                             security_instance_t * targetP)
{
    // There are no multiple instance ressources
    tlvP->type = LWM2M_TYPE_RESOURCE;

    switch (tlvP->id)
    {
    case LWM2M_SECURITY_URI_ID:
        tlvP->value = (uint8_t*)targetP->uri;
        tlvP->length = strlen(targetP->uri);
        tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA;
        tlvP->dataType = LWM2M_TYPE_STRING;
        return COAP_205_CONTENT;

    case LWM2M_SECURITY_BOOTSTRAP_ID:
        lwm2m_tlv_encode_bool(targetP->isBootstrap, tlvP);
        if (0 != tlvP->length) return COAP_205_CONTENT;
        else return COAP_500_INTERNAL_SERVER_ERROR;

    case LWM2M_SECURITY_SECURITY_ID:
        lwm2m_tlv_encode_int(LWM2M_SECURITY_MODE_NONE, tlvP);
        if (0 != tlvP->length) return COAP_205_CONTENT;
        else return COAP_500_INTERNAL_SERVER_ERROR;

    case LWM2M_SECURITY_PUBLIC_KEY_ID:
        // Here we return an opaque of 1 byte containing 0
        tlvP->value = (uint8_t*)"";
        tlvP->length = 1;
        tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA;
        tlvP->dataType = LWM2M_TYPE_OPAQUE;
        return COAP_205_CONTENT;

    case LWM2M_SECURITY_SERVER_PUBLIC_KEY_ID:
        // Here we return an opaque of 1 byte containing 0
        tlvP->value = (uint8_t*)"";
        tlvP->length = 1;
        tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA;
        tlvP->dataType = LWM2M_TYPE_OPAQUE;
        return COAP_205_CONTENT;

    case LWM2M_SECURITY_SECRET_KEY_ID:
        // Here we return an opaque of 1 byte containing 0
        tlvP->value = (uint8_t*)"";
        tlvP->length = 1;
        tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA;
        tlvP->dataType = LWM2M_TYPE_OPAQUE;
        return COAP_205_CONTENT;

    case LWM2M_SECURITY_SMS_SECURITY_ID:
        lwm2m_tlv_encode_int(LWM2M_SECURITY_MODE_NONE, tlvP);
        if (0 != tlvP->length) return COAP_205_CONTENT;
        else return COAP_500_INTERNAL_SERVER_ERROR;

    case LWM2M_SECURITY_SMS_KEY_PARAM_ID:
        // Here we return an opaque of 6 bytes containing a buggy value
        tlvP->value = (uint8_t*)"12345";
        tlvP->length = 6;
        tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA;
        tlvP->dataType = LWM2M_TYPE_OPAQUE;
        return COAP_205_CONTENT;

    case LWM2M_SECURITY_SMS_SECRET_KEY_ID:
        // Here we return an opaque of 32 bytes containing a buggy value
        tlvP->value = (uint8_t*)"1234567890abcdefghijklmnopqrstu";
        tlvP->length = 32;
        tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA;
        tlvP->dataType = LWM2M_TYPE_OPAQUE;
        return COAP_205_CONTENT;

    case LWM2M_SECURITY_SMS_SERVER_NUMBER_ID:
        lwm2m_tlv_encode_int(0, tlvP);
        if (0 != tlvP->length) return COAP_205_CONTENT;
        else return COAP_500_INTERNAL_SERVER_ERROR;

    case LWM2M_SECURITY_SHORT_SERVER_ID:
        lwm2m_tlv_encode_int(targetP->shortID, tlvP);
        if (0 != tlvP->length) return COAP_205_CONTENT;
        else return COAP_500_INTERNAL_SERVER_ERROR;

    case LWM2M_SECURITY_HOLD_OFF_ID:
        lwm2m_tlv_encode_int(targetP->clientHoldOffTime, tlvP);
        if (0 != tlvP->length) return COAP_205_CONTENT;
        else return COAP_500_INTERNAL_SERVER_ERROR;

    default:
        return COAP_404_NOT_FOUND;
    }
}
Ejemplo n.º 4
0
static uint8_t prv_set_value(lwm2m_tlv_t * tlvP,
                             device_data_t * devDataP)
{
    // a simple switch structure is used to respond at the specified resource asked
    switch (tlvP->id)
    {
    case 0:
        tlvP->value = PRV_MANUFACTURER;
        tlvP->length = strlen(PRV_MANUFACTURER);
        tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA;
        tlvP->type = LWM2M_TYPE_RESSOURCE;
        return COAP_205_CONTENT;

    case 1:
        tlvP->value = PRV_MODEL_NUMBER;
        tlvP->length = strlen(PRV_MODEL_NUMBER);
        tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA;
        tlvP->type = LWM2M_TYPE_RESSOURCE;
        return COAP_205_CONTENT;

    case 2:
        tlvP->value = PRV_SERIAL_NUMBER;
        tlvP->length = strlen(PRV_SERIAL_NUMBER);
        tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA;
        tlvP->type = LWM2M_TYPE_RESSOURCE;
        return COAP_205_CONTENT;

    case 3:
        tlvP->value = PRV_FIRMWARE_VERSION;
        tlvP->length = strlen(PRV_FIRMWARE_VERSION);
        tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA;
        tlvP->type = LWM2M_TYPE_RESSOURCE;
        return COAP_205_CONTENT;

    case 4:
        return COAP_405_METHOD_NOT_ALLOWED;

    case 5:
        return COAP_405_METHOD_NOT_ALLOWED;

    case 6:
    {
        lwm2m_tlv_t * subTlvP;

        subTlvP = lwm2m_tlv_new(2);

        subTlvP[0].flags = 0;
        subTlvP[0].id = 0;
        subTlvP[0].type = LWM2M_TYPE_RESSOURCE_INSTANCE;
        lwm2m_tlv_encode_int(PRV_POWER_SOURCE_1, subTlvP);
        if (0 == subTlvP[0].length)
        {
            lwm2m_tlv_free(2, subTlvP);
            return COAP_500_INTERNAL_SERVER_ERROR;
        }

        subTlvP[1].flags = 0;
        subTlvP[1].id = 1;
        subTlvP[1].type = LWM2M_TYPE_RESSOURCE_INSTANCE;
        lwm2m_tlv_encode_int(PRV_POWER_SOURCE_2, subTlvP + 1);
        if (0 == subTlvP[1].length)
        {
            lwm2m_tlv_free(2, subTlvP);
            return COAP_500_INTERNAL_SERVER_ERROR;
        }

        tlvP->flags = 0;
        tlvP->type = LWM2M_TYPE_MULTIPLE_RESSOURCE;
        tlvP->length = 2;
        tlvP->value = (uint8_t *)subTlvP;

        return COAP_205_CONTENT;
    }

    case 7:
    {
        lwm2m_tlv_t * subTlvP;

        subTlvP = lwm2m_tlv_new(2);

        subTlvP[0].flags = 0;
        subTlvP[0].id = 0;
        subTlvP[0].type = LWM2M_TYPE_RESSOURCE_INSTANCE;
        lwm2m_tlv_encode_int(PRV_POWER_VOLTAGE_1, subTlvP);
        if (0 == subTlvP[0].length)
        {
            lwm2m_tlv_free(2, subTlvP);
            return COAP_500_INTERNAL_SERVER_ERROR;
        }

        subTlvP[1].flags = 0;
        subTlvP[1].id = 1;
        subTlvP[1].type = LWM2M_TYPE_RESSOURCE_INSTANCE;
        lwm2m_tlv_encode_int(PRV_POWER_VOLTAGE_2, subTlvP + 1);
        if (0 == subTlvP[1].length)
        {
            lwm2m_tlv_free(2, subTlvP);
            return COAP_500_INTERNAL_SERVER_ERROR;
        }

        tlvP->flags = 0;
        tlvP->type = LWM2M_TYPE_MULTIPLE_RESSOURCE;
        tlvP->length = 2;
        tlvP->value = (uint8_t *)subTlvP;

        return COAP_205_CONTENT;
    }

    case 8:
    {
        lwm2m_tlv_t * subTlvP;

        subTlvP = lwm2m_tlv_new(2);

        subTlvP[0].flags = 0;
        subTlvP[0].id = 0;
        subTlvP[0].type = LWM2M_TYPE_RESSOURCE_INSTANCE;
        lwm2m_tlv_encode_int(PRV_POWER_CURRENT_1, subTlvP);
        if (0 == subTlvP[0].length)
        {
            lwm2m_tlv_free(2, subTlvP);
            return COAP_500_INTERNAL_SERVER_ERROR;
        }

        subTlvP[1].flags = 0;
        subTlvP[1].id = 1;
        subTlvP[1].type = LWM2M_TYPE_RESSOURCE_INSTANCE;
        lwm2m_tlv_encode_int(PRV_POWER_CURRENT_2, subTlvP + 1);
        if (0 == subTlvP[1].length)
        {
            lwm2m_tlv_free(2, subTlvP);
            return COAP_500_INTERNAL_SERVER_ERROR;
        }

        tlvP->flags = 0;
        tlvP->type = LWM2M_TYPE_MULTIPLE_RESSOURCE;
        tlvP->length = 2;
        tlvP->value = (uint8_t *)subTlvP;

        return COAP_205_CONTENT;
    }

    case 9:
        lwm2m_tlv_encode_int(PRV_BATTERY_LEVEL, tlvP);
        tlvP->type = LWM2M_TYPE_RESSOURCE;

        if (0 != tlvP->length) return COAP_205_CONTENT;
        else return COAP_500_INTERNAL_SERVER_ERROR;

    case 10:
        lwm2m_tlv_encode_int(PRV_MEMORY_FREE, tlvP);
        tlvP->type = LWM2M_TYPE_RESSOURCE;

        if (0 != tlvP->length) return COAP_205_CONTENT;
        else return COAP_500_INTERNAL_SERVER_ERROR;

    case 11:
        lwm2m_tlv_encode_int(PRV_ERROR_CODE, tlvP);
        tlvP->type = LWM2M_TYPE_RESSOURCE;

        if (0 != tlvP->length) return COAP_205_CONTENT;
        else return COAP_500_INTERNAL_SERVER_ERROR;

    case 12:
        return COAP_405_METHOD_NOT_ALLOWED;

    case 13:
        lwm2m_tlv_encode_int(devDataP->time, tlvP);
        tlvP->type = LWM2M_TYPE_RESSOURCE;

        if (0 != tlvP->length) return COAP_205_CONTENT;
        else return COAP_500_INTERNAL_SERVER_ERROR;

    case 14:
        tlvP->value = devDataP->time_offset;
        tlvP->length = strlen(devDataP->time_offset);
        tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA;
        tlvP->type = LWM2M_TYPE_RESSOURCE;
        return COAP_205_CONTENT;

    case 15:
        tlvP->value = PRV_BINDING_MODE;
        tlvP->length = strlen(PRV_BINDING_MODE);
        tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA;
        tlvP->type = LWM2M_TYPE_RESSOURCE;
        return COAP_205_CONTENT;

    default:
        return COAP_404_NOT_FOUND;
    }
}
static uint8_t prv_firmware_read(uint16_t instanceId,
                                 int * numDataP,
                                 lwm2m_tlv_t ** dataArrayP,
                                 lwm2m_object_t * objectP)
{
    int i;
    uint8_t result;
    firmware_data_t * data = (firmware_data_t*)(objectP->userData);

    // this is a single instance object
    if (instanceId != 0)
    {
        return COAP_404_NOT_FOUND;
    }

    // is the server asking for the full object ?
    if (*numDataP == 0)
    {
        *dataArrayP = lwm2m_tlv_new(3);
        if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;
        *numDataP = 3;
        (*dataArrayP)[0].id = 3;
        (*dataArrayP)[1].id = 4;
        (*dataArrayP)[2].id = 5;
    }

    i = 0;
    do
    {
        switch ((*dataArrayP)[i].id)
        {
        case 0:
        case 1:
        case 2:
            result = COAP_405_METHOD_NOT_ALLOWED;
            break;

        case 3:
            // firmware update state (int)
            lwm2m_tlv_encode_int(data->state, *dataArrayP + i);
            (*dataArrayP)[i].type = LWM2M_TYPE_RESSOURCE;

            if (0 != (*dataArrayP)[i].length) result = COAP_205_CONTENT;
            else result = COAP_500_INTERNAL_SERVER_ERROR;

            break;

        case 4:
            lwm2m_tlv_encode_int(data->supported, *dataArrayP + i);
            (*dataArrayP)[i].type = LWM2M_TYPE_RESSOURCE;

            if (0 != (*dataArrayP)[i].length) result = COAP_205_CONTENT;
            else result = COAP_500_INTERNAL_SERVER_ERROR;

            break;

        case 5:
            lwm2m_tlv_encode_int(data->result, *dataArrayP + i);
            (*dataArrayP)[i].type = LWM2M_TYPE_RESSOURCE;

            if (0 != (*dataArrayP)[i].length) result = COAP_205_CONTENT;
            else result = COAP_500_INTERNAL_SERVER_ERROR;

            break;

        default:
            result = COAP_404_NOT_FOUND;
        }

        i++;
    } while (i < *numDataP && result == COAP_205_CONTENT);

    return result;
}
Ejemplo n.º 6
0
static uint8_t prv_set_value(lwm2m_tlv_t * tlvP,
                             conn_m_data_t * connDataP)
{
    switch (tlvP->id)
    {
    case RES_M_NETWORK_BEARER:
        lwm2m_tlv_encode_int(VALUE_NETWORK_BEARER_GSM, tlvP);
        tlvP->type = LWM2M_TYPE_RESOURCE;
        if (0 != tlvP->length) return COAP_205_CONTENT ;
        else return COAP_500_INTERNAL_SERVER_ERROR ;
        break;

    case RES_M_AVL_NETWORK_BEARER:
    {
        int riCnt = 1;   // reduced to 1 instance to fit in one block size
        lwm2m_tlv_t * subTlvP;
        subTlvP = lwm2m_tlv_new(riCnt);
        subTlvP[0].flags = 0;
        subTlvP[0].id    = 0;
        subTlvP[0].type  = LWM2M_TYPE_RESOURCE_INSTANCE;
        lwm2m_tlv_encode_int(VALUE_AVL_NETWORK_BEARER_1, subTlvP);
        if (0 == subTlvP[0].length)
        {
            lwm2m_tlv_free(riCnt, subTlvP);
            return COAP_500_INTERNAL_SERVER_ERROR ;
        }
        lwm2m_tlv_include(subTlvP, riCnt, tlvP);
        return COAP_205_CONTENT ;
    }
        break;

    case RES_M_RADIO_SIGNAL_STRENGTH: //s-int
        lwm2m_tlv_encode_int(connDataP->signalStrength, tlvP);
        tlvP->type = LWM2M_TYPE_RESOURCE;
        if (0 != tlvP->length)
            return COAP_205_CONTENT ;
        else
            return COAP_500_INTERNAL_SERVER_ERROR ;
        break;

    case RES_O_LINK_QUALITY: //s-int
        lwm2m_tlv_encode_int(connDataP->linkQuality, tlvP);
        tlvP->type = LWM2M_TYPE_RESOURCE;
        if (0 != tlvP->length) return COAP_205_CONTENT ;
        else return COAP_500_INTERNAL_SERVER_ERROR ;
        break;

    case RES_M_IP_ADDRESSES:
    {
        int ri, riCnt = 1;   // reduced to 1 instance to fit in one block size
        lwm2m_tlv_t* subTlvP = lwm2m_tlv_new(riCnt);
        for (ri=0; ri<riCnt; ri++)
        {
            subTlvP[ri].flags  = LWM2M_TLV_FLAG_STATIC_DATA;
            subTlvP[ri].id     = 0;
            subTlvP[ri].type   = LWM2M_TYPE_RESOURCE_INSTANCE;
            subTlvP[ri].dataType = LWM2M_TYPE_STRING;
            subTlvP[ri].value  = (uint8_t*) connDataP->ipAddresses[ri];
            subTlvP[ri].length = strlen(connDataP->ipAddresses[ri]);
            if (subTlvP[ri].length == 0)
            {
                lwm2m_tlv_free(riCnt, subTlvP);
                return COAP_500_INTERNAL_SERVER_ERROR ;
            }
        }
        lwm2m_tlv_include(subTlvP, riCnt, tlvP);
        return COAP_205_CONTENT ;
    }
        break;

    case RES_O_ROUTER_IP_ADDRESS:
    {
        int ri, riCnt = 1;   // reduced to 1 instance to fit in one block size
        lwm2m_tlv_t* subTlvP = lwm2m_tlv_new(riCnt);
        for (ri=0; ri<riCnt; ri++)
        {
            subTlvP[ri].flags  = LWM2M_TLV_FLAG_STATIC_DATA;
            subTlvP[ri].id     = 0;
            subTlvP[ri].type   = LWM2M_TYPE_RESOURCE_INSTANCE;
            subTlvP[ri].dataType = LWM2M_TYPE_STRING;
            subTlvP[ri].value  = (uint8_t*) connDataP->routerIpAddresses[ri];
            subTlvP[ri].length = strlen(connDataP->routerIpAddresses[ri]);
            if (subTlvP[ri].length == 0)
            {
                lwm2m_tlv_free(riCnt, subTlvP);
                return COAP_500_INTERNAL_SERVER_ERROR ;
            }
        }
        lwm2m_tlv_include(subTlvP, riCnt, tlvP);
        return COAP_205_CONTENT ;
    }
        break;

    case RES_O_LINK_UTILIZATION:
        lwm2m_tlv_encode_int(connDataP->linkUtilization, tlvP);
        tlvP->type = LWM2M_TYPE_RESOURCE;
        if (0 != tlvP->length)
            return COAP_205_CONTENT ;
        else
            return COAP_500_INTERNAL_SERVER_ERROR ;
        break;

    case RES_O_APN:
    {
        int riCnt = 1;   // reduced to 1 instance to fit in one block size
        lwm2m_tlv_t * subTlvP;
        subTlvP = lwm2m_tlv_new(riCnt);
        subTlvP[0].flags  = LWM2M_TLV_FLAG_STATIC_DATA;
        subTlvP[0].id     = 0;
        subTlvP[0].type   = LWM2M_TYPE_RESOURCE_INSTANCE;
        subTlvP[0].dataType = LWM2M_TYPE_STRING;
        subTlvP[0].value  = (uint8_t*) VALUE_APN_1;
        subTlvP[0].length = strlen(VALUE_APN_1);
        if (0 == subTlvP[0].length)
        {
            lwm2m_tlv_free(riCnt, subTlvP);
            return COAP_500_INTERNAL_SERVER_ERROR ;
        }
        lwm2m_tlv_include(subTlvP, riCnt, tlvP);
        return COAP_205_CONTENT;
    }
        break;

    case RES_O_CELL_ID:
        lwm2m_tlv_encode_int(connDataP->cellId, tlvP);
        tlvP->type = LWM2M_TYPE_RESOURCE;
        if (0 != tlvP->length) return COAP_205_CONTENT ;
        else return COAP_500_INTERNAL_SERVER_ERROR ;
        break;

    case RES_O_SMNC:
        lwm2m_tlv_encode_int(VALUE_SMNC, tlvP);
        tlvP->type = LWM2M_TYPE_RESOURCE;
        if (0 != tlvP->length) return COAP_205_CONTENT ;
        else return COAP_500_INTERNAL_SERVER_ERROR ;
        break;

    case RES_O_SMCC:
        lwm2m_tlv_encode_int(VALUE_SMCC, tlvP);
        tlvP->type = LWM2M_TYPE_RESOURCE;
        if (0 != tlvP->length) return COAP_205_CONTENT ;
        else return COAP_500_INTERNAL_SERVER_ERROR ;
        break;

    default:
        return COAP_404_NOT_FOUND ;
    }
}