From 538d3418fdfba537bc96f5484e52809325d1b27d Mon Sep 17 00:00:00 2001 From: Michael Scott Date: Thu, 12 Jul 2018 10:00:01 -0700 Subject: [PATCH] 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 --- include/net/lwm2m.h | 4 +++ subsys/net/lib/lwm2m/lwm2m_engine.c | 51 +++++++++++++++++++++++++++++ subsys/net/lib/lwm2m/lwm2m_object.h | 2 ++ 3 files changed, 57 insertions(+) diff --git a/include/net/lwm2m.h b/include/net/lwm2m.h index 19cb5ff4797..a9f42b97ae3 100644 --- a/include/net/lwm2m.h +++ b/include/net/lwm2m.h @@ -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 diff --git a/subsys/net/lib/lwm2m/lwm2m_engine.c b/subsys/net/lib/lwm2m/lwm2m_engine.c index 5f3a735cd69..d6e91ed5f3c 100644 --- a/subsys/net/lib/lwm2m/lwm2m_engine.c +++ b/subsys/net/lib/lwm2m/lwm2m_engine.c @@ -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, diff --git a/subsys/net/lib/lwm2m/lwm2m_object.h b/subsys/net/lib/lwm2m/lwm2m_object.h index af2976cbb8f..27c9782295f 100644 --- a/subsys/net/lib/lwm2m/lwm2m_object.h +++ b/subsys/net/lib/lwm2m/lwm2m_object.h @@ -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;