aboutsummaryrefslogtreecommitdiff
path: root/src/transport/gnunet-nat-server.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2010-08-21 16:54:47 +0000
committerChristian Grothoff <christian@grothoff.org>2010-08-21 16:54:47 +0000
commitabbb17455c5b2a93df79e20158e152b6b7f3becd (patch)
tree0337bcf5615bb230ebda235a87feedac4c14a9dc /src/transport/gnunet-nat-server.c
parent0465310093c39138a7b894e15b40a819ce768ae4 (diff)
downloadgnunet-abbb17455c5b2a93df79e20158e152b6b7f3becd.tar.gz
gnunet-abbb17455c5b2a93df79e20158e152b6b7f3becd.zip
adding UDP server side
Diffstat (limited to 'src/transport/gnunet-nat-server.c')
-rw-r--r--src/transport/gnunet-nat-server.c105
1 files changed, 103 insertions, 2 deletions
diff --git a/src/transport/gnunet-nat-server.c b/src/transport/gnunet-nat-server.c
index e9cbee47c..e3631b63f 100644
--- a/src/transport/gnunet-nat-server.c
+++ b/src/transport/gnunet-nat-server.c
@@ -74,6 +74,11 @@
74#define DUMMY_IP "192.0.2.86" 74#define DUMMY_IP "192.0.2.86"
75 75
76/** 76/**
77 * Port for UDP
78 */
79#define NAT_TRAV_PORT 22225
80
81/**
77 * How often do we send our ICMP messages to receive replies? 82 * How often do we send our ICMP messages to receive replies?
78 */ 83 */
79#define ICMP_SEND_FREQUENCY_MS 500 84#define ICMP_SEND_FREQUENCY_MS 500
@@ -172,6 +177,11 @@ static int icmpsock;
172static int rawsock; 177static int rawsock;
173 178
174/** 179/**
180 * Socket we use to send our UDP requests.
181 */
182static int udpsock;
183
184/**
175 * Target "dummy" address. 185 * Target "dummy" address.
176 */ 186 */
177static struct in_addr dummy; 187static struct in_addr dummy;
@@ -258,7 +268,7 @@ send_icmp_echo (const struct in_addr *my_ip)
258 "sendto failed: %s\n", strerror(errno)); 268 "sendto failed: %s\n", strerror(errno));
259#endif 269#endif
260 } 270 }
261 else if (err != off) 271 else if (err != sizeof (packet))
262 { 272 {
263 fprintf(stderr, 273 fprintf(stderr,
264 "Error: partial send of ICMP message\n"); 274 "Error: partial send of ICMP message\n");
@@ -267,6 +277,44 @@ send_icmp_echo (const struct in_addr *my_ip)
267 277
268 278
269/** 279/**
280 * Send a UDP message to the dummy IP.
281 *
282 * @param my_ip source address (our ip address)
283 */
284static void
285send_udp (const struct in_addr *my_ip)
286{
287 struct sockaddr_in dst;
288 ssize_t err;
289
290 memset (&dst, 0, sizeof (dst));
291 dst.sin_family = AF_INET;
292#if HAVE_SOCKADDR_IN_SIN_LEN
293 dst.sin_len = sizeof (struct sockaddr_in);
294#endif
295 dst.sin_addr = dummy;
296 dst.sin_port = htons (NAT_TRAV_PORT);
297 err = sendto(udpsock,
298 NULL, 0, 0,
299 (struct sockaddr*)&dst,
300 sizeof(dst));
301 if (err < 0)
302 {
303#if VERBOSE
304 fprintf(stderr,
305 "sendto failed: %s\n", strerror(errno));
306#endif
307 }
308 else if (err != 0)
309 {
310 fprintf(stderr,
311 "Error: partial send of ICMP message\n");
312 }
313}
314
315
316
317/**
270 * We've received an ICMP response. Process it. 318 * We've received an ICMP response. Process it.
271 */ 319 */
272static void 320static void
@@ -444,6 +492,47 @@ make_raw_socket ()
444} 492}
445 493
446 494
495/**
496 * Create a UDP socket for writinging.
497 *
498 * @return -1 on error
499 */
500static int
501make_udp_socket ()
502{
503 int ret;
504 struct sockaddr_in addr;
505
506 ret = socket (AF_INET, SOCK_DGRAM, 0);
507 if (-1 == ret)
508 {
509 fprintf (stderr,
510 "Error opening UDP socket: %s\n",
511 strerror (errno));
512 return -1;
513 }
514 memset (&addr, 0, sizeof (addr));
515 addr.sin_family = AF_INET;
516#if HAVE_SOCKADDR_IN_SIN_LEN
517 addr.sin_len = sizeof (struct sockaddr_in);
518#endif
519 /* addr.sin_addr zero == ours (hopefully...) */
520 addr.sin_port = htons (NAT_TRAV_PORT);
521
522 if (0 != bind (ret,
523 &addr,
524 sizeof(addr)))
525 {
526 fprintf (stderr,
527 "Error binding UDP socket to port %u: %s\n",
528 NAT_TRAV_PORT,
529 strerror (errno));
530 /* likely problematic, but not certain, try to continue */
531 }
532 return ret;
533}
534
535
447int 536int
448main (int argc, 537main (int argc,
449 char *const *argv) 538 char *const *argv)
@@ -452,6 +541,7 @@ main (int argc,
452 fd_set rs; 541 fd_set rs;
453 struct timeval tv; 542 struct timeval tv;
454 uid_t uid; 543 uid_t uid;
544 unsigned int alt;
455 545
456 if (argc != 2) 546 if (argc != 2)
457 { 547 {
@@ -489,6 +579,13 @@ main (int argc,
489 strerror (errno)); 579 strerror (errno));
490 /* not critical, continue anyway */ 580 /* not critical, continue anyway */
491 } 581 }
582 if (-1 == (udpsock = make_udp_socket()))
583 {
584 close (icmpsock);
585 close (rawsock);
586 return 3;
587 }
588 alt = 0;
492 while (1) 589 while (1)
493 { 590 {
494 FD_ZERO (&rs); 591 FD_ZERO (&rs);
@@ -506,11 +603,15 @@ main (int argc,
506 } 603 }
507 if (FD_ISSET (icmpsock, &rs)) 604 if (FD_ISSET (icmpsock, &rs))
508 process_icmp_response (); 605 process_icmp_response ();
509 send_icmp_echo (&external); 606 if (0 == (++alt % 2))
607 send_icmp_echo (&external);
608 else
609 send_udp (&external);
510 } 610 }
511 /* select failed (internal error or OS out of resources) */ 611 /* select failed (internal error or OS out of resources) */
512 close (icmpsock); 612 close (icmpsock);
513 close (rawsock); 613 close (rawsock);
614 close (udpsock);
514 return 4; 615 return 4;
515} 616}
516 617