Imported Upstream version 878.70.2
[platform/upstream/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__) */