Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
142 changes: 142 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
name: CI

on:
push:
branches: [ main, master, develop ]
pull_request:
branches: [ main, master, develop ]

jobs:
build-and-test:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
build_type: [Release, Debug]

steps:
- uses: actions/checkout@v4

- name: Install dependencies (Ubuntu)
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt-get update
sudo apt-get install -y \
libpcap-dev \
libgoogle-glog-dev \
libgtest-dev \
cmake \
build-essential

- name: Install dependencies (macOS)
if: matrix.os == 'macos-latest'
run: |
brew update
brew install \
libpcap \
glog \
googletest \
cmake

- name: Configure CMake
run: |
cmake -B build \
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \
-DBUILD_TESTS=ON

- name: Build
run: cmake --build build --config ${{ matrix.build_type }} -j $(nproc 2>/dev/null || sysctl -n hw.ncpu)

- name: Run tests
working-directory: build
run: ctest --output-on-failure --verbose

- name: Test installation
run: |
sudo cmake --install build
which pkt2flow
pkt2flow -h || true # Show help (exits with non-zero)

static-analysis:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
libpcap-dev \
libgoogle-glog-dev \
libgtest-dev \
cmake \
build-essential \
cppcheck \
clang-format

- name: Run cppcheck
run: |
cppcheck --enable=all --error-exitcode=1 --suppress=missingIncludeSystem \
--suppress=unusedFunction \
--inline-suppr \
*.c *.h

- name: Check code formatting
run: |
clang-format --dry-run --Werror *.c *.h

build-docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y doxygen graphviz

- name: Generate documentation
run: |
doxygen --version
# Documentation generation can be added when Doxyfile is created

cross-compile:
runs-on: ubuntu-latest
strategy:
matrix:
target: [x86_64, aarch64]
steps:
- uses: actions/checkout@v4

- name: Install cross-compilation tools
run: |
sudo apt-get update
sudo apt-get install -y gcc-aarch64-linux-gnu

- name: Install dependencies
run: |
sudo apt-get install -y \
libpcap-dev \
libgoogle-glog-dev \
cmake \
build-essential

- name: Configure CMake (x86_64)
if: matrix.target == 'x86_64'
run: |
cmake -B build \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_TESTS=OFF

- name: Configure CMake (aarch64)
if: matrix.target == 'aarch64'
run: |
cmake -B build \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_TESTS=OFF \
-DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \
-DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++

- name: Build
run: cmake --build build -j $(nproc)
61 changes: 60 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,62 @@
.sconsign.dblite
# Build directories
build/
build-*/
_builds/

# CMake
CMakeFiles/
CMakeCache.txt
cmake_install.cmake
Makefile
*.cmake
!CMakeLists.txt

# Compiled binaries
pkt2flow
pkt2flow_tests
*.exe

# Object files
*.o
*.obj

# Libraries
*.a
*.so
*.dylib
*.dll

# Logs
logs/
*.log

# IDE files
.vscode/
.vs/
.idea/
*.swp
*.swo
*~

# OS specific
.DS_Store
Thumbs.db

# Test artifacts
Testing/
CTestTestfile.cmake
DartConfiguration.tcl

# Package files
*.deb
*.rpm
*.tar.gz
*.zip

# Coverage files
*.gcov
*.gcda
*.gcno

# Static analysis
cppcheck-result.xml
6 changes: 0 additions & 6 deletions .travis.yml

This file was deleted.

149 changes: 149 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
cmake_minimum_required(VERSION 3.16)

project(pkt2flow
VERSION 1.2.0
DESCRIPTION "A simple utility to classify packets into flows"
LANGUAGES C CXX)

# Set C and C++ standards
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Enable compile commands for better IDE support
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# Set default build type to Release if not specified
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()

# Compiler flags
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
set(CMAKE_C_FLAGS_DEBUG "-g -O0")
set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG")
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")

# Platform-specific definitions
if(APPLE)
add_definitions(-Ddarwin)
endif()

# Find required packages
find_package(PkgConfig REQUIRED)

# Find libpcap
pkg_check_modules(PCAP REQUIRED libpcap)
if(NOT PCAP_FOUND)
find_library(PCAP_LIBRARIES pcap)
if(NOT PCAP_LIBRARIES)
message(FATAL_ERROR "libpcap not found")
endif()
set(PCAP_INCLUDE_DIRS "")
endif()

# Find glog
find_package(glog REQUIRED)

# Source files
set(PKT2FLOW_SOURCES
pkt2flow.cpp
flow_db.cpp
utilities.c
)

# Create the main executable
add_executable(pkt2flow ${PKT2FLOW_SOURCES})

# Link libraries
target_link_libraries(pkt2flow
${PCAP_LIBRARIES}
glog::glog
)

# Include directories
target_include_directories(pkt2flow PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${PCAP_INCLUDE_DIRS}
)

# Set compile definitions
target_compile_definitions(pkt2flow PRIVATE _GNU_SOURCE)

# Installation
include(GNUInstallDirs)
install(TARGETS pkt2flow
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

# Enable testing
enable_testing()

# Build tests if requested
option(BUILD_TESTS "Build unit tests" ON)
if(BUILD_TESTS)
# Find GoogleTest
find_package(GTest REQUIRED)

# Test source files
set(TEST_SOURCES
tests/test_flow_db.cpp
tests/test_utilities.cpp
tests/test_main.cpp
)

# Create test executable
add_executable(pkt2flow_tests ${TEST_SOURCES})

# Link test libraries
target_link_libraries(pkt2flow_tests
${PCAP_LIBRARIES}
glog::glog
GTest::gtest
GTest::gtest_main
)

# Include directories for tests
target_include_directories(pkt2flow_tests PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${PCAP_INCLUDE_DIRS}
)

# Set compile definitions for tests
target_compile_definitions(pkt2flow_tests PRIVATE _GNU_SOURCE)

# Add test
add_test(NAME pkt2flow_unit_tests COMMAND pkt2flow_tests)

# Create a library from the source files for testing
add_library(pkt2flow_lib STATIC
flow_db.cpp
utilities.c
)

target_include_directories(pkt2flow_lib PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}
${PCAP_INCLUDE_DIRS}
)

target_link_libraries(pkt2flow_lib
${PCAP_LIBRARIES}
glog::glog
)

target_compile_definitions(pkt2flow_lib PRIVATE _GNU_SOURCE)

# Link the library to tests
target_link_libraries(pkt2flow_tests pkt2flow_lib)
endif()

# CPack configuration for packaging
include(CPack)
set(CPACK_PACKAGE_NAME "pkt2flow")
set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PROJECT_DESCRIPTION}")
set(CPACK_PACKAGE_VENDOR "chenxm")
set(CPACK_PACKAGE_CONTACT "chenxm35@gmail.com")
Loading
Loading