diff options
author | Christian Grothoff <christian@grothoff.org> | 2010-04-14 19:21:45 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2010-04-14 19:21:45 +0000 |
commit | ee29103768ab0565efc9900d11d23c16a52d16d4 (patch) | |
tree | a4aa5d1e042c2eef8ba5c8c4d37b84a898d353ab /src/transport | |
parent | 1af740f9589aee283ef9473e8528b5a9ce76e60d (diff) | |
download | gnunet-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.c | 132 |
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, |