Skip to content

Commit f9a841d

Browse files
authored
Merge pull request #172 from CESNET/nettisa_time_comparison
Nettisa - fix time comparison
2 parents 8c3ee86 + 555c67d commit f9a841d

File tree

4 files changed

+49
-29
lines changed

4 files changed

+49
-29
lines changed

include/ipfixprobe/utils.hpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,5 +145,11 @@ T str2num(std::string str, typename std::enable_if<is_uint<T>()>::type * = nullp
145145
return static_cast<T>(tmp);
146146
}
147147

148+
/**
149+
* @brief Convert struct Timeval to microseconds
150+
*/
151+
uint64_t timeval2usec(const struct timeval& tv);
152+
148153
}
149-
#endif /* IPXP_UTILS_HPP */
154+
155+
#endif /* IPXP_UTILS_HPP */

process/nettisa.cpp

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include <cmath>
1111
#include <iostream>
12+
#include <ipfixprobe/utils.hpp>
1213

1314
namespace ipxp {
1415

@@ -21,14 +22,6 @@ __attribute__((constructor)) static void register_this_plugin()
2122
RecordExtNETTISA::REGISTERED_ID = register_extension();
2223
}
2324

24-
NETTISAPlugin::NETTISAPlugin() {}
25-
26-
NETTISAPlugin::~NETTISAPlugin() {}
27-
28-
void NETTISAPlugin::init(const char* params) {}
29-
30-
void NETTISAPlugin::close() {}
31-
3225
ProcessPlugin* NETTISAPlugin::copy()
3326
{
3427
return new NETTISAPlugin(*this);
@@ -41,8 +34,11 @@ void NETTISAPlugin::update_record(
4134
{
4235
float variation_from_mean = pkt.payload_len_wire - nettisa_data->mean;
4336
uint32_t n = rec.dst_packets + rec.src_packets;
44-
long diff_time = pkt.ts.tv_usec - nettisa_data->prev_time;
45-
nettisa_data->prev_time = pkt.ts.tv_usec;
37+
uint64_t packet_time = timeval2usec(pkt.ts);
38+
uint64_t record_time = timeval2usec(rec.time_first);
39+
float diff_time = fmax(packet_time - nettisa_data->prev_time, 0);
40+
nettisa_data->sum_payload += pkt.payload_len_wire;
41+
nettisa_data->prev_time = packet_time;
4642
// MEAN
4743
nettisa_data->mean += (variation_from_mean) / n;
4844
// MIN
@@ -57,7 +53,7 @@ void NETTISAPlugin::update_record(
5753
nettisa_data->kurtosis += pow(variation_from_mean, 4);
5854
// MEAN SCALED TIME
5955
nettisa_data->mean_scaled_time
60-
+= (pkt.ts.tv_usec - rec.time_first.tv_usec - nettisa_data->mean_scaled_time) / n;
56+
+= (packet_time - record_time - nettisa_data->mean_scaled_time) / n;
6157
// MEAN TIME DIFFERENCES
6258
nettisa_data->mean_difftimes += (diff_time - nettisa_data->mean_difftimes) / n;
6359
// MIN
@@ -78,7 +74,7 @@ int NETTISAPlugin::post_create(Flow& rec, const Packet& pkt)
7874
RecordExtNETTISA* nettisa_data = new RecordExtNETTISA();
7975
rec.add_extension(nettisa_data);
8076

81-
nettisa_data->prev_time = pkt.ts.tv_usec;
77+
nettisa_data->prev_time = timeval2usec(pkt.ts);
8278

8379
update_record(nettisa_data, pkt, rec);
8480
return 0;
@@ -88,6 +84,7 @@ int NETTISAPlugin::post_update(Flow& rec, const Packet& pkt)
8884
{
8985
RecordExtNETTISA* nettisa_data
9086
= (RecordExtNETTISA*) rec.get_extension(RecordExtNETTISA::REGISTERED_ID);
87+
9188
update_record(nettisa_data, pkt, rec);
9289
return 0;
9390
}
@@ -97,15 +94,26 @@ void NETTISAPlugin::pre_export(Flow& rec)
9794
RecordExtNETTISA* nettisa_data
9895
= (RecordExtNETTISA*) rec.get_extension(RecordExtNETTISA::REGISTERED_ID);
9996
uint32_t n = rec.src_packets + rec.dst_packets;
100-
nettisa_data->switching_ratio = nettisa_data->switching_ratio / ((n - 1) / 2);
101-
nettisa_data->stdev = pow(
102-
(nettisa_data->root_mean_square / n) - pow((rec.src_bytes + rec.dst_bytes) / n, 2),
103-
0.5);
97+
if (n == 1) {
98+
nettisa_data->switching_ratio = 0;
99+
nettisa_data->stdev = 0;
100+
nettisa_data->kurtosis = 0;
101+
nettisa_data->time_distribution = 0;
102+
} else {
103+
nettisa_data->switching_ratio = nettisa_data->switching_ratio / n;
104+
nettisa_data->stdev = pow(
105+
(nettisa_data->root_mean_square / n) - pow(nettisa_data->sum_payload / n, 2),
106+
0.5);
107+
if (nettisa_data->stdev == 0) {
108+
nettisa_data->kurtosis = 0;
109+
} else {
110+
nettisa_data->kurtosis = nettisa_data->kurtosis / (n * pow(nettisa_data->stdev, 4));
111+
}
112+
nettisa_data->time_distribution = (nettisa_data->time_distribution / (n - 1))
113+
/ (nettisa_data->max_difftimes - nettisa_data->min);
114+
}
104115
nettisa_data->root_mean_square = pow(nettisa_data->root_mean_square / n, 0.5);
105116
nettisa_data->average_dispersion = nettisa_data->average_dispersion / n;
106-
nettisa_data->kurtosis = nettisa_data->kurtosis / (n * pow(nettisa_data->stdev, 4));
107-
nettisa_data->time_distribution = (nettisa_data->time_distribution / (n - 1))
108-
/ (nettisa_data->max_difftimes - nettisa_data->min);
109117
}
110118

111119
} // namespace ipxp

process/nettisa.hpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@
2727
namespace ipxp {
2828

2929
#define NETTISA_UNIREC_TEMPLATE \
30-
"NTS_MEAN,NTS_MIN,NTS_MAX,NTS_STDEV,NTS_KURTOSIS,NTS_ROOT_MEAN_SQUARE,NTS_AVERAGE_DISPERSION," \
31-
"NTS_MEAN_SCALED_TIME,NTS_MEAN_DIFFTIMES,NTS_MIN_DIFFTIMES,NTS_MAX_DIFFTIMES,NTS_TIME_" \
30+
"NTS_MEAN,NTS_MIN,NTS_MAX,NTS_STDEV,NTS_KURTOSIS,NTS_ROOT_MEAN_SQUARE,NTS_" \
31+
"AVERAGE_DISPERSION," \
32+
"NTS_MEAN_SCALED_TIME,NTS_MEAN_DIFFTIMES,NTS_MIN_DIFFTIMES,NTS_MAX_" \
33+
"DIFFTIMES,NTS_TIME_" \
3234
"DISTRIBUTION," \
3335
"NTS_SWITCHING_RATIO"
3436

@@ -68,7 +70,8 @@ struct RecordExtNETTISA : public RecordExt {
6870
float switching_ratio;
6971

7072
uint16_t prev_payload;
71-
long prev_time;
73+
uint64_t prev_time;
74+
uint64_t sum_payload;
7275

7376
RecordExtNETTISA()
7477
: RecordExt(REGISTERED_ID)
@@ -89,6 +92,7 @@ struct RecordExtNETTISA : public RecordExt {
8992

9093
prev_payload = 0;
9194
prev_time = 0;
95+
sum_payload = 0;
9296
}
9397

9498
#ifdef WITH_NEMEA
@@ -112,7 +116,7 @@ struct RecordExtNETTISA : public RecordExt {
112116
const char* get_unirec_tmplt() const { return NETTISA_UNIREC_TEMPLATE; }
113117
#endif // ifdef WITH_NEMEA
114118

115-
constexpr int get_ipfix_size() const noexcept
119+
int get_ipfix_size() const noexcept
116120
{
117121
return sizeof(mean) + sizeof(min) + sizeof(max) + sizeof(stdev) + sizeof(kurtosis)
118122
+ sizeof(root_mean_square) + sizeof(average_dispersion) + sizeof(mean_scaled_time)
@@ -169,10 +173,6 @@ struct RecordExtNETTISA : public RecordExt {
169173
*/
170174
class NETTISAPlugin : public ProcessPlugin {
171175
public:
172-
NETTISAPlugin();
173-
~NETTISAPlugin();
174-
void init(const char* params);
175-
void close();
176176
OptionsParser* get_parser() const { return new OptionsParser("nettisa", "Parse NetTiSA flow"); }
177177
std::string get_name() const { return "nettisa"; }
178178
RecordExt* get_ext() const { return new RecordExtNETTISA(); }

utils.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,4 +132,10 @@ uint32_t variable2ipfix_buffer(uint8_t* buffer2write, uint8_t* buffer2read, uint
132132
return ptr + len;
133133
}
134134

135-
} // namespace ipxp
135+
uint64_t timeval2usec(const struct timeval& tv)
136+
{
137+
constexpr size_t usec_in_sec = 1000000;
138+
return tv.tv_sec * usec_in_sec + tv.tv_usec;
139+
}
140+
141+
} // namespace ipxp

0 commit comments

Comments
 (0)