@@ -163,7 +163,8 @@ void DnsStreamHandler::process_udp_packet_cb(pcpp::Packet &payload, PacketDirect
163163 if (metric_port) {
164164 DnsLayer dnsLayer (udpLayer, &payload);
165165 if (!_filtering (dnsLayer, dir, l3, pcpp::UDP, metric_port, stamp)) {
166- _metrics->process_dns_layer (dnsLayer, dir, l3, pcpp::UDP, flowkey, metric_port, stamp);
166+ _metrics->process_dns_layer (dnsLayer, dir, l3, pcpp::UDP, flowkey, metric_port, _static_suffix_size, stamp);
167+ _static_suffix_size = 0 ;
167168 // signal for chained stream handlers, if we have any
168169 udp_signal (payload, dir, l3, flowkey, stamp);
169170 }
@@ -243,7 +244,8 @@ void DnsStreamHandler::tcp_message_ready_cb(int8_t side, const pcpp::TcpStreamDa
243244 pcpp::Packet dummy_packet;
244245 DnsLayer dnsLayer (data.get (), size, nullptr , &dummy_packet);
245246 if (!_filtering (dnsLayer, dir, l3Type, pcpp::UDP, port, stamp)) {
246- _metrics->process_dns_layer (dnsLayer, dir, l3Type, pcpp::TCP, flowKey, port, stamp);
247+ _metrics->process_dns_layer (dnsLayer, dir, l3Type, pcpp::TCP, flowKey, port, _static_suffix_size, stamp);
248+ _static_suffix_size = 0 ;
247249 }
248250 // data is freed upon return
249251 };
@@ -319,9 +321,10 @@ bool DnsStreamHandler::_filtering(DnsLayer &payload, [[maybe_unused]] PacketDire
319321 std::string qname_ci{payload.getFirstQuery ()->getName ()};
320322 std::transform (qname_ci.begin (), qname_ci.end (), qname_ci.begin (),
321323 [](unsigned char c) { return std::tolower (c); });
322- for (auto fqn : _f_qnames) {
324+ for (const auto & fqn : _f_qnames) {
323325 // if it matched, we know we are not filtering
324326 if (endsWith (qname_ci, fqn)) {
327+ _static_suffix_size = fqn.size ();
325328 goto will_not_filter;
326329 }
327330 }
@@ -532,7 +535,7 @@ void DnsMetricsBucket::process_dnstap(bool deep, const dnstap::Dnstap &payload)
532535 process_dns_layer (deep, dpayload, l3, l4, port);
533536 }
534537}
535- void DnsMetricsBucket::process_dns_layer (bool deep, DnsLayer &payload, pcpp::ProtocolType l3, Protocol l4, uint16_t port)
538+ void DnsMetricsBucket::process_dns_layer (bool deep, DnsLayer &payload, pcpp::ProtocolType l3, Protocol l4, uint16_t port, size_t suffix_size )
536539{
537540 std::unique_lock lock (_mutex);
538541
@@ -626,7 +629,7 @@ void DnsMetricsBucket::process_dns_layer(bool deep, DnsLayer &payload, pcpp::Pro
626629 }
627630 }
628631
629- auto aggDomain = aggregateDomain (name);
632+ auto aggDomain = aggregateDomain (name, suffix_size );
630633 _dns_topQname2.update (std::string (aggDomain.first ));
631634 if (aggDomain.second .size ()) {
632635 _dns_topQname3.update (std::string (aggDomain.second ));
@@ -788,12 +791,12 @@ void DnsMetricsBucket::process_filtered()
788791}
789792
790793// the general metrics manager entry point (both UDP and TCP)
791- void DnsMetricsManager::process_dns_layer (DnsLayer &payload, PacketDirection dir, pcpp::ProtocolType l3, pcpp::ProtocolType l4, uint32_t flowkey, uint16_t port, timespec stamp)
794+ void DnsMetricsManager::process_dns_layer (DnsLayer &payload, PacketDirection dir, pcpp::ProtocolType l3, pcpp::ProtocolType l4, uint32_t flowkey, uint16_t port, size_t suffix_size, timespec stamp)
792795{
793796 // base event
794797 new_event (stamp);
795798 // process in the "live" bucket. this will parse the resources if we are deep sampling
796- live_bucket ()->process_dns_layer (_deep_sampling_now, payload, l3, static_cast <Protocol>(l4), port);
799+ live_bucket ()->process_dns_layer (_deep_sampling_now, payload, l3, static_cast <Protocol>(l4), port, suffix_size );
797800
798801 if (group_enabled (group::DnsMetrics::DnsTransactions)) {
799802 // handle dns transactions (query/response pairs)
0 commit comments