summaryrefslogtreecommitdiffstats
path: root/stacks/lwip_stack/lwip_src/socket/stackx_container_cfg.c
diff options
context:
space:
mode:
Diffstat (limited to 'stacks/lwip_stack/lwip_src/socket/stackx_container_cfg.c')
-rw-r--r--stacks/lwip_stack/lwip_src/socket/stackx_container_cfg.c329
1 files changed, 329 insertions, 0 deletions
diff --git a/stacks/lwip_stack/lwip_src/socket/stackx_container_cfg.c b/stacks/lwip_stack/lwip_src/socket/stackx_container_cfg.c
new file mode 100644
index 0000000..8c6ab46
--- /dev/null
+++ b/stacks/lwip_stack/lwip_src/socket/stackx_container_cfg.c
@@ -0,0 +1,329 @@
+/*
+*
+* 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.
+*/
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <arpa/inet.h>
+#include "stackx_cfg.h"
+#include "json.h"
+#include "nstack_log.h"
+#include "spl_def.h"
+#include "nstack_securec.h"
+#include "stackx_ip_addr.h"
+
+sbr_container_ip_group g_container_ip_group;
+
+/*****************************************************************************
+* Prototype : sbr_parse_container_ip_json
+* Description : parse port json
+* Input : char* param
+* Output : None
+* Return Value : static void
+* Calls :
+* Called By :
+*
+*****************************************************************************/
+static void sbr_parse_container_ip_json(char *param)
+{
+ int retval;
+ struct json_object *obj = json_tokener_parse(param);
+ struct json_object *container_id_obj = NULL;
+ struct json_object *ports_list_obj = NULL;
+ struct json_object *ip_cidr_list_obj = NULL;
+
+ if (!obj)
+ {
+ NSSBR_LOGERR("json_tokener_parse failed");
+ return;
+ }
+
+ json_object_object_get_ex(obj, "containerID", &container_id_obj);
+ if (!container_id_obj)
+ {
+ NSSBR_LOGERR("can't get containerID");
+ goto RETURN_ERROR;
+ }
+
+ json_object_object_get_ex(obj, "ports_list", &ports_list_obj);
+ if (ports_list_obj)
+ {
+ int i;
+ int port_num = json_object_array_length(ports_list_obj);
+
+ if (0 == port_num)
+ {
+ NSSBR_LOGERR("port num is 0");
+ goto RETURN_ERROR;
+ }
+
+ for (i = 0; i < port_num; i++)
+ {
+ struct json_object *port_obj =
+ json_object_array_get_idx(ports_list_obj, i);
+ json_object_object_get_ex(port_obj, "ip_cidr", &ip_cidr_list_obj);
+ if (ip_cidr_list_obj)
+ {
+ int j;
+ int ip_cidr_num = json_object_array_length(ip_cidr_list_obj);
+ for (j = 0; j < ip_cidr_num; ++j)
+ {
+ struct json_object *ip_cidr_obj =
+ json_object_array_get_idx(ip_cidr_list_obj, j);
+ if (ip_cidr_obj)
+ {
+ char tmp[32] = { 0 };
+ const char *ip_cidr =
+ json_object_get_string(ip_cidr_obj);
+ if ((NULL == ip_cidr) || (ip_cidr[0] == 0))
+ {
+ NSSBR_LOGERR("ip is empty");
+ goto RETURN_ERROR;
+ }
+
+ const char *sub = strstr(ip_cidr, "/");
+ if ((NULL == sub)
+ || (sizeof(tmp) - 1 <
+ (unsigned int) (sub - ip_cidr))
+ || (strlen(sub) > sizeof(tmp) - 1))
+ {
+ NSSBR_LOGERR("ip format is not ok");
+ goto RETURN_ERROR;
+ }
+
+ retval =
+ strncpy_s(tmp, sizeof(tmp), ip_cidr,
+ (size_t) (sub - ip_cidr));
+ if (EOK != retval)
+ {
+ NSSBR_LOGERR("STRNCPY_S failed]ret=%d", retval);
+ goto RETURN_ERROR;
+ }
+
+ struct in_addr addr;
+ retval =
+ memset_s(&addr, sizeof(addr), 0, sizeof(addr));
+ if (EOK != retval)
+ {
+ NSSBR_LOGERR("MEMSET_S failed]ret=%d", retval);
+ goto RETURN_ERROR;
+ }
+
+ retval = spl_inet_aton(tmp, &addr);
+ if (0 == retval)
+ {
+ NSSBR_LOGERR("spl_inet_aton failed]ret=%d",
+ retval);
+ goto RETURN_ERROR;
+ }
+
+ g_container_ip_group.
+ ip_array[g_container_ip_group.ip_num].ip =
+ addr.s_addr;
+ int mask_len = atoi(sub + 1);
+ if ((mask_len <= 0) || (mask_len > 32))
+ {
+ NSSBR_LOGERR("mask len is not ok");
+ goto RETURN_ERROR;
+ }
+
+ g_container_ip_group.
+ ip_array[g_container_ip_group.ip_num].mask_len =
+ (u32) mask_len;
+ g_container_ip_group.ip_num++;
+
+ if (g_container_ip_group.ip_num >=
+ SBR_MAX_CONTAINER_IP_NUM)
+ {
+ NSSBR_LOGWAR("container ip num is full]ip_num=%u",
+ g_container_ip_group.ip_num);
+ goto RETURN_OK;
+ }
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ NSSBR_LOGERR("can't get ports_list");
+ goto RETURN_ERROR;
+ }
+
+ RETURN_OK:
+ json_object_put(obj);
+ NSSBR_LOGINF("container ip num is %u", g_container_ip_group.ip_num);
+ u32 idx;
+ for (idx = 0; idx < g_container_ip_group.ip_num; ++idx)
+ {
+ NSSBR_LOGDBG("container ip=0x%08x",
+ g_container_ip_group.ip_array[idx].ip);
+ }
+ return;
+
+ RETURN_ERROR:
+ json_object_put(obj);
+ if (memset_s
+ (&g_container_ip_group, sizeof(sbr_container_ip_group), 0,
+ sizeof(sbr_container_ip_group)) != EOK)
+ {
+ NSSBR_LOGERR("MEMSET_S failed");
+ }
+}
+
+/*****************************************************************************
+* Prototype : sbr_get_cfg_path
+* Description : get cfg path
+* Input : None
+* Output : None
+* Return Value : NSTACK_STATIC const char*
+* Calls :
+* Called By :
+*
+*****************************************************************************/
+NSTACK_STATIC const char *sbr_get_cfg_path()
+{
+ static char cfg_file[SBR_MAX_CFG_PATH_LEN] =
+ "/canal/output/portinfo.json";
+ return cfg_file;
+}
+
+/*****************************************************************************
+* Prototype : sbr_init_cfg
+* Description : init cfg from file
+* Input : None
+* Output : None
+* Return Value : int
+* Calls :
+* Called By :
+*
+*****************************************************************************/
+int sbr_init_cfg()
+{
+ int ret;
+ off_t file_len = 0;
+ off_t buff_len = 0;
+ char *buff = NULL;
+ const char *cfg_file = sbr_get_cfg_path(); /* no need check ret */
+
+ int fp = open(cfg_file, O_RDONLY);
+
+ if (fp < 0)
+ {
+ NSSBR_LOGWAR("failed to open file]file name=%s", cfg_file);
+ goto RETURN_ERROR;
+ }
+
+ file_len = lseek(fp, 0, SEEK_END);
+ if (file_len <= 0)
+ {
+ NSSBR_LOGWAR("failed to get file len]file name=%s", cfg_file);
+ goto RETURN_ERROR;
+ }
+
+ if (file_len > SBR_MAX_CFG_FILE_SIZE)
+ {
+ NSSBR_LOGWAR
+ ("file len is too big]file len=%d, max len=%d, file name=%s",
+ file_len, SBR_MAX_CFG_FILE_SIZE, cfg_file);
+ goto RETURN_ERROR;
+ }
+
+ ret = lseek(fp, 0, SEEK_SET);
+ if (ret < 0)
+ {
+ NSSBR_LOGWAR("seek to start failed]file name=%s", cfg_file);
+ goto RETURN_ERROR;
+ }
+
+ buff_len = file_len + 1;
+ buff = (char *) malloc(buff_len);
+ if (!buff)
+ {
+ NSSBR_LOGWAR("malloc buff failed]buff_len=%d", buff_len);
+ goto RETURN_ERROR;
+ }
+
+ ret = memset_s(buff, buff_len, 0, buff_len);
+ if (EOK != ret)
+ {
+ NSSBR_LOGWAR("MEMSET_S failed]ret=%d.", ret);
+ goto RETURN_ERROR;
+ }
+
+ ret = read(fp, buff, buff_len - 1);
+ if (ret <= 0)
+ {
+ NSSBR_LOGWAR("read failed]ret=%d", ret);
+ goto RETURN_ERROR;
+ }
+
+ sbr_parse_container_ip_json(buff);
+ close(fp);
+ free(buff);
+ return 0;
+
+ RETURN_ERROR:
+ if (fp >= 0)
+ {
+ close(fp);
+ }
+
+ if (buff)
+ {
+ free(buff);
+ }
+
+ return -1;
+}
+
+/*****************************************************************************
+* Prototype : sbr_get_src_ip
+* Description : get src ip from cfg
+* Input : u32 dst_ip
+* u32* src_ip
+* Output : None
+* Return Value : int
+* Calls :
+* Called By :
+*
+*****************************************************************************/
+int sbr_get_src_ip(u32 dst_ip, u32 * src_ip)
+{
+ if (!src_ip)
+ {
+ NSSBR_LOGERR("src_ip is NULL");
+ return -1;
+ }
+
+ u32 i;
+ for (i = 0; i < g_container_ip_group.ip_num; ++i)
+ {
+ unsigned int mask = ~0;
+ mask = (mask << (32 - g_container_ip_group.ip_array[i].mask_len));
+ mask = htonl(mask);
+ if ((dst_ip & mask) == (g_container_ip_group.ip_array[i].ip & mask))
+ {
+ *src_ip = g_container_ip_group.ip_array[i].ip;
+ NSSBR_LOGDBG("find src ip]container_ip=0x%08x,dest_ip=0x%08x",
+ *src_ip, dst_ip);
+ return 0;
+ }
+ }
+
+ NSSBR_LOGDBG("can't find src ip]dest_ip=0x%08x", dst_ip);
+ return -1;
+}