diff options
author | Christian Grothoff <christian@grothoff.org> | 2010-08-21 16:54:47 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2010-08-21 16:54:47 +0000 |
commit | abbb17455c5b2a93df79e20158e152b6b7f3becd (patch) | |
tree | 0337bcf5615bb230ebda235a87feedac4c14a9dc /src/transport/gnunet-nat-server.c | |
parent | 0465310093c39138a7b894e15b40a819ce768ae4 (diff) | |
download | gnunet-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.c | 105 |
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; | |||
172 | static int rawsock; | 177 | static int rawsock; |
173 | 178 | ||
174 | /** | 179 | /** |
180 | * Socket we use to send our UDP requests. | ||
181 | */ | ||
182 | static int udpsock; | ||
183 | |||
184 | /** | ||
175 | * Target "dummy" address. | 185 | * Target "dummy" address. |
176 | */ | 186 | */ |
177 | static struct in_addr dummy; | 187 | static 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 | */ | ||
284 | static void | ||
285 | send_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 | */ |
272 | static void | 320 | static 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 | */ | ||
500 | static int | ||
501 | make_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 | |||
447 | int | 536 | int |
448 | main (int argc, | 537 | main (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 | ||