Group PJNATH_STUN_SOCK

group PJNATH_STUN_SOCK

STUN aware UDP socket transport.

The STUN transport provides asynchronous UDP like socket transport with the additional STUN capability. It has the following features:

  • API to send and receive UDP packets

  • multiplex STUN and non-STUN incoming packets and distinguish between STUN responses that belong to internal requests with application data (the application data may be STUN packets as well)

  • DNS SRV resolution to the STUN server (if wanted), along with fallback to DNS A resolution if SRV record is not found.

  • STUN keep-alive maintenance, and handle changes to the mapped address (when the NAT binding changes)

Typedefs

typedef struct pj_stun_sock pj_stun_sock

Opaque type to represent a STUN transport.

Enums

enum pj_stun_sock_op

Types of operation being reported in on_status() callback of pj_stun_sock_cb. Application may retrieve the string representation of these constants with pj_stun_sock_op_name().

Values:

enumerator PJ_STUN_SOCK_DNS_OP

Asynchronous DNS resolution.

enumerator PJ_STUN_SOCK_BINDING_OP

Initial STUN Binding request.

enumerator PJ_STUN_SOCK_KEEP_ALIVE_OP

Subsequent STUN Binding request for keeping the binding alive.

enumerator PJ_STUN_SOCK_MAPPED_ADDR_CHANGE

IP address change notification from the keep-alive operation.

Functions

const char *pj_stun_sock_op_name(pj_stun_sock_op op)

Retrieve the name representing the specified operation.

void pj_stun_sock_cfg_default(pj_stun_sock_cfg *cfg)

Initialize the STUN transport setting with its default values.

Parameters

cfg – The STUN transport config.

pj_status_t pj_stun_sock_create(pj_stun_config *stun_cfg, const char *name, int af, const pj_stun_sock_cb *cb, const pj_stun_sock_cfg *cfg, void *user_data, pj_stun_sock **p_sock)

Create the STUN transport using the specified configuration. Once the STUN transport has been create, application should call pj_stun_sock_start() to start the transport.

Parameters
  • stun_cfg – The STUN configuration which contains among other things the ioqueue and timer heap instance for the operation of this transport.

  • af – Address family of socket. Currently pj_AF_INET() and pj_AF_INET6() are supported.

  • name – Optional name to be given to this transport to assist debugging.

  • cb – Callback to receive events/data from the transport.

  • cfg – Optional transport settings.

  • user_data – Arbitrary application data to be associated with this transport.

  • p_sock – Pointer to receive the created transport instance.

Returns

PJ_SUCCESS if the operation has been successful, or the appropriate error code on failure.

pj_status_t pj_stun_sock_start(pj_stun_sock *stun_sock, const pj_str_t *domain, pj_uint16_t default_port, pj_dns_resolver *resolver)

Start the STUN transport. This will start the DNS SRV resolution for the STUN server (if desired), and once the server is resolved, STUN Binding request will be sent to resolve the publicly mapped address. Once the initial STUN Binding response is received, the keep-alive timer will be started.

Parameters
  • stun_sock – The STUN transport instance.

  • domain – The domain, hostname, or IP address of the TURN server. When this parameter contains domain name, the resolver parameter must be set to activate DNS SRV resolution.

  • default_port – The default STUN port number to use when DNS SRV resolution is not used. If DNS SRV resolution is used, the server port number will be set from the DNS SRV records. The recommended value for this parameter is PJ_STUN_PORT.

  • resolver – If this parameter is not NULL, then the domain parameter will be first resolved with DNS SRV and then fallback to using DNS A/AAAA resolution when DNS SRV resolution fails. If this parameter is NULL, the domain parameter will be resolved as hostname.

Returns

PJ_SUCCESS if the operation has been successfully queued, or the appropriate error code on failure. When this function returns PJ_SUCCESS, the final result of the allocation process will be notified to application in on_state() callback.

pj_status_t pj_stun_sock_destroy(pj_stun_sock *sock)

Destroy the STUN transport.

Parameters

sock – The STUN transport socket.

Returns

PJ_SUCCESS if the operation has been successful, or the appropriate error code on failure.

pj_status_t pj_stun_sock_set_user_data(pj_stun_sock *stun_sock, void *user_data)

Associate a user data with this STUN transport. The user data may then be retrieved later with pj_stun_sock_get_user_data().

Parameters
  • stun_sock – The STUN transport instance.

  • user_data – Arbitrary data.

Returns

PJ_SUCCESS if the operation has been successful, or the appropriate error code on failure.

void *pj_stun_sock_get_user_data(pj_stun_sock *stun_sock)

Retrieve the previously assigned user data associated with this STUN transport.

Parameters

stun_sock – The STUN transport instance.

Returns

The user/application data.

pj_status_t pj_stun_sock_get_info(pj_stun_sock *stun_sock, pj_stun_sock_info *info)

Get the STUN transport info. The transport info contains, among other things, the allocated relay address.

Parameters
  • stun_sock – The STUN transport instance.

  • info – Pointer to be filled with STUN transport info.

Returns

PJ_SUCCESS if the operation has been successful, or the appropriate error code on failure.

pj_status_t pj_stun_sock_sendto(pj_stun_sock *stun_sock, pj_ioqueue_op_key_t *send_key, const void *pkt, unsigned pkt_len, unsigned flag, const pj_sockaddr_t *dst_addr, unsigned addr_len)

Send a data to the specified address. This function may complete asynchronously and in this case on_data_sent() will be called.

Parameters
  • stun_sock – The STUN transport instance.

  • send_key – Optional send key for sending the packet down to the ioqueue. This value will be given back to on_data_sent() callback

  • pkt – The data/packet to be sent to peer.

  • pkt_len – Length of the data.

  • flagpj_ioqueue_sendto() flag.

  • dst_addr – The remote address.

  • addr_len – Length of the address.

Returns

PJ_SUCCESS if data has been sent immediately, or PJ_EPENDING if data cannot be sent immediately. In this case the on_data_sent() callback will be called when data is actually sent. Any other return value indicates error condition.

struct pj_stun_sock_cb
#include <stun_sock.h>

This structure contains callbacks that will be called by the STUN transport to notify application about various events.

struct pj_stun_sock_info
#include <stun_sock.h>

This structure contains information about the STUN transport. Application may query this information by calling pj_stun_sock_get_info().

struct pj_stun_sock_cfg
#include <stun_sock.h>

This describe the settings to be given to the STUN transport during its creation. Application should initialize this structure by calling pj_stun_sock_cfg_default().