diff options
author | Philipp Tölke <toelke@in.tum.de> | 2011-04-29 13:13:54 +0000 |
---|---|---|
committer | Philipp Tölke <toelke@in.tum.de> | 2011-04-29 13:13:54 +0000 |
commit | aab9f46b0488e0dd80c728b6d642fa4de853e63f (patch) | |
tree | d6e8be8159cc56917870838b1b27d7b4c8a3c464 | |
parent | 67bb0b2d4c066476d4719b7151bebb3b81c84190 (diff) | |
download | gnunet-aab9f46b0488e0dd80c728b6d642fa4de853e63f.tar.gz gnunet-aab9f46b0488e0dd80c728b6d642fa4de853e63f.zip |
handle the reception of dns-answers in daemon-vpn
-rw-r--r-- | src/vpn/gnunet-daemon-vpn.c | 77 | ||||
-rw-r--r-- | src/vpn/gnunet-daemon-vpn.h | 4 |
2 files changed, 80 insertions, 1 deletions
diff --git a/src/vpn/gnunet-daemon-vpn.c b/src/vpn/gnunet-daemon-vpn.c index 726a013c0..6829b3cd9 100644 --- a/src/vpn/gnunet-daemon-vpn.c +++ b/src/vpn/gnunet-daemon-vpn.c | |||
@@ -237,6 +237,34 @@ new_ip6addr(unsigned char* buf, const GNUNET_HashCode *peer, const GNUNET_HashCo | |||
237 | /*}}}*/ | 237 | /*}}}*/ |
238 | 238 | ||
239 | /** | 239 | /** |
240 | * Create a new Address from an answer-packet | ||
241 | */ | ||
242 | void | ||
243 | new_ip6addr_remote (unsigned char *buf, unsigned char *addr, char addrlen) | ||
244 | { /* {{{ */ | ||
245 | char *ipv6addr; | ||
246 | unsigned long long ipv6prefix; | ||
247 | GNUNET_assert (GNUNET_OK == | ||
248 | GNUNET_CONFIGURATION_get_value_string (cfg, "vpn", | ||
249 | "IPV6ADDR", | ||
250 | &ipv6addr)); | ||
251 | GNUNET_assert (GNUNET_OK == | ||
252 | GNUNET_CONFIGURATION_get_value_number (cfg, "vpn", | ||
253 | "IPV6PREFIX", | ||
254 | &ipv6prefix)); | ||
255 | GNUNET_assert (ipv6prefix < 127); | ||
256 | ipv6prefix = (ipv6prefix + 7) / 8; | ||
257 | |||
258 | inet_pton (AF_INET6, ipv6addr, buf); | ||
259 | GNUNET_free (ipv6addr); | ||
260 | |||
261 | int local_length = 16 - ipv6prefix; | ||
262 | |||
263 | memcpy (buf + ipv6prefix, addr, max (addrlen, local_length)); | ||
264 | } | ||
265 | /*}}}*/ | ||
266 | |||
267 | /** | ||
240 | * This gets scheduled with cls pointing to an answer_packet and does everything | 268 | * This gets scheduled with cls pointing to an answer_packet and does everything |
241 | * needed in order to send it to the helper. | 269 | * needed in order to send it to the helper. |
242 | * | 270 | * |
@@ -360,7 +388,54 @@ process_answer(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc) { | |||
360 | list = GNUNET_malloc(htons(pkt->hdr.size) + 2*sizeof(struct answer_packet_list*)); | 388 | list = GNUNET_malloc(htons(pkt->hdr.size) + 2*sizeof(struct answer_packet_list*)); |
361 | memcpy(&list->pkt, pkt, htons(pkt->hdr.size)); | 389 | memcpy(&list->pkt, pkt, htons(pkt->hdr.size)); |
362 | } | 390 | } |
363 | /* TODO GNUNET_DNS_ANSWER_TYPE_REMOTE */ | 391 | else if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_REMOTE) |
392 | { | ||
393 | pkt->subtype = GNUNET_DNS_ANSWER_TYPE_IP; | ||
394 | |||
395 | GNUNET_HashCode key; | ||
396 | memset(&key, 0, sizeof(GNUNET_HashCode)); | ||
397 | |||
398 | unsigned char* c = ((unsigned char*)pkt)+ntohs(pkt->addroffset); | ||
399 | new_ip6addr_remote(c, &pkt->addr, pkt->addrsize); | ||
400 | unsigned char* k = (unsigned char*)&key; | ||
401 | /* | ||
402 | * Copy the newly generated ip-address to the key backwards (as only the first part is used in the hash-table) | ||
403 | */ | ||
404 | unsigned int i; | ||
405 | for (i = 0; i < 16; i++) | ||
406 | k[15-i] = c[i]; | ||
407 | |||
408 | uint16_t namelen = strlen((char*)pkt->data+12)+1; | ||
409 | |||
410 | struct map_entry* value = GNUNET_malloc(sizeof(struct map_entry) + namelen); | ||
411 | char* name = (char*)(value +1); | ||
412 | |||
413 | value->namelen = namelen; | ||
414 | memcpy(name, pkt->data+12, namelen); | ||
415 | |||
416 | value->addrlen = pkt->addrsize; | ||
417 | memcpy(&value->addr, &pkt->addr, pkt->addrsize); | ||
418 | memset(value->additional_ports, 0, 8192); | ||
419 | |||
420 | memcpy(&value->hash, &key, sizeof(GNUNET_HashCode)); | ||
421 | |||
422 | if (GNUNET_NO == | ||
423 | GNUNET_CONTAINER_multihashmap_contains (hashmap, &key)) | ||
424 | { | ||
425 | GNUNET_CONTAINER_multihashmap_put (hashmap, &key, value, | ||
426 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY); | ||
427 | value->heap_node = GNUNET_CONTAINER_heap_insert (heap, value, | ||
428 | GNUNET_TIME_absolute_get ().abs_value); | ||
429 | if (GNUNET_CONTAINER_heap_get_size(heap) > max_mappings) | ||
430 | GNUNET_SCHEDULER_add_now(collect_mappings, NULL); | ||
431 | } | ||
432 | else | ||
433 | GNUNET_free(value); | ||
434 | |||
435 | list = GNUNET_malloc(htons(pkt->hdr.size) + 2*sizeof(struct answer_packet_list*)); | ||
436 | |||
437 | memcpy(&list->pkt, pkt, htons(pkt->hdr.size)); | ||
438 | } | ||
364 | else | 439 | else |
365 | { | 440 | { |
366 | GNUNET_break(0); | 441 | GNUNET_break(0); |
diff --git a/src/vpn/gnunet-daemon-vpn.h b/src/vpn/gnunet-daemon-vpn.h index 11d3fa43b..3ddd6eef6 100644 --- a/src/vpn/gnunet-daemon-vpn.h +++ b/src/vpn/gnunet-daemon-vpn.h | |||
@@ -70,6 +70,10 @@ extern struct GNUNET_CONTAINER_MultiHashMap* hashmap; | |||
70 | 70 | ||
71 | struct map_entry { | 71 | struct map_entry { |
72 | struct GNUNET_vpn_service_descriptor desc; | 72 | struct GNUNET_vpn_service_descriptor desc; |
73 | |||
74 | char addrlen; | ||
75 | char addr[16]; | ||
76 | |||
73 | struct GNUNET_MESH_Tunnel *tunnel; | 77 | struct GNUNET_MESH_Tunnel *tunnel; |
74 | uint16_t namelen; | 78 | uint16_t namelen; |
75 | char additional_ports[8192]; | 79 | char additional_ports[8192]; |