diff options
author | Philipp Tölke <toelke@in.tum.de> | 2010-10-26 13:55:56 +0000 |
---|---|---|
committer | Philipp Tölke <toelke@in.tum.de> | 2010-10-26 13:55:56 +0000 |
commit | 4b082a48b93980cfd1c85371ca75d4909716911c (patch) | |
tree | e37eae1bab784be0d408bba829f45c16849109d1 /src | |
parent | 8441a5c3976e209805c862081d0987a74a7bb929 (diff) | |
download | gnunet-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.c | 29 | ||||
-rw-r--r-- | src/vpn/gnunet-service-dns-p.h | 6 | ||||
-rw-r--r-- | src/vpn/gnunet-service-dns.c | 49 | ||||
-rw-r--r-- | src/vpn/gnunet-vpn-packet.h | 13 |
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 | |||
307 | process_answer(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc) { | 308 | process_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 | ||
332 | static void | 341 | static 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 | }; |
65 | static struct dns_query_id_state query_states[65536]; /* This is < 1.5MiB */ | 67 | static 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 | ||
101 | struct dns_query_line { | ||
102 | unsigned short type; | ||
103 | unsigned short class; | ||
104 | }; | ||
105 | |||
101 | struct dns_query { | 106 | struct 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 | ||
113 | struct 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 | |||
108 | struct dns_record { | 121 | struct dns_record { |
109 | char* name; | 122 | char* name; |
110 | unsigned char namelen; | 123 | unsigned char namelen; |