diff options
author | Philipp Tölke <toelke@in.tum.de> | 2010-09-21 15:14:40 +0000 |
---|---|---|
committer | Philipp Tölke <toelke@in.tum.de> | 2010-09-21 15:14:40 +0000 |
commit | 2d7387bcf63ccf0db74ea96295ec23f4780683e7 (patch) | |
tree | e48757ac8ec52effa1b7854f02bc88adc1c1c92a /src/vpn/gnunet-service-dns.c | |
parent | 5afd08c1faa47523e9d8f52a452e119630636009 (diff) | |
download | gnunet-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.c | 32 |
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 | |||
36 | struct dns_cls { | 35 | struct 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 | |||
44 | static struct dns_cls mycls; | 42 | static struct dns_cls mycls; |
45 | 43 | ||
44 | struct 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 | }; | ||
50 | static struct dns_query_id_state query_states[65536]; /* This is < 1MiB */ | ||
51 | |||
46 | void hijack(unsigned short port) { | 52 | void 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; |