PcapPlusPlus  Next
DnsResource.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "DnsLayer.h"
4 #include "DnsLayerEnums.h"
5 #include "DnsResourceData.h"
6 #include <stdio.h>
7 #include <string>
8 #include <stdint.h>
9 
11 
14 namespace pcpp
15 {
16  // forward declarations
17  class DnsLayer;
18  class IDnsResourceData;
19  class DnsResourceDataPtr;
20 
26  {
27  protected:
28  friend class DnsLayer;
29  friend class IDnsResourceData;
30 
31  protected:
32  DnsLayer* m_DnsLayer;
33  size_t m_OffsetInLayer;
34  IDnsResource* m_NextResource;
35  std::string m_DecodedName;
36  size_t m_NameLength;
37  uint8_t* m_ExternalRawData;
38 
39  IDnsResource(DnsLayer* dnsLayer, size_t offsetInLayer);
40 
41  IDnsResource(uint8_t* emptyRawData);
42 
43  size_t decodeName(const char* encodedName, char* result, int iteration = 1);
44  void encodeName(const std::string& decodedName, char* result, size_t& resultLen);
45 
46  IDnsResource* getNextResource() const
47  {
48  return m_NextResource;
49  }
50  void setNextResource(IDnsResource* next)
51  {
52  m_NextResource = next;
53  }
54 
55  uint8_t* getRawData() const;
56 
57  void setDnsLayer(DnsLayer* dnsLayer, size_t offsetInLayer);
58 
59  public:
60  virtual ~IDnsResource() = default;
61 
64 
67  void setDnsType(DnsType newType);
68 
71 
74  void setDnsClass(DnsClass newClass);
75 
77  const std::string& getName() const
78  {
79  return m_DecodedName;
80  }
81 
83  size_t getNameOffset() const
84  {
85  return m_OffsetInLayer;
86  }
87 
99  bool setName(const std::string& newName);
100 
101  // abstract methods
102 
104  virtual size_t getSize() const = 0;
105 
107  virtual DnsResourceType getType() const = 0;
108  };
109 
112  class DnsQuery : public IDnsResource
113  {
114  friend class DnsLayer;
115 
116  private:
117  DnsQuery(DnsLayer* dnsLayer, size_t offsetInLayer) : IDnsResource(dnsLayer, offsetInLayer)
118  {}
119 
120  explicit DnsQuery(uint8_t* emptyRawData) : IDnsResource(emptyRawData)
121  {}
122 
123  public:
124  ~DnsQuery() override = default;
125 
126  // implementation of abstract methods
127  size_t getSize() const override
128  {
129  return m_NameLength + 2 * sizeof(uint16_t);
130  }
131  DnsResourceType getType() const override
132  {
133  return DnsQueryType;
134  }
135  };
136 
139  class DnsResource : public IDnsResource
140  {
141  friend class DnsLayer;
142 
143  private:
144  DnsResourceType m_ResourceType;
145 
146  DnsResource(DnsLayer* dnsLayer, size_t offsetInLayer, DnsResourceType resourceType)
147  : IDnsResource(dnsLayer, offsetInLayer)
148  {
149  m_ResourceType = resourceType;
150  }
151 
152  DnsResource(uint8_t* emptyRawData, DnsResourceType resType)
153  : IDnsResource(emptyRawData), m_ResourceType(resType)
154  {}
155 
156  public:
157  ~DnsResource() override = default;
158 
160  uint32_t getTTL() const;
161 
164  void setTTL(uint32_t newTTL);
165 
167  size_t getDataLength() const;
168 
183 
185  size_t getDataOffset() const;
186 
206 
210  uint16_t getCustomDnsClass() const;
211 
215  void setCustomDnsClass(uint16_t customValue);
216 
217  // implementation of abstract methods
218  size_t getSize() const override
219  {
220  return m_NameLength + 3 * sizeof(uint16_t) + sizeof(uint32_t) + getDataLength();
221  }
222  DnsResourceType getType() const override
223  {
224  return m_ResourceType;
225  }
226  };
227 
228 } // namespace pcpp
Definition: DnsLayer.h:88
Definition: DnsResource.h:113
size_t getSize() const override
Definition: DnsResource.h:127
DnsResourceType getType() const override
Definition: DnsResource.h:131
Definition: DnsResourceData.h:71
Definition: DnsResource.h:140
void setTTL(uint32_t newTTL)
void setCustomDnsClass(uint16_t customValue)
size_t getSize() const override
Definition: DnsResource.h:218
uint32_t getTTL() const
uint16_t getCustomDnsClass() const
DnsResourceType getType() const override
Definition: DnsResource.h:222
size_t getDataOffset() const
size_t getDataLength() const
DnsResourceDataPtr getData() const
bool setData(IDnsResourceData *data)
Definition: DnsResourceData.h:24
Definition: DnsResource.h:26
void setDnsType(DnsType newType)
virtual DnsResourceType getType() const =0
const std::string & getName() const
Definition: DnsResource.h:77
virtual size_t getSize() const =0
DnsClass getDnsClass() const
size_t getNameOffset() const
Definition: DnsResource.h:83
void setDnsClass(DnsClass newClass)
DnsType getDnsType() const
bool setName(const std::string &newName)
The main namespace for the PcapPlusPlus lib.
DnsClass
An enum for all possible DNS classes.
Definition: DnsLayerEnums.h:120
DnsResourceType
An enum for representing the 4 types of possible DNS records.
Definition: DnsLayerEnums.h:135
@ DnsQueryType
DNS query record.
Definition: DnsLayerEnums.h:137
DnsType
An enum for all possible DNS record types.
Definition: DnsLayerEnums.h:11