1 //
2 //  DNSFrame.h
3 //  TestTB
4 //
5 //  Created by Terrin Eager on 9/26/12.
6 //
7 //
8 
9 #ifndef __TestTB__DNSFrame__
10 #define __TestTB__DNSFrame__
11 
12 #include <iostream>
13 #include "bjtypes.h"
14 #include "bjstring.h"
15 #include "bjIPAddr.h"
16 #include "bjMACAddr.h"
17 
18 #define MAX_DNS_RECORDS_PER_FRAME 500
19 
20 #define DNS_TYPE_PTR    12
21 #define DNS_TYPE_SRV    33
22 #define DNS_TYPE_TXT    16
23 #define DNS_TYPE_A      1
24 #define DNS_TYPE_AAAA   28
25 #define DNS_TYPE_OPT    41
26 
27 #define DNS_EDNS0_TRACE 65001
28 
29 class CDNSFrame;
30 
31 
32 
33 
34 class CDNSRecord
35 {
36 public:
37     typedef enum {Question,Answer,ns,ar} dnsItemType;
38 
39     void GetDnsRecordName(BJString& ReturnString,int nLabelToSkip,int nMaxLabel);
40     void GetDnsRecordNameFromBuffer(BJ_UINT8* pBuffer,BJString& ReturnString,int nLabelToSkip,int nMaxLabel);
41 
GetStartofRdata()42     BJ_UINT8* GetStartofRdata() {return m_pStartofRec+m_nNameLength+10;}; // 10 = type(2) +class(2) + ttl(4) + datalen(2)
GetRdata(BJString & ReturnString,int nLabelToSkip,int nMaxLabel)43     void GetRdata(BJString& ReturnString,int nLabelToSkip,int nMaxLabel)
44     {
45         if (m_RecType == DNS_TYPE_SRV)
46             GetDnsRecordNameFromBuffer(GetStartofRdata()+6, ReturnString, nLabelToSkip, nMaxLabel); // 6 = Priority + Weight + Port
47         else
48             GetDnsRecordNameFromBuffer(GetStartofRdata(), ReturnString, nLabelToSkip, nMaxLabel);
49     }
50     dnsItemType m_dnsType;
51     BJ_UINT8*   m_pStartofRec;
52     BJ_UINT32   m_nNameLength;
53     BJ_INT16    m_RecType;
54     BJ_INT16    m_RecClass;
55     BJ_UINT32   m_nTTL;
56     BJ_UINT32   m_nRdataLen;
57 
58     CDNSFrame*  m_pDNSFrame;
59 };
60 
61 
62 
63 class CDNSFrame
64 {
65 public:
66 
67     CDNSFrame();
68     bool ParseDNSFrame(BJ_UINT8* pBuffer,BJ_INT32 nLength,BJ_UINT64 frameTime);
69 
70 
71     CDNSRecord* GetDnsRecord(int nIndex);
72     CDNSRecord* FindAdditionRecord(BJString& sName, BJ_INT16 nType);
73 
GetQuestionCount()74     BJ_UINT16 GetQuestionCount() {return m_nQuestionCount;};
GetAnswerCount()75     BJ_UINT16 GetAnswerCount(){return m_nAnswersCount;};
GetMaxRecords()76     BJ_UINT16 GetMaxRecords(){return m_nMaxItems;};
GetBuffer()77     BJ_UINT8* GetBuffer() { return m_pStartBuffer;};
78 
79     BJ_BOOL ParseDnsRecord(CDNSRecord::dnsItemType eItemType);
80 
81     BJ_BOOL IsQueryFrame();
82     BJ_BOOL IsWakeFrame();
83     BJ_BOOL IsTruncatedFrame();
84 
85     BJ_BOOL HasOnlyService(BJString sName, BJ_INT16 nRecType);
86 
87     void SetAddress(BJIPAddr *SourceIPAddress,BJMACAddr *SourceMACAddress);
88 
89     bool GetTracingInfo(BJ_UINT8 &platform, BJ_UINT32 &version, BJMACAddr &mac);
90 
GetTime()91     BJ_UINT64 GetTime() {return m_Time;};
92 
93 
94     BJIPAddr m_Servicev4Address;
95     BJIPAddr m_Servicev6Address;
96 
97     BJIPAddr   m_SourceIPAddress;
98     BJMACAddr  m_SourceMACAddress;
99 
100 protected:
101 
102 
103     BJ_UINT8* m_pStartBuffer;
104     BJ_UINT8* m_pEndBuffer;
105     BJ_UINT8* m_pCurrentBuffer;
106     BJ_INT32  m_nBufferLen;
107 
108     BJ_INT32 m_nFrameLen;
109 
110     // Header
111     BJ_UINT16 m_nId;
112     BJ_UINT16 m_nFlags;
113 
114     BJ_UINT16 m_nQuestionCount;
115     BJ_UINT16 m_nAnswersCount;
116     BJ_UINT16 m_NSCOUNT;
117     BJ_UINT16 m_ARCOUNT;
118 
119 
120     CDNSRecord m_dnsItems[MAX_DNS_RECORDS_PER_FRAME];
121 
122     int m_nMaxItems;
123 
124     BJ_UINT64 m_Time;
125 
126 };
127 
128 
129 
130 
131 
132 #endif /* defined(__TestTB__DNSFrame__) */
133