diff options
| author | 杨威 <[email protected]> | 2019-05-24 17:39:50 +0800 |
|---|---|---|
| committer | 杨威 <[email protected]> | 2019-05-24 17:39:50 +0800 |
| commit | 330fda98c056c0b5d0620e7c3b9f46e4462d8afd (patch) | |
| tree | 8d2fcdd05cfdbd7ea0261699d5bcfe067ade8aea | |
| parent | ac0fc50da4b1f09f999d81c49e57b2ba70294ff5 (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-- | .gitignore | 25 | ||||
| -rw-r--r-- | .splint.rc | 48 | ||||
| -rw-r--r-- | CMakeLists.txt | 103 | ||||
| -rw-r--r-- | cmake/Package.cmake | 36 | ||||
| -rw-r--r-- | cmake/Version.cmake | 37 | ||||
| -rw-r--r-- | entry/CMakeLists.txt | 32 | ||||
| -rw-r--r-- | entry/sapp_main.c | 2 | ||||
| -rw-r--r-- | packet_io/CMakeLists.txt | 26 | ||||
| -rw-r--r-- | packet_io/cycle_pkt_dump_pipe.c.bak | 556 | ||||
| -rw-r--r-- | packet_io/cycle_pkt_dump_through_write.c.bak | 975 | ||||
| -rw-r--r-- | packet_io/cycle_pkt_dump_through_write_offset.c.bak | 1119 | ||||
| -rw-r--r-- | packet_io/cycle_pkt_dump_through_write_with_offset.c.bak | 1055 | ||||
| -rw-r--r-- | packet_io/cycle_pkt_dump_through_write_with_offset.c.bak2 | 1055 | ||||
| -rw-r--r-- | packet_io/cycle_pkt_dump_unix.c.bak | 677 | ||||
| -rw-r--r-- | run/conf/main.conf | 8 | ||||
| -rw-r--r-- | run/plug/business/conflist_business.inf | 2 | ||||
| -rw-r--r-- | run/plug/platform/conflist_platform.inf | 2 |
17 files changed, 163 insertions, 5595 deletions
@@ -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 |
