aboutsummaryrefslogtreecommitdiff
path: root/src/transport/plugin_transport_http.c
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2012-07-10 08:57:34 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2012-07-10 08:57:34 +0000
commit2606a543d5f3330b13c31155688a777b1d124841 (patch)
treede14a704fcc377c4828027f09eb1501a95f3acda /src/transport/plugin_transport_http.c
parent1ba824d63fe1c2cd32ddbf924b9e9ab61169be52 (diff)
downloadgnunet-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.c127
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
1327static void 1338static void
1328stop_report_addresses (struct Plugin *plugin) 1339stop_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;