Skip to content

Commit 1f4b212

Browse files
authored
Merge pull request #161 from CESNET/nettisa
Introduce Nettisa plugin
2 parents ec147b4 + d8e4048 commit 1f4b212

File tree

7 files changed

+447
-72
lines changed

7 files changed

+447
-72
lines changed

Makefile.am

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,9 @@ ipfixprobe_process_src=\
128128
process/ssadetector.hpp \
129129
process/ssadetector.cpp \
130130
process/icmp.hpp \
131-
process/icmp.cpp
131+
process/icmp.cpp \
132+
process/nettisa.hpp \
133+
process/nettisa.cpp
132134

133135
if WITH_QUIC
134136
ipfixprobe_process_src+=\

README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,25 @@ Fields without `_REV` suffix are fields from source flow. Fields with `_REV` are
239239
| TCP_MSS_REV | uint32 | TCP maximum segment size |
240240
| TCP_SYN_SIZE | uint16 | TCP SYN packet size |
241241

242+
### NetTiSA
243+
List of unirec fields exported together with NetTiSA flow fields on interface by nettisa plugin.
244+
245+
| Output field | Type | Description |
246+
|:------------:|:------:|:---------------------------:|
247+
| NTS_MEAN | float | The mean of the payload lengths of packets |
248+
| NTS_MIN | uint16 | Minimal value from all packet payload lengths |
249+
| NTS_MAX | uint16 | Maximum value from all packet payload lengths |
250+
| NTS_STDEV | float | Represents a switching ratio between different values of the sequence of observation. |
251+
| NTS_KURTOSIS | float | The standard deviation is measure of the variation of data from the mean. |
252+
| NTS_ROOT_MEAN_SQUARE | float | The measure of the magnitude of payload lengths of packets. |
253+
| NTS_AVERAGE_DISPERSION | float | The average absolute difference between each payload length of packet and the mean value. |
254+
| NTS_MEAN_SCALED_TIME | float | The kurtosis is the measure describing the extent to which the tails of a distribution differ from the tails of a normal distribution. |
255+
| NTS_MEAN_DIFFTIMES | float | The scaled times is defined as sequence $\{st\} = \{ t_1 - t_1, t_2 - t_1, \dots, t_n - t_1 \}$. We compute the mean of the value with same method as for feature \textit{Mean}. |
256+
| NTS_MIN_DIFFTIMES | float | The time differences is defined as sequence $ \{dt\} = \{ t_j - t_i \| j = i + 1, i \in \{1, 2, \dots, n - 1\}\}$. We compute the mean of the value with same method as for feature \textit{Mean}. |
257+
| NTS_MAX_DIFFTIMES | float | Minimal value from all time differences, i.e., min space between packets. |
258+
| NTS_TIME_DISTRIBUTION | float | Maximum value from all time differences, i.e., max space between packets. |
259+
| NTS_SWITCHING_RATIO | float | Describes the distribution of time differences between individual packets. |
260+
242261
### HTTP
243262
List of unirec fields exported together with basic flow fields on interface by HTTP plugin.
244263

include/ipfixprobe/byte-utils.hpp

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@
3131
#ifndef IPXP_BYTE_UTILS_HPP
3232
#define IPXP_BYTE_UTILS_HPP
3333

34-
#include <stdint.h>
34+
#include <arpa/inet.h>
3535
#include <endian.h>
36+
#include <stdint.h>
3637

3738
namespace ipxp {
3839

@@ -44,21 +45,29 @@ namespace ipxp {
4445
#if defined(__BYTE_ORDER) && __BYTE_ORDER == __BIG_ENDIAN
4546
static inline uint64_t swap_uint64(uint64_t value)
4647
{
47-
return value;
48+
return value;
4849
}
4950
#elif defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN
5051
static inline uint64_t swap_uint64(uint64_t value)
5152
{
52-
value = ((value << 8) & 0xFF00FF00FF00FF00ULL ) | ((value >> 8) & 0x00FF00FF00FF00FFULL );
53-
value = ((value << 16) & 0xFFFF0000FFFF0000ULL ) | ((value >> 16) & 0x0000FFFF0000FFFFULL );
54-
return (value << 32) | (value >> 32);
53+
value = ((value << 8) & 0xFF00FF00FF00FF00ULL) | ((value >> 8) & 0x00FF00FF00FF00FFULL);
54+
value = ((value << 16) & 0xFFFF0000FFFF0000ULL) | ((value >> 16) & 0x0000FFFF0000FFFFULL);
55+
return (value << 32) | (value >> 32);
5556
}
56-
# else
57-
# error "Please fix <endian.h>"
58-
# endif
57+
#else
58+
#error "Please fix <endian.h>"
59+
#endif
5960

60-
void phton64(uint8_t *p, uint64_t v);
61-
uint64_t pntoh64(const void *p);
61+
void phton64(uint8_t* p, uint64_t v);
62+
uint64_t pntoh64(const void* p);
63+
64+
/**
65+
* \brief Swaps byte order of float value.
66+
* @param value Value to swap
67+
* @return Swapped value
68+
*/
69+
uint32_t htonf(float value);
70+
71+
} // namespace ipxp
6272

63-
}
6473
#endif /* IPXP_BYTE_UTILS_HPP */

include/ipfixprobe/ipfix-elements.hpp

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,21 @@ namespace ipxp {
260260
#define WG_SRC_PEER(F) F(8057, 1101, 4, nullptr)
261261
#define WG_DST_PEER(F) F(8057, 1102, 4, nullptr)
262262

263+
#define NTS_MEAN(F) F(8057, 1020, 4, nullptr)
264+
#define NTS_MIN(F) F(8057, 1021, 2, nullptr)
265+
#define NTS_MAX(F) F(8057, 1022, 2, nullptr)
266+
#define NTS_STDEV(F) F(8057, 1023, 4, nullptr)
267+
#define NTS_KURTOSIS(F) F(8057, 1024, 4, nullptr)
268+
#define NTS_ROOT_MEAN_SQUARE(F) F(8057, 1025, 4, nullptr)
269+
#define NTS_AVERAGE_DISPERSION(F) F(8057, 1026, 4, nullptr)
270+
#define NTS_MEAN_SCALED_TIME(F) F(8057, 1027, 4, nullptr)
271+
#define NTS_MEAN_DIFFTIMES(F) F(8057, 1028, 4, nullptr)
272+
#define NTS_MIN_DIFFTIMES(F) F(8057, 1029, 4, nullptr)
273+
#define NTS_MAX_DIFFTIMES(F) F(8057, 1030, 4, nullptr)
274+
#define NTS_TIME_DISTRIBUTION(F) F(8057, 1031, 4, nullptr)
275+
#define NTS_SWITCHING_RATIO(F) F(8057, 1032, 4, nullptr)
276+
277+
263278
/**
264279
* IPFIX Templates - list of elements
265280
*
@@ -494,6 +509,21 @@ namespace ipxp {
494509
#define IPFIX_ICMP_TEMPLATE(F) \
495510
F(L4_ICMP_TYPE_CODE)
496511

512+
#define IPFIX_NETTISA_TEMPLATE(F) \
513+
F(NTS_MEAN) \
514+
F(NTS_MIN) \
515+
F(NTS_MAX) \
516+
F(NTS_STDEV) \
517+
F(NTS_KURTOSIS) \
518+
F(NTS_ROOT_MEAN_SQUARE) \
519+
F(NTS_AVERAGE_DISPERSION) \
520+
F(NTS_MEAN_SCALED_TIME) \
521+
F(NTS_MEAN_DIFFTIMES) \
522+
F(NTS_MIN_DIFFTIMES) \
523+
F(NTS_MAX_DIFFTIMES) \
524+
F(NTS_TIME_DISTRIBUTION) \
525+
F(NTS_SWITCHING_RATIO)
526+
497527
#ifdef WITH_FLEXPROBE
498528
#define IPFIX_FLEXPROBE_DATA_TEMPLATE(F) F(FX_FRAME_SIGNATURE) F(FX_INPUT_INTERFACE)
499529
#define IPFIX_FLEXPROBE_TCP_TEMPLATE(F) F(FX_TCP_TRACKING)
@@ -537,7 +567,8 @@ namespace ipxp {
537567
IPFIX_FLEXPROBE_TCP_TEMPLATE(F) \
538568
IPFIX_FLEXPROBE_ENCR_TEMPLATE(F) \
539569
IPFIX_SSADETECTOR_TEMPLATE(F) \
540-
IPFIX_ICMP_TEMPLATE(F)
570+
IPFIX_ICMP_TEMPLATE(F) \
571+
IPFIX_NETTISA_TEMPLATE(F)
541572

542573
/**
543574
* Helper macro, convert FIELD into its name as a C literal.

process/nettisa.cpp

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
/**
2+
* \file nettisa.cpp
3+
* \brief Plugin for creating NetTiSA flow.
4+
* \author Josef Koumar [email protected]
5+
* \date 2023
6+
*/
7+
8+
#include "nettisa.hpp"
9+
10+
#include <cmath>
11+
#include <iostream>
12+
13+
namespace ipxp {
14+
15+
int RecordExtNETTISA::REGISTERED_ID = -1;
16+
17+
__attribute__((constructor)) static void register_this_plugin()
18+
{
19+
static PluginRecord rec = PluginRecord("nettisa", []() { return new NETTISAPlugin(); });
20+
register_plugin(&rec);
21+
RecordExtNETTISA::REGISTERED_ID = register_extension();
22+
}
23+
24+
NETTISAPlugin::NETTISAPlugin() {}
25+
26+
NETTISAPlugin::~NETTISAPlugin() {}
27+
28+
void NETTISAPlugin::init(const char* params) {}
29+
30+
void NETTISAPlugin::close() {}
31+
32+
ProcessPlugin* NETTISAPlugin::copy()
33+
{
34+
return new NETTISAPlugin(*this);
35+
}
36+
37+
void NETTISAPlugin::update_record(
38+
RecordExtNETTISA* nettisa_data,
39+
const Packet& pkt,
40+
const Flow& rec)
41+
{
42+
float variation_from_mean = pkt.payload_len_wire - nettisa_data->mean;
43+
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;
46+
// MEAN
47+
nettisa_data->mean += (variation_from_mean) / n;
48+
// MIN
49+
nettisa_data->min = std::min(nettisa_data->min, pkt.payload_len_wire);
50+
// MAX
51+
nettisa_data->max = std::max(nettisa_data->max, pkt.payload_len_wire);
52+
// ROOT MEAN SQUARE
53+
nettisa_data->root_mean_square += pow(pkt.payload_len_wire, 2);
54+
// AVERAGE DISPERSION
55+
nettisa_data->average_dispersion += abs(variation_from_mean);
56+
// KURTOSIS
57+
nettisa_data->kurtosis += pow(variation_from_mean, 4);
58+
// MEAN SCALED TIME
59+
nettisa_data->mean_scaled_time
60+
+= (pkt.ts.tv_usec - rec.time_first.tv_usec - nettisa_data->mean_scaled_time) / n;
61+
// MEAN TIME DIFFERENCES
62+
nettisa_data->mean_difftimes += (diff_time - nettisa_data->mean_difftimes) / n;
63+
// MIN
64+
nettisa_data->min_difftimes = fmin(nettisa_data->min_difftimes, diff_time);
65+
// MAX
66+
nettisa_data->max_difftimes = fmax(nettisa_data->max_difftimes, diff_time);
67+
// TIME DISTRIBUTION
68+
nettisa_data->time_distribution += abs(nettisa_data->mean_difftimes - diff_time);
69+
// SWITCHING RATIO
70+
if (nettisa_data->prev_payload != pkt.packet_len_wire) {
71+
nettisa_data->switching_ratio += 1;
72+
nettisa_data->prev_payload = pkt.packet_len_wire;
73+
}
74+
}
75+
76+
int NETTISAPlugin::post_create(Flow& rec, const Packet& pkt)
77+
{
78+
RecordExtNETTISA* nettisa_data = new RecordExtNETTISA();
79+
rec.add_extension(nettisa_data);
80+
81+
nettisa_data->prev_time = pkt.ts.tv_usec;
82+
83+
update_record(nettisa_data, pkt, rec);
84+
return 0;
85+
}
86+
87+
int NETTISAPlugin::post_update(Flow& rec, const Packet& pkt)
88+
{
89+
RecordExtNETTISA* nettisa_data
90+
= (RecordExtNETTISA*) rec.get_extension(RecordExtNETTISA::REGISTERED_ID);
91+
update_record(nettisa_data, pkt, rec);
92+
return 0;
93+
}
94+
95+
void NETTISAPlugin::pre_export(Flow& rec)
96+
{
97+
RecordExtNETTISA* nettisa_data
98+
= (RecordExtNETTISA*) rec.get_extension(RecordExtNETTISA::REGISTERED_ID);
99+
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);
104+
nettisa_data->root_mean_square = pow(nettisa_data->root_mean_square / n, 0.5);
105+
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);
109+
}
110+
111+
} // namespace ipxp

0 commit comments

Comments
 (0)