Program Listing for File defs.h

Return to documentation for file (include_public/anj/defs.h)

/*
 * Copyright 2023-2026 AVSystem <avsystem@avsystem.com>
 * AVSystem Anjay Lite LwM2M SDK
 * All rights reserved.
 *
 * Licensed under AVSystem Anjay Lite LwM2M Client SDK - Non-Commercial License.
 * See the attached LICENSE file for details.
 */

#include <anj/init.h>

#ifndef ANJ_DEFS_H
#    define ANJ_DEFS_H

#    include <assert.h>
#    include <math.h>
#    include <stdbool.h>
#    include <stdint.h>
#    include <stdlib.h>

#    include <anj/time.h>

#    ifdef __cplusplus
extern "C" {
#    endif

#    define ANJ_COAP_CODE_CLASS_MASK 0xE0
#    define ANJ_COAP_CODE_CLASS_SHIFT 5
#    define ANJ_COAP_CODE_DETAIL_MASK 0x1F
#    define ANJ_COAP_CODE_DETAIL_SHIFT 0

#    define ANJ_COAP_CODE(cls, detail)                                     \
        ((((cls) << ANJ_COAP_CODE_CLASS_SHIFT) & ANJ_COAP_CODE_CLASS_MASK) \
         | (((detail) << ANJ_COAP_CODE_DETAIL_SHIFT)                       \
            & ANJ_COAP_CODE_DETAIL_MASK))

// clang-format off

#define ANJ_COAP_CODE_EMPTY  ANJ_COAP_CODE(0, 0)

#define ANJ_COAP_CODE_GET     ANJ_COAP_CODE(0, 1)
#define ANJ_COAP_CODE_POST    ANJ_COAP_CODE(0, 2)
#define ANJ_COAP_CODE_PUT     ANJ_COAP_CODE(0, 3)
#define ANJ_COAP_CODE_DELETE  ANJ_COAP_CODE(0, 4)
#define ANJ_COAP_CODE_FETCH   ANJ_COAP_CODE(0, 5)
#define ANJ_COAP_CODE_PATCH   ANJ_COAP_CODE(0, 6)
#define ANJ_COAP_CODE_IPATCH  ANJ_COAP_CODE(0, 7)

#define ANJ_COAP_CODE_CREATED   ANJ_COAP_CODE(2, 1)
#define ANJ_COAP_CODE_DELETED   ANJ_COAP_CODE(2, 2)
#define ANJ_COAP_CODE_VALID     ANJ_COAP_CODE(2, 3)
#define ANJ_COAP_CODE_CHANGED   ANJ_COAP_CODE(2, 4)
#define ANJ_COAP_CODE_CONTENT   ANJ_COAP_CODE(2, 5)
#define ANJ_COAP_CODE_CONTINUE  ANJ_COAP_CODE(2, 31)

#define ANJ_COAP_CODE_BAD_REQUEST                 ANJ_COAP_CODE(4, 0)
#define ANJ_COAP_CODE_UNAUTHORIZED                ANJ_COAP_CODE(4, 1)
#define ANJ_COAP_CODE_BAD_OPTION                  ANJ_COAP_CODE(4, 2)
#define ANJ_COAP_CODE_FORBIDDEN                   ANJ_COAP_CODE(4, 3)
#define ANJ_COAP_CODE_NOT_FOUND                   ANJ_COAP_CODE(4, 4)
#define ANJ_COAP_CODE_METHOD_NOT_ALLOWED          ANJ_COAP_CODE(4, 5)
#define ANJ_COAP_CODE_NOT_ACCEPTABLE              ANJ_COAP_CODE(4, 6)
#define ANJ_COAP_CODE_REQUEST_ENTITY_INCOMPLETE   ANJ_COAP_CODE(4, 8)
#define ANJ_COAP_CODE_PRECONDITION_FAILED         ANJ_COAP_CODE(4, 12)
#define ANJ_COAP_CODE_REQUEST_ENTITY_TOO_LARGE    ANJ_COAP_CODE(4, 13)
#define ANJ_COAP_CODE_UNSUPPORTED_CONTENT_FORMAT  ANJ_COAP_CODE(4, 15)

#define ANJ_COAP_CODE_INTERNAL_SERVER_ERROR   ANJ_COAP_CODE(5, 0)
#define ANJ_COAP_CODE_NOT_IMPLEMENTED         ANJ_COAP_CODE(5, 1)
#define ANJ_COAP_CODE_BAD_GATEWAY             ANJ_COAP_CODE(5, 2)
#define ANJ_COAP_CODE_SERVICE_UNAVAILABLE     ANJ_COAP_CODE(5, 3)
#define ANJ_COAP_CODE_GATEWAY_TIMEOUT         ANJ_COAP_CODE(5, 4)
#define ANJ_COAP_CODE_PROXYING_NOT_SUPPORTED  ANJ_COAP_CODE(5, 5)

// clang-format on

#    define ANJ_OBJ_ID_SECURITY 0U
#    define ANJ_OBJ_ID_SERVER 1U
#    define ANJ_OBJ_ID_ACCESS_CONTROL 2U
#    define ANJ_OBJ_ID_DEVICE 3U
#    define ANJ_OBJ_ID_FIRMWARE_UPDATE 5U
#    define ANJ_OBJ_ID_OSCORE 21U

#    define ANJ_I64_STR_MAX_LEN (sizeof("-9223372036854775808") - 1)
#    define ANJ_U16_STR_MAX_LEN (sizeof("65535") - 1)
#    define ANJ_U32_STR_MAX_LEN (sizeof("4294967295") - 1)
#    define ANJ_U64_STR_MAX_LEN (sizeof("18446744073709551615") - 1)
#    define ANJ_DOUBLE_STR_MAX_LEN (sizeof("-2.2250738585072014E-308") - 1)

#    define ANJ_ATTR_UINT_NONE (UINT32_MAX)
#    define ANJ_ATTR_DOUBLE_NONE (NAN)

#    define ANJ_IO_NEED_NEXT_CALL 4

typedef uint16_t anj_oid_t;

typedef uint16_t anj_iid_t;

typedef uint16_t anj_rid_t;

typedef uint16_t anj_riid_t;

typedef struct anj_struct anj_t;

#    ifdef ANJ_WITH_COAP_DOWNLOADER
typedef struct _anj_coap_downloader_struct anj_coap_downloader_t;
#    endif // ANJ_WITH_COAP_DOWNLOADER

#    ifdef ANJ_WITH_NTP
typedef struct _anj_ntp_struct anj_ntp_t;
#    endif // ANJ_WITH_NTP

#    define ANJ_SERVER_URI_MAX_SIZE 256

#    define ANJ_DISABLE_TIMEOUT_DEFAULT_VALUE 86400

#    define ANJ_COMMUNICATION_RETRY_RES_DEFAULT \
        (anj_communication_retry_res_t) {       \
            .retry_count = 5,                   \
            .retry_timer = 60,                  \
            .seq_delay_timer = 24 * 60 * 60,    \
            .seq_retry_count = 1                \
        }

#    define ANJ_EXCHANGE_SERVER_REQUEST_TIMEOUT \
        anj_time_duration_new(50, ANJ_TIME_UNIT_S)

#    define ANJ_EXCHANGE_UDP_TX_PARAMS_DEFAULT                        \
        (anj_exchange_udp_tx_params_t) {                              \
            .ack_timeout = anj_time_duration_new(2, ANJ_TIME_UNIT_S), \
            .ack_random_factor = 1.5,                                 \
            .max_retransmit = 4                                       \
        }

typedef struct {
    uint16_t retry_count;

    uint32_t retry_timer;

    uint32_t seq_delay_timer;

    uint16_t seq_retry_count;
} anj_communication_retry_res_t;

typedef struct {
    anj_time_duration_t ack_timeout;

    double ack_random_factor;

    uint16_t max_retransmit;
} anj_exchange_udp_tx_params_t;

typedef enum {
    ANJ_ID_OID,
    ANJ_ID_IID,
    ANJ_ID_RID,
    ANJ_ID_RIID,
    ANJ_URI_PATH_MAX_LENGTH
} anj_id_type_t;

typedef struct {
    uint16_t ids[ANJ_URI_PATH_MAX_LENGTH];
    size_t uri_len;
} anj_uri_path_t;

typedef uint16_t anj_data_type_t;

#    define ANJ_DATA_TYPE_NULL ((anj_data_type_t) 0)

#    define ANJ_DATA_TYPE_BYTES ((anj_data_type_t) (1 << 0))

#    define ANJ_DATA_TYPE_STRING ((anj_data_type_t) (1 << 1))

#    define ANJ_DATA_TYPE_INT ((anj_data_type_t) (1 << 2))

#    define ANJ_DATA_TYPE_DOUBLE ((anj_data_type_t) (1 << 3))

#    define ANJ_DATA_TYPE_BOOL ((anj_data_type_t) (1 << 4))

#    define ANJ_DATA_TYPE_OBJLNK ((anj_data_type_t) (1 << 5))

#    define ANJ_DATA_TYPE_UINT ((anj_data_type_t) (1 << 6))

#    define ANJ_DATA_TYPE_TIME ((anj_data_type_t) (1 << 7))

#    define ANJ_DATA_TYPE_ANY                                           \
        ((anj_data_type_t) (ANJ_DATA_TYPE_BYTES | ANJ_DATA_TYPE_STRING  \
                            | ANJ_DATA_TYPE_INT | ANJ_DATA_TYPE_DOUBLE  \
                            | ANJ_DATA_TYPE_BOOL | ANJ_DATA_TYPE_OBJLNK \
                            | ANJ_DATA_TYPE_UINT | ANJ_DATA_TYPE_TIME))

#    ifdef ANJ_WITH_EXTERNAL_DATA

#        define ANJ_DATA_TYPE_FLAG_EXTERNAL ((anj_data_type_t) (1 << 15))

#        define ANJ_DATA_TYPE_EXTERNAL_BYTES        \
            ((anj_data_type_t) (ANJ_DATA_TYPE_BYTES \
                                | ANJ_DATA_TYPE_FLAG_EXTERNAL))

#        define ANJ_DATA_TYPE_EXTERNAL_STRING        \
            ((anj_data_type_t) (ANJ_DATA_TYPE_STRING \
                                | ANJ_DATA_TYPE_FLAG_EXTERNAL))

typedef int anj_get_external_data_t(void *buffer,
                                    size_t *inout_size,
                                    size_t offset,
                                    void *user_args);

typedef int anj_open_external_data_t(void *user_args);

typedef void anj_close_external_data_t(void *user_args);
#    endif // ANJ_WITH_EXTERNAL_DATA

typedef struct {
    const void *data;

    size_t offset;

    size_t chunk_length;

    size_t full_length_hint;
} anj_bytes_or_string_value_t;

typedef struct {
    anj_oid_t oid;

    anj_iid_t iid;
} anj_objlnk_value_t;

#    define ANJ_NULL_LINK          \
        (anj_objlnk_value_t) {     \
            .oid = ANJ_ID_INVALID, \
            .iid = ANJ_ID_INVALID  \
        }

typedef union {
    anj_bytes_or_string_value_t bytes_or_string;

#    ifdef ANJ_WITH_EXTERNAL_DATA
    struct {
        anj_get_external_data_t *get_external_data;

        anj_open_external_data_t *open_external_data;

        anj_close_external_data_t *close_external_data;

        void *user_args;
    } external_data;
#    endif // ANJ_WITH_EXTERNAL_DATA

    int64_t int_value;

    uint64_t uint_value;

    double double_value;

    bool bool_value;

    anj_objlnk_value_t objlnk;

    int64_t time_value;
} anj_res_value_t;

typedef struct anj_io_out_entry_struct {
    anj_data_type_t type;

    anj_res_value_t value;

    anj_uri_path_t path;

    double timestamp;
} anj_io_out_entry_t;

#    ifdef __cplusplus
}
#    endif

#endif // ANJ_DEFS_H