aboutsummaryrefslogtreecommitdiff
path: root/src/vpn/gnunet-service-dns.c
diff options
context:
space:
mode:
authorPhilipp Tölke <toelke@in.tum.de>2010-09-21 15:14:40 +0000
committerPhilipp Tölke <toelke@in.tum.de>2010-09-21 15:14:40 +0000
commit2d7387bcf63ccf0db74ea96295ec23f4780683e7 (patch)
treee48757ac8ec52effa1b7854f02bc88adc1c1c92a /src/vpn/gnunet-service-dns.c
parent5afd08c1faa47523e9d8f52a452e119630636009 (diff)
downloadgnunet-2d7387bcf63ccf0db74ea96295ec23f4780683e7.tar.gz
gnunet-2d7387bcf63ccf0db74ea96295ec23f4780683e7.zip
save a bit of state
Diffstat (limited to 'src/vpn/gnunet-service-dns.c')
-rw-r--r--src/vpn/gnunet-service-dns.c32
1 files changed, 26 insertions, 6 deletions
diff --git a/src/vpn/gnunet-service-dns.c b/src/vpn/gnunet-service-dns.c
index b05bfd17f..351df68a6 100644
--- a/src/vpn/gnunet-service-dns.c
+++ b/src/vpn/gnunet-service-dns.c
@@ -32,7 +32,6 @@
32#include "gnunet-vpn-packet.h" 32#include "gnunet-vpn-packet.h"
33#include "gnunet-vpn-pretty-print.h" 33#include "gnunet-vpn-pretty-print.h"
34 34
35
36struct dns_cls { 35struct dns_cls {
37 struct GNUNET_SCHEDULER_Handle *sched; 36 struct GNUNET_SCHEDULER_Handle *sched;
38 37
@@ -40,9 +39,16 @@ struct dns_cls {
40 39
41 unsigned short dnsoutport; 40 unsigned short dnsoutport;
42}; 41};
43
44static struct dns_cls mycls; 42static struct dns_cls mycls;
45 43
44struct dns_query_id_state {
45 unsigned valid:1;
46 struct GNUNET_SERVER_Client* client;
47 unsigned local_ip:32;
48 unsigned local_port:16;
49};
50static struct dns_query_id_state query_states[65536]; /* This is < 1MiB */
51
46void hijack(unsigned short port) { 52void hijack(unsigned short port) {
47 char port_s[6]; 53 char port_s[6];
48 54
@@ -69,9 +75,11 @@ void receive_query(void *cls, struct GNUNET_SERVER_Client *client, const struct
69 memset(&dest, 0, sizeof dest); 75 memset(&dest, 0, sizeof dest);
70 dest.sin_port = htons(53); 76 dest.sin_port = htons(53);
71 dest.sin_addr.s_addr = pkt->orig_to; 77 dest.sin_addr.s_addr = pkt->orig_to;
72 /* TODO: 78
73 * State merken, damit die Antwort korrekt zurückgeschickt werden kann 79 query_states[dns->id].valid = 1;
74 */ 80 query_states[dns->id].client = client;
81 query_states[dns->id].local_ip = pkt->orig_from;
82 query_states[dns->id].local_port = pkt->src_port;
75 83
76 int r = GNUNET_NETWORK_socket_sendto(mycls.dnsout, dns, ntohs(pkt->hdr.size) - sizeof(struct query_packet) + 1, (struct sockaddr*) &dest, sizeof dest); 84 int r = GNUNET_NETWORK_socket_sendto(mycls.dnsout, dns, ntohs(pkt->hdr.size) - sizeof(struct query_packet) + 1, (struct sockaddr*) &dest, sizeof dest);
77 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "send %d bytes to socket\n", r); 85 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "send %d bytes to socket\n", r);
@@ -89,7 +97,11 @@ static void read_response (void *cls, const struct GNUNET_SCHEDULER_TaskContext
89 int r; 97 int r;
90 r = GNUNET_NETWORK_socket_recv(mycls.dnsout, buf, 65536); 98 r = GNUNET_NETWORK_socket_recv(mycls.dnsout, buf, 65536);
91 99
92 pkt_printf_dns(dns); 100 if (query_states[dns->id].valid == 1) {
101 query_states[dns->id].valid = 0;
102
103 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Would send answer to Client %x, to IP %x:%d\n", query_states[dns->id].client, ntohl(query_states[dns->id].local_ip), ntohs(query_states[dns->id].local_port));
104 }
93 105
94 GNUNET_SCHEDULER_add_read_net(mycls.sched, GNUNET_TIME_UNIT_FOREVER_REL, mycls.dnsout, &read_response, NULL); 106 GNUNET_SCHEDULER_add_read_net(mycls.sched, GNUNET_TIME_UNIT_FOREVER_REL, mycls.dnsout, &read_response, NULL);
95} 107}
@@ -125,6 +137,14 @@ run (void *cls,
125 {&receive_query, NULL, GNUNET_MESSAGE_TYPE_LOCAL_QUERY_DNS, 0}, 137 {&receive_query, NULL, GNUNET_MESSAGE_TYPE_LOCAL_QUERY_DNS, 0},
126 {NULL, NULL, 0, 0} 138 {NULL, NULL, 0, 0}
127 }; 139 };
140
141 {
142 int i;
143 for (i = 0; i < 65536; i++) {
144 query_states[i].valid = 0;
145 }
146 }
147
128 struct sockaddr_in addr; 148 struct sockaddr_in addr;
129 149
130 mycls.sched = sched; 150 mycls.sched = sched;