PcapPlusPlus  23.09
DnsLayer.h
Go to the documentation of this file.
1 #ifndef PACKETPP_DNS_LAYER
2 #define PACKETPP_DNS_LAYER
3 
4 #include "DnsLayerEnums.h"
5 #include "DnsResource.h"
6 #include "DnsResourceData.h"
7 #include "Layer.h"
8 
10 
15 namespace pcpp
16 {
17 
23 #pragma pack(push, 1)
24  struct dnshdr
25  {
27  uint16_t transactionID;
28 #if (BYTE_ORDER == LITTLE_ENDIAN)
29  uint16_t
33  truncation:1,
37  opcode:4,
41  responseCode:4,
45  authenticData:1,
47  zero:1,
50 #elif (BYTE_ORDER == BIG_ENDIAN)
51  uint16_t
55  opcode:4,
59  truncation:1,
65  zero:1,
67  authenticData:1,
71  responseCode:4;
72 #endif
73 
76  uint16_t numberOfAnswers;
81  };
82 #pragma pack(pop)
83 
84 
85  // forward declarations
86  class DnsQuery;
87  class IDnsResource;
88  class DnsResource;
89  class IDnsResourceData;
90 
91 
96  class DnsLayer : public Layer
97  {
98  friend class IDnsResource;
99  friend class DnsQuery;
100  friend class DnsResource;
101 
102  public:
103 
111  DnsLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet);
112 
116  DnsLayer();
117 
122  DnsLayer(const DnsLayer& other);
123 
129  DnsLayer& operator=(const DnsLayer& other);
130 
131  virtual ~DnsLayer();
132 
138  dnshdr* getDnsHeader() const;
139 
147  DnsQuery* getQuery(const std::string& name, bool exactMatch) const;
148 
152  DnsQuery* getFirstQuery() const;
153 
159  DnsQuery* getNextQuery(DnsQuery* query) const;
160 
164  size_t getQueryCount() const;
165 
174  DnsQuery* addQuery(const std::string& name, DnsType dnsType, DnsClass dnsClass);
175 
182  DnsQuery* addQuery(DnsQuery* const copyQuery);
183 
190  bool removeQuery(const std::string& queryNameToRemove, bool exactMatch);
191 
197  bool removeQuery(DnsQuery* queryToRemove);
198 
206  DnsResource* getAnswer(const std::string& name, bool exactMatch) const;
207 
211  DnsResource* getFirstAnswer() const;
212 
218  DnsResource* getNextAnswer(DnsResource* answer) const;
219 
223  size_t getAnswerCount() const;
224 
237  DnsResource* addAnswer(const std::string& name, DnsType dnsType, DnsClass dnsClass, uint32_t ttl, IDnsResourceData* data);
238 
245  DnsResource* addAnswer(DnsResource* const copyAnswer);
246 
253  bool removeAnswer(const std::string& answerNameToRemove, bool exactMatch);
254 
260  bool removeAnswer(DnsResource* answerToRemove);
261 
262 
270  DnsResource* getAuthority(const std::string& name, bool exactMatch) const;
271 
275  DnsResource* getFirstAuthority() const;
276 
282  DnsResource* getNextAuthority(DnsResource* authority) const;
283 
287  size_t getAuthorityCount() const;
288 
301  DnsResource* addAuthority(const std::string& name, DnsType dnsType, DnsClass dnsClass, uint32_t ttl, IDnsResourceData* data);
302 
309  DnsResource* addAuthority(DnsResource* const copyAuthority);
310 
317  bool removeAuthority(const std::string& authorityNameToRemove, bool exactMatch);
318 
324  bool removeAuthority(DnsResource* authorityToRemove);
325 
326 
335  DnsResource* getAdditionalRecord(const std::string& name, bool exactMatch) const;
336 
340  DnsResource* getFirstAdditionalRecord() const;
341 
348  DnsResource* getNextAdditionalRecord(DnsResource* additionalRecord) const;
349 
353  size_t getAdditionalRecordCount() const;
354 
367  DnsResource* addAdditionalRecord(const std::string& name, DnsType dnsType, DnsClass dnsClass, uint32_t ttl, IDnsResourceData* data);
368 
382  DnsResource* addAdditionalRecord(const std::string& name, DnsType dnsType, uint16_t customData1, uint32_t customData2, IDnsResourceData* data);
383 
391  DnsResource* addAdditionalRecord(DnsResource* const copyAdditionalRecord);
392 
399  bool removeAdditionalRecord(const std::string& additionalRecordNameToRemove, bool exactMatch);
400 
406  bool removeAdditionalRecord(DnsResource* additionalRecordToRemove);
407 
408  // implement abstract methods
409 
413  void parseNextLayer() {}
414 
419  size_t getHeaderLen() const { return m_DataLen; } //No layer above DNS
420 
424  virtual void computeCalculateFields() {}
425 
426  std::string toString() const;
427 
429 
435  static inline bool isDnsPort(uint16_t port);
436 
445  static inline bool isDataValid(const uint8_t* data, size_t dataLen, bool dnsOverTcp = false);
446 
447  protected:
448  DnsLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet, size_t offsetAdjustment);
449  explicit DnsLayer(size_t offsetAdjustment);
450 
451  private:
452  IDnsResource* m_ResourceList;
453  DnsQuery* m_FirstQuery;
454  DnsResource* m_FirstAnswer;
455  DnsResource* m_FirstAuthority;
456  DnsResource* m_FirstAdditional;
457  uint16_t m_OffsetAdjustment;
458 
459  size_t getBasicHeaderSize();
460  void init(size_t offsetAdjustment, bool callParseResource);
461  void initNewLayer(size_t offsetAdjustment);
462 
463  IDnsResource* getFirstResource(DnsResourceType resType) const;
464  void setFirstResource(DnsResourceType resType, IDnsResource* resource);
465 
466  using Layer::extendLayer;
467  bool extendLayer(int offsetInLayer, size_t numOfBytesToExtend, IDnsResource* resource);
468 
469  using Layer::shortenLayer;
470  bool shortenLayer(int offsetInLayer, size_t numOfBytesToShorten, IDnsResource* resource);
471 
472  IDnsResource* getResourceByName(IDnsResource* startFrom, size_t resourceCount, const std::string& name, bool exactMatch) const;
473 
474  void parseResources();
475 
476  DnsResource* addResource(DnsResourceType resType, const std::string& name, DnsType dnsType, DnsClass dnsClass,
477  uint32_t ttl, IDnsResourceData* data);
478 
479  bool removeResource(IDnsResource* resourceToRemove);
480 
481  };
482 
483 
484 
495  class DnsOverTcpLayer : public DnsLayer
496  {
497  public:
498 
506  DnsOverTcpLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
507  : DnsLayer(data, dataLen, prevLayer, packet, sizeof(uint16_t)) {}
508 
512  DnsOverTcpLayer() : DnsLayer(sizeof(uint16_t)) {}
513 
518  DnsOverTcpLayer(const DnsOverTcpLayer& other) : DnsLayer(other) {}
519 
523  uint16_t getTcpMessageLength();
524 
529  void setTcpMessageLength(uint16_t value);
530 
531 
532  // overridden methods
533 
537  void computeCalculateFields();
538  };
539 
540 
541  // implementation of inline methods
542 
543  bool DnsLayer::isDnsPort(uint16_t port)
544  {
545  switch (port)
546  {
547  case 53:
548  case 5353:
549  case 5355:
550  return true;
551  default:
552  return false;
553  }
554  }
555 
556  bool DnsLayer::isDataValid(const uint8_t* data, size_t dataLen, bool dnsOverTcp)
557  {
558  size_t minSize = sizeof(dnshdr) + (dnsOverTcp ? sizeof(uint16_t) : 0);
559  return data && dataLen >= minSize;
560  }
561 
562 } // namespace pcpp
563 
564 #endif /* PACKETPP_DNS_LAYER */
The main namespace for the PcapPlusPlus lib.
OsiModelLayer
Definition: ProtocolType.h:333
DnsOverTcpLayer(const DnsOverTcpLayer &other)
Definition: DnsLayer.h:518
uint16_t authoritativeAnswer
Definition: DnsLayer.h:31
uint16_t opcode
Definition: DnsLayer.h:31
uint16_t numberOfAdditional
Definition: DnsLayer.h:80
OsiModelLayer getOsiModelLayer() const
Definition: DnsLayer.h:428
Definition: ProtocolType.h:348
Definition: Layer.h:70
Definition: Packet.h:26
DnsOverTcpLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: DnsLayer.h:506
uint16_t numberOfAuthority
Definition: DnsLayer.h:78
DnsClass
Definition: DnsLayerEnums.h:127
static bool isDataValid(const uint8_t *data, size_t dataLen, bool dnsOverTcp=false)
Definition: DnsLayer.h:556
Definition: DnsResourceData.h:40
uint16_t responseCode
Definition: DnsLayer.h:31
uint16_t queryOrResponse
Definition: DnsLayer.h:31
uint16_t truncation
Definition: DnsLayer.h:31
DnsType
Definition: DnsLayerEnums.h:15
uint16_t checkingDisabled
Definition: DnsLayer.h:31
Definition: DnsLayer.h:96
uint16_t numberOfAnswers
Definition: DnsLayer.h:76
size_t getHeaderLen() const
Definition: DnsLayer.h:419
virtual void computeCalculateFields()
Definition: DnsLayer.h:424
uint16_t recursionDesired
Definition: DnsLayer.h:31
DnsResourceType
Definition: DnsLayerEnums.h:145
void parseNextLayer()
Definition: DnsLayer.h:413
Definition: DnsLayer.h:24
uint16_t transactionID
Definition: DnsLayer.h:27
Definition: DnsLayer.h:495
uint16_t numberOfQuestions
Definition: DnsLayer.h:74
uint16_t authenticData
Definition: DnsLayer.h:31
Definition: DnsResource.h:150
Definition: DnsResource.h:30
Definition: DnsResource.h:128
uint16_t zero
Definition: DnsLayer.h:31
DnsOverTcpLayer()
Definition: DnsLayer.h:512
static bool isDnsPort(uint16_t port)
Definition: DnsLayer.h:543
uint16_t recursionAvailable
Definition: DnsLayer.h:31