X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/8c6fa3fbaccc22127280bf77a48fab5a3ee0716e..46b0747592074017ff0ea4b33d4a7194235886e5:/projects/stargazer/plugins/capture/ether_linux/ether_cap.cpp diff --git a/projects/stargazer/plugins/capture/ether_linux/ether_cap.cpp b/projects/stargazer/plugins/capture/ether_linux/ether_cap.cpp deleted file mode 100644 index cc64bc18..00000000 --- a/projects/stargazer/plugins/capture/ether_linux/ether_cap.cpp +++ /dev/null @@ -1,234 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* -Date: 18.09.2002 -*/ - -/* -* Author : Boris Mikhailenko -*/ - -/* -$Revision: 1.23 $ -$Date: 2009/12/13 13:45:13 $ -*/ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "stg/common.h" -#include "stg/raw_ip_packet.h" -#include "stg/traffcounter.h" -#include "stg/plugin_creator.h" - -#include "ether_cap.h" - -//#define CAP_DEBUG 1 - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -namespace -{ -PLUGIN_CREATOR ecc; -} - -extern "C" PLUGIN * GetPlugin(); -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -PLUGIN * GetPlugin() -{ -return ecc.GetPlugin(); -} -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -std::string ETHER_CAP::GetVersion() const -{ -return "cap_ether v.1.2"; -} -//----------------------------------------------------------------------------- -ETHER_CAP::ETHER_CAP() - : nonstop(false), - isRunning(false), - capSock(-1), - traffCnt(NULL), - logger(GetPluginLogger(GetStgLogger(), "cap_ether")) -{ -} -//----------------------------------------------------------------------------- -int ETHER_CAP::Start() -{ -if (isRunning) - return 0; - -if (EthCapOpen() < 0) - { - errorStr = "Cannot open socket!"; - printfd(__FILE__, "Cannot open socket\n"); - return -1; - } - -nonstop = true; - -if (pthread_create(&thread, NULL, Run, this)) - { - errorStr = "Cannot create thread."; - logger("Cannot create thread."); - printfd(__FILE__, "Cannot create thread\n"); - return -1; - } - -return 0; -} -//----------------------------------------------------------------------------- -int ETHER_CAP::Stop() -{ -if (!isRunning) - return 0; - -nonstop = false; - -//5 seconds to thread stops itself -for (int i = 0; i < 25 && isRunning; i++) - { - struct timespec ts = {0, 200000000}; - nanosleep(&ts, NULL); - } -//after 5 seconds waiting thread still running. now killing it -if (isRunning) - { - if (pthread_kill(thread, SIGUSR1)) - { - errorStr = "Cannot kill thread."; - logger("Cannot send signal to thread."); - return -1; - } - for (int i = 0; i < 25 && isRunning; ++i) - { - struct timespec ts = {0, 200000000}; - nanosleep(&ts, NULL); - } - if (isRunning) - { - errorStr = "ETHER_CAP not stopped."; - logger("Cannot stop thread."); - printfd(__FILE__, "Cannot stop thread\n"); - return -1; - } - else - { - pthread_join(thread, NULL); - } - } - -EthCapClose(); -return 0; -} -//----------------------------------------------------------------------------- -void * ETHER_CAP::Run(void * d) -{ -sigset_t signalSet; -sigfillset(&signalSet); -pthread_sigmask(SIG_BLOCK, &signalSet, NULL); - -ETHER_CAP * dc = static_cast(d); -dc->isRunning = true; - -struct ETH_IP -{ -uint16_t ethHdr[8]; -RAW_PACKET rp; -char padding[4]; -char padding1[8]; -}; - -char ethip[sizeof(ETH_IP)]; - -memset(ðip, 0, sizeof(ETH_IP)); - -ETH_IP * ethIP = static_cast(static_cast(ðip)); -ethIP->rp.dataLen = -1; - -char * iface = NULL; - -while (dc->nonstop) - { - if (dc->EthCapRead(ðip, 68 + 14, &iface)) - { - continue; - } - - if (ethIP->ethHdr[7] != 0x8) - continue; - - dc->traffCnt->Process(ethIP->rp); - } - -dc->isRunning = false; -return NULL; -} -//----------------------------------------------------------------------------- -int ETHER_CAP::EthCapOpen() -{ -capSock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); -if (capSock < 0) - logger("Cannot create socket: %s", strerror(errno)); -return capSock; -} -//----------------------------------------------------------------------------- -int ETHER_CAP::EthCapClose() -{ -close(capSock); -return 0; -} -//----------------------------------------------------------------------------- -int ETHER_CAP::EthCapRead(void * buffer, int blen, char **) -{ -struct sockaddr_ll addr; -int addrLen; - -if (!WaitPackets(capSock)) - { - return ENODATA; - } - -addrLen = sizeof(addr); - -if (recvfrom(capSock, ((char*)buffer) + 2, blen, 0, (struct sockaddr *)&addr, (socklen_t*)&addrLen) < 0) - { - logger("recvfrom error: %s", strerror(errno)); - return ENODATA; - } - -return 0; -}