From bd4b7b43485ed8cf1817f41cd8793885a3a5b5c5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Philipp=20T=C3=B6lke?= Date: Tue, 5 Oct 2010 18:20:19 +0000 Subject: [PATCH] split the dns-datastructure --- src/vpn/gnunet-service-dns.c | 18 +++++++++--------- src/vpn/gnunet-vpn-packet.h | 14 +++++++++++++- src/vpn/gnunet-vpn-pretty-print.c | 16 ++++++++-------- 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/vpn/gnunet-service-dns.c b/src/vpn/gnunet-service-dns.c index e40b2c5c4..a3322f7ea 100644 --- a/src/vpn/gnunet-service-dns.c +++ b/src/vpn/gnunet-service-dns.c @@ -79,10 +79,10 @@ void receive_query(void *cls, struct GNUNET_SERVER_Client *client, const struct dest.sin_port = htons(53); dest.sin_addr.s_addr = pkt->orig_to; - query_states[dns->id].valid = 1; - query_states[dns->id].client = client; - query_states[dns->id].local_ip = pkt->orig_from; - query_states[dns->id].local_port = pkt->src_port; + query_states[dns->s.id].valid = 1; + query_states[dns->s.id].client = client; + query_states[dns->s.id].local_ip = pkt->orig_from; + query_states[dns->s.id].local_port = pkt->src_port; /* int r = */ GNUNET_NETWORK_socket_sendto(mycls.dnsout, dns, ntohs(pkt->hdr.size) - sizeof(struct query_packet) + 1, (struct sockaddr*) &dest, sizeof dest); @@ -124,21 +124,21 @@ static void read_response (void *cls, const struct GNUNET_SCHEDULER_TaskContext /* if (r < 0) TODO */ - if (query_states[dns->id].valid == 1) { - query_states[dns->id].valid = 0; + if (query_states[dns->s.id].valid == 1) { + query_states[dns->s.id].valid = 0; size_t len = sizeof(struct answer_packet) + r - 1; /* 1 for the unsigned char data[1]; */ struct answer_packet_list* answer = GNUNET_malloc(len + 2*sizeof(struct answer_packet_list*)); answer->pkt.hdr.type = htons(GNUNET_MESSAGE_TYPE_LOCAL_RESPONSE_DNS); answer->pkt.hdr.size = htons(len); answer->pkt.from = addr.sin_addr.s_addr; - answer->pkt.to = query_states[dns->id].local_ip; - answer->pkt.dst_port = query_states[dns->id].local_port; + answer->pkt.to = query_states[dns->s.id].local_ip; + answer->pkt.dst_port = query_states[dns->s.id].local_port; memcpy(answer->pkt.data, buf, r); GNUNET_CONTAINER_DLL_insert_after(mycls.head, mycls.tail, mycls.tail, answer); - /* struct GNUNET_CONNECTION_TransmitHandle* th = */ GNUNET_SERVER_notify_transmit_ready(query_states[dns->id].client, len, GNUNET_TIME_UNIT_FOREVER_REL, &send_answer, query_states[dns->id].client); + /* struct GNUNET_CONNECTION_TransmitHandle* th = */ GNUNET_SERVER_notify_transmit_ready(query_states[dns->s.id].client, len, GNUNET_TIME_UNIT_FOREVER_REL, &send_answer, query_states[dns->s.id].client); } GNUNET_SCHEDULER_add_read_net(mycls.sched, GNUNET_TIME_UNIT_FOREVER_REL, mycls.dnsout, &read_response, NULL); diff --git a/src/vpn/gnunet-vpn-packet.h b/src/vpn/gnunet-vpn-packet.h index 7eb1afe8c..0659215cb 100644 --- a/src/vpn/gnunet-vpn-packet.h +++ b/src/vpn/gnunet-vpn-packet.h @@ -61,7 +61,7 @@ struct udp_pkt { }; // DNS-Stuff -struct dns_pkt { +struct dns_static { unsigned short id GNUNET_PACKED; unsigned rd:1 GNUNET_PACKED; // recursion desired (client -> server) @@ -83,9 +83,21 @@ struct dns_pkt { unsigned short ancount GNUNET_PACKED; // number of answers unsigned short nscount GNUNET_PACKED; // number of authority-records unsigned short arcount GNUNET_PACKED; // number of additional records +}; + +struct dns_pkt { + struct dns_static s; unsigned char data[1]; }; +struct dns_pkt_parsed { + struct dns_static s; + struct dns_query* queries; + struct dns_record* answers; + struct dns_record* nameservers; + struct dns_record* additional; +}; + struct dns_query { unsigned char* name; unsigned short qtype; diff --git a/src/vpn/gnunet-vpn-pretty-print.c b/src/vpn/gnunet-vpn-pretty-print.c index f620e84fa..e8fe4c722 100644 --- a/src/vpn/gnunet-vpn-pretty-print.c +++ b/src/vpn/gnunet-vpn-pretty-print.c @@ -262,14 +262,14 @@ static char* dns_classes(short class) { /* {{{ */ void pkt_printf_dns(struct dns_pkt* pkt) {{{ printf("DNS-Packet:\n"); - printf("\tid: %d\n", ntohs(pkt->id)); - printf("\t%d: %s\n", pkt->qr, pkt->qr == 0 ? "query" : "response"); - printf("\top: %s\n", (char*[]){"query", "inverse q.", "status", "inval"}[pkt->op]); - printf("\trecursion is%s desired\n", pkt->rd == 0 ? " not" : ""); - unsigned short qdcount = ntohs(pkt->qdcount); - unsigned short ancount = ntohs(pkt->ancount); - unsigned short nscount = ntohs(pkt->nscount); - unsigned short arcount = ntohs(pkt->arcount); + printf("\tid: %d\n", ntohs(pkt->s.id)); + printf("\t%d: %s\n", pkt->s.qr, pkt->s.qr == 0 ? "query" : "response"); + printf("\top: %s\n", (char*[]){"query", "inverse q.", "status", "inval"}[pkt->s.op]); + printf("\trecursion is%s desired\n", pkt->s.rd == 0 ? " not" : ""); + unsigned short qdcount = ntohs(pkt->s.qdcount); + unsigned short ancount = ntohs(pkt->s.ancount); + unsigned short nscount = ntohs(pkt->s.nscount); + unsigned short arcount = ntohs(pkt->s.arcount); printf("\t#qd: %d\n", qdcount); printf("\t#an: %d\n", ancount); printf("\t#ns: %d\n", nscount); -- 2.25.1