Program Listing for File dm.h

Return to documentation for file (include_public/anjay/dm.h)

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

#ifndef ANJAY_INCLUDE_ANJAY_DM_H
#define ANJAY_INCLUDE_ANJAY_DM_H

#include <math.h>
#include <stdint.h>

#include <anjay/io.h>

#ifdef __cplusplus
extern "C" {
#endif

#define ANJAY_DM_OID_SECURITY 0
#define ANJAY_DM_OID_SERVER 1
#define ANJAY_DM_OID_ACCESS_CONTROL 2
#define ANJAY_DM_OID_DEVICE 3
#define ANJAY_DM_OID_FIRMWARE_UPDATE 5
#ifdef ANJAY_WITH_COAP_OSCORE
#    define ANJAY_DM_OID_OSCORE 21
#endif // ANJAY_WITH_COAP_OSCORE
#ifdef ANJAY_WITH_LWM2M_GATEWAY
#    define ANJAY_DM_OID_LWM2M_GATEWAY 25
#endif // ANJAY_WITH_LWM2M_GATEWAY

typedef struct anjay_dm_object_def_struct anjay_dm_object_def_t;

typedef enum {
    ANJAY_DM_CON_ATTR_NONE = -1,
    ANJAY_DM_CON_ATTR_NON = 0,
    ANJAY_DM_CON_ATTR_CON = 1
} anjay_dm_con_attr_t;

#ifdef ANJAY_WITH_LWM2M12
typedef enum {
    ANJAY_DM_EDGE_ATTR_NONE = -1,
    ANJAY_DM_EDGE_ATTR_FALLING = 0,
    ANJAY_DM_EDGE_ATTR_RISING = 1
} anjay_dm_edge_attr_t;
#endif // ANJAY_WITH_LWM2M12

typedef struct {
    int32_t min_period;
    int32_t max_period;
    int32_t min_eval_period;
    int32_t max_eval_period;
#ifdef ANJAY_WITH_CON_ATTR
    anjay_dm_con_attr_t con;
#endif // ANJAY_WITH_CON_ATTR
#ifdef ANJAY_WITH_LWM2M12
    int32_t hqmax;
#endif // ANJAY_WITH_LWM2M12
} anjay_dm_oi_attributes_t;

typedef struct {
    anjay_dm_oi_attributes_t common;
    double greater_than;
    double less_than;
    double step;
#ifdef ANJAY_WITH_LWM2M12
    anjay_dm_edge_attr_t edge;
#endif // ANJAY_WITH_LWM2M12
} anjay_dm_r_attributes_t;

#define ANJAY_ATTRIB_INTEGER_NONE (-1)

#define ANJAY_ATTRIB_PERIOD_NONE ANJAY_ATTRIB_INTEGER_NONE

#define ANJAY_ATTRIB_DOUBLE_NONE (NAN)

#define ANJAY_ATTRIB_VALUE_NONE ANJAY_ATTRIB_DOUBLE_NONE

extern const anjay_dm_oi_attributes_t ANJAY_DM_OI_ATTRIBUTES_EMPTY;

extern const anjay_dm_r_attributes_t ANJAY_DM_R_ATTRIBUTES_EMPTY;

typedef int anjay_dm_object_read_default_attrs_t(
        anjay_t *anjay,
        const anjay_dm_object_def_t *const *obj_ptr,
        anjay_ssid_t ssid,
        anjay_dm_oi_attributes_t *out);

typedef int anjay_dm_object_write_default_attrs_t(
        anjay_t *anjay,
        const anjay_dm_object_def_t *const *obj_ptr,
        anjay_ssid_t ssid,
        const anjay_dm_oi_attributes_t *attrs);

typedef int
anjay_dm_list_instances_t(anjay_t *anjay,
                          const anjay_dm_object_def_t *const *obj_ptr,
                          anjay_dm_list_ctx_t *ctx);

int anjay_dm_list_instances_SINGLE(anjay_t *anjay,
                                   const anjay_dm_object_def_t *const *obj_ptr,
                                   anjay_dm_list_ctx_t *ctx);

typedef int
anjay_dm_instance_reset_t(anjay_t *anjay,
                          const anjay_dm_object_def_t *const *obj_ptr,
                          anjay_iid_t iid);

typedef int
anjay_dm_instance_remove_t(anjay_t *anjay,
                           const anjay_dm_object_def_t *const *obj_ptr,
                           anjay_iid_t iid);

typedef int
anjay_dm_instance_create_t(anjay_t *anjay,
                           const anjay_dm_object_def_t *const *obj_ptr,
                           anjay_iid_t iid);

typedef int anjay_dm_instance_read_default_attrs_t(
        anjay_t *anjay,
        const anjay_dm_object_def_t *const *obj_ptr,
        anjay_iid_t iid,
        anjay_ssid_t ssid,
        anjay_dm_oi_attributes_t *out);

typedef int anjay_dm_instance_write_default_attrs_t(
        anjay_t *anjay,
        const anjay_dm_object_def_t *const *obj_ptr,
        anjay_iid_t iid,
        anjay_ssid_t ssid,
        const anjay_dm_oi_attributes_t *attrs);

typedef int
anjay_dm_list_resources_t(anjay_t *anjay,
                          const anjay_dm_object_def_t *const *obj_ptr,
                          anjay_iid_t iid,
                          anjay_dm_resource_list_ctx_t *ctx);

typedef int
anjay_dm_resource_read_t(anjay_t *anjay,
                         const anjay_dm_object_def_t *const *obj_ptr,
                         anjay_iid_t iid,
                         anjay_rid_t rid,
                         anjay_riid_t riid,
                         anjay_output_ctx_t *ctx);

typedef int
anjay_dm_resource_write_t(anjay_t *anjay,
                          const anjay_dm_object_def_t *const *obj_ptr,
                          anjay_iid_t iid,
                          anjay_rid_t rid,
                          anjay_riid_t riid,
                          anjay_input_ctx_t *ctx);

typedef int
anjay_dm_resource_execute_t(anjay_t *anjay,
                            const anjay_dm_object_def_t *const *obj_ptr,
                            anjay_iid_t iid,
                            anjay_rid_t rid,
                            anjay_execute_ctx_t *ctx);

typedef int
anjay_dm_resource_reset_t(anjay_t *anjay,
                          const anjay_dm_object_def_t *const *obj_ptr,
                          anjay_iid_t iid,
                          anjay_rid_t rid);

typedef int
anjay_dm_list_resource_instances_t(anjay_t *anjay,
                                   const anjay_dm_object_def_t *const *obj_ptr,
                                   anjay_iid_t iid,
                                   anjay_rid_t rid,
                                   anjay_dm_list_ctx_t *ctx);

typedef int
anjay_dm_resource_read_attrs_t(anjay_t *anjay,
                               const anjay_dm_object_def_t *const *obj_ptr,
                               anjay_iid_t iid,
                               anjay_rid_t rid,
                               anjay_ssid_t ssid,
                               anjay_dm_r_attributes_t *out);

typedef int
anjay_dm_resource_write_attrs_t(anjay_t *anjay,
                                const anjay_dm_object_def_t *const *obj_ptr,
                                anjay_iid_t iid,
                                anjay_rid_t rid,
                                anjay_ssid_t ssid,
                                const anjay_dm_r_attributes_t *attrs);

typedef int anjay_dm_resource_instance_read_attrs_t(
        anjay_t *anjay,
        const anjay_dm_object_def_t *const *obj_ptr,
        anjay_iid_t iid,
        anjay_rid_t rid,
        anjay_riid_t riid,
        anjay_ssid_t ssid,
        anjay_dm_r_attributes_t *out);

typedef int anjay_dm_resource_instance_write_attrs_t(
        anjay_t *anjay,
        const anjay_dm_object_def_t *const *obj_ptr,
        anjay_iid_t iid,
        anjay_rid_t rid,
        anjay_riid_t riid,
        anjay_ssid_t ssid,
        const anjay_dm_r_attributes_t *attrs);

typedef int
anjay_dm_resource_instance_remove_t(anjay_t *anjay,
                                    const anjay_dm_object_def_t *const *obj_ptr,
                                    anjay_iid_t iid,
                                    anjay_rid_t rid,
                                    anjay_riid_t riid);

typedef int
anjay_dm_transaction_begin_t(anjay_t *anjay,
                             const anjay_dm_object_def_t *const *obj_ptr);

typedef int
anjay_dm_transaction_validate_t(anjay_t *anjay,
                                const anjay_dm_object_def_t *const *obj_ptr);

typedef int
anjay_dm_transaction_commit_t(anjay_t *anjay,
                              const anjay_dm_object_def_t *const *obj_ptr);

int anjay_dm_transaction_NOOP(anjay_t *anjay,
                              const anjay_dm_object_def_t *const *obj_ptr);

typedef int
anjay_dm_transaction_rollback_t(anjay_t *anjay,
                                const anjay_dm_object_def_t *const *obj_ptr);

typedef struct {
    anjay_dm_object_read_default_attrs_t *object_read_default_attrs;

    anjay_dm_object_write_default_attrs_t *object_write_default_attrs;

    anjay_dm_list_instances_t *list_instances;

    anjay_dm_instance_reset_t *instance_reset;

    anjay_dm_instance_create_t *instance_create;

    anjay_dm_instance_remove_t *instance_remove;

    anjay_dm_instance_read_default_attrs_t *instance_read_default_attrs;

    anjay_dm_instance_write_default_attrs_t *instance_write_default_attrs;

    anjay_dm_list_resources_t *list_resources;

    anjay_dm_resource_read_t *resource_read;

    anjay_dm_resource_write_t *resource_write;

    anjay_dm_resource_execute_t *resource_execute;

    anjay_dm_resource_reset_t *resource_reset;

    anjay_dm_list_resource_instances_t *list_resource_instances;

    anjay_dm_resource_read_attrs_t *resource_read_attrs;

    anjay_dm_resource_write_attrs_t *resource_write_attrs;

    anjay_dm_transaction_begin_t *transaction_begin;

    anjay_dm_transaction_validate_t *transaction_validate;

    anjay_dm_transaction_commit_t *transaction_commit;

    anjay_dm_transaction_rollback_t *transaction_rollback;

    anjay_dm_resource_instance_read_attrs_t *resource_instance_read_attrs;

    anjay_dm_resource_instance_write_attrs_t *resource_instance_write_attrs;

#ifdef ANJAY_WITH_LWM2M12
    anjay_dm_resource_instance_remove_t *resource_instance_remove;
#endif // ANJAY_WITH_LWM2M12
} anjay_dm_handlers_t;

struct anjay_dm_object_def_struct {
    anjay_oid_t oid;

    const char *version;

    anjay_dm_handlers_t handlers;
};

int anjay_notify_changed(anjay_t *anjay,
                         anjay_oid_t oid,
                         anjay_iid_t iid,
                         anjay_rid_t rid);

int anjay_notify_instances_changed(anjay_t *anjay, anjay_oid_t oid);

#ifdef ANJAY_WITH_OBSERVATION_STATUS
#    ifndef ANJAY_MAX_OBSERVATION_SERVERS_REPORTED_NUMBER
#        define ANJAY_MAX_OBSERVATION_SERVERS_REPORTED_NUMBER 0
#    endif // ANJAY_MAX_OBSERVATION_SERVERS_REPORTED_NUMBER

typedef struct {
    bool is_observed;
    int32_t min_period;
    int32_t max_eval_period;
#    if (ANJAY_MAX_OBSERVATION_SERVERS_REPORTED_NUMBER > 0)
    uint16_t servers_number;
    anjay_ssid_t servers[ANJAY_MAX_OBSERVATION_SERVERS_REPORTED_NUMBER];
#    endif //(ANJAY_MAX_OBSERVATION_SERVERS_REPORTED_NUMBER > 0)
} anjay_resource_observation_status_t;

anjay_resource_observation_status_t anjay_resource_observation_status(
        anjay_t *anjay, anjay_oid_t oid, anjay_iid_t iid, anjay_rid_t rid);

#endif // ANJAY_WITH_OBSERVATION_STATUS

int anjay_register_object(anjay_t *anjay,
                          const anjay_dm_object_def_t *const *def_ptr);

int anjay_unregister_object(anjay_t *anjay,
                            const anjay_dm_object_def_t *const *def_ptr);

bool anjay_binding_mode_valid(const char *binding_mode);

typedef enum {
    ANJAY_SECURITY_PSK = 0,         //< Pre-Shared Key mode
    ANJAY_SECURITY_RPK = 1,         //< Raw Public Key mode
    ANJAY_SECURITY_CERTIFICATE = 2, //< Certificate mode
    ANJAY_SECURITY_NOSEC = 3,       //< NoSec mode
    ANJAY_SECURITY_EST = 4          //< Certificate mode with EST
} anjay_security_mode_t;

#ifdef ANJAY_WITH_SMS
typedef enum {
    ANJAY_SMS_SECURITY_DTLS_PSK = 1,      //< DTLS in PSK mode
    ANJAY_SMS_SECURITY_SECURE_PACKET = 2, //< Secure Packet Structure
    ANJAY_SMS_SECURITY_NOSEC = 3          //< NoSec mode
} anjay_sms_security_mode_t;
#endif // ANJAY_WITH_SMS

#define ANJAY_ACCESS_MASK_READ (1U << 0)
#define ANJAY_ACCESS_MASK_WRITE (1U << 1)
#define ANJAY_ACCESS_MASK_EXECUTE (1U << 2)
#define ANJAY_ACCESS_MASK_DELETE (1U << 3)
#define ANJAY_ACCESS_MASK_CREATE (1U << 4)
// clang-format off
#define ANJAY_ACCESS_MASK_FULL   \
    (ANJAY_ACCESS_MASK_READ      \
     | ANJAY_ACCESS_MASK_WRITE   \
     | ANJAY_ACCESS_MASK_DELETE  \
     | ANJAY_ACCESS_MASK_EXECUTE \
     | ANJAY_ACCESS_MASK_CREATE)
// clang-format on
#define ANJAY_ACCESS_MASK_NONE 0
#define ANJAY_ACCESS_LIST_OWNER_BOOTSTRAP UINT16_MAX

typedef uint16_t anjay_access_mask_t;

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /*ANJAY_INCLUDE_ANJAY_DM_H*/