diff options
author | Philipp Tölke <toelke@in.tum.de> | 2011-07-27 07:28:20 +0000 |
---|---|---|
committer | Philipp Tölke <toelke@in.tum.de> | 2011-07-27 07:28:20 +0000 |
commit | 51074a30f34eee12cb388451a0fd94bfa78d3dd4 (patch) | |
tree | 65d83b65034041a8c4c2be69a88a21f8131fac85 /src/vpn/gnunet-daemon-vpn.c | |
parent | 2bafcee957905f901c23507d9542e5e2d75a17d9 (diff) | |
download | gnunet-51074a30f34eee12cb388451a0fd94bfa78d3dd4.tar.gz gnunet-51074a30f34eee12cb388451a0fd94bfa78d3dd4.zip |
begin resolving A-records
Diffstat (limited to 'src/vpn/gnunet-daemon-vpn.c')
-rw-r--r-- | src/vpn/gnunet-daemon-vpn.c | 113 |
1 files changed, 110 insertions, 3 deletions
diff --git a/src/vpn/gnunet-daemon-vpn.c b/src/vpn/gnunet-daemon-vpn.c index ece7b554a..257ab22b8 100644 --- a/src/vpn/gnunet-daemon-vpn.c +++ b/src/vpn/gnunet-daemon-vpn.c | |||
@@ -200,7 +200,6 @@ send_pkt_to_peer_notify_callback (void *cls, size_t size, void *buf) | |||
200 | GNUNET_assert (size >= ntohs (hdr->size)); | 200 | GNUNET_assert (size >= ntohs (hdr->size)); |
201 | memcpy (buf, hdr, ntohs (hdr->size)); | 201 | memcpy (buf, hdr, ntohs (hdr->size)); |
202 | size = ntohs(hdr->size); | 202 | size = ntohs(hdr->size); |
203 | GNUNET_free (cls); | ||
204 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sent!\n"); | 203 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sent!\n"); |
205 | 204 | ||
206 | if (NULL != GNUNET_MESH_tunnel_get_head(*tunnel)) | 205 | if (NULL != GNUNET_MESH_tunnel_get_head(*tunnel)) |
@@ -225,6 +224,7 @@ send_pkt_to_peer_notify_callback (void *cls, size_t size, void *buf) | |||
225 | /* save the handle */ | 224 | /* save the handle */ |
226 | GNUNET_MESH_tunnel_set_data(*tunnel, th); | 225 | GNUNET_MESH_tunnel_set_data(*tunnel, th); |
227 | } | 226 | } |
227 | GNUNET_free (cls); | ||
228 | 228 | ||
229 | return size; | 229 | return size; |
230 | } | 230 | } |
@@ -331,7 +331,60 @@ new_ip6addr_remote (unsigned char *buf, unsigned char *addr, char addrlen) | |||
331 | 331 | ||
332 | int local_length = 16 - ipv6prefix; | 332 | int local_length = 16 - ipv6prefix; |
333 | 333 | ||
334 | memcpy (buf + ipv6prefix, addr, GNUNET_MAX (addrlen, local_length)); | 334 | memcpy (buf + ipv6prefix, addr, GNUNET_MIN (addrlen, local_length)); |
335 | } | ||
336 | /*}}}*/ | ||
337 | |||
338 | /** | ||
339 | * Create a new Address from an answer-packet | ||
340 | */ | ||
341 | void | ||
342 | new_ip4addr_remote (unsigned char *buf, unsigned char *addr, char addrlen) | ||
343 | { /* {{{ */ | ||
344 | char *ipv4addr; | ||
345 | char *ipv4mask; | ||
346 | GNUNET_assert (GNUNET_OK == | ||
347 | GNUNET_CONFIGURATION_get_value_string (cfg, "vpn", | ||
348 | "IPV4ADDR", | ||
349 | &ipv4addr)); | ||
350 | GNUNET_assert (GNUNET_OK == | ||
351 | GNUNET_CONFIGURATION_get_value_string (cfg, "vpn", | ||
352 | "IPV4MASK", | ||
353 | &ipv4mask)); | ||
354 | uint32_t mask; | ||
355 | inet_pton (AF_INET, ipv4addr, buf); | ||
356 | int r = inet_pton (AF_INET, ipv4mask, &mask); | ||
357 | mask = htonl(mask); | ||
358 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "inet_pton: %d; %m; mask: %08x\n", r, mask); | ||
359 | |||
360 | GNUNET_free (ipv4addr); | ||
361 | |||
362 | int c; | ||
363 | |||
364 | if (mask) | ||
365 | { | ||
366 | mask = (mask ^ (mask - 1)) >> 1; | ||
367 | for (c = 0; mask; c++) | ||
368 | { | ||
369 | mask >>= 1; | ||
370 | } | ||
371 | } | ||
372 | else | ||
373 | { | ||
374 | c = CHAR_BIT * sizeof(mask); | ||
375 | } | ||
376 | |||
377 | c = 32-c; | ||
378 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "The mask %s has %d leading 1s.\n", ipv4mask, c); | ||
379 | |||
380 | GNUNET_free (ipv4mask); | ||
381 | |||
382 | if (c % 8 == 0) | ||
383 | c = c / 8; | ||
384 | else | ||
385 | GNUNET_assert(0); | ||
386 | |||
387 | memcpy (buf + c, addr, GNUNET_MIN (addrlen, c)); | ||
335 | } | 388 | } |
336 | /*}}}*/ | 389 | /*}}}*/ |
337 | 390 | ||
@@ -463,7 +516,7 @@ process_answer(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc) { | |||
463 | list = GNUNET_malloc(htons(pkt->hdr.size) + 2*sizeof(struct answer_packet_list*)); | 516 | list = GNUNET_malloc(htons(pkt->hdr.size) + 2*sizeof(struct answer_packet_list*)); |
464 | memcpy(&list->pkt, pkt, htons(pkt->hdr.size)); | 517 | memcpy(&list->pkt, pkt, htons(pkt->hdr.size)); |
465 | } | 518 | } |
466 | else if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_REMOTE) | 519 | else if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_REMOTE_AAAA) |
467 | { | 520 | { |
468 | pkt->subtype = GNUNET_DNS_ANSWER_TYPE_IP; | 521 | pkt->subtype = GNUNET_DNS_ANSWER_TYPE_IP; |
469 | 522 | ||
@@ -529,6 +582,60 @@ process_answer(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc) { | |||
529 | 582 | ||
530 | memcpy(&list->pkt, pkt, htons(pkt->hdr.size)); | 583 | memcpy(&list->pkt, pkt, htons(pkt->hdr.size)); |
531 | } | 584 | } |
585 | else if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_REMOTE_A) | ||
586 | { | ||
587 | pkt->subtype = GNUNET_DNS_ANSWER_TYPE_IP; | ||
588 | |||
589 | GNUNET_HashCode key; | ||
590 | memset(&key, 0, sizeof(GNUNET_HashCode)); | ||
591 | |||
592 | unsigned char* c = ((unsigned char*)pkt)+ntohs(pkt->addroffset); | ||
593 | new_ip4addr_remote(c, pkt->addr, pkt->addrsize); | ||
594 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "New mapping to %d.%d.%d.%d\n", | ||
595 | c[0], | ||
596 | c[1], | ||
597 | c[2], | ||
598 | c[3]); | ||
599 | unsigned char* k = (unsigned char*)&key; | ||
600 | /* | ||
601 | * Copy the newly generated ip-address to the key backwards (as only the first part is used in the hash-table) | ||
602 | */ | ||
603 | unsigned int i; | ||
604 | for (i = 0; i < 4; i++) | ||
605 | k[3-i] = c[i]; | ||
606 | |||
607 | uint16_t namelen = strlen((char*)pkt->data+12)+1; | ||
608 | |||
609 | struct map_entry* value = GNUNET_malloc(sizeof(struct map_entry) + namelen); | ||
610 | char* name = (char*)(value +1); | ||
611 | |||
612 | value->namelen = namelen; | ||
613 | memcpy(name, pkt->data+12, namelen); | ||
614 | |||
615 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Setting addrlen to %d\n", pkt->addrsize); | ||
616 | value->addrlen = pkt->addrsize; | ||
617 | memcpy(&value->addr, &pkt->addr, pkt->addrsize); | ||
618 | memset(value->additional_ports, 0, 8192); | ||
619 | |||
620 | memcpy(&value->hash, &key, sizeof(GNUNET_HashCode)); | ||
621 | |||
622 | if (GNUNET_NO == | ||
623 | GNUNET_CONTAINER_multihashmap_contains (hashmap, &key)) | ||
624 | { | ||
625 | GNUNET_CONTAINER_multihashmap_put (hashmap, &key, value, | ||
626 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY); | ||
627 | value->heap_node = GNUNET_CONTAINER_heap_insert (heap, value, | ||
628 | GNUNET_TIME_absolute_get ().abs_value); | ||
629 | if (GNUNET_CONTAINER_heap_get_size(heap) > max_mappings) | ||
630 | GNUNET_SCHEDULER_add_now(collect_mappings, NULL); | ||
631 | } | ||
632 | else | ||
633 | GNUNET_free(value); | ||
634 | |||
635 | list = GNUNET_malloc(htons(pkt->hdr.size) + 2*sizeof(struct answer_packet_list*)); | ||
636 | |||
637 | memcpy(&list->pkt, pkt, htons(pkt->hdr.size)); | ||
638 | } | ||
532 | else | 639 | else |
533 | { | 640 | { |
534 | GNUNET_break(0); | 641 | GNUNET_break(0); |