static void stop_report_addresses (struct Plugin *plugin) { /* Stop NAT handle */ GNUNET_NAT_unregister (plugin->nat); /* Clean up addresses */ struct IPv4HttpAddressWrapper *w_t4; struct IPv6HttpAddressWrapper *w_t6; while (plugin->ipv4_addr_head != NULL) { w_t4 = plugin->ipv4_addr_head; GNUNET_CONTAINER_DLL_remove (plugin->ipv4_addr_head, plugin->ipv4_addr_tail, w_t4); GNUNET_free (w_t4); } while (plugin->ipv6_addr_head != NULL) { w_t6 = plugin->ipv6_addr_head; GNUNET_CONTAINER_DLL_remove (plugin->ipv6_addr_head, plugin->ipv6_addr_tail, w_t6); GNUNET_free (w_t6); } }
/** * Stop an active NAT test. * * @param tst test to stop. */ void GNUNET_NAT_test_stop (struct GNUNET_NAT_Test *tst) { struct NatActivity *pos; struct ClientActivity *cpos; LOG (GNUNET_ERROR_TYPE_DEBUG, "Stopping NAT test\n"); while (NULL != (cpos = tst->ca_head)) { GNUNET_CONTAINER_DLL_remove (tst->ca_head, tst->ca_tail, cpos); GNUNET_CLIENT_disconnect (cpos->client); GNUNET_free (cpos); } while (NULL != (pos = tst->na_head)) { GNUNET_CONTAINER_DLL_remove (tst->na_head, tst->na_tail, pos); GNUNET_SCHEDULER_cancel (pos->rtask); GNUNET_NETWORK_socket_close (pos->sock); GNUNET_free (pos); } if (NULL != tst->ttask) GNUNET_SCHEDULER_cancel (tst->ttask); if (NULL != tst->ltask) GNUNET_SCHEDULER_cancel (tst->ltask); if (NULL != tst->lsock) GNUNET_NETWORK_socket_close (tst->lsock); if (NULL != tst->nat) GNUNET_NAT_unregister (tst->nat); GNUNET_free (tst); }
/** * Function that terminates the test. */ static void stop (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { struct GNUNET_NAT_Handle *nat = cls; GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Stopping NAT and quitting...\n"); GNUNET_NAT_unregister (nat); }
/** * Task run on shutdown. * * @param cls NULL */ static void do_shutdown (void *cls) { if (NULL != nh) { GNUNET_NAT_unregister (nh); nh = NULL; } if (NULL != ls) { GNUNET_NETWORK_socket_close (ls); ls = NULL; } if (NULL != rtask) { GNUNET_SCHEDULER_cancel (rtask); rtask = NULL; } }
/** * Try contacting the peer using autonomous * NAT traveral method. * * @param dst_ipv4 IPv4 address to send the fake ICMP message * @param dport destination port to include in ICMP message * @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) { struct GNUNET_NAT_Handle *h; struct sockaddr_in sa; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "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; GNUNET_NAT_run_client (h, &sa); GNUNET_NAT_unregister (h); }