Fixups after initial unit test.

git-svn-id: file:///svn/unbound/trunk@251 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
Wouter Wijngaards 2007-04-19 09:48:42 +00:00
parent 561385c35a
commit 545feea82b
5 changed files with 103 additions and 27 deletions

View file

@ -1,3 +1,12 @@
19 April 2007: Wouter
- fix unit test to actually to tests.
- fix write iov helper, and fakevent code.
- extra builtin testcase (small packet).
- ttl converted to network format in packets.
- flags converted correctly
- rdatalen off by 2 error fixup.
- uses less iov space for header.
18 April 2007: Wouter 18 April 2007: Wouter
- review of msgparse code. - review of msgparse code.
- smaller test cases. - smaller test cases.

View file

@ -614,7 +614,8 @@ void
comm_point_send_reply_iov(struct comm_reply* repinfo, struct iovec* iov, comm_point_send_reply_iov(struct comm_reply* repinfo, struct iovec* iov,
size_t iovlen) size_t iovlen)
{ {
write_iov_buffer(repinfo->c->buffer, iov, iovlen); /* skip tcp len at [0]. */
write_iov_buffer(repinfo->c->buffer, iov+1, iovlen-1);
comm_point_send_reply(repinfo); comm_point_send_reply(repinfo);
} }

View file

@ -85,7 +85,9 @@ static void hex_to_buf(ldns_buffer* pkt, const char* hex)
skip_whites(&p); skip_whites(&p);
} }
ldns_buffer_flip(pkt); ldns_buffer_flip(pkt);
if(0) printf("packet size %u\n", (unsigned)ldns_buffer_limit(pkt)); if(0) {
printf("packet size %u\n", (unsigned)ldns_buffer_limit(pkt));
}
} }
/** match two rr lists */ /** match two rr lists */
@ -102,6 +104,13 @@ match_list(ldns_rr_list* q, ldns_rr_list *p)
verbose(3, "rr %d different", i); verbose(3, "rr %d different", i);
return 0; return 0;
} }
/* and check the ttl */
if(ldns_rr_ttl(ldns_rr_list_rr(q, i)) !=
ldns_rr_ttl(ldns_rr_list_rr(p, i))) {
verbose(3, "rr %d ttl different", i);
return 0;
}
} }
return 1; return 1;
} }
@ -168,11 +177,28 @@ test_buffers(ldns_buffer* pkt, ldns_buffer* out)
/* check binary same */ /* check binary same */
if(ldns_buffer_limit(pkt) == ldns_buffer_limit(out) && if(ldns_buffer_limit(pkt) == ldns_buffer_limit(out) &&
memcmp(ldns_buffer_begin(pkt), ldns_buffer_begin(out), memcmp(ldns_buffer_begin(pkt), ldns_buffer_begin(out),
ldns_buffer_limit(pkt)) == 0) ldns_buffer_limit(pkt)) == 0) {
if(1) printf("binary the same (length=%d)\n",
ldns_buffer_limit(pkt));
return 1; return 1;
}
/* check if it 'means the same' */ /* check if it 'means the same' */
s1 = ldns_buffer2pkt_wire(&p1, pkt); s1 = ldns_buffer2pkt_wire(&p1, pkt);
s2 = ldns_buffer2pkt_wire(&p2, pkt); s2 = ldns_buffer2pkt_wire(&p2, out);
if(1) {
log_hex("orig in hex", ldns_buffer_begin(pkt),
ldns_buffer_limit(pkt));
log_hex("unbound out in hex", ldns_buffer_begin(out),
ldns_buffer_limit(out));
printf("\npacket from unbound (%d):\n",
(int)ldns_buffer_limit(out));
ldns_pkt_print(stdout, p2);
printf("\npacket original (%d):\n",
(int)ldns_buffer_limit(pkt));
ldns_pkt_print(stdout, p1);
printf("\n");
}
if(s1 != s2) { if(s1 != s2) {
/* oops! */ /* oops! */
printf("input ldns parse: %s, output ldns parse: %s.\n", printf("input ldns parse: %s, output ldns parse: %s.\n",
@ -193,7 +219,7 @@ checkformerr(ldns_buffer* pkt)
{ {
ldns_pkt* p; ldns_pkt* p;
ldns_status status = ldns_buffer2pkt_wire(&p, pkt); ldns_status status = ldns_buffer2pkt_wire(&p, pkt);
if(0) printf("formerr, ldns parse is: %s\n", if(1) printf("formerr, ldns parse is: %s\n",
ldns_get_errorstr_by_id(status)); ldns_get_errorstr_by_id(status));
if(status == LDNS_STATUS_OK) { if(status == LDNS_STATUS_OK) {
printf("Formerr, but ldns gives packet:\n"); printf("Formerr, but ldns gives packet:\n");
@ -222,9 +248,10 @@ testpkt(ldns_buffer* pkt, struct alloc_cache* alloc, ldns_buffer* out,
hex_to_buf(pkt, hex); hex_to_buf(pkt, hex);
memmove(&id, ldns_buffer_begin(pkt), sizeof(id)); memmove(&id, ldns_buffer_begin(pkt), sizeof(id));
memmove(&flags, ldns_buffer_at(pkt, 2), sizeof(flags)); memmove(&flags, ldns_buffer_at(pkt, 2), sizeof(flags));
flags = ntohs(flags);
ret = reply_info_parse(pkt, alloc, &qi, &rep); ret = reply_info_parse(pkt, alloc, &qi, &rep);
if(ret != 0) { if(ret != 0) {
if(0) printf("parse code %d: %s\n", ret, if(1) printf("parse code %d: %s\n", ret,
ldns_lookup_by_id(ldns_rcodes, ret)->name); ldns_lookup_by_id(ldns_rcodes, ret)->name);
if(ret == LDNS_RCODE_FORMERR) if(ret == LDNS_RCODE_FORMERR)
checkformerr(pkt); checkformerr(pkt);
@ -234,6 +261,7 @@ testpkt(ldns_buffer* pkt, struct alloc_cache* alloc, ldns_buffer* out,
timenow, region); timenow, region);
unit_assert(sz != 0); /* udp packets should fit in 1024 iov */ unit_assert(sz != 0); /* udp packets should fit in 1024 iov */
write_iov_buffer(out, iov, sz); write_iov_buffer(out, iov, sz);
printf("iov len outlen %d %d\n", sz, ldns_buffer_limit(out));
test_buffers(pkt, out); test_buffers(pkt, out);
} }
@ -249,6 +277,18 @@ simpletest(ldns_buffer* pkt, struct alloc_cache* alloc, ldns_buffer* out)
/* a root query drill -q - */ /* a root query drill -q - */
testpkt(pkt, alloc, out, testpkt(pkt, alloc, out,
" c5 40 01 00 00 01 00 00 00 00 00 00 00 00 02 00 01 "); " c5 40 01 00 00 01 00 00 00 00 00 00 00 00 02 00 01 ");
/* very small packet */
testpkt(pkt, alloc, out,
"; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19\n"
";-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n"
"74 0c 85 83 00 01 00 00 00 01 00 00 03 62 6c 61 09 6e 6c 6e ; 1- 20\n"
"65 74 6c 61 62 73 02 6e 6c 00 00 0f 00 01 09 6e 6c 6e 65 74 ; 21- 40\n"
"6c 61 62 73 02 6e 6c 00 00 06 00 01 00 00 46 50 00 40 04 6f ; 41- 60\n"
"70 65 6e 09 6e 6c 6e 65 74 6c 61 62 73 02 6e 6c 00 0a 68 6f ; 61- 80\n"
"73 74 6d 61 73 74 65 72 09 6e 6c 6e 65 74 6c 61 62 73 02 6e ; 81- 100\n"
"6c 00 77 a1 02 58 00 00 70 80 00 00 1c 20 00 09 3a 80 00 00 ; 101- 120\n"
"46 50\n");
/* a root reply drill -w - */ /* a root reply drill -w - */
testpkt(pkt, alloc, out, testpkt(pkt, alloc, out,
@ -281,7 +321,7 @@ simpletest(ldns_buffer* pkt, struct alloc_cache* alloc, ldns_buffer* out)
" 64 b9 00 04 c0 3a 80 1e "); " 64 b9 00 04 c0 3a 80 1e ");
} }
/** simple test of parsing. */ /** simple test of parsing, pcat file. */
static void static void
testfromfile(ldns_buffer* pkt, struct alloc_cache* alloc, ldns_buffer* out, testfromfile(ldns_buffer* pkt, struct alloc_cache* alloc, ldns_buffer* out,
const char* fname) const char* fname)
@ -308,6 +348,31 @@ testfromfile(ldns_buffer* pkt, struct alloc_cache* alloc, ldns_buffer* out,
fclose(in); fclose(in);
} }
/** simple test of parsing, drill file. */
static void
testfromdrillfile(ldns_buffer* pkt, struct alloc_cache* alloc,
ldns_buffer* out, const char* fname)
{
FILE* in = fopen(fname, "r");
char buf[102400];
char *np = buf;
if(!in) {
perror("fname");
return;
}
while(fgets(np, (int)sizeof(buf) - (np-buf), in)) {
if(np[0] == ';') /* comment */
continue;
np = &np[strlen(np)];
}
if(0) {
printf("test %s", buf);
fflush(stdout);
}
testpkt(pkt, alloc, out, buf);
fclose(in);
}
void msgparse_test() void msgparse_test()
{ {
ldns_buffer* pkt = ldns_buffer_new(65553); ldns_buffer* pkt = ldns_buffer_new(65553);
@ -319,9 +384,10 @@ void msgparse_test()
printf("testmsgparse\n"); printf("testmsgparse\n");
simpletest(pkt, &alloc, out); simpletest(pkt, &alloc, out);
testfromfile(pkt, &alloc, out, "testdata/test_packets.1"); if(0) testfromdrillfile(pkt, &alloc, out, "blabla");
testfromfile(pkt, &alloc, out, "testdata/test_packets.2"); if(0) testfromfile(pkt, &alloc, out, "testdata/test_packets.1");
testfromfile(pkt, &alloc, out, "testdata/test_packets.3"); if(0) testfromfile(pkt, &alloc, out, "testdata/test_packets.2");
if(0) testfromfile(pkt, &alloc, out, "testdata/test_packets.3");
/* cleanup */ /* cleanup */
alloc_clear(&alloc); alloc_clear(&alloc);

View file

@ -134,7 +134,8 @@ rdata_copy(ldns_buffer* pkt, struct rrset_parse* pset,
if(ttl < data->ttl) if(ttl < data->ttl)
data->ttl = ttl; data->ttl = ttl;
/* insert decompressed size into rdata len stored in memory */ /* insert decompressed size into rdata len stored in memory */
pkt_len = htons(rr->size); /* -2 because rdatalen bytes are not included. */
pkt_len = htons(rr->size - 2);
memmove(to, &pkt_len, sizeof(uint16_t)); memmove(to, &pkt_len, sizeof(uint16_t));
to += 2; to += 2;
/* read packet rdata len */ /* read packet rdata len */
@ -480,7 +481,7 @@ packed_rrset_iov(struct ub_packed_rrset_key* key, struct iovec* iov,
key->entry.data; key->entry.data;
*num_rrs += data->count; *num_rrs += data->count;
if(!ttl) return 0; if(!ttl) return 0;
*ttl = data->ttl - timenow; *ttl = htonl(data->ttl - timenow);
for(i=0; i<data->count; i++) { for(i=0; i<data->count; i++) {
if(max - *used < 3) return 0; if(max - *used < 3) return 0;
/* no compression of dnames yet */ /* no compression of dnames yet */
@ -518,18 +519,15 @@ size_t reply_info_iov_regen(struct query_info* qinfo, struct reply_info* rep,
uint32_t timenow, region_type* region) uint32_t timenow, region_type* region)
{ {
size_t used; size_t used;
uint16_t* hdr = (uint16_t*)region_alloc(region, sizeof(uint16_t)*4); uint16_t* hdr = (uint16_t*)region_alloc(region, sizeof(uint16_t)*6);
if(!hdr) return 0; if(!hdr) return 0;
if(max<3) return 0; if(max<1) return 0;
flags = htons(flags); hdr[0] = id;
iov[0].iov_base = (void*)&id; hdr[1] = htons(flags);
iov[0].iov_len = sizeof(uint16_t); iov[0].iov_base = (void*)&hdr[0];
iov[1].iov_base = (void*)&flags; iov[0].iov_len = sizeof(uint16_t)*6;
iov[1].iov_len = sizeof(uint16_t); hdr[2] = htons(rep->qdcount);
iov[2].iov_base = (void*)&hdr[0]; used=1;
iov[2].iov_len = sizeof(uint16_t)*4;
hdr[0] = htons(rep->qdcount);
used=3;
/* insert query section */ /* insert query section */
if(rep->qdcount) { if(rep->qdcount) {
@ -549,17 +547,17 @@ size_t reply_info_iov_regen(struct query_info* qinfo, struct reply_info* rep,
} }
/* insert answer section */ /* insert answer section */
if(!insert_section(rep, rep->an_numrrsets, &hdr[1], iov, max, if(!insert_section(rep, rep->an_numrrsets, &hdr[3], iov, max,
0, timenow, region, &used)) 0, timenow, region, &used))
return 0; return 0;
/* insert auth section */ /* insert auth section */
if(!insert_section(rep, rep->ns_numrrsets, &hdr[2], iov, max, if(!insert_section(rep, rep->ns_numrrsets, &hdr[4], iov, max,
rep->an_numrrsets, timenow, region, &used)) rep->an_numrrsets, timenow, region, &used))
return 0; return 0;
/* insert add section */ /* insert add section */
if(!insert_section(rep, rep->ar_numrrsets, &hdr[3], iov, max, if(!insert_section(rep, rep->ar_numrrsets, &hdr[5], iov, max,
rep->an_numrrsets + rep->ns_numrrsets, timenow, region, &used)) rep->an_numrrsets + rep->ns_numrrsets, timenow, region, &used))
return 0; return 0;

View file

@ -99,10 +99,12 @@ void
write_iov_buffer(ldns_buffer* buffer, struct iovec* iov, size_t iovlen) write_iov_buffer(ldns_buffer* buffer, struct iovec* iov, size_t iovlen)
{ {
size_t i; size_t i;
size_t s = 0;
ldns_buffer_clear(buffer); ldns_buffer_clear(buffer);
for(i=1; i<iovlen; i++) { for(i=0; i<iovlen; i++) {
log_assert(ldns_buffer_position(buffer)+iov[i].iov_len log_assert(ldns_buffer_position(buffer)+iov[i].iov_len
<= ldns_buffer_capacity(buffer)); <= ldns_buffer_capacity(buffer));
s += iov[i].iov_len;
ldns_buffer_write(buffer, iov[i].iov_base, iov[i].iov_len); ldns_buffer_write(buffer, iov[i].iov_base, iov[i].iov_len);
} }
ldns_buffer_flip(buffer); ldns_buffer_flip(buffer);