*** Bigger and Better
* Config file syntax checker program. Tests on checker.
* Logging first class feature with config options.
+ * with logfile turnover to avoid Gbs of logs.
* donotqueryaddresses with trie for blocking entire netblocks.
* Memory overhaul, special allocators for hashtable caches, and mesh qstates.
+ * keep a preallocated list of region-chunks per worker thread.
+ * allocate region struct and cleanup list in region itself; use
+ linked list cleanup list. unit test on this. do not call region
+ to avoid name-collision with nsd regions, 'regional'.
* read root hints from file.
+* failure to return answer, w. reason (donotq, noanswer servers, cannot
+ find servers, validationfail w.classification, error),
+ with threadno, starttime and endtime and qname/type/class, prime/qflags,
+ from-clients, from-internal, has-subrequests, a nice error report,
+ so that an excerpt from those times can be made from the logs.
+ logfileparsing tool that makes these excerpts and emails them.
+* ANS failure workaround (nxdomain for ENT; check if nxdomain is ENTnodata).
+* clear cache as a callback from the new-rrset-id routine.
*** Local zones feature.
* Build in local zone features. First the total stop for1912.
* Be able to prime roots using several queries (like, get only NS first).
* Nicer statistics
* private TTL, dTLS features.
-
+* retry-mode, where a bogus result triggers a retry-mode query, where a list
+ of responses over a time interval is collected, and each is validated.
+* draft-timers, DLV features.
treeshrew/
validator/ *.c *.h
}
return rep->rrset_count;
}
+
+const char*
+val_classification_to_string(enum val_classification subtype)
+{
+ switch(subtype) {
+ case VAL_CLASS_UNTYPED: return "untyped";
+ case VAL_CLASS_UNKNOWN: return "unknown";
+ case VAL_CLASS_POSITIVE: return "positive";
+ case VAL_CLASS_CNAME: return "cname";
+ case VAL_CLASS_NODATA: return "nodata";
+ case VAL_CLASS_NAMEERROR: return "nameerror";
+ case VAL_CLASS_CNAMENOANSWER: return "cnamenoanswer";
+ case VAL_CLASS_REFERRAL: return "referral";
+ case VAL_CLASS_ANY: return "qtype_any";
+ default:
+ return "bad_val_classification";
+ }
+}
*/
size_t val_next_unchecked(struct reply_info* rep, size_t skip);
+/**
+ * Get string to denote the classification result.
+ * @param subtype: from classification function.
+ * @return static string to describe the classification.
+ */
+const char* val_classification_to_string(enum val_classification subtype);
+
#endif /* VALIDATOR_VAL_UTILS_H */
enum val_classification subtype = val_classify_response(
qstate->query_flags, &vq->qchase, vq->orig_msg->rep,
vq->rrset_skip);
+ verbose(VERB_ALGO, "validator classification %s",
+ val_classification_to_string(subtype));
if(subtype == VAL_CLASS_REFERRAL &&
vq->rrset_skip < vq->orig_msg->rep->rrset_count) {
/* referral uses the rrset name as qchase, to find keys for