/** * Activity on our incoming socket. Read data from the * incoming connection. * * @param cls * @param tc scheduler context */ static void do_udp_read (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { struct GNUNET_NAT_AutoHandle *ah = cls; unsigned char reply_buf[1024]; ssize_t rlen; struct sockaddr_in answer; if ((0 != (tc->reason & GNUNET_SCHEDULER_REASON_READ_READY)) && (GNUNET_NETWORK_fdset_isset (tc->read_ready, lsock4))) { rlen = GNUNET_NETWORK_socket_recv (lsock4, reply_buf, sizeof (reply_buf)); //Lets handle the packet memset(&answer, 0, sizeof(struct sockaddr_in)); if(ah->phase == AUTO_NAT_PUNCHED) { //Destroy the connection GNUNET_NETWORK_socket_close (lsock4); GNUNET_log (GNUNET_ERROR_TYPE_INFO, "The external server was able to connect back"); ah->connected_back = GNUNET_YES; next_phase (ah); } else { if (GNUNET_OK == GNUNET_NAT_stun_handle_packet (reply_buf, rlen, &answer)) { //Process the answer process_stun_reply (&answer, ah); } else { next_phase (ah); } } } else { GNUNET_log (GNUNET_ERROR_TYPE_INFO, "TIMEOUT while waiting for an answer\n"); if (ah->phase == AUTO_NAT_PUNCHED) { stop_stun(); } next_phase (ah); } }
/** * Task to receive incoming packets for STUN processing. */ static void stun_read_task (void *cls) { ssize_t size; rtask = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, ls, &stun_read_task, NULL); size = GNUNET_NETWORK_socket_recvfrom_amount (ls); if (size > 0) { GNUNET_break (0); GNUNET_SCHEDULER_shutdown (); global_ret = 1; return; } { char buf[size + 1]; struct sockaddr_storage sa; socklen_t salen = sizeof (sa); ssize_t ret; ret = GNUNET_NETWORK_socket_recvfrom (ls, buf, size + 1, (struct sockaddr *) &sa, &salen); if (ret != size) { GNUNET_break (0); GNUNET_SCHEDULER_shutdown (); global_ret = 1; return; } (void) GNUNET_NAT_stun_handle_packet (nh, (const struct sockaddr *) &sa, salen, buf, ret); } }
/** * Activity on our incoming socket. Read data from the * incoming connection. * * @param cls */ static void do_udp_read (void *cls) { //struct GNUNET_NAT_Test *tst = cls; unsigned char reply_buf[1024]; ssize_t rlen; struct sockaddr_in answer; const struct GNUNET_SCHEDULER_TaskContext *tc; ltask4 = NULL; tc = GNUNET_SCHEDULER_get_task_context (); if ( (0 == (tc->reason & GNUNET_SCHEDULER_REASON_READ_READY)) || (! GNUNET_NETWORK_fdset_isset (tc->read_ready, lsock4)) ) { fprintf (stderr, "Timeout waiting for STUN response\n"); stop(); } rlen = GNUNET_NETWORK_socket_recv (lsock4, reply_buf, sizeof (reply_buf)); memset (&answer, 0, sizeof(struct sockaddr_in)); if (GNUNET_OK != GNUNET_NAT_stun_handle_packet (reply_buf, rlen, &answer)) { fprintf (stderr, "Unexpected UDP packet, trying to read more\n"); ltask4 = GNUNET_SCHEDULER_add_read_net (TIMEOUT, lsock4, &do_udp_read, NULL); return; } ret = 0; print_answer (&answer); stop (); }