r.qtype=row[3];
- if (d_upgradeContent && DNSRecordContent::isUnknownType(row[3]) && r.qtype.isSupportedType()) {
+ if (d_upgradeContent && DNSRecordContent::isUnknownType(row[3]) && r.qtype.isSupportedType() && !r.qtype.isMetadataType() && DNSRecordContent::isRegisteredType(r.qtype, r.qclass) && r.qtype != QType::NSEC && r.qtype != QType::NSEC3 && r.qtype != QType::ANY) {
r.content = DNSRecordContent::upgradeContent(r.qname, r.qtype, row[0]);
}
else if (r.qtype==QType::MX || r.qtype==QType::SRV) {
return zmakermap;
}
+bool DNSRecordContent::isRegisteredType(uint16_t rtype, uint16_t rclass)
+{
+ return getTypemap().count(pair(rclass, rtype)) != 0;
+}
+
DNSRecord::DNSRecord(const DNSResourceRecord& rr): d_name(rr.qname)
{
d_type = rr.qtype.getCode();
throw runtime_error("Unknown DNS type '"+name+"'");
}
- static const string NumberToType(uint16_t num, uint16_t classnum=1)
+ static const string NumberToType(uint16_t num, uint16_t classnum = QClass::IN)
{
auto iter = getT2Namemap().find(pair(classnum, num));
if(iter == getT2Namemap().end())
return iter->second;
}
+ /**
+ * \brief Return whether we have implemented a content representation for this type
+ */
+ static bool isRegisteredType(uint16_t rtype, uint16_t rclass = QClass::IN);
+
virtual uint16_t getType() const = 0;
protected:
bool QType::isMetadataType() const
{
- if (code == QType::AXFR ||
- code == QType::MAILA ||
- code == QType::MAILB ||
- code == QType::TSIG ||
- code == QType::IXFR)
+ // rfc6895 section 3.1, note ANY is 255 and falls outside the range
+ if (code == QType::OPT || (code >= rfc6895MetaLowerBound && code <= rfc6895MetaUpperBound)) {
return true;
-
+ }
return false;
}
return code;
}
+ /**
+ * \brief Return whether we know the name of this type.
+ *
+ * This does not presume that we have an implemented a content representation for this type,
+ * for that please see DNSRecordContent::isRegisteredType().
+ */
bool isSupportedType() const;
+ /**
+ * \brief Whether the type is either a QTYPE or Meta-Type as defined by rfc6895 section 3.1.
+ *
+ * Note that ANY is 255 and falls outside the range.
+ */
bool isMetadataType() const;
static uint16_t chartocode(const char* p);
// Method implements section 3.4.1 of RFC2136
int PacketHandler::checkUpdatePrescan(const DNSRecord *rr) {
// The RFC stats that d_class != ZCLASS, but we only support the IN class.
- if (rr->d_class != QClass::IN && rr->d_class != QClass::NONE && rr->d_class != QClass::ANY)
+ if (rr->d_class != QClass::IN && rr->d_class != QClass::NONE && rr->d_class != QClass::ANY) {
return RCode::FormErr;
+ }
QType qtype = QType(rr->d_type);
- if (! qtype.isSupportedType())
+ if (!qtype.isSupportedType()) {
return RCode::FormErr;
+ }
- if ((rr->d_class == QClass::NONE || rr->d_class == QClass::ANY) && rr->d_ttl != 0)
+ if ((rr->d_class == QClass::NONE || rr->d_class == QClass::ANY) && rr->d_ttl != 0) {
return RCode::FormErr;
+ }
- if (rr->d_class == QClass::ANY && rr->d_clen != 0)
+ if (rr->d_class == QClass::ANY && rr->d_clen != 0) {
return RCode::FormErr;
+ }
- if (qtype.isMetadataType())
- return RCode::FormErr;
+ if (qtype.isMetadataType()) {
+ return RCode::FormErr;
+ }
- if (rr->d_class != QClass::ANY && qtype.getCode() == QType::ANY)
+ if (rr->d_class != QClass::ANY && qtype.getCode() == QType::ANY) {
return RCode::FormErr;
+ }
return RCode::NoError;
}