PcapPlusPlus  Next
DnsLayer.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "DnsLayerEnums.h"
4 #include "DnsResource.h"
5 #include "DnsResourceData.h"
6 #include "Layer.h"
7 
9 
12 namespace pcpp
13 {
17 #pragma pack(push, 1)
18  struct dnshdr
19  {
21  uint16_t transactionID;
22 #if (BYTE_ORDER == LITTLE_ENDIAN)
23  uint16_t
31  opcode : 4,
41  zero : 1,
44 #elif (BYTE_ORDER == BIG_ENDIAN)
45  uint16_t
47  queryOrResponse : 1,
49  opcode : 4,
53  truncation : 1,
55  recursionDesired : 1,
59  zero : 1,
61  authenticData : 1,
63  checkingDisabled : 1,
65  responseCode : 4;
66 #endif
70  uint16_t numberOfAnswers;
75  };
76 #pragma pack(pop)
77  static_assert(sizeof(dnshdr) == 12, "dnshdr size is not 12 bytes");
78 
79  // forward declarations
80  class DnsQuery;
81  class IDnsResource;
82  class DnsResource;
83  class IDnsResourceData;
84 
87  class DnsLayer : public Layer
88  {
89  friend class IDnsResource;
90  friend class DnsQuery;
91  friend class DnsResource;
92 
93  public:
99  DnsLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet);
100 
104 
107  DnsLayer(const DnsLayer& other);
108 
112  DnsLayer& operator=(const DnsLayer& other);
113 
114  ~DnsLayer() override;
115 
121 
128  DnsQuery* getQuery(const std::string& name, bool exactMatch) const;
129 
132 
138 
140  size_t getQueryCount() const;
141 
148  DnsQuery* addQuery(const std::string& name, DnsType dnsType, DnsClass dnsClass);
149 
155  DnsQuery* addQuery(DnsQuery* const copyQuery);
156 
162  bool removeQuery(const std::string& queryNameToRemove, bool exactMatch);
163 
168  bool removeQuery(DnsQuery* queryToRemove);
169 
176  DnsResource* getAnswer(const std::string& name, bool exactMatch) const;
177 
180 
186 
188  size_t getAnswerCount() const;
189 
200  DnsResource* addAnswer(const std::string& name, DnsType dnsType, DnsClass dnsClass, uint32_t ttl,
201  IDnsResourceData* data);
202 
208  DnsResource* addAnswer(DnsResource* const copyAnswer);
209 
215  bool removeAnswer(const std::string& answerNameToRemove, bool exactMatch);
216 
221  bool removeAnswer(DnsResource* answerToRemove);
222 
229  DnsResource* getAuthority(const std::string& name, bool exactMatch) const;
230 
233 
239 
241  size_t getAuthorityCount() const;
242 
253  DnsResource* addAuthority(const std::string& name, DnsType dnsType, DnsClass dnsClass, uint32_t ttl,
254  IDnsResourceData* data);
255 
261  DnsResource* addAuthority(DnsResource* const copyAuthority);
262 
269  bool removeAuthority(const std::string& authorityNameToRemove, bool exactMatch);
270 
275  bool removeAuthority(DnsResource* authorityToRemove);
276 
283  DnsResource* getAdditionalRecord(const std::string& name, bool exactMatch) const;
284 
288 
294 
296  size_t getAdditionalRecordCount() const;
297 
308  DnsResource* addAdditionalRecord(const std::string& name, DnsType dnsType, DnsClass dnsClass, uint32_t ttl,
309  IDnsResourceData* data);
310 
325  DnsResource* addAdditionalRecord(const std::string& name, DnsType dnsType, uint16_t customData1,
326  uint32_t customData2, IDnsResourceData* data);
327 
334  DnsResource* addAdditionalRecord(DnsResource* const copyAdditionalRecord);
335 
342  bool removeAdditionalRecord(const std::string& additionalRecordNameToRemove, bool exactMatch);
343 
348  bool removeAdditionalRecord(DnsResource* additionalRecordToRemove);
349 
350  // implement abstract methods
351 
353  void parseNextLayer() override
354  {}
355 
358  size_t getHeaderLen() const override
359  {
360  return m_DataLen;
361  } // No layer above DNS
362 
364  void computeCalculateFields() override
365  {}
366 
367  std::string toString() const override;
368 
370  {
372  }
373 
377  static inline bool isDnsPort(uint16_t port);
378 
385  static inline bool isDataValid(const uint8_t* data, size_t dataLen, bool dnsOverTcp = false);
386 
387  protected:
388  DnsLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet, size_t offsetAdjustment);
389  explicit DnsLayer(size_t offsetAdjustment);
390 
391  private:
392  IDnsResource* m_ResourceList;
393  DnsQuery* m_FirstQuery;
394  DnsResource* m_FirstAnswer;
395  DnsResource* m_FirstAuthority;
396  DnsResource* m_FirstAdditional;
397  uint16_t m_OffsetAdjustment;
398 
399  size_t getBasicHeaderSize();
400  void init(size_t offsetAdjustment, bool callParseResource);
401  void initNewLayer(size_t offsetAdjustment);
402 
403  IDnsResource* getFirstResource(DnsResourceType resType) const;
404  void setFirstResource(DnsResourceType resType, IDnsResource* resource);
405 
406  using Layer::extendLayer;
407  bool extendLayer(int offsetInLayer, size_t numOfBytesToExtend, IDnsResource* resource);
408 
409  using Layer::shortenLayer;
410  bool shortenLayer(int offsetInLayer, size_t numOfBytesToShorten, IDnsResource* resource);
411 
412  IDnsResource* getResourceByName(IDnsResource* startFrom, size_t resourceCount, const std::string& name,
413  bool exactMatch) const;
414 
415  void parseResources();
416 
417  DnsResource* addResource(DnsResourceType resType, const std::string& name, DnsType dnsType, DnsClass dnsClass,
418  uint32_t ttl, IDnsResourceData* data);
419 
420  bool removeResource(IDnsResource* resourceToRemove);
421  };
422 
428 
431  class DnsOverTcpLayer : public DnsLayer
432  {
433  public:
439  DnsOverTcpLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
440  : DnsLayer(data, dataLen, prevLayer, packet, sizeof(uint16_t))
441  {}
442 
445  DnsOverTcpLayer() : DnsLayer(sizeof(uint16_t))
446  {}
447 
450  DnsOverTcpLayer(const DnsOverTcpLayer& other) : DnsLayer(other)
451  {}
452 
455 
458  void setTcpMessageLength(uint16_t value);
459 
460  // overridden methods
461 
463  void computeCalculateFields() override;
464  };
465 
466  // implementation of inline methods
467 
468  bool DnsLayer::isDnsPort(uint16_t port)
469  {
470  switch (port)
471  {
472  case 53:
473  case 5353:
474  case 5355:
475  return true;
476  default:
477  return false;
478  }
479  }
480 
481  bool DnsLayer::isDataValid(const uint8_t* data, size_t dataLen, bool dnsOverTcp)
482  {
483  size_t minSize = sizeof(dnshdr) + (dnsOverTcp ? sizeof(uint16_t) : 0);
484  return data && dataLen >= minSize;
485  }
486 
487 } // namespace pcpp
Definition: DnsLayer.h:88
DnsResource * getFirstAnswer() const
DnsLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
DnsResource * addAdditionalRecord(const std::string &name, DnsType dnsType, DnsClass dnsClass, uint32_t ttl, IDnsResourceData *data)
size_t getHeaderLen() const override
Definition: DnsLayer.h:358
DnsQuery * getQuery(const std::string &name, bool exactMatch) const
DnsResource * addAdditionalRecord(const std::string &name, DnsType dnsType, uint16_t customData1, uint32_t customData2, IDnsResourceData *data)
DnsResource * addAuthority(DnsResource *const copyAuthority)
static bool isDataValid(const uint8_t *data, size_t dataLen, bool dnsOverTcp=false)
Definition: DnsLayer.h:481
DnsQuery * addQuery(DnsQuery *const copyQuery)
DnsResource * getAuthority(const std::string &name, bool exactMatch) const
bool removeAdditionalRecord(DnsResource *additionalRecordToRemove)
DnsResource * addAdditionalRecord(DnsResource *const copyAdditionalRecord)
DnsResource * addAnswer(DnsResource *const copyAnswer)
bool removeQuery(const std::string &queryNameToRemove, bool exactMatch)
DnsResource * getAdditionalRecord(const std::string &name, bool exactMatch) const
size_t getQueryCount() const
DnsResource * getNextAuthority(DnsResource *authority) const
std::string toString() const override
DnsResource * getNextAnswer(DnsResource *answer) const
void computeCalculateFields() override
Does nothing for this layer.
Definition: DnsLayer.h:364
DnsQuery * addQuery(const std::string &name, DnsType dnsType, DnsClass dnsClass)
DnsLayer(const DnsLayer &other)
DnsQuery * getNextQuery(DnsQuery *query) const
DnsResource * getFirstAdditionalRecord() const
bool removeAuthority(const std::string &authorityNameToRemove, bool exactMatch)
DnsResource * getFirstAuthority() const
bool removeQuery(DnsQuery *queryToRemove)
size_t getAuthorityCount() const
size_t getAnswerCount() const
dnshdr * getDnsHeader() const
void parseNextLayer() override
Does nothing for this layer (DnsLayer is always last)
Definition: DnsLayer.h:353
DnsResource * addAuthority(const std::string &name, DnsType dnsType, DnsClass dnsClass, uint32_t ttl, IDnsResourceData *data)
bool removeAnswer(DnsResource *answerToRemove)
DnsResource * getNextAdditionalRecord(DnsResource *additionalRecord) const
DnsQuery * getFirstQuery() const
DnsResource * addAnswer(const std::string &name, DnsType dnsType, DnsClass dnsClass, uint32_t ttl, IDnsResourceData *data)
bool removeAdditionalRecord(const std::string &additionalRecordNameToRemove, bool exactMatch)
bool removeAnswer(const std::string &answerNameToRemove, bool exactMatch)
static bool isDnsPort(uint16_t port)
Definition: DnsLayer.h:468
DnsLayer & operator=(const DnsLayer &other)
bool removeAuthority(DnsResource *authorityToRemove)
OsiModelLayer getOsiModelLayer() const override
Definition: DnsLayer.h:369
size_t getAdditionalRecordCount() const
DnsResource * getAnswer(const std::string &name, bool exactMatch) const
Definition: DnsLayer.h:432
DnsOverTcpLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: DnsLayer.h:439
void computeCalculateFields() override
Calculate the TCP message length field.
void setTcpMessageLength(uint16_t value)
uint16_t getTcpMessageLength()
DnsOverTcpLayer()
Definition: DnsLayer.h:445
DnsOverTcpLayer(const DnsOverTcpLayer &other)
Definition: DnsLayer.h:450
Definition: DnsResource.h:113
Definition: DnsResource.h:140
Definition: DnsResourceData.h:24
Definition: DnsResource.h:26
Definition: Layer.h:60
Definition: Packet.h:22
The main namespace for the PcapPlusPlus lib.
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:225
@ OsiModelApplicationLayer
Application layer (layer 7)
Definition: ProtocolType.h:239
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
DnsType
An enum for all possible DNS record types.
Definition: DnsLayerEnums.h:11
Definition: DnsLayer.h:19
uint16_t responseCode
Return Code.
Definition: DnsLayer.h:35
uint16_t authoritativeAnswer
Authoritative answer flag.
Definition: DnsLayer.h:29
uint16_t queryOrResponse
Query/Response flag.
Definition: DnsLayer.h:33
uint16_t zero
Zero flag (Reserved)
Definition: DnsLayer.h:41
uint16_t transactionID
DNS query identification.
Definition: DnsLayer.h:21
uint16_t numberOfAuthority
Number of authority records in packet.
Definition: DnsLayer.h:72
uint16_t truncation
Truncated flag.
Definition: DnsLayer.h:27
uint16_t numberOfAdditional
Number of additional records in packet.
Definition: DnsLayer.h:74
uint16_t checkingDisabled
Checking disabled flag.
Definition: DnsLayer.h:37
uint16_t numberOfAnswers
Number of DNS answer records in packet.
Definition: DnsLayer.h:70
uint16_t authenticData
Authenticated data flag.
Definition: DnsLayer.h:39
uint16_t opcode
Operation Code.
Definition: DnsLayer.h:31
uint16_t recursionAvailable
Recursion available flag.
Definition: DnsLayer.h:43
uint16_t recursionDesired
Recursion desired flag.
Definition: DnsLayer.h:25
uint16_t numberOfQuestions
Number of DNS query records in packet.
Definition: DnsLayer.h:68