Service for handling UPnP and NAT-PMP port forwarding and external IP address retrieval. More...
Typedefs | |
typedef void(* | GNUNET_NAT_AUTO_AutoResultCallback) (void *cls, const struct GNUNET_CONFIGURATION_Handle *diff, enum GNUNET_NAT_StatusCode result, enum GNUNET_NAT_Type type) |
Function called with the result from the autoconfiguration. More... | |
typedef void(* | GNUNET_NAT_AddressCallback) (void *cls, void **app_ctx, int add_remove, enum GNUNET_NAT_AddressClass ac, const struct sockaddr *addr, socklen_t addrlen) |
Signature of the callback passed to GNUNET_NAT_register() for a function to call whenever our set of 'valid' addresses changes. More... | |
typedef void(* | GNUNET_NAT_ReversalCallback) (void *cls, const struct sockaddr *remote_addr, socklen_t remote_addrlen) |
Signature of the callback passed to GNUNET_NAT_register(). More... | |
typedef void(* | GNUNET_NAT_TestCallback) (void *cls, enum GNUNET_NAT_StatusCode result) |
Function called to report success or failure for NAT configuration test. More... | |
Functions | |
struct GNUNET_NAT_AUTO_Test * | GNUNET_NAT_AUTO_test_start (const struct GNUNET_CONFIGURATION_Handle *cfg, uint8_t proto, const char *section_name, GNUNET_NAT_TestCallback report, void *report_cls) |
Start testing if NAT traversal works using the given configuration. More... | |
void | GNUNET_NAT_AUTO_test_stop (struct GNUNET_NAT_AUTO_Test *tst) |
Stop an active NAT test. More... | |
const char * | GNUNET_NAT_AUTO_status2string (enum GNUNET_NAT_StatusCode err) |
Converts enum GNUNET_NAT_StatusCode to string. More... | |
struct GNUNET_NAT_AUTO_AutoHandle * | GNUNET_NAT_AUTO_autoconfig_start (const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_NAT_AUTO_AutoResultCallback cb, void *cb_cls) |
Start auto-configuration routine. More... | |
void | GNUNET_NAT_AUTO_autoconfig_cancel (struct GNUNET_NAT_AUTO_AutoHandle *ah) |
Abort autoconfiguration. More... | |
struct GNUNET_NAT_Handle * | GNUNET_NAT_register (const struct GNUNET_CONFIGURATION_Handle *cfg, const char *config_section, uint8_t proto, unsigned int num_addrs, const struct sockaddr **addrs, const socklen_t *addrlens, GNUNET_NAT_AddressCallback address_callback, GNUNET_NAT_ReversalCallback reversal_callback, void *callback_cls) |
Attempt to enable port redirection and detect public IP address contacting UPnP or NAT-PMP routers on the local network. More... | |
int | GNUNET_NAT_test_address (struct GNUNET_NAT_Handle *nh, const void *addr, socklen_t addrlen) |
Test if the given address is (currently) a plausible IP address for this peer. More... | |
int | GNUNET_NAT_request_reversal (struct GNUNET_NAT_Handle *nh, const struct sockaddr_in *local_sa, const struct sockaddr_in *remote_sa) |
We learned about a peer (possibly behind NAT) so run the gnunet-nat-client to send dummy ICMP responses to cause that peer to connect to us (connection reversal). More... | |
void | GNUNET_NAT_unregister (struct GNUNET_NAT_Handle *nh) |
Stop port redirection and public IP address detection for the given handle. More... | |
int | GNUNET_NAT_stun_handle_packet (struct GNUNET_NAT_Handle *nh, const struct sockaddr *sender_addr, size_t sender_addr_len, const void *data, size_t data_size) |
Handle an incoming STUN message. More... | |
struct GNUNET_NAT_STUN_Handle * | GNUNET_NAT_stun_make_request (const char *server, uint16_t port, struct GNUNET_NETWORK_Handle *sock, GNUNET_NAT_TestCallback cb, void *cb_cls) |
Make Generic STUN request. More... | |
void | GNUNET_NAT_stun_make_request_cancel (struct GNUNET_NAT_STUN_Handle *rh) |
Cancel active STUN request. More... | |
Service for handling UPnP and NAT-PMP port forwarding and external IP address retrieval.
typedef void(* GNUNET_NAT_AUTO_AutoResultCallback) (void *cls, const struct GNUNET_CONFIGURATION_Handle *diff, enum GNUNET_NAT_StatusCode result, enum GNUNET_NAT_Type type) |
Function called with the result from the autoconfiguration.
cls | closure |
diff | minimal suggested changes to the original configuration to make it work (as best as we can) |
result | GNUNET_NAT_ERROR_SUCCESS on success, otherwise the specific error code |
type | what the situation of the NAT |
Definition at line 101 of file gnunet_nat_auto_service.h.
typedef void(* GNUNET_NAT_AddressCallback) (void *cls, void **app_ctx, int add_remove, enum GNUNET_NAT_AddressClass ac, const struct sockaddr *addr, socklen_t addrlen) |
Signature of the callback passed to GNUNET_NAT_register() for a function to call whenever our set of 'valid' addresses changes.
cls | closure |
app_ctx[in,out] | location where the app can store stuff on add and retrieve it on remove |
add_remove | GNUNET_YES to add a new public IP address, GNUNET_NO to remove a previous (now invalid) one |
ac | address class the address belongs to |
addr | either the previous or the new public IP address |
addrlen | actual length of the addr |
Definition at line 285 of file gnunet_nat_service.h.
typedef void(* GNUNET_NAT_ReversalCallback) (void *cls, const struct sockaddr *remote_addr, socklen_t remote_addrlen) |
Signature of the callback passed to GNUNET_NAT_register().
for a function to call whenever someone asks us to do connection reversal.
cls | closure |
remote_addr | public IP address of the other peer |
remote_addrlen | actual length of the remote_addr |
Definition at line 303 of file gnunet_nat_service.h.
typedef void(* GNUNET_NAT_TestCallback) (void *cls, enum GNUNET_NAT_StatusCode result) |
Function called to report success or failure for NAT configuration test.
cls | closure |
result | GNUNET_NAT_ERROR_SUCCESS on success, otherwise the specific error code |
Definition at line 447 of file gnunet_nat_service.h.
Some addresses contain sensitive information or are not suitable for global distribution.
We use address classes to filter addresses by which domain they make sense to be used in. These are used in a bitmask.
FIXME: might want to define this elsewhere; we have an equivalent enum in gnunet_transport_hello_service.h; might ultimately belong with the new HELLO definition.
Enumerator | |
---|---|
GNUNET_NAT_AC_NONE | No address. |
GNUNET_NAT_AC_OTHER | Addresses that fall into no other category (i.e. incoming which we cannot use elsewhere). |
GNUNET_NAT_AC_PRIVATE | Flag for addresses that are highly sensitive (i.e. IPv6 with our MAC). |
GNUNET_NAT_AC_GLOBAL | Addresses that are global (i.e. IPv4). |
GNUNET_NAT_AC_GLOBAL_PRIVATE | Addresses that are global and are sensitive (i.e. IPv6 with our MAC). |
GNUNET_NAT_AC_LAN | Addresses useful in the local wired network, i.e. a MAC. Sensitive, but obvious to people nearby. Useful for broadcasts. |
GNUNET_NAT_AC_LAN_PRIVATE | Addresses useful in the local wired network, i.e. a MAC. Sensitive, but obvious to people nearby. Useful for broadcasts. |
GNUNET_NAT_AC_WLAN | Addresses useful in the local wireless network, i.e. a MAC. Sensitive, but obvious to people nearby. Useful for broadcasts. |
GNUNET_NAT_AC_BT | Addresses useful in the local bluetooth network. Sensitive, but obvious to people nearby. Useful for broadcasts. |
GNUNET_NAT_AC_LOOPBACK | Loopback addresses, only useful under special circumstances. |
GNUNET_NAT_AC_EXTERN | Addresses that should be our external IP address on the outside of a NAT. Might be incorrectly determined. Used as a bit in combination with GNUNET_NAT_AC_GLOBAL, or in case of double-NAT with GNUNET_NAT_AC_LAN. |
GNUNET_NAT_AC_MANUAL | Addresses that were manually configured by the user. Used as a bit in combination with GNUNET_NAT_AC_GLOBAL. |
GNUNET_NAT_AC_ANY | Bitmask for "any" address. |
Definition at line 53 of file gnunet_nat_service.h.
Error Types for the NAT subsystem (which can then later be converted/resolved to a string)
Definition at line 141 of file gnunet_nat_service.h.
enum GNUNET_NAT_Type |
What the situation of the NAT connectivity.
Definition at line 243 of file gnunet_nat_service.h.
struct GNUNET_NAT_AUTO_Test* GNUNET_NAT_AUTO_test_start | ( | const struct GNUNET_CONFIGURATION_Handle * | cfg, |
uint8_t | proto, | ||
const char * | section_name, | ||
GNUNET_NAT_TestCallback | report, | ||
void * | report_cls | ||
) |
Start testing if NAT traversal works using the given configuration.
The transport adapters should be down while using this function.
cfg | configuration for the NAT traversal |
proto | protocol to test, i.e. IPPROTO_TCP or IPPROTO_UDP |
section_name | configuration section to use for configuration |
report | function to call with the result of the test |
report_cls | closure for report |
Definition at line 426 of file nat_auto_api_test.c.
References _, addr_cb(), cfg, GNUNET_NAT_Handle::cfg, do_accept(), do_fail(), do_udp_read(), GNUNET_a2s(), GNUNET_break, GNUNET_CONFIGURATION_get_value_number(), GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_INFO, GNUNET_log, GNUNET_NAT_ERROR_INTERNAL_NETWORK_ERROR, GNUNET_NAT_ERROR_NAT_REGISTER_FAILED, GNUNET_NAT_ERROR_SUCCESS, GNUNET_NAT_register(), GNUNET_NETWORK_socket_bind(), GNUNET_NETWORK_socket_close(), GNUNET_NETWORK_socket_create(), GNUNET_NETWORK_socket_listen(), GNUNET_new, GNUNET_OK, GNUNET_SCHEDULER_add_now(), GNUNET_SCHEDULER_add_read_net(), GNUNET_SCHEDULER_cancel(), GNUNET_strdup, GNUNET_TIME_UNIT_FOREVER_REL, LOG, nh, proto, reversal_cb(), and section_name.
Referenced by run().
void GNUNET_NAT_AUTO_test_stop | ( | struct GNUNET_NAT_AUTO_Test * | tst | ) |
Stop an active NAT test.
tst | test to stop. |
Definition at line 558 of file nat_auto_api_test.c.
References GNUNET_NAT_AUTO_Test::ca_head, GNUNET_NAT_AUTO_Test::ca_tail, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_MQ_destroy(), GNUNET_NAT_unregister(), GNUNET_NETWORK_socket_close(), GNUNET_SCHEDULER_cancel(), LOG, GNUNET_NAT_AUTO_Test::lsock, GNUNET_NAT_AUTO_Test::ltask, ClientActivity::mq, GNUNET_NAT_AUTO_Test::na_head, GNUNET_NAT_AUTO_Test::na_tail, GNUNET_NAT_AUTO_Test::nat, NatActivity::rtask, GNUNET_NAT_AUTO_Test::section_name, NatActivity::sock, and GNUNET_NAT_AUTO_Test::ttask.
Referenced by do_shutdown().
const char* GNUNET_NAT_AUTO_status2string | ( | enum GNUNET_NAT_StatusCode | err | ) |
Converts enum GNUNET_NAT_StatusCode
to string.
err | error code to resolve to a string |
Definition at line 68 of file nat_auto_api.c.
References _, GNUNET_NAT_ERROR_EXTERNAL_IP_ADDRESS_INVALID, GNUNET_NAT_ERROR_EXTERNAL_IP_UTILITY_FAILED, GNUNET_NAT_ERROR_EXTERNAL_IP_UTILITY_NOT_FOUND, GNUNET_NAT_ERROR_EXTERNAL_IP_UTILITY_OUTPUT_INVALID, GNUNET_NAT_ERROR_HELPER_NAT_CLIENT_NOT_FOUND, GNUNET_NAT_ERROR_HELPER_NAT_SERVER_NOT_FOUND, GNUNET_NAT_ERROR_INTERNAL_NETWORK_ERROR, GNUNET_NAT_ERROR_IPC_FAILURE, GNUNET_NAT_ERROR_NAT_REGISTER_FAILED, GNUNET_NAT_ERROR_NAT_TEST_START_FAILED, GNUNET_NAT_ERROR_NAT_TEST_TIMEOUT, GNUNET_NAT_ERROR_NO_VALID_IF_IP_COMBO, GNUNET_NAT_ERROR_NOT_ONLINE, GNUNET_NAT_ERROR_SUCCESS, GNUNET_NAT_ERROR_TIMEOUT, GNUNET_NAT_ERROR_UPNPC_FAILED, GNUNET_NAT_ERROR_UPNPC_NOT_FOUND, GNUNET_NAT_ERROR_UPNPC_PORTMAP_FAILED, and GNUNET_NAT_ERROR_UPNPC_TIMEOUT.
Referenced by auto_config_cb(), and test_report_cb().
struct GNUNET_NAT_AUTO_AutoHandle* GNUNET_NAT_AUTO_autoconfig_start | ( | const struct GNUNET_CONFIGURATION_Handle * | cfg, |
GNUNET_NAT_AUTO_AutoResultCallback | cb, | ||
void * | cb_cls | ||
) |
Start auto-configuration routine.
The transport adapters should be stopped while this function is called.
cfg | initial configuration |
cb | function to call with autoconfiguration result |
cb_cls | closure for cb |
Definition at line 225 of file nat_auto_api.c.
References ah, ah_error_handler(), GNUNET_NAT_AUTO_AutoHandle::arc, GNUNET_NAT_AUTO_AutoHandle::arc_cls, buf, cfg, env, GNUNET_break, GNUNET_CLIENT_connect(), GNUNET_CONFIGURATION_serialize(), GNUNET_free, GNUNET_MAX_MESSAGE_SIZE, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_NAT_AUTO_CFG_RESULT, GNUNET_MESSAGE_TYPE_NAT_AUTO_REQUEST_CFG, GNUNET_MQ_handler_end, GNUNET_MQ_hd_var_size, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_new, handlers, GNUNET_NAT_AUTO_AutoHandle::mq, and size.
Referenced by run().
void GNUNET_NAT_AUTO_autoconfig_cancel | ( | struct GNUNET_NAT_AUTO_AutoHandle * | ah | ) |
Abort autoconfiguration.
ah | handle for operation to abort |
Definition at line 285 of file nat_auto_api.c.
References ah, GNUNET_free, GNUNET_MQ_destroy(), and GNUNET_NAT_AUTO_AutoHandle::mq.
Referenced by ah_error_handler(), do_shutdown(), and handle_auto_result().
struct GNUNET_NAT_Handle* GNUNET_NAT_register | ( | const struct GNUNET_CONFIGURATION_Handle * | cfg, |
const char * | config_section, | ||
uint8_t | proto, | ||
unsigned int | num_addrs, | ||
const struct sockaddr ** | addrs, | ||
const socklen_t * | addrlens, | ||
GNUNET_NAT_AddressCallback | address_callback, | ||
GNUNET_NAT_ReversalCallback | reversal_callback, | ||
void * | callback_cls | ||
) |
Attempt to enable port redirection and detect public IP address contacting UPnP or NAT-PMP routers on the local network.
Use addr to specify to which of the local host's addresses should the external port be mapped. The port is taken from the corresponding sockaddr_in[6] field. The NAT module should call the given address_callback for any 'plausible' external address.
cfg | configuration to use |
config_section | name of the configuration section for options |
proto | protocol this is about, IPPROTO_TCP or IPPROTO_UDP |
num_addrs | number of addresses in addrs |
addrs | list of local addresses packets should be redirected to |
addrlens | actual lengths of the addresses in addrs |
address_callback | function to call every time the public IP address changes |
reversal_callback | function to call if someone wants connection reversal from us, NULL if connection reversal is not supported |
callback_cls | closure for callbacks |
Definition at line 366 of file nat_api.c.
References GNUNET_NAT_Handle::address_callback, GNUNET_NAT_Handle::callback_cls, cfg, GNUNET_NAT_Handle::cfg, do_connect(), GNUNET_NAT_RegisterMessage::flags, GNUNET_break, GNUNET_free, GNUNET_malloc, GNUNET_MAX_MESSAGE_SIZE, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_NAT_REGISTER, GNUNET_NAT_RF_ADDRESSES, GNUNET_NAT_RF_NONE, GNUNET_NAT_RF_REVERSAL, GNUNET_new, GNUNET_NAT_RegisterMessage::header, len, nh, GNUNET_NAT_RegisterMessage::num_addrs, proto, GNUNET_NAT_RegisterMessage::proto, GNUNET_NAT_Handle::reg, reversal_callback(), GNUNET_NAT_Handle::reversal_callback, GNUNET_MessageHeader::size, GNUNET_NAT_RegisterMessage::str_len, and GNUNET_MessageHeader::type.
Referenced by GNUNET_NAT_AUTO_test_start(), GNUNET_NAT_test_start(), libgnunet_plugin_transport_tcp_init(), nat_register(), run(), server_start_report_addresses(), setup_sockets(), and try_anat().
int GNUNET_NAT_test_address | ( | struct GNUNET_NAT_Handle * | nh, |
const void * | addr, | ||
socklen_t | addrlen | ||
) |
Test if the given address is (currently) a plausible IP address for this peer.
Mostly a convenience function so that clients do not have to explicitly track all IPs that the GNUNET_NAT_AddressCallback has returned so far.
nh | the handle returned by register |
addr | IP address to test (IPv4 or IPv6) |
addrlen | number of bytes in addr |
Definition at line 614 of file nat_api.c.
References AddrEntry::addrlen, GNUNET_NAT_Handle::ae_head, GNUNET_break, GNUNET_NO, GNUNET_SYSERR, GNUNET_YES, AddrEntry::next, and nh.
Referenced by tcp_plugin_check_address(), and udp_plugin_check_address().
int GNUNET_NAT_request_reversal | ( | struct GNUNET_NAT_Handle * | nh, |
const struct sockaddr_in * | local_sa, | ||
const struct sockaddr_in * | remote_sa | ||
) |
We learned about a peer (possibly behind NAT) so run the gnunet-nat-client to send dummy ICMP responses to cause that peer to connect to us (connection reversal).
nh | handle (used for configuration) |
local_sa | our local address of the peer (IPv4-only) |
remote_sa | the remote address of the peer (IPv4-only) |
Definition at line 646 of file nat_api.c.
References buf, env, GNUNET_break, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_NAT_REQUEST_CONNECTION_REVERSAL, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_OK, GNUNET_SYSERR, GNUNET_NAT_RequestConnectionReversalMessage::local_addr_size, GNUNET_NAT_Handle::mq, nh, and GNUNET_NAT_RequestConnectionReversalMessage::remote_addr_size.
Referenced by mq_init(), run(), tcp_plugin_get_session(), and try_anat().
void GNUNET_NAT_unregister | ( | struct GNUNET_NAT_Handle * | nh | ) |
Stop port redirection and public IP address detection for the given handle.
This frees the handle, after having sent the needed commands to close open ports.
FIXME: No, the implementation of this API does not do anything beyond cleaning up the handle. This is a problem for applications that use GNUNET_NAT_AddressCallback and use the app_ctx to store objects, because the callback will never be called for cleanup on unregister.
nh | the handle to unregister |
Definition at line 674 of file nat_api.c.
References GNUNET_NAT_Handle::ae_head, GNUNET_NAT_Handle::ae_tail, GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_MQ_destroy(), GNUNET_SCHEDULER_cancel(), GNUNET_NAT_Handle::mq, AddrEntry::next, nh, GNUNET_NAT_Handle::reconnect_task, and GNUNET_NAT_Handle::reg.
Referenced by do_shutdown(), GNUNET_NAT_AUTO_test_stop(), GNUNET_NAT_test_stop(), libgnunet_plugin_transport_tcp_done(), libgnunet_plugin_transport_tcp_init(), libgnunet_plugin_transport_udp_init(), server_stop_report_addresses(), and try_anat().
int GNUNET_NAT_stun_handle_packet | ( | struct GNUNET_NAT_Handle * | nh, |
const struct sockaddr * | sender_addr, | ||
size_t | sender_addr_len, | ||
const void * | data, | ||
size_t | data_size | ||
) |
Handle an incoming STUN message.
This function is useful as some GNUnet service may be listening on a UDP port and might thus receive STUN messages while trying to receive other data. In this case, this function can be used to process replies to STUN requests.
The function does some basic sanity checks on packet size and content, try to extract a bit of information.
At the moment this only processes BIND requests, and returns the externally visible address of the request to the rest of the NAT logic.
nh | handle to the NAT service |
sender_addr | address from which we got data |
sender_addr_len | number of bytes in sender_addr |
data | the packet |
data_size | number of bytes in data |
Definition at line 572 of file nat_api.c.
References buf, data, data_size, env, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_NAT_HANDLE_STUN, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, GNUNET_YES, GNUNET_NAT_Handle::mq, nh, GNUNET_NAT_HandleStunMessage::payload_size, GNUNET_NAT_HandleStunMessage::sender_addr_size, and test_stun_packet().
Referenced by do_udp_read(), stun_read_task(), and udp_select_read().
struct GNUNET_NAT_STUN_Handle* GNUNET_NAT_stun_make_request | ( | const char * | server, |
uint16_t | port, | ||
struct GNUNET_NETWORK_Handle * | sock, | ||
GNUNET_NAT_TestCallback | cb, | ||
void * | cb_cls | ||
) |
Make Generic STUN request.
Sends a generic stun request to the server specified using the specified socket. If we do this, we need to watch for possible responses and call GNUNET_NAT_stun_handle_packet() on incoming packets.
server | the address of the stun server |
port | port of the stun server, in host byte order |
sock | the socket used to send the request, must be a UDP socket |
cb | callback in case of error |
cb_cls | closure for cb |
Sends a generic stun request to the server specified using the specified socket.
server | the address of the stun server |
port | port of the stun server, in host byte order |
sock | the socket used to send the request |
cb | callback in case of error |
cb_cls | closure for cb |
Definition at line 211 of file nat_api_stun.c.
References GNUNET_NAT_STUN_Handle::cb, GNUNET_NAT_STUN_Handle::cb_cls, GNUNET_NAT_STUN_Handle::dns_active, GNUNET_NAT_STUN_Handle::dns_success, GNUNET_NAT_stun_make_request_cancel(), GNUNET_new, GNUNET_NO, GNUNET_RESOLVER_ip_get(), GNUNET_strdup, port, GNUNET_NAT_STUN_Handle::sock, stun_dns_callback(), GNUNET_NAT_STUN_Handle::stun_port, GNUNET_NAT_STUN_Handle::stun_server, and TIMEOUT.
Referenced by test_stun().
void GNUNET_NAT_stun_make_request_cancel | ( | struct GNUNET_NAT_STUN_Handle * | rh | ) |
Cancel active STUN request.
Frees associated resources and ensures that the callback is no longer invoked.
rh | request to cancel |
Definition at line 247 of file nat_api_stun.c.
References GNUNET_NAT_STUN_Handle::dns_active, GNUNET_free, GNUNET_RESOLVER_request_cancel(), and GNUNET_NAT_STUN_Handle::stun_server.
Referenced by GNUNET_NAT_stun_make_request(), and stun_dns_callback().