net: lwm2m: introduce user-code callbacks for obj create/delete

LwM2M engine now supports optional resources that may need to be
setup or torn down in user-based code during object instance
creation / deletion.

Let's provide callbacks that can be used for this purpose.

Signed-off-by: Michael Scott <mike@foundries.io>
This commit is contained in:
Michael Scott 2018-07-12 10:00:01 -07:00 committed by Jukka Rissanen
commit 538d3418fd
3 changed files with 57 additions and 0 deletions

View file

@ -206,6 +206,10 @@ int lwm2m_engine_register_post_write_callback(char *path,
lwm2m_engine_set_data_cb_t cb);
int lwm2m_engine_register_exec_callback(char *path,
lwm2m_engine_user_cb_t cb);
int lwm2m_engine_register_create_callback(u16_t obj_id,
lwm2m_engine_user_cb_t cb);
int lwm2m_engine_register_delete_callback(u16_t obj_id,
lwm2m_engine_user_cb_t cb);
/* resource data bit values */
#define LWM2M_RES_DATA_READ_ONLY 0

View file

@ -685,6 +685,7 @@ int lwm2m_create_obj_inst(u16_t obj_id, u16_t obj_inst_id,
struct lwm2m_engine_obj_inst **obj_inst)
{
struct lwm2m_engine_obj *obj;
int ret;
*obj_inst = NULL;
obj = get_engine_obj(obj_id);
@ -718,6 +719,17 @@ int lwm2m_create_obj_inst(u16_t obj_id, u16_t obj_inst_id,
(*obj_inst)->obj = obj;
(*obj_inst)->obj_inst_id = obj_inst_id;
engine_register_obj_inst(*obj_inst);
if (obj->user_create_cb) {
ret = obj->user_create_cb(obj_inst_id);
if (ret < 0) {
SYS_LOG_ERR("Error in user obj create %u/%u: %d",
obj_id, obj_inst_id, ret);
lwm2m_delete_obj_inst(obj_id, obj_inst_id);
return ret;
}
}
#ifdef CONFIG_LWM2M_RD_CLIENT_SUPPORT
engine_trigger_update();
#endif
@ -740,6 +752,15 @@ int lwm2m_delete_obj_inst(u16_t obj_id, u16_t obj_inst_id)
return -ENOENT;
}
if (obj->user_delete_cb) {
ret = obj->user_delete_cb(obj_inst_id);
if (ret < 0) {
SYS_LOG_ERR("Error in user obj delete %u/%u: %d",
obj_id, obj_inst_id, ret);
/* don't return error */
}
}
engine_unregister_obj_inst(obj_inst);
obj->instance_count--;
@ -1897,6 +1918,36 @@ int lwm2m_engine_register_exec_callback(char *pathstr,
return 0;
}
int lwm2m_engine_register_create_callback(u16_t obj_id,
lwm2m_engine_user_cb_t cb)
{
struct lwm2m_engine_obj *obj = NULL;
obj = get_engine_obj(obj_id);
if (!obj) {
SYS_LOG_ERR("unable to find obj: %u", obj_id);
return -ENOENT;
}
obj->user_create_cb = cb;
return 0;
}
int lwm2m_engine_register_delete_callback(u16_t obj_id,
lwm2m_engine_user_cb_t cb)
{
struct lwm2m_engine_obj *obj = NULL;
obj = get_engine_obj(obj_id);
if (!obj) {
SYS_LOG_ERR("unable to find obj: %u", obj_id);
return -ENOENT;
}
obj->user_delete_cb = cb;
return 0;
}
/* generic data handlers */
static int lwm2m_read_handler(struct lwm2m_engine_obj_inst *obj_inst,

View file

@ -169,6 +169,8 @@ struct lwm2m_engine_obj {
/* object event callbacks */
lwm2m_engine_obj_create_cb_t create_cb;
lwm2m_engine_obj_delete_cb_t delete_cb;
lwm2m_engine_user_cb_t user_create_cb;
lwm2m_engine_user_cb_t user_delete_cb;
/* object member data */
u16_t obj_id;