99
1010#include < cmath>
1111#include < iostream>
12+ #include < ipfixprobe/utils.hpp>
1213
1314namespace 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-
3225ProcessPlugin* 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
0 commit comments