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.
4
5#ifndef NET_DNS_RECORD_RDATA_H_
6#define NET_DNS_RECORD_RDATA_H_
7
8#include <string>
9#include <vector>
10
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/big_endian.h"
16#include "net/base/net_export.h"
17#include "net/base/net_util.h"
18#include "net/dns/dns_protocol.h"
19
20namespace net {
21
22class DnsRecordParser;
23
24// Parsed represenation of the extra data in a record. Does not include standard
25// DNS record data such as TTL, Name, Type and Class.
26class NET_EXPORT_PRIVATE RecordRdata {
27 public:
28  virtual ~RecordRdata() {}
29
30  virtual bool IsEqual(const RecordRdata* other) const = 0;
31  virtual uint16 Type() const = 0;
32
33 protected:
34  RecordRdata();
35
36  DISALLOW_COPY_AND_ASSIGN(RecordRdata);
37};
38
39// SRV record format (http://www.ietf.org/rfc/rfc2782.txt):
40// 2 bytes network-order unsigned priority
41// 2 bytes network-order unsigned weight
42// 2 bytes network-order unsigned port
43// target: domain name (on-the-wire representation)
44class NET_EXPORT_PRIVATE SrvRecordRdata : public RecordRdata {
45 public:
46  static const uint16 kType = dns_protocol::kTypeSRV;
47
48  virtual ~SrvRecordRdata();
49  static scoped_ptr<SrvRecordRdata> Create(const base::StringPiece& data,
50                                           const DnsRecordParser& parser);
51
52  virtual bool IsEqual(const RecordRdata* other) const OVERRIDE;
53  virtual uint16 Type() const OVERRIDE;
54
55  uint16 priority() const { return priority_; }
56  uint16 weight() const { return weight_; }
57  uint16 port() const { return port_; }
58
59  const std::string& target() const { return target_; }
60
61 private:
62  SrvRecordRdata();
63
64  uint16 priority_;
65  uint16 weight_;
66  uint16 port_;
67
68  std::string target_;
69
70  DISALLOW_COPY_AND_ASSIGN(SrvRecordRdata);
71};
72
73// A Record format (http://www.ietf.org/rfc/rfc1035.txt):
74// 4 bytes for IP address.
75class NET_EXPORT_PRIVATE ARecordRdata : public RecordRdata {
76 public:
77  static const uint16 kType = dns_protocol::kTypeA;
78
79  virtual ~ARecordRdata();
80  static scoped_ptr<ARecordRdata> Create(const base::StringPiece& data,
81                                         const DnsRecordParser& parser);
82  virtual bool IsEqual(const RecordRdata* other) const OVERRIDE;
83  virtual uint16 Type() const OVERRIDE;
84
85  const IPAddressNumber& address() const { return address_; }
86
87 private:
88  ARecordRdata();
89
90  IPAddressNumber address_;
91
92  DISALLOW_COPY_AND_ASSIGN(ARecordRdata);
93};
94
95// AAAA Record format (http://www.ietf.org/rfc/rfc1035.txt):
96// 16 bytes for IP address.
97class NET_EXPORT_PRIVATE AAAARecordRdata : public RecordRdata {
98 public:
99  static const uint16 kType = dns_protocol::kTypeAAAA;
100
101  virtual ~AAAARecordRdata();
102  static scoped_ptr<AAAARecordRdata> Create(const base::StringPiece& data,
103                                         const DnsRecordParser& parser);
104  virtual bool IsEqual(const RecordRdata* other) const OVERRIDE;
105  virtual uint16 Type() const OVERRIDE;
106
107  const IPAddressNumber& address() const { return address_; }
108
109 private:
110  AAAARecordRdata();
111
112  IPAddressNumber address_;
113
114  DISALLOW_COPY_AND_ASSIGN(AAAARecordRdata);
115};
116
117// CNAME record format (http://www.ietf.org/rfc/rfc1035.txt):
118// cname: On the wire representation of domain name.
119class NET_EXPORT_PRIVATE CnameRecordRdata : public RecordRdata {
120 public:
121  static const uint16 kType = dns_protocol::kTypeCNAME;
122
123  virtual ~CnameRecordRdata();
124  static scoped_ptr<CnameRecordRdata> Create(const base::StringPiece& data,
125                                             const DnsRecordParser& parser);
126  virtual bool IsEqual(const RecordRdata* other) const OVERRIDE;
127  virtual uint16 Type() const OVERRIDE;
128
129  std::string cname() const { return cname_; }
130
131 private:
132  CnameRecordRdata();
133
134  std::string cname_;
135
136  DISALLOW_COPY_AND_ASSIGN(CnameRecordRdata);
137};
138
139// PTR record format (http://www.ietf.org/rfc/rfc1035.txt):
140// domain: On the wire representation of domain name.
141class NET_EXPORT_PRIVATE PtrRecordRdata : public RecordRdata {
142 public:
143  static const uint16 kType = dns_protocol::kTypePTR;
144
145  virtual ~PtrRecordRdata();
146  static scoped_ptr<PtrRecordRdata> Create(const base::StringPiece& data,
147                                           const DnsRecordParser& parser);
148  virtual bool IsEqual(const RecordRdata* other) const OVERRIDE;
149  virtual uint16 Type() const OVERRIDE;
150
151  std::string ptrdomain() const { return ptrdomain_; }
152
153 private:
154  PtrRecordRdata();
155
156  std::string ptrdomain_;
157
158  DISALLOW_COPY_AND_ASSIGN(PtrRecordRdata);
159};
160
161// TXT record format (http://www.ietf.org/rfc/rfc1035.txt):
162// texts: One or more <character-string>s.
163// a <character-string> is a length octet followed by as many characters.
164class NET_EXPORT_PRIVATE TxtRecordRdata : public RecordRdata {
165 public:
166  static const uint16 kType = dns_protocol::kTypeTXT;
167
168  virtual ~TxtRecordRdata();
169  static scoped_ptr<TxtRecordRdata> Create(const base::StringPiece& data,
170                                           const DnsRecordParser& parser);
171  virtual bool IsEqual(const RecordRdata* other) const OVERRIDE;
172  virtual uint16 Type() const OVERRIDE;
173
174  const std::vector<std::string>& texts() const { return texts_; }
175
176 private:
177  TxtRecordRdata();
178
179  std::vector<std::string> texts_;
180
181  DISALLOW_COPY_AND_ASSIGN(TxtRecordRdata);
182};
183
184// Only the subset of the NSEC record format required by mDNS is supported.
185// Nsec record format is described in http://www.ietf.org/rfc/rfc3845.txt and
186// the limited version required for mDNS described in
187// http://www.rfc-editor.org/rfc/rfc6762.txt Section 6.1.
188class NET_EXPORT_PRIVATE NsecRecordRdata : public RecordRdata {
189 public:
190  static const uint16 kType = dns_protocol::kTypeNSEC;
191
192  virtual ~NsecRecordRdata();
193  static scoped_ptr<NsecRecordRdata> Create(const base::StringPiece& data,
194                                            const DnsRecordParser& parser);
195  virtual bool IsEqual(const RecordRdata* other) const OVERRIDE;
196  virtual uint16 Type() const OVERRIDE;
197
198  // Length of the bitmap in bits.
199  unsigned bitmap_length() const { return bitmap_.size() * 8; }
200
201  // Returns bit i-th bit in the bitmap, where bits withing a byte are organized
202  // most to least significant. If it is set, a record with rrtype i exists for
203  // the domain name of this nsec record.
204  bool GetBit(unsigned i) const;
205
206 private:
207  NsecRecordRdata();
208
209  std::vector<uint8> bitmap_;
210
211  DISALLOW_COPY_AND_ASSIGN(NsecRecordRdata);
212};
213
214
215}  // namespace net
216
217#endif  // NET_DNS_RECORD_RDATA_H_
218