77 *
88 * Provides a plugin that extracts NetBIOS suffix and name from packets,
99 * stores them in per-flow plugin data, and exposes fields via FieldManager.
10- *
10+ *
1111 * @copyright Copyright (c) 2025 CESNET, z.s.p.o.
1212 */
1313
1414#include " netbios.hpp"
1515
16- #include < iostream>
1716#include < cmath>
17+ #include < iostream>
1818
19- #include < pluginManifest.hpp>
20- #include < pluginRegistrar.hpp>
21- #include < pluginFactory.hpp>
19+ #include < dns-utils.hpp>
2220#include < fieldGroup.hpp>
2321#include < fieldManager.hpp>
24- #include < dns-utils.hpp>
22+ #include < ipfixprobe/options.hpp>
23+ #include < pluginFactory.hpp>
24+ #include < pluginManifest.hpp>
25+ #include < pluginRegistrar.hpp>
2526#include < utils/spanUtils.hpp>
2627#include < utils/stringViewUtils.hpp>
27- #include < ipfixprobe/options.hpp>
2828
2929namespace ipxp {
3030
@@ -40,34 +40,41 @@ static const PluginManifest netbiosPluginManifest = {
4040 },
4141};
4242
43- static FieldGroup createNetBIOSSchema (FieldManager& fieldManager, FieldHandlers<NetBIOSFields>& fieldHandlers)
43+ static FieldGroup
44+ createNetBIOSSchema (FieldManager& fieldManager, FieldHandlers<NetBIOSFields>& fieldHandlers)
4445{
4546 FieldGroup schema = fieldManager.createFieldGroup (" netbios" );
4647
47- fieldHandlers.insert (NetBIOSFields::NB_SUFFIX, schema.addScalarField (
48- " NB_SUFFIX" ,
49- [] (const void * context) { return static_cast <uint8_t >(static_cast <const NetBIOSData*>(context)->suffix ); }
50- ));
48+ fieldHandlers.insert (
49+ NetBIOSFields::NB_SUFFIX,
50+ schema.addScalarField (" NB_SUFFIX" , [](const void * context) {
51+ return static_cast <uint8_t >(static_cast <const NetBIOSData*>(context)->suffix );
52+ }));
5153
52- fieldHandlers.insert (NetBIOSFields::NB_NAME, schema.addScalarField (
53- " NB_NAME" ,
54- [] (const void * context) { return toStringView (static_cast <const NetBIOSData*>(context)->name ); }
55- ));
54+ fieldHandlers.insert (
55+ NetBIOSFields::NB_NAME,
56+ schema.addScalarField (" NB_NAME" , [](const void * context) {
57+ return toStringView (static_cast <const NetBIOSData*>(context)->name );
58+ }));
5659
5760 return schema;
5861}
5962
60- NetBIOSPlugin::NetBIOSPlugin ([[maybe_unused]]const std::string& params, FieldManager& manager)
63+ NetBIOSPlugin::NetBIOSPlugin ([[maybe_unused]] const std::string& params, FieldManager& manager)
6164{
6265 createNetBIOSSchema (manager, m_fieldHandlers);
6366}
6467
6568PluginInitResult NetBIOSPlugin::onInit (const FlowContext& flowContext, void * pluginContext)
6669{
6770 constexpr uint8_t NETBIOS_PORT = 137 ;
68- if (flowContext.packet .src_port == NETBIOS_PORT || flowContext.packet .dst_port == NETBIOS_PORT) {
71+ if (flowContext.packet .src_port == NETBIOS_PORT
72+ || flowContext.packet .dst_port == NETBIOS_PORT) {
6973 auto * pluginData = std::construct_at (reinterpret_cast <NetBIOSData*>(pluginContext));
70- parseNetBIOS (flowContext.flowRecord , toSpan<const std::byte>(flowContext.packet .payload , flowContext.packet .payload_len ), *pluginData);
74+ parseNetBIOS (
75+ flowContext.flowRecord ,
76+ toSpan<const std::byte>(flowContext.packet .payload , flowContext.packet .payload_len ),
77+ *pluginData);
7178 return {
7279 .constructionState = ConstructionState::Constructed,
7380 .updateRequirement = UpdateRequirement::NoUpdateNeeded,
@@ -82,19 +89,21 @@ PluginInitResult NetBIOSPlugin::onInit(const FlowContext& flowContext, void* plu
8289 };
8390}
8491
85- constexpr static
86- char compressCharPair (const char first, const char second)
92+ constexpr static char compressCharPair (const char first, const char second)
8793{
8894 return static_cast <char >(((first - ' A' ) << 4 ) | (second - ' A' ));
8995}
9096
91- void NetBIOSPlugin::parseNetBIOS (FlowRecord& flowRecord, std::span<const std::byte> payload, NetBIOSData& pluginData) noexcept
97+ void NetBIOSPlugin::parseNetBIOS (
98+ FlowRecord& flowRecord,
99+ std::span<const std::byte> payload,
100+ NetBIOSData& pluginData) noexcept
92101{
93102 if (payload.size () < sizeof (dns_hdr) || !pluginData.name .empty ()) {
94103 return ;
95104 }
96105
97- const std::size_t queryCount
106+ const std::size_t queryCount
98107 = reinterpret_cast <const dns_hdr*>(payload.data ())->question_rec_cnt ;
99108 if (queryCount == 0 ) {
100109 return ;
@@ -107,8 +116,8 @@ void NetBIOSPlugin::parseNetBIOS(FlowRecord& flowRecord, std::span<const std::by
107116 }
108117
109118 auto nameIt = reinterpret_cast <const std::pair<char , char >*>(payload.data ());
110- for (; reinterpret_cast <const std::byte*>(nameIt)
111- != payload. data () + payload. size () - 2 ; nameIt++) {
119+ for (; reinterpret_cast <const std::byte*>(nameIt) != payload. data () + payload. size () - 2 ;
120+ nameIt++) {
112121 pluginData.name .push_back (compressCharPair (nameIt->first , nameIt->second ));
113122 }
114123 m_fieldHandlers[NetBIOSFields::NB_NAME].setAsAvailable (flowRecord);
@@ -130,7 +139,9 @@ PluginDataMemoryLayout NetBIOSPlugin::getDataMemoryLayout() const noexcept
130139 };
131140}
132141
133- static const PluginRegistrar<NetBIOSPlugin, PluginFactory<ProcessPlugin, const std::string&, FieldManager&>>
142+ static const PluginRegistrar<
143+ NetBIOSPlugin,
144+ PluginFactory<ProcessPlugin, const std::string&, FieldManager&>>
134145 netbiosRegistrar (netbiosPluginManifest);
135146
136147} // namespace ipxp
0 commit comments