123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301 |
- #ifndef CPP_PCAPREADER_STATISTICS_H
- #define CPP_PCAPREADER_STATISTICS_H
- #include <unordered_map>
- #include <list>
- #include <tuple>
- #include <tins/timestamp.h>
- #include <tins/ip_address.h>
- struct ip_stats {
- float bandwidthKBitsIn;
- float bandwidthKBitsOut;
- float packetPerSecondIn;
- float packetPerSecondOut;
- float AvgPacketSizeSent;
- float AvgPacketSizeRecv;
- long AvgMaxSegmentSizeTCP;
- };
- struct ipAddress_mss {
- std::string ipAddress;
- int mssValue;
- bool operator==(const ipAddress_mss &other) const {
- return ipAddress == other.ipAddress
- && mssValue == other.mssValue;
- }
- };
- struct ipAddress_win {
- std::string ipAddress;
- int winSize;
- bool operator==(const ipAddress_win &other) const {
- return ipAddress == other.ipAddress
- && winSize == other.winSize;
- }
- };
- struct ipAddress_ttl {
- std::string ipAddress;
- int ttlValue;
- bool operator==(const ipAddress_ttl &other) const {
- return ipAddress == other.ipAddress
- && ttlValue == other.ttlValue;
- }
- };
- struct ipAddress_protocol {
- std::string ipAddress;
- std::string protocol;
- bool operator==(const ipAddress_protocol &other) const {
- return ipAddress == other.ipAddress
- && protocol == other.protocol;
- }
- };
- struct entry_ipStat {
- long pkts_received;
- long pkts_sent;
- float kbytes_received;
- float kbytes_sent;
- bool operator==(const entry_ipStat &other) const {
- return pkts_received == other.pkts_received
- && pkts_sent == other.pkts_sent
- && kbytes_sent == other.kbytes_sent
- && kbytes_received == other.kbytes_received;
- }
- };
- struct ipAddress_inOut_port {
- std::string ipAddress;
- std::string trafficDirection;
- int portNumber;
- bool operator==(const ipAddress_inOut_port &other) const {
- return ipAddress == other.ipAddress
- && trafficDirection == other.trafficDirection
- && portNumber == other.portNumber;
- }
- };
- namespace std {
- template<>
- struct hash<ipAddress_ttl> {
- std::size_t operator()(const ipAddress_ttl &k) const {
- using std::size_t;
- using std::hash;
- using std::string;
- return ((hash<string>()(k.ipAddress)
- ^ (hash<int>()(k.ttlValue) << 1)) >> 1);
- }
- };
-
- template<>
- struct hash<ipAddress_mss> {
- std::size_t operator()(const ipAddress_mss &k) const {
- using std::size_t;
- using std::hash;
- using std::string;
- return ((hash<string>()(k.ipAddress)
- ^ (hash<int>()(k.mssValue) << 1)) >> 1);
- }
- };
-
- template<>
- struct hash<ipAddress_win> {
- std::size_t operator()(const ipAddress_win &k) const {
- using std::size_t;
- using std::hash;
- using std::string;
- return ((hash<string>()(k.ipAddress)
- ^ (hash<int>()(k.winSize) << 1)) >> 1);
- }
- };
- template<>
- struct hash<ipAddress_protocol> {
- std::size_t operator()(const ipAddress_protocol &k) const {
- using std::size_t;
- using std::hash;
- using std::string;
- return ((hash<string>()(k.ipAddress)
- ^ (hash<string>()(k.protocol) << 1)) >> 1);
- }
- };
- template<>
- struct hash<ipAddress_inOut_port> {
- std::size_t operator()(const ipAddress_inOut_port &k) const {
- using std::size_t;
- using std::hash;
- using std::string;
- return ((hash<string>()(k.ipAddress)
- ^ (hash<string>()(k.trafficDirection) << 1)) >> 1)
- ^ (hash<int>()(k.portNumber) << 1);
- }
- };
- }
- class statistics {
- public:
-
- statistics();
-
- std::string getFormattedTimestamp(time_t seconds, suseconds_t microseconds) const;
-
- void incrementPacketCount();
-
- void incrementMSScount(std::string ipAddress, int mssValue);
- void incrementWinCount(std::string ipAddress, int winSize);
- void addIPEntropy();
- void incrementTTLcount(std::string ipAddress, int ttlValue);
- void incrementProtocolCount(std::string ipAddress, std::string protocol);
- void incrementPortCount(std::string ipAddressSender, int outgoingPort, std::string ipAddressReceiver,
- int incomingPort);
- int getProtocolCount(std::string ipAddress, std::string protocol);
- void setTimestampFirstPacket(Tins::Timestamp ts);
- void setTimestampLastPacket(Tins::Timestamp ts);
- void assignMacAddress(std::string ipAddress, std::string macAddress);
- void addIpStat_packetSent(std::string ipAddressSender, std::string ipAddressReceiver, long bytesSent);
- void addMSS(std::string ipAddress, int MSSvalue);
- void writeToDatabase(std::string database_path);
- void addPacketSize(uint32_t packetSize);
- std::string getCaptureDurationTimestamp() const;
- float getCaptureDurationSeconds() const;
- float getAvgPacketSize() const;
- void printStats(std::string ipAddress);
-
- ip_stats getStatsForIP(std::string ipAddress);
- private:
-
- Tins::Timestamp timestamp_firstPacket;
- Tins::Timestamp timestamp_lastPacket;
- float sumPacketSize = 0;
- int packetCount = 0;
-
-
- std::unordered_map<ipAddress_ttl, int> ttl_distribution;
-
-
- std::unordered_map<ipAddress_mss, int> mss_distribution;
-
- std::unordered_map<ipAddress_win, int> win_distribution;
-
- std::unordered_map<ipAddress_protocol, int> protocol_distribution;
-
- std::unordered_map<std::string, entry_ipStat> ip_statistics;
-
- std::unordered_map<ipAddress_inOut_port, int> ip_ports;
-
- std::unordered_map<std::string, std::string> ip_mac_mapping;
-
- std::unordered_map<std::string, int> ip_sumMss;
- };
- #endif
|