/** Fetch our likely public IP from our upstream UPnP IGD enabled NAT device. * Use the connection context stored in <b>backend_state</b>. */ int tor_upnp_fetch_public_ip(tor_fw_options_t *options, void *backend_state) { miniupnpc_state_t *state = (miniupnpc_state_t *) backend_state; int r; char externalIPAddress[16]; if (!state->init) { r = tor_upnp_init(options, state); if (r != UPNP_ERR_SUCCESS) return r; } r = UPNP_GetExternalIPAddress(state->urls.controlURL, state->data.first.servicetype, externalIPAddress); if (r != UPNPCOMMAND_SUCCESS) goto err; if (externalIPAddress[0]) { fprintf(stderr, "tor-fw-helper: ExternalIPAddress = %s\n", externalIPAddress); tor_upnp_cleanup(options, state); options->public_ip_status = 1; return UPNP_ERR_SUCCESS; } else { goto err; } err: tor_upnp_cleanup(options, state); return UPNP_ERR_GETEXTERNALIP; }
/** Add a TCP port mapping for a single port stored in <b>tor_fw_options</b> * and store the results in <b>backend_state</b>. */ int tor_upnp_add_tcp_mapping(tor_fw_options_t *options, void *backend_state) { miniupnpc_state_t *state = (miniupnpc_state_t *) backend_state; int r; char internal_port_str[6]; char external_port_str[6]; if (!state->init) { r = tor_upnp_init(options, state); if (r != UPNP_ERR_SUCCESS) return r; } if (options->verbose) fprintf(stdout, "V: internal port: %d, external port: %d\n", (int)options->internal_port, (int)options->external_port); tor_snprintf(internal_port_str, sizeof(internal_port_str), "%d", (int)options->internal_port); tor_snprintf(external_port_str, sizeof(external_port_str), "%d", (int)options->external_port); r = UPNP_AddPortMapping(state->urls.controlURL, state->data.first.servicetype, external_port_str, internal_port_str, #ifdef MINIUPNPC15 state->lanaddr, UPNP_DESC, "TCP", 0); #else state->lanaddr, UPNP_DESC, "TCP", 0, 0); #endif if (r != UPNPCOMMAND_SUCCESS) return UPNP_ERR_ADDPORTMAPPING; options->upnp_status = 1; return UPNP_ERR_SUCCESS; }