aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPhilipp Tölke <toelke@in.tum.de>2010-10-26 13:55:56 +0000
committerPhilipp Tölke <toelke@in.tum.de>2010-10-26 13:55:56 +0000
commit4b082a48b93980cfd1c85371ca75d4909716911c (patch)
treee37eae1bab784be0d408bba829f45c16849109d1 /src
parent8441a5c3976e209805c862081d0987a74a7bb929 (diff)
downloadgnunet-4b082a48b93980cfd1c85371ca75d4909716911c.tar.gz
gnunet-4b082a48b93980cfd1c85371ca75d4909716911c.zip
Answer questions for .gnunet with an ipv6-address
Diffstat (limited to 'src')
-rw-r--r--src/vpn/gnunet-daemon-vpn.c29
-rw-r--r--src/vpn/gnunet-service-dns-p.h6
-rw-r--r--src/vpn/gnunet-service-dns.c49
-rw-r--r--src/vpn/gnunet-vpn-packet.h13
4 files changed, 84 insertions, 13 deletions
diff --git a/src/vpn/gnunet-daemon-vpn.c b/src/vpn/gnunet-daemon-vpn.c
index 227bcd9ae..a02af54a2 100644
--- a/src/vpn/gnunet-daemon-vpn.c
+++ b/src/vpn/gnunet-daemon-vpn.c
@@ -36,6 +36,7 @@
36#include "gnunet-service-dns-p.h" 36#include "gnunet-service-dns-p.h"
37#include "gnunet_client_lib.h" 37#include "gnunet_client_lib.h"
38#include "gnunet_container_lib.h" 38#include "gnunet_container_lib.h"
39#include "block_dns.h"
39 40
40/** 41/**
41 * Final status code. 42 * Final status code.
@@ -307,8 +308,25 @@ static void
307process_answer(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc) { 308process_answer(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc) {
308 struct answer_packet* pkt = cls; 309 struct answer_packet* pkt = cls;
309 310
310 if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_IP) 311 if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_SERVICE)
311 { 312 {
313 pkt->subtype = GNUNET_DNS_ANSWER_TYPE_IP;
314 unsigned char ip6addr[16];
315 memcpy(ip6addr, (int[]){htons(0x1234)}, 2);
316 memcpy(ip6addr+2, &pkt->peer, 7);
317 memcpy(ip6addr+9, &pkt->service_descriptor, 7);
318
319 memcpy(((char*)pkt)+ntohs(pkt->addroffset), ip6addr, 16);
320
321 /*FIXME:
322 * -save DNS_Record into hashmap, pointed to by ip
323 * -regularily walk through hashmap, deleting old entries
324 * when is an entry old?
325 * have a last-used field
326 * don't remove if last-used "recent", ask dht again if record expired
327 */
328 }
329
312 struct answer_packet_list* list = GNUNET_malloc(htons(pkt->hdr.size) + 2*sizeof(struct answer_packet_list*)); 330 struct answer_packet_list* list = GNUNET_malloc(htons(pkt->hdr.size) + 2*sizeof(struct answer_packet_list*));
313 331
314 memcpy(&list->pkt, pkt, htons(pkt->hdr.size)); 332 memcpy(&list->pkt, pkt, htons(pkt->hdr.size));
@@ -318,15 +336,6 @@ process_answer(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc) {
318 GNUNET_SCHEDULER_add_write_file (mycls.sched, GNUNET_TIME_UNIT_FOREVER_REL, mycls.fh_to_helper, &helper_write, NULL); 336 GNUNET_SCHEDULER_add_write_file (mycls.sched, GNUNET_TIME_UNIT_FOREVER_REL, mycls.fh_to_helper, &helper_write, NULL);
319 337
320 return; 338 return;
321 }
322
323 if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_SERVICE)
324 {
325 /*FIXME:
326 * -find new IP-address for this service
327 * -create a DNS-Answer
328 */
329 }
330} 339}
331 340
332static void 341static void
diff --git a/src/vpn/gnunet-service-dns-p.h b/src/vpn/gnunet-service-dns-p.h
index 1e25daa90..690a947a6 100644
--- a/src/vpn/gnunet-service-dns-p.h
+++ b/src/vpn/gnunet-service-dns-p.h
@@ -40,6 +40,12 @@ struct answer_packet {
40 unsigned dst_port:16 GNUNET_PACKED; 40 unsigned dst_port:16 GNUNET_PACKED;
41 41
42 unsigned short id GNUNET_PACKED; 42 unsigned short id GNUNET_PACKED;
43 GNUNET_HashCode peer;
44 GNUNET_HashCode service_descriptor;
45 uint64_t ports;
46 uint32_t service_type;
47
48 unsigned addroffset:16 GNUNET_PACKED;
43 49
44 unsigned char data[1]; 50 unsigned char data[1];
45}; 51};
diff --git a/src/vpn/gnunet-service-dns.c b/src/vpn/gnunet-service-dns.c
index 4849749c0..9732f90c4 100644
--- a/src/vpn/gnunet-service-dns.c
+++ b/src/vpn/gnunet-service-dns.c
@@ -61,6 +61,8 @@ struct dns_query_id_state {
61 unsigned local_ip:32; 61 unsigned local_ip:32;
62 unsigned remote_ip:32; 62 unsigned remote_ip:32;
63 unsigned local_port:16; 63 unsigned local_port:16;
64 char* name;
65 unsigned namelen:8;
64}; 66};
65static struct dns_query_id_state query_states[65536]; /* This is < 1.5MiB */ 67static struct dns_query_id_state query_states[65536]; /* This is < 1.5MiB */
66 68
@@ -108,20 +110,58 @@ void receive_dht(void *cls,
108 const struct GNUNET_DNS_Record* rec = data; 110 const struct GNUNET_DNS_Record* rec = data;
109 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Got block of size %d, peer: %08x, desc: %08x\n", size, *((unsigned int*)&rec->peer), *((unsigned int*)&rec->service_descriptor)); 111 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Got block of size %d, peer: %08x, desc: %08x\n", size, *((unsigned int*)&rec->peer), *((unsigned int*)&rec->service_descriptor));
110 112
111 size_t len = sizeof(struct answer_packet) + size - 1; /* 1 for the unsigned char data[1]; */ 113 size_t len = sizeof(struct answer_packet) - 1 \
114 + sizeof(struct dns_static) \
115 + query_states[id].namelen \
116 + sizeof(struct dns_query_line) \
117 + 2 /* To hold the pointer to the name */ \
118 + sizeof(struct dns_record_line) - 1 \
119 + 16;
120 ;
112 struct answer_packet_list* answer = GNUNET_malloc(len + 2*sizeof(struct answer_packet_list*)); 121 struct answer_packet_list* answer = GNUNET_malloc(len + 2*sizeof(struct answer_packet_list*));
122 memset(answer, 0, len + 2*sizeof(struct answer_packet_list*));
123
113 answer->pkt.hdr.type = htons(GNUNET_MESSAGE_TYPE_LOCAL_RESPONSE_DNS); 124 answer->pkt.hdr.type = htons(GNUNET_MESSAGE_TYPE_LOCAL_RESPONSE_DNS);
114 answer->pkt.hdr.size = htons(len); 125 answer->pkt.hdr.size = htons(len);
115 answer->pkt.subtype = GNUNET_DNS_ANSWER_TYPE_SERVICE; 126 answer->pkt.subtype = GNUNET_DNS_ANSWER_TYPE_SERVICE;
116 127
128 GNUNET_CRYPTO_hash(&rec->peer, sizeof(struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), &answer->pkt.peer);
129 memcpy(&answer->pkt.service_descriptor, &rec->service_descriptor, sizeof(GNUNET_HashCode));
130 memcpy(&answer->pkt.service_type, &rec->service_type, sizeof(answer->pkt.service_type));
131 memcpy(&answer->pkt.ports, &rec->ports, sizeof(answer->pkt.ports));
132
117 answer->pkt.from = query_states[id].remote_ip; 133 answer->pkt.from = query_states[id].remote_ip;
118 134
119 answer->pkt.to = query_states[id].local_ip; 135 answer->pkt.to = query_states[id].local_ip;
120 answer->pkt.dst_port = query_states[id].local_port; 136 answer->pkt.dst_port = query_states[id].local_port;
121 137
122 answer->pkt.id = id; 138 struct dns_pkt *dpkt = (struct dns_pkt*)answer->pkt.data;
139
140 dpkt->s.id = id;
141 dpkt->s.aa = 1;
142 dpkt->s.qr = 1;
143 dpkt->s.ra = 1;
144 dpkt->s.qdcount = htons(1);
145 dpkt->s.ancount = htons(1);
146
147 memcpy(dpkt->data, query_states[id].name, query_states[id].namelen);
148 GNUNET_free(query_states[id].name);
149
150
151 struct dns_query_line* dque = (struct dns_query_line*)(dpkt->data+(query_states[id].namelen));
152 dque->type = htons(28);
153 dque->class = htons(1);
154
155 char* anname = (char*)(dpkt->data+(query_states[id].namelen)+sizeof(struct dns_query_line));
156 memcpy(anname, (char[]){0xc0, 0x0c}, 2);
157
158 struct dns_record_line *drec_data = (struct dns_record_line*)(dpkt->data+(query_states[id].namelen)+sizeof(struct dns_query_line)+2);
159 drec_data->type = htons(28); /* AAAA */
160 drec_data->class = htons(1); /* IN */
161 drec_data->ttl = htonl(3600); /* FIXME: read from block */
162 drec_data->data_len = htons(16);
123 163
124 memcpy(answer->pkt.data, data, size); 164 answer->pkt.addroffset = htons((unsigned short)((unsigned long)(&drec_data->data)-(unsigned long)(&answer->pkt)));
125 165
126 GNUNET_CONTAINER_DLL_insert_after(mycls.head, mycls.tail, mycls.tail, answer); 166 GNUNET_CONTAINER_DLL_insert_after(mycls.head, mycls.tail, mycls.tail, answer);
127 167
@@ -156,6 +196,9 @@ void receive_query(void *cls, struct GNUNET_SERVER_Client *client, const struct
156 query_states[dns->s.id].local_ip = pkt->orig_from; 196 query_states[dns->s.id].local_ip = pkt->orig_from;
157 query_states[dns->s.id].local_port = pkt->src_port; 197 query_states[dns->s.id].local_port = pkt->src_port;
158 query_states[dns->s.id].remote_ip = pkt->orig_to; 198 query_states[dns->s.id].remote_ip = pkt->orig_to;
199 query_states[dns->s.id].namelen = strlen((char*)dns->data) + 1;
200 query_states[dns->s.id].name = GNUNET_malloc(query_states[dns->s.id].namelen);
201 memcpy(query_states[dns->s.id].name, dns->data, query_states[dns->s.id].namelen);
159 202
160 if (pdns->queries[0]->namelen > 9 && 203 if (pdns->queries[0]->namelen > 9 &&
161 0 == strncmp(pdns->queries[0]->name+(pdns->queries[0]->namelen - 9), ".gnunet.", 9)) { 204 0 == strncmp(pdns->queries[0]->name+(pdns->queries[0]->namelen - 9), ".gnunet.", 9)) {
diff --git a/src/vpn/gnunet-vpn-packet.h b/src/vpn/gnunet-vpn-packet.h
index 3df33a3f1..6f453d9fd 100644
--- a/src/vpn/gnunet-vpn-packet.h
+++ b/src/vpn/gnunet-vpn-packet.h
@@ -98,6 +98,11 @@ struct dns_pkt_parsed {
98 struct dns_record** additional; 98 struct dns_record** additional;
99}; 99};
100 100
101struct dns_query_line {
102 unsigned short type;
103 unsigned short class;
104};
105
101struct dns_query { 106struct dns_query {
102 char* name; 107 char* name;
103 unsigned char namelen; 108 unsigned char namelen;
@@ -105,6 +110,14 @@ struct dns_query {
105 unsigned short qclass; 110 unsigned short qclass;
106}; 111};
107 112
113struct dns_record_line {
114 unsigned short type;
115 unsigned short class;
116 unsigned int ttl;
117 unsigned short data_len;
118 unsigned char data;
119};
120
108struct dns_record { 121struct dns_record {
109 char* name; 122 char* name;
110 unsigned char namelen; 123 unsigned char namelen;