aboutsummaryrefslogtreecommitdiff
path: root/src/pt
diff options
context:
space:
mode:
Diffstat (limited to 'src/pt')
-rw-r--r--src/pt/gnunet-daemon-pt.c139
1 files changed, 92 insertions, 47 deletions
diff --git a/src/pt/gnunet-daemon-pt.c b/src/pt/gnunet-daemon-pt.c
index 7f4852e4b..443ff8ae6 100644
--- a/src/pt/gnunet-daemon-pt.c
+++ b/src/pt/gnunet-daemon-pt.c
@@ -333,7 +333,11 @@ try_open_exit ()
333 struct CadetExit *pos; 333 struct CadetExit *pos;
334 uint32_t candidate_count; 334 uint32_t candidate_count;
335 uint32_t candidate_selected; 335 uint32_t candidate_selected;
336 struct GNUNET_HashCode port;
336 337
338 GNUNET_CRYPTO_hash (GNUNET_APPLICATION_PORT_INTERNET_RESOLVER,
339 strlen (GNUNET_APPLICATION_PORT_INTERNET_RESOLVER),
340 &port);
337 candidate_count = 0; 341 candidate_count = 0;
338 for (pos = exit_head; NULL != pos; pos = pos->next) 342 for (pos = exit_head; NULL != pos; pos = pos->next)
339 if (NULL == pos->cadet_channel) 343 if (NULL == pos->cadet_channel)
@@ -348,11 +352,12 @@ try_open_exit ()
348 if (candidate_selected < candidate_count) 352 if (candidate_selected < candidate_count)
349 { 353 {
350 /* move to the head of the DLL */ 354 /* move to the head of the DLL */
351 pos->cadet_channel = GNUNET_CADET_channel_create (cadet_handle, 355 pos->cadet_channel
352 pos, 356 = GNUNET_CADET_channel_create (cadet_handle,
353 &pos->peer, 357 pos,
354 GC_u2h (GNUNET_APPLICATION_TYPE_INTERNET_RESOLVER), 358 &pos->peer,
355 GNUNET_CADET_OPTION_DEFAULT); 359 &port,
360 GNUNET_CADET_OPTION_DEFAULT);
356 if (NULL == pos->cadet_channel) 361 if (NULL == pos->cadet_channel)
357 { 362 {
358 GNUNET_break (0); 363 GNUNET_break (0);
@@ -488,7 +493,8 @@ finish_request (struct ReplyContext *rc)
488 gettext_noop ("# DNS requests mapped to VPN"), 493 gettext_noop ("# DNS requests mapped to VPN"),
489 1, GNUNET_NO); 494 1, GNUNET_NO);
490 GNUNET_DNS_request_answer (rc->rh, 495 GNUNET_DNS_request_answer (rc->rh,
491 buf_len, buf); 496 buf_len,
497 buf);
492 GNUNET_free (buf); 498 GNUNET_free (buf);
493 } 499 }
494 GNUNET_DNSPARSER_free_packet (rc->dns); 500 GNUNET_DNSPARSER_free_packet (rc->dns);
@@ -539,16 +545,21 @@ vpn_allocation_callback (void *cls,
539 } 545 }
540 GNUNET_STATISTICS_update (stats, 546 GNUNET_STATISTICS_update (stats,
541 gettext_noop ("# DNS records modified"), 547 gettext_noop ("# DNS records modified"),
542 1, GNUNET_NO); 548 1,
549 GNUNET_NO);
543 switch (rc->rec->type) 550 switch (rc->rec->type)
544 { 551 {
545 case GNUNET_DNSPARSER_TYPE_A: 552 case GNUNET_DNSPARSER_TYPE_A:
546 GNUNET_assert (AF_INET == af); 553 GNUNET_assert (AF_INET == af);
547 GNUNET_memcpy (rc->rec->data.raw.data, address, sizeof (struct in_addr)); 554 GNUNET_memcpy (rc->rec->data.raw.data,
555 address,
556 sizeof (struct in_addr));
548 break; 557 break;
549 case GNUNET_DNSPARSER_TYPE_AAAA: 558 case GNUNET_DNSPARSER_TYPE_AAAA:
550 GNUNET_assert (AF_INET6 == af); 559 GNUNET_assert (AF_INET6 == af);
551 GNUNET_memcpy (rc->rec->data.raw.data, address, sizeof (struct in6_addr)); 560 GNUNET_memcpy (rc->rec->data.raw.data,
561 address,
562 sizeof (struct in6_addr));
552 break; 563 break;
553 default: 564 default:
554 GNUNET_assert (0); 565 GNUNET_assert (0);
@@ -590,7 +601,8 @@ modify_address (struct ReplyContext *rc,
590 } 601 }
591 rc->rec = rec; 602 rc->rec = rec;
592 rc->rr = GNUNET_VPN_redirect_to_ip (vpn_handle, 603 rc->rr = GNUNET_VPN_redirect_to_ip (vpn_handle,
593 af, af, 604 af,
605 af,
594 rec->data.raw.data, 606 rec->data.raw.data,
595 GNUNET_TIME_relative_to_absolute (TIMEOUT), 607 GNUNET_TIME_relative_to_absolute (TIMEOUT),
596 &vpn_allocation_callback, 608 &vpn_allocation_callback,
@@ -642,7 +654,8 @@ submit_request (struct ReplyContext *rc)
642 if (ipv4_pt) 654 if (ipv4_pt)
643 { 655 {
644 rc->offset = i + 1; 656 rc->offset = i + 1;
645 modify_address (rc, &ra[i]); 657 modify_address (rc,
658 &ra[i]);
646 return; 659 return;
647 } 660 }
648 break; 661 break;
@@ -650,7 +663,8 @@ submit_request (struct ReplyContext *rc)
650 if (ipv6_pt) 663 if (ipv6_pt)
651 { 664 {
652 rc->offset = i + 1; 665 rc->offset = i + 1;
653 modify_address (rc, &ra[i]); 666 modify_address (rc,
667 &ra[i]);
654 return; 668 return;
655 } 669 }
656 break; 670 break;
@@ -716,7 +730,8 @@ dns_post_request_handler (void *cls,
716 GNUNET_STATISTICS_update (stats, 730 GNUNET_STATISTICS_update (stats,
717 gettext_noop ("# DNS replies intercepted"), 731 gettext_noop ("# DNS replies intercepted"),
718 1, GNUNET_NO); 732 1, GNUNET_NO);
719 dns = GNUNET_DNSPARSER_parse (request, request_length); 733 dns = GNUNET_DNSPARSER_parse (request,
734 request_length);
720 if (NULL == dns) 735 if (NULL == dns)
721 { 736 {
722 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 737 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
@@ -725,9 +740,12 @@ dns_post_request_handler (void *cls,
725 return; 740 return;
726 } 741 }
727 work = GNUNET_NO; 742 work = GNUNET_NO;
728 work |= work_test (dns->answers, dns->num_answers); 743 work |= work_test (dns->answers,
729 work |= work_test (dns->authority_records, dns->num_authority_records); 744 dns->num_answers);
730 work |= work_test (dns->additional_records, dns->num_additional_records); 745 work |= work_test (dns->authority_records,
746 dns->num_authority_records);
747 work |= work_test (dns->additional_records,
748 dns->num_additional_records);
731 if (! work) 749 if (! work)
732 { 750 {
733 GNUNET_DNS_request_forward (rh); 751 GNUNET_DNS_request_forward (rh);
@@ -767,16 +785,19 @@ transmit_dns_request_to_cadet (void *cls,
767 mlen = rc->mlen; 785 mlen = rc->mlen;
768 if (mlen > size) 786 if (mlen > size)
769 { 787 {
770 exit->cadet_th = GNUNET_CADET_notify_transmit_ready (exit->cadet_channel, 788 exit->cadet_th
771 GNUNET_NO, 789 = GNUNET_CADET_notify_transmit_ready (exit->cadet_channel,
772 TIMEOUT, 790 GNUNET_NO,
773 mlen, 791 TIMEOUT,
774 &transmit_dns_request_to_cadet, 792 mlen,
775 exit); 793 &transmit_dns_request_to_cadet,
794 exit);
776 return 0; 795 return 0;
777 } 796 }
778 GNUNET_assert (GNUNET_NO == rc->was_transmitted); 797 GNUNET_assert (GNUNET_NO == rc->was_transmitted);
779 GNUNET_memcpy (buf, rc->cadet_message, mlen); 798 GNUNET_memcpy (buf,
799 rc->cadet_message,
800 mlen);
780 GNUNET_CONTAINER_DLL_remove (exit->transmit_queue_head, 801 GNUNET_CONTAINER_DLL_remove (exit->transmit_queue_head,
781 exit->transmit_queue_tail, 802 exit->transmit_queue_tail,
782 rc); 803 rc);
@@ -822,7 +843,8 @@ timeout_request (void *cls)
822 } 843 }
823 GNUNET_STATISTICS_update (stats, 844 GNUNET_STATISTICS_update (stats,
824 gettext_noop ("# DNS requests dropped (timeout)"), 845 gettext_noop ("# DNS requests dropped (timeout)"),
825 1, GNUNET_NO); 846 1,
847 GNUNET_NO);
826 GNUNET_DNS_request_drop (rc->rh); 848 GNUNET_DNS_request_drop (rc->rh);
827 GNUNET_free (rc); 849 GNUNET_free (rc);
828 if ( (0 == get_channel_weight (exit)) && 850 if ( (0 == get_channel_weight (exit)) &&
@@ -1148,12 +1170,13 @@ cadet_channel_end_cb (void *cls,
1148 } 1170 }
1149 if ( (NULL == alt->cadet_th) && 1171 if ( (NULL == alt->cadet_th) &&
1150 (NULL != (rc = alt->transmit_queue_head)) ) 1172 (NULL != (rc = alt->transmit_queue_head)) )
1151 alt->cadet_th = GNUNET_CADET_notify_transmit_ready (alt->cadet_channel, 1173 alt->cadet_th
1152 GNUNET_NO, 1174 = GNUNET_CADET_notify_transmit_ready (alt->cadet_channel,
1153 TIMEOUT, 1175 GNUNET_NO,
1154 rc->mlen, 1176 TIMEOUT,
1155 &transmit_dns_request_to_cadet, 1177 rc->mlen,
1156 alt); 1178 &transmit_dns_request_to_cadet,
1179 alt);
1157} 1180}
1158 1181
1159 1182
@@ -1233,10 +1256,17 @@ run (void *cls, char *const *args GNUNET_UNUSED,
1233 struct GNUNET_HashCode dns_key; 1256 struct GNUNET_HashCode dns_key;
1234 1257
1235 cfg = cfg_; 1258 cfg = cfg_;
1236 stats = GNUNET_STATISTICS_create ("pt", cfg); 1259 stats = GNUNET_STATISTICS_create ("pt",
1237 ipv4_pt = GNUNET_CONFIGURATION_get_value_yesno (cfg, "pt", "TUNNEL_IPV4"); 1260 cfg);
1238 ipv6_pt = GNUNET_CONFIGURATION_get_value_yesno (cfg, "pt", "TUNNEL_IPV6"); 1261 ipv4_pt = GNUNET_CONFIGURATION_get_value_yesno (cfg,
1239 dns_channel = GNUNET_CONFIGURATION_get_value_yesno (cfg, "pt", "TUNNEL_DNS"); 1262 "pt",
1263 "TUNNEL_IPV4");
1264 ipv6_pt = GNUNET_CONFIGURATION_get_value_yesno (cfg,
1265 "pt",
1266 "TUNNEL_IPV6");
1267 dns_channel = GNUNET_CONFIGURATION_get_value_yesno (cfg,
1268 "pt",
1269 "TUNNEL_DNS");
1240 if (! (ipv4_pt || ipv6_pt || dns_channel)) 1270 if (! (ipv4_pt || ipv6_pt || dns_channel))
1241 { 1271 {
1242 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 1272 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
@@ -1250,7 +1280,8 @@ run (void *cls, char *const *args GNUNET_UNUSED,
1250 dns_post_handle 1280 dns_post_handle
1251 = GNUNET_DNS_connect (cfg, 1281 = GNUNET_DNS_connect (cfg,
1252 GNUNET_DNS_FLAG_POST_RESOLUTION, 1282 GNUNET_DNS_FLAG_POST_RESOLUTION,
1253 &dns_post_request_handler, NULL); 1283 &dns_post_request_handler,
1284 NULL);
1254 if (NULL == dns_post_handle) 1285 if (NULL == dns_post_handle)
1255 { 1286 {
1256 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 1287 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
@@ -1279,7 +1310,8 @@ run (void *cls, char *const *args GNUNET_UNUSED,
1279 dns_pre_handle 1310 dns_pre_handle
1280 = GNUNET_DNS_connect (cfg, 1311 = GNUNET_DNS_connect (cfg,
1281 GNUNET_DNS_FLAG_PRE_RESOLUTION, 1312 GNUNET_DNS_FLAG_PRE_RESOLUTION,
1282 &dns_pre_request_handler, NULL); 1313 &dns_pre_request_handler,
1314 NULL);
1283 if (NULL == dns_pre_handle) 1315 if (NULL == dns_pre_handle)
1284 { 1316 {
1285 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 1317 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
@@ -1288,9 +1320,10 @@ run (void *cls, char *const *args GNUNET_UNUSED,
1288 GNUNET_SCHEDULER_shutdown (); 1320 GNUNET_SCHEDULER_shutdown ();
1289 return; 1321 return;
1290 } 1322 }
1291 cadet_handle = GNUNET_CADET_connect (cfg, NULL, 1323 cadet_handle = GNUNET_CADET_connect (cfg,
1292 &cadet_channel_end_cb, 1324 NULL,
1293 cadet_handlers); 1325 &cadet_channel_end_cb,
1326 cadet_handlers);
1294 if (NULL == cadet_handle) 1327 if (NULL == cadet_handle)
1295 { 1328 {
1296 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 1329 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
@@ -1308,14 +1341,17 @@ run (void *cls, char *const *args GNUNET_UNUSED,
1308 GNUNET_SCHEDULER_shutdown (); 1341 GNUNET_SCHEDULER_shutdown ();
1309 return; 1342 return;
1310 } 1343 }
1311 GNUNET_CRYPTO_hash ("dns", strlen ("dns"), &dns_key); 1344 GNUNET_CRYPTO_hash ("dns",
1345 strlen ("dns"),
1346 &dns_key);
1312 dht_get = GNUNET_DHT_get_start (dht, 1347 dht_get = GNUNET_DHT_get_start (dht,
1313 GNUNET_BLOCK_TYPE_DNS, 1348 GNUNET_BLOCK_TYPE_DNS,
1314 &dns_key, 1349 &dns_key,
1315 1, 1350 1,
1316 GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE, 1351 GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE,
1317 NULL, 0, 1352 NULL, 0,
1318 &handle_dht_result, NULL); 1353 &handle_dht_result,
1354 NULL);
1319 } 1355 }
1320} 1356}
1321 1357
@@ -1328,20 +1364,29 @@ run (void *cls, char *const *args GNUNET_UNUSED,
1328 * @return 0 ok, 1 on error 1364 * @return 0 ok, 1 on error
1329 */ 1365 */
1330int 1366int
1331main (int argc, char *const *argv) 1367main (int argc,
1368 char *const *argv)
1332{ 1369{
1333 static const struct GNUNET_GETOPT_CommandLineOption options[] = { 1370 static const struct GNUNET_GETOPT_CommandLineOption options[] = {
1334 GNUNET_GETOPT_OPTION_END 1371 GNUNET_GETOPT_OPTION_END
1335 }; 1372 };
1336 int ret; 1373 int ret;
1337 1374
1338 if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv)) 1375 if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc,
1376 argv,
1377 &argc,
1378 &argv))
1339 return 2; 1379 return 2;
1340 ret = (GNUNET_OK == 1380 ret = (GNUNET_OK ==
1341 GNUNET_PROGRAM_run (argc, argv, "gnunet-daemon-pt", 1381 GNUNET_PROGRAM_run (argc,
1342 gettext_noop 1382 argv,
1343 ("Daemon to run to perform IP protocol translation to GNUnet"), 1383 "gnunet-daemon-pt",
1344 options, &run, NULL)) ? 0 : 1; 1384 gettext_noop ("Daemon to run to perform IP protocol translation to GNUnet"),
1385 options,
1386 &run,
1387 NULL))
1388 ? 0
1389 : 1;
1345 GNUNET_free ((void*) argv); 1390 GNUNET_free ((void*) argv);
1346 return ret; 1391 return ret;
1347} 1392}