Skip to content

Commit e5ea52a

Browse files
Zainullin DamirZainullin Damir
authored andcommitted
++
1 parent f5a4168 commit e5ea52a

File tree

11 files changed

+86
-25
lines changed

11 files changed

+86
-25
lines changed

include/ipfixprobe/processPlugin/flowRecord.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "directionalField.hpp"
66
#include "tcpFlags.hpp"
77
#include "packet.hpp"
8+
#include "xxhash.h"
89

910
#include <array>
1011
#include <bitset>

include/ipfixprobe/processPlugin/ipAddress.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ union IPAddress {
7171

7272
constexpr bool operator==(const IPAddress& other) const noexcept
7373
{
74-
return u8 == other.u8;
74+
return u64 == other.u64;
7575
}
7676

7777
//constexpr std::strong_ordering operator<=>(const IPAddress& other) const noexcept = default;
@@ -81,6 +81,7 @@ union IPAddress {
8181
if (this != &other) {
8282
u8 = other.u8;
8383
}
84+
8485
return *this;
8586
}
8687

src/core/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ add_library(ipfixprobe-core STATIC
1414
pluginManager.cpp
1515
pluginManager.hpp
1616
fieldManager.cpp
17+
xxhash.c
1718
)
1819

1920
target_include_directories(ipfixprobe-core PUBLIC

src/core/fieldManager.cpp:Zone.Identifier

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

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

Lines changed: 79 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,9 @@ int UnirecExporter::init_trap(std::string& ifcs, int verbosity)
150150
return ifc_cnt;
151151
}
152152

153+
template<typename T>
154+
constexpr bool always_false = false;
155+
153156
template<typename Type>
154157
static ur_field_id_t defineField(std::string_view name) noexcept
155158
{
@@ -175,9 +178,47 @@ static ur_field_id_t defineField(std::string_view name) noexcept
175178
return ur_define_field(name.data(), UR_TYPE_DOUBLE);
176179
} else if constexpr (std::is_same_v<Type, std::string_view>) {
177180
return ur_define_field(name.data(), UR_TYPE_STRING);
181+
} else if constexpr (std::is_same_v<Type, MACAddress>) {
182+
return ur_define_field(name.data(), UR_TYPE_MAC);
183+
} else if constexpr (std::is_same_v<Type, IPAddress>) {
184+
return ur_define_field(name.data(), UR_TYPE_IP);
185+
} else if constexpr (std::is_same_v<Type, Timestamp>) {
186+
return ur_define_field(name.data(), UR_TYPE_TIME);
187+
} else if constexpr (std::is_same_v<Type, std::span<const std::byte>>) {
188+
return ur_define_field(name.data(), UR_TYPE_BYTES);
189+
} else if constexpr (std::is_same_v<Type, std::span<const std::string>>) {
190+
return ur_define_field(name.data(), UR_TYPE_STRING);
191+
} else if constexpr (std::is_same_v<Type, std::span<const MACAddress>>) {
192+
return ur_define_field(name.data(), UR_TYPE_A_MAC);
193+
} else if constexpr (std::is_same_v<Type, std::span<const IPAddress>>) {
194+
return ur_define_field(name.data(), UR_TYPE_A_IP);
195+
} else if constexpr (std::is_same_v<Type, std::span<const Timestamp>>) {
196+
return ur_define_field(name.data(), UR_TYPE_A_TIME);
197+
} else if constexpr (std::is_same_v<Type, std::span<const double>>) {
198+
return ur_define_field(name.data(), UR_TYPE_A_DOUBLE);
199+
} else if constexpr (std::is_same_v<Type, std::span<const float>>) {
200+
return ur_define_field(name.data(), UR_TYPE_A_FLOAT);
201+
} else if constexpr (std::is_same_v<Type, std::span<const uint8_t>>) {
202+
return ur_define_field(name.data(), UR_TYPE_A_UINT8);
203+
} else if constexpr (std::is_same_v<Type, std::span<const uint16_t>>) {
204+
return ur_define_field(name.data(), UR_TYPE_A_UINT16);
205+
} else if constexpr (std::is_same_v<Type, std::span<const uint32_t>>) {
206+
return ur_define_field(name.data(), UR_TYPE_A_UINT32);
207+
} else if constexpr (std::is_same_v<Type, std::span<const uint64_t>>) {
208+
return ur_define_field(name.data(), UR_TYPE_A_UINT64);
209+
} else if constexpr (std::is_same_v<Type, std::span<const int8_t>>) {
210+
return ur_define_field(name.data(), UR_TYPE_A_INT8);
211+
} else if constexpr (std::is_same_v<Type, std::span<const int16_t>>) {
212+
return ur_define_field(name.data(), UR_TYPE_A_INT16);
213+
} else if constexpr (std::is_same_v<Type, std::span<const int32_t>>) {
214+
return ur_define_field(name.data(), UR_TYPE_A_INT32);
215+
} else if constexpr (std::is_same_v<Type, std::span<const int64_t>>) {
216+
return ur_define_field(name.data(), UR_TYPE_A_INT64);
178217
} else {
179-
throw std::logic_error("unsupported field type");
218+
static_assert(always_false<Type>, "Unsupported type");
180219
}
220+
221+
__builtin_unreachable();
181222
}
182223

183224
void UnirecExporter::init(const char* params)
@@ -222,19 +263,11 @@ void UnirecExporter::init(const char* params)
222263

223264
std::ranges::transform(m_fieldManager.getBiflowFields(), std::back_inserter(m_field_ids),
224265
[&](const FieldDescriptor& fieldDescriptor) {
225-
//const auto& getter = ;
226-
227266
return std::visit(
228267
[&](const auto& variant) {
229-
//using GetterT = std::decay_t<decltype(variant)>;
230268
return std::visit([&](const auto& accessor) {
231269
return defineField<decltype(accessor(nullptr))>(fieldDescriptor.getName());
232270
}, variant);
233-
/*if constexpr (std::is_same_v<GetterT, ScalarValueGetter>) {
234-
defineScalar(, variant, pluginExportData, tmplt_ptr, record_ptr);
235-
} else if constexpr (std::is_same_v<GetterT, VectorValueGetter>) {
236-
fillFromVectorVariant(outputField, variant, pluginExportData, tmplt_ptr, record_ptr);
237-
}*/
238271
}, fieldDescriptor.getValueGetter());
239272
});
240273
}
@@ -394,7 +427,7 @@ void UnirecExporter::free_unirec_resources()
394427

395428
/*template<typename T>
396429
static void
397-
printVector(const FieldDescriptor& field, const VectorAccessor<T>& accessor, const void* data)
430+
fillFromVectorVariant(const FieldDescriptor& field, const VectorAccessor<T>& accessor, const void* data)
398431
{
399432
std::cout << "[" << field.getGroup() << "] " << field.getName() << ": [";
400433
@@ -412,17 +445,46 @@ printVector(const FieldDescriptor& field, const VectorAccessor<T>& accessor, con
412445
void UnirecExporter::fillFromScalarVariant(const FieldDescriptor& field, const ScalarValueGetter& variant, const void* data, ur_template_t* tmplt_ptr, void* record_ptr) noexcept
413446
{
414447
const auto visitor = [&](const auto& accessor) {
415-
*reinterpret_cast<decltype(accessor(data))*>(
416-
ur_get_ptr_by_id(tmplt_ptr, record_ptr, m_field_ids[field.getBitIndex()])) = accessor(data);
448+
if constexpr (std::is_same_v<std::decay_t<decltype(accessor(data))>, std::string_view>) {
449+
ur_set_string(tmplt_ptr, record_ptr, m_field_ids[field.getBitIndex()], accessor(data).data());
450+
} else {
451+
*reinterpret_cast<decltype(accessor(data))*>(
452+
ur_get_ptr_by_id(tmplt_ptr, record_ptr, m_field_ids[field.getBitIndex()])) = accessor(data);
453+
}
417454
};
418455
std::visit(visitor, variant);
419456
}
420457

421-
static void
422-
fillFromVectorVariant(const FieldDescriptor& field, const VectorValueGetter& variant, const void* data)
458+
void UnirecExporter::fillFromVectorVariant(const FieldDescriptor& field, const VectorValueGetter& variant, const void* data, ur_template_t* tmplt_ptr, void* record_ptr) noexcept
423459
{
424-
/*const auto visitor = [&](const auto& accessor) { printVector(field, accessor, data); };
425-
std::visit(visitor, variant);*/
460+
const auto visitor = [&](const auto& accessor) {
461+
if constexpr (std::is_same_v<std::decay_t<decltype(accessor(data))>, std::span<const Timestamp>>) {
462+
ur_set_var_len(tmplt_ptr, record_ptr, m_field_ids[field.getBitIndex()], accessor(data).size() * sizeof(ur_time_t));
463+
auto* buffer = reinterpret_cast<ur_time_t*>(ur_get_ptr_by_id(tmplt_ptr, record_ptr, m_field_ids[field.getBitIndex()]));
464+
std::ranges::transform(accessor(data), buffer, [](const Timestamp& ts) {
465+
return ur_time_from_sec_usec(ts.toTimeval().tv_sec, ts.toTimeval().tv_usec);
466+
});
467+
} else if constexpr (std::is_same_v<std::decay_t<decltype(accessor(data))>, std::span<const std::string>>) {
468+
const std::size_t totalLength = std::accumulate(accessor(data).begin(), accessor(data).end(), 0,
469+
[](std::size_t sum, const std::string& str) { return sum + str.size() + sizeof(';'); });
470+
ur_set_var_len(tmplt_ptr, record_ptr, m_field_ids[field.getBitIndex()], totalLength);
471+
auto* buffer = reinterpret_cast<char*>(ur_get_ptr_by_id(tmplt_ptr, record_ptr, m_field_ids[field.getBitIndex()]));
472+
std::ranges::for_each(accessor(data), [&buffer](const std::string& str) {
473+
std::memcpy(buffer, str.data(), str.size());
474+
buffer += str.size();
475+
*(buffer++) = ';';
476+
});
477+
} /*else if constexpr (std::is_same_v<std::decay_t<decltype(accessor(data))>, std::span<const IPAddress>>) {}*/
478+
else {
479+
ur_set_var(
480+
tmplt_ptr,
481+
record_ptr,
482+
m_field_ids[field.getBitIndex()],
483+
accessor(data).data(),
484+
accessor(data).size() * sizeof(decltype(accessor(data)[0])));
485+
}
486+
};
487+
std::visit(visitor, variant);
426488
}
427489

428490

@@ -482,7 +544,7 @@ void UnirecExporter::processRecord(FlowRecordUniquePtr& flowRecord)
482544
if constexpr (std::is_same_v<GetterT, ScalarValueGetter>) {
483545
fillFromScalarVariant(fieldDescriptor, variant, pluginExportData, tmplt_ptr, record_ptr);
484546
} else if constexpr (std::is_same_v<GetterT, VectorValueGetter>) {
485-
//fillFromVectorVariant(outputField, variant, pluginExportData, tmplt_ptr, record_ptr);
547+
fillFromVectorVariant(fieldDescriptor, variant, pluginExportData, tmplt_ptr, record_ptr);
486548
}
487549
},
488550
getter);

src/plugins/output/unirec/src/unirec.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@ class UnirecExporter : public OutputPlugin {
255255
void fill_basic_flow(const FlowRecord& flow, ur_template_t* tmplt_ptr, void* record_ptr);
256256
void free_unirec_resources();
257257
void fillFromScalarVariant(const FieldDescriptor& field, const ScalarValueGetter& variant, const void* data, ur_template_t* tmplt_ptr, void* record_ptr) noexcept;
258+
void fillFromVectorVariant(const FieldDescriptor& field, const VectorValueGetter& variant, const void* data, ur_template_t* tmplt_ptr, void* record_ptr) noexcept;
258259

259260
int m_basic_idx{-1}; /**< Basic output interface number. */
260261
size_t m_ext_cnt{0}; /**< Size of ifc map. */

src/plugins/storage/cache/CMakeLists.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ add_library(ipfixprobe-storage-cache MODULE
1212
src/fragmentationCache/fragmentationTable.hpp
1313
src/fragmentationCache/ringBuffer.hpp
1414
src/fragmentationCache/timevalUtils.hpp
15-
src/xxhash.c
16-
src/xxhash.h
1715
)
1816

1917
set_target_properties(ipfixprobe-storage-cache PROPERTIES

src/plugins/storage/cache/src/fragmentationCache/fragmentationCache.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131
#include "fragmentationCache.hpp"
3232

33-
#include "../xxhash.h"
33+
#include "xxhash.h"
3434
#include "timevalUtils.hpp"
3535

3636
#include <cstring>

0 commit comments

Comments
 (0)