diff --git a/scripts/parse_dump.py b/scripts/parse_dump.py index 7f71950d7a843dfa035b30dc565e7022e6488107..d9cc44b6998ca68fad2f8d4c2e32ae97ebac5020 100755 --- a/scripts/parse_dump.py +++ b/scripts/parse_dump.py @@ -106,6 +106,9 @@ def chop_and_write_packet(packet): fp.write(pack('H', packet.ancount)) fp.write(pack('H', packet.nscount)) fp.write(pack('H', packet.arcount)) + +#write query flag + fp.write(pack('H', packet.qr)) chop_and_write_section_query(packet.qd) chop_and_write_section_response(packet.an) @@ -122,6 +125,7 @@ fp.write(pack('L', total_length)) for packet in packets: try: data = a2b_hex(str(packet['DNS']).encode('hex')) + fr.write(pack('H', packet.qr)) fr.write(pack('H', len(data))) fr.write(data) chop_and_write_packet(packet['DNS']) diff --git a/src/dnslib/tests/realdata/dnslib_tests_loader_realdata.c b/src/dnslib/tests/realdata/dnslib_tests_loader_realdata.c index a551c8cfd0364761015e910d753c831c404faa2a..eb5e2a062d551f420cc677129247c4bb9dafef38 100644 --- a/src/dnslib/tests/realdata/dnslib_tests_loader_realdata.c +++ b/src/dnslib/tests/realdata/dnslib_tests_loader_realdata.c @@ -28,6 +28,7 @@ static int mem_read(void *dst, size_t n, const char **src, static int load_raw_packets(test_data_t *data, uint32_t *count, const char *src, unsigned src_size) { + uint16_t tmp_size = 0; /* Packets are stored like this: [size][packet_data]+ */ @@ -37,6 +38,11 @@ static int load_raw_packets(test_data_t *data, uint32_t *count, } for (int i = 0; i < *count; i++) { + uint16_t query = 0; + if (!mem_read(&query, sizeof(query), &src, &src_size)) { + return -1; + } + if(!mem_read(&tmp_size, sizeof(uint16_t), &src, &src_size)) { return -1; } @@ -50,7 +56,14 @@ static int load_raw_packets(test_data_t *data, uint32_t *count, sizeof(uint8_t) * tmp_size, &src, &src_size)) { return -1; } - add_tail(&data->raw_response_list, (void *)packet); + + if (query) { + add_tail(&data->raw_query_list, (void *)packet); + } else { + add_tail(&data->raw_response_list, (void *)packet); + } + + add_tail(&data->raw_packet_list, (void *)packet); } return 0; @@ -676,6 +689,11 @@ static test_response_t *load_parsed_response(const char **src, fprintf(stderr, "arcount: %d\n", resp->arcount); #endif + if (!mem_read(&resp->query, sizeof(resp->query), src, src_size)) { + free(resp); + return NULL; + } + test_rrset_t **question_rrsets; question_rrsets = malloc(sizeof(test_rrset_t *) * resp->qdcount); @@ -1026,7 +1044,6 @@ static void get_and_save_data_from_response(const test_response_t *response, static int load_parsed_responses(test_data_t *data, uint32_t *count, const char* src, unsigned src_size) { - if (!mem_read(count, sizeof(*count), &src, &src_size)) { fprintf(stderr, "Wrong read\n"); return -1; @@ -1045,7 +1062,13 @@ static int load_parsed_responses(test_data_t *data, uint32_t *count, return -1; } - add_tail(&data->response_list, + if (tmp_response->query) { + add_tail(&data->query_list, (node *)tmp_response); + } else { + add_tail(&data->response_list, (node *)tmp_response); + } + + add_tail(&data->packet_list, (node *)tmp_response); } @@ -1084,6 +1107,10 @@ static int init_data(test_data_t *data) init_list(&data->rrset_list); init_list(&data->item_list); init_list(&data->raw_response_list); + init_list(&data->raw_query_list); + init_list(&data->raw_packet_list); + init_list(&data->query_list); + init_list(&data->packet_list); data->node_tree = malloc(sizeof(avl_tree_test_t)); CHECK_ALLOC_LOG(data->node_tree, 0); @@ -1096,8 +1123,9 @@ static int init_data(test_data_t *data) static void print_stats(test_data_t *data) { uint resp_count = 0, dname_count = 0, edns_count = 0, node_count = 0, - rdata_count = 0, rrset_count = 0, item_count = 0, - raw_response_count = 0; + rdata_count = 0, rrset_count = 0, item_count = 0, query_count = 0, + raw_query_count = 0, response_count = 0, packet_count = 0, + raw_packet_count = 0, raw_response_count = 0; node *n = NULL; /* Will not be used */ @@ -1135,6 +1163,29 @@ static void print_stats(test_data_t *data) raw_response_count++; } + WALK_LIST(n, data->query_list) { + query_count++; + } + + WALK_LIST(n, data->response_list) { + response_count++; + } + + WALK_LIST(n, data->raw_query_list) { + raw_query_count++; + } + + WALK_LIST(n, data->packet_list) { + packet_count++; + } + + WALK_LIST(n, data->raw_packet_list) { + raw_packet_count++; + } + + + + printf("Loaded: Responses: %d RRSets: %d RDATAs: %d Dnames: %d Nodes: %d Items: %d Raw_responses: %d\n", resp_count, rrset_count, rdata_count, dname_count, node_count, item_count, raw_response_count); diff --git a/src/dnslib/tests/realdata/dnslib_tests_loader_realdata.h b/src/dnslib/tests/realdata/dnslib_tests_loader_realdata.h index db296d46888e4f02595c442dadd8aa46cb1a2826..0fa0a555840734a12e28e8dcea5fd57f1cf96c79 100644 --- a/src/dnslib/tests/realdata/dnslib_tests_loader_realdata.h +++ b/src/dnslib/tests/realdata/dnslib_tests_loader_realdata.h @@ -106,6 +106,7 @@ typedef struct test_rrset test_rrset_t; struct test_response { struct node *next, *prev; /* This is basically same thing as actual response structure */ + uint16_t query; test_dname_t *qname; uint16_t qclass; uint16_t qtype; @@ -141,10 +142,13 @@ struct test_data { list node_list; list rrset_list; list response_list; - list query_list; - list item_list; list raw_response_list; + list query_list; list raw_query_list; + list item_list; + /* responses and queries together */ + list packet_list; + list raw_packet_list; avl_tree_test_t *node_tree; }; diff --git a/src/dnslib/tests/realdata/files/parsed_data b/src/dnslib/tests/realdata/files/parsed_data index 4027c920d2d6372d570efbb2798f40ec194c8135..fe22b9017fc6ee4e1dca6a23bf5bd4e1e639d54b 100644 Binary files a/src/dnslib/tests/realdata/files/parsed_data and b/src/dnslib/tests/realdata/files/parsed_data differ diff --git a/src/dnslib/tests/realdata/files/raw_data b/src/dnslib/tests/realdata/files/raw_data index f94236b9fc5d70073b843252366d7436bea4c503..502005e96b582b149f611e1a1e1feab1d7a696cc 100644 Binary files a/src/dnslib/tests/realdata/files/raw_data and b/src/dnslib/tests/realdata/files/raw_data differ