split the dns-datastructure
authorPhilipp Tölke <toelke@in.tum.de>
Tue, 5 Oct 2010 18:20:19 +0000 (18:20 +0000)
committerPhilipp Tölke <toelke@in.tum.de>
Tue, 5 Oct 2010 18:20:19 +0000 (18:20 +0000)
src/vpn/gnunet-service-dns.c
src/vpn/gnunet-vpn-packet.h
src/vpn/gnunet-vpn-pretty-print.c

index e40b2c5c46acf1c8b33f85c14c0a79384e5e8eb0..a3322f7eab24e2d35b0ae73af036e5d7236c7aa1 100644 (file)
@@ -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);
index 7eb1afe8c3e6760485a54b49763ad98eeef27b7b..0659215cb5aa6ec17e6f8290337aa46754e64e9f 100644 (file)
@@ -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;
index f620e84fa82771ee3c22b3d6b1f14b568fcb9d2b..e8fe4c7224e4ecea712c01371ea599ffc041dee4 100644 (file)
@@ -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);