From 9dc4b302ef35c977b104f0722116f4f6ade64bd8 Mon Sep 17 00:00:00 2001 From: Paul Hollinsky Date: Mon, 14 Sep 2020 11:51:15 -0400 Subject: [PATCH] POSIX: PCAP: Enable if permissions are set, with a warning otherwise On Linux, raw packet capture requires CAP_NET_RAW (or root). If we can't capture raw packets, we will not be able to find/connect to devices over ethernet. --- include/icsneo/platform/posix/devices.h | 6 +++--- platform/posix/pcap.cpp | 21 +++++++++++++++------ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/include/icsneo/platform/posix/devices.h b/include/icsneo/platform/posix/devices.h index 636d4eb..f9b9d65 100644 --- a/include/icsneo/platform/posix/devices.h +++ b/include/icsneo/platform/posix/devices.h @@ -5,13 +5,13 @@ #include "icsneo/device/tree/neoobd2pro/neoobd2pro.h" #include "icsneo/device/tree/neoobd2sim/neoobd2sim.h" #include "icsneo/device/tree/neovifire/neovifire.h" -//#include "icsneo/device/tree/neovifire2/neovifire2eth.h" +#include "icsneo/device/tree/neovifire2/neovifire2eth.h" #include "icsneo/device/tree/neovifire2/neovifire2usb.h" #include "icsneo/device/tree/plasion/neoviion.h" #include "icsneo/device/tree/plasion/neoviplasma.h" -//#include "icsneo/device/tree/radgalaxy/radgalaxy.h" +#include "icsneo/device/tree/radgalaxy/radgalaxy.h" #include "icsneo/device/tree/radpluto/radplutousb.h" -//#include "icsneo/device/tree/radstar2/radstar2eth.h" +#include "icsneo/device/tree/radstar2/radstar2eth.h" #include "icsneo/device/tree/radstar2/radstar2usb.h" #include "icsneo/device/tree/radsupermoon/radsupermoon.h" #include "icsneo/device/tree/valuecan3/valuecan3.h" diff --git a/platform/posix/pcap.cpp b/platform/posix/pcap.cpp index cc4f816..74f14a9 100644 --- a/platform/posix/pcap.cpp +++ b/platform/posix/pcap.cpp @@ -4,7 +4,6 @@ #include "icsneo/communication/packetizer.h" #include #include -#include #include #include #include @@ -20,6 +19,7 @@ static const uint8_t ICS_UNSET_MAC[6] = { 0x00, 0xFC, 0x70, 0xFF, 0xFF, 0xFF }; std::vector PCAP::knownInterfaces; std::vector PCAP::FindAll() { + static bool warned = false; // Only warn once for failure to open devices std::vector foundDevices; // First we ask WinPCAP to give us all of the devices @@ -92,12 +92,17 @@ std::vector PCAP::FindAll() { errbuf[0] = '\0'; interface.fp = pcap_open_live(interface.nameFromWinPCAP.c_str(), 65536, 1, -1, errbuf); - if(strlen(errbuf) != 0) { // This means a warning - std::cout << "Warning for " << interface.nameFromWinPCAP << " " << errbuf << std::endl; - } + // TODO Handle warnings + // if(strlen(errbuf) != 0) { // This means a warning + // std::cout << "Warning for " << interface.nameFromWinPCAP << " " << errbuf << std::endl; + // } if(interface.fp == nullptr) { - std::cout << "pcap_open_live failed for " << interface.nameFromWinPCAP << " with " << errbuf << std::endl; + if (!warned) { + warned = true; + EventManager::GetInstance().add(APIEvent::Type::PCAPCouldNotFindDevices, APIEvent::Severity::EventWarning); + // std::cout << "pcap_open_live failed for " << interface.nameFromWinPCAP << " with " << errbuf << std::endl; + } continue; // Could not open the interface } @@ -122,7 +127,11 @@ std::vector PCAP::FindAll() { const uint8_t* data; auto res = pcap_next_ex(interface.fp, &header, &data); if(res < 0) { - std::cout << "pcapnextex failed with " << res << std::endl; + if (!warned) { + warned = true; + EventManager::GetInstance().add(APIEvent::Type::PCAPCouldNotFindDevices, APIEvent::Severity::EventWarning); + // std::cout << "pcapnextex failed with " << res << std::endl; + } break; } if(res == 0)