aboutsummaryrefslogtreecommitdiff
path: root/src/vpn/gnunet-daemon-vpn.c
diff options
context:
space:
mode:
authorPhilipp Tölke <toelke@in.tum.de>2011-07-27 07:28:20 +0000
committerPhilipp Tölke <toelke@in.tum.de>2011-07-27 07:28:20 +0000
commit51074a30f34eee12cb388451a0fd94bfa78d3dd4 (patch)
tree65d83b65034041a8c4c2be69a88a21f8131fac85 /src/vpn/gnunet-daemon-vpn.c
parent2bafcee957905f901c23507d9542e5e2d75a17d9 (diff)
downloadgnunet-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.c113
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 */
341void
342new_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);