summaryrefslogtreecommitdiffstats
path: root/mDNSResponder/mDNSMacOSX/BonjourTop/source/DNSFrame.h
blob: 8e7ded7c00e615d36edb488533860556dae799d9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//
//  DNSFrame.h
//  TestTB
//
//  Created by Terrin Eager on 9/26/12.
//
//

#ifndef __TestTB__DNSFrame__
#define __TestTB__DNSFrame__

#include <iostream>
#include "bjtypes.h"
#include "bjstring.h"
#include "bjIPAddr.h"
#include "bjMACAddr.h"

#define MAX_DNS_RECORDS_PER_FRAME 500

#define DNS_TYPE_PTR    12
#define DNS_TYPE_SRV    33
#define DNS_TYPE_TXT    16
#define DNS_TYPE_A      1
#define DNS_TYPE_AAAA   28
#define DNS_TYPE_OPT    41

#define DNS_EDNS0_TRACE 65001

class CDNSFrame;




class CDNSRecord
{
public:
    typedef enum {Question,Answer,ns,ar} dnsItemType;

    void GetDnsRecordName(BJString& ReturnString,int nLabelToSkip,int nMaxLabel);
    void GetDnsRecordNameFromBuffer(BJ_UINT8* pBuffer,BJString& ReturnString,int nLabelToSkip,int nMaxLabel);

    BJ_UINT8* GetStartofRdata() {return m_pStartofRec+m_nNameLength+10;}; // 10 = type(2) +class(2) + ttl(4) + datalen(2)
    void GetRdata(BJString& ReturnString,int nLabelToSkip,int nMaxLabel)
    {
        if (m_RecType == DNS_TYPE_SRV)
            GetDnsRecordNameFromBuffer(GetStartofRdata()+6, ReturnString, nLabelToSkip, nMaxLabel); // 6 = Priority + Weight + Port
        else
            GetDnsRecordNameFromBuffer(GetStartofRdata(), ReturnString, nLabelToSkip, nMaxLabel);
    }
    dnsItemType m_dnsType;
    BJ_UINT8*   m_pStartofRec;
    BJ_UINT32   m_nNameLength;
    BJ_INT16    m_RecType;
    BJ_INT16    m_RecClass;
    BJ_UINT32   m_nTTL;
    BJ_UINT32   m_nRdataLen;

    CDNSFrame*  m_pDNSFrame;
};



class CDNSFrame
{
public:

    CDNSFrame();
    bool ParseDNSFrame(BJ_UINT8* pBuffer,BJ_INT32 nLength,BJ_UINT64 frameTime);


    CDNSRecord* GetDnsRecord(int nIndex);
    CDNSRecord* FindAdditionRecord(BJString& sName, BJ_INT16 nType);

    BJ_UINT16 GetQuestionCount() {return m_nQuestionCount;};
    BJ_UINT16 GetAnswerCount(){return m_nAnswersCount;};
    BJ_UINT16 GetMaxRecords(){return m_nMaxItems;};
    BJ_UINT8* GetBuffer() { return m_pStartBuffer;};

    BJ_BOOL ParseDnsRecord(CDNSRecord::dnsItemType eItemType);

    BJ_BOOL IsQueryFrame();
    BJ_BOOL IsWakeFrame();
    BJ_BOOL IsTruncatedFrame();

    BJ_BOOL HasOnlyService(BJString sName, BJ_INT16 nRecType);

    void SetAddress(BJIPAddr *SourceIPAddress,BJMACAddr *SourceMACAddress);

    bool GetTracingInfo(BJ_UINT8 &platform, BJ_UINT32 &version, BJMACAddr &mac);

    BJ_UINT64 GetTime() {return m_Time;};


    BJIPAddr m_Servicev4Address;
    BJIPAddr m_Servicev6Address;

    BJIPAddr   m_SourceIPAddress;
    BJMACAddr  m_SourceMACAddress;

protected:


    BJ_UINT8* m_pStartBuffer;
    BJ_UINT8* m_pEndBuffer;
    BJ_UINT8* m_pCurrentBuffer;
    BJ_INT32  m_nBufferLen;

    BJ_INT32 m_nFrameLen;

    // Header
    BJ_UINT16 m_nId;
    BJ_UINT16 m_nFlags;

    BJ_UINT16 m_nQuestionCount;
    BJ_UINT16 m_nAnswersCount;
    BJ_UINT16 m_NSCOUNT;
    BJ_UINT16 m_ARCOUNT;


    CDNSRecord m_dnsItems[MAX_DNS_RECORDS_PER_FRAME];

    int m_nMaxItems;

    BJ_UINT64 m_Time;

};





#endif /* defined(__TestTB__DNSFrame__) */