struct ReportIsOnlyCallableByReportAllTypes;
-#define includeboilerplate(RNAME) RNAME##RecordContent(const DNSRecord& dr, PacketReader& pr); \
- RNAME##RecordContent(const string& zoneData); \
- static void report(const ReportIsOnlyCallableByReportAllTypes& guard); \
- static std::shared_ptr<DNSRecordContent> make(const DNSRecord &dr, PacketReader& pr); \
- static std::shared_ptr<DNSRecordContent> make(const string& zonedata); \
- string getZoneRepresentation(bool noDot=false) const override; \
- void toPacket(DNSPacketWriter& pw) const override; \
- uint16_t getType() const override { return QType::RNAME; } \
- template<class Convertor> void xfrPacket(Convertor& conv, bool noDot=false) const; \
- template<class Convertor> void xfrPacket(Convertor& conv, bool noDot=false);
+#define includeboilerplate(RNAME) \
+ RNAME##RecordContent(const DNSRecord& dr, PacketReader& pr); \
+ RNAME##RecordContent(const string& zoneData); \
+ static void report(const ReportIsOnlyCallableByReportAllTypes& guard); \
+ static std::shared_ptr<DNSRecordContent> make(const DNSRecord& dr, PacketReader& pr); \
+ static std::shared_ptr<DNSRecordContent> make(const string& zonedata); \
+ string getZoneRepresentation(bool noDot = false) const override; \
+ void toPacket(DNSPacketWriter& pw) const override; \
+ uint16_t getType() const override { return QType::RNAME; } \
+ template <class Convertor> \
+ void xfrPacket(Convertor& conv, bool noDot = false) const; \
+ template <class Convertor> \
+ void xfrPacket(Convertor& conv, bool noDot = false);
class NAPTRRecordContent : public DNSRecordContent
{
{
return d_replacement;
}
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_replacement.sizeEstimate() + d_flags.size() + d_services.size() + d_regexp.size();
+ }
private:
uint16_t d_order, d_preference;
string d_flags, d_services, d_regexp;
return false;
return d_ip == dynamic_cast<const ARecordContent&>(rhs).d_ip;
}
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this);
+ }
private:
uint32_t d_ip;
};
return false;
return d_ip6 == dynamic_cast<const decltype(this)>(&rhs)->d_ip6;
}
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_ip6.size();
+ }
private:
string d_ip6; // why??
};
auto rrhs =dynamic_cast<const decltype(this)>(&rhs);
return std::tie(d_preference, d_mxname) == std::tie(rrhs->d_preference, rrhs->d_mxname);
}
-
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_mxname.sizeEstimate();
+ }
};
class KXRecordContent : public DNSRecordContent
includeboilerplate(KX)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_exchanger.sizeEstimate();
+ }
private:
uint16_t d_preference;
DNSName d_exchanger;
includeboilerplate(IPSECKEY)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_gateway.sizeEstimate() + d_publickey.size() + d_ip6.size();
+ }
private:
uint32_t d_ip4;
DNSName d_gateway;
{
public:
includeboilerplate(DHCID)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_content.size();
+ }
private:
string d_content;
SRVRecordContent(uint16_t preference, uint16_t weight, uint16_t port, DNSName target);
includeboilerplate(SRV)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_target.sizeEstimate();
+ }
uint16_t d_weight, d_port;
DNSName d_target;
public:
includeboilerplate(TSIG)
TSIGRecordContent() = default;
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_algoName.sizeEstimate() + d_mac.size() + d_otherData.size();
+ }
uint16_t d_origID{0};
uint16_t d_fudge{0};
public:
includeboilerplate(TXT)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_text.size();
+ }
+
string d_text;
};
{
public:
includeboilerplate(LUA)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + getCode().size();
+ }
string getCode() const;
uint16_t d_type;
string d_code;
{
public:
includeboilerplate(ENT)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this);
+ }
};
class SPFRecordContent : public DNSRecordContent
{
return d_text;
}
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_text.size();
+ }
private:
string d_text;
auto rrhs =dynamic_cast<const decltype(this)>(&rhs);
return d_content == rrhs->d_content;
}
-
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_content.sizeEstimate();
+ }
private:
DNSName d_content;
};
includeboilerplate(PTR)
explicit PTRRecordContent(const DNSName& content) : d_content(content){}
const DNSName& getContent() const { return d_content; }
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_content.sizeEstimate();
+ }
private:
DNSName d_content;
};
includeboilerplate(CNAME)
CNAMERecordContent(const DNSName& content) : d_content(content){}
DNSName getTarget() const { return d_content; }
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_content.sizeEstimate();
+ }
private:
DNSName d_content;
};
{
return d_content;
}
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_content.sizeEstimate();
+ }
private:
DNSName d_content;
};
includeboilerplate(DNAME)
DNAMERecordContent(const DNSName& content) : d_content(content){}
const DNSName& getTarget() const { return d_content; }
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_content.sizeEstimate();
+ }
private:
DNSName d_content;
};
{
public:
includeboilerplate(MB)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_madname.sizeEstimate();
+ }
private:
DNSName d_madname;
{
public:
includeboilerplate(MG)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_mgmname.sizeEstimate();
+ }
private:
DNSName d_mgmname;
{
public:
includeboilerplate(MR)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_alias.sizeEstimate();
+ }
private:
DNSName d_alias;
{
public:
includeboilerplate(MINFO)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_rmailbx.sizeEstimate() + d_emailbx.sizeEstimate();
+ }
private:
DNSName d_rmailbx;
OPTRecordContent() = default;
includeboilerplate(OPT)
void getData(vector<pair<uint16_t, string> > &opts) const;
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_data.size();
+ }
private:
string d_data;
};
{
public:
includeboilerplate(HINFO)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_cpu.size() + d_host.size();
+ }
private:
string d_cpu, d_host;
{
public:
includeboilerplate(RP)
-
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_mbox.sizeEstimate() + d_info.sizeEstimate();
+ }
private:
DNSName d_mbox, d_info;
};
return std::tie(d_flags, d_protocol, d_algorithm, d_key) <
std::tie(rhs.d_flags, rhs.d_protocol, rhs.d_algorithm, rhs.d_key);
}
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_key.size();
+ }
};
class CDNSKEYRecordContent : public DNSRecordContent
CDNSKEYRecordContent();
includeboilerplate(CDNSKEY)
uint16_t getTag();
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_key.size();
+ }
uint16_t d_flags{0};
uint8_t d_protocol{0};
}
includeboilerplate(DS)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_digest.size();
+ }
uint16_t d_tag{0};
uint8_t d_algorithm{0}, d_digesttype{0};
public:
CDSRecordContent();
includeboilerplate(CDS)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_digest.size();
+ }
uint16_t d_tag{0};
uint8_t d_algorithm{0}, d_digesttype{0};
public:
DLVRecordContent();
includeboilerplate(DLV)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_digest.size();
+ }
uint16_t d_tag{0};
uint8_t d_algorithm{0}, d_digesttype{0};
{
public:
includeboilerplate(SSHFP)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_fingerprint.size();
+ }
private:
uint8_t d_algorithm, d_fptype;
{
public:
includeboilerplate(KEY)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_certificate.size();
+ }
private:
uint16_t d_flags;
{
public:
includeboilerplate(AFSDB)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_hostname.sizeEstimate();
+ }
private:
uint16_t d_subtype;
{
public:
includeboilerplate(CERT)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_certificate.size();
+ }
private:
uint16_t d_type, d_tag;
{
public:
includeboilerplate(TLSA)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_cert.size();
+ }
private:
uint8_t d_certusage, d_selector, d_matchtype;
{
public:
includeboilerplate(SMIMEA)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_cert.size();
+ }
private:
uint8_t d_certusage, d_selector, d_matchtype;
{
public:
includeboilerplate(OPENPGPKEY)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_keyring.size();
+ }
private:
string d_keyring;
SvcParam getParam(const SvcParam::SvcParamKey &key) const;
virtual std::shared_ptr<SVCBBaseRecordContent> clone() const = 0;
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_params.size() * sizeof(SvcParam) + d_target.sizeEstimate();
+ }
+
protected:
std::set<SvcParam> d_params;
DNSName d_target;
RRSIGRecordContent();
includeboilerplate(RRSIG)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_signer.sizeEstimate() + d_signature.size();
+ }
uint16_t d_type{0};
uint16_t d_tag{0};
DNSName d_signer;
public:
RKEYRecordContent();
includeboilerplate(RKEY)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_key.size();
+ }
uint16_t d_flags{0};
uint8_t d_protocol{0}, d_algorithm{0};
string d_key;
includeboilerplate(SOA)
SOARecordContent(DNSName mname, DNSName rname, const struct soatimes& st);
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_mname.sizeEstimate() + d_rname.sizeEstimate();
+ }
DNSName d_mname;
DNSName d_rname;
struct soatimes d_st;
includeboilerplate(ZONEMD)
//ZONEMDRecordContent(uint32_t serial, uint8_t scheme, uint8_t hashalgo, string digest);
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_digest.size();
+ }
uint32_t d_serial;
uint8_t d_scheme;
uint8_t d_hashalgo;
static constexpr size_t const nbTypes = 65536;
+ [[nodiscard]] size_t sizeEstimate() const
+ {
+ return d_bitset ? nbTypes / 8 : d_set.size() * (2U + sizeof(std::set<uint16_t>)); // XXX
+ }
+
private:
void migrateToBitSet()
return d_bitmap.count();
}
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_next.sizeEstimate() + d_bitmap.sizeEstimate();
+ }
DNSName d_next;
private:
NSECBitmap d_bitmap;
return d_flags & 1;
}
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_salt.size() + d_nexthash.size() + d_bitmap.sizeEstimate();
+ }
private:
NSECBitmap d_bitmap;
};
d_bitmap.set(type);
}
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_bitmap.sizeEstimate();
+ }
+
private:
uint32_t d_serial{0};
uint16_t d_flags{0};
return QType::NSEC3PARAM;
}
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_salt.size();
+ }
uint8_t d_algorithm{0}, d_flags{0};
uint16_t d_iterations{0};
return QType::LOC;
}
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this);
+ }
private:
};
{
public:
includeboilerplate(NID);
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this);
+ }
private:
uint16_t d_preference;
{
public:
includeboilerplate(L32);
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this);
+ }
private:
uint16_t d_preference;
{
public:
includeboilerplate(L64);
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this);
+ }
private:
uint16_t d_preference;
{
public:
includeboilerplate(LP);
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_fqdn.sizeEstimate();
+ }
private:
uint16_t d_preference;
string getZoneRepresentation(bool noDot=false) const override;
void toPacket(DNSPacketWriter& pw) const override;
uint16_t getType() const override { return QType::EUI48; }
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this);
+ }
private:
// storage for the bytes
uint8_t d_eui48[6];
string getZoneRepresentation(bool noDot=false) const override;
void toPacket(DNSPacketWriter& pw) const override;
uint16_t getType() const override { return QType::EUI64; }
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this);
+ }
private:
// storage for the bytes
uint8_t d_eui64[8];
public:
APLRecordContent() = default;
includeboilerplate(APL)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + aplrdata.size() * sizeof(APLRDataElement);
+ }
private:
std::vector<APLRDataElement> aplrdata;
APLRDataElement parseAPLElement(const string &element);
public:
TKEYRecordContent();
includeboilerplate(TKEY)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_algo.sizeEstimate() + d_key.size() + d_other.size();
+ }
// storage for the bytes
uint16_t d_othersize{0};
class URIRecordContent : public DNSRecordContent {
public:
includeboilerplate(URI)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_target.size();
+ }
private:
uint16_t d_priority, d_weight;
string d_target;
};
class CAARecordContent : public DNSRecordContent {
- public:
- includeboilerplate(CAA)
- private:
+public:
+ includeboilerplate(CAA)
+ [[nodiscard]] size_t sizeEstimate() const override
+ {
+ return sizeof(*this) + d_tag.size() + d_value.size();
+ }
+private:
uint8_t d_flags;
string d_tag, d_value;
};