1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef NET_DNS_RECORD_RDATA_H_
6 #define NET_DNS_RECORD_RDATA_H_
11 #include "base/basictypes.h"
12 #include "base/compiler_specific.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/strings/string_piece.h"
15 #include "net/base/ip_address_number.h"
16 #include "net/base/net_export.h"
17 #include "net/dns/dns_protocol.h"
21 class DnsRecordParser
;
23 // Parsed represenation of the extra data in a record. Does not include standard
24 // DNS record data such as TTL, Name, Type and Class.
25 class NET_EXPORT_PRIVATE RecordRdata
{
27 virtual ~RecordRdata() {}
29 virtual bool IsEqual(const RecordRdata
* other
) const = 0;
30 virtual uint16
Type() const = 0;
35 DISALLOW_COPY_AND_ASSIGN(RecordRdata
);
38 // SRV record format (http://www.ietf.org/rfc/rfc2782.txt):
39 // 2 bytes network-order unsigned priority
40 // 2 bytes network-order unsigned weight
41 // 2 bytes network-order unsigned port
42 // target: domain name (on-the-wire representation)
43 class NET_EXPORT_PRIVATE SrvRecordRdata
: public RecordRdata
{
45 static const uint16 kType
= dns_protocol::kTypeSRV
;
47 ~SrvRecordRdata() override
;
48 static scoped_ptr
<SrvRecordRdata
> Create(const base::StringPiece
& data
,
49 const DnsRecordParser
& parser
);
51 bool IsEqual(const RecordRdata
* other
) const override
;
52 uint16
Type() const override
;
54 uint16
priority() const { return priority_
; }
55 uint16
weight() const { return weight_
; }
56 uint16
port() const { return port_
; }
58 const std::string
& target() const { return target_
; }
69 DISALLOW_COPY_AND_ASSIGN(SrvRecordRdata
);
72 // A Record format (http://www.ietf.org/rfc/rfc1035.txt):
73 // 4 bytes for IP address.
74 class NET_EXPORT_PRIVATE ARecordRdata
: public RecordRdata
{
76 static const uint16 kType
= dns_protocol::kTypeA
;
78 ~ARecordRdata() override
;
79 static scoped_ptr
<ARecordRdata
> Create(const base::StringPiece
& data
,
80 const DnsRecordParser
& parser
);
81 bool IsEqual(const RecordRdata
* other
) const override
;
82 uint16
Type() const override
;
84 const IPAddressNumber
& address() const { return address_
; }
89 IPAddressNumber address_
;
91 DISALLOW_COPY_AND_ASSIGN(ARecordRdata
);
94 // AAAA Record format (http://www.ietf.org/rfc/rfc1035.txt):
95 // 16 bytes for IP address.
96 class NET_EXPORT_PRIVATE AAAARecordRdata
: public RecordRdata
{
98 static const uint16 kType
= dns_protocol::kTypeAAAA
;
100 ~AAAARecordRdata() override
;
101 static scoped_ptr
<AAAARecordRdata
> Create(const base::StringPiece
& data
,
102 const DnsRecordParser
& parser
);
103 bool IsEqual(const RecordRdata
* other
) const override
;
104 uint16
Type() const override
;
106 const IPAddressNumber
& address() const { return address_
; }
111 IPAddressNumber address_
;
113 DISALLOW_COPY_AND_ASSIGN(AAAARecordRdata
);
116 // CNAME record format (http://www.ietf.org/rfc/rfc1035.txt):
117 // cname: On the wire representation of domain name.
118 class NET_EXPORT_PRIVATE CnameRecordRdata
: public RecordRdata
{
120 static const uint16 kType
= dns_protocol::kTypeCNAME
;
122 ~CnameRecordRdata() override
;
123 static scoped_ptr
<CnameRecordRdata
> Create(const base::StringPiece
& data
,
124 const DnsRecordParser
& parser
);
125 bool IsEqual(const RecordRdata
* other
) const override
;
126 uint16
Type() const override
;
128 std::string
cname() const { return cname_
; }
135 DISALLOW_COPY_AND_ASSIGN(CnameRecordRdata
);
138 // PTR record format (http://www.ietf.org/rfc/rfc1035.txt):
139 // domain: On the wire representation of domain name.
140 class NET_EXPORT_PRIVATE PtrRecordRdata
: public RecordRdata
{
142 static const uint16 kType
= dns_protocol::kTypePTR
;
144 ~PtrRecordRdata() override
;
145 static scoped_ptr
<PtrRecordRdata
> Create(const base::StringPiece
& data
,
146 const DnsRecordParser
& parser
);
147 bool IsEqual(const RecordRdata
* other
) const override
;
148 uint16
Type() const override
;
150 std::string
ptrdomain() const { return ptrdomain_
; }
155 std::string ptrdomain_
;
157 DISALLOW_COPY_AND_ASSIGN(PtrRecordRdata
);
160 // TXT record format (http://www.ietf.org/rfc/rfc1035.txt):
161 // texts: One or more <character-string>s.
162 // a <character-string> is a length octet followed by as many characters.
163 class NET_EXPORT_PRIVATE TxtRecordRdata
: public RecordRdata
{
165 static const uint16 kType
= dns_protocol::kTypeTXT
;
167 ~TxtRecordRdata() override
;
168 static scoped_ptr
<TxtRecordRdata
> Create(const base::StringPiece
& data
,
169 const DnsRecordParser
& parser
);
170 bool IsEqual(const RecordRdata
* other
) const override
;
171 uint16
Type() const override
;
173 const std::vector
<std::string
>& texts() const { return texts_
; }
178 std::vector
<std::string
> texts_
;
180 DISALLOW_COPY_AND_ASSIGN(TxtRecordRdata
);
183 // Only the subset of the NSEC record format required by mDNS is supported.
184 // Nsec record format is described in http://www.ietf.org/rfc/rfc3845.txt and
185 // the limited version required for mDNS described in
186 // http://www.rfc-editor.org/rfc/rfc6762.txt Section 6.1.
187 class NET_EXPORT_PRIVATE NsecRecordRdata
: public RecordRdata
{
189 static const uint16 kType
= dns_protocol::kTypeNSEC
;
191 ~NsecRecordRdata() override
;
192 static scoped_ptr
<NsecRecordRdata
> Create(const base::StringPiece
& data
,
193 const DnsRecordParser
& parser
);
194 bool IsEqual(const RecordRdata
* other
) const override
;
195 uint16
Type() const override
;
197 // Length of the bitmap in bits.
198 unsigned bitmap_length() const { return bitmap_
.size() * 8; }
200 // Returns bit i-th bit in the bitmap, where bits withing a byte are organized
201 // most to least significant. If it is set, a record with rrtype i exists for
202 // the domain name of this nsec record.
203 bool GetBit(unsigned i
) const;
208 std::vector
<uint8
> bitmap_
;
210 DISALLOW_COPY_AND_ASSIGN(NsecRecordRdata
);
216 #endif // NET_DNS_RECORD_RDATA_H_