kr_rule_fwd_flags_t flags;
knot_db_val_t targets_ptr;
};
-enum kr_rule_sub_t {KR_RULE_SUB_EMPTY = 1, KR_RULE_SUB_NXDOMAIN, KR_RULE_SUB_NODATA, KR_RULE_SUB_REDIRECT, KR_RULE_SUB_DNAME};
+enum kr_rule_sub_t {KR_RULE_SUB_EMPTY = 16, KR_RULE_SUB_NXDOMAIN, KR_RULE_SUB_NODATA, KR_RULE_SUB_REDIRECT, KR_RULE_SUB_DNAME};
enum kr_proto {KR_PROTO_INTERNAL, KR_PROTO_UDP53, KR_PROTO_TCP53, KR_PROTO_DOT, KR_PROTO_DOH, KR_PROTO_DOQ, KR_PROTO_COUNT};
typedef unsigned char kr_proto_set;
kr_layer_t kr_layer_t_static;
kr_log_req(req, qid, ind, WORKER, "internal timeout for resolving the request has expired\n");
}
+
+/* Let's represent unblocked (allow-listed) requests in this way. */
+static inline void kr_request_unblock(struct kr_request *req)
+{
+ req->rule.action = KREQ_ACTION_PASS;
+}
+static inline bool kr_request_unblocked(const struct kr_request *req)
+{
+ return req->rule.action == KREQ_ACTION_PASS;
+}
+
const char * const ruleset_name,
struct kr_query *qry, knot_pkt_t *pkt)
{
+ struct kr_request * const req = qry->request;
kr_require(lf_start_i < KEY_MAXLEN);
knot_db_val_t key_leq = key;
knot_db_val_t val;
.len = key_leq.len - lf_start_i,
};
// Found some good key, now check tags.
- if (!kr_rule_consume_tags(&val, qry->request)) {
+ if (!kr_rule_consume_tags(&val, req)) {
kr_assert(key_leq.len >= lf_start_i);
shorten:
// Shorten key_leq by one label and retry.
return RET_CONT_CACHE;
}
+ // Only forward rules apply to unblocked requests.
+ // LATER(optim.): we might cache the state of having no forward rules
+ if (kr_request_unblocked(req))
+ goto shorten;
+ // Unblock rules also don't have opts+ttl.
+ if (ztype == VAL_ZLAT_UNBLOCK) {
+ kr_request_unblock(req);
+ VERBOSE_MSG(qry, "=> unblocked\n");
+ if (kr_fails_assert(val.len == 0))
+ kr_log_error(RULES, "ERROR: unused bytes: %zu\n", val.len);
+ goto shorten; // the same situation as kr_request_unblocked()
+ }
+
// Process opts.
kr_rule_opts_t opts;
if (deserialize_fails_assert(&val, &opts))
return kr_error(EILSEQ);
log_rule(opts, qry);
- if (opts.score < qry->request->rule_score_apply)
+ if (opts.score < req->rule_score_apply)
goto shorten; // continue looking for rules
// The non-forward types optionally specify TTL.
goto skip_exact;
}
}
+ if (kr_request_unblocked(qry->request))
+ goto skip_exact;
// Probe for exact and CNAME rule.
memcpy(key_data_ruleset_end, &KEY_EXACT_MATCH, sizeof(KEY_EXACT_MATCH));