88 *
99 * Provides a plugin that extracts packet burst statistics of flows,
1010 * stores them in per-flow plugin data, and exposes fields via FieldManager.
11- *
11+ *
1212 * @copyright Copyright (c) 2025 CESNET, z.s.p.o.
1313 */
1414
1515#include " burstStats.hpp"
16+
1617#include " burstStatsData.hpp"
1718
1819#include < iostream>
1920
20- // #include <ipfixprobe/pluginFactory/pluginManifest.hpp>
21- #include < ipfixprobe/pluginFactory/pluginRegistrar.hpp>
22-
23- // #include <pluginManifest.hpp>
24- // #include <pluginRegistrar.hpp>
25- // #include <pluginFactory.hpp>
2621#include < fieldGroup.hpp>
27- // #include <fieldManager.hpp>
2822#include < ipfixprobe/options.hpp>
23+ #include < ipfixprobe/pluginFactory/pluginRegistrar.hpp>
2924
3025namespace ipxp {
3126
@@ -41,55 +36,77 @@ static const PluginManifest burstStatsPluginManifest = {
4136 },
4237};
4338
44- static FieldGroup createBurstStatsSchema (FieldManager& fieldManager, FieldHandlers<BurstStatsFields>& handlers)
39+ static FieldGroup
40+ createBurstStatsSchema (FieldManager& fieldManager, FieldHandlers<BurstStatsFields>& handlers)
4541{
4642 FieldGroup schema = fieldManager.createFieldGroup (" bstats" );
4743
4844 auto [sourcePacketsField, destPacketsField] = schema.addVectorDirectionalFields (
49- " SBI_BRST_PACKETS" , " DBI_BRST_PACKETS" ,
50- [](const void * context) { return reinterpret_cast <const BurstStatsData*>(context)->getPackets (Direction::Forward); },
51- [](const void * context) { return reinterpret_cast <const BurstStatsData*>(context)->getPackets (Direction::Reverse); }
52- );
45+ " SBI_BRST_PACKETS" ,
46+ " DBI_BRST_PACKETS" ,
47+ [](const void * context) {
48+ return reinterpret_cast <const BurstStatsData*>(context)->getPackets (Direction::Forward);
49+ },
50+ [](const void * context) {
51+ return reinterpret_cast <const BurstStatsData*>(context)->getPackets (Direction::Reverse);
52+ });
5353 handlers.insert (BurstStatsFields::SBI_BRST_PACKETS, sourcePacketsField);
5454 handlers.insert (BurstStatsFields::DBI_BRST_PACKETS, destPacketsField);
5555
5656 auto [sourceBytesField, destBytesField] = schema.addVectorDirectionalFields (
57- " SBI_BRST_BYTES" , " DBI_BRST_BYTES" ,
58- [](const void * context) { return reinterpret_cast <const BurstStatsData*>(context)->getBytes (Direction::Forward); },
59- [](const void * context) { return reinterpret_cast <const BurstStatsData*>(context)->getBytes (Direction::Reverse); }
60- );
57+ " SBI_BRST_BYTES" ,
58+ " DBI_BRST_BYTES" ,
59+ [](const void * context) {
60+ return reinterpret_cast <const BurstStatsData*>(context)->getBytes (Direction::Forward);
61+ },
62+ [](const void * context) {
63+ return reinterpret_cast <const BurstStatsData*>(context)->getBytes (Direction::Reverse);
64+ });
6165 handlers.insert (BurstStatsFields::SBI_BRST_BYTES, sourceBytesField);
6266 handlers.insert (BurstStatsFields::DBI_BRST_BYTES, destBytesField);
6367
64-
6568 auto [sourceTimeStartField, destTimeStartField] = schema.addVectorDirectionalFields (
66- " SBI_BRST_TIME_START" , " DBI_BRST_TIME_START" ,
67- [](const void * context) { return reinterpret_cast <const BurstStatsData*>(context)->getStartTimestamps (Direction::Forward); },
68- [](const void * context) { return reinterpret_cast <const BurstStatsData*>(context)->getStartTimestamps (Direction::Reverse); }
69- );
69+ " SBI_BRST_TIME_START" ,
70+ " DBI_BRST_TIME_START" ,
71+ [](const void * context) {
72+ return reinterpret_cast <const BurstStatsData*>(context)->getStartTimestamps (
73+ Direction::Forward);
74+ },
75+ [](const void * context) {
76+ return reinterpret_cast <const BurstStatsData*>(context)->getStartTimestamps (
77+ Direction::Reverse);
78+ });
7079 handlers.insert (BurstStatsFields::SBI_BRST_TIME_START, sourceTimeStartField);
7180 handlers.insert (BurstStatsFields::DBI_BRST_TIME_START, destTimeStartField);
7281
7382 auto [sourceTimeStopField, destTimeStopField] = schema.addVectorDirectionalFields (
74- " SBI_BRST_TIME_STOP" , " DBI_BRST_TIME_STOP" ,
75- [](const void * context) { return reinterpret_cast <const BurstStatsData*>(context)->getEndTimestamps (Direction::Forward); },
76- [](const void * context) { return reinterpret_cast <const BurstStatsData*>(context)->getEndTimestamps (Direction::Reverse); }
77- );
83+ " SBI_BRST_TIME_STOP" ,
84+ " DBI_BRST_TIME_STOP" ,
85+ [](const void * context) {
86+ return reinterpret_cast <const BurstStatsData*>(context)->getEndTimestamps (
87+ Direction::Forward);
88+ },
89+ [](const void * context) {
90+ return reinterpret_cast <const BurstStatsData*>(context)->getEndTimestamps (
91+ Direction::Reverse);
92+ });
7893 handlers.insert (BurstStatsFields::SBI_BRST_TIME_STOP, sourceTimeStopField);
7994 handlers.insert (BurstStatsFields::DBI_BRST_TIME_STOP, destTimeStopField);
8095
8196 return schema;
8297}
8398
84- BurstStatsPlugin::BurstStatsPlugin ([[maybe_unused]]const std::string& params, FieldManager& manager)
99+ BurstStatsPlugin::BurstStatsPlugin (
100+ [[maybe_unused]] const std::string& params,
101+ FieldManager& manager)
85102{
86103 createBurstStatsSchema (manager, m_fieldHandlers);
87104}
88105
89106PluginInitResult BurstStatsPlugin::onInit (const FlowContext& flowContext, void * pluginContext)
90107{
91108 auto * pluginData = std::construct_at (reinterpret_cast <BurstStatsData*>(pluginContext));
92-
109+
93110 std::optional<Burst> burst = pluginData->push (Direction::Forward);
94111 updateBursts (*burst, flowContext.packet );
95112
@@ -103,7 +120,7 @@ PluginInitResult BurstStatsPlugin::onInit(const FlowContext& flowContext, void*
103120void BurstStatsPlugin::updateBursts (Burst& burst, const Packet& packet) noexcept
104121{
105122 burst.packets ++;
106- burst.bytes += packet.ip_payload_len ;
123+ burst.bytes += packet.ip_payload_len ;
107124 burst.end .get () = packet.ts ;
108125 if (burst.packets == 1 ) {
109126 burst.start .get () = packet.ts ;
@@ -133,11 +150,12 @@ PluginUpdateResult BurstStatsPlugin::onUpdate(const FlowContext& flowContext, vo
133150 };
134151}
135152
136- PluginExportResult BurstStatsPlugin::onExport (const FlowRecord& flowRecord, [[maybe_unused]] void * pluginContext)
153+ PluginExportResult
154+ BurstStatsPlugin::onExport (const FlowRecord& flowRecord, [[maybe_unused]] void * pluginContext)
137155{
138- const uint32_t packetsTotal
139- = static_cast < uint32_t >(
140- flowRecord. directionalData [Direction::Forward]. packets + flowRecord.directionalData [Direction::Reverse].packets );
156+ const uint32_t packetsTotal = static_cast < uint32_t >(
157+ flowRecord. directionalData [Direction::Forward]. packets
158+ + flowRecord.directionalData [Direction::Reverse].packets );
141159 if (packetsTotal <= MINIMAL_PACKETS_COUNT) {
142160 return {
143161 .flowAction = FlowAction::RemovePlugin,
@@ -171,6 +189,7 @@ PluginDataMemoryLayout BurstStatsPlugin::getDataMemoryLayout() const noexcept
171189 };
172190}
173191
174- static const PluginRegistrar<BurstStatsPlugin, ProcessPluginFactory> burstStatsRegistrar (burstStatsPluginManifest);
192+ static const PluginRegistrar<BurstStatsPlugin, ProcessPluginFactory>
193+ burstStatsRegistrar (burstStatsPluginManifest);
175194
176195} // namespace ipxp
0 commit comments