• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/net_export.h"
16 #include "net/base/net_util.h"
17 #include "net/dns/dns_protocol.h"
18 
19 namespace net {
20 
21 class DnsRecordParser;
22 
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 {
26  public:
~RecordRdata()27   virtual ~RecordRdata() {}
28 
29   virtual bool IsEqual(const RecordRdata* other) const = 0;
30   virtual uint16 Type() const = 0;
31 
32  protected:
33   RecordRdata();
34 
35   DISALLOW_COPY_AND_ASSIGN(RecordRdata);
36 };
37 
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 {
44  public:
45   static const uint16 kType = dns_protocol::kTypeSRV;
46 
47   virtual ~SrvRecordRdata();
48   static scoped_ptr<SrvRecordRdata> Create(const base::StringPiece& data,
49                                            const DnsRecordParser& parser);
50 
51   virtual bool IsEqual(const RecordRdata* other) const OVERRIDE;
52   virtual uint16 Type() const OVERRIDE;
53 
priority()54   uint16 priority() const { return priority_; }
weight()55   uint16 weight() const { return weight_; }
port()56   uint16 port() const { return port_; }
57 
target()58   const std::string& target() const { return target_; }
59 
60  private:
61   SrvRecordRdata();
62 
63   uint16 priority_;
64   uint16 weight_;
65   uint16 port_;
66 
67   std::string target_;
68 
69   DISALLOW_COPY_AND_ASSIGN(SrvRecordRdata);
70 };
71 
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 {
75  public:
76   static const uint16 kType = dns_protocol::kTypeA;
77 
78   virtual ~ARecordRdata();
79   static scoped_ptr<ARecordRdata> Create(const base::StringPiece& data,
80                                          const DnsRecordParser& parser);
81   virtual bool IsEqual(const RecordRdata* other) const OVERRIDE;
82   virtual uint16 Type() const OVERRIDE;
83 
address()84   const IPAddressNumber& address() const { return address_; }
85 
86  private:
87   ARecordRdata();
88 
89   IPAddressNumber address_;
90 
91   DISALLOW_COPY_AND_ASSIGN(ARecordRdata);
92 };
93 
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 {
97  public:
98   static const uint16 kType = dns_protocol::kTypeAAAA;
99 
100   virtual ~AAAARecordRdata();
101   static scoped_ptr<AAAARecordRdata> Create(const base::StringPiece& data,
102                                          const DnsRecordParser& parser);
103   virtual bool IsEqual(const RecordRdata* other) const OVERRIDE;
104   virtual uint16 Type() const OVERRIDE;
105 
address()106   const IPAddressNumber& address() const { return address_; }
107 
108  private:
109   AAAARecordRdata();
110 
111   IPAddressNumber address_;
112 
113   DISALLOW_COPY_AND_ASSIGN(AAAARecordRdata);
114 };
115 
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 {
119  public:
120   static const uint16 kType = dns_protocol::kTypeCNAME;
121 
122   virtual ~CnameRecordRdata();
123   static scoped_ptr<CnameRecordRdata> Create(const base::StringPiece& data,
124                                              const DnsRecordParser& parser);
125   virtual bool IsEqual(const RecordRdata* other) const OVERRIDE;
126   virtual uint16 Type() const OVERRIDE;
127 
cname()128   std::string cname() const { return cname_; }
129 
130  private:
131   CnameRecordRdata();
132 
133   std::string cname_;
134 
135   DISALLOW_COPY_AND_ASSIGN(CnameRecordRdata);
136 };
137 
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 {
141  public:
142   static const uint16 kType = dns_protocol::kTypePTR;
143 
144   virtual ~PtrRecordRdata();
145   static scoped_ptr<PtrRecordRdata> Create(const base::StringPiece& data,
146                                            const DnsRecordParser& parser);
147   virtual bool IsEqual(const RecordRdata* other) const OVERRIDE;
148   virtual uint16 Type() const OVERRIDE;
149 
ptrdomain()150   std::string ptrdomain() const { return ptrdomain_; }
151 
152  private:
153   PtrRecordRdata();
154 
155   std::string ptrdomain_;
156 
157   DISALLOW_COPY_AND_ASSIGN(PtrRecordRdata);
158 };
159 
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 {
164  public:
165   static const uint16 kType = dns_protocol::kTypeTXT;
166 
167   virtual ~TxtRecordRdata();
168   static scoped_ptr<TxtRecordRdata> Create(const base::StringPiece& data,
169                                            const DnsRecordParser& parser);
170   virtual bool IsEqual(const RecordRdata* other) const OVERRIDE;
171   virtual uint16 Type() const OVERRIDE;
172 
texts()173   const std::vector<std::string>& texts() const { return texts_; }
174 
175  private:
176   TxtRecordRdata();
177 
178   std::vector<std::string> texts_;
179 
180   DISALLOW_COPY_AND_ASSIGN(TxtRecordRdata);
181 };
182 
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 {
188  public:
189   static const uint16 kType = dns_protocol::kTypeNSEC;
190 
191   virtual ~NsecRecordRdata();
192   static scoped_ptr<NsecRecordRdata> Create(const base::StringPiece& data,
193                                             const DnsRecordParser& parser);
194   virtual bool IsEqual(const RecordRdata* other) const OVERRIDE;
195   virtual uint16 Type() const OVERRIDE;
196 
197   // Length of the bitmap in bits.
bitmap_length()198   unsigned bitmap_length() const { return bitmap_.size() * 8; }
199 
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;
204 
205  private:
206   NsecRecordRdata();
207 
208   std::vector<uint8> bitmap_;
209 
210   DISALLOW_COPY_AND_ASSIGN(NsecRecordRdata);
211 };
212 
213 
214 }  // namespace net
215 
216 #endif  // NET_DNS_RECORD_RDATA_H_
217