-- Question
qname = function(pkt)
assert(ffi.istype(knot_pkt_t, pkt))
- -- inlined knot_pkt_qname(), basically
+ -- inlined knot_pkt_qname(), basically but not lower-cased
if pkt == nil or pkt.qname_size == 0 then return nil end
return ffi.string(pkt.wire + 12, pkt.qname_size)
end,
qtype == knot_pkt_qtype(answer) &&
/* qry->secret had been xor-applied to answer already,
* so this also checks for correctness of case randomization */
- knot_dname_is_equal(qname, knot_pkt_qname(answer));
+ knot_dname_is_equal(qname, kr_pkt_qname_raw(answer));
}
/** Relaxed rule for AA, either AA=1 or SOA matching zone cut is required. */
return KR_STATE_PRODUCE;
/* Packet cleared, derandomize QNAME. */
- knot_dname_t *qname_raw = knot_pkt_qname(packet);
+ knot_dname_t *qname_raw = kr_pkt_qname_raw(packet);
if (qname_raw && qry->secret != 0) {
randomized_qname_case(qname_raw, qry->secret);
}
/* Randomize query case (if not in not turned off) */
qry->secret = qry->flags.NO_0X20 ? 0 : kr_rand_bytes(sizeof(qry->secret));
- knot_dname_t *qname_raw = knot_pkt_qname(packet);
+ knot_dname_t *qname_raw = kr_pkt_qname_raw(packet);
randomized_qname_case(qname_raw, qry->secret);
/*
}
/* Randomize query case (if secret changed) */
- knot_dname_t *qname = knot_pkt_qname(packet);
+ knot_dname_t *qname_raw = kr_pkt_qname_raw(packet);
if (qry->secret != old_minimization_secret) {
- randomized_qname_case(qname, qry->secret);
+ randomized_qname_case(qname_raw, qry->secret);
}
/* Write down OPT unless in safemode */
KR_EXPORT
void kr_pkt_make_auth_header(knot_pkt_t *pkt);
+/** Get pointer to the in-header QNAME.
+ *
+ * That's normally not lower-cased. However, when receiving packets from upstream
+ * we xor-apply the secret during packet-parsing, so it would get lower-cased
+ * after that point if the case was right.
+ */
+static inline knot_dname_t * kr_pkt_qname_raw(const knot_pkt_t *pkt)
+{
+ if (pkt == NULL || pkt->qname_size == 0) {
+ return NULL;
+ }
+ return pkt->wire + KNOT_WIRE_HEADER_SIZE;
+}
+
/** Simple storage for IPx address and their ports or AF_UNSPEC. */
union kr_sockaddr {
struct sockaddr ip;