mirror of
https://dev.iopsys.eu/bbf/bbfdm.git
synced 2025-12-10 07:44:39 +01:00
bbfdmd: Collect datamodel from decentralized nodes
This commit is contained in:
parent
189ea564de
commit
457550b0c1
39 changed files with 5739 additions and 5074 deletions
|
|
@ -57,7 +57,9 @@ extern struct list_head json_memhead;
|
|||
// Global variables
|
||||
static unsigned int g_refresh_time = BBF_INSTANCES_UPDATE_TIMEOUT;
|
||||
static int g_subprocess_level = USP_SUBPROCESS_DEPTH;
|
||||
|
||||
static void *deamon_lib_handle = NULL;
|
||||
static json_object *deamon_json_obj = NULL;
|
||||
|
||||
char UBUS_METHOD_NAME[32] = "bbfdm";
|
||||
bool enable_plugins = true;
|
||||
|
|
@ -94,7 +96,18 @@ static void usp_cleanup(struct usp_context *u)
|
|||
free_path_list(&u->instances);
|
||||
free_path_list(&u->old_instances);
|
||||
bbf_global_clean(DEAMON_DM_ROOT_OBJ);
|
||||
|
||||
/* DotSo Plugin */
|
||||
free_dotso_plugin(deamon_lib_handle);
|
||||
|
||||
/* JSON Plugin */
|
||||
free_json_plugin();
|
||||
|
||||
/* Input JSON File */
|
||||
if (deamon_json_obj) {
|
||||
json_object_put(deamon_json_obj);
|
||||
deamon_json_obj = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static bool is_sync_operate_cmd(usp_data_t *data __attribute__((unused)))
|
||||
|
|
@ -1193,14 +1206,13 @@ static int bbfdm_load_deamon_config(const char *json_path)
|
|||
if (!json_path || !strlen(json_path))
|
||||
return -1;
|
||||
|
||||
json_object *json_obj = json_object_from_file(json_path);
|
||||
if (!json_obj)
|
||||
deamon_json_obj = json_object_from_file(json_path);
|
||||
if (!deamon_json_obj)
|
||||
return -1;
|
||||
|
||||
json_object *deamon_obj = dmjson_get_obj(json_obj, 1, "daemon");
|
||||
json_object *deamon_obj = dmjson_get_obj(deamon_json_obj, 1, "daemon");
|
||||
if (!deamon_obj) {
|
||||
err = -1;
|
||||
goto exit;
|
||||
return -1;
|
||||
}
|
||||
|
||||
opt_val = dmjson_get_value(deamon_obj, 2, "config", "loglevel");
|
||||
|
|
@ -1236,27 +1248,28 @@ static int bbfdm_load_deamon_config(const char *json_path)
|
|||
strncpyt(UBUS_METHOD_NAME, opt_val, sizeof(UBUS_METHOD_NAME));
|
||||
}
|
||||
|
||||
DEAMON_DM_SERVICES = dmjson_get_obj(deamon_obj, 1, "services");
|
||||
|
||||
opt_val = dmjson_get_value(deamon_obj, 2, "input", "type");
|
||||
if (opt_val && strlen(opt_val)) {
|
||||
char *file_path = dmjson_get_value(deamon_obj, 2, "input", "name");
|
||||
|
||||
if (strcasecmp(opt_val, "JSON") == 0)
|
||||
if (strcasecmp(opt_val, "JSON") == 0) {
|
||||
enable_plugins = false; // To be sure that all additional plugins will be ignored
|
||||
err= load_json_plugin(&loaded_json_files, &json_list, &json_memhead, file_path,
|
||||
&DEAMON_DM_ROOT_OBJ);
|
||||
else if (strcasecmp(opt_val, "DotSo") == 0)
|
||||
} else if (strcasecmp(opt_val, "DotSo") == 0) {
|
||||
err = load_dotso_plugin(&deamon_lib_handle, file_path,
|
||||
&DEAMON_DM_ROOT_OBJ,
|
||||
DEAMON_DM_VENDOR_EXTENSION,
|
||||
&DEAMON_DM_VENDOR_EXTENSION_EXCLUDE);
|
||||
else
|
||||
} else {
|
||||
err = -1;
|
||||
}
|
||||
} else {
|
||||
err = -1;
|
||||
}
|
||||
|
||||
exit:
|
||||
json_object_put(json_obj);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -38,8 +38,10 @@ extern struct list_head json_memhead;
|
|||
static DMOBJ *CLIENT_DM_ROOT_OBJ = NULL;
|
||||
static DM_MAP_VENDOR *CLIENT_DM_VENDOR_EXTENSION[2] = {0};
|
||||
static DM_MAP_VENDOR_EXCLUDE *CLIENT_DM_VENDOR_EXTENSION_EXCLUDE = NULL;
|
||||
static json_object *CLIENT_DM_SERVICES = NULL;
|
||||
|
||||
static void *client_lib_handle = NULL;
|
||||
static json_object *client_json_obj = NULL;
|
||||
|
||||
typedef struct {
|
||||
struct dmctx bbf_ctx;
|
||||
|
|
@ -145,6 +147,11 @@ static void __ubus_callback(struct ubus_request *req, int type __attribute__((un
|
|||
return;
|
||||
}
|
||||
|
||||
if (blobmsg_len(parameters) == 0) {
|
||||
client_data->ubus_status = true;
|
||||
return;
|
||||
}
|
||||
|
||||
blobmsg_for_each_attr(cur, parameters, rem) {
|
||||
struct blob_attr *tb[6] = {0};
|
||||
|
||||
|
|
@ -162,7 +169,7 @@ static void __ubus_callback(struct ubus_request *req, int type __attribute__((un
|
|||
if (strcmp(client_data->cmd, "get") == 0)
|
||||
printf("%s => %s\n", name, data);
|
||||
else if (strcmp(client_data->cmd, "set") == 0) {
|
||||
printf("%s => Set value is successfully done\n", name);
|
||||
printf("Set value of %s is successfully done\n", name);
|
||||
} else if (strcmp(client_data->cmd, "add") == 0) {
|
||||
printf("Added %s%s.\n", name, data);
|
||||
} else if (strcmp(client_data->cmd, "del") == 0) {
|
||||
|
|
@ -267,7 +274,6 @@ static int in_ubus_out_cli_exec_cmd(client_data_t *client_data, const char *path
|
|||
|
||||
static int bbfdm_load_client_config(const char *json_path, client_data_t *client_data)
|
||||
{
|
||||
json_object *json_obj = NULL;
|
||||
char *opt_val = NULL;
|
||||
|
||||
if (!json_path || !strlen(json_path)) {
|
||||
|
|
@ -275,20 +281,20 @@ static int bbfdm_load_client_config(const char *json_path, client_data_t *client
|
|||
return -1;
|
||||
}
|
||||
|
||||
json_obj = json_object_from_file(json_path);
|
||||
if (!json_obj) {
|
||||
client_json_obj = json_object_from_file(json_path);
|
||||
if (!client_json_obj) {
|
||||
printf("ERROR: not possible to load json file (%s)\n", json_path);
|
||||
return -1;
|
||||
}
|
||||
|
||||
opt_val = dmjson_get_value(json_obj, 3, "client", "config", "proto");
|
||||
opt_val = dmjson_get_value(client_json_obj, 3, "client", "config", "proto");
|
||||
if (opt_val && strlen(opt_val)) {
|
||||
client_data->proto = get_proto_type(opt_val);
|
||||
} else {
|
||||
client_data->proto = BBFDM_BOTH;
|
||||
}
|
||||
|
||||
opt_val = dmjson_get_value(json_obj, 3, "client", "config", "instance_mode");
|
||||
opt_val = dmjson_get_value(client_json_obj, 3, "client", "config", "instance_mode");
|
||||
if (opt_val && strlen(opt_val)) {
|
||||
int inst_mode = (int) strtol(opt_val, NULL, 10);
|
||||
client_data->instance_mode = get_instance_mode(inst_mode);
|
||||
|
|
@ -296,14 +302,14 @@ static int bbfdm_load_client_config(const char *json_path, client_data_t *client
|
|||
client_data->instance_mode = INSTANCE_MODE_NUMBER;
|
||||
}
|
||||
|
||||
opt_val = dmjson_get_value(json_obj, 3, "client", "config", "enable_plugins");
|
||||
opt_val = dmjson_get_value(client_json_obj, 3, "client", "config", "enable_plugins");
|
||||
if (opt_val && strlen(opt_val)) {
|
||||
client_data->enable_plugins = (unsigned int) strtoul(opt_val, NULL, 10);
|
||||
} else {
|
||||
client_data->enable_plugins = false;
|
||||
}
|
||||
|
||||
opt_val = dmjson_get_value(json_obj, 3, "client", "input", "type");
|
||||
opt_val = dmjson_get_value(client_json_obj, 3, "client", "input", "type");
|
||||
if (opt_val && strlen(opt_val)) {
|
||||
snprintf(client_data->in_type, sizeof(client_data->in_type), "%s", opt_val);
|
||||
} else {
|
||||
|
|
@ -311,7 +317,7 @@ static int bbfdm_load_client_config(const char *json_path, client_data_t *client
|
|||
return -1;
|
||||
}
|
||||
|
||||
opt_val = dmjson_get_value(json_obj, 3, "client", "input", "name");
|
||||
opt_val = dmjson_get_value(client_json_obj, 3, "client", "input", "name");
|
||||
if (opt_val && strlen(opt_val)) {
|
||||
snprintf(client_data->in_name, sizeof(client_data->in_name), "%s", opt_val);
|
||||
} else {
|
||||
|
|
@ -319,7 +325,7 @@ static int bbfdm_load_client_config(const char *json_path, client_data_t *client
|
|||
return -1;
|
||||
}
|
||||
|
||||
opt_val = dmjson_get_value(json_obj, 3, "client", "output", "type");
|
||||
opt_val = dmjson_get_value(client_json_obj, 3, "client", "output", "type");
|
||||
if (opt_val && strlen(opt_val)) {
|
||||
snprintf(client_data->out_type, sizeof(client_data->out_type), "%s", opt_val);
|
||||
} else {
|
||||
|
|
@ -327,7 +333,8 @@ static int bbfdm_load_client_config(const char *json_path, client_data_t *client
|
|||
return -1;
|
||||
}
|
||||
|
||||
json_object_put(json_obj);
|
||||
CLIENT_DM_SERVICES = dmjson_get_obj(client_json_obj, 2, "client", "services");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -645,6 +652,7 @@ static int cli_exec_command(client_data_t *client_data, int argc, char *argv[])
|
|||
goto end;
|
||||
}
|
||||
} else {
|
||||
client_data->enable_plugins = false;
|
||||
if (load_json_plugin(&loaded_json_files, &json_list, &json_memhead, client_data->in_name,
|
||||
&CLIENT_DM_ROOT_OBJ) != 0) {
|
||||
err = EXIT_FAILURE;
|
||||
|
|
@ -657,7 +665,7 @@ static int cli_exec_command(client_data_t *client_data, int argc, char *argv[])
|
|||
goto end;
|
||||
}
|
||||
|
||||
bbf_ctx_init(&client_data->bbf_ctx, CLIENT_DM_ROOT_OBJ, CLIENT_DM_VENDOR_EXTENSION, CLIENT_DM_VENDOR_EXTENSION_EXCLUDE);
|
||||
bbf_ctx_init(&client_data->bbf_ctx, CLIENT_DM_ROOT_OBJ, CLIENT_DM_VENDOR_EXTENSION, CLIENT_DM_VENDOR_EXTENSION_EXCLUDE, CLIENT_DM_SERVICES);
|
||||
|
||||
client_data->bbf_ctx.dm_type = client_data->proto;
|
||||
client_data->bbf_ctx.instance_mode = client_data->instance_mode;
|
||||
|
|
@ -692,11 +700,16 @@ static int cli_exec_command(client_data_t *client_data, int argc, char *argv[])
|
|||
|
||||
end:
|
||||
if (strcasecmp(client_data->in_type, "DotSO") == 0) {
|
||||
bbf_ctx_clean(&client_data->bbf_ctx);
|
||||
bbf_global_clean(CLIENT_DM_ROOT_OBJ);
|
||||
if (CLIENT_DM_ROOT_OBJ) {
|
||||
bbf_ctx_clean(&client_data->bbf_ctx);
|
||||
bbf_global_clean(CLIENT_DM_ROOT_OBJ);
|
||||
}
|
||||
free_dotso_plugin(client_lib_handle);
|
||||
} else if (strcasecmp(client_data->in_type, "JSON") == 0) {
|
||||
bbf_ctx_clean(&client_data->bbf_ctx);
|
||||
if (CLIENT_DM_ROOT_OBJ) {
|
||||
bbf_ctx_clean(&client_data->bbf_ctx);
|
||||
bbf_global_clean(CLIENT_DM_ROOT_OBJ);
|
||||
}
|
||||
free_json_plugin();
|
||||
}
|
||||
|
||||
|
|
@ -720,5 +733,11 @@ int bbfdm_cli_exec_command(const char *json_path, int argc, char *argv[])
|
|||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
return cli_exec_command(&client_data, argc, argv);
|
||||
err = cli_exec_command(&client_data, argc, argv);
|
||||
|
||||
if (client_json_obj) {
|
||||
json_object_put(client_json_obj);
|
||||
client_json_obj = NULL;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@
|
|||
extern DMOBJ *DEAMON_DM_ROOT_OBJ;
|
||||
extern DM_MAP_VENDOR *DEAMON_DM_VENDOR_EXTENSION[2];
|
||||
extern DM_MAP_VENDOR_EXCLUDE *DEAMON_DM_VENDOR_EXTENSION_EXCLUDE;
|
||||
extern json_object *DEAMON_DM_SERVICES;
|
||||
|
||||
bool match(const char *string, const char *pattern);
|
||||
bool is_str_eq(const char *s1, const char *s2);
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
DMOBJ *DEAMON_DM_ROOT_OBJ = NULL;
|
||||
DM_MAP_VENDOR *DEAMON_DM_VENDOR_EXTENSION[2] = {0};
|
||||
DM_MAP_VENDOR_EXCLUDE *DEAMON_DM_VENDOR_EXTENSION_EXCLUDE = NULL;
|
||||
json_object *DEAMON_DM_SERVICES = NULL;
|
||||
|
||||
// uloop.h does not have versions, below line is to use
|
||||
// deprecated uloop_timeout_remaining for the time being
|
||||
|
|
@ -74,7 +75,7 @@ void bb_add_string(struct blob_buf *bb, const char *name, const char *value)
|
|||
|
||||
void bbf_init(struct dmctx *dm_ctx)
|
||||
{
|
||||
bbf_ctx_init(dm_ctx, DEAMON_DM_ROOT_OBJ, DEAMON_DM_VENDOR_EXTENSION, DEAMON_DM_VENDOR_EXTENSION_EXCLUDE);
|
||||
bbf_ctx_init(dm_ctx, DEAMON_DM_ROOT_OBJ, DEAMON_DM_VENDOR_EXTENSION, DEAMON_DM_VENDOR_EXTENSION_EXCLUDE, DEAMON_DM_SERVICES);
|
||||
}
|
||||
|
||||
void bbf_cleanup(struct dmctx *dm_ctx)
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@
|
|||
|
||||
#include "common.h"
|
||||
#include "libbbfdm-api/dmapi.h"
|
||||
#include "libbbfdm-api/dm_plugin/dmdynamicjson.h"
|
||||
#include "libbbfdm-api/plugin/json_plugin.h"
|
||||
|
||||
extern struct list_head global_memhead;
|
||||
|
||||
|
|
@ -98,8 +98,10 @@ int load_dotso_plugin(void **lib_handle, const char *file_path,
|
|||
|
||||
int free_dotso_plugin(void *lib_handle)
|
||||
{
|
||||
if (lib_handle)
|
||||
if (lib_handle) {
|
||||
dlclose(lib_handle);
|
||||
lib_handle = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -161,5 +163,5 @@ int load_json_plugin(struct list_head *json_plugin, struct list_head *json_list,
|
|||
|
||||
int free_json_plugin(void)
|
||||
{
|
||||
return free_json_loaded_object();
|
||||
return free_json_plugins();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,7 +34,6 @@ do
|
|||
$test
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "ok ${num} - $test" >> ./funl-result.log
|
||||
|
||||
else
|
||||
echo "not ok ${num} - $test" >> ./funl-result.log
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -15,6 +15,9 @@ install_libbbf ${1}
|
|||
#compile and install libbbf_test dynamic extension library
|
||||
install_libbbf_test ${1}
|
||||
|
||||
#compile and install libwifi_dataelements dynamic extension library
|
||||
install_libwifi_dataelements ${1}
|
||||
|
||||
# Install datamodel plugins only when pipeline trigger for bbfdm
|
||||
if [ -z "${1}" ]; then
|
||||
git clone -b devel --depth 1 https://dev.iopsys.eu/feed/iopsys.git /opt/dev/iopsys
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ priority=1
|
|||
command=/bin/bash -c "/usr/sbin/ubusd"
|
||||
|
||||
[program:rpcd]
|
||||
autorestart=false
|
||||
autorestart=true
|
||||
numprocs_start=1
|
||||
startretries=0
|
||||
priority=2
|
||||
|
|
@ -18,3 +18,10 @@ numprocs_start=2
|
|||
startretries=0
|
||||
priority=3
|
||||
command=/bin/bash -c "/usr/bin/valgrind --xml=yes --xml-file=/tmp/memory-report.xml --leak-check=full --show-reachable=yes --show-leak-kinds=all --errors-for-leak-kinds=all --error-exitcode=1 --track-origins=yes --leak-resolution=high --show-error-list=yes --child-silent-after-fork=yes /usr/sbin/bbfdmd"
|
||||
|
||||
[program:bbfdm_dataelementsd]
|
||||
autorestart=false
|
||||
numprocs_start=3
|
||||
startretries=0
|
||||
priority=4
|
||||
command=/bin/bash -c "/usr/bin/valgrind --xml=yes --xml-file=/tmp/memory-report-dataelements.xml --leak-check=full --show-reachable=yes --show-leak-kinds=all --errors-for-leak-kinds=all --error-exitcode=1 --track-origins=yes --leak-resolution=high --show-error-list=yes --child-silent-after-fork=yes /usr/sbin/bbfdmd -I /tmp/wifi_dataelements.json"
|
||||
|
|
|
|||
|
|
@ -14,4 +14,6 @@ cp -r ./test/files/lib/* /lib/
|
|||
|
||||
[ -z "${1}" ] && cp ./gitlab-ci/iopsys-supervisord.conf /etc/supervisor/conf.d/
|
||||
|
||||
rm -f /etc/bbfdm/dmmap/*
|
||||
|
||||
ls /etc/config/
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ function install_libbbf()
|
|||
|
||||
mkdir -p build
|
||||
cd build
|
||||
cmake ../ -DCMAKE_C_FLAGS="$COV_CFLAGS " -DCMAKE_EXE_LINKER_FLAGS="$COV_LDFLAGS" -DBBFDMD_ENABLED=ON -DBBF_TR181=ON -DBBF_TR104=ON -DBBF_TR143=ON -DWITH_OPENSSL=ON -DBBF_JSON_PLUGIN=ON -DBBF_DOTSO_PLUGIN=ON -DBBF_VENDOR_EXTENSION=ON -DBBF_VENDOR_LIST="$VENDOR_LIST" -DBBF_VENDOR_PREFIX="$VENDOR_PREFIX" -DBBF_MAX_OBJECT_INSTANCES=255 -DBBFDMD_MAX_MSG_LEN=1048576 -DCMAKE_INSTALL_PREFIX=/
|
||||
cmake ../ -DCMAKE_C_FLAGS="$COV_CFLAGS " -DCMAKE_EXE_LINKER_FLAGS="$COV_LDFLAGS" -DBBFDMD_ENABLED=ON -DBBF_TR181=ON -DBBF_TR104=ON -DBBF_TR143=ON -DWITH_OPENSSL=ON -DBBF_JSON_PLUGIN=ON -DBBF_DOTSO_PLUGIN=ON -DBBF_VENDOR_EXTENSION=ON -DBBF_WIFI_DATAELEMENTS=OFF -DBBF_VENDOR_LIST="$VENDOR_LIST" -DBBF_VENDOR_PREFIX="$VENDOR_PREFIX" -DBBF_MAX_OBJECT_INSTANCES=255 -DBBFDMD_MAX_MSG_LEN=1048576 -DCMAKE_INSTALL_PREFIX=/
|
||||
exec_cmd_verbose make
|
||||
|
||||
echo "installing libbbf"
|
||||
|
|
@ -91,6 +91,22 @@ function install_libbbf_test()
|
|||
cp -f test/bbf_test/libbbf_test.so /usr/lib/bbfdm
|
||||
}
|
||||
|
||||
function install_libwifi_dataelements()
|
||||
{
|
||||
# Enable coverage flags only for test
|
||||
[ -n "${1}" ] && return 0;
|
||||
|
||||
# compile and install libwifi_dataelements
|
||||
echo "Compiling libwifi_dataelements"
|
||||
exec_cmd_verbose make clean -C test/wifi_dataelements/
|
||||
exec_cmd_verbose make -C test/wifi_dataelements/
|
||||
|
||||
echo "installing libwifi_dataelements"
|
||||
cp -f test/wifi_dataelements/input.json /etc/bbfdm/input.json
|
||||
cp -f test/wifi_dataelements/wifi_dataelements.json /tmp/wifi_dataelements.json
|
||||
cp -f test/wifi_dataelements/libwifi_dataelements.so /tmp/libwifi_dataelements.so
|
||||
}
|
||||
|
||||
function install_libperiodicstats()
|
||||
{
|
||||
# clone and compile libperiodicstats
|
||||
|
|
|
|||
|
|
@ -4,6 +4,18 @@
|
|||
"refresh_time": 10,
|
||||
"enable_plugins": 1
|
||||
},
|
||||
"services": [
|
||||
{
|
||||
"ubus_obj": "bbfdm.bulkdata",
|
||||
"obj_mount": "Device.",
|
||||
"obj_name": "BulkData"
|
||||
},
|
||||
{
|
||||
"ubus_obj": "bbfdm.periodicstats",
|
||||
"obj_mount": "Device.",
|
||||
"obj_name": "PeriodicStatistics"
|
||||
}
|
||||
],
|
||||
"input": {
|
||||
"type": "DotSo",
|
||||
"name": "/lib/libbbfdm.so"
|
||||
|
|
@ -15,7 +27,7 @@
|
|||
},
|
||||
"client": {
|
||||
"config": {
|
||||
"proto": "usp",
|
||||
"proto": "both",
|
||||
"instance_mode": 0,
|
||||
"enable_plugins": 0
|
||||
},
|
||||
|
|
|
|||
|
|
@ -15,17 +15,17 @@ OPTION(BBF_JSON_PLUGIN "build with json plugin" ON)
|
|||
OPTION(BBF_VENDOR_EXTENSION "build with vendor extension enabled" ON)
|
||||
|
||||
IF(BBF_DOTSO_PLUGIN)
|
||||
SET(BBF_DOTSO_PLUGIN_SOURCES dm_plugin/dmdynamiclibrary.c)
|
||||
SET(BBF_DOTSO_PLUGIN_SOURCES plugin/dotso_plugin.c)
|
||||
add_compile_definitions(BBFDM_ENABLE_DOTSO_PLUGIN)
|
||||
ENDIF(BBF_DOTSO_PLUGIN)
|
||||
|
||||
IF(BBF_JSON_PLUGIN)
|
||||
SET(BBF_JSON_PLUGIN_SOURCES dm_plugin/dmdynamicjson.c)
|
||||
SET(BBF_JSON_PLUGIN_SOURCES plugin/json_plugin.c)
|
||||
add_compile_definitions(BBFDM_ENABLE_JSON_PLUGIN)
|
||||
endif(BBF_JSON_PLUGIN)
|
||||
|
||||
IF(BBF_VENDOR_EXTENSION)
|
||||
SET(BBF_VENDOR_EXTENSION_SOURCES dm_plugin/dmdynamicvendor.c)
|
||||
SET(BBF_VENDOR_EXTENSION_SOURCES plugin/vendor_plugin.c)
|
||||
ADD_DEFINITIONS(-DBBF_VENDOR_LIST="${BBF_VENDOR_LIST}")
|
||||
add_compile_definitions(BBF_VENDOR_EXTENSION)
|
||||
SET(BBF_VENDOR_LIST "iopsys" CACHE STRING "vendor list to be used")
|
||||
|
|
|
|||
|
|
@ -177,6 +177,7 @@ struct dmctx {
|
|||
DMOBJ *dm_entryobj;
|
||||
DM_MAP_VENDOR *dm_vendor_extension[2];
|
||||
DM_MAP_VENDOR_EXCLUDE *dm_vendor_extension_exclude;
|
||||
json_object *services_obj;
|
||||
bool nextlevel;
|
||||
bool iswildcard;
|
||||
int faultcode;
|
||||
|
|
@ -212,6 +213,7 @@ typedef struct dmnode {
|
|||
unsigned char browse_type;
|
||||
int max_instance;
|
||||
int num_of_entries;
|
||||
bool is_ubus_service;
|
||||
} DMNODE;
|
||||
|
||||
enum operate_ret_status {
|
||||
|
|
@ -372,6 +374,7 @@ enum {
|
|||
INDX_JSON_MOUNT,
|
||||
INDX_LIBRARY_MOUNT,
|
||||
INDX_VENDOR_MOUNT,
|
||||
INDX_SERVICE_MOUNT,
|
||||
__INDX_DYNAMIC_MAX
|
||||
};
|
||||
|
||||
|
|
|
|||
1505
libbbfdm-api/dmbbf.c
1505
libbbfdm-api/dmbbf.c
File diff suppressed because it is too large
Load diff
|
|
@ -37,25 +37,16 @@ int string_to_bool(char *v, bool *b);
|
|||
void dmentry_instance_lookup_inparam(struct dmctx *ctx);
|
||||
int dm_entry_get_value(struct dmctx *dmctx);
|
||||
int dm_entry_get_name(struct dmctx *ctx);
|
||||
int dm_entry_get_schema(struct dmctx *ctx);
|
||||
int dm_entry_get_supported_dm(struct dmctx *ctx);
|
||||
int dm_entry_get_instances(struct dmctx *ctx);
|
||||
int dm_entry_add_object(struct dmctx *dmctx);
|
||||
int dm_entry_delete_object(struct dmctx *dmctx);
|
||||
int dm_entry_set_value(struct dmctx *dmctx);
|
||||
int dm_entry_operate(struct dmctx *dmctx);
|
||||
int dm_entry_get_linker(struct dmctx *dmctx);
|
||||
int dm_entry_get_linker_value(struct dmctx *dmctx);
|
||||
int dm_entry_list_operates(struct dmctx *ctx);
|
||||
int dm_entry_operate(struct dmctx *dmctx);
|
||||
int dm_entry_list_events(struct dmctx *dmctx);
|
||||
int dm_browse_last_access_path(char *path, size_t len);
|
||||
int dm_link_inst_obj(struct dmctx *dmctx, DMNODE *parent_node, void *data, char *instance);
|
||||
void dm_exclude_obj(struct dmctx *dmctx, DMNODE *parent_node, DMOBJ *entryobj, char *data);
|
||||
void dm_check_dynamic_obj(struct dmctx *dmctx, DMNODE *parent_node, DMOBJ *entryobj, char *full_obj, char *obj, DMOBJ **root_entry, int *obj_found);
|
||||
bool find_root_entry(struct dmctx *ctx, char *in_param, DMOBJ **root_entry);
|
||||
int get_obj_idx_dynamic_array(DMOBJ **entryobj);
|
||||
int get_leaf_idx_dynamic_array(DMLEAF **entryleaf);
|
||||
void free_dm_browse_node_dynamic_object_tree(DMNODE *parent_node, DMOBJ *entryobj);
|
||||
|
||||
char *update_instance_alias(int action, char **last_inst, char **max_inst, void *argv[]);
|
||||
char *update_instance(char *max_inst, int argc, ...);
|
||||
|
|
|
|||
|
|
@ -13,39 +13,24 @@
|
|||
*/
|
||||
|
||||
#include "dmapi.h"
|
||||
#include "dmuci.h"
|
||||
#include "dmbbf.h"
|
||||
#include "dmmem.h"
|
||||
#include "dmubus.h"
|
||||
#include "dmplugin.h"
|
||||
#include "dmcommon.h"
|
||||
#include "dmentry.h"
|
||||
|
||||
#ifdef BBFDM_ENABLE_JSON_PLUGIN
|
||||
#include "dm_plugin/dmdynamicjson.h"
|
||||
static char json_hash[64] = {0};
|
||||
#endif /* BBFDM_ENABLE_JSON_PLUGIN */
|
||||
|
||||
#ifdef BBFDM_ENABLE_DOTSO_PLUGIN
|
||||
#include "dm_plugin/dmdynamiclibrary.h"
|
||||
static char library_hash[64] = {0};
|
||||
#endif /* BBFDM_ENABLE_DOTSO_PLUGIN */
|
||||
|
||||
#ifdef BBF_VENDOR_EXTENSION
|
||||
#include "dm_plugin/dmdynamicvendor.h"
|
||||
static bool first_boot = false;
|
||||
#endif
|
||||
|
||||
LIST_HEAD(head_package_change);
|
||||
LIST_HEAD(global_memhead);
|
||||
|
||||
void bbf_ctx_init(struct dmctx *ctx, DMOBJ *tEntryObj,
|
||||
DM_MAP_VENDOR *tVendorExtension[],
|
||||
DM_MAP_VENDOR_EXCLUDE *tVendorExtensionExclude)
|
||||
DM_MAP_VENDOR_EXCLUDE *tVendorExtensionExclude,
|
||||
json_object *services_obj)
|
||||
{
|
||||
INIT_LIST_HEAD(&ctx->list_parameter);
|
||||
ctx->dm_entryobj = tEntryObj;
|
||||
ctx->dm_vendor_extension[0] = tVendorExtension ? tVendorExtension[0] : NULL;
|
||||
ctx->dm_vendor_extension[1] = tVendorExtension ? tVendorExtension[1] : NULL;
|
||||
ctx->dm_vendor_extension_exclude = tVendorExtensionExclude;
|
||||
ctx->services_obj = services_obj;
|
||||
dm_uci_init();
|
||||
}
|
||||
|
||||
|
|
@ -156,147 +141,17 @@ int bbf_fault_map(unsigned int dm_type, int fault)
|
|||
return out_fault;
|
||||
}
|
||||
|
||||
#if defined(BBFDM_ENABLE_JSON_PLUGIN) || defined(BBFDM_ENABLE_DOTSO_PLUGIN)
|
||||
static char* get_folder_path(bool json_path)
|
||||
{
|
||||
if (json_path) {
|
||||
#ifdef BBFDM_ENABLE_JSON_PLUGIN
|
||||
return JSON_FOLDER_PATH;
|
||||
#endif /* BBFDM_ENABLE_JSON_PLUGIN */
|
||||
} else {
|
||||
#ifdef BBFDM_ENABLE_DOTSO_PLUGIN
|
||||
return LIBRARY_FOLDER_PATH;
|
||||
#endif /* BBFDM_ENABLE_DOTSO_PLUGIN */
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int get_stats_folder(bool json_path, int *count, unsigned long *size)
|
||||
{
|
||||
const char *path = get_folder_path(json_path);
|
||||
if (path == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (folder_exists(path)) {
|
||||
struct dirent *entry = NULL;
|
||||
struct stat stats;
|
||||
int file_count = 0;
|
||||
unsigned long file_size = 0;
|
||||
char buf[512] = {0};
|
||||
|
||||
DIR *dirp = opendir(path);
|
||||
while ((entry = readdir(dirp)) != NULL) {
|
||||
if ((entry->d_type == DT_REG) && (strstr(entry->d_name, json_path ? ".json" : ".so"))) {
|
||||
file_count++;
|
||||
snprintf(buf, sizeof(buf), "%s/%s", path, entry->d_name);
|
||||
if (!stat(buf, &stats))
|
||||
file_size += stats.st_size;
|
||||
}
|
||||
}
|
||||
|
||||
if (dirp)
|
||||
closedir(dirp);
|
||||
|
||||
*count = file_count;
|
||||
*size = file_size;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int check_stats_folder(bool json_path)
|
||||
{
|
||||
int count = 0;
|
||||
unsigned long size = 0;
|
||||
char buf[64] = {0};
|
||||
|
||||
if (!get_stats_folder(json_path, &count, &size))
|
||||
return 0;
|
||||
|
||||
snprintf(buf, sizeof(buf), "count:%d,size:%lu", count, size);
|
||||
|
||||
if (json_path) {
|
||||
#ifdef BBFDM_ENABLE_JSON_PLUGIN
|
||||
if (DM_STRCMP(buf, json_hash) != 0) {
|
||||
DM_STRNCPY(json_hash, buf, sizeof(json_hash));
|
||||
return 1;
|
||||
}
|
||||
#endif /* BBFDM_ENABLE_JSON_PLUGIN */
|
||||
} else {
|
||||
#ifdef BBFDM_ENABLE_DOTSO_PLUGIN
|
||||
if (DM_STRCMP(buf, library_hash) != 0) {
|
||||
DM_STRNCPY(library_hash, buf, sizeof(library_hash));
|
||||
return 1;
|
||||
}
|
||||
#endif /* BBFDM_ENABLE_DOTSO_PLUGIN */
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* (BBFDM_ENABLE_JSON_PLUGIN || BBFDM_ENABLE_DOTSO_PLUGIN) */
|
||||
|
||||
static void load_dynamic_arrays(struct dmctx *ctx)
|
||||
{
|
||||
#ifdef BBFDM_ENABLE_JSON_PLUGIN
|
||||
// Load dynamic objects and parameters exposed via a JSON file
|
||||
if (check_stats_folder(true)) {
|
||||
free_json_dynamic_arrays(ctx->dm_entryobj);
|
||||
load_json_dynamic_arrays(ctx);
|
||||
}
|
||||
#endif /* BBFDM_ENABLE_JSON_PLUGIN */
|
||||
|
||||
#ifdef BBFDM_ENABLE_DOTSO_PLUGIN
|
||||
// Load dynamic objects and parameters exposed via a library
|
||||
if (check_stats_folder(false)) {
|
||||
free_library_dynamic_arrays(ctx->dm_entryobj);
|
||||
load_library_dynamic_arrays(ctx);
|
||||
}
|
||||
#endif /* BBFDM_ENABLE_DOTSO_PLUGIN */
|
||||
|
||||
#ifdef BBF_VENDOR_EXTENSION
|
||||
// Load objects and parameters exposed via vendor extension
|
||||
if (first_boot == false) {
|
||||
free_vendor_dynamic_arrays(ctx->dm_entryobj);
|
||||
load_vendor_dynamic_arrays(ctx);
|
||||
first_boot = true;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void free_dynamic_arrays(DMOBJ *dm_entryobj)
|
||||
{
|
||||
DMNODE node = {.current_object = ""};
|
||||
|
||||
#ifdef BBFDM_ENABLE_JSON_PLUGIN
|
||||
free_json_dynamic_arrays(dm_entryobj);
|
||||
#endif /* BBFDM_ENABLE_JSON_PLUGIN */
|
||||
|
||||
#ifdef BBFDM_ENABLE_DOTSO_PLUGIN
|
||||
free_library_dynamic_arrays(dm_entryobj);
|
||||
#endif /* BBFDM_ENABLE_DOTSO_PLUGIN */
|
||||
|
||||
#ifdef BBF_VENDOR_EXTENSION
|
||||
free_vendor_dynamic_arrays(dm_entryobj);
|
||||
#endif
|
||||
|
||||
free_dm_browse_node_dynamic_object_tree(&node, dm_entryobj);
|
||||
}
|
||||
|
||||
int bbf_entry_method(struct dmctx *ctx, int cmd)
|
||||
{
|
||||
int fault = 0;
|
||||
|
||||
if (!ctx->dm_entryobj)
|
||||
if (!ctx || !ctx->dm_entryobj)
|
||||
return bbf_fault_map(ctx->dm_type, USP_FAULT_INVALID_CONFIGURATION);
|
||||
|
||||
if (!ctx->in_param)
|
||||
return bbf_fault_map(ctx->dm_type, USP_FAULT_INVALID_PATH);
|
||||
|
||||
// Load dynamic objects and parameters
|
||||
if (ctx->enable_plugins)
|
||||
load_dynamic_arrays(ctx);
|
||||
load_plugins(ctx);
|
||||
|
||||
dmentry_instance_lookup_inparam(ctx);
|
||||
|
||||
|
|
@ -349,7 +204,7 @@ int bbf_entry_method(struct dmctx *ctx, int cmd)
|
|||
|
||||
void bbf_global_clean(DMOBJ *dm_entryobj)
|
||||
{
|
||||
free_dynamic_arrays(dm_entryobj);
|
||||
free_plugins(dm_entryobj);
|
||||
dm_dynamic_cleanmem(&global_memhead);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -17,7 +17,8 @@
|
|||
|
||||
void bbf_ctx_init(struct dmctx *ctx, DMOBJ *tEntryObj,
|
||||
DM_MAP_VENDOR *tVendorExtension[],
|
||||
DM_MAP_VENDOR_EXCLUDE *tVendorExtensionExclude);
|
||||
DM_MAP_VENDOR_EXCLUDE *tVendorExtensionExclude,
|
||||
json_object *services_obj);
|
||||
void bbf_ctx_clean(struct dmctx *ctx);
|
||||
|
||||
void bbf_ctx_init_sub(struct dmctx *ctx, DMOBJ *tEntryObj,
|
||||
|
|
@ -30,6 +31,7 @@ int bbf_fault_map(unsigned int dm_type, int fault);
|
|||
int bbf_entry_method(struct dmctx *ctx, int cmd);
|
||||
|
||||
void bbf_global_clean(DMOBJ *dm_entryobj);
|
||||
|
||||
int dm_entry_validate_allowed_objects(struct dmctx *ctx, char *value, char *objects[]);
|
||||
|
||||
int adm_entry_get_linker_param(struct dmctx *ctx, char *param, char *linker, char **value);
|
||||
|
|
|
|||
401
libbbfdm-api/dmplugin.c
Normal file
401
libbbfdm-api/dmplugin.c
Normal file
|
|
@ -0,0 +1,401 @@
|
|||
/*
|
||||
* Copyright (C) 2023 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author Amin Ben Romdhane <amin.benromdhane@iopsys.eu>
|
||||
*/
|
||||
|
||||
#include "dmapi.h"
|
||||
#include "dmplugin.h"
|
||||
|
||||
#ifdef BBFDM_ENABLE_JSON_PLUGIN
|
||||
#include "plugin/json_plugin.h"
|
||||
static char json_hash[64] = {0};
|
||||
#endif /* BBFDM_ENABLE_JSON_PLUGIN */
|
||||
|
||||
#ifdef BBFDM_ENABLE_DOTSO_PLUGIN
|
||||
#include "plugin/dotso_plugin.h"
|
||||
static char library_hash[64] = {0};
|
||||
#endif /* BBFDM_ENABLE_DOTSO_PLUGIN */
|
||||
|
||||
#ifdef BBF_VENDOR_EXTENSION
|
||||
#include "plugin/vendor_plugin.h"
|
||||
#endif
|
||||
|
||||
static bool first_boot = false;
|
||||
|
||||
extern struct list_head global_memhead;
|
||||
|
||||
#if defined(BBFDM_ENABLE_JSON_PLUGIN) || defined(BBFDM_ENABLE_DOTSO_PLUGIN)
|
||||
static char *get_folder_path(bool json_path)
|
||||
{
|
||||
if (json_path) {
|
||||
#ifdef BBFDM_ENABLE_JSON_PLUGIN
|
||||
return JSON_FOLDER_PATH;
|
||||
#endif /* BBFDM_ENABLE_JSON_PLUGIN */
|
||||
} else {
|
||||
#ifdef BBFDM_ENABLE_DOTSO_PLUGIN
|
||||
return LIBRARY_FOLDER_PATH;
|
||||
#endif /* BBFDM_ENABLE_DOTSO_PLUGIN */
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int get_stats_folder(bool json_path, int *count, unsigned long *size)
|
||||
{
|
||||
const char *path = get_folder_path(json_path);
|
||||
if (path == NULL)
|
||||
return 0;
|
||||
|
||||
if (folder_exists(path)) {
|
||||
struct dirent *entry = NULL;
|
||||
struct stat stats;
|
||||
int file_count = 0;
|
||||
unsigned long file_size = 0;
|
||||
char buf[512] = {0};
|
||||
|
||||
DIR *dirp = opendir(path);
|
||||
while ((entry = readdir(dirp)) != NULL) {
|
||||
if ((entry->d_type == DT_REG) && (strstr(entry->d_name, json_path ? ".json" : ".so"))) {
|
||||
file_count++;
|
||||
snprintf(buf, sizeof(buf), "%s/%s", path, entry->d_name);
|
||||
if (!stat(buf, &stats))
|
||||
file_size += stats.st_size;
|
||||
}
|
||||
}
|
||||
|
||||
if (dirp)
|
||||
closedir(dirp);
|
||||
|
||||
*count = file_count;
|
||||
*size = file_size;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool check_stats_folder(bool json_path)
|
||||
{
|
||||
int count = 0;
|
||||
unsigned long size = 0;
|
||||
char buf[64] = {0};
|
||||
|
||||
if (!get_stats_folder(json_path, &count, &size))
|
||||
return false;
|
||||
|
||||
snprintf(buf, sizeof(buf), "count:%d,size:%lu", count, size);
|
||||
|
||||
if (json_path) {
|
||||
#ifdef BBFDM_ENABLE_JSON_PLUGIN
|
||||
if (DM_STRCMP(buf, json_hash) != 0) {
|
||||
DM_STRNCPY(json_hash, buf, sizeof(json_hash));
|
||||
return true;
|
||||
}
|
||||
#endif /* BBFDM_ENABLE_JSON_PLUGIN */
|
||||
} else {
|
||||
#ifdef BBFDM_ENABLE_DOTSO_PLUGIN
|
||||
if (DM_STRCMP(buf, library_hash) != 0) {
|
||||
DM_STRNCPY(library_hash, buf, sizeof(library_hash));
|
||||
return true;
|
||||
}
|
||||
#endif /* BBFDM_ENABLE_DOTSO_PLUGIN */
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
#endif /* (BBFDM_ENABLE_JSON_PLUGIN || BBFDM_ENABLE_DOTSO_PLUGIN) */
|
||||
|
||||
static void load_services(struct dmctx *ctx)
|
||||
{
|
||||
json_object *service = NULL;
|
||||
|
||||
if (!ctx->services_obj)
|
||||
return;
|
||||
|
||||
size_t nbre_services = json_object_array_length(ctx->services_obj);
|
||||
|
||||
for (size_t i = 0; i < nbre_services; i++) {
|
||||
service = json_object_array_get_idx(ctx->services_obj, i);
|
||||
|
||||
char *obj_mount = dmjson_get_value(service, 1, "obj_mount");
|
||||
if (DM_STRLEN(obj_mount) == 0)
|
||||
continue;
|
||||
|
||||
char *obj_name = dmjson_get_value(service, 1, "obj_name");
|
||||
if (DM_STRLEN(obj_name) == 0)
|
||||
continue;
|
||||
|
||||
char *ubus_obj = dmjson_get_value(service, 1, "ubus_obj");
|
||||
if (DM_STRLEN(ubus_obj) == 0)
|
||||
continue;
|
||||
|
||||
DMOBJ *dm_entryobj = NULL;
|
||||
bool obj_exists = find_entry_obj(ctx->dm_entryobj, obj_mount, &dm_entryobj);
|
||||
if (obj_exists == false || !dm_entryobj)
|
||||
continue;
|
||||
|
||||
if (dm_entryobj->nextdynamicobj == NULL) {
|
||||
dm_entryobj->nextdynamicobj = calloc(__INDX_DYNAMIC_MAX, sizeof(struct dm_dynamic_obj));
|
||||
dm_entryobj->nextdynamicobj[INDX_JSON_MOUNT].idx_type = INDX_JSON_MOUNT;
|
||||
dm_entryobj->nextdynamicobj[INDX_LIBRARY_MOUNT].idx_type = INDX_LIBRARY_MOUNT;
|
||||
dm_entryobj->nextdynamicobj[INDX_VENDOR_MOUNT].idx_type = INDX_VENDOR_MOUNT;
|
||||
dm_entryobj->nextdynamicobj[INDX_SERVICE_MOUNT].idx_type = INDX_SERVICE_MOUNT;
|
||||
}
|
||||
|
||||
if (dm_entryobj->nextdynamicobj[INDX_SERVICE_MOUNT].nextobj == NULL) {
|
||||
dm_entryobj->nextdynamicobj[INDX_SERVICE_MOUNT].nextobj = calloc(2, sizeof(DMOBJ *));
|
||||
}
|
||||
|
||||
if (dm_entryobj->nextdynamicobj[INDX_SERVICE_MOUNT].nextobj[0] == NULL) {
|
||||
dm_entryobj->nextdynamicobj[INDX_SERVICE_MOUNT].nextobj[0] = dm_dynamic_calloc(&global_memhead, 2, sizeof(struct dm_obj_s));
|
||||
((dm_entryobj->nextdynamicobj[INDX_SERVICE_MOUNT].nextobj[0])[0]).obj = dm_dynamic_strdup(&global_memhead, obj_name);
|
||||
((dm_entryobj->nextdynamicobj[INDX_SERVICE_MOUNT].nextobj[0])[0]).checkdep = dm_dynamic_strdup(&global_memhead, ubus_obj);
|
||||
} else {
|
||||
int idx = get_entry_idx(dm_entryobj->nextdynamicobj[INDX_SERVICE_MOUNT].nextobj[0]);
|
||||
dm_entryobj->nextdynamicobj[INDX_SERVICE_MOUNT].nextobj[0] = dm_dynamic_realloc(&global_memhead, dm_entryobj->nextdynamicobj[INDX_SERVICE_MOUNT].nextobj[0], (idx + 2) * sizeof(struct dm_obj_s));
|
||||
memset(dm_entryobj->nextdynamicobj[INDX_SERVICE_MOUNT].nextobj[0] + (idx + 1), 0, sizeof(struct dm_obj_s));
|
||||
((dm_entryobj->nextdynamicobj[INDX_SERVICE_MOUNT].nextobj[0])[idx]).obj = dm_dynamic_strdup(&global_memhead, obj_name);
|
||||
((dm_entryobj->nextdynamicobj[INDX_SERVICE_MOUNT].nextobj[0])[idx]).checkdep = dm_dynamic_strdup(&global_memhead, ubus_obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void free_specific_dynamic_node(DMOBJ *entryobj, int indx)
|
||||
{
|
||||
for (; (entryobj && entryobj->obj); entryobj++) {
|
||||
|
||||
if (entryobj->nextdynamicobj) {
|
||||
struct dm_dynamic_obj *next_dyn_array = entryobj->nextdynamicobj + indx;
|
||||
FREE(next_dyn_array->nextobj);
|
||||
}
|
||||
|
||||
if (entryobj->dynamicleaf) {
|
||||
struct dm_dynamic_leaf *next_dyn_array = entryobj->dynamicleaf + indx;
|
||||
FREE(next_dyn_array->nextleaf);
|
||||
}
|
||||
|
||||
if (entryobj->nextobj)
|
||||
free_specific_dynamic_node(entryobj->nextobj, indx);
|
||||
}
|
||||
}
|
||||
|
||||
static void free_all_dynamic_nodes(DMOBJ *entryobj)
|
||||
{
|
||||
for (; (entryobj && entryobj->obj); entryobj++) {
|
||||
|
||||
if (entryobj->nextdynamicobj) {
|
||||
for (int i = 0; i < __INDX_DYNAMIC_MAX; i++) {
|
||||
struct dm_dynamic_obj *next_dyn_array = entryobj->nextdynamicobj + i;
|
||||
FREE(next_dyn_array->nextobj);
|
||||
}
|
||||
FREE(entryobj->nextdynamicobj);
|
||||
}
|
||||
|
||||
if (entryobj->dynamicleaf) {
|
||||
for (int i = 0; i < __INDX_DYNAMIC_MAX; i++) {
|
||||
struct dm_dynamic_leaf *next_dyn_array = entryobj->dynamicleaf + i;
|
||||
FREE(next_dyn_array->nextleaf);
|
||||
}
|
||||
FREE(entryobj->dynamicleaf);
|
||||
}
|
||||
|
||||
if (entryobj->nextobj)
|
||||
free_all_dynamic_nodes(entryobj->nextobj);
|
||||
}
|
||||
}
|
||||
|
||||
static int plugin_obj_match(char *in_param, struct dmnode *node)
|
||||
{
|
||||
if (node->matched)
|
||||
return 0;
|
||||
|
||||
if (DM_STRSTR(node->current_object, in_param) == node->current_object) {
|
||||
node->matched++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (DM_STRSTR(in_param, node->current_object) == in_param)
|
||||
return 0;
|
||||
|
||||
return FAULT_9005;
|
||||
}
|
||||
|
||||
static void dm_check_dynamic_obj(DMNODE *parent_node, DMOBJ *entryobj, char *full_obj, DMOBJ **root_entry, bool *obj_found);
|
||||
static void dm_check_dynamic_obj_entry(DMNODE *parent_node, DMOBJ *entryobj, char *parent_obj, char *full_obj, DMOBJ **root_entry, bool *obj_found)
|
||||
{
|
||||
DMNODE node = {0};
|
||||
node.obj = entryobj;
|
||||
node.parent = parent_node;
|
||||
node.instance_level = parent_node->instance_level;
|
||||
node.matched = parent_node->matched;
|
||||
|
||||
dmasprintf(&(node.current_object), "%s%s.", parent_obj, entryobj->obj);
|
||||
if (DM_STRCMP(node.current_object, full_obj) == 0) {
|
||||
*root_entry = entryobj;
|
||||
*obj_found = true;
|
||||
return;
|
||||
}
|
||||
|
||||
int err = plugin_obj_match(full_obj, &node);
|
||||
if (err)
|
||||
return;
|
||||
|
||||
if (entryobj->nextobj || entryobj->nextdynamicobj)
|
||||
dm_check_dynamic_obj(&node, entryobj->nextobj, full_obj, root_entry, obj_found);
|
||||
}
|
||||
|
||||
static void dm_check_dynamic_obj(DMNODE *parent_node, DMOBJ *entryobj, char *full_obj, DMOBJ **root_entry, bool *obj_found)
|
||||
{
|
||||
char *parent_obj = parent_node->current_object;
|
||||
|
||||
for (; (entryobj && entryobj->obj); entryobj++) {
|
||||
dm_check_dynamic_obj_entry(parent_node, entryobj, parent_obj, full_obj, root_entry, obj_found);
|
||||
if (*obj_found == true)
|
||||
return;
|
||||
}
|
||||
|
||||
if (parent_node->obj) {
|
||||
if (parent_node->obj->nextdynamicobj) {
|
||||
for (int i = 0; i < __INDX_DYNAMIC_MAX - 1; i++) {
|
||||
struct dm_dynamic_obj *next_dyn_array = parent_node->obj->nextdynamicobj + i;
|
||||
if (next_dyn_array->nextobj) {
|
||||
for (int j = 0; next_dyn_array->nextobj[j]; j++) {
|
||||
DMOBJ *jentryobj = next_dyn_array->nextobj[j];
|
||||
for (; (jentryobj && jentryobj->obj); jentryobj++) {
|
||||
dm_check_dynamic_obj_entry(parent_node, jentryobj, parent_obj, full_obj, root_entry, obj_found);
|
||||
if (*obj_found == true)
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool find_entry_obj(DMOBJ *root_entry, char *in_param, DMOBJ **entryobj)
|
||||
{
|
||||
if (!root_entry || !in_param || !entryobj)
|
||||
return false;
|
||||
|
||||
DMNODE node = {.current_object = ""};
|
||||
bool obj_found = false;
|
||||
|
||||
char *obj_path = replace_str(in_param, ".{i}.", ".");
|
||||
dm_check_dynamic_obj(&node, root_entry, obj_path, entryobj, &obj_found);
|
||||
FREE(obj_path);
|
||||
|
||||
return (obj_found && *entryobj) ? true : false;
|
||||
}
|
||||
|
||||
void dm_exclude_obj(DMOBJ *entryobj, DMNODE *parent_node, char *obj_path)
|
||||
{
|
||||
char *parent_obj = parent_node->current_object;
|
||||
|
||||
for (; (entryobj && entryobj->obj); entryobj++) {
|
||||
DMNODE node = {0};
|
||||
node.obj = entryobj;
|
||||
node.parent = parent_node;
|
||||
node.instance_level = parent_node->instance_level;
|
||||
node.matched = parent_node->matched;
|
||||
|
||||
dmasprintf(&(node.current_object), "%s%s.", parent_obj, entryobj->obj);
|
||||
if (DM_STRCMP(node.current_object, obj_path) == 0) {
|
||||
entryobj->bbfdm_type = BBFDM_NONE;
|
||||
return;
|
||||
}
|
||||
|
||||
int err = plugin_obj_match(obj_path, &node);
|
||||
if (err)
|
||||
continue;
|
||||
|
||||
if (entryobj->nextobj)
|
||||
dm_exclude_obj(entryobj->nextobj, &node, obj_path);
|
||||
}
|
||||
}
|
||||
|
||||
int get_entry_idx(DMOBJ *entryobj)
|
||||
{
|
||||
int idx = 0;
|
||||
|
||||
for (; (entryobj && entryobj->obj); entryobj++)
|
||||
idx++;
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
int get_obj_idx(DMOBJ **entryobj)
|
||||
{
|
||||
int idx = 0;
|
||||
|
||||
for (int i = 0; entryobj[i]; i++)
|
||||
idx++;
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
int get_leaf_idx(DMLEAF **entryleaf)
|
||||
{
|
||||
int idx = 0;
|
||||
|
||||
for (int i = 0; entryleaf[i]; i++)
|
||||
idx++;
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
void load_plugins(struct dmctx *ctx)
|
||||
{
|
||||
if (ctx->enable_plugins) {
|
||||
#ifdef BBFDM_ENABLE_JSON_PLUGIN
|
||||
// Load dynamic objects and parameters exposed via JSON file plugin
|
||||
if (check_stats_folder(true)) {
|
||||
free_json_plugins();
|
||||
free_specific_dynamic_node(ctx->dm_entryobj, INDX_JSON_MOUNT);
|
||||
load_json_plugins(ctx);
|
||||
}
|
||||
#endif /* BBFDM_ENABLE_JSON_PLUGIN */
|
||||
|
||||
#ifdef BBFDM_ENABLE_DOTSO_PLUGIN
|
||||
// Load dynamic objects and parameters exposed via a dotso plugin
|
||||
if (check_stats_folder(false)) {
|
||||
free_dotso_plugins();
|
||||
free_specific_dynamic_node(ctx->dm_entryobj, INDX_LIBRARY_MOUNT);
|
||||
load_dotso_plugins(ctx);
|
||||
}
|
||||
#endif /* BBFDM_ENABLE_DOTSO_PLUGIN */
|
||||
|
||||
#ifdef BBF_VENDOR_EXTENSION
|
||||
// Load objects and parameters exposed via vendor extension plugin
|
||||
if (first_boot == false) {
|
||||
free_specific_dynamic_node(ctx->dm_entryobj, INDX_VENDOR_MOUNT);
|
||||
load_vendor_dynamic_arrays(ctx);
|
||||
}
|
||||
#endif /* BBF_VENDOR_EXTENSION */
|
||||
}
|
||||
|
||||
if (first_boot == false) {
|
||||
// Load main objects exposed via services section
|
||||
free_specific_dynamic_node(ctx->dm_entryobj, INDX_SERVICE_MOUNT);
|
||||
load_services(ctx);
|
||||
}
|
||||
|
||||
first_boot = true;
|
||||
}
|
||||
|
||||
void free_plugins(DMOBJ *dm_entryobj)
|
||||
{
|
||||
free_all_dynamic_nodes(dm_entryobj);
|
||||
|
||||
#ifdef BBFDM_ENABLE_JSON_PLUGIN
|
||||
free_json_plugins();
|
||||
#endif /* BBFDM_ENABLE_JSON_PLUGIN */
|
||||
|
||||
#ifdef BBFDM_ENABLE_DOTSO_PLUGIN
|
||||
free_dotso_plugins();
|
||||
#endif /* BBFDM_ENABLE_DOTSO_PLUGIN */
|
||||
}
|
||||
25
libbbfdm-api/dmplugin.h
Normal file
25
libbbfdm-api/dmplugin.h
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
* Copyright (C) 2023 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author Amin Ben Romdhane <amin.benromdhane@iopsys.eu>
|
||||
*/
|
||||
|
||||
#ifndef __DMPLUGIN_H__
|
||||
#define __DMPLUGIN_H__
|
||||
|
||||
bool find_entry_obj(DMOBJ *root_entry, char *in_param, DMOBJ **entryobj);
|
||||
|
||||
void dm_exclude_obj(DMOBJ *entryobj, DMNODE *parent_node, char *obj_path);
|
||||
|
||||
int get_entry_idx(DMOBJ *entryobj);
|
||||
int get_obj_idx(DMOBJ **entryobj);
|
||||
int get_leaf_idx(DMLEAF **entryleaf);
|
||||
|
||||
void load_plugins(struct dmctx *ctx);
|
||||
void free_plugins(DMOBJ *dm_entryobj);
|
||||
|
||||
#endif //__DMPLUGIN_H__
|
||||
|
|
@ -5,11 +5,12 @@
|
|||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author Amin Ben Romdhane <amin.benramdhane@iopsys.eu>
|
||||
* Author Amin Ben Romdhane <amin.benromdhane@iopsys.eu>
|
||||
*
|
||||
*/
|
||||
|
||||
#include "dmdynamiclibrary.h"
|
||||
#include "dotso_plugin.h"
|
||||
#include "../dmplugin.h"
|
||||
|
||||
LIST_HEAD(loaded_library_list);
|
||||
|
||||
|
|
@ -22,13 +23,15 @@ struct loaded_library
|
|||
static void add_list_loaded_libraries(struct list_head *library_list, void *library)
|
||||
{
|
||||
struct loaded_library *lib = calloc(1, sizeof(struct loaded_library));
|
||||
|
||||
list_add_tail(&lib->list, library_list);
|
||||
lib->library = library;
|
||||
}
|
||||
|
||||
static void free_all_list_open_library(struct list_head *library_list)
|
||||
{
|
||||
struct loaded_library *lib;
|
||||
struct loaded_library *lib = NULL;
|
||||
|
||||
while (library_list->next != library_list) {
|
||||
lib = list_entry(library_list->next, struct loaded_library, list);
|
||||
list_del(&lib->list);
|
||||
|
|
@ -39,41 +42,7 @@ static void free_all_list_open_library(struct list_head *library_list)
|
|||
}
|
||||
}
|
||||
|
||||
static void dm_browse_node_dynamic_object_tree(DMNODE *parent_node, DMOBJ *entryobj)
|
||||
{
|
||||
for (; (entryobj && entryobj->obj); entryobj++) {
|
||||
|
||||
if (entryobj->nextdynamicobj) {
|
||||
struct dm_dynamic_obj *next_dyn_array = entryobj->nextdynamicobj + INDX_LIBRARY_MOUNT;
|
||||
FREE(next_dyn_array->nextobj);
|
||||
}
|
||||
|
||||
if (entryobj->dynamicleaf) {
|
||||
struct dm_dynamic_leaf *next_dyn_array = entryobj->dynamicleaf + INDX_LIBRARY_MOUNT;
|
||||
FREE(next_dyn_array->nextleaf);
|
||||
}
|
||||
|
||||
DMNODE node = {0};
|
||||
node.obj = entryobj;
|
||||
node.parent = parent_node;
|
||||
node.instance_level = parent_node->instance_level;
|
||||
node.matched = parent_node->matched;
|
||||
|
||||
if (entryobj->nextobj)
|
||||
dm_browse_node_dynamic_object_tree(&node, entryobj->nextobj);
|
||||
}
|
||||
}
|
||||
|
||||
void free_library_dynamic_arrays(DMOBJ *dm_entryobj)
|
||||
{
|
||||
DMOBJ *root = dm_entryobj;
|
||||
DMNODE node = {.current_object = ""};
|
||||
|
||||
free_all_list_open_library(&loaded_library_list);
|
||||
dm_browse_node_dynamic_object_tree(&node, root);
|
||||
}
|
||||
|
||||
int load_library_dynamic_arrays(struct dmctx *ctx)
|
||||
int load_dotso_plugins(struct dmctx *ctx)
|
||||
{
|
||||
struct dirent *ent = NULL;
|
||||
DIR *dir = NULL;
|
||||
|
|
@ -101,7 +70,7 @@ int load_library_dynamic_arrays(struct dmctx *ctx)
|
|||
for (int i = 0; dynamic_obj[i].path; i++) {
|
||||
|
||||
DMOBJ *dm_entryobj = NULL;
|
||||
bool obj_exists = find_root_entry(ctx, dynamic_obj[i].path, &dm_entryobj);
|
||||
bool obj_exists = find_entry_obj(ctx->dm_entryobj, dynamic_obj[i].path, &dm_entryobj);
|
||||
if (obj_exists == false || !dm_entryobj)
|
||||
continue;
|
||||
|
||||
|
|
@ -118,7 +87,7 @@ int load_library_dynamic_arrays(struct dmctx *ctx)
|
|||
dm_entryobj->nextdynamicobj[INDX_LIBRARY_MOUNT].nextobj = calloc(2, sizeof(DMOBJ *));
|
||||
dm_entryobj->nextdynamicobj[INDX_LIBRARY_MOUNT].nextobj[0] = dynamic_obj[i].root_obj;
|
||||
} else {
|
||||
int idx = get_obj_idx_dynamic_array(dm_entryobj->nextdynamicobj[INDX_LIBRARY_MOUNT].nextobj);
|
||||
int idx = get_obj_idx(dm_entryobj->nextdynamicobj[INDX_LIBRARY_MOUNT].nextobj);
|
||||
dm_entryobj->nextdynamicobj[INDX_LIBRARY_MOUNT].nextobj = realloc(dm_entryobj->nextdynamicobj[INDX_LIBRARY_MOUNT].nextobj, (idx + 2) * sizeof(DMOBJ *));
|
||||
dm_entryobj->nextdynamicobj[INDX_LIBRARY_MOUNT].nextobj[idx] = dynamic_obj[i].root_obj;
|
||||
dm_entryobj->nextdynamicobj[INDX_LIBRARY_MOUNT].nextobj[idx+1] = NULL;
|
||||
|
|
@ -139,7 +108,7 @@ int load_library_dynamic_arrays(struct dmctx *ctx)
|
|||
dm_entryobj->dynamicleaf[INDX_LIBRARY_MOUNT].nextleaf = calloc(2, sizeof(DMLEAF *));
|
||||
dm_entryobj->dynamicleaf[INDX_LIBRARY_MOUNT].nextleaf[0] = dynamic_obj[i].root_leaf;
|
||||
} else {
|
||||
int idx = get_leaf_idx_dynamic_array(dm_entryobj->dynamicleaf[INDX_LIBRARY_MOUNT].nextleaf);
|
||||
int idx = get_leaf_idx(dm_entryobj->dynamicleaf[INDX_LIBRARY_MOUNT].nextleaf);
|
||||
dm_entryobj->dynamicleaf[INDX_LIBRARY_MOUNT].nextleaf = realloc(dm_entryobj->dynamicleaf[INDX_LIBRARY_MOUNT].nextleaf, (idx + 2) * sizeof(DMLEAF *));
|
||||
dm_entryobj->dynamicleaf[INDX_LIBRARY_MOUNT].nextleaf[idx] = dynamic_obj[i].root_leaf;
|
||||
dm_entryobj->dynamicleaf[INDX_LIBRARY_MOUNT].nextleaf[idx+1] = NULL;
|
||||
|
|
@ -156,3 +125,9 @@ int load_library_dynamic_arrays(struct dmctx *ctx)
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int free_dotso_plugins(void)
|
||||
{
|
||||
free_all_list_open_library(&loaded_library_list);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -9,14 +9,14 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#ifndef __DMENTRYLIBRARY_H__
|
||||
#define __DMENTRYLIBRARY_H__
|
||||
#ifndef __DOTSO_PLUGIN_H__
|
||||
#define __DOTSO_PLUGIN_H__
|
||||
|
||||
#include "../dmcommon.h"
|
||||
|
||||
#define LIBRARY_FOLDER_PATH "/usr/lib/bbfdm"
|
||||
|
||||
int load_library_dynamic_arrays(struct dmctx *ctx);
|
||||
void free_library_dynamic_arrays(DMOBJ *dm_entryobj);
|
||||
int load_dotso_plugins(struct dmctx *ctx);
|
||||
int free_dotso_plugins(void);
|
||||
|
||||
#endif //__DMENTRYLIBRARY_H__
|
||||
#endif //__DOTSO_PLUGIN_H__
|
||||
|
|
@ -1,15 +1,16 @@
|
|||
/*
|
||||
* Copyright (C) 2021 iopsys Software Solutions AB
|
||||
* Copyright (C) 2023 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
* Author Amin Ben Romdhane <amin.benromdhane@iopsys.eu>
|
||||
*
|
||||
*/
|
||||
|
||||
#include "dmdynamicjson.h"
|
||||
#include "json_plugin.h"
|
||||
#include "../dmplugin.h"
|
||||
|
||||
#define MAX_DM_LENGTH (1024)
|
||||
#define json_object_get_string(x) (char *)json_object_get_string(x)
|
||||
|
|
@ -92,6 +93,7 @@ static void free_json_data(struct list_head *json_list)
|
|||
void save_loaded_json_files(struct list_head *json_list, json_object *data)
|
||||
{
|
||||
struct loaded_json_file *json_file = calloc(1, sizeof(struct loaded_json_file));
|
||||
|
||||
list_add_tail(&json_file->list, json_list);
|
||||
json_file->data = data;
|
||||
}
|
||||
|
|
@ -108,51 +110,6 @@ static void free_loaded_json_files(struct list_head *json_list)
|
|||
}
|
||||
}
|
||||
|
||||
static void dm_browse_node_json_object_tree(DMNODE *parent_node, DMOBJ *entryobj)
|
||||
{
|
||||
for (; (entryobj && entryobj->obj); entryobj++) {
|
||||
|
||||
if (entryobj->nextdynamicobj) {
|
||||
struct dm_dynamic_obj *next_dyn_array = entryobj->nextdynamicobj + INDX_JSON_MOUNT;
|
||||
FREE(next_dyn_array->nextobj);
|
||||
}
|
||||
|
||||
DMNODE node = {0};
|
||||
node.obj = entryobj;
|
||||
node.parent = parent_node;
|
||||
node.instance_level = parent_node->instance_level;
|
||||
node.matched = parent_node->matched;
|
||||
|
||||
if (entryobj->nextobj)
|
||||
dm_browse_node_json_object_tree(&node, entryobj->nextobj);
|
||||
}
|
||||
}
|
||||
|
||||
static void free_node_object_tree_dynamic_array(DMOBJ *dm_entryobj)
|
||||
{
|
||||
DMOBJ *root = dm_entryobj;
|
||||
DMNODE node = {.current_object = ""};
|
||||
|
||||
dm_browse_node_json_object_tree(&node, root);
|
||||
}
|
||||
|
||||
int free_json_dynamic_arrays(DMOBJ *dm_entryobj)
|
||||
{
|
||||
free_loaded_json_files(&loaded_json_files);
|
||||
free_json_data(&json_list);
|
||||
dm_dynamic_cleanmem(&json_memhead);
|
||||
free_node_object_tree_dynamic_array(dm_entryobj);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int free_json_loaded_object(void)
|
||||
{
|
||||
free_loaded_json_files(&loaded_json_files);
|
||||
free_json_data(&json_list);
|
||||
dm_dynamic_cleanmem(&json_memhead);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void find_prefix_obj(char *full_obj, char *prefix_obj, size_t len)
|
||||
{
|
||||
int last_occurent = 0, occur = 0;
|
||||
|
|
@ -207,15 +164,6 @@ static void generate_path_without_instance(char *full_obj, bool is_obj, char *ob
|
|||
obj_path[pos - 1] = 0;
|
||||
}
|
||||
|
||||
static int get_index_of_available_entry(DMOBJ *jentryobj)
|
||||
{
|
||||
int idx = 0;
|
||||
for (; (jentryobj && jentryobj->obj); jentryobj++) {
|
||||
idx++;
|
||||
}
|
||||
return idx;
|
||||
}
|
||||
|
||||
static json_object *get_requested_json_obj(json_object *json_obj, char *instance, const char *key, char *arr_name, size_t arr_len)
|
||||
{
|
||||
struct json_object *res = json_obj;
|
||||
|
|
@ -1927,7 +1875,7 @@ void parse_obj(char *object, json_object *jobj, DMOBJ *pobj, int index, int json
|
|||
FREE(full_obj);
|
||||
}
|
||||
|
||||
int load_json_dynamic_arrays(struct dmctx *ctx)
|
||||
int load_json_plugins(struct dmctx *ctx)
|
||||
{
|
||||
struct dirent *ent = NULL;
|
||||
DIR *dir = NULL;
|
||||
|
|
@ -1961,7 +1909,7 @@ int load_json_dynamic_arrays(struct dmctx *ctx)
|
|||
char *obj_path = replace_str(key, "{BBF_VENDOR_PREFIX}", BBF_VENDOR_PREFIX);
|
||||
find_prefix_obj(obj_path, obj_prefix, MAX_DM_LENGTH);
|
||||
|
||||
bool obj_exists = find_root_entry(ctx, obj_prefix, &dm_entryobj);
|
||||
bool obj_exists = find_entry_obj(ctx->dm_entryobj, obj_prefix, &dm_entryobj);
|
||||
if (obj_exists == 0 || !dm_entryobj) {
|
||||
FREE(obj_path);
|
||||
continue;
|
||||
|
|
@ -1972,6 +1920,7 @@ int load_json_dynamic_arrays(struct dmctx *ctx)
|
|||
dm_entryobj->nextdynamicobj[INDX_JSON_MOUNT].idx_type = INDX_JSON_MOUNT;
|
||||
dm_entryobj->nextdynamicobj[INDX_LIBRARY_MOUNT].idx_type = INDX_LIBRARY_MOUNT;
|
||||
dm_entryobj->nextdynamicobj[INDX_VENDOR_MOUNT].idx_type = INDX_VENDOR_MOUNT;
|
||||
dm_entryobj->nextdynamicobj[INDX_SERVICE_MOUNT].idx_type = INDX_SERVICE_MOUNT;
|
||||
}
|
||||
|
||||
if (dm_entryobj->nextdynamicobj[INDX_JSON_MOUNT].nextobj == NULL) {
|
||||
|
|
@ -1982,7 +1931,7 @@ int load_json_dynamic_arrays(struct dmctx *ctx)
|
|||
dm_entryobj->nextdynamicobj[INDX_JSON_MOUNT].nextobj[0] = dm_dynamic_calloc(&json_memhead, 2, sizeof(struct dm_obj_s));
|
||||
parse_obj(obj_path, jobj, dm_entryobj->nextdynamicobj[INDX_JSON_MOUNT].nextobj[0], 0, json_plugin_version, &json_list);
|
||||
} else {
|
||||
int idx = get_index_of_available_entry(dm_entryobj->nextdynamicobj[INDX_JSON_MOUNT].nextobj[0]);
|
||||
int idx = get_entry_idx(dm_entryobj->nextdynamicobj[INDX_JSON_MOUNT].nextobj[0]);
|
||||
dm_entryobj->nextdynamicobj[INDX_JSON_MOUNT].nextobj[0] = dm_dynamic_realloc(&json_memhead, dm_entryobj->nextdynamicobj[INDX_JSON_MOUNT].nextobj[0], (idx + 2) * sizeof(struct dm_obj_s));
|
||||
memset(dm_entryobj->nextdynamicobj[INDX_JSON_MOUNT].nextobj[0] + (idx + 1), 0, sizeof(struct dm_obj_s));
|
||||
parse_obj(obj_path, jobj, dm_entryobj->nextdynamicobj[INDX_JSON_MOUNT].nextobj[0], idx, json_plugin_version, &json_list);
|
||||
|
|
@ -1996,3 +1945,12 @@ int load_json_dynamic_arrays(struct dmctx *ctx)
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int free_json_plugins(void)
|
||||
{
|
||||
free_loaded_json_files(&loaded_json_files);
|
||||
free_json_data(&json_list);
|
||||
dm_dynamic_cleanmem(&json_memhead);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1,11 +1,11 @@
|
|||
/*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
* Copyright (C) 2023 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
* Author Amin Ben Romdhane <amin.benromdhane@iopsys.eu>
|
||||
*
|
||||
*/
|
||||
|
||||
|
|
@ -19,10 +19,8 @@
|
|||
void save_loaded_json_files(struct list_head *json_list, json_object *data);
|
||||
void parse_obj(char *object, json_object *jobj, DMOBJ *pobj, int index, int json_version, struct list_head *list);
|
||||
void find_prefix_obj(char *full_obj, char *prefix_obj, size_t len);
|
||||
int free_json_loaded_object(void);
|
||||
|
||||
|
||||
int load_json_dynamic_arrays(struct dmctx *ctx);
|
||||
int free_json_dynamic_arrays(DMOBJ *dm_entryobj);
|
||||
int load_json_plugins(struct dmctx *ctx);
|
||||
int free_json_plugins(void);
|
||||
|
||||
#endif //__DMENTRYJSON_H__
|
||||
|
|
@ -1,48 +1,16 @@
|
|||
/*
|
||||
* Copyright (C) 2021 iopsys Software Solutions AB
|
||||
* Copyright (C) 2023 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
* Author Amin Ben Romdhane <amin.benromdhane@iopsys.eu>
|
||||
*
|
||||
*/
|
||||
|
||||
#include "dmdynamicvendor.h"
|
||||
|
||||
static void dm_browse_node_vendor_object_tree(DMNODE *parent_node, DMOBJ *entryobj)
|
||||
{
|
||||
for (; (entryobj && entryobj->obj); entryobj++) {
|
||||
|
||||
if (entryobj->nextdynamicobj) {
|
||||
struct dm_dynamic_obj *next_dyn_array = entryobj->nextdynamicobj + INDX_VENDOR_MOUNT;
|
||||
FREE(next_dyn_array->nextobj);
|
||||
}
|
||||
|
||||
if (entryobj->dynamicleaf) {
|
||||
struct dm_dynamic_leaf *next_dyn_array = entryobj->dynamicleaf + INDX_VENDOR_MOUNT;
|
||||
FREE(next_dyn_array->nextleaf);
|
||||
}
|
||||
|
||||
DMNODE node = {0};
|
||||
node.obj = entryobj;
|
||||
node.parent = parent_node;
|
||||
node.instance_level = parent_node->instance_level;
|
||||
node.matched = parent_node->matched;
|
||||
|
||||
if (entryobj->nextobj)
|
||||
dm_browse_node_vendor_object_tree(&node, entryobj->nextobj);
|
||||
}
|
||||
}
|
||||
|
||||
void free_vendor_dynamic_arrays(DMOBJ *dm_entryobj)
|
||||
{
|
||||
DMOBJ *root = dm_entryobj;
|
||||
DMNODE node = {.current_object = ""};
|
||||
|
||||
dm_browse_node_vendor_object_tree(&node, root);
|
||||
}
|
||||
#include "vendor_plugin.h"
|
||||
#include "../dmplugin.h"
|
||||
|
||||
static void overwrite_param(DMOBJ *entryobj, DMLEAF *leaf)
|
||||
{
|
||||
|
|
@ -120,7 +88,7 @@ static void load_vendor_extension_arrays(struct dmctx *ctx)
|
|||
for (int i = 0; vendor_obj[i].path; i++) {
|
||||
|
||||
DMOBJ *dm_entryobj = NULL;
|
||||
bool obj_exists = find_root_entry(ctx, vendor_obj[i].path, &dm_entryobj);
|
||||
bool obj_exists = find_entry_obj(ctx->dm_entryobj, vendor_obj[i].path, &dm_entryobj);
|
||||
if (obj_exists == false || !dm_entryobj)
|
||||
continue;
|
||||
|
||||
|
|
@ -130,13 +98,14 @@ static void load_vendor_extension_arrays(struct dmctx *ctx)
|
|||
dm_entryobj->nextdynamicobj[INDX_JSON_MOUNT].idx_type = INDX_JSON_MOUNT;
|
||||
dm_entryobj->nextdynamicobj[INDX_LIBRARY_MOUNT].idx_type = INDX_LIBRARY_MOUNT;
|
||||
dm_entryobj->nextdynamicobj[INDX_VENDOR_MOUNT].idx_type = INDX_VENDOR_MOUNT;
|
||||
dm_entryobj->nextdynamicobj[INDX_SERVICE_MOUNT].idx_type = INDX_SERVICE_MOUNT;
|
||||
}
|
||||
|
||||
if (dm_entryobj->nextdynamicobj[INDX_VENDOR_MOUNT].nextobj == NULL) {
|
||||
dm_entryobj->nextdynamicobj[INDX_VENDOR_MOUNT].nextobj = calloc(2, sizeof(DMOBJ *));
|
||||
dm_entryobj->nextdynamicobj[INDX_VENDOR_MOUNT].nextobj[0] = vendor_obj[i].root_obj;
|
||||
} else {
|
||||
int obj_idx = get_obj_idx_dynamic_array(dm_entryobj->nextdynamicobj[INDX_VENDOR_MOUNT].nextobj);
|
||||
int obj_idx = get_obj_idx(dm_entryobj->nextdynamicobj[INDX_VENDOR_MOUNT].nextobj);
|
||||
dm_entryobj->nextdynamicobj[INDX_VENDOR_MOUNT].nextobj = realloc(dm_entryobj->nextdynamicobj[INDX_VENDOR_MOUNT].nextobj, (obj_idx + 2) * sizeof(DMOBJ *));
|
||||
dm_entryobj->nextdynamicobj[INDX_VENDOR_MOUNT].nextobj[obj_idx] = vendor_obj[i].root_obj;
|
||||
dm_entryobj->nextdynamicobj[INDX_VENDOR_MOUNT].nextobj[obj_idx+1] = NULL;
|
||||
|
|
@ -155,7 +124,7 @@ static void load_vendor_extension_arrays(struct dmctx *ctx)
|
|||
dm_entryobj->dynamicleaf[INDX_VENDOR_MOUNT].nextleaf = calloc(2, sizeof(DMLEAF *));
|
||||
dm_entryobj->dynamicleaf[INDX_VENDOR_MOUNT].nextleaf[0] = vendor_obj[i].root_leaf;
|
||||
} else {
|
||||
int leaf_idx = get_leaf_idx_dynamic_array(dm_entryobj->dynamicleaf[INDX_VENDOR_MOUNT].nextleaf);
|
||||
int leaf_idx = get_leaf_idx(dm_entryobj->dynamicleaf[INDX_VENDOR_MOUNT].nextleaf);
|
||||
dm_entryobj->dynamicleaf[INDX_VENDOR_MOUNT].nextleaf = realloc(dm_entryobj->dynamicleaf[INDX_VENDOR_MOUNT].nextleaf, (leaf_idx + 2) * sizeof(DMLEAF *));
|
||||
dm_entryobj->dynamicleaf[INDX_VENDOR_MOUNT].nextleaf[leaf_idx] = vendor_obj[i].root_leaf;
|
||||
dm_entryobj->dynamicleaf[INDX_VENDOR_MOUNT].nextleaf[leaf_idx+1] = NULL;
|
||||
|
|
@ -192,7 +161,7 @@ static void load_vendor_extension_overwrite_arrays(struct dmctx *ctx)
|
|||
|
||||
for (int i = 0; dynamic_overwrite_obj[i].path; i++) {
|
||||
|
||||
bool obj_exists = find_root_entry(ctx, dynamic_overwrite_obj[i].path, &dm_entryobj);
|
||||
bool obj_exists = find_entry_obj(ctx->dm_entryobj, dynamic_overwrite_obj[i].path, &dm_entryobj);
|
||||
if (obj_exists == false || !dm_entryobj)
|
||||
continue;
|
||||
|
||||
|
|
@ -220,11 +189,10 @@ static void load_vendor_extension_overwrite_arrays(struct dmctx *ctx)
|
|||
|
||||
static void exclude_obj(struct dmctx *ctx, char *in_obj)
|
||||
{
|
||||
DMOBJ *root = ctx->dm_entryobj;
|
||||
DMNODE node = {.current_object = ""};
|
||||
|
||||
char *obj_path = replace_str(in_obj, ".{i}.", ".");
|
||||
dm_exclude_obj(ctx, &node, root, obj_path);
|
||||
dm_exclude_obj(ctx->dm_entryobj, &node, obj_path);
|
||||
FREE(obj_path);
|
||||
}
|
||||
|
||||
|
|
@ -240,7 +208,7 @@ static void exclude_param(struct dmctx *ctx, char *in_param)
|
|||
if (ret)
|
||||
DM_STRNCPY(obj_prefix, in_param, ret - in_param + 2);
|
||||
|
||||
bool obj_exists = find_root_entry(ctx, obj_prefix, &entryobj);
|
||||
bool obj_exists = find_entry_obj(ctx->dm_entryobj, obj_prefix, &entryobj);
|
||||
|
||||
if (entryobj && obj_exists == true) {
|
||||
DMLEAF *leaf = entryobj->leaf;
|
||||
|
|
@ -1,20 +1,19 @@
|
|||
/*
|
||||
* Copyright (C) 2021 iopsys Software Solutions AB
|
||||
* Copyright (C) 2023 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
* Author Amin Ben Romdhane <amin.benromdhane@iopsys.eu>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __DMENTRYVENDOR_H__
|
||||
#define __DMENTRYVENDOR_H__
|
||||
#ifndef __VENDOR_PLUGIN_H__
|
||||
#define __VENDOR_PLUGIN_H__
|
||||
|
||||
#include "../dmcommon.h"
|
||||
|
||||
void load_vendor_dynamic_arrays(struct dmctx *ctx);
|
||||
void free_vendor_dynamic_arrays(DMOBJ *dm_entryobj);
|
||||
|
||||
#endif //__DMENTRYVENDOR_H__
|
||||
#endif //__VENDOR_PLUGIN_H__
|
||||
|
|
@ -13,6 +13,7 @@ OPTION(BBF_TR104 "build with tr104 datamodel" ON)
|
|||
OPTION(BBF_TR143 "build with tr143 datamodel" ON)
|
||||
OPTION(BBF_TR471 "build with tr471 datamodel" ON)
|
||||
OPTION(BBF_VENDOR_EXTENSION "build with vendor extension enabled" ON)
|
||||
OPTION(BBF_WIFI_DATAELEMENTS "build with wifi dataelements datamodel" ON)
|
||||
OPTION(WITH_WOLFSSL "build with lib wolfssl" OFF)
|
||||
OPTION(WITH_OPENSSL "build with lib openssl" OFF)
|
||||
OPTION(WITH_MBEDTLS "build with lib mbedtls" OFF)
|
||||
|
|
@ -27,6 +28,9 @@ IF(BBF_TR181)
|
|||
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}/dmtree/tr181")
|
||||
FILE(GLOB BBF_TR181_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/dmtree/tr181/*.c)
|
||||
add_compile_definitions(BBF_TR181)
|
||||
IF(BBF_WIFI_DATAELEMENTS)
|
||||
add_compile_definitions(BBF_WIFI_DATAELEMENTS)
|
||||
ENDIF(BBF_WIFI_DATAELEMENTS)
|
||||
ENDIF(BBF_TR181)
|
||||
|
||||
IF(BBF_TR104)
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
4014
libbbfdm/dmtree/tr181/wifi.dataelements.c
Normal file
4014
libbbfdm/dmtree/tr181/wifi.dataelements.c
Normal file
File diff suppressed because it is too large
Load diff
97
libbbfdm/dmtree/tr181/wifi.dataelements.h
Normal file
97
libbbfdm/dmtree/tr181/wifi.dataelements.h
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
/*
|
||||
* Copyright (C) 2023 IOPSYS Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Amin Ben Romdhane <amin.benromdhane@iopsys.eu>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __WIFI_DATAELEMENTS_H
|
||||
#define __WIFI_DATAELEMENTS_H
|
||||
|
||||
#include "libbbfdm-api/dmcommon.h"
|
||||
|
||||
extern DMOBJ tWiFiDataElementsObj[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkSSIDParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkMultiAPSteeringSummaryStatsParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceDefault8021QParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceSSIDtoVIDMappingParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceCACStatusObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceCACStatusParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceCACStatusCACAvailableChannelParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceCACStatusCACNonOccupancyChannelParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceCACStatusCACActiveChannelParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceSPRuleParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceIEEE1905SecurityParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceAnticipatedChannelsParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceAnticipatedChannelUsageObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceAnticipatedChannelUsageParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceAnticipatedChannelUsageEntryParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceMultiAPDeviceObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceMultiAPDeviceParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceMultiAPDeviceBackhaulObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceMultiAPDeviceBackhaulParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceMultiAPDeviceBackhaulCurrentOperatingClassProfileParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceMultiAPDeviceBackhaulStatsParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceRadioObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceRadioScanResultObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioScanResultParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanNeighborBSSParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioBackhaulStaParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceRadioScanCapabilityObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioScanCapabilityParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioScanCapabilityOpClassChannelsParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceRadioCACCapabilityObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioCACCapabilityParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethodObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethodParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethodOpClassChannelsParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceRadioCapabilitiesObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioCapabilitiesParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioCapabilitiesWiFi6APRoleParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioCapabilitiesWiFi6bSTARoleParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioCapabilitiesAKMFrontHaulParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioCapabilitiesAKMBackhaulParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioCapabilitiesCapableOperatingClassProfileParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioCurrentOperatingClassProfileParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioDisAllowedOpClassChannelsParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioSpatialReuseParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceRadioBSSObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioBSSParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioBSSQMDescriptorParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioBSSMultiAPSteeringParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceRadioBSSSTAObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioBSSSTAParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceRadioBSSSTAMultiAPSTAObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioBSSSTAMultiAPSTAParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioBSSSTAMultiAPSTASteeringSummaryStatsParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioBSSSTAMultiAPSTASteeringHistoryParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioBSSSTAWiFi6CapabilitiesParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioBSSSTATIDQueueSizesParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioUnassociatedSTAParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioMultiAPRadioParams[];
|
||||
extern DMOBJ tWiFiDataElementsAssociationEventObj[];
|
||||
extern DMLEAF tWiFiDataElementsAssociationEventParams[];
|
||||
extern DMOBJ tWiFiDataElementsAssociationEventAssociationEventDataObj[];
|
||||
extern DMLEAF tWiFiDataElementsAssociationEventAssociationEventDataParams[];
|
||||
extern DMLEAF tWiFiDataElementsAssociationEventAssociationEventDataWiFi6CapabilitiesParams[];
|
||||
extern DMOBJ tWiFiDataElementsDisassociationEventObj[];
|
||||
extern DMLEAF tWiFiDataElementsDisassociationEventParams[];
|
||||
extern DMLEAF tWiFiDataElementsDisassociationEventDisassociationEventDataParams[];
|
||||
extern DMOBJ tWiFiDataElementsFailedConnectionEventObj[];
|
||||
extern DMLEAF tWiFiDataElementsFailedConnectionEventParams[];
|
||||
extern DMLEAF tWiFiDataElementsFailedConnectionEventFailedConnectionEventDataParams[];
|
||||
|
||||
#endif //__WIFI_DATAELEMENTS_H
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2019 iopsys Software Solutions AB
|
||||
* Copyright (C) 2023 IOPSYS Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
|
|
@ -41,85 +41,6 @@ extern DMLEAF tWiFiEndPointWPSParams[];
|
|||
extern DMOBJ tWiFiEndPointProfileObj[];
|
||||
extern DMLEAF tWiFiEndPointProfileParams[];
|
||||
extern DMLEAF tWiFiEndPointProfileSecurityParams[];
|
||||
extern DMOBJ tWiFiDataElementsObj[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkSSIDParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkMultiAPSteeringSummaryStatsParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceDefault8021QParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceSSIDtoVIDMappingParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceCACStatusObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceCACStatusParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceCACStatusCACAvailableChannelParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceCACStatusCACNonOccupancyChannelParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceCACStatusCACActiveChannelParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceSPRuleParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceIEEE1905SecurityParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceAnticipatedChannelsParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceAnticipatedChannelUsageObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceAnticipatedChannelUsageParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceAnticipatedChannelUsageEntryParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceMultiAPDeviceObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceMultiAPDeviceParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceMultiAPDeviceBackhaulObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceMultiAPDeviceBackhaulParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceMultiAPDeviceBackhaulCurrentOperatingClassProfileParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceMultiAPDeviceBackhaulStatsParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceRadioObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceRadioScanResultObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioScanResultParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanNeighborBSSParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioBackhaulStaParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceRadioScanCapabilityObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioScanCapabilityParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioScanCapabilityOpClassChannelsParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceRadioCACCapabilityObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioCACCapabilityParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethodObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethodParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethodOpClassChannelsParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceRadioCapabilitiesObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioCapabilitiesParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioCapabilitiesWiFi6APRoleParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioCapabilitiesWiFi6bSTARoleParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioCapabilitiesAKMFrontHaulParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioCapabilitiesAKMBackhaulParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioCapabilitiesCapableOperatingClassProfileParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioCurrentOperatingClassProfileParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioDisAllowedOpClassChannelsParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioSpatialReuseParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceRadioBSSObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioBSSParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioBSSQMDescriptorParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioBSSMultiAPSteeringParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceRadioBSSSTAObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioBSSSTAParams[];
|
||||
extern DMOBJ tWiFiDataElementsNetworkDeviceRadioBSSSTAMultiAPSTAObj[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioBSSSTAMultiAPSTAParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioBSSSTAMultiAPSTASteeringSummaryStatsParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioBSSSTAMultiAPSTASteeringHistoryParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioBSSSTAWiFi6CapabilitiesParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioBSSSTATIDQueueSizesParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioUnassociatedSTAParams[];
|
||||
extern DMLEAF tWiFiDataElementsNetworkDeviceRadioMultiAPRadioParams[];
|
||||
extern DMOBJ tWiFiDataElementsAssociationEventObj[];
|
||||
extern DMLEAF tWiFiDataElementsAssociationEventParams[];
|
||||
extern DMOBJ tWiFiDataElementsAssociationEventAssociationEventDataObj[];
|
||||
extern DMLEAF tWiFiDataElementsAssociationEventAssociationEventDataParams[];
|
||||
extern DMLEAF tWiFiDataElementsAssociationEventAssociationEventDataWiFi6CapabilitiesParams[];
|
||||
extern DMOBJ tWiFiDataElementsDisassociationEventObj[];
|
||||
extern DMLEAF tWiFiDataElementsDisassociationEventParams[];
|
||||
extern DMLEAF tWiFiDataElementsDisassociationEventDisassociationEventDataParams[];
|
||||
extern DMOBJ tWiFiDataElementsFailedConnectionEventObj[];
|
||||
extern DMLEAF tWiFiDataElementsFailedConnectionEventParams[];
|
||||
extern DMLEAF tWiFiDataElementsFailedConnectionEventFailedConnectionEventDataParams[];
|
||||
extern DMLEAF tWiFiEndPointStatsParams[];
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -13,4 +13,4 @@ $(LIB): $(LIB_OBJS)
|
|||
$(CC) $(LIB_CFLAGS) $(LIB_LDFLAGS) -shared -o $@ $^
|
||||
|
||||
clean:
|
||||
rm -fv *.o $(LIB)
|
||||
rm -fv *.o $(LIB)
|
||||
|
|
@ -23,7 +23,7 @@ static int setup(void **state)
|
|||
if (!ctx)
|
||||
return -1;
|
||||
|
||||
bbf_ctx_init(ctx, TR181_ROOT_TREE, TR181_VENDOR_EXTENSION, TR181_VENDOR_EXTENSION_EXCLUDE);
|
||||
bbf_ctx_init(ctx, TR181_ROOT_TREE, TR181_VENDOR_EXTENSION, TR181_VENDOR_EXTENSION_EXCLUDE, NULL);
|
||||
|
||||
// Enable Plugins
|
||||
ctx->enable_plugins = true;
|
||||
|
|
@ -1465,7 +1465,7 @@ static void test_api_bbfdm_valid_library_event(void **state)
|
|||
idx++;
|
||||
}
|
||||
|
||||
assert_int_equal(idx, 9);
|
||||
assert_int_equal(idx, 7);
|
||||
}
|
||||
|
||||
static void test_api_bbfdm_valid_json_event(void **state)
|
||||
|
|
@ -1512,7 +1512,7 @@ static void test_api_bbfdm_valid_json_event(void **state)
|
|||
idx++;
|
||||
}
|
||||
|
||||
assert_int_equal(idx, 9);
|
||||
assert_int_equal(idx, 7);
|
||||
}
|
||||
|
||||
static void test_api_bbfdm_valid_json_v1_event(void **state)
|
||||
|
|
@ -1561,7 +1561,7 @@ static void test_api_bbfdm_valid_json_v1_event(void **state)
|
|||
idx++;
|
||||
}
|
||||
|
||||
assert_int_equal(idx, 9);
|
||||
assert_int_equal(idx, 7);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ static int setup(void **state)
|
|||
if (!ctx)
|
||||
return -1;
|
||||
|
||||
bbf_ctx_init(ctx, TR181_ROOT_TREE, TR181_VENDOR_EXTENSION, TR181_VENDOR_EXTENSION_EXCLUDE);
|
||||
bbf_ctx_init(ctx, TR181_ROOT_TREE, TR181_VENDOR_EXTENSION, TR181_VENDOR_EXTENSION_EXCLUDE, NULL);
|
||||
|
||||
// Enable Plugins
|
||||
ctx->enable_plugins = true;
|
||||
|
|
@ -594,7 +594,7 @@ static void test_api_bbfdm_json_get_value(void **state)
|
|||
assert_true(&first_entry->list != &ctx->list_parameter);
|
||||
|
||||
bbf_ctx_clean_sub(ctx);
|
||||
bbf_ctx_init(ctx, TR181_ROOT_TREE, TR181_VENDOR_EXTENSION, TR181_VENDOR_EXTENSION_EXCLUDE);
|
||||
bbf_ctx_init(ctx, TR181_ROOT_TREE, TR181_VENDOR_EXTENSION, TR181_VENDOR_EXTENSION_EXCLUDE, NULL);
|
||||
|
||||
// Enable Plugins
|
||||
ctx->enable_plugins = true;
|
||||
|
|
@ -610,7 +610,7 @@ static void test_api_bbfdm_json_get_value(void **state)
|
|||
assert_true(&first_entry->list != &ctx->list_parameter);
|
||||
|
||||
bbf_ctx_clean_sub(ctx);
|
||||
bbf_ctx_init(ctx, TR181_ROOT_TREE, TR181_VENDOR_EXTENSION, TR181_VENDOR_EXTENSION_EXCLUDE);
|
||||
bbf_ctx_init(ctx, TR181_ROOT_TREE, TR181_VENDOR_EXTENSION, TR181_VENDOR_EXTENSION_EXCLUDE, NULL);
|
||||
|
||||
// Enable Plugins
|
||||
ctx->enable_plugins = true;
|
||||
|
|
@ -690,7 +690,7 @@ static void test_api_bbfdm_library_get_value(void **state)
|
|||
assert_true(&first_entry->list != &ctx->list_parameter);
|
||||
|
||||
bbf_ctx_clean_sub(ctx);
|
||||
bbf_ctx_init(ctx, TR181_ROOT_TREE, TR181_VENDOR_EXTENSION, TR181_VENDOR_EXTENSION_EXCLUDE);
|
||||
bbf_ctx_init(ctx, TR181_ROOT_TREE, TR181_VENDOR_EXTENSION, TR181_VENDOR_EXTENSION_EXCLUDE, NULL);
|
||||
|
||||
// Enable Plugins
|
||||
ctx->enable_plugins = true;
|
||||
|
|
@ -704,7 +704,7 @@ static void test_api_bbfdm_library_get_value(void **state)
|
|||
assert_true(&first_entry->list != &ctx->list_parameter);
|
||||
|
||||
bbf_ctx_clean_sub(ctx);
|
||||
bbf_ctx_init(ctx, TR181_ROOT_TREE, TR181_VENDOR_EXTENSION, TR181_VENDOR_EXTENSION_EXCLUDE);
|
||||
bbf_ctx_init(ctx, TR181_ROOT_TREE, TR181_VENDOR_EXTENSION, TR181_VENDOR_EXTENSION_EXCLUDE, NULL);
|
||||
|
||||
// Enable Plugins
|
||||
ctx->enable_plugins = true;
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
{
|
||||
"method": "get",
|
||||
"args": {
|
||||
"path":"Device.Users.User.*.Alias",
|
||||
"path":"Device.WiFi.SSID.*.Alias",
|
||||
"optional": {"format":"raw", "proto":"cwmp"}
|
||||
},
|
||||
"rc": 0
|
||||
|
|
@ -66,7 +66,7 @@
|
|||
{
|
||||
"method": "get",
|
||||
"args": {
|
||||
"path":"Device.Users.User.*.Alias"
|
||||
"path":"Device.WiFi.SSID.*.Alias"
|
||||
},
|
||||
"rc": 0
|
||||
},
|
||||
|
|
@ -91,7 +91,7 @@
|
|||
{
|
||||
"method": "instances",
|
||||
"args": {
|
||||
"path": "Device.Users.User.",
|
||||
"path": "Device.WiFi.SSID.",
|
||||
"optional": {"format":"raw", "proto":"usp"}
|
||||
},
|
||||
"rc": 0
|
||||
|
|
@ -107,7 +107,7 @@
|
|||
{
|
||||
"method": "schema",
|
||||
"args": {
|
||||
"path": "Device.Users.User."
|
||||
"path": "Device.WiFi."
|
||||
},
|
||||
"rc": 0
|
||||
},
|
||||
|
|
@ -145,7 +145,7 @@
|
|||
{
|
||||
"method": "set",
|
||||
"args": {
|
||||
"path": "Device.Users.User.1.",
|
||||
"path": "Device.WiFi.SSID.1.",
|
||||
"obj_path": {"Alias":"test", "Enable":"1"},
|
||||
"optional":{"transaction_id":123}
|
||||
},
|
||||
|
|
|
|||
|
|
@ -9,10 +9,10 @@ ret = 1
|
|||
child = pexpect.spawn('ubus monitor')
|
||||
|
||||
# force change in schema, by removing dependency uci file
|
||||
os.rename("/etc/config/users", "/etc/config/users_1")
|
||||
os.rename("/etc/config/dropbear", "/etc/config/dropbear_1")
|
||||
|
||||
try:
|
||||
ret = child.expect('notify', timeout=35)
|
||||
ret = child.expect('notify', timeout=65)
|
||||
except:
|
||||
print("FAIL: Schema updater notification")
|
||||
|
||||
|
|
@ -23,7 +23,7 @@ if ret == 0:
|
|||
print("FAIL: Schema updater notification")
|
||||
|
||||
# Revert back uci changes
|
||||
os.rename("/etc/config/users_1", "/etc/config/users")
|
||||
os.rename("/etc/config/dropbear_1", "/etc/config/dropbear")
|
||||
|
||||
if ret == 0:
|
||||
print("PASS: Schema updater notification")
|
||||
|
|
|
|||
16
test/wifi_dataelements/Makefile
Normal file
16
test/wifi_dataelements/Makefile
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
LIB_WIFI_DATAELEMENTS = libwifi_dataelements.so
|
||||
|
||||
LIB_WIFI_DATAELEMENTS_OBJS = wifi_dataelements.o ../../libbbfdm/dmtree/tr181/wifi.dataelements.o
|
||||
LIB_CFLAGS = $(CFLAGS) -Wall -Werror -fPIC -I /usr/local/include/
|
||||
LIB_LDFLAGS = $(LDFLAGS) -lbbfdm-api
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(LIB_CFLAGS) $(FPIC) -c -o $@ $<
|
||||
|
||||
all: $(LIB_WIFI_DATAELEMENTS)
|
||||
|
||||
$(LIB_WIFI_DATAELEMENTS): $(LIB_WIFI_DATAELEMENTS_OBJS)
|
||||
$(CC) $(LIB_CFLAGS) $(LIB_LDFLAGS) -shared -o $@ $^
|
||||
|
||||
clean:
|
||||
rm -fv *.o $(LIB_WIFI_DATAELEMENTS)
|
||||
37
test/wifi_dataelements/input.json
Executable file
37
test/wifi_dataelements/input.json
Executable file
|
|
@ -0,0 +1,37 @@
|
|||
{
|
||||
"daemon": {
|
||||
"config": {
|
||||
"refresh_time": 10,
|
||||
"enable_plugins": 1
|
||||
},
|
||||
"services": [
|
||||
{
|
||||
"ubus_obj": "bbfdm.dataelements",
|
||||
"obj_mount": "Device.WiFi.",
|
||||
"obj_name": "DataElements"
|
||||
}
|
||||
],
|
||||
"input": {
|
||||
"type": "DotSo",
|
||||
"name": "/lib/libbbfdm.so"
|
||||
},
|
||||
"output": {
|
||||
"type": "UBUS",
|
||||
"name": "bbfdm"
|
||||
}
|
||||
},
|
||||
"client": {
|
||||
"config": {
|
||||
"proto": "both",
|
||||
"instance_mode": 0,
|
||||
"enable_plugins": 0
|
||||
},
|
||||
"input": {
|
||||
"type": "UBUS",
|
||||
"name": "bbfdm"
|
||||
},
|
||||
"output": {
|
||||
"type": "CLI"
|
||||
}
|
||||
}
|
||||
}
|
||||
25
test/wifi_dataelements/wifi_dataelements.c
Normal file
25
test/wifi_dataelements/wifi_dataelements.c
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
* Copyright (C) 2023 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Amin Ben Romdhane <amin.benromdhane@iopsys.eu>
|
||||
*/
|
||||
|
||||
#include "../../libbbfdm/dmtree/tr181/wifi.dataelements.h"
|
||||
|
||||
/* *** Device.WiFi. *** */
|
||||
DMOBJ tDeviceWiFiObj[] = {
|
||||
/* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/
|
||||
{"DataElements", &DMREAD, NULL, NULL, "file:/etc/init.d/decollector", NULL, NULL, NULL, tWiFiDataElementsObj, NULL, NULL, BBFDM_BOTH, NULL, "2.13"},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* ********** DynamicObj ********** */
|
||||
DM_MAP_OBJ tDynamicObj[] = {
|
||||
/* parentobj, nextobject, parameter */
|
||||
{"Device.WiFi.", tDeviceWiFiObj, NULL},
|
||||
{0}
|
||||
};
|
||||
30
test/wifi_dataelements/wifi_dataelements.json
Executable file
30
test/wifi_dataelements/wifi_dataelements.json
Executable file
|
|
@ -0,0 +1,30 @@
|
|||
{
|
||||
"daemon": {
|
||||
"config": {
|
||||
"refresh_time": 3600,
|
||||
"enable_plugins": 0
|
||||
},
|
||||
"input": {
|
||||
"type": "DotSo",
|
||||
"name": "/tmp/libwifi_dataelements.so"
|
||||
},
|
||||
"output": {
|
||||
"type": "UBUS",
|
||||
"name": "bbfdm.dataelements"
|
||||
}
|
||||
},
|
||||
"client": {
|
||||
"config": {
|
||||
"proto": "both",
|
||||
"instance_mode": 0,
|
||||
"enable_plugins": 0
|
||||
},
|
||||
"input": {
|
||||
"type": "UBUS",
|
||||
"name": "bbfdm.dataelements"
|
||||
},
|
||||
"output": {
|
||||
"type": "CLI"
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue