summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author杨威 <[email protected]>2019-05-24 17:39:50 +0800
committer杨威 <[email protected]>2019-05-24 17:39:50 +0800
commit330fda98c056c0b5d0620e7c3b9f46e4462d8afd (patch)
tree8d2fcdd05cfdbd7ea0261699d5bcfe067ade8aea
parentac0fc50da4b1f09f999d81c49e57b2ba70294ff5 (diff)
1、移除packet_io目录下无用代码文件
2、更新version.cmake文件,命名规范化,配套更新sapp_main.c中使用的版本宏定义至GIT_VERSION 3、新增package.cmake用于打包RPM 4、注释掉CMakeLists中无关的捕包模式,目前仅保留pcap,pag和marsio,其中pcap对应的packet_io一定会编译 5、调整run目录下的默认配置文件,仅保留sapp串联环境下必须使用的用于install或者package 6、本分支仅支持多个packet_io使用dlopen打开的模式,因此增加LINK_MODE_DYNAMIC=1的定义
-rw-r--r--.gitignore25
-rw-r--r--.splint.rc48
-rw-r--r--CMakeLists.txt103
-rw-r--r--cmake/Package.cmake36
-rw-r--r--cmake/Version.cmake37
-rw-r--r--entry/CMakeLists.txt32
-rw-r--r--entry/sapp_main.c2
-rw-r--r--packet_io/CMakeLists.txt26
-rw-r--r--packet_io/cycle_pkt_dump_pipe.c.bak556
-rw-r--r--packet_io/cycle_pkt_dump_through_write.c.bak975
-rw-r--r--packet_io/cycle_pkt_dump_through_write_offset.c.bak1119
-rw-r--r--packet_io/cycle_pkt_dump_through_write_with_offset.c.bak1055
-rw-r--r--packet_io/cycle_pkt_dump_through_write_with_offset.c.bak21055
-rw-r--r--packet_io/cycle_pkt_dump_unix.c.bak677
-rw-r--r--run/conf/main.conf8
-rw-r--r--run/plug/business/conflist_business.inf2
-rw-r--r--run/plug/platform/conflist_platform.inf2
17 files changed, 163 insertions, 5595 deletions
diff --git a/.gitignore b/.gitignore
index 4ea2af1..0de9cfc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,12 +1,13 @@
-SI/
-*.log
-*.o
-*.so
-*.si4project/
-*.a
-*.o
-*.d
-build/
-.idea/
-run/log/
-run/sapp
+SI/
+*.log
+*.o
+*.so
+*.si4project/
+*.a
+*.o
+*.d
+build/
+.idea/
+run/log/
+run/sapp
+version.txt
diff --git a/.splint.rc b/.splint.rc
deleted file mode 100644
index 96c463c..0000000
--- a/.splint.rc
+++ /dev/null
@@ -1,48 +0,0 @@
-+sysdirs /usr/include/:/usr/include/netinet/:/usr/local/include
-+single-include
-+unixlib
--bounds
--retvalother
--retvalint
--redef
--boolops
--predboolint
--fixedformalarray
--type
--nestcomment
-
--I./include
--I./include/stream_inc
--I./include/support
--I./project
--I./packet_io
--I./dealpkt
--I./include/net
--I/usr/include/linux/
--Dasm=__asm__
--D__signed__=signed
--D__linux__=1
--Dlinux=1
--D__LITTLE_ENDIAN=1234
--D__BYTE_ORDER=__LITTLE_ENDIAN
--D__USE_BSD=1
--D__unix__=1
--D__unix=1
--D__size_t
--D__daddr_t_defined
--D__SIZE_T
--D_ARPA_INET_H=1
--D__gnu_linux__=1
--D__USE_ISOC95=1
--D__USE_ISOC99=1
--D__USE_POSIX199506=1
--D__USE_POSIX199309=1
--D__amd64=1
--D__USE_POSIX=1
--D__USE_POSIX2=1
--D__ELF__=1
--D__USE_MISC=1
--D__USE_POSIX=1
--D__off_t_defined
--D__size_t__
--D_STDLIB_H=1
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f2c327c..58442fe 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,18 +1,26 @@
cmake_minimum_required(VERSION 2.8)
+set(project_name sapp)
+
+project(${project_name})
+
+
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
include(Version)
set(CMAKE_MACOSX_RPATH 0)
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DLINK_MODE_DYNAMIC=1")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DLINK_MODE_DYNAMIC=1")
+
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DDEBUG")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DDEBUG")
endif()
#set(CMAKE_INSTALL_PREFIX /home/ceiec/sapp/)
-set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/run/)
+set(CMAKE_INSTALL_PREFIX /home/mesasoft/sapp_run/)
option(PLATFORM_MODE_SERIAL "Using serial mode" TRUE)
@@ -40,35 +48,35 @@ set(MESA_SDK_PREFIX "/opt/MESA/" CACHE STRING "MESA Framework Prefix")
# Capture Mode
option(OPT_IOMODE_PCAP "Capture network traffic with libpcap" ON)
option(OPT_IOMODE_PAG "Capture network traffic with libpag" OFF)
-option(OPT_IOMODE_PPF "Capture network traffic with libppf" OFF)
-option(OPT_IOMODE_PFRING "Capture network traffic with PF-RING" OFF)
-option(OPT_IOMODE_DPDK "Capture network traffic with DPDK" OFF)
-option(OPT_IOMODE_PAG_N95 "Capture network traffic with N95" OFF)
+#option(OPT_IOMODE_PPF "Capture network traffic with libppf" OFF)
+#option(OPT_IOMODE_PFRING "Capture network traffic with PF-RING" OFF)
+#option(OPT_IOMODE_DPDK "Capture network traffic with DPDK" OFF)
+#option(OPT_IOMODE_PAG_N95 "Capture network traffic with N95" OFF)
option(OPT_IOMODE_MARSIO "Capture network traffic with MARSIO" ON)
if(OPT_IOMODE_PCAP)
set(CAPTURE_MODE "PCAP")
endif()
-if(OPT_IOMODE_PAG)
- set(CAPTURE_MODE "PAG")
-endif()
-
-if(OPT_IOMODE_PPF)
- set(CAPTURE_MODE "PPF")
-endif()
-
-if(OPT_IOMODE_PFRING)
- set(CAPTURE_MODE "PFRING")
-endif()
-
-if(OPT_IOMODE_DPDK)
- set(CAPTURE_MODE "DPDK")
-endif()
-
-if(OPT_IOMODE_PAG_N95)
- set(CAPTURE_MODE "PAG_N95")
-endif()
+#if(OPT_IOMODE_PAG)
+# set(CAPTURE_MODE "PAG")
+#endif()
+#
+#if(OPT_IOMODE_PPF)
+# set(CAPTURE_MODE "PPF")
+#endif()
+#
+#if(OPT_IOMODE_PFRING)
+# set(CAPTURE_MODE "PFRING")
+#endif()
+#
+#if(OPT_IOMODE_DPDK)
+# set(CAPTURE_MODE "DPDK")
+#endif()
+#
+#if(OPT_IOMODE_PAG_N95)
+# set(CAPTURE_MODE "PAG_N95")
+#endif()
if(OPT_IOMODE_MARSIO)
set(CAPTURE_MODE "MARSIO")
@@ -83,17 +91,17 @@ if(CAPTURE_MODE MATCHES "PAG")
set(CAPTURE_DEFINITIONS -DCAPTURE_MODE_PAG)
endif()
-if(CAPTURE_MODE MATCHES "PPF")
- set(CAPTURE_DEFINITIONS -DCAPTURE_MODE_PPF)
-endif()
-
-if(CAPTURE_MODE MATCHES "PFRING")
- set(CAPTURE_DEFINITIONS -DCAPTURE_MODE_PFRING)
-endif()
-
-if(CAPTURE_MODE MATCHES "DPDK")
- set(CAPTURE_DEFINITIONS -DCAPTURE_MODE_DPDK)
-endif()
+#if(CAPTURE_MODE MATCHES "PPF")
+# set(CAPTURE_DEFINITIONS -DCAPTURE_MODE_PPF)
+#endif()
+#
+#if(CAPTURE_MODE MATCHES "PFRING")
+# set(CAPTURE_DEFINITIONS -DCAPTURE_MODE_PFRING)
+#endif()
+#
+#if(CAPTURE_MODE MATCHES "DPDK")
+# set(CAPTURE_DEFINITIONS -DCAPTURE_MODE_DPDK)
+#endif()
if(CAPTURE_MODE MATCHES "MARSIO")
set(CAPTURE_DEFINITIONS -DCAPTURE_MODE_MARSIO -DIOMODE_MARSIO)
@@ -163,7 +171,7 @@ install(PROGRAMS ${CMAKE_BINARY_DIR}/entry/sapp DESTINATION .)
install(PROGRAMS run/r2 DESTINATION .)
install(PROGRAMS run/r3 DESTINATION .)
-install(PROGRAMS run/vv.py DESTINATION .)
+#install(PROGRAMS run/vv.py DESTINATION .)
install(PROGRAMS run/pag.conf DESTINATION .)
install(PROGRAMS run/memchk.sh DESTINATION .)
install(FILES run/conf/gdev_block.conf DESTINATION conf)
@@ -177,26 +185,28 @@ install(FILES run/conf/send_route.conf DESTINATION conf)
install(FILES run/conf/streamid.txt DESTINATION conf)
install(FILES run/conf/plugin/entrylist.conf DESTINATION conf/plugin)
install(FILES run/conf/plugin/plugin.conf DESTINATION conf/plugin)
+install(FILES run/conf/vxlan_sport_service_map.conf DESTINATION conf)
if(CAPTURE_MODE MATCHES "MARSIO")
install(FILES ${CMAKE_BINARY_DIR}/packet_io/packet_io_marsio.so DESTINATION platform_lib)
endif()
-if(CAPTURE_MODE MATCHES "PCAP")
+#if(CAPTURE_MODE MATCHES "PCAP")
install(FILES ${CMAKE_BINARY_DIR}/packet_io/packet_io_pcap.so DESTINATION platform_lib)
-endif()
+#endif()
install(FILES run/plug/protocol/conflist_protocol.inf DESTINATION plug/protocol)
-install(FILES run/plug/protocol/isakmp_protocol_plug/isakmp_protocol_plug.inf DESTINATION plug/protocol/isakmp_protocol_plug)
-install(FILES ${CMAKE_BINARY_DIR}/inner_plug/isakmp_protocol_plug.so DESTINATION plug/protocol/isakmp_protocol_plug)
-
-install(FILES run/plug/protocol/l2tp_protocol_plug/l2tp_protocol_plug.inf DESTINATION plug/protocol/l2tp_protocol_plug)
-install(FILES ${CMAKE_BINARY_DIR}/inner_plug/l2tp_protocol_plug.so DESTINATION plug/protocol/l2tp_protocol_plug)
+if(NOT PLATFORM_MODE_SERIAL)
+ install(FILES run/plug/protocol/isakmp_protocol_plug/isakmp_protocol_plug.inf DESTINATION plug/protocol/isakmp_protocol_plug)
+ install(FILES ${CMAKE_BINARY_DIR}/inner_plug/isakmp_protocol_plug.so DESTINATION plug/protocol/isakmp_protocol_plug)
-install(FILES run/plug/protocol/pptp_protocol_plug/pptp_protocol_plug.inf DESTINATION plug/protocol/pptp_protocol_plug)
-install(FILES ${CMAKE_BINARY_DIR}/inner_plug/pptp_protocol_plug.so DESTINATION plug/protocol/pptp_protocol_plug)
+ install(FILES run/plug/protocol/l2tp_protocol_plug/l2tp_protocol_plug.inf DESTINATION plug/protocol/l2tp_protocol_plug)
+ install(FILES ${CMAKE_BINARY_DIR}/inner_plug/l2tp_protocol_plug.so DESTINATION plug/protocol/l2tp_protocol_plug)
+ install(FILES run/plug/protocol/pptp_protocol_plug/pptp_protocol_plug.inf DESTINATION plug/protocol/pptp_protocol_plug)
+ install(FILES ${CMAKE_BINARY_DIR}/inner_plug/pptp_protocol_plug.so DESTINATION plug/protocol/pptp_protocol_plug)
+endif()
install(FILES run/plug/platform/conflist_platform.inf DESTINATION plug/platform)
@@ -211,3 +221,6 @@ install(FILES run/plug/business/conflist_business.inf DESTINATION plug/business)
install(FILES run/plug/business/test_app/test_app.inf DESTINATION plug/business/test_app)
install(FILES ${CMAKE_BINARY_DIR}/test_so/test_app_sapp.so DESTINATION plug/business/test_app)
install(FILES ${CMAKE_BINARY_DIR}/test_so/trace_delay.so DESTINATION plug/business/test_app)
+
+
+include(Package) \ No newline at end of file
diff --git a/cmake/Package.cmake b/cmake/Package.cmake
new file mode 100644
index 0000000..a797e6c
--- /dev/null
+++ b/cmake/Package.cmake
@@ -0,0 +1,36 @@
+if(CMAKE_BUILD_TYPE STREQUAL "Debug")
+ set(CPACK_PACKAGE_NAME "${project_name}-debug")
+else()
+ set(CPACK_PACKAGE_NAME ${project_name})
+endif()
+
+message(STATUS "Package: ${CPACK_PACKAGE_NAME}")
+
+set(CPACK_PACKAGE_VECDOR "MESA")
+set(CPACK_PACKAGE_VERSION_MAJOR "${VERSION_MAJOR}")
+set(CPACK_PACKAGE_VERSION_MINOR "${VERSION_MINOR}")
+set(CPACK_PACKAGE_VERSION_PATCH "${VERSION_PATCH}.${VERSION_BUILD}")
+set(CPACK_PACKAGING_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX})
+
+#set(CPACK_RPM_PACKAGE_DEBUG 1)
+
+# RPM Build
+set(CPACK_GENERATOR "RPM")
+set(CPACK_RPM_AUTO_GENERATED_FILE_NAME ON)
+set(CPACK_RPM_FILE_NAME "RPM-DEFAULT")
+set(CPACK_RPM_PACKAGE_VENDOR "MESA")
+set(CPACK_RPM_PACKAGE_AUTOREQPROV "no")
+set(CPACK_RPM_PACKAGE_RELEASE_DIST on)
+set(CPACK_RPM_DEBUGINFO_PACKAGE off)
+
+set(CPACK_BUILD_SOURCE_DIRS "${CMAKE_SOURCE_DIR}")
+
+# Must uninstall the debug package before install release package
+if(CMAKE_BUILD_TYPE STREQUAL "Debug")
+ set(CPACK_RPM_PACKAGE_CONFLICTS "${project_name}-debug")
+else()
+ set(CPACK_RPM_PACKAGE_CONFLICTS ${project_name})
+ # set(CPACK_STRIP_FILES TRUE)
+endif()
+
+include(CPack)
diff --git a/cmake/Version.cmake b/cmake/Version.cmake
index 0af0ab6..5bbb1dc 100644
--- a/cmake/Version.cmake
+++ b/cmake/Version.cmake
@@ -1,4 +1,3 @@
-
# Using autorevision.sh to generate version information
set(__SOURCE_AUTORESIVISION ${CMAKE_SOURCE_DIR}/autorevision.sh)
@@ -16,28 +15,32 @@ execute_process(COMMAND ${__AUTORESIVISION} -t cmake -o ${__VERSION_CACHE}
include(${__VERSION_CONFIG})
# extract major, minor, patch version from git tag
-string(REGEX REPLACE "^v([0-9]+)\\..*" "\\1" SAPP_VERSION_MAJOR "${VCS_TAG}")
-string(REGEX REPLACE "^v[0-9]+\\.([0-9]+).*" "\\1" SAPP_VERSION_MINOR "${VCS_TAG}")
-string(REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" SAPP_VERSION_PATCH "${VCS_TAG}")
+string(REGEX REPLACE "^v([0-9]+)\\..*" "\\1" VERSION_MAJOR "${VCS_TAG}")
+string(REGEX REPLACE "^v[0-9]+\\.([0-9]+).*" "\\1" VERSION_MINOR "${VCS_TAG}")
+string(REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" VERSION_PATCH "${VCS_TAG}")
-if(NOT SAPP_VERSION_MAJOR)
- set(SAPP_VERSION_MAJOR 3)
+if(NOT VERSION_MAJOR)
+ set(VERSION_MAJOR 3)
endif()
-if(NOT SAPP_VERSION_MINOR)
- set(SAPP_VERSION_MINOR 0)
+if(NOT VERSION_MINOR)
+ set(VERSION_MINOR 0)
endif()
-if(NOT SAPP_VERSION_PATCH)
- set(SAPP_VERSION_PATCH 0)
+if(NOT VERSION_PATCH)
+ set(VERSION_PATCH 0)
endif()
-set(SAPP_VERSION "${SAPP_VERSION_MAJOR}.${SAPP_VERSION_MINOR}.${SAPP_VERSION_PATCH}")
-set(SAPP_VERSION_BUILD "${VCS_SHORT_HASH}")
+set(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
+set(VERSION_BUILD "${VCS_SHORT_HASH}")
-# print information
-message(STATUS "Sapp Version: ${SAPP_VERSION}-${SAPP_VERSION_BUILD}")
+set(GIT_VERSION
+ "${VERSION}-${CMAKE_BUILD_TYPE}-${VERSION_BUILD}-${VCS_BRANCH}-${VCS_TAG}-${VCS_DATE}")
+
+string(REGEX REPLACE "[-:+/\\.]" "_" GIT_VERSION ${GIT_VERSION})
-set(SAPP_GIT_VERSION
- "${SAPP_VERSION}-${CMAKE_BUILD_TYPE}-${SAPP_VERSION_BUILD}-${VCS_BRANCH}-${VCS_TAG}-${VCS_DATE}")
-add_definitions(-DGITVER=\"${SAPP_GIT_VERSION}\")
+add_definitions(-DGIT_VERSION=\"${GIT_VERSION}\")
+
+
+# print information
+message(STATUS "Sapp Version: ${GIT_VERSION}")
diff --git a/entry/CMakeLists.txt b/entry/CMakeLists.txt
index c65d496..267a4a1 100644
--- a/entry/CMakeLists.txt
+++ b/entry/CMakeLists.txt
@@ -29,24 +29,24 @@ set(SAPP_MODULES iknow timestamp_record md5 symbol_check MESA_sleep MESA_socket_
target_link_libraries(sapp -Wl,--whole-archive ${SAPP_MODULES} -Wl,--no-whole-archive ${SAPP_DEPEND_DYN_LIB})
-if(CAPTURE_MODE MATCHES "PAG")
- target_link_libraries(sapp pag)
-endif()
-
-if(CAPTURE_MODE MATCHES "PPF")
- target_link_libraries(psapp ppf)
-endif()
-
-if(CAPTURE_MODE MATCHES "PFRING")
- target_link_libraries(sapp pfring)
-endif()
-
-if(CAPTURE_MODE MATCHES "DPDK")
- target_link_libraries(sapp nl2fwd)
-endif()
+#if(CAPTURE_MODE MATCHES "PAG")
+# target_link_libraries(sapp pag)
+#endif()
+#
+#if(CAPTURE_MODE MATCHES "PPF")
+# target_link_libraries(psapp ppf)
+#endif()
+#
+#if(CAPTURE_MODE MATCHES "PFRING")
+# target_link_libraries(sapp pfring)
+#endif()
+#
+#if(CAPTURE_MODE MATCHES "DPDK")
+# target_link_libraries(sapp nl2fwd)
+#endif()
# Target Install
-install(TARGETS sapp DESTINATION ${CMAKE_SOURCE_DIR}/run/)
+#install(TARGETS sapp DESTINATION ${CMAKE_SOURCE_DIR}/run/)
#install(FILES ${CMAKE_SOURCE_DIR}/build/inner_plug/libsapp_assistant.so DESTINATION /opt/MESA/lib)
#install(DIRECTORY conf/ DESTINATION ${CMAKE_SOURCE_DIR}/run/conf)
#install(DIRECTORY log/ DESTINATION ${CMAKE_SOURCE_DIR}/run/log)
diff --git a/entry/sapp_main.c b/entry/sapp_main.c
index b18d7ff..5023edf 100644
--- a/entry/sapp_main.c
+++ b/entry/sapp_main.c
@@ -83,7 +83,7 @@ static void signal_take_over(void)
int main(int argc, char *argv[])
{
if((argc == 2) && (strncasecmp(argv[1], "-v", 2) == 0)){
- const char *sapp_version = GITVER;
+ const char *sapp_version = GIT_VERSION;
printf("Platform version: %s\n", sapp_version);
exit(0);
}
diff --git a/packet_io/CMakeLists.txt b/packet_io/CMakeLists.txt
index 89e6b6d..4024fcd 100644
--- a/packet_io/CMakeLists.txt
+++ b/packet_io/CMakeLists.txt
@@ -17,26 +17,26 @@ endif()
add_definitions(-fPIC)
-if(CAPTURE_MODE MATCHES "PCAP")
- set(PACKET_IO_SOURCE ${PACKET_IO_SOURCE} packet_io_pcap.c)
- add_library(packet_io_pcap SHARED ${PACKET_IO_SOURCE})
+#if(CAPTURE_MODE MATCHES "PCAP")
+# set(PACKET_IO_SOURCE ${PACKET_IO_SOURCE} packet_io_pcap.c)
+ add_library(packet_io_pcap SHARED packet_io_pcap.c)
set_target_properties(packet_io_pcap PROPERTIES PREFIX "")
-endif()
+#endif()
if(CAPTURE_MODE MATCHES "PAG")
set(PACKET_IO_SOURCE ${PACKET_IO_SOURCE} packet_io_pag_marsio.c)
add_library(packet_io_pag_marsio SHARED ${PACKET_IO_SOURCE})
endif()
-if(CAPTURE_MODE MATCHES "PPF")
- set(PACKET_IO_SOURCE ${PACKET_IO_SOURCE} packet_io_ppf.c)
- add_library(packet_io_ppf SHARED ${PACKET_IO_SOURCE})
-endif()
-
-if(CAPTURE_MODE MATCHES "DPDK")
- set(PACKET_IO_SOURCE ${PACKET_IO_SOURCE} packet_io_dpdk.c)
- add_library(packet_io_dpdk SHARED ${PACKET_IO_SOURCE})
-endif()
+#if(CAPTURE_MODE MATCHES "PPF")
+# set(PACKET_IO_SOURCE ${PACKET_IO_SOURCE} packet_io_ppf.c)
+# add_library(packet_io_ppf SHARED ${PACKET_IO_SOURCE})
+#endif()
+#
+#if(CAPTURE_MODE MATCHES "DPDK")
+# set(PACKET_IO_SOURCE ${PACKET_IO_SOURCE} packet_io_dpdk.c)
+# add_library(packet_io_dpdk SHARED ${PACKET_IO_SOURCE})
+#endif()
if(CAPTURE_MODE MATCHES "MARSIO")
set(PACKET_IO_SOURCE ${PACKET_IO_SOURCE} packet_io_marsio.c)
diff --git a/packet_io/cycle_pkt_dump_pipe.c.bak b/packet_io/cycle_pkt_dump_pipe.c.bak
deleted file mode 100644
index 1db88b8..0000000
--- a/packet_io/cycle_pkt_dump_pipe.c.bak
+++ /dev/null
@@ -1,556 +0,0 @@
-#include "packet_io.h"
-#include "stream_internal.h"
-#include "stream_manage.h"
-#include "mesa_net.h"
-#include "sendpacket.h"
-#include "MESA_prof_load.h"
-#include "MESA_sleep.h"
-#include <stdio.h>
-#include <unistd.h>
-#include <assert.h>
-#include <errno.h>
-#include <pthread.h>
-#include <signal.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/prctl.h>
-
-/*
- 2015-04-15 , LiJia.
- ����cycle_pkt_dump����,
- ����ʵʱѭ���洢���ݰ���Ŀ���ǽ�����߻�����������ҵ���ֻ����һ��core, ��BUG�޷���������.
- sapp����coredump�� 'pkt_dump_file_root_dir'Ŀ¼��洢���һ��ʱ���յ��İ�,
- ���ö���ģʽ���֣����п��ܷ���BUG������Դ��
- ������������֣���pkt_dump_file_max_size�ʵ�����һЩ.
-
- ----- -----
- | S | | D |
- | A | ---���̹ܵ�--> | U |
- | P | | M |
- | P | | P |
- ----- -----
-
- Ϊʲô����sapp������, �յ�������������? ����ͨ�����̼�ͨ�Ÿ���һ�������ٴ洢?
- ��:
- sapp�յ���֮��, ����fwrite()�洢��, ��Ϊfwrite���л�����Ƶ�, ����֤����������д��Ӳ��.
- ���ǵ���fflush()��fclose(), �����ÿ������ǿ��ˢ��һ��, ����Ӱ���������,
- ������pipe()�����ݰ�������һ������, write()���غ�,
- ����sapp������������BUG, ����core dump��, ���ݰ�Ҳ�Ѿ���copy����һ������,
- pkt_dump�����ǿ϶����԰����һ����BUG�İ�, ��ȫ�ı��浽Ӳ�̵�.
-
- main.conf������1���µ�section��5������������:
- [pkt_dump]
- pkt_dump_switch=0 //�ܿ���
- pkt_dump_total_size=1000 //root_dir�ܼ�.pcap�ļ��Ĵ�С, ��λ:MB, ��ֹ������ƶ�������д��Ӳ��
- pkt_dump_file_max_size=200 //pcap�ļ�ÿ���߳̿������ֵ, ��λ:MB.
- pkt_dump_file_root_dir=/dev/shm //pcap�洢·��, �Ƽ�/dev/shm, ��Ӳ���ٶȿ�ܶ�
- pkt_dump_thread_seq=0,2,4,6,8 //ÿ���̵߳Ŀ��أ���Ϊ�����������ܾ޴��޷�ȫ���洢���Ǿ�����������ֻ���ò����̵߳�dump���� , all=ȫ����
-
-*/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-#if CYCLE_PKT_DUMP
-
-extern int g_use_MESA_sleep_sw;
-extern int MESA_mkdir_p(const char *pathname, mode_t mode);
-//extern time_t g_CurrentTime;
-extern int g_packet_io_thread_num;
-extern int g_iThreadNum; /* for dual_stack, start */
-static char G_PKT_DUMP_ROOT_DIR[PATH_MAX]; /* ����ָ��Ϊ/dev/shm, �ٶȿ� */
-static long G_PKT_DUMP_FILE_SIZE = 104857600; /* Ĭ��100MB, ���߳� */
-static int G_PKT_DUMP_SW = 0; /* Ĭ�Ϲر� */
-static int G_PKT_DUMP_PER_THREAD_SW[MAX_THREAD_NUM];
-static int pkt_dump_thread_num = 1;
-static char phony_mac_hdr[14] =
-{
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0x12, 0x23, 0x34, 0x56, 0x67, 0x78,
- 0x08, 0x00
-};
-typedef struct {
- unsigned int magic;
- unsigned short version_major;
- unsigned short version_minor;
- unsigned int thiszone; /* gmt to local correction */
- unsigned int sigfigs; /* accuracy of timestamps */
- unsigned int snaplen; /* max length saved portion of each pkt */
- unsigned int linktype; /* data link type (LINKTYPE_*) */
-}pkt_dump_file_hdr_t;
-
-struct pkt_dump_timeval {
- unsigned int tv_sec; /* seconds */
- unsigned int tv_usec; /* microseconds */
-};
-
-typedef struct {
- struct pkt_dump_timeval ts; /* time stamp */
- unsigned int caplen; /* length of portion present */
- unsigned int len; /* length this packet (off wire) */
-}pkt_dump_pkt_hdr_t;
-
-typedef struct{
- enum addr_type_t low_layer_type; /* ԭʼ����ײ�Э�������, ������MAC(pcap����), Ҳ������IPv4(pag����) */
- int raw_pkt_len; /* ԭʼ���ܳ��� */
- //char pkt_data[];
-}pkt_dump_pipe_t;
-
-static int G_PKT_DUMP_PIPE[MAX_THREAD_NUM][2];
-static const pkt_dump_file_hdr_t pfile_hdr =
-{
- 0xA1B2C3D4,
- 0x0002,
- 0x0004,
- 0,
- 0,
- 0xFFFF,
- 1
-};
-
-/* reliable read */
-static inline ssize_t Rread(int fd, void *buf, size_t expect_count)
-{
- ssize_t ret;
- void *save_ptr = buf;
- size_t left_count = expect_count;
-
- while(left_count > 0){
-retry:
- ret = read(fd, save_ptr, left_count);
- if(ret < 0){
- switch(errno){
- case EAGAIN:
- if(0 == g_use_MESA_sleep_sw){
- usleep(1);
- }else{
- MESA_sleep();
- }
- /* no break here!!! no break here!!! no break here!!!*/
- case EINTR:
- goto retry;
- break;
-
- default:
- printf("pkt dump, read error:%s, ptr=%p, expect_count=%lu, left_count=%lu\n",
- strerror(errno), save_ptr, expect_count, left_count);
- break;
- }
- }else if(0 == ret){
- return 0; /* peer close */
- }else{
- save_ptr = (char *)save_ptr + ret;
- left_count -= ret;
- }
- }
-
- return expect_count - left_count;
-}
-
-/* reliable write */
-static inline ssize_t Rwrite(int fd, const void *buf, size_t expect_count)
-{
- ssize_t ret;
- const void *real_ptr = buf;
- size_t left_count = expect_count;
-
- while(left_count > 0){
-retry:
- ret = write(fd, real_ptr, left_count);
- if(ret < 0){
- switch(errno){
- case EINTR:
- goto retry;
- break;
-
- default:
- printf("pkt dump, write error:%s\n", strerror(errno));
- /* д�������ռ䲻��, ��������, �����Ӱ���������������� */
- break;
- }
- }else{
- real_ptr = (const char *)real_ptr + ret;
- left_count -= ret;
- }
- }
-
- return expect_count - left_count;
-}
-
-static void *cycle_pkt_dump_thread(void *arg)
-{
- int thread_seq = *((int *)arg);
- FILE *fp;
- int file_name_post_prefix = 0, ret, pfile_hdr_flag = 0;
- long tot_pcap_file_len = 0;
- char pkt_buf[65536];
- char dump_file_name[PATH_MAX];
- pkt_dump_pkt_hdr_t *ppkt_hdr;
- unsigned int pkt_len;
- int skip_pkt_hdr_len; /* Ԥ����ͷ���ռ䳤��, ���ݲ���ģʽ��ͬ, ���ܻ����Eth�� */
-
- snprintf(dump_file_name, PATH_MAX, "%s/pid_%d.tid_%d.%d.pcap",
- G_PKT_DUMP_ROOT_DIR, getppid(), thread_seq, file_name_post_prefix);
- fp = fopen(dump_file_name, "w+");
- if(NULL == fp){
- printf("fopen %s error!\n", dump_file_name);
- goto done;
- }
- ppkt_hdr = (pkt_dump_pkt_hdr_t *)pkt_buf;
- ppkt_hdr->ts.tv_usec = 0;
-#ifdef CAPTURE_MODE_PAG
- memcpy(pkt_buf+sizeof(pkt_dump_pkt_hdr_t), phony_mac_hdr, 14);
- skip_pkt_hdr_len = sizeof(pkt_dump_pkt_hdr_t) + 14;
-#else
- skip_pkt_hdr_len = sizeof(pkt_dump_pkt_hdr_t);
-#endif
- while(1){
- /* �Ȼ�ȡ������ */
- ret = Rread(G_PKT_DUMP_PIPE[thread_seq][0], &pkt_len, sizeof(int));
- if(0 == ret){
- goto done;
- }else if(ret < 0){
- continue;
- }
- if(ret != sizeof(int))
- {
- printf("read hdr, but ret=%d\n", ret);
- assert(0);
- }
-
- if((unsigned int )pkt_len > 65536){
- printf("pkt length is too long, len = %u\n", pkt_len);
- assert(0);
- }
-
- /* ��pcap��ͷ���ռ�Ԥ��, ����ֻ��һ��fwrite, �ͽ�ͷ��������һ��д�� */
- ret = Rread(G_PKT_DUMP_PIPE[thread_seq][0], (char *)pkt_buf+skip_pkt_hdr_len, pkt_len);
- if(0 == ret){
- goto done;
- }else if(ret < 0){
- /* ������ͷ����, ��û������, ��ô��? */
- assert(0);
- }
-
- if((unsigned int )ret != pkt_len)
- {
- printf("read pkt data, expect=%u, but ret=%d\n", pkt_len, ret);
- assert(0);
- }
-
- /* pcap file header, first time */
- if(0 == pfile_hdr_flag){
- fwrite(&pfile_hdr, sizeof(pkt_dump_file_hdr_t), 1, fp);
- tot_pcap_file_len += sizeof(pkt_dump_file_hdr_t);
- pfile_hdr_flag = 1;
- }
- /* ���°�����, ʱ��� */
- ppkt_hdr->ts.tv_sec = (unsigned int )g_CurrentTime;
-#ifdef CAPTURE_MODE_PAG
- ppkt_hdr->caplen = pkt_len+14;
- ppkt_hdr->len = pkt_len+14;
-#else
- ppkt_hdr->caplen = pkt_len;
- ppkt_hdr->len = pkt_len;
-#endif
-
-
- fwrite(pkt_buf, pkt_len+skip_pkt_hdr_len, 1, fp);
- tot_pcap_file_len += pkt_len+skip_pkt_hdr_len;
-
- /* �����������, ѭ��д�ļ� */
- if(tot_pcap_file_len >= G_PKT_DUMP_FILE_SIZE){
- fclose(fp);
- file_name_post_prefix = file_name_post_prefix ^ 1;
- snprintf(dump_file_name, PATH_MAX, "%s/pid_%d.tid_%d.%d.pcap",
- G_PKT_DUMP_ROOT_DIR, getppid(), thread_seq, file_name_post_prefix);
- fp = fopen(dump_file_name, "w+"); /* cycle write two files */
- if(NULL == fp){
- printf("fopen %s error!\n", dump_file_name);
- goto done;
- }
- tot_pcap_file_len = 0;
- pfile_hdr_flag = 0;
- }
- }
-
-done:
-
- return NULL;
-}
-
-
-void cycle_pkt_dump(int thread_seq, const raw_pkt_t *p_raw_pkt)
-{
- int ret;
-
- if((0 == G_PKT_DUMP_SW) || (0 == G_PKT_DUMP_PER_THREAD_SW[thread_seq])){
- return;
- }
-
- ret = Rwrite(G_PKT_DUMP_PIPE[thread_seq][1], &p_raw_pkt->raw_pkt_len, sizeof(int)); /* hdr, ��������Ϊͷ�� */
- if(ret < 0){
- printf("cycle_pkt_dump() write pkt hdr error: %s!\n", strerror(errno));
- return;
- }
- if(ret != sizeof(int)){
- printf("cycle_pkt_dump write pkt hdr, actual:%lu, ret:%d\n", sizeof(int), ret);
- }
-
- ret = Rwrite(G_PKT_DUMP_PIPE[thread_seq][1], p_raw_pkt->raw_pkt_data, p_raw_pkt->raw_pkt_len); /* raw data */
- if(ret < 0){
- printf("cycle_pkt_dump() write pkt hdr data: %s!\n", strerror(errno));
- return;
- }
-
- if(ret != p_raw_pkt->raw_pkt_len){
- printf("cycle_pkt_dump write pkt data, actual:%d, ret:%d\n", p_raw_pkt->raw_pkt_len, ret);
- }
-}
-
-void cycle_pkt_dump_old(int thread_seq, const void *ippkt, int ippktlen)
-{
- raw_pkt_t raw_pkt;
-
- raw_pkt.raw_pkt_data = ippkt;
- raw_pkt.raw_pkt_len = ippktlen;
-
- cycle_pkt_dump(thread_seq, &raw_pkt);
-}
-
-static void cycle_pkt_dump_exec(int argc, char *argv[])
-{
- int i;
- pid_t pid;
- pthread_t thread_id[MAX_THREAD_NUM];
- static int thread_seq[MAX_THREAD_NUM];
-
- pid = fork();
- if(0 == pid){ /* �������� */
- for(i = 0; i < pkt_dump_thread_num; i++){
- close(G_PKT_DUMP_PIPE[i][1]); /* close write end */
- }
- prctl(PR_SET_NAME, "cycle_pkt_dump", 0, 0, 0);
- }else if(pid > 0){
- for(i = 0; i < pkt_dump_thread_num; i++){
- close(G_PKT_DUMP_PIPE[i][0]); /* close read end */
- }
- usleep(10000);
- return; /* ������, ��sapp������ */
- }else{
- printf("cycle_pkt_dump fork error!\n");
- }
-
- for(i = 0; i < pkt_dump_thread_num; i++){
- if(G_PKT_DUMP_PER_THREAD_SW[i] != 0){
- thread_seq[i] = i;
- pthread_create(&thread_id[i], NULL, cycle_pkt_dump_thread, &thread_seq[i]);
- usleep(10);
- }
- }
-
- for(i = 0; i < pkt_dump_thread_num; i++){
- if(G_PKT_DUMP_PER_THREAD_SW[i] != 0){
- pthread_join(thread_id[i], NULL);
- }
- }
-
- exit(0);
-}
-
-static void cycle_pkt_dump_set_thread_num(int thread_num)
-{
- pkt_dump_thread_num = thread_num;
-}
-
-static int cycle_pkt_dump_get_core_num(void)
-{
- FILE *fp;
- char line_buf[PATH_MAX] = {0};
- int core_num = 0;
-
- fp = popen("ls -l core.* | wc -l", "r");
- if(NULL == fp){
- return -1;
- }
-
- fgets(line_buf, PATH_MAX, fp);
-
- core_num = atoi(line_buf);
-
- pclose(fp);
- return core_num;
-}
-
-/* config is like: "0,1,2,3,4,5" */
-static int cycle_pkt_dump_parse_per_thread_switch(char *config_str)
-{
- char *parse_config = config_str;
- char *save_ptr;
- char *token;
- int i, thread_seq;
-
- if(strncasecmp("all", config_str, 3) == 0){ /* all thread is enable */
- for(i = 0; i < pkt_dump_thread_num; i++){
- G_PKT_DUMP_PER_THREAD_SW[i] = 1;
- }
- return 0;
- }
-
- while((token = strtok_r(parse_config, ", \t", &save_ptr)) != NULL){
- thread_seq = atoi(token);
- if(thread_seq < 0 || thread_seq >= pkt_dump_thread_num){
- printf("'pkt_dump_thread_seq' config invalid, threadnum=%d!\n", pkt_dump_thread_num);
- return -1;
- }
- G_PKT_DUMP_PER_THREAD_SW[thread_seq] = 1;
- parse_config = NULL;
- }
-
- return 0;
-}
-
-
-static int cycle_pkt_dump_get_cur_files_size(void)
-{
- FILE *fp;
- int cur_files_size;
- char cmd_str[PATH_MAX], tmp_str[1024];
-
- snprintf(cmd_str, PATH_MAX, "du -scb %s/*.pcap | grep total | awk {'print $1'}", G_PKT_DUMP_ROOT_DIR);
-
- fp = popen(cmd_str, "r");
- if(NULL == fp){
- return -1;
- }
-
- if(NULL == fgets(tmp_str, 1024, fp)){
- return -1;
- }
- cur_files_size = atoi(tmp_str);
-
- pclose(fp);
-
- return cur_files_size;
-}
-
-static int cycle_pkt_dump_get_cur_enable_thread(void)
-{
- int i, sum = 0;
-
- for(i = 0; i < MAX_THREAD_NUM; i++){
- if(G_PKT_DUMP_PER_THREAD_SW[i] > 0){
- sum++;
- }
- }
-
- return sum;
-}
-/*
- total_files_size: ��Ŀ¼���ܵ�.pcap����С, ��λ:Byte;
- file_size_per_thread_by_conf: �����߳�����ļ���С, ��λ:Byte;
-
- ���յ�ʵ��file_size_per_threadֵ, ȡ���ڵ�ǰ���е�.pcap�ļ���С��total_files_size�Ĺ�ϵ;
- �����ǰ���е�.pcap�ļ��ѳ���total_files_size, ����д�µ��ļ�.
-*/
-static int cycle_pkt_dump_set_file_size(int total_files_size, int file_size_per_thread_by_conf)
-{
- int cur_files_size, cur_enable_thread_num = 0;
- int file_size_per_thread_by_calc; /* ����ʵ�ʼ���ó���ÿ���߳�����ļ���С */
-
- cur_files_size = cycle_pkt_dump_get_cur_files_size();
- if(cur_files_size < 0 || cur_files_size >= total_files_size){
- printf("Warning: pkt_dump is enable, but current files size is more than 'pkt_dump_total_size'!\n");
- G_PKT_DUMP_SW = 0;
- return -1;
- }
-
- cur_enable_thread_num = cycle_pkt_dump_get_cur_enable_thread();
- if(0 == cur_enable_thread_num){
- return -1;
- }
-
- file_size_per_thread_by_calc = (total_files_size-cur_files_size)/cur_enable_thread_num/2;
-
- /* ����ȡ��С */
- G_PKT_DUMP_FILE_SIZE = (file_size_per_thread_by_calc < file_size_per_thread_by_conf?file_size_per_thread_by_calc:file_size_per_thread_by_conf);
- if(G_PKT_DUMP_FILE_SIZE < 2048){
- printf("Warning: pkt_dump is enable, but current files size is more than 'pkt_dump_total_size'!\n");
- return -1;
- }
-
- return 0;
-}
-
-int cycle_pkt_dump_init(int argc, char *argv[])
-{
- int i, ret, int_tmp, total_files_size, core_num;
- char per_thread_sw[PATH_MAX];
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_switch", &G_PKT_DUMP_SW, 0);
-
- if(0 == G_PKT_DUMP_SW){
- return 0;
- }
-
- cycle_pkt_dump_set_thread_num(g_packet_io_thread_num);
-
- core_num = cycle_pkt_dump_get_core_num();
- if(core_num < 0 || core_num > 10){
- printf("Warning! core.* number is more than 10, pkt dump is auto disabled!\n");
- G_PKT_DUMP_SW = 0;
- return 0;
- }
-
- MESA_load_profile_string_def((char *)"conf/main.conf",(char *)"pkt_dump", (char *)"pkt_dump_file_root_dir", G_PKT_DUMP_ROOT_DIR, PATH_MAX, (char *)"./pkt_dump");
- MESA_mkdir_p(G_PKT_DUMP_ROOT_DIR, 0755);
-
- MESA_load_profile_string_nodef((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_thread_seq", per_thread_sw, PATH_MAX);
- if(cycle_pkt_dump_parse_per_thread_switch(per_thread_sw) < 0){
- return 0;
- }
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_total_size", &total_files_size, 1000);
- if(total_files_size < 1 || (unsigned int)total_files_size >= 1024*100 /* 100GB */){
- printf("pkt_dump_total_size invalid!\n");
- return -1;
- }
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_file_max_size", &int_tmp, 100);
- if(int_tmp < 2 || (unsigned int)int_tmp >= 1024*100 /* 100GB */){
- printf("pkt_dump_file_max_size invalid!\n");
- return -1;
- }
- /* ÿ���߳���Ҫѭ��д2���ļ�, ������Ҫ��pkt_dump_file_max_size��ʵ��ֵ�ٳ���2 */
- if(cycle_pkt_dump_set_file_size(total_files_size*1024*1024, int_tmp*1024*512) < 0){
- return 0;
- }
-
- for(i = 0; i < pkt_dump_thread_num; i++){
- //ret = pipe2(G_PKT_DUMP_PIPE[i], O_NONBLOCK); /* ʹ�÷�����ģʽ, ������̫����, ��ʹ������ģʽ�� */
- ret = pipe(G_PKT_DUMP_PIPE[i]);
- if(ret < 0){
- return -1;
- }
- }
-
- signal(SIGPIPE, SIG_IGN);
-
- cycle_pkt_dump_exec(argc, argv);
-
- printf("\033[41mWarning! pkt dump enable, this maybe encumber performance.\033[0m\n");
- sleep(1);
- printf("\033[41mWarning! pkt dump enable, this maybe encumber performance.\033[0m\n");
- sleep(1);
-
- return 0;
-}
-
-
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
diff --git a/packet_io/cycle_pkt_dump_through_write.c.bak b/packet_io/cycle_pkt_dump_through_write.c.bak
deleted file mode 100644
index ee6a59d..0000000
--- a/packet_io/cycle_pkt_dump_through_write.c.bak
+++ /dev/null
@@ -1,975 +0,0 @@
-#include "packet_io.h"
-#include "stream_internal.h"
-#include "stream_manage.h"
-#include "mesa_net.h"
-#include "sendpacket.h"
-#include "MESA_prof_load.h"
-#include "MESA_sleep.h"
-#include "MESA_socket_wrap.h"
-#include "iknow.h"
-#include <stdio.h>
-#include <unistd.h>
-#include <assert.h>
-#include <errno.h>
-#include <pthread.h>
-#include <signal.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/prctl.h>
-#include <sys/un.h>
-#include <execinfo.h>
-#include <pcap/pcap.h>
-
-/*
- 2015-04-15 , LiJia.
- ����cycle_pkt_dump����,
- ����ʵʱѭ���洢���ݰ���Ŀ���ǽ�����߻�����������ҵ���ֻ����һ��core, ��BUG�޷���������.
- sapp����coredump�� 'pkt_dump_file_root_dir'Ŀ¼��洢���һ��ʱ���յ��İ�,
- ���ö���ģʽ���֣����п��ܷ���BUG������Դ��
- ������������֣���pkt_dump_file_max_size�ʵ�����һЩ.
-
- main.conf������1���µ�section��5������������:
- [pkt_dump]
- pkt_dump_switch=0 //�ܿ���
- pkt_dump_total_size=1000 //root_dir�ܼ�.pcap�ļ��Ĵ�С, ��λ:MB, ��ֹ������ƶ�������д��Ӳ��
- pkt_dump_file_max_size=200 //pcap�ļ�ÿ���߳̿������ֵ, ��λ:MB.
- pkt_dump_file_root_dir=/dev/shm //pcap�洢·��, �Ƽ�/dev/shm, ��Ӳ���ٶȿ�ܶ�
- pkt_dump_thread_seq=0,2,4,6,8 //ÿ���̵߳Ŀ��أ���Ϊ�����������ܾ޴��޷�ȫ���洢���Ǿ�����������ֻ���ò����̵߳�dump���� , all=ȫ����
-
-*/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-#define UNIX_DOMAIN_SOCKET_NAME "/tmp/.pktdump"
-#define PKT_DUMP_PROCESS_NAME "sapp_pkt_dump"
-
-extern iknow_handle PLATFORM_IHANDLE;
-
-enum dump_mode{
- PKT_DUMP_LOCAL_FILE = 1, /* д�����ļ� */
- PKT_DUMP_UDP_SOCKET = 2, /* д��UDP ij���˿� */
-};
-
-#if DEBUG
-#include "iknow.h"
-
-typedef struct{
- unsigned long long total_pkt_num;
- unsigned long long total_pkt_bytes;
- unsigned long long discard_pkt_num;
- unsigned long long discard_pkt_bytes;
- char __pad__[32]; /* 64�ֽ�cache���� */
-}pkt_dump_status_t;
-static pkt_dump_status_t PKT_DISCARD_STAT[MAX_THREAD_NUM];
-
-#endif
-
-extern int g_packet_io_cap_level;
-extern int g_use_MESA_sleep_sw;
-extern int MESA_mkdir_p(const char *pathname, mode_t mode);
-//extern time_t g_CurrentTime;
-extern int g_packet_io_thread_num;
-extern int g_iThreadNum; /* for dual_stack, start */
-static char G_PKT_DUMP_ROOT_DIR[PATH_MAX]; /* ����ָ��Ϊ/dev/shm, �ٶȿ� */
-static long G_PKT_DUMP_FILE_SIZE = 104857600; /* Ĭ��100MB, ���߳� */
-int G_PKT_DUMP_SW = 0; /* Ĭ�Ϲر� */
-int G_PKT_DUMP_MODE = PKT_DUMP_LOCAL_FILE; /* Ĭ����д�������ļ� */
-static int G_PKT_DUMP_PER_THREAD_SW[MAX_THREAD_NUM];
-
-static int pkt_dump_thread_num = 1;
-
-static FILE *G_PKT_DUMP_FP[MAX_THREAD_NUM];
-static int G_FILENAME_INDEX[MAX_THREAD_NUM];
-static long G_PCAP_SIZE[MAX_THREAD_NUM];
-static char G_PKT_DUMP_FILTER_STR[PATH_MAX];
-static struct bpf_program G_PKT_DUMP_BPF_FILTER[MAX_THREAD_NUM];
-static pcap_t *phony_pcap_handle[MAX_THREAD_NUM]; /* ������BPF����ʱʹ�� */
-
-static unsigned short pkt_dump_tcp_bind_port = 12345; /* Ĭ��TCP�����˿�, ���ڽ����ⲿtcpdump���� */
-static int pkt_dump_tcp_cmd_sd = -1;/* TCP fd, ���ڽ����ⲿtcpdump���� */
-static volatile int pkt_dump_udp_socket_peer_alive = 0; /* �ⲿtcpdump�Ƿ��� */
-static int pkt_dump_udp_pkt_sd[MAX_THREAD_NUM]; /* UDP�������ݰ�fd */
-static struct sockaddr_in udp_recv_addr;
-
-static unsigned char phony_mac_hdr[14] =
-{
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0x12, 0x23, 0x34, 0x56, 0x67, 0x78,
- 0x08, 0x00
-};
-typedef struct {
- unsigned int magic;
- unsigned short version_major;
- unsigned short version_minor;
- unsigned int thiszone; /* gmt to local correction */
- unsigned int sigfigs; /* accuracy of timestamps */
- unsigned int snaplen; /* max length saved portion of each pkt */
- unsigned int linktype; /* data link type (LINKTYPE_*) */
-}pkt_dump_file_hdr_t;
-
-struct pkt_dump_timeval {
- unsigned int tv_sec; /* seconds */
- unsigned int tv_usec; /* microseconds */
-};
-
-typedef struct {
- struct pkt_dump_timeval ts; /* time stamp */
- unsigned int caplen; /* length of portion present */
- unsigned int len; /* length this packet (off wire) */
-}pkt_dump_pkt_hdr_t;
-
-typedef struct{
- enum addr_type_t low_layer_type; /* ԭʼ����ײ�Э�������, ������MAC(pcap����), Ҳ������IPv4(pag����) */
- int raw_pkt_len; /* ԭʼ���ܳ��� */
- //char pkt_data[];
-}pkt_dump_pipe_t;
-
-
-static const pkt_dump_file_hdr_t pfile_hdr =
-{
- 0xA1B2C3D4,
- 0x0002,
- 0x0004,
- 0,
- 0,
- 0xFFFF,
- 1
-};
-
-/* reliable read */
-static inline ssize_t Rread(int fd, void *buf, size_t expect_count)
-{
- ssize_t ret;
- void *save_ptr = buf;
- size_t left_count = expect_count;
-
- while(left_count > 0){
-retry:
- ret = read(fd, save_ptr, left_count);
- if(ret < 0){
- switch(errno){
- case EAGAIN:
- if(0 == g_use_MESA_sleep_sw){
- usleep(1);
- }else{
- MESA_sleep();
- }
- /* no break here!!! no break here!!! no break here!!!*/
- case EINTR:
- goto retry;
- break;
-
- default:
- printf("pkt dump, read error:%s, ptr=%p, expect_count=%lu, left_count=%lu\n",
- strerror(errno), save_ptr, expect_count, left_count);
- break;
- }
- }else if(0 == ret){
- return 0; /* peer close */
- }else{
- save_ptr = (char *)save_ptr + ret;
- left_count -= ret;
- }
- }
-
- return expect_count - left_count;
-}
-
-/* reliable write */
-static inline ssize_t Rwrite(int fd, const void *buf, size_t expect_count)
-{
- ssize_t ret;
- const void *real_ptr = buf;
- size_t left_count = expect_count;
-
- while(left_count > 0){
-retry:
- ret = write(fd, real_ptr, left_count);
- if(ret < 0){
- switch(errno){
- case EINTR:
- goto retry;
- break;
-
- default:
- printf("pkt dump, write error:%s\n", strerror(errno));
- /* д�������ռ䲻��, ��������, �����Ӱ���������������� */
- break;
- }
- }else{
- real_ptr = (const char *)real_ptr + ret;
- left_count -= ret;
- }
- }
-
- return expect_count - left_count;
-}
-
-#if 0
-static void *cycle_pkt_dump_check_father(void *arg)
-{
- while(1){
- if(1 == getppid()){ /* �����̱�Ϊinit, ˵���������Ѿ��˳� */
- exit(1);
- }else{
- usleep(100000);
- }
- }
-
- return NULL;
-}
-
-
-static void *cycle_pkt_dump_thread(void *arg)
-{
- int thread_seq = *((int *)arg);
- FILE *fp;
- int file_name_post_prefix = 0, ret, pfile_hdr_flag = 0;
- long tot_pcap_file_len = 0;
- char pkt_buf[65536];
- char dump_file_name[PATH_MAX];
- pkt_dump_pkt_hdr_t *ppkt_hdr;
- int pkt_len;
- int skip_pkt_hdr_len; /* Ԥ����ͷ���ռ䳤��, ���ݲ���ģʽ��ͬ, ���ܻ����Eth�� */
-
- snprintf(dump_file_name, PATH_MAX, "%s/pid_%d.tid_%d.%d.pcap",
- G_PKT_DUMP_ROOT_DIR, getpid(), thread_seq, file_name_post_prefix);
- fp = fopen(dump_file_name, "w+");
- if(NULL == fp){
- printf("fopen %s error!\n", dump_file_name);
- goto done;
- }
- ppkt_hdr = (pkt_dump_pkt_hdr_t *)pkt_buf;
- ppkt_hdr->ts.tv_usec = 0;
-#ifdef CAPTURE_MODE_PAG
- memcpy(pkt_buf+sizeof(pkt_dump_pkt_hdr_t), phony_mac_hdr, 14);
- skip_pkt_hdr_len = sizeof(pkt_dump_pkt_hdr_t) + 14;
-#else
- skip_pkt_hdr_len = sizeof(pkt_dump_pkt_hdr_t);
-#endif
- while(1){
- /* ��pcap��ͷ���ռ�Ԥ��, ����ֻ��һ��fwrite, �ͽ�ͷ��������һ��д�� */
- pkt_len = read(G_UNIX_DOMAIN_SD[thread_seq], (char *)pkt_buf+skip_pkt_hdr_len, 2048);
- if(0 == pkt_len){
- goto done;
- }else if(pkt_len < 0){
- continue;
- }
-
- /* pcap file header, first time */
- if(0 == pfile_hdr_flag){
- fwrite(&pfile_hdr, sizeof(pkt_dump_file_hdr_t), 1, fp);
- tot_pcap_file_len += sizeof(pkt_dump_file_hdr_t);
- pfile_hdr_flag = 1;
- }
- /* ���°�����, ʱ��� */
- ppkt_hdr->ts.tv_sec = (unsigned int )g_CurrentTime;
-#ifdef CAPTURE_MODE_PAG
- ppkt_hdr->caplen = pkt_len+14;
- ppkt_hdr->len = pkt_len+14;
-#else
- ppkt_hdr->caplen = pkt_len;
- ppkt_hdr->len = pkt_len;
-#endif
-
- fwrite(pkt_buf, pkt_len+skip_pkt_hdr_len, 1, fp);
- tot_pcap_file_len += pkt_len+skip_pkt_hdr_len;
-
- /* �����������, ѭ��д�ļ� */
- if(tot_pcap_file_len >= G_PKT_DUMP_FILE_SIZE){
- fclose(fp);
- file_name_post_prefix = file_name_post_prefix ^ 1;
- snprintf(dump_file_name, PATH_MAX, "%s/pid_%d.tid_%d.%d.pcap",
- G_PKT_DUMP_ROOT_DIR, getpid(), thread_seq, file_name_post_prefix);
- fp = fopen(dump_file_name, "w+"); /* cycle write two files */
- if(NULL == fp){
- printf("fopen %s error!\n", dump_file_name);
- goto done;
- }
- tot_pcap_file_len = 0;
- pfile_hdr_flag = 0;
- }
- }
-
-done:
-
- return NULL;
-}
-#endif
-
-static void __do_cycle_pkt_dump_udp_socket(int thread_seq, const raw_pkt_t *p_raw_pkt)
-{
- if(1 == pkt_dump_udp_socket_peer_alive){
- if(g_packet_io_cap_level != CAP_LEVEL_MAC){
- if(0 == bpf_filter(G_PKT_DUMP_BPF_FILTER[thread_seq].bf_insns,
- (const unsigned char *)p_raw_pkt->raw_pkt_data-14,
- p_raw_pkt->raw_pkt_len+14, p_raw_pkt->raw_pkt_len+14)){
- return;
- }
- }else{
- if(0 == bpf_filter(G_PKT_DUMP_BPF_FILTER[thread_seq].bf_insns,
- (const unsigned char *)p_raw_pkt->raw_pkt_data,
- p_raw_pkt->raw_pkt_len, p_raw_pkt->raw_pkt_len)){
- return;
- }
- }
-
- /* bingo, match filter, sendto, TODO, if error, such as EAGAIN, EINTR */
- sendto(pkt_dump_udp_pkt_sd[thread_seq], p_raw_pkt->raw_pkt_data, p_raw_pkt->raw_pkt_len,
- MSG_DONTWAIT,
- (const struct sockaddr *)&udp_recv_addr,
- sizeof(udp_recv_addr));
- }
-}
-
-static void __do_cycle_pkt_dump(int thread_seq, const raw_pkt_t *p_raw_pkt)
-{
- int ret;
- /* ����Ϊpcap_hdr[2]����,��һ��СС��trick, ����[0]��ʾpcap��ͷ����Ϣ,
- ����[1]��ʾ��PAGģʽ��, �洢��etherhdr, pkt_dump_pkt_hdr_tΪ16�ֽ�, ���ÿ��Է�һ��������ether hdr.
- */
- pkt_dump_pkt_hdr_t pcap_hdr[2];
- int write_hdr_len;
- char dump_file_name[PATH_MAX];
-
- if(PKT_DUMP_LOCAL_FILE == G_PKT_DUMP_MODE){
- if(0 == G_PKT_DUMP_PER_THREAD_SW[thread_seq]){
- return;
- }
- }else{
- __do_cycle_pkt_dump_udp_socket(thread_seq, p_raw_pkt);
- return;
- }
-
- if(G_PKT_DUMP_FILTER_STR[0] != '\0'){
- if(g_packet_io_cap_level != CAP_LEVEL_MAC){
- if(0 == bpf_filter(G_PKT_DUMP_BPF_FILTER[thread_seq].bf_insns,
- (const unsigned char *)p_raw_pkt->raw_pkt_data-14,
- p_raw_pkt->raw_pkt_len+14, p_raw_pkt->raw_pkt_len+14)){
- return;
- }
- }else{
- if(0 == bpf_filter(G_PKT_DUMP_BPF_FILTER[thread_seq].bf_insns,
- (const unsigned char *)p_raw_pkt->raw_pkt_data,
- p_raw_pkt->raw_pkt_len, p_raw_pkt->raw_pkt_len)){
- return;
- }
- }
- }
-
- if(unlikely(NULL == G_PKT_DUMP_FP[thread_seq])){
- snprintf(dump_file_name, PATH_MAX, "%s/pid_%d.tid_%d.%d.pcap",
- G_PKT_DUMP_ROOT_DIR, getpid(), thread_seq, G_FILENAME_INDEX[thread_seq]);
- G_PKT_DUMP_FP[thread_seq] = fopen(dump_file_name, "wb+");
- if(NULL == G_PKT_DUMP_FP[thread_seq]){
- printf("fopen %s error!\n", dump_file_name);
- return;
- }
- /* pcap file header, first time */
- fwrite(&pfile_hdr, sizeof(pkt_dump_file_hdr_t), 1, G_PKT_DUMP_FP[thread_seq]);
- }
-
- /* ���°�����, ʱ��� */
- pcap_hdr[0].ts.tv_sec = (unsigned int )g_CurrentTime;
-
- if(g_packet_io_cap_level != CAP_LEVEL_MAC){
- pcap_hdr[0].caplen = p_raw_pkt->raw_pkt_len+14;
- pcap_hdr[0].len = p_raw_pkt->raw_pkt_len+14;
- memcpy(&pcap_hdr[1], phony_mac_hdr, 14);
- write_hdr_len = sizeof(pkt_dump_pkt_hdr_t) + 14;
- }else{
- pcap_hdr[0].caplen = p_raw_pkt->raw_pkt_len;
- pcap_hdr[0].len = p_raw_pkt->raw_pkt_len;
- write_hdr_len = sizeof(pkt_dump_pkt_hdr_t);
- }
-
- ret = fwrite(&pcap_hdr[0], write_hdr_len, 1, G_PKT_DUMP_FP[thread_seq]);
- if(unlikely(ret < 1)){
- return;
- }
- ret = fwrite(p_raw_pkt->raw_pkt_data, p_raw_pkt->raw_pkt_len, 1, G_PKT_DUMP_FP[thread_seq]);
- if(unlikely(ret < 1)){
- /* ���ֻд��ͷ��, ��д���ݳ��ִ���, �ع� */
- fseek(G_PKT_DUMP_FP[thread_seq], (int)0-(int)sizeof(pkt_dump_pkt_hdr_t), SEEK_CUR);
- return;
- }
-
- /* �����������, ѭ��д�ļ� */
- G_PCAP_SIZE[thread_seq] += write_hdr_len + p_raw_pkt->raw_pkt_len;
- if(unlikely(G_PCAP_SIZE[thread_seq] >= G_PKT_DUMP_FILE_SIZE)){
- fclose(G_PKT_DUMP_FP[thread_seq]);
- G_FILENAME_INDEX[thread_seq] ^= 1;
- snprintf(dump_file_name, PATH_MAX, "%s/pid_%d.tid_%d.%d.pcap",
- G_PKT_DUMP_ROOT_DIR, getpid(), thread_seq, G_FILENAME_INDEX[thread_seq]);
- G_PKT_DUMP_FP[thread_seq] = fopen(dump_file_name, "wb+");
- if(NULL == G_PKT_DUMP_FP[thread_seq]){
- printf("fopen %s error!\n", dump_file_name);
- return;
- }
- /* pcap file header, first time */
- fwrite(&pfile_hdr, sizeof(pkt_dump_file_hdr_t), 1, G_PKT_DUMP_FP[thread_seq]);
- G_PCAP_SIZE[thread_seq] = 0;
- }
-
- return;
-}
-
-void cycle_pkt_dump(int thread_seq, const raw_pkt_t *p_raw_pkt)
-{
- if(likely(0 == G_PKT_DUMP_SW)){
- return;
- }
-
- __do_cycle_pkt_dump(thread_seq, p_raw_pkt);
-}
-
-void cycle_pkt_dump_old(int thread_seq, const void *ippkt, int ippktlen)
-{
- raw_pkt_t raw_pkt;
-
- raw_pkt.raw_pkt_data = ippkt;
- raw_pkt.raw_pkt_len = ippktlen;
-
- cycle_pkt_dump(thread_seq, &raw_pkt);
-}
-
-#if 0
-static int cycle_pkt_dump_child_init(void)
-{
- int i, ret;
- struct sockaddr_un father_pro_addr;
- int addr_len;
- char test_buf[1024];
- int buf_len = 0;
- socklen_t opt_len;
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- G_UNIX_DOMAIN_SD[i] = socket(AF_UNIX,SOCK_DGRAM,0);
- if(G_UNIX_DOMAIN_SD[i] < 0){
- printf("socket error: %s\n", strerror(errno));
- return -1;
- }
-
- addr_len = sizeof(father_pro_addr);
- father_pro_addr.sun_family=AF_UNIX;
- snprintf(father_pro_addr.sun_path, sizeof(father_pro_addr.sun_path), "%s%d", UNIX_DOMAIN_SOCKET_NAME, i);
-
- unlink(father_pro_addr.sun_path);
- if(bind(G_UNIX_DOMAIN_SD[i], (struct sockaddr *)&father_pro_addr, addr_len) < 0){
- printf("bind %s error: %s\n", father_pro_addr.sun_path, strerror(errno));
- return -1;
- }
-
- listen(G_UNIX_DOMAIN_SD[i], 10);
- }
-
- usleep(10000);
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- ret = read(G_UNIX_DOMAIN_SD[i], test_buf, 1024); /* �����ȴ��������̵�����, ��ȷ����˵���������� */
- if(ret <= 0){
- printf("socket read error:%s\n", strerror(errno));
- return -1;
- }
- }
-
- return 0;
-}
-#endif
-
-
-#if DEBUG
-static long ifuncb_show_pktdump_summary(iknow_handle ihandle, iknow_conn iconn, const void *cb_fun_arg, const char *cmd_args)
-{
- int i;
- unsigned long long discard_pkt_sum = 0, discard_byte_sum = 0;
- unsigned long long tot_pkt_sum = 0, tot_byte_sum = 0;
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- tot_pkt_sum += PKT_DISCARD_STAT[i].total_pkt_num;
- tot_byte_sum += PKT_DISCARD_STAT[i].total_pkt_bytes;
- discard_pkt_sum += PKT_DISCARD_STAT[i].discard_pkt_num;
- discard_byte_sum += PKT_DISCARD_STAT[i].discard_pkt_bytes;
- }
- //iprintf(ihandle, iconn,"NOTE: unit of byte for total is 'byte', for realtime is 'bps, bit per second'!\n");
- iprintf(ihandle, iconn, "%8s %8s %13s\n", "", "packet", "byte");
- iprintf(ihandle, iconn, "%8s %8llu %13llu\n", "total", tot_pkt_sum, tot_byte_sum);
- iprintf(ihandle, iconn, "%8s %8llu %13llu\n", "DROP", discard_pkt_sum, discard_byte_sum);
-
- return 0;
-}
-
-#endif
-
-#if 0
-static int cycle_pkt_dump_father_init(void)
-{
- int i;
- struct sockaddr_un child_pro_addr;
- int addr_len;
- char test_buf[1024] = "I am father";
- int buf_len = 0;
- socklen_t opt_len;
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- G_UNIX_DOMAIN_SD[i] = socket(AF_UNIX,SOCK_DGRAM,0);
- if(G_UNIX_DOMAIN_SD[i] < 0){
- printf("socket error: %s\n", strerror(errno));
- return -1;
- }
-
- addr_len = sizeof(child_pro_addr);
- child_pro_addr.sun_family=AF_UNIX;
- snprintf(child_pro_addr.sun_path, sizeof(child_pro_addr.sun_path), "%s%d", UNIX_DOMAIN_SOCKET_NAME, i);
-
- if(connect(G_UNIX_DOMAIN_SD[i], (struct sockaddr*)&child_pro_addr, addr_len) < 0){
- printf("connect %s error: %s\n", child_pro_addr.sun_path, strerror(errno));
- return -1;
- }
- }
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- write(G_UNIX_DOMAIN_SD[i], test_buf, 1024);
- }
-
- unlink(child_pro_addr.sun_path);
-#if DEBUG
- iknow_register_cmd(PLATFORM_IHANDLE, "show pktdump summary", "display packet dump status",
- ifuncb_show_pktdump_summary, NULL, 0, NULL);
-#endif
-
- return 0;
-}
-#endif
-
-#if 0
-static void cycle_pkt_dump_clear_last_status(void)
-{
- char cmd_buf[128];
-
- snprintf(cmd_buf, 128, "killall %s", PKT_DUMP_PROCESS_NAME);
-
- system(cmd_buf);
-}
-
-
-static void cycle_pkt_dump_exec(int argc, char *argv[])
-{
- int i;
- pid_t pid;
- pthread_t check_ppid, thread_id[MAX_THREAD_NUM];
- static int thread_seq[MAX_THREAD_NUM];
-
- cycle_pkt_dump_clear_last_status();
-
- pid = fork();
- if(0 == pid){ /* �ӽ���, ���������� */
- if(cycle_pkt_dump_child_init() < 0){
- printf("cycle pkt dump init error!\n");
- exit(1);
- }
- prctl(PR_SET_NAME, PKT_DUMP_PROCESS_NAME, 0, 0, 0);
- }else if(pid > 0){
- usleep(50000);
- if(cycle_pkt_dump_father_init() < 0){
- printf("cycle pkt dump init error!\n");
- exit(1);
- }
- return; /* �����̷���, ��sapp������ */
- }else{
- printf("cycle_pkt_dump fork error!\n");
- exit(0);
- }
-
- for(i = 0; i < pkt_dump_thread_num; i++){
- if(G_PKT_DUMP_PER_THREAD_SW[i] != 0){
- thread_seq[i] = i;
- pthread_create(&thread_id[i], NULL, cycle_pkt_dump_thread, &thread_seq[i]);
- usleep(100);
- }
- }
-
- pthread_create(&check_ppid, NULL, cycle_pkt_dump_check_father, NULL);
-
- /* �ӽ��̵����߳������ȴ� */
- for(i = 0; i < pkt_dump_thread_num; i++){
- if(G_PKT_DUMP_PER_THREAD_SW[i] != 0){
- pthread_join(thread_id[i], NULL);
- }
- }
-
- exit(0);
-}
-#endif
-
-static void cycle_pkt_dump_set_thread_num(int thread_num)
-{
- pkt_dump_thread_num = thread_num;
-}
-
-static int cycle_pkt_dump_get_core_num(void)
-{
- FILE *fp;
- char line_buf[PATH_MAX] = {0};
- int core_num = 0;
-
- fp = popen("ls -l core.* | wc -l", "r");
- if(NULL == fp){
- return -1;
- }
-
- fgets(line_buf, PATH_MAX, fp);
-
- core_num = atoi(line_buf);
-
- pclose(fp);
- return core_num;
-}
-
-/* config is like: "0,1,2,3,4,5" */
-static int cycle_pkt_dump_parse_per_thread_switch(char *config_str)
-{
- char *parse_config = config_str;
- char *save_ptr;
- char *token;
- int i, thread_seq;
-
- if(strncasecmp("all", config_str, 3) == 0){ /* all thread is enable */
- for(i = 0; i < pkt_dump_thread_num; i++){
- G_PKT_DUMP_PER_THREAD_SW[i] = 1;
- }
- return 0;
- }
-
- while((token = strtok_r(parse_config, ", \t", &save_ptr)) != NULL){
- thread_seq = atoi(token);
- if(thread_seq < 0 || thread_seq >= pkt_dump_thread_num){
- printf("'pkt_dump_thread_seq' config invalid, threadnum=%d!\n", pkt_dump_thread_num);
- return -1;
- }
- G_PKT_DUMP_PER_THREAD_SW[thread_seq] = 1;
- parse_config = NULL;
- }
-
- return 0;
-}
-
-
-static long cycle_pkt_dump_get_cur_files_size(void)
-{
- FILE *fp;
- long cur_files_size;
- char cmd_str[PATH_MAX], tmp_str[1024];
-
- snprintf(cmd_str, PATH_MAX, "du -scb %s | grep %s | awk {'print $1'}", G_PKT_DUMP_ROOT_DIR, G_PKT_DUMP_ROOT_DIR);
-
- fp = popen(cmd_str, "r");
- if(NULL == fp){
- return -1;
- }
-
- if(NULL == fgets(tmp_str, 1024, fp)){
- return -1;
- }
- cur_files_size = (long)strtol(tmp_str, NULL, 10);
-
- pclose(fp);
-
- return cur_files_size;
-}
-
-static int cycle_pkt_dump_get_cur_enable_thread(void)
-{
- int i, sum = 0;
-
- for(i = 0; i < MAX_THREAD_NUM; i++){
- if(G_PKT_DUMP_PER_THREAD_SW[i] > 0){
- sum++;
- }
- }
-
- return sum;
-}
-/*
- total_files_size: ��Ŀ¼���ܵ�.pcap����С, ��λ:Byte;
- file_size_per_thread_by_conf: �����߳�����ļ���С, ��λ:Byte;
-
- ���յ�ʵ��file_size_per_threadֵ, ȡ���ڵ�ǰ���е�.pcap�ļ���С��total_files_size�Ĺ�ϵ;
- �����ǰ���е�.pcap�ļ��ѳ���total_files_size, ����д�µ��ļ�.
-*/
-static int cycle_pkt_dump_set_file_size(long total_files_size, long file_size_per_thread_by_conf)
-{
- long cur_files_size;
- int cur_enable_thread_num = 0;
- long file_size_per_thread_by_calc; /* ����ʵ�ʼ���ó���ÿ���߳�����ļ���С */
-
- cur_files_size = cycle_pkt_dump_get_cur_files_size();
- if(cur_files_size < 0 || cur_files_size >= total_files_size){
- printf("\033[33m[Warning]pkt_dump is enable, but current files size is more than 'pkt_dump_total_size', disable pktdump!\033[0m\n");
- usleep(100000);
- G_PKT_DUMP_SW = 0;
- return -1;
- }
-
- cur_enable_thread_num = cycle_pkt_dump_get_cur_enable_thread();
- if(0 == cur_enable_thread_num){
- printf("\033[33m[Warning]pkt_dump is enable, but enable thread number is 0, disable pktdump!\033[0m\n");
- usleep(100000);
- return -1;
- }
-
- file_size_per_thread_by_calc = (total_files_size-cur_files_size)/cur_enable_thread_num/2;
-
- /* ����ȡ��С */
- G_PKT_DUMP_FILE_SIZE = (file_size_per_thread_by_calc < file_size_per_thread_by_conf?file_size_per_thread_by_calc:file_size_per_thread_by_conf);
- if(G_PKT_DUMP_FILE_SIZE < 2048){
- printf("\033[33m[Warning]pkt_dump is enable, but current files size is more than 'pkt_dump_total_size'!\033[0m\n");
- return -1;
- }
-
- return 0;
-}
-
-static void pkt_dump_sig_ignore(int sig)
-{
- return;
-}
-
-static void pkt_dump_sig_handle(int sig)
-{
- signal(SIGSEGV, pkt_dump_sig_ignore); /* SIGSEGV����������, ��һ����ٵ��жϴ�������ƭ��ϵͳ */
- sync(); /* ����������δд�����̵�����ǿ��д�� */
- abort(); /* ��ֹ����, ����core�ļ� */
-}
-
-static void cycle_pkt_dump_command_parse(int connfd)
-{
- char cmd_buf[1024];
- int i, ret;
- int *bpf_filter_len; /* with EOF */
- unsigned short *udp_rcv_port;
-
- /* �ȷ���2���ֽ�tcpdump UDP���ն˿� */
- ret = MESA_sock_greedy_read(connfd, cmd_buf, 2, -1);
- if(0 == ret){
- goto err_exit;
- }else if(ret < 0){
- printf("sock read error, %s\n", strerror(errno));
- goto err_exit;
- }
- udp_rcv_port = (unsigned short *)&cmd_buf[0];
-
- udp_recv_addr.sin_family = AF_INET;
- udp_recv_addr.sin_addr.s_addr = htonl(0x7f000001);
- udp_recv_addr.sin_port = htons(*udp_rcv_port);
-
- /* �ٷ���4���ֽڳ�����Ϣ, ��ʾBPF-filter���ַ�������, filter��EOF */
- ret = MESA_sock_greedy_read(connfd, cmd_buf, 4, -1);
- if(0 == ret){
- goto err_exit;
- }else if(ret < 0){
- printf("sock read error, %s\n", strerror(errno));
- goto err_exit;
- }
- bpf_filter_len = (int *)&cmd_buf[0];
-
- if(bpf_filter_len > 0){ /* ����û��filter */
- ret = MESA_sock_greedy_read(connfd, cmd_buf, (size_t )(*bpf_filter_len), -1);
- if(0 == ret){
- goto err_exit;
- }
- }
- for(i = 0; i < g_packet_io_thread_num; i++){
- phony_pcap_handle[i] = pcap_open_dead(DLT_EN10MB, 65535);
- if(NULL == phony_pcap_handle[i]){
- goto err_exit;
- }
-
- if(bpf_filter_len > 0){ /* ����û��filter */
- if(pcap_compile(phony_pcap_handle[i], &G_PKT_DUMP_BPF_FILTER[i], cmd_buf, 100, 0) < 0){
- printf("Compile pcap filter '%s' error:%s\n", cmd_buf, pcap_geterr(phony_pcap_handle[i]));
- goto err_exit;
- }
- }
- }
-
- pkt_dump_udp_socket_peer_alive = 1;
-
- while(MESA_sock_greedy_read(connfd, cmd_buf, 1, -1) != 0);
-
-err_exit:
- pkt_dump_udp_socket_peer_alive = 0;
- usleep(1000 * 500); /* ��ʱ�ͷ�, �������߳�����ʹ��BPF������ */
- for(i = 0; i < g_packet_io_thread_num; i++){
- pcap_freecode(&G_PKT_DUMP_BPF_FILTER[i]);
- }
- close(connfd);
- return;
-}
-
-static void * cycle_pkt_dump_udp_socket_daemon_thread(void *arg)
-{
- socklen_t cliaddr_len;
- struct sockaddr_in cliaddr;
- int connfd;
-#if(__GNUC__ * 100 + __GNUC_MINOR__ * 10 + __GNUC_PATCHLEVEL__ >= 480) /* �汾�ж�, �ܶ��ϵͳ�޷����� */
-#ifdef _GNU_SOURCE
- pthread_setname_np(pthread_self(), "sapp_pkt_dump");
-#endif
-#endif
-
- while(1){
- cliaddr_len = sizeof(cliaddr);
- connfd = accept(pkt_dump_tcp_cmd_sd, (struct sockaddr *) &cliaddr, &cliaddr_len);
- if(connfd > 0){
- cycle_pkt_dump_command_parse(connfd);
- }
- }
-
- return NULL;
-}
-
-static int cycle_pkt_dump_socket_init(void)
-{
- pthread_t pid;
- int i, opt;
- struct sockaddr_in sockadd;
-
- pkt_dump_tcp_cmd_sd = socket(AF_INET, SOCK_STREAM, 0);
-
- opt = 1;
- setsockopt(pkt_dump_tcp_cmd_sd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int));
-
- bzero(&sockadd, sizeof(sockadd));
- sockadd.sin_family = AF_INET;
- sockadd.sin_addr.s_addr = htonl(INADDR_ANY);
- sockadd.sin_port = htons(pkt_dump_tcp_bind_port);
-
- if(bind(pkt_dump_tcp_cmd_sd, (struct sockaddr *) &sockadd, sizeof(sockadd)) < 0){
- printf("pkt dump bind cmd port %u error, %s!\n", pkt_dump_tcp_bind_port, strerror(errno));
- return -1;
- }
- listen(pkt_dump_tcp_cmd_sd, 1);
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- pkt_dump_udp_pkt_sd[i] = socket(AF_INET, SOCK_DGRAM, 0);
- }
-
- pthread_create(&pid, NULL, cycle_pkt_dump_udp_socket_daemon_thread, NULL);
-
- return 0;
-}
-
-int cycle_pkt_dump_init(int argc, char *argv[])
-{
- int i, ret = 0;
- int int_tmp, total_files_size, core_num;
- char per_thread_sw[PATH_MAX];
- char pcap_errbuf[PCAP_ERRBUF_SIZE];
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_switch", &G_PKT_DUMP_SW, 0);
-
- if(0 == G_PKT_DUMP_SW){
- return 0;
- }
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_mode", &G_PKT_DUMP_MODE, 1);
- if((G_PKT_DUMP_MODE != PKT_DUMP_LOCAL_FILE) && (G_PKT_DUMP_MODE != PKT_DUMP_UDP_SOCKET)){
- printf("\n\033[41mError! pkt_dump_mode only support 1 or 2!\033[0m\n");
- return -1;
- }
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_cmd_port", &int_tmp, 12345);
- if((int_tmp <=0) || (int_tmp > 65535)){
- printf("\n\033[41mError! pkt_dump_cmd_port invalid, %d!\033[0m\n", int_tmp);
- return -1;
- }
- pkt_dump_tcp_bind_port = (unsigned short)int_tmp;
-
-#if 0 == CYCLE_PKT_DUMP
- printf("\n\033[33m[Warning]pkt_dump is enable, but sapp is not compile correct, please use debug=2.\033[0m\n");
- sleep(1);
-#endif
-
- if(PKT_DUMP_LOCAL_FILE == G_PKT_DUMP_MODE){
- cycle_pkt_dump_set_thread_num(g_packet_io_thread_num);
-
- core_num = cycle_pkt_dump_get_core_num();
- if(core_num < 0 || core_num > 10){
- printf("\033[33m[Warning]core.* number is more than 10, pkt dump is auto disabled!\n");
- G_PKT_DUMP_SW = 0;
- return 0;
- }
-
- MESA_load_profile_string_def((char *)"conf/main.conf",(char *)"pkt_dump", (char *)"pkt_dump_bpf_filter", G_PKT_DUMP_FILTER_STR, PATH_MAX, (char *)"");
- if(G_PKT_DUMP_FILTER_STR[0] != '\0'){
- for(i = 0; i < g_packet_io_thread_num; i++){
- phony_pcap_handle[i] = pcap_open_dead(DLT_EN10MB, 65535);
- if(NULL == phony_pcap_handle[i]){
- printf("pcap_open %s error, %s\n", "lo", pcap_errbuf);
- printf("\n\033[41mpkt_dump_bpf_filter is not enable!\033[0m\n");
- goto skip_bpf_filter;
- }
- if(pcap_compile(phony_pcap_handle[i], &G_PKT_DUMP_BPF_FILTER[i], G_PKT_DUMP_FILTER_STR, 100, 0) < 0){
- printf("Compile pcap filter '%s' error:%s\n", G_PKT_DUMP_FILTER_STR, pcap_geterr(phony_pcap_handle[i]));
- return -1;
- }
- }
- }
-
- skip_bpf_filter:
-
- MESA_load_profile_string_def((char *)"conf/main.conf",(char *)"pkt_dump", (char *)"pkt_dump_file_root_dir", G_PKT_DUMP_ROOT_DIR, PATH_MAX, (char *)"/tmp/pkt_dump");
- MESA_mkdir_p(G_PKT_DUMP_ROOT_DIR, 0755);
-
- MESA_load_profile_string_nodef((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_thread_seq", per_thread_sw, PATH_MAX);
- if(cycle_pkt_dump_parse_per_thread_switch(per_thread_sw) < 0){
- return 0;
- }
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_total_size", &total_files_size, 1000);
- if(total_files_size < 1 || (unsigned int)total_files_size >= 1024*100 /* 100GB */){
- printf("pkt_dump_total_size invalid!\n");
- return -1;
- }
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_file_max_size", &int_tmp, 100);
- if(int_tmp < 2 || (unsigned int)int_tmp >= 1024*100 /* 100GB */){
- printf("pkt_dump_file_max_size invalid!\n");
- return -1;
- }
- /* ÿ���߳���Ҫѭ��д2���ļ�, ������Ҫ��pkt_dump_file_max_size��ʵ��ֵ�ٳ���2 */
- if(cycle_pkt_dump_set_file_size((long)total_files_size*1024*1024, (long)int_tmp*1024*512) < 0){
- return 0;
- }
-
- signal(SIGPIPE, SIG_IGN);
- /* ����SIGSEGV�ź�, ��֤�����쳣��ֹʱ, ���һ������BUG��pcap��������д��Ӳ�� */
- if((SIG_ERR == signal(SIGSEGV, pkt_dump_sig_handle))){
- printf("Catch SIGSEGV error!\n");
- }
-
-#if DEBUG
- iknow_register_cmd(PLATFORM_IHANDLE, "show pkt dump summary", "display pkt dump summary",
- ifuncb_show_pktdump_summary, NULL, 0, NULL);
-#endif
- printf("\n\033[33m[Warning]pkt dump enable, this maybe encumber performance.\033[0m\n");
- sleep(1);
- }else{
- ret = cycle_pkt_dump_socket_init();
- }
-
- return ret;
-}
-
-
-#ifdef __cplusplus
-}
-#endif
-
-
-
diff --git a/packet_io/cycle_pkt_dump_through_write_offset.c.bak b/packet_io/cycle_pkt_dump_through_write_offset.c.bak
deleted file mode 100644
index cad996e..0000000
--- a/packet_io/cycle_pkt_dump_through_write_offset.c.bak
+++ /dev/null
@@ -1,1119 +0,0 @@
-#include "packet_io.h"
-#include "stream_internal.h"
-#include "stream_manage.h"
-#include "mesa_net.h"
-#include "sendpacket.h"
-#include "MESA_prof_load.h"
-#include "MESA_sleep.h"
-#include "MESA_socket_wrap.h"
-#include "iknow.h"
-#include "mesa_pkt_dump.h"
-#include <stdio.h>
-#include <unistd.h>
-#include <assert.h>
-#include <errno.h>
-#include <pthread.h>
-#include <signal.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/prctl.h>
-#include <sys/un.h>
-#include <execinfo.h>
-#include <pcap/pcap.h>
-
-/*
- 2015-04-15 , LiJia.
- ����cycle_pkt_dump����,
- ����ʵʱѭ���洢���ݰ���Ŀ���ǽ�����߻�����������ҵ���ֻ����һ��core, ��BUG�޷���������.
- sapp����coredump�� 'pkt_dump_file_root_dir'Ŀ¼��洢���һ��ʱ���յ��İ�,
- ���ö���ģʽ���֣����п��ܷ���BUG������Դ��
- ������������֣���pkt_dump_file_max_size�ʵ�����һЩ.
-
- main.conf������1���µ�section��5������������:
- [pkt_dump]
- pkt_dump_switch=0 //�ܿ���
- pkt_dump_total_size=1000 //root_dir�ܼ�.pcap�ļ��Ĵ�С, ��λ:MB, ��ֹ������ƶ�������д��Ӳ��
- pkt_dump_file_max_size=200 //pcap�ļ�ÿ���߳̿������ֵ, ��λ:MB.
- pkt_dump_file_root_dir=/dev/shm //pcap�洢·��, �Ƽ�/dev/shm, ��Ӳ���ٶȿ�ܶ�
- pkt_dump_thread_seq=0,2,4,6,8 //ÿ���̵߳Ŀ��أ���Ϊ�����������ܾ޴��޷�ȫ���洢���Ǿ�����������ֻ���ò����̵߳�dump���� , all=ȫ����
-
-*/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-#define UNIX_DOMAIN_SOCKET_NAME "/tmp/.pktdump"
-#define PKT_DUMP_PROCESS_NAME "sapp_pkt_dump"
-
-extern iknow_handle PLATFORM_IHANDLE;
-
-enum dump_mode{
- PKT_DUMP_LOCAL_FILE = 1, /* д�����ļ� */
- PKT_DUMP_UDP_SOCKET = 2, /* д��UDP ij���˿� */
-};
-
-#if DEBUG
-#include "iknow.h"
-
-typedef struct{
- unsigned long long total_pkt_num;
- unsigned long long total_pkt_bytes;
- unsigned long long discard_pkt_num;
- unsigned long long discard_pkt_bytes;
- char __pad__[32]; /* 64�ֽ�cache���� */
-}pkt_dump_status_t;
-static pkt_dump_status_t PKT_DISCARD_STAT[MAX_THREAD_NUM];
-
-#endif
-
-extern int g_packet_io_cap_level;
-extern int g_use_MESA_sleep_sw;
-extern int MESA_mkdir_p(const char *pathname, mode_t mode);
-//extern time_t g_CurrentTime;
-extern int g_packet_io_thread_num;
-extern int g_iThreadNum; /* for dual_stack, start */
-static char G_PKT_DUMP_ROOT_DIR[PATH_MAX]; /* ����ָ��Ϊ/dev/shm, �ٶȿ� */
-static long G_PKT_DUMP_FILE_SIZE = 104857600; /* Ĭ��100MB, ���߳� */
-int G_PKT_DUMP_SW = 0; /* Ĭ�Ϲر� */
-int G_PKT_DUMP_MODE = PKT_DUMP_LOCAL_FILE; /* Ĭ����д�������ļ� */
-static int G_PKT_DUMP_PER_THREAD_SW[MAX_THREAD_NUM];
-
-static int pkt_dump_thread_num = 1;
-
-static FILE *G_PKT_DUMP_FP[MAX_THREAD_NUM];
-static int G_FILENAME_INDEX[MAX_THREAD_NUM];
-static long G_PCAP_SIZE[MAX_THREAD_NUM];
-static char G_PKT_DUMP_FILTER_STR[PATH_MAX];
-static struct bpf_program G_PKT_DUMP_BPF_FILTER[MAX_THREAD_NUM];
-static pcap_t *phony_pcap_handle[MAX_THREAD_NUM]; /* ������BPF����ʱʹ�� */
-static unsigned short pkt_dump_data_offset = 0; /* ����ʱ��ָ��ƫ����, ����vxlan�����²����ڲ����ݰ� */
-static unsigned short pkt_dump_tcp_bind_port = 12345; /* Ĭ��TCP�����˿�, ���ڽ����ⲿtcpdump���� */
-static int pkt_dump_tcp_cmd_sd = -1;/* TCP fd, ���ڽ����ⲿtcpdump���� */
-static volatile int pkt_dump_udp_socket_peer_alive = 0; /* �ⲿtcpdump�Ƿ��� */
-static int pkt_dump_udp_pkt_sd[MAX_THREAD_NUM]; /* UDP�������ݰ�fd */
-static struct sockaddr_in udp_recv_addr;
-
-static unsigned char phony_mac_hdr[14] =
-{
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0x12, 0x23, 0x34, 0x56, 0x67, 0x78,
- 0x08, 0x00
-};
-/* ������������, δָ����������, ������sapp����, �������ò������� */
-typedef struct{
- int sample_pkt_num;
- char __cache_alignment[60];
-}pkt_dump_sample_t;
-
-static pkt_dump_sample_t pkt_dump_sample[MAX_THREAD_NUM];
-static int pkt_dump_ratio = 30; /* ÿ��N��������һ�� */
-
-typedef struct {
- unsigned int magic;
- unsigned short version_major;
- unsigned short version_minor;
- unsigned int thiszone; /* gmt to local correction */
- unsigned int sigfigs; /* accuracy of timestamps */
- unsigned int snaplen; /* max length saved portion of each pkt */
- unsigned int linktype; /* data link type (LINKTYPE_*) */
-}pkt_dump_file_hdr_t;
-
-struct pkt_dump_timeval {
- unsigned int tv_sec; /* seconds */
- unsigned int tv_usec; /* microseconds */
-};
-
-typedef struct {
- struct pkt_dump_timeval ts; /* time stamp */
- unsigned int caplen; /* length of portion present */
- unsigned int len; /* length this packet (off wire) */
-}pkt_dump_pkt_hdr_t;
-
-typedef struct{
- enum addr_type_t low_layer_type; /* ԭʼ����ײ�Э�������, ������MAC(pcap����), Ҳ������IPv4(pag����) */
- int raw_pkt_len; /* ԭʼ���ܳ��� */
- //char pkt_data[];
-}pkt_dump_pipe_t;
-
-
-static const pkt_dump_file_hdr_t pfile_hdr =
-{
- 0xA1B2C3D4,
- 0x0002,
- 0x0004,
- 0,
- 0,
- 0xFFFF,
- 1
-};
-
-/* reliable read */
-static inline ssize_t Rread(int fd, void *buf, size_t expect_count)
-{
- ssize_t ret;
- void *save_ptr = buf;
- size_t left_count = expect_count;
-
- while(left_count > 0){
-retry:
- ret = read(fd, save_ptr, left_count);
- if(ret < 0){
- switch(errno){
- case EAGAIN:
- if(0 == g_use_MESA_sleep_sw){
- usleep(1);
- }else{
- MESA_sleep();
- }
- /* no break here!!! no break here!!! no break here!!!*/
- case EINTR:
- goto retry;
- break;
-
- default:
- printf("pkt dump, read error:%s, ptr=%p, expect_count=%lu, left_count=%lu\n",
- strerror(errno), save_ptr, expect_count, left_count);
- break;
- }
- }else if(0 == ret){
- return 0; /* peer close */
- }else{
- save_ptr = (char *)save_ptr + ret;
- left_count -= ret;
- }
- }
-
- return expect_count - left_count;
-}
-
-/* reliable write */
-static inline ssize_t Rwrite(int fd, const void *buf, size_t expect_count)
-{
- ssize_t ret;
- const void *real_ptr = buf;
- size_t left_count = expect_count;
-
- while(left_count > 0){
-retry:
- ret = write(fd, real_ptr, left_count);
- if(ret < 0){
- switch(errno){
- case EINTR:
- goto retry;
- break;
-
- default:
- printf("pkt dump, write error:%s\n", strerror(errno));
- /* д�������ռ䲻��, ��������, �����Ӱ���������������� */
- break;
- }
- }else{
- real_ptr = (const char *)real_ptr + ret;
- left_count -= ret;
- }
- }
-
- return expect_count - left_count;
-}
-
-#if 0
-static void *cycle_pkt_dump_check_father(void *arg)
-{
- while(1){
- if(1 == getppid()){ /* �����̱�Ϊinit, ˵���������Ѿ��˳� */
- exit(1);
- }else{
- usleep(100000);
- }
- }
-
- return NULL;
-}
-
-
-static void *cycle_pkt_dump_thread(void *arg)
-{
- int thread_seq = *((int *)arg);
- FILE *fp;
- int file_name_post_prefix = 0, ret, pfile_hdr_flag = 0;
- long tot_pcap_file_len = 0;
- char pkt_buf[65536];
- char dump_file_name[PATH_MAX];
- pkt_dump_pkt_hdr_t *ppkt_hdr;
- int pkt_len;
- int skip_pkt_hdr_len; /* Ԥ����ͷ���ռ䳤��, ���ݲ���ģʽ��ͬ, ���ܻ����Eth�� */
-
- snprintf(dump_file_name, PATH_MAX, "%s/pid_%d.tid_%d.%d.pcap",
- G_PKT_DUMP_ROOT_DIR, getpid(), thread_seq, file_name_post_prefix);
- fp = fopen(dump_file_name, "w+");
- if(NULL == fp){
- printf("fopen %s error!\n", dump_file_name);
- goto done;
- }
- ppkt_hdr = (pkt_dump_pkt_hdr_t *)pkt_buf;
- ppkt_hdr->ts.tv_usec = 0;
-#ifdef CAPTURE_MODE_PAG
- memcpy(pkt_buf+sizeof(pkt_dump_pkt_hdr_t), phony_mac_hdr, 14);
- skip_pkt_hdr_len = sizeof(pkt_dump_pkt_hdr_t) + 14;
-#else
- skip_pkt_hdr_len = sizeof(pkt_dump_pkt_hdr_t);
-#endif
- while(1){
- /* ��pcap��ͷ���ռ�Ԥ��, ����ֻ��һ��fwrite, �ͽ�ͷ��������һ��д�� */
- pkt_len = read(G_UNIX_DOMAIN_SD[thread_seq], (char *)pkt_buf+skip_pkt_hdr_len, 2048);
- if(0 == pkt_len){
- goto done;
- }else if(pkt_len < 0){
- continue;
- }
-
- /* pcap file header, first time */
- if(0 == pfile_hdr_flag){
- fwrite(&pfile_hdr, sizeof(pkt_dump_file_hdr_t), 1, fp);
- tot_pcap_file_len += sizeof(pkt_dump_file_hdr_t);
- pfile_hdr_flag = 1;
- }
- /* ���°�����, ʱ��� */
- ppkt_hdr->ts.tv_sec = (unsigned int )g_CurrentTime;
-#ifdef CAPTURE_MODE_PAG
- ppkt_hdr->caplen = pkt_len+14;
- ppkt_hdr->len = pkt_len+14;
-#else
- ppkt_hdr->caplen = pkt_len;
- ppkt_hdr->len = pkt_len;
-#endif
-
- fwrite(pkt_buf, pkt_len+skip_pkt_hdr_len, 1, fp);
- tot_pcap_file_len += pkt_len+skip_pkt_hdr_len;
-
- /* �����������, ѭ��д�ļ� */
- if(tot_pcap_file_len >= G_PKT_DUMP_FILE_SIZE){
- fclose(fp);
- file_name_post_prefix = file_name_post_prefix ^ 1;
- snprintf(dump_file_name, PATH_MAX, "%s/pid_%d.tid_%d.%d.pcap",
- G_PKT_DUMP_ROOT_DIR, getpid(), thread_seq, file_name_post_prefix);
- fp = fopen(dump_file_name, "w+"); /* cycle write two files */
- if(NULL == fp){
- printf("fopen %s error!\n", dump_file_name);
- goto done;
- }
- tot_pcap_file_len = 0;
- pfile_hdr_flag = 0;
- }
- }
-
-done:
-
- return NULL;
-}
-#endif
-
-static inline int cycle_pkt_dump_sample_by_ratio(int thread_seq)
-{
- if(pkt_dump_sample[thread_seq].sample_pkt_num++ >= pkt_dump_ratio){
- pkt_dump_sample[thread_seq].sample_pkt_num = 0;
- return 1;
- }
-
- return 0;
-}
-static void __do_cycle_pkt_dump_udp_socket(int thread_seq, const raw_pkt_t *p_raw_pkt)
-{
- const mesa_ethernet_hdr *ehdr;
- const unsigned char *pktdata;
- int pktlen;
-
- if(1 == pkt_dump_udp_socket_peer_alive){
- if(0 == G_PKT_DUMP_PER_THREAD_SW[thread_seq]){
- return;
- }
- /* ԭʼ������ƫ������, ������һ��Ethernet֡, ���� */
- if(pkt_dump_data_offset + 14 > p_raw_pkt->raw_pkt_len){
- return;
- }
-
- if(g_packet_io_cap_level != CAP_LEVEL_MAC){
- pktdata = (const unsigned char *)p_raw_pkt->raw_pkt_data-14 + pkt_dump_data_offset,
- pktlen = p_raw_pkt->raw_pkt_len + 14 - pkt_dump_data_offset;
- ehdr = (const mesa_ethernet_hdr *)pktdata;
- }else{
- pktdata = (const unsigned char *)p_raw_pkt->raw_pkt_data + pkt_dump_data_offset,
- pktlen = p_raw_pkt->raw_pkt_len - pkt_dump_data_offset;
- ehdr = (const mesa_ethernet_hdr *)pktdata;
- }
-
- /* 2017-01-06 lijia add, �dz���Ethernet�������� */
- switch(ntohs(ehdr->ether_type)){
- case ETHERTYPE_IP:
- case ETHERTYPE_IPv6:
- case ETHERTYPE_VLAN:
- case ETHERTYPE_ARP:
- break;
-
- default:
- return;
- }
-
- if(G_PKT_DUMP_FILTER_STR[0] != '\0'){
- if(0 == bpf_filter(G_PKT_DUMP_BPF_FILTER[thread_seq].bf_insns,
- (const unsigned char *)pktdata, pktlen, pktlen)){
- return;
- }
- }
-
- if(pkt_dump_ratio > 0){
- if(0 == cycle_pkt_dump_sample_by_ratio(thread_seq)){
- return;
- }
- }
-
- /* bingo, match filter, sendto */
- sendto(pkt_dump_udp_pkt_sd[thread_seq],
- (char *)pktdata,
- pktlen,
- MSG_DONTWAIT,
- (const struct sockaddr *)&udp_recv_addr,
- sizeof(udp_recv_addr));
- }
-}
-
-static void __do_cycle_pkt_dump(int thread_seq, const raw_pkt_t *p_raw_pkt)
-{
- int ret;
- /* ����Ϊpcap_hdr[2]����,��һ��СС��trick, ����[0]��ʾpcap��ͷ����Ϣ,
- ����[1]��ʾ��PAGģʽ��, �洢��etherhdr, pkt_dump_pkt_hdr_tΪ16�ֽ�, ���ÿ��Է�һ��������ether hdr.
- */
- pkt_dump_pkt_hdr_t pcap_hdr[2];
- int write_hdr_len;
- char dump_file_name[PATH_MAX];
-
- if(PKT_DUMP_LOCAL_FILE == G_PKT_DUMP_MODE){
- if(0 == G_PKT_DUMP_PER_THREAD_SW[thread_seq]){
- return;
- }
- }else{
- __do_cycle_pkt_dump_udp_socket(thread_seq, p_raw_pkt);
- return;
- }
-
- if(G_PKT_DUMP_FILTER_STR[0] != '\0'){
- if(g_packet_io_cap_level != CAP_LEVEL_MAC){
- if(0 == bpf_filter(G_PKT_DUMP_BPF_FILTER[thread_seq].bf_insns,
- (const unsigned char *)p_raw_pkt->raw_pkt_data-14,
- p_raw_pkt->raw_pkt_len+14, p_raw_pkt->raw_pkt_len+14)){
- return;
- }
- }else{
- if(0 == bpf_filter(G_PKT_DUMP_BPF_FILTER[thread_seq].bf_insns,
- (const unsigned char *)p_raw_pkt->raw_pkt_data,
- p_raw_pkt->raw_pkt_len, p_raw_pkt->raw_pkt_len)){
- return;
- }
- }
- }
-
- if(unlikely(NULL == G_PKT_DUMP_FP[thread_seq])){
- snprintf(dump_file_name, PATH_MAX, "%s/pid_%d.tid_%d.%d.pcap",
- G_PKT_DUMP_ROOT_DIR, getpid(), thread_seq, G_FILENAME_INDEX[thread_seq]);
- G_PKT_DUMP_FP[thread_seq] = fopen(dump_file_name, "wb+");
- if(NULL == G_PKT_DUMP_FP[thread_seq]){
- printf("fopen %s error!\n", dump_file_name);
- return;
- }
- /* pcap file header, first time */
- fwrite(&pfile_hdr, sizeof(pkt_dump_file_hdr_t), 1, G_PKT_DUMP_FP[thread_seq]);
- }
-
- /* ���°�����, ʱ��� */
- pcap_hdr[0].ts.tv_sec = (unsigned int )g_CurrentTime;
-
- if(g_packet_io_cap_level != CAP_LEVEL_MAC){
- pcap_hdr[0].caplen = p_raw_pkt->raw_pkt_len+14;
- pcap_hdr[0].len = p_raw_pkt->raw_pkt_len+14;
- memcpy(&pcap_hdr[1], phony_mac_hdr, 14);
- write_hdr_len = sizeof(pkt_dump_pkt_hdr_t) + 14;
- }else{
- pcap_hdr[0].caplen = p_raw_pkt->raw_pkt_len;
- pcap_hdr[0].len = p_raw_pkt->raw_pkt_len;
- write_hdr_len = sizeof(pkt_dump_pkt_hdr_t);
- }
-
- ret = fwrite(&pcap_hdr[0], write_hdr_len, 1, G_PKT_DUMP_FP[thread_seq]);
- if(unlikely(ret < 1)){
- return;
- }
- ret = fwrite(p_raw_pkt->raw_pkt_data, p_raw_pkt->raw_pkt_len, 1, G_PKT_DUMP_FP[thread_seq]);
- if(unlikely(ret < 1)){
- /* ���ֻд��ͷ��, ��д���ݳ��ִ���, �ع� */
- fseek(G_PKT_DUMP_FP[thread_seq], (int)0-(int)sizeof(pkt_dump_pkt_hdr_t), SEEK_CUR);
- return;
- }
-
- /* �����������, ѭ��д�ļ� */
- G_PCAP_SIZE[thread_seq] += write_hdr_len + p_raw_pkt->raw_pkt_len;
- if(unlikely(G_PCAP_SIZE[thread_seq] >= G_PKT_DUMP_FILE_SIZE)){
- fclose(G_PKT_DUMP_FP[thread_seq]);
- G_FILENAME_INDEX[thread_seq] ^= 1;
- snprintf(dump_file_name, PATH_MAX, "%s/pid_%d.tid_%d.%d.pcap",
- G_PKT_DUMP_ROOT_DIR, getpid(), thread_seq, G_FILENAME_INDEX[thread_seq]);
- G_PKT_DUMP_FP[thread_seq] = fopen(dump_file_name, "wb+");
- if(NULL == G_PKT_DUMP_FP[thread_seq]){
- printf("fopen %s error!\n", dump_file_name);
- return;
- }
- /* pcap file header, first time */
- fwrite(&pfile_hdr, sizeof(pkt_dump_file_hdr_t), 1, G_PKT_DUMP_FP[thread_seq]);
- G_PCAP_SIZE[thread_seq] = 0;
- }
-
- return;
-}
-
-void cycle_pkt_dump(int thread_seq, const raw_pkt_t *p_raw_pkt)
-{
- if(likely(0 == G_PKT_DUMP_SW)){
- return;
- }
-
- __do_cycle_pkt_dump(thread_seq, p_raw_pkt);
-}
-
-void cycle_pkt_dump_old(int thread_seq, const void *ippkt, int ippktlen)
-{
- raw_pkt_t raw_pkt;
-
- raw_pkt.raw_pkt_data = ippkt;
- raw_pkt.raw_pkt_len = ippktlen;
-
- cycle_pkt_dump(thread_seq, &raw_pkt);
-}
-
-#if 0
-static int cycle_pkt_dump_child_init(void)
-{
- int i, ret;
- struct sockaddr_un father_pro_addr;
- int addr_len;
- char test_buf[1024];
- int buf_len = 0;
- socklen_t opt_len;
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- G_UNIX_DOMAIN_SD[i] = socket(AF_UNIX,SOCK_DGRAM,0);
- if(G_UNIX_DOMAIN_SD[i] < 0){
- printf("socket error: %s\n", strerror(errno));
- return -1;
- }
-
- addr_len = sizeof(father_pro_addr);
- father_pro_addr.sun_family=AF_UNIX;
- snprintf(father_pro_addr.sun_path, sizeof(father_pro_addr.sun_path), "%s%d", UNIX_DOMAIN_SOCKET_NAME, i);
-
- unlink(father_pro_addr.sun_path);
- if(bind(G_UNIX_DOMAIN_SD[i], (struct sockaddr *)&father_pro_addr, addr_len) < 0){
- printf("bind %s error: %s\n", father_pro_addr.sun_path, strerror(errno));
- return -1;
- }
-
- listen(G_UNIX_DOMAIN_SD[i], 10);
- }
-
- usleep(10000);
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- ret = read(G_UNIX_DOMAIN_SD[i], test_buf, 1024); /* �����ȴ��������̵�����, ��ȷ����˵���������� */
- if(ret <= 0){
- printf("socket read error:%s\n", strerror(errno));
- return -1;
- }
- }
-
- return 0;
-}
-#endif
-
-
-#if DEBUG
-static long ifuncb_show_pktdump_summary(iknow_handle ihandle, iknow_conn iconn, const void *cb_fun_arg, const char *cmd_args)
-{
- int i;
- unsigned long long discard_pkt_sum = 0, discard_byte_sum = 0;
- unsigned long long tot_pkt_sum = 0, tot_byte_sum = 0;
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- tot_pkt_sum += PKT_DISCARD_STAT[i].total_pkt_num;
- tot_byte_sum += PKT_DISCARD_STAT[i].total_pkt_bytes;
- discard_pkt_sum += PKT_DISCARD_STAT[i].discard_pkt_num;
- discard_byte_sum += PKT_DISCARD_STAT[i].discard_pkt_bytes;
- }
- //iprintf(ihandle, iconn,"NOTE: unit of byte for total is 'byte', for realtime is 'bps, bit per second'!\n");
- iprintf(ihandle, iconn, "%8s %8s %13s\n", "", "packet", "byte");
- iprintf(ihandle, iconn, "%8s %8llu %13llu\n", "total", tot_pkt_sum, tot_byte_sum);
- iprintf(ihandle, iconn, "%8s %8llu %13llu\n", "DROP", discard_pkt_sum, discard_byte_sum);
-
- return 0;
-}
-
-#endif
-
-#if 0
-static int cycle_pkt_dump_father_init(void)
-{
- int i;
- struct sockaddr_un child_pro_addr;
- int addr_len;
- char test_buf[1024] = "I am father";
- int buf_len = 0;
- socklen_t opt_len;
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- G_UNIX_DOMAIN_SD[i] = socket(AF_UNIX,SOCK_DGRAM,0);
- if(G_UNIX_DOMAIN_SD[i] < 0){
- printf("socket error: %s\n", strerror(errno));
- return -1;
- }
-
- addr_len = sizeof(child_pro_addr);
- child_pro_addr.sun_family=AF_UNIX;
- snprintf(child_pro_addr.sun_path, sizeof(child_pro_addr.sun_path), "%s%d", UNIX_DOMAIN_SOCKET_NAME, i);
-
- if(connect(G_UNIX_DOMAIN_SD[i], (struct sockaddr*)&child_pro_addr, addr_len) < 0){
- printf("connect %s error: %s\n", child_pro_addr.sun_path, strerror(errno));
- return -1;
- }
- }
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- write(G_UNIX_DOMAIN_SD[i], test_buf, 1024);
- }
-
- unlink(child_pro_addr.sun_path);
-#if DEBUG
- iknow_register_cmd(PLATFORM_IHANDLE, "show pktdump summary", "display packet dump status",
- ifuncb_show_pktdump_summary, NULL, 0, NULL);
-#endif
-
- return 0;
-}
-#endif
-
-#if 0
-static void cycle_pkt_dump_clear_last_status(void)
-{
- char cmd_buf[128];
-
- snprintf(cmd_buf, 128, "killall %s", PKT_DUMP_PROCESS_NAME);
-
- system(cmd_buf);
-}
-
-
-static void cycle_pkt_dump_exec(int argc, char *argv[])
-{
- int i;
- pid_t pid;
- pthread_t check_ppid, thread_id[MAX_THREAD_NUM];
- static int thread_seq[MAX_THREAD_NUM];
-
- cycle_pkt_dump_clear_last_status();
-
- pid = fork();
- if(0 == pid){ /* �ӽ���, ���������� */
- if(cycle_pkt_dump_child_init() < 0){
- printf("cycle pkt dump init error!\n");
- exit(1);
- }
- prctl(PR_SET_NAME, PKT_DUMP_PROCESS_NAME, 0, 0, 0);
- }else if(pid > 0){
- usleep(50000);
- if(cycle_pkt_dump_father_init() < 0){
- printf("cycle pkt dump init error!\n");
- exit(1);
- }
- return; /* �����̷���, ��sapp������ */
- }else{
- printf("cycle_pkt_dump fork error!\n");
- exit(0);
- }
-
- for(i = 0; i < pkt_dump_thread_num; i++){
- if(G_PKT_DUMP_PER_THREAD_SW[i] != 0){
- thread_seq[i] = i;
- pthread_create(&thread_id[i], NULL, cycle_pkt_dump_thread, &thread_seq[i]);
- usleep(100);
- }
- }
-
- pthread_create(&check_ppid, NULL, cycle_pkt_dump_check_father, NULL);
-
- /* �ӽ��̵����߳������ȴ� */
- for(i = 0; i < pkt_dump_thread_num; i++){
- if(G_PKT_DUMP_PER_THREAD_SW[i] != 0){
- pthread_join(thread_id[i], NULL);
- }
- }
-
- exit(0);
-}
-#endif
-
-static void cycle_pkt_dump_set_thread_num(int thread_num)
-{
- pkt_dump_thread_num = thread_num;
-}
-
-static int cycle_pkt_dump_get_core_num(void)
-{
- FILE *fp;
- char line_buf[PATH_MAX] = {0};
- int core_num = 0;
-
- fp = popen("ls -l core.* | wc -l", "r");
- if(NULL == fp){
- return -1;
- }
-
- fgets(line_buf, PATH_MAX, fp);
-
- core_num = atoi(line_buf);
-
- pclose(fp);
- return core_num;
-}
-
-/* config is like: "0,1,2,3,4,5" */
-static int cycle_pkt_dump_parse_per_thread_switch(char *config_str)
-{
- char *parse_config = config_str;
- char *save_ptr;
- char *token;
- int i, thread_seq;
-
- if(strncasecmp("all", config_str, 3) == 0){ /* all thread is enable */
- for(i = 0; i < pkt_dump_thread_num; i++){
- G_PKT_DUMP_PER_THREAD_SW[i] = 1;
- }
- return 0;
- }
-
- while((token = strtok_r(parse_config, ", \t", &save_ptr)) != NULL){
- thread_seq = atoi(token);
- if(thread_seq < 0 || thread_seq >= pkt_dump_thread_num){
- printf("'pkt_dump_thread_seq' config invalid, threadnum=%d!\n", pkt_dump_thread_num);
- return -1;
- }
- G_PKT_DUMP_PER_THREAD_SW[thread_seq] = 1;
- parse_config = NULL;
- }
-
- return 0;
-}
-
-
-static long cycle_pkt_dump_get_cur_files_size(void)
-{
- FILE *fp;
- long cur_files_size;
- char cmd_str[PATH_MAX], tmp_str[1024];
-
- snprintf(cmd_str, PATH_MAX, "du -scb %s | grep %s | awk {'print $1'}", G_PKT_DUMP_ROOT_DIR, G_PKT_DUMP_ROOT_DIR);
-
- fp = popen(cmd_str, "r");
- if(NULL == fp){
- return -1;
- }
-
- if(NULL == fgets(tmp_str, 1024, fp)){
- return -1;
- }
- cur_files_size = (long)strtol(tmp_str, NULL, 10);
-
- pclose(fp);
-
- return cur_files_size;
-}
-
-static int cycle_pkt_dump_get_cur_enable_thread(void)
-{
- int i, sum = 0;
-
- for(i = 0; i < MAX_THREAD_NUM; i++){
- if(G_PKT_DUMP_PER_THREAD_SW[i] > 0){
- sum++;
- }
- }
-
- return sum;
-}
-/*
- total_files_size: ��Ŀ¼���ܵ�.pcap����С, ��λ:Byte;
- file_size_per_thread_by_conf: �����߳�����ļ���С, ��λ:Byte;
-
- ���յ�ʵ��file_size_per_threadֵ, ȡ���ڵ�ǰ���е�.pcap�ļ���С��total_files_size�Ĺ�ϵ;
- �����ǰ���е�.pcap�ļ��ѳ���total_files_size, ����д�µ��ļ�.
-*/
-static int cycle_pkt_dump_set_file_size(long total_files_size, long file_size_per_thread_by_conf)
-{
- long cur_files_size;
- int cur_enable_thread_num = 0;
- long file_size_per_thread_by_calc; /* ����ʵ�ʼ���ó���ÿ���߳�����ļ���С */
-
- cur_files_size = cycle_pkt_dump_get_cur_files_size();
- if(cur_files_size < 0 || cur_files_size >= total_files_size){
- printf("\033[33m[Warning]pkt_dump is enable, but current files size is more than 'pkt_dump_total_size', disable pktdump!\033[0m\n");
- usleep(100000);
- G_PKT_DUMP_SW = 0;
- return -1;
- }
-
- cur_enable_thread_num = cycle_pkt_dump_get_cur_enable_thread();
- if(0 == cur_enable_thread_num){
- printf("\033[33m[Warning]pkt_dump is enable, but enable thread number is 0, disable pktdump!\033[0m\n");
- usleep(100000);
- return -1;
- }
-
- file_size_per_thread_by_calc = (total_files_size-cur_files_size)/cur_enable_thread_num/2;
-
- /* ����ȡ��С */
- G_PKT_DUMP_FILE_SIZE = (file_size_per_thread_by_calc < file_size_per_thread_by_conf?file_size_per_thread_by_calc:file_size_per_thread_by_conf);
- if(G_PKT_DUMP_FILE_SIZE < 2048){
- printf("\033[33m[Warning]pkt_dump is enable, but current files size is more than 'pkt_dump_total_size'!\033[0m\n");
- return -1;
- }
-
- return 0;
-}
-
-static void pkt_dump_sig_ignore(int sig)
-{
- return;
-}
-
-static void pkt_dump_sig_handle(int sig)
-{
- signal(SIGSEGV, pkt_dump_sig_ignore); /* SIGSEGV����������, ��һ����ٵ��жϴ�������ƭ��ϵͳ */
- sync(); /* ����������δд�����̵�����ǿ��д�� */
- abort(); /* ��ֹ����, ����core�ļ� */
-}
-
-static void pkt_dump_set_default_opt(void)
-{
- udp_recv_addr.sin_family = AF_INET;
- udp_recv_addr.sin_addr.s_addr = htonl(0x7f000001);
- udp_recv_addr.sin_port = htons(12345);
-
- memset(G_PKT_DUMP_FILTER_STR, 0, sizeof(G_PKT_DUMP_FILTER_STR));
- pkt_dump_data_offset = 0;
- /* Ĭ�������߳�ȫ������ */
- memset(G_PKT_DUMP_PER_THREAD_SW, 1, sizeof(G_PKT_DUMP_PER_THREAD_SW));
-}
-
-static void pkt_dump_parse_opt_rcv_port(const struct pkt_dump_opt *cmd_opt, const char *opt_val)
-{
- unsigned short *rcv_port = (unsigned short *)opt_val;
-
- udp_recv_addr.sin_port = *rcv_port; /* �˴�ֱ��ʹ�������� */
-}
-
-static void pkt_dump_parse_opt_bpf_filter(const struct pkt_dump_opt *cmd_opt, const char *opt_val)
-{
- memcpy(G_PKT_DUMP_FILTER_STR, opt_val, ntohs(cmd_opt->opt_len)); /* �Ѱ�����EOF */
-}
-
-static void pkt_dump_parse_opt_dump_offset(const struct pkt_dump_opt *cmd_opt, const char *opt_val)
-{
- unsigned short *toffset = (unsigned short *)opt_val;
- pkt_dump_data_offset = ntohs(*toffset);
-}
-
-/*
- tcpdump_mesa�������char����Ϊ��λ������thread_id, ���糤����3, ������[1,3,5],
- ��ʾ��1,3,5�߳̿�����������.
-*/
-static void pkt_dump_parse_opt_thread_index(const struct pkt_dump_opt *cmd_opt, const char *opt_val)
-{
- int i;
- unsigned short opt_len = ntohs(cmd_opt->opt_len);
- unsigned char *thread_index = (unsigned char *)opt_val;
-
- /* Ĭ��ֵ��1, �˴������������������, ֻ�����ض��߳� */
- memset(G_PKT_DUMP_PER_THREAD_SW, 0, sizeof(G_PKT_DUMP_PER_THREAD_SW));
-
- for(i = 0; i < opt_len; i++){
- if(thread_index[i] >= MAX_THREAD_NUM){
- continue;
- }
- G_PKT_DUMP_PER_THREAD_SW[thread_index[i]] = 1;
- }
-
- return;
-}
-
-static void cycle_pkt_dump_command_paicdiarse(int connfd)
-{
- char cmd_buf[1024];
- unsigned int i;
- int ret;
- struct pkt_dump_handshake pkt_hdr;
- struct pkt_dump_opt cmd_opt;
-
- /* �ȷ���2���ֽ�tcpdump UDP���ն˿� */
- ret = MESA_sock_greedy_read(connfd, &pkt_hdr, sizeof(pkt_hdr), -1);
- if(0 == ret){
- goto err_exit;
- }else if(ret < 0){
- printf("sock read error, %s\n", strerror(errno));
- goto err_exit;
- }
-
- if(ntohl(pkt_hdr.magic) != PKT_DUMP_HDR_MAGIC){
- printf("Remote tcpdump is not recognized\n");
- goto err_exit;
- }
-
- pkt_dump_set_default_opt();
-
- for(i = 0; i < ntohl(pkt_hdr.opt_num); i++){
- /* get opt hdr */
- ret = MESA_sock_greedy_read(connfd, &cmd_opt, sizeof(cmd_opt), -1);
- if(0 == ret){
- goto err_exit;
- }else if(ret < 0){
- printf("sock read error, %s\n", strerror(errno));
- goto err_exit;
- }
- /* get opt value */
- ret = MESA_sock_greedy_read(connfd, cmd_buf, ntohs(cmd_opt.opt_len), -1);
- if(0 == ret){
- goto err_exit;
- }else if(ret < 0){
- printf("sock read error, %s\n", strerror(errno));
- goto err_exit;
- }
-
- switch(ntohs(cmd_opt.opt_type)){
- case PKT_DUMP_OPT_RCV_PORT:
- pkt_dump_parse_opt_rcv_port(&cmd_opt, cmd_buf);
- break;
-
- case PKT_DUMP_OPT_BPF_FILTER:
- pkt_dump_parse_opt_bpf_filter(&cmd_opt, cmd_buf);
- break;
-
- case PKT_DUMP_OPT_DATA_OFFSET:
- pkt_dump_parse_opt_dump_offset(&cmd_opt, cmd_buf);
- break;
-
- case PKT_DUMP_OPT_THREAD_INDEX:
- pkt_dump_parse_opt_thread_index(&cmd_opt, cmd_buf);
- break;
- default:
- /* δ֪ѡ������������ */
- break;
- }
- }
-
- for(i = 0; i < (unsigned int )g_packet_io_thread_num; i++){
- phony_pcap_handle[i] = pcap_open_dead(DLT_EN10MB, 65535);
- if(NULL == phony_pcap_handle[i]){
- goto err_exit;
- }
-
- if(G_PKT_DUMP_FILTER_STR[0] != '\0'){ /* ����û��filter */
- if(pcap_compile(phony_pcap_handle[i], &G_PKT_DUMP_BPF_FILTER[i], G_PKT_DUMP_FILTER_STR, 100, 0) < 0){
- printf("Compile pcap filter '%s' error:%s\n", G_PKT_DUMP_FILTER_STR, pcap_geterr(phony_pcap_handle[i]));
- goto err_exit;
- }
- }
- }
-
- pkt_dump_udp_socket_peer_alive = 1;
-
- /* �Ժ��ٴ����κ�����, ������ȡ, ֱ���Զ����ӽ��� */
- while(MESA_sock_greedy_read(connfd, cmd_buf, sizeof(cmd_buf), -1) != 0);
-
-err_exit:
- pkt_dump_udp_socket_peer_alive = 0;
- usleep(1000 * 500); /* ��ʱ�ͷ�, �������߳�����ʹ��BPF������ */
- for(i = 0; i < (unsigned int )g_packet_io_thread_num; i++){
- pcap_freecode(&G_PKT_DUMP_BPF_FILTER[i]);
- }
- memset(G_PKT_DUMP_FILTER_STR, 0, sizeof(G_PKT_DUMP_FILTER_STR));
- pkt_dump_data_offset = 0;
- /* �ɵ������߳�ָ������, ÿ�λָ�Ĭ��ֵ */
- memset(G_PKT_DUMP_PER_THREAD_SW, 0, sizeof(G_PKT_DUMP_PER_THREAD_SW));
- close(connfd);
- return;
-}
-
-static void * cycle_pkt_dump_udp_socket_daemon_thread(void *arg)
-{
- socklen_t cliaddr_len;
- struct sockaddr_in cliaddr;
- int connfd;
-#if(__GNUC__ * 100 + __GNUC_MINOR__ * 10 + __GNUC_PATCHLEVEL__ >= 480) /* �汾�ж�, �ܶ��ϵͳ�޷����� */
-#ifdef _GNU_SOURCE
- pthread_setname_np(pthread_self(), "sapp_pkt_dump");
-#endif
-#endif
-
- while(1){
- cliaddr_len = sizeof(cliaddr);
- connfd = accept(pkt_dump_tcp_cmd_sd, (struct sockaddr *) &cliaddr, &cliaddr_len);
- if(connfd > 0){
- //cycle_pkt_dump_command_parse(connfd);
- cycle_pkt_dump_command_paicdiarse(connfd);
- }
- }
-
- return NULL;
-}
-
-static int cycle_pkt_dump_socket_init(void)
-{
- pthread_t pid;
- int i, opt;
- struct sockaddr_in sockadd;
-
- pkt_dump_tcp_cmd_sd = socket(AF_INET, SOCK_STREAM, 0);
-
- opt = 1;
- setsockopt(pkt_dump_tcp_cmd_sd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int));
-
- bzero(&sockadd, sizeof(sockadd));
- sockadd.sin_family = AF_INET;
- sockadd.sin_addr.s_addr = htonl(INADDR_ANY);
- sockadd.sin_port = htons(pkt_dump_tcp_bind_port);
-
- if(bind(pkt_dump_tcp_cmd_sd, (struct sockaddr *) &sockadd, sizeof(sockadd)) < 0){
- printf("pkt dump bind cmd port %u error, %s!\n", pkt_dump_tcp_bind_port, strerror(errno));
- return -1;
- }
- listen(pkt_dump_tcp_cmd_sd, 1); /* ��ʱֻ֧��һ���ͻ��˲��� */
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- pkt_dump_udp_pkt_sd[i] = socket(AF_INET, SOCK_DGRAM, 0);
- }
-
- pthread_create(&pid, NULL, cycle_pkt_dump_udp_socket_daemon_thread, NULL);
-
- return 0;
-}
-
-int cycle_pkt_dump_init(int argc, char *argv[])
-{
- int i, ret;
- int int_tmp, total_files_size, core_num;
- char per_thread_sw[PATH_MAX];
- char pcap_errbuf[PCAP_ERRBUF_SIZE];
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_switch", &G_PKT_DUMP_SW, 0);
-
- if(0 == G_PKT_DUMP_SW){
- return 0;
- }
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_mode", &G_PKT_DUMP_MODE, 1);
- if((G_PKT_DUMP_MODE != PKT_DUMP_LOCAL_FILE) && (G_PKT_DUMP_MODE != PKT_DUMP_UDP_SOCKET)){
- printf("\n\033[41mError! pkt_dump_mode only support 1 or 2!\033[0m\n");
- return -1;
- }
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_cmd_port", &int_tmp, 12345);
- if((int_tmp <=0) || (int_tmp > 65535)){
- printf("\n\033[41mError! pkt_dump_cmd_port invalid, %d!\033[0m\n", int_tmp);
- return -1;
- }
- pkt_dump_tcp_bind_port = (unsigned short)int_tmp;
-
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_ratio", &pkt_dump_ratio, 30);
-
-
-#if 0 == CYCLE_PKT_DUMP
- printf("\n\033[33m[Warning]pkt_dump is enable, but sapp is not compile correct, please use debug=2.\033[0m\n");
- sleep(1);
-#endif
-
- if(PKT_DUMP_LOCAL_FILE == G_PKT_DUMP_MODE){
- cycle_pkt_dump_set_thread_num(g_packet_io_thread_num);
-
- core_num = cycle_pkt_dump_get_core_num();
- if(core_num < 0 || core_num > 10){
- printf("\033[33m[Warning]core.* number is more than 10, pkt dump is auto disabled!\n");
- G_PKT_DUMP_SW = 0;
- return 0;
- }
-
- MESA_load_profile_string_def((char *)"conf/main.conf",(char *)"pkt_dump", (char *)"pkt_dump_bpf_filter", G_PKT_DUMP_FILTER_STR, PATH_MAX, (char *)"");
- if(G_PKT_DUMP_FILTER_STR[0] != '\0'){
- for(i = 0; i < g_packet_io_thread_num; i++){
- phony_pcap_handle[i] = pcap_open_dead(DLT_EN10MB, 65535);
- if(NULL == phony_pcap_handle[i]){
- printf("pcap_open %s error, %s\n", "lo", pcap_errbuf);
- printf("\n\033[41mpkt_dump_bpf_filter is not enable!\033[0m\n");
- goto skip_bpf_filter;
- }
- if(pcap_compile(phony_pcap_handle[i], &G_PKT_DUMP_BPF_FILTER[i], G_PKT_DUMP_FILTER_STR, 100, 0) < 0){
- printf("Compile pcap filter '%s' error:%s\n", G_PKT_DUMP_FILTER_STR, pcap_geterr(phony_pcap_handle[i]));
- return -1;
- }
- }
- }
-
- skip_bpf_filter:
-
- MESA_load_profile_string_def((char *)"conf/main.conf",(char *)"pkt_dump", (char *)"pkt_dump_file_root_dir", G_PKT_DUMP_ROOT_DIR, PATH_MAX, (char *)"/tmp/pkt_dump");
- MESA_mkdir_p(G_PKT_DUMP_ROOT_DIR, 0755);
-
- MESA_load_profile_string_nodef((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_thread_seq", per_thread_sw, PATH_MAX);
- if(cycle_pkt_dump_parse_per_thread_switch(per_thread_sw) < 0){
- return 0;
- }
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_total_size", &total_files_size, 1000);
- if(total_files_size < 1 || (unsigned int)total_files_size >= 1024*100 /* 100GB */){
- printf("pkt_dump_total_size invalid!\n");
- return -1;
- }
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_file_max_size", &int_tmp, 100);
- if(int_tmp < 2 || (unsigned int)int_tmp >= 1024*100 /* 100GB */){
- printf("pkt_dump_file_max_size invalid!\n");
- return -1;
- }
- /* ÿ���߳���Ҫѭ��д2���ļ�, ������Ҫ��pkt_dump_file_max_size��ʵ��ֵ�ٳ���2 */
- if(cycle_pkt_dump_set_file_size((long)total_files_size*1024*1024, (long)int_tmp*1024*512) < 0){
- return 0;
- }
-
- signal(SIGPIPE, SIG_IGN);
- /* ����SIGSEGV�ź�, ��֤�����쳣��ֹʱ, ���һ������BUG��pcap��������д��Ӳ�� */
- if((SIG_ERR == signal(SIGSEGV, pkt_dump_sig_handle))){
- printf("Catch SIGSEGV error!\n");
- }
-
-#if DEBUG
- iknow_register_cmd(PLATFORM_IHANDLE, "show pkt dump summary", "display pkt dump summary",
- ifuncb_show_pktdump_summary, NULL, 0, NULL);
-#endif
- printf("\n\033[33m[Warning]pkt dump enable, this maybe encumber performance.\033[0m\n");
- sleep(1);
- }else{
- ret = cycle_pkt_dump_socket_init();
- }
-
- return ret;
-}
-
-
-#ifdef __cplusplus
-}
-#endif
-
-
-
diff --git a/packet_io/cycle_pkt_dump_through_write_with_offset.c.bak b/packet_io/cycle_pkt_dump_through_write_with_offset.c.bak
deleted file mode 100644
index 8a018f4..0000000
--- a/packet_io/cycle_pkt_dump_through_write_with_offset.c.bak
+++ /dev/null
@@ -1,1055 +0,0 @@
-#include "packet_io.h"
-#include "stream_internal.h"
-#include "stream_manage.h"
-#include "mesa_net.h"
-#include "sendpacket.h"
-#include "MESA_prof_load.h"
-#include "MESA_sleep.h"
-#include "MESA_socket_wrap.h"
-#include "iknow.h"
-#include "mesa_pkt_dump.h"
-#include <stdio.h>
-#include <unistd.h>
-#include <assert.h>
-#include <errno.h>
-#include <pthread.h>
-#include <signal.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/prctl.h>
-#include <sys/un.h>
-#include <execinfo.h>
-#include <pcap/pcap.h>
-
-/*
- 2015-04-15 , LiJia.
- ����cycle_pkt_dump����,
- ����ʵʱѭ���洢���ݰ���Ŀ���ǽ�����߻�����������ҵ���ֻ����һ��core, ��BUG�޷���������.
- sapp����coredump�� 'pkt_dump_file_root_dir'Ŀ¼��洢���һ��ʱ���յ��İ�,
- ���ö���ģʽ���֣����п��ܷ���BUG������Դ��
- ������������֣���pkt_dump_file_max_size�ʵ�����һЩ.
-
- main.conf������1���µ�section��5������������:
- [pkt_dump]
- pkt_dump_switch=0 //�ܿ���
- pkt_dump_total_size=1000 //root_dir�ܼ�.pcap�ļ��Ĵ�С, ��λ:MB, ��ֹ������ƶ�������д��Ӳ��
- pkt_dump_file_max_size=200 //pcap�ļ�ÿ���߳̿������ֵ, ��λ:MB.
- pkt_dump_file_root_dir=/dev/shm //pcap�洢·��, �Ƽ�/dev/shm, ��Ӳ���ٶȿ�ܶ�
- pkt_dump_thread_seq=0,2,4,6,8 //ÿ���̵߳Ŀ��أ���Ϊ�����������ܾ޴��޷�ȫ���洢���Ǿ�����������ֻ���ò����̵߳�dump���� , all=ȫ����
-
-*/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-#define UNIX_DOMAIN_SOCKET_NAME "/tmp/.pktdump"
-#define PKT_DUMP_PROCESS_NAME "sapp_pkt_dump"
-
-extern iknow_handle PLATFORM_IHANDLE;
-
-enum dump_mode{
- PKT_DUMP_LOCAL_FILE = 1, /* д�����ļ� */
- PKT_DUMP_UDP_SOCKET = 2, /* д��UDP ij���˿� */
-};
-
-#if DEBUG
-#include "iknow.h"
-
-typedef struct{
- unsigned long long total_pkt_num;
- unsigned long long total_pkt_bytes;
- unsigned long long discard_pkt_num;
- unsigned long long discard_pkt_bytes;
- char __pad__[32]; /* 64�ֽ�cache���� */
-}pkt_dump_status_t;
-static pkt_dump_status_t PKT_DISCARD_STAT[MAX_THREAD_NUM];
-
-#endif
-
-extern int g_packet_io_cap_level;
-extern int g_use_MESA_sleep_sw;
-extern int MESA_mkdir_p(const char *pathname, mode_t mode);
-//extern time_t g_CurrentTime;
-extern int g_packet_io_thread_num;
-extern int g_iThreadNum; /* for dual_stack, start */
-static char G_PKT_DUMP_ROOT_DIR[PATH_MAX]; /* ����ָ��Ϊ/dev/shm, �ٶȿ� */
-static long G_PKT_DUMP_FILE_SIZE = 104857600; /* Ĭ��100MB, ���߳� */
-int G_PKT_DUMP_SW = 0; /* Ĭ�Ϲر� */
-int G_PKT_DUMP_MODE = PKT_DUMP_LOCAL_FILE; /* Ĭ����д�������ļ� */
-static int G_PKT_DUMP_PER_THREAD_SW[MAX_THREAD_NUM];
-
-static int pkt_dump_thread_num = 1;
-
-static FILE *G_PKT_DUMP_FP[MAX_THREAD_NUM];
-static int G_FILENAME_INDEX[MAX_THREAD_NUM];
-static long G_PCAP_SIZE[MAX_THREAD_NUM];
-static char G_PKT_DUMP_FILTER_STR[PATH_MAX];
-static struct bpf_program G_PKT_DUMP_BPF_FILTER[MAX_THREAD_NUM];
-static pcap_t *phony_pcap_handle[MAX_THREAD_NUM]; /* ������BPF����ʱʹ�� */
-static unsigned short pkt_dump_data_offset = 0; /* ����ʱ��ָ��ƫ����, ����vxlan�����²����ڲ����ݰ� */
-static unsigned short pkt_dump_tcp_bind_port = 12345; /* Ĭ��TCP�����˿�, ���ڽ����ⲿtcpdump���� */
-static int pkt_dump_tcp_cmd_sd = -1;/* TCP fd, ���ڽ����ⲿtcpdump���� */
-static volatile int pkt_dump_udp_socket_peer_alive = 0; /* �ⲿtcpdump�Ƿ��� */
-static int pkt_dump_udp_pkt_sd[MAX_THREAD_NUM]; /* UDP�������ݰ�fd */
-static struct sockaddr_in udp_recv_addr;
-
-static unsigned char phony_mac_hdr[14] =
-{
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0x12, 0x23, 0x34, 0x56, 0x67, 0x78,
- 0x08, 0x00
-};
-typedef struct {
- unsigned int magic;
- unsigned short version_major;
- unsigned short version_minor;
- unsigned int thiszone; /* gmt to local correction */
- unsigned int sigfigs; /* accuracy of timestamps */
- unsigned int snaplen; /* max length saved portion of each pkt */
- unsigned int linktype; /* data link type (LINKTYPE_*) */
-}pkt_dump_file_hdr_t;
-
-struct pkt_dump_timeval {
- unsigned int tv_sec; /* seconds */
- unsigned int tv_usec; /* microseconds */
-};
-
-typedef struct {
- struct pkt_dump_timeval ts; /* time stamp */
- unsigned int caplen; /* length of portion present */
- unsigned int len; /* length this packet (off wire) */
-}pkt_dump_pkt_hdr_t;
-
-typedef struct{
- enum addr_type_t low_layer_type; /* ԭʼ����ײ�Э�������, ������MAC(pcap����), Ҳ������IPv4(pag����) */
- int raw_pkt_len; /* ԭʼ���ܳ��� */
- //char pkt_data[];
-}pkt_dump_pipe_t;
-
-
-static const pkt_dump_file_hdr_t pfile_hdr =
-{
- 0xA1B2C3D4,
- 0x0002,
- 0x0004,
- 0,
- 0,
- 0xFFFF,
- 1
-};
-
-/* reliable read */
-static inline ssize_t Rread(int fd, void *buf, size_t expect_count)
-{
- ssize_t ret;
- void *save_ptr = buf;
- size_t left_count = expect_count;
-
- while(left_count > 0){
-retry:
- ret = read(fd, save_ptr, left_count);
- if(ret < 0){
- switch(errno){
- case EAGAIN:
- if(0 == g_use_MESA_sleep_sw){
- usleep(1);
- }else{
- MESA_sleep();
- }
- /* no break here!!! no break here!!! no break here!!!*/
- case EINTR:
- goto retry;
- break;
-
- default:
- printf("pkt dump, read error:%s, ptr=%p, expect_count=%lu, left_count=%lu\n",
- strerror(errno), save_ptr, expect_count, left_count);
- break;
- }
- }else if(0 == ret){
- return 0; /* peer close */
- }else{
- save_ptr = (char *)save_ptr + ret;
- left_count -= ret;
- }
- }
-
- return expect_count - left_count;
-}
-
-/* reliable write */
-static inline ssize_t Rwrite(int fd, const void *buf, size_t expect_count)
-{
- ssize_t ret;
- const void *real_ptr = buf;
- size_t left_count = expect_count;
-
- while(left_count > 0){
-retry:
- ret = write(fd, real_ptr, left_count);
- if(ret < 0){
- switch(errno){
- case EINTR:
- goto retry;
- break;
-
- default:
- printf("pkt dump, write error:%s\n", strerror(errno));
- /* д�������ռ䲻��, ��������, �����Ӱ���������������� */
- break;
- }
- }else{
- real_ptr = (const char *)real_ptr + ret;
- left_count -= ret;
- }
- }
-
- return expect_count - left_count;
-}
-
-#if 0
-static void *cycle_pkt_dump_check_father(void *arg)
-{
- while(1){
- if(1 == getppid()){ /* �����̱�Ϊinit, ˵���������Ѿ��˳� */
- exit(1);
- }else{
- usleep(100000);
- }
- }
-
- return NULL;
-}
-
-
-static void *cycle_pkt_dump_thread(void *arg)
-{
- int thread_seq = *((int *)arg);
- FILE *fp;
- int file_name_post_prefix = 0, ret, pfile_hdr_flag = 0;
- long tot_pcap_file_len = 0;
- char pkt_buf[65536];
- char dump_file_name[PATH_MAX];
- pkt_dump_pkt_hdr_t *ppkt_hdr;
- int pkt_len;
- int skip_pkt_hdr_len; /* Ԥ����ͷ���ռ䳤��, ���ݲ���ģʽ��ͬ, ���ܻ����Eth�� */
-
- snprintf(dump_file_name, PATH_MAX, "%s/pid_%d.tid_%d.%d.pcap",
- G_PKT_DUMP_ROOT_DIR, getpid(), thread_seq, file_name_post_prefix);
- fp = fopen(dump_file_name, "w+");
- if(NULL == fp){
- printf("fopen %s error!\n", dump_file_name);
- goto done;
- }
- ppkt_hdr = (pkt_dump_pkt_hdr_t *)pkt_buf;
- ppkt_hdr->ts.tv_usec = 0;
-#ifdef CAPTURE_MODE_PAG
- memcpy(pkt_buf+sizeof(pkt_dump_pkt_hdr_t), phony_mac_hdr, 14);
- skip_pkt_hdr_len = sizeof(pkt_dump_pkt_hdr_t) + 14;
-#else
- skip_pkt_hdr_len = sizeof(pkt_dump_pkt_hdr_t);
-#endif
- while(1){
- /* ��pcap��ͷ���ռ�Ԥ��, ����ֻ��һ��fwrite, �ͽ�ͷ��������һ��д�� */
- pkt_len = read(G_UNIX_DOMAIN_SD[thread_seq], (char *)pkt_buf+skip_pkt_hdr_len, 2048);
- if(0 == pkt_len){
- goto done;
- }else if(pkt_len < 0){
- continue;
- }
-
- /* pcap file header, first time */
- if(0 == pfile_hdr_flag){
- fwrite(&pfile_hdr, sizeof(pkt_dump_file_hdr_t), 1, fp);
- tot_pcap_file_len += sizeof(pkt_dump_file_hdr_t);
- pfile_hdr_flag = 1;
- }
- /* ���°�����, ʱ��� */
- ppkt_hdr->ts.tv_sec = (unsigned int )g_CurrentTime;
-#ifdef CAPTURE_MODE_PAG
- ppkt_hdr->caplen = pkt_len+14;
- ppkt_hdr->len = pkt_len+14;
-#else
- ppkt_hdr->caplen = pkt_len;
- ppkt_hdr->len = pkt_len;
-#endif
-
- fwrite(pkt_buf, pkt_len+skip_pkt_hdr_len, 1, fp);
- tot_pcap_file_len += pkt_len+skip_pkt_hdr_len;
-
- /* �����������, ѭ��д�ļ� */
- if(tot_pcap_file_len >= G_PKT_DUMP_FILE_SIZE){
- fclose(fp);
- file_name_post_prefix = file_name_post_prefix ^ 1;
- snprintf(dump_file_name, PATH_MAX, "%s/pid_%d.tid_%d.%d.pcap",
- G_PKT_DUMP_ROOT_DIR, getpid(), thread_seq, file_name_post_prefix);
- fp = fopen(dump_file_name, "w+"); /* cycle write two files */
- if(NULL == fp){
- printf("fopen %s error!\n", dump_file_name);
- goto done;
- }
- tot_pcap_file_len = 0;
- pfile_hdr_flag = 0;
- }
- }
-
-done:
-
- return NULL;
-}
-#endif
-
-static void __do_cycle_pkt_dump_udp_socket(int thread_seq, const raw_pkt_t *p_raw_pkt)
-{
- const mesa_ethernet_hdr *ehdr;
- const unsigned char *pktdata;
- int pktlen;
-
- if(1 == pkt_dump_udp_socket_peer_alive){
- /* ԭʼ������ƫ������, ������һ��Ethernet֡, ���� */
- if(pkt_dump_data_offset + 14 > p_raw_pkt->raw_pkt_len){
- return;
- }
-
- if(g_packet_io_cap_level != CAP_LEVEL_MAC){
- pktdata = (const unsigned char *)p_raw_pkt->raw_pkt_data-14 + pkt_dump_data_offset,
- pktlen = p_raw_pkt->raw_pkt_len+14 - pkt_dump_data_offset;
- ehdr = (const mesa_ethernet_hdr *)pktdata;
- }else{
- pktdata = (const unsigned char *)p_raw_pkt->raw_pkt_data + pkt_dump_data_offset,
- pktlen = p_raw_pkt->raw_pkt_len - pkt_dump_data_offset;
- ehdr = (const mesa_ethernet_hdr *)pktdata;
- }
-
- /* 2017-01-06 lijia add, �dz���Ethernet�������� */
- switch(ntohs(ehdr->ether_type)){
- case ETHERTYPE_IP:
- case ETHERTYPE_IPv6:
- case ETHERTYPE_VLAN:
- case ETHERTYPE_ARP:
- break;
-
- default:
- return;
- }
-
- if(G_PKT_DUMP_FILTER_STR[0] != '\0'){
- if(0 == bpf_filter(G_PKT_DUMP_BPF_FILTER[thread_seq].bf_insns,
- (const unsigned char *)pktdata, pktlen, pktlen)){
- return;
- }
- }
-
- /* bingo, match filter, sendto */
- sendto(pkt_dump_udp_pkt_sd[thread_seq],
- (char *)pktdata,
- pktlen,
- MSG_DONTWAIT,
- (const struct sockaddr *)&udp_recv_addr,
- sizeof(udp_recv_addr));
- }
-}
-
-static void __do_cycle_pkt_dump(int thread_seq, const raw_pkt_t *p_raw_pkt)
-{
- int ret;
- /* ����Ϊpcap_hdr[2]����,��һ��СС��trick, ����[0]��ʾpcap��ͷ����Ϣ,
- ����[1]��ʾ��PAGģʽ��, �洢��etherhdr, pkt_dump_pkt_hdr_tΪ16�ֽ�, ���ÿ��Է�һ��������ether hdr.
- */
- pkt_dump_pkt_hdr_t pcap_hdr[2];
- int write_hdr_len;
- char dump_file_name[PATH_MAX];
-
- if(PKT_DUMP_LOCAL_FILE == G_PKT_DUMP_MODE){
- if(0 == G_PKT_DUMP_PER_THREAD_SW[thread_seq]){
- return;
- }
- }else{
- __do_cycle_pkt_dump_udp_socket(thread_seq, p_raw_pkt);
- return;
- }
-
- if(G_PKT_DUMP_FILTER_STR[0] != '\0'){
- if(g_packet_io_cap_level != CAP_LEVEL_MAC){
- if(0 == bpf_filter(G_PKT_DUMP_BPF_FILTER[thread_seq].bf_insns,
- (const unsigned char *)p_raw_pkt->raw_pkt_data-14,
- p_raw_pkt->raw_pkt_len+14, p_raw_pkt->raw_pkt_len+14)){
- return;
- }
- }else{
- if(0 == bpf_filter(G_PKT_DUMP_BPF_FILTER[thread_seq].bf_insns,
- (const unsigned char *)p_raw_pkt->raw_pkt_data,
- p_raw_pkt->raw_pkt_len, p_raw_pkt->raw_pkt_len)){
- return;
- }
- }
- }
-
- if(unlikely(NULL == G_PKT_DUMP_FP[thread_seq])){
- snprintf(dump_file_name, PATH_MAX, "%s/pid_%d.tid_%d.%d.pcap",
- G_PKT_DUMP_ROOT_DIR, getpid(), thread_seq, G_FILENAME_INDEX[thread_seq]);
- G_PKT_DUMP_FP[thread_seq] = fopen(dump_file_name, "wb+");
- if(NULL == G_PKT_DUMP_FP[thread_seq]){
- printf("fopen %s error!\n", dump_file_name);
- return;
- }
- /* pcap file header, first time */
- fwrite(&pfile_hdr, sizeof(pkt_dump_file_hdr_t), 1, G_PKT_DUMP_FP[thread_seq]);
- }
-
- /* ���°�����, ʱ��� */
- pcap_hdr[0].ts.tv_sec = (unsigned int )g_CurrentTime;
-
- if(g_packet_io_cap_level != CAP_LEVEL_MAC){
- pcap_hdr[0].caplen = p_raw_pkt->raw_pkt_len+14;
- pcap_hdr[0].len = p_raw_pkt->raw_pkt_len+14;
- memcpy(&pcap_hdr[1], phony_mac_hdr, 14);
- write_hdr_len = sizeof(pkt_dump_pkt_hdr_t) + 14;
- }else{
- pcap_hdr[0].caplen = p_raw_pkt->raw_pkt_len;
- pcap_hdr[0].len = p_raw_pkt->raw_pkt_len;
- write_hdr_len = sizeof(pkt_dump_pkt_hdr_t);
- }
-
- ret = fwrite(&pcap_hdr[0], write_hdr_len, 1, G_PKT_DUMP_FP[thread_seq]);
- if(unlikely(ret < 1)){
- return;
- }
- ret = fwrite(p_raw_pkt->raw_pkt_data, p_raw_pkt->raw_pkt_len, 1, G_PKT_DUMP_FP[thread_seq]);
- if(unlikely(ret < 1)){
- /* ���ֻд��ͷ��, ��д���ݳ��ִ���, �ع� */
- fseek(G_PKT_DUMP_FP[thread_seq], (int)0-(int)sizeof(pkt_dump_pkt_hdr_t), SEEK_CUR);
- return;
- }
-
- /* �����������, ѭ��д�ļ� */
- G_PCAP_SIZE[thread_seq] += write_hdr_len + p_raw_pkt->raw_pkt_len;
- if(unlikely(G_PCAP_SIZE[thread_seq] >= G_PKT_DUMP_FILE_SIZE)){
- fclose(G_PKT_DUMP_FP[thread_seq]);
- G_FILENAME_INDEX[thread_seq] ^= 1;
- snprintf(dump_file_name, PATH_MAX, "%s/pid_%d.tid_%d.%d.pcap",
- G_PKT_DUMP_ROOT_DIR, getpid(), thread_seq, G_FILENAME_INDEX[thread_seq]);
- G_PKT_DUMP_FP[thread_seq] = fopen(dump_file_name, "wb+");
- if(NULL == G_PKT_DUMP_FP[thread_seq]){
- printf("fopen %s error!\n", dump_file_name);
- return;
- }
- /* pcap file header, first time */
- fwrite(&pfile_hdr, sizeof(pkt_dump_file_hdr_t), 1, G_PKT_DUMP_FP[thread_seq]);
- G_PCAP_SIZE[thread_seq] = 0;
- }
-
- return;
-}
-
-void cycle_pkt_dump(int thread_seq, const raw_pkt_t *p_raw_pkt)
-{
- if(likely(0 == G_PKT_DUMP_SW)){
- return;
- }
-
- __do_cycle_pkt_dump(thread_seq, p_raw_pkt);
-}
-
-void cycle_pkt_dump_old(int thread_seq, const void *ippkt, int ippktlen)
-{
- raw_pkt_t raw_pkt;
-
- raw_pkt.raw_pkt_data = ippkt;
- raw_pkt.raw_pkt_len = ippktlen;
-
- cycle_pkt_dump(thread_seq, &raw_pkt);
-}
-
-#if 0
-static int cycle_pkt_dump_child_init(void)
-{
- int i, ret;
- struct sockaddr_un father_pro_addr;
- int addr_len;
- char test_buf[1024];
- int buf_len = 0;
- socklen_t opt_len;
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- G_UNIX_DOMAIN_SD[i] = socket(AF_UNIX,SOCK_DGRAM,0);
- if(G_UNIX_DOMAIN_SD[i] < 0){
- printf("socket error: %s\n", strerror(errno));
- return -1;
- }
-
- addr_len = sizeof(father_pro_addr);
- father_pro_addr.sun_family=AF_UNIX;
- snprintf(father_pro_addr.sun_path, sizeof(father_pro_addr.sun_path), "%s%d", UNIX_DOMAIN_SOCKET_NAME, i);
-
- unlink(father_pro_addr.sun_path);
- if(bind(G_UNIX_DOMAIN_SD[i], (struct sockaddr *)&father_pro_addr, addr_len) < 0){
- printf("bind %s error: %s\n", father_pro_addr.sun_path, strerror(errno));
- return -1;
- }
-
- listen(G_UNIX_DOMAIN_SD[i], 10);
- }
-
- usleep(10000);
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- ret = read(G_UNIX_DOMAIN_SD[i], test_buf, 1024); /* �����ȴ��������̵�����, ��ȷ����˵���������� */
- if(ret <= 0){
- printf("socket read error:%s\n", strerror(errno));
- return -1;
- }
- }
-
- return 0;
-}
-#endif
-
-
-#if DEBUG
-static long ifuncb_show_pktdump_summary(iknow_handle ihandle, iknow_conn iconn, const void *cb_fun_arg, const char *cmd_args)
-{
- int i;
- unsigned long long discard_pkt_sum = 0, discard_byte_sum = 0;
- unsigned long long tot_pkt_sum = 0, tot_byte_sum = 0;
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- tot_pkt_sum += PKT_DISCARD_STAT[i].total_pkt_num;
- tot_byte_sum += PKT_DISCARD_STAT[i].total_pkt_bytes;
- discard_pkt_sum += PKT_DISCARD_STAT[i].discard_pkt_num;
- discard_byte_sum += PKT_DISCARD_STAT[i].discard_pkt_bytes;
- }
- //iprintf(ihandle, iconn,"NOTE: unit of byte for total is 'byte', for realtime is 'bps, bit per second'!\n");
- iprintf(ihandle, iconn, "%8s %8s %13s\n", "", "packet", "byte");
- iprintf(ihandle, iconn, "%8s %8llu %13llu\n", "total", tot_pkt_sum, tot_byte_sum);
- iprintf(ihandle, iconn, "%8s %8llu %13llu\n", "DROP", discard_pkt_sum, discard_byte_sum);
-
- return 0;
-}
-
-#endif
-
-#if 0
-static int cycle_pkt_dump_father_init(void)
-{
- int i;
- struct sockaddr_un child_pro_addr;
- int addr_len;
- char test_buf[1024] = "I am father";
- int buf_len = 0;
- socklen_t opt_len;
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- G_UNIX_DOMAIN_SD[i] = socket(AF_UNIX,SOCK_DGRAM,0);
- if(G_UNIX_DOMAIN_SD[i] < 0){
- printf("socket error: %s\n", strerror(errno));
- return -1;
- }
-
- addr_len = sizeof(child_pro_addr);
- child_pro_addr.sun_family=AF_UNIX;
- snprintf(child_pro_addr.sun_path, sizeof(child_pro_addr.sun_path), "%s%d", UNIX_DOMAIN_SOCKET_NAME, i);
-
- if(connect(G_UNIX_DOMAIN_SD[i], (struct sockaddr*)&child_pro_addr, addr_len) < 0){
- printf("connect %s error: %s\n", child_pro_addr.sun_path, strerror(errno));
- return -1;
- }
- }
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- write(G_UNIX_DOMAIN_SD[i], test_buf, 1024);
- }
-
- unlink(child_pro_addr.sun_path);
-#if DEBUG
- iknow_register_cmd(PLATFORM_IHANDLE, "show pktdump summary", "display packet dump status",
- ifuncb_show_pktdump_summary, NULL, 0, NULL);
-#endif
-
- return 0;
-}
-#endif
-
-#if 0
-static void cycle_pkt_dump_clear_last_status(void)
-{
- char cmd_buf[128];
-
- snprintf(cmd_buf, 128, "killall %s", PKT_DUMP_PROCESS_NAME);
-
- system(cmd_buf);
-}
-
-
-static void cycle_pkt_dump_exec(int argc, char *argv[])
-{
- int i;
- pid_t pid;
- pthread_t check_ppid, thread_id[MAX_THREAD_NUM];
- static int thread_seq[MAX_THREAD_NUM];
-
- cycle_pkt_dump_clear_last_status();
-
- pid = fork();
- if(0 == pid){ /* �ӽ���, ���������� */
- if(cycle_pkt_dump_child_init() < 0){
- printf("cycle pkt dump init error!\n");
- exit(1);
- }
- prctl(PR_SET_NAME, PKT_DUMP_PROCESS_NAME, 0, 0, 0);
- }else if(pid > 0){
- usleep(50000);
- if(cycle_pkt_dump_father_init() < 0){
- printf("cycle pkt dump init error!\n");
- exit(1);
- }
- return; /* �����̷���, ��sapp������ */
- }else{
- printf("cycle_pkt_dump fork error!\n");
- exit(0);
- }
-
- for(i = 0; i < pkt_dump_thread_num; i++){
- if(G_PKT_DUMP_PER_THREAD_SW[i] != 0){
- thread_seq[i] = i;
- pthread_create(&thread_id[i], NULL, cycle_pkt_dump_thread, &thread_seq[i]);
- usleep(100);
- }
- }
-
- pthread_create(&check_ppid, NULL, cycle_pkt_dump_check_father, NULL);
-
- /* �ӽ��̵����߳������ȴ� */
- for(i = 0; i < pkt_dump_thread_num; i++){
- if(G_PKT_DUMP_PER_THREAD_SW[i] != 0){
- pthread_join(thread_id[i], NULL);
- }
- }
-
- exit(0);
-}
-#endif
-
-static void cycle_pkt_dump_set_thread_num(int thread_num)
-{
- pkt_dump_thread_num = thread_num;
-}
-
-static int cycle_pkt_dump_get_core_num(void)
-{
- FILE *fp;
- char line_buf[PATH_MAX] = {0};
- int core_num = 0;
-
- fp = popen("ls -l core.* | wc -l", "r");
- if(NULL == fp){
- return -1;
- }
-
- fgets(line_buf, PATH_MAX, fp);
-
- core_num = atoi(line_buf);
-
- pclose(fp);
- return core_num;
-}
-
-/* config is like: "0,1,2,3,4,5" */
-static int cycle_pkt_dump_parse_per_thread_switch(char *config_str)
-{
- char *parse_config = config_str;
- char *save_ptr;
- char *token;
- int i, thread_seq;
-
- if(strncasecmp("all", config_str, 3) == 0){ /* all thread is enable */
- for(i = 0; i < pkt_dump_thread_num; i++){
- G_PKT_DUMP_PER_THREAD_SW[i] = 1;
- }
- return 0;
- }
-
- while((token = strtok_r(parse_config, ", \t", &save_ptr)) != NULL){
- thread_seq = atoi(token);
- if(thread_seq < 0 || thread_seq >= pkt_dump_thread_num){
- printf("'pkt_dump_thread_seq' config invalid, threadnum=%d!\n", pkt_dump_thread_num);
- return -1;
- }
- G_PKT_DUMP_PER_THREAD_SW[thread_seq] = 1;
- parse_config = NULL;
- }
-
- return 0;
-}
-
-
-static long cycle_pkt_dump_get_cur_files_size(void)
-{
- FILE *fp;
- long cur_files_size;
- char cmd_str[PATH_MAX], tmp_str[1024];
-
- snprintf(cmd_str, PATH_MAX, "du -scb %s | grep %s | awk {'print $1'}", G_PKT_DUMP_ROOT_DIR, G_PKT_DUMP_ROOT_DIR);
-
- fp = popen(cmd_str, "r");
- if(NULL == fp){
- return -1;
- }
-
- if(NULL == fgets(tmp_str, 1024, fp)){
- return -1;
- }
- cur_files_size = (long)strtol(tmp_str, NULL, 10);
-
- pclose(fp);
-
- return cur_files_size;
-}
-
-static int cycle_pkt_dump_get_cur_enable_thread(void)
-{
- int i, sum = 0;
-
- for(i = 0; i < MAX_THREAD_NUM; i++){
- if(G_PKT_DUMP_PER_THREAD_SW[i] > 0){
- sum++;
- }
- }
-
- return sum;
-}
-/*
- total_files_size: ��Ŀ¼���ܵ�.pcap����С, ��λ:Byte;
- file_size_per_thread_by_conf: �����߳�����ļ���С, ��λ:Byte;
-
- ���յ�ʵ��file_size_per_threadֵ, ȡ���ڵ�ǰ���е�.pcap�ļ���С��total_files_size�Ĺ�ϵ;
- �����ǰ���е�.pcap�ļ��ѳ���total_files_size, ����д�µ��ļ�.
-*/
-static int cycle_pkt_dump_set_file_size(long total_files_size, long file_size_per_thread_by_conf)
-{
- long cur_files_size;
- int cur_enable_thread_num = 0;
- long file_size_per_thread_by_calc; /* ����ʵ�ʼ���ó���ÿ���߳�����ļ���С */
-
- cur_files_size = cycle_pkt_dump_get_cur_files_size();
- if(cur_files_size < 0 || cur_files_size >= total_files_size){
- printf("\033[33m[Warning]pkt_dump is enable, but current files size is more than 'pkt_dump_total_size', disable pktdump!\033[0m\n");
- usleep(100000);
- G_PKT_DUMP_SW = 0;
- return -1;
- }
-
- cur_enable_thread_num = cycle_pkt_dump_get_cur_enable_thread();
- if(0 == cur_enable_thread_num){
- printf("\033[33m[Warning]pkt_dump is enable, but enable thread number is 0, disable pktdump!\033[0m\n");
- usleep(100000);
- return -1;
- }
-
- file_size_per_thread_by_calc = (total_files_size-cur_files_size)/cur_enable_thread_num/2;
-
- /* ����ȡ��С */
- G_PKT_DUMP_FILE_SIZE = (file_size_per_thread_by_calc < file_size_per_thread_by_conf?file_size_per_thread_by_calc:file_size_per_thread_by_conf);
- if(G_PKT_DUMP_FILE_SIZE < 2048){
- printf("\033[33m[Warning]pkt_dump is enable, but current files size is more than 'pkt_dump_total_size'!\033[0m\n");
- return -1;
- }
-
- return 0;
-}
-
-static void pkt_dump_sig_ignore(int sig)
-{
- return;
-}
-
-static void pkt_dump_sig_handle(int sig)
-{
- signal(SIGSEGV, pkt_dump_sig_ignore); /* SIGSEGV����������, ��һ����ٵ��жϴ�������ƭ��ϵͳ */
- sync(); /* ����������δд�����̵�����ǿ��д�� */
- abort(); /* ��ֹ����, ����core�ļ� */
-}
-
-static void pkt_dump_set_default_opt(void)
-{
- udp_recv_addr.sin_family = AF_INET;
- udp_recv_addr.sin_addr.s_addr = htonl(0x7f000001);
- udp_recv_addr.sin_port = htons(12345);
-
- memset(G_PKT_DUMP_FILTER_STR, 0, sizeof(G_PKT_DUMP_FILTER_STR));
- pkt_dump_data_offset = 0;
-}
-
-static void pkt_dump_parse_opt_rcv_port(const struct pkt_dump_opt *cmd_opt, const char *opt_val)
-{
- unsigned short *rcv_port = (unsigned short *)opt_val;
-
- udp_recv_addr.sin_port = *rcv_port; /* �˴�ֱ��ʹ�������� */
-}
-
-static void pkt_dump_parse_opt_bpf_filter(const struct pkt_dump_opt *cmd_opt, const char *opt_val)
-{
- memcpy(G_PKT_DUMP_FILTER_STR, opt_val, ntohs(cmd_opt->opt_len)); /* �Ѱ�����EOF */
-}
-
-static void pkt_dump_parse_opt_dump_offset(const struct pkt_dump_opt *cmd_opt, const char *opt_val)
-{
- unsigned short *toffset = (unsigned short *)opt_val;
- pkt_dump_data_offset = ntohs(*toffset);
-}
-
-static void cycle_pkt_dump_command_parse(int connfd)
-{
- char cmd_buf[1024];
- unsigned int i;
- int ret;
- struct pkt_dump_handshake pkt_hdr;
- struct pkt_dump_opt cmd_opt;
-
- /* �ȷ���2���ֽ�tcpdump UDP���ն˿� */
- ret = MESA_sock_greedy_read(connfd, &pkt_hdr, sizeof(pkt_hdr), -1);
- if(0 == ret){
- goto err_exit;
- }else if(ret < 0){
- printf("sock read error, %s\n", strerror(errno));
- goto err_exit;
- }
-
- if(ntohl(pkt_hdr.magic) != PKT_DUMP_HDR_MAGIC){
- printf("Remote tcpdump is not recognized\n");
- goto err_exit;
- }
-
- pkt_dump_set_default_opt();
-
- for(i = 0; i < ntohl(pkt_hdr.opt_num); i++){
- /* get opt hdr */
- ret = MESA_sock_greedy_read(connfd, &cmd_opt, sizeof(cmd_opt), -1);
- if(0 == ret){
- goto err_exit;
- }else if(ret < 0){
- printf("sock read error, %s\n", strerror(errno));
- goto err_exit;
- }
- /* get opt value */
- ret = MESA_sock_greedy_read(connfd, cmd_buf, ntohs(cmd_opt.opt_len), -1);
- if(0 == ret){
- goto err_exit;
- }else if(ret < 0){
- printf("sock read error, %s\n", strerror(errno));
- goto err_exit;
- }
-
- switch(ntohs(cmd_opt.opt_type)){
- case PKT_DUMP_OPT_RCV_PORT:
- pkt_dump_parse_opt_rcv_port(&cmd_opt, cmd_buf);
- break;
-
- case PKT_DUMP_OPT_BPF_FILTER:
- pkt_dump_parse_opt_bpf_filter(&cmd_opt, cmd_buf);
- break;
-
- case PKT_DUMP_OPT_DATA_OFFSET:
- pkt_dump_parse_opt_dump_offset(&cmd_opt, cmd_buf);
- break;
-
- default:
- /* δ֪ѡ������������ */
- break;
- }
- }
-
- for(i = 0; i < (unsigned int )g_packet_io_thread_num; i++){
- phony_pcap_handle[i] = pcap_open_dead(DLT_EN10MB, 65535);
- if(NULL == phony_pcap_handle[i]){
- goto err_exit;
- }
-
- if(G_PKT_DUMP_FILTER_STR[0] != '\0'){ /* ����û��filter */
- if(pcap_compile(phony_pcap_handle[i], &G_PKT_DUMP_BPF_FILTER[i], G_PKT_DUMP_FILTER_STR, 100, 0) < 0){
- printf("Compile pcap filter '%s' error:%s\n", G_PKT_DUMP_FILTER_STR, pcap_geterr(phony_pcap_handle[i]));
- goto err_exit;
- }
- }
- }
-
- pkt_dump_udp_socket_peer_alive = 1;
-
- /* �Ժ��ٶ�̬�����κ�����, ֱ�����ӽ��� */
- while(MESA_sock_greedy_read(connfd, cmd_buf, sizeof(cmd_buf), -1) != 0);
-
-err_exit:
- pkt_dump_udp_socket_peer_alive = 0;
- usleep(1000 * 500); /* ��ʱ�ͷ�, �������߳�����ʹ��BPF������ */
- for(i = 0; i < (unsigned int )g_packet_io_thread_num; i++){
- pcap_freecode(&G_PKT_DUMP_BPF_FILTER[i]);
- }
- memset(G_PKT_DUMP_FILTER_STR, 0, sizeof(G_PKT_DUMP_FILTER_STR));
- pkt_dump_data_offset = 0;
- close(connfd);
- return;
-}
-
-static void * cycle_pkt_dump_udp_socket_daemon_thread(void *arg)
-{
- socklen_t cliaddr_len;
- struct sockaddr_in cliaddr;
- int connfd;
-#ifdef _GNU_SOURCE
- pthread_setname_np(pthread_self(), "sapp_pkt_dump");
-#endif
-
- while(1){
- cliaddr_len = sizeof(cliaddr);
- connfd = accept(pkt_dump_tcp_cmd_sd, (struct sockaddr *) &cliaddr, &cliaddr_len);
- if(connfd > 0){
- cycle_pkt_dump_command_parse(connfd);
- }
- }
-
- return NULL;
-}
-
-static int cycle_pkt_dump_socket_init(void)
-{
- pthread_t pid;
- int i, opt;
- struct sockaddr_in sockadd;
-
- pkt_dump_tcp_cmd_sd = socket(AF_INET, SOCK_STREAM, 0);
-
- opt = 1;
- setsockopt(pkt_dump_tcp_cmd_sd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int));
-
- bzero(&sockadd, sizeof(sockadd));
- sockadd.sin_family = AF_INET;
- sockadd.sin_addr.s_addr = htonl(INADDR_ANY);
- sockadd.sin_port = htons(pkt_dump_tcp_bind_port);
-
- if(bind(pkt_dump_tcp_cmd_sd, (struct sockaddr *) &sockadd, sizeof(sockadd)) < 0){
- printf("pkt dump bind cmd port %u error, %s!\n", pkt_dump_tcp_bind_port, strerror(errno));
- return -1;
- }
- listen(pkt_dump_tcp_cmd_sd, 1); /* ��ʱֻ֧��һ���ͻ��˲��� */
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- pkt_dump_udp_pkt_sd[i] = socket(AF_INET, SOCK_DGRAM, 0);
- }
-
- pthread_create(&pid, NULL, cycle_pkt_dump_udp_socket_daemon_thread, NULL);
-
- return 0;
-}
-
-int cycle_pkt_dump_init(int argc, char *argv[])
-{
- int i, ret;
- int int_tmp, total_files_size, core_num;
- char per_thread_sw[PATH_MAX];
- char pcap_errbuf[PCAP_ERRBUF_SIZE];
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_switch", &G_PKT_DUMP_SW, 0);
-
- if(0 == G_PKT_DUMP_SW){
- return 0;
- }
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_mode", &G_PKT_DUMP_MODE, 1);
- if((G_PKT_DUMP_MODE != PKT_DUMP_LOCAL_FILE) && (G_PKT_DUMP_MODE != PKT_DUMP_UDP_SOCKET)){
- printf("\n\033[41mError! pkt_dump_mode only support 1 or 2!\033[0m\n");
- return -1;
- }
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_cmd_port", &int_tmp, 12345);
- if((int_tmp <=0) || (int_tmp > 65535)){
- printf("\n\033[41mError! pkt_dump_cmd_port invalid, %d!\033[0m\n", int_tmp);
- return -1;
- }
- pkt_dump_tcp_bind_port = (unsigned short)int_tmp;
-
-#if 0 == CYCLE_PKT_DUMP
- printf("\n\033[33m[Warning]pkt_dump is enable, but sapp is not compile correct, please use debug=2.\033[0m\n");
- sleep(1);
-#endif
-
- if(PKT_DUMP_LOCAL_FILE == G_PKT_DUMP_MODE){
- cycle_pkt_dump_set_thread_num(g_packet_io_thread_num);
-
- core_num = cycle_pkt_dump_get_core_num();
- if(core_num < 0 || core_num > 10){
- printf("\033[33m[Warning]core.* number is more than 10, pkt dump is auto disabled!\n");
- G_PKT_DUMP_SW = 0;
- return 0;
- }
-
- MESA_load_profile_string_def((char *)"conf/main.conf",(char *)"pkt_dump", (char *)"pkt_dump_bpf_filter", G_PKT_DUMP_FILTER_STR, PATH_MAX, (char *)"");
- if(G_PKT_DUMP_FILTER_STR[0] != '\0'){
- for(i = 0; i < g_packet_io_thread_num; i++){
- phony_pcap_handle[i] = pcap_open_dead(DLT_EN10MB, 65535);
- if(NULL == phony_pcap_handle[i]){
- printf("pcap_open %s error, %s\n", "lo", pcap_errbuf);
- printf("\n\033[41mpkt_dump_bpf_filter is not enable!\033[0m\n");
- goto skip_bpf_filter;
- }
- if(pcap_compile(phony_pcap_handle[i], &G_PKT_DUMP_BPF_FILTER[i], G_PKT_DUMP_FILTER_STR, 100, 0) < 0){
- printf("Compile pcap filter '%s' error:%s\n", G_PKT_DUMP_FILTER_STR, pcap_geterr(phony_pcap_handle[i]));
- return -1;
- }
- }
- }
-
- skip_bpf_filter:
-
- MESA_load_profile_string_def((char *)"conf/main.conf",(char *)"pkt_dump", (char *)"pkt_dump_file_root_dir", G_PKT_DUMP_ROOT_DIR, PATH_MAX, (char *)"/tmp/pkt_dump");
- MESA_mkdir_p(G_PKT_DUMP_ROOT_DIR, 0755);
-
- MESA_load_profile_string_nodef((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_thread_seq", per_thread_sw, PATH_MAX);
- if(cycle_pkt_dump_parse_per_thread_switch(per_thread_sw) < 0){
- return 0;
- }
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_total_size", &total_files_size, 1000);
- if(total_files_size < 1 || (unsigned int)total_files_size >= 1024*100 /* 100GB */){
- printf("pkt_dump_total_size invalid!\n");
- return -1;
- }
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_file_max_size", &int_tmp, 100);
- if(int_tmp < 2 || (unsigned int)int_tmp >= 1024*100 /* 100GB */){
- printf("pkt_dump_file_max_size invalid!\n");
- return -1;
- }
- /* ÿ���߳���Ҫѭ��д2���ļ�, ������Ҫ��pkt_dump_file_max_size��ʵ��ֵ�ٳ���2 */
- if(cycle_pkt_dump_set_file_size((long)total_files_size*1024*1024, (long)int_tmp*1024*512) < 0){
- return 0;
- }
-
- signal(SIGPIPE, SIG_IGN);
- /* ����SIGSEGV�ź�, ��֤�����쳣��ֹʱ, ���һ������BUG��pcap��������д��Ӳ�� */
- if((SIG_ERR == signal(SIGSEGV, pkt_dump_sig_handle))){
- printf("Catch SIGSEGV error!\n");
- }
-
-#if DEBUG
- iknow_register_cmd(PLATFORM_IHANDLE, "show pkt dump summary", "display pkt dump summary",
- ifuncb_show_pktdump_summary, NULL, 0, NULL);
-#endif
- printf("\n\033[33m[Warning]pkt dump enable, this maybe encumber performance.\033[0m\n");
- sleep(1);
- }else{
- ret = cycle_pkt_dump_socket_init();
- }
-
- return ret;
-}
-
-
-#ifdef __cplusplus
-}
-#endif
-
-
-
diff --git a/packet_io/cycle_pkt_dump_through_write_with_offset.c.bak2 b/packet_io/cycle_pkt_dump_through_write_with_offset.c.bak2
deleted file mode 100644
index 8a018f4..0000000
--- a/packet_io/cycle_pkt_dump_through_write_with_offset.c.bak2
+++ /dev/null
@@ -1,1055 +0,0 @@
-#include "packet_io.h"
-#include "stream_internal.h"
-#include "stream_manage.h"
-#include "mesa_net.h"
-#include "sendpacket.h"
-#include "MESA_prof_load.h"
-#include "MESA_sleep.h"
-#include "MESA_socket_wrap.h"
-#include "iknow.h"
-#include "mesa_pkt_dump.h"
-#include <stdio.h>
-#include <unistd.h>
-#include <assert.h>
-#include <errno.h>
-#include <pthread.h>
-#include <signal.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/prctl.h>
-#include <sys/un.h>
-#include <execinfo.h>
-#include <pcap/pcap.h>
-
-/*
- 2015-04-15 , LiJia.
- ����cycle_pkt_dump����,
- ����ʵʱѭ���洢���ݰ���Ŀ���ǽ�����߻�����������ҵ���ֻ����һ��core, ��BUG�޷���������.
- sapp����coredump�� 'pkt_dump_file_root_dir'Ŀ¼��洢���һ��ʱ���յ��İ�,
- ���ö���ģʽ���֣����п��ܷ���BUG������Դ��
- ������������֣���pkt_dump_file_max_size�ʵ�����һЩ.
-
- main.conf������1���µ�section��5������������:
- [pkt_dump]
- pkt_dump_switch=0 //�ܿ���
- pkt_dump_total_size=1000 //root_dir�ܼ�.pcap�ļ��Ĵ�С, ��λ:MB, ��ֹ������ƶ�������д��Ӳ��
- pkt_dump_file_max_size=200 //pcap�ļ�ÿ���߳̿������ֵ, ��λ:MB.
- pkt_dump_file_root_dir=/dev/shm //pcap�洢·��, �Ƽ�/dev/shm, ��Ӳ���ٶȿ�ܶ�
- pkt_dump_thread_seq=0,2,4,6,8 //ÿ���̵߳Ŀ��أ���Ϊ�����������ܾ޴��޷�ȫ���洢���Ǿ�����������ֻ���ò����̵߳�dump���� , all=ȫ����
-
-*/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-#define UNIX_DOMAIN_SOCKET_NAME "/tmp/.pktdump"
-#define PKT_DUMP_PROCESS_NAME "sapp_pkt_dump"
-
-extern iknow_handle PLATFORM_IHANDLE;
-
-enum dump_mode{
- PKT_DUMP_LOCAL_FILE = 1, /* д�����ļ� */
- PKT_DUMP_UDP_SOCKET = 2, /* д��UDP ij���˿� */
-};
-
-#if DEBUG
-#include "iknow.h"
-
-typedef struct{
- unsigned long long total_pkt_num;
- unsigned long long total_pkt_bytes;
- unsigned long long discard_pkt_num;
- unsigned long long discard_pkt_bytes;
- char __pad__[32]; /* 64�ֽ�cache���� */
-}pkt_dump_status_t;
-static pkt_dump_status_t PKT_DISCARD_STAT[MAX_THREAD_NUM];
-
-#endif
-
-extern int g_packet_io_cap_level;
-extern int g_use_MESA_sleep_sw;
-extern int MESA_mkdir_p(const char *pathname, mode_t mode);
-//extern time_t g_CurrentTime;
-extern int g_packet_io_thread_num;
-extern int g_iThreadNum; /* for dual_stack, start */
-static char G_PKT_DUMP_ROOT_DIR[PATH_MAX]; /* ����ָ��Ϊ/dev/shm, �ٶȿ� */
-static long G_PKT_DUMP_FILE_SIZE = 104857600; /* Ĭ��100MB, ���߳� */
-int G_PKT_DUMP_SW = 0; /* Ĭ�Ϲر� */
-int G_PKT_DUMP_MODE = PKT_DUMP_LOCAL_FILE; /* Ĭ����д�������ļ� */
-static int G_PKT_DUMP_PER_THREAD_SW[MAX_THREAD_NUM];
-
-static int pkt_dump_thread_num = 1;
-
-static FILE *G_PKT_DUMP_FP[MAX_THREAD_NUM];
-static int G_FILENAME_INDEX[MAX_THREAD_NUM];
-static long G_PCAP_SIZE[MAX_THREAD_NUM];
-static char G_PKT_DUMP_FILTER_STR[PATH_MAX];
-static struct bpf_program G_PKT_DUMP_BPF_FILTER[MAX_THREAD_NUM];
-static pcap_t *phony_pcap_handle[MAX_THREAD_NUM]; /* ������BPF����ʱʹ�� */
-static unsigned short pkt_dump_data_offset = 0; /* ����ʱ��ָ��ƫ����, ����vxlan�����²����ڲ����ݰ� */
-static unsigned short pkt_dump_tcp_bind_port = 12345; /* Ĭ��TCP�����˿�, ���ڽ����ⲿtcpdump���� */
-static int pkt_dump_tcp_cmd_sd = -1;/* TCP fd, ���ڽ����ⲿtcpdump���� */
-static volatile int pkt_dump_udp_socket_peer_alive = 0; /* �ⲿtcpdump�Ƿ��� */
-static int pkt_dump_udp_pkt_sd[MAX_THREAD_NUM]; /* UDP�������ݰ�fd */
-static struct sockaddr_in udp_recv_addr;
-
-static unsigned char phony_mac_hdr[14] =
-{
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0x12, 0x23, 0x34, 0x56, 0x67, 0x78,
- 0x08, 0x00
-};
-typedef struct {
- unsigned int magic;
- unsigned short version_major;
- unsigned short version_minor;
- unsigned int thiszone; /* gmt to local correction */
- unsigned int sigfigs; /* accuracy of timestamps */
- unsigned int snaplen; /* max length saved portion of each pkt */
- unsigned int linktype; /* data link type (LINKTYPE_*) */
-}pkt_dump_file_hdr_t;
-
-struct pkt_dump_timeval {
- unsigned int tv_sec; /* seconds */
- unsigned int tv_usec; /* microseconds */
-};
-
-typedef struct {
- struct pkt_dump_timeval ts; /* time stamp */
- unsigned int caplen; /* length of portion present */
- unsigned int len; /* length this packet (off wire) */
-}pkt_dump_pkt_hdr_t;
-
-typedef struct{
- enum addr_type_t low_layer_type; /* ԭʼ����ײ�Э�������, ������MAC(pcap����), Ҳ������IPv4(pag����) */
- int raw_pkt_len; /* ԭʼ���ܳ��� */
- //char pkt_data[];
-}pkt_dump_pipe_t;
-
-
-static const pkt_dump_file_hdr_t pfile_hdr =
-{
- 0xA1B2C3D4,
- 0x0002,
- 0x0004,
- 0,
- 0,
- 0xFFFF,
- 1
-};
-
-/* reliable read */
-static inline ssize_t Rread(int fd, void *buf, size_t expect_count)
-{
- ssize_t ret;
- void *save_ptr = buf;
- size_t left_count = expect_count;
-
- while(left_count > 0){
-retry:
- ret = read(fd, save_ptr, left_count);
- if(ret < 0){
- switch(errno){
- case EAGAIN:
- if(0 == g_use_MESA_sleep_sw){
- usleep(1);
- }else{
- MESA_sleep();
- }
- /* no break here!!! no break here!!! no break here!!!*/
- case EINTR:
- goto retry;
- break;
-
- default:
- printf("pkt dump, read error:%s, ptr=%p, expect_count=%lu, left_count=%lu\n",
- strerror(errno), save_ptr, expect_count, left_count);
- break;
- }
- }else if(0 == ret){
- return 0; /* peer close */
- }else{
- save_ptr = (char *)save_ptr + ret;
- left_count -= ret;
- }
- }
-
- return expect_count - left_count;
-}
-
-/* reliable write */
-static inline ssize_t Rwrite(int fd, const void *buf, size_t expect_count)
-{
- ssize_t ret;
- const void *real_ptr = buf;
- size_t left_count = expect_count;
-
- while(left_count > 0){
-retry:
- ret = write(fd, real_ptr, left_count);
- if(ret < 0){
- switch(errno){
- case EINTR:
- goto retry;
- break;
-
- default:
- printf("pkt dump, write error:%s\n", strerror(errno));
- /* д�������ռ䲻��, ��������, �����Ӱ���������������� */
- break;
- }
- }else{
- real_ptr = (const char *)real_ptr + ret;
- left_count -= ret;
- }
- }
-
- return expect_count - left_count;
-}
-
-#if 0
-static void *cycle_pkt_dump_check_father(void *arg)
-{
- while(1){
- if(1 == getppid()){ /* �����̱�Ϊinit, ˵���������Ѿ��˳� */
- exit(1);
- }else{
- usleep(100000);
- }
- }
-
- return NULL;
-}
-
-
-static void *cycle_pkt_dump_thread(void *arg)
-{
- int thread_seq = *((int *)arg);
- FILE *fp;
- int file_name_post_prefix = 0, ret, pfile_hdr_flag = 0;
- long tot_pcap_file_len = 0;
- char pkt_buf[65536];
- char dump_file_name[PATH_MAX];
- pkt_dump_pkt_hdr_t *ppkt_hdr;
- int pkt_len;
- int skip_pkt_hdr_len; /* Ԥ����ͷ���ռ䳤��, ���ݲ���ģʽ��ͬ, ���ܻ����Eth�� */
-
- snprintf(dump_file_name, PATH_MAX, "%s/pid_%d.tid_%d.%d.pcap",
- G_PKT_DUMP_ROOT_DIR, getpid(), thread_seq, file_name_post_prefix);
- fp = fopen(dump_file_name, "w+");
- if(NULL == fp){
- printf("fopen %s error!\n", dump_file_name);
- goto done;
- }
- ppkt_hdr = (pkt_dump_pkt_hdr_t *)pkt_buf;
- ppkt_hdr->ts.tv_usec = 0;
-#ifdef CAPTURE_MODE_PAG
- memcpy(pkt_buf+sizeof(pkt_dump_pkt_hdr_t), phony_mac_hdr, 14);
- skip_pkt_hdr_len = sizeof(pkt_dump_pkt_hdr_t) + 14;
-#else
- skip_pkt_hdr_len = sizeof(pkt_dump_pkt_hdr_t);
-#endif
- while(1){
- /* ��pcap��ͷ���ռ�Ԥ��, ����ֻ��һ��fwrite, �ͽ�ͷ��������һ��д�� */
- pkt_len = read(G_UNIX_DOMAIN_SD[thread_seq], (char *)pkt_buf+skip_pkt_hdr_len, 2048);
- if(0 == pkt_len){
- goto done;
- }else if(pkt_len < 0){
- continue;
- }
-
- /* pcap file header, first time */
- if(0 == pfile_hdr_flag){
- fwrite(&pfile_hdr, sizeof(pkt_dump_file_hdr_t), 1, fp);
- tot_pcap_file_len += sizeof(pkt_dump_file_hdr_t);
- pfile_hdr_flag = 1;
- }
- /* ���°�����, ʱ��� */
- ppkt_hdr->ts.tv_sec = (unsigned int )g_CurrentTime;
-#ifdef CAPTURE_MODE_PAG
- ppkt_hdr->caplen = pkt_len+14;
- ppkt_hdr->len = pkt_len+14;
-#else
- ppkt_hdr->caplen = pkt_len;
- ppkt_hdr->len = pkt_len;
-#endif
-
- fwrite(pkt_buf, pkt_len+skip_pkt_hdr_len, 1, fp);
- tot_pcap_file_len += pkt_len+skip_pkt_hdr_len;
-
- /* �����������, ѭ��д�ļ� */
- if(tot_pcap_file_len >= G_PKT_DUMP_FILE_SIZE){
- fclose(fp);
- file_name_post_prefix = file_name_post_prefix ^ 1;
- snprintf(dump_file_name, PATH_MAX, "%s/pid_%d.tid_%d.%d.pcap",
- G_PKT_DUMP_ROOT_DIR, getpid(), thread_seq, file_name_post_prefix);
- fp = fopen(dump_file_name, "w+"); /* cycle write two files */
- if(NULL == fp){
- printf("fopen %s error!\n", dump_file_name);
- goto done;
- }
- tot_pcap_file_len = 0;
- pfile_hdr_flag = 0;
- }
- }
-
-done:
-
- return NULL;
-}
-#endif
-
-static void __do_cycle_pkt_dump_udp_socket(int thread_seq, const raw_pkt_t *p_raw_pkt)
-{
- const mesa_ethernet_hdr *ehdr;
- const unsigned char *pktdata;
- int pktlen;
-
- if(1 == pkt_dump_udp_socket_peer_alive){
- /* ԭʼ������ƫ������, ������һ��Ethernet֡, ���� */
- if(pkt_dump_data_offset + 14 > p_raw_pkt->raw_pkt_len){
- return;
- }
-
- if(g_packet_io_cap_level != CAP_LEVEL_MAC){
- pktdata = (const unsigned char *)p_raw_pkt->raw_pkt_data-14 + pkt_dump_data_offset,
- pktlen = p_raw_pkt->raw_pkt_len+14 - pkt_dump_data_offset;
- ehdr = (const mesa_ethernet_hdr *)pktdata;
- }else{
- pktdata = (const unsigned char *)p_raw_pkt->raw_pkt_data + pkt_dump_data_offset,
- pktlen = p_raw_pkt->raw_pkt_len - pkt_dump_data_offset;
- ehdr = (const mesa_ethernet_hdr *)pktdata;
- }
-
- /* 2017-01-06 lijia add, �dz���Ethernet�������� */
- switch(ntohs(ehdr->ether_type)){
- case ETHERTYPE_IP:
- case ETHERTYPE_IPv6:
- case ETHERTYPE_VLAN:
- case ETHERTYPE_ARP:
- break;
-
- default:
- return;
- }
-
- if(G_PKT_DUMP_FILTER_STR[0] != '\0'){
- if(0 == bpf_filter(G_PKT_DUMP_BPF_FILTER[thread_seq].bf_insns,
- (const unsigned char *)pktdata, pktlen, pktlen)){
- return;
- }
- }
-
- /* bingo, match filter, sendto */
- sendto(pkt_dump_udp_pkt_sd[thread_seq],
- (char *)pktdata,
- pktlen,
- MSG_DONTWAIT,
- (const struct sockaddr *)&udp_recv_addr,
- sizeof(udp_recv_addr));
- }
-}
-
-static void __do_cycle_pkt_dump(int thread_seq, const raw_pkt_t *p_raw_pkt)
-{
- int ret;
- /* ����Ϊpcap_hdr[2]����,��һ��СС��trick, ����[0]��ʾpcap��ͷ����Ϣ,
- ����[1]��ʾ��PAGģʽ��, �洢��etherhdr, pkt_dump_pkt_hdr_tΪ16�ֽ�, ���ÿ��Է�һ��������ether hdr.
- */
- pkt_dump_pkt_hdr_t pcap_hdr[2];
- int write_hdr_len;
- char dump_file_name[PATH_MAX];
-
- if(PKT_DUMP_LOCAL_FILE == G_PKT_DUMP_MODE){
- if(0 == G_PKT_DUMP_PER_THREAD_SW[thread_seq]){
- return;
- }
- }else{
- __do_cycle_pkt_dump_udp_socket(thread_seq, p_raw_pkt);
- return;
- }
-
- if(G_PKT_DUMP_FILTER_STR[0] != '\0'){
- if(g_packet_io_cap_level != CAP_LEVEL_MAC){
- if(0 == bpf_filter(G_PKT_DUMP_BPF_FILTER[thread_seq].bf_insns,
- (const unsigned char *)p_raw_pkt->raw_pkt_data-14,
- p_raw_pkt->raw_pkt_len+14, p_raw_pkt->raw_pkt_len+14)){
- return;
- }
- }else{
- if(0 == bpf_filter(G_PKT_DUMP_BPF_FILTER[thread_seq].bf_insns,
- (const unsigned char *)p_raw_pkt->raw_pkt_data,
- p_raw_pkt->raw_pkt_len, p_raw_pkt->raw_pkt_len)){
- return;
- }
- }
- }
-
- if(unlikely(NULL == G_PKT_DUMP_FP[thread_seq])){
- snprintf(dump_file_name, PATH_MAX, "%s/pid_%d.tid_%d.%d.pcap",
- G_PKT_DUMP_ROOT_DIR, getpid(), thread_seq, G_FILENAME_INDEX[thread_seq]);
- G_PKT_DUMP_FP[thread_seq] = fopen(dump_file_name, "wb+");
- if(NULL == G_PKT_DUMP_FP[thread_seq]){
- printf("fopen %s error!\n", dump_file_name);
- return;
- }
- /* pcap file header, first time */
- fwrite(&pfile_hdr, sizeof(pkt_dump_file_hdr_t), 1, G_PKT_DUMP_FP[thread_seq]);
- }
-
- /* ���°�����, ʱ��� */
- pcap_hdr[0].ts.tv_sec = (unsigned int )g_CurrentTime;
-
- if(g_packet_io_cap_level != CAP_LEVEL_MAC){
- pcap_hdr[0].caplen = p_raw_pkt->raw_pkt_len+14;
- pcap_hdr[0].len = p_raw_pkt->raw_pkt_len+14;
- memcpy(&pcap_hdr[1], phony_mac_hdr, 14);
- write_hdr_len = sizeof(pkt_dump_pkt_hdr_t) + 14;
- }else{
- pcap_hdr[0].caplen = p_raw_pkt->raw_pkt_len;
- pcap_hdr[0].len = p_raw_pkt->raw_pkt_len;
- write_hdr_len = sizeof(pkt_dump_pkt_hdr_t);
- }
-
- ret = fwrite(&pcap_hdr[0], write_hdr_len, 1, G_PKT_DUMP_FP[thread_seq]);
- if(unlikely(ret < 1)){
- return;
- }
- ret = fwrite(p_raw_pkt->raw_pkt_data, p_raw_pkt->raw_pkt_len, 1, G_PKT_DUMP_FP[thread_seq]);
- if(unlikely(ret < 1)){
- /* ���ֻд��ͷ��, ��д���ݳ��ִ���, �ع� */
- fseek(G_PKT_DUMP_FP[thread_seq], (int)0-(int)sizeof(pkt_dump_pkt_hdr_t), SEEK_CUR);
- return;
- }
-
- /* �����������, ѭ��д�ļ� */
- G_PCAP_SIZE[thread_seq] += write_hdr_len + p_raw_pkt->raw_pkt_len;
- if(unlikely(G_PCAP_SIZE[thread_seq] >= G_PKT_DUMP_FILE_SIZE)){
- fclose(G_PKT_DUMP_FP[thread_seq]);
- G_FILENAME_INDEX[thread_seq] ^= 1;
- snprintf(dump_file_name, PATH_MAX, "%s/pid_%d.tid_%d.%d.pcap",
- G_PKT_DUMP_ROOT_DIR, getpid(), thread_seq, G_FILENAME_INDEX[thread_seq]);
- G_PKT_DUMP_FP[thread_seq] = fopen(dump_file_name, "wb+");
- if(NULL == G_PKT_DUMP_FP[thread_seq]){
- printf("fopen %s error!\n", dump_file_name);
- return;
- }
- /* pcap file header, first time */
- fwrite(&pfile_hdr, sizeof(pkt_dump_file_hdr_t), 1, G_PKT_DUMP_FP[thread_seq]);
- G_PCAP_SIZE[thread_seq] = 0;
- }
-
- return;
-}
-
-void cycle_pkt_dump(int thread_seq, const raw_pkt_t *p_raw_pkt)
-{
- if(likely(0 == G_PKT_DUMP_SW)){
- return;
- }
-
- __do_cycle_pkt_dump(thread_seq, p_raw_pkt);
-}
-
-void cycle_pkt_dump_old(int thread_seq, const void *ippkt, int ippktlen)
-{
- raw_pkt_t raw_pkt;
-
- raw_pkt.raw_pkt_data = ippkt;
- raw_pkt.raw_pkt_len = ippktlen;
-
- cycle_pkt_dump(thread_seq, &raw_pkt);
-}
-
-#if 0
-static int cycle_pkt_dump_child_init(void)
-{
- int i, ret;
- struct sockaddr_un father_pro_addr;
- int addr_len;
- char test_buf[1024];
- int buf_len = 0;
- socklen_t opt_len;
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- G_UNIX_DOMAIN_SD[i] = socket(AF_UNIX,SOCK_DGRAM,0);
- if(G_UNIX_DOMAIN_SD[i] < 0){
- printf("socket error: %s\n", strerror(errno));
- return -1;
- }
-
- addr_len = sizeof(father_pro_addr);
- father_pro_addr.sun_family=AF_UNIX;
- snprintf(father_pro_addr.sun_path, sizeof(father_pro_addr.sun_path), "%s%d", UNIX_DOMAIN_SOCKET_NAME, i);
-
- unlink(father_pro_addr.sun_path);
- if(bind(G_UNIX_DOMAIN_SD[i], (struct sockaddr *)&father_pro_addr, addr_len) < 0){
- printf("bind %s error: %s\n", father_pro_addr.sun_path, strerror(errno));
- return -1;
- }
-
- listen(G_UNIX_DOMAIN_SD[i], 10);
- }
-
- usleep(10000);
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- ret = read(G_UNIX_DOMAIN_SD[i], test_buf, 1024); /* �����ȴ��������̵�����, ��ȷ����˵���������� */
- if(ret <= 0){
- printf("socket read error:%s\n", strerror(errno));
- return -1;
- }
- }
-
- return 0;
-}
-#endif
-
-
-#if DEBUG
-static long ifuncb_show_pktdump_summary(iknow_handle ihandle, iknow_conn iconn, const void *cb_fun_arg, const char *cmd_args)
-{
- int i;
- unsigned long long discard_pkt_sum = 0, discard_byte_sum = 0;
- unsigned long long tot_pkt_sum = 0, tot_byte_sum = 0;
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- tot_pkt_sum += PKT_DISCARD_STAT[i].total_pkt_num;
- tot_byte_sum += PKT_DISCARD_STAT[i].total_pkt_bytes;
- discard_pkt_sum += PKT_DISCARD_STAT[i].discard_pkt_num;
- discard_byte_sum += PKT_DISCARD_STAT[i].discard_pkt_bytes;
- }
- //iprintf(ihandle, iconn,"NOTE: unit of byte for total is 'byte', for realtime is 'bps, bit per second'!\n");
- iprintf(ihandle, iconn, "%8s %8s %13s\n", "", "packet", "byte");
- iprintf(ihandle, iconn, "%8s %8llu %13llu\n", "total", tot_pkt_sum, tot_byte_sum);
- iprintf(ihandle, iconn, "%8s %8llu %13llu\n", "DROP", discard_pkt_sum, discard_byte_sum);
-
- return 0;
-}
-
-#endif
-
-#if 0
-static int cycle_pkt_dump_father_init(void)
-{
- int i;
- struct sockaddr_un child_pro_addr;
- int addr_len;
- char test_buf[1024] = "I am father";
- int buf_len = 0;
- socklen_t opt_len;
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- G_UNIX_DOMAIN_SD[i] = socket(AF_UNIX,SOCK_DGRAM,0);
- if(G_UNIX_DOMAIN_SD[i] < 0){
- printf("socket error: %s\n", strerror(errno));
- return -1;
- }
-
- addr_len = sizeof(child_pro_addr);
- child_pro_addr.sun_family=AF_UNIX;
- snprintf(child_pro_addr.sun_path, sizeof(child_pro_addr.sun_path), "%s%d", UNIX_DOMAIN_SOCKET_NAME, i);
-
- if(connect(G_UNIX_DOMAIN_SD[i], (struct sockaddr*)&child_pro_addr, addr_len) < 0){
- printf("connect %s error: %s\n", child_pro_addr.sun_path, strerror(errno));
- return -1;
- }
- }
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- write(G_UNIX_DOMAIN_SD[i], test_buf, 1024);
- }
-
- unlink(child_pro_addr.sun_path);
-#if DEBUG
- iknow_register_cmd(PLATFORM_IHANDLE, "show pktdump summary", "display packet dump status",
- ifuncb_show_pktdump_summary, NULL, 0, NULL);
-#endif
-
- return 0;
-}
-#endif
-
-#if 0
-static void cycle_pkt_dump_clear_last_status(void)
-{
- char cmd_buf[128];
-
- snprintf(cmd_buf, 128, "killall %s", PKT_DUMP_PROCESS_NAME);
-
- system(cmd_buf);
-}
-
-
-static void cycle_pkt_dump_exec(int argc, char *argv[])
-{
- int i;
- pid_t pid;
- pthread_t check_ppid, thread_id[MAX_THREAD_NUM];
- static int thread_seq[MAX_THREAD_NUM];
-
- cycle_pkt_dump_clear_last_status();
-
- pid = fork();
- if(0 == pid){ /* �ӽ���, ���������� */
- if(cycle_pkt_dump_child_init() < 0){
- printf("cycle pkt dump init error!\n");
- exit(1);
- }
- prctl(PR_SET_NAME, PKT_DUMP_PROCESS_NAME, 0, 0, 0);
- }else if(pid > 0){
- usleep(50000);
- if(cycle_pkt_dump_father_init() < 0){
- printf("cycle pkt dump init error!\n");
- exit(1);
- }
- return; /* �����̷���, ��sapp������ */
- }else{
- printf("cycle_pkt_dump fork error!\n");
- exit(0);
- }
-
- for(i = 0; i < pkt_dump_thread_num; i++){
- if(G_PKT_DUMP_PER_THREAD_SW[i] != 0){
- thread_seq[i] = i;
- pthread_create(&thread_id[i], NULL, cycle_pkt_dump_thread, &thread_seq[i]);
- usleep(100);
- }
- }
-
- pthread_create(&check_ppid, NULL, cycle_pkt_dump_check_father, NULL);
-
- /* �ӽ��̵����߳������ȴ� */
- for(i = 0; i < pkt_dump_thread_num; i++){
- if(G_PKT_DUMP_PER_THREAD_SW[i] != 0){
- pthread_join(thread_id[i], NULL);
- }
- }
-
- exit(0);
-}
-#endif
-
-static void cycle_pkt_dump_set_thread_num(int thread_num)
-{
- pkt_dump_thread_num = thread_num;
-}
-
-static int cycle_pkt_dump_get_core_num(void)
-{
- FILE *fp;
- char line_buf[PATH_MAX] = {0};
- int core_num = 0;
-
- fp = popen("ls -l core.* | wc -l", "r");
- if(NULL == fp){
- return -1;
- }
-
- fgets(line_buf, PATH_MAX, fp);
-
- core_num = atoi(line_buf);
-
- pclose(fp);
- return core_num;
-}
-
-/* config is like: "0,1,2,3,4,5" */
-static int cycle_pkt_dump_parse_per_thread_switch(char *config_str)
-{
- char *parse_config = config_str;
- char *save_ptr;
- char *token;
- int i, thread_seq;
-
- if(strncasecmp("all", config_str, 3) == 0){ /* all thread is enable */
- for(i = 0; i < pkt_dump_thread_num; i++){
- G_PKT_DUMP_PER_THREAD_SW[i] = 1;
- }
- return 0;
- }
-
- while((token = strtok_r(parse_config, ", \t", &save_ptr)) != NULL){
- thread_seq = atoi(token);
- if(thread_seq < 0 || thread_seq >= pkt_dump_thread_num){
- printf("'pkt_dump_thread_seq' config invalid, threadnum=%d!\n", pkt_dump_thread_num);
- return -1;
- }
- G_PKT_DUMP_PER_THREAD_SW[thread_seq] = 1;
- parse_config = NULL;
- }
-
- return 0;
-}
-
-
-static long cycle_pkt_dump_get_cur_files_size(void)
-{
- FILE *fp;
- long cur_files_size;
- char cmd_str[PATH_MAX], tmp_str[1024];
-
- snprintf(cmd_str, PATH_MAX, "du -scb %s | grep %s | awk {'print $1'}", G_PKT_DUMP_ROOT_DIR, G_PKT_DUMP_ROOT_DIR);
-
- fp = popen(cmd_str, "r");
- if(NULL == fp){
- return -1;
- }
-
- if(NULL == fgets(tmp_str, 1024, fp)){
- return -1;
- }
- cur_files_size = (long)strtol(tmp_str, NULL, 10);
-
- pclose(fp);
-
- return cur_files_size;
-}
-
-static int cycle_pkt_dump_get_cur_enable_thread(void)
-{
- int i, sum = 0;
-
- for(i = 0; i < MAX_THREAD_NUM; i++){
- if(G_PKT_DUMP_PER_THREAD_SW[i] > 0){
- sum++;
- }
- }
-
- return sum;
-}
-/*
- total_files_size: ��Ŀ¼���ܵ�.pcap����С, ��λ:Byte;
- file_size_per_thread_by_conf: �����߳�����ļ���С, ��λ:Byte;
-
- ���յ�ʵ��file_size_per_threadֵ, ȡ���ڵ�ǰ���е�.pcap�ļ���С��total_files_size�Ĺ�ϵ;
- �����ǰ���е�.pcap�ļ��ѳ���total_files_size, ����д�µ��ļ�.
-*/
-static int cycle_pkt_dump_set_file_size(long total_files_size, long file_size_per_thread_by_conf)
-{
- long cur_files_size;
- int cur_enable_thread_num = 0;
- long file_size_per_thread_by_calc; /* ����ʵ�ʼ���ó���ÿ���߳�����ļ���С */
-
- cur_files_size = cycle_pkt_dump_get_cur_files_size();
- if(cur_files_size < 0 || cur_files_size >= total_files_size){
- printf("\033[33m[Warning]pkt_dump is enable, but current files size is more than 'pkt_dump_total_size', disable pktdump!\033[0m\n");
- usleep(100000);
- G_PKT_DUMP_SW = 0;
- return -1;
- }
-
- cur_enable_thread_num = cycle_pkt_dump_get_cur_enable_thread();
- if(0 == cur_enable_thread_num){
- printf("\033[33m[Warning]pkt_dump is enable, but enable thread number is 0, disable pktdump!\033[0m\n");
- usleep(100000);
- return -1;
- }
-
- file_size_per_thread_by_calc = (total_files_size-cur_files_size)/cur_enable_thread_num/2;
-
- /* ����ȡ��С */
- G_PKT_DUMP_FILE_SIZE = (file_size_per_thread_by_calc < file_size_per_thread_by_conf?file_size_per_thread_by_calc:file_size_per_thread_by_conf);
- if(G_PKT_DUMP_FILE_SIZE < 2048){
- printf("\033[33m[Warning]pkt_dump is enable, but current files size is more than 'pkt_dump_total_size'!\033[0m\n");
- return -1;
- }
-
- return 0;
-}
-
-static void pkt_dump_sig_ignore(int sig)
-{
- return;
-}
-
-static void pkt_dump_sig_handle(int sig)
-{
- signal(SIGSEGV, pkt_dump_sig_ignore); /* SIGSEGV����������, ��һ����ٵ��жϴ�������ƭ��ϵͳ */
- sync(); /* ����������δд�����̵�����ǿ��д�� */
- abort(); /* ��ֹ����, ����core�ļ� */
-}
-
-static void pkt_dump_set_default_opt(void)
-{
- udp_recv_addr.sin_family = AF_INET;
- udp_recv_addr.sin_addr.s_addr = htonl(0x7f000001);
- udp_recv_addr.sin_port = htons(12345);
-
- memset(G_PKT_DUMP_FILTER_STR, 0, sizeof(G_PKT_DUMP_FILTER_STR));
- pkt_dump_data_offset = 0;
-}
-
-static void pkt_dump_parse_opt_rcv_port(const struct pkt_dump_opt *cmd_opt, const char *opt_val)
-{
- unsigned short *rcv_port = (unsigned short *)opt_val;
-
- udp_recv_addr.sin_port = *rcv_port; /* �˴�ֱ��ʹ�������� */
-}
-
-static void pkt_dump_parse_opt_bpf_filter(const struct pkt_dump_opt *cmd_opt, const char *opt_val)
-{
- memcpy(G_PKT_DUMP_FILTER_STR, opt_val, ntohs(cmd_opt->opt_len)); /* �Ѱ�����EOF */
-}
-
-static void pkt_dump_parse_opt_dump_offset(const struct pkt_dump_opt *cmd_opt, const char *opt_val)
-{
- unsigned short *toffset = (unsigned short *)opt_val;
- pkt_dump_data_offset = ntohs(*toffset);
-}
-
-static void cycle_pkt_dump_command_parse(int connfd)
-{
- char cmd_buf[1024];
- unsigned int i;
- int ret;
- struct pkt_dump_handshake pkt_hdr;
- struct pkt_dump_opt cmd_opt;
-
- /* �ȷ���2���ֽ�tcpdump UDP���ն˿� */
- ret = MESA_sock_greedy_read(connfd, &pkt_hdr, sizeof(pkt_hdr), -1);
- if(0 == ret){
- goto err_exit;
- }else if(ret < 0){
- printf("sock read error, %s\n", strerror(errno));
- goto err_exit;
- }
-
- if(ntohl(pkt_hdr.magic) != PKT_DUMP_HDR_MAGIC){
- printf("Remote tcpdump is not recognized\n");
- goto err_exit;
- }
-
- pkt_dump_set_default_opt();
-
- for(i = 0; i < ntohl(pkt_hdr.opt_num); i++){
- /* get opt hdr */
- ret = MESA_sock_greedy_read(connfd, &cmd_opt, sizeof(cmd_opt), -1);
- if(0 == ret){
- goto err_exit;
- }else if(ret < 0){
- printf("sock read error, %s\n", strerror(errno));
- goto err_exit;
- }
- /* get opt value */
- ret = MESA_sock_greedy_read(connfd, cmd_buf, ntohs(cmd_opt.opt_len), -1);
- if(0 == ret){
- goto err_exit;
- }else if(ret < 0){
- printf("sock read error, %s\n", strerror(errno));
- goto err_exit;
- }
-
- switch(ntohs(cmd_opt.opt_type)){
- case PKT_DUMP_OPT_RCV_PORT:
- pkt_dump_parse_opt_rcv_port(&cmd_opt, cmd_buf);
- break;
-
- case PKT_DUMP_OPT_BPF_FILTER:
- pkt_dump_parse_opt_bpf_filter(&cmd_opt, cmd_buf);
- break;
-
- case PKT_DUMP_OPT_DATA_OFFSET:
- pkt_dump_parse_opt_dump_offset(&cmd_opt, cmd_buf);
- break;
-
- default:
- /* δ֪ѡ������������ */
- break;
- }
- }
-
- for(i = 0; i < (unsigned int )g_packet_io_thread_num; i++){
- phony_pcap_handle[i] = pcap_open_dead(DLT_EN10MB, 65535);
- if(NULL == phony_pcap_handle[i]){
- goto err_exit;
- }
-
- if(G_PKT_DUMP_FILTER_STR[0] != '\0'){ /* ����û��filter */
- if(pcap_compile(phony_pcap_handle[i], &G_PKT_DUMP_BPF_FILTER[i], G_PKT_DUMP_FILTER_STR, 100, 0) < 0){
- printf("Compile pcap filter '%s' error:%s\n", G_PKT_DUMP_FILTER_STR, pcap_geterr(phony_pcap_handle[i]));
- goto err_exit;
- }
- }
- }
-
- pkt_dump_udp_socket_peer_alive = 1;
-
- /* �Ժ��ٶ�̬�����κ�����, ֱ�����ӽ��� */
- while(MESA_sock_greedy_read(connfd, cmd_buf, sizeof(cmd_buf), -1) != 0);
-
-err_exit:
- pkt_dump_udp_socket_peer_alive = 0;
- usleep(1000 * 500); /* ��ʱ�ͷ�, �������߳�����ʹ��BPF������ */
- for(i = 0; i < (unsigned int )g_packet_io_thread_num; i++){
- pcap_freecode(&G_PKT_DUMP_BPF_FILTER[i]);
- }
- memset(G_PKT_DUMP_FILTER_STR, 0, sizeof(G_PKT_DUMP_FILTER_STR));
- pkt_dump_data_offset = 0;
- close(connfd);
- return;
-}
-
-static void * cycle_pkt_dump_udp_socket_daemon_thread(void *arg)
-{
- socklen_t cliaddr_len;
- struct sockaddr_in cliaddr;
- int connfd;
-#ifdef _GNU_SOURCE
- pthread_setname_np(pthread_self(), "sapp_pkt_dump");
-#endif
-
- while(1){
- cliaddr_len = sizeof(cliaddr);
- connfd = accept(pkt_dump_tcp_cmd_sd, (struct sockaddr *) &cliaddr, &cliaddr_len);
- if(connfd > 0){
- cycle_pkt_dump_command_parse(connfd);
- }
- }
-
- return NULL;
-}
-
-static int cycle_pkt_dump_socket_init(void)
-{
- pthread_t pid;
- int i, opt;
- struct sockaddr_in sockadd;
-
- pkt_dump_tcp_cmd_sd = socket(AF_INET, SOCK_STREAM, 0);
-
- opt = 1;
- setsockopt(pkt_dump_tcp_cmd_sd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int));
-
- bzero(&sockadd, sizeof(sockadd));
- sockadd.sin_family = AF_INET;
- sockadd.sin_addr.s_addr = htonl(INADDR_ANY);
- sockadd.sin_port = htons(pkt_dump_tcp_bind_port);
-
- if(bind(pkt_dump_tcp_cmd_sd, (struct sockaddr *) &sockadd, sizeof(sockadd)) < 0){
- printf("pkt dump bind cmd port %u error, %s!\n", pkt_dump_tcp_bind_port, strerror(errno));
- return -1;
- }
- listen(pkt_dump_tcp_cmd_sd, 1); /* ��ʱֻ֧��һ���ͻ��˲��� */
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- pkt_dump_udp_pkt_sd[i] = socket(AF_INET, SOCK_DGRAM, 0);
- }
-
- pthread_create(&pid, NULL, cycle_pkt_dump_udp_socket_daemon_thread, NULL);
-
- return 0;
-}
-
-int cycle_pkt_dump_init(int argc, char *argv[])
-{
- int i, ret;
- int int_tmp, total_files_size, core_num;
- char per_thread_sw[PATH_MAX];
- char pcap_errbuf[PCAP_ERRBUF_SIZE];
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_switch", &G_PKT_DUMP_SW, 0);
-
- if(0 == G_PKT_DUMP_SW){
- return 0;
- }
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_mode", &G_PKT_DUMP_MODE, 1);
- if((G_PKT_DUMP_MODE != PKT_DUMP_LOCAL_FILE) && (G_PKT_DUMP_MODE != PKT_DUMP_UDP_SOCKET)){
- printf("\n\033[41mError! pkt_dump_mode only support 1 or 2!\033[0m\n");
- return -1;
- }
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_cmd_port", &int_tmp, 12345);
- if((int_tmp <=0) || (int_tmp > 65535)){
- printf("\n\033[41mError! pkt_dump_cmd_port invalid, %d!\033[0m\n", int_tmp);
- return -1;
- }
- pkt_dump_tcp_bind_port = (unsigned short)int_tmp;
-
-#if 0 == CYCLE_PKT_DUMP
- printf("\n\033[33m[Warning]pkt_dump is enable, but sapp is not compile correct, please use debug=2.\033[0m\n");
- sleep(1);
-#endif
-
- if(PKT_DUMP_LOCAL_FILE == G_PKT_DUMP_MODE){
- cycle_pkt_dump_set_thread_num(g_packet_io_thread_num);
-
- core_num = cycle_pkt_dump_get_core_num();
- if(core_num < 0 || core_num > 10){
- printf("\033[33m[Warning]core.* number is more than 10, pkt dump is auto disabled!\n");
- G_PKT_DUMP_SW = 0;
- return 0;
- }
-
- MESA_load_profile_string_def((char *)"conf/main.conf",(char *)"pkt_dump", (char *)"pkt_dump_bpf_filter", G_PKT_DUMP_FILTER_STR, PATH_MAX, (char *)"");
- if(G_PKT_DUMP_FILTER_STR[0] != '\0'){
- for(i = 0; i < g_packet_io_thread_num; i++){
- phony_pcap_handle[i] = pcap_open_dead(DLT_EN10MB, 65535);
- if(NULL == phony_pcap_handle[i]){
- printf("pcap_open %s error, %s\n", "lo", pcap_errbuf);
- printf("\n\033[41mpkt_dump_bpf_filter is not enable!\033[0m\n");
- goto skip_bpf_filter;
- }
- if(pcap_compile(phony_pcap_handle[i], &G_PKT_DUMP_BPF_FILTER[i], G_PKT_DUMP_FILTER_STR, 100, 0) < 0){
- printf("Compile pcap filter '%s' error:%s\n", G_PKT_DUMP_FILTER_STR, pcap_geterr(phony_pcap_handle[i]));
- return -1;
- }
- }
- }
-
- skip_bpf_filter:
-
- MESA_load_profile_string_def((char *)"conf/main.conf",(char *)"pkt_dump", (char *)"pkt_dump_file_root_dir", G_PKT_DUMP_ROOT_DIR, PATH_MAX, (char *)"/tmp/pkt_dump");
- MESA_mkdir_p(G_PKT_DUMP_ROOT_DIR, 0755);
-
- MESA_load_profile_string_nodef((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_thread_seq", per_thread_sw, PATH_MAX);
- if(cycle_pkt_dump_parse_per_thread_switch(per_thread_sw) < 0){
- return 0;
- }
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_total_size", &total_files_size, 1000);
- if(total_files_size < 1 || (unsigned int)total_files_size >= 1024*100 /* 100GB */){
- printf("pkt_dump_total_size invalid!\n");
- return -1;
- }
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_file_max_size", &int_tmp, 100);
- if(int_tmp < 2 || (unsigned int)int_tmp >= 1024*100 /* 100GB */){
- printf("pkt_dump_file_max_size invalid!\n");
- return -1;
- }
- /* ÿ���߳���Ҫѭ��д2���ļ�, ������Ҫ��pkt_dump_file_max_size��ʵ��ֵ�ٳ���2 */
- if(cycle_pkt_dump_set_file_size((long)total_files_size*1024*1024, (long)int_tmp*1024*512) < 0){
- return 0;
- }
-
- signal(SIGPIPE, SIG_IGN);
- /* ����SIGSEGV�ź�, ��֤�����쳣��ֹʱ, ���һ������BUG��pcap��������д��Ӳ�� */
- if((SIG_ERR == signal(SIGSEGV, pkt_dump_sig_handle))){
- printf("Catch SIGSEGV error!\n");
- }
-
-#if DEBUG
- iknow_register_cmd(PLATFORM_IHANDLE, "show pkt dump summary", "display pkt dump summary",
- ifuncb_show_pktdump_summary, NULL, 0, NULL);
-#endif
- printf("\n\033[33m[Warning]pkt dump enable, this maybe encumber performance.\033[0m\n");
- sleep(1);
- }else{
- ret = cycle_pkt_dump_socket_init();
- }
-
- return ret;
-}
-
-
-#ifdef __cplusplus
-}
-#endif
-
-
-
diff --git a/packet_io/cycle_pkt_dump_unix.c.bak b/packet_io/cycle_pkt_dump_unix.c.bak
deleted file mode 100644
index fc6da5b..0000000
--- a/packet_io/cycle_pkt_dump_unix.c.bak
+++ /dev/null
@@ -1,677 +0,0 @@
-#include "packet_io.h"
-#include "stream_internal.h"
-#include "stream_manage.h"
-#include "mesa_net.h"
-#include "sendpacket.h"
-#include "MESA_prof_load.h"
-#include "MESA_sleep.h"
-#include <stdio.h>
-#include <unistd.h>
-#include <assert.h>
-#include <errno.h>
-#include <pthread.h>
-#include <signal.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/prctl.h>
-#include <sys/un.h>
-
-/*
- 2015-04-15 , LiJia.
- ����cycle_pkt_dump����,
- ����ʵʱѭ���洢���ݰ���Ŀ���ǽ�����߻�����������ҵ���ֻ����һ��core, ��BUG�޷���������.
- sapp����coredump�� 'pkt_dump_file_root_dir'Ŀ¼��洢���һ��ʱ���յ��İ�,
- ���ö���ģʽ���֣����п��ܷ���BUG������Դ��
- ������������֣���pkt_dump_file_max_size�ʵ�����һЩ.
-
- ----- -----
- | S | | D |
- | A | ---UNIX Socket--> | U |
- | P | | M |
- | P | | P |
- ----- -----
-
- Ϊʲô����sapp������, �յ�������������? ����ͨ�����̼�ͨ�Ÿ���һ�������ٴ洢?
- ��:
- sapp�յ���֮��, ����fwrite()�洢��, ��Ϊfwrite���л�����Ƶ�, ����֤����������д��Ӳ��.
- ���ǵ���fflush()��fclose(), �����ÿ������ǿ��ˢ��һ��, ����Ӱ���������,
- ������unix_domain_socket()�����ݰ�������һ������, write()���غ�,
- ����sapp������������BUG, ����core dump��, ���ݰ�Ҳ�Ѿ���copy����һ������,
- pkt_dump�����ǿ϶����԰����һ����BUG�İ�, ��ȫ�ı��浽Ӳ�̵�.
-
- main.conf������1���µ�section��5������������:
- [pkt_dump]
- pkt_dump_switch=0 //�ܿ���
- pkt_dump_total_size=1000 //root_dir�ܼ�.pcap�ļ��Ĵ�С, ��λ:MB, ��ֹ������ƶ�������д��Ӳ��
- pkt_dump_file_max_size=200 //pcap�ļ�ÿ���߳̿������ֵ, ��λ:MB.
- pkt_dump_file_root_dir=/dev/shm //pcap�洢·��, �Ƽ�/dev/shm, ��Ӳ���ٶȿ�ܶ�
- pkt_dump_thread_seq=0,2,4,6,8 //ÿ���̵߳Ŀ��أ���Ϊ�����������ܾ޴��޷�ȫ���洢���Ǿ�����������ֻ���ò����̵߳�dump���� , all=ȫ����
-
-*/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-#if CYCLE_PKT_DUMP
-
-#define UNIX_DOMAIN_SOCKET_NAME "/tmp/.pktdump"
-#define PKT_DUMP_PROCESS_NAME "sapp_pkt_dump"
-
-#if DEBUG
-#include "iknow.h"
-extern iknow_handle PLATFORM_IHANDLE;
-
-typedef struct{
- unsigned long long total_pkt_num;
- unsigned long long total_pkt_bytes;
- unsigned long long discard_pkt_num;
- unsigned long long discard_pkt_bytes;
- char __pad__[32]; /* 64�ֽ�cache���� */
-}pkt_dump_status_t;
-static pkt_dump_status_t PKT_DISCARD_STAT[MAX_THREAD_NUM];
-
-#endif
-
-extern int MESA_mkdir_p(const char *pathname, mode_t mode);
-//extern time_t g_CurrentTime;
-extern int g_packet_io_thread_num;
-extern int g_iThreadNum; /* for dual_stack, start */
-static char G_PKT_DUMP_ROOT_DIR[PATH_MAX]; /* ����ָ��Ϊ/dev/shm, �ٶȿ� */
-static long G_PKT_DUMP_FILE_SIZE = 104857600; /* Ĭ��100MB, ���߳� */
-static int G_PKT_DUMP_SW = 0; /* Ĭ�Ϲر� */
-static int G_PKT_DUMP_PER_THREAD_SW[MAX_THREAD_NUM];
-static int G_UNIX_DOMAIN_SD[MAX_THREAD_NUM];
-static int pkt_dump_thread_num = 1;
-static char phony_mac_hdr[14] =
-{
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0x12, 0x23, 0x34, 0x56, 0x67, 0x78,
- 0x08, 0x00
-};
-typedef struct {
- unsigned int magic;
- unsigned short version_major;
- unsigned short version_minor;
- unsigned int thiszone; /* gmt to local correction */
- unsigned int sigfigs; /* accuracy of timestamps */
- unsigned int snaplen; /* max length saved portion of each pkt */
- unsigned int linktype; /* data link type (LINKTYPE_*) */
-}pkt_dump_file_hdr_t;
-
-struct pkt_dump_timeval {
- unsigned int tv_sec; /* seconds */
- unsigned int tv_usec; /* microseconds */
-};
-
-typedef struct {
- struct pkt_dump_timeval ts; /* time stamp */
- unsigned int caplen; /* length of portion present */
- unsigned int len; /* length this packet (off wire) */
-}pkt_dump_pkt_hdr_t;
-
-typedef struct{
- enum addr_type_t low_layer_type; /* ԭʼ����ײ�Э�������, ������MAC(pcap����), Ҳ������IPv4(pag����) */
- int raw_pkt_len; /* ԭʼ���ܳ��� */
- //char pkt_data[];
-}pkt_dump_pipe_t;
-
-
-static const pkt_dump_file_hdr_t pfile_hdr =
-{
- 0xA1B2C3D4,
- 0x0002,
- 0x0004,
- 0,
- 0,
- 0xFFFF,
- 1
-};
-
-/* reliable read */
-static inline ssize_t Rread(int fd, void *buf, size_t expect_count)
-{
- ssize_t ret;
- void *save_ptr = buf;
- size_t left_count = expect_count;
-
- while(left_count > 0){
-retry:
- ret = read(fd, save_ptr, left_count);
- if(ret < 0){
- switch(errno){
- case EAGAIN:
- //usleep(1);
- MESA_sleep();
- /* no break here!!! no break here!!! no break here!!!*/
- case EINTR:
- goto retry;
- break;
-
- default:
- printf("pkt dump, read error:%s, ptr=%p, expect_count=%lu, left_count=%lu\n",
- strerror(errno), save_ptr, expect_count, left_count);
- break;
- }
- }else if(0 == ret){
- return 0; /* peer close */
- }else{
- save_ptr = (char *)save_ptr + ret;
- left_count -= ret;
- }
- }
-
- return expect_count - left_count;
-}
-
-/* reliable write */
-static inline ssize_t Rwrite(int fd, const void *buf, size_t expect_count)
-{
- ssize_t ret;
- const void *real_ptr = buf;
- size_t left_count = expect_count;
-
- while(left_count > 0){
-retry:
- ret = write(fd, real_ptr, left_count);
- if(ret < 0){
- switch(errno){
- case EINTR:
- goto retry;
- break;
-
- default:
- printf("pkt dump, write error:%s\n", strerror(errno));
- /* д�������ռ䲻��, ��������, �����Ӱ���������������� */
- break;
- }
- }else{
- real_ptr = (const char *)real_ptr + ret;
- left_count -= ret;
- }
- }
-
- return expect_count - left_count;
-}
-
-static void *cycle_pkt_dump_check_father(void *arg)
-{
- while(1){
- if(1 == getppid()){ /* �����̱�Ϊinit, ˵���������Ѿ��˳� */
- exit(1);
- }else{
- usleep(100000);
- }
- }
-
- return NULL;
-}
-
-static void *cycle_pkt_dump_thread(void *arg)
-{
- int thread_seq = *((int *)arg);
- FILE *fp;
- int file_name_post_prefix = 0, ret, pfile_hdr_flag = 0;
- long tot_pcap_file_len = 0;
- char pkt_buf[65536];
- char dump_file_name[PATH_MAX];
- pkt_dump_pkt_hdr_t *ppkt_hdr;
- int pkt_len;
- int skip_pkt_hdr_len; /* Ԥ����ͷ���ռ䳤��, ���ݲ���ģʽ��ͬ, ���ܻ����Eth�� */
-
- snprintf(dump_file_name, PATH_MAX, "%s/pid_%d.tid_%d.%d.pcap",
- G_PKT_DUMP_ROOT_DIR, getppid(), thread_seq, file_name_post_prefix);
- fp = fopen(dump_file_name, "w+");
- if(NULL == fp){
- printf("fopen %s error!\n", dump_file_name);
- goto done;
- }
- ppkt_hdr = (pkt_dump_pkt_hdr_t *)pkt_buf;
- ppkt_hdr->ts.tv_usec = 0;
-#ifdef CAPTURE_MODE_PAG
- memcpy(pkt_buf+sizeof(pkt_dump_pkt_hdr_t), phony_mac_hdr, 14);
- skip_pkt_hdr_len = sizeof(pkt_dump_pkt_hdr_t) + 14;
-#else
- skip_pkt_hdr_len = sizeof(pkt_dump_pkt_hdr_t);
-#endif
- while(1){
- /* ��pcap��ͷ���ռ�Ԥ��, ����ֻ��һ��fwrite, �ͽ�ͷ��������һ��д�� */
- pkt_len = read(G_UNIX_DOMAIN_SD[thread_seq], (char *)pkt_buf+skip_pkt_hdr_len, 2048);
- if(0 == pkt_len){
- goto done;
- }else if(pkt_len < 0){
- continue;
- }
-
- /* pcap file header, first time */
- if(0 == pfile_hdr_flag){
- fwrite(&pfile_hdr, sizeof(pkt_dump_file_hdr_t), 1, fp);
- tot_pcap_file_len += sizeof(pkt_dump_file_hdr_t);
- pfile_hdr_flag = 1;
- }
- /* ���°�����, ʱ��� */
- ppkt_hdr->ts.tv_sec = (unsigned int )g_CurrentTime;
-#ifdef CAPTURE_MODE_PAG
- ppkt_hdr->caplen = pkt_len+14;
- ppkt_hdr->len = pkt_len+14;
-#else
- ppkt_hdr->caplen = pkt_len;
- ppkt_hdr->len = pkt_len;
-#endif
-
- fwrite(pkt_buf, pkt_len+skip_pkt_hdr_len, 1, fp);
- tot_pcap_file_len += pkt_len+skip_pkt_hdr_len;
-
- /* �����������, ѭ��д�ļ� */
- if(tot_pcap_file_len >= G_PKT_DUMP_FILE_SIZE){
- fclose(fp);
- file_name_post_prefix = file_name_post_prefix ^ 1;
- snprintf(dump_file_name, PATH_MAX, "%s/pid_%d.tid_%d.%d.pcap",
- G_PKT_DUMP_ROOT_DIR, getppid(), thread_seq, file_name_post_prefix);
- fp = fopen(dump_file_name, "w+"); /* cycle write two files */
- if(NULL == fp){
- printf("fopen %s error!\n", dump_file_name);
- goto done;
- }
- tot_pcap_file_len = 0;
- pfile_hdr_flag = 0;
- }
- }
-
-done:
-
- return NULL;
-}
-
-
-void cycle_pkt_dump(int thread_seq, const raw_pkt_t *p_raw_pkt)
-{
- int ret;
-
- if((0 == G_PKT_DUMP_SW) || (0 == G_PKT_DUMP_PER_THREAD_SW[thread_seq])){
- return;
- }
-
- ret = send(G_UNIX_DOMAIN_SD[thread_seq], p_raw_pkt->raw_pkt_data, p_raw_pkt->raw_pkt_len, MSG_DONTWAIT); /* raw data */
- if(ret < 0){
- //printf("cycle_pkt_dump() error: %s!\n", strerror(errno));
-#if DEBUG
- PKT_DISCARD_STAT[thread_seq].discard_pkt_num++;
- PKT_DISCARD_STAT[thread_seq].discard_pkt_bytes+= p_raw_pkt->raw_pkt_len;
-#endif
- return;
- }
-
-#if DEBUG
- PKT_DISCARD_STAT[thread_seq].total_pkt_num++;
- PKT_DISCARD_STAT[thread_seq].total_pkt_bytes += p_raw_pkt->raw_pkt_len;
-#endif
-
- if(ret != p_raw_pkt->raw_pkt_len){
- //printf("cycle_pkt_dump write pkt data, actual:%d, ret:%d\n", p_raw_pkt->raw_pkt_len, ret);
- }
-}
-
-void cycle_pkt_dump_old(int thread_seq, const void *ippkt, int ippktlen)
-{
- raw_pkt_t raw_pkt;
-
- raw_pkt.raw_pkt_data = ippkt;
- raw_pkt.raw_pkt_len = ippktlen;
-
- cycle_pkt_dump(thread_seq, &raw_pkt);
-}
-
-static int cycle_pkt_dump_child_init(void)
-{
- int i, ret;
- struct sockaddr_un father_pro_addr;
- int addr_len;
- char test_buf[1024];
- int buf_len = 0;
- socklen_t opt_len;
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- G_UNIX_DOMAIN_SD[i] = socket(AF_UNIX,SOCK_DGRAM,0);
- if(G_UNIX_DOMAIN_SD[i] < 0){
- printf("socket error: %s\n", strerror(errno));
- return -1;
- }
-
- addr_len = sizeof(father_pro_addr);
- father_pro_addr.sun_family=AF_UNIX;
- snprintf(father_pro_addr.sun_path, sizeof(father_pro_addr.sun_path), "%s%d", UNIX_DOMAIN_SOCKET_NAME, i);
-
- unlink(father_pro_addr.sun_path);
- if(bind(G_UNIX_DOMAIN_SD[i], (struct sockaddr *)&father_pro_addr, addr_len) < 0){
- printf("bind %s error: %s\n", father_pro_addr.sun_path, strerror(errno));
- return -1;
- }
-
- listen(G_UNIX_DOMAIN_SD[i], 10);
- }
-
- usleep(10000);
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- ret = read(G_UNIX_DOMAIN_SD[i], test_buf, 1024); /* �����ȴ��������̵�����, ��ȷ����˵���������� */
- if(ret <= 0){
- printf("socket read error:%s\n", strerror(errno));
- return -1;
- }
- }
-
- return 0;
-}
-
-
-#if DEBUG
-static long ifuncb_show_pktdump_summary(iknow_handle ihandle, iknow_conn iconn, const void *cb_fun_arg, const char *cmd_args)
-{
- int i;
- unsigned long long discard_pkt_sum = 0, discard_byte_sum = 0;
- unsigned long long tot_pkt_sum = 0, tot_byte_sum = 0;
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- tot_pkt_sum += PKT_DISCARD_STAT[i].total_pkt_num;
- tot_byte_sum += PKT_DISCARD_STAT[i].total_pkt_bytes;
- discard_pkt_sum += PKT_DISCARD_STAT[i].discard_pkt_num;
- discard_byte_sum += PKT_DISCARD_STAT[i].discard_pkt_bytes;
- }
- //iprintf(ihandle, iconn,"NOTE: unit of byte for total is 'byte', for realtime is 'bps, bit per second'!\n");
- iprintf(ihandle, iconn, "%8s %8s %13s\n", "", "packet", "byte");
- iprintf(ihandle, iconn, "%8s %8llu %13llu\n", "total", tot_pkt_sum, tot_byte_sum);
- iprintf(ihandle, iconn, "%8s %8llu %13llu\n", "DROP", discard_pkt_sum, discard_byte_sum);
-
- return 0;
-}
-
-#endif
-
-static int cycle_pkt_dump_father_init(void)
-{
- int i;
- struct sockaddr_un child_pro_addr;
- int addr_len;
- char test_buf[1024] = "I am father";
- int buf_len = 0;
- socklen_t opt_len;
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- G_UNIX_DOMAIN_SD[i] = socket(AF_UNIX,SOCK_DGRAM,0);
- if(G_UNIX_DOMAIN_SD[i] < 0){
- printf("socket error: %s\n", strerror(errno));
- return -1;
- }
-
- addr_len = sizeof(child_pro_addr);
- child_pro_addr.sun_family=AF_UNIX;
- snprintf(child_pro_addr.sun_path, sizeof(child_pro_addr.sun_path), "%s%d", UNIX_DOMAIN_SOCKET_NAME, i);
-
- if(connect(G_UNIX_DOMAIN_SD[i], (struct sockaddr*)&child_pro_addr, addr_len) < 0){
- printf("connect %s error: %s\n", child_pro_addr.sun_path, strerror(errno));
- return -1;
- }
- }
-
- for(i = 0; i < g_packet_io_thread_num; i++){
- write(G_UNIX_DOMAIN_SD[i], test_buf, 1024);
- }
-
- unlink(child_pro_addr.sun_path);
-#if DEBUG
- iknow_register_cmd(PLATFORM_IHANDLE, "show pktdump summary", "display packet dump status",
- ifuncb_show_pktdump_summary, NULL, 0, NULL);
-#endif
-
- return 0;
-}
-
-static void cycle_pkt_dump_clear_last_status(void)
-{
- char cmd_buf[128];
-
- snprintf(cmd_buf, 128, "killall %s", PKT_DUMP_PROCESS_NAME);
-
- system(cmd_buf);
-}
-
-static void cycle_pkt_dump_exec(int argc, char *argv[])
-{
- int i;
- pid_t pid;
- pthread_t check_ppid, thread_id[MAX_THREAD_NUM];
- static int thread_seq[MAX_THREAD_NUM];
-
- cycle_pkt_dump_clear_last_status();
-
- pid = fork();
- if(0 == pid){ /* �ӽ���, ���������� */
- if(cycle_pkt_dump_child_init() < 0){
- printf("cycle pkt dump init error!\n");
- exit(1);
- }
- prctl(PR_SET_NAME, PKT_DUMP_PROCESS_NAME, 0, 0, 0);
- }else if(pid > 0){
- usleep(50000);
- if(cycle_pkt_dump_father_init() < 0){
- printf("cycle pkt dump init error!\n");
- exit(1);
- }
- return; /* �����̷���, ��sapp������ */
- }else{
- printf("cycle_pkt_dump fork error!\n");
- exit(0);
- }
-
- for(i = 0; i < pkt_dump_thread_num; i++){
- if(G_PKT_DUMP_PER_THREAD_SW[i] != 0){
- thread_seq[i] = i;
- pthread_create(&thread_id[i], NULL, cycle_pkt_dump_thread, &thread_seq[i]);
- usleep(100);
- }
- }
-
- pthread_create(&check_ppid, NULL, cycle_pkt_dump_check_father, NULL);
-
- /* �ӽ��̵����߳������ȴ� */
- for(i = 0; i < pkt_dump_thread_num; i++){
- if(G_PKT_DUMP_PER_THREAD_SW[i] != 0){
- pthread_join(thread_id[i], NULL);
- }
- }
-
- exit(0);
-}
-
-static void cycle_pkt_dump_set_thread_num(int thread_num)
-{
- pkt_dump_thread_num = thread_num;
-}
-
-static int cycle_pkt_dump_get_core_num(void)
-{
- FILE *fp;
- char line_buf[PATH_MAX] = {0};
- int core_num = 0;
-
- fp = popen("ls -l core.* | wc -l", "r");
- if(NULL == fp){
- return -1;
- }
-
- fgets(line_buf, PATH_MAX, fp);
-
- core_num = atoi(line_buf);
-
- pclose(fp);
- return core_num;
-}
-
-/* config is like: "0,1,2,3,4,5" */
-static int cycle_pkt_dump_parse_per_thread_switch(char *config_str)
-{
- char *parse_config = config_str;
- char *save_ptr;
- char *token;
- int i, thread_seq;
-
- if(strncasecmp("all", config_str, 3) == 0){ /* all thread is enable */
- for(i = 0; i < pkt_dump_thread_num; i++){
- G_PKT_DUMP_PER_THREAD_SW[i] = 1;
- }
- return 0;
- }
-
- while((token = strtok_r(parse_config, ", \t", &save_ptr)) != NULL){
- thread_seq = atoi(token);
- if(thread_seq < 0 || thread_seq >= pkt_dump_thread_num){
- printf("'pkt_dump_thread_seq' config invalid, threadnum=%d!\n", pkt_dump_thread_num);
- return -1;
- }
- G_PKT_DUMP_PER_THREAD_SW[thread_seq] = 1;
- parse_config = NULL;
- }
-
- return 0;
-}
-
-
-static long cycle_pkt_dump_get_cur_files_size(void)
-{
- FILE *fp;
- long cur_files_size;
- char cmd_str[PATH_MAX], tmp_str[1024];
-
- snprintf(cmd_str, PATH_MAX, "du -scb %s/*.pcap | grep total | awk {'print $1'}", G_PKT_DUMP_ROOT_DIR);
-
- fp = popen(cmd_str, "r");
- if(NULL == fp){
- return -1;
- }
-
- if(NULL == fgets(tmp_str, 1024, fp)){
- return -1;
- }
- cur_files_size = (long)strtol(tmp_str, NULL, 10);
-
- pclose(fp);
-
- return cur_files_size;
-}
-
-static int cycle_pkt_dump_get_cur_enable_thread(void)
-{
- int i, sum = 0;
-
- for(i = 0; i < MAX_THREAD_NUM; i++){
- if(G_PKT_DUMP_PER_THREAD_SW[i] > 0){
- sum++;
- }
- }
-
- return sum;
-}
-/*
- total_files_size: ��Ŀ¼���ܵ�.pcap����С, ��λ:Byte;
- file_size_per_thread_by_conf: �����߳�����ļ���С, ��λ:Byte;
-
- ���յ�ʵ��file_size_per_threadֵ, ȡ���ڵ�ǰ���е�.pcap�ļ���С��total_files_size�Ĺ�ϵ;
- �����ǰ���е�.pcap�ļ��ѳ���total_files_size, ����д�µ��ļ�.
-*/
-static int cycle_pkt_dump_set_file_size(long total_files_size, long file_size_per_thread_by_conf)
-{
- long cur_files_size;
- int cur_enable_thread_num = 0;
- long file_size_per_thread_by_calc; /* ����ʵ�ʼ���ó���ÿ���߳�����ļ���С */
-
- cur_files_size = cycle_pkt_dump_get_cur_files_size();
- if(cur_files_size < 0 || cur_files_size >= total_files_size){
- printf("Warning: pkt_dump is enable, but current files size is more than 'pkt_dump_total_size'!\n");
- G_PKT_DUMP_SW = 0;
- return -1;
- }
-
- cur_enable_thread_num = cycle_pkt_dump_get_cur_enable_thread();
- if(0 == cur_enable_thread_num){
- return -1;
- }
-
- file_size_per_thread_by_calc = (total_files_size-cur_files_size)/cur_enable_thread_num/2;
-
- /* ����ȡ��С */
- G_PKT_DUMP_FILE_SIZE = (file_size_per_thread_by_calc < file_size_per_thread_by_conf?file_size_per_thread_by_calc:file_size_per_thread_by_conf);
- if(G_PKT_DUMP_FILE_SIZE < 2048){
- printf("Warning: pkt_dump is enable, but current files size is more than 'pkt_dump_total_size'!\n");
- return -1;
- }
-
- return 0;
-}
-
-
-
-int cycle_pkt_dump_init(int argc, char *argv[])
-{
- int int_tmp, total_files_size, core_num;
- char per_thread_sw[PATH_MAX];
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_switch", &G_PKT_DUMP_SW, 0);
-
- if(0 == G_PKT_DUMP_SW){
- return 0;
- }
-
- cycle_pkt_dump_set_thread_num(g_packet_io_thread_num);
-
- core_num = cycle_pkt_dump_get_core_num();
- if(core_num < 0 || core_num > 10){
- printf("Warning! core.* number is more than 10, pkt dump is auto disabled!\n");
- G_PKT_DUMP_SW = 0;
- return 0;
- }
-
- MESA_load_profile_string_def((char *)"conf/main.conf",(char *)"pkt_dump", (char *)"pkt_dump_file_root_dir", G_PKT_DUMP_ROOT_DIR, PATH_MAX, (char *)"./pkt_dump");
- MESA_mkdir_p(G_PKT_DUMP_ROOT_DIR, 0755);
-
- MESA_load_profile_string_nodef((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_thread_seq", per_thread_sw, PATH_MAX);
- if(cycle_pkt_dump_parse_per_thread_switch(per_thread_sw) < 0){
- return 0;
- }
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_total_size", &total_files_size, 1000);
- if(total_files_size < 1 || (unsigned int)total_files_size >= 1024*100 /* 100GB */){
- printf("pkt_dump_total_size invalid!\n");
- return -1;
- }
-
- MESA_load_profile_int_def((char *)"conf/main.conf", (char *)"pkt_dump", (char *)"pkt_dump_file_max_size", &int_tmp, 100);
- if(int_tmp < 2 || (unsigned int)int_tmp >= 1024*100 /* 100GB */){
- printf("pkt_dump_file_max_size invalid!\n");
- return -1;
- }
- /* ÿ���߳���Ҫѭ��д2���ļ�, ������Ҫ��pkt_dump_file_max_size��ʵ��ֵ�ٳ���2 */
- if(cycle_pkt_dump_set_file_size((long)total_files_size*1024*1024, (long)int_tmp*1024*512) < 0){
- return 0;
- }
-
- signal(SIGPIPE, SIG_IGN);
-
- cycle_pkt_dump_exec(argc, argv);
-
- printf("\n\033[41mWarning! pkt dump enable, this maybe encumber performance.\033[0m\n");
- sleep(1);
- printf("\033[41mWarning! pkt dump enable, this maybe encumber performance.\033[0m\n");
- sleep(1);
-
- return 0;
-}
-
-
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-
diff --git a/run/conf/main.conf b/run/conf/main.conf
index 7a72aec..c965c91 100644
--- a/run/conf/main.conf
+++ b/run/conf/main.conf
@@ -2,8 +2,8 @@
threadnum=4
#cpu_bind_core_mask=1,2,3,4,5
-cpu_bind_core_mask=0xFFFFFFFF
-app_instance_name=slave3
+cpu_bind_core_mask=0xF0
+app_instance_name=sapp
MaxTcpStreams=99990
MaxUdpStreams=99990
LinkTimeout=0
@@ -45,10 +45,10 @@ randkeyval=13
#(0:pag,1:pcap,2:dumpfile,3:pfring,4:DPDK,5:ppf,6:NPacket,7:qnf,8:N95,9:pcap-dumpfile-list,10:topsec,
#(11:ipfile, 12:marsio4, 13:agent_smith, 14:dpdk_vxlan, 15:marsio_vxlan, 16:pag_marsio
-capdatamodlel=2
+capdatamodlel=12
forwardpkt=0
#pcapdevice=vxlan_user
-pcapdevice=p7p2
+pcapdevice=lo
pcapdevice2=
pcapfilter=
pcap_dumpfile_list=dumpfile.list
diff --git a/run/plug/business/conflist_business.inf b/run/plug/business/conflist_business.inf
index 3b274e9..ea8335c 100644
--- a/run/plug/business/conflist_business.inf
+++ b/run/plug/business/conflist_business.inf
@@ -1,5 +1,5 @@
#./plug/business/test_app/test_app.inf
-./plug/business/test_wangyan/test_wangyan.inf
+#./plug/business/test_wangyan/test_wangyan.inf
#./plug/business/test_http/test_http.inf
#./plug/business/ipsec_biz_sample/ipsec_biz_sample.inf
#./plug/business/l2tp_biz_sample/l2tp_biz_sample.inf
diff --git a/run/plug/platform/conflist_platform.inf b/run/plug/platform/conflist_platform.inf
index d71ecbc..ee2a20b 100644
--- a/run/plug/platform/conflist_platform.inf
+++ b/run/plug/platform/conflist_platform.inf
@@ -1,3 +1,3 @@
-#./plug/platform/g_device_plug/g_device_plug.inf
+./plug/platform/g_device_plug/g_device_plug.inf
#./plug/platform/wangyan_keepalive_plug/wangyan_keepalive_plug.inf
#./plug/platform/sapp_assistant/sapp_assistant.inf