X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fnat%2Fgnunet-nat-server.c;h=1a98cdc9628f1f871dc98a41bd91b47f8e0907e7;hb=27c12911f4f2aba2d90099270d70de846e83854f;hp=bf4318a91481471f75b739319ceb56d5883dd6df;hpb=ec346597fba6b7fdec3939de40b3b7aba322049d;p=oweals%2Fgnunet.git diff --git a/src/nat/gnunet-nat-server.c b/src/nat/gnunet-nat-server.c index bf4318a91..1a98cdc96 100644 --- a/src/nat/gnunet-nat-server.c +++ b/src/nat/gnunet-nat-server.c @@ -29,7 +29,6 @@ #include "gnunet_protocols.h" #include "nat.h" -#define DEBUG_NAT GNUNET_NO /** * Our server. @@ -51,30 +50,21 @@ static const struct GNUNET_CONFIGURATION_Handle *cfg; * @param is_tcp mark for TCP (GNUNET_YES) or UDP (GNUNET_NO) */ static void -try_anat (uint32_t dst_ipv4, - uint16_t dport, - int is_tcp) +try_anat (uint32_t dst_ipv4, uint16_t dport, int is_tcp) { struct GNUNET_NAT_Handle *h; struct sockaddr_in sa; -#if DEBUG_NAT GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Asking for connection reversal with %x and code %u\n", - (unsigned int) dst_ipv4, - (unsigned int) dport); -#endif - h = GNUNET_NAT_register (cfg, - is_tcp, - dport, - 0, NULL, NULL, - NULL, NULL, NULL); + "Asking for connection reversal with %x and code %u\n", + (unsigned int) dst_ipv4, (unsigned int) dport); + h = GNUNET_NAT_register (cfg, is_tcp, dport, 0, NULL, NULL, NULL, NULL, NULL); memset (&sa, 0, sizeof (sa)); sa.sin_family = AF_INET; #if HAVE_SOCKADDR_IN_SIN_LEN sa.sin_len = sizeof (sa); #endif - sa.sin_addr.s_addr = dst_ipv4; + sa.sin_addr.s_addr = dst_ipv4; GNUNET_NAT_run_client (h, &sa); GNUNET_NAT_unregister (h); } @@ -83,16 +73,16 @@ try_anat (uint32_t dst_ipv4, /** * Closure for 'tcp_send'. */ -struct TcpContext +struct TcpContext { /** * TCP socket. */ struct GNUNET_NETWORK_Handle *s; - /** + /** * Data to transmit. - */ + */ uint16_t data; }; @@ -101,27 +91,24 @@ struct TcpContext * Task called by the scheduler once we can do the TCP send * (or once we failed to connect...). * - * @param ctx the 'struct TcpContext' + * @param cls the 'struct TcpContext' * @param tc scheduler context */ static void -tcp_send (void *cls, - const struct GNUNET_SCHEDULER_TaskContext *tc) +tcp_send (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { struct TcpContext *ctx = cls; - if ( (NULL != tc->write_ready) && - (GNUNET_NETWORK_fdset_isset (tc->write_ready, - ctx->s)) ) + if ((NULL != tc->write_ready) && + (GNUNET_NETWORK_fdset_isset (tc->write_ready, ctx->s))) + { + if (-1 == + GNUNET_NETWORK_socket_send (ctx->s, &ctx->data, sizeof (ctx->data))) { - if (-1 == GNUNET_NETWORK_socket_send (ctx->s, &ctx->data, sizeof (ctx->data))) - { -#if DEBUG_NAT - GNUNET_log_strerror (GNUNET_ERROR_TYPE_DEBUG, "send"); -#endif - } - GNUNET_NETWORK_socket_shutdown (ctx->s, SHUT_RDWR); + GNUNET_log_strerror (GNUNET_ERROR_TYPE_DEBUG, "send"); } + GNUNET_NETWORK_socket_shutdown (ctx->s, SHUT_RDWR); + } GNUNET_NETWORK_socket_close (ctx->s); GNUNET_free (ctx); } @@ -130,15 +117,13 @@ tcp_send (void *cls, /** * Try to send 'data' to the * IP 'dst_ipv4' at port 'dport' via TCP. - * - * @param dst_ivp4 target IP + * + * @param dst_ipv4 target IP * @param dport target port * @param data data to send */ static void -try_send_tcp (uint32_t dst_ipv4, - uint16_t dport, - uint16_t data) +try_send_tcp (uint32_t dst_ipv4, uint16_t dport, uint16_t data) { struct GNUNET_NETWORK_Handle *s; struct sockaddr_in sa; @@ -146,77 +131,66 @@ try_send_tcp (uint32_t dst_ipv4, s = GNUNET_NETWORK_socket_create (AF_INET, SOCK_STREAM, 0); if (NULL == s) - { - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "socket"); - return; - } + { + GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "socket"); + return; + } memset (&sa, 0, sizeof (sa)); sa.sin_family = AF_INET; #if HAVE_SOCKADDR_IN_SIN_LEN sa.sin_len = sizeof (sa); #endif - sa.sin_addr.s_addr = dst_ipv4; + sa.sin_addr.s_addr = dst_ipv4; sa.sin_port = htons (dport); -#if DEBUG_NAT - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Sending TCP message to `%s'\n", - GNUNET_a2s ((struct sockaddr*) &sa, sizeof (sa))); -#endif - if ( (GNUNET_OK != - GNUNET_NETWORK_socket_connect (s, - (const struct sockaddr*) &sa, sizeof (sa))) && - (errno != EINPROGRESS) ) - { - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "connect"); - GNUNET_NETWORK_socket_close (s); - return; - } + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending TCP message to `%s'\n", + GNUNET_a2s ((struct sockaddr *) &sa, sizeof (sa))); + if ((GNUNET_OK != + GNUNET_NETWORK_socket_connect (s, (const struct sockaddr *) &sa, + sizeof (sa))) && (errno != EINPROGRESS)) + { + GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "connect"); + GNUNET_NETWORK_socket_close (s); + return; + } ctx = GNUNET_malloc (sizeof (struct TcpContext)); ctx->s = s; ctx->data = data; - GNUNET_SCHEDULER_add_write_net (GNUNET_TIME_UNIT_SECONDS, - s, - &tcp_send, ctx); + GNUNET_SCHEDULER_add_write_net (GNUNET_TIME_UNIT_SECONDS, s, &tcp_send, ctx); } /** * Try to send 'data' to the * IP 'dst_ipv4' at port 'dport' via UDP. - * - * @param dst_ivp4 target IP + * + * @param dst_ipv4 target IP * @param dport target port * @param data data to send */ static void -try_send_udp (uint32_t dst_ipv4, - uint16_t dport, - uint16_t data) +try_send_udp (uint32_t dst_ipv4, uint16_t dport, uint16_t data) { struct GNUNET_NETWORK_Handle *s; struct sockaddr_in sa; s = GNUNET_NETWORK_socket_create (AF_INET, SOCK_DGRAM, 0); if (NULL == s) - { - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "socket"); - return; - } + { + GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "socket"); + return; + } memset (&sa, 0, sizeof (sa)); sa.sin_family = AF_INET; #if HAVE_SOCKADDR_IN_SIN_LEN sa.sin_len = sizeof (sa); #endif - sa.sin_addr.s_addr = dst_ipv4; + sa.sin_addr.s_addr = dst_ipv4; sa.sin_port = htons (dport); -#if DEBUG_NAT - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Sending UDP packet to `%s'\n", - GNUNET_a2s ((struct sockaddr*) &sa, sizeof (sa))); -#endif - if (-1 == GNUNET_NETWORK_socket_sendto (s, - &data, sizeof(data), - (const struct sockaddr*) &sa, sizeof (sa))) + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending UDP packet to `%s'\n", + GNUNET_a2s ((struct sockaddr *) &sa, sizeof (sa))); + if (-1 == + GNUNET_NETWORK_socket_sendto (s, &data, sizeof (data), + (const struct sockaddr *) &sa, sizeof (sa))) GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "sendto"); GNUNET_NETWORK_socket_close (s); } @@ -225,47 +199,39 @@ try_send_udp (uint32_t dst_ipv4, /** * We've received a request to probe a NAT * traversal. Do it. - * + * * @param cls unused * @param client handle to client (we always close) * @param msg message with details about what to test */ static void -test (void *cls, - struct GNUNET_SERVER_Client *client, +test (void *cls, struct GNUNET_SERVER_Client *client, const struct GNUNET_MessageHeader *msg) { const struct GNUNET_NAT_TestMessage *tm; uint16_t dport; -#if DEBUG_NAT - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received test request\n"); -#endif - tm = (const struct GNUNET_NAT_TestMessage*) msg; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received test request\n"); + tm = (const struct GNUNET_NAT_TestMessage *) msg; dport = ntohs (tm->dport); if (0 == dport) - try_anat (tm->dst_ipv4, - ntohs (tm->data), - (int) ntohl (tm->is_tcp)); + try_anat (tm->dst_ipv4, ntohs (tm->data), (int) ntohl (tm->is_tcp)); else if (GNUNET_YES == ntohl (tm->is_tcp)) try_send_tcp (tm->dst_ipv4, dport, tm->data); else try_send_udp (tm->dst_ipv4, dport, tm->data); - GNUNET_SERVER_receive_done (client, - GNUNET_NO); + GNUNET_SERVER_receive_done (client, GNUNET_NO); } /** * Task run during shutdown. * - * @param ctx unused + * @param cls unused * @param tc scheduler context */ static void -shutdown_task (void *cls, - const struct GNUNET_SCHEDULER_TaskContext *tc) +shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { GNUNET_SERVER_destroy (server); server = NULL; @@ -281,45 +247,41 @@ shutdown_task (void *cls, * @param c configuration */ static void -run (void *cls, - char *const *args, - const char *cfgfile, +run (void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *c) { - static const struct GNUNET_SERVER_MessageHandler handlers[] = - { - { &test, NULL, GNUNET_MESSAGE_TYPE_NAT_TEST, sizeof (struct GNUNET_NAT_TestMessage) }, - { NULL, NULL, 0, 0 } - }; + static const struct GNUNET_SERVER_MessageHandler handlers[] = { + {&test, NULL, GNUNET_MESSAGE_TYPE_NAT_TEST, + sizeof (struct GNUNET_NAT_TestMessage)}, + {NULL, NULL, 0, 0} + }; unsigned int port; struct sockaddr_in in4; struct sockaddr_in6 in6; - socklen_t slen[] = - { - sizeof (in4), - sizeof (in6), - 0 - }; - struct sockaddr *sa[] = - { - (struct sockaddr*) &in4, - (struct sockaddr*) &in6, - NULL - }; + + socklen_t slen[] = { + sizeof (in4), + sizeof (in6), + 0 + }; + struct sockaddr *sa[] = { + (struct sockaddr *) &in4, + (struct sockaddr *) &in6, + NULL + }; cfg = c; - if ( (args[0] == NULL) || - (1 != SSCANF (args[0], "%u", &port)) || - (0 == port) || - (65536 <= port) ) - { - fprintf (stderr, - _("Please pass valid port number as the first argument! (got `%s')\n"), - args[0]); - return; - } - memset (&in4, 0, sizeof (in4)); - memset (&in6, 0, sizeof (in6)); + if ((args[0] == NULL) || (1 != SSCANF (args[0], "%u", &port)) || (0 == port) + || (65536 <= port)) + { + FPRINTF (stderr, + _ + ("Please pass valid port number as the first argument! (got `%s')\n"), + args[0]); + return; + } + memset (&in4, 0, sizeof (in4)); + memset (&in6, 0, sizeof (in6)); in4.sin_family = AF_INET; in4.sin_port = htons ((uint16_t) port); in6.sin6_family = AF_INET6; @@ -328,16 +290,12 @@ run (void *cls, in4.sin_len = sizeof (in4); in6.sin6_len = sizeof (in6); #endif - server = GNUNET_SERVER_create (NULL, NULL, - (struct sockaddr*const*) sa, - slen, - GNUNET_TIME_UNIT_SECONDS, - GNUNET_YES); - GNUNET_SERVER_add_handlers (server, - handlers); - GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, - &shutdown_task, - NULL); + server = + GNUNET_SERVER_create (NULL, NULL, (struct sockaddr * const *) sa, slen, + GNUNET_TIME_UNIT_SECONDS, GNUNET_YES); + GNUNET_SERVER_add_handlers (server, handlers); + GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task, + NULL); } @@ -355,13 +313,18 @@ main (int argc, char *const argv[]) GNUNET_GETOPT_OPTION_END }; + if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv)) + return 2; + if (GNUNET_OK != - GNUNET_PROGRAM_run (argc, argv, - "gnunet-nat-server [options] PORT", - _("GNUnet NAT traversal test helper daemon"), - options, - &run, NULL)) + GNUNET_PROGRAM_run (argc, argv, "gnunet-nat-server [options] PORT", + _("GNUnet NAT traversal test helper daemon"), options, + &run, NULL)) + { + GNUNET_free ((void*) argv); return 1; + } + GNUNET_free ((void*) argv); return 0; }