]> git.saurik.com Git - apple/mdnsresponder.git/blob - mDNSMacOSX/BonjourTop/source/DNSFrame.h
mDNSResponder-1310.60.4.tar.gz
[apple/mdnsresponder.git] / mDNSMacOSX / BonjourTop / source / DNSFrame.h
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
42 BJ_UINT8* GetStartofRdata() {return m_pStartofRec+m_nNameLength+10;}; // 10 = type(2) +class(2) + ttl(4) + datalen(2)
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
74 BJ_UINT16 GetQuestionCount() {return m_nQuestionCount;};
75 BJ_UINT16 GetAnswerCount(){return m_nAnswersCount;};
76 BJ_UINT16 GetMaxRecords(){return m_nMaxItems;};
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
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__) */