aboutsummaryrefslogtreecommitdiff
path: root/src/transport
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2010-04-14 19:21:45 +0000
committerChristian Grothoff <christian@grothoff.org>2010-04-14 19:21:45 +0000
commitee29103768ab0565efc9900d11d23c16a52d16d4 (patch)
treea4aa5d1e042c2eef8ba5c8c4d37b84a898d353ab /src/transport
parent1af740f9589aee283ef9473e8528b5a9ce76e60d (diff)
downloadgnunet-ee29103768ab0565efc9900d11d23c16a52d16d4.tar.gz
gnunet-ee29103768ab0565efc9900d11d23c16a52d16d4.zip
maybe done with transport inbound-NAT verification and connect signalling fixed
Diffstat (limited to 'src/transport')
-rw-r--r--src/transport/gnunet-service-transport.c132
1 files changed, 80 insertions, 52 deletions
diff --git a/src/transport/gnunet-service-transport.c b/src/transport/gnunet-service-transport.c
index 2ac33c3e1..d379a7410 100644
--- a/src/transport/gnunet-service-transport.c
+++ b/src/transport/gnunet-service-transport.c
@@ -23,10 +23,6 @@
23 * @brief low-level P2P messaging 23 * @brief low-level P2P messaging
24 * @author Christian Grothoff 24 * @author Christian Grothoff
25 * 25 *
26 * TODO:
27 * - CHECK that 'address' being NULL in 'struct ForeignAddressList' is
28 * tolerated in the code everywhere (could not happen before)
29 *
30 * NOTE: 26 * NOTE:
31 * - This code uses 'GNUNET_a2s' for debug printing in many places, 27 * - This code uses 'GNUNET_a2s' for debug printing in many places,
32 * which is technically wrong since it assumes we have IP+Port 28 * which is technically wrong since it assumes we have IP+Port
@@ -1213,17 +1209,18 @@ find_ready_address(struct NeighbourList *neighbour)
1213 while (addresses != NULL) 1209 while (addresses != NULL)
1214 { 1210 {
1215#if DEBUG_TRANSPORT > 1 1211#if DEBUG_TRANSPORT > 1
1216 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1212 if (addresses->addr != NULL)
1217 "Have address `%s' for peer `%4s' (status: %d, %d, %d, %u, %llums, %u)\n", 1213 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1218 GNUNET_a2s (addresses->addr, 1214 "Have address `%s' for peer `%4s' (status: %d, %d, %d, %u, %llums, %u)\n",
1219 addresses->addrlen), 1215 GNUNET_a2s (addresses->addr,
1220 GNUNET_i2s (&neighbour->id), 1216 addresses->addrlen),
1221 addresses->connected, 1217 GNUNET_i2s (&neighbour->id),
1222 addresses->in_transmit, 1218 addresses->connected,
1223 addresses->validated, 1219 addresses->in_transmit,
1224 addresses->connect_attempts, 1220 addresses->validated,
1225 (unsigned long long) addresses->timeout.value, 1221 addresses->connect_attempts,
1226 (unsigned int) addresses->distance); 1222 (unsigned long long) addresses->timeout.value,
1223 (unsigned int) addresses->distance);
1227#endif 1224#endif
1228 if ( ( (best_address == NULL) || 1225 if ( ( (best_address == NULL) ||
1229 (addresses->connected == GNUNET_YES) || 1226 (addresses->connected == GNUNET_YES) ||
@@ -1376,8 +1373,10 @@ try_transmission_to_peer (struct NeighbourList *neighbour)
1376 "Sending message of size %u for `%4s' to `%s' via plugin `%s'\n", 1373 "Sending message of size %u for `%4s' to `%s' via plugin `%s'\n",
1377 mq->message_buf_size, 1374 mq->message_buf_size,
1378 GNUNET_i2s (&neighbour->id), 1375 GNUNET_i2s (&neighbour->id),
1379 GNUNET_a2s (mq->specific_address->addr, 1376 (mq->specific_address->addr != NULL)
1380 mq->specific_address->addrlen), 1377 ? GNUNET_a2s (mq->specific_address->addr,
1378 mq->specific_address->addrlen)
1379 : "<inbound>",
1381 rl->plugin->short_name); 1380 rl->plugin->short_name);
1382#endif 1381#endif
1383 GNUNET_STATISTICS_update (stats, 1382 GNUNET_STATISTICS_update (stats,
@@ -1787,9 +1786,9 @@ plugin_env_notify_address (void *cls,
1787 struct OwnAddressList *al; 1786 struct OwnAddressList *al;
1788 struct GNUNET_TIME_Absolute abex; 1787 struct GNUNET_TIME_Absolute abex;
1789 1788
1789 GNUNET_assert (addr != NULL);
1790 abex = GNUNET_TIME_relative_to_absolute (expires); 1790 abex = GNUNET_TIME_relative_to_absolute (expires);
1791 GNUNET_assert (p == find_transport (name)); 1791 GNUNET_assert (p == find_transport (name));
1792
1793 al = p->addresses; 1792 al = p->addresses;
1794 while (al != NULL) 1793 while (al != NULL)
1795 { 1794 {
@@ -1886,6 +1885,7 @@ notify_clients_disconnect (const struct GNUNET_PeerIdentity *peer)
1886 * @param tname name of the transport plugin 1885 * @param tname name of the transport plugin
1887 * @param session session to look for, NULL for 'any'; otherwise 1886 * @param session session to look for, NULL for 'any'; otherwise
1888 * can be used for the service to "learn" this session ID 1887 * can be used for the service to "learn" this session ID
1888 * if 'addr' matches
1889 * @param addr binary address 1889 * @param addr binary address
1890 * @param addrlen length of addr 1890 * @param addrlen length of addr
1891 * @return NULL if no such entry exists 1891 * @return NULL if no such entry exists
@@ -1898,7 +1898,7 @@ find_peer_address(struct NeighbourList *neighbour,
1898 size_t addrlen) 1898 size_t addrlen)
1899{ 1899{
1900 struct ReadyList *head; 1900 struct ReadyList *head;
1901 struct ForeignAddressList *address_head; 1901 struct ForeignAddressList *pos;
1902 1902
1903 head = neighbour->plugins; 1903 head = neighbour->plugins;
1904 while (head != NULL) 1904 while (head != NULL)
@@ -1909,15 +1909,19 @@ find_peer_address(struct NeighbourList *neighbour,
1909 } 1909 }
1910 if (head == NULL) 1910 if (head == NULL)
1911 return NULL; 1911 return NULL;
1912 1912 pos = head->addresses;
1913 address_head = head->addresses; 1913 while ( (pos != NULL) &&
1914 while ( (address_head != NULL) && 1914 ( (pos->addrlen != addrlen) ||
1915 ( (address_head->addrlen != addrlen) || 1915 (memcmp(pos->addr, addr, addrlen) != 0) ) )
1916 (memcmp(address_head->addr, addr, addrlen) != 0) ) ) 1916 {
1917 address_head = address_head->next; 1917 if ( (session != NULL) &&
1918 if ( (session != NULL) && (address_head != NULL) ) 1918 (pos->session == session) )
1919 address_head->session = session; /* learn it! */ 1919 return pos;
1920 return address_head; 1920 pos = pos->next;
1921 }
1922 if ( (session != NULL) && (pos != NULL) )
1923 pos->session = session; /* learn it! */
1924 return pos;
1921} 1925}
1922 1926
1923 1927
@@ -2044,6 +2048,11 @@ struct CheckAddressExistsClosure
2044 const char *tname; 2048 const char *tname;
2045 2049
2046 /** 2050 /**
2051 * Session, or NULL.
2052 */
2053 struct Session *session;
2054
2055 /**
2047 * Length of addr. 2056 * Length of addr.
2048 */ 2057 */
2049 size_t addrlen; 2058 size_t addrlen;
@@ -2073,6 +2082,7 @@ check_address_exists (void *cls,
2073{ 2082{
2074 struct CheckAddressExistsClosure *caec = cls; 2083 struct CheckAddressExistsClosure *caec = cls;
2075 struct ValidationEntry *ve = value; 2084 struct ValidationEntry *ve = value;
2085
2076 if ( (0 == strcmp (caec->tname, 2086 if ( (0 == strcmp (caec->tname,
2077 ve->transport_name)) && 2087 ve->transport_name)) &&
2078 (caec->addrlen == ve->addrlen) && 2088 (caec->addrlen == ve->addrlen) &&
@@ -2083,6 +2093,12 @@ check_address_exists (void *cls,
2083 caec->exists = GNUNET_YES; 2093 caec->exists = GNUNET_YES;
2084 return GNUNET_NO; 2094 return GNUNET_NO;
2085 } 2095 }
2096 if ( (ve->session != NULL) &&
2097 (caec->session == ve->session) )
2098 {
2099 caec->exists = GNUNET_YES;
2100 return GNUNET_NO;
2101 }
2086 return GNUNET_YES; 2102 return GNUNET_YES;
2087} 2103}
2088 2104
@@ -2362,6 +2378,7 @@ send_periodic_ping (void *cls,
2362 caec.addr = peer_address->addr; 2378 caec.addr = peer_address->addr;
2363 caec.addrlen = peer_address->addrlen; 2379 caec.addrlen = peer_address->addrlen;
2364 caec.tname = tp->short_name; 2380 caec.tname = tp->short_name;
2381 caec.session = peer_address->session;
2365 caec.exists = GNUNET_NO; 2382 caec.exists = GNUNET_NO;
2366 GNUNET_CONTAINER_multihashmap_iterate (validation_map, 2383 GNUNET_CONTAINER_multihashmap_iterate (validation_map,
2367 &check_address_exists, 2384 &check_address_exists,
@@ -2375,8 +2392,10 @@ send_periodic_ping (void *cls,
2375#if DEBUG_TRANSPORT > 1 2392#if DEBUG_TRANSPORT > 1
2376 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2393 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2377 "Some validation of address `%s' via `%s' for peer `%4s' already in progress.\n", 2394 "Some validation of address `%s' via `%s' for peer `%4s' already in progress.\n",
2378 GNUNET_a2s (peer_address->addr, 2395 (peer_address->addr != NULL)
2379 peer_address->addrlen), 2396 ? GNUNET_a2s (peer_address->addr,
2397 peer_address->addrlen)
2398 : "<inbound>",
2380 tp->short_name, 2399 tp->short_name,
2381 GNUNET_i2s (&neighbour->id)); 2400 GNUNET_i2s (&neighbour->id));
2382#endif 2401#endif
@@ -2389,10 +2408,12 @@ send_periodic_ping (void *cls,
2389 (unsigned int) -1); 2408 (unsigned int) -1);
2390 va->send_time = GNUNET_TIME_absolute_get(); 2409 va->send_time = GNUNET_TIME_absolute_get();
2391 va->session = peer_address->session; 2410 va->session = peer_address->session;
2392 va->addr = (const void*) &va[1]; 2411 if (peer_address->addr != NULL)
2393 memcpy (&va[1], peer_address->addr, peer_address->addrlen); 2412 {
2394 va->addrlen = peer_address->addrlen; 2413 va->addr = (const void*) &va[1];
2395 2414 memcpy (&va[1], peer_address->addr, peer_address->addrlen);
2415 va->addrlen = peer_address->addrlen;
2416 }
2396 memcpy(&va->publicKey, 2417 memcpy(&va->publicKey,
2397 &neighbour->publicKey, 2418 &neighbour->publicKey,
2398 sizeof(struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded)); 2419 sizeof(struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded));
@@ -2419,8 +2440,10 @@ send_periodic_ping (void *cls,
2419#if DEBUG_TRANSPORT_REVALIDATION 2440#if DEBUG_TRANSPORT_REVALIDATION
2420 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2441 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2421 "Performing re-validation of address `%s' via `%s' for peer `%4s' sending `%s' (%u bytes) and `%s' (%u bytes)\n", 2442 "Performing re-validation of address `%s' via `%s' for peer `%4s' sending `%s' (%u bytes) and `%s' (%u bytes)\n",
2422 GNUNET_a2s (peer_address->addr, 2443 (peer_address->addr != NULL)
2423 peer_address->addrlen), 2444 ? GNUNET_a2s (peer_address->addr,
2445 peer_address->addrlen)
2446 : "<inbound>",
2424 tp->short_name, 2447 tp->short_name,
2425 GNUNET_i2s (&neighbour->id), 2448 GNUNET_i2s (&neighbour->id),
2426 "HELLO", hello_size, 2449 "HELLO", hello_size,
@@ -2595,13 +2618,14 @@ check_pending_validation (void *cls,
2595 } 2618 }
2596 2619
2597#if DEBUG_TRANSPORT 2620#if DEBUG_TRANSPORT
2598 if (ve->addr != NULL) 2621 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2599 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2622 "Confirmed validity of address, peer `%4s' has address `%s' (%s).\n",
2600 "Confirmed validity of address, peer `%4s' has address `%s' (%s).\n", 2623 GNUNET_h2s (key),
2601 GNUNET_h2s (key), 2624 (ve->addr != NULL)
2602 GNUNET_a2s ((const struct sockaddr *) ve->addr, 2625 ? GNUNET_a2s ((const struct sockaddr *) ve->addr,
2603 ve->addrlen), 2626 ve->addrlen)
2604 ve->transport_name); 2627 : "<inbound>",
2628 ve->transport_name);
2605#endif 2629#endif
2606 GNUNET_STATISTICS_update (stats, 2630 GNUNET_STATISTICS_update (stats,
2607 gettext_noop ("# address validation successes"), 2631 gettext_noop ("# address validation successes"),
@@ -2611,15 +2635,18 @@ check_pending_validation (void *cls,
2611 GNUNET_CRYPTO_hash (&ve->publicKey, 2635 GNUNET_CRYPTO_hash (&ve->publicKey,
2612 sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), 2636 sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded),
2613 &target.hashPubKey); 2637 &target.hashPubKey);
2614 avac.done = GNUNET_NO; 2638 if (ve->addr != NULL)
2615 avac.ve = ve; 2639 {
2616 hello = GNUNET_HELLO_create (&ve->publicKey, 2640 avac.done = GNUNET_NO;
2617 &add_validated_address, 2641 avac.ve = ve;
2618 &avac); 2642 hello = GNUNET_HELLO_create (&ve->publicKey,
2619 GNUNET_PEERINFO_add_peer (cfg, sched, 2643 &add_validated_address,
2620 &target, 2644 &avac);
2621 hello); 2645 GNUNET_PEERINFO_add_peer (cfg, sched,
2622 GNUNET_free (hello); 2646 &target,
2647 hello);
2648 GNUNET_free (hello);
2649 }
2623 n = find_neighbour (&target); 2650 n = find_neighbour (&target);
2624 if (n != NULL) 2651 if (n != NULL)
2625 { 2652 {
@@ -2775,6 +2802,7 @@ run_validation (void *cls,
2775 uint16_t hello_size; 2802 uint16_t hello_size;
2776 size_t tsize; 2803 size_t tsize;
2777 2804
2805 GNUNET_assert (addr != NULL);
2778 GNUNET_STATISTICS_update (stats, 2806 GNUNET_STATISTICS_update (stats,
2779 gettext_noop ("# peer addresses scheduled for validation"), 2807 gettext_noop ("# peer addresses scheduled for validation"),
2780 1, 2808 1,