Home | History | Annotate | Download | only in dns
      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