Coverage Report

Created: 2026-11-12 06:50

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/PcapPlusPlus/Packet++/header/TLVData.h
Line
Count
Source
1
#pragma once
2
3
#include "Layer.h"
4
#include "IpAddress.h"
5
#include <string.h>
6
#include <type_traits>
7
8
/// @file
9
10
/// @namespace pcpp
11
/// @brief The main namespace for the PcapPlusPlus lib
12
namespace pcpp
13
{
14
  /// @class TLVRecord
15
  /// A wrapper class for a Type-Length-Value (TLV) record. This class does not create or modify TLV records, but
16
  /// rather serves as a wrapper and provides useful methods for retrieving data from them. This class has several
17
  /// abstract methods that should be implemented in derived classes. These methods are for record length value
18
  /// calculation (the 'L' in TLV) which is implemented differently in different protocols
19
  template <typename TRecType, typename TRecLen> class TLVRecord
20
  {
21
  protected:
22
    /// A struct representing the TLV construct
23
#pragma pack(push, 1)
24
    struct TLVRawData
25
    {
26
      /// Record type
27
      TRecType recordType;
28
      /// Record length in bytes
29
      TRecLen recordLen;
30
      /// Record value (variable size)
31
      uint8_t recordValue[];
32
    };
33
#pragma pack(pop)
34
35
    TLVRawData* m_Data;
36
37
  public:
38
    /// A c'tor for this class that gets a pointer to the TLV record raw data (byte array)
39
    /// @param[in] recordRawData A pointer to the TLV record raw data
40
    TLVRecord(uint8_t* recordRawData)
41
2.16M
    {
42
2.16M
      assign(recordRawData);
43
2.16M
    }
pcpp::TLVRecord<unsigned char, unsigned char>::TLVRecord(unsigned char*)
Line
Count
Source
41
2.11M
    {
42
2.11M
      assign(recordRawData);
43
2.11M
    }
pcpp::TLVRecord<unsigned short, unsigned short>::TLVRecord(unsigned char*)
Line
Count
Source
41
48.6k
    {
42
48.6k
      assign(recordRawData);
43
48.6k
    }
Unexecuted instantiation: pcpp::TLVRecord<unsigned char, unsigned short>::TLVRecord(unsigned char*)
44
45
    /// A copy c'tor for this class. This copy c'tor doesn't copy the TLV data, but only the pointer to it,
46
    /// which means that after calling it both the old and the new instance will point to the same TLV raw data
47
    /// @param[in] other The TLVRecord instance to copy from
48
    TLVRecord(const TLVRecord& other)
49
661k
    {
50
661k
      m_Data = other.m_Data;
51
661k
    }
pcpp::TLVRecord<unsigned char, unsigned char>::TLVRecord(pcpp::TLVRecord<unsigned char, unsigned char> const&)
Line
Count
Source
49
648k
    {
50
648k
      m_Data = other.m_Data;
51
648k
    }
pcpp::TLVRecord<unsigned short, unsigned short>::TLVRecord(pcpp::TLVRecord<unsigned short, unsigned short> const&)
Line
Count
Source
49
12.7k
    {
50
12.7k
      m_Data = other.m_Data;
51
12.7k
    }
Unexecuted instantiation: pcpp::TLVRecord<unsigned char, unsigned short>::TLVRecord(pcpp::TLVRecord<unsigned char, unsigned short> const&)
52
53
    /// A d'tor for this class, currently does nothing
54
2.03M
    virtual ~TLVRecord() = default;
pcpp::TLVRecord<unsigned char, unsigned char>::~TLVRecord()
Line
Count
Source
54
1.98M
    virtual ~TLVRecord() = default;
pcpp::TLVRecord<unsigned short, unsigned short>::~TLVRecord()
Line
Count
Source
54
52.1k
    virtual ~TLVRecord() = default;
Unexecuted instantiation: pcpp::TLVRecord<unsigned char, unsigned short>::~TLVRecord()
55
56
    /// Assign a pointer to the TLV record raw data (byte array)
57
    /// @param[in] recordRawData A pointer to the TLV record raw data
58
    void assign(uint8_t* recordRawData)
59
3.98M
    {
60
3.98M
      m_Data = reinterpret_cast<TLVRawData*>(recordRawData);
61
3.98M
    }
pcpp::TLVRecord<unsigned char, unsigned char>::assign(unsigned char*)
Line
Count
Source
59
3.89M
    {
60
3.89M
      m_Data = reinterpret_cast<TLVRawData*>(recordRawData);
61
3.89M
    }
pcpp::TLVRecord<unsigned short, unsigned short>::assign(unsigned char*)
Line
Count
Source
59
97.3k
    {
60
97.3k
      m_Data = reinterpret_cast<TLVRawData*>(recordRawData);
61
97.3k
    }
Unexecuted instantiation: pcpp::TLVRecord<unsigned char, unsigned short>::assign(unsigned char*)
62
63
    /// Check if a pointer can be assigned to the TLV record data
64
    /// @param[in] recordRawData A pointer to the TLV record raw data
65
    /// @param[in] tlvDataLen The size of the TLV record raw data
66
    /// @return True if data is valid and can be assigned
67
    static bool canAssign(const uint8_t* recordRawData, size_t tlvDataLen)
68
391k
    {
69
391k
      return recordRawData != nullptr &&
70
391k
             tlvDataLen >= (sizeof(TLVRawData::recordType) + sizeof(TLVRawData::recordLen));
71
391k
    }
pcpp::TLVRecord<unsigned char, unsigned char>::canAssign(unsigned char const*, unsigned long)
Line
Count
Source
68
342k
    {
69
342k
      return recordRawData != nullptr &&
70
342k
             tlvDataLen >= (sizeof(TLVRawData::recordType) + sizeof(TLVRawData::recordLen));
71
342k
    }
pcpp::TLVRecord<unsigned short, unsigned short>::canAssign(unsigned char const*, unsigned long)
Line
Count
Source
68
48.6k
    {
69
48.6k
      return recordRawData != nullptr &&
70
48.6k
             tlvDataLen >= (sizeof(TLVRawData::recordType) + sizeof(TLVRawData::recordLen));
71
48.6k
    }
Unexecuted instantiation: pcpp::TLVRecord<unsigned char, unsigned short>::canAssign(unsigned char const*, unsigned long)
72
73
    /// Overload of the assignment operator. This operator doesn't copy the TLV data, but rather copies the pointer
74
    /// to it, which means that after calling it both the old and the new instance will point to the same TLV raw
75
    /// data
76
    /// @param[in] other The TLVRecord instance to assign
77
    TLVRecord& operator=(const TLVRecord& other)
78
1.51M
    {
79
1.51M
      m_Data = other.m_Data;
80
1.51M
      return *this;
81
1.51M
    }
pcpp::TLVRecord<unsigned short, unsigned short>::operator=(pcpp::TLVRecord<unsigned short, unsigned short> const&)
Line
Count
Source
78
35.0k
    {
79
35.0k
      m_Data = other.m_Data;
80
35.0k
      return *this;
81
35.0k
    }
pcpp::TLVRecord<unsigned char, unsigned char>::operator=(pcpp::TLVRecord<unsigned char, unsigned char> const&)
Line
Count
Source
78
1.47M
    {
79
1.47M
      m_Data = other.m_Data;
80
1.47M
      return *this;
81
1.47M
    }
Unexecuted instantiation: pcpp::TLVRecord<unsigned char, unsigned short>::operator=(pcpp::TLVRecord<unsigned char, unsigned short> const&)
82
83
    /// Overload of the equality operator. Two record are equal if both of them point to the same data, or if they
84
    /// point to different data but their total size is equal and the raw data they both contain is similar.
85
    /// @param[in] rhs The object to compare to
86
    /// @return True if both objects are equal, false otherwise
87
    bool operator==(const TLVRecord& rhs) const
88
    {
89
      if (m_Data == rhs.m_Data)
90
        return true;
91
92
      if (getTotalSize() != rhs.getTotalSize())
93
        return false;
94
95
      if (isNull() || ((TLVRecord&)rhs).isNull())
96
        return false;
97
98
      return (memcmp(m_Data, rhs.m_Data, getTotalSize()) == 0);
99
    }
100
101
    /// Overload of the not equal operator.
102
    /// @param[in] rhs The object to compare to
103
    /// @return True if objects are not equal, false otherwise
104
    bool operator!=(const TLVRecord& rhs) const
105
    {
106
      return !operator==(rhs);
107
    }
108
109
    /// @return The type field of the record (the 'T' in __Type__-Length-Value)
110
    TRecType getType() const
111
890k
    {
112
890k
      if (m_Data == nullptr)
113
0
        return 0;
114
115
890k
      return m_Data->recordType;
116
890k
    }
pcpp::TLVRecord<unsigned char, unsigned char>::getType() const
Line
Count
Source
111
890k
    {
112
890k
      if (m_Data == nullptr)
113
0
        return 0;
114
115
890k
      return m_Data->recordType;
116
890k
    }
Unexecuted instantiation: pcpp::TLVRecord<unsigned char, unsigned short>::getType() const
117
118
    /// @return A pointer to the value of the record as byte array (the 'V' in Type-Length- __Value__)
119
    uint8_t* getValue() const
120
636
    {
121
636
      if (m_Data == nullptr)
122
0
        return nullptr;
123
124
636
      return m_Data->recordValue;
125
636
    }
126
127
    /// @return True if the TLV record raw data is nullptr, false otherwise
128
    bool isNull() const
129
5.14M
    {
130
5.14M
      return (m_Data == nullptr);
131
5.14M
    }
pcpp::TLVRecord<unsigned char, unsigned char>::isNull() const
Line
Count
Source
129
5.03M
    {
130
5.03M
      return (m_Data == nullptr);
131
5.03M
    }
pcpp::TLVRecord<unsigned short, unsigned short>::isNull() const
Line
Count
Source
129
107k
    {
130
107k
      return (m_Data == nullptr);
131
107k
    }
Unexecuted instantiation: pcpp::TLVRecord<unsigned char, unsigned short>::isNull() const
132
133
    /// @return True if the TLV record raw data is not nullptr, false otherwise
134
    bool isNotNull() const
135
344k
    {
136
344k
      return (m_Data != nullptr);
137
344k
    }
pcpp::TLVRecord<unsigned char, unsigned char>::isNotNull() const
Line
Count
Source
135
344k
    {
136
344k
      return (m_Data != nullptr);
137
344k
    }
Unexecuted instantiation: pcpp::TLVRecord<unsigned short, unsigned short>::isNotNull() const
Unexecuted instantiation: pcpp::TLVRecord<unsigned char, unsigned short>::isNotNull() const
138
139
    /// @return A pointer to the TLV record raw data byte stream
140
    uint8_t* getRecordBasePtr() const
141
7.70M
    {
142
7.70M
      return reinterpret_cast<uint8_t*>(m_Data);
143
7.70M
    }
pcpp::TLVRecord<unsigned char, unsigned char>::getRecordBasePtr() const
Line
Count
Source
141
7.53M
    {
142
7.53M
      return reinterpret_cast<uint8_t*>(m_Data);
143
7.53M
    }
pcpp::TLVRecord<unsigned short, unsigned short>::getRecordBasePtr() const
Line
Count
Source
141
166k
    {
142
166k
      return reinterpret_cast<uint8_t*>(m_Data);
143
166k
    }
Unexecuted instantiation: pcpp::TLVRecord<unsigned char, unsigned short>::getRecordBasePtr() const
144
145
    /// Free the memory of the TLV record raw data
146
    void purgeRecordData()
147
100k
    {
148
100k
      if (!isNull())
149
100k
      {
150
100k
        delete[] m_Data;
151
100k
        m_Data = nullptr;
152
100k
      }
153
100k
    }
pcpp::TLVRecord<unsigned char, unsigned char>::purgeRecordData()
Line
Count
Source
147
100k
    {
148
100k
      if (!isNull())
149
100k
      {
150
100k
        delete[] m_Data;
151
100k
        m_Data = nullptr;
152
100k
      }
153
100k
    }
Unexecuted instantiation: pcpp::TLVRecord<unsigned short, unsigned short>::purgeRecordData()
Unexecuted instantiation: pcpp::TLVRecord<unsigned char, unsigned short>::purgeRecordData()
154
155
    /// A templated method to retrieve the record data as a certain type T. For example, if record data is 4B long
156
    /// (integer) then this method should be used as getValueAs<int>() and it will return the record data as an
157
    /// integer.<BR> Notice this return value is a copy of the data, not a pointer to the actual data
158
    /// @tparam T A non-pointer, default-constructible, trivially copyable type
159
    /// @param[in] offset The offset in the record data to start reading the value from. Useful for cases when you
160
    /// want to read some of the data that doesn't start at offset 0. This is an optional parameter and the default
161
    /// value is 0, meaning start reading the value at the beginning of the record data
162
    /// @return The record data as type T
163
    template <typename T> T getValueAs(size_t offset = 0) const
164
22.6k
    {
165
22.6k
      static_assert(std::is_trivially_copyable<T>::value && std::is_default_constructible<T>::value &&
166
22.6k
                        !std::is_pointer<T>::value,
167
22.6k
                    "TLVRecord::getValueAs<T>() requires T to be a non-pointer, "
168
22.6k
                    "default-constructible, trivially copyable type");
169
170
22.6k
      if (getDataSize() < sizeof(T) + offset)
171
8.22k
      {
172
8.22k
        return T{};
173
8.22k
      }
174
175
14.4k
      T result;
176
14.4k
      memcpy(&result, m_Data->recordValue + getValueOffset() + offset, sizeof(T));
177
14.4k
      return result;
178
22.6k
    }
unsigned char pcpp::TLVRecord<unsigned char, unsigned char>::getValueAs<unsigned char>(unsigned long) const
Line
Count
Source
164
15.6k
    {
165
15.6k
      static_assert(std::is_trivially_copyable<T>::value && std::is_default_constructible<T>::value &&
166
15.6k
                        !std::is_pointer<T>::value,
167
15.6k
                    "TLVRecord::getValueAs<T>() requires T to be a non-pointer, "
168
15.6k
                    "default-constructible, trivially copyable type");
169
170
15.6k
      if (getDataSize() < sizeof(T) + offset)
171
1.71k
      {
172
1.71k
        return T{};
173
1.71k
      }
174
175
13.9k
      T result;
176
13.9k
      memcpy(&result, m_Data->recordValue + getValueOffset() + offset, sizeof(T));
177
13.9k
      return result;
178
15.6k
    }
unsigned int pcpp::TLVRecord<unsigned char, unsigned char>::getValueAs<unsigned int>(unsigned long) const
Line
Count
Source
164
7.01k
    {
165
7.01k
      static_assert(std::is_trivially_copyable<T>::value && std::is_default_constructible<T>::value &&
166
7.01k
                        !std::is_pointer<T>::value,
167
7.01k
                    "TLVRecord::getValueAs<T>() requires T to be a non-pointer, "
168
7.01k
                    "default-constructible, trivially copyable type");
169
170
7.01k
      if (getDataSize() < sizeof(T) + offset)
171
6.51k
      {
172
6.51k
        return T{};
173
6.51k
      }
174
175
503
      T result;
176
503
      memcpy(&result, m_Data->recordValue + getValueOffset() + offset, sizeof(T));
177
503
      return result;
178
7.01k
    }
179
180
    /// A templated method to copy data of type T into the TLV record data. For example: if record data is 4[Bytes]
181
    /// long use this method with \<int\> to set an integer value into the record data: setValue<int>(num)
182
    /// @tparam T A non-pointer, trivially copyable type
183
    /// @param[in] newValue The value of type T to copy to the record data
184
    /// @param[in] valueOffset An optional parameter that specifies where to start setting the record data (default
185
    /// set to 0). For example: if record data is 20 bytes long and you only need to set the 4 last bytes as integer
186
    /// then use this method like this: setValue<int>(num, 16)
187
    /// @return True if value was set successfully or false if the size of T is larger than the record data size
188
    template <typename T> bool setValue(T newValue, int valueOffset = 0)
189
0
    {
190
0
      static_assert(std::is_trivially_copyable<T>::value && !std::is_pointer<T>::value,
191
0
                    "TLVRecord::setValue<T>() requires T to be a non-pointer, trivially copyable type");
192
193
0
      if (getDataSize() < sizeof(T))
194
0
      {
195
0
        return false;
196
0
      }
197
198
0
      memcpy(m_Data->recordValue + getValueOffset() + valueOffset, &newValue, sizeof(T));
199
0
      return true;
200
0
    }
Unexecuted instantiation: bool pcpp::TLVRecord<unsigned char, unsigned char>::setValue<unsigned int>(unsigned int, int)
Unexecuted instantiation: bool pcpp::TLVRecord<unsigned char, unsigned char>::setValue<unsigned char>(unsigned char, int)
201
202
    /// @return The total size of the TLV record (in bytes)
203
    virtual size_t getTotalSize() const = 0;
204
205
    /// @return The size of the record value (meaning the size of the 'V' part in TLV)
206
    virtual size_t getDataSize() const = 0;
207
208
  protected:
209
    virtual size_t getValueOffset() const
210
14.4k
    {
211
14.4k
      return 0;
212
14.4k
    }
pcpp::TLVRecord<unsigned char, unsigned char>::getValueOffset() const
Line
Count
Source
210
14.4k
    {
211
14.4k
      return 0;
212
14.4k
    }
Unexecuted instantiation: pcpp::TLVRecord<unsigned short, unsigned short>::getValueOffset() const
Unexecuted instantiation: pcpp::TLVRecord<unsigned char, unsigned short>::getValueOffset() const
213
  };
214
215
  /// @class TLVRecordReader
216
  /// A class for reading TLV records data out of a byte stream. This class contains helper methods for retrieving and
217
  /// counting TLV records. This is a template class that expects template argument class derived from TLVRecord.
218
  template <typename TLVRecordType> class TLVRecordReader
219
  {
220
  private:
221
    mutable size_t m_RecordCount;
222
223
  public:
224
    /// A default c'tor for this class
225
    TLVRecordReader()
226
3.16M
    {
227
3.16M
      m_RecordCount = static_cast<size_t>(-1);
228
3.16M
    }
pcpp::TLVRecordReader<pcpp::NflogTlv>::TLVRecordReader()
Line
Count
Source
226
4.69k
    {
227
4.69k
      m_RecordCount = static_cast<size_t>(-1);
228
4.69k
    }
pcpp::TLVRecordReader<pcpp::PPPoEDiscoveryLayer::PPPoETag>::TLVRecordReader()
Line
Count
Source
226
6.63k
    {
227
6.63k
      m_RecordCount = static_cast<size_t>(-1);
228
6.63k
    }
pcpp::TLVRecordReader<pcpp::IPv4Option>::TLVRecordReader()
Line
Count
Source
226
1.76M
    {
227
1.76M
      m_RecordCount = static_cast<size_t>(-1);
228
1.76M
    }
pcpp::TLVRecordReader<pcpp::TcpOption>::TLVRecordReader()
Line
Count
Source
226
1.23M
    {
227
1.23M
      m_RecordCount = static_cast<size_t>(-1);
228
1.23M
    }
pcpp::TLVRecordReader<pcpp::GtpV2InformationElement>::TLVRecordReader()
Line
Count
Source
226
20.8k
    {
227
20.8k
      m_RecordCount = static_cast<size_t>(-1);
228
20.8k
    }
pcpp::TLVRecordReader<pcpp::RadiusAttribute>::TLVRecordReader()
Line
Count
Source
226
31.5k
    {
227
31.5k
      m_RecordCount = static_cast<size_t>(-1);
228
31.5k
    }
pcpp::TLVRecordReader<pcpp::DhcpOption>::TLVRecordReader()
Line
Count
Source
226
38.1k
    {
227
38.1k
      m_RecordCount = static_cast<size_t>(-1);
228
38.1k
    }
pcpp::TLVRecordReader<pcpp::DhcpV6Option>::TLVRecordReader()
Line
Count
Source
226
24.9k
    {
227
24.9k
      m_RecordCount = static_cast<size_t>(-1);
228
24.9k
    }
pcpp::TLVRecordReader<pcpp::NdpOption>::TLVRecordReader()
Line
Count
Source
226
5.32k
    {
227
5.32k
      m_RecordCount = static_cast<size_t>(-1);
228
5.32k
    }
pcpp::TLVRecordReader<pcpp::IPv6TLVOptionHeader::IPv6Option>::TLVRecordReader()
Line
Count
Source
226
28.7k
    {
227
28.7k
      m_RecordCount = static_cast<size_t>(-1);
228
28.7k
    }
229
230
    /// A default copy c'tor for this class
231
    TLVRecordReader(const TLVRecordReader& other)
232
    {
233
      m_RecordCount = other.m_RecordCount;
234
    }
235
236
    /// A d'tor for this class which currently does nothing
237
3.16M
    virtual ~TLVRecordReader() = default;
pcpp::TLVRecordReader<pcpp::NflogTlv>::~TLVRecordReader()
Line
Count
Source
237
4.69k
    virtual ~TLVRecordReader() = default;
pcpp::TLVRecordReader<pcpp::PPPoEDiscoveryLayer::PPPoETag>::~TLVRecordReader()
Line
Count
Source
237
6.63k
    virtual ~TLVRecordReader() = default;
pcpp::TLVRecordReader<pcpp::IPv4Option>::~TLVRecordReader()
Line
Count
Source
237
1.76M
    virtual ~TLVRecordReader() = default;
pcpp::TLVRecordReader<pcpp::IPv6TLVOptionHeader::IPv6Option>::~TLVRecordReader()
Line
Count
Source
237
28.7k
    virtual ~TLVRecordReader() = default;
pcpp::TLVRecordReader<pcpp::TcpOption>::~TLVRecordReader()
Line
Count
Source
237
1.23M
    virtual ~TLVRecordReader() = default;
pcpp::TLVRecordReader<pcpp::GtpV2InformationElement>::~TLVRecordReader()
Line
Count
Source
237
20.8k
    virtual ~TLVRecordReader() = default;
pcpp::TLVRecordReader<pcpp::RadiusAttribute>::~TLVRecordReader()
Line
Count
Source
237
31.5k
    virtual ~TLVRecordReader() = default;
pcpp::TLVRecordReader<pcpp::DhcpOption>::~TLVRecordReader()
Line
Count
Source
237
38.1k
    virtual ~TLVRecordReader() = default;
pcpp::TLVRecordReader<pcpp::DhcpV6Option>::~TLVRecordReader()
Line
Count
Source
237
24.9k
    virtual ~TLVRecordReader() = default;
pcpp::TLVRecordReader<pcpp::NdpOption>::~TLVRecordReader()
Line
Count
Source
237
5.32k
    virtual ~TLVRecordReader() = default;
238
239
    /// Overload of the assignment operator for this class
240
    /// @param[in] other The TLVRecordReader instance to assign
241
    TLVRecordReader& operator=(const TLVRecordReader& other)
242
193k
    {
243
193k
      m_RecordCount = other.m_RecordCount;
244
193k
      return *this;
245
193k
    }
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::IPv4Option>::operator=(pcpp::TLVRecordReader<pcpp::IPv4Option> const&)
pcpp::TLVRecordReader<pcpp::TcpOption>::operator=(pcpp::TLVRecordReader<pcpp::TcpOption> const&)
Line
Count
Source
242
193k
    {
243
193k
      m_RecordCount = other.m_RecordCount;
244
193k
      return *this;
245
193k
    }
246
247
    // cppcheck-suppress functionStatic
248
    /// Get the first TLV record out of a byte stream
249
    /// @param[in] tlvDataBasePtr A pointer to the TLV data byte stream
250
    /// @param[in] tlvDataLen The TLV data byte stream length
251
    /// @return An instance of type TLVRecordType that contains the first TLV record. If tlvDataBasePtr is nullptr
252
    /// or tlvDataLen is zero the returned TLVRecordType instance will be logically null, meaning
253
    /// TLVRecordType.isNull() will return true
254
    TLVRecordType getFirstTLVRecord(uint8_t* tlvDataBasePtr, size_t tlvDataLen) const
255
359k
    {
256
359k
      TLVRecordType resRec(nullptr);  // for NRVO optimization
257
359k
      if (!TLVRecordType::canAssign(tlvDataBasePtr, tlvDataLen))
258
78.7k
        return resRec;
259
260
280k
      resRec.assign(tlvDataBasePtr);
261
      // resRec pointer is out-bounds of the TLV records memory
262
280k
      if (resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
263
10.4k
        resRec.assign(nullptr);
264
265
      // check if there are records at all and the total size is not zero
266
280k
      if (!resRec.isNull() && (tlvDataLen == 0 || resRec.getTotalSize() == 0))
267
2.72k
        resRec.assign(nullptr);
268
269
280k
      return resRec;
270
359k
    }
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::IPv4Option>::getFirstTLVRecord(unsigned char*, unsigned long) const
pcpp::TLVRecordReader<pcpp::NflogTlv>::getFirstTLVRecord(unsigned char*, unsigned long) const
Line
Count
Source
255
6.80k
    {
256
6.80k
      TLVRecordType resRec(nullptr);  // for NRVO optimization
257
6.80k
      if (!TLVRecordType::canAssign(tlvDataBasePtr, tlvDataLen))
258
112
        return resRec;
259
260
6.69k
      resRec.assign(tlvDataBasePtr);
261
      // resRec pointer is out-bounds of the TLV records memory
262
6.69k
      if (resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
263
2.18k
        resRec.assign(nullptr);
264
265
      // check if there are records at all and the total size is not zero
266
6.69k
      if (!resRec.isNull() && (tlvDataLen == 0 || resRec.getTotalSize() == 0))
267
1.47k
        resRec.assign(nullptr);
268
269
6.69k
      return resRec;
270
6.80k
    }
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::PPPoEDiscoveryLayer::PPPoETag>::getFirstTLVRecord(unsigned char*, unsigned long) const
pcpp::TLVRecordReader<pcpp::TcpOption>::getFirstTLVRecord(unsigned char*, unsigned long) const
Line
Count
Source
255
293k
    {
256
293k
      TLVRecordType resRec(nullptr);  // for NRVO optimization
257
293k
      if (!TLVRecordType::canAssign(tlvDataBasePtr, tlvDataLen))
258
77.3k
        return resRec;
259
260
216k
      resRec.assign(tlvDataBasePtr);
261
      // resRec pointer is out-bounds of the TLV records memory
262
216k
      if (resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
263
7.20k
        resRec.assign(nullptr);
264
265
      // check if there are records at all and the total size is not zero
266
216k
      if (!resRec.isNull() && (tlvDataLen == 0 || resRec.getTotalSize() == 0))
267
600
        resRec.assign(nullptr);
268
269
216k
      return resRec;
270
293k
    }
pcpp::TLVRecordReader<pcpp::DhcpOption>::getFirstTLVRecord(unsigned char*, unsigned long) const
Line
Count
Source
255
42.6k
    {
256
42.6k
      TLVRecordType resRec(nullptr);  // for NRVO optimization
257
42.6k
      if (!TLVRecordType::canAssign(tlvDataBasePtr, tlvDataLen))
258
30
        return resRec;
259
260
42.6k
      resRec.assign(tlvDataBasePtr);
261
      // resRec pointer is out-bounds of the TLV records memory
262
42.6k
      if (resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
263
530
        resRec.assign(nullptr);
264
265
      // check if there are records at all and the total size is not zero
266
42.6k
      if (!resRec.isNull() && (tlvDataLen == 0 || resRec.getTotalSize() == 0))
267
0
        resRec.assign(nullptr);
268
269
42.6k
      return resRec;
270
42.6k
    }
pcpp::TLVRecordReader<pcpp::DhcpV6Option>::getFirstTLVRecord(unsigned char*, unsigned long) const
Line
Count
Source
255
13.5k
    {
256
13.5k
      TLVRecordType resRec(nullptr);  // for NRVO optimization
257
13.5k
      if (!TLVRecordType::canAssign(tlvDataBasePtr, tlvDataLen))
258
40
        return resRec;
259
260
13.4k
      resRec.assign(tlvDataBasePtr);
261
      // resRec pointer is out-bounds of the TLV records memory
262
13.4k
      if (resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
263
534
        resRec.assign(nullptr);
264
265
      // check if there are records at all and the total size is not zero
266
13.4k
      if (!resRec.isNull() && (tlvDataLen == 0 || resRec.getTotalSize() == 0))
267
0
        resRec.assign(nullptr);
268
269
13.4k
      return resRec;
270
13.5k
    }
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::GtpV2InformationElement>::getFirstTLVRecord(unsigned char*, unsigned long) const
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::IPv6TLVOptionHeader::IPv6Option>::getFirstTLVRecord(unsigned char*, unsigned long) const
pcpp::TLVRecordReader<pcpp::NdpOption>::getFirstTLVRecord(unsigned char*, unsigned long) const
Line
Count
Source
255
3.27k
    {
256
3.27k
      TLVRecordType resRec(nullptr);  // for NRVO optimization
257
3.27k
      if (!TLVRecordType::canAssign(tlvDataBasePtr, tlvDataLen))
258
1.22k
        return resRec;
259
260
2.05k
      resRec.assign(tlvDataBasePtr);
261
      // resRec pointer is out-bounds of the TLV records memory
262
2.05k
      if (resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
263
40
        resRec.assign(nullptr);
264
265
      // check if there are records at all and the total size is not zero
266
2.05k
      if (!resRec.isNull() && (tlvDataLen == 0 || resRec.getTotalSize() == 0))
267
654
        resRec.assign(nullptr);
268
269
2.05k
      return resRec;
270
3.27k
    }
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::RadiusAttribute>::getFirstTLVRecord(unsigned char*, unsigned long) const
271
272
    // cppcheck-suppress [constParameterReference, functionStatic]
273
    /// Get a TLV record that follows a given TLV record in a byte stream
274
    /// @param[in] record A given TLV record
275
    /// @param[in] tlvDataBasePtr A pointer to the TLV data byte stream
276
    /// @param[in] tlvDataLen The TLV data byte stream length
277
    /// @return An instance of type TLVRecordType that wraps the record following the record given as input. If the
278
    /// input record.isNull() is true or if the next record is out of bounds of the byte stream, a logical null
279
    /// instance of TLVRecordType will be returned, meaning TLVRecordType.isNull() will return true
280
    TLVRecordType getNextTLVRecord(TLVRecordType& record, const uint8_t* tlvDataBasePtr, size_t tlvDataLen) const
281
1.52M
    {
282
1.52M
      TLVRecordType resRec(nullptr);  // for NRVO optimization
283
284
1.52M
      if (record.isNull())
285
0
        return resRec;
286
287
1.52M
      if (!TLVRecordType::canAssign(record.getRecordBasePtr() + record.getTotalSize(),
288
1.52M
                                    tlvDataBasePtr - record.getRecordBasePtr() + tlvDataLen -
289
1.52M
                                        record.getTotalSize()))
290
114k
        return resRec;
291
292
1.40M
      resRec.assign(record.getRecordBasePtr() + record.getTotalSize());
293
294
1.40M
      if (resRec.getTotalSize() == 0)
295
4.72k
        resRec.assign(nullptr);
296
297
      // resRec pointer is out-bounds of the TLV records memory
298
1.40M
      if ((resRec.getRecordBasePtr() - tlvDataBasePtr) < 0)
299
4.72k
        resRec.assign(nullptr);
300
301
      // resRec pointer is out-bounds of the TLV records memory
302
1.40M
      if (!resRec.isNull() && resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
303
28.1k
        resRec.assign(nullptr);
304
305
1.40M
      return resRec;
306
1.52M
    }
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::IPv4Option>::getNextTLVRecord(pcpp::IPv4Option&, unsigned char const*, unsigned long) const
pcpp::TLVRecordReader<pcpp::NflogTlv>::getNextTLVRecord(pcpp::NflogTlv&, unsigned char const*, unsigned long) const
Line
Count
Source
281
7.53k
    {
282
7.53k
      TLVRecordType resRec(nullptr);  // for NRVO optimization
283
284
7.53k
      if (record.isNull())
285
0
        return resRec;
286
287
7.53k
      if (!TLVRecordType::canAssign(record.getRecordBasePtr() + record.getTotalSize(),
288
7.53k
                                    tlvDataBasePtr - record.getRecordBasePtr() + tlvDataLen -
289
7.53k
                                        record.getTotalSize()))
290
552
        return resRec;
291
292
6.98k
      resRec.assign(record.getRecordBasePtr() + record.getTotalSize());
293
294
6.98k
      if (resRec.getTotalSize() == 0)
295
834
        resRec.assign(nullptr);
296
297
      // resRec pointer is out-bounds of the TLV records memory
298
6.98k
      if ((resRec.getRecordBasePtr() - tlvDataBasePtr) < 0)
299
834
        resRec.assign(nullptr);
300
301
      // resRec pointer is out-bounds of the TLV records memory
302
6.98k
      if (!resRec.isNull() && resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
303
1.37k
        resRec.assign(nullptr);
304
305
6.98k
      return resRec;
306
7.53k
    }
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::PPPoEDiscoveryLayer::PPPoETag>::getNextTLVRecord(pcpp::PPPoEDiscoveryLayer::PPPoETag&, unsigned char const*, unsigned long) const
pcpp::TLVRecordReader<pcpp::TcpOption>::getNextTLVRecord(pcpp::TcpOption&, unsigned char const*, unsigned long) const
Line
Count
Source
281
397k
    {
282
397k
      TLVRecordType resRec(nullptr);  // for NRVO optimization
283
284
397k
      if (record.isNull())
285
0
        return resRec;
286
287
397k
      if (!TLVRecordType::canAssign(record.getRecordBasePtr() + record.getTotalSize(),
288
397k
                                    tlvDataBasePtr - record.getRecordBasePtr() + tlvDataLen -
289
397k
                                        record.getTotalSize()))
290
87.2k
        return resRec;
291
292
309k
      resRec.assign(record.getRecordBasePtr() + record.getTotalSize());
293
294
309k
      if (resRec.getTotalSize() == 0)
295
3.89k
        resRec.assign(nullptr);
296
297
      // resRec pointer is out-bounds of the TLV records memory
298
309k
      if ((resRec.getRecordBasePtr() - tlvDataBasePtr) < 0)
299
3.89k
        resRec.assign(nullptr);
300
301
      // resRec pointer is out-bounds of the TLV records memory
302
309k
      if (!resRec.isNull() && resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
303
16.3k
        resRec.assign(nullptr);
304
305
309k
      return resRec;
306
397k
    }
pcpp::TLVRecordReader<pcpp::DhcpOption>::getNextTLVRecord(pcpp::DhcpOption&, unsigned char const*, unsigned long) const
Line
Count
Source
281
1.08M
    {
282
1.08M
      TLVRecordType resRec(nullptr);  // for NRVO optimization
283
284
1.08M
      if (record.isNull())
285
0
        return resRec;
286
287
1.08M
      if (!TLVRecordType::canAssign(record.getRecordBasePtr() + record.getTotalSize(),
288
1.08M
                                    tlvDataBasePtr - record.getRecordBasePtr() + tlvDataLen -
289
1.08M
                                        record.getTotalSize()))
290
19.0k
        return resRec;
291
292
1.06M
      resRec.assign(record.getRecordBasePtr() + record.getTotalSize());
293
294
1.06M
      if (resRec.getTotalSize() == 0)
295
0
        resRec.assign(nullptr);
296
297
      // resRec pointer is out-bounds of the TLV records memory
298
1.06M
      if ((resRec.getRecordBasePtr() - tlvDataBasePtr) < 0)
299
0
        resRec.assign(nullptr);
300
301
      // resRec pointer is out-bounds of the TLV records memory
302
1.06M
      if (!resRec.isNull() && resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
303
6.16k
        resRec.assign(nullptr);
304
305
1.06M
      return resRec;
306
1.08M
    }
pcpp::TLVRecordReader<pcpp::DhcpV6Option>::getNextTLVRecord(pcpp::DhcpV6Option&, unsigned char const*, unsigned long) const
Line
Count
Source
281
35.0k
    {
282
35.0k
      TLVRecordType resRec(nullptr);  // for NRVO optimization
283
284
35.0k
      if (record.isNull())
285
0
        return resRec;
286
287
35.0k
      if (!TLVRecordType::canAssign(record.getRecordBasePtr() + record.getTotalSize(),
288
35.0k
                                    tlvDataBasePtr - record.getRecordBasePtr() + tlvDataLen -
289
35.0k
                                        record.getTotalSize()))
290
7.47k
        return resRec;
291
292
27.6k
      resRec.assign(record.getRecordBasePtr() + record.getTotalSize());
293
294
27.6k
      if (resRec.getTotalSize() == 0)
295
0
        resRec.assign(nullptr);
296
297
      // resRec pointer is out-bounds of the TLV records memory
298
27.6k
      if ((resRec.getRecordBasePtr() - tlvDataBasePtr) < 0)
299
0
        resRec.assign(nullptr);
300
301
      // resRec pointer is out-bounds of the TLV records memory
302
27.6k
      if (!resRec.isNull() && resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
303
4.15k
        resRec.assign(nullptr);
304
305
27.6k
      return resRec;
306
35.0k
    }
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::GtpV2InformationElement>::getNextTLVRecord(pcpp::GtpV2InformationElement&, unsigned char const*, unsigned long) const
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::IPv6TLVOptionHeader::IPv6Option>::getNextTLVRecord(pcpp::IPv6TLVOptionHeader::IPv6Option&, unsigned char const*, unsigned long) const
pcpp::TLVRecordReader<pcpp::NdpOption>::getNextTLVRecord(pcpp::NdpOption&, unsigned char const*, unsigned long) const
Line
Count
Source
281
160
    {
282
160
      TLVRecordType resRec(nullptr);  // for NRVO optimization
283
284
160
      if (record.isNull())
285
0
        return resRec;
286
287
160
      if (!TLVRecordType::canAssign(record.getRecordBasePtr() + record.getTotalSize(),
288
160
                                    tlvDataBasePtr - record.getRecordBasePtr() + tlvDataLen -
289
160
                                        record.getTotalSize()))
290
2
        return resRec;
291
292
158
      resRec.assign(record.getRecordBasePtr() + record.getTotalSize());
293
294
158
      if (resRec.getTotalSize() == 0)
295
4
        resRec.assign(nullptr);
296
297
      // resRec pointer is out-bounds of the TLV records memory
298
158
      if ((resRec.getRecordBasePtr() - tlvDataBasePtr) < 0)
299
4
        resRec.assign(nullptr);
300
301
      // resRec pointer is out-bounds of the TLV records memory
302
158
      if (!resRec.isNull() && resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
303
78
        resRec.assign(nullptr);
304
305
158
      return resRec;
306
160
    }
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::RadiusAttribute>::getNextTLVRecord(pcpp::RadiusAttribute&, unsigned char const*, unsigned long) const
307
308
    /// Search for the first TLV record that corresponds to a given record type (the 'T' in __Type__-Length-Value)
309
    /// @param[in] recordType The record type to search for
310
    /// @param[in] tlvDataBasePtr A pointer to the TLV data byte stream
311
    /// @param[in] tlvDataLen The TLV data byte stream length
312
    /// @return An instance of type TLVRecordType that contains the result record. If record was not found a logical
313
    /// null instance of TLVRecordType will be returned, meaning TLVRecordType.isNull() will return true
314
    TLVRecordType getTLVRecord(uint32_t recordType, uint8_t* tlvDataBasePtr, size_t tlvDataLen) const
315
233k
    {
316
233k
      TLVRecordType curRec = getFirstTLVRecord(tlvDataBasePtr, tlvDataLen);
317
775k
      while (!curRec.isNull())
318
661k
      {
319
661k
        if (curRec.getType() == recordType)
320
120k
        {
321
120k
          return curRec;
322
120k
        }
323
324
541k
        curRec = getNextTLVRecord(curRec, tlvDataBasePtr, tlvDataLen);
325
541k
      }
326
327
113k
      curRec.assign(nullptr);
328
113k
      return curRec;  // for NRVO optimization
329
233k
    }
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::IPv4Option>::getTLVRecord(unsigned int, unsigned char*, unsigned long) const
pcpp::TLVRecordReader<pcpp::NflogTlv>::getTLVRecord(unsigned int, unsigned char*, unsigned long) const
Line
Count
Source
315
4.47k
    {
316
4.47k
      TLVRecordType curRec = getFirstTLVRecord(tlvDataBasePtr, tlvDataLen);
317
9.55k
      while (!curRec.isNull())
318
5.26k
      {
319
5.26k
        if (curRec.getType() == recordType)
320
192
        {
321
192
          return curRec;
322
192
        }
323
324
5.07k
        curRec = getNextTLVRecord(curRec, tlvDataBasePtr, tlvDataLen);
325
5.07k
      }
326
327
4.28k
      curRec.assign(nullptr);
328
4.28k
      return curRec;  // for NRVO optimization
329
4.47k
    }
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::PPPoEDiscoveryLayer::PPPoETag>::getTLVRecord(unsigned int, unsigned char*, unsigned long) const
pcpp::TLVRecordReader<pcpp::TcpOption>::getTLVRecord(unsigned int, unsigned char*, unsigned long) const
Line
Count
Source
315
193k
    {
316
193k
      TLVRecordType curRec = getFirstTLVRecord(tlvDataBasePtr, tlvDataLen);
317
245k
      while (!curRec.isNull())
318
152k
      {
319
152k
        if (curRec.getType() == recordType)
320
100k
        {
321
100k
          return curRec;
322
100k
        }
323
324
52.2k
        curRec = getNextTLVRecord(curRec, tlvDataBasePtr, tlvDataLen);
325
52.2k
      }
326
327
92.5k
      curRec.assign(nullptr);
328
92.5k
      return curRec;  // for NRVO optimization
329
193k
    }
pcpp::TLVRecordReader<pcpp::DhcpOption>::getTLVRecord(unsigned int, unsigned char*, unsigned long) const
Line
Count
Source
315
28.5k
    {
316
28.5k
      TLVRecordType curRec = getFirstTLVRecord(tlvDataBasePtr, tlvDataLen);
317
502k
      while (!curRec.isNull())
318
491k
      {
319
491k
        if (curRec.getType() == recordType)
320
16.9k
        {
321
16.9k
          return curRec;
322
16.9k
        }
323
324
474k
        curRec = getNextTLVRecord(curRec, tlvDataBasePtr, tlvDataLen);
325
474k
      }
326
327
11.6k
      curRec.assign(nullptr);
328
11.6k
      return curRec;  // for NRVO optimization
329
28.5k
    }
pcpp::TLVRecordReader<pcpp::DhcpV6Option>::getTLVRecord(unsigned int, unsigned char*, unsigned long) const
Line
Count
Source
315
4.31k
    {
316
4.31k
      TLVRecordType curRec = getFirstTLVRecord(tlvDataBasePtr, tlvDataLen);
317
14.0k
      while (!curRec.isNull())
318
10.9k
      {
319
10.9k
        if (curRec.getType() == recordType)
320
1.30k
        {
321
1.30k
          return curRec;
322
1.30k
        }
323
324
9.68k
        curRec = getNextTLVRecord(curRec, tlvDataBasePtr, tlvDataLen);
325
9.68k
      }
326
327
3.00k
      curRec.assign(nullptr);
328
3.00k
      return curRec;  // for NRVO optimization
329
4.31k
    }
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::GtpV2InformationElement>::getTLVRecord(unsigned int, unsigned char*, unsigned long) const
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::IPv6TLVOptionHeader::IPv6Option>::getTLVRecord(unsigned int, unsigned char*, unsigned long) const
pcpp::TLVRecordReader<pcpp::NdpOption>::getTLVRecord(unsigned int, unsigned char*, unsigned long) const
Line
Count
Source
315
3.27k
    {
316
3.27k
      TLVRecordType curRec = getFirstTLVRecord(tlvDataBasePtr, tlvDataLen);
317
3.43k
      while (!curRec.isNull())
318
1.43k
      {
319
1.43k
        if (curRec.getType() == recordType)
320
1.27k
        {
321
1.27k
          return curRec;
322
1.27k
        }
323
324
160
        curRec = getNextTLVRecord(curRec, tlvDataBasePtr, tlvDataLen);
325
160
      }
326
327
1.99k
      curRec.assign(nullptr);
328
1.99k
      return curRec;  // for NRVO optimization
329
3.27k
    }
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::RadiusAttribute>::getTLVRecord(unsigned int, unsigned char*, unsigned long) const
330
331
    /// Get the TLV record count in a given TLV data byte stream. For efficiency purposes the count is being cached
332
    /// so only the first call to this method will go over all the TLV records, while all consequent calls will
333
    /// return the cached number. This implies that if there is a change in the number of records, it's the user's
334
    /// responsibility to call changeTLVRecordCount() with the record count change
335
    /// @param[in] tlvDataBasePtr A pointer to the TLV data byte stream
336
    /// @param[in] tlvDataLen The TLV data byte stream length
337
    /// @return The TLV record count
338
    size_t getTLVRecordCount(uint8_t* tlvDataBasePtr, size_t tlvDataLen) const
339
339k
    {
340
339k
      if (m_RecordCount != static_cast<size_t>(-1))
341
327k
        return m_RecordCount;
342
343
12.0k
      m_RecordCount = 0;
344
12.0k
      TLVRecordType curRec = getFirstTLVRecord(tlvDataBasePtr, tlvDataLen);
345
328k
      while (!curRec.isNull())
346
316k
      {
347
316k
        m_RecordCount++;
348
316k
        curRec = getNextTLVRecord(curRec, tlvDataBasePtr, tlvDataLen);
349
316k
      }
350
351
12.0k
      return m_RecordCount;
352
339k
    }
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::IPv4Option>::getTLVRecordCount(unsigned char*, unsigned long) const
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::PPPoEDiscoveryLayer::PPPoETag>::getTLVRecordCount(unsigned char*, unsigned long) const
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::TcpOption>::getTLVRecordCount(unsigned char*, unsigned long) const
pcpp::TLVRecordReader<pcpp::DhcpOption>::getTLVRecordCount(unsigned char*, unsigned long) const
Line
Count
Source
339
317k
    {
340
317k
      if (m_RecordCount != static_cast<size_t>(-1))
341
310k
        return m_RecordCount;
342
343
7.12k
      m_RecordCount = 0;
344
7.12k
      TLVRecordType curRec = getFirstTLVRecord(tlvDataBasePtr, tlvDataLen);
345
310k
      while (!curRec.isNull())
346
303k
      {
347
303k
        m_RecordCount++;
348
303k
        curRec = getNextTLVRecord(curRec, tlvDataBasePtr, tlvDataLen);
349
303k
      }
350
351
7.12k
      return m_RecordCount;
352
317k
    }
pcpp::TLVRecordReader<pcpp::DhcpV6Option>::getTLVRecordCount(unsigned char*, unsigned long) const
Line
Count
Source
339
21.9k
    {
340
21.9k
      if (m_RecordCount != static_cast<size_t>(-1))
341
17.0k
        return m_RecordCount;
342
343
4.88k
      m_RecordCount = 0;
344
4.88k
      TLVRecordType curRec = getFirstTLVRecord(tlvDataBasePtr, tlvDataLen);
345
17.5k
      while (!curRec.isNull())
346
12.7k
      {
347
12.7k
        m_RecordCount++;
348
12.7k
        curRec = getNextTLVRecord(curRec, tlvDataBasePtr, tlvDataLen);
349
12.7k
      }
350
351
4.88k
      return m_RecordCount;
352
21.9k
    }
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::GtpV2InformationElement>::getTLVRecordCount(unsigned char*, unsigned long) const
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::IPv6TLVOptionHeader::IPv6Option>::getTLVRecordCount(unsigned char*, unsigned long) const
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::NdpOption>::getTLVRecordCount(unsigned char*, unsigned long) const
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::RadiusAttribute>::getTLVRecordCount(unsigned char*, unsigned long) const
353
354
    /// As described in getTLVRecordCount(), the TLV record count is being cached for efficiency purposes. So if the
355
    /// number of TLV records change, it's the user's responsibility to call this method with the number of TLV
356
    /// records being added or removed. If records were added the change should be a positive number, or a negative
357
    /// number if records were removed
358
    /// @param[in] changedBy Number of records that were added or removed
359
    void changeTLVRecordCount(int changedBy)
360
100k
    {
361
100k
      if (m_RecordCount != static_cast<size_t>(-1))
362
0
        m_RecordCount += changedBy;
363
100k
    }
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::IPv4Option>::changeTLVRecordCount(int)
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::PPPoEDiscoveryLayer::PPPoETag>::changeTLVRecordCount(int)
pcpp::TLVRecordReader<pcpp::TcpOption>::changeTLVRecordCount(int)
Line
Count
Source
360
100k
    {
361
100k
      if (m_RecordCount != static_cast<size_t>(-1))
362
0
        m_RecordCount += changedBy;
363
100k
    }
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::DhcpOption>::changeTLVRecordCount(int)
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::DhcpV6Option>::changeTLVRecordCount(int)
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::GtpV2InformationElement>::changeTLVRecordCount(int)
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::IPv6TLVOptionHeader::IPv6Option>::changeTLVRecordCount(int)
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::NdpOption>::changeTLVRecordCount(int)
Unexecuted instantiation: pcpp::TLVRecordReader<pcpp::RadiusAttribute>::changeTLVRecordCount(int)
364
  };
365
366
  /// @class TLVRecordBuilder
367
  /// A base class for building Type-Length-Value (TLV) records. This builder receives the record parameters in its
368
  /// c'tor, builds the record raw buffer and provides a method to build a TLVRecord object out of it. Please notice
369
  /// this is a base class that lacks the capability of actually building TLVRecord objects and also cannot be
370
  /// instantiated. The reason for that is that different protocols build TLV records in different ways, so these
371
  /// missing capabilities will be implemented by the derived classes which are specific to each protocol. This class
372
  /// only provides the common infrastructure that will be used by them
373
  class TLVRecordBuilder
374
  {
375
  protected:
376
    TLVRecordBuilder();
377
378
    TLVRecordBuilder(uint32_t recType, const uint8_t* recValue, uint8_t recValueLen);
379
380
    TLVRecordBuilder(uint32_t recType, uint8_t recValue);
381
382
    TLVRecordBuilder(uint32_t recType, uint16_t recValue);
383
384
    TLVRecordBuilder(uint32_t recType, uint32_t recValue);
385
386
    TLVRecordBuilder(uint32_t recType, const IPv4Address& recValue);
387
388
    TLVRecordBuilder(uint32_t recType, const std::string& recValue, bool valueIsHexString = false);
389
390
    TLVRecordBuilder(const TLVRecordBuilder& other);
391
392
    TLVRecordBuilder& operator=(const TLVRecordBuilder& other);
393
394
    virtual ~TLVRecordBuilder();
395
396
    void init(uint32_t recType, const uint8_t* recValue, size_t recValueLen);
397
398
    uint8_t* m_RecValue;
399
    size_t m_RecValueLen;
400
    uint32_t m_RecType;
401
402
  private:
403
    void copyData(const TLVRecordBuilder& other);
404
  };
405
}  // namespace pcpp