aboutsummaryrefslogtreecommitdiff
path: root/src/transport/gnunet-communicator-tcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/transport/gnunet-communicator-tcp.c')
-rw-r--r--src/transport/gnunet-communicator-tcp.c246
1 files changed, 130 insertions, 116 deletions
diff --git a/src/transport/gnunet-communicator-tcp.c b/src/transport/gnunet-communicator-tcp.c
index db2aea552..e2f1e4507 100644
--- a/src/transport/gnunet-communicator-tcp.c
+++ b/src/transport/gnunet-communicator-tcp.c
@@ -1513,13 +1513,13 @@ handshake_ack_monotime_cb (void *cls,
1513 */ 1513 */
1514static void 1514static void
1515send_challenge (struct GNUNET_CRYPTO_ChallengeNonceP challenge, 1515send_challenge (struct GNUNET_CRYPTO_ChallengeNonceP challenge,
1516 struct Queue *queue) 1516 struct Queue *queue)
1517{ 1517{
1518 struct TCPConfirmationAck tca; 1518 struct TCPConfirmationAck tca;
1519 struct TcpHandshakeAckSignature thas; 1519 struct TcpHandshakeAckSignature thas;
1520 1520
1521 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1521 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1522 "sending challenge\n"); 1522 "sending challenge\n");
1523 1523
1524 tca.header.type = ntohs ( 1524 tca.header.type = ntohs (
1525 GNUNET_MESSAGE_TYPE_COMMUNICATOR_TCP_CONFIRMATION_ACK); 1525 GNUNET_MESSAGE_TYPE_COMMUNICATOR_TCP_CONFIRMATION_ACK);
@@ -1546,7 +1546,7 @@ send_challenge (struct GNUNET_CRYPTO_ChallengeNonceP challenge,
1546 sizeof(tca))); 1546 sizeof(tca)));
1547 queue->cwrite_off += sizeof(tca); 1547 queue->cwrite_off += sizeof(tca);
1548 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1548 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1549 "sending challenge done\n"); 1549 "sending challenge done\n");
1550} 1550}
1551 1551
1552 1552
@@ -1632,8 +1632,8 @@ inject_rekey (struct Queue *queue)
1632 1632
1633static int 1633static int
1634pending_reversals_delete_it (void *cls, 1634pending_reversals_delete_it (void *cls,
1635 const struct GNUNET_HashCode *key, 1635 const struct GNUNET_HashCode *key,
1636 void *value) 1636 void *value)
1637{ 1637{
1638 (void) cls; 1638 (void) cls;
1639 struct PendingReversal *pending_reversal = value; 1639 struct PendingReversal *pending_reversal = value;
@@ -1643,9 +1643,10 @@ pending_reversals_delete_it (void *cls,
1643 GNUNET_SCHEDULER_cancel (pending_reversal->timeout_task); 1643 GNUNET_SCHEDULER_cancel (pending_reversal->timeout_task);
1644 pending_reversal->timeout_task = NULL; 1644 pending_reversal->timeout_task = NULL;
1645 } 1645 }
1646 GNUNET_assert (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove (pending_reversals, 1646 GNUNET_assert (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove (
1647 key, 1647 pending_reversals,
1648 pending_reversal)); 1648 key,
1649 pending_reversal));
1649 GNUNET_free (pending_reversal->in); 1650 GNUNET_free (pending_reversal->in);
1650 GNUNET_free (pending_reversal); 1651 GNUNET_free (pending_reversal);
1651 return GNUNET_OK; 1652 return GNUNET_OK;
@@ -1653,33 +1654,37 @@ pending_reversals_delete_it (void *cls,
1653 1654
1654 1655
1655static void 1656static void
1656check_and_remove_pending_reversal (struct sockaddr *in, sa_family_t sa_family, struct GNUNET_PeerIdentity *sender) 1657check_and_remove_pending_reversal (struct sockaddr *in, sa_family_t sa_family,
1658 struct GNUNET_PeerIdentity *sender)
1657{ 1659{
1658 if (AF_INET == sa_family) 1660 if (AF_INET == sa_family)
1659 { 1661 {
1660 struct PendingReversal *pending_reversal; 1662 struct PendingReversal *pending_reversal;
1661 struct GNUNET_HashCode key; 1663 struct GNUNET_HashCode key;
1662 struct sockaddr_in *natted_address; 1664 struct sockaddr_in *natted_address;
1663 1665
1664 natted_address = GNUNET_memdup (in, sizeof (struct sockaddr)); 1666 natted_address = GNUNET_memdup (in, sizeof (struct sockaddr));
1665 natted_address->sin_port = 0; 1667 natted_address->sin_port = 0;
1666 GNUNET_CRYPTO_hash (natted_address, 1668 GNUNET_CRYPTO_hash (natted_address,
1667 sizeof(struct sockaddr), 1669 sizeof(struct sockaddr),
1668 &key); 1670 &key);
1669 1671
1670 pending_reversal = GNUNET_CONTAINER_multihashmap_get (pending_reversals, 1672 pending_reversal = GNUNET_CONTAINER_multihashmap_get (pending_reversals,
1671 &key); 1673 &key);
1672 if (NULL != pending_reversal && (NULL == sender || 1674 if (NULL != pending_reversal && (NULL == sender ||
1673 0 != memcmp (sender, &pending_reversal->target, sizeof(struct GNUNET_PeerIdentity)))) 1675 0 != memcmp (sender,
1674 { 1676 &pending_reversal->target,
1675 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, 1677 sizeof(struct
1676 "Removing invalid pending reversal for `%s'at `%s'\n", 1678 GNUNET_PeerIdentity))))
1677 GNUNET_i2s (&pending_reversal->target), 1679 {
1678 GNUNET_a2s (in, sizeof (struct sockaddr))); 1680 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
1679 pending_reversals_delete_it (NULL, &key, pending_reversal); 1681 "Removing invalid pending reversal for `%s'at `%s'\n",
1680 } 1682 GNUNET_i2s (&pending_reversal->target),
1681 GNUNET_free (natted_address); 1683 GNUNET_a2s (in, sizeof (struct sockaddr)));
1682 } 1684 pending_reversals_delete_it (NULL, &key, pending_reversal);
1685 }
1686 GNUNET_free (natted_address);
1687 }
1683} 1688}
1684 1689
1685 1690
@@ -1971,7 +1976,8 @@ try_handle_plaintext (struct Queue *queue)
1971 } 1976 }
1972 else if (GNUNET_TRANSPORT_CS_OUTBOUND == queue->cs) 1977 else if (GNUNET_TRANSPORT_CS_OUTBOUND == queue->cs)
1973 { 1978 {
1974 check_and_remove_pending_reversal (queue->address, queue->address->sa_family, NULL); 1979 check_and_remove_pending_reversal (queue->address,
1980 queue->address->sa_family, NULL);
1975 } 1981 }
1976 1982
1977 unverified_size = -1; 1983 unverified_size = -1;
@@ -2691,7 +2697,7 @@ transmit_kx (struct Queue *queue,
2691 queue->cwrite_off += sizeof(tc); 2697 queue->cwrite_off += sizeof(tc);
2692 2698
2693 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2699 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2694 "handshake written\n"); 2700 "handshake written\n");
2695} 2701}
2696 2702
2697 2703
@@ -2987,7 +2993,8 @@ proto_read_kx (void *cls)
2987 { 2993 {
2988 struct TCPNATProbeMessage *pm = (struct TCPNATProbeMessage *) pq->ibuf; 2994 struct TCPNATProbeMessage *pm = (struct TCPNATProbeMessage *) pq->ibuf;
2989 2995
2990 check_and_remove_pending_reversal (pq->address, pq->address->sa_family, &pm->clientIdentity); 2996 check_and_remove_pending_reversal (pq->address, pq->address->sa_family,
2997 &pm->clientIdentity);
2991 2998
2992 queue = GNUNET_new (struct Queue); 2999 queue = GNUNET_new (struct Queue);
2993 queue->target = pm->clientIdentity; 3000 queue->target = pm->clientIdentity;
@@ -3009,13 +3016,13 @@ proto_read_kx (void *cls)
3009 queue); 3016 queue);
3010 if (GNUNET_OK != decrypt_and_check_tc (queue, &tc, pq->ibuf)) 3017 if (GNUNET_OK != decrypt_and_check_tc (queue, &tc, pq->ibuf))
3011 { 3018 {
3012 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 3019 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
3013 "Invalid TCP KX received from %s\n", 3020 "Invalid TCP KX received from %s\n",
3014 GNUNET_a2s (pq->address, pq->address_len)); 3021 GNUNET_a2s (pq->address, pq->address_len));
3015 gcry_cipher_close (queue->in_cipher); 3022 gcry_cipher_close (queue->in_cipher);
3016 GNUNET_free (queue); 3023 GNUNET_free (queue);
3017 free_proto_queue (pq); 3024 free_proto_queue (pq);
3018 return; 3025 return;
3019 } 3026 }
3020 queue->target = tc.sender; 3027 queue->target = tc.sender;
3021 queue->cs = GNUNET_TRANSPORT_CS_INBOUND; 3028 queue->cs = GNUNET_TRANSPORT_CS_INBOUND;
@@ -3062,29 +3069,29 @@ create_proto_queue (struct GNUNET_NETWORK_Handle *sock,
3062 3069
3063 if (NULL == sock) 3070 if (NULL == sock)
3064 { 3071 {
3065 //sock = GNUNET_CONNECTION_create_from_sockaddr (AF_INET, addr, addrlen); 3072 // sock = GNUNET_CONNECTION_create_from_sockaddr (AF_INET, addr, addrlen);
3066 sock = GNUNET_NETWORK_socket_create (in->sa_family, SOCK_STREAM, 0); 3073 sock = GNUNET_NETWORK_socket_create (in->sa_family, SOCK_STREAM, 0);
3067 if (NULL == sock) 3074 if (NULL == sock)
3068 { 3075 {
3069 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, 3076 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
3070 "socket(%d) failed: %s", 3077 "socket(%d) failed: %s",
3071 in->sa_family, 3078 in->sa_family,
3072 strerror (errno)); 3079 strerror (errno));
3073 GNUNET_free (in); 3080 GNUNET_free (in);
3074 GNUNET_free (pq); 3081 GNUNET_free (pq);
3075 return NULL; 3082 return NULL;
3076 } 3083 }
3077 if ((GNUNET_OK != GNUNET_NETWORK_socket_connect (sock, in, addrlen)) && 3084 if ((GNUNET_OK != GNUNET_NETWORK_socket_connect (sock, in, addrlen)) &&
3078 (errno != EINPROGRESS)) 3085 (errno != EINPROGRESS))
3079 { 3086 {
3080 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, 3087 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
3081 "connect to `%s' failed: %s", 3088 "connect to `%s' failed: %s",
3082 GNUNET_a2s (in, addrlen), 3089 GNUNET_a2s (in, addrlen),
3083 strerror (errno)); 3090 strerror (errno));
3084 GNUNET_NETWORK_socket_close (sock); 3091 GNUNET_NETWORK_socket_close (sock);
3085 GNUNET_free (in); 3092 GNUNET_free (in);
3086 return NULL; 3093 return NULL;
3087 } 3094 }
3088 } 3095 }
3089 pq->address_len = addrlen; 3096 pq->address_len = addrlen;
3090 pq->address = in; 3097 pq->address = in;
@@ -3158,31 +3165,31 @@ try_connection_reversal (void *cls,
3158 struct sockaddr *in_addr; 3165 struct sockaddr *in_addr;
3159 3166
3160 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 3167 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
3161 "addr->sa_family %d\n", 3168 "addr->sa_family %d\n",
3162 addr->sa_family); 3169 addr->sa_family);
3163 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 3170 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
3164 "Try to connect back\n"); 3171 "Try to connect back\n");
3165 in_addr = GNUNET_memdup (addr, addrlen); 3172 in_addr = GNUNET_memdup (addr, addrlen);
3166 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 3173 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
3167 "in_addr->sa_family %d\n", 3174 "in_addr->sa_family %d\n",
3168 in_addr->sa_family); 3175 in_addr->sa_family);
3169 pq = create_proto_queue (NULL, in_addr, addrlen); 3176 pq = create_proto_queue (NULL, in_addr, addrlen);
3170 if (NULL != pq) 3177 if (NULL != pq)
3171 { 3178 {
3172 pm.header.size = htons (sizeof(struct TCPNATProbeMessage)); 3179 pm.header.size = htons (sizeof(struct TCPNATProbeMessage));
3173 pm.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_NAT_PROBE); 3180 pm.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_NAT_PROBE);
3174 pm.clientIdentity = my_identity; 3181 pm.clientIdentity = my_identity;
3175 memcpy (pq->write_buf, &pm, sizeof(struct TCPNATProbeMessage)); 3182 memcpy (pq->write_buf, &pm, sizeof(struct TCPNATProbeMessage));
3176 pq->write_off = sizeof(struct TCPNATProbeMessage); 3183 pq->write_off = sizeof(struct TCPNATProbeMessage);
3177 pq->write_task = GNUNET_SCHEDULER_add_write_net (PROTO_QUEUE_TIMEOUT, 3184 pq->write_task = GNUNET_SCHEDULER_add_write_net (PROTO_QUEUE_TIMEOUT,
3178 pq->sock, 3185 pq->sock,
3179 &proto_queue_write, 3186 &proto_queue_write,
3180 pq); 3187 pq);
3181 } 3188 }
3182 else 3189 else
3183 { 3190 {
3184 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, 3191 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
3185 "Couldn't create ProtoQueue for sending TCPNATProbeMessage\n"); 3192 "Couldn't create ProtoQueue for sending TCPNATProbeMessage\n");
3186 } 3193 }
3187} 3194}
3188 3195
@@ -3268,43 +3275,45 @@ mq_init (void *cls, const struct GNUNET_PeerIdentity *peer, const char *address)
3268 GNUNET_a2s (in, in_len)); 3275 GNUNET_a2s (in, in_len));
3269 3276
3270 switch (in->sa_family) 3277 switch (in->sa_family)
3278 {
3279 case AF_INET:
3280 v4 = (struct sockaddr_in *) in;
3281 if (0 == v4->sin_port)
3271 { 3282 {
3272 case AF_INET: 3283 is_natd = GNUNET_YES;
3273 v4 = (struct sockaddr_in *) in; 3284 GNUNET_CRYPTO_hash (in,
3274 if (0 == v4->sin_port){ 3285 sizeof(struct sockaddr),
3275 is_natd = GNUNET_YES; 3286 &key);
3276 GNUNET_CRYPTO_hash (in, 3287 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (
3277 sizeof(struct sockaddr), 3288 pending_reversals,
3278 &key); 3289 &key))
3279 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (pending_reversals,
3280 &key))
3281 {
3282 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
3283 "There is already a request reversal for `%s'at `%s'\n",
3284 GNUNET_i2s (peer),
3285 address);
3286 GNUNET_free (in);
3287 return GNUNET_SYSERR;
3288 }
3289 }
3290 break;
3291
3292 case AF_INET6:
3293 v6 = (struct sockaddr_in6 *) in;
3294 if (0 == v6->sin6_port)
3295 { 3290 {
3296 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, 3291 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
3297 "Request reversal for `%s' at `%s' not possible for an IPv6 address\n", 3292 "There is already a request reversal for `%s'at `%s'\n",
3298 GNUNET_i2s (peer), 3293 GNUNET_i2s (peer),
3299 address); 3294 address);
3300 GNUNET_free (in); 3295 GNUNET_free (in);
3301 return GNUNET_SYSERR; 3296 return GNUNET_SYSERR;
3302 } 3297 }
3303 break; 3298 }
3299 break;
3304 3300
3305 default: 3301 case AF_INET6:
3306 GNUNET_assert (0); 3302 v6 = (struct sockaddr_in6 *) in;
3303 if (0 == v6->sin6_port)
3304 {
3305 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
3306 "Request reversal for `%s' at `%s' not possible for an IPv6 address\n",
3307 GNUNET_i2s (peer),
3308 address);
3309 GNUNET_free (in);
3310 return GNUNET_SYSERR;
3307 } 3311 }
3312 break;
3313
3314 default:
3315 GNUNET_assert (0);
3316 }
3308 3317
3309 if (GNUNET_YES == is_natd) 3318 if (GNUNET_YES == is_natd)
3310 { 3319 {
@@ -3320,9 +3329,9 @@ mq_init (void *cls, const struct GNUNET_PeerIdentity *peer, const char *address)
3320 if (GNUNET_OK != GNUNET_NAT_request_reversal (nat, &local_sa, v4)) 3329 if (GNUNET_OK != GNUNET_NAT_request_reversal (nat, &local_sa, v4))
3321 { 3330 {
3322 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, 3331 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
3323 "request reversal for `%s' at `%s' failed\n", 3332 "request reversal for `%s' at `%s' failed\n",
3324 GNUNET_i2s (peer), 3333 GNUNET_i2s (peer),
3325 address); 3334 address);
3326 GNUNET_free (in); 3335 GNUNET_free (in);
3327 return GNUNET_SYSERR; 3336 return GNUNET_SYSERR;
3328 } 3337 }
@@ -3334,18 +3343,22 @@ mq_init (void *cls, const struct GNUNET_PeerIdentity *peer, const char *address)
3334 pending_reversal, 3343 pending_reversal,
3335 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); 3344 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
3336 pending_reversal->target = *peer; 3345 pending_reversal->target = *peer;
3337 pending_reversal->timeout_task = GNUNET_SCHEDULER_add_delayed (NAT_TIMEOUT, &pending_reversal_timeout, in); 3346 pending_reversal->timeout_task = GNUNET_SCHEDULER_add_delayed (NAT_TIMEOUT,
3347 &
3348 pending_reversal_timeout,
3349 in);
3338 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 3350 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
3339 "Created NAT WAIT connection to `%s' at `%s'\n", 3351 "Created NAT WAIT connection to `%s' at `%s'\n",
3340 GNUNET_i2s (peer), 3352 GNUNET_i2s (peer),
3341 GNUNET_a2s (in, sizeof (struct sockaddr))); 3353 GNUNET_a2s (in, sizeof (struct sockaddr)));
3342 } 3354 }
3343 else 3355 else
3344 { 3356 {
3345 struct GNUNET_NETWORK_Handle *sock; 3357 struct GNUNET_NETWORK_Handle *sock;
3346 struct Queue *queue; 3358 struct Queue *queue;
3347 3359
3348 sock = GNUNET_NETWORK_socket_create (in->sa_family, SOCK_STREAM, IPPROTO_TCP); 3360 sock = GNUNET_NETWORK_socket_create (in->sa_family, SOCK_STREAM,
3361 IPPROTO_TCP);
3349 if (NULL == sock) 3362 if (NULL == sock)
3350 { 3363 {
3351 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, 3364 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
@@ -3478,7 +3491,8 @@ do_shutdown (void *cls)
3478 GNUNET_NAT_unregister (nat); 3491 GNUNET_NAT_unregister (nat);
3479 nat = NULL; 3492 nat = NULL;
3480 } 3493 }
3481 GNUNET_CONTAINER_multihashmap_iterate (pending_reversals, &pending_reversals_delete_it, NULL); 3494 GNUNET_CONTAINER_multihashmap_iterate (pending_reversals,
3495 &pending_reversals_delete_it, NULL);
3482 GNUNET_CONTAINER_multihashmap_destroy (pending_reversals); 3496 GNUNET_CONTAINER_multihashmap_destroy (pending_reversals);
3483 GNUNET_CONTAINER_multihashmap_iterate (lt_map, &get_lt_delete_it, NULL); 3497 GNUNET_CONTAINER_multihashmap_iterate (lt_map, &get_lt_delete_it, NULL);
3484 GNUNET_CONTAINER_multihashmap_destroy (lt_map); 3498 GNUNET_CONTAINER_multihashmap_destroy (lt_map);
@@ -4040,7 +4054,7 @@ main (int argc, char *const *argv)
4040 int ret; 4054 int ret;
4041 4055
4042 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 4056 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
4043 "Starting tcp communicator\n"); 4057 "Starting tcp communicator\n");
4044 if (GNUNET_OK != 4058 if (GNUNET_OK !=
4045 GNUNET_STRINGS_get_utf8_args (argc, argv, 4059 GNUNET_STRINGS_get_utf8_args (argc, argv,
4046 &argc, &argv)) 4060 &argc, &argv))