Skip to content

Commit 6d33067

Browse files
author
Damir Zainullin
committed
++
1 parent bbbb36e commit 6d33067

35 files changed

+305
-347
lines changed

process-plugin-api/Makefile

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,24 @@
11
CXX := g++
22
CXXFLAGS := -std=c++20 -Wall -Wextra -pedantic -Wunused -Wconversion -Wsign-conversion -g -fsanitize=address
33
TARGET := ipx
4-
SRC := main.cpp $(wildcard process/*/src/*.cpp)
4+
SRC := main.cpp \
5+
$(wildcard process/common/*/*/*.cpp) \
6+
$(wildcard process/common/*/*.cpp) \
7+
$(wildcard process/*/src/*.cpp)
8+
9+
INCLUDE := -I. -I../include/ipfixprobe/pluginFactory -Iprocess/common
10+
11+
OBJ := $(SRC:.cpp=.o)
512

613
.PHONY: all clean
714

815
all: $(TARGET)
916

10-
$(TARGET): $(SRC)
11-
$(CXX) $(CXXFLAGS) $^ -I. -I../include/ipfixprobe/pluginFactory -Iprocess/common -o $@
17+
$(TARGET): $(OBJ)
18+
$(CXX) $(CXXFLAGS) $(INCLUDE) $^ -o $@
19+
20+
%.o: %.cpp
21+
$(CXX) $(CXXFLAGS) $(INCLUDE) -c $< -o $@
1222

1323
clean:
1424
rm -f $(TARGET)

process-plugin-api/ipx

-14.2 MB
Binary file not shown.

process-plugin-api/main.o

4.63 MB
Binary file not shown.

process-plugin-api/process/common/dnsParser/dnsName.cpp

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,19 @@
1-
#pragma once
2-
31
#include "dnsName.hpp"
42

3+
#include <numeric>
4+
#include <span>
5+
#include <string>
6+
#include <optional>
7+
#include <algorithm>
8+
#include <cstddef>
9+
#include <cstdint>
10+
#include <arpa/inet.h>
11+
#include <boost/container/static_vector.hpp>
12+
#include <boost/static_string.hpp>
13+
14+
#include <utils/stringViewUtils.hpp>
15+
#include <utils/toHostByteOrder.hpp>
16+
517
namespace ipxp
618
{
719

@@ -14,30 +26,31 @@ constexpr static bool isPointer(const std::byte byte) noexcept
1426
constexpr static uint16_t getPointerOffset(const std::byte* pointer) noexcept
1527
{
1628
constexpr uint16_t pointerMask = 0x3FFF;
17-
return ntohs(*reinterpret_cast<const uint16_t*>(pointer)) & pointerMask;
29+
return toHostByteOrder(*reinterpret_cast<const uint16_t*>(pointer)) & pointerMask;
1830
}
1931

2032
constexpr static std::size_t calculateElementsLength(auto&& container) noexcept
2133
{
22-
return std::ranges::accumulate(container, std::size_t{0},
34+
return std::accumulate(
35+
container.begin(), container.end(), std::size_t{0},
2336
[](std::size_t sum, auto&& element) {
2437
return sum + element.size();
2538
});
2639
}
2740

2841
constexpr
2942
std::optional<DNSName> DNSName::createFrom(
30-
std::span<const std::byte> payload, const std::byte* dnsBegin) noexcept
43+
std::span<const std::byte> payload,
44+
std::span<const std::byte> fullDNSpayload) noexcept
3145
{
3246
auto dnsName = std::make_optional<DNSName>();
33-
uint16_t labelCount = 0;
3447
while (!payload.empty()) {
3548
if (isPointer(*payload.data())) {
3649
if (payload.size() < sizeof(uint16_t)) {
3750
return std::nullopt;
3851
}
3952
const uint16_t pointerOffset = getPointerOffset(payload.data());
40-
if (pointerOffset >= payload.size()) {
53+
if (pointerOffset >= fullDNSpayload.size()) {
4154
return std::nullopt;
4255
}
4356

@@ -46,9 +59,7 @@ std::optional<DNSName> DNSName::createFrom(
4659
dnsName->m_length = calculateElementsLength(
4760
dnsName->m_labels) + lengthBytesCount + sizeof(pointerOffset);
4861

49-
payload = std::span<const std::byte>(
50-
dnsBegin + pointerOffset, payload.end());
51-
62+
payload = fullDNSpayload.subspan(pointerOffset);
5263
continue;
5364
}
5465

@@ -57,21 +68,30 @@ std::optional<DNSName> DNSName::createFrom(
5768
return std::nullopt;
5869
}
5970
if (labelLength == 0) {
60-
break;
71+
return dnsName;
6172
}
6273

63-
if (!dnsName->m_labels.full()) {
64-
dnsName->m_labels.push_back(toStringView(
65-
payload.subspan(sizeof(uint8_t), labelLength)));
74+
if (dnsName->m_labels.size() == dnsName->m_labels.capacity()) {
75+
return std::nullopt;
6676
}
6777

78+
dnsName->m_labels.push_back(toStringView(
79+
payload.subspan(sizeof(uint8_t), labelLength)));
80+
6881
payload = payload.subspan(labelLength + sizeof(uint8_t));
6982
}
7083

71-
return dnsName;
84+
return std::nullopt;
85+
}
86+
87+
bool DNSName::operator==(const DNSName& other) const noexcept
88+
{
89+
return std::equal(
90+
m_labels.begin(), m_labels.end(),
91+
other.m_labels.begin(), other.m_labels.end());
7292
}
7393

74-
constexpr std::string DNSName::toString(const char delimiter) const noexcept
94+
std::string DNSName::toString(const char delimiter) const noexcept
7595
{
7696
std::string res;
7797
std::ranges::for_each(m_labels, [&res, delimiter](std::string_view label) {

process-plugin-api/process/common/dnsParser/dnsName.hpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,15 @@ class DNSName {
1919

2020
constexpr static
2121
std::optional<DNSName> createFrom(
22-
std::span<const std::byte> payload, const std::byte* dnsBegin) noexcept;
22+
std::span<const std::byte> payload,
23+
std::span<const std::byte> fullDNSpayload) noexcept;
2324

2425
/**
2526
* @brief Converts DNS name to string
2627
* @param delimiter Delimiter to use between labels
2728
* @return Concatenated labels with delimiter
2829
*/
29-
constexpr std::string toString(const char delimiter = '.') const noexcept;
30+
std::string toString(const char delimiter = '.') const noexcept;
3031

3132
/**
3233
* @brief Get length of the DNS name
@@ -35,6 +36,8 @@ class DNSName {
3536
*/
3637
constexpr std::size_t length() const noexcept;
3738

39+
bool operator==(const DNSName& other) const noexcept;
40+
3841
private:
3942
constexpr static uint16_t MAX_LABEL_COUNT = 15;
4043

482 KB
Binary file not shown.

process-plugin-api/process/common/dnsParser/dnsParser.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@
1717

1818
#include "dnsSection.hpp"
1919

20-
namespace ipxp2 {
20+
namespace ipxp {
2121

2222
constexpr static
23-
bool parseDnsOverTCPLength(std::span<const std::byte> payload) noexcept
23+
std::optional<std::size_t> parseDNSOverTCPLength(std::span<const std::byte> payload) noexcept
2424
{
2525
if (payload.size() < sizeof(uint16_t)) {
2626
return std::nullopt;
@@ -63,7 +63,7 @@ parseSection(
6363
}
6464

6565
constexpr
66-
bool DnsParser::parse(
66+
bool DNSParser::parse(
6767
std::span<const std::byte> payload,
6868
const bool isDnsOverTCP,
6969
std::function<bool(const DNSQuestion& query)>& queryCallback,
@@ -74,7 +74,7 @@ bool DnsParser::parse(
7474
{
7575
if (isDnsOverTCP) {
7676
const std::optional<uint16_t> dnsDataLength
77-
= parseDnsOverTCPLength(payload);
77+
= parseDNSOverTCPLength(payload);
7878
if (!dnsDataLength.has_value() ||
7979
sizeof(uint16_t) + *dnsDataLength > payload.size()) {
8080
return false;
@@ -152,7 +152,7 @@ std::optional<DNSHeader> parseHeader(std::span<const std::byte> payload) noexcep
152152
}
153153

154154
constexpr
155-
std::optional<std::size_t> DnsParser::parseQuestionSection(
155+
std::optional<std::size_t> DNSParser::parseQuestionSection(
156156
std::span<const std::byte> payload,
157157
std::span<const std::byte> fullDNSPayload,
158158
const uint16_t questionCount,
@@ -186,6 +186,7 @@ std::optional<std::size_t> DnsParser::parseQuestionSection(
186186
.class = queryClass
187187
});
188188
}
189+
}
189190
/*if (questionIndex == 0) {
190191
m_parsedFirstQuestion = {ParsedQuestion {
191192
.name = *name,

process-plugin-api/process/common/dnsParser/dnsParser.hpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,21 @@
1212
#include <optional>
1313
#include <span>
1414
#include <string_view>
15+
#include <functional>
1516

1617
#include <boost/container/static_vector.hpp>
1718

1819
#include "dnsRecord.hpp"
1920
#include "dnsQuestion.hpp"
2021
#include "optRecord.hpp"
22+
#include "dnsQuestion.hpp"
2123

22-
namespace ipxp2 {
24+
namespace ipxp {
2325

2426
/**
2527
* @brief DNS parser class
2628
*/
27-
class DnsParser {
29+
class DNSParser {
2830

2931
public:
3032
/**
@@ -35,10 +37,10 @@ class DnsParser {
3537
*/
3638
constexpr bool parse(
3739
std::span<const std::byte> payload, const bool isDnsOverTCP,
38-
std::function<bool(const DNSQuestion& query)>& queryCallback,
39-
std::function<bool(const DNSRecord& answer)>& answerCallback,
40-
std::function<bool(const DNSRecord& authorityRecord)>& authorityCallback,
41-
std::function<bool(const DNSRecord& additionalRecord)>& additionalCallback) noexcept;
40+
const std::function<bool(const DNSQuestion& query)>& queryCallback,
41+
const std::function<bool(const DNSRecord& answer)>& answerCallback,
42+
const std::function<bool(const DNSRecord& authorityRecord)>& authorityCallback,
43+
const std::function<bool(const DNSRecord& additionalRecord)>& additionalCallback) noexcept;
4244

4345
uint16_t answersCount;
4446
uint16_t id;
@@ -56,7 +58,7 @@ class DnsParser {
5658
const std::byte* dnsBegin,
5759
const uint16_t questionCount) noexcept;
5860

59-
constexpr std::optional<std::size_t> parseAnswerSection(
61+
/*constexpr std::optional<std::size_t> parseAnswerSection(
6062
std::span<const std::byte> payload,
6163
const std::byte* dnsBegin,
6264
const DNSHeader& header) noexcept;
@@ -69,9 +71,9 @@ class DnsParser {
6971
constexpr std::optional<std::size_t> parseAdditionalResourceRecordsSection(
7072
std::span<const std::byte> payload,
7173
const std::byte* dnsBegin,
72-
const DNSHeader& header) noexcept;
74+
const DNSHeader& header) noexcept;*/
7375

7476
};
7577

76-
} // namespace ipxp2
78+
} // namespace ipxp
7779

process-plugin-api/process/common/dnsParser/dnsRecordPayload.hpp

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,37 @@
33
#include <variant>
44

55
#include "dnsQueryType.hpp"
6-
#include "../dnsRecordPayloadTypes/dnsARecord.hpp"
7-
#include "../dnsRecordPayloadTypes/dnsAAAARecord.hpp"
8-
#include "../dnsRecordPayloadTypes/dnsDSRecord.hpp"
9-
#include "../dnsRecordPayloadTypes/dnsHINFORecord.hpp"
10-
#include "../dnsRecordPayloadTypes/dnsSDNRecord.hpp"
11-
#include "../dnsRecordPayloadTypes/dnsKEYRecord.hpp"
12-
#include "../dnsRecordPayloadTypes/dnsMINFORecord.hpp"
13-
#include "../dnsRecordPayloadTypes/dnsMXRecord.hpp"
14-
#include "../dnsRecordPayloadTypes/dnsPTRRecord.hpp"
15-
#include "../dnsRecordPayloadTypes/dnsRRSIGRecord.hpp"
16-
#include "../dnsRecordPayloadTypes/dnsSOARecord.hpp"
17-
#include "../dnsRecordPayloadTypes/dnsTXTRecord.hpp"
6+
#include "dnsRecordPayloadTypes/dnsARecord.hpp"
7+
#include "dnsRecordPayloadTypes/dnsAAAARecord.hpp"
8+
#include "dnsRecordPayloadTypes/dnsDSRecord.hpp"
9+
#include "dnsRecordPayloadTypes/dnsHINFORecord.hpp"
10+
#include "dnsRecordPayloadTypes/dnsISDNRecord.hpp"
11+
#include "dnsRecordPayloadTypes/dnsKEYRecord.hpp"
12+
#include "dnsRecordPayloadTypes/dnsMINFORecord.hpp"
13+
#include "dnsRecordPayloadTypes/dnsMXRecord.hpp"
14+
#include "dnsRecordPayloadTypes/dnsPTRRecord.hpp"
15+
#include "dnsRecordPayloadTypes/dnsRRSIGRecord.hpp"
16+
#include "dnsRecordPayloadTypes/dnsSOARecord.hpp"
17+
#include "dnsRecordPayloadTypes/dnsSRVRecord.hpp"
18+
#include "dnsRecordPayloadTypes/dnsTXTRecord.hpp"
1819

1920
namespace ipxp
2021
{
2122

2223
using DNSRecordPayloadType = std::variant<
23-
dnsARecord,
24-
dnsAAAARecord,
25-
dnsDSRecord,
26-
dnsHINFORecord,
27-
dnsSDNRecord,
28-
dnsKEYRecord,
29-
dnsMINFORecord,
30-
dnsMXRecord,
31-
dnsPTRRecord,
32-
dnsRRSIGRecord,
33-
dnsSOARecord,
34-
dnsTXTRecord
24+
DNSARecord,
25+
DNSAAAARecord,
26+
DNSDSRecord,
27+
DNSHINFORecord,
28+
DNSISDNRecord,
29+
DNSKEYRecord,
30+
DNSMINFORecord,
31+
DNSMXRecord,
32+
DNSPTRRecord,
33+
DNSRRSIGRecord,
34+
DNSSOARecord,
35+
DNSSRVRecord,
36+
DNSTXTRecord
3537
>;
3638

3739
class DNSRecordPayload
@@ -50,39 +52,39 @@ class DNSRecordPayload
5052
{
5153
switch (m_type) {
5254
case DNSQueryType::A:
53-
return dnsARecord::createFrom(m_data);
55+
return DNSARecord::createFrom(m_data);
5456
case DNSQueryType::AAAA:
55-
return dnsAAAARecord::createFrom(m_data);
57+
return DNSAAAARecord::createFrom(m_data);
5658
case DNSQueryType::NS: [[fallthrough]];
5759
case DNSQueryType::CNAME: [[fallthrough]];
5860
case DNSQueryType::PTR:
59-
return dnsPTRRecord::createFrom(m_data, m_fullDNSPayload);
61+
return DNSPTRRecord::createFrom(m_data, m_fullDNSPayload);
6062
case DNSQueryType::SOA:
61-
return dnsSOARecord::createFrom(m_data, m_fullDNSPayload);
63+
return DNSSOARecord::createFrom(m_data, m_fullDNSPayload);
6264
case DNSQueryType::MX:
63-
return dnsMXRecord::createFrom(m_data, m_fullDNSPayload);
65+
return DNSMXRecord::createFrom(m_data, m_fullDNSPayload);
6466
case DNSQueryType::TXT:
65-
return dnsTXTRecord::createFrom(m_data, m_fullDNSPayload);
67+
return DNSTXTRecord::createFrom(m_data, m_fullDNSPayload);
6668
case DNSQueryType::ISDN:
67-
return dnsISDNRecord::createFrom(m_data, m_fullDNSPayload);
69+
return DNSISDNRecord::createFrom(m_data, m_fullDNSPayload);
6870
case DNSQueryType::HINFO:
69-
return dnsHINFORecord::createFrom(m_data, m_fullDNSPayload);
71+
return DNSHINFORecord::createFrom(m_data, m_fullDNSPayload);
7072
case DNSQueryType::MINFO:
71-
return dnsMINFORecord::createFrom(m_data, m_fullDNSPayload);
73+
return DNSMINFORecord::createFrom(m_data, m_fullDNSPayload);
7274
case DNSQueryType::SRV:
73-
return dnsSRVRecord::createFrom(m_data, m_fullDNSPayload);
75+
return DNSSRVRecord::createFrom(m_data, m_fullDNSPayload);
7476
case DNSQueryType::RRSIG:
75-
return dnsRRSIGRecord::createFrom(m_data);
77+
return DNSRRSIGRecord::createFrom(m_data);
7678
case DNSQueryType::DNSKEY:
77-
return dnsKEYRecord::createFrom(m_data);
79+
return DNSKEYRecord::createFrom(m_data);
7880
case DNSQueryType::DS:
79-
return dnsDSRecord::createFrom(m_data);
81+
return DNSDSRecord::createFrom(m_data);
8082
default:
8183
return std::nullopt;
8284
}
8385
}
8486

85-
constexpr std::span<const std::byte> getPayload() const noexcept
87+
constexpr std::span<const std::byte> getSpan() const noexcept
8688
{
8789
return m_data;
8890
}

0 commit comments

Comments
 (0)