Skip to content

Commit c3dbda5

Browse files
Zainullin DamirZainullin Damir
authored andcommitted
++
1 parent 47879b5 commit c3dbda5

File tree

11 files changed

+127
-364
lines changed

11 files changed

+127
-364
lines changed

include/ipfixprobe/processPlugin/directionalField.hpp

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,24 @@
44

55
class Direction {
66
private:
7-
enum class Value : std::size_t {Forward, Reverse};
7+
enum class Value : std::size_t { Forward, Reverse };
88

9-
constexpr Direction(const Value value) noexcept
10-
: m_value(value) {}
9+
constexpr Direction(const Value value) noexcept
10+
: m_value(value)
11+
{
12+
}
1113

1214
public:
1315
const static Direction Forward;
1416
const static Direction Reverse;
1517

16-
constexpr Direction(const bool value) noexcept
17-
: m_value(static_cast<Value>(value)) {}
18-
19-
constexpr operator bool() const noexcept
18+
constexpr Direction(const bool value) noexcept
19+
: m_value(static_cast<Value>(value))
2020
{
21-
return static_cast<bool>(m_value);
2221
}
2322

23+
constexpr operator bool() const noexcept { return static_cast<bool>(m_value); }
24+
2425
constexpr Direction operator!() const noexcept
2526
{
2627
return Direction(!static_cast<bool>(m_value));
@@ -35,15 +36,9 @@ inline const Direction Direction::Reverse = Direction(Value::Reverse);
3536

3637
template<typename T>
3738
struct DirectionalField {
38-
T values[2]{};
39+
T values[2] {};
3940

40-
constexpr T& operator[](const Direction d)
41-
{
42-
return values[static_cast<bool>(d)];
43-
}
41+
constexpr T& operator[](const Direction d) { return values[static_cast<bool>(d)]; }
4442

45-
constexpr const T& operator[](const Direction d) const
46-
{
47-
return values[static_cast<bool>(d)];
48-
}
43+
constexpr const T& operator[](const Direction d) const { return values[static_cast<bool>(d)]; }
4944
};

src/plugins/output/unirec/src/unirec.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,8 @@ void UnirecExporter::processRecord(FlowRecordUniquePtr& flowRecord)
508508
int ext_processed_cnd = 0;
509509

510510
std::ranges::for_each(m_fieldManager.getBiflowFields(), [&, index = 0](const FieldDescriptor& fieldDescriptor) mutable {
511-
ext_processed_cnd++;
511+
ext_processed_cnd++;
512+
std::cout << "Bit index is " << fieldDescriptor.getBitIndex() << "\n";
512513
const void* pluginExportData = flowRecord->getPluginContext(fieldDescriptor.getBitIndex());
513514
if (!fieldDescriptor.isInRecord(*flowRecord)) {
514515
return;
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# BasicPlus Plugin
2+
3+
The **BasicPlus Plugin** is a module for the IPFIXprobe exporter, designed to extend flow records with additional basic network information.
4+
5+
## Features
6+
7+
- Extends basic flow export data.
8+
- Extracts and exports additional fields from network flows.
9+
10+
11+
## Output Fields
12+
13+
| Field Name | Data Type | Description |
14+
|-----------------|-----------|-------------------------------------------------------------|
15+
| IP_TTL | uint8_t | IP time-to-live in source-to-destination direction |
16+
| IP_TTL_REV | uint8_t | IP time-to-live in destination-to-source direction |
17+
| IP_FLG | uint8_t | IP flags in source-to-destination direction |
18+
| IP_FLG_REV | uint8_t | IP flags in destination-to-source direction |
19+
| TCP_WIN | uint16_t | TCP window size in source-to-destination direction |
20+
| TCP_WIN_REV | uint16_t | TCP window size in destination-to-source direction |
21+
| TCP_OPT | uint8_t | TCP options in source-to-destination direction |
22+
| TCP_OPT_REV | uint8_t | TCP options in destination-to-source direction |
23+
| TCP_MSS | uint16_t | TCP maximum segment size in source-to-destination direction |
24+
| TCP_MSS_REV | uint16_t | TCP maximum segment size in destination-to-source direction |
25+
| TCP_SYN_SIZE | uint16_t | TCP syn packet size (only one in bidirectional flow) |
26+
27+
## Usage
28+
29+
Once enabled, the plugin will automatically process flows and add the export fields to each record.
30+
31+
1. ``` make install ```.
32+
2. ``` ipfixprobe -p "basicplus" ... " ```
33+
3. Extracted values are exported to the output interface.
34+
35+
## Support
36+
37+
For issues or feature requests, please open an issue in the [IPFIXprobe repository](https://github.com/CESNET/ipfixprobe).

src/plugins/process/basicPlus/src/basicPlus.cpp

Lines changed: 58 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,12 @@
1616

1717
#include <iostream>
1818

19-
#include <ipfixprobe/pluginFactory/pluginManifest.hpp>
20-
#include <ipfixprobe/pluginFactory/pluginRegistrar.hpp>
21-
//#include <pluginManifest.hpp>
22-
//#include <pluginRegistrar.hpp>
23-
//#include <pluginFactory.hpp>
2419
#include <fieldGroup.hpp>
2520
#include <fieldManager.hpp>
26-
#include <tcpData.hpp>
2721
#include <ipfixprobe/options.hpp>
22+
#include <ipfixprobe/pluginFactory/pluginManifest.hpp>
23+
#include <ipfixprobe/pluginFactory/pluginRegistrar.hpp>
24+
#include <tcpData.hpp>
2825

2926
namespace ipxp {
3027

@@ -42,59 +39,83 @@ static const PluginManifest basicPlusPluginManifest = {
4239
},
4340
};
4441

45-
46-
static FieldGroup createBasicPlusSchema(FieldManager& fieldManager, FieldHandlers<BasicPlusFields>& handlers)
42+
static FieldGroup
43+
createBasicPlusSchema(FieldManager& fieldManager, FieldHandlers<BasicPlusFields>& handlers)
4744
{
4845
FieldGroup schema = fieldManager.createFieldGroup("basicplus");
4946

5047
auto [ipTTLField, ipTTLRevField] = schema.addScalarDirectionalFields(
51-
"IP_TTL", "IP_TTL_REV",
52-
[](const void* context) { return reinterpret_cast<const BasicPlusData*>(context)->ipTTL[Direction::Forward]; },
53-
[](const void* context) { return reinterpret_cast<const BasicPlusData*>(context)->ipTTL[Direction::Reverse]; }
54-
);
48+
"IP_TTL",
49+
"IP_TTL_REV",
50+
[](const void* context) {
51+
return reinterpret_cast<const BasicPlusData*>(context)->ipTTL[Direction::Forward];
52+
},
53+
[](const void* context) {
54+
return reinterpret_cast<const BasicPlusData*>(context)->ipTTL[Direction::Reverse];
55+
});
5556
handlers.insert(BasicPlusFields::IP_TTL, ipTTLField);
5657
handlers.insert(BasicPlusFields::IP_TTL_REV, ipTTLRevField);
5758

5859
auto [ipFlagField, ipFlagRevField] = schema.addScalarDirectionalFields(
59-
"IP_FLG", "IP_FLG_REV",
60-
[](const void* context) { return reinterpret_cast<const BasicPlusData*>(context)->ipFlag[Direction::Forward]; },
61-
[](const void* context) { return reinterpret_cast<const BasicPlusData*>(context)->ipFlag[Direction::Reverse]; }
62-
);
60+
"IP_FLG",
61+
"IP_FLG_REV",
62+
[](const void* context) {
63+
return reinterpret_cast<const BasicPlusData*>(context)->ipFlag[Direction::Forward];
64+
},
65+
[](const void* context) {
66+
return reinterpret_cast<const BasicPlusData*>(context)->ipFlag[Direction::Reverse];
67+
});
6368
handlers.insert(BasicPlusFields::IP_FLG, ipFlagField);
6469
handlers.insert(BasicPlusFields::IP_FLG_REV, ipFlagRevField);
6570

6671
auto [tcpWinField, tcpWinRevField] = schema.addScalarDirectionalFields(
67-
"TCP_WIN", "TCP_WIN_REV",
68-
[](const void* context) { return reinterpret_cast<const BasicPlusData*>(context)->tcpWindow[Direction::Forward]; },
69-
[](const void* context) { return reinterpret_cast<const BasicPlusData*>(context)->tcpWindow[Direction::Reverse]; }
70-
);
72+
"TCP_WIN",
73+
"TCP_WIN_REV",
74+
[](const void* context) {
75+
return reinterpret_cast<const BasicPlusData*>(context)->tcpWindow[Direction::Forward];
76+
},
77+
[](const void* context) {
78+
return reinterpret_cast<const BasicPlusData*>(context)->tcpWindow[Direction::Reverse];
79+
});
7180
handlers.insert(BasicPlusFields::TCP_WIN, tcpWinField);
7281
handlers.insert(BasicPlusFields::TCP_WIN_REV, tcpWinRevField);
7382

7483
auto [tcpOptField, tcpOptRevField] = schema.addScalarDirectionalFields(
75-
"TCP_OPT", "TCP_OPT_REV",
76-
[](const void* context) { return reinterpret_cast<const BasicPlusData*>(context)->tcpOption[Direction::Forward]; },
77-
[](const void* context) { return reinterpret_cast<const BasicPlusData*>(context)->tcpOption[Direction::Reverse]; }
78-
);
84+
"TCP_OPT",
85+
"TCP_OPT_REV",
86+
[](const void* context) {
87+
return reinterpret_cast<const BasicPlusData*>(context)->tcpOption[Direction::Forward];
88+
},
89+
[](const void* context) {
90+
return reinterpret_cast<const BasicPlusData*>(context)->tcpOption[Direction::Reverse];
91+
});
7992
handlers.insert(BasicPlusFields::TCP_OPT, tcpOptField);
8093
handlers.insert(BasicPlusFields::TCP_OPT_REV, tcpOptRevField);
8194

8295
auto [tcpMSSField, tcpMSSRevField] = schema.addScalarDirectionalFields(
83-
"TCP_MSS", "TCP_MSS_REV",
84-
[](const void* context) { return reinterpret_cast<const BasicPlusData*>(context)->tcpMSS[Direction::Forward]; },
85-
[](const void* context) { return reinterpret_cast<const BasicPlusData*>(context)->tcpMSS[Direction::Reverse]; }
86-
);
96+
"TCP_MSS",
97+
"TCP_MSS_REV",
98+
[](const void* context) {
99+
return reinterpret_cast<const BasicPlusData*>(context)->tcpMSS[Direction::Forward];
100+
},
101+
[](const void* context) {
102+
return reinterpret_cast<const BasicPlusData*>(context)->tcpMSS[Direction::Reverse];
103+
});
87104
handlers.insert(BasicPlusFields::TCP_MSS, tcpMSSField);
88105
handlers.insert(BasicPlusFields::TCP_MSS_REV, tcpMSSRevField);
89106

90-
handlers.insert(BasicPlusFields::TCP_SYN_SIZE, schema.addScalarField("TCP_SYN_SIZE", [](const void* context) {
91-
return static_cast<const BasicPlusData*>(context)->tcpSynSize;
92-
}));
107+
handlers.insert(
108+
BasicPlusFields::TCP_SYN_SIZE,
109+
schema.addScalarField("TCP_SYN_SIZE", [](const void* context) {
110+
return static_cast<const BasicPlusData*>(context)->tcpSynSize;
111+
}));
93112

94113
return schema;
95114
}
96115

97-
BasicPlusPlugin::BasicPlusPlugin([[maybe_unused]]const std::string& params, FieldManager& fieldManager)
116+
BasicPlusPlugin::BasicPlusPlugin(
117+
[[maybe_unused]] const std::string& params,
118+
FieldManager& fieldManager)
98119
{
99120
createBasicPlusSchema(fieldManager, m_fieldHandlers);
100121
}
@@ -142,8 +163,8 @@ PluginInitResult BasicPlusPlugin::onInit(const FlowContext& flowContext, void* p
142163
PluginUpdateResult BasicPlusPlugin::onUpdate(const FlowContext& flowContext, void* pluginContext)
143164
{
144165
auto* pluginData = reinterpret_cast<BasicPlusData*>(pluginContext);
145-
146-
pluginData->ipTTL[flowContext.packet.source_pkt]
166+
167+
pluginData->ipTTL[flowContext.packet.source_pkt]
147168
= std::min(pluginData->ipTTL[flowContext.packet.source_pkt], flowContext.packet.ip_ttl);
148169

149170
constexpr std::size_t TCP = 6;
@@ -184,7 +205,7 @@ PluginUpdateResult BasicPlusPlugin::onUpdate(const FlowContext& flowContext, voi
184205
};
185206
}
186207

187-
void BasicPlusPlugin::onDestroy(void* pluginContext)
208+
void BasicPlusPlugin::onDestroy(void* pluginContext)
188209
{
189210
std::destroy_at(reinterpret_cast<BasicPlusData*>(pluginContext));
190211
}
@@ -197,6 +218,7 @@ PluginDataMemoryLayout BasicPlusPlugin::getDataMemoryLayout() const noexcept
197218
};
198219
}
199220

200-
static const PluginRegistrar<BasicPlusPlugin, ProcessPluginFactory> basicPlusRegistrar(basicPlusPluginManifest);
221+
static const PluginRegistrar<BasicPlusPlugin, ProcessPluginFactory>
222+
basicPlusRegistrar(basicPlusPluginManifest);
201223

202224
} // namespace ipxp

src/plugins/process/basicPlus/src/basicPlus.hpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,22 @@
1414

1515
#pragma once
1616

17+
#include "basicPlusData.hpp"
18+
#include "basicPlusFields.hpp"
19+
1720
#include <sstream>
1821
#include <string>
1922

20-
#include <processPlugin.hpp>
21-
#include <fieldManager.hpp>
2223
#include <fieldHandlersEnum.hpp>
23-
24-
#include "basicPlusData.hpp"
25-
#include "basicPlusFields.hpp"
24+
#include <fieldManager.hpp>
25+
#include <processPlugin.hpp>
2626

2727
namespace ipxp {
2828

2929
/**
3030
* @class BasicPlusPlugin
31-
* @brief A plugin for collecting basic statistics about the flow: IP TTL, flags, TCP window, options, MSS and SYN length.
31+
* @brief A plugin for collecting basic statistics about the flow: IP TTL, flags, TCP window,
32+
* options, MSS and SYN length.
3233
*/
3334
class BasicPlusPlugin : public ProcessPlugin {
3435
public:

src/plugins/process/basicPlus/src/basicPlusData.hpp

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111

1212
#include <directionalField.hpp>
1313

14-
namespace ipxp
15-
{
14+
namespace ipxp {
1615

1716
/**
1817
* @struct BasicPlusExport
@@ -22,13 +21,12 @@ namespace ipxp
2221
* additional TCP-specific metrics.
2322
*/
2423
struct BasicPlusData {
25-
DirectionalField<uint8_t> ipTTL; ///< Directional IP Time-To-Live value
26-
DirectionalField<uint8_t> ipFlag; ///< Directional IP flag value
27-
DirectionalField<uint16_t> tcpWindow; ///< Directional TCP window size
28-
DirectionalField<uint64_t> tcpOption; ///< Directional TCP option value
29-
DirectionalField<uint32_t> tcpMSS; ///< Directional TCP Maximum Segment Size
30-
uint16_t tcpSynSize{0}; ///< Size of TCP SYN packet
31-
};
24+
DirectionalField<uint8_t> ipTTL; ///< Directional IP Time-To-Live value
25+
DirectionalField<uint8_t> ipFlag; ///< Directional IP flag value
26+
DirectionalField<uint16_t> tcpWindow; ///< Directional TCP window size
27+
DirectionalField<uint64_t> tcpOption; ///< Directional TCP option value
28+
DirectionalField<uint32_t> tcpMSS; ///< Directional TCP Maximum Segment Size
29+
uint16_t tcpSynSize {0}; ///< Size of TCP SYN packet
30+
};
3231

3332
} // namespace ipxp
34-

src/plugins/process/basicPlus/src/basicPlusFields.hpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111

1212
#include <cstddef>
1313

14-
namespace ipxp
15-
{
14+
namespace ipxp {
1615

1716
/**
1817
* @enum BasicPlusFields
@@ -33,6 +32,6 @@ enum class BasicPlusFields : std::size_t {
3332
TCP_MSS_REV,
3433
TCP_SYN_SIZE,
3534
FIELDS_SIZE,
36-
};
37-
35+
};
36+
3837
} // namespace ipxp

src/plugins/process/basicplus/CMakeLists.txt

Lines changed: 0 additions & 31 deletions
This file was deleted.

src/plugins/process/basicplus/README.md

Whitespace-only changes.

0 commit comments

Comments
 (0)