diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a048038c..0d7e06f0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -47,7 +47,7 @@ unit_test windows/x64: script: - apt update -y - apt upgrade -y - - apt install -y g++ ninja-build cmake libpcap-dev git ca-certificates + - apt install -y g++ ninja-build cmake git ca-certificates - echo "$ICS_IPA_CA_CRT" >/usr/local/share/ca-certificates/ica-ipa-ca.crt - update-ca-certificates --fresh - sh ci/build-posix.sh @@ -64,7 +64,6 @@ unit_test windows/x64: script: - apt update -y - apt upgrade -y - - apt install -y libpcap-dev - build/libicsneo-unit-tests tags: - linux-build @@ -75,7 +74,7 @@ unit_test windows/x64: script: - apt update -y - apt upgrade -y - - apt install -y clang lld ninja-build cmake libpcap-dev git ca-certificates + - apt install -y clang lld ninja-build cmake git ca-certificates - echo "$ICS_IPA_CA_CRT" >/usr/local/share/ca-certificates/ica-ipa-ca.crt - update-ca-certificates --fresh - CC=clang CXX=clang++ LDFLAGS=-fuse-ld=lld sh ci/build-posix.sh @@ -92,7 +91,6 @@ unit_test windows/x64: script: - apt update -y - apt upgrade -y - - apt install -y libpcap-dev - build/libicsneo-unit-tests tags: - linux-build @@ -159,7 +157,7 @@ unit_test linux/ubuntu/2604/amd64/clang: - echo max_parallel_downloads=10 >>/etc/dnf/dnf.conf - echo fastestmirror=True >>/etc/dnf/dnf.conf - dnf upgrade -y - - dnf install -y g++ libpcap-devel cmake ninja-build git ca-certificates + - dnf install -y g++ cmake ninja-build git ca-certificates - echo "$ICS_IPA_CA_CRT" >/etc/pki/ca-trust/source/anchors/ica-ipa-ca.crt - update-ca-trust - sh ci/build-posix.sh @@ -180,7 +178,6 @@ unit_test linux/ubuntu/2604/amd64/clang: - echo max_parallel_downloads=10 >>/etc/dnf/dnf.conf - echo fastestmirror=True >>/etc/dnf/dnf.conf - dnf upgrade -y - - dnf install -y libpcap-devel - build/libicsneo-unit-tests tags: - linux-build @@ -195,7 +192,7 @@ unit_test linux/ubuntu/2604/amd64/clang: - echo max_parallel_downloads=10 >>/etc/dnf/dnf.conf - echo fastestmirror=True >>/etc/dnf/dnf.conf - dnf upgrade -y - - dnf install -y clang lld libpcap-devel cmake ninja-build git ca-certificates + - dnf install -y clang lld cmake ninja-build git ca-certificates - echo "$ICS_IPA_CA_CRT" >/etc/pki/ca-trust/source/anchors/ica-ipa-ca.crt - update-ca-trust - CC=clang CXX=clang++ LDFLAGS=-fuse-ld=lld sh ci/build-posix.sh @@ -216,7 +213,6 @@ unit_test linux/ubuntu/2604/amd64/clang: - echo max_parallel_downloads=10 >>/etc/dnf/dnf.conf - echo fastestmirror=True >>/etc/dnf/dnf.conf - dnf upgrade -y - - dnf install -y libpcap-devel - build/libicsneo-unit-tests tags: - linux-build diff --git a/99-intrepidcs.rules b/99-intrepidcs.rules deleted file mode 100644 index b919d3b9..00000000 --- a/99-intrepidcs.rules +++ /dev/null @@ -1,10 +0,0 @@ -# Intrepid Control System, Inc. neoVI Devices -SUBSYSTEM=="usb", ATTRS{idVendor}=="093c", GROUP="users", MODE="0666" -KERNEL=="ttyUSB?", ATTRS{idVendor}=="093c", GROUP="users", MODE="0666" -KERNEL=="ttyACM?", ATTRS{idVendor}=="093c", GROUP="users", MODE="0666" - -ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="093c", KERNEL=="ttyUSB*", \ -RUN+="/bin/sh -c 'echo $id:1.0>/sys/bus/usb/drivers/ftdi_sio/unbind'" - -ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="093c", DRIVER=="usbhid", \ -RUN+="/bin/sh -c 'echo $id:1.0>/sys/bus/usb/drivers/usbhid/unbind'" diff --git a/CMakeLists.txt b/CMakeLists.txt index 26124bfc..43a961fe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,17 +53,12 @@ option(LIBICSNEO_BUILD_ICSNEOC2 "Build dynamic C2 library" ON) option(LIBICSNEO_BUILD_ICSNEOC2_STATIC "Build static C2 library" ON) option(LIBICSNEO_BUILD_ICSNEOLEGACY "Build icsnVC40 compatibility library" ON) option(LIBICSNEO_BUILD_ICSNEOLEGACY_STATIC "Build static icsnVC40 compatibility library" ON) -set(LIBICSNEO_NPCAP_INCLUDE_DIR "" CACHE STRING "Npcap include directory; set to build with Npcap") # Device Drivers # You almost certainly don't want firmio for your build, # it is only relevant for communication between Linux and # CoreMini from the onboard processor of the device. option(LIBICSNEO_ENABLE_FIRMIO "Enable communication between Linux and CoreMini within the same device" OFF) -option(LIBICSNEO_ENABLE_RAW_ETHERNET "Enable devices which communicate over raw ethernet" ON) -option(LIBICSNEO_ENABLE_CDCACM "Enable devices which communicate over USB CDC ACM" ON) -option(LIBICSNEO_ENABLE_TCP "Enable devices which communicate over TCP" OFF) -option(LIBICSNEO_ENABLE_DXX "Enable devices which communicate over D2XX/D3XX via libredxx" ON) option(LIBICSNEO_ENABLE_BINDINGS_PYTHON "Enable Python library" OFF) @@ -145,72 +140,8 @@ if(LIBICSNEO_BUILD_DOCS) endif() endif() -if(WIN32) - set(PLATFORM_SRC - platform/windows/strings.cpp - platform/windows/registry.cpp - ) - - if(LIBICSNEO_ENABLE_RAW_ETHERNET) - list(APPEND PLATFORM_SRC - platform/windows/pcap.cpp - platform/windows/internal/pcapdll.cpp - ) - endif() - - if(LIBICSNEO_ENABLE_CDCACM) - list(APPEND PLATFORM_SRC - platform/windows/cdcacm.cpp - ) - endif() -else() # Darwin or Linux - set(PLATFORM_SRC) - - if(LIBICSNEO_ENABLE_FIRMIO) - list(APPEND PLATFORM_SRC - platform/posix/firmio.cpp - ) - endif() - - if(LIBICSNEO_ENABLE_RAW_ETHERNET) - list(APPEND PLATFORM_SRC - platform/posix/pcap.cpp - ) - endif() - - if(LIBICSNEO_ENABLE_CDCACM) - list(APPEND PLATFORM_SRC - platform/posix/cdcacm.cpp - ) - - if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") - list(APPEND PLATFORM_SRC - platform/posix/darwin/cdcacmdarwin.cpp - ) - else() # Linux or other - list(APPEND PLATFORM_SRC - platform/posix/linux/cdcacmlinux.cpp - ) - if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Linux") - message(WARNING - "There is no CDCACM platform port defined for ${CMAKE_SYSTEM_NAME}!\n" - "The Linux platform code will be used, as it will generally allow building, but some devices may not enumerate properly." - ) - endif() - endif() - endif() -endif() - -if(LIBICSNEO_ENABLE_DXX) - list(APPEND PLATFORM_SRC - platform/dxx.cpp - ) -endif() - -if(LIBICSNEO_ENABLE_TCP) - list(APPEND PLATFORM_SRC - platform/tcp.cpp - ) +if(LIBICSNEO_ENABLE_FIRMIO AND NOT WIN32) + set(PLATFORM_SRC platform/posix/firmio.cpp) endif() set(SRC_FILES @@ -375,59 +306,11 @@ target_compile_options(icsneocpp PRIVATE ${LIBICSNEO_COMPILER_WARNINGS}) if(LIBICSNEO_ENABLE_FIRMIO) target_compile_definitions(icsneocpp PRIVATE ICSNEO_ENABLE_FIRMIO) endif() -if(LIBICSNEO_ENABLE_RAW_ETHERNET) - target_compile_definitions(icsneocpp PRIVATE ICSNEO_ENABLE_RAW_ETHERNET) -endif() -if(LIBICSNEO_ENABLE_CDCACM) - target_compile_definitions(icsneocpp PRIVATE ICSNEO_ENABLE_CDCACM) - if(APPLE) - find_library(CORE_FOUNDATION_FRAMEWORK CoreFoundation REQUIRED) - find_library(IO_KIT_FRAMEWORK IOKit REQUIRED) - target_link_libraries(icsneocpp PRIVATE ${CORE_FOUNDATION_FRAMEWORK} ${IO_KIT_FRAMEWORK}) - endif() -endif() -if(LIBICSNEO_ENABLE_DXX) - target_compile_definitions(icsneocpp PRIVATE ICSNEO_ENABLE_DXX) - target_link_libraries(icsneocpp PRIVATE libredxx::libredxx) -endif() -if(LIBICSNEO_ENABLE_TCP) - target_compile_definitions(icsneocpp PRIVATE ICSNEO_ENABLE_TCP) - if(WIN32) - target_link_libraries(icsneocpp PRIVATE ws2_32 iphlpapi) - endif() -endif() # fatfs add_subdirectory(third-party/fatfs) target_link_libraries(icsneocpp PRIVATE fatfs) -# dxx -if(LIBICSNEO_ENABLE_DXX) - include(FetchContent) - FetchContent_Declare(libredxx - GIT_REPOSITORY https://github.com/Zeranoe/libredxx.git - GIT_TAG e823a96c39a64ab41b7d1632dbe8f86bb854df83 - ) - set(LIBREDXX_DISABLE_INSTALL ON) - FetchContent_MakeAvailable(libredxx) -endif() - -# pcap -if(LIBICSNEO_ENABLE_RAW_ETHERNET) - if(WIN32) - if(LIBICSNEO_NPCAP_INCLUDE_DIR STREQUAL "") - target_include_directories(icsneocpp PUBLIC AFTER third-party/winpcap/include) - add_definitions(-DWPCAP -DHAVE_REMOTE) - else() - target_include_directories(icsneocpp PUBLIC AFTER ${LIBICSNEO_NPCAP_INCLUDE_DIR}) - endif() - else() - find_package(PCAP REQUIRED) - target_include_directories(icsneocpp PUBLIC ${PCAP_INCLUDE_DIR}) - target_link_libraries(icsneocpp PUBLIC ${PCAP_LIBRARY}) - endif(WIN32) -endif(LIBICSNEO_ENABLE_RAW_ETHERNET) - # protobuf if(DEFINED ENV{LIBICSNEO_ICSPB_REPO}) set(LIBICSNEO_ICSPB_REPO "$ENV{LIBICSNEO_ICSPB_REPO}") @@ -629,7 +512,6 @@ if(LIBICSNEO_BUILD_UNIT_TESTS) test/unit/icsneoc2.cpp test/unit/ethphyregistertest.cpp test/unit/tc10test.cpp - test/unit/windowsstrings.cpp test/unit/periodictest.cpp ) diff --git a/api/icsneocpp/event.cpp b/api/icsneocpp/event.cpp index a0e9b2ad..de8f0e9f 100644 --- a/api/icsneocpp/event.cpp +++ b/api/icsneocpp/event.cpp @@ -171,6 +171,7 @@ static constexpr const char* SERVD_POLL_ERROR = "Error polling on Servd socket"; static constexpr const char* SERVD_NODATA_ERROR = "No data received from Servd"; static constexpr const char* SERVD_JOIN_MULTICAST_ERROR = "Error joining Servd multicast group"; static constexpr const char* SERVD_NOT_REACHABLE = "Could not reach Servd; ensure it is installed and running"; +static constexpr const char* SERVD_DISABLED = "Servd is disabled via LIBICSNEO_USE_SERVD; no devices will be found"; // DXX static constexpr const char* DXX_ERROR_SYS = "System error, check errno/GetLastError()"; @@ -451,6 +452,8 @@ const char* APIEvent::DescriptionForType(Type type) { return SERVD_JOIN_MULTICAST_ERROR; case Type::ServdNotReachable: return SERVD_NOT_REACHABLE; + case Type::ServdDisabled: + return SERVD_DISABLED; // DXX case Type::DXXErrorSys: diff --git a/bindings/python/icsneopy/api/event.cpp b/bindings/python/icsneopy/api/event.cpp index ae1a1e31..f52b7c14 100644 --- a/bindings/python/icsneopy/api/event.cpp +++ b/bindings/python/icsneopy/api/event.cpp @@ -130,6 +130,7 @@ void init_event(pybind11::module_& m) { .value("ServdNoDataError", APIEvent::Type::ServdNoDataError) .value("ServdJoinMulticastError", APIEvent::Type::ServdJoinMulticastError) .value("ServdNotReachable", APIEvent::Type::ServdNotReachable) + .value("ServdDisabled", APIEvent::Type::ServdDisabled) .value("DXXErrorSys", APIEvent::Type::DXXErrorSys) .value("DXXErrorInt", APIEvent::Type::DXXErrorInt) .value("DXXErrorOverflow", APIEvent::Type::DXXErrorOverflow) diff --git a/ci/bootstrap-libpcap.sh b/ci/bootstrap-libpcap.sh deleted file mode 100644 index 8e812e55..00000000 --- a/ci/bootstrap-libpcap.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh - -VERSION="1.10.5" -ROOT="$PWD/libpcap" -SOURCE="$ROOT/source" -BUILD="$ROOT/build" -INSTALL="$ROOT/install" - -mkdir -p "$ROOT" -cd "$ROOT" || exit 1 - -curl -LO "https://www.tcpdump.org/release/libpcap-$VERSION.tar.xz" || exit 1 -tar -xf "libpcap-$VERSION.tar.xz" || exit 1 -mv "libpcap-$VERSION" "$SOURCE" || exit 1 - -cmake -D CMAKE_POSITION_INDEPENDENT_CODE=ON -D CMAKE_INSTALL_PREFIX="$INSTALL" -D BUILD_SHARED_LIBS=OFF -D BUILD_WITH_LIBNL=OFF -D DISABLE_DBUS=ON -D DISABLE_LINUX_USBMON=ON -D DISABLE_BLUETOOTH=ON -D DISABLE_NETMAP=ON -D DISABLE_DPDK=ON -D DISABLE_RDMA=ON -D DISABLE_DAG=ON -D DISABLE_SEPTEL=ON -D DISABLE_SNF=ON -D DISABLE_TC=ON -B "$BUILD" -S "$SOURCE" || exit 1 -cmake --build "$BUILD" || exit 1 -cmake --install "$BUILD" || exit 1 diff --git a/ci/build-posix.sh b/ci/build-posix.sh index 15388c37..6aa0310f 100644 --- a/ci/build-posix.sh +++ b/ci/build-posix.sh @@ -1,6 +1,6 @@ #!/bin/sh -cmake -GNinja -Bbuild -DCMAKE_BUILD_TYPE=Release -DLIBICSNEO_BUILD_EXAMPLES=ON -DLIBICSNEO_BUILD_UNIT_TESTS=ON -DLIBICSNEO_ENABLE_TCP=OFF -DLIBICSNEO_ENABLE_BOOTLOADER=ON || exit 1 +cmake -GNinja -Bbuild -DCMAKE_BUILD_TYPE=Release -DLIBICSNEO_BUILD_EXAMPLES=ON -DLIBICSNEO_BUILD_UNIT_TESTS=ON -DLIBICSNEO_ENABLE_BOOTLOADER=ON || exit 1 cmake --build build || exit 1 diff --git a/ci/build-wheel-linux.sh b/ci/build-wheel-linux.sh index 62722ff5..3a50c7fd 100755 --- a/ci/build-wheel-linux.sh +++ b/ci/build-wheel-linux.sh @@ -1,8 +1,8 @@ #!/bin/sh -export CIBW_BEFORE_ALL="sh ci/bootstrap-cibuildwheel.sh && sh ci/bootstrap-libpcap.sh" +export CIBW_BEFORE_ALL="sh ci/bootstrap-cibuildwheel.sh" export CIBW_BUILD="*manylinux*" # no musl -export CIBW_ENVIRONMENT="LD_LIBRARY_PATH=/project/fc/libicsbl-src/lib64 PCAP_ROOT=/project/libpcap/install" +export CIBW_ENVIRONMENT="LD_LIBRARY_PATH=/project/fc/libicsbl-src/lib64" export SKBUILD_CMAKE_DEFINE="LIBICSNEO_ENABLE_BOOTLOADER=ON;ICSPB_BOOTSTRAP_DIR=/project/icspb;FETCHCONTENT_BASE_DIR=/project/fc" sh ci/build-wheel-posix.sh diff --git a/ci/build-wheel-macos.sh b/ci/build-wheel-macos.sh index f8f5a8f5..6d023345 100755 --- a/ci/build-wheel-macos.sh +++ b/ci/build-wheel-macos.sh @@ -1,8 +1,6 @@ #!/bin/sh -export CIBW_BEFORE_ALL="sh ci/bootstrap-libpcap.sh" export CIBW_ARCHS="arm64" -export CIBW_ENVIRONMENT="PCAP_ROOT=$PWD/libpcap/install" export SKBUILD_CMAKE_DEFINE="LIBICSNEO_ENABLE_BOOTLOADER=ON;ICSPB_BOOTSTRAP_DIR=$PWD/icspb;FETCHCONTENT_BASE_DIR=$PWD/fc" export REPAIR_LIBRARY_PATH="$PWD/fc/libicsbl-src/lib" export MACOSX_DEPLOYMENT_TARGET="10.14" diff --git a/ci/build-windows.bat b/ci/build-windows.bat index 07ecf35b..fd24472b 100644 --- a/ci/build-windows.bat +++ b/ci/build-windows.bat @@ -3,6 +3,6 @@ mkdir build >nul 2>&1 -cmake -GNinja -Bbuild -DCMAKE_BUILD_TYPE=Release -DCMAKE_COMPILE_WARNING_AS_ERROR=ON -DLIBICSNEO_BUILD_UNIT_TESTS=ON -DLIBICSNEO_ENABLE_TCP=ON -DLIBICSNEO_ENABLE_BOOTLOADER=ON || exit /b 1 +cmake -GNinja -Bbuild -DCMAKE_BUILD_TYPE=Release -DCMAKE_COMPILE_WARNING_AS_ERROR=ON -DLIBICSNEO_BUILD_UNIT_TESTS=ON -DLIBICSNEO_ENABLE_BOOTLOADER=ON || exit /b 1 cmake --build build || exit /b 1 diff --git a/cmake/FindPCAP.cmake b/cmake/FindPCAP.cmake deleted file mode 100644 index 90fab580..00000000 --- a/cmake/FindPCAP.cmake +++ /dev/null @@ -1,74 +0,0 @@ -# - Try to find libpcap include dirs and libraries -# -# Usage of this module as follows: -# -# find_package(PCAP) -# -# Variables used by this module, they can change the default behaviour and need -# to be set before calling find_package: -# -# PCAP_ROOT_DIR Set this variable to the root installation of -# libpcap if the module has problems finding the -# proper installation path. -# -# Variables defined by this module: -# -# PCAP_FOUND System has libpcap, include and library dirs found -# PCAP_INCLUDE_DIR The libpcap include directories. -# PCAP_LIBRARY The libpcap library (possibly includes a thread -# library e.g. required by pf_ring's libpcap) -# HAVE_PF_RING If a found version of libpcap supports PF_RING - -find_path(PCAP_ROOT_DIR - NAMES include/pcap.h -) - -find_path(PCAP_INCLUDE_DIR - NAMES pcap.h - HINTS ${PCAP_ROOT_DIR}/include -) - -find_library(PCAP_LIBRARY - NAMES pcap - HINTS ${PCAP_ROOT_DIR}/lib -) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(PCAP DEFAULT_MSG - PCAP_LIBRARY - PCAP_INCLUDE_DIR -) - -include(CheckCSourceCompiles) -set(CMAKE_REQUIRED_LIBRARIES ${PCAP_LIBRARY}) -check_c_source_compiles("int main() { return 0; }" PCAP_LINKS_SOLO) -set(CMAKE_REQUIRED_LIBRARIES) - -# check if linking against libpcap also needs to link against a thread library -if (NOT PCAP_LINKS_SOLO) - find_package(Threads) - if (THREADS_FOUND) - set(CMAKE_REQUIRED_LIBRARIES ${PCAP_LIBRARY} ${CMAKE_THREAD_LIBS_INIT}) - check_c_source_compiles("int main() { return 0; }" PCAP_NEEDS_THREADS) - set(CMAKE_REQUIRED_LIBRARIES) - endif () - if (THREADS_FOUND AND PCAP_NEEDS_THREADS) - set(_tmp ${PCAP_LIBRARY} ${CMAKE_THREAD_LIBS_INIT}) - list(REMOVE_DUPLICATES _tmp) - set(PCAP_LIBRARY ${_tmp} - CACHE STRING "Libraries needed to link against libpcap" FORCE) - else () - message(FATAL_ERROR "Couldn't determine how to link against libpcap") - endif () -endif () - -include(CheckFunctionExists) -set(CMAKE_REQUIRED_LIBRARIES ${PCAP_LIBRARY}) -check_function_exists(pcap_get_pfring_id HAVE_PF_RING) -set(CMAKE_REQUIRED_LIBRARIES) - -mark_as_advanced( - PCAP_ROOT_DIR - PCAP_INCLUDE_DIR - PCAP_LIBRARY -) diff --git a/device/devicefinder.cpp b/device/devicefinder.cpp index d40c5be5..7a80b722 100644 --- a/device/devicefinder.cpp +++ b/device/devicefinder.cpp @@ -7,22 +7,6 @@ #include "icsneo/platform/firmio.h" #endif -#ifdef ICSNEO_ENABLE_RAW_ETHERNET -#include "icsneo/platform/pcap.h" -#endif - -#ifdef ICSNEO_ENABLE_CDCACM -#include "icsneo/platform/cdcacm.h" -#endif - -#ifdef ICSNEO_ENABLE_DXX -#include "icsneo/platform/dxx.h" -#endif - -#ifdef ICSNEO_ENABLE_TCP -#include "icsneo/platform/tcp.h" -#endif - using namespace icsneo; template @@ -55,22 +39,8 @@ std::vector> DeviceFinder::FindAll() { } else { #ifdef ICSNEO_ENABLE_FIRMIO FirmIO::Find(newDriverFoundDevices); - #endif - - #ifdef ICSNEO_ENABLE_TCP - TCP::Find(newDriverFoundDevices); - #endif - - #ifdef ICSNEO_ENABLE_RAW_ETHERNET - PCAP::Find(newDriverFoundDevices); - #endif - - #ifdef ICSNEO_ENABLE_CDCACM - CDCACM::Find(newDriverFoundDevices); - #endif - - #ifdef ICSNEO_ENABLE_DXX - DXX::Find(newDriverFoundDevices); + #else + EventManager::GetInstance().add(APIEvent::Type::ServdDisabled, APIEvent::Severity::EventWarning); #endif } diff --git a/docs/icsneocpp/installation.rst b/docs/icsneocpp/installation.rst index 8c2291ad..18e429ca 100644 --- a/docs/icsneocpp/installation.rst +++ b/docs/icsneocpp/installation.rst @@ -8,7 +8,6 @@ Dependencies The minimum requirements to build libicsneo are: - CMake version 3.12 or newer - A C++17 compiler -- libpcap on Linux and macOS Building library & examples @@ -30,10 +29,3 @@ libicsneo supports being added as a sub-projects with CMake's #. Clone libicsneo into the desired location within the project #. Add ``add_subdirectory(path/to/libicsneo)`` to ``CMakeLists.txt`` #. Link the project to libicsneo with ``target_link_libraries(app icsneocpp)`` - -Linux udev Rules -================ - -Linux users may want to install the included udev rules to run libicsneo based -applications without root, this can be done with: -``cp 99-intrepidcs.rules /etc/udev/rules.d/`` diff --git a/docs/icsneopy/installation.rst b/docs/icsneopy/installation.rst index eef0f22a..4602e27c 100644 --- a/docs/icsneopy/installation.rst +++ b/docs/icsneopy/installation.rst @@ -25,14 +25,3 @@ To upgrade an existing installation: .. code-block:: bash pip install --pre --upgrade icsneopy - -Linux udev Rules -================ - -Linux users may want to install the included udev rules to run icsneopy-based -applications without root. The rules file can be found in the libicsneo source -repository at https://github.com/intrepidcs/libicsneo/. - -.. code-block:: bash - - sudo cp 99-intrepidcs.rules /etc/udev/rules.d/ diff --git a/docs/index.rst b/docs/index.rst index 1616280b..60c63383 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -15,17 +15,3 @@ communication library. The source code for libicsneo can be found on GitHub: icsneoc/index icsneoc2/index -Linux Installation -================== - -Applications that use raw Ethernet device discovery, such as PCAP-backed -discovery, need permission to open raw network sockets. Instead of running your -application with ``sudo``, grant the installed executable the required Linux -capabilities: - -.. code-block:: bash - - sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/your-app - -Replace ``/usr/bin/your-app`` with the full path to the application executable. - diff --git a/examples/c/interactive/README.md b/examples/c/interactive/README.md index d7dcc827..b003d7d8 100644 --- a/examples/c/interactive/README.md +++ b/examples/c/interactive/README.md @@ -52,7 +52,7 @@ Although the example program will build without successfully completing the step First, we are going to build the icsneoc library into a .so file that we can later use in order to access the library functions. -1. Install dependencies with `sudo apt update` then `sudo apt install build-essential cmake libpcap0.8-dev` +1. Install dependencies with `sudo apt update` then `sudo apt install build-essential cmake` 2. Change directories to `libicsneo-examples/third-party/libicsneo` and create a build directory by running `mkdir -p build` 3. Enter the build directory with `cd build` 4. Run `cmake ..` to generate your Makefile. @@ -72,8 +72,7 @@ Although the example program will build without successfully completing the step * Hint! Running `cmake -DCMAKE_BUILD_TYPE=Debug ..` will generate the proper scripts to build debug, and `cmake -DCMAKE_BUILD_TYPE=Release ..` will generate the proper scripts to build with all optimizations on. 5. Run `make` to build the library. * Hint! Speed up your build by using multiple processors! Use `make -j#` where `#` is the number of cores/threads your system has plus one. For instance, on a standard 8 thread Intel i7, you might use `-j9` for an ~8x speedup. -6. Run `sudo ./libicsneoc-example` to run the example. - * Hint! In order to run without sudo, you will need to set up the udev rules. Copy `libicsneo-examples/third-party/libicsneo/99-intrepidcs.rules` to `/etc/udev/rules.d`, then run `udevadm control --reload-rules && udevadm trigger` afterwards. While the program will still run without setting up these rules, it will fail to open any devices. +6. Run `./libicsneoc-example` to run the example. ## macOS diff --git a/examples/c/legacy/README.md b/examples/c/legacy/README.md index d7dcc827..b003d7d8 100644 --- a/examples/c/legacy/README.md +++ b/examples/c/legacy/README.md @@ -52,7 +52,7 @@ Although the example program will build without successfully completing the step First, we are going to build the icsneoc library into a .so file that we can later use in order to access the library functions. -1. Install dependencies with `sudo apt update` then `sudo apt install build-essential cmake libpcap0.8-dev` +1. Install dependencies with `sudo apt update` then `sudo apt install build-essential cmake` 2. Change directories to `libicsneo-examples/third-party/libicsneo` and create a build directory by running `mkdir -p build` 3. Enter the build directory with `cd build` 4. Run `cmake ..` to generate your Makefile. @@ -72,8 +72,7 @@ Although the example program will build without successfully completing the step * Hint! Running `cmake -DCMAKE_BUILD_TYPE=Debug ..` will generate the proper scripts to build debug, and `cmake -DCMAKE_BUILD_TYPE=Release ..` will generate the proper scripts to build with all optimizations on. 5. Run `make` to build the library. * Hint! Speed up your build by using multiple processors! Use `make -j#` where `#` is the number of cores/threads your system has plus one. For instance, on a standard 8 thread Intel i7, you might use `-j9` for an ~8x speedup. -6. Run `sudo ./libicsneoc-example` to run the example. - * Hint! In order to run without sudo, you will need to set up the udev rules. Copy `libicsneo-examples/third-party/libicsneo/99-intrepidcs.rules` to `/etc/udev/rules.d`, then run `udevadm control --reload-rules && udevadm trigger` afterwards. While the program will still run without setting up these rules, it will fail to open any devices. +6. Run `./libicsneoc-example` to run the example. ## macOS diff --git a/examples/c/simple/README.md b/examples/c/simple/README.md index d7dcc827..b003d7d8 100644 --- a/examples/c/simple/README.md +++ b/examples/c/simple/README.md @@ -52,7 +52,7 @@ Although the example program will build without successfully completing the step First, we are going to build the icsneoc library into a .so file that we can later use in order to access the library functions. -1. Install dependencies with `sudo apt update` then `sudo apt install build-essential cmake libpcap0.8-dev` +1. Install dependencies with `sudo apt update` then `sudo apt install build-essential cmake` 2. Change directories to `libicsneo-examples/third-party/libicsneo` and create a build directory by running `mkdir -p build` 3. Enter the build directory with `cd build` 4. Run `cmake ..` to generate your Makefile. @@ -72,8 +72,7 @@ Although the example program will build without successfully completing the step * Hint! Running `cmake -DCMAKE_BUILD_TYPE=Debug ..` will generate the proper scripts to build debug, and `cmake -DCMAKE_BUILD_TYPE=Release ..` will generate the proper scripts to build with all optimizations on. 5. Run `make` to build the library. * Hint! Speed up your build by using multiple processors! Use `make -j#` where `#` is the number of cores/threads your system has plus one. For instance, on a standard 8 thread Intel i7, you might use `-j9` for an ~8x speedup. -6. Run `sudo ./libicsneoc-example` to run the example. - * Hint! In order to run without sudo, you will need to set up the udev rules. Copy `libicsneo-examples/third-party/libicsneo/99-intrepidcs.rules` to `/etc/udev/rules.d`, then run `udevadm control --reload-rules && udevadm trigger` afterwards. While the program will still run without setting up these rules, it will fail to open any devices. +6. Run `./libicsneoc-example` to run the example. ## macOS diff --git a/examples/cpp/interactive/README.md b/examples/cpp/interactive/README.md index 895ed549..3126814b 100644 --- a/examples/cpp/interactive/README.md +++ b/examples/cpp/interactive/README.md @@ -32,15 +32,14 @@ If you haven't done this, `third-party/libicsneo` will be empty and you won't be ### Ubuntu 18.04 LTS -1. Install dependencies with `sudo apt update` then `sudo apt install build-essential cmake libpcap0.8-dev` +1. Install dependencies with `sudo apt update` then `sudo apt install build-essential cmake` 2. Change directories to your `libicsneo-examples/libicsneocpp-example` folder and create a build directory by running `mkdir -p build` 3. Enter the build directory with `cd build` 4. Run `cmake ..` to generate your Makefile. * Hint! Running `cmake -DCMAKE_BUILD_TYPE=Debug ..` will generate the proper scripts to build debug, and `cmake -DCMAKE_BUILD_TYPE=Release ..` will generate the proper scripts to build with all optimizations on. 5. Run `make libicsneocpp-interactive-example` to build. * Hint! Speed up your build by using multiple processors! Use `make libicsneocpp-interactive-example -j#` where `#` is the number of cores/threads your system has plus one. For instance, on a standard 8 thread Intel i7, you might use `-j9` for an ~8x speedup. -6. Now run `sudo ./libicsneocpp-interactive-example` to run the example. - * Hint! In order to run without sudo, you will need to set up the udev rules. Copy `libicsneo-examples/third-party/libicsneo/99-intrepidcs.rules` to `/etc/udev/rules.d`, then run `udevadm control --reload-rules && udevadm trigger` afterwards. While the program will still run without setting up these rules, it will fail to open any devices. +6. Now run `./libicsneocpp-interactive-example` to run the example. 7. If you wish to run the simple example instead, replace any instances of "interactive" with "simple" in steps 5 and 6. ### macOS diff --git a/examples/cpp/simple/README.md b/examples/cpp/simple/README.md index 6707f145..4035f0db 100644 --- a/examples/cpp/simple/README.md +++ b/examples/cpp/simple/README.md @@ -32,15 +32,14 @@ If you haven't done this, `third-party/libicsneo` will be empty and you won't be ### Ubuntu 18.04 LTS -1. Install dependencies with `sudo apt update` then `sudo apt install build-essential cmake libpcap0.8-dev` +1. Install dependencies with `sudo apt update` then `sudo apt install build-essential cmake` 2. Change directories to your `libicsneo-examples/libicsneocpp-example` folder and create a build directory by running `mkdir -p build` 3. Enter the build directory with `cd build` 4. Run `cmake ..` to generate your Makefile. * Hint! Running `cmake -DCMAKE_BUILD_TYPE=Debug ..` will generate the proper scripts to build debug, and `cmake -DCMAKE_BUILD_TYPE=Release ..` will generate the proper scripts to build with all optimizations on. 5. Run `make libicsneocpp-interactive-example` to build. * Hint! Speed up your build by using multiple processors! Use `make libicsneocpp-interactive-example -j#` where `#` is the number of cores/threads your system has plus one. For instance, on a standard 8 thread Intel i7, you might use `-j9` for an ~8x speedup. -6. Now run `sudo ./libicsneocpp-interactive-example` to run the example. - * Hint! In order to run without sudo, you will need to set up the udev rules. Copy `libicsneo-examples/third-party/libicsneo/99-intrepidcs.rules` to `/etc/udev/rules.d`, then run `udevadm control --reload-rules && udevadm trigger` afterwards. While the program will still run without setting up these rules, it will fail to open any devices. +6. Now run `./libicsneocpp-interactive-example` to run the example. 7. If you wish to run the simple example instead, replace any instances of "interactive" with "simple" in steps 5 and 6. ### macOS diff --git a/include/icsneo/api/event.h b/include/icsneo/api/event.h index 88310c74..697fe14a 100644 --- a/include/icsneo/api/event.h +++ b/include/icsneo/api/event.h @@ -170,6 +170,7 @@ public: ServdNoDataError = ServdBindError + 9, ServdJoinMulticastError = ServdBindError + 10, ServdNotReachable = ServdBindError + 11, + ServdDisabled = ServdBindError + 12, // DXX DXXErrorSys = 0x6100, diff --git a/include/icsneo/device/tree/vividcan/vividcan.h b/include/icsneo/device/tree/vividcan/vividcan.h index 2fbf78c8..de66f3a5 100644 --- a/include/icsneo/device/tree/vividcan/vividcan.h +++ b/include/icsneo/device/tree/vividcan/vividcan.h @@ -5,7 +5,6 @@ #include "icsneo/device/device.h" #include "icsneo/device/devicetype.h" -#include "icsneo/platform/cdcacm.h" #include "icsneo/device/tree/vividcan/vividcansettings.h" namespace icsneo { diff --git a/include/icsneo/platform/cdcacm.h b/include/icsneo/platform/cdcacm.h deleted file mode 100644 index addab1a5..00000000 --- a/include/icsneo/platform/cdcacm.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef __CDCACM_H_ -#define __CDCACM_H_ - -#define INTREPID_USB_VENDOR_ID (0x093c) - -#if defined _WIN32 -#include "icsneo/platform/windows/cdcacm.h" -#elif defined (__unix__) || (defined (__APPLE__) && defined (__MACH__)) -#include "icsneo/platform/posix/cdcacm.h" -#else -#warning "This platform is not supported by the CDC ACM driver" -#endif - -#endif \ No newline at end of file diff --git a/include/icsneo/platform/dxx.h b/include/icsneo/platform/dxx.h deleted file mode 100644 index d0a79225..00000000 --- a/include/icsneo/platform/dxx.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef __DXX_H_ -#define __DXX_H_ - -#ifdef __cplusplus - -#include "icsneo/communication/driver.h" -#include "icsneo/device/founddevice.h" - -#include "libredxx/libredxx.h" - -namespace icsneo { - -class DXX : public Driver { -public: - static void Find(std::vector& found); - - DXX(const device_eventhandler_t& err, neodevice_t& forDevice, uint16_t pid, libredxx_device_type type); - - bool open() override; - - bool isOpen() override; - - bool close() override; - driver_finder_t getFinder() override { return DXX::Find; } - -private: - void read(); - void write(); - neodevice_t neodevice; - uint16_t pid; - libredxx_device_type type; - libredxx_opened_device* device = nullptr; - std::thread readThread; - std::thread writeThread; -}; - -} - -#endif // __cplusplus -#endif // __DXX_H_ diff --git a/include/icsneo/platform/pcap.h b/include/icsneo/platform/pcap.h deleted file mode 100644 index 738ceae1..00000000 --- a/include/icsneo/platform/pcap.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef __PCAP_H_ -#define __PCAP_H_ - -#ifdef _WIN32 -#include "icsneo/platform/windows/pcap.h" -#elif defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) -#include "icsneo/platform/posix/pcap.h" -#else -#warning "This platform is not supported by the PCAP driver" -#endif - -#endif \ No newline at end of file diff --git a/include/icsneo/platform/posix/cdcacm.h b/include/icsneo/platform/posix/cdcacm.h deleted file mode 100644 index 769ec921..00000000 --- a/include/icsneo/platform/posix/cdcacm.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef __CDCACM_POSIX_H_ -#define __CDCACM_POSIX_H_ - -#ifdef __cplusplus - -#include "icsneo/communication/driver.h" -#include "icsneo/device/neodevice.h" -#include "icsneo/api/eventmanager.h" -#include -#include -#include -#include - -namespace icsneo { - -class CDCACM : public Driver { -public: - /** - * Note: This is a driver for all devices which use CDC_ACM - * Once we find the TTY we want it's a pretty generic POSIX TTY driver, but - * the method for finding the TTY we want varies by OS. - * On Linux, we read sysfs to find users of the CDC_ACM driver - * On macOS, we use IOKit to find the USB device we're looking for - * As such platform specific FindByProduct & HandleToTTY code can be found - * in cdcacmlinux.cpp and cdcacmdarwin.cpp respectively - * Other POSIX systems (BSDs, QNX, etc) will need bespoke code written in the future - */ - CDCACM(const device_eventhandler_t& err, neodevice_t& forDevice) : Driver(err), device(forDevice) {} - ~CDCACM(); - static void Find(std::vector& found); - - bool open() override; - bool isOpen() override; - bool close() override; - driver_finder_t getFinder() override { return CDCACM::Find; } - - void modeChangeIncoming() override; - void awaitModeChangeComplete() override; - -private: - neodevice_t& device; - int fd = -1; - std::optional disallowedInode; - std::atomic modeChanging{false}; - std::thread modeChangeThread; - std::mutex modeChangeMutex; - std::condition_variable modeChangeCV; - - static std::string HandleToTTY(neodevice_handle_t handle); - - std::thread readThread, writeThread; - void readTask(); - void writeTask(); - - bool fdIsValid(); -}; - -} - -#endif // __cplusplus - -#endif \ No newline at end of file diff --git a/include/icsneo/platform/posix/pcap.h b/include/icsneo/platform/posix/pcap.h deleted file mode 100644 index 064f5184..00000000 --- a/include/icsneo/platform/posix/pcap.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef __PCAP_POSIX_H_ -#define __PCAP_POSIX_H_ - -#ifdef __cplusplus - -#include "icsneo/device/neodevice.h" -#include "icsneo/device/founddevice.h" -#include "icsneo/communication/driver.h" -#include "icsneo/communication/ethernetpacketizer.h" -#include "icsneo/api/eventmanager.h" -#include -#include - -namespace icsneo { - -class PCAP : public Driver { -public: - static void Find(std::vector& foundDevices); - static std::string GetEthDevSerialFromMacAddress(uint8_t product, uint16_t macSerial); - static bool IsHandleValid(neodevice_handle_t handle); - - PCAP(device_eventhandler_t err, neodevice_t& forDevice); - bool open() override; - bool isOpen() override; - bool close() override; - bool isEthernet() const override { return true; } - driver_finder_t getFinder() override { return PCAP::Find; } - -private: - char errbuf[PCAP_ERRBUF_SIZE] = { 0 }; - neodevice_t& device; - uint8_t deviceMAC[6]; - bool openable = true; - EthernetPacketizer ethPacketizer; - - std::thread readThread, writeThread; - void readTask(); - void writeTask(); - - class NetworkInterface { - public: - uint8_t uuid; - uint8_t macAddress[6]; - std::string nameFromPCAP; - std::string descriptionFromPCAP; - std::string fullName; - pcap_t* fp = nullptr; - pcap_stat stats; - }; - static std::vector knownInterfaces; - NetworkInterface iface; -}; - -} - -#endif // __cplusplus - -#endif \ No newline at end of file diff --git a/include/icsneo/platform/registry.h b/include/icsneo/platform/registry.h deleted file mode 100644 index 5b6fa589..00000000 --- a/include/icsneo/platform/registry.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef __REGISTRY_H_ -#define __REGISTRY_H_ - -#if defined _WIN32 -#include "icsneo/platform/windows/registry.h" -#else -#warning "This platform is not supported by the registry driver" -#endif - -#endif \ No newline at end of file diff --git a/include/icsneo/platform/tcp.h b/include/icsneo/platform/tcp.h deleted file mode 100644 index 7687fd3e..00000000 --- a/include/icsneo/platform/tcp.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef __TCP_H_ -#define __TCP_H_ - -#ifdef __cplusplus - -#include - -#include "icsneo/communication/driver.h" - -namespace icsneo { - -class TCP : public Driver { -public: - static void Find(std::vector& foundDevices); - - struct NetworkInterface { - const std::string name; - const uint32_t ip; - }; - - TCP(const device_eventhandler_t& err, NetworkInterface on, uint32_t dstIP, uint16_t dstPort); - ~TCP() override { if(isOpen()) close(); } - bool open() override; - bool isOpen() override; - bool close() override; - bool isEthernet() const override { return true; } - driver_finder_t getFinder() override { return TCP::Find; } - -private: - #ifdef _WIN32 - typedef size_t SocketFileDescriptor; - #else - typedef int SocketFileDescriptor; - #endif - - class Socket { - public: - Socket(int domain, int type, int protocol, bool nonblocking = true); - ~Socket(); - explicit operator bool() const { return fd != -1; } - operator SocketFileDescriptor() const { return fd; } - void poll(uint16_t event, uint32_t msTimeout); - private: - SocketFileDescriptor fd; - }; - - NetworkInterface interfaceDescription; - uint32_t dstIP; - uint16_t dstPort; - std::unique_ptr socket; - - std::thread readThread, writeThread; - void readTask(); - void writeTask(); -}; - -} - -#endif // __cplusplus - -#endif diff --git a/include/icsneo/platform/windows/cdcacm.h b/include/icsneo/platform/windows/cdcacm.h deleted file mode 100644 index 79fa3e75..00000000 --- a/include/icsneo/platform/windows/cdcacm.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef __CDCACM_WINDOWS_H_ -#define __CDCACM_WINDOWS_H_ - -#ifdef __cplusplus - -#include "icsneo/communication/driver.h" -#include "icsneo/device/founddevice.h" - -#define WIN32_LEAN_AND_MEAN -#define NOMINMAX -#include - -#include - -namespace icsneo { - -class CDCACM : public Driver { -public: - CDCACM(const device_eventhandler_t& err, const std::wstring& path); - static void Find(std::vector& found); - bool open() override; - bool isOpen() override; - bool close() override; - driver_finder_t getFinder() override { return CDCACM::Find; } - -private: - void read(); - void write(); - std::wstring path; - HANDLE handle = INVALID_HANDLE_VALUE; - std::thread readThread; - std::thread writeThread; - OVERLAPPED readOverlapped = {}; - OVERLAPPED writeOverlapped = {}; -}; - -} - -#endif // __cplusplus - -#endif \ No newline at end of file diff --git a/include/icsneo/platform/windows/internal/pcapdll.h b/include/icsneo/platform/windows/internal/pcapdll.h deleted file mode 100644 index b90d5397..00000000 --- a/include/icsneo/platform/windows/internal/pcapdll.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef __PCAPDLL_WINDOWS_H_ -#define __PCAPDLL_WINDOWS_H_ - -#ifdef __cplusplus - -#define WIN32_LEAN_AND_MEAN -#define NOMINMAX -#include -#include -#include - -namespace icsneo { - -// Helper loader for the PCAP DLL -class PCAPDLL { -public: - // The first time we use the DLL we keep it in here and it won't get freed until the user unloads us (for speed reasons) - static const PCAPDLL& getInstance(); - - // Functions - typedef int(__cdecl* PCAPFINDDEVICE)(char* source, struct pcap_rmtauth* auth, pcap_if_t** alldevs, char* errbuf); - typedef pcap_t*(__cdecl* PCAPOPEN)(const char* source, int snaplen, int flags, int read_timeout, struct pcap_rmtauth* auth, char* errbuf); - typedef void(__cdecl* PCAPFREEDEVS)(pcap_if_t* alldevsp); - typedef void(__cdecl* PCAPCLOSE)(pcap_t* p); - typedef int(__cdecl* PCAPSTATS)(pcap_t* p, struct pcap_stat* ps); - typedef int(__cdecl* PCAPNEXTEX)(pcap_t* p, struct pcap_pkthdr** pkt_header, const unsigned char** pkt_data); - typedef int(__cdecl* PCAPSENDPACKET)(pcap_t* p, const unsigned char* buf, int size); - typedef pcap_send_queue*(__cdecl* PCAPSENDQUEUEALLOC)(unsigned int memsize); - typedef int(__cdecl* PCAPSENDQUEUEQUEUE)(pcap_send_queue* queue, const struct pcap_pkthdr* pkt_header, const unsigned char* pkt_data); - typedef void(__cdecl* PCAPSENDQUEUEDESTROY)(pcap_send_queue* queue); - typedef unsigned int(__cdecl* PCAPSENDQUEUETRANSMIT)(pcap_t* p, pcap_send_queue* queue, int sync); - typedef int(__cdecl* PCAPDATALINK)(pcap_t* p); - typedef int(__cdecl* PCAPCREATESRCSTR)(char* source, int type, const char* host, const char* port, const char* name, char* errbuf); - typedef int(__cdecl* PCAPSETBUFF)(pcap_t* p, int dim); - PCAPFINDDEVICE findalldevs_ex; - PCAPOPEN open; - PCAPFREEDEVS freealldevs; - PCAPCLOSE close; - PCAPSTATS stats; - PCAPNEXTEX next_ex; - PCAPSENDPACKET sendpacket; - PCAPSENDQUEUEALLOC sendqueue_alloc; - PCAPSENDQUEUEQUEUE sendqueue_queue; - PCAPSENDQUEUEDESTROY sendqueue_destroy; - PCAPSENDQUEUETRANSMIT sendqueue_transmit; - PCAPDATALINK datalink; - PCAPCREATESRCSTR createsrcstr; - PCAPSETBUFF setbuff; - - - ~PCAPDLL(); - bool ok() const; -private: - PCAPDLL(); - HINSTANCE dll = nullptr; - void closeDLL(); -}; -} - -#endif // __cplusplus - -#endif \ No newline at end of file diff --git a/include/icsneo/platform/windows/pcap.h b/include/icsneo/platform/windows/pcap.h deleted file mode 100644 index 044be666..00000000 --- a/include/icsneo/platform/windows/pcap.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef __PCAP_WINDOWS_H_ -#define __PCAP_WINDOWS_H_ - -#ifdef __cplusplus - -#include "icsneo/platform/windows/internal/pcapdll.h" -#include "icsneo/device/neodevice.h" -#include "icsneo/communication/driver.h" -#include "icsneo/device/founddevice.h" -#include "icsneo/api/eventmanager.h" -#include "icsneo/communication/ethernetpacketizer.h" -#include -#include -namespace icsneo { - -class PCAP : public Driver { -public: - static void Find(std::vector& foundDevices); - static std::string GetEthDevSerialFromMacAddress(uint8_t product, uint16_t macSerial); - static bool IsHandleValid(neodevice_handle_t handle); - - PCAP(const device_eventhandler_t& err, neodevice_t& forDevice); - bool open() override; - bool isOpen() override; - bool close() override; - bool isEthernet() const override { return true; } - driver_finder_t getFinder() override { return PCAP::Find; } - -private: - const PCAPDLL& pcap; - char errbuf[PCAP_ERRBUF_SIZE] = { 0 }; - neodevice_t& device; - uint8_t deviceMAC[6]; - bool openable = true; - EthernetPacketizer ethPacketizer; - - std::thread readThread, writeThread; - std::thread transmitThread; - pcap_send_queue* transmitQueue = nullptr; - std::condition_variable transmitQueueCV; - std::mutex transmitQueueMutex; - - void readTask(); - void writeTask(); - void transmitTask(); - - class NetworkInterface { - public: - uint8_t uuid; - uint8_t macAddress[6]; - std::string nameFromWinPCAP; - std::string nameFromWin32API; - std::string descriptionFromWinPCAP; - std::string descriptionFromWin32API; - std::string friendlyNameFromWin32API; - std::string fullName; - pcap_t* fp = nullptr; - pcap_stat stats; - }; - static std::vector knownInterfaces; - NetworkInterface iface; -}; - -} - -#endif // __cplusplus - -#endif \ No newline at end of file diff --git a/include/icsneo/platform/windows/registry.h b/include/icsneo/platform/windows/registry.h deleted file mode 100644 index 1c644437..00000000 --- a/include/icsneo/platform/windows/registry.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef __REGISTRY_WINDOWS_H_ -#define __REGISTRY_WINDOWS_H_ - -#ifdef __cplusplus - -#include -#include - -namespace icsneo { - -class Registry { -public: - static bool EnumerateSubkeys(std::wstring path, std::vector& subkeys); - - // Get string value - static bool Get(std::wstring path, std::wstring key, std::wstring& value); - static bool Get(std::string path, std::string key, std::string& value); - - // Get DWORD value - static bool Get(std::wstring path, std::wstring key, uint32_t& value); - static bool Get(std::string path, std::string key, uint32_t& value); -}; - -} - -#endif // __cplusplus - -#endif \ No newline at end of file diff --git a/include/icsneo/platform/windows/strings.h b/include/icsneo/platform/windows/strings.h deleted file mode 100644 index 2e9107c2..00000000 --- a/include/icsneo/platform/windows/strings.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef __WINDOWS_STRINGS_H__ -#define __WINDOWS_STRINGS_H__ - -#ifdef __cplusplus - - -#include - -namespace icsneo { - -// Helper function to convert UTF-16 to UTF-8 strings (wide to standard) -std::string convertWideString(const std::wstring& value); - -// Helper function to convert UTF-8 to UTF-16 strings (standard to wide) -std::wstring convertStringToWide(const std::string& value); - -}; - - -#endif // __cplusplus - -#endif // __WINDOWS_STRINGS_H__ diff --git a/platform/dxx.cpp b/platform/dxx.cpp deleted file mode 100644 index 27df92b4..00000000 --- a/platform/dxx.cpp +++ /dev/null @@ -1,201 +0,0 @@ -#include "icsneo/platform/dxx.h" - -#define ICS_USB_VID 0x093C - -using namespace icsneo; - -static APIEvent::Type eventError(libredxx_status status) { - switch (status) { - case LIBREDXX_STATUS_ERROR_SYS: return APIEvent::Type::DXXErrorSys; - case LIBREDXX_STATUS_ERROR_INTERRUPTED: return APIEvent::Type::DXXErrorSys; - case LIBREDXX_STATUS_ERROR_OVERFLOW: return APIEvent::Type::DXXErrorSys; - case LIBREDXX_STATUS_ERROR_IO: return APIEvent::Type::DXXErrorSys; - case LIBREDXX_STATUS_ERROR_INVALID_ARGUMENT: return APIEvent::Type::DXXErrorSys; - default: return APIEvent::Type::Unknown; - } -} - -void DXX::Find(std::vector& found) { - libredxx_status status; - static libredxx_find_filter filters[] = { - { LIBREDXX_DEVICE_TYPE_D2XX, { ICS_USB_VID, 0x0005 } }, // RAD-Star 2 - { LIBREDXX_DEVICE_TYPE_D2XX, { ICS_USB_VID, 0x0006 } }, // RAD-A2B Rev A - { LIBREDXX_DEVICE_TYPE_D2XX, { ICS_USB_VID, 0x0601 } }, // ValueCAN 3 - { LIBREDXX_DEVICE_TYPE_D2XX, { ICS_USB_VID, 0x0701 } }, // FIRE - { LIBREDXX_DEVICE_TYPE_D2XX, { ICS_USB_VID, 0x0801 } }, // neoVI PLASMA - { LIBREDXX_DEVICE_TYPE_D2XX, { ICS_USB_VID, 0x0901 } }, // neoVI ION - { LIBREDXX_DEVICE_TYPE_D2XX, { ICS_USB_VID, 0x1000 } }, // neoVI FIRE2 - { LIBREDXX_DEVICE_TYPE_D3XX, { ICS_USB_VID, 0x1201 } }, // RAD-SuperMoon - { LIBREDXX_DEVICE_TYPE_D3XX, { ICS_USB_VID, 0x1202 } }, // RAD-Moon2 - { LIBREDXX_DEVICE_TYPE_D3XX, { ICS_USB_VID, 0x1205 } }, // RAD-Moon2 - { LIBREDXX_DEVICE_TYPE_D3XX, { ICS_USB_VID, 0x1203 } }, // RAD-Gigalog - { LIBREDXX_DEVICE_TYPE_D3XX, { ICS_USB_VID, 0x1204 } }, // RAD-Gigastar - { LIBREDXX_DEVICE_TYPE_D3XX, { ICS_USB_VID, 0x1206 } }, // RAD-A2B Rev B - { LIBREDXX_DEVICE_TYPE_D3XX, { ICS_USB_VID, 0x1207 } }, // RAD-Comet2 - { LIBREDXX_DEVICE_TYPE_D3XX, { ICS_USB_VID, 0x1208 } }, // RAD-Comet3 - { LIBREDXX_DEVICE_TYPE_D3XX, { ICS_USB_VID, 0x1209 } }, // RAD-MoonT1S - { LIBREDXX_DEVICE_TYPE_D3XX, { ICS_USB_VID, 0x1210 } }, // RAD-Gigastar 2 - }; - static size_t filterCount = sizeof(filters) / sizeof(filters[0]); - - libredxx_found_device** foundDevices = nullptr; - size_t foundDevicesCount; - status = libredxx_find_devices(filters, filterCount, &foundDevices, &foundDevicesCount); - if(status != LIBREDXX_STATUS_SUCCESS) { - EventManager::GetInstance().add(eventError(status), APIEvent::Severity::Error); - return; - } - if(foundDevicesCount == 0) { - return; - } - for(size_t i = 0; i < foundDevicesCount; ++i) { - libredxx_found_device* foundDevice = foundDevices[i]; - libredxx_serial serial = {}; - status = libredxx_get_serial(foundDevice, &serial); - if(status != LIBREDXX_STATUS_SUCCESS) { - EventManager::GetInstance().add(eventError(status), APIEvent::Severity::Error); - continue; - } - - libredxx_device_id id; - status = libredxx_get_device_id(foundDevice, &id); - if(status != LIBREDXX_STATUS_SUCCESS) { - EventManager::GetInstance().add(eventError(status), APIEvent::Severity::Error); - continue; - } - - libredxx_device_type type; - status = libredxx_get_device_type(foundDevice, &type); - if(status != LIBREDXX_STATUS_SUCCESS) { - EventManager::GetInstance().add(eventError(status), APIEvent::Severity::Error); - continue; - } - - auto& device = found.emplace_back(); - // -1 to make sure serial has a trailing '\0' - std::copy(serial.serial, serial.serial + (sizeof(device.serial) - 1), device.serial); - device.makeDriver = [id, type](device_eventhandler_t err, neodevice_t& forDevice) { - return std::make_unique(err, forDevice, id.pid, type); - }; - } - libredxx_free_found(foundDevices); -} - -DXX::DXX(const device_eventhandler_t& err, neodevice_t& forDevice, uint16_t pid, libredxx_device_type type) : - Driver(err), neodevice(forDevice), pid(pid), type(type) { -} - -bool DXX::open() { - libredxx_status status; - libredxx_find_filter filters[] = { - { (libredxx_device_type)type, { ICS_USB_VID, pid } } - }; - libredxx_found_device** foundDevices = nullptr; - size_t foundDevicesCount; - status = libredxx_find_devices(filters, 1, &foundDevices, &foundDevicesCount); - if(status != LIBREDXX_STATUS_SUCCESS) { - EventManager::GetInstance().add(eventError(status), APIEvent::Severity::Error); - return false; - } - if(foundDevicesCount == 0) { - EventManager::GetInstance().add(APIEvent::Type::DeviceDisconnected, APIEvent::Severity::Error); - return false; - } - - libredxx_found_device* foundDevice = nullptr; - for(size_t i = 0; i < foundDevicesCount; ++i) { - libredxx_serial serial = {}; - status = libredxx_get_serial(foundDevices[i], &serial); - if(status != LIBREDXX_STATUS_SUCCESS) { - EventManager::GetInstance().add(eventError(status), APIEvent::Severity::EventWarning); - continue; - } - - if(strncmp(serial.serial, neodevice.serial, sizeof(neodevice.serial) - 1) == 0) { - foundDevice = foundDevices[i]; - break; - } - } - if(foundDevice == nullptr) { - EventManager::GetInstance().add(APIEvent::Type::DeviceDisconnected, APIEvent::Severity::Error); - libredxx_free_found(foundDevices); - return false; - } - status = libredxx_open_device(foundDevice, &device); - if(status != LIBREDXX_STATUS_SUCCESS) { - EventManager::GetInstance().add(eventError(status), APIEvent::Severity::Error); - libredxx_free_found(foundDevices); - return false; - } - libredxx_free_found(foundDevices); - setIsDisconnected(false); - readThread = std::thread(&DXX::read, this); - writeThread = std::thread(&DXX::write, this); - return true; -} - -bool DXX::isOpen() { - return device != nullptr; -} - -bool DXX::close() { - setIsClosing(true); - libredxx_close_device(device); // unblock read thread & close - writeQueue.enqueue(WriteOperation{}); // unblock write thread - readThread.join(); - writeThread.join(); - device = nullptr; - setIsClosing(false); - return true; -} - -void DXX::read() { - EventManager::GetInstance().downgradeErrorsOnCurrentThread(); - - std::vector buffer(ICSNEO_DRIVER_RINGBUFFER_SIZE); - - while(!isDisconnected() && !isClosing()) { - size_t received = buffer.size(); - const auto status = libredxx_read(device, buffer.data(), &received, LIBREDXX_ENDPOINT_A); - if(isDisconnected() || isClosing()) { - return; - } - if(status != LIBREDXX_STATUS_SUCCESS) { - EventManager::GetInstance().add(eventError(status), APIEvent::Severity::Error); - setIsDisconnected(true); - return; - } - while(!isDisconnected() && !isClosing()) { - if(pushRx(buffer.data(), received)) - break; - } - } -} - -void DXX::write() { - EventManager::GetInstance().downgradeErrorsOnCurrentThread(); - - WriteOperation writeOp; - - while(!isDisconnected() && !isClosing()) { - writeQueue.wait_dequeue(writeOp); - - if(isDisconnected() || isClosing()) { - return; - } - - for(size_t totalWritten = 0; totalWritten < writeOp.bytes.size();) { - size_t size = writeOp.bytes.size() - totalWritten; - const auto status = libredxx_write(device, &writeOp.bytes[totalWritten], &size, LIBREDXX_ENDPOINT_A); - if(isDisconnected() || isClosing()) { - return; - } - if(status != LIBREDXX_STATUS_SUCCESS) { - EventManager::GetInstance().add(eventError(status), APIEvent::Severity::Error); - setIsDisconnected(true); - return; - } - totalWritten += size; - } - } -} diff --git a/platform/posix/cdcacm.cpp b/platform/posix/cdcacm.cpp deleted file mode 100644 index 7056abad..00000000 --- a/platform/posix/cdcacm.cpp +++ /dev/null @@ -1,262 +0,0 @@ -#include "icsneo/platform/cdcacm.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace icsneo; - -CDCACM::~CDCACM() { - awaitModeChangeComplete(); - if(isOpen()) - close(); -} - -bool CDCACM::open() { - if(isOpen()) { - report(APIEvent::Type::DeviceCurrentlyOpen, APIEvent::Severity::Error); - return false; - } - - const std::string& ttyPath = HandleToTTY(device.handle); - if(ttyPath.empty()) { - report(APIEvent::Type::DriverFailedToOpen, APIEvent::Severity::Error); - return false; - } - - // Some devices can take a while to boot - for(int i = 0; i != 50; ++i) { - fd = ::open(ttyPath.c_str(), O_RDWR | O_NOCTTY | O_NONBLOCK); - - if(fd != -1) { - // Opened successfully, check if it's the same inode as the disallowed one - // The inode is disallowed if we're expecting the device to re-enumerate (modeChanging) - if(disallowedInode.has_value()) { - struct stat fileStat = {}; - if(fstat(fd, &fileStat) >= 0) { - if(fileStat.st_ino != *disallowedInode) - break; - } - } else { - break; - } - - // This is still the old device, wait and try again - ::close(fd); - fd = -1; - } - - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - } - disallowedInode.reset(); - if(!isOpen()) { - //std::cout << "Open of " << ttyPath.c_str() << " failed with " << strerror(errno) << ' '; - report(APIEvent::Type::DriverFailedToOpen, APIEvent::Severity::Error); - return false; - } - - struct termios tty = {}; - struct termios compare = {}; - - if(tcgetattr(fd, &tty) != 0) { - close(); - report(APIEvent::Type::DriverFailedToOpen, APIEvent::Severity::Error); - return false; - } - - tty.c_cflag |= (CLOCAL | CREAD); // Ignore modem controls - tty.c_cflag &= ~CSIZE; - tty.c_cflag |= CS8; // 8-bit characters - tty.c_cflag &= ~PARENB; // No parity bit - tty.c_cflag &= ~CSTOPB; // One stop bit - tty.c_cflag &= ~CRTSCTS; // No hardware flow control - - // Non-canonical mode - tty.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON); - tty.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); - tty.c_oflag &= ~OPOST; - - // Fetch bytes as they become available - // See http://man7.org/linux/man-pages/man3/termios.3.html - tty.c_cc[VMIN] = 0; - tty.c_cc[VTIME] = 1; // 100ms timeout (1 decisecond, what?) - - if(tcsetattr(fd, TCSAFLUSH, &tty) != 0) { // Flushes input and output buffers as well as setting settings - close(); - report(APIEvent::Type::DriverFailedToOpen, APIEvent::Severity::Error); - return false; - } - - if(tcgetattr(fd, &compare) != 0 || memcmp(&tty, &compare, sizeof(struct termios)) != 0) { - close(); - return false; - } - - // Create threads - readThread = std::thread(&CDCACM::readTask, this); - writeThread = std::thread(&CDCACM::writeTask, this); - - return true; -} - -bool CDCACM::isOpen() { - return fd >= 0; // Negative fd indicates error or not opened yet -} - -bool CDCACM::close() { - if(!isOpen() && !isDisconnected()) { - report(APIEvent::Type::DeviceCurrentlyClosed, APIEvent::Severity::Error); - return false; - } - - setIsClosing(true); - - if(readThread.joinable()) - readThread.join(); - - if(writeThread.joinable()) - writeThread.join(); - - setIsClosing(false); - setIsDisconnected(false); - - if(modeChanging) { - // We're expecting this inode to go away after we close the device - // In order to block waiting for this to happen, we first need to - // get the inode. - struct stat fileStat = {}; - if(fstat(fd, &fileStat) >= 0) - disallowedInode = fileStat.st_ino; - } - - int ret = ::close(fd); - fd = -1; - - clearBuffers(); - - if(modeChanging) { - modeChanging = false; - return open(); // Reopen the reenumerated device - } - - if(ret == 0) { - return true; - } else { - report(APIEvent::Type::DriverFailedToClose, APIEvent::Severity::Error); - return false; - } -} - -void CDCACM::modeChangeIncoming() { - modeChanging = true; -} - -void CDCACM::awaitModeChangeComplete() { - std::unique_lock lk(modeChangeMutex); - if(modeChanging && !modeChangeThread.joinable()) // Waiting for the thread to start - modeChangeCV.wait_for(lk, std::chrono::seconds(1), [this] { return modeChangeThread.joinable(); }); - if(modeChangeThread.joinable()) - modeChangeThread.join(); -} - -void CDCACM::readTask() { - constexpr size_t READ_BUFFER_SIZE = 2048; - uint8_t readbuf[READ_BUFFER_SIZE]; - EventManager::GetInstance().downgradeErrorsOnCurrentThread(); - while(!isClosing() && !isDisconnected()) { - fd_set rfds = {0}; - struct timeval tv = {}; - FD_SET(fd, &rfds); - tv.tv_usec = 50000; // 50ms - ::select(fd + 1, &rfds, NULL, NULL, &tv); - auto bytesRead = ::read(fd, readbuf, READ_BUFFER_SIZE); - if(bytesRead > 0) { -#if 0 // Perhaps helpful for debugging :) - std::cout << "Read data: (" << bytesRead << ')' << std::hex << std::endl; - for(int i = 0; i < bytesRead; i += 16) { - for(int j = 0; j < std::min(bytesRead - i, 16); j++) - std::cout << std::setw(2) << std::setfill('0') << uint32_t(readbuf[i+j]) << ' '; - std::cout << std::endl; - } - std::cout << std::dec << std::endl; -#endif - pushRx(readbuf, bytesRead); - } else { - if(modeChanging) { - // We were expecting a disconnect for reenumeration - modeChangeThread = std::thread([this] { - modeChangeCV.notify_all(); - // Requesting thread is responsible for calling close. This allows for more flexibility - }); - break; - } else if(!isClosing() && !fdIsValid() && !isDisconnected()) { - setIsDisconnected(true); - report(APIEvent::Type::DeviceDisconnected, APIEvent::Severity::Error); - } - } - } -} - -void CDCACM::writeTask() { - WriteOperation writeOp; - EventManager::GetInstance().downgradeErrorsOnCurrentThread(); - while(!isClosing() && !isDisconnected()) { - if(!writeQueue.wait_dequeue_timed(writeOp, std::chrono::milliseconds(100))) - continue; - - const ssize_t totalWriteSize = (ssize_t)writeOp.bytes.size(); - ssize_t totalWritten = 0; - while(totalWritten < totalWriteSize) { - const ssize_t writeSize = totalWriteSize - totalWritten; - ssize_t actualWritten = ::write(fd, writeOp.bytes.data() + totalWritten, writeSize); - if(actualWritten != writeSize) { - // If we partially wrote, it's probably EAGAIN but it won't have been set - // so don't signal an error unless it's < 0, we'll come back around and - // get a -1 to see the real error. - if(errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) { - // We filled the TX FIFO, use select to wait for it to become available again - fd_set wfds = {0}; - struct timeval tv = {}; - FD_SET(fd, &wfds); - tv.tv_usec = 50000; // 50ms - ::select(fd + 1, nullptr, &wfds, nullptr, &tv); - } else if (actualWritten < 0) { - if(!fdIsValid()) { - if(!isDisconnected()) { - setIsDisconnected(true); - report(APIEvent::Type::DeviceDisconnected, APIEvent::Severity::Error); - } - } else - report(APIEvent::Type::FailedToWrite, APIEvent::Severity::Error); - break; - } - } - if(actualWritten > 0) { -#if 0 // Perhaps helpful for debugging :) - std::cout << "Wrote data: (" << actualWritten << ')' << std::hex << std::endl; - for(int i = 0; i < actualWritten; i += 16) { - for(int j = 0; j < std::min(actualWritten - i, 16); j++) - std::cout << std::setw(2) << std::setfill('0') << uint32_t(writeOp.bytes[totalWritten+i+j]) << ' '; - std::cout << std::endl; - } - std::cout << std::dec << std::endl; -#endif - - totalWritten += actualWritten; - } - } - } -} - -bool CDCACM::fdIsValid() { - struct termios tty = {}; - return tcgetattr(fd, &tty) == 0 ? true : false; -} diff --git a/platform/posix/darwin/cdcacmdarwin.cpp b/platform/posix/darwin/cdcacmdarwin.cpp deleted file mode 100644 index 601c6727..00000000 --- a/platform/posix/darwin/cdcacmdarwin.cpp +++ /dev/null @@ -1,192 +0,0 @@ -#include "icsneo/platform/cdcacm.h" -#include "icsneo/device/founddevice.h" -#include -#include -#include -#include -#include -#include -#include - -using namespace icsneo; - -/* The index into the TTY table starts at zero, but we want to keep zero - * for an undefined handle, so add a constant. - */ -static constexpr const neodevice_handle_t HANDLE_OFFSET = 10; - -static std::mutex ttyTableMutex; -static std::vector ttyTable; - -static neodevice_handle_t TTYToHandle(const std::string& tty) { - std::lock_guard lk(ttyTableMutex); - for(size_t i = 0; i < ttyTable.size(); i++) { - if(ttyTable[i] == tty) - return neodevice_handle_t(i + HANDLE_OFFSET); - } - ttyTable.push_back(tty); - return neodevice_handle_t(ttyTable.size() - 1 + HANDLE_OFFSET); -} - -static std::string CFStringToString(CFStringRef cfString) { - if(cfString == nullptr) - return std::string(); - // As an optimization, we can try to directly read the CFString's CStringPtr - // CoreFoundation will seemingly not lift a finger if the pointer is not readily available - // so it will often return nullptr and we'll have to get the string "the hard way" - const char* cstr = CFStringGetCStringPtr(cfString, kCFStringEncodingUTF8); - if(cstr != nullptr) - return std::string(cstr); - // "The hard way" - // CFStringGetLength returns the length in UTF-16 Code Points - // CFStringGetCString will convert to UTF-8 for us so long as we give it enough space - const int len = CFStringGetLength(cfString); - if(len <= 0) - return std::string(); - std::vector utf8data; - utf8data.resize(len * 4 + 1); // UTF-16 => UTF-8, 1 code point can become up to 4 bytes, plus NUL - if(!CFStringGetCString(cfString, utf8data.data(), utf8data.size(), kCFStringEncodingUTF8)) - return std::string(); - return std::string(utf8data.data()); -} - -class CFReleaser { -public: - CFReleaser(CFTypeRef obj) : toRelease(obj) {} - ~CFReleaser() { - if(toRelease != nullptr) - CFRelease(toRelease); - } - CFReleaser(CFReleaser const&) = delete; - CFReleaser& operator=(CFReleaser const&) = delete; - -private: - CFTypeRef toRelease; -}; - -class IOReleaser { -public: - IOReleaser(io_object_t obj) : toRelease(obj) {} - ~IOReleaser() { - if(toRelease != 0) - IOObjectRelease(toRelease); - } - IOReleaser(IOReleaser&& moved) : toRelease(moved.toRelease) { - moved.toRelease = 0; - } - IOReleaser(IOReleaser const&) = delete; - IOReleaser& operator=(IOReleaser const&) = delete; - -private: - io_object_t toRelease; -}; - -void CDCACM::Find(std::vector& found) { - CFMutableDictionaryRef ref = IOServiceMatching(kIOSerialBSDServiceValue); - if(ref == nullptr) - return; - io_iterator_t matchingServices = 0; - kern_return_t kernResult = IOServiceGetMatchingServices(kIOMainPortDefault, ref, &matchingServices); - if(KERN_SUCCESS != kernResult || matchingServices == 0) - return; - IOReleaser matchingServicesReleaser(matchingServices); - - io_object_t serialPort; - while((serialPort = IOIteratorNext(matchingServices))) { - IOReleaser serialPortReleaser(serialPort); - - // First get the parent device - // We want to check that it has the right VID/PID - - // Find the parent structure that describes the USB device providing this port - io_object_t parent = 0; - io_object_t current = serialPort; - io_object_t usb = 0; - // Need to release every parent we find in the chain, but we should defer that until later - std::vector releasers; - while(IORegistryEntryGetParentEntry(current, kIOServicePlane, &parent) == KERN_SUCCESS) { - releasers.emplace_back(parent); - current = parent; - // On old macOSes, IOUSBDevice is the type of the class we want - // On newer macOSes, IOUSBDevice may further be subclassed as IOUSBHostDevice - if(IOObjectConformsTo(parent, kIOUSBDeviceClassName)) { - usb = parent; - break; - } - } - if(!usb) // Did not find a USB parent (maybe this is a Bluetooth modem or something) - continue; - - // Get the VID - CFTypeRef vendorProp = IORegistryEntryCreateCFProperty(usb, CFSTR("idVendor"), kCFAllocatorDefault, 0); - if(vendorProp == nullptr) - continue; - CFReleaser vendorPropReleaser(vendorProp); - if(CFGetTypeID(vendorProp) != CFNumberGetTypeID()) - continue; - uint16_t vid = 0; - if(!CFNumberGetValue(static_cast(vendorProp), kCFNumberSInt16Type, &vid)) - continue; - if(vid != INTREPID_USB_VENDOR_ID) - continue; - - // Get the PID - CFTypeRef productProp = IORegistryEntryCreateCFProperty(usb, CFSTR("idProduct"), kCFAllocatorDefault, 0); - if(productProp == nullptr) - continue; - CFReleaser productPropReleaser(productProp); - if(CFGetTypeID(productProp) != CFNumberGetTypeID()) - continue; - - // Read the PID directly into the FoundDevice structure - FoundDevice device; - if(!CFNumberGetValue(static_cast(productProp), kCFNumberSInt16Type, &device.productId)) - continue; - - // Now, let's get the "call-out" device (/dev/cu.*) - // We get the /dev/cu.* variant instead of the /dev/tty.* variant because the device will not assert DCD - // Therefore, the open call on /dev/tty.* will hang, whereas /dev/cu.* will not - // This `propertyValue` will need to be freed, that will happen in CFStringToString - CFTypeRef calloutProp = IORegistryEntryCreateCFProperty(serialPort, CFSTR(kIOCalloutDeviceKey), kCFAllocatorDefault, 0); - if(calloutProp == nullptr) - continue; - CFReleaser calloutPropReleaser(calloutProp); - if(CFGetTypeID(calloutProp) != CFStringGetTypeID()) - continue; - // We can static cast here because we have verified the type to be a CFString - const std::string tty = CFStringToString(static_cast(calloutProp)); - if(tty.empty()) - continue; - device.handle = TTYToHandle(tty); - - // Last but not least, get the serial number - CFTypeRef serialProp = IORegistryEntryCreateCFProperty(usb, CFSTR("kUSBSerialNumberString"), kCFAllocatorDefault, 0); - if(serialProp == nullptr) - continue; - CFReleaser serialPropReleaser(serialProp); - if(CFGetTypeID(serialProp) != CFStringGetTypeID()) - continue; - // We can static cast here because we have verified the type to be a CFString - std::string serial = CFStringToString(static_cast(serialProp)); - if(serial.empty()) - continue; - for(char& c : serial) - c = static_cast(toupper(c)); - device.serial[serial.copy(device.serial, sizeof(device.serial)-1)] = '\0'; - - // Add a factory to make the driver - device.makeDriver = [](const device_eventhandler_t& report, neodevice_t& device) { - return std::unique_ptr(new CDCACM(report, device)); - }; - - found.push_back(device); - } -} - -std::string CDCACM::HandleToTTY(neodevice_handle_t handle) { - std::lock_guard lk(ttyTableMutex); - const size_t index = size_t(handle - HANDLE_OFFSET); - if(index >= ttyTable.size()) - return ""; // Not found, generic driver (cdcacm.cpp) will throw an error - return ttyTable[index]; -} \ No newline at end of file diff --git a/platform/posix/linux/cdcacmlinux.cpp b/platform/posix/linux/cdcacmlinux.cpp deleted file mode 100644 index 5f151f12..00000000 --- a/platform/posix/linux/cdcacmlinux.cpp +++ /dev/null @@ -1,212 +0,0 @@ -#include "icsneo/platform/cdcacm.h" -#include "icsneo/device/founddevice.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace icsneo; - -/* The TTY numbering starts at zero, but we want to keep zero for an undefined - * handle, so add a constant. - */ -static constexpr const neodevice_handle_t HANDLE_OFFSET = 10; - -class Directory { -public: - class Listing { - public: - Listing(std::string newName, uint8_t newType) : name(newName), type(newType) {} - const std::string& getName() const { return name; } - uint8_t getType() const { return type; } - private: - std::string name; - uint8_t type; - }; - Directory(std::string directory) { - dir = opendir(directory.c_str()); - } - ~Directory() { - if(openedSuccessfully()) - closedir(dir); - dir = nullptr; - } - bool openedSuccessfully() { return dir != nullptr; } - std::vector ls() { - std::vector results; - struct dirent* entry; - while((entry = readdir(dir)) != nullptr) { - std::string name = entry->d_name; - if(name != "." && name != "..") // Ignore parent and self - results.emplace_back(name, entry->d_type); - } - return results; - } -private: - DIR* dir; -}; - -class USBSerialGetter { -public: - USBSerialGetter(std::string usbid) { - std::stringstream ss; - auto colonpos = usbid.find(":"); - if(colonpos == std::string::npos) { - succeeded = false; - return; - } - - ss << "/sys/bus/usb/devices/" << usbid.substr(0, colonpos) << "/serial"; - try { - std::ifstream reader(ss.str()); - std::getline(reader, serial); - for (auto& c : serial) - c = toupper(c); - } catch(...) { - succeeded = false; - return; - } - - succeeded = true; - } - bool success() const { return succeeded; } - const std::string& getSerial() const { return serial; } -private: - bool succeeded; - std::string serial; -}; - -void CDCACM::Find(std::vector& found) { - Directory directory("/sys/bus/usb/drivers/cdc_acm"); // Query the CDCACM driver - if(!directory.openedSuccessfully()) - return; - - std::vector foundusbs; - for(auto& entry : directory.ls()) { - /* This directory will have directories (links) for all devices using the cdc_acm driver (as CDCACM devices do) - * There will also be other files and directories providing information about the driver in here. We want to ignore them. - * Devices will be named like "7-2:1.0" where 7 is the enumeration for the USB controller, 2 is the device enumeration on - * that specific controller (will change if the device is unplugged and replugged), 1 is the device itself and 0 is - * enumeration for different services provided by the device. We're looking for the service that provides TTY. - * For now we find the directories with a digit for the first character, these are likely to be our USB devices. - */ - if(isdigit(entry.getName()[0]) && entry.getType() == DT_LNK) - foundusbs.emplace_back(entry.getName()); - } - - // Map the USB directory to the TTY and PID if found - // The PID will be filled later - std::map< std::string, std::pair > foundttys; - for(auto& usb : foundusbs) { - std::stringstream ss; - ss << "/sys/bus/usb/drivers/cdc_acm/" << usb << "/tty"; - Directory devicedir(ss.str()); - if(!devicedir.openedSuccessfully()) // The tty directory doesn't exist, because this is not the tty service we want - continue; - - auto listing = devicedir.ls(); - if(listing.size() != 1) // We either got no serial ports or multiple, either way no good - continue; - - foundttys.insert(std::make_pair(usb, std::make_pair(listing[0].getName(), 0))); - } - - // We're going to remove from the map if this is not the product we're looking for - for(auto iter = foundttys.begin(); iter != foundttys.end(); ) { - auto& [_, pair] = *iter; - auto& [tty, ttyPid] = pair; - const std::string matchString = "PRODUCT="; - std::stringstream ss; - ss << "/sys/class/tty/" << tty << "/device/uevent"; // Read the uevent file, which contains should have a line like "PRODUCT=93c/1101/100" - std::ifstream fs(ss.str()); - std::string productLine; - size_t pos = std::string::npos; - do { - std::getline(fs, productLine, '\n'); - } while(((pos = productLine.find(matchString)) == std::string::npos) && !fs.eof()); - - if(pos != 0) { // We did not find a product line... weird - iter = foundttys.erase(iter); // Remove the element, this also moves iter forward for us - continue; - } - - size_t firstSlashPos = productLine.find('/', matchString.length()); - if(firstSlashPos == std::string::npos) { - iter = foundttys.erase(iter); - continue; - } - size_t pidpos = firstSlashPos + 1; - - std::string vidstr = productLine.substr(matchString.length(), firstSlashPos - matchString.length()); - std::string pidstr = productLine.substr(pidpos, productLine.find('/', pidpos) - pidpos); // In hex like "1101" or "93c" - - uint16_t vid, pid; - try { - vid = (uint16_t)std::stoul(vidstr, nullptr, 16); - pid = (uint16_t)std::stoul(pidstr, nullptr, 16); - } catch(...) { - iter = foundttys.erase(iter); // We could not parse the numbers - continue; - } - - if(vid != INTREPID_USB_VENDOR_ID) { - iter = foundttys.erase(iter); // Not the right VID, remove - continue; - } - ttyPid = pid; // Set the PID for this TTY - iter++; // If the loop ends without erasing the iter from the map, the item is good - } - - // At this point, foundttys contains the the devices we want - - // Get the serial number, create the neodevice_t - for(auto& [usb, pair] : foundttys) { - auto& [tty, ttyPid] = pair; - FoundDevice device; - - USBSerialGetter getter(usb); - if(!getter.success()) - continue; // Failure, could not get serial number - - // In ttyACM0, we want the i to be the first character of the number - size_t i; - for(i = 0; i < tty.length(); i++) { - if(isdigit(tty[i])) - break; - } - // Now we try to parse the number so we have a handle for later - try { - device.handle = (neodevice_handle_t)std::stoul(tty.substr(i)); - /* The TTY numbering starts at zero, but we want to keep zero for an undefined - * handle, so add a constant, and we'll subtract that constant in the open function. - */ - device.handle += HANDLE_OFFSET; - } catch(...) { - continue; // Somehow this failed, have to toss the device - } - - device.productId = ttyPid; - device.serial[getter.getSerial().copy(device.serial, sizeof(device.serial)-1)] = '\0'; - - // Add a factory to make the driver - device.makeDriver = [](const device_eventhandler_t& report, neodevice_t& device) { - return std::unique_ptr(new CDCACM(report, device)); - }; - - found.push_back(device); // Finally, add device to search results - } -} - -std::string CDCACM::HandleToTTY(neodevice_handle_t handle) { - std::stringstream ss; - ss << "/dev/ttyACM" << (int)(handle - HANDLE_OFFSET); - return ss.str(); -} \ No newline at end of file diff --git a/platform/posix/pcap.cpp b/platform/posix/pcap.cpp deleted file mode 100644 index c10146cf..00000000 --- a/platform/posix/pcap.cpp +++ /dev/null @@ -1,314 +0,0 @@ -#include "icsneo/platform/posix/pcap.h" -#include "icsneo/communication/network.h" -#include "icsneo/communication/communication.h" -#include "icsneo/communication/ethernetpacketizer.h" -#include "icsneo/communication/packetizer.h" -#include "icsneo/communication/decoder.h" -#include -#include -#include -#include -#include -#ifdef __linux__ -#include -#else -#include -#endif - -using namespace icsneo; - -std::vector PCAP::knownInterfaces; - -void PCAP::Find(std::vector& found) { - static bool warned = false; // Only warn once for failure to open devices - - // First we ask PCAP to give us all of the devices - pcap_if_t* alldevs; - char errbuf[PCAP_ERRBUF_SIZE] = { 0 }; - bool success = false; - // Calling pcap_findalldevs too quickly can cause various errors. Retry a few times in this case. - for(auto retry = 0; retry < 10; retry++) { - auto ret = pcap_findalldevs(&alldevs, errbuf); - if(ret == 0) { - success = true; - break; - } - } - - if(!success) { - EventManager::GetInstance().add(APIEvent::Type::PCAPCouldNotFindDevices, APIEvent::Severity::Error); - return; - } - - std::vector interfaces; - for(pcap_if_t* dev = alldevs; dev != nullptr; dev = dev->next) { - if(dev->name == nullptr) - continue; - if(dev->addresses == nullptr) { - //std::cout << dev->name << " has no addresses" << std::endl; - continue; - } - NetworkInterface netif; - netif.nameFromPCAP = dev->name; - if(dev->description) - netif.descriptionFromPCAP = dev->description; - pcap_addr* currentAddress = dev->addresses; - bool hasAddress = false; - while(!hasAddress && currentAddress != nullptr) { -#ifdef __linux__ - if(currentAddress->addr && currentAddress->addr->sa_family == AF_PACKET) { - struct sockaddr_ll* s = (struct sockaddr_ll*)currentAddress->addr; - memcpy(netif.macAddress, s->sll_addr, sizeof(netif.macAddress)); - hasAddress = true; - break; - } -#else // macOS and likely other BSDs - if(currentAddress->addr && currentAddress->addr->sa_family == AF_LINK) { - struct sockaddr_dl* s = (struct sockaddr_dl*)currentAddress->addr; - if(s->sdl_alen == 6 && s->sdl_alen + s->sdl_nlen < sizeof(s->sdl_data)) { - const uint8_t* mac = (uint8_t*)(s->sdl_data) + s->sdl_nlen; - memcpy(netif.macAddress, mac, sizeof(netif.macAddress)); - hasAddress = true; - break; - } - } -#endif - currentAddress = currentAddress->next; - } - - if(!hasAddress) - continue; - - interfaces.push_back(netif); - } - - pcap_freealldevs(alldevs); - - for(auto& iface : interfaces) { - bool exists = false; - for(auto& known : knownInterfaces) - if(memcmp(iface.macAddress, known.macAddress, sizeof(iface.macAddress)) == 0) - exists = true; - if(!exists) - knownInterfaces.emplace_back(iface); - } - - for(size_t i = 0; i < knownInterfaces.size(); i++) { - auto& iface = knownInterfaces[i]; - // if(iface.fullName.length() == 0) - // continue; // Win32 did not find this interface in the previous step - - errbuf[0] = '\0'; - iface.fp = pcap_open_live(iface.nameFromPCAP.c_str(), 65536, 1, -#ifdef __linux__ // -1 is required for instant reporting of new packets - -1, // to_ms -#else // macOS gives BIOCSRTIMEOUT for -1 and no packets for 0 - 1, -#endif - errbuf); - // TODO Handle warnings - // if(strlen(errbuf) != 0) { // This means a warning - // std::cout << "Warning for " << iface.nameFromPCAP << " " << errbuf << std::endl; - // } - - if(iface.fp == nullptr) { - if (!warned) { - warned = true; - EventManager::GetInstance().add(APIEvent::Type::PCAPCouldNotFindDevices, APIEvent::Severity::EventWarning); - // std::cout << "pcap_open_live failed for " << iface.nameFromPCAP << " with " << errbuf << std::endl; - } - continue; // Could not open the interface - } - - pcap_setnonblock(iface.fp, 1, errbuf); - - EthernetPacketizer::EthernetPacket requestPacket; - memcpy(requestPacket.srcMAC, iface.macAddress, sizeof(requestPacket.srcMAC)); - requestPacket.payload.reserve(4); - requestPacket.payload = { - ((1 << 4) | (uint8_t)Network::NetID::Main51), // Packet size of 1 on NETID_MAIN51 - (uint8_t)Command::RequestSerialNumber - }; - requestPacket.payload.push_back(Packetizer::ICSChecksum(requestPacket.payload)); - requestPacket.payload.insert(requestPacket.payload.begin(), 0xAA); - - auto bs = requestPacket.getBytestream(); - pcap_sendpacket(iface.fp, bs.data(), (int)bs.size()); - - auto timeout = std::chrono::high_resolution_clock::now() + std::chrono::milliseconds(50); - constexpr const size_t TempBufferSize = 4096; - RingBuffer tempBuffer(TempBufferSize); - while(std::chrono::high_resolution_clock::now() <= timeout) { // Wait up to 50ms for the response - struct pcap_pkthdr* header; - const uint8_t* data; - auto res = pcap_next_ex(iface.fp, &header, &data); - if(res == 0) - continue; - if(res < 0 || !header || !data) { - if (!warned) { - warned = true; - EventManager::GetInstance().add(APIEvent::Type::PCAPCouldNotFindDevices, APIEvent::Severity::EventWarning); - // std::cout << "pcapnextex failed with " << res << std::endl; - } - break; - } - - EthernetPacketizer ethPacketizer([](APIEvent::Type, APIEvent::Severity) {}); - memcpy(ethPacketizer.hostMAC, iface.macAddress, sizeof(ethPacketizer.hostMAC)); - ethPacketizer.allowInPacketsFromAnyMAC = true; - if(!ethPacketizer.inputUp({ data, data + header->caplen })) - continue; // This packet is not for us - - Packetizer packetizer([](APIEvent::Type, APIEvent::Severity) {}); - tempBuffer.write(ethPacketizer.outputUp()); - if(!packetizer.input(tempBuffer)) - continue; // This packet was not well formed - - EthernetPacketizer::EthernetPacket decoded(data, header->caplen); - Decoder decoder([](APIEvent::Type, APIEvent::Severity) {}); - for(const auto& packet : packetizer.output()) { - std::shared_ptr message; - if(!decoder.decode(message, packet)) - continue; - - const auto serial = std::dynamic_pointer_cast(message); - if(!serial || serial->deviceSerial.size() != 6) - continue; - - FoundDevice foundDevice; - foundDevice.handle = (neodevice_handle_t)((i << 24) | (decoded.srcMAC[3] << 16) | (decoded.srcMAC[4] << 8) | (decoded.srcMAC[5])); - foundDevice.productId = decoded.srcMAC[2]; - memcpy(foundDevice.serial, serial->deviceSerial.c_str(), sizeof(foundDevice.serial) - 1); - foundDevice.serial[sizeof(foundDevice.serial) - 1] = '\0'; - - if(std::any_of(found.begin(), found.end(), [&](const auto& found) { return ::strncmp(foundDevice.serial, found.serial, sizeof(foundDevice.serial)) == 0; })) - continue; // We already have this device on this interface - - foundDevice.makeDriver = [](const device_eventhandler_t& report, neodevice_t& device) { - return std::unique_ptr(new PCAP(report, device)); - }; - - found.push_back(foundDevice); - } - } - - pcap_close(iface.fp); - iface.fp = nullptr; - } -} - -bool PCAP::IsHandleValid(neodevice_handle_t handle) { - uint8_t netifIndex = (uint8_t)(handle >> 24); - return (netifIndex < knownInterfaces.size()); -} - -PCAP::PCAP(device_eventhandler_t err, neodevice_t& forDevice) : Driver(err), device(forDevice), ethPacketizer(err) { - if(IsHandleValid(device.handle)) { - iface = knownInterfaces[(device.handle >> 24) & 0xFF]; - iface.fp = nullptr; // We're going to open our own connection to the interface. This should already be nullptr but just in case. - - deviceMAC[0] = 0x00; - deviceMAC[1] = 0xFC; - deviceMAC[2] = 0x70; - deviceMAC[3] = (device.handle >> 16) & 0xFF; - deviceMAC[4] = (device.handle >> 8) & 0xFF; - deviceMAC[5] = device.handle & 0xFF; - memcpy(ethPacketizer.deviceMAC, deviceMAC, 6); - memcpy(ethPacketizer.hostMAC, iface.macAddress, 6); - } else { - openable = false; - } -} - -bool PCAP::open() { - if(!openable) - return false; - - if(isOpen()) - return false; - - // Open the interface - iface.fp = pcap_open_live(iface.nameFromPCAP.c_str(), 65536, 1, -#ifdef __linux__ // -1 is required for instant reporting of new packets - -1, // to_ms -#else // macOS gives BIOCSRTIMEOUT for -1 and no packets for 0 - 1, -#endif - errbuf); - if(iface.fp == nullptr) { - report(APIEvent::Type::DriverFailedToOpen, APIEvent::Severity::Error); - return false; - } - - pcap_setnonblock(iface.fp, 0, errbuf); - pcap_set_immediate_mode(iface.fp, 1); - - // Create threads - readThread = std::thread(&PCAP::readTask, this); - writeThread = std::thread(&PCAP::writeTask, this); - - return true; -} - -bool PCAP::isOpen() { - return iface.fp != nullptr; -} - -bool PCAP::close() { - if(!isOpen()) - return false; - - setIsClosing(true); // Signal the threads that we are closing - pcap_breakloop(iface.fp); -#ifndef __linux__ - pthread_cancel(readThread.native_handle()); -#endif - readThread.join(); - writeThread.join(); - setIsClosing(false); - - pcap_close(iface.fp); - iface.fp = nullptr; - - clearBuffers(); - - return true; -} - -void PCAP::readTask() { - EventManager::GetInstance().downgradeErrorsOnCurrentThread(); - while (!isClosing()) { - pcap_dispatch(iface.fp, -1, [](uint8_t* obj, const struct pcap_pkthdr* header, const uint8_t* data) { - PCAP* driver = reinterpret_cast(obj); - if(driver->ethPacketizer.inputUp({data, data + header->caplen})) { - const auto bytes = driver->ethPacketizer.outputUp(); - driver->pushRx(bytes.data(), bytes.size()); - } - }, (uint8_t*)this); - } -} - -void PCAP::writeTask() { - WriteOperation writeOp; - EventManager::GetInstance().downgradeErrorsOnCurrentThread(); - - while(!isClosing()) { - if(!writeQueue.wait_dequeue_timed(writeOp, std::chrono::milliseconds(100))) - continue; - - // If we have a bunch of small packets to send, try to pack them into a packet - // We use the average packet size to determine if we're likely to have enough room - size_t bytesPushed = 0; - size_t packetsPushed = 0; - do { - packetsPushed++; - bytesPushed += writeOp.bytes.size(); - ethPacketizer.inputDown(std::move(writeOp.bytes)); - } while(bytesPushed < (EthernetPacketizer::MaxPacketLength - (bytesPushed / packetsPushed * 2)) && writeQueue.try_dequeue(writeOp)); - - for(const auto& packet : ethPacketizer.outputDown()) { - pcap_sendpacket(iface.fp, packet.data(), (int)packet.size()); - } - // TODO Handle packet send errors - } -} diff --git a/platform/tcp.cpp b/platform/tcp.cpp deleted file mode 100644 index 1f442026..00000000 --- a/platform/tcp.cpp +++ /dev/null @@ -1,573 +0,0 @@ - -#ifdef _WIN32 -#include -#include -#include -#else -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#endif - -#include -#include "icsneo/platform/tcp.h" - -#ifdef _WIN32 -#define WIN_INT(a) static_cast(a) -#else -#define WIN_INT(a) a -#endif - -#ifdef __APPLE__ -#define APPLE_SIN_LEN(a) a.sin_len = sizeof(struct sockaddr_in); -#else -#define APPLE_SIN_LEN(a) -#endif - -using namespace icsneo; - -TCP::Socket::Socket(int domain, int type, int protocol, bool nonblocking) { - #ifdef _WIN32 - class WSAState { - public: - WSAState() { - WSADATA wsaData = {}; - valid = ::WSAStartup(MAKEWORD(2, 2), &wsaData) == 0; - } - ~WSAState() { - ::WSACleanup(); - } - explicit operator bool() const { return valid; } - private: - bool valid = false; - }; - static const WSAState WSA_STATE; - if(!WSA_STATE) - return; - #endif - fd = ::socket(domain, type, protocol); - if(nonblocking) { - #ifdef _WIN32 - unsigned long param = 1; - ::ioctlsocket(fd, FIONBIO, ¶m); - #else - const int flags = fcntl(fd, F_GETFL, 0); - ::fcntl(fd, F_SETFL, flags | O_NONBLOCK); - #endif - } -} - -TCP::Socket::~Socket() { - #ifdef _WIN32 - ::closesocket(fd); - #else - ::close(fd); - #endif -} - -void TCP::Socket::poll(uint16_t event, uint32_t msTimeout) { - #ifdef _WIN32 - WSAPOLLFD pfd; - pfd.fd = fd; - pfd.events = event; - ::WSAPoll(&pfd, 1, msTimeout); - #else - struct pollfd pfd; - pfd.fd = fd; - pfd.events = event; - ::poll(&pfd, 1, msTimeout); - #endif -} - -void TCP::Find(std::vector& found) { - static const auto tcpDisabled = []() -> bool { - #ifdef _MSC_VER - #pragma warning(push) - #pragma warning(disable : 4996) - #endif - const auto disabled = std::getenv("LIBICSNEO_DISABLE_TCP"); - return disabled ? std::stoi(disabled) : false; - #ifdef _MSC_VER - #pragma warning(pop) - #endif - }; - if(tcpDisabled()) { - return; - } - - static const auto MDNS_PORT = htons((unsigned short)5353); - static const auto MDNS_IP = htonl((((uint32_t)224U) << 24U) | ((uint32_t)251U)); - - class IFAddresses { - public: - #ifdef _WIN32 - typedef IP_ADAPTER_ADDRESSES* InterfaceHandle; - #else - typedef ifaddrs* InterfaceHandle; - #endif - - class Interface { - public: - Interface(InterfaceHandle handle) : handle(handle) {} - Interface next() { - #ifdef _WIN32 - return Interface(handle->Next); - #else - return Interface(handle->ifa_next); - #endif - } - unsigned flags() { - #ifdef _WIN32 - return handle->Flags; - #else - return handle->ifa_flags; - #endif - } - explicit operator bool() { - return handle; - } - bool validType() { - #ifdef _WIN32 - return - handle && - (handle->TunnelType != TUNNEL_TYPE_TEREDO) && - (handle->OperStatus == IfOperStatusUp) && - (address()->sa_family == AF_INET); - #else - return - handle && - handle->ifa_addr && - (flags() & IFF_UP) && - (flags() & IFF_MULTICAST) && - !(flags() & IFF_LOOPBACK) && - !(flags() & IFF_POINTOPOINT) && - (handle->ifa_addr->sa_family == AF_INET) && - (((sockaddr_in*)address())->sin_addr.s_addr != htonl(INADDR_LOOPBACK)); - #endif - - } - InterfaceHandle operator->() { - return handle; - } - sockaddr* address() const { - #ifdef _WIN32 - return handle->FirstUnicastAddress->Address.lpSockaddr; - #else - return handle->ifa_addr; - #endif - } - std::string_view name() const { - #ifdef _WIN32 - return handle->AdapterName; - #else - return handle->ifa_name; - #endif - } - private: - InterfaceHandle handle; - }; - - IFAddresses() { - #ifdef _WIN32 - unsigned long ret; - unsigned long size = 15'000; - do { - storage.resize(size); - ret = ::GetAdaptersAddresses(AF_INET, 0, NULL, (InterfaceHandle)storage.data(), &size); - } while (ret == ERROR_BUFFER_OVERFLOW); - front = (InterfaceHandle)storage.data(); - #else - ::getifaddrs(&front); - #endif - } - ~IFAddresses() { - #ifdef _WIN32 - #else - ::freeifaddrs(front); - #endif - } - - explicit operator bool() { - return front; - } - Interface begin() const { - return Interface(front); - } - private: - #ifdef _WIN32 - std::vector storage; - #endif - InterfaceHandle front; - }; - - IFAddresses interfaces; - if(!interfaces) { - EventManager::GetInstance().add(APIEvent::Type::GetIfAddrsError, APIEvent::Severity::EventWarning); - return; - } - - for(auto intf = interfaces.begin(); intf; intf = intf.next()) { - if(!intf.validType()) - continue; - Socket socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - if(!socket) { - EventManager::GetInstance().add(APIEvent::Type::SocketFailedToOpen, APIEvent::Severity::EventWarning); - return; - } - - { - unsigned int reuse = 1; - if(::setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse)) < 0) { - EventManager::GetInstance().add(APIEvent::Type::ErrorSettingSocketOption, APIEvent::Severity::EventWarning); - continue; - } - #ifndef _WIN32 - if(::setsockopt(socket, SOL_SOCKET, SO_REUSEPORT, (const char*)&reuse, sizeof(reuse)) < 0) { - EventManager::GetInstance().add(APIEvent::Type::ErrorSettingSocketOption, APIEvent::Severity::EventWarning); - continue; - } - #ifndef __APPLE__ - if(::setsockopt(socket, SOL_SOCKET, SO_BINDTODEVICE, intf.name().data(), intf.name().size()) < 0) { - EventManager::GetInstance().add(APIEvent::Type::ErrorSettingSocketOption, APIEvent::Severity::EventWarning); - continue; - } - #endif - #endif - } - auto ifAddrIn = (sockaddr_in*)intf.address(); - ifAddrIn->sin_port = MDNS_PORT; - - { - sockaddr_in addr = *ifAddrIn; - APPLE_SIN_LEN(addr); - ::setsockopt(socket, IPPROTO_IP, IP_MULTICAST_IF, (const char*)&addr.sin_addr, sizeof(addr.sin_addr)); - #ifndef _WIN32 - addr.sin_addr.s_addr = INADDR_ANY; - #endif - if(::bind(socket, (sockaddr*)&addr, sizeof(addr)) == -1) { - EventManager::GetInstance().add(APIEvent::Type::FailedToBind, APIEvent::Severity::EventWarning); - continue; - } - } - - { - ip_mreq req = {}; - req.imr_multiaddr.s_addr = htonl((((uint32_t)224U) << 24U) | ((uint32_t)251U)); - req.imr_interface = ifAddrIn->sin_addr; - ::setsockopt(socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&req, sizeof(req)); - } - - std::array query = { - 0x00, 0x00, /* id */ - 0x00, 0x00, /* flags */ - 0x00, 0x01, /* query count */ - 0x00, 0x00, /* answer count */ - 0x00, 0x00, /* auth count */ - 0x00, 0x00, /* additional count */ - 0x06, '_', 'n', 'e', 'o', 'v', 'i', 0x04, '_', 't', 'c', 'p', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00, - 0x00, 0x0c, /* type*/ - 0x00, 0x01 /* class */ - }; - sockaddr_in addr = {}; - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = MDNS_IP; - addr.sin_port = MDNS_PORT; - APPLE_SIN_LEN(addr); - if(::sendto(socket, (char*)query.data(), WIN_INT(query.size()), 0, (sockaddr*)&addr, sizeof(addr)) < 0) { - EventManager::GetInstance().add(APIEvent::Type::SendToError, APIEvent::Severity::EventWarning); - continue; - } - - const auto rxTill = std::chrono::steady_clock::now() + std::chrono::milliseconds(100); - while(std::chrono::steady_clock::now() < rxTill) { - static constexpr size_t bufferLen = 2048; - uint8_t buffer[bufferLen]; - // keep trying till the timeout - const auto msWait = std::chrono::duration_cast(rxTill - std::chrono::steady_clock::now()).count(); - if(msWait < 0) { - break; - } - socket.poll(POLLIN, static_cast(msWait)); - const auto recvRet = ::recv(socket, (char*)buffer, bufferLen, 0); - static constexpr auto headerLength = 12; - if(recvRet < headerLength) { - break; - } - uint8_t* bufferEnd = buffer + recvRet; - const auto flags = ntohs(*(uint16_t*)(buffer + 2)); - const bool isResponse = flags >> 15; - if(!isResponse) - continue; - const auto answerCount = ntohs(*(uint16_t*)(buffer + 6)); - const auto additionalCount = ntohs(*(uint16_t*)(buffer + 10)); - if(answerCount < 1 || additionalCount < 1) { - continue; - } - std::function(uint8_t*,std::vector&)> parseStrings = [&](uint8_t* start, std::vector& strings) -> std::optional { - uint8_t* origStart = start; - for(size_t i = 0; i < 10 /* infinite loop prevention */; ++i) { - if(start >= bufferEnd) - return std::nullopt; - static constexpr uint8_t isCompressed = 0xC0; - if(*start & isCompressed) { - if(start + 2 > bufferEnd) - return std::nullopt; - uint16_t offset = ntohs(*(uint16_t*)start) & 0x3FFF; - if(buffer + offset > bufferEnd) - return std::nullopt; - parseStrings(buffer + offset, strings); - start += 2; - return start - origStart; - } else if(*start == 0) { - return start + 1 - origStart; - } else { - if(start + 1 /* skip the length */ + *start > bufferEnd - 1 /* every string ends with '\0' */) - return std::nullopt; - strings.emplace_back((char*)(start + 1), *start); - start += 1 + *start; - } - } - return std::nullopt; - }; - struct Record { - enum class Type { - PTR = 0x000C, - SRV = 0x0021, - A = 0x0001, - }; - std::vector name; - Type type; - uint8_t* data; - uint16_t dataLength; - }; - const auto parseRecord = [&](uint8_t* start, Record& parsedRecord) -> std::optional { - uint8_t* origStart = start; - const auto nameLength = parseStrings(start, parsedRecord.name); - if(!nameLength) - return std::nullopt; - if(start + *nameLength + 10 /* type + flags + TTL + data length */ > bufferEnd) - return std::nullopt; - start += *nameLength; - parsedRecord.type = Record::Type(ntohs(*(uint16_t*)start)); - start += 8; /* type + flags + TTL */ - parsedRecord.dataLength = ntohs(*(uint16_t*)start); - start += 2; - parsedRecord.data = start; - start += parsedRecord.dataLength; - return start - origStart; - }; - - const auto parseRecords = [&](uint8_t* start, std::vector& parsed) -> std::optional { - uint8_t* origStart = start; - for(auto& record : parsed) { - const auto recordLength = parseRecord(start, record); - if(!recordLength || start + *recordLength > bufferEnd) - return std::nullopt; - start += *recordLength; - } - return start - origStart; - }; - std::vector answers(answerCount); - const auto answersLength = parseRecords(buffer + headerLength, answers); - if(!answersLength) - continue; - - std::vector additional(additionalCount); - const auto additionalLength = parseRecords(buffer + headerLength + *answersLength, additional); - if(!additionalLength) - continue; - FoundDevice foundDevice; - - const auto fillSerial = [&]() -> bool { - for(const auto& record : answers) { - if(record.name.size() == 3 && record.name[0] == "_neovi" && record.name[1] == "_tcp" && record.name[2] == "local") { - constexpr size_t deviceSerialBufferLength = sizeof(foundDevice.serial); - std::copy(record.data + 1 /* length field */, record.data + deviceSerialBufferLength, foundDevice.serial); - foundDevice.serial[deviceSerialBufferLength - 1] = '\0'; - return true; - } - } - return false; - }; - - if(!fillSerial()) - continue; - - std::optional devIP; - std::optional devPort; - const auto fillDevEndpoint = [&]() -> bool { - for(const auto& record : additional) { - if(record.name.size() == 4 && record.name[1] == "_neovi" && record.name[2] == "_tcp" && record.name[3] == "local") { - if(record.type == Record::Type::A) { - if(record.dataLength != 4) - return false; - devIP.emplace(ntohl(*(uint32_t*)record.data)); - } else if(record.type == Record::Type::SRV) { - if(record.dataLength != 8 /* priority + weight + port */) - return false; - devPort.emplace(ntohs(*(uint16_t*)(record.data + 4))); - } - } - } - return devIP && devPort; - }; - - if(!fillDevEndpoint()) - continue; - - NetworkInterface on = { - std::string(intf.name()), - ntohl(ifAddrIn->sin_addr.s_addr) - }; - - foundDevice.makeDriver = [=](const device_eventhandler_t& eh, neodevice_t&) { - return std::unique_ptr(new TCP(eh, on, *devIP, *devPort)); - }; - found.push_back(std::move(foundDevice)); - } - } -} - -TCP::TCP(const device_eventhandler_t& err, NetworkInterface on, uint32_t dstIP, uint16_t dstPort) : - Driver(err), interfaceDescription(on), dstIP(dstIP), dstPort(dstPort) { -} - -bool TCP::open() { - if(socket) { - report(APIEvent::Type::DeviceCurrentlyOpen, APIEvent::Severity::Error); - return false; - } - - auto partiallyOpenSocket = std::make_unique(AF_INET, SOCK_STREAM, IPPROTO_TCP); - - #if !defined(_WIN32) && !defined(__APPLE__) - if(::setsockopt(*partiallyOpenSocket, SOL_SOCKET, SO_BINDTODEVICE, interfaceDescription.name.c_str(), interfaceDescription.name.size()) < 0) { - report(APIEvent::Type::ErrorSettingSocketOption, APIEvent::Severity::Error); - return false; - } - #endif - - { - sockaddr_in addr = {}; - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = htonl(interfaceDescription.ip); - APPLE_SIN_LEN(addr); - if(::bind(*partiallyOpenSocket, (sockaddr*)&addr, sizeof(addr)) < 0) { - report(APIEvent::Type::FailedToBind, APIEvent::Severity::Error); - return false; - } - } - - { - sockaddr_in addr = {}; - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = htonl(dstIP); - addr.sin_port = htons(dstPort); - APPLE_SIN_LEN(addr); - - // the socket is non-blocking so it's expected that the first connect will fail - if(::connect(*partiallyOpenSocket, (sockaddr*)&addr, sizeof(addr)) == 0) { - report(APIEvent::Type::DriverFailedToOpen, APIEvent::Severity::Error); - return false; - } - #ifdef _WIN32 - if(::WSAGetLastError() != WSAEWOULDBLOCK) { - report(APIEvent::Type::DriverFailedToOpen, APIEvent::Severity::Error); - return false; - } - #else - if(errno != EINPROGRESS) { - report(APIEvent::Type::DriverFailedToOpen, APIEvent::Severity::Error); - return false; - } - #endif - - partiallyOpenSocket->poll(POLLOUT, 1000); - - if(::connect(*partiallyOpenSocket, (sockaddr*)&addr, sizeof(addr)) < 0) { - #ifdef _WIN32 - if(::WSAGetLastError() != WSAEISCONN) { - report(APIEvent::Type::DriverFailedToOpen, APIEvent::Severity::Error); - return false; - } - #elif defined(__APPLE__) - if(errno != EISCONN) { - report(APIEvent::Type::DriverFailedToOpen, APIEvent::Severity::Error); - return false; - } - #else - report(APIEvent::Type::DriverFailedToOpen, APIEvent::Severity::Error); - return false; - #endif - } - } - - socket = std::move(partiallyOpenSocket); - readThread = std::thread(&TCP::readTask, this); - writeThread = std::thread(&TCP::writeTask, this); - return true; -} - -bool TCP::isOpen() { - return socket ? true : false; -} - -bool TCP::close() { - if(!isOpen() && !isDisconnected()) { - report(APIEvent::Type::DeviceCurrentlyClosed, APIEvent::Severity::Error); - return false; - } - - setIsClosing(true); - setIsDisconnected(false); - - if(readThread.joinable()) - readThread.join(); - if(writeThread.joinable()) - writeThread.join(); - - clearBuffers(); - - socket.reset(); - setIsClosing(false); - - return true; -} - -void TCP::readTask() { - EventManager::GetInstance().downgradeErrorsOnCurrentThread(); - - constexpr size_t READ_BUFFER_SIZE = 2048; - uint8_t readbuf[READ_BUFFER_SIZE]; - while(!isClosing()) { - if(const auto received = ::recv(*socket, (char*)readbuf, READ_BUFFER_SIZE, 0); received > 0) { - pushRx(readbuf, received); - } else { - socket->poll(POLLIN, 100); - } - } -} - -void TCP::writeTask() { - EventManager::GetInstance().downgradeErrorsOnCurrentThread(); - - WriteOperation writeOp; - while(!isClosing()) { - if(!writeQueue.wait_dequeue_timed(writeOp, std::chrono::milliseconds(100))) - continue; - - while(!isClosing()) { - if(::send(*socket, (char*)writeOp.bytes.data(), WIN_INT(writeOp.bytes.size()), 0) > 0) - break; - socket->poll(POLLOUT, 100); - } - } -} diff --git a/platform/windows/cdcacm.cpp b/platform/windows/cdcacm.cpp deleted file mode 100644 index 2a195b83..00000000 --- a/platform/windows/cdcacm.cpp +++ /dev/null @@ -1,244 +0,0 @@ -#include "icsneo/platform/windows/cdcacm.h" - -#include -#include -#include -#include - -using namespace icsneo; - -#define SERIAL_SIZE 6 - -CDCACM::CDCACM(const device_eventhandler_t& err, const std::wstring& path) : Driver(err), path(path) { -} - -bool CDCACM::open() { - handle = CreateFileW(path.c_str(), GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nullptr); - if(handle == INVALID_HANDLE_VALUE) { - EventManager::GetInstance().add(APIEvent::Type::SyscallError, APIEvent::Severity::Error); - return false; - } - COMMTIMEOUTS timeouts; - timeouts.ReadIntervalTimeout = MAXDWORD; - timeouts.ReadTotalTimeoutMultiplier = MAXDWORD; - timeouts.ReadTotalTimeoutConstant = MAXDWORD - 1; - timeouts.WriteTotalTimeoutMultiplier = 0; - timeouts.WriteTotalTimeoutConstant = 0; - - if(!SetCommTimeouts(handle, &timeouts)) { - EventManager::GetInstance().add(APIEvent::Type::SyscallError, APIEvent::Severity::Error); - CloseHandle(handle); - handle = INVALID_HANDLE_VALUE; - return false; - } - - DCB comstate; - if(!GetCommState(handle, &comstate)) { - EventManager::GetInstance().add(APIEvent::Type::SyscallError, APIEvent::Severity::Error); - CloseHandle(handle); - handle = INVALID_HANDLE_VALUE; - return false; - } - comstate.BaudRate = 115200; - comstate.ByteSize = 8; - comstate.fRtsControl = RTS_CONTROL_DISABLE; - if(!SetCommState(handle, &comstate)) { - EventManager::GetInstance().add(APIEvent::Type::SyscallError, APIEvent::Severity::Error); - CloseHandle(handle); - handle = INVALID_HANDLE_VALUE; - return false; - } - - PurgeComm(handle, PURGE_RXCLEAR); - - readOverlapped.hEvent = CreateEventA(nullptr, false, false, nullptr); - writeOverlapped.hEvent = CreateEventA(nullptr, false, false, nullptr); - - setIsDisconnected(false); - readThread = std::thread(&CDCACM::read, this); - writeThread = std::thread(&CDCACM::write, this); - return true; -} - -bool CDCACM::isOpen() { - return handle != INVALID_HANDLE_VALUE; -} - -bool CDCACM::close() { - setIsClosing(true); - SetEvent(readOverlapped.hEvent); // unblock read thread - SetEvent(writeOverlapped.hEvent); // unblock write thread if waiting on COM write - writeQueue.enqueue(WriteOperation{}); // unblock write thread if waiting on write queue pop - readThread.join(); - writeThread.join(); - CloseHandle(readOverlapped.hEvent); - CloseHandle(writeOverlapped.hEvent); - CloseHandle(handle); - handle = INVALID_HANDLE_VALUE; - setIsClosing(false); - return true; -} - -void CDCACM::read() { - EventManager::GetInstance().downgradeErrorsOnCurrentThread(); - - std::vector buffer(ICSNEO_DRIVER_RINGBUFFER_SIZE); - - while(!isDisconnected() && !isClosing()) { - if(!ReadFile(handle, buffer.data(), (DWORD)buffer.size(), nullptr, &readOverlapped)) { - if(GetLastError() != ERROR_IO_PENDING) { - EventManager::GetInstance().add(APIEvent::Type::SyscallError, APIEvent::Severity::Error); - setIsDisconnected(true); - return; - } - } - DWORD read = 0; - if(!GetOverlappedResult(handle, &readOverlapped, &read, true)) { - EventManager::GetInstance().add(APIEvent::Type::SyscallError, APIEvent::Severity::Error); - setIsDisconnected(true); - return; - } - if(read == 0) { - continue; - } - while(!isDisconnected() && !isClosing()) { - if(pushRx(buffer.data(), read)) - break; - } - } -} - -void CDCACM::write() { - EventManager::GetInstance().downgradeErrorsOnCurrentThread(); - - WriteOperation writeOp; - - while(!isDisconnected() && !isClosing()) { - writeQueue.wait_dequeue(writeOp); - - if(isDisconnected() || isClosing()) { - return; - } - - if(!WriteFile(handle, writeOp.bytes.data(), (DWORD)writeOp.bytes.size(), nullptr, &writeOverlapped)) { - if(GetLastError() != ERROR_IO_PENDING) { - EventManager::GetInstance().add(APIEvent::Type::SyscallError, APIEvent::Severity::Error); - setIsDisconnected(true); - return; - } - } - DWORD written; - if(!GetOverlappedResult(handle, &writeOverlapped, &written, true)) { - EventManager::GetInstance().add(APIEvent::Type::SyscallError, APIEvent::Severity::Error); - setIsDisconnected(true); - return; - } - - if(written != writeOp.bytes.size()) { - EventManager::GetInstance().add(APIEvent::Type::FailedToWrite, APIEvent::Severity::Error); - setIsDisconnected(true); - return; - } - } -} - - -class DeviceInfo { -public: - DeviceInfo() { - mDeviceInfo = SetupDiGetClassDevsW(&GUID_DEVINTERFACE_USB_DEVICE, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); - } - ~DeviceInfo() { - SetupDiDestroyDeviceInfoList(mDeviceInfo); - } - operator HDEVINFO() const { - return mDeviceInfo; - } - operator bool() const { - return mDeviceInfo != INVALID_HANDLE_VALUE; - } -private: - HDEVINFO mDeviceInfo; -}; - -class DeviceInfoData { -public: - DeviceInfoData() { - mDeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); - } - operator SP_DEVINFO_DATA*() { - return &mDeviceInfoData; - } -private: - SP_DEVINFO_DATA mDeviceInfoData; -}; - -static constexpr size_t WSTRING_ELEMENT_SIZE = sizeof(std::wstring::value_type); - -void CDCACM::Find(std::vector& found) { - DeviceInfoData deviceInfoData; - const std::wstring intrepidUSB(L"USB\\VID_093C"); - DeviceInfo deviceInfoSet; - if(!deviceInfoSet) { - EventManager::GetInstance().add(APIEvent::Type::SyscallError, APIEvent::Severity::Error); - return; - } - - for(DWORD i = 0; SetupDiEnumDeviceInfo(deviceInfoSet, i, deviceInfoData); ++i) { - DWORD DataT; - DWORD buffersize = 0; - - std::wstring wclass; - while(!SetupDiGetDevicePropertyW(deviceInfoSet, deviceInfoData, &DEVPKEY_Device_Class, &DataT, reinterpret_cast(wclass.data()), static_cast((wclass.size() + 1) * WSTRING_ELEMENT_SIZE), &buffersize, 0)) { - wclass.resize((buffersize - 1) / WSTRING_ELEMENT_SIZE); - } - - if(wclass != L"Ports") { - continue; - } - - // TODO: is this a bug in Windows? why is this returned size different/wrong? It's like it's not a wstring at all - std::wstring deviceInstanceId; - while(!SetupDiGetDeviceInstanceIdW(deviceInfoSet, deviceInfoData, deviceInstanceId.data(), static_cast(deviceInstanceId.size() + 1), &buffersize)) { - deviceInstanceId.resize(buffersize - 1); - } - - if(deviceInstanceId.find(intrepidUSB) != 0) { - continue; - } - - auto serialOffset = deviceInstanceId.find_last_of('\\'); - - if(serialOffset == std::string::npos) { - continue; - } - - ++serialOffset; // move past '\' - - if(deviceInstanceId.size() < serialOffset + SERIAL_SIZE) { - continue; - } - - std::wstring wserial(deviceInstanceId.c_str() + serialOffset, SERIAL_SIZE); - - FoundDevice device = {0}; - - if(WideCharToMultiByte(CP_ACP, 0, wserial.c_str(), (int)wserial.size(), device.serial, SERIAL_SIZE, NULL, NULL) == 0) { - EventManager::GetInstance().add(APIEvent::Type::SyscallError, APIEvent::Severity::Error); - continue; - } - - std::wstring wport; - while(!SetupDiGetCustomDevicePropertyW(deviceInfoSet, deviceInfoData, L"PortName", 0, &DataT, reinterpret_cast(wport.data()), static_cast((wport.size() + 1) * WSTRING_ELEMENT_SIZE), &buffersize)) { - wport.resize((buffersize - 1) / WSTRING_ELEMENT_SIZE); - } - - const std::wstring path(L"\\\\.\\" + wport); - - device.makeDriver = [path](device_eventhandler_t err, neodevice_t&) { - return std::make_unique(err, path); - }; - - found.emplace_back(std::move(device)); - } -} diff --git a/platform/windows/internal/pcapdll.cpp b/platform/windows/internal/pcapdll.cpp deleted file mode 100644 index 4bdbb0fe..00000000 --- a/platform/windows/internal/pcapdll.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include "icsneo/platform/windows/internal/pcapdll.h" -#include - -using namespace icsneo; - -const PCAPDLL& PCAPDLL::getInstance() -{ - static PCAPDLL instance; - return instance; -} - -PCAPDLL::~PCAPDLL() -{ - closeDLL(); -} - -void PCAPDLL::closeDLL() -{ - if (dll) - FreeLibrary(dll); - dll = nullptr; -} - -bool PCAPDLL::ok() const -{ - return dll != nullptr; -} - -PCAPDLL::PCAPDLL() -{ - TCHAR dir[512] = {0}; - if(GetSystemDirectory(dir, 480)) { - _tcscat_s(dir, 512, TEXT("\\Npcap")); - if(SetDllDirectory(dir)) { - // will search for Npcap first, then fall back to WinPcap - dll = LoadLibrary(TEXT("wpcap.dll")); - SetDllDirectory(nullptr); // reset - } - } - - if(dll == NULL) { - closeDLL(); - } else { - findalldevs_ex = (PCAPFINDDEVICE)GetProcAddress(dll, "pcap_findalldevs_ex"); - open = (PCAPOPEN)GetProcAddress(dll, "pcap_open"); - freealldevs = (PCAPFREEDEVS)GetProcAddress(dll, "pcap_freealldevs"); - close = (PCAPCLOSE)GetProcAddress(dll, "pcap_close"); - stats = (PCAPSTATS)GetProcAddress(dll, "pcap_stats"); - next_ex = (PCAPNEXTEX)GetProcAddress(dll, "pcap_next_ex"); - sendpacket = (PCAPSENDPACKET)GetProcAddress(dll, "pcap_sendpacket"); - sendqueue_alloc = (PCAPSENDQUEUEALLOC)GetProcAddress(dll, "pcap_sendqueue_alloc"); - sendqueue_queue = (PCAPSENDQUEUEQUEUE)GetProcAddress(dll, "pcap_sendqueue_queue"); - sendqueue_destroy = (PCAPSENDQUEUEDESTROY)GetProcAddress(dll, "pcap_sendqueue_destroy"); - sendqueue_transmit = (PCAPSENDQUEUETRANSMIT)GetProcAddress(dll, "pcap_sendqueue_transmit"); - datalink = (PCAPDATALINK)GetProcAddress(dll, "pcap_datalink"); - createsrcstr = (PCAPCREATESRCSTR)GetProcAddress(dll, "pcap_createsrcstr"); - setbuff = (PCAPSETBUFF)GetProcAddress(dll, "pcap_setbuff"); - if(findalldevs_ex == NULL || open == NULL || - freealldevs == NULL || close == NULL || - stats == NULL || next_ex == NULL || - sendpacket == NULL || - sendqueue_alloc == NULL || - sendqueue_queue == NULL || sendqueue_destroy == NULL || - sendqueue_transmit == NULL || - datalink == NULL || - createsrcstr == NULL || setbuff == NULL) { - closeDLL(); - } - } -} diff --git a/platform/windows/pcap.cpp b/platform/windows/pcap.cpp deleted file mode 100644 index 26d408b0..00000000 --- a/platform/windows/pcap.cpp +++ /dev/null @@ -1,358 +0,0 @@ -#define WIN32_LEAN_AND_MEAN -#define NOMINMAX -#include -#include - -#include "icsneo/platform/windows/pcap.h" -#include "icsneo/platform/windows/strings.h" -#include "icsneo/communication/network.h" -#include "icsneo/communication/communication.h" -#include "icsneo/communication/ethernetpacketizer.h" -#include "icsneo/communication/packetizer.h" -#include "icsneo/communication/decoder.h" -#include "icsneo/core/ringbuffer.h" -#include -#include -#pragma comment(lib, "IPHLPAPI.lib") -#include -#include -#include - -using namespace icsneo; - - -std::vector PCAP::knownInterfaces; - -void PCAP::Find(std::vector& found) { - const PCAPDLL& pcap = PCAPDLL::getInstance(); - if(!pcap.ok()) { - EventManager::GetInstance().add(APIEvent::Type::PCAPCouldNotStart, APIEvent::Severity::Error); - return; - } - - // First we ask WinPCAP to give us all of the devices - pcap_if_t* alldevs; - char errbuf[PCAP_ERRBUF_SIZE] = { 0 }; - bool success = false; - // Calling pcap.findalldevs_ex too quickly can cause various errors. Retry a few times in this case. - for(auto retry = 0; retry < 10; retry++) { - auto ret = pcap.findalldevs_ex((char*)PCAP_SRC_IF_STRING, nullptr, &alldevs, errbuf); - if(ret == 0) { - success = true; - break; - } - } - - if(!success) { - EventManager::GetInstance().add(APIEvent::Type::PCAPCouldNotFindDevices, APIEvent::Severity::Error); - return; - } - - std::vector interfaces; - for(pcap_if_t* dev = alldevs; dev != nullptr; dev = dev->next) { - NetworkInterface netif; - netif.nameFromWinPCAP = dev->name; - netif.descriptionFromWinPCAP = dev->description; - interfaces.push_back(netif); - } - - pcap.freealldevs(alldevs); - - // Now we're going to ask Win32 for the information as well - ULONG size = 0; - if(GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, nullptr, nullptr, &size) != ERROR_BUFFER_OVERFLOW) { - EventManager::GetInstance().add(APIEvent::Type::PCAPCouldNotFindDevices, APIEvent::Severity::Error); - return; - } - std::vector adapterAddressBuffer; - adapterAddressBuffer.resize(size); - if(GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, nullptr, (IP_ADAPTER_ADDRESSES*)adapterAddressBuffer.data(), &size) != ERROR_SUCCESS) { - EventManager::GetInstance().add(APIEvent::Type::PCAPCouldNotFindDevices, APIEvent::Severity::Error); - return; - } - - // aa->AdapterName constains a unique name of the interface like "{3B1D2791-435A-456F-8A7B-9CB0EEE5DAB3}" - // iface.nameFromWinPCAP has "rpcap://\Device\NPF_{3B1D2791-435A-456F-8A7B-9CB0EEE5DAB3}" - // We're comparing strings to match the Win32 info with the WinPCAP info - for(IP_ADAPTER_ADDRESSES* aa = (IP_ADAPTER_ADDRESSES*)adapterAddressBuffer.data(); aa != nullptr; aa = aa->Next) { - for(auto& iface : interfaces) { - if(iface.nameFromWinPCAP.find(aa->AdapterName) == std::string::npos) - continue; // This is not the interface that corresponds - - memcpy(iface.macAddress, aa->PhysicalAddress, sizeof(iface.macAddress)); - iface.nameFromWin32API = aa->AdapterName; - iface.descriptionFromWin32API = convertWideString(aa->Description); - iface.friendlyNameFromWin32API = convertWideString(aa->FriendlyName); - if(iface.descriptionFromWin32API.find("LAN9512/LAN9514") != std::string::npos) { - // This is an Ethernet EVB device - iface.fullName = "Intrepid Ethernet EVB ( " + iface.friendlyNameFromWin32API + " : " + iface.descriptionFromWin32API + " )"; - } else { - iface.fullName = iface.friendlyNameFromWin32API + " : " + iface.descriptionFromWin32API; - } - } - } - - for(auto& iface : interfaces) { - bool exists = false; - for(auto& known : knownInterfaces) - if(memcmp(iface.macAddress, known.macAddress, sizeof(iface.macAddress)) == 0) - exists = true; - if(!exists) - knownInterfaces.emplace_back(iface); - } - - constexpr auto openflags = (PCAP_OPENFLAG_MAX_RESPONSIVENESS | PCAP_OPENFLAG_NOCAPTURE_LOCAL); - for(size_t i = 0; i < knownInterfaces.size(); i++) { - auto& iface = knownInterfaces[i]; - if(iface.fullName.length() == 0) - continue; // Win32 did not find this interface in the previous step - - iface.fp = pcap.open(iface.nameFromWinPCAP.c_str(), 1518, openflags, 1, nullptr, errbuf); - - if(iface.fp == nullptr) - continue; // Could not open the interface - - EthernetPacketizer::EthernetPacket requestPacket; - memcpy(requestPacket.srcMAC, iface.macAddress, sizeof(requestPacket.srcMAC)); - requestPacket.payload.reserve(4); - requestPacket.payload = { - ((1 << 4) | (uint8_t)Network::NetID::Main51), // Packet size of 1 on NETID_MAIN51 - (uint8_t)Command::RequestSerialNumber - }; - requestPacket.payload.push_back(Packetizer::ICSChecksum(requestPacket.payload)); - requestPacket.payload.insert(requestPacket.payload.begin(), 0xAA); - - auto bs = requestPacket.getBytestream(); - pcap.sendpacket(iface.fp, bs.data(), (int)bs.size()); - - auto timeout = std::chrono::high_resolution_clock::now() + std::chrono::milliseconds(250); - constexpr const size_t TempBufferSize = 4096; - RingBuffer tempBuffer(TempBufferSize); - while(std::chrono::high_resolution_clock::now() <= timeout) { // Wait up to 5ms for the response - struct pcap_pkthdr* header; - const uint8_t* data; - auto res = pcap.next_ex(iface.fp, &header, &data); - if(res < 0) { - //std::cout << "pcapnextex failed with " << res << std::endl; - break; - } - if(res == 0) - continue; // Keep waiting for that packet - - EthernetPacketizer ethPacketizer([](APIEvent::Type, APIEvent::Severity) {}); - memcpy(ethPacketizer.hostMAC, iface.macAddress, sizeof(ethPacketizer.hostMAC)); - ethPacketizer.allowInPacketsFromAnyMAC = true; - if(!ethPacketizer.inputUp({ data, data + header->caplen })) - continue; // This packet is not for us - - Packetizer packetizer([](APIEvent::Type, APIEvent::Severity) {}); - tempBuffer.write(ethPacketizer.outputUp()); - if(!packetizer.input(tempBuffer)) - continue; // This packet was not well formed - - EthernetPacketizer::EthernetPacket decoded(data, header->caplen); - for(const auto& packet : packetizer.output()) { - Decoder decoder([](APIEvent::Type, APIEvent::Severity) {}); - std::shared_ptr message; - if(!decoder.decode(message, packet)) - continue; - - const auto serial = std::dynamic_pointer_cast(message); - if(!serial || serial->deviceSerial.size() != 6) - continue; - - FoundDevice foundDevice; - foundDevice.handle = (neodevice_handle_t)((i << 24) | (decoded.srcMAC[3] << 16) | (decoded.srcMAC[4] << 8) | (decoded.srcMAC[5])); - foundDevice.productId = decoded.srcMAC[2]; - memcpy(foundDevice.serial, serial->deviceSerial.c_str(), sizeof(foundDevice.serial) - 1); - foundDevice.serial[sizeof(foundDevice.serial) - 1] = '\0'; - - if(std::any_of(found.begin(), found.end(), [&](const auto& found) { return ::strncmp(foundDevice.serial, found.serial, sizeof(foundDevice.serial)) == 0; })) - continue; - - foundDevice.makeDriver = [](const device_eventhandler_t& reportFn, neodevice_t& device) { - return std::unique_ptr(new PCAP(reportFn, device)); - }; - - found.push_back(foundDevice); - } - } - - pcap.close(iface.fp); - iface.fp = nullptr; - } -} - -bool PCAP::IsHandleValid(neodevice_handle_t handle) { - uint8_t netifIndex = (uint8_t)(handle >> 24); - return (netifIndex < knownInterfaces.size()); -} - -PCAP::PCAP(const device_eventhandler_t& eventHandler, neodevice_t& forDevice) : Driver(eventHandler), pcap(PCAPDLL::getInstance()), device(forDevice), ethPacketizer(eventHandler) { - if(IsHandleValid(device.handle)) { - iface = knownInterfaces[(device.handle >> 24) & 0xFF]; - iface.fp = nullptr; // We're going to open our own connection to the interface. This should already be nullptr but just in case. - - deviceMAC[0] = 0x00; - deviceMAC[1] = 0xFC; - deviceMAC[2] = 0x70; - deviceMAC[3] = (device.handle >> 16) & 0xFF; - deviceMAC[4] = (device.handle >> 8) & 0xFF; - deviceMAC[5] = device.handle & 0xFF; - memcpy(ethPacketizer.deviceMAC, deviceMAC, 6); - memcpy(ethPacketizer.hostMAC, iface.macAddress, 6); - } else { - openable = false; - } -} - -bool PCAP::open() { - if(!openable) { - report(APIEvent::Type::InvalidNeoDevice, APIEvent::Severity::Error); - return false; - } - - if(!pcap.ok()) { - report(APIEvent::Type::DriverFailedToOpen, APIEvent::Severity::Error); - return false; - } - - if(isOpen()) { - report(APIEvent::Type::DeviceCurrentlyOpen, APIEvent::Severity::Error); - return false; - } - - // Open the interface - iface.fp = pcap.open(iface.nameFromWinPCAP.c_str(), 65536, PCAP_OPENFLAG_MAX_RESPONSIVENESS | PCAP_OPENFLAG_NOCAPTURE_LOCAL, 50, nullptr, errbuf); - if(iface.fp == nullptr) { - report(APIEvent::Type::DriverFailedToOpen, APIEvent::Severity::Error); - return false; - } - - // Create threads - readThread = std::thread(&PCAP::readTask, this); - writeThread = std::thread(&PCAP::writeTask, this); - transmitThread = std::thread(&PCAP::transmitTask, this); - - return true; -} - -bool PCAP::isOpen() { - return iface.fp != nullptr; -} - -bool PCAP::close() { - if(!isOpen()) { - report(APIEvent::Type::DeviceCurrentlyClosed, APIEvent::Severity::Error); - return false; - } - - setIsClosing(true); // Signal the threads that we are closing - readThread.join(); - writeThread.join(); - transmitThread.join(); - setIsClosing(false); - - pcap.close(iface.fp); - iface.fp = nullptr; - - clearBuffers(); - - transmitQueue = nullptr; - - return true; -} - -void PCAP::readTask() { - struct pcap_pkthdr* header; - const uint8_t* data; - EventManager::GetInstance().downgradeErrorsOnCurrentThread(); - while(!isClosing()) { - auto readBytes = pcap.next_ex(iface.fp, &header, &data); - if(readBytes < 0) { - report(APIEvent::Type::FailedToRead, APIEvent::Severity::Error); - break; - } - if(readBytes == 0) - continue; // Keep waiting for that packet - - if(ethPacketizer.inputUp({data, data + header->caplen})) { - const auto bytes = ethPacketizer.outputUp(); - pushRx(bytes.data(), bytes.size()); - } - } -} - -void PCAP::writeTask() { - WriteOperation writeOp; - EventManager::GetInstance().downgradeErrorsOnCurrentThread(); - - pcap_send_queue* queue1 = pcap.sendqueue_alloc(128000); - pcap_send_queue* queue2 = pcap.sendqueue_alloc(128000); - pcap_send_queue* queue = queue1; - - while(!isClosing()) { - // Potentially, we added frames to a second queue faster than the other thread was able to hand the first - // off to the kernel. In that case, wait for a minimal amount of time before checking whether we can - // transmit it again. - if(writeQueue.wait_dequeue_timed(writeOp, std::chrono::milliseconds(queue->len ? 1 : 100))) { - unsigned int i = 0; - do { - ethPacketizer.inputDown(std::move(writeOp.bytes)); - if(i++ >= (queue->maxlen - queue->len) / 1518 / 3) - break; // Not safe to try to fit any more packets in this queue, let it transmit and come around again - } while(writeQueue.try_dequeue(writeOp)); - - for(const auto& data : ethPacketizer.outputDown()) { - pcap_pkthdr header = {}; - header.caplen = header.len = bpf_u_int32(data.size()); - if(pcap.sendqueue_queue(queue, &header, data.data()) != 0) - report(APIEvent::Type::FailedToWrite, APIEvent::Severity::EventWarning); - } - } - - std::unique_lock lk(transmitQueueMutex); - // Check if we want to transmit our current queue - // If we're not currently transmitting a queue, let this one transmit immediately for good latency - // If our queue is full and we're transmitting the other, we can't accept any more packets out of the writeQueue - // In that case we're putting as many packets into the driver as possible, so wait for it to be free - // This puts the backpressure on the writeQueue - if(queue->len && (!transmitQueue || queue->len + (1518*2) >= queue->maxlen)) { - if(transmitQueue) // Need to wait for the queue to become available - transmitQueueCV.wait(lk, [this] { return !transmitQueue; }); - - // Time to swap - transmitQueue = queue; - lk.unlock(); - transmitQueueCV.notify_one(); - - // Set up our next queue - if(queue == queue1) { - pcap.sendqueue_destroy(queue2); - queue = queue2 = pcap.sendqueue_alloc(128000); - } else { - pcap.sendqueue_destroy(queue1); - queue = queue1 = pcap.sendqueue_alloc(128000); - } - } - } - - pcap.sendqueue_destroy(queue1); - pcap.sendqueue_destroy(queue2); -} - -void PCAP::transmitTask() { - while(!isClosing()) { - std::unique_lock lk(transmitQueueMutex); - if(transmitQueueCV.wait_for(lk, std::chrono::milliseconds(100), [this] { return !!transmitQueue; }) && !isClosing() && transmitQueue) { - pcap_send_queue* current = transmitQueue; - lk.unlock(); - pcap.sendqueue_transmit(iface.fp, current, 0); - { - std::lock_guard lk2(transmitQueueMutex); - transmitQueue = nullptr; - } - transmitQueueCV.notify_one(); - } - } -} diff --git a/platform/windows/registry.cpp b/platform/windows/registry.cpp deleted file mode 100644 index 9b20e9f2..00000000 --- a/platform/windows/registry.cpp +++ /dev/null @@ -1,122 +0,0 @@ -#include "icsneo/platform/windows/registry.h" -#include "icsneo/platform/windows/strings.h" - -#define WIN32_LEAN_AND_MEAN -#define NOMINMAX -#include -#include -#include -#include - -using namespace icsneo; - -class Key { -public: - Key(std::wstring path, bool readwrite = false); - ~Key(); - HKEY GetKey() { return key; } - bool IsOpen() { return key != nullptr; } -private: - HKEY key; -}; - -Key::Key(std::wstring path, bool readwrite) { - DWORD dwDisposition; - if(readwrite) - RegCreateKeyExW(HKEY_LOCAL_MACHINE, path.c_str(), 0, nullptr, 0, KEY_QUERY_VALUE | KEY_WRITE, nullptr, &key, &dwDisposition); - else - RegOpenKeyExW(HKEY_LOCAL_MACHINE, path.c_str(), 0, KEY_READ, &key); -} - -Key::~Key() { - if(IsOpen()) - RegCloseKey(key); -} - -bool Registry::EnumerateSubkeys(std::wstring path, std::vector& subkeys) { - Key regKey(path); - if(!regKey.IsOpen()) - return false; - - wchar_t className[MAX_PATH]; - memset(className, 0, sizeof(className)); - DWORD classNameLen = MAX_PATH; - DWORD subKeyCount = 0; - DWORD maxSubKeyLen, maxClassStringLen, valueCount, maxValueNameLen, maxValueDataLen, securityDescriptorLen; - FILETIME lastWriteTime; - auto ret = RegQueryInfoKeyW( - regKey.GetKey(), - className, - &classNameLen, - nullptr, - &subKeyCount, - &maxSubKeyLen, - &maxClassStringLen, - &valueCount, - &maxValueNameLen, - &maxValueDataLen, - &securityDescriptorLen, - &lastWriteTime); - - if(ret != ERROR_SUCCESS) - return false; - - subkeys.clear(); - for(DWORD i = 0; i < subKeyCount; i++) { - DWORD nameLen = MAX_PATH; - wchar_t name[MAX_PATH]; - memset(name, 0, sizeof(name)); - ret = RegEnumKeyExW(regKey.GetKey(), i, name, &nameLen, nullptr, nullptr, nullptr, &lastWriteTime); - if(ret == ERROR_SUCCESS) - subkeys.push_back(name); - } - return true; -} - -bool Registry::Get(std::wstring path, std::wstring key, std::wstring& value) { - Key regKey(path); - if(!regKey.IsOpen()) - return false; - - // Query for the type and size of the data - DWORD type, size; - auto ret = RegQueryValueExW(regKey.GetKey(), key.c_str(), nullptr, &type, (LPBYTE)nullptr, &size); - if(ret != ERROR_SUCCESS) - return false; - - // Query for the data itself - std::vector data(size / 2 + 1); - DWORD bytesRead = size; // We want to read up to the size we got earlier - ret = RegQueryValueExW(regKey.GetKey(), key.c_str(), nullptr, &type, (LPBYTE)data.data(), &bytesRead); - if(ret != ERROR_SUCCESS) - return false; - - value = data.data(); - return true; -} - -bool Registry::Get(std::string path, std::string key, std::string& value) { - std::wstring wvalue; - bool ret = Get(convertStringToWide(path), convertStringToWide(key), wvalue); - value = convertWideString(wvalue); - return ret; -} - -bool Registry::Get(std::wstring path, std::wstring key, uint32_t& value) { - Key regKey(path); - if(!regKey.IsOpen()) - return false; - - // Query for the data - DWORD type, size = sizeof(DWORD), kvalue; - auto ret = RegQueryValueExW(regKey.GetKey(), key.c_str(), nullptr, &type, (LPBYTE)&kvalue, &size); - if(ret != ERROR_SUCCESS || type != REG_DWORD) - return false; - - value = kvalue; - return true; -} - -bool Registry::Get(std::string path, std::string key, uint32_t& value) { - return Get(convertStringToWide(path), convertStringToWide(key), value); -} diff --git a/platform/windows/strings.cpp b/platform/windows/strings.cpp deleted file mode 100644 index f8efce79..00000000 --- a/platform/windows/strings.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include - -#define WIN32_LEAN_AND_MEAN -#define NOMINMAX -#include - -#include - -// Helper function to convert UTF-16 to UTF-8 strings (wide to standard) -std::string icsneo::convertWideString(const std::wstring& value) { - // Get the width of the string (character count) - int width = WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)value.c_str(), -1, 0, 0, NULL, NULL); - // Create the new string - std::string new_string(width+1, '\0'); - // fill the new string with the converted characters - WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)value.c_str(), -1, new_string.data(), width, NULL, NULL); - return new_string; -}; - -// Helper function to convert UTF-8 to UTF-16 strings (standard to wide) -std::wstring icsneo::convertStringToWide(const std::string& value) { - // Get the width of the string (character count) - int width = MultiByteToWideChar(CP_UTF8, 0, value.c_str(), -1, NULL, 0); - // Create the new string - std::wstring new_string(width+1, '\0'); - // fill the new string with the converted characters - MultiByteToWideChar(CP_UTF8, 0, value.c_str(), -1, (LPWSTR)new_string.data(), width); - return new_string; -} \ No newline at end of file diff --git a/test/unit/windowsstrings.cpp b/test/unit/windowsstrings.cpp deleted file mode 100644 index 86e3c747..00000000 --- a/test/unit/windowsstrings.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include - -#include - -#include - -TEST(WindowsUtilTest, testConvertWideString) { -#ifdef WIN32 - std::wstring wideString(L"Hello World!"); - auto normalString = icsneo::convertWideString(wideString); - - ASSERT_STREQ(normalString.c_str(), "Hello World!"); -#endif -} - -TEST(WindowsUtilTest, testConvertStringToWide) { -#ifdef WIN32 - std::string normalString("Hello World!"); - auto wideString = icsneo::convertStringToWide(normalString); - - ASSERT_STREQ(wideString.c_str(), L"Hello World!"); -#endif -} \ No newline at end of file diff --git a/third-party/winpcap/include/Packet32.h b/third-party/winpcap/include/Packet32.h deleted file mode 100644 index 64be055d..00000000 --- a/third-party/winpcap/include/Packet32.h +++ /dev/null @@ -1,359 +0,0 @@ -/* - * Copyright (c) 1999 - 2005 NetGroup, Politecnico di Torino (Italy) - * Copyright (c) 2005 - 2007 CACE Technologies, Davis (California) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Politecnico di Torino, CACE Technologies - * nor the names of its contributors may be used to endorse or promote - * products derived from this software without specific prior written - * permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/** @ingroup packetapi - * @{ - */ - -/** @defgroup packet32h Packet.dll definitions and data structures - * Packet32.h contains the data structures and the definitions used by packet.dll. - * The file is used both by the Win9x and the WinNTx versions of packet.dll, and can be included - * by the applications that use the functions of this library - * @{ - */ - -#ifndef __PACKET32 -#define __PACKET32 - -#include - -#ifdef HAVE_AIRPCAP_API -#include -#else -#if !defined(AIRPCAP_HANDLE__EAE405F5_0171_9592_B3C2_C19EC426AD34__DEFINED_) -#define AIRPCAP_HANDLE__EAE405F5_0171_9592_B3C2_C19EC426AD34__DEFINED_ -typedef struct _AirpcapHandle *PAirpcapHandle; -#endif /* AIRPCAP_HANDLE__EAE405F5_0171_9592_B3C2_C19EC426AD34__DEFINED_ */ -#endif /* HAVE_AIRPCAP_API */ - -#ifdef HAVE_DAG_API -#include -#endif /* HAVE_DAG_API */ - -// Working modes -#define PACKET_MODE_CAPT 0x0 ///< Capture mode -#define PACKET_MODE_STAT 0x1 ///< Statistical mode -#define PACKET_MODE_MON 0x2 ///< Monitoring mode -#define PACKET_MODE_DUMP 0x10 ///< Dump mode -#define PACKET_MODE_STAT_DUMP MODE_DUMP | MODE_STAT ///< Statistical dump Mode - - -/// Alignment macro. Defines the alignment size. -#define Packet_ALIGNMENT sizeof(int) -/// Alignment macro. Rounds up to the next even multiple of Packet_ALIGNMENT. -#define Packet_WORDALIGN(x) (((x)+(Packet_ALIGNMENT-1))&~(Packet_ALIGNMENT-1)) - -#define NdisMediumNull -1 ///< Custom linktype: NDIS doesn't provide an equivalent -#define NdisMediumCHDLC -2 ///< Custom linktype: NDIS doesn't provide an equivalent -#define NdisMediumPPPSerial -3 ///< Custom linktype: NDIS doesn't provide an equivalent -#define NdisMediumBare80211 -4 ///< Custom linktype: NDIS doesn't provide an equivalent -#define NdisMediumRadio80211 -5 ///< Custom linktype: NDIS doesn't provide an equivalent -#define NdisMediumPpi -6 ///< Custom linktype: NDIS doesn't provide an equivalent - -// Loopback behaviour definitions -#define NPF_DISABLE_LOOPBACK 1 ///< Drop the packets sent by the NPF driver -#define NPF_ENABLE_LOOPBACK 2 ///< Capture the packets sent by the NPF driver - -/*! - \brief Network type structure. - - This structure is used by the PacketGetNetType() function to return information on the current adapter's type and speed. -*/ -typedef struct NetType -{ - UINT LinkType; ///< The MAC of the current network adapter (see function PacketGetNetType() for more information) - ULONGLONG LinkSpeed; ///< The speed of the network in bits per second -}NetType; - - -//some definitions stolen from libpcap - -#ifndef BPF_MAJOR_VERSION - -/*! - \brief A BPF pseudo-assembly program. - - The program will be injected in the kernel by the PacketSetBPF() function and applied to every incoming packet. -*/ -struct bpf_program -{ - UINT bf_len; ///< Indicates the number of instructions of the program, i.e. the number of struct bpf_insn that will follow. - struct bpf_insn *bf_insns; ///< A pointer to the first instruction of the program. -}; - -/*! - \brief A single BPF pseudo-instruction. - - bpf_insn contains a single instruction for the BPF register-machine. It is used to send a filter program to the driver. -*/ -struct bpf_insn -{ - USHORT code; ///< Instruction type and addressing mode. - UCHAR jt; ///< Jump if true - UCHAR jf; ///< Jump if false - int k; ///< Generic field used for various purposes. -}; - -/*! - \brief Structure that contains a couple of statistics values on the current capture. - - It is used by packet.dll to return statistics about a capture session. -*/ -struct bpf_stat -{ - UINT bs_recv; ///< Number of packets that the driver received from the network adapter - ///< from the beginning of the current capture. This value includes the packets - ///< lost by the driver. - UINT bs_drop; ///< number of packets that the driver lost from the beginning of a capture. - ///< Basically, a packet is lost when the the buffer of the driver is full. - ///< In this situation the packet cannot be stored and the driver rejects it. - UINT ps_ifdrop; ///< drops by interface. XXX not yet supported - UINT bs_capt; ///< number of packets that pass the filter, find place in the kernel buffer and - ///< thus reach the application. -}; - -/*! - \brief Packet header. - - This structure defines the header associated with every packet delivered to the application. -*/ -struct bpf_hdr -{ - struct timeval bh_tstamp; ///< The timestamp associated with the captured packet. - ///< It is stored in a TimeVal structure. - UINT bh_caplen; ///< Length of captured portion. The captured portion can be different - ///< from the original packet, because it is possible (with a proper filter) - ///< to instruct the driver to capture only a portion of the packets. - UINT bh_datalen; ///< Original length of packet - USHORT bh_hdrlen; ///< Length of bpf header (this struct plus alignment padding). In some cases, - ///< a padding could be added between the end of this structure and the packet - ///< data for performance reasons. This filed can be used to retrieve the actual data - ///< of the packet. -}; - -/*! - \brief Dump packet header. - - This structure defines the header associated with the packets in a buffer to be used with PacketSendPackets(). - It is simpler than the bpf_hdr, because it corresponds to the header associated by WinPcap and libpcap to a - packet in a dump file. This makes straightforward sending WinPcap dump files to the network. -*/ -struct dump_bpf_hdr{ - struct timeval ts; ///< Time stamp of the packet - UINT caplen; ///< Length of captured portion. The captured portion can smaller than the - ///< the original packet, because it is possible (with a proper filter) to - ///< instruct the driver to capture only a portion of the packets. - UINT len; ///< Length of the original packet (off wire). -}; - - -#endif - -struct bpf_stat; - -#define DOSNAMEPREFIX TEXT("Packet_") ///< Prefix added to the adapters device names to create the WinPcap devices -#define MAX_LINK_NAME_LENGTH 64 //< Maximum length of the devices symbolic links -#define NMAX_PACKET 65535 - -/*! - \brief Addresses of a network adapter. - - This structure is used by the PacketGetNetInfoEx() function to return the IP addresses associated with - an adapter. -*/ -typedef struct npf_if_addr { - struct sockaddr_storage IPAddress; ///< IP address. - struct sockaddr_storage SubnetMask; ///< Netmask for that address. - struct sockaddr_storage Broadcast; ///< Broadcast address. -}npf_if_addr; - - -#define ADAPTER_NAME_LENGTH 256 + 12 ///< Maximum length for the name of an adapter. The value is the same used by the IP Helper API. -#define ADAPTER_DESC_LENGTH 128 ///< Maximum length for the description of an adapter. The value is the same used by the IP Helper API. -#define MAX_MAC_ADDR_LENGTH 8 ///< Maximum length for the link layer address of an adapter. The value is the same used by the IP Helper API. -#define MAX_NETWORK_ADDRESSES 16 ///< Maximum length for the link layer address of an adapter. The value is the same used by the IP Helper API. - - -typedef struct WAN_ADAPTER_INT WAN_ADAPTER; ///< Describes an opened wan (dialup, VPN...) network adapter using the NetMon API -typedef WAN_ADAPTER *PWAN_ADAPTER; ///< Describes an opened wan (dialup, VPN...) network adapter using the NetMon API - -#define INFO_FLAG_NDIS_ADAPTER 0 ///< Flag for ADAPTER_INFO: this is a traditional ndis adapter -#define INFO_FLAG_NDISWAN_ADAPTER 1 ///< Flag for ADAPTER_INFO: this is a NdisWan adapter, and it's managed by WANPACKET -#define INFO_FLAG_DAG_CARD 2 ///< Flag for ADAPTER_INFO: this is a DAG card -#define INFO_FLAG_DAG_FILE 6 ///< Flag for ADAPTER_INFO: this is a DAG file -#define INFO_FLAG_DONT_EXPORT 8 ///< Flag for ADAPTER_INFO: when this flag is set, the adapter will not be listed or openend by winpcap. This allows to prevent exporting broken network adapters, like for example FireWire ones. -#define INFO_FLAG_AIRPCAP_CARD 16 ///< Flag for ADAPTER_INFO: this is an airpcap card -#define INFO_FLAG_NPFIM_DEVICE 32 - -/*! - \brief Describes an opened network adapter. - - This structure is the most important for the functioning of packet.dll, but the great part of its fields - should be ignored by the user, since the library offers functions that avoid to cope with low-level parameters -*/ -typedef struct _ADAPTER { - HANDLE hFile; ///< \internal Handle to an open instance of the NPF driver. - CHAR SymbolicLink[MAX_LINK_NAME_LENGTH]; ///< \internal A string containing the name of the network adapter currently opened. - int NumWrites; ///< \internal Number of times a packets written on this adapter will be repeated - ///< on the wire. - HANDLE ReadEvent; ///< A notification event associated with the read calls on the adapter. - ///< It can be passed to standard Win32 functions (like WaitForSingleObject - ///< or WaitForMultipleObjects) to wait until the driver's buffer contains some - ///< data. It is particularly useful in GUI applications that need to wait - ///< concurrently on several events. In Windows NT/2000 the PacketSetMinToCopy() - ///< function can be used to define the minimum amount of data in the kernel buffer - ///< that will cause the event to be signalled. - - UINT ReadTimeOut; ///< \internal The amount of time after which a read on the driver will be released and - ///< ReadEvent will be signaled, also if no packets were captured - CHAR Name[ADAPTER_NAME_LENGTH]; - PWAN_ADAPTER pWanAdapter; - UINT Flags; ///< Adapter's flags. Tell if this adapter must be treated in a different way, using the Netmon API or the dagc API. - -#ifdef HAVE_AIRPCAP_API - PAirpcapHandle AirpcapAd; -#endif // HAVE_AIRPCAP_API - -#ifdef HAVE_NPFIM_API - void* NpfImHandle; -#endif // HAVE_NPFIM_API - -#ifdef HAVE_DAG_API - dagc_t *pDagCard; ///< Pointer to the dagc API adapter descriptor for this adapter - PCHAR DagBuffer; ///< Pointer to the buffer with the packets that is received from the DAG card - struct timeval DagReadTimeout; ///< Read timeout. The dagc API requires a timeval structure - unsigned DagFcsLen; ///< Length of the frame check sequence attached to any packet by the card. Obtained from the registry - DWORD DagFastProcess; ///< True if the user requests fast capture processing on this card. Higher level applications can use this value to provide a faster but possibly unprecise capture (for example, libpcap doesn't convert the timestamps). -#endif // HAVE_DAG_API -} ADAPTER, *LPADAPTER; - -/*! - \brief Structure that contains a group of packets coming from the driver. - - This structure defines the header associated with every packet delivered to the application. -*/ -typedef struct _PACKET { - HANDLE hEvent; ///< \deprecated Still present for compatibility with old applications. - OVERLAPPED OverLapped; ///< \deprecated Still present for compatibility with old applications. - PVOID Buffer; ///< Buffer with containing the packets. See the PacketReceivePacket() for - ///< details about the organization of the data in this buffer - UINT Length; ///< Length of the buffer - DWORD ulBytesReceived; ///< Number of valid bytes present in the buffer, i.e. amount of data - ///< received by the last call to PacketReceivePacket() - BOOLEAN bIoComplete; ///< \deprecated Still present for compatibility with old applications. -} PACKET, *LPPACKET; - -/*! - \brief Structure containing an OID request. - - It is used by the PacketRequest() function to send an OID to the interface card driver. - It can be used, for example, to retrieve the status of the error counters on the adapter, its MAC address, - the list of the multicast groups defined on it, and so on. -*/ -struct _PACKET_OID_DATA { - ULONG Oid; ///< OID code. See the Microsoft DDK documentation or the file ntddndis.h - ///< for a complete list of valid codes. - ULONG Length; ///< Length of the data field - UCHAR Data[1]; ///< variable-lenght field that contains the information passed to or received - ///< from the adapter. -}; -typedef struct _PACKET_OID_DATA PACKET_OID_DATA, *PPACKET_OID_DATA; - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @} - */ - -/* -BOOLEAN QueryWinPcapRegistryStringA(CHAR *SubKeyName, - CHAR *Value, - UINT *pValueLen, - CHAR *DefaultVal); - -BOOLEAN QueryWinPcapRegistryStringW(WCHAR *SubKeyName, - WCHAR *Value, - UINT *pValueLen, - WCHAR *DefaultVal); -*/ - -//--------------------------------------------------------------------------- -// EXPORTED FUNCTIONS -//--------------------------------------------------------------------------- - -PCHAR PacketGetVersion(); -PCHAR PacketGetDriverVersion(); -BOOLEAN PacketSetMinToCopy(LPADAPTER AdapterObject,int nbytes); -BOOLEAN PacketSetNumWrites(LPADAPTER AdapterObject,int nwrites); -BOOLEAN PacketSetMode(LPADAPTER AdapterObject,int mode); -BOOLEAN PacketSetReadTimeout(LPADAPTER AdapterObject,int timeout); -BOOLEAN PacketSetBpf(LPADAPTER AdapterObject,struct bpf_program *fp); -BOOLEAN PacketSetLoopbackBehavior(LPADAPTER AdapterObject, UINT LoopbackBehavior); -INT PacketSetSnapLen(LPADAPTER AdapterObject,int snaplen); -BOOLEAN PacketGetStats(LPADAPTER AdapterObject,struct bpf_stat *s); -BOOLEAN PacketGetStatsEx(LPADAPTER AdapterObject,struct bpf_stat *s); -BOOLEAN PacketSetBuff(LPADAPTER AdapterObject,int dim); -BOOLEAN PacketGetNetType (LPADAPTER AdapterObject,NetType *type); -LPADAPTER PacketOpenAdapter(PCHAR AdapterName); -BOOLEAN PacketSendPacket(LPADAPTER AdapterObject,LPPACKET pPacket,BOOLEAN Sync); -INT PacketSendPackets(LPADAPTER AdapterObject,PVOID PacketBuff,ULONG Size, BOOLEAN Sync); -LPPACKET PacketAllocatePacket(void); -VOID PacketInitPacket(LPPACKET lpPacket,PVOID Buffer,UINT Length); -VOID PacketFreePacket(LPPACKET lpPacket); -BOOLEAN PacketReceivePacket(LPADAPTER AdapterObject,LPPACKET lpPacket,BOOLEAN Sync); -BOOLEAN PacketSetHwFilter(LPADAPTER AdapterObject,ULONG Filter); -BOOLEAN PacketGetAdapterNames(PTSTR pStr,PULONG BufferSize); -BOOLEAN PacketGetNetInfoEx(PCHAR AdapterName, npf_if_addr* buffer, PLONG NEntries); -BOOLEAN PacketRequest(LPADAPTER AdapterObject,BOOLEAN Set,PPACKET_OID_DATA OidData); -HANDLE PacketGetReadEvent(LPADAPTER AdapterObject); -BOOLEAN PacketSetDumpName(LPADAPTER AdapterObject, void *name, int len); -BOOLEAN PacketSetDumpLimits(LPADAPTER AdapterObject, UINT maxfilesize, UINT maxnpacks); -BOOLEAN PacketIsDumpEnded(LPADAPTER AdapterObject, BOOLEAN sync); -BOOL PacketStopDriver(); -VOID PacketCloseAdapter(LPADAPTER lpAdapter); -BOOLEAN PacketStartOem(PCHAR errorString, UINT errorStringLength); -BOOLEAN PacketStartOemEx(PCHAR errorString, UINT errorStringLength, ULONG flags); -PAirpcapHandle PacketGetAirPcapHandle(LPADAPTER AdapterObject); - -// -// Used by PacketStartOemEx -// -#define PACKET_START_OEM_NO_NETMON 0x00000001 - -#ifdef __cplusplus -} -#endif - -#endif //__PACKET32 diff --git a/third-party/winpcap/include/Win32-Extensions.h b/third-party/winpcap/include/Win32-Extensions.h deleted file mode 100644 index ad3be25c..00000000 --- a/third-party/winpcap/include/Win32-Extensions.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (c) 1999 - 2005 NetGroup, Politecnico di Torino (Italy) - * Copyright (c) 2005 - 2006 CACE Technologies, Davis (California) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Politecnico di Torino, CACE Technologies - * nor the names of its contributors may be used to endorse or promote - * products derived from this software without specific prior written - * permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#ifndef __WIN32_EXTENSIONS_H__ -#define __WIN32_EXTENSIONS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Definitions */ - -/*! - \brief A queue of raw packets that will be sent to the network with pcap_sendqueue_transmit(). -*/ -struct pcap_send_queue -{ - u_int maxlen; ///< Maximum size of the the queue, in bytes. This variable contains the size of the buffer field. - u_int len; ///< Current size of the queue, in bytes. - char *buffer; ///< Buffer containing the packets to be sent. -}; - -typedef struct pcap_send_queue pcap_send_queue; - -/*! - \brief This typedef is a support for the pcap_get_airpcap_handle() function -*/ -#if !defined(AIRPCAP_HANDLE__EAE405F5_0171_9592_B3C2_C19EC426AD34__DEFINED_) -#define AIRPCAP_HANDLE__EAE405F5_0171_9592_B3C2_C19EC426AD34__DEFINED_ -typedef struct _AirpcapHandle *PAirpcapHandle; -#endif - -#define BPF_MEM_EX_IMM 0xc0 -#define BPF_MEM_EX_IND 0xe0 - -/*used for ST*/ -#define BPF_MEM_EX 0xc0 -#define BPF_TME 0x08 - -#define BPF_LOOKUP 0x90 -#define BPF_EXECUTE 0xa0 -#define BPF_INIT 0xb0 -#define BPF_VALIDATE 0xc0 -#define BPF_SET_ACTIVE 0xd0 -#define BPF_RESET 0xe0 -#define BPF_SET_MEMORY 0x80 -#define BPF_GET_REGISTER_VALUE 0x70 -#define BPF_SET_REGISTER_VALUE 0x60 -#define BPF_SET_WORKING 0x50 -#define BPF_SET_ACTIVE_READ 0x40 -#define BPF_SET_AUTODELETION 0x30 -#define BPF_SEPARATION 0xff - -/* Prototypes */ -pcap_send_queue* pcap_sendqueue_alloc(u_int memsize); - -void pcap_sendqueue_destroy(pcap_send_queue* queue); - -int pcap_sendqueue_queue(pcap_send_queue* queue, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data); - -u_int pcap_sendqueue_transmit(pcap_t *p, pcap_send_queue* queue, int sync); - -HANDLE pcap_getevent(pcap_t *p); - -struct pcap_stat *pcap_stats_ex(pcap_t *p, int *pcap_stat_size); - -int pcap_setuserbuffer(pcap_t *p, int size); - -int pcap_live_dump(pcap_t *p, char *filename, int maxsize, int maxpacks); - -int pcap_live_dump_ended(pcap_t *p, int sync); - -int pcap_offline_filter(struct bpf_program *prog, const struct pcap_pkthdr *header, const u_char *pkt_data); - -int pcap_start_oem(char* err_str, int flags); - -PAirpcapHandle pcap_get_airpcap_handle(pcap_t *p); - -#ifdef __cplusplus -} -#endif - -#endif //__WIN32_EXTENSIONS_H__ diff --git a/third-party/winpcap/include/bittypes.h b/third-party/winpcap/include/bittypes.h deleted file mode 100644 index 558a0b5c..00000000 --- a/third-party/winpcap/include/bittypes.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (C) 1999 WIDE Project. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the project nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -#ifndef _BITTYPES_H -#define _BITTYPES_H - -#ifndef HAVE_U_INT8_T - -#if SIZEOF_CHAR == 1 -typedef unsigned char u_int8_t; -typedef signed char int8_t; -#elif SIZEOF_INT == 1 -typedef unsigned int u_int8_t; -typedef signed int int8_t; -#else /* XXX */ -#error "there's no appropriate type for u_int8_t" -#endif -#define HAVE_U_INT8_T 1 -#define HAVE_INT8_T 1 - -#endif /* HAVE_U_INT8_T */ - -#ifndef HAVE_U_INT16_T - -#if SIZEOF_SHORT == 2 -typedef unsigned short u_int16_t; -typedef signed short int16_t; -#elif SIZEOF_INT == 2 -typedef unsigned int u_int16_t; -typedef signed int int16_t; -#elif SIZEOF_CHAR == 2 -typedef unsigned char u_int16_t; -typedef signed char int16_t; -#else /* XXX */ -#error "there's no appropriate type for u_int16_t" -#endif -#define HAVE_U_INT16_T 1 -#define HAVE_INT16_T 1 - -#endif /* HAVE_U_INT16_T */ - -#ifndef HAVE_U_INT32_T - -#if SIZEOF_INT == 4 -typedef unsigned int u_int32_t; -typedef signed int int32_t; -#elif SIZEOF_LONG == 4 -typedef unsigned long u_int32_t; -typedef signed long int32_t; -#elif SIZEOF_SHORT == 4 -typedef unsigned short u_int32_t; -typedef signed short int32_t; -#else /* XXX */ -#error "there's no appropriate type for u_int32_t" -#endif -#define HAVE_U_INT32_T 1 -#define HAVE_INT32_T 1 - -#endif /* HAVE_U_INT32_T */ - -#ifndef HAVE_U_INT64_T -#if SIZEOF_LONG_LONG == 8 -typedef unsigned long long u_int64_t; -typedef long long int64_t; -#elif defined(_MSC_EXTENSIONS) -typedef unsigned _int64 u_int64_t; -typedef _int64 int64_t; -#elif SIZEOF_INT == 8 -typedef unsigned int u_int64_t; -#elif SIZEOF_LONG == 8 -typedef unsigned long u_int64_t; -#elif SIZEOF_SHORT == 8 -typedef unsigned short u_int64_t; -#else /* XXX */ -#error "there's no appropriate type for u_int64_t" -#endif - -#endif /* HAVE_U_INT64_T */ - -#ifndef PRId64 -#ifdef _MSC_EXTENSIONS -#define PRId64 "I64d" -#else /* _MSC_EXTENSIONS */ -#define PRId64 "lld" -#endif /* _MSC_EXTENSIONS */ -#endif /* PRId64 */ - -#ifndef PRIo64 -#ifdef _MSC_EXTENSIONS -#define PRIo64 "I64o" -#else /* _MSC_EXTENSIONS */ -#define PRIo64 "llo" -#endif /* _MSC_EXTENSIONS */ -#endif /* PRIo64 */ - -#ifndef PRIx64 -#ifdef _MSC_EXTENSIONS -#define PRIx64 "I64x" -#else /* _MSC_EXTENSIONS */ -#define PRIx64 "llx" -#endif /* _MSC_EXTENSIONS */ -#endif /* PRIx64 */ - -#ifndef PRIu64 -#ifdef _MSC_EXTENSIONS -#define PRIu64 "I64u" -#else /* _MSC_EXTENSIONS */ -#define PRIu64 "llu" -#endif /* _MSC_EXTENSIONS */ -#endif /* PRIu64 */ - -#endif /* _BITTYPES_H */ diff --git a/third-party/winpcap/include/ip6_misc.h b/third-party/winpcap/include/ip6_misc.h deleted file mode 100644 index 562fa618..00000000 --- a/third-party/winpcap/include/ip6_misc.h +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (c) 1993, 1994, 1997 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that: (1) source code distributions - * retain the above copyright notice and this paragraph in its entirety, (2) - * distributions including binary code include the above copyright notice and - * this paragraph in its entirety in the documentation or other materials - * provided with the distribution, and (3) all advertising materials mentioning - * features or use of this software display the following acknowledgement: - * ``This product includes software developed by the University of California, - * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of - * the University nor the names of its contributors may be used to endorse - * or promote products derived from this software without specific prior - * written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * @(#) $Header: /tcpdump/master/libpcap/Win32/Include/ip6_misc.h,v 1.5 2006-01-22 18:02:18 gianluca Exp $ (LBL) - */ - -/* - * This file contains a collage of declarations for IPv6 from FreeBSD not present in Windows - */ - -#include - -#include - -#ifndef __MINGW32__ -#define IN_MULTICAST(a) IN_CLASSD(a) -#endif - -#define IN_EXPERIMENTAL(a) ((((u_int32_t) (a)) & 0xf0000000) == 0xf0000000) - -#define IN_LOOPBACKNET 127 - -#if defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF) -/* IPv6 address */ -struct in6_addr - { - union - { - u_int8_t u6_addr8[16]; - u_int16_t u6_addr16[8]; - u_int32_t u6_addr32[4]; - } in6_u; -#define s6_addr in6_u.u6_addr8 -#define s6_addr16 in6_u.u6_addr16 -#define s6_addr32 in6_u.u6_addr32 -#define s6_addr64 in6_u.u6_addr64 - }; - -#define IN6ADDR_ANY_INIT { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } -#define IN6ADDR_LOOPBACK_INIT { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } -#endif /* __MINGW32__ */ - - -#if (defined _MSC_VER) || (defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF)) -typedef unsigned short sa_family_t; -#endif - - -#if defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF) - -#define __SOCKADDR_COMMON(sa_prefix) \ - sa_family_t sa_prefix##family - -/* Ditto, for IPv6. */ -struct sockaddr_in6 - { - __SOCKADDR_COMMON (sin6_); - u_int16_t sin6_port; /* Transport layer port # */ - u_int32_t sin6_flowinfo; /* IPv6 flow information */ - struct in6_addr sin6_addr; /* IPv6 address */ - }; - -#define IN6_IS_ADDR_V4MAPPED(a) \ - ((((u_int32_t *) (a))[0] == 0) && (((u_int32_t *) (a))[1] == 0) && \ - (((u_int32_t *) (a))[2] == htonl (0xffff))) - -#define IN6_IS_ADDR_MULTICAST(a) (((u_int8_t *) (a))[0] == 0xff) - -#define IN6_IS_ADDR_LINKLOCAL(a) \ - ((((u_int32_t *) (a))[0] & htonl (0xffc00000)) == htonl (0xfe800000)) - -#define IN6_IS_ADDR_LOOPBACK(a) \ - (((u_int32_t *) (a))[0] == 0 && ((u_int32_t *) (a))[1] == 0 && \ - ((u_int32_t *) (a))[2] == 0 && ((u_int32_t *) (a))[3] == htonl (1)) -#endif /* __MINGW32__ */ - -#define ip6_vfc ip6_ctlun.ip6_un2_vfc -#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow -#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen -#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt -#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim -#define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim - -#define nd_rd_type nd_rd_hdr.icmp6_type -#define nd_rd_code nd_rd_hdr.icmp6_code -#define nd_rd_cksum nd_rd_hdr.icmp6_cksum -#define nd_rd_reserved nd_rd_hdr.icmp6_data32[0] - -/* - * IPV6 extension headers - */ -#define IPPROTO_HOPOPTS 0 /* IPv6 hop-by-hop options */ -#define IPPROTO_IPV6 41 /* IPv6 header. */ -#define IPPROTO_ROUTING 43 /* IPv6 routing header */ -#define IPPROTO_FRAGMENT 44 /* IPv6 fragmentation header */ -#define IPPROTO_ESP 50 /* encapsulating security payload */ -#define IPPROTO_AH 51 /* authentication header */ -#define IPPROTO_ICMPV6 58 /* ICMPv6 */ -#define IPPROTO_NONE 59 /* IPv6 no next header */ -#define IPPROTO_DSTOPTS 60 /* IPv6 destination options */ -#define IPPROTO_PIM 103 /* Protocol Independent Multicast. */ - -#define IPV6_RTHDR_TYPE_0 0 - -/* Option types and related macros */ -#define IP6OPT_PAD1 0x00 /* 00 0 00000 */ -#define IP6OPT_PADN 0x01 /* 00 0 00001 */ -#define IP6OPT_JUMBO 0xC2 /* 11 0 00010 = 194 */ -#define IP6OPT_JUMBO_LEN 6 -#define IP6OPT_ROUTER_ALERT 0x05 /* 00 0 00101 */ - -#define IP6OPT_RTALERT_LEN 4 -#define IP6OPT_RTALERT_MLD 0 /* Datagram contains an MLD message */ -#define IP6OPT_RTALERT_RSVP 1 /* Datagram contains an RSVP message */ -#define IP6OPT_RTALERT_ACTNET 2 /* contains an Active Networks msg */ -#define IP6OPT_MINLEN 2 - -#define IP6OPT_BINDING_UPDATE 0xc6 /* 11 0 00110 */ -#define IP6OPT_BINDING_ACK 0x07 /* 00 0 00111 */ -#define IP6OPT_BINDING_REQ 0x08 /* 00 0 01000 */ -#define IP6OPT_HOME_ADDRESS 0xc9 /* 11 0 01001 */ -#define IP6OPT_EID 0x8a /* 10 0 01010 */ - -#define IP6OPT_TYPE(o) ((o) & 0xC0) -#define IP6OPT_TYPE_SKIP 0x00 -#define IP6OPT_TYPE_DISCARD 0x40 -#define IP6OPT_TYPE_FORCEICMP 0x80 -#define IP6OPT_TYPE_ICMP 0xC0 - -#define IP6OPT_MUTABLE 0x20 - - -#if defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF) -#ifndef EAI_ADDRFAMILY -struct addrinfo { - int ai_flags; /* AI_PASSIVE, AI_CANONNAME */ - int ai_family; /* PF_xxx */ - int ai_socktype; /* SOCK_xxx */ - int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */ - size_t ai_addrlen; /* length of ai_addr */ - char *ai_canonname; /* canonical name for hostname */ - struct sockaddr *ai_addr; /* binary address */ - struct addrinfo *ai_next; /* next structure in linked list */ -}; -#endif -#endif /* __MINGW32__ */ diff --git a/third-party/winpcap/include/pcap-bpf.h b/third-party/winpcap/include/pcap-bpf.h deleted file mode 100644 index 5fe129db..00000000 --- a/third-party/winpcap/include/pcap-bpf.h +++ /dev/null @@ -1,47 +0,0 @@ -/*- - * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from the Stanford/CMU enet packet filter, - * (net/enet.c) distributed as part of 4.3BSD, and code contributed - * to Berkeley by Steven McCanne and Van Jacobson both of Lawrence - * Berkeley Laboratory. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#) $Header: /tcpdump/master/libpcap/pcap-bpf.h,v 1.50 2007/04/01 21:43:55 guy Exp $ (LBL) - */ - -/* - * For backwards compatibility. - * - * Note to OS vendors: do NOT get rid of this file! Some applications - * might expect to be able to include . - */ -#include diff --git a/third-party/winpcap/include/pcap-namedb.h b/third-party/winpcap/include/pcap-namedb.h deleted file mode 100644 index 80a2f004..00000000 --- a/third-party/winpcap/include/pcap-namedb.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 1994, 1996 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the Computer Systems - * Engineering Group at Lawrence Berkeley Laboratory. - * 4. Neither the name of the University nor of the Laboratory may be used - * to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#) $Header: /tcpdump/master/libpcap/pcap-namedb.h,v 1.13 2006/10/04 18:13:32 guy Exp $ (LBL) - */ - -/* - * For backwards compatibility. - * - * Note to OS vendors: do NOT get rid of this file! Some applications - * might expect to be able to include . - */ -#include diff --git a/third-party/winpcap/include/pcap-stdinc.h b/third-party/winpcap/include/pcap-stdinc.h deleted file mode 100644 index edb88170..00000000 --- a/third-party/winpcap/include/pcap-stdinc.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2002 - 2005 NetGroup, Politecnico di Torino (Italy) - * Copyright (c) 2005 - 2009 CACE Technologies, Inc. Davis (California) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Politecnico di Torino nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @(#) $Header: /tcpdump/master/libpcap/pcap-stdinc.h,v 1.10.2.1 2008-10-06 15:38:39 gianluca Exp $ (LBL) - */ - -#define SIZEOF_CHAR 1 -#define SIZEOF_SHORT 2 -#define SIZEOF_INT 4 -#ifndef _MSC_EXTENSIONS -#define SIZEOF_LONG_LONG 8 -#endif - -/* - * Avoids a compiler warning in case this was already defined - * (someone defined _WINSOCKAPI_ when including 'windows.h', in order - * to prevent it from including 'winsock.h') - */ -#ifdef _WINSOCKAPI_ -#undef _WINSOCKAPI_ -#endif -#include - -#include - -#include "bittypes.h" -#include -#include - -#ifndef __MINGW32__ -#include "ip6_misc.h" -#endif - -#define caddr_t char* - -#ifdef __MSC_VER -#if _MSC_VER < 1500 -#define snprintf _snprintf -#define vsnprintf _vsnprintf -#define strdup _strdup -#endif -#endif // __MSC_VER - -//#define inline __inline - -#ifdef __MINGW32__ -#include -#else /*__MINGW32__*/ -/* MSVC compiler */ -#ifndef _UINTPTR_T_DEFINED -#ifdef _WIN64 -typedef unsigned __int64 uintptr_t; -#else -typedef _W64 unsigned int uintptr_t; -#endif -#define _UINTPTR_T_DEFINED -#endif - -#ifndef _INTPTR_T_DEFINED -#ifdef _WIN64 -typedef __int64 intptr_t; -#else -typedef _W64 int intptr_t; -#endif -#define _INTPTR_T_DEFINED -#endif - -#endif /*__MINGW32__*/ diff --git a/third-party/winpcap/include/pcap.h b/third-party/winpcap/include/pcap.h deleted file mode 100644 index 935f9494..00000000 --- a/third-party/winpcap/include/pcap.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 1993, 1994, 1995, 1996, 1997 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the Computer Systems - * Engineering Group at Lawrence Berkeley Laboratory. - * 4. Neither the name of the University nor of the Laboratory may be used - * to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#) $Header: /tcpdump/master/libpcap/pcap.h,v 1.59 2006/10/04 18:09:22 guy Exp $ (LBL) - */ - -/* - * For backwards compatibility. - * - * Note to OS vendors: do NOT get rid of this file! Many applications - * expect to be able to include , and at least some of them - * go through contortions in their configure scripts to try to detect - * OSes that have "helpfully" moved pcap.h to without - * leaving behind a file. - */ -#include diff --git a/third-party/winpcap/include/pcap/bluetooth.h b/third-party/winpcap/include/pcap/bluetooth.h deleted file mode 100644 index 7bf65df0..00000000 --- a/third-party/winpcap/include/pcap/bluetooth.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2006 Paolo Abeni (Italy) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote - * products derived from this software without specific prior written - * permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * bluetooth data struct - * By Paolo Abeni - * - * @(#) $Header: /tcpdump/master/libpcap/pcap/bluetooth.h,v 1.1 2007/09/22 02:10:17 guy Exp $ - */ - -#ifndef _PCAP_BLUETOOTH_STRUCTS_H__ -#define _PCAP_BLUETOOTH_STRUCTS_H__ - -/* - * Header prepended libpcap to each bluetooth h:4 frame. - * fields are in network byte order - */ -typedef struct _pcap_bluetooth_h4_header { - u_int32_t direction; /* if first bit is set direction is incoming */ -} pcap_bluetooth_h4_header; - - -#endif diff --git a/third-party/winpcap/include/pcap/bpf.h b/third-party/winpcap/include/pcap/bpf.h deleted file mode 100644 index 9f4ca33e..00000000 --- a/third-party/winpcap/include/pcap/bpf.h +++ /dev/null @@ -1,934 +0,0 @@ -/*- - * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from the Stanford/CMU enet packet filter, - * (net/enet.c) distributed as part of 4.3BSD, and code contributed - * to Berkeley by Steven McCanne and Van Jacobson both of Lawrence - * Berkeley Laboratory. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)bpf.h 7.1 (Berkeley) 5/7/91 - * - * @(#) $Header: /tcpdump/master/libpcap/pcap/bpf.h,v 1.19.2.8 2008-09-22 20:16:01 guy Exp $ (LBL) - */ - -/* - * This is libpcap's cut-down version of bpf.h; it includes only - * the stuff needed for the code generator and the userland BPF - * interpreter, and the libpcap APIs for setting filters, etc.. - * - * "pcap-bpf.c" will include the native OS version, as it deals with - * the OS's BPF implementation. - * - * XXX - should this all just be moved to "pcap.h"? - */ - -#ifndef BPF_MAJOR_VERSION - -#ifdef __cplusplus -extern "C" { -#endif - -/* BSD style release date */ -#define BPF_RELEASE 199606 - -#ifdef MSDOS /* must be 32-bit */ -typedef long bpf_int32; -typedef unsigned long bpf_u_int32; -#else -typedef int bpf_int32; -typedef u_int bpf_u_int32; -#endif - -/* - * Alignment macros. BPF_WORDALIGN rounds up to the next - * even multiple of BPF_ALIGNMENT. - */ -#ifndef __NetBSD__ -#define BPF_ALIGNMENT sizeof(bpf_int32) -#else -#define BPF_ALIGNMENT sizeof(long) -#endif -#define BPF_WORDALIGN(x) (((x)+(BPF_ALIGNMENT-1))&~(BPF_ALIGNMENT-1)) - -#define BPF_MAXBUFSIZE 0x8000 -#define BPF_MINBUFSIZE 32 - -/* - * Structure for "pcap_compile()", "pcap_setfilter()", etc.. - */ -struct bpf_program { - u_int bf_len; - struct bpf_insn *bf_insns; -}; - -/* - * Struct return by BIOCVERSION. This represents the version number of - * the filter language described by the instruction encodings below. - * bpf understands a program iff kernel_major == filter_major && - * kernel_minor >= filter_minor, that is, if the value returned by the - * running kernel has the same major number and a minor number equal - * equal to or less than the filter being downloaded. Otherwise, the - * results are undefined, meaning an error may be returned or packets - * may be accepted haphazardly. - * It has nothing to do with the source code version. - */ -struct bpf_version { - u_short bv_major; - u_short bv_minor; -}; -/* Current version number of filter architecture. */ -#define BPF_MAJOR_VERSION 1 -#define BPF_MINOR_VERSION 1 - -/* - * Data-link level type codes. - * - * Do *NOT* add new values to this list without asking - * "tcpdump-workers@lists.tcpdump.org" for a value. Otherwise, you run - * the risk of using a value that's already being used for some other - * purpose, and of having tools that read libpcap-format captures not - * being able to handle captures with your new DLT_ value, with no hope - * that they will ever be changed to do so (as that would destroy their - * ability to read captures using that value for that other purpose). - */ - -/* - * These are the types that are the same on all platforms, and that - * have been defined by for ages. - */ -#define DLT_NULL 0 /* BSD loopback encapsulation */ -#define DLT_EN10MB 1 /* Ethernet (10Mb) */ -#define DLT_EN3MB 2 /* Experimental Ethernet (3Mb) */ -#define DLT_AX25 3 /* Amateur Radio AX.25 */ -#define DLT_PRONET 4 /* Proteon ProNET Token Ring */ -#define DLT_CHAOS 5 /* Chaos */ -#define DLT_IEEE802 6 /* 802.5 Token Ring */ -#define DLT_ARCNET 7 /* ARCNET, with BSD-style header */ -#define DLT_SLIP 8 /* Serial Line IP */ -#define DLT_PPP 9 /* Point-to-point Protocol */ -#define DLT_FDDI 10 /* FDDI */ - -/* - * These are types that are different on some platforms, and that - * have been defined by for ages. We use #ifdefs to - * detect the BSDs that define them differently from the traditional - * libpcap - * - * XXX - DLT_ATM_RFC1483 is 13 in BSD/OS, and DLT_RAW is 14 in BSD/OS, - * but I don't know what the right #define is for BSD/OS. - */ -#define DLT_ATM_RFC1483 11 /* LLC-encapsulated ATM */ - -#ifdef __OpenBSD__ -#define DLT_RAW 14 /* raw IP */ -#else -#define DLT_RAW 12 /* raw IP */ -#endif - -/* - * Given that the only OS that currently generates BSD/OS SLIP or PPP - * is, well, BSD/OS, arguably everybody should have chosen its values - * for DLT_SLIP_BSDOS and DLT_PPP_BSDOS, which are 15 and 16, but they - * didn't. So it goes. - */ -#if defined(__NetBSD__) || defined(__FreeBSD__) -#ifndef DLT_SLIP_BSDOS -#define DLT_SLIP_BSDOS 13 /* BSD/OS Serial Line IP */ -#define DLT_PPP_BSDOS 14 /* BSD/OS Point-to-point Protocol */ -#endif -#else -#define DLT_SLIP_BSDOS 15 /* BSD/OS Serial Line IP */ -#define DLT_PPP_BSDOS 16 /* BSD/OS Point-to-point Protocol */ -#endif - -/* - * 17 is used for DLT_OLD_PFLOG in OpenBSD; - * OBSOLETE: DLT_PFLOG is 117 in OpenBSD now as well. See below. - * 18 is used for DLT_PFSYNC in OpenBSD; don't use it for anything else. - */ - -#define DLT_ATM_CLIP 19 /* Linux Classical-IP over ATM */ - -/* - * Apparently Redback uses this for its SmartEdge 400/800. I hope - * nobody else decided to use it, too. - */ -#define DLT_REDBACK_SMARTEDGE 32 - -/* - * These values are defined by NetBSD; other platforms should refrain from - * using them for other purposes, so that NetBSD savefiles with link - * types of 50 or 51 can be read as this type on all platforms. - */ -#define DLT_PPP_SERIAL 50 /* PPP over serial with HDLC encapsulation */ -#define DLT_PPP_ETHER 51 /* PPP over Ethernet */ - -/* - * The Axent Raptor firewall - now the Symantec Enterprise Firewall - uses - * a link-layer type of 99 for the tcpdump it supplies. The link-layer - * header has 6 bytes of unknown data, something that appears to be an - * Ethernet type, and 36 bytes that appear to be 0 in at least one capture - * I've seen. - */ -#define DLT_SYMANTEC_FIREWALL 99 - -/* - * Values between 100 and 103 are used in capture file headers as - * link-layer types corresponding to DLT_ types that differ - * between platforms; don't use those values for new DLT_ new types. - */ - -/* - * This value was defined by libpcap 0.5; platforms that have defined - * it with a different value should define it here with that value - - * a link type of 104 in a save file will be mapped to DLT_C_HDLC, - * whatever value that happens to be, so programs will correctly - * handle files with that link type regardless of the value of - * DLT_C_HDLC. - * - * The name DLT_C_HDLC was used by BSD/OS; we use that name for source - * compatibility with programs written for BSD/OS. - * - * libpcap 0.5 defined it as DLT_CHDLC; we define DLT_CHDLC as well, - * for source compatibility with programs written for libpcap 0.5. - */ -#define DLT_C_HDLC 104 /* Cisco HDLC */ -#define DLT_CHDLC DLT_C_HDLC - -#define DLT_IEEE802_11 105 /* IEEE 802.11 wireless */ - -/* - * 106 is reserved for Linux Classical IP over ATM; it's like DLT_RAW, - * except when it isn't. (I.e., sometimes it's just raw IP, and - * sometimes it isn't.) We currently handle it as DLT_LINUX_SLL, - * so that we don't have to worry about the link-layer header.) - */ - -/* - * Frame Relay; BSD/OS has a DLT_FR with a value of 11, but that collides - * with other values. - * DLT_FR and DLT_FRELAY packets start with the Q.922 Frame Relay header - * (DLCI, etc.). - */ -#define DLT_FRELAY 107 - -/* - * OpenBSD DLT_LOOP, for loopback devices; it's like DLT_NULL, except - * that the AF_ type in the link-layer header is in network byte order. - * - * DLT_LOOP is 12 in OpenBSD, but that's DLT_RAW in other OSes, so - * we don't use 12 for it in OSes other than OpenBSD. - */ -#ifdef __OpenBSD__ -#define DLT_LOOP 12 -#else -#define DLT_LOOP 108 -#endif - -/* - * Encapsulated packets for IPsec; DLT_ENC is 13 in OpenBSD, but that's - * DLT_SLIP_BSDOS in NetBSD, so we don't use 13 for it in OSes other - * than OpenBSD. - */ -#ifdef __OpenBSD__ -#define DLT_ENC 13 -#else -#define DLT_ENC 109 -#endif - -/* - * Values between 110 and 112 are reserved for use in capture file headers - * as link-layer types corresponding to DLT_ types that might differ - * between platforms; don't use those values for new DLT_ types - * other than the corresponding DLT_ types. - */ - -/* - * This is for Linux cooked sockets. - */ -#define DLT_LINUX_SLL 113 - -/* - * Apple LocalTalk hardware. - */ -#define DLT_LTALK 114 - -/* - * Acorn Econet. - */ -#define DLT_ECONET 115 - -/* - * Reserved for use with OpenBSD ipfilter. - */ -#define DLT_IPFILTER 116 - -/* - * OpenBSD DLT_PFLOG; DLT_PFLOG is 17 in OpenBSD, but that's DLT_LANE8023 - * in SuSE 6.3, so we can't use 17 for it in capture-file headers. - * - * XXX: is there a conflict with DLT_PFSYNC 18 as well? - */ -#ifdef __OpenBSD__ -#define DLT_OLD_PFLOG 17 -#define DLT_PFSYNC 18 -#endif -#define DLT_PFLOG 117 - -/* - * Registered for Cisco-internal use. - */ -#define DLT_CISCO_IOS 118 - -/* - * For 802.11 cards using the Prism II chips, with a link-layer - * header including Prism monitor mode information plus an 802.11 - * header. - */ -#define DLT_PRISM_HEADER 119 - -/* - * Reserved for Aironet 802.11 cards, with an Aironet link-layer header - * (see Doug Ambrisko's FreeBSD patches). - */ -#define DLT_AIRONET_HEADER 120 - -/* - * Reserved for Siemens HiPath HDLC. - */ -#define DLT_HHDLC 121 - -/* - * This is for RFC 2625 IP-over-Fibre Channel. - * - * This is not for use with raw Fibre Channel, where the link-layer - * header starts with a Fibre Channel frame header; it's for IP-over-FC, - * where the link-layer header starts with an RFC 2625 Network_Header - * field. - */ -#define DLT_IP_OVER_FC 122 - -/* - * This is for Full Frontal ATM on Solaris with SunATM, with a - * pseudo-header followed by an AALn PDU. - * - * There may be other forms of Full Frontal ATM on other OSes, - * with different pseudo-headers. - * - * If ATM software returns a pseudo-header with VPI/VCI information - * (and, ideally, packet type information, e.g. signalling, ILMI, - * LANE, LLC-multiplexed traffic, etc.), it should not use - * DLT_ATM_RFC1483, but should get a new DLT_ value, so tcpdump - * and the like don't have to infer the presence or absence of a - * pseudo-header and the form of the pseudo-header. - */ -#define DLT_SUNATM 123 /* Solaris+SunATM */ - -/* - * Reserved as per request from Kent Dahlgren - * for private use. - */ -#define DLT_RIO 124 /* RapidIO */ -#define DLT_PCI_EXP 125 /* PCI Express */ -#define DLT_AURORA 126 /* Xilinx Aurora link layer */ - -/* - * Header for 802.11 plus a number of bits of link-layer information - * including radio information, used by some recent BSD drivers as - * well as the madwifi Atheros driver for Linux. - */ -#define DLT_IEEE802_11_RADIO 127 /* 802.11 plus radiotap radio header */ - -/* - * Reserved for the TZSP encapsulation, as per request from - * Chris Waters - * TZSP is a generic encapsulation for any other link type, - * which includes a means to include meta-information - * with the packet, e.g. signal strength and channel - * for 802.11 packets. - */ -#define DLT_TZSP 128 /* Tazmen Sniffer Protocol */ - -/* - * BSD's ARCNET headers have the source host, destination host, - * and type at the beginning of the packet; that's what's handed - * up to userland via BPF. - * - * Linux's ARCNET headers, however, have a 2-byte offset field - * between the host IDs and the type; that's what's handed up - * to userland via PF_PACKET sockets. - * - * We therefore have to have separate DLT_ values for them. - */ -#define DLT_ARCNET_LINUX 129 /* ARCNET */ - -/* - * Juniper-private data link types, as per request from - * Hannes Gredler . The DLT_s are used - * for passing on chassis-internal metainformation such as - * QOS profiles, etc.. - */ -#define DLT_JUNIPER_MLPPP 130 -#define DLT_JUNIPER_MLFR 131 -#define DLT_JUNIPER_ES 132 -#define DLT_JUNIPER_GGSN 133 -#define DLT_JUNIPER_MFR 134 -#define DLT_JUNIPER_ATM2 135 -#define DLT_JUNIPER_SERVICES 136 -#define DLT_JUNIPER_ATM1 137 - -/* - * Apple IP-over-IEEE 1394, as per a request from Dieter Siegmund - * . The header that's presented is an Ethernet-like - * header: - * - * #define FIREWIRE_EUI64_LEN 8 - * struct firewire_header { - * u_char firewire_dhost[FIREWIRE_EUI64_LEN]; - * u_char firewire_shost[FIREWIRE_EUI64_LEN]; - * u_short firewire_type; - * }; - * - * with "firewire_type" being an Ethernet type value, rather than, - * for example, raw GASP frames being handed up. - */ -#define DLT_APPLE_IP_OVER_IEEE1394 138 - -/* - * Various SS7 encapsulations, as per a request from Jeff Morriss - * and subsequent discussions. - */ -#define DLT_MTP2_WITH_PHDR 139 /* pseudo-header with various info, followed by MTP2 */ -#define DLT_MTP2 140 /* MTP2, without pseudo-header */ -#define DLT_MTP3 141 /* MTP3, without pseudo-header or MTP2 */ -#define DLT_SCCP 142 /* SCCP, without pseudo-header or MTP2 or MTP3 */ - -/* - * DOCSIS MAC frames. - */ -#define DLT_DOCSIS 143 - -/* - * Linux-IrDA packets. Protocol defined at http://www.irda.org. - * Those packets include IrLAP headers and above (IrLMP...), but - * don't include Phy framing (SOF/EOF/CRC & byte stuffing), because Phy - * framing can be handled by the hardware and depend on the bitrate. - * This is exactly the format you would get capturing on a Linux-IrDA - * interface (irdaX), but not on a raw serial port. - * Note the capture is done in "Linux-cooked" mode, so each packet include - * a fake packet header (struct sll_header). This is because IrDA packet - * decoding is dependant on the direction of the packet (incomming or - * outgoing). - * When/if other platform implement IrDA capture, we may revisit the - * issue and define a real DLT_IRDA... - * Jean II - */ -#define DLT_LINUX_IRDA 144 - -/* - * Reserved for IBM SP switch and IBM Next Federation switch. - */ -#define DLT_IBM_SP 145 -#define DLT_IBM_SN 146 - -/* - * Reserved for private use. If you have some link-layer header type - * that you want to use within your organization, with the capture files - * using that link-layer header type not ever be sent outside your - * organization, you can use these values. - * - * No libpcap release will use these for any purpose, nor will any - * tcpdump release use them, either. - * - * Do *NOT* use these in capture files that you expect anybody not using - * your private versions of capture-file-reading tools to read; in - * particular, do *NOT* use them in products, otherwise you may find that - * people won't be able to use tcpdump, or snort, or Ethereal, or... to - * read capture files from your firewall/intrusion detection/traffic - * monitoring/etc. appliance, or whatever product uses that DLT_ value, - * and you may also find that the developers of those applications will - * not accept patches to let them read those files. - * - * Also, do not use them if somebody might send you a capture using them - * for *their* private type and tools using them for *your* private type - * would have to read them. - * - * Instead, ask "tcpdump-workers@lists.tcpdump.org" for a new DLT_ value, - * as per the comment above, and use the type you're given. - */ -#define DLT_USER0 147 -#define DLT_USER1 148 -#define DLT_USER2 149 -#define DLT_USER3 150 -#define DLT_USER4 151 -#define DLT_USER5 152 -#define DLT_USER6 153 -#define DLT_USER7 154 -#define DLT_USER8 155 -#define DLT_USER9 156 -#define DLT_USER10 157 -#define DLT_USER11 158 -#define DLT_USER12 159 -#define DLT_USER13 160 -#define DLT_USER14 161 -#define DLT_USER15 162 - -/* - * For future use with 802.11 captures - defined by AbsoluteValue - * Systems to store a number of bits of link-layer information - * including radio information: - * - * http://www.shaftnet.org/~pizza/software/capturefrm.txt - * - * but it might be used by some non-AVS drivers now or in the - * future. - */ -#define DLT_IEEE802_11_RADIO_AVS 163 /* 802.11 plus AVS radio header */ - -/* - * Juniper-private data link type, as per request from - * Hannes Gredler . The DLT_s are used - * for passing on chassis-internal metainformation such as - * QOS profiles, etc.. - */ -#define DLT_JUNIPER_MONITOR 164 - -/* - * Reserved for BACnet MS/TP. - */ -#define DLT_BACNET_MS_TP 165 - -/* - * Another PPP variant as per request from Karsten Keil . - * - * This is used in some OSes to allow a kernel socket filter to distinguish - * between incoming and outgoing packets, on a socket intended to - * supply pppd with outgoing packets so it can do dial-on-demand and - * hangup-on-lack-of-demand; incoming packets are filtered out so they - * don't cause pppd to hold the connection up (you don't want random - * input packets such as port scans, packets from old lost connections, - * etc. to force the connection to stay up). - * - * The first byte of the PPP header (0xff03) is modified to accomodate - * the direction - 0x00 = IN, 0x01 = OUT. - */ -#define DLT_PPP_PPPD 166 - -/* - * Names for backwards compatibility with older versions of some PPP - * software; new software should use DLT_PPP_PPPD. - */ -#define DLT_PPP_WITH_DIRECTION DLT_PPP_PPPD -#define DLT_LINUX_PPP_WITHDIRECTION DLT_PPP_PPPD - -/* - * Juniper-private data link type, as per request from - * Hannes Gredler . The DLT_s are used - * for passing on chassis-internal metainformation such as - * QOS profiles, cookies, etc.. - */ -#define DLT_JUNIPER_PPPOE 167 -#define DLT_JUNIPER_PPPOE_ATM 168 - -#define DLT_GPRS_LLC 169 /* GPRS LLC */ -#define DLT_GPF_T 170 /* GPF-T (ITU-T G.7041/Y.1303) */ -#define DLT_GPF_F 171 /* GPF-F (ITU-T G.7041/Y.1303) */ - -/* - * Requested by Oolan Zimmer for use in Gcom's T1/E1 line - * monitoring equipment. - */ -#define DLT_GCOM_T1E1 172 -#define DLT_GCOM_SERIAL 173 - -/* - * Juniper-private data link type, as per request from - * Hannes Gredler . The DLT_ is used - * for internal communication to Physical Interface Cards (PIC) - */ -#define DLT_JUNIPER_PIC_PEER 174 - -/* - * Link types requested by Gregor Maier of Endace - * Measurement Systems. They add an ERF header (see - * http://www.endace.com/support/EndaceRecordFormat.pdf) in front of - * the link-layer header. - */ -#define DLT_ERF_ETH 175 /* Ethernet */ -#define DLT_ERF_POS 176 /* Packet-over-SONET */ - -/* - * Requested by Daniele Orlandi for raw LAPD - * for vISDN (http://www.orlandi.com/visdn/). Its link-layer header - * includes additional information before the LAPD header, so it's - * not necessarily a generic LAPD header. - */ -#define DLT_LINUX_LAPD 177 - -/* - * Juniper-private data link type, as per request from - * Hannes Gredler . - * The DLT_ are used for prepending meta-information - * like interface index, interface name - * before standard Ethernet, PPP, Frelay & C-HDLC Frames - */ -#define DLT_JUNIPER_ETHER 178 -#define DLT_JUNIPER_PPP 179 -#define DLT_JUNIPER_FRELAY 180 -#define DLT_JUNIPER_CHDLC 181 - -/* - * Multi Link Frame Relay (FRF.16) - */ -#define DLT_MFR 182 - -/* - * Juniper-private data link type, as per request from - * Hannes Gredler . - * The DLT_ is used for internal communication with a - * voice Adapter Card (PIC) - */ -#define DLT_JUNIPER_VP 183 - -/* - * Arinc 429 frames. - * DLT_ requested by Gianluca Varenni . - * Every frame contains a 32bit A429 label. - * More documentation on Arinc 429 can be found at - * http://www.condoreng.com/support/downloads/tutorials/ARINCTutorial.pdf - */ -#define DLT_A429 184 - -/* - * Arinc 653 Interpartition Communication messages. - * DLT_ requested by Gianluca Varenni . - * Please refer to the A653-1 standard for more information. - */ -#define DLT_A653_ICM 185 - -/* - * USB packets, beginning with a USB setup header; requested by - * Paolo Abeni . - */ -#define DLT_USB 186 - -/* - * Bluetooth HCI UART transport layer (part H:4); requested by - * Paolo Abeni. - */ -#define DLT_BLUETOOTH_HCI_H4 187 - -/* - * IEEE 802.16 MAC Common Part Sublayer; requested by Maria Cruz - * . - */ -#define DLT_IEEE802_16_MAC_CPS 188 - -/* - * USB packets, beginning with a Linux USB header; requested by - * Paolo Abeni . - */ -#define DLT_USB_LINUX 189 - -/* - * Controller Area Network (CAN) v. 2.0B packets. - * DLT_ requested by Gianluca Varenni . - * Used to dump CAN packets coming from a CAN Vector board. - * More documentation on the CAN v2.0B frames can be found at - * http://www.can-cia.org/downloads/?269 - */ -#define DLT_CAN20B 190 - -/* - * IEEE 802.15.4, with address fields padded, as is done by Linux - * drivers; requested by Juergen Schimmer. - */ -#define DLT_IEEE802_15_4_LINUX 191 - -/* - * Per Packet Information encapsulated packets. - * DLT_ requested by Gianluca Varenni . - */ -#define DLT_PPI 192 - -/* - * Header for 802.16 MAC Common Part Sublayer plus a radiotap radio header; - * requested by Charles Clancy. - */ -#define DLT_IEEE802_16_MAC_CPS_RADIO 193 - -/* - * Juniper-private data link type, as per request from - * Hannes Gredler . - * The DLT_ is used for internal communication with a - * integrated service module (ISM). - */ -#define DLT_JUNIPER_ISM 194 - -/* - * IEEE 802.15.4, exactly as it appears in the spec (no padding, no - * nothing); requested by Mikko Saarnivala . - */ -#define DLT_IEEE802_15_4 195 - -/* - * Various link-layer types, with a pseudo-header, for SITA - * (http://www.sita.aero/); requested by Fulko Hew (fulko.hew@gmail.com). - */ -#define DLT_SITA 196 - -/* - * Various link-layer types, with a pseudo-header, for Endace DAG cards; - * encapsulates Endace ERF records. Requested by Stephen Donnelly - * . - */ -#define DLT_ERF 197 - -/* - * Special header prepended to Ethernet packets when capturing from a - * u10 Networks board. Requested by Phil Mulholland - * . - */ -#define DLT_RAIF1 198 - -/* - * IPMB packet for IPMI, beginning with the I2C slave address, followed - * by the netFn and LUN, etc.. Requested by Chanthy Toeung - * . - */ -#define DLT_IPMB 199 - -/* - * Juniper-private data link type, as per request from - * Hannes Gredler . - * The DLT_ is used for capturing data on a secure tunnel interface. - */ -#define DLT_JUNIPER_ST 200 - -/* - * Bluetooth HCI UART transport layer (part H:4), with pseudo-header - * that includes direction information; requested by Paolo Abeni. - */ -#define DLT_BLUETOOTH_HCI_H4_WITH_PHDR 201 - -/* - * AX.25 packet with a 1-byte KISS header; see - * - * http://www.ax25.net/kiss.htm - * - * as per Richard Stearn . - */ -#define DLT_AX25_KISS 202 - -/* - * LAPD packets from an ISDN channel, starting with the address field, - * with no pseudo-header. - * Requested by Varuna De Silva . - */ -#define DLT_LAPD 203 - -/* - * Variants of various link-layer headers, with a one-byte direction - * pseudo-header prepended - zero means "received by this host", - * non-zero (any non-zero value) means "sent by this host" - as per - * Will Barker . - */ -#define DLT_PPP_WITH_DIR 204 /* PPP - don't confuse with DLT_PPP_WITH_DIRECTION */ -#define DLT_C_HDLC_WITH_DIR 205 /* Cisco HDLC */ -#define DLT_FRELAY_WITH_DIR 206 /* Frame Relay */ -#define DLT_LAPB_WITH_DIR 207 /* LAPB */ - -/* - * 208 is reserved for an as-yet-unspecified proprietary link-layer - * type, as requested by Will Barker. - */ - -/* - * IPMB with a Linux-specific pseudo-header; as requested by Alexey Neyman - * . - */ -#define DLT_IPMB_LINUX 209 - -/* - * FlexRay automotive bus - http://www.flexray.com/ - as requested - * by Hannes Kaelber . - */ -#define DLT_FLEXRAY 210 - -/* - * Media Oriented Systems Transport (MOST) bus for multimedia - * transport - http://www.mostcooperation.com/ - as requested - * by Hannes Kaelber . - */ -#define DLT_MOST 211 - -/* - * Local Interconnect Network (LIN) bus for vehicle networks - - * http://www.lin-subbus.org/ - as requested by Hannes Kaelber - * . - */ -#define DLT_LIN 212 - -/* - * X2E-private data link type used for serial line capture, - * as requested by Hannes Kaelber . - */ -#define DLT_X2E_SERIAL 213 - -/* - * X2E-private data link type used for the Xoraya data logger - * family, as requested by Hannes Kaelber . - */ -#define DLT_X2E_XORAYA 214 - -/* - * IEEE 802.15.4, exactly as it appears in the spec (no padding, no - * nothing), but with the PHY-level data for non-ASK PHYs (4 octets - * of 0 as preamble, one octet of SFD, one octet of frame length+ - * reserved bit, and then the MAC-layer data, starting with the - * frame control field). - * - * Requested by Max Filippov . - */ -#define DLT_IEEE802_15_4_NONASK_PHY 215 - - -/* - * DLT and savefile link type values are split into a class and - * a member of that class. A class value of 0 indicates a regular - * DLT_/LINKTYPE_ value. - */ -#define DLT_CLASS(x) ((x) & 0x03ff0000) - -/* - * NetBSD-specific generic "raw" link type. The class value indicates - * that this is the generic raw type, and the lower 16 bits are the - * address family we're dealing with. Those values are NetBSD-specific; - * do not assume that they correspond to AF_ values for your operating - * system. - */ -#define DLT_CLASS_NETBSD_RAWAF 0x02240000 -#define DLT_NETBSD_RAWAF(af) (DLT_CLASS_NETBSD_RAWAF | (af)) -#define DLT_NETBSD_RAWAF_AF(x) ((x) & 0x0000ffff) -#define DLT_IS_NETBSD_RAWAF(x) (DLT_CLASS(x) == DLT_CLASS_NETBSD_RAWAF) - - -/* - * The instruction encodings. - */ -/* instruction classes */ -#define BPF_CLASS(code) ((code) & 0x07) -#define BPF_LD 0x00 -#define BPF_LDX 0x01 -#define BPF_ST 0x02 -#define BPF_STX 0x03 -#define BPF_ALU 0x04 -#define BPF_JMP 0x05 -#define BPF_RET 0x06 -#define BPF_MISC 0x07 - -/* ld/ldx fields */ -#define BPF_SIZE(code) ((code) & 0x18) -#define BPF_W 0x00 -#define BPF_H 0x08 -#define BPF_B 0x10 -#define BPF_MODE(code) ((code) & 0xe0) -#define BPF_IMM 0x00 -#define BPF_ABS 0x20 -#define BPF_IND 0x40 -#define BPF_MEM 0x60 -#define BPF_LEN 0x80 -#define BPF_MSH 0xa0 - -/* alu/jmp fields */ -#define BPF_OP(code) ((code) & 0xf0) -#define BPF_ADD 0x00 -#define BPF_SUB 0x10 -#define BPF_MUL 0x20 -#define BPF_DIV 0x30 -#define BPF_OR 0x40 -#define BPF_AND 0x50 -#define BPF_LSH 0x60 -#define BPF_RSH 0x70 -#define BPF_NEG 0x80 -#define BPF_JA 0x00 -#define BPF_JEQ 0x10 -#define BPF_JGT 0x20 -#define BPF_JGE 0x30 -#define BPF_JSET 0x40 -#define BPF_SRC(code) ((code) & 0x08) -#define BPF_K 0x00 -#define BPF_X 0x08 - -/* ret - BPF_K and BPF_X also apply */ -#define BPF_RVAL(code) ((code) & 0x18) -#define BPF_A 0x10 - -/* misc */ -#define BPF_MISCOP(code) ((code) & 0xf8) -#define BPF_TAX 0x00 -#define BPF_TXA 0x80 - -/* - * The instruction data structure. - */ -struct bpf_insn { - u_short code; - u_char jt; - u_char jf; - bpf_u_int32 k; -}; - -/* - * Macros for insn array initializers. - */ -#define BPF_STMT(code, k) { (u_short)(code), 0, 0, k } -#define BPF_JUMP(code, k, jt, jf) { (u_short)(code), jt, jf, k } - -#if __STDC__ || defined(__cplusplus) -extern int bpf_validate(const struct bpf_insn *, int); -extern u_int bpf_filter(const struct bpf_insn *, const u_char *, u_int, u_int); -#else -extern int bpf_validate(); -extern u_int bpf_filter(); -#endif - -/* - * Number of scratch memory words (for BPF_LD|BPF_MEM and BPF_ST). - */ -#define BPF_MEMWORDS 16 - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/third-party/winpcap/include/pcap/namedb.h b/third-party/winpcap/include/pcap/namedb.h deleted file mode 100644 index 9002c750..00000000 --- a/third-party/winpcap/include/pcap/namedb.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 1994, 1996 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the Computer Systems - * Engineering Group at Lawrence Berkeley Laboratory. - * 4. Neither the name of the University nor of the Laboratory may be used - * to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#) $Header: /tcpdump/master/libpcap/pcap/namedb.h,v 1.1 2006/10/04 18:09:22 guy Exp $ (LBL) - */ - -#ifndef lib_pcap_namedb_h -#define lib_pcap_namedb_h - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * As returned by the pcap_next_etherent() - * XXX this stuff doesn't belong in this interface, but this - * library already must do name to address translation, so - * on systems that don't have support for /etc/ethers, we - * export these hooks since they'll - */ -struct pcap_etherent { - u_char addr[6]; - char name[122]; -}; -#ifndef PCAP_ETHERS_FILE -#define PCAP_ETHERS_FILE "/etc/ethers" -#endif -struct pcap_etherent *pcap_next_etherent(FILE *); -u_char *pcap_ether_hostton(const char*); -u_char *pcap_ether_aton(const char *); - -bpf_u_int32 **pcap_nametoaddr(const char *); -#ifdef INET6 -struct addrinfo *pcap_nametoaddrinfo(const char *); -#endif -bpf_u_int32 pcap_nametonetaddr(const char *); - -int pcap_nametoport(const char *, int *, int *); -int pcap_nametoportrange(const char *, int *, int *, int *); -int pcap_nametoproto(const char *); -int pcap_nametoeproto(const char *); -int pcap_nametollc(const char *); -/* - * If a protocol is unknown, PROTO_UNDEF is returned. - * Also, pcap_nametoport() returns the protocol along with the port number. - * If there are ambiguous entried in /etc/services (i.e. domain - * can be either tcp or udp) PROTO_UNDEF is returned. - */ -#define PROTO_UNDEF -1 - -/* XXX move these to pcap-int.h? */ -int __pcap_atodn(const char *, bpf_u_int32 *); -int __pcap_atoin(const char *, bpf_u_int32 *); -u_short __pcap_nametodnaddr(const char *); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/third-party/winpcap/include/pcap/pcap.h b/third-party/winpcap/include/pcap/pcap.h deleted file mode 100644 index ad8fc40a..00000000 --- a/third-party/winpcap/include/pcap/pcap.h +++ /dev/null @@ -1,407 +0,0 @@ -/* -*- Mode: c; tab-width: 8; indent-tabs-mode: 1; c-basic-offset: 8; -*- */ -/* - * Copyright (c) 1993, 1994, 1995, 1996, 1997 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the Computer Systems - * Engineering Group at Lawrence Berkeley Laboratory. - * 4. Neither the name of the University nor of the Laboratory may be used - * to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#) $Header: /tcpdump/master/libpcap/pcap/pcap.h,v 1.4.2.11 2008-10-06 15:38:39 gianluca Exp $ (LBL) - */ - -#ifndef lib_pcap_pcap_h -#define lib_pcap_pcap_h - -#if defined(WIN32) - #include -#elif defined(MSDOS) - #include - #include /* u_int, u_char etc. */ -#else /* UN*X */ - #include - #include -#endif /* WIN32/MSDOS/UN*X */ - -#ifndef PCAP_DONT_INCLUDE_PCAP_BPF_H -#include -#endif - -#include - -#ifdef HAVE_REMOTE - // We have to define the SOCKET here, although it has been defined in sockutils.h - // This is to avoid the distribution of the 'sockutils.h' file around - // (for example in the WinPcap developer's pack) - #ifndef SOCKET - #ifdef WIN32 - #define SOCKET unsigned int - #else - #define SOCKET int - #endif - #endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#define PCAP_VERSION_MAJOR 2 -#define PCAP_VERSION_MINOR 4 - -#define PCAP_ERRBUF_SIZE 256 - -/* - * Compatibility for systems that have a bpf.h that - * predates the bpf typedefs for 64-bit support. - */ -#if BPF_RELEASE - 0 < 199406 -typedef int bpf_int32; -typedef u_int bpf_u_int32; -#endif - -typedef struct pcap pcap_t; -typedef struct pcap_dumper pcap_dumper_t; -typedef struct pcap_if pcap_if_t; -typedef struct pcap_addr pcap_addr_t; - -/* - * The first record in the file contains saved values for some - * of the flags used in the printout phases of tcpdump. - * Many fields here are 32 bit ints so compilers won't insert unwanted - * padding; these files need to be interchangeable across architectures. - * - * Do not change the layout of this structure, in any way (this includes - * changes that only affect the length of fields in this structure). - * - * Also, do not change the interpretation of any of the members of this - * structure, in any way (this includes using values other than - * LINKTYPE_ values, as defined in "savefile.c", in the "linktype" - * field). - * - * Instead: - * - * introduce a new structure for the new format, if the layout - * of the structure changed; - * - * send mail to "tcpdump-workers@lists.tcpdump.org", requesting - * a new magic number for your new capture file format, and, when - * you get the new magic number, put it in "savefile.c"; - * - * use that magic number for save files with the changed file - * header; - * - * make the code in "savefile.c" capable of reading files with - * the old file header as well as files with the new file header - * (using the magic number to determine the header format). - * - * Then supply the changes as a patch at - * - * http://sourceforge.net/projects/libpcap/ - * - * so that future versions of libpcap and programs that use it (such as - * tcpdump) will be able to read your new capture file format. - */ -struct pcap_file_header { - bpf_u_int32 magic; - u_short version_major; - u_short version_minor; - bpf_int32 thiszone; /* gmt to local correction */ - bpf_u_int32 sigfigs; /* accuracy of timestamps */ - bpf_u_int32 snaplen; /* max length saved portion of each pkt */ - bpf_u_int32 linktype; /* data link type (LINKTYPE_*) */ -}; - -/* - * Macros for the value returned by pcap_datalink_ext(). - * - * If LT_FCS_LENGTH_PRESENT(x) is true, the LT_FCS_LENGTH(x) macro - * gives the FCS length of packets in the capture. - */ -#define LT_FCS_LENGTH_PRESENT(x) ((x) & 0x04000000) -#define LT_FCS_LENGTH(x) (((x) & 0xF0000000) >> 28) -#define LT_FCS_DATALINK_EXT(x) ((((x) & 0xF) << 28) | 0x04000000) - -typedef enum { - PCAP_D_INOUT = 0, - PCAP_D_IN, - PCAP_D_OUT -} pcap_direction_t; - -/* - * Generic per-packet information, as supplied by libpcap. - * - * The time stamp can and should be a "struct timeval", regardless of - * whether your system supports 32-bit tv_sec in "struct timeval", - * 64-bit tv_sec in "struct timeval", or both if it supports both 32-bit - * and 64-bit applications. The on-disk format of savefiles uses 32-bit - * tv_sec (and tv_usec); this structure is irrelevant to that. 32-bit - * and 64-bit versions of libpcap, even if they're on the same platform, - * should supply the appropriate version of "struct timeval", even if - * that's not what the underlying packet capture mechanism supplies. - */ -struct pcap_pkthdr { - struct timeval ts; /* time stamp */ - bpf_u_int32 caplen; /* length of portion present */ - bpf_u_int32 len; /* length this packet (off wire) */ -}; - -/* - * As returned by the pcap_stats() - */ -struct pcap_stat { - u_int ps_recv; /* number of packets received */ - u_int ps_drop; /* number of packets dropped */ - u_int ps_ifdrop; /* drops by interface XXX not yet supported */ -#ifdef HAVE_REMOTE - u_int ps_capt; /* number of packets that are received by the application; please get rid off the Win32 ifdef */ - u_int ps_sent; /* number of packets sent by the server on the network */ - u_int ps_netdrop; /* number of packets lost on the network */ -#endif /* HAVE_REMOTE */ -}; - -#ifdef MSDOS -/* - * As returned by the pcap_stats_ex() - */ -struct pcap_stat_ex { - u_long rx_packets; /* total packets received */ - u_long tx_packets; /* total packets transmitted */ - u_long rx_bytes; /* total bytes received */ - u_long tx_bytes; /* total bytes transmitted */ - u_long rx_errors; /* bad packets received */ - u_long tx_errors; /* packet transmit problems */ - u_long rx_dropped; /* no space in Rx buffers */ - u_long tx_dropped; /* no space available for Tx */ - u_long multicast; /* multicast packets received */ - u_long collisions; - - /* detailed rx_errors: */ - u_long rx_length_errors; - u_long rx_over_errors; /* receiver ring buff overflow */ - u_long rx_crc_errors; /* recv'd pkt with crc error */ - u_long rx_frame_errors; /* recv'd frame alignment error */ - u_long rx_fifo_errors; /* recv'r fifo overrun */ - u_long rx_missed_errors; /* recv'r missed packet */ - - /* detailed tx_errors */ - u_long tx_aborted_errors; - u_long tx_carrier_errors; - u_long tx_fifo_errors; - u_long tx_heartbeat_errors; - u_long tx_window_errors; - }; -#endif - -/* - * Item in a list of interfaces. - */ -struct pcap_if { - struct pcap_if *next; - char *name; /* name to hand to "pcap_open_live()" */ - char *description; /* textual description of interface, or NULL */ - struct pcap_addr *addresses; - bpf_u_int32 flags; /* PCAP_IF_ interface flags */ -}; - -#define PCAP_IF_LOOPBACK 0x00000001 /* interface is loopback */ - -/* - * Representation of an interface address. - */ -struct pcap_addr { - struct pcap_addr *next; - struct sockaddr *addr; /* address */ - struct sockaddr *netmask; /* netmask for that address */ - struct sockaddr *broadaddr; /* broadcast address for that address */ - struct sockaddr *dstaddr; /* P2P destination address for that address */ -}; - -typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *, - const u_char *); - -/* - * Error codes for the pcap API. - * These will all be negative, so you can check for the success or - * failure of a call that returns these codes by checking for a - * negative value. - */ -#define PCAP_ERROR -1 /* generic error code */ -#define PCAP_ERROR_BREAK -2 /* loop terminated by pcap_breakloop */ -#define PCAP_ERROR_NOT_ACTIVATED -3 /* the capture needs to be activated */ -#define PCAP_ERROR_ACTIVATED -4 /* the operation can't be performed on already activated captures */ -#define PCAP_ERROR_NO_SUCH_DEVICE -5 /* no such device exists */ -#define PCAP_ERROR_RFMON_NOTSUP -6 /* this device doesn't support rfmon (monitor) mode */ -#define PCAP_ERROR_NOT_RFMON -7 /* operation supported only in monitor mode */ -#define PCAP_ERROR_PERM_DENIED -8 /* no permission to open the device */ -#define PCAP_ERROR_IFACE_NOT_UP -9 /* interface isn't up */ - -/* - * Warning codes for the pcap API. - * These will all be positive and non-zero, so they won't look like - * errors. - */ -#define PCAP_WARNING 1 /* generic warning code */ -#define PCAP_WARNING_PROMISC_NOTSUP 2 /* this device doesn't support promiscuous mode */ - -char *pcap_lookupdev(char *); -int pcap_lookupnet(const char *, bpf_u_int32 *, bpf_u_int32 *, char *); - -pcap_t *pcap_create(const char *, char *); -int pcap_set_snaplen(pcap_t *, int); -int pcap_set_promisc(pcap_t *, int); -int pcap_can_set_rfmon(pcap_t *); -int pcap_set_rfmon(pcap_t *, int); -int pcap_set_timeout(pcap_t *, int); -int pcap_set_buffer_size(pcap_t *, int); -int pcap_activate(pcap_t *); - -pcap_t *pcap_open_live(const char *, int, int, int, char *); -pcap_t *pcap_open_dead(int, int); -pcap_t *pcap_open_offline(const char *, char *); -#if defined(WIN32) -pcap_t *pcap_hopen_offline(intptr_t, char *); -#if !defined(LIBPCAP_EXPORTS) -#define pcap_fopen_offline(f,b) \ - pcap_hopen_offline(_get_osfhandle(_fileno(f)), b) -#else /*LIBPCAP_EXPORTS*/ -static pcap_t *pcap_fopen_offline(FILE *, char *); -#endif -#else /*WIN32*/ -pcap_t *pcap_fopen_offline(FILE *, char *); -#endif /*WIN32*/ - -void pcap_close(pcap_t *); -int pcap_loop(pcap_t *, int, pcap_handler, u_char *); -int pcap_dispatch(pcap_t *, int, pcap_handler, u_char *); -const u_char* - pcap_next(pcap_t *, struct pcap_pkthdr *); -int pcap_next_ex(pcap_t *, struct pcap_pkthdr **, const u_char **); -void pcap_breakloop(pcap_t *); -int pcap_stats(pcap_t *, struct pcap_stat *); -int pcap_setfilter(pcap_t *, struct bpf_program *); -int pcap_setdirection(pcap_t *, pcap_direction_t); -int pcap_getnonblock(pcap_t *, char *); -int pcap_setnonblock(pcap_t *, int, char *); -int pcap_inject(pcap_t *, const void *, size_t); -int pcap_sendpacket(pcap_t *, const u_char *, int); -const char *pcap_statustostr(int); -const char *pcap_strerror(int); -char *pcap_geterr(pcap_t *); -void pcap_perror(pcap_t *, char *); -int pcap_compile(pcap_t *, struct bpf_program *, const char *, int, - bpf_u_int32); -int pcap_compile_nopcap(int, int, struct bpf_program *, - const char *, int, bpf_u_int32); -void pcap_freecode(struct bpf_program *); -int pcap_offline_filter(struct bpf_program *, const struct pcap_pkthdr *, - const u_char *); -int pcap_datalink(pcap_t *); -int pcap_datalink_ext(pcap_t *); -int pcap_list_datalinks(pcap_t *, int **); -int pcap_set_datalink(pcap_t *, int); -void pcap_free_datalinks(int *); -int pcap_datalink_name_to_val(const char *); -const char *pcap_datalink_val_to_name(int); -const char *pcap_datalink_val_to_description(int); -int pcap_snapshot(pcap_t *); -int pcap_is_swapped(pcap_t *); -int pcap_major_version(pcap_t *); -int pcap_minor_version(pcap_t *); - -/* XXX */ -FILE *pcap_file(pcap_t *); -int pcap_fileno(pcap_t *); - -pcap_dumper_t *pcap_dump_open(pcap_t *, const char *); -pcap_dumper_t *pcap_dump_fopen(pcap_t *, FILE *fp); -FILE *pcap_dump_file(pcap_dumper_t *); -long pcap_dump_ftell(pcap_dumper_t *); -int pcap_dump_flush(pcap_dumper_t *); -void pcap_dump_close(pcap_dumper_t *); -void pcap_dump(u_char *, const struct pcap_pkthdr *, const u_char *); - -int pcap_findalldevs(pcap_if_t **, char *); -void pcap_freealldevs(pcap_if_t *); - -const char *pcap_lib_version(void); - -/* XXX this guy lives in the bpf tree */ -u_int bpf_filter(const struct bpf_insn *, const u_char *, u_int, u_int); -int bpf_validate(const struct bpf_insn *f, int len); -char *bpf_image(const struct bpf_insn *, int); -void bpf_dump(const struct bpf_program *, int); - -#if defined(WIN32) - -/* - * Win32 definitions - */ - -int pcap_setbuff(pcap_t *p, int dim); -int pcap_setmode(pcap_t *p, int mode); -int pcap_setmintocopy(pcap_t *p, int size); - -#ifdef WPCAP -/* Include file with the wpcap-specific extensions */ -#include -#endif /* WPCAP */ - -#define MODE_CAPT 0 -#define MODE_STAT 1 -#define MODE_MON 2 - -#elif defined(MSDOS) - -/* - * MS-DOS definitions - */ - -int pcap_stats_ex (pcap_t *, struct pcap_stat_ex *); -void pcap_set_wait (pcap_t *p, void (*yield)(void), int wait); -u_long pcap_mac_packets (void); - -#else /* UN*X */ - -/* - * UN*X definitions - */ - -int pcap_get_selectable_fd(pcap_t *); - -#endif /* WIN32/MSDOS/UN*X */ - -#ifdef HAVE_REMOTE -/* Includes most of the public stuff that is needed for the remote capture */ -#include -#endif /* HAVE_REMOTE */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/third-party/winpcap/include/pcap/sll.h b/third-party/winpcap/include/pcap/sll.h deleted file mode 100644 index e9d5452a..00000000 --- a/third-party/winpcap/include/pcap/sll.h +++ /dev/null @@ -1,129 +0,0 @@ -/*- - * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from the Stanford/CMU enet packet filter, - * (net/enet.c) distributed as part of 4.3BSD, and code contributed - * to Berkeley by Steven McCanne and Van Jacobson both of Lawrence - * Berkeley Laboratory. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#) $Header: /tcpdump/master/libpcap/pcap/sll.h,v 1.2.2.1 2008-05-30 01:36:06 guy Exp $ (LBL) - */ - -/* - * For captures on Linux cooked sockets, we construct a fake header - * that includes: - * - * a 2-byte "packet type" which is one of: - * - * LINUX_SLL_HOST packet was sent to us - * LINUX_SLL_BROADCAST packet was broadcast - * LINUX_SLL_MULTICAST packet was multicast - * LINUX_SLL_OTHERHOST packet was sent to somebody else - * LINUX_SLL_OUTGOING packet was sent *by* us; - * - * a 2-byte Ethernet protocol field; - * - * a 2-byte link-layer type; - * - * a 2-byte link-layer address length; - * - * an 8-byte source link-layer address, whose actual length is - * specified by the previous value. - * - * All fields except for the link-layer address are in network byte order. - * - * DO NOT change the layout of this structure, or change any of the - * LINUX_SLL_ values below. If you must change the link-layer header - * for a "cooked" Linux capture, introduce a new DLT_ type (ask - * "tcpdump-workers@lists.tcpdump.org" for one, so that you don't give it - * a value that collides with a value already being used), and use the - * new header in captures of that type, so that programs that can - * handle DLT_LINUX_SLL captures will continue to handle them correctly - * without any change, and so that capture files with different headers - * can be told apart and programs that read them can dissect the - * packets in them. - */ - -#ifndef lib_pcap_sll_h -#define lib_pcap_sll_h - -/* - * A DLT_LINUX_SLL fake link-layer header. - */ -#define SLL_HDR_LEN 16 /* total header length */ -#define SLL_ADDRLEN 8 /* length of address field */ - -struct sll_header { - u_int16_t sll_pkttype; /* packet type */ - u_int16_t sll_hatype; /* link-layer address type */ - u_int16_t sll_halen; /* link-layer address length */ - u_int8_t sll_addr[SLL_ADDRLEN]; /* link-layer address */ - u_int16_t sll_protocol; /* protocol */ -}; - -/* - * The LINUX_SLL_ values for "sll_pkttype"; these correspond to the - * PACKET_ values on Linux, but are defined here so that they're - * available even on systems other than Linux, and so that they - * don't change even if the PACKET_ values change. - */ -#define LINUX_SLL_HOST 0 -#define LINUX_SLL_BROADCAST 1 -#define LINUX_SLL_MULTICAST 2 -#define LINUX_SLL_OTHERHOST 3 -#define LINUX_SLL_OUTGOING 4 - -/* - * The LINUX_SLL_ values for "sll_protocol"; these correspond to the - * ETH_P_ values on Linux, but are defined here so that they're - * available even on systems other than Linux. We assume, for now, - * that the ETH_P_ values won't change in Linux; if they do, then: - * - * if we don't translate them in "pcap-linux.c", capture files - * won't necessarily be readable if captured on a system that - * defines ETH_P_ values that don't match these values; - * - * if we do translate them in "pcap-linux.c", that makes life - * unpleasant for the BPF code generator, as the values you test - * for in the kernel aren't the values that you test for when - * reading a capture file, so the fixup code run on BPF programs - * handed to the kernel ends up having to do more work. - * - * Add other values here as necessary, for handling packet types that - * might show up on non-Ethernet, non-802.x networks. (Not all the ones - * in the Linux "if_ether.h" will, I suspect, actually show up in - * captures.) - */ -#define LINUX_SLL_P_802_3 0x0001 /* Novell 802.3 frames without 802.2 LLC header */ -#define LINUX_SLL_P_802_2 0x0004 /* 802.2 frames (not D/I/X Ethernet) */ - -#endif diff --git a/third-party/winpcap/include/pcap/usb.h b/third-party/winpcap/include/pcap/usb.h deleted file mode 100644 index adcd19c0..00000000 --- a/third-party/winpcap/include/pcap/usb.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2006 Paolo Abeni (Italy) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote - * products derived from this software without specific prior written - * permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Basic USB data struct - * By Paolo Abeni - * - * @(#) $Header: /tcpdump/master/libpcap/pcap/usb.h,v 1.6 2007/09/22 02:06:08 guy Exp $ - */ - -#ifndef _PCAP_USB_STRUCTS_H__ -#define _PCAP_USB_STRUCTS_H__ - -/* - * possible transfer mode - */ -#define URB_TRANSFER_IN 0x80 -#define URB_ISOCHRONOUS 0x0 -#define URB_INTERRUPT 0x1 -#define URB_CONTROL 0x2 -#define URB_BULK 0x3 - -/* - * possible event type - */ -#define URB_SUBMIT 'S' -#define URB_COMPLETE 'C' -#define URB_ERROR 'E' - -/* - * USB setup header as defined in USB specification. - * Appears at the front of each packet in DLT_USB captures. - */ -typedef struct _usb_setup { - u_int8_t bmRequestType; - u_int8_t bRequest; - u_int16_t wValue; - u_int16_t wIndex; - u_int16_t wLength; -} pcap_usb_setup; - - -/* - * Header prepended by linux kernel to each event. - * Appears at the front of each packet in DLT_USB_LINUX captures. - */ -typedef struct _usb_header { - u_int64_t id; - u_int8_t event_type; - u_int8_t transfer_type; - u_int8_t endpoint_number; - u_int8_t device_address; - u_int16_t bus_id; - char setup_flag;/*if !=0 the urb setup header is not present*/ - char data_flag; /*if !=0 no urb data is present*/ - int64_t ts_sec; - int32_t ts_usec; - int32_t status; - u_int32_t urb_len; - u_int32_t data_len; /* amount of urb data really present in this event*/ - pcap_usb_setup setup; -} pcap_usb_header; - - -#endif diff --git a/third-party/winpcap/include/pcap/vlan.h b/third-party/winpcap/include/pcap/vlan.h deleted file mode 100644 index b0cb7949..00000000 --- a/third-party/winpcap/include/pcap/vlan.h +++ /dev/null @@ -1,46 +0,0 @@ -/*- - * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#) $Header: /tcpdump/master/libpcap/pcap/vlan.h,v 1.1.2.2 2008-08-06 07:45:59 guy Exp $ - */ - -#ifndef lib_pcap_vlan_h -#define lib_pcap_vlan_h - -struct vlan_tag { - u_int16_t vlan_tpid; /* ETH_P_8021Q */ - u_int16_t vlan_tci; /* VLAN TCI */ -}; - -#define VLAN_TAG_LEN 4 - -#endif diff --git a/third-party/winpcap/include/remote-ext.h b/third-party/winpcap/include/remote-ext.h deleted file mode 100644 index 35a2fff6..00000000 --- a/third-party/winpcap/include/remote-ext.h +++ /dev/null @@ -1,444 +0,0 @@ -/* - * Copyright (c) 2002 - 2003 - * NetGroup, Politecnico di Torino (Italy) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Politecnico di Torino nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - - -#ifndef __REMOTE_EXT_H__ -#define __REMOTE_EXT_H__ - - -#ifndef HAVE_REMOTE -#error Please do not include this file directly. Just define HAVE_REMOTE and then include pcap.h -#endif - -// Definition for Microsoft Visual Studio -#if _MSC_VER > 1000 -#pragma once -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/*! - \file remote-ext.h - - The goal of this file it to include most of the new definitions that should be - placed into the pcap.h file. - - It includes all new definitions (structures and functions like pcap_open(). - Some of the functions are not really a remote feature, but, right now, - they are placed here. -*/ - - - -// All this stuff is public -/*! \addtogroup remote_struct - \{ -*/ - - - - -/*! - \brief Defines the maximum buffer size in which address, port, interface names are kept. - - In case the adapter name or such is larger than this value, it is truncated. - This is not used by the user; however it must be aware that an hostname / interface - name longer than this value will be truncated. -*/ -#define PCAP_BUF_SIZE 1024 - - -/*! \addtogroup remote_source_ID - \{ -*/ - - -/*! - \brief Internal representation of the type of source in use (file, - remote/local interface). - - This indicates a file, i.e. the user want to open a capture from a local file. -*/ -#define PCAP_SRC_FILE 2 -/*! - \brief Internal representation of the type of source in use (file, - remote/local interface). - - This indicates a local interface, i.e. the user want to open a capture from - a local interface. This does not involve the RPCAP protocol. -*/ -#define PCAP_SRC_IFLOCAL 3 -/*! - \brief Internal representation of the type of source in use (file, - remote/local interface). - - This indicates a remote interface, i.e. the user want to open a capture from - an interface on a remote host. This does involve the RPCAP protocol. -*/ -#define PCAP_SRC_IFREMOTE 4 - -/*! - \} -*/ - - - -/*! \addtogroup remote_source_string - - The formats allowed by the pcap_open() are the following: - - file://path_and_filename [opens a local file] - - rpcap://devicename [opens the selected device devices available on the local host, without using the RPCAP protocol] - - rpcap://host/devicename [opens the selected device available on a remote host] - - rpcap://host:port/devicename [opens the selected device available on a remote host, using a non-standard port for RPCAP] - - adaptername [to open a local adapter; kept for compability, but it is strongly discouraged] - - (NULL) [to open the first local adapter; kept for compability, but it is strongly discouraged] - - The formats allowed by the pcap_findalldevs_ex() are the following: - - file://folder/ [lists all the files in the given folder] - - rpcap:// [lists all local adapters] - - rpcap://host:port/ [lists the devices available on a remote host] - - Referring to the 'host' and 'port' paramters, they can be either numeric or literal. Since - IPv6 is fully supported, these are the allowed formats: - - - host (literal): e.g. host.foo.bar - - host (numeric IPv4): e.g. 10.11.12.13 - - host (numeric IPv4, IPv6 style): e.g. [10.11.12.13] - - host (numeric IPv6): e.g. [1:2:3::4] - - port: can be either numeric (e.g. '80') or literal (e.g. 'http') - - Here you find some allowed examples: - - rpcap://host.foo.bar/devicename [everything literal, no port number] - - rpcap://host.foo.bar:1234/devicename [everything literal, with port number] - - rpcap://10.11.12.13/devicename [IPv4 numeric, no port number] - - rpcap://10.11.12.13:1234/devicename [IPv4 numeric, with port number] - - rpcap://[10.11.12.13]:1234/devicename [IPv4 numeric with IPv6 format, with port number] - - rpcap://[1:2:3::4]/devicename [IPv6 numeric, no port number] - - rpcap://[1:2:3::4]:1234/devicename [IPv6 numeric, with port number] - - rpcap://[1:2:3::4]:http/devicename [IPv6 numeric, with literal port number] - - \{ -*/ - - -/*! - \brief String that will be used to determine the type of source in use (file, - remote/local interface). - - This string will be prepended to the interface name in order to create a string - that contains all the information required to open the source. - - This string indicates that the user wants to open a capture from a local file. -*/ -#define PCAP_SRC_FILE_STRING "file://" -/*! - \brief String that will be used to determine the type of source in use (file, - remote/local interface). - - This string will be prepended to the interface name in order to create a string - that contains all the information required to open the source. - - This string indicates that the user wants to open a capture from a network interface. - This string does not necessarily involve the use of the RPCAP protocol. If the - interface required resides on the local host, the RPCAP protocol is not involved - and the local functions are used. -*/ -#define PCAP_SRC_IF_STRING "rpcap://" - -/*! - \} -*/ - - - - - -/*! - \addtogroup remote_open_flags - \{ -*/ - -/*! - \brief Defines if the adapter has to go in promiscuous mode. - - It is '1' if you have to open the adapter in promiscuous mode, '0' otherwise. - Note that even if this parameter is false, the interface could well be in promiscuous - mode for some other reason (for example because another capture process with - promiscuous mode enabled is currently using that interface). - On on Linux systems with 2.2 or later kernels (that have the "any" device), this - flag does not work on the "any" device; if an argument of "any" is supplied, - the 'promisc' flag is ignored. -*/ -#define PCAP_OPENFLAG_PROMISCUOUS 1 - -/*! - \brief Defines if the data trasfer (in case of a remote - capture) has to be done with UDP protocol. - - If it is '1' if you want a UDP data connection, '0' if you want - a TCP data connection; control connection is always TCP-based. - A UDP connection is much lighter, but it does not guarantee that all - the captured packets arrive to the client workstation. Moreover, - it could be harmful in case of network congestion. - This flag is meaningless if the source is not a remote interface. - In that case, it is simply ignored. -*/ -#define PCAP_OPENFLAG_DATATX_UDP 2 - - -/*! - \brief Defines if the remote probe will capture its own generated traffic. - - In case the remote probe uses the same interface to capture traffic and to send - data back to the caller, the captured traffic includes the RPCAP traffic as well. - If this flag is turned on, the RPCAP traffic is excluded from the capture, so that - the trace returned back to the collector is does not include this traffic. -*/ -#define PCAP_OPENFLAG_NOCAPTURE_RPCAP 4 - -/*! - \brief Defines if the local adapter will capture its own generated traffic. - - This flag tells the underlying capture driver to drop the packets that were sent by itself. - This is usefult when building applications like bridges, that should ignore the traffic - they just sent. -*/ -#define PCAP_OPENFLAG_NOCAPTURE_LOCAL 8 - -/*! - \brief This flag configures the adapter for maximum responsiveness. - - In presence of a large value for nbytes, WinPcap waits for the arrival of several packets before - copying the data to the user. This guarantees a low number of system calls, i.e. lower processor usage, - i.e. better performance, which is good for applications like sniffers. If the user sets the - PCAP_OPENFLAG_MAX_RESPONSIVENESS flag, the capture driver will copy the packets as soon as the application - is ready to receive them. This is suggested for real time applications (like, for example, a bridge) - that need the best responsiveness.*/ -#define PCAP_OPENFLAG_MAX_RESPONSIVENESS 16 - -/*! - \} -*/ - - -/*! - \addtogroup remote_samp_methods - \{ -*/ - -/*! - \brief No sampling has to be done on the current capture. - - In this case, no sampling algorithms are applied to the current capture. -*/ -#define PCAP_SAMP_NOSAMP 0 - -/*! - \brief It defines that only 1 out of N packets must be returned to the user. - - In this case, the 'value' field of the 'pcap_samp' structure indicates the - number of packets (minus 1) that must be discarded before one packet got accepted. - In other words, if 'value = 10', the first packet is returned to the caller, while - the following 9 are discarded. -*/ -#define PCAP_SAMP_1_EVERY_N 1 - -/*! - \brief It defines that we have to return 1 packet every N milliseconds. - - In this case, the 'value' field of the 'pcap_samp' structure indicates the 'waiting - time' in milliseconds before one packet got accepted. - In other words, if 'value = 10', the first packet is returned to the caller; the next - returned one will be the first packet that arrives when 10ms have elapsed. -*/ -#define PCAP_SAMP_FIRST_AFTER_N_MS 2 - -/*! - \} -*/ - - -/*! - \addtogroup remote_auth_methods - \{ -*/ - -/*! - \brief It defines the NULL authentication. - - This value has to be used within the 'type' member of the pcap_rmtauth structure. - The 'NULL' authentication has to be equal to 'zero', so that old applications - can just put every field of struct pcap_rmtauth to zero, and it does work. -*/ -#define RPCAP_RMTAUTH_NULL 0 -/*! - \brief It defines the username/password authentication. - - With this type of authentication, the RPCAP protocol will use the username/ - password provided to authenticate the user on the remote machine. If the - authentication is successful (and the user has the right to open network devices) - the RPCAP connection will continue; otherwise it will be dropped. - - This value has to be used within the 'type' member of the pcap_rmtauth structure. -*/ -#define RPCAP_RMTAUTH_PWD 1 - -/*! - \} -*/ - - - - -/*! - - \brief This structure keeps the information needed to autheticate - the user on a remote machine. - - The remote machine can either grant or refuse the access according - to the information provided. - In case the NULL authentication is required, both 'username' and - 'password' can be NULL pointers. - - This structure is meaningless if the source is not a remote interface; - in that case, the functions which requires such a structure can accept - a NULL pointer as well. -*/ -struct pcap_rmtauth -{ - /*! - \brief Type of the authentication required. - - In order to provide maximum flexibility, we can support different types - of authentication based on the value of this 'type' variable. The currently - supported authentication methods are defined into the - \link remote_auth_methods Remote Authentication Methods Section\endlink. - - */ - int type; - /*! - \brief Zero-terminated string containing the username that has to be - used on the remote machine for authentication. - - This field is meaningless in case of the RPCAP_RMTAUTH_NULL authentication - and it can be NULL. - */ - char *username; - /*! - \brief Zero-terminated string containing the password that has to be - used on the remote machine for authentication. - - This field is meaningless in case of the RPCAP_RMTAUTH_NULL authentication - and it can be NULL. - */ - char *password; -}; - - -/*! - \brief This structure defines the information related to sampling. - - In case the sampling is requested, the capturing device should read - only a subset of the packets coming from the source. The returned packets depend - on the sampling parameters. - - \warning The sampling process is applied after the filtering process. - In other words, packets are filtered first, then the sampling process selects a - subset of the 'filtered' packets and it returns them to the caller. -*/ -struct pcap_samp -{ - /*! - Method used for sampling. Currently, the supported methods are listed in the - \link remote_samp_methods Sampling Methods Section\endlink. - */ - int method; - - /*! - This value depends on the sampling method defined. For its meaning, please check - at the \link remote_samp_methods Sampling Methods Section\endlink. - */ - int value; -}; - - - - -//! Maximum lenght of an host name (needed for the RPCAP active mode) -#define RPCAP_HOSTLIST_SIZE 1024 - - -/*! - \} -*/ // end of public documentation - - -// Exported functions - - - -/** \name New WinPcap functions - - This section lists the new functions that are able to help considerably in writing - WinPcap programs because of their easiness of use. - */ -//\{ -pcap_t *pcap_open(const char *source, int snaplen, int flags, int read_timeout, struct pcap_rmtauth *auth, char *errbuf); -int pcap_createsrcstr(char *source, int type, const char *host, const char *port, const char *name, char *errbuf); -int pcap_parsesrcstr(const char *source, int *type, char *host, char *port, char *name, char *errbuf); -int pcap_findalldevs_ex(char *source, struct pcap_rmtauth *auth, pcap_if_t **alldevs, char *errbuf); -struct pcap_samp *pcap_setsampling(pcap_t *p); - -//\} -// End of new winpcap functions - - - -/** \name Remote Capture functions - */ -//\{ -SOCKET pcap_remoteact_accept(const char *address, const char *port, const char *hostlist, char *connectinghost, struct pcap_rmtauth *auth, char *errbuf); -int pcap_remoteact_list(char *hostlist, char sep, int size, char *errbuf); -int pcap_remoteact_close(const char *host, char *errbuf); -void pcap_remoteact_cleanup(); -//\} -// End of remote capture functions - -#ifdef __cplusplus -} -#endif - - -#endif -