diff --git a/src/knot/include/module.h b/src/knot/include/module.h index ed5a06cd6204a359578cf27b59e7b9d9ae803d93..5f888997ce1e3ca4dc23abbe268287038b33ef9b 100644 --- a/src/knot/include/module.h +++ b/src/knot/include/module.h @@ -465,6 +465,15 @@ const knot_dname_t *knotd_qdata_zone_name(knotd_qdata_t *qdata); */ knot_rrset_t knotd_qdata_zone_apex_rrset(knotd_qdata_t *qdata, uint16_t type); +/*! + * Gets the original QNAME of the query, before downcasing. + * + * \param[in] qdata Query data. + * + * \return Original QNAME or NULL if error. + */ +const knot_dname_t *knotd_qdata_orig_qname(knotd_qdata_t *qdata); + /*! General query processing states. */ typedef enum { KNOTD_STATE_NOOP = 0, /*!< No response. */ diff --git a/src/knot/modules/dnstap/dnstap.c b/src/knot/modules/dnstap/dnstap.c index eef68bd3d35e7be0947eb9cebddbd66edaef9e08..60a4eb6cacaaaf9c9e54e59ee04cfd89de2530a8 100644 --- a/src/knot/modules/dnstap/dnstap.c +++ b/src/knot/modules/dnstap/dnstap.c @@ -61,6 +61,30 @@ typedef struct { bool with_queries; } dnstap_ctx_t; +static void msg_query_qname_restore(Dnstap__Message *msg, knotd_qdata_t *qdata) +{ + if (msg->query_message.data == NULL) { + return; + } + + const knot_dname_t *orig_qname = knotd_qdata_orig_qname(qdata); + if (orig_qname == NULL) { + return; + } + + memcpy(msg->query_message.data + KNOT_WIRE_HEADER_SIZE, + orig_qname, qdata->query->qname_size); +} + +static void msg_query_qname_case_lower(Dnstap__Message *msg) +{ + if (msg->query_message.data == NULL) { + return; + } + + knot_dname_to_lower(msg->query_message.data + KNOT_WIRE_HEADER_SIZE); +} + static knotd_state_t log_message(knotd_state_t state, const knot_pkt_t *pkt, knotd_qdata_t *qdata, knotd_mod_t *mod) { @@ -132,7 +156,9 @@ static knotd_state_t log_message(knotd_state_t state, const knot_pkt_t *pkt, /* Pack the message. */ uint8_t *frame = NULL; size_t size = 0; + msg_query_qname_restore(&msg, qdata); dt_pack(&dnstap, &frame, &size); + msg_query_qname_case_lower(&msg); if (frame == NULL) { return state; } diff --git a/src/knot/nameserver/query_module.c b/src/knot/nameserver/query_module.c index 0effefe524004a462340c2aabdcd742a9fe47e9d..976b0576d22869108d852854b664ae333c7e8709 100644 --- a/src/knot/nameserver/query_module.c +++ b/src/knot/nameserver/query_module.c @@ -681,6 +681,16 @@ knot_rrset_t knotd_qdata_zone_apex_rrset(knotd_qdata_t *qdata, uint16_t type) return node_rrset(qdata->extra->contents->apex, type); } +_public_ +const knot_dname_t *knotd_qdata_orig_qname(knotd_qdata_t *qdata) +{ + if (qdata == NULL) { + return NULL; + } + + return qdata->extra->orig_qname; +} + _public_ int knotd_mod_dnssec_init(knotd_mod_t *mod) {