skip_whites(&p);
}
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 */
verbose(3, "rr %d different", i);
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;
}
/* check binary same */
if(ldns_buffer_limit(pkt) == ldns_buffer_limit(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;
+ }
/* check if it 'means the same' */
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) {
/* oops! */
printf("input ldns parse: %s, output ldns parse: %s.\n",
{
ldns_pkt* p;
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));
if(status == LDNS_STATUS_OK) {
printf("Formerr, but ldns gives packet:\n");
hex_to_buf(pkt, hex);
memmove(&id, ldns_buffer_begin(pkt), sizeof(id));
memmove(&flags, ldns_buffer_at(pkt, 2), sizeof(flags));
+ flags = ntohs(flags);
ret = reply_info_parse(pkt, alloc, &qi, &rep);
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);
if(ret == LDNS_RCODE_FORMERR)
checkformerr(pkt);
timenow, region);
unit_assert(sz != 0); /* udp packets should fit in 1024 iov */
write_iov_buffer(out, iov, sz);
+ printf("iov len outlen %d %d\n", sz, ldns_buffer_limit(out));
test_buffers(pkt, out);
}
/* a root query drill -q - */
testpkt(pkt, alloc, out,
" 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 - */
testpkt(pkt, alloc, out,
" 64 b9 00 04 c0 3a 80 1e ");
}
-/** simple test of parsing. */
+/** simple test of parsing, pcat file. */
static void
testfromfile(ldns_buffer* pkt, struct alloc_cache* alloc, ldns_buffer* out,
const char* fname)
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()
{
ldns_buffer* pkt = ldns_buffer_new(65553);
printf("testmsgparse\n");
simpletest(pkt, &alloc, out);
- testfromfile(pkt, &alloc, out, "testdata/test_packets.1");
- testfromfile(pkt, &alloc, out, "testdata/test_packets.2");
- testfromfile(pkt, &alloc, out, "testdata/test_packets.3");
+ if(0) testfromdrillfile(pkt, &alloc, out, "blabla");
+ if(0) testfromfile(pkt, &alloc, out, "testdata/test_packets.1");
+ if(0) testfromfile(pkt, &alloc, out, "testdata/test_packets.2");
+ if(0) testfromfile(pkt, &alloc, out, "testdata/test_packets.3");
/* cleanup */
alloc_clear(&alloc);
if(ttl < data->ttl)
data->ttl = ttl;
/* 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));
to += 2;
/* read packet rdata len */
key->entry.data;
*num_rrs += data->count;
if(!ttl) return 0;
- *ttl = data->ttl - timenow;
+ *ttl = htonl(data->ttl - timenow);
for(i=0; i<data->count; i++) {
if(max - *used < 3) return 0;
/* no compression of dnames yet */
uint32_t timenow, region_type* region)
{
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(max<3) return 0;
- flags = htons(flags);
- iov[0].iov_base = (void*)&id;
- iov[0].iov_len = sizeof(uint16_t);
- iov[1].iov_base = (void*)&flags;
- iov[1].iov_len = sizeof(uint16_t);
- iov[2].iov_base = (void*)&hdr[0];
- iov[2].iov_len = sizeof(uint16_t)*4;
- hdr[0] = htons(rep->qdcount);
- used=3;
+ if(max<1) return 0;
+ hdr[0] = id;
+ hdr[1] = htons(flags);
+ iov[0].iov_base = (void*)&hdr[0];
+ iov[0].iov_len = sizeof(uint16_t)*6;
+ hdr[2] = htons(rep->qdcount);
+ used=1;
/* insert query section */
if(rep->qdcount) {
}
/* 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))
return 0;
/* 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))
return 0;
/* 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))
return 0;