Skip to content

Commit 72f3565

Browse files
committed
++
1 parent 7c5dcad commit 72f3565

File tree

8 files changed

+89
-45
lines changed

8 files changed

+89
-45
lines changed

new-process-api/directionalField.hpp

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,42 +4,46 @@
44

55
class Direction {
66
private:
7-
enum class Value : std::size_t {};
8-
public:
9-
constexpr static Value Forward = static_cast<Value>(0);
10-
constexpr static Value Reverse = static_cast<Value>(1);
7+
enum class Value : std::size_t {Forward, Reverse};
118

129
constexpr Direction(const Value value) noexcept
1310
: m_value(value) {}
1411

12+
public:
13+
const static Direction Forward;
14+
const static Direction Reverse;
15+
1516
constexpr Direction(const bool value) noexcept
1617
: m_value(static_cast<Value>(value)) {}
1718

18-
constexpr operator Value() const noexcept
19+
constexpr operator bool() const noexcept
1920
{
20-
return m_value;
21+
return static_cast<bool>(m_value);
2122
}
2223

2324
constexpr Direction operator!() const noexcept
2425
{
25-
return m_value == Direction::Forward ? Direction::Reverse : Direction::Forward;
26+
return Direction(!static_cast<bool>(m_value));
2627
}
28+
2729
private:
2830
Value m_value;
2931
};
3032

33+
const Direction Direction::Forward = Direction(Value::Forward);
34+
const Direction Direction::Reverse = Direction(Value::Reverse);
3135

3236
template<typename T>
3337
struct DirectionalField {
3438
T values[2]{};
3539

36-
constexpr T& operator[](Direction d)
40+
constexpr T& operator[](const Direction d)
3741
{
38-
return d == Direction::Forward ? values[0] : values[1];
42+
return values[static_cast<bool>(d)];
3943
}
4044

41-
constexpr const T& operator[](Direction d) const
45+
constexpr const T& operator[](const Direction d) const
4246
{
43-
return d == Direction::Forward ? values[0] : values[1];
47+
return values[static_cast<bool>(d)];
4448
}
4549
};

new-process-api/process/basicPlus/src/basicPlus.cpp

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include <pluginFactory.hpp>
2020
#include <fieldSchema.hpp>
2121
#include <fieldManager.hpp>
22+
#include <tcpData.hpp>
2223

2324
namespace ipxp {
2425

@@ -97,31 +98,32 @@ PluginInitResult BasicPlusPlugin::onInit(const FlowContext& flowContext, void* p
9798
{
9899
auto* pluginData = std::construct_at(reinterpret_cast<BasicPlusData*>(pluginContext));
99100

100-
pluginData->ipTTL[Direction::Forward] = flowContext.packet.ipTTL;
101+
pluginData->ipTTL[Direction::Forward] = flowContext.packet.ip_ttl;
101102
m_fieldHandlers[BasicPlusFields::IP_TTL].setAsAvailable(flowContext.flowRecord);
102103

103-
pluginData->ipFlag[Direction::Forward] = flowContext.packet.ipFlags;
104+
pluginData->ipFlag[Direction::Forward] = flowContext.packet.ip_flags;
104105
m_fieldHandlers[BasicPlusFields::IP_FLG].setAsAvailable(flowContext.flowRecord);
105106

106-
if (!flowContext.packet.tcpData.has_value()) {
107+
constexpr std::size_t TCP = 6;
108+
if (flowContext.packet.ip_proto != TCP) {
107109
return {
108110
.constructionState = ConstructionState::Constructed,
109111
.updateRequirement = UpdateRequirement::RequiresUpdate,
110112
.flowAction = FlowAction::NoAction,
111113
};
112114
}
113115

114-
pluginData->tcpWindow[Direction::Forward] = flowContext.packet.tcpData->window;
116+
pluginData->tcpWindow[Direction::Forward] = flowContext.packet.tcp_window;
115117
m_fieldHandlers[BasicPlusFields::TCP_WIN].setAsAvailable(flowContext.flowRecord);
116118

117-
pluginData->tcpOption[Direction::Forward] = flowContext.packet.tcpData->options;
119+
pluginData->tcpOption[Direction::Forward] = flowContext.packet.tcp_options;
118120
m_fieldHandlers[BasicPlusFields::TCP_OPT].setAsAvailable(flowContext.flowRecord);
119121

120-
pluginData->tcpMSS[Direction::Forward] = flowContext.packet.tcpData->mss;
122+
pluginData->tcpMSS[Direction::Forward] = flowContext.packet.tcp_mss;
121123
m_fieldHandlers[BasicPlusFields::TCP_MSS].setAsAvailable(flowContext.flowRecord);
122124

123-
if (flowContext.packet.tcpData->flags.bitfields.synchronize) { // check if SYN packet
124-
pluginData->tcpSynSize = flowContext.packet.ipLength;
125+
if (TCPFlags(flowContext.packet.tcp_flags).bitfields.synchronize) { // check if SYN packet
126+
pluginData->tcpSynSize = flowContext.packet.ip_len;
125127
m_fieldHandlers[BasicPlusFields::TCP_SYN_SIZE].setAsAvailable(flowContext.flowRecord);
126128
}
127129

@@ -136,38 +138,39 @@ PluginUpdateResult BasicPlusPlugin::onUpdate(const FlowContext& flowContext, voi
136138
{
137139
auto* pluginData = reinterpret_cast<BasicPlusData*>(pluginContext);
138140

139-
pluginData->ipTTL[flowContext.packet.direction]
140-
= std::min(pluginData->ipTTL[flowContext.packet.direction], flowContext.packet.ipTTL);
141+
pluginData->ipTTL[flowContext.packet.source_pkt]
142+
= std::min(pluginData->ipTTL[flowContext.packet.source_pkt], flowContext.packet.ip_ttl);
141143

142-
if (!flowContext.packet.tcpData.has_value()) {
144+
constexpr std::size_t TCP = 6;
145+
if (flowContext.packet.ip_proto != TCP) {
143146
return {
144147
.updateRequirement = UpdateRequirement::RequiresUpdate,
145148
.flowAction = FlowAction::NoAction,
146149
};
147150
}
148151

149-
pluginData->tcpOption[flowContext.packet.direction] |= flowContext.packet.tcpData->options;
152+
pluginData->tcpOption[flowContext.packet.source_pkt] |= flowContext.packet.tcp_options;
150153

151-
if (flowContext.packet.direction == Direction::Forward) {
154+
if (flowContext.packet.source_pkt == Direction::Forward) {
152155
return {
153156
.updateRequirement = UpdateRequirement::RequiresUpdate,
154157
.flowAction = FlowAction::NoAction,
155158
};
156159
}
157160

158-
pluginData->ipTTL[Direction::Reverse] = flowContext.packet.ipTTL;
161+
pluginData->ipTTL[Direction::Reverse] = flowContext.packet.ip_ttl;
159162
m_fieldHandlers[BasicPlusFields::IP_TTL_REV].setAsAvailable(flowContext.flowRecord);
160163

161-
pluginData->ipFlag[Direction::Reverse] = flowContext.packet.ipFlags;
164+
pluginData->ipFlag[Direction::Reverse] = flowContext.packet.ip_flags;
162165
m_fieldHandlers[BasicPlusFields::IP_FLG_REV].setAsAvailable(flowContext.flowRecord);
163166

164-
pluginData->tcpWindow[Direction::Reverse] = flowContext.packet.tcpData->window;
167+
pluginData->tcpWindow[Direction::Reverse] = flowContext.packet.tcp_window;
165168
m_fieldHandlers[BasicPlusFields::TCP_WIN_REV].setAsAvailable(flowContext.flowRecord);
166169

167-
pluginData->tcpOption[Direction::Reverse] = flowContext.packet.tcpData->options;
170+
pluginData->tcpOption[Direction::Reverse] = flowContext.packet.tcp_options;
168171
m_fieldHandlers[BasicPlusFields::TCP_OPT_REV].setAsAvailable(flowContext.flowRecord);
169172

170-
pluginData->tcpMSS[Direction::Reverse] = flowContext.packet.tcpData->mss;
173+
pluginData->tcpMSS[Direction::Reverse] = flowContext.packet.tcp_mss;
171174
m_fieldHandlers[BasicPlusFields::TCP_MSS_REV].setAsAvailable(flowContext.flowRecord);
172175

173176
return {
@@ -181,11 +184,6 @@ void BasicPlusPlugin::onDestroy(void* pluginContext)
181184
std::destroy_at(reinterpret_cast<BasicPlusData*>(pluginContext));
182185
}
183186

184-
std::string BasicPlusPlugin::getName() const noexcept
185-
{
186-
return basicPlusPluginManifest.name;
187-
}
188-
189187
PluginDataMemoryLayout BasicPlusPlugin::getDataMemoryLayout() const noexcept
190188
{
191189
return {

new-process-api/process/basicPlus/src/basicPlus.hpp

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,6 @@
1515
#include <sstream>
1616
#include <string>
1717

18-
//#include <ipfixprobe/byte-utils.hpp>
19-
//#include <ipfixprobe/flowifc.hpp>
20-
//#include <ipfixprobe/ipfix-elements.hpp>
21-
//#include <ipfixprobe/packet.hpp>
22-
//#include <ipfixprobe/processPlugin.hpp>
23-
2418
#include <processPlugin.hpp>
2519
#include <fieldManager.hpp>
2620
#include <fieldHandlersEnum.hpp>
@@ -31,20 +25,56 @@
3125
namespace ipxp {
3226

3327
/**
34-
* \brief Basic flow cache plugin.
28+
* @class BasicPlusPlugin
29+
* @brief A plugin for collecting basic statistics about the flow: IP TTL, flags, TCP window, options, MSS and SYN length.
30+
*
31+
* @note Duplicate and empty packets can be optionally skipped.
3532
*/
3633
class BasicPlusPlugin : public ProcessPlugin {
3734
public:
35+
/**
36+
* @brief Constructs the BasicPlus plugin.
37+
*
38+
* @param parameters Plugin parameters as a string (currently unused).
39+
* @param fieldManager Reference to the FieldManager for field registration.
40+
*/
3841
BasicPlusPlugin(const std::string& params, FieldManager& manager);
3942

43+
/**
44+
* @brief Initializes plugin data for a new flow.
45+
*
46+
* Constructs `BasicPlusData` in `pluginContext` and initializes it with
47+
* the first packet's IP TTL and flags. If flow is TCP also adds MSS, options
48+
* and window. If TCP SYN packet, also adds SYN length.
49+
*
50+
* @param flowContext Contextual information about the flow to fill new record.
51+
* @param pluginContext Pointer to pre-allocated memory to create record.
52+
* @return Result of the initialization process.
53+
*/
4054
PluginInitResult onInit(const FlowContext& flowContext, void* pluginContext) override;
4155

56+
/**
57+
* @brief Updates plugin data with values from new packet.
58+
*
59+
* Updates `BasicPlusData` to obtain minimum IP TTL and TCP options cumulative
60+
* from `pluginContext`. Also updates same fields as `onInit` from reverse direction.
61+
*
62+
* @param flowContext Contextual information about the flow to be updated.
63+
* @param pluginContext Pointer to `BasicPlusData`.
64+
* @return Result of the update, may not require new packets if both directions are observed.
65+
*/
4266
PluginUpdateResult onUpdate(const FlowContext& flowContext, void* pluginContext) override;
4367

68+
/**
69+
* @brief Cleans up and destroys `BasicPlusData`.
70+
* @param pluginContext Pointer to `BasicPlusData`.
71+
*/
4472
void onDestroy(void* pluginContext) override;
4573

46-
std::string getName() const noexcept override;
47-
74+
/**
75+
* @brief Provides the memory layout of `BasicPlusData`.
76+
* @return Memory layout description for the plugin data.
77+
*/
4878
PluginDataMemoryLayout getDataMemoryLayout() const noexcept override;
4979

5080
private:
-13 KB
Binary file not shown.

new-process-api/process/basicPlus/src/basicPlusFields.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@
55
namespace ipxp
66
{
77

8+
/**
9+
* @enum BasicPlusFields
10+
* @brief Enumerates the fields exported by the BasicPlus plugin.
11+
*
12+
* These enum values are used to index field handlers for this plugin.
13+
*/
814
enum class BasicPlusFields : std::size_t {
915
IP_TTL = 0,
1016
IP_TTL_REV,

new-process-api/process/pstats/src/packetStatsData.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ namespace ipxp
1818
*
1919
*/
2020
struct PacketStatsData {
21-
/// Initial reserved size for stora.
21+
/// Initial reserved size for the storage.
2222
constexpr static std::size_t INITIAL_SIZE = 5;
2323
/// Maximum storage size.
2424
constexpr static std::size_t MAX_SIZE = 30;

new-process-api/process/pstats/src/packetStatsFields.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@
55
namespace ipxp
66
{
77

8+
/**
9+
* @enum PacketStatsFields
10+
* @brief Enumerates the fields exported by the PacketStats plugin.
11+
*
12+
* These enum values are used to index field handlers for this plugin.
13+
*/
814
enum class PacketStatsFields : std::size_t {
915
PPI_PKT_LENGTHS = 0,
1016
PPI_PKT_TIMES,

new-process-api/tcpData.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ struct TCPData {
1111
uint16_t window{0};
1212
uint64_t options{0};
1313
uint32_t mss{0};
14-
TcpFlags flags{};
14+
TCPFlags flags{};
1515
uint32_t sequence{0};
1616
uint32_t acknowledgment{0};
1717
};

0 commit comments

Comments
 (0)