diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2012-07-10 08:57:34 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2012-07-10 08:57:34 +0000 |
commit | 2606a543d5f3330b13c31155688a777b1d124841 (patch) | |
tree | de14a704fcc377c4828027f09eb1501a95f3acda /src/transport/plugin_transport_http.c | |
parent | 1ba824d63fe1c2cd32ddbf924b9e9ab61169be52 (diff) | |
download | gnunet-2606a543d5f3330b13c31155688a777b1d124841.tar.gz gnunet-2606a543d5f3330b13c31155688a777b1d124841.zip |
- improved session creation and listen only mode
Diffstat (limited to 'src/transport/plugin_transport_http.c')
-rw-r--r-- | src/transport/plugin_transport_http.c | 127 |
1 files changed, 70 insertions, 57 deletions
diff --git a/src/transport/plugin_transport_http.c b/src/transport/plugin_transport_http.c index 7d13960f0..14187a4f0 100644 --- a/src/transport/plugin_transport_http.c +++ b/src/transport/plugin_transport_http.c | |||
@@ -608,16 +608,56 @@ create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target, | |||
608 | const void *addr, size_t addrlen) | 608 | const void *addr, size_t addrlen) |
609 | { | 609 | { |
610 | struct Session *s = NULL; | 610 | struct Session *s = NULL; |
611 | struct GNUNET_ATS_Information ats; | ||
611 | 612 | ||
612 | GNUNET_assert ((addrlen == sizeof (struct IPv6HttpAddress)) || | 613 | GNUNET_assert ((addrlen == sizeof (struct IPv6HttpAddress)) || |
613 | (addrlen == sizeof (struct IPv4HttpAddress))); | 614 | (addrlen == sizeof (struct IPv4HttpAddress))); |
615 | |||
616 | |||
617 | |||
618 | |||
619 | if (addrlen == sizeof (struct IPv4HttpAddress)) | ||
620 | { | ||
621 | struct IPv4HttpAddress *a4 = (struct IPv4HttpAddress *) addr; | ||
622 | struct sockaddr_in s4; | ||
623 | |||
624 | if (0 == ntohs(a4->u4_port)) | ||
625 | return NULL; | ||
626 | |||
627 | s4.sin_family = AF_INET; | ||
628 | s4.sin_addr.s_addr = a4->ipv4_addr; | ||
629 | s4.sin_port = a4->u4_port; | ||
630 | #if HAVE_SOCKADDR_IN_SIN_LEN | ||
631 | s4.sin_len = sizeof (struct sockaddr_in); | ||
632 | #endif | ||
633 | ats = plugin->env->get_address_type (plugin->env->cls, (const struct sockaddr *) &s4, sizeof (struct sockaddr_in)); | ||
634 | } | ||
635 | if (addrlen == sizeof (struct IPv6HttpAddress)) | ||
636 | { | ||
637 | struct IPv6HttpAddress *a6 = (struct IPv6HttpAddress *) addr; | ||
638 | struct sockaddr_in6 s6; | ||
639 | |||
640 | if (0 == ntohs(a6->u6_port)) | ||
641 | return NULL; | ||
642 | |||
643 | s6.sin6_family = AF_INET6; | ||
644 | s6.sin6_addr = a6->ipv6_addr; | ||
645 | s6.sin6_port = a6->u6_port; | ||
646 | #if HAVE_SOCKADDR_IN_SIN_LEN | ||
647 | s6.sin6_len = sizeof (struct sockaddr_in6); | ||
648 | #endif | ||
649 | ats = plugin->env->get_address_type (plugin->env->cls, (const struct sockaddr *) &s6, sizeof (struct sockaddr_in6)); | ||
650 | } | ||
651 | |||
614 | s = GNUNET_malloc (sizeof (struct Session)); | 652 | s = GNUNET_malloc (sizeof (struct Session)); |
615 | memcpy (&s->target, target, sizeof (struct GNUNET_PeerIdentity)); | 653 | memcpy (&s->target, target, sizeof (struct GNUNET_PeerIdentity)); |
616 | s->plugin = plugin; | 654 | s->plugin = plugin; |
617 | s->addr = GNUNET_malloc (addrlen); | 655 | s->addr = GNUNET_malloc (addrlen); |
618 | memcpy (s->addr, addr, addrlen); | 656 | memcpy (s->addr, addr, addrlen); |
619 | s->addrlen = addrlen; | 657 | s->addrlen = addrlen; |
620 | s->ats_address_network_type = htonl (GNUNET_ATS_NET_UNSPECIFIED); | 658 | s->ats_address_network_type = ats.value; |
659 | |||
660 | |||
621 | start_session_timeout(s); | 661 | start_session_timeout(s); |
622 | return s; | 662 | return s; |
623 | } | 663 | } |
@@ -649,16 +689,12 @@ http_get_session (void *cls, | |||
649 | { | 689 | { |
650 | struct Plugin *plugin = cls; | 690 | struct Plugin *plugin = cls; |
651 | struct Session * s = NULL; | 691 | struct Session * s = NULL; |
652 | struct GNUNET_ATS_Information ats; | ||
653 | size_t addrlen; | 692 | size_t addrlen; |
654 | 693 | ||
655 | GNUNET_assert (plugin != NULL); | 694 | GNUNET_assert (plugin != NULL); |
656 | GNUNET_assert (address != NULL); | 695 | GNUNET_assert (address != NULL); |
657 | GNUNET_assert (address->address != NULL); | 696 | GNUNET_assert (address->address != NULL); |
658 | 697 | ||
659 | ats.type = htonl (GNUNET_ATS_ARRAY_TERMINATOR); | ||
660 | ats.value = htonl (GNUNET_ATS_ARRAY_TERMINATOR); | ||
661 | |||
662 | /* find existing session */ | 698 | /* find existing session */ |
663 | s = lookup_session (plugin, address); | 699 | s = lookup_session (plugin, address); |
664 | if (s != NULL) | 700 | if (s != NULL) |
@@ -680,35 +716,6 @@ http_get_session (void *cls, | |||
680 | 716 | ||
681 | s = create_session (plugin, &address->peer, address->address, address->address_length); | 717 | s = create_session (plugin, &address->peer, address->address, address->address_length); |
682 | 718 | ||
683 | /* Get ATS type */ | ||
684 | if (addrlen == sizeof (struct IPv4HttpAddress)) | ||
685 | { | ||
686 | struct IPv4HttpAddress *a4 = (struct IPv4HttpAddress *) address->address; | ||
687 | struct sockaddr_in s4; | ||
688 | |||
689 | s4.sin_family = AF_INET; | ||
690 | s4.sin_addr.s_addr = a4->ipv4_addr; | ||
691 | s4.sin_port = a4->u4_port; | ||
692 | #if HAVE_SOCKADDR_IN_SIN_LEN | ||
693 | s4.sin_len = sizeof (struct sockaddr_in); | ||
694 | #endif | ||
695 | ats = plugin->env->get_address_type (plugin->env->cls, (const struct sockaddr *) &s4, sizeof (struct sockaddr_in)); | ||
696 | } | ||
697 | if (addrlen == sizeof (struct IPv6HttpAddress)) | ||
698 | { | ||
699 | struct IPv6HttpAddress *a6 = (struct IPv6HttpAddress *) address->address; | ||
700 | struct sockaddr_in6 s6; | ||
701 | |||
702 | s6.sin6_family = AF_INET6; | ||
703 | s6.sin6_addr = a6->ipv6_addr; | ||
704 | s6.sin6_port = a6->u6_port; | ||
705 | #if HAVE_SOCKADDR_IN_SIN_LEN | ||
706 | s6.sin6_len = sizeof (struct sockaddr_in6); | ||
707 | #endif | ||
708 | ats = plugin->env->get_address_type (plugin->env->cls, (const struct sockaddr *) &s6, sizeof (struct sockaddr_in6)); | ||
709 | } | ||
710 | s->ats_address_network_type = ats.value; | ||
711 | |||
712 | /* add new session */ | 719 | /* add new session */ |
713 | GNUNET_CONTAINER_DLL_insert (plugin->head, plugin->tail, s); | 720 | GNUNET_CONTAINER_DLL_insert (plugin->head, plugin->tail, s); |
714 | /* initiate new connection */ | 721 | /* initiate new connection */ |
@@ -1150,6 +1157,13 @@ http_get_addresses (struct Plugin *plugin, const char *serviceName, | |||
1150 | return GNUNET_SYSERR; | 1157 | return GNUNET_SYSERR; |
1151 | } | 1158 | } |
1152 | } | 1159 | } |
1160 | if (0 == port) | ||
1161 | { | ||
1162 | GNUNET_log_from (GNUNET_ERROR_TYPE_INFO, plugin->name, | ||
1163 | "Starting in listen only mode\n"); | ||
1164 | return -1; /* listen only */ | ||
1165 | } | ||
1166 | |||
1153 | 1167 | ||
1154 | if (GNUNET_CONFIGURATION_have_value (cfg, serviceName, "BINDTO")) | 1168 | if (GNUNET_CONFIGURATION_have_value (cfg, serviceName, "BINDTO")) |
1155 | { | 1169 | { |
@@ -1295,40 +1309,39 @@ start_report_addresses (struct Plugin *plugin) | |||
1295 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, | 1309 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, |
1296 | _("Found %u addresses to report to NAT service\n"), res); | 1310 | _("Found %u addresses to report to NAT service\n"), res); |
1297 | 1311 | ||
1298 | if (res != GNUNET_SYSERR) | 1312 | if (GNUNET_SYSERR == res) |
1299 | { | 1313 | { |
1300 | plugin->nat = | 1314 | plugin->nat = NULL; |
1301 | GNUNET_NAT_register (plugin->env->cfg, GNUNET_YES, plugin->port, | 1315 | return; |
1302 | (unsigned int) res, | ||
1303 | (const struct sockaddr **) addrs, addrlens, | ||
1304 | &nat_port_map_callback, NULL, plugin); | ||
1305 | while (res > 0) | ||
1306 | { | ||
1307 | res--; | ||
1308 | #if 0 | ||
1309 | GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, plugin->name, _("FREEING %s\n"), | ||
1310 | GNUNET_a2s (addrs[res], addrlens[res])); | ||
1311 | #endif | ||
1312 | GNUNET_assert (addrs[res] != NULL); | ||
1313 | GNUNET_free (addrs[res]); | ||
1314 | } | ||
1315 | GNUNET_free_non_null (addrs); | ||
1316 | GNUNET_free_non_null (addrlens); | ||
1317 | } | 1316 | } |
1318 | else | 1317 | |
1318 | plugin->nat = | ||
1319 | GNUNET_NAT_register (plugin->env->cfg, GNUNET_YES, plugin->port, | ||
1320 | (unsigned int) res, | ||
1321 | (const struct sockaddr **) addrs, addrlens, | ||
1322 | &nat_port_map_callback, NULL, plugin); | ||
1323 | while (res > 0) | ||
1319 | { | 1324 | { |
1320 | plugin->nat = | 1325 | res--; |
1321 | GNUNET_NAT_register (plugin->env->cfg, GNUNET_YES, 0, 0, NULL, NULL, | 1326 | #if 0 |
1322 | NULL, NULL, plugin); | 1327 | GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, plugin->name, _("FREEING %s\n"), |
1328 | GNUNET_a2s (addrs[res], addrlens[res])); | ||
1329 | #endif | ||
1330 | GNUNET_assert (addrs[res] != NULL); | ||
1331 | GNUNET_free (addrs[res]); | ||
1323 | } | 1332 | } |
1333 | GNUNET_free_non_null (addrs); | ||
1334 | GNUNET_free_non_null (addrlens); | ||
1324 | } | 1335 | } |
1325 | 1336 | ||
1326 | 1337 | ||
1327 | static void | 1338 | static void |
1328 | stop_report_addresses (struct Plugin *plugin) | 1339 | stop_report_addresses (struct Plugin *plugin) |
1329 | { | 1340 | { |
1341 | |||
1330 | /* Stop NAT handle */ | 1342 | /* Stop NAT handle */ |
1331 | GNUNET_NAT_unregister (plugin->nat); | 1343 | if (NULL != plugin->nat) |
1344 | GNUNET_NAT_unregister (plugin->nat); | ||
1332 | 1345 | ||
1333 | /* Clean up addresses */ | 1346 | /* Clean up addresses */ |
1334 | struct IPv4HttpAddressWrapper *w_t4; | 1347 | struct IPv4HttpAddressWrapper *w_t4; |