/*
 * Copyright (c) 2017 Linaro Limited
 * Copyright (c) 2017-2019 Foundries.io
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/** @file lwm2m.h
 *
 * @defgroup lwm2m_api LwM2M high-level API
 * @ingroup networking
 * @{
 * @brief LwM2M high-level API
 *
 * @details
 * LwM2M high-level interface is defined in this header.
 *
 * @note The implementation assumes UDP module is enabled.
 *
 * @note For more information refer to Technical Specification
 * OMA-TS-LightweightM2M_Core-V1_1_1-20190617-A
 */

#ifndef ZEPHYR_INCLUDE_NET_LWM2M_H_
#define ZEPHYR_INCLUDE_NET_LWM2M_H_

#include <time.h>
#include <zephyr/kernel.h>
#include <zephyr/sys/mutex.h>
#include <zephyr/net/coap.h>
#include <zephyr/net/lwm2m_path.h>

/**
 * @name LwM2M Objects managed by OMA for LwM2M tech specification.
 * Objects in this range have IDs from 0 to 1023.
 * @{
 */

/* clang-format off */
#define LWM2M_OBJECT_SECURITY_ID                0  /**< Security object */
#define LWM2M_OBJECT_SERVER_ID                  1  /**< Server object */
#define LWM2M_OBJECT_ACCESS_CONTROL_ID          2  /**< Access Control object */
#define LWM2M_OBJECT_DEVICE_ID                  3  /**< Device object */
#define LWM2M_OBJECT_CONNECTIVITY_MONITORING_ID 4  /**< Connectivity Monitoring object */
#define LWM2M_OBJECT_FIRMWARE_ID                5  /**< Firmware object */
#define LWM2M_OBJECT_LOCATION_ID                6  /**< Location object */
#define LWM2M_OBJECT_CONNECTIVITY_STATISTICS_ID 7  /**< Connectivity Statistics object */
#define LWM2M_OBJECT_SOFTWARE_MANAGEMENT_ID     9  /**< Software Management object */
#define LWM2M_OBJECT_PORTFOLIO_ID               16 /**< Portfolio object */
#define LWM2M_OBJECT_BINARYAPPDATACONTAINER_ID  19 /**< Binary App Data Container object */
#define LWM2M_OBJECT_EVENT_LOG_ID               20 /**< Event Log object */
#define LWM2M_OBJECT_GATEWAY_ID                 25 /**< Gateway object */
/* clang-format on */

/** @} */

/**
 * @name LwM2M Objects produced by 3rd party Standards Development
 * Organizations.
 * Refer to the OMA LightweightM2M (LwM2M) Object and Resource Registry:
 * http://www.openmobilealliance.org/wp/OMNA/LwM2M/LwM2MRegistry.html
 * @{
 */

/* clang-format off */
#define IPSO_OBJECT_GENERIC_SENSOR_ID       3300 /**< IPSO Generic Sensor object */
#define IPSO_OBJECT_TEMP_SENSOR_ID          3303 /**< IPSO Temperature Sensor object */
#define IPSO_OBJECT_HUMIDITY_SENSOR_ID      3304 /**< IPSO Humidity Sensor object */
#define IPSO_OBJECT_LIGHT_CONTROL_ID        3311 /**< IPSO Light Control object */
#define IPSO_OBJECT_ACCELEROMETER_ID        3313 /**< IPSO Accelerometer object */
#define IPSO_OBJECT_VOLTAGE_SENSOR_ID       3316 /**< IPSO Voltage Sensor object */
#define IPSO_OBJECT_CURRENT_SENSOR_ID       3317 /**< IPSO Current Sensor object */
#define IPSO_OBJECT_PRESSURE_ID             3323 /**< IPSO Pressure Sensor object */
#define IPSO_OBJECT_BUZZER_ID               3338 /**< IPSO Buzzer object */
#define IPSO_OBJECT_TIMER_ID                3340 /**< IPSO Timer object */
#define IPSO_OBJECT_ONOFF_SWITCH_ID         3342 /**< IPSO On/Off Switch object */
#define IPSO_OBJECT_PUSH_BUTTON_ID          3347 /**< IPSO Push Button object */
#define UCIFI_OBJECT_BATTERY_ID             3411 /**< uCIFI Battery object */
#define IPSO_OBJECT_FILLING_LEVEL_SENSOR_ID 3435 /**< IPSO Filling Level Sensor object */
/* clang-format on */

/** @} */

/**
 * @brief Callback function called when a socket error is encountered
 *
 * @param error Error code
 */
typedef void (*lwm2m_socket_fault_cb_t)(int error);

/** @brief LwM2M object path structure */
struct lwm2m_obj_path {
	uint16_t obj_id;         /**< Object ID */
	uint16_t obj_inst_id;    /**< Object instance ID */
	uint16_t res_id;         /**< Resource ID */
	uint16_t res_inst_id;    /**< Resource instance ID */
	uint8_t  level;          /**< Path level (0-4). Ex. 4 = resource instance. */
};

/**
 * @brief Observe callback events
 */
enum lwm2m_observe_event {
	LWM2M_OBSERVE_EVENT_OBSERVER_ADDED,    /**< Observer added */
	LWM2M_OBSERVE_EVENT_OBSERVER_REMOVED,  /**< Observer removed */
	LWM2M_OBSERVE_EVENT_NOTIFY_ACK,        /**< Notification ACKed */
	LWM2M_OBSERVE_EVENT_NOTIFY_TIMEOUT,    /**< Notification timed out */
};

/**
 * @brief Observe callback indicating observer adds and deletes, and
 *	  notification ACKs and timeouts
 *
 * @param[in] event Observer add/delete or notification ack/timeout
 * @param[in] path LwM2M path
 * @param[in] user_data Pointer to user_data buffer, as provided in
 *			send_traceable_notification(). Used to determine for which
 *			data the ACKed/timed out notification was.
 */
typedef void (*lwm2m_observe_cb_t)(enum lwm2m_observe_event event, struct lwm2m_obj_path *path,
				   void *user_data);


struct lwm2m_ctx;
enum lwm2m_rd_client_event;
/**
 * @brief Asynchronous RD client event callback
 *
 * @param[in] ctx LwM2M context generating the event
 * @param[in] event LwM2M RD client event code
 */
typedef void (*lwm2m_ctx_event_cb_t)(struct lwm2m_ctx *ctx,
				     enum lwm2m_rd_client_event event);


/**
 * @brief LwM2M context structure to maintain information for a single
 * LwM2M connection.
 */
struct lwm2m_ctx {
	/** Destination address storage */
	struct sockaddr remote_addr;

	/** @cond INTERNAL_HIDDEN
	 * Private CoAP and networking structures + 1 is for RD Client own message
	 */
	struct coap_pending pendings[CONFIG_LWM2M_ENGINE_MAX_PENDING + 1];
	struct coap_reply replies[CONFIG_LWM2M_ENGINE_MAX_REPLIES + 1];
	sys_slist_t pending_sends;
#if defined(CONFIG_LWM2M_QUEUE_MODE_ENABLED)
	sys_slist_t queued_messages;
#endif
	sys_slist_t observer;
	/** @endcond */

	/** A pointer to currently processed request, for internal LwM2M engine
	 *  use. The underlying type is ``struct lwm2m_message``, but since it's
	 *  declared in a private header and not exposed to the application,
	 *  it's stored as a void pointer.
	 */
	void *processed_req;

#if defined(CONFIG_LWM2M_DTLS_SUPPORT) || defined(__DOXYGEN__)
	/**
	 * @name DTLS related information
	 * Available only when @kconfig{CONFIG_LWM2M_DTLS_SUPPORT} is enabled and
	 * @ref lwm2m_ctx.use_dtls is set to true.
	 * @{
	 */
	/** TLS tag is set by client as a reference used when the
	 *  LwM2M engine calls tls_credential_(add|delete)
	 */
	int tls_tag;

	/** Destination hostname.
	 *  When MBEDTLS SNI is enabled socket must be set with destination
	 *  server hostname.
	 */
	char *desthostname;
	/** Destination hostname length */
	uint16_t desthostnamelen;
	/** Flag to indicate if hostname verification is enabled */
	bool hostname_verify;

	/** Custom load_credentials function.
	 *  Client can set load_credentials function as a way of overriding
	 *  the default behavior of load_tls_credential() in lwm2m_engine.c
	 */
	int (*load_credentials)(struct lwm2m_ctx *client_ctx);
	/** @} */
#endif
	/** Custom socket options.
	 * Client can override default socket options by providing
	 * a callback that is called afer a socket is created and before
	 * connect.
	 */
	int (*set_socketoptions)(struct lwm2m_ctx *client_ctx);

	/** Flag to indicate if context should use DTLS.
	 *  Enabled via the use of coaps:// protocol prefix in connection
	 *  information.
	 *  NOTE: requires @kconfig{CONFIG_LWM2M_DTLS_SUPPORT}
	 */
	bool use_dtls;

	/**
	 * Flag to indicate that the socket connection is suspended.
	 * With queue mode, this will tell if there is a need to reconnect.
	 */
	bool connection_suspended;

#if defined(CONFIG_LWM2M_QUEUE_MODE_ENABLED) || defined(__DOXYGEN__)
	/**
	 * Flag to indicate that the client is buffering Notifications and Send messages.
	 * True value buffer Notifications and Send messages.
	 */
	bool buffer_client_messages;
#endif
	/** Current index of Security Object used for server credentials */
	int sec_obj_inst;

	/** Current index of Server Object used in this context. */
	int srv_obj_inst;

	/** Flag to enable BOOTSTRAP interface. See Section "Bootstrap Interface"
	 *  of LwM2M Technical Specification for more information.
	 */
	bool bootstrap_mode;

	/** Socket File Descriptor */
	int sock_fd;

	/** Socket fault callback. LwM2M processing thread will call this
	 *  callback in case of socket errors on receive.
	 */
	lwm2m_socket_fault_cb_t fault_cb;

	/** Callback for new or cancelled observations, and acknowledged or timed
	 *  out notifications.
	 */
	lwm2m_observe_cb_t observe_cb;

	/** Callback for client events */
	lwm2m_ctx_event_cb_t event_cb;

	/** Validation buffer. Used as a temporary buffer to decode the resource
	 *  value before validation. On successful validation, its content is
	 *  copied into the actual resource buffer.
	 */
	uint8_t validate_buf[CONFIG_LWM2M_ENGINE_VALIDATION_BUFFER_SIZE];
};

/**
 * LwM2M Time series data structure
 */
struct lwm2m_time_series_elem {
	/** Cached data Unix timestamp */
	time_t t;
	union {
		uint8_t u8;
		uint16_t u16;
		uint32_t u32;
		uint64_t u64;
		int8_t i8;
		int16_t i16;
		int32_t i32;
		int64_t i64;
		time_t time;
		double f;
		bool b;
	};
};

/**
 * @brief Asynchronous callback to get a resource buffer and length.
 *
 * Prior to accessing the data buffer of a resource, the engine can
 * use this callback to get the buffer pointer and length instead
 * of using the resource's data buffer.
 *
 * The client or LwM2M objects can register a function of this type via:
 * lwm2m_engine_register_read_callback()
 * lwm2m_engine_register_pre_write_callback()
 *
 * @param[in] obj_inst_id Object instance ID generating the callback.
 * @param[in] res_id Resource ID generating the callback.
 * @param[in] res_inst_id Resource instance ID generating the callback
 *                        (typically 0 for non-multi instance resources).
 * @param[out] data_len Length of the data buffer.
 *
 * @return Callback returns a pointer to the data buffer or NULL for failure.
 */
typedef void *(*lwm2m_engine_get_data_cb_t)(uint16_t obj_inst_id,
					    uint16_t res_id,
					    uint16_t res_inst_id,
					    size_t *data_len);

/**
 * @brief Asynchronous callback when data has been set to a resource buffer.
 *
 * After changing the data of a resource buffer, the LwM2M engine can
 * make use of this callback to pass the data back to the client or LwM2M
 * objects.
 *
 * A function of this type can be registered via:
 * lwm2m_engine_register_validate_callback()
 * lwm2m_engine_register_post_write_callback()
 *
 * @param[in] obj_inst_id Object instance ID generating the callback.
 * @param[in] res_id Resource ID generating the callback.
 * @param[in] res_inst_id Resource instance ID generating the callback
 *                        (typically 0 for non-multi instance resources).
 * @param[in] data Pointer to data.
 * @param[in] data_len Length of the data.
 * @param[in] last_block Flag used during block transfer to indicate the last
 *                       block of data. For non-block transfers this is always
 *                       false.
 * @param[in] total_size Expected total size of data for a block transfer.
 *                       For non-block transfers this is 0.
 *
 * @return Callback returns a negative error code (errno.h) indicating
 *         reason of failure or 0 for success.
 */
typedef int (*lwm2m_engine_set_data_cb_t)(uint16_t obj_inst_id,
					  uint16_t res_id, uint16_t res_inst_id,
					  uint8_t *data, uint16_t data_len,
					  bool last_block, size_t total_size);

/**
 * @brief Asynchronous event notification callback.
 *
 * Various object instance and resource-based events in the LwM2M engine
 * can trigger a callback of this function type: object instance create,
 * and object instance delete.
 *
 * Register a function of this type via:
 * lwm2m_engine_register_create_callback()
 * lwm2m_engine_register_delete_callback()
 *
 * @param[in] obj_inst_id Object instance ID generating the callback.
 *
 * @return Callback returns a negative error code (errno.h) indicating
 *         reason of failure or 0 for success.
 */
typedef int (*lwm2m_engine_user_cb_t)(uint16_t obj_inst_id);

/**
 * @brief Asynchronous execute notification callback.
 *
 * Resource executes trigger a callback of this type.
 *
 * Register a function of this type via:
 * lwm2m_engine_register_exec_callback()
 *
 * @param[in] obj_inst_id Object instance ID generating the callback.
 * @param[in] args Pointer to execute arguments payload. (This can be
 *            NULL if no arguments are provided)
 * @param[in] args_len Length of argument payload in bytes.
 *
 * @return Callback returns a negative error code (errno.h) indicating
 *         reason of failure or 0 for success.
 */
typedef int (*lwm2m_engine_execute_cb_t)(uint16_t obj_inst_id,
					 uint8_t *args, uint16_t args_len);

/**
 * @name Power source types used for the "Available Power Sources" resource of
 * the LwM2M Device object (3/0/6).
 * @{
 */
#define LWM2M_DEVICE_PWR_SRC_TYPE_DC_POWER	0 /**< DC power */
#define LWM2M_DEVICE_PWR_SRC_TYPE_BAT_INT	1 /**< Internal battery */
#define LWM2M_DEVICE_PWR_SRC_TYPE_BAT_EXT	2 /**< External battery */
#define LWM2M_DEVICE_PWR_SRC_TYPE_FUEL_CELL	3 /**< Fuel cell */
#define LWM2M_DEVICE_PWR_SRC_TYPE_PWR_OVER_ETH	4 /**< Power over Ethernet */
#define LWM2M_DEVICE_PWR_SRC_TYPE_USB		5 /**< USB */
#define LWM2M_DEVICE_PWR_SRC_TYPE_AC_POWER	6 /**< AC (mains) power */
#define LWM2M_DEVICE_PWR_SRC_TYPE_SOLAR		7 /**< Solar */
#define LWM2M_DEVICE_PWR_SRC_TYPE_MAX		8 /**< Max value for Available Power Source type */
/** @} */

/**
 * @name Error codes used for the "Error Code" resource of the LwM2M Device
 * object.
 * An LwM2M client can register one of the following error codes via
 * the lwm2m_device_add_err() function.
 * @{
 */
#define LWM2M_DEVICE_ERROR_NONE			0 /**< No error */
#define LWM2M_DEVICE_ERROR_LOW_POWER		1 /**< Low battery power */
#define LWM2M_DEVICE_ERROR_EXT_POWER_SUPPLY_OFF	2 /**< External power supply off */
#define LWM2M_DEVICE_ERROR_GPS_FAILURE		3 /**< GPS module failure */
#define LWM2M_DEVICE_ERROR_LOW_SIGNAL_STRENGTH	4 /**< Low received signal strength */
#define LWM2M_DEVICE_ERROR_OUT_OF_MEMORY	5 /**< Out of memory */
#define LWM2M_DEVICE_ERROR_SMS_FAILURE		6 /**< SMS failure */
#define LWM2M_DEVICE_ERROR_NETWORK_FAILURE	7 /**< IP Connectivity failure */
#define LWM2M_DEVICE_ERROR_PERIPHERAL_FAILURE	8 /**< Peripheral malfunction */

/** @} */

/**
 * @name Battery status codes used for the "Battery Status" resource (3/0/20)
 *        of the LwM2M Device object.  As the battery status changes, an LwM2M
 *        client can set one of the following codes via:
 *        lwm2m_engine_set_u8("3/0/20", [battery status])
 * @{
 */
#define LWM2M_DEVICE_BATTERY_STATUS_NORMAL	0 /**< The battery is operating normally and not on
						    *   power
						    */
#define LWM2M_DEVICE_BATTERY_STATUS_CHARGING	1 /**< The battery is currently charging */
#define LWM2M_DEVICE_BATTERY_STATUS_CHARGE_COMP	2 /**< The battery is fully charged and the charger
						    *   is still connected
						    */
#define LWM2M_DEVICE_BATTERY_STATUS_DAMAGED	3 /**< The battery has some problem */
#define LWM2M_DEVICE_BATTERY_STATUS_LOW		4 /**< The battery is low on charge */
#define LWM2M_DEVICE_BATTERY_STATUS_NOT_INST	5 /**< The battery is not installed */
#define LWM2M_DEVICE_BATTERY_STATUS_UNKNOWN	6 /**< The battery information is not available */

/** @} */

/**
 * @brief Register a new error code with LwM2M Device object.
 *
 * @param[in] error_code New error code.
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_device_add_err(uint8_t error_code);


/**
 * @name LWM2M Firmware Update object states
 *
 * An LwM2M client or the LwM2M Firmware Update object use the following codes
 * to represent the LwM2M Firmware Update state (5/0/3).
 * @{
 */

/**
 * Idle. Before downloading or after successful updating.
 */
#define STATE_IDLE		0
/**
 * Downloading. The data sequence is being downloaded.
 */
#define STATE_DOWNLOADING	1
/**
 * Downloaded. The whole data sequence has been downloaded.
 */
#define STATE_DOWNLOADED	2
/**
 * Updating. The device is being updated.
 */
#define STATE_UPDATING		3

/** @} */

/**
 * @name LWM2M Firmware Update object result codes
 *
 * After processing a firmware update, the client sets the result via one of
 * the following codes via lwm2m_engine_set_u8("5/0/5", [result code])
 * @{
 */

#define RESULT_DEFAULT		0	/**< Initial value */
#define RESULT_SUCCESS		1	/**< Firmware updated successfully */
#define RESULT_NO_STORAGE	2	/**< Not enough flash memory for the new firmware package */
#define RESULT_OUT_OF_MEM	3	/**< Out of RAM during downloading process */
#define RESULT_CONNECTION_LOST	4	/**< Connection lost during downloading process */
#define RESULT_INTEGRITY_FAILED	5	/**< Integrity check failure for new downloaded package */
#define RESULT_UNSUP_FW		6	/**< Unsupported package type */
#define RESULT_INVALID_URI	7	/**< Invalid URI */
#define RESULT_UPDATE_FAILED	8	/**< Firmware update failed */
#define RESULT_UNSUP_PROTO	9	/**< Unsupported protocol */

/** @} */

#if defined(CONFIG_LWM2M_FIRMWARE_UPDATE_OBJ_SUPPORT) || defined(__DOXYGEN__)
/**
 * @brief Set data callback for firmware block transfer.
 *
 * LwM2M clients use this function to register a callback for receiving the
 * block transfer data when performing a firmware update.
 *
 * @param[in] cb A callback function to receive the block transfer data
 */
void lwm2m_firmware_set_write_cb(lwm2m_engine_set_data_cb_t cb);

/**
 * @brief Get the data callback for firmware block transfer writes.
 *
 * @return A registered callback function to receive the block transfer data
 */
lwm2m_engine_set_data_cb_t lwm2m_firmware_get_write_cb(void);

/**
 * @brief Set data callback for firmware block transfer.
 *
 * LwM2M clients use this function to register a callback for receiving the
 * block transfer data when performing a firmware update.
 *
 * @param[in] obj_inst_id Object instance ID
 * @param[in] cb A callback function to receive the block transfer data
 */
void lwm2m_firmware_set_write_cb_inst(uint16_t obj_inst_id, lwm2m_engine_set_data_cb_t cb);

/**
 * @brief Get the data callback for firmware block transfer writes.
 *
 * @param[in] obj_inst_id Object instance ID
 * @return A registered callback function to receive the block transfer data
 */
lwm2m_engine_set_data_cb_t lwm2m_firmware_get_write_cb_inst(uint16_t obj_inst_id);

/**
 * @brief Set callback for firmware update cancel.
 *
 * LwM2M clients use this function to register a callback to perform actions
 * on firmware update cancel.
 *
 * @param[in] cb A callback function perform actions on firmware update cancel.
 */
void lwm2m_firmware_set_cancel_cb(lwm2m_engine_user_cb_t cb);

/**
 * @brief Get a callback for firmware update cancel.
 *
 * @return A registered callback function perform actions on firmware update cancel.
 */
lwm2m_engine_user_cb_t lwm2m_firmware_get_cancel_cb(void);

/**
 * @brief Set data callback for firmware update cancel.
 *
 * LwM2M clients use this function to register a callback to perform actions
 * on firmware update cancel.
 *
 * @param[in] obj_inst_id Object instance ID
 * @param[in] cb A callback function perform actions on firmware update cancel.
 */
void lwm2m_firmware_set_cancel_cb_inst(uint16_t obj_inst_id, lwm2m_engine_user_cb_t cb);

/**
 * @brief Get the callback for firmware update cancel.
 *
 * @param[in] obj_inst_id Object instance ID
 * @return A registered callback function perform actions on firmware update cancel.
 */
lwm2m_engine_user_cb_t lwm2m_firmware_get_cancel_cb_inst(uint16_t obj_inst_id);

#if defined(CONFIG_LWM2M_FIRMWARE_UPDATE_PULL_SUPPORT) || defined(__DOXYGEN__)
/**
 * @brief Set data callback to handle firmware update execute events.
 *
 * LwM2M clients use this function to register a callback for receiving the
 * update resource "execute" operation on the LwM2M Firmware Update object.
 *
 * @param[in] cb A callback function to receive the execute event.
 */
void lwm2m_firmware_set_update_cb(lwm2m_engine_execute_cb_t cb);

/**
 * @brief Get the event callback for firmware update execute events.
 *
 * @return A registered callback function to receive the execute event.
 */
lwm2m_engine_execute_cb_t lwm2m_firmware_get_update_cb(void);

/**
 * @brief Set data callback to handle firmware update execute events.
 *
 * LwM2M clients use this function to register a callback for receiving the
 * update resource "execute" operation on the LwM2M Firmware Update object.
 *
 * @param[in] obj_inst_id Object instance ID
 * @param[in] cb A callback function to receive the execute event.
 */
void lwm2m_firmware_set_update_cb_inst(uint16_t obj_inst_id, lwm2m_engine_execute_cb_t cb);

/**
 * @brief Get the event callback for firmware update execute events.
 *
 * @param[in] obj_inst_id Object instance ID
 * @return A registered callback function to receive the execute event.
 */
lwm2m_engine_execute_cb_t lwm2m_firmware_get_update_cb_inst(uint16_t obj_inst_id);
#endif
#endif


#if defined(CONFIG_LWM2M_SWMGMT_OBJ_SUPPORT) || defined(__DOXYGEN__)

/**
 * @brief Set callback to handle software activation requests
 *
 * The callback will be executed when the LWM2M execute operation gets called
 * on the corresponding object's Activate resource instance.
 *
 * @param[in] obj_inst_id The instance number to set the callback for.
 * @param[in] cb A callback function to receive the execute event.
 *
 * @return 0 on success, otherwise a negative integer.
 */
int lwm2m_swmgmt_set_activate_cb(uint16_t obj_inst_id, lwm2m_engine_execute_cb_t cb);

/**
 * @brief Set callback to handle software deactivation requests
 *
 * The callback will be executed when the LWM2M execute operation gets called
 * on the corresponding object's Deactivate resource instance.
 *
 * @param[in] obj_inst_id The instance number to set the callback for.
 * @param[in] cb A callback function to receive the execute event.
 *
 * @return 0 on success, otherwise a negative integer.
 */
int lwm2m_swmgmt_set_deactivate_cb(uint16_t obj_inst_id, lwm2m_engine_execute_cb_t cb);

/**
 * @brief Set callback to handle software install requests
 *
 * The callback will be executed when the LWM2M execute operation gets called
 * on the corresponding object's Install resource instance.
 *
 * @param[in] obj_inst_id The instance number to set the callback for.
 * @param[in] cb A callback function to receive the execute event.
 *
 * @return 0 on success, otherwise a negative integer.
 */
int lwm2m_swmgmt_set_install_package_cb(uint16_t obj_inst_id, lwm2m_engine_execute_cb_t cb);

/**
 * @brief Set callback to handle software uninstall requests
 *
 * The callback will be executed when the LWM2M execute operation gets called
 * on the corresponding object's Uninstall resource instance.
 *
 * @param[in] obj_inst_id The instance number to set the callback for.
 * @param[in] cb A callback function for handling the execute event.
 *
 * @return 0 on success, otherwise a negative integer.
 */
int lwm2m_swmgmt_set_delete_package_cb(uint16_t obj_inst_id, lwm2m_engine_execute_cb_t cb);

/**
 * @brief Set callback to read software package
 *
 * The callback will be executed when the LWM2M read operation gets called
 * on the corresponding object.
 *
 * @param[in] obj_inst_id The instance number to set the callback for.
 * @param[in] cb A callback function for handling the read event.
 *
 * @return 0 on success, otherwise a negative integer.
 */
int lwm2m_swmgmt_set_read_package_version_cb(uint16_t obj_inst_id, lwm2m_engine_get_data_cb_t cb);

/**
 * @brief Set data callback for software management block transfer.
 *
 * The callback will be executed when the LWM2M block write operation gets called
 * on the corresponding object's resource instance.
 *
 * @param[in] obj_inst_id The instance number to set the callback for.
 * @param[in] cb A callback function for handling the block write event.
 *
 * @return 0 on success, otherwise a negative integer.
 */
int lwm2m_swmgmt_set_write_package_cb(uint16_t obj_inst_id, lwm2m_engine_set_data_cb_t cb);

/**
 * Function to be called when a Software Management object instance
 * completed the Install operation.
 *
 * @param[in] obj_inst_id The Software Management object instance
 * @param[in] error_code The result code of the operation. Zero on success
 * otherwise it should be a negative integer.
 *
 * return 0 on success, otherwise a negative integer.
 */
int lwm2m_swmgmt_install_completed(uint16_t obj_inst_id, int error_code);

#endif

#if defined(CONFIG_LWM2M_EVENT_LOG_OBJ_SUPPORT) || defined(__DOXYGEN__)

/**
 * @brief Set callback to read log data
 *
 * The callback will be executed when the LWM2M read operation gets called
 * on the corresponding object.
 *
 * @param[in] cb A callback function for handling the read event.
 */
void lwm2m_event_log_set_read_log_data_cb(lwm2m_engine_get_data_cb_t cb);

#endif

/**
 * @brief Maximum value for Objlnk resource fields
 */
#define LWM2M_OBJLNK_MAX_ID USHRT_MAX

/**
 * @brief LWM2M Objlnk resource type structure
 */
struct lwm2m_objlnk {
	uint16_t obj_id;     /**< Object ID */
	uint16_t obj_inst;   /**< Object instance ID */
};

/**
 * @brief Change an observer's pmin value.
 *
 * @deprecated Use lwm2m_update_observer_min_period() instead.
 *
 * LwM2M clients use this function to modify the pmin attribute
 * for an observation being made.
 * Example to update the pmin of a temperature sensor value being observed:
 * lwm2m_engine_update_observer_min_period("client_ctx, 3303/0/5700", 5);
 *
 * @param[in] client_ctx LwM2M context
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res"
 * @param[in] period_s Value of pmin to be given (in seconds).
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_update_observer_min_period(struct lwm2m_ctx *client_ctx, const char *pathstr,
					    uint32_t period_s);

/**
 * @brief Change an observer's pmin value.
 *
 * LwM2M clients use this function to modify the pmin attribute
 * for an observation being made.
 * Example to update the pmin of a temperature sensor value being observed:
 * lwm2m_update_observer_min_period(client_ctx, &LWM2M_OBJ(3303, 0, 5700), 5);
 *
 * @param[in] client_ctx LwM2M context
 * @param[in] path LwM2M path as a struct
 * @param[in] period_s Value of pmin to be given (in seconds).
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_update_observer_min_period(struct lwm2m_ctx *client_ctx,
				     const struct lwm2m_obj_path *path, uint32_t period_s);

/**
 * @brief Change an observer's pmax value.
 *
 * @deprecated Use lwm2m_update_observer_max_period() instead.
 *
 * LwM2M clients use this function to modify the pmax attribute
 * for an observation being made.
 * Example to update the pmax of a temperature sensor value being observed:
 * lwm2m_engine_update_observer_max_period("client_ctx, 3303/0/5700", 5);
 *
 * @param[in] client_ctx LwM2M context
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res"
 * @param[in] period_s Value of pmax to be given (in seconds).
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_update_observer_max_period(struct lwm2m_ctx *client_ctx, const char *pathstr,
					    uint32_t period_s);

/**
 * @brief Change an observer's pmax value.
 *
 * LwM2M clients use this function to modify the pmax attribute
 * for an observation being made.
 * Example to update the pmax of a temperature sensor value being observed:
 * lwm2m__update_observer_max_period(client_ctx, &LWM2M_OBJ(3303, 0, 5700), 5);
 *
 * @param[in] client_ctx LwM2M context
 * @param[in] path LwM2M path as a struct
 * @param[in] period_s Value of pmax to be given (in seconds).
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_update_observer_max_period(struct lwm2m_ctx *client_ctx,
				     const struct lwm2m_obj_path *path, uint32_t period_s);

/**
 * @brief Create an LwM2M object instance.
 *
 * @deprecated Use lwm2m_create_obj_inst() instead.
 *
 * LwM2M clients use this function to create non-default LwM2M objects:
 * Example to create first temperature sensor object:
 * lwm2m_engine_create_obj_inst("3303/0");
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst"
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_create_obj_inst(const char *pathstr);

/**
 * @brief Create an LwM2M object instance.
 *
 * LwM2M clients use this function to create non-default LwM2M objects:
 * Example to create first temperature sensor object:
 * lwm2m_create_obj_inst(&LWM2M_OBJ(3303, 0));
 *
 * @param[in] path LwM2M path as a struct
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_create_object_inst(const struct lwm2m_obj_path *path);

/**
 * @brief Delete an LwM2M object instance.
 *
 * @deprecated Use lwm2m_delete_obj_inst() instead.
 *
 * LwM2M clients use this function to delete LwM2M objects.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst"
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_delete_obj_inst(const char *pathstr);

/**
 * @brief Delete an LwM2M object instance.
 *
 * LwM2M clients use this function to delete LwM2M objects.
 *
 * @param[in] path LwM2M path as a struct
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_delete_object_inst(const struct lwm2m_obj_path *path);

/**
 * @brief Locks the registry for this thread.
 *
 * Use this function before writing to multiple resources. This halts the
 * lwm2m main thread until all the write-operations are finished.
 *
 */
void lwm2m_registry_lock(void);

/**
 * @brief Unlocks the registry previously locked by lwm2m_registry_lock().
 *
 */
void lwm2m_registry_unlock(void);

/**
 * @brief Set resource (instance) value (opaque buffer)
 *
 * @deprecated Use lwm2m_set_opaque() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[in] data_ptr Data buffer
 * @param[in] data_len Length of buffer
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_set_opaque(const char *pathstr, const char *data_ptr, uint16_t data_len);

/**
 * @brief Set resource (instance) value (opaque buffer)
 *
 * @param[in] path LwM2M path as a struct
 * @param[in] data_ptr Data buffer
 * @param[in] data_len Length of buffer
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_set_opaque(const struct lwm2m_obj_path *path, const char *data_ptr, uint16_t data_len);

/**
 * @brief Set resource (instance) value (string)
 *
 * @deprecated Use lwm2m_set_string() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[in] data_ptr NULL terminated char buffer
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_set_string(const char *pathstr, const char *data_ptr);

/**
 * @brief Set resource (instance) value (string)
 *
 * @param[in] path LwM2M path as a struct
 * @param[in] data_ptr NULL terminated char buffer
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_set_string(const struct lwm2m_obj_path *path, const char *data_ptr);

/**
 * @brief Set resource (instance) value (u8)
 *
 * @deprecated Use lwm2m_set_u8() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[in] value u8 value
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_set_u8(const char *pathstr, uint8_t value);

/**
 * @brief Set resource (instance) value (u8)
 *
 * @param[in] path LwM2M path as a struct
 * @param[in] value u8 value
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_set_u8(const struct lwm2m_obj_path *path, uint8_t value);

/**
 * @brief Set resource (instance) value (u16)
 *
 * @deprecated Use lwm2m_set_u16() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[in] value u16 value
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_set_u16(const char *pathstr, uint16_t value);

/**
 * @brief Set resource (instance) value (u16)
 *
 * @param[in] path LwM2M path as a struct
 * @param[in] value u16 value
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_set_u16(const struct lwm2m_obj_path *path, uint16_t value);

/**
 * @brief Set resource (instance) value (u32)
 *
 * @deprecated Use lwm2m_set_u32() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[in] value u32 value
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_set_u32(const char *pathstr, uint32_t value);

/**
 * @brief Set resource (instance) value (u32)
 *
 * @param[in] path LwM2M path as a struct
 * @param[in] value u32 value
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_set_u32(const struct lwm2m_obj_path *path, uint32_t value);

/**
 * @brief Set resource (instance) value (u64)
 *
 * @deprecated Use lwm2m_set_u64() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[in] value u64 value
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_set_u64(const char *pathstr, uint64_t value);

/**
 * @brief Set resource (instance) value (u64)
 *
 * @param[in] path LwM2M path as a struct
 * @param[in] value u64 value
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_set_u64(const struct lwm2m_obj_path *path, uint64_t value);

/**
 * @brief Set resource (instance) value (s8)
 *
 * @deprecated Use lwm2m_set_s8() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[in] value s8 value
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_set_s8(const char *pathstr, int8_t value);

/**
 * @brief Set resource (instance) value (s8)
 *
 * @param[in] path LwM2M path as a struct
 * @param[in] value s8 value
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_set_s8(const struct lwm2m_obj_path *path, int8_t value);

/**
 * @brief Set resource (instance) value (s16)
 *
 * @deprecated Use lwm2m_set_s16() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[in] value s16 value
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_set_s16(const char *pathstr, int16_t value);

/**
 * @brief Set resource (instance) value (s16)
 *
 * @param[in] path LwM2M path as a struct
 * @param[in] value s16 value
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_set_s16(const struct lwm2m_obj_path *path, int16_t value);

/**
 * @brief Set resource (instance) value (s32)
 *
 * @deprecated Use lwm2m_set_s32() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[in] value s32 value
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_set_s32(const char *pathstr, int32_t value);

/**
 * @brief Set resource (instance) value (s32)
 *
 * @param[in] path LwM2M path as a struct
 * @param[in] value s32 value
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_set_s32(const struct lwm2m_obj_path *path, int32_t value);

/**
 * @brief Set resource (instance) value (s64)
 *
 * @deprecated Use lwm2m_set_s64() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[in] value s64 value
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_set_s64(const char *pathstr, int64_t value);

/**
 * @brief Set resource (instance) value (s64)
 *
 * @param[in] path LwM2M path as a struct
 * @param[in] value s64 value
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_set_s64(const struct lwm2m_obj_path *path, int64_t value);

/**
 * @brief Set resource (instance) value (bool)
 *
 * @deprecated Use lwm2m_set_bool() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[in] value bool value
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_set_bool(const char *pathstr, bool value);

/**
 * @brief Set resource (instance) value (bool)
 *
 * @param[in] path LwM2M path as a struct
 * @param[in] value bool value
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_set_bool(const struct lwm2m_obj_path *path, bool value);

/**
 * @brief Set resource (instance) value (double)
 *
 * @deprecated Use lwm2m_set_f64() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[in] value double value
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_set_float(const char *pathstr, const double *value);

/**
 * @brief Set resource (instance) value (double)
 *
 * @param[in] path LwM2M path as a struct
 * @param[in] value double value
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_set_f64(const struct lwm2m_obj_path *path, const double value);

/**
 * @brief Set resource (instance) value (Objlnk)
 *
 * @deprecated Use lwm2m_set_objlnk() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[in] value pointer to the lwm2m_objlnk structure
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_set_objlnk(const char *pathstr, const struct lwm2m_objlnk *value);

/**
 * @brief Set resource (instance) value (Objlnk)
 *
 * @param[in] path LwM2M path as a struct
 * @param[in] value pointer to the lwm2m_objlnk structure
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_set_objlnk(const struct lwm2m_obj_path *path, const struct lwm2m_objlnk *value);

/**
 * @brief Set resource (instance) value (Time)
 *
 * @deprecated Use lwm2m_set_time() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[in] value Epoch timestamp
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_set_time(const char *pathstr, time_t value);

/**
 * @brief Set resource (instance) value (Time)
 *
 * @param[in] path LwM2M path as a struct
 * @param[in] value Epoch timestamp
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_set_time(const struct lwm2m_obj_path *path, time_t value);

/**
 * @brief Get resource (instance) value (opaque buffer)
 *
 * @deprecated Use lwm2m_get_opaque() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[out] buf Data buffer to copy data into
 * @param[in] buflen Length of buffer
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_get_opaque(const char *pathstr, void *buf, uint16_t buflen);

/**
 * @brief Get resource (instance) value (opaque buffer)
 *
 * @param[in] path LwM2M path as a struct
 * @param[out] buf Data buffer to copy data into
 * @param[in] buflen Length of buffer
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_get_opaque(const struct lwm2m_obj_path *path, void *buf, uint16_t buflen);

/**
 * @brief Get resource (instance) value (string)
 *
 * @deprecated Use lwm2m_get_string() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[out] str String buffer to copy data into
 * @param[in] buflen Length of buffer
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_get_string(const char *pathstr, void *str, uint16_t buflen);

/**
 * @brief Get resource (instance) value (string)
 *
 * @param[in] path LwM2M path as a struct
 * @param[out] str String buffer to copy data into
 * @param[in] buflen Length of buffer
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_get_string(const struct lwm2m_obj_path *path, void *str, uint16_t buflen);

/**
 * @brief Get resource (instance) value (u8)
 *
 * @deprecated Use lwm2m_get_u8() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[out] value u8 buffer to copy data into
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_get_u8(const char *pathstr, uint8_t *value);

/**
 * @brief Get resource (instance) value (u8)
 *
 * @param[in] path LwM2M path as a struct
 * @param[out] value u8 buffer to copy data into
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_get_u8(const struct lwm2m_obj_path *path, uint8_t *value);

/**
 * @brief Get resource (instance) value (u16)
 *
 * @deprecated Use lwm2m_get_u16() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[out] value u16 buffer to copy data into
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_get_u16(const char *pathstr, uint16_t *value);

/**
 * @brief Get resource (instance) value (u16)
 *
 * @param[in] path LwM2M path as a struct
 * @param[out] value u16 buffer to copy data into
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_get_u16(const struct lwm2m_obj_path *path, uint16_t *value);

/**
 * @brief Get resource (instance) value (u32)
 *
 * @deprecated Use lwm2m_get_u32() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[out] value u32 buffer to copy data into
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_get_u32(const char *pathstr, uint32_t *value);

/**
 * @brief Get resource (instance) value (u32)
 *
 * @param[in] path LwM2M path as a struct
 * @param[out] value u32 buffer to copy data into
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_get_u32(const struct lwm2m_obj_path *path, uint32_t *value);

/**
 * @brief Get resource (instance) value (u64)
 *
 * @deprecated Use lwm2m_get_u64() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[out] value u64 buffer to copy data into
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_get_u64(const char *pathstr, uint64_t *value);

/**
 * @brief Get resource (instance) value (u64)
 *
 * @param[in] path LwM2M path as a struct
 * @param[out] value u64 buffer to copy data into
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_get_u64(const struct lwm2m_obj_path *path, uint64_t *value);

/**
 * @brief Get resource (instance) value (s8)
 *
 * @deprecated Use lwm2m_get_s8() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[out] value s8 buffer to copy data into
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_get_s8(const char *pathstr, int8_t *value);

/**
 * @brief Get resource (instance) value (s8)
 *
 * @param[in] path LwM2M path as a struct
 * @param[out] value s8 buffer to copy data into
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_get_s8(const struct lwm2m_obj_path *path, int8_t *value);

/**
 * @brief Get resource (instance) value (s16)
 *
 * @deprecated Use lwm2m_get_s16() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[out] value s16 buffer to copy data into
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_get_s16(const char *pathstr, int16_t *value);

/**
 * @brief Get resource (instance) value (s16)
 *
 * @param[in] path LwM2M path as a struct
 * @param[out] value s16 buffer to copy data into
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_get_s16(const struct lwm2m_obj_path *path, int16_t *value);

/**
 * @brief Get resource (instance) value (s32)
 *
 * @deprecated Use lwm2m_get_s32() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[out] value s32 buffer to copy data into
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_get_s32(const char *pathstr, int32_t *value);

/**
 * @brief Get resource (instance) value (s32)
 *
 * @param[in] path LwM2M path as a struct
 * @param[out] value s32 buffer to copy data into
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_get_s32(const struct lwm2m_obj_path *path, int32_t *value);

/**
 * @brief Get resource (instance) value (s64)
 *
 * @deprecated Use lwm2m_get_s64() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[out] value s64 buffer to copy data into
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_get_s64(const char *pathstr, int64_t *value);

/**
 * @brief Get resource (instance) value (s64)
 *
 * @param[in] path LwM2M path as a struct
 * @param[out] value s64 buffer to copy data into
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_get_s64(const struct lwm2m_obj_path *path, int64_t *value);

/**
 * @brief Get resource (instance) value (bool)
 *
 * @deprecated Use lwm2m_get_bool() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[out] value bool buffer to copy data into
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_get_bool(const char *pathstr, bool *value);

/**
 * @brief Get resource (instance) value (bool)
 *
 * @param[in] path LwM2M path as a struct
 * @param[out] value bool buffer to copy data into
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_get_bool(const struct lwm2m_obj_path *path, bool *value);

/**
 * @brief Get resource (instance) value (double)
 *
 * @deprecated Use lwm2m_get_f64() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[out] buf double buffer to copy data into
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_get_float(const char *pathstr, double *buf);

/**
 * @brief Get resource (instance) value (double)
 *
 * @param[in] path LwM2M path as a struct
 * @param[out] value double buffer to copy data into
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_get_f64(const struct lwm2m_obj_path *path, double *value);

/**
 * @brief Get resource (instance) value (Objlnk)
 *
 * @deprecated Use lwm2m_get_objlnk() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[out] buf lwm2m_objlnk buffer to copy data into
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_get_objlnk(const char *pathstr, struct lwm2m_objlnk *buf);

/**
 * @brief Get resource (instance) value (Objlnk)
 *
 * @param[in] path LwM2M path as a struct
 * @param[out] buf lwm2m_objlnk buffer to copy data into
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_get_objlnk(const struct lwm2m_obj_path *path, struct lwm2m_objlnk *buf);

/**
 * @brief Get resource (instance) value (Time)
 *
 * @deprecated Use lwm2m_get_time() instead.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[out] buf time_t pointer to copy data
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_get_time(const char *pathstr, time_t *buf);

/**
 * @brief Get resource (instance) value (Time)
 *
 * @param[in] path LwM2M path as a struct
 * @param[out] buf time_t pointer to copy data
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_get_time(const struct lwm2m_obj_path *path, time_t *buf);

/**
 * @brief Set resource (instance) read callback
 *
 * @deprecated Use lwm2m_register_read_callback() instead.
 *
 * LwM2M clients can use this to set the callback function for resource reads when data
 * handling in the LwM2M engine needs to be bypassed.
 * For example reading back opaque binary data from external storage.
 *
 * This callback should not generally be used for any data that might be observed as
 * engine does not have any knowledge of data changes.
 *
 * When separate buffer for data should be used, use lwm2m_engine_set_res_buf() instead
 * to set the storage.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[in] cb Read resource callback
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_register_read_callback(const char *pathstr,
					lwm2m_engine_get_data_cb_t cb);

/**
 * @brief Set resource (instance) read callback
 *
 * LwM2M clients can use this to set the callback function for resource reads when data
 * handling in the LwM2M engine needs to be bypassed.
 * For example reading back opaque binary data from external storage.
 *
 * This callback should not generally be used for any data that might be observed as
 * engine does not have any knowledge of data changes.
 *
 * When separate buffer for data should be used, use lwm2m_engine_set_res_buf() instead
 * to set the storage.
 *
 * @param[in] path LwM2M path as a struct
 * @param[in] cb Read resource callback
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_register_read_callback(const struct lwm2m_obj_path *path, lwm2m_engine_get_data_cb_t cb);

/**
 * @brief Set resource (instance) pre-write callback
 *
 * @deprecated Use lwm2m_register_pre_write_callback() instead.
 *
 * This callback is triggered before setting the value of a resource.  It
 * can pass a special data buffer to the engine so that the actual resource
 * value can be calculated later, etc.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[in] cb Pre-write resource callback
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_register_pre_write_callback(const char *pathstr,
					     lwm2m_engine_get_data_cb_t cb);

/**
 * @brief Set resource (instance) pre-write callback
 *
 * This callback is triggered before setting the value of a resource.  It
 * can pass a special data buffer to the engine so that the actual resource
 * value can be calculated later, etc.
 *
 * @param[in] path LwM2M path as a struct
 * @param[in] cb Pre-write resource callback
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_register_pre_write_callback(const struct lwm2m_obj_path *path,
				      lwm2m_engine_get_data_cb_t cb);

/**
 * @brief Set resource (instance) validation callback
 *
 * @deprecated Use lwm2m_register_validate_callback() instead.
 *
 * This callback is triggered before setting the value of a resource to the
 * resource data buffer.
 *
 * The callback allows an LwM2M client or object to validate the data before
 * writing and notify an error if the data should be discarded for any reason
 * (by returning a negative error code).
 *
 * @note All resources that have a validation callback registered are initially
 *       decoded into a temporary validation buffer. Make sure that
 *       ``CONFIG_LWM2M_ENGINE_VALIDATION_BUFFER_SIZE`` is large enough to
 *       store each of the validated resources (individually).
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[in] cb Validate resource data callback
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_register_validate_callback(const char *pathstr,
					    lwm2m_engine_set_data_cb_t cb);

/**
 * @brief Set resource (instance) validation callback
 *
 * This callback is triggered before setting the value of a resource to the
 * resource data buffer.
 *
 * The callback allows an LwM2M client or object to validate the data before
 * writing and notify an error if the data should be discarded for any reason
 * (by returning a negative error code).
 *
 * @note All resources that have a validation callback registered are initially
 *       decoded into a temporary validation buffer. Make sure that
 *       ``CONFIG_LWM2M_ENGINE_VALIDATION_BUFFER_SIZE`` is large enough to
 *       store each of the validated resources (individually).
 *
 * @param[in] path LwM2M path as a struct
 * @param[in] cb Validate resource data callback
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_register_validate_callback(const struct lwm2m_obj_path *path,
				     lwm2m_engine_set_data_cb_t cb);

/**
 * @brief Set resource (instance) post-write callback
 *
 * @deprecated Use lwm2m_register_post_write_callback() instead.
 *
 * This callback is triggered after setting the value of a resource to the
 * resource data buffer.
 *
 * It allows an LwM2M client or object to post-process the value of a resource
 * or trigger other related resource calculations.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[in] cb Post-write resource callback
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_register_post_write_callback(const char *pathstr,
					      lwm2m_engine_set_data_cb_t cb);

/**
 * @brief Set resource (instance) post-write callback
 *
 * This callback is triggered after setting the value of a resource to the
 * resource data buffer.
 *
 * It allows an LwM2M client or object to post-process the value of a resource
 * or trigger other related resource calculations.
 *
 * @param[in] path LwM2M path as a struct
 * @param[in] cb Post-write resource callback
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_register_post_write_callback(const struct lwm2m_obj_path *path,
				       lwm2m_engine_set_data_cb_t cb);

/**
 * @brief Set resource execute event callback
 *
 * @deprecated Use lwm2m_register_exec_callback() instead.
 *
 * This event is triggered when the execute method of a resource is enabled.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res"
 * @param[in] cb Execute resource callback
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_register_exec_callback(const char *pathstr,
					lwm2m_engine_execute_cb_t cb);

/**
 * @brief Set resource execute event callback
 *
 * This event is triggered when the execute method of a resource is enabled.
 *
 * @param[in] path LwM2M path as a struct
 * @param[in] cb Execute resource callback
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_register_exec_callback(const struct lwm2m_obj_path *path, lwm2m_engine_execute_cb_t cb);

/**
 * @brief Set object instance create event callback
 *
 * @deprecated Use lwm2m_register_create_callback instead.
 *
 * This event is triggered when an object instance is created.
 *
 * @param[in] obj_id LwM2M object id
 * @param[in] cb Create object instance callback
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_register_create_callback(uint16_t obj_id,
					  lwm2m_engine_user_cb_t cb);

/**
 * @brief Set object instance create event callback
 *
 * This event is triggered when an object instance is created.
 *
 * @param[in] obj_id LwM2M object id
 * @param[in] cb Create object instance callback
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_register_create_callback(uint16_t obj_id,
				   lwm2m_engine_user_cb_t cb);

/**
 * @brief Set object instance delete event callback
 *
 * @deprecated Use lwm2m_register_delete_callback instead
 *
 * This event is triggered when an object instance is deleted.
 *
 * @param[in] obj_id LwM2M object id
 * @param[in] cb Delete object instance callback
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_register_delete_callback(uint16_t obj_id,
					  lwm2m_engine_user_cb_t cb);

/**
 * @brief Set object instance delete event callback
 *
 * This event is triggered when an object instance is deleted.
 *
 * @param[in] obj_id LwM2M object id
 * @param[in] cb Delete object instance callback
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_register_delete_callback(uint16_t obj_id,
					  lwm2m_engine_user_cb_t cb);

/**
 * @brief Resource read-only value bit
 */
#define LWM2M_RES_DATA_READ_ONLY	0

/**
 * @brief Resource read-only flag
 */
#define LWM2M_RES_DATA_FLAG_RO		BIT(LWM2M_RES_DATA_READ_ONLY)

/**
 * @brief Read resource flags helper macro
 */
#define LWM2M_HAS_RES_FLAG(res, f)	((res->data_flags & f) == f)

/**
 * @brief Set data buffer for a resource
 *
 * @deprecated Use lwm2m_set_res_buf() instead.
 *
 * Use this function to set the data buffer and flags for the specified LwM2M
 * resource.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[in] buffer_ptr Data buffer pointer
 * @param[in] buffer_len Length of buffer
 * @param[in] data_len Length of existing data in the buffer
 * @param[in] data_flags Data buffer flags (such as read-only, etc)
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_set_res_buf(const char *pathstr, void *buffer_ptr, uint16_t buffer_len,
			     uint16_t data_len, uint8_t data_flags);

/**
 * @brief Set data buffer for a resource
 *
 * Use this function to set the data buffer and flags for the specified LwM2M
 * resource.
 *
 * @param[in] path LwM2M path as a struct
 * @param[in] buffer_ptr Data buffer pointer
 * @param[in] buffer_len Length of buffer
 * @param[in] data_len Length of existing data in the buffer
 * @param[in] data_flags Data buffer flags (such as read-only, etc)
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_set_res_buf(const struct lwm2m_obj_path *path, void *buffer_ptr, uint16_t buffer_len,
		      uint16_t data_len, uint8_t data_flags);

/**
 * @brief Set data buffer for a resource
 *
 * Use this function to set the data buffer and flags for the specified LwM2M
 * resource.
 *
 * @deprecated Use lwm2m_set_res_buf() instead, so you can define buffer size and data size
 *             separately.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[in] data_ptr Data buffer pointer
 * @param[in] data_len Length of buffer
 * @param[in] data_flags Data buffer flags (such as read-only, etc)
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_set_res_data(const char *pathstr, void *data_ptr, uint16_t data_len,
			      uint8_t data_flags);

/**
 * @brief Update data size for a resource
 *
 * @deprecated Use lwm2m_set_res_data_len() instead.
 *
 * Use this function to set the new size of data in the buffer if you write
 * to a buffer received by lwm2m_engine_get_res_buf().
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[in] data_len Length of data
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_set_res_data_len(const char *pathstr, uint16_t data_len);

/**
 * @brief Update data size for a resource
 *
 * Use this function to set the new size of data in the buffer if you write
 * to a buffer received by lwm2m_engine_get_res_buf().
 *
 * @param[in] path LwM2M path as a struct
 * @param[in] data_len Length of data
 * @return 0 for success or negative in case of error.
 */
int lwm2m_set_res_data_len(const struct lwm2m_obj_path *path, uint16_t data_len);

/**
 * @brief Get data buffer for a resource
 *
 * @deprecated Use lwm2m_get_res_buf() instead.
 *
 * Use this function to get the data buffer information for the specified LwM2M
 * resource.
 *
 * If you directly write into the buffer, you must use lwm2m_engine_set_res_data_len()
 * function to update the new size of the written data.
 *
 * All parameters except pathstr can NULL if you don't want to read those values.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[out] buffer_ptr Data buffer pointer
 * @param[out] buffer_len Length of buffer
 * @param[out] data_len Length of existing data in the buffer
 * @param[out] data_flags Data buffer flags (such as read-only, etc)
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_get_res_buf(const char *pathstr, void **buffer_ptr, uint16_t *buffer_len,
			     uint16_t *data_len, uint8_t *data_flags);

/**
 * @brief Get data buffer for a resource
 *
 * Use this function to get the data buffer information for the specified LwM2M
 * resource.
 *
 * If you directly write into the buffer, you must use lwm2m_set_res_data_len()
 * function to update the new size of the written data.
 *
 * All parameters, except for the pathstr, can be NULL if you don't want to read those values.
 *
 * @param[in] path LwM2M path as a struct
 * @param[out] buffer_ptr Data buffer pointer
 * @param[out] buffer_len Length of buffer
 * @param[out] data_len Length of existing data in the buffer
 * @param[out] data_flags Data buffer flags (such as read-only, etc)
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_get_res_buf(const struct lwm2m_obj_path *path, void **buffer_ptr, uint16_t *buffer_len,
		      uint16_t *data_len, uint8_t *data_flags);

/**
 * @brief Get data buffer for a resource
 *
 * Use this function to get the data buffer information for the specified LwM2M
 * resource.
 *
 * @deprecated Use lwm2m_get_res_buf() as it can tell you the size of the buffer as well.
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
 * @param[out] data_ptr Data buffer pointer
 * @param[out] data_len Length of existing data in the buffer
 * @param[out] data_flags Data buffer flags (such as read-only, etc)
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_get_res_data(const char *pathstr, void **data_ptr, uint16_t *data_len,
			      uint8_t *data_flags);

/**
 * @brief Create a resource instance
 *
 * @deprecated Use lwm2m_create_res_inst() instead.
 *
 * LwM2M clients use this function to create multi-resource instances:
 * Example to create 0 instance of device available power sources:
 * lwm2m_engine_create_res_inst("3/0/6/0");
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res/res-inst"
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_create_res_inst(const char *pathstr);

/**
 * @brief Create a resource instance
 *
 * LwM2M clients use this function to create multi-resource instances:
 * Example to create 0 instance of device available power sources:
 * lwm2m_create_res_inst(&LWM2M_OBJ(3, 0, 6, 0));
 *
 * @param[in] path LwM2M path as a struct
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_create_res_inst(const struct lwm2m_obj_path *path);

/**
 * @brief Delete a resource instance
 *
 * @deprecated Use lwm2m_delete_res_inst() instead.
 *
 * Use this function to remove an existing resource instance
 *
 * @param[in] pathstr LwM2M path string "obj/obj-inst/res/res-inst"
 *
 * @return 0 for success or negative in case of error.
 */
__deprecated
int lwm2m_engine_delete_res_inst(const char *pathstr);

/**
 * @brief Delete a resource instance
 *
 * Use this function to remove an existing resource instance
 *
 * @param[in] path LwM2M path as a struct
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_delete_res_inst(const struct lwm2m_obj_path *path);

/**
 * @brief Update the period of the device service.
 *
 * Change the duration of the periodic device service that notifies the
 * current time.
 *
 * @param[in] period_ms New period for the device service (in milliseconds)
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_update_device_service_period(uint32_t period_ms);

/**
 * @brief Check whether a path is observed
 *
 * @deprecated Use lwm2m_path_is_observed() instead.
 *
 * @param[in] pathstr LwM2M path string to check, e.g. "3/0/1"
 *
 * @return true when there exists an observation of the same level
 *         or lower as the given path, false if it doesn't or path is not a
 *         valid LwM2M-path.
 *         E.g. true if path refers to a resource and the parent object has an
 *         observation, false for the inverse.
 */
__deprecated
bool lwm2m_engine_path_is_observed(const char *pathstr);

/**
 * @brief Check whether a path is observed
 *
 * @param[in] path LwM2M path as a struct to check
 *
 * @return true when there exists an observation of the same level
 *         or lower as the given path, false if it doesn't or path is not a
 *         valid LwM2M-path.
 *         E.g. true if path refers to a resource and the parent object has an
 *         observation, false for the inverse.
 */
bool lwm2m_path_is_observed(const struct lwm2m_obj_path *path);

/**
 * @brief Stop the LwM2M engine
 *
 * LwM2M clients normally do not need to call this function as it is called
 * within lwm2m_rd_client. However, if the client does not use the RD
 * client implementation, it will need to be called manually.
 *
 * @param[in] client_ctx LwM2M context
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_engine_stop(struct lwm2m_ctx *client_ctx);

/**
 * @brief Start the LwM2M engine
 *
 * LwM2M clients normally do not need to call this function as it is called
 * by lwm2m_rd_client_start().  However, if the client does not use the RD
 * client implementation, it will need to be called manually.
 *
 * @param[in] client_ctx LwM2M context
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_engine_start(struct lwm2m_ctx *client_ctx);

/**
 * @brief Acknowledge the currently processed request with an empty ACK.
 *
 * LwM2M engine by default sends piggybacked responses for requests.
 * This function allows to send an empty ACK for a request earlier (from the
 * application callback). The LwM2M engine will then send the actual response
 * as a separate CON message after all callbacks are executed.
 *
 * @param[in] client_ctx LwM2M context
 *
 */
void lwm2m_acknowledge(struct lwm2m_ctx *client_ctx);

/**
 * @brief LwM2M RD client events
 *
 * LwM2M client events are passed back to the event_cb function in
 * lwm2m_rd_client_start()
 */
enum lwm2m_rd_client_event {
	LWM2M_RD_CLIENT_EVENT_NONE,
	LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_REG_FAILURE,
	LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_REG_COMPLETE,
	LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_TRANSFER_COMPLETE,
	LWM2M_RD_CLIENT_EVENT_REGISTRATION_FAILURE,
	LWM2M_RD_CLIENT_EVENT_REGISTRATION_COMPLETE,
	LWM2M_RD_CLIENT_EVENT_REG_TIMEOUT,
	LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE,
	LWM2M_RD_CLIENT_EVENT_DEREGISTER_FAILURE,
	LWM2M_RD_CLIENT_EVENT_DISCONNECT,
	LWM2M_RD_CLIENT_EVENT_QUEUE_MODE_RX_OFF,
	LWM2M_RD_CLIENT_EVENT_ENGINE_SUSPENDED,
	LWM2M_RD_CLIENT_EVENT_NETWORK_ERROR,
	LWM2M_RD_CLIENT_EVENT_REG_UPDATE,
	LWM2M_RD_CLIENT_EVENT_DEREGISTER,
};

/**
 *	Define for old event name keeping backward compatibility.
 */
#define LWM2M_RD_CLIENT_EVENT_REG_UPDATE_FAILURE                                                   \
	LWM2M_RD_CLIENT_EVENT_REG_TIMEOUT __DEPRECATED_MACRO

/*
 * LwM2M RD client flags, used to configure LwM2M session.
 */

/**
 * @brief Run bootstrap procedure in current session.
 */
#define LWM2M_RD_CLIENT_FLAG_BOOTSTRAP BIT(0)

/**
 * @brief Start the LwM2M RD (Registration / Discovery) Client
 *
 * The RD client sits just above the LwM2M engine and performs the necessary
 * actions to implement the "Registration interface".
 * For more information see Section "Client Registration Interface" of
 * LwM2M Technical Specification.
 *
 * NOTE: lwm2m_engine_start() is called automatically by this function.
 *
 * @param[in] client_ctx LwM2M context
 * @param[in] ep_name Registered endpoint name
 * @param[in] flags Flags used to configure current LwM2M session.
 * @param[in] event_cb Client event callback function
 * @param[in] observe_cb Observe callback function called when an observer was
 *			 added or deleted, and when a notification was acked or
 *			 has timed out
 *
 * @return 0 for success, -EINPROGRESS when client is already running
 *         or negative error codes in case of failure.
 */
int lwm2m_rd_client_start(struct lwm2m_ctx *client_ctx, const char *ep_name,
			   uint32_t flags, lwm2m_ctx_event_cb_t event_cb,
			   lwm2m_observe_cb_t observe_cb);

/**
 * @brief Stop the LwM2M RD (De-register) Client
 *
 * The RD client sits just above the LwM2M engine and performs the necessary
 * actions to implement the "Registration interface".
 * For more information see Section "Client Registration Interface" of the
 * LwM2M Technical Specification.
 *
 * @param[in] client_ctx LwM2M context
 * @param[in] event_cb Client event callback function
 * @param[in] deregister True to deregister the client if registered.
 *                       False to force close the connection.
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_rd_client_stop(struct lwm2m_ctx *client_ctx,
			  lwm2m_ctx_event_cb_t event_cb, bool deregister);

/**
 * @brief Suspend the LwM2M engine Thread
 *
 * Suspend LwM2M engine. Use case could be when network connection is down.
 * LwM2M Engine indicate before it suspend by
 * LWM2M_RD_CLIENT_EVENT_ENGINE_SUSPENDED event.
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_engine_pause(void);

/**
 * @brief Resume the LwM2M engine thread
 *
 * Resume suspended LwM2M engine. After successful resume call engine will do
 * full registration or registration update based on suspended time.
 * Event's LWM2M_RD_CLIENT_EVENT_REGISTRATION_COMPLETE or LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE
 * indicate that client is connected to server.
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_engine_resume(void);

/**
 * @brief Trigger a Registration Update of the LwM2M RD Client
 */
void lwm2m_rd_client_update(void);

/**
 * @brief LwM2M path maximum length
 */
#define LWM2M_MAX_PATH_STR_SIZE sizeof("/65535/65535/65535/65535")

/**
 * @brief Helper function to print path objects' contents to log
 *
 * @param[in] buf The buffer to use for formatting the string
 * @param[in] path The path to stringify
 *
 * @return Resulting formatted path string
 */
char *lwm2m_path_log_buf(char *buf, struct lwm2m_obj_path *path);

/**
 * @brief LwM2M send status
 *
 * LwM2M send status are generated back to the lwm2m_send_cb_t function in
 * lwm2m_send_cb()
 */
enum lwm2m_send_status {
	LWM2M_SEND_STATUS_SUCCESS,
	LWM2M_SEND_STATUS_FAILURE,
	LWM2M_SEND_STATUS_TIMEOUT,
};

/**
 * @typedef lwm2m_send_cb_t
 * @brief Callback returning send status
 */
typedef void (*lwm2m_send_cb_t)(enum lwm2m_send_status status);

/** 
 * @brief LwM2M SEND operation to given path list
 *
 * @deprecated Use lwm2m_send_cb() instead.
 *
 * @param ctx LwM2M context
 * @param path_list LwM2M Path string list
 * @param path_list_size Length of path list. Max size is CONFIG_LWM2M_COMPOSITE_PATH_LIST_SIZE
 * @param confirmation_request True request confirmation for operation.
 *
 * @return 0 for success or negative in case of error.
 *
 */
__deprecated
int lwm2m_engine_send(struct lwm2m_ctx *ctx, char const *path_list[], uint8_t path_list_size,
		      bool confirmation_request);

/** 
 * @brief LwM2M SEND operation to given path list
 *
 * @deprecated Use lwm2m_send_cb() instead.
 *
 * @param ctx LwM2M context
 * @param path_list LwM2M path struct list
 * @param path_list_size Length of path list. Max size is CONFIG_LWM2M_COMPOSITE_PATH_LIST_SIZE
 * @param confirmation_request True request confirmation for operation.
 *
 * @return 0 for success or negative in case of error.
 *
 */
__deprecated
int lwm2m_send(struct lwm2m_ctx *ctx, const struct lwm2m_obj_path path_list[],
	       uint8_t path_list_size, bool confirmation_request);

/** 
 * @brief LwM2M SEND operation to given path list asynchronously with confirmation callback
 *
 * @param ctx LwM2M context
 * @param path_list LwM2M path struct list
 * @param path_list_size Length of path list. Max size is CONFIG_LWM2M_COMPOSITE_PATH_LIST_SIZE
 * @param reply_cb Callback triggered with confirmation state or NULL if not used
 *
 * @return 0 for success or negative in case of error.
 *
 */
int lwm2m_send_cb(struct lwm2m_ctx *ctx, const struct lwm2m_obj_path path_list[],
			  uint8_t path_list_size, lwm2m_send_cb_t reply_cb);

/** 
 * @brief Returns LwM2M client context
 *
 * @return ctx LwM2M context
 *
 */
struct lwm2m_ctx *lwm2m_rd_client_ctx(void);

/** 
 * @brief Enable data cache for a resource.
 *
 * @deprecated Use lwm2m_enable_cache instead
 *
 * Application may enable caching of resource data by allocating buffer for LwM2M engine to use.
 * Buffer must be size of struct @ref lwm2m_time_series_elem times cache_len
 *
 * @param resource_path LwM2M resourcepath string "obj/obj-inst/res(/res-inst)"
 * @param data_cache Pointer to Data cache array
 * @param cache_len number of cached entries
 *
 * @return 0 for success or negative in case of error.
 *
 */
__deprecated
int lwm2m_engine_enable_cache(char const *resource_path, struct lwm2m_time_series_elem *data_cache,
			      size_t cache_len);

/** 
 * @brief Enable data cache for a resource.
 *
 * Application may enable caching of resource data by allocating buffer for LwM2M engine to use.
 * Buffer must be size of struct @ref lwm2m_time_series_elem times cache_len
 *
 * @param path LwM2M path to resource as a struct
 * @param data_cache Pointer to Data cache array
 * @param cache_len number of cached entries
 *
 * @return 0 for success or negative in case of error.
 *
 */
int lwm2m_enable_cache(const struct lwm2m_obj_path *path, struct lwm2m_time_series_elem *data_cache,
		       size_t cache_len);

/**
 * @brief Security modes as defined in LwM2M Security object.
 */
enum lwm2m_security_mode_e {
	LWM2M_SECURITY_PSK = 0,      /**< Pre-Shared Key mode */
	LWM2M_SECURITY_RAW_PK = 1,   /**< Raw Public Key mode */
	LWM2M_SECURITY_CERT = 2,     /**< Certificate mode */
	LWM2M_SECURITY_NOSEC = 3,    /**< NoSec mode */
	LWM2M_SECURITY_CERT_EST = 4, /**< Certificate mode with EST */
};

/**
 * @brief Read security mode from selected security object instance.
 *
 * This data is valid only if RD client is running.
 *
 * @param ctx Pointer to client context.
 * @return int Positive values are @ref lwm2m_security_mode_e, negative error codes otherwise.
 */
int lwm2m_security_mode(struct lwm2m_ctx *ctx);

/**
 * @brief Set default socket options for DTLS connections.
 *
 * The engine calls this when @ref lwm2m_ctx::set_socketoptions is not overwritten.
 * You can call this from the overwritten callback to set extra options after or
 * before defaults.
 *
 * @param ctx Client context
 * @return 0 for success or negative in case of error.
 */
int lwm2m_set_default_sockopt(struct lwm2m_ctx *ctx);

#endif	/* ZEPHYR_INCLUDE_NET_LWM2M_H_ */
/**@}  */
