aboutsummaryrefslogtreecommitdiffstats
path: root/src/nSocket/nstack/nstack_info_parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nSocket/nstack/nstack_info_parse.c')
-rw-r--r--src/nSocket/nstack/nstack_info_parse.c493
1 files changed, 493 insertions, 0 deletions
diff --git a/src/nSocket/nstack/nstack_info_parse.c b/src/nSocket/nstack/nstack_info_parse.c
new file mode 100644
index 0000000..06c956b
--- /dev/null
+++ b/src/nSocket/nstack/nstack_info_parse.c
@@ -0,0 +1,493 @@
+/*
+*
+* Copyright (c) 2018 Huawei Technologies Co.,Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at:
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <errno.h>
+#include "json.h"
+#include "nsfw_base_linux_api.h"
+#include "nstack_info_parse.h"
+
+/*get string value*/
+#define NSTACK_JSON_PARSE_STRING(obj, name, lent, reslt, index) do { \
+ struct json_object* temp_obj1 = NULL; \
+ (void)json_object_object_get_ex((obj), (name), &temp_obj1); \
+ if (temp_obj1) \
+ { \
+ const char *temp_value1 = json_object_get_string(temp_obj1); \
+ if (!temp_value1) \
+ { \
+ NSSOC_LOGERR("can't get value from %s index:%d", name, (index)); \
+ goto RETURN_ERROR; \
+ } \
+ (void)STRNCPY_S((reslt), (lent), temp_value1, (lent)); \
+ } \
+ else \
+ { \
+ NSSOC_LOGERR("can't get obj from %s index:%d", name, (index)); \
+ goto RETURN_ERROR; \
+ } \
+} while ( 0 );
+
+/*get int value*/
+#define NSTACK_JSON_PARSE_INT(obj, name, lent, reslt, index) do { \
+ struct json_object* temp_obj1 = NULL; \
+ (void)json_object_object_get_ex((obj), (name), &temp_obj1); \
+ if (temp_obj1) \
+ { \
+ const char *temp_value1 = json_object_get_string(temp_obj1); \
+ if (!temp_value1) \
+ { \
+ NSSOC_LOGERR("can't get value from %s index:%d", name, (index)); \
+ goto RETURN_ERROR; \
+ } \
+ (reslt) = atoi(temp_value1); \
+ } \
+ else \
+ { \
+ NSSOC_LOGERR("can't get obj from %s index:%d", name, (index)); \
+ goto RETURN_ERROR; \
+ } \
+} while ( 0 );
+
+/*parse module cfg*/
+int
+nstack_parse_module_cfg_json (char *param)
+{
+ struct json_object *obj = json_tokener_parse (param);
+ struct json_object *module_list_obj = NULL;
+ struct json_object *module_obj = NULL;
+ struct json_object *temp_obj = NULL;
+ const char *default_name = NULL;
+ const char *temp_value = NULL;
+ int module_num = 0;
+ int ret = NSTACK_RETURN_FAIL;
+ int index = 0;
+ int icnt = 0;
+
+ if (!obj)
+ {
+ NSSOC_LOGERR ("json parse fail");
+ return NSTACK_RETURN_FAIL;
+ }
+
+ (void) MEMSET_S (&g_nstack_module_desc[0], sizeof (g_nstack_module_desc), 0,
+ sizeof (g_nstack_module_desc));
+
+ (void) json_object_object_get_ex (obj, "default_stack_name", &temp_obj);
+ if (!temp_obj)
+ {
+ NSSOC_LOGERR ("can't get module_list");
+ goto RETURN_ERROR;
+ }
+
+ default_name = json_object_get_string (temp_obj);
+
+ (void) json_object_object_get_ex (obj, "module_list", &module_list_obj);
+ if (!module_list_obj)
+ {
+ NSSOC_LOGERR ("can't get module_list");
+ goto RETURN_ERROR;
+ }
+ module_num = json_object_array_length (module_list_obj);
+ if ((module_num <= 0) || (module_num >= NSTACK_MAX_MODULE_NUM))
+ {
+ NSSOC_LOGERR ("get module number:%d fail", module_num);
+ goto RETURN_ERROR;
+ }
+
+ for (index = 0; index < module_num; index++)
+ {
+ module_obj = json_object_array_get_idx (module_list_obj, index);
+ if (module_obj)
+ {
+ NSTACK_JSON_PARSE_STRING (module_obj, "stack_name", MODULE_NAME_MAX,
+ &(g_nstack_module_desc[icnt].modName[0]),
+ index);
+ NSTACK_JSON_PARSE_STRING (module_obj, "function_name",
+ MODULE_NAME_MAX,
+ &(g_nstack_module_desc
+ [icnt].registe_fn_name[0]), index);
+ NSTACK_JSON_PARSE_STRING (module_obj, "libname", MODULE_NAME_MAX,
+ &(g_nstack_module_desc[icnt].libPath[0]),
+ index);
+
+ (void) json_object_object_get_ex (module_obj, "loadtype",
+ &temp_obj);
+ if (temp_obj)
+ {
+ temp_value = json_object_get_string (temp_obj);
+ if (strcmp (temp_value, "static") == 0)
+ {
+ g_nstack_module_desc[icnt].libtype = NSTACK_LIB_LOAD_STATIC;
+ }
+ else
+ {
+ g_nstack_module_desc[icnt].libtype = NSTACK_LIB_LOAD_DYN;
+ }
+ }
+ else
+ {
+ NSSOC_LOGERR ("can't get value from loadtype index:%d", index);
+ goto RETURN_ERROR;
+ }
+ NSTACK_JSON_PARSE_INT (module_obj, "deploytype", MODULE_NAME_MAX,
+ g_nstack_module_desc[icnt].deploytype,
+ index);
+ NSTACK_JSON_PARSE_INT (module_obj, "maxfd", MODULE_NAME_MAX,
+ g_nstack_module_desc[icnt].maxfdid, index);
+ NSTACK_JSON_PARSE_INT (module_obj, "minfd", MODULE_NAME_MAX,
+ g_nstack_module_desc[icnt].minfdid, index);
+ NSTACK_JSON_PARSE_INT (module_obj, "priorty", MODULE_NAME_MAX,
+ g_nstack_module_desc[icnt].priority, index);
+ NSTACK_JSON_PARSE_INT (module_obj, "stackid", MODULE_NAME_MAX,
+ g_nstack_module_desc[icnt].modInx, index);
+ if (0 == strcmp (g_nstack_module_desc[icnt].modName, default_name))
+ {
+ g_nstack_module_desc[icnt].default_stack = 1;
+ }
+ icnt++;
+ g_mudle_num = icnt;
+ }
+ }
+ ret = NSTACK_RETURN_OK;
+
+RETURN_ERROR:
+ json_object_put (obj);
+ return ret;
+}
+
+/*parse module cfg*/
+int
+nstack_parse_rd_cfg_json (char *param, rd_route_data ** data, int *num)
+{
+ struct json_object *obj = json_tokener_parse (param);
+ struct json_object *ip_list_obj = NULL;
+ struct json_object *proto_list_obj = NULL;
+ struct json_object *module_obj = NULL;
+ struct json_object *temp_obj = NULL;
+ rd_route_data *rdtemp = NULL;
+ rd_route_data *rddata = NULL;
+ const char *sub = NULL;
+ const char *temp_value = NULL;
+ int ip_list_num = 0;
+ int proto_list_num = 0;
+ int totalnum = 0;
+ int tlen = 0;
+ int index = 0;
+ int icnt = 0;
+ char ipadd[32] = { 0 };
+
+ if (!obj)
+ {
+ NSSOC_LOGERR ("json parse fail");
+ return NSTACK_RETURN_FAIL;
+ }
+
+ (void) json_object_object_get_ex (obj, "ip_route", &ip_list_obj);
+ if (!ip_list_obj)
+ {
+ NSSOC_LOGERR ("can't get module_list");
+ goto RETURN_ERROR;
+ }
+ (void) json_object_object_get_ex (obj, "prot_route", &proto_list_obj);
+ if (!proto_list_obj)
+ {
+ NSSOC_LOGERR ("can't get module_list");
+ goto RETURN_ERROR;
+ }
+
+ ip_list_num = json_object_array_length (ip_list_obj);
+ proto_list_num = json_object_array_length (proto_list_obj);
+ totalnum = ip_list_num + proto_list_num;
+ if (totalnum > NSTACK_RD_MAX)
+ {
+ NSSOC_LOGERR ("rd num is too more, and return fail");
+ goto RETURN_ERROR;
+ }
+ tlen = sizeof (rd_route_data) * totalnum;
+ rdtemp = (rd_route_data *) malloc (tlen);
+ if (!rdtemp)
+ {
+ NSSOC_LOGERR ("malloc mem fail");
+ goto RETURN_ERROR;
+ }
+ MEMSET_S (rdtemp, tlen, 0, tlen);
+ for (index = 0; index < ip_list_num; index++)
+ {
+ module_obj = json_object_array_get_idx (ip_list_obj, index);
+ if (module_obj)
+ {
+ rddata = rdtemp + icnt;
+ rddata->type = RD_DATA_TYPE_IP;
+ (void) json_object_object_get_ex (module_obj, "type", &temp_obj);
+ if (temp_obj)
+ {
+ temp_value = json_object_get_string (temp_obj);
+ if (!temp_value)
+ {
+ NSSOC_LOGERR ("can't get value from subnet index:%d",
+ index);
+ goto RETURN_ERROR;
+ }
+ (void) STRNCPY_S (rddata->stack_name, RD_PLANE_NAMELEN,
+ temp_value, RD_PLANE_NAMELEN);
+ }
+ (void) json_object_object_get_ex (module_obj, "subnet", &temp_obj);
+ if (temp_obj)
+ {
+ temp_value = json_object_get_string (temp_obj);
+ if (!temp_value)
+ {
+ NSSOC_LOGERR ("can't get value from subnet index:%d",
+ index);
+ goto RETURN_ERROR;
+ }
+ sub = strstr (temp_value, "/");
+ if (!sub)
+ {
+ NSSOC_LOGERR ("can't get maskklen from %s", temp_value);
+ goto RETURN_ERROR;
+ }
+ (void) MEMSET_S (ipadd, sizeof (ipadd), 0, sizeof (ipadd));
+ (void) STRNCPY_S (ipadd, sizeof (ipadd), temp_value,
+ (size_t) (sub - temp_value));
+ rddata->ipdata.masklen = atoi (sub + 1);
+ rddata->ipdata.addr = ntohl (inet_addr (ipadd));
+ icnt++;
+ }
+ }
+ }
+
+ for (index = 0; index < ip_list_num; index++)
+ {
+ module_obj = json_object_array_get_idx (proto_list_obj, index);
+ if (module_obj)
+ {
+ rddata = rdtemp + icnt;
+ rddata->type = RD_DATA_TYPE_PROTO;
+ (void) json_object_object_get_ex (module_obj, "type", &temp_obj);
+ if (temp_obj)
+ {
+ temp_value = json_object_get_string (temp_obj);
+ if (!temp_value)
+ {
+ NSSOC_LOGERR ("can't get value from subnet index:%d",
+ index);
+ goto RETURN_ERROR;
+ }
+ (void) STRNCPY_S (rddata->stack_name, RD_PLANE_NAMELEN,
+ temp_value, RD_PLANE_NAMELEN);
+ }
+ (void) json_object_object_get_ex (module_obj, "proto_type",
+ &temp_obj);
+ if (temp_obj)
+ {
+ temp_value = json_object_get_string (temp_obj);
+ if (!temp_value)
+ {
+ NSSOC_LOGERR ("can't get value from subnet index:%d",
+ index);
+ goto RETURN_ERROR;
+ }
+ rddata->proto_type = atoi (temp_value);
+ icnt++;
+ }
+ }
+ }
+ *data = rdtemp;
+ *num = icnt;
+ json_object_put (obj);
+ return NSTACK_RETURN_OK;
+RETURN_ERROR:
+ json_object_put (obj);
+ if (rdtemp)
+ {
+ free (rdtemp);
+ }
+ return -1;
+}
+
+/*read json file, and return a buf, if return success, the caller need to free **buf*/
+int
+nstack_json_file_read (char *filename, char **buf)
+{
+ char *cfg_buf = NULL;
+ int fp = 0;
+ off_t file_len = 0;
+ off_t buff_len = 0;
+ int ret = NSTACK_RETURN_FAIL;
+
+ if ((!filename) || (!buf))
+ {
+ return NSTACK_RETURN_FAIL;
+ }
+
+ fp = open (filename, O_RDONLY);
+ if (fp < 0)
+ {
+ NSSOC_LOGERR ("open %s fail, error:%d!", filename, errno);
+ ret = NSTACK_RETURN_FAIL;
+ goto RETURN_RELEASE;
+ }
+
+ file_len = lseek (fp, 0, SEEK_END);
+ if (file_len <= 0)
+ {
+ NSSOC_LOGERR ("failed to get file len]file name=%s", filename);
+ ret = NSTACK_RETURN_FAIL;
+ goto RETURN_RELEASE;
+ }
+
+ if (file_len > NSTACK_CFG_FILELEN_MAX)
+ {
+ NSSOC_LOGERR
+ ("file len is too big]file len=%d, max len=%d, file name=%s",
+ file_len, NSTACK_CFG_FILELEN_MAX, filename);
+ ret = NSTACK_RETURN_FAIL;
+ goto RETURN_RELEASE;
+ }
+
+ ret = lseek (fp, 0, SEEK_SET);
+ if (ret < 0)
+ {
+ NSSOC_LOGERR ("seek to start failed]file name=%s", filename);
+ ret = NSTACK_RETURN_FAIL;
+ goto RETURN_RELEASE;
+ }
+
+ buff_len = file_len + 1;
+ cfg_buf = (char *) malloc (buff_len);
+ if (!cfg_buf)
+ {
+ NSSOC_LOGERR ("malloc buff failed]buff_len=%d", buff_len);
+ ret = NSTACK_RETURN_FAIL;
+ goto RETURN_RELEASE;
+ }
+
+ ret = MEMSET_S (cfg_buf, buff_len, 0, buff_len);
+ if (NSTACK_RETURN_OK != ret)
+ {
+ NSSOC_LOGERR ("MEMSET_S failed]ret=%d.", ret);
+ ret = NSTACK_RETURN_FAIL;
+ goto RETURN_RELEASE;
+ }
+
+ ret = nsfw_base_read (fp, cfg_buf, buff_len - 1);
+ if (ret <= 0)
+ {
+ NSSOC_LOGERR ("read failed]ret=%d, errno:%d", ret, errno);
+ ret = NSTACK_RETURN_FAIL;
+ goto RETURN_RELEASE;
+ }
+
+ *buf = cfg_buf;
+ nsfw_base_close (fp);
+ return NSTACK_RETURN_OK;
+RETURN_RELEASE:
+ if (fp >= 0)
+ {
+ nsfw_base_close (fp);
+ }
+ if (cfg_buf)
+ {
+ free (cfg_buf);
+ }
+ return ret;
+}
+
+/*parse module cfg file*/
+int
+nstack_module_parse ()
+{
+ char *modulecfg = NULL;
+ char *tmp_config_path = NULL;
+ char *cfg_buf = NULL;
+ int ret = NSTACK_RETURN_FAIL;
+
+ modulecfg = getenv (NSTACK_MOD_CFG_FILE);
+
+ if (modulecfg)
+ {
+ tmp_config_path = realpath (modulecfg, NULL);
+ }
+ else
+ {
+ tmp_config_path = realpath (DEFALT_MODULE_CFG_FILE, NULL);
+ }
+
+ if (!tmp_config_path)
+ {
+ NSSOC_LOGERR ("nstack module file:%s get real path fail!",
+ modulecfg ? modulecfg : DEFALT_MODULE_CFG_FILE);
+ return NSTACK_RETURN_FAIL;
+ }
+
+ ret = nstack_json_file_read (tmp_config_path, &cfg_buf);
+ if (NSTACK_RETURN_OK == ret)
+ {
+ ret = nstack_parse_module_cfg_json (cfg_buf);
+ free (cfg_buf);
+ }
+
+ free (tmp_config_path);
+ return ret;
+}
+
+int
+nstack_stack_rd_parse (rd_route_data ** data, int *num)
+{
+ char *modulecfg = NULL;
+ char *tmp_config_path = NULL;
+ char *cfg_buf = NULL;
+ int ret = NSTACK_RETURN_FAIL;
+
+ modulecfg = getenv (NSTACK_MOD_CFG_RD);
+
+ if (modulecfg)
+ {
+ tmp_config_path = realpath (modulecfg, NULL);
+ }
+ else
+ {
+ tmp_config_path = realpath (DEFALT_RD_CFG_FILE, NULL);
+ }
+
+ if (!tmp_config_path)
+ {
+ NSSOC_LOGERR ("nstack rd file:%s get real path fail!",
+ modulecfg ? modulecfg : DEFALT_MODULE_CFG_FILE);
+ return NSTACK_RETURN_FAIL;
+ }
+
+ ret = nstack_json_file_read (tmp_config_path, &cfg_buf);
+ if (NSTACK_RETURN_OK == ret)
+ {
+ ret = nstack_parse_rd_cfg_json (cfg_buf, data, num);
+ free (cfg_buf);
+ }
+
+ free (tmp_config_path);
+ return ret;
+}