From dcee630fc8d7031461dcbb5938d3fafeeec88a79 Mon Sep 17 00:00:00 2001 From: Marek Vavrusa <marek.vavrusa@nic.cz> Date: Mon, 17 Dec 2012 16:37:06 +0100 Subject: [PATCH] Ported query to new rrset structures. Reused wire writing from rrset (knot_rrset_to_wire). --- src/Makefile.am | 2 + src/libknot/packet/packet.c | 1 - src/libknot/packet/query.c | 79 ++----------------------------------- src/libknot/packet/query.h | 5 +-- src/libknot/rrset.h | 1 + 5 files changed, 8 insertions(+), 80 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 0942c967b..62197bf32 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -31,6 +31,8 @@ knot_zcompile_SOURCES = \ libknot/util/wire.h \ libknot/packet/packet.h \ libknot/packet/packet.c \ + libknot/packet/query.h \ + libknot/packet/query.c \ libknot/zone/zone.c \ libknot/zone/zone-contents.c \ libknot/zone/zone-tree.c \ diff --git a/src/libknot/packet/packet.c b/src/libknot/packet/packet.c index 88b6efa2a..28df0f6d4 100644 --- a/src/libknot/packet/packet.c +++ b/src/libknot/packet/packet.c @@ -404,7 +404,6 @@ static int knot_packet_parse_rdata(knot_rrset_t *rr, const uint8_t *wire, memcpy(rd, wire + *pos, rchunk); rd += rchunk; *pos += rchunk; - break; } else { //NAPTR assert(knot_rrset_type(rr) == KNOT_RRTYPE_NAPTR); diff --git a/src/libknot/packet/query.c b/src/libknot/packet/query.c index 8f4cf1881..84b04c91d 100644 --- a/src/libknot/packet/query.c +++ b/src/libknot/packet/query.c @@ -21,74 +21,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) { @@ -211,14 +143,9 @@ int knot_query_add_rrset_authority(knot_packet_t *query, /* 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 = (pos - startp); + size_t written = 0; + int rr_count = 0; + knot_rrset_to_wire(rrset, startp, &written, &rr_count); query->size += written; ++query->ns_rrsets; ++query->header.nscount; diff --git a/src/libknot/packet/query.h b/src/libknot/packet/query.h index 3ca4fd31d..4a5a2f0db 100644 --- a/src/libknot/packet/query.h +++ b/src/libknot/packet/query.h @@ -81,9 +81,8 @@ int knot_query_set_opcode(knot_packet_t *query, uint8_t opcode); int knot_query_add_rrset_authority(knot_packet_t *query, const knot_rrset_t *rrset); -int knot_query_rr_to_wire(const knot_rrset_t *rrset, const knot_rdata_t *rdata, - uint8_t **wire, uint8_t *endp); - +int knot_query_rr_to_wire(const knot_rrset_t *rrset, size_t rid, + uint8_t **wire, uint8_t *endp); #endif /* _KNOT_QUERY_H_ */ /*! @} */ diff --git a/src/libknot/rrset.h b/src/libknot/rrset.h index efef9c816..aefb97db3 100644 --- a/src/libknot/rrset.h +++ b/src/libknot/rrset.h @@ -250,6 +250,7 @@ knot_rrset_t *knot_rrset_get_rrsigs(knot_rrset_t *rrset); int knot_rrset_compare_rdata(const knot_rrset_t *r1, const knot_rrset_t *r2); +/*! \todo Should support (optional) dname compression. */ int knot_rrset_to_wire(const knot_rrset_t *rrset, uint8_t *wire, size_t *size, int *rr_count); -- GitLab