aboutsummaryrefslogtreecommitdiff
path: root/src/transport
diff options
context:
space:
mode:
Diffstat (limited to 'src/transport')
-rw-r--r--src/transport/gnunet-communicator-tcp.c109
1 files changed, 70 insertions, 39 deletions
diff --git a/src/transport/gnunet-communicator-tcp.c b/src/transport/gnunet-communicator-tcp.c
index df1bdc410..1783edb91 100644
--- a/src/transport/gnunet-communicator-tcp.c
+++ b/src/transport/gnunet-communicator-tcp.c
@@ -836,6 +836,11 @@ static struct GNUNET_PEERSTORE_Handle *peerstore;
836int shutdown_running = GNUNET_NO; 836int shutdown_running = GNUNET_NO;
837 837
838/** 838/**
839 * The port the communicator should be assigned to.
840 */
841unsigned int bind_port;
842
843/**
839 * We have been notified that our listen socket has something to 844 * We have been notified that our listen socket has something to
840 * read. Do the read and reschedule this function to be called again 845 * read. Do the read and reschedule this function to be called again
841 * once more is available. 846 * once more is available.
@@ -856,7 +861,6 @@ listen_cb (void *cls);
856static void 861static void
857queue_destroy (struct Queue *queue) 862queue_destroy (struct Queue *queue)
858{ 863{
859 struct GNUNET_MQ_Handle *mq;
860 struct ListenTask *lt; 864 struct ListenTask *lt;
861 lt = GNUNET_new (struct ListenTask); 865 lt = GNUNET_new (struct ListenTask);
862 lt->listen_sock = queue->listen_sock; 866 lt->listen_sock = queue->listen_sock;
@@ -1432,7 +1436,7 @@ try_handle_plaintext (struct Queue *queue)
1432 if ((-1 != unverified_size) && (unverified_size > INITIAL_CORE_KX_SIZE)) 1436 if ((-1 != unverified_size) && (unverified_size > INITIAL_CORE_KX_SIZE))
1433 { 1437 {
1434 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 1438 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1435 "Already received data of size %u bigger than KX size %u!\n", 1439 "Already received data of size %lu bigger than KX size %lu!\n",
1436 unverified_size, 1440 unverified_size,
1437 INITIAL_CORE_KX_SIZE); 1441 INITIAL_CORE_KX_SIZE);
1438 GNUNET_break_op (0); 1442 GNUNET_break_op (0);
@@ -1709,6 +1713,8 @@ tcp_address_to_sockaddr_numeric_v6 (socklen_t *sock_len, struct sockaddr_in6 v6,
1709#if HAVE_SOCKADDR_IN_SIN_LEN 1713#if HAVE_SOCKADDR_IN_SIN_LEN
1710 v6.sin6_len = sizeof(sizeof(struct sockaddr_in6)); 1714 v6.sin6_len = sizeof(sizeof(struct sockaddr_in6));
1711#endif 1715#endif
1716 v6.sin6_flowinfo = 0;
1717 v6.sin6_scope_id = 0;
1712 in = GNUNET_memdup (&v6, sizeof(v6)); 1718 in = GNUNET_memdup (&v6, sizeof(v6));
1713 *sock_len = sizeof(struct sockaddr_in6); 1719 *sock_len = sizeof(struct sockaddr_in6);
1714 1720
@@ -1976,6 +1982,8 @@ tcp_address_to_sockaddr (const char *bindto, socklen_t *sock_len)
1976 // colon = strrchr (cp, ':'); 1982 // colon = strrchr (cp, ':');
1977 port = extract_port (bindto); 1983 port = extract_port (bindto);
1978 in = tcp_address_to_sockaddr_numeric_v6 (sock_len, v6, port); 1984 in = tcp_address_to_sockaddr_numeric_v6 (sock_len, v6, port);
1985 }else{
1986 GNUNET_assert (0);
1979 } 1987 }
1980 1988
1981 // GNUNET_free (start); 1989 // GNUNET_free (start);
@@ -2826,7 +2834,7 @@ mq_init (void *cls, const struct GNUNET_PeerIdentity *peer, const char *address)
2826 struct Queue *queue; 2834 struct Queue *queue;
2827 const char *path; 2835 const char *path;
2828 struct sockaddr *in; 2836 struct sockaddr *in;
2829 socklen_t in_len; 2837 socklen_t in_len = 0;
2830 struct GNUNET_NETWORK_Handle *sock; 2838 struct GNUNET_NETWORK_Handle *sock;
2831 2839
2832 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2840 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -3030,6 +3038,10 @@ nat_address_cb (void *cls,
3030 char *my_addr; 3038 char *my_addr;
3031 struct GNUNET_TRANSPORT_AddressIdentifier *ai; 3039 struct GNUNET_TRANSPORT_AddressIdentifier *ai;
3032 3040
3041 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
3042 "nat address cb %s\n",
3043 GNUNET_a2s (addr, addrlen));
3044
3033 if (GNUNET_YES == add_remove) 3045 if (GNUNET_YES == add_remove)
3034 { 3046 {
3035 enum GNUNET_NetworkType nt; 3047 enum GNUNET_NetworkType nt;
@@ -3056,6 +3068,35 @@ nat_address_cb (void *cls,
3056} 3068}
3057 3069
3058/** 3070/**
3071 * This method adds addresses to the DLL, that are later register at the NAT service.
3072 */
3073static void
3074add_addr (struct sockaddr *in, socklen_t in_len)
3075{
3076
3077 struct Addresses *saddrs;
3078
3079 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
3080 "add address %s\n",
3081 GNUNET_a2s (in, in_len));
3082
3083 saddrs = GNUNET_new (struct Addresses);
3084 saddrs->addr = in;
3085 saddrs->addr_len = in_len;
3086 GNUNET_CONTAINER_DLL_insert (addrs_head, addrs_tail, saddrs);
3087
3088 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
3089 "after add address %s\n",
3090 GNUNET_a2s (in, in_len));
3091
3092 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
3093 "add address %s\n",
3094 GNUNET_a2s (saddrs->addr, saddrs->addr_len));
3095
3096 addrs_lens++;
3097}
3098
3099/**
3059 * This method launch network interactions for each address we like to bind to. 3100 * This method launch network interactions for each address we like to bind to.
3060 * 3101 *
3061 * @param addr The address we will listen to. 3102 * @param addr The address we will listen to.
@@ -3063,7 +3104,7 @@ nat_address_cb (void *cls,
3063 * @return GNUNET_SYSERR in case of error. GNUNET_OK in case we are successfully listen to the address. 3104 * @return GNUNET_SYSERR in case of error. GNUNET_OK in case we are successfully listen to the address.
3064 */ 3105 */
3065static int 3106static int
3066init_socket (const struct sockaddr *addr, 3107init_socket (struct sockaddr *addr,
3067 socklen_t in_len) 3108 socklen_t in_len)
3068{ 3109{
3069 struct sockaddr_storage in_sto; 3110 struct sockaddr_storage in_sto;
@@ -3178,6 +3219,7 @@ init_socket (const struct sockaddr *addr,
3178 return GNUNET_SYSERR; 3219 return GNUNET_SYSERR;
3179 } 3220 }
3180 3221
3222 add_addr (addr, in_len);
3181 return GNUNET_OK; 3223 return GNUNET_OK;
3182 3224
3183} 3225}
@@ -3194,6 +3236,10 @@ nat_register ()
3194 int i; 3236 int i;
3195 struct Addresses *pos; 3237 struct Addresses *pos;
3196 3238
3239
3240 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
3241 "starting nat register!\n");
3242
3197 i = 0; 3243 i = 0;
3198 saddrs = GNUNET_malloc ((addrs_lens + 1) * sizeof(struct sockaddr *)); 3244 saddrs = GNUNET_malloc ((addrs_lens + 1) * sizeof(struct sockaddr *));
3199 3245
@@ -3202,6 +3248,10 @@ nat_register ()
3202 for (pos = addrs_head; NULL != pos; pos = pos->next) 3248 for (pos = addrs_head; NULL != pos; pos = pos->next)
3203 { 3249 {
3204 3250
3251 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
3252 "registering address %s\n",
3253 GNUNET_a2s (addrs_head->addr, addrs_head->addr_len));
3254
3205 saddr_lens[i] = addrs_head->addr_len; 3255 saddr_lens[i] = addrs_head->addr_len;
3206 saddrs[i] = GNUNET_memdup (addrs_head->addr, saddr_lens[i]); 3256 saddrs[i] = GNUNET_memdup (addrs_head->addr, saddr_lens[i]);
3207 3257
@@ -3236,22 +3286,6 @@ nat_register ()
3236} 3286}
3237 3287
3238/** 3288/**
3239 * This method adds addresses to the DLL, that are later register at the NAT service.
3240 */
3241static void
3242add_addr (struct sockaddr *in, socklen_t in_len)
3243{
3244
3245 struct Addresses *saddrs;
3246
3247 saddrs = GNUNET_new (struct Addresses);
3248 saddrs->addr = in;
3249 saddrs->addr_len = in_len;
3250 GNUNET_CONTAINER_DLL_insert (addrs_head, addrs_tail, saddrs);
3251 addrs_lens++;
3252}
3253
3254/**
3255 * This method is the callback called by the resolver API, and wraps method init_socket. 3289 * This method is the callback called by the resolver API, and wraps method init_socket.
3256 * 3290 *
3257 * @param cls The port we will bind to. 3291 * @param cls The port we will bind to.
@@ -3266,22 +3300,19 @@ init_socket_resolv (void *cls,
3266 struct sockaddr_in *v4; 3300 struct sockaddr_in *v4;
3267 struct sockaddr_in6 *v6; 3301 struct sockaddr_in6 *v6;
3268 struct sockaddr *in; 3302 struct sockaddr *in;
3269 unsigned int *port;
3270 3303
3271 port = cls; 3304 (void) cls;
3272 if (NULL != addr) 3305 if (NULL != addr)
3273 { 3306 {
3274 if (AF_INET == addr->sa_family) 3307 if (AF_INET == addr->sa_family)
3275 { 3308 {
3276 v4 = (struct sockaddr_in *) addr; 3309 v4 = (struct sockaddr_in *) addr;
3277 in = tcp_address_to_sockaddr_numeric_v4 (&in_len, *v4, *port);// _global); 3310 in = tcp_address_to_sockaddr_numeric_v4 (&in_len, *v4, bind_port);// _global);
3278 add_addr (in, in_len);
3279 } 3311 }
3280 else if (AF_INET6 == addr->sa_family) 3312 else if (AF_INET6 == addr->sa_family)
3281 { 3313 {
3282 v6 = (struct sockaddr_in6 *) addr; 3314 v6 = (struct sockaddr_in6 *) addr;
3283 in = tcp_address_to_sockaddr_numeric_v6 (&in_len, *v6, *port);// _global); 3315 in = tcp_address_to_sockaddr_numeric_v6 (&in_len, *v6, bind_port);// _global);
3284 add_addr (in, in_len);
3285 } 3316 }
3286 else 3317 else
3287 { 3318 {
@@ -3292,13 +3323,17 @@ init_socket_resolv (void *cls,
3292 AF_INET6); 3323 AF_INET6);
3293 return; 3324 return;
3294 } 3325 }
3295 init_socket (in, 3326 init_socket (in, in_len);
3296 in_len);
3297 } 3327 }
3298 else 3328 else
3299 { 3329 {
3300 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 3330 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
3301 "Address is NULL. This might be an error or the resolver finished resolving.\n"); 3331 "Address is NULL. This might be an error or the resolver finished resolving.\n");
3332 if (NULL == addrs_head){
3333 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
3334 "Resolver finished resolving, but we do not listen to an address!.\n");
3335 return;
3336 }
3302 nat_register (); 3337 nat_register ();
3303 } 3338 }
3304} 3339}
@@ -3364,9 +3399,9 @@ run (void *cls,
3364 return; 3399 return;
3365 } 3400 }
3366 3401
3367 if (1 == sscanf (bindto, "%u%1s", &port, dummy)) 3402 if (1 == sscanf (bindto, "%u%1s", &bind_port, dummy))
3368 { 3403 {
3369 po = tcp_address_to_sockaddr_port_only (bindto, &port); 3404 po = tcp_address_to_sockaddr_port_only (bindto, &bind_port);
3370 3405
3371 addr_len_ipv4 = po->addr_len_ipv4; 3406 addr_len_ipv4 = po->addr_len_ipv4;
3372 3407
@@ -3378,14 +3413,12 @@ run (void *cls,
3378 if (NULL != po->addr_ipv4) 3413 if (NULL != po->addr_ipv4)
3379 { 3414 {
3380 init_socket (po->addr_ipv4, addr_len_ipv4); 3415 init_socket (po->addr_ipv4, addr_len_ipv4);
3381 add_addr (po->addr_ipv4, addr_len_ipv4);
3382 } 3416 }
3383 3417
3384 if (NULL != po->addr_ipv6) 3418 if (NULL != po->addr_ipv6)
3385 { 3419 {
3386 addr_len_ipv6 = po->addr_len_ipv6; 3420 addr_len_ipv6 = po->addr_len_ipv6;
3387 init_socket (po->addr_ipv6, addr_len_ipv6); 3421 init_socket (po->addr_ipv6, addr_len_ipv6);
3388 add_addr (po->addr_ipv6, addr_len_ipv6);
3389 } 3422 }
3390 3423
3391 GNUNET_free (po); 3424 GNUNET_free (po);
@@ -3399,11 +3432,10 @@ run (void *cls,
3399 3432
3400 if (1 == inet_pton (AF_INET, start, &v4.sin_addr)) 3433 if (1 == inet_pton (AF_INET, start, &v4.sin_addr))
3401 { 3434 {
3402 port = extract_port (bindto); 3435 bind_port = extract_port (bindto);
3403 3436
3404 in = tcp_address_to_sockaddr_numeric_v4 (&in_len, v4, port); 3437 in = tcp_address_to_sockaddr_numeric_v4 (&in_len, v4, bind_port);
3405 init_socket (in, in_len); 3438 init_socket (in, in_len);
3406 add_addr (in, in_len);
3407 nat_register (); 3439 nat_register ();
3408 GNUNET_free (bindto); 3440 GNUNET_free (bindto);
3409 return; 3441 return;
@@ -3411,17 +3443,16 @@ run (void *cls,
3411 3443
3412 if (1 == inet_pton (AF_INET6, start, &v6.sin6_addr)) 3444 if (1 == inet_pton (AF_INET6, start, &v6.sin6_addr))
3413 { 3445 {
3414 port = extract_port (bindto); 3446 bind_port = extract_port (bindto);
3415 in = tcp_address_to_sockaddr_numeric_v6 (&in_len, v6, port); 3447 in = tcp_address_to_sockaddr_numeric_v6 (&in_len, v6, bind_port);
3416 init_socket (in, in_len); 3448 init_socket (in, in_len);
3417 add_addr (in, in_len);
3418 nat_register (); 3449 nat_register ();
3419 GNUNET_free (bindto); 3450 GNUNET_free (bindto);
3420 return; 3451 return;
3421 } 3452 }
3422 3453
3423 3454
3424 port = extract_port (bindto); 3455 bind_port = extract_port (bindto);
3425 3456
3426 resolve_request_handle = GNUNET_RESOLVER_ip_get (strtok_r (bindto, ":", 3457 resolve_request_handle = GNUNET_RESOLVER_ip_get (strtok_r (bindto, ":",
3427 &rest), 3458 &rest),