summaryrefslogtreecommitdiff
path: root/src/libknot/packet/query.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libknot/packet/query.c')
-rw-r--r--src/libknot/packet/query.c89
1 files changed, 9 insertions, 80 deletions
diff --git a/src/libknot/packet/query.c b/src/libknot/packet/query.c
index 8f4cf18..4bededc 100644
--- a/src/libknot/packet/query.c
+++ b/src/libknot/packet/query.c
@@ -14,6 +14,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <config.h>
#include <stdlib.h>
#include "packet/query.h"
#include "util/wire.h"
@@ -21,74 +22,6 @@
/*----------------------------------------------------------------------------*/
-int knot_query_rr_to_wire(const knot_rrset_t *rrset, const knot_rdata_t *rdata,
- uint8_t **wire, uint8_t *endp)
-{
- /* Store owner. */
- knot_dname_t *owner = rrset->owner;
- if (*wire + owner->size > endp) {
- return KNOT_ENOMEM;
- }
- memcpy(*wire, owner->name, owner->size);
- *wire += owner->size;
-
- if (*wire + 10 > endp) {
- return KNOT_ENOMEM;
- }
-
- /* Write RR header. */
- knot_wire_write_u16(*wire, rrset->type); *wire += 2;
- knot_wire_write_u16(*wire, rrset->rclass); *wire += 2;
- knot_wire_write_u32(*wire, rrset->ttl); *wire += 4;
- knot_wire_write_u16(*wire, 0); *wire += 2; /* RDLENGTH reserve. */
- uint8_t *rdlength_p = *wire - 2;
- uint16_t rdlength = 0;
-
- /* Write data. */
- knot_dname_t *dname = 0;
- uint16_t *raw_data = 0;
- knot_rrtype_descriptor_t *desc =
- knot_rrtype_descriptor_by_type(rrset->type);
-
- for (int i = 0; i < rdata->count; ++i) {
- switch (desc->wireformat[i]) {
- case KNOT_RDATA_WF_COMPRESSED_DNAME:
- case KNOT_RDATA_WF_UNCOMPRESSED_DNAME:
- case KNOT_RDATA_WF_LITERAL_DNAME:
-
- /* Check space for dname. */
- dname = knot_rdata_item(rdata, i)->dname;
- if (*wire + dname->size > endp) {
- return KNOT_ESPACE;
- }
-
- /* Save domain name. */
- memcpy(*wire, dname->name, dname->size);
- *wire += dname->size;
- rdlength += dname->size;
- break;
- default:
- raw_data = knot_rdata_item(rdata, i)->raw_data;
- if (*wire + raw_data[0] > endp) {
- return KNOT_ESPACE;
- }
-
- /* Copy data. */
- memcpy(*wire, raw_data + 1, raw_data[0]);
- *wire += raw_data[0];
- rdlength += raw_data[0];
- break;
-
- }
- }
-
- /* Store rdlength. */
- knot_wire_write_u16(rdlength_p, rdlength);
-
- return KNOT_EOK;
-}
-/*----------------------------------------------------------------------------*/
-
int knot_query_dnssec_requested(const knot_packet_t *query)
{
if (query == NULL) {
@@ -153,9 +86,7 @@ int knot_query_set_question(knot_packet_t *query,
query->header.qdcount = 1;
// convert the Question to wire format right away
- knot_packet_question_to_wire(query);
-
- return KNOT_EOK;
+ return knot_packet_question_to_wire(query);
}
/*----------------------------------------------------------------------------*/
@@ -203,26 +134,24 @@ int knot_query_add_rrset_authority(knot_packet_t *query,
/* Write to wire. */
uint8_t *startp = query->wireformat + query->size;
uint8_t *endp = query->wireformat + query->max_size;
-
+
assert(endp - startp > query->opt_rr.size + query->tsig_size);
// reserve space for OPT RR
/*! \todo Why here??? */
endp -= query->opt_rr.size;
/* Reserve space for TSIG RR */
endp -= query->tsig_size;
-
- uint8_t *pos = startp;
- const knot_rdata_t *rdata = 0;
- while ((rdata = knot_rrset_rdata_next(rrset, rdata))) {
- knot_query_rr_to_wire(rrset, rdata, &pos, endp);
+ size_t written = 0;
+ uint16_t rr_count = 0;
+ int ret = knot_rrset_to_wire(rrset, startp, &written, query->max_size,
+ &rr_count, NULL);
+ if (ret != KNOT_EOK) {
+ return ret;
}
-
- size_t written = (pos - startp);
query->size += written;
++query->ns_rrsets;
++query->header.nscount;
return KNOT_EOK;
}
-