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