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: 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 54 uint16 priority() const { return priority_; } 55 uint16 weight() const { return weight_; } 56 uint16 port() const { return port_; } 57 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 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 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 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 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 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. 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