aboutsummaryrefslogtreecommitdiffstats
path: root/stacks/lwip_stack/src/tools/dump_tool.c
diff options
context:
space:
mode:
Diffstat (limited to 'stacks/lwip_stack/src/tools/dump_tool.c')
-rw-r--r--stacks/lwip_stack/src/tools/dump_tool.c622
1 files changed, 0 insertions, 622 deletions
diff --git a/stacks/lwip_stack/src/tools/dump_tool.c b/stacks/lwip_stack/src/tools/dump_tool.c
deleted file mode 100644
index 53f0e44..0000000
--- a/stacks/lwip_stack/src/tools/dump_tool.c
+++ /dev/null
@@ -1,622 +0,0 @@
-/*
-*
-* 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 <arpa/inet.h>
-
-#include "nsfw_init.h"
-#include "nsfw_maintain_api.h"
-#include "nsfw_mem_api.h"
-#include "nsfw_fd_timer_api.h"
-#include "nstack_log.h"
-#include "nstack_securec.h"
-
-#include "dump_tool.h"
-#include "nstack_dmm_adpt.h"
-
-NSTACK_STATIC u32 g_dump_task_mask = 0;
-NSTACK_STATIC dump_task_info g_dump_task[MAX_DUMP_TASK];
-static dump_timer_info g_dump_timer;
-
-static nsfw_mem_name g_dump_mem_ring_info =
- { NSFW_SHMEM, NSFW_PROC_MAIN, DUMP_SHMEM_RIGN_NAME };
-static nsfw_mem_name g_dump_mem_pool_info =
- { NSFW_SHMEM, NSFW_PROC_MAIN, DUMP_SHMEM_POOL_NAME };
-
-NSTACK_STATIC inline void
-dump_task_init (dump_task_info * task)
-{
- task->task_state = 0;
- task->task_id = -1;
- task->task_keep_time = 0;
- task->task_pool = NULL;
- task->task_queue = NULL;
-}
-
-NSTACK_STATIC inline void
-clear_dump_task ()
-{
- int i = 0;
- for (; i < MAX_DUMP_TASK; i++)
- {
- dump_task_init (&g_dump_task[i]);
- }
-}
-
-NSTACK_STATIC i16
-get_dump_task (nsfw_tool_dump_msg * req)
-{
- // base version just support 1 dump task
- if (req->task_keep_time > MAX_DUMP_TIME
- || req->task_keep_time < MIN_DUMP_TIME)
- {
- NSPOL_DUMP_LOGERR ("task keep time invalid] time=%u.",
- req->task_keep_time);
- return -1;
- }
-
- if (1 == g_dump_task[0].task_state)
- {
- NSPOL_DUMP_LOGERR
- ("start tcpdump task failed, task still in work state] task id=%d.",
- 0);
- return -1;
- }
-
- struct timespec cur_time;
- GET_CUR_TIME (&cur_time); /*do not need return value */
- g_dump_task[0].task_start_sec = cur_time.tv_sec;
- g_dump_task[0].last_hbt_sec = cur_time.tv_sec;
-
- g_dump_task[0].task_state = 1;
- g_dump_task[0].task_id = 0;
- g_dump_task[0].task_keep_time = req->task_keep_time;
-
- g_dump_task_mask |= (1 << g_dump_task[0].task_id);
- NSPOL_DUMP_LOGINF ("start tcpdump task success] task id=%d.", 0);
- return 0;
-}
-
-NSTACK_STATIC i16
-close_dump_task (i16 task_id)
-{
- if (task_id < 0 || task_id >= MAX_DUMP_TASK)
- {
- NSPOL_DUMP_LOGERR
- ("receive invalid task id in close dump task req] task id=%d.",
- task_id);
- return -1;
- }
-
- g_dump_task[task_id].task_state = 0;
-
- g_dump_task_mask &= ~(1 << task_id);
-
- NSPOL_DUMP_LOGINF ("stop tcpdump task success] task id=%d.", 0);
-
- return task_id;
-}
-
-NSTACK_STATIC void
-stop_expired_task (int idx, u32 now_sec)
-{
- dump_task_info *ptask = &g_dump_task[idx];
- if (0 == ptask->task_state)
- {
- return;
- }
-
- if (now_sec - ptask->task_start_sec > ptask->task_keep_time)
- {
- NSPOL_DUMP_LOGERR
- ("stop dump task because task time expired] task id=%d, now_sec=%u, task start time=%u, dump time=%u.",
- ptask->task_id, now_sec, ptask->task_start_sec,
- ptask->task_keep_time);
- close_dump_task (ptask->task_id);
- return;
- }
-
- if (now_sec - ptask->last_hbt_sec > DUMP_TASK_HBT_TIME_OUT)
- {
- NSPOL_DUMP_LOGERR
- ("stop dump task because heart beat time out] task id=%d, now_sec=%u, last hbt time=%u, hbt timeout=%u.",
- ptask->task_id, now_sec, ptask->last_hbt_sec,
- DUMP_TASK_HBT_TIME_OUT);
- close_dump_task (ptask->task_id);
- }
-
- return;
-}
-
-NSTACK_STATIC inline bool
-check_dump_alive (u32 timer_type, void *data)
-{
- dump_timer_info *ptimer_info = (dump_timer_info *) data;
-
- struct timespec cur_time;
- GET_CUR_TIME (&cur_time); /*do not need return value */
-
- int i = 0;
- for (; i < MAX_DUMP_TASK; i++)
- {
- stop_expired_task (i, cur_time.tv_sec);
- }
-
- ptimer_info->ptimer =
- nsfw_timer_reg_timer (1, ptimer_info, check_dump_alive,
- *(struct timespec *) (ptimer_info->interval));
-
- return true;
-}
-
-NSTACK_STATIC bool
-dump_init_timer (dump_timer_info * ptimer_info)
-{
- struct timespec *trigger_time =
- (struct timespec *) malloc (sizeof (struct timespec));
- if (NULL == trigger_time)
- {
- NSPOL_DUMP_LOGERR ("alloc memory for timer failed.");
- return false;
- }
-
- trigger_time->tv_sec = DUMP_HBT_CHK_INTERVAL;
- trigger_time->tv_nsec = 0;
-
- ptimer_info->interval = trigger_time;
- ptimer_info->ptimer =
- nsfw_timer_reg_timer (1, ptimer_info, check_dump_alive, *trigger_time);
- return true;
-}
-
-NSTACK_STATIC inline u32
-copy_limit_buf (char *dst_buf, int dst_buf_len, char *src_buf,
- u32 src_buf_len, u32 limit_len)
-{
- if (src_buf_len < limit_len)
- {
- NSPOL_DUMP_LOGERR ("message too short] len=%d", src_buf_len);
- return 0;
- }
-
- if (EOK != MEMCPY_S (dst_buf, dst_buf_len, src_buf, limit_len))
- {
- NSPOL_DUMP_LOGERR ("MEMCPY_S failed");
- return 0;
- }
-
- return limit_len;
-}
-
-NSTACK_STATIC inline u32
-get_packet_buf (char *dst_buf, int dst_buf_len, char *src_buf,
- u32 src_buf_len, u32 eth_head_len)
-{
-#define TCP_BUF_LEN (eth_head_len + IP_HEAD_LEN + TCP_HEAD_LEN)
-#define UDP_BUF_LEN (eth_head_len + IP_HEAD_LEN + UDP_HEAD_LEN)
-#define ICMP_BUF_LEN (eth_head_len + IP_HEAD_LEN + ICMP_HEAD_LEN)
-
- if (NULL == dst_buf || NULL == src_buf)
- {
- return 0;
- }
-
- struct ip_hdr *ip_head = (struct ip_hdr *) (src_buf + eth_head_len);
- if (ip_head->_proto == IP_PROTO_TCP)
- {
- return copy_limit_buf (dst_buf, dst_buf_len, src_buf, src_buf_len,
- TCP_BUF_LEN);
- }
-
- if (ip_head->_proto == IP_PROTO_UDP)
- {
- return copy_limit_buf (dst_buf, dst_buf_len, src_buf, src_buf_len,
- UDP_BUF_LEN);
- }
-
- if (ip_head->_proto == IP_PROTO_ICMP)
- {
- return copy_limit_buf (dst_buf, dst_buf_len, src_buf, src_buf_len,
- ICMP_BUF_LEN);
- }
-
- if (EOK != MEMCPY_S (dst_buf, dst_buf_len, src_buf, src_buf_len))
- {
- NSPOL_DUMP_LOGERR ("MEMCPY_S failed");
- return 0;
- }
-
- return src_buf_len;
-}
-
-NSTACK_STATIC int
-pack_msg_inout (void *dump_buf, char *msg_buf, u32 len, u16 direction,
- void *para)
-{
- (void) para;
- dump_msg_info *pmsg = (dump_msg_info *) dump_buf;
- if (!pmsg)
- {
- return 0;
- }
-
- pmsg->direction = direction;
- struct timeval cur_time;
- gettimeofday (&cur_time, NULL);
- pmsg->dump_sec = cur_time.tv_sec;
- pmsg->dump_usec = cur_time.tv_usec;
-
- /* msg content can not be captured */
- u32 real_len =
- get_packet_buf (pmsg->buf, DUMP_MSG_SIZE, msg_buf, len, ETH_HEAD_LEN);
- if (0 == real_len)
- {
- return 0;
- }
-
- pmsg->len = real_len;
-
- return 1;
-}
-
-NSTACK_STATIC int
-pack_msg_loop (void *dump_buf, char *msg_buf, u32 len, u16 direction,
- void *para)
-{
- dump_msg_info *pmsg = (dump_msg_info *) dump_buf;
- if (!pmsg)
- {
- return 0;
- }
- pmsg->direction = direction;
- struct timeval cur_time;
- gettimeofday (&cur_time, NULL);
- pmsg->dump_sec = cur_time.tv_sec;
- pmsg->dump_usec = cur_time.tv_usec;
-
- eth_head pack_eth_head;
- int retVal =
- MEMCPY_S (pack_eth_head.dest_mac, MAC_ADDR_LEN, para, MAC_ADDR_LEN);
- if (EOK != retVal)
- {
- NSPOL_DUMP_LOGERR ("MEMCPY_S failed]retVal=%d", retVal);
- return 0;
- }
- retVal = MEMCPY_S (pack_eth_head.src_mac, MAC_ADDR_LEN, para, MAC_ADDR_LEN);
- if (EOK != retVal)
- {
- NSPOL_DUMP_LOGERR ("MEMCPY_S failed]retVal=%d", retVal);
- return 0;
- }
- pack_eth_head.eth_type = htons (PROTOCOL_IP);
-
- retVal =
- MEMCPY_S (pmsg->buf, DUMP_MSG_SIZE, &pack_eth_head, sizeof (eth_head));
- if (EOK != retVal)
- {
- NSPOL_DUMP_LOGERR ("MEMCPY_S failed]retVal=%d", retVal);
- return 0;
- }
-
- u32 buf_len = DUMP_MSG_SIZE - ETH_HEAD_LEN;
-
- /* msg content can not be captured- Begin */
- u32 real_len =
- get_packet_buf (pmsg->buf + ETH_HEAD_LEN, buf_len, msg_buf, len, 0);
- if (0 == real_len)
- {
- return 0;
- }
-
- pmsg->len = real_len + ETH_HEAD_LEN;
-
- return 1;
-}
-
-NSTACK_STATIC void
-dump_enqueue (int task_idx, void *buf, u32 len, u16 direction,
- pack_msg_fun pack_msg, void *para)
-{
- mring_handle queue = (mring_handle *) g_dump_task[task_idx].task_queue;
- mring_handle pool = (mring_handle *) g_dump_task[task_idx].task_pool;
-
- void *msg = NULL;
-
- if (nsfw_mem_ring_dequeue (pool, &msg) <= 0)
- {
- // such log may be too much if queue is empty
- NSPOL_DUMP_LOGDBG ("get msg node from mem pool failed] pool=%p.", pool);
- return;
- }
-
- if (NULL == msg)
- {
- NSPOL_DUMP_LOGWAR ("get NULL msg node from mem pool] pool=%p.", pool);
- return;
- }
-
- if (!pack_msg (msg, buf, len, direction, para))
- {
- NSPOL_DUMP_LOGWAR ("get dump msg failed");
- return;
- }
-
- if (nsfw_mem_ring_enqueue (queue, msg) < 0)
- {
- NSPOL_DUMP_LOGWAR ("dump mem ring enqueue failed] ring=%p.", queue);
- }
-
- return;
-}
-
-NSTACK_STATIC inline bool
-dump_enabled ()
-{
- return (0 != g_dump_task_mask);
-}
-
-void
-ntcpdump (void *buf, u32 buf_len, u16 direction)
-{
- u32 i;
- if (!dump_enabled ())
- {
- return;
- }
-
- /* fix Dead-code type Codedex issue here */
- for (i = 0; i < MAX_DUMP_TASK; i++)
- {
- if (g_dump_task[i].task_state)
- {
- dump_enqueue (i, buf, buf_len, direction, pack_msg_inout, NULL);
- }
- }
-}
-
-void
-ntcpdump_loop (void *buf, u32 buf_len, u16 direction, void *eth_addr)
-{
- u32 i;
-
- if (!dump_enabled ())
- {
- return;
- }
-
- /* fix Dead-code type Codedex issue here */
- for (i = 0; i < MAX_DUMP_TASK; i++)
- {
- if (g_dump_task[i].task_state)
- {
- dump_enqueue (i, buf, buf_len, direction, pack_msg_loop, eth_addr);
- }
- }
-}
-
-// called by nStackMain
-bool
-dump_create_pool ()
-{
- nsfw_mem_sppool pool_info;
- if (EOK !=
- MEMCPY_S (&pool_info.stname, sizeof (nsfw_mem_name),
- &g_dump_mem_pool_info, sizeof (nsfw_mem_name)))
- {
- NSPOL_DUMP_LOGERR ("create dump mem pool failed, MEMCPY_S failed.");
- return false;
- }
-
- pool_info.usnum = DUMP_MSG_NUM;
- pool_info.useltsize = DUMP_MSG_SIZE + sizeof (dump_msg_info);
- pool_info.isocket_id = NSFW_SOCKET_ANY;
- pool_info.enmptype = NSFW_MRING_MPSC;
-
- mring_handle pool = nsfw_mem_sp_create (&pool_info);
- if (NULL == pool)
- {
- NSPOL_DUMP_LOGERR ("create dump mem pool failed, pool create failed.");
- return false;
- }
-
- g_dump_task[0].task_pool = pool;
-
- NSPOL_DUMP_LOGINF ("dump pool create success] pool=%p.", pool);
-
- return true;
-}
-
-bool
-dump_create_ring ()
-{
- nsfw_mem_mring ring_info;
- if (EOK !=
- MEMCPY_S (&ring_info.stname, sizeof (nsfw_mem_name),
- &g_dump_mem_ring_info, sizeof (nsfw_mem_name)))
- {
- NSPOL_DUMP_LOGERR ("create dump mem ring failed, MEMCPY_S failed.");
- return false;
- }
-
- ring_info.usnum = DUMP_MSG_NUM;
- ring_info.isocket_id = NSFW_SOCKET_ANY;
- ring_info.enmptype = NSFW_MRING_MPSC;
-
- mring_handle ring = nsfw_mem_ring_create (&ring_info);
- if (NULL == ring)
- {
- NSPOL_DUMP_LOGERR ("create dump mem ring failed, ring create failed.");
- return false;
- }
-
- g_dump_task[0].task_queue = ring;
-
- NSPOL_DUMP_LOGINF ("dump ring create success] ring=%p.", ring);
-
- return true;
-}
-
-NSTACK_STATIC int
-on_dump_tool_req (nsfw_mgr_msg * req)
-{
- i16 task_id = 0;
- if (!req)
- {
- return -1;
- }
- if (req->src_proc_type != NSFW_PROC_TOOLS)
- {
- NSPOL_DUMP_LOGDBG
- ("dump module receive invaild message] module type=%u.",
- req->src_proc_type);
- return -1;
- }
-
- if (req->msg_type != MGR_MSG_TOOL_TCPDUMP_REQ)
- {
- NSPOL_DUMP_LOGDBG ("dump module receive invaild message] msg type=%u.",
- req->msg_type);
- return -1;
- }
-
- nsfw_tool_dump_msg *dump_msg_req = GET_USER_MSG (nsfw_tool_dump_msg, req);
-
- switch (dump_msg_req->op_type)
- {
- case START_DUMP_REQ:
- task_id = get_dump_task (dump_msg_req);
- break;
-
- case STOP_DUMP_REQ:
- task_id = close_dump_task (dump_msg_req->task_id);
- break;
-
- default:
- task_id = -1;
- }
-
- nsfw_mgr_msg *rsp = nsfw_mgr_rsp_msg_alloc (req);
- if (NULL == rsp)
- {
- NSPOL_DUMP_LOGDBG ("alloc response for dump request failed.");
- return -1;
- }
-
- nsfw_tool_dump_msg *dump_msg_rsp = GET_USER_MSG (nsfw_tool_dump_msg, rsp);
- dump_msg_rsp->op_type = dump_msg_req->op_type + DUMP_MSG_TYPE_RSP;
- dump_msg_rsp->task_id = task_id;
-
- nsfw_mgr_send_msg (rsp);
- nsfw_mgr_msg_free (rsp);
- return 0;
-
-}
-
-NSTACK_STATIC int
-on_dump_hbt_req (nsfw_mgr_msg * req)
-{
- if (!req)
- {
- return -1;
- }
- if (req->src_proc_type != NSFW_PROC_TOOLS)
- {
- NSPOL_DUMP_LOGDBG
- ("dump module receive invaild message] module type=%u.",
- req->src_proc_type);
- return -1;
- }
-
- if (req->msg_type != MGR_MSG_TOOL_HEART_BEAT)
- {
- NSPOL_DUMP_LOGDBG ("dump module receive invaild message] msg type=%u.",
- req->msg_type);
- return -1;
- }
-
- nsfw_tool_hbt *dump_hbt_req = GET_USER_MSG (nsfw_tool_hbt, req);
-
- i16 task_id = dump_hbt_req->task_id;
- if (task_id < 0 || task_id >= MAX_DUMP_TASK)
- {
- NSPOL_DUMP_LOGERR ("dump heart beat with invalid task id] task id=%d.",
- task_id);
- return -1;
- }
-
- if (0 == g_dump_task[task_id].task_state)
- {
- NSPOL_DUMP_LOGDBG
- ("dump module receive heart beat but task not enabled] task id=%d.",
- task_id);
- return 0;
- }
-
- struct timespec cur_time;
- GET_CUR_TIME (&cur_time); /*no need return value */
-
- // update task alive time
- g_dump_task[task_id].last_hbt_seq = dump_hbt_req->seq;
- g_dump_task[task_id].last_hbt_sec = cur_time.tv_sec;
-
- return 0;
-}
-
-NSTACK_STATIC int dump_tool_init (void *param);
-NSTACK_STATIC int
-dump_tool_init (void *param)
-{
- u32 proc_type = (u32) ((long long) param);
- NSPOL_DUMP_LOGINF ("dump module init] proc type=%d", proc_type);
-
- switch (proc_type)
- {
- case NSFW_PROC_MAIN:
- nsfw_mgr_reg_msg_fun (MGR_MSG_TOOL_TCPDUMP_REQ, on_dump_tool_req);
- nsfw_mgr_reg_msg_fun (MGR_MSG_TOOL_HEART_BEAT, on_dump_hbt_req);
- break;
- default:
- NSPOL_DUMP_LOGERR ("dump init with unknow module] proc type=%d",
- proc_type);
- return -1;
- }
-
- clear_dump_task ();
-
- if (!dump_create_ring ())
- {
- return -1;
- }
-
- if (!dump_create_pool ())
- {
- return -1;
- }
-
- if (!dump_init_timer (&g_dump_timer))
- {
- return -1;
- }
-
- NSPOL_DUMP_LOGINF ("dump module init success.");
- return 0;
-}
-
-/* *INDENT-OFF* */
-NSFW_MODULE_NAME (TCPDUMP_MODULE)
-NSFW_MODULE_PRIORITY (10)
-NSFW_MODULE_DEPENDS (NSTACK_DMM_MODULE)
-NSFW_MODULE_INIT (dump_tool_init)
-/* *INDENT-ON* */