aboutsummaryrefslogtreecommitdiff
path: root/src/nat
diff options
context:
space:
mode:
authorBart Polot <bart@net.in.tum.de>2015-10-06 19:09:30 +0000
committerBart Polot <bart@net.in.tum.de>2015-10-06 19:09:30 +0000
commit88a70fd6af0e132f2a13bc682f4c10f3d4971198 (patch)
tree4cbc86459cfd3bafcc09c7b627028e9ba3218ff4 /src/nat
parent74735f9ef6d47283feb58d8b5ca7209875150063 (diff)
downloadgnunet-88a70fd6af0e132f2a13bc682f4c10f3d4971198.tar.gz
gnunet-88a70fd6af0e132f2a13bc682f4c10f3d4971198.zip
- fix multiple gnunet-nat crashes
Diffstat (limited to 'src/nat')
-rw-r--r--src/nat/nat_auto.c74
-rw-r--r--src/nat/nat_stun.c6
-rw-r--r--src/nat/test_stun.c11
3 files changed, 47 insertions, 44 deletions
diff --git a/src/nat/nat_auto.c b/src/nat/nat_auto.c
index a76bb0d1d..9d0ee5516 100644
--- a/src/nat/nat_auto.c
+++ b/src/nat/nat_auto.c
@@ -236,16 +236,21 @@ process_stun_reply(struct sockaddr_in* answer, struct GNUNET_NAT_AutoHandle *ah)
236static void 236static void
237stop_stun () 237stop_stun ()
238{ 238{
239 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Stopping NAT and quitting...\n"); 239 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Stopping STUN and quitting...\n");
240 240
241 //Clean task 241 /* Clean task */
242 if(NULL != ltask4) 242 if(NULL != ltask4)
243 {
243 GNUNET_SCHEDULER_cancel (ltask4); 244 GNUNET_SCHEDULER_cancel (ltask4);
245 ltask4 = NULL;
246 }
244 247
245 //Clean socket 248 /* Clean socket */
246 if(NULL != lsock4) 249 if(NULL != lsock4)
250 {
247 GNUNET_NETWORK_socket_close (lsock4); 251 GNUNET_NETWORK_socket_close (lsock4);
248 252 lsock4 = NULL;
253 }
249} 254}
250 255
251/** 256/**
@@ -271,47 +276,40 @@ do_udp_read (void *cls,
271 { 276 {
272 rlen = GNUNET_NETWORK_socket_recv (lsock4, reply_buf, sizeof (reply_buf)); 277 rlen = GNUNET_NETWORK_socket_recv (lsock4, reply_buf, sizeof (reply_buf));
273 278
274
275 //Lets handle the packet 279 //Lets handle the packet
276 memset(&answer, 0, sizeof(struct sockaddr_in)); 280 memset(&answer, 0, sizeof(struct sockaddr_in));
277
278
279
280
281
282 if(ah->phase == AUTO_NAT_PUNCHED) 281 if(ah->phase == AUTO_NAT_PUNCHED)
283 { 282 {
284 //Destroy the connection 283 //Destroy the connection
285 GNUNET_NETWORK_socket_close (lsock4); 284 GNUNET_NETWORK_socket_close (lsock4);
286 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "The external server was able to connect back"); 285 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
286 "The external server was able to connect back");
287 ah->connected_back = GNUNET_YES; 287 ah->connected_back = GNUNET_YES;
288 next_phase (ah); 288 next_phase (ah);
289 } 289 }
290 else 290 else
291 { 291 {
292 if(GNUNET_OK == GNUNET_NAT_stun_handle_packet(reply_buf,rlen, &answer)) 292 if (GNUNET_OK == GNUNET_NAT_stun_handle_packet (reply_buf, rlen, &answer))
293 { 293 {
294 //Process the answer 294 //Process the answer
295 process_stun_reply(&answer, ah); 295 process_stun_reply (&answer, ah);
296
297 } 296 }
298 else 297 else
299 { 298 {
300 next_phase (ah); 299 next_phase (ah);
301 } 300 }
302 } 301 }
303
304
305 } 302 }
306 else 303 else
307 { 304 {
308 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "TIMEOUT while aiting for an answer"); 305 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
309 if(ah->phase == AUTO_NAT_PUNCHED) 306 "TIMEOUT while waiting for an answer\n");
307 if (ah->phase == AUTO_NAT_PUNCHED)
310 { 308 {
311 stop_stun(); 309 stop_stun();
312 } 310 }
313 311
314 next_phase(ah); 312 next_phase (ah);
315 } 313 }
316 314
317 315
@@ -357,14 +355,15 @@ bind_v4 ()
357 355
358 356
359 357
360static void request_callback(void *cls, 358static void request_callback (void *cls,
361 enum GNUNET_NAT_StatusCode result) 359 enum GNUNET_NAT_StatusCode result)
362{ 360{
363 struct GNUNET_NAT_AutoHandle *ah = cls; 361 // struct GNUNET_NAT_AutoHandle *ah = cls;
364 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Stopping NAT and quitting...\n"); 362
365 stop_stun(); 363 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Request callback: stop and quit\n");
364 stop_stun ();
366 365
367 next_phase(ah); 366 // next_phase (ah); FIXME this always will be NULL, as called in test_stun()
368}; 367};
369 368
370 369
@@ -498,7 +497,7 @@ static void
498test_stun (struct GNUNET_NAT_AutoHandle *ah) 497test_stun (struct GNUNET_NAT_AutoHandle *ah)
499{ 498{
500 499
501 GNUNET_log (GNUNET_ERROR_TYPE_INFO,"Running STUN test"); 500 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Running STUN test\n");
502 501
503 /* Get port from the configuration */ 502 /* Get port from the configuration */
504 if (GNUNET_OK != 503 if (GNUNET_OK !=
@@ -530,14 +529,15 @@ test_stun (struct GNUNET_NAT_AutoHandle *ah)
530 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 529 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
531 "STUN service listens on port %u\n", 530 "STUN service listens on port %u\n",
532 port); 531 port);
533 if( GNUNET_NO == GNUNET_NAT_stun_make_request(stun_server, stun_port, lsock4, &request_callback, NULL)) 532 if (GNUNET_NO == GNUNET_NAT_stun_make_request (stun_server, stun_port,
533 lsock4, &request_callback,
534 NULL))
534 { 535 {
535 /*An error happened*/ 536 /*An error happened*/
536 stop_stun(); 537 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "STUN error, stopping\n");
537 next_phase(ah); 538 stop_stun ();
539 next_phase (ah);
538 } 540 }
539
540
541} 541}
542 542
543 543
@@ -648,7 +648,7 @@ test_nat_punched (struct GNUNET_NAT_AutoHandle *ah)
648 struct GNUNET_NAT_TestMessage msg; 648 struct GNUNET_NAT_TestMessage msg;
649 649
650 650
651 if(ah->stun_ip) 651 if (ah->stun_ip)
652 { 652 {
653 LOG (GNUNET_ERROR_TYPE_INFO, 653 LOG (GNUNET_ERROR_TYPE_INFO,
654 "Asking gnunet-nat-server to connect to `%s'\n", 654 "Asking gnunet-nat-server to connect to `%s'\n",
@@ -675,8 +675,12 @@ test_nat_punched (struct GNUNET_NAT_AutoHandle *ah)
675 NAT_SERVER_TIMEOUT, 675 NAT_SERVER_TIMEOUT,
676 GNUNET_YES, NULL, 676 GNUNET_YES, NULL,
677 NULL)); 677 NULL));
678 ltask4 = GNUNET_SCHEDULER_add_read_net (NAT_SERVER_TIMEOUT, 678 if (NULL != ltask4)
679 lsock4, &do_udp_read, ah); 679 {
680 GNUNET_SCHEDULER_cancel (ltask4);
681 ltask4 = GNUNET_SCHEDULER_add_read_net (NAT_SERVER_TIMEOUT,
682 lsock4, &do_udp_read, ah);
683 }
680 684
681 } 685 }
682 else 686 else
@@ -847,7 +851,7 @@ next_phase (struct GNUNET_NAT_AutoHandle *ah)
847 test_local_ip (ah); 851 test_local_ip (ah);
848 break; 852 break;
849 case AUTO_NAT_PUNCHED: 853 case AUTO_NAT_PUNCHED:
850 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"Will run GNUNET_ERROR_TYPE_DEBUG\n"); 854 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"Will run AUTO_NAT_PUNCHED\n");
851 test_nat_punched (ah); 855 test_nat_punched (ah);
852 break; 856 break;
853 case AUTO_UPNPC: 857 case AUTO_UPNPC:
diff --git a/src/nat/nat_stun.c b/src/nat/nat_stun.c
index 7b41b3387..5c819356c 100644
--- a/src/nat/nat_stun.c
+++ b/src/nat/nat_stun.c
@@ -19,7 +19,7 @@
19*/ 19*/
20 20
21/** 21/**
22 * 22 *
23 * This code provides some support for doing STUN transactions. 23 * This code provides some support for doing STUN transactions.
24 * We send simplest possible packet ia REQUEST with BIND to a STUN server. 24 * We send simplest possible packet ia REQUEST with BIND to a STUN server.
25 * 25 *
@@ -29,7 +29,7 @@
29 * structured as a type, length and a value (whose format depends 29 * structured as a type, length and a value (whose format depends
30 * on the type, but often contains addresses). 30 * on the type, but often contains addresses).
31 * Of course all fields are in network format. 31 * Of course all fields are in network format.
32 * 32 *
33 * This code was based on ministun.c. 33 * This code was based on ministun.c.
34 * 34 *
35 * 35 *
@@ -567,7 +567,7 @@ GNUNET_NAT_stun_make_request(char * server,
567 TIMEOUT, 567 TIMEOUT,
568 &stun_dns_callback, rh); 568 &stun_dns_callback, rh);
569 569
570 if(rh->dns_active == NULL) 570 if (rh->dns_active == NULL)
571 { 571 {
572 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "Failed DNS"); 572 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "Failed DNS");
573 GNUNET_free(rh); 573 GNUNET_free(rh);
diff --git a/src/nat/test_stun.c b/src/nat/test_stun.c
index edb7a89eb..5045b1cac 100644
--- a/src/nat/test_stun.c
+++ b/src/nat/test_stun.c
@@ -105,7 +105,7 @@ stop ()
105 * Activity on our incoming socket. Read data from the 105 * Activity on our incoming socket. Read data from the
106 * incoming connection. 106 * incoming connection.
107 * 107 *
108 * @param cls 108 * @param cls
109 * @param tc scheduler context 109 * @param tc scheduler context
110 */ 110 */
111static void 111static void
@@ -123,7 +123,7 @@ do_udp_read (void *cls,
123 { 123 {
124 rlen = GNUNET_NETWORK_socket_recv (lsock4, reply_buf, sizeof (reply_buf)); 124 rlen = GNUNET_NETWORK_socket_recv (lsock4, reply_buf, sizeof (reply_buf));
125 125
126 126
127 //Lets handle the packet 127 //Lets handle the packet
128 memset(&answer, 0, sizeof(struct sockaddr_in)); 128 memset(&answer, 0, sizeof(struct sockaddr_in));
129 129
@@ -154,8 +154,6 @@ do_udp_read (void *cls,
154 } 154 }
155 155
156 ltask4 = NULL; 156 ltask4 = NULL;
157
158
159} 157}
160 158
161 159
@@ -176,7 +174,7 @@ bind_v4 ()
176 sa4.sin_port = htons (port); 174 sa4.sin_port = htons (port);
177#if HAVE_SOCKADDR_IN_SIN_LEN 175#if HAVE_SOCKADDR_IN_SIN_LEN
178 sa4.sin_len = sizeof (sa4); 176 sa4.sin_len = sizeof (sa4);
179#endif 177#endif
180 ls = GNUNET_NETWORK_socket_create (AF_INET, 178 ls = GNUNET_NETWORK_socket_create (AF_INET,
181 SOCK_DGRAM, 179 SOCK_DGRAM,
182 0); 180 0);
@@ -243,7 +241,8 @@ run (void *cls, char *const *args, const char *cfgfile,
243 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 241 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
244 "Service listens on port %u\n", 242 "Service listens on port %u\n",
245 port); 243 port);
246 GNUNET_NAT_stun_make_request(stun_server, stun_port, lsock4, &request_callback, NULL); 244 GNUNET_NAT_stun_make_request (stun_server, stun_port, lsock4,
245 &request_callback, NULL);
247 246
248 GNUNET_SCHEDULER_add_delayed (TIMEOUT, &stop, NULL); 247 GNUNET_SCHEDULER_add_delayed (TIMEOUT, &stop, NULL);
249 248