2323
2424namespace ipxp {
2525
26-
2726static const PluginManifest packetStatsPluginManifest = {
2827 .name = " pstats" ,
2928 .description = " Pstats process plugin for computing packet bursts stats." ,
@@ -36,15 +35,7 @@ static const PluginManifest packetStatsPluginManifest = {
3635 },
3736};
3837
39- const inline std::vector<FieldPair<PacketStatsFields>> fields = {
40- {PacketStatsFields::PPI_PKT_LENGTHS, " PPI_PKT_LENGTHS" },
41- {PacketStatsFields::PPI_PKT_TIMES, " PPI_PKT_TIMES" },
42- {PacketStatsFields::PPI_PKT_FLAGS, " PPI_PKT_FLAGS" },
43- {PacketStatsFields::PPI_PKT_DIRECTIONS, " PPI_PKT_DIRECTIONS" },
44- };
45-
46-
47- static FieldSchema createPacketStatsSchema (FieldManager& manager, FieldHandlers<PacketStatsFields>& handlers) noexcept
38+ static void createPacketStatsSchema (FieldManager& manager, FieldHandlers<PacketStatsFields>& handlers) noexcept
4839{
4940 FieldSchema schema = fieldManager.createFieldSchema (" pstats" );
5041
@@ -58,15 +49,12 @@ static FieldSchema createPacketStatsSchema(FieldManager& manager, FieldHandlers<
5849 }));
5950 handlers.insert (PacketStatsFields::PPI_PKT_DIRECTIONS, schema.addVectorField (
6051 " PPI_PKT_DIRECTIONS" ,
61- FieldDirection::DirectionalIndifferent,
6252 [](const void * context) { return getSpan (reinterpret_cast <const PacketStatsExport*>(context)->directions );
6353 }));
6454 handlers.insert (PacketStatsFields::PPI_PKT_TIMES, schema.addVectorField (
6555 " PPI_PKT_TIMES" ,
6656 [](const void * context) {return toSpan (reinterpret_cast <const PacketStatsExport*>(context)->timestamps );
6757 }));
68-
69- return schema;
7058}
7159
7260PacketStatsPlugin::PacketStatsPlugin ([[maybe_unused]]const std::string& params, FieldManager& manager)
@@ -100,9 +88,8 @@ PluginUpdateResult PacketStatsPlugin::onUpdate(const FlowContext& flowContext, v
10088PluginExportResult PacketStatsPlugin::onExport (const FlowRecord& flowRecord, void * pluginContext)
10189{
10290 const std::size_t packetsTotal
103- = flowRecord.dataForward . packets + flowRecord.dataReverse . packets ;
91+ = flowRecord.src_packets + flowRecord.dst_packets ;
10492
105- constexpr static std::size_t MIN_FLOW_LENGTH = 1 ;
10693 if (packetsTotal <= MIN_FLOW_LENGTH) {
10794 return {
10895 .flowAction = FlowAction::RemovePlugin,
@@ -125,32 +112,31 @@ bool isSequenceOverflowed(const uint32_t currentValue, const uint32_t prevValue)
125112 constexpr int64_t MAX_DIFF = static_cast <int64_t >(
126113 static_cast <double >(std::numeric_limits<uint32_t >::max ()) / 100 );
127114
128- return static_cast <int64_t >(currentValue)
129- - static_cast <int64_t >(prevValue) < - MAX_DIFF;
115+ return static_cast <int64_t >(prevValue)
116+ - static_cast <int64_t >(currentValue) > MAX_DIFF
130117}
131118
132119static
133120bool isDuplicate (const Packet& packet, const PacketStatsData& pluginData) noexcept
134121{
135- // TODO USE VALUES FROM DISSECTOR
136122 constexpr std::size_t TCP = 6 ;
137- if (packet.flowKey . l4Protocol != TCP) {
123+ if (packet.ip_proto != TCP) {
138124 return false ;
139125 }
140126
141127 // Current seq <= previous ack?
142128 const bool suspiciousSequence
143- = packet.tcpData -> sequence <= pluginData.processingState .lastSequence [packet.direction ]
144- && !isSequenceOverflowed (packet.tcpData -> sequence , pluginData.processingState .lastSequence [packet.direction ]);
129+ = packet.tcp_seq <= pluginData.processingState .lastSequence [packet.source_pkt ]
130+ && !isSequenceOverflowed (packet.tcp_seq , pluginData.processingState .lastSequence [packet.source_pkt ]);
145131
146132 // Current ack <= previous ack?
147133 const bool suspiciousAcknowledgment
148- = packet.tcpData -> acknowledgment <= pluginData.processingState .lastAcknowledgment [packet.direction ]
149- && !isSequenceOverflowed (packet.tcpData -> acknowledgment , pluginData.processingState .lastAcknowledgment [packet.direction ]);
134+ = packet.tcp_ack <= pluginData.processingState .lastAcknowledgment [packet.source_pkt ]
135+ && !isSequenceOverflowed (packet.tcp_ack , pluginData.processingState .lastAcknowledgment [packet.source_pkt ]);
150136
151137 if (suspiciousSequence && suspiciousAcknowledgment
152- && packet.payload . size () == pluginData.processingState .lastLength [packet.direction ]
153- && packet.tcpData -> flags == pluginData.processingState .lastFlags [packet.direction ]
138+ && packet.payload_len == pluginData.processingState .lastLength [packet.source_pkt ]
139+ && packet.tcp_flags == pluginData.processingState .lastFlags [packet.source_pkt ]
154140 && pluginData.lengths .size () != 0 ) {
155141 return true ;
156142 }
@@ -160,38 +146,34 @@ bool isDuplicate(const Packet& packet, const PacketStatsData& pluginData) noexce
160146
161147void PacketStatsPlugin::updatePacketsData (const Packet& packet, PacketStatsData& pluginData) noexcept
162148{
163- if (!packet.tcpData .has_value ()) {
164- return ;
165- }
166-
167149 if (m_skipDuplicates && isDuplicate (packet, pluginData)) {
168150 return ;
169151 }
170152
171- pluginData.processingState .lastSequence [packet.direction ] = packet.tcpData -> sequence ;
172- pluginData.processingState .lastAcknowledgment [packet.direction ] = packet.tcpData -> acknowledgment ;
173- pluginData.processingState .lastLength [packet.direction ] = packet.realLength ;
174- pluginData.processingState .lastFlags [packet.direction ] = packet.tcpData -> flags ;
153+ pluginData.processingState .lastSequence [packet.source_pkt ] = packet.tcp_seq ;
154+ pluginData.processingState .lastAcknowledgment [packet.source_pkt ] = packet.tcp_ack ;
155+ pluginData.processingState .lastLength [packet.source_pkt ] = packet.payload_len ;
156+ pluginData.processingState .lastFlags [packet.source_pkt ] = TcpFlags ( packet.tcp_flags ) ;
175157
176- if (packet.realLength == 0 && !m_countEmptyPackets) {
158+ if (packet.packet_len == 0 && !m_countEmptyPackets) {
177159 return ;
178160 }
179161
180162 if (pluginData.lengths .size () == pluginData.lengths .capacity ()) {
181163 return ;
182164 }
183165
184- pluginData.lengths .push_back (static_cast <uint16_t >(packet.realLength ));
166+ pluginData.lengths .push_back (static_cast <uint16_t >(packet.payload_len_wire ));
185167
186- pluginData.tcpFlags .push_back (packet.tcpData -> flags );
187-
188- pluginData.timestamps .push_back (packet.timestamp );
168+ pluginData.tcpFlags .push_back (TcpFlags ( packet.tcp_flags ) );
169+
170+ pluginData.timestamps .push_back (packet.ts );
189171
190172 /*
191173 * direction = 1 iff client -> server
192174 * direction = -1 iff server -> client
193175 */
194- const int8_t direction = packet.direction ? 1 : -1 ;
176+ const int8_t direction = packet.source_pkt ? 1 : -1 ;
195177 pluginData.directions .push_back (direction);
196178}
197179
0 commit comments