summaryrefslogtreecommitdiff
path: root/pjnath/include/pjnath/ice_strans.h
diff options
context:
space:
mode:
Diffstat (limited to 'pjnath/include/pjnath/ice_strans.h')
-rw-r--r--pjnath/include/pjnath/ice_strans.h695
1 files changed, 282 insertions, 413 deletions
diff --git a/pjnath/include/pjnath/ice_strans.h b/pjnath/include/pjnath/ice_strans.h
index 09fedbad..8097b382 100644
--- a/pjnath/include/pjnath/ice_strans.h
+++ b/pjnath/include/pjnath/ice_strans.h
@@ -25,6 +25,8 @@
* @brief ICE Stream Transport
*/
#include <pjnath/ice_session.h>
+#include <pjnath/stun_sock.h>
+#include <pjnath/turn_sock.h>
#include <pjlib-util/resolver.h>
#include <pj/ioqueue.h>
#include <pj/timer.h>
@@ -44,137 +46,28 @@ PJ_BEGIN_DECL
* library.
*
* ICE stream transport, as represented by #pj_ice_strans structure, is an ICE
- * capable component for transporting media streams within a media session.
+ * capable class for transporting media streams within a media session.
* It consists of one or more transport sockets (typically two for RTP
* based communication - one for RTP and one for RTCP), and an
* \ref PJNATH_ICE_SESSION for performing connectivity checks among the.
* various candidates of the transport addresses.
*
- * \section PJNATH_ICE_STREAM_TRANSPORT_USING Using the ICE Stream Transport
- *
- * Application may use the ICE stream transport in two ways:
- * - it can create the ICE stream transports once during application
- * initialization and keep them alive throughout application lifetime, or
- * - it can create and destroy the ICE stream transport as needed everytime
- * a call is made and destroyed.
- *
- * Keeping the ICE stream transport alive throughout
- * application's lifetime is normally preferable, as initializing the
- * ICE stream transport may incur delay because the ICE stream transport
- * would need to communicate with the STUN/TURN server to get the
- * server reflexive and relayed candidates for the transports.
- *
- * Regardless of which usage scenario is being used, the ICE stream
- * transport is capable for restarting the ICE session being used and to
- * send STUN keep-alives for its STUN server reflexive and relayed
- * candidates. When ICE stream transport detects that the STUN mapped
- * address has changed in the keep-alive response, it will automatically
- * update its address to the new address, and notify the application via
- * \a on_addr_change() function of the #pj_ice_strans_cb callback.
- *
- * \subsection PJNATH_ICE_ST_TRA_INIT Initialization
- *
- * Application creates the ICE stream transport by calling
- * #pj_ice_strans_create() function. Among other things, application needs
- * to specify:
- * - STUN configuration (pj_stun_config), containing STUN settings
- * such as timeout values and the instances of timer heap and
- * ioqueue.
- * - Session name, useful for identifying this session in the log.
- * - Number of ICE components.
- * - Arbitrary user data, useful when associating the ICE session
- * with some application's data structure.
- * - A callback (#pj_ice_strans_cb) to receive events from the ICE
- * stream transport. Two of the most important fields in this
- * callback structure are \a on_rx_data() to notify application
- * about incoming data (perhaps RTP or RTCP packet), and
- * \a on_ice_complete() to notify application that ICE negotiation
- * has completed, either successfully or with failure.
- *
- * After the ICE stream transport is created, application may set up the
- * STUN servers to be used to obtain STUN server reflexive and relayed
- * candidate, by calling #pj_ice_strans_set_stun_domain() or
- * #pj_ice_strans_set_stun_srv().
- *
- * Application then creates each component by calling
- * #pj_ice_strans_create_comp(); this would create an actual socket
- * which listens to the specified local address, and it would also
- * perform lookup to find various transport address candidates for this
- * socket.
- *
- * Adding component may involve contacting STUN and TURN servers to get
- * STUN mapped address and allocate TURN relay channel, and this process
- * may take some time to complete. Once application has added all
- * components, it can check whether server reflexive and relayed
- * candidates have been acquired, by calling #pj_ice_strans_get_comps_status().
- *
- * \subsection PJNATH_ICE_ST_TRA_INIT_ICE Starting ICE Session
- *
- * When application is about to send an offer containing ICE capability,
- * or when it receives an offer containing ICE capability, it would
- * create the ICE session by calling #pj_ice_strans_init_ice(). This would
- * register all transport address aliases for each component to the ICE
- * session as candidates. After this application can enumerate all local
- * candidates by calling #pj_ice_strans_enum_cands(), and encode these
- * candidates in the SDP to be sent to remote agent.
- *
- * \subsection PJNATH_ICE_ST_TRA_START Starting Connectivity Checks
- *
- * Once application receives the SDP from remote, it pairs local candidates
- * with remote candidates, and can start ICE connectivity checks. This is
- * done by calling #pj_ice_strans_start_ice(), specifying
- * the remote candidate list, and remote username and password. If the
- * pairing process is successful, ICE connectivity checks will begin
- * immediately. The ICE session/transport will then notify the application
- * via the callback when ICE connectivity checks completes, either
- * successfully or with failure.
- *
- * \subsection PJNATH_ICE_ST_TRA_SEND_RECV Sending and Receiving Data
- *
- * Application can send data (normally RTP or RTCP packets) at any time
- * by calling #pj_ice_strans_sendto(). This function takes a destination
- * address as one of the arguments, and this destination address should
- * be taken from the default transport address of the component (that is
- * the address in SDP c= and m= lines, or in a=rtcp attribute).
- * If ICE negotiation is in progress, this function will send the data
- * to the destination address. Otherwise if ICE negotiation has completed
- * successfully, this function will send the data to the nominated remote
- * address, as negotiated by ICE.
- *
- * Upon receiving incoming data (that is a non-STUN message), the ICE
- * stream transport will notify the application by calling \a on_rx_data()
- * of the #pj_ice_strans_cb callback.
- *
- * \subsection PJNATH_ICE_ST_TRA_STOP Stopping ICE Session
- *
- * Once the call is terminated, application no longer needs to keep the
- * ICE session, so it should call #pj_ice_strans_stop_ice() to destroy the
- * ICE session within this ICE stream transport. Note that this WILL NOT
- * destroy the sockets/transports, it only destroys the ICE session
- * within this ICE stream transport. It is recommended that application
- * retains the ICE stream transport to speed up the process of setting up
- * the next call. The ICE stream transport will continue to send STUN
- * keep-alive packets to keep the NAT binding open and to detect change
- * in STUN mapped address.
- *
- * \subsection PJNATH_ICE_ST_TRA_RESTART Restarting ICE Session
- *
- * When a new call is made, application can repeat the above
- * #pj_ice_strans_init_ice() to #pj_ice_strans_stop_ice() cycle for
- * the new call, using this same ICE stream transport.
- *
- * \subsection PJNATH_ICE_ST_TRA_DESTROY Destroying ICE Stream Transport
- *
- * Finally, when the ICE stream transport itself is no longer needed,
- * for example when the application quits, application should call
- * #pj_ice_strans_destroy() to release back all resources allocated by this
- * ICE stream transport.
- *
*/
/** Forward declaration for ICE stream transport. */
typedef struct pj_ice_strans pj_ice_strans;
+/** Transport operation types to be reported on \a on_status() callback */
+typedef enum pj_ice_strans_op
+{
+ /** Initialization (candidate gathering) */
+ PJ_ICE_STRANS_OP_INIT,
+
+ /** Negotiation */
+ PJ_ICE_STRANS_OP_NEGOTIATION
+
+} pj_ice_strans_op;
+
/**
* This structure contains callbacks that will be called by the
* ICE stream transport.
@@ -200,195 +93,200 @@ typedef struct pj_ice_strans_cb
unsigned src_addr_len);
/**
- * This callback will be called when ICE checks have completed.
- * This callback is optional.
+ * Callback to report status.
*
* @param ice_st The ICE stream transport.
- * @param status The ICE connectivity check status.
+ * @param op The operation
+ * @param status Operation status.
*/
void (*on_ice_complete)(pj_ice_strans *ice_st,
+ pj_ice_strans_op op,
pj_status_t status);
- /**
- * This callback will be called when ICE transport has detected that
- * the STUN mapped address of a candidate has changed.
- *
- * @param ice_st The ICE stream transport.
- * @param comp_id Component ID.
- * @param cand_id Candidate ID.
- */
- void (*on_addr_change)(pj_ice_strans *ice_st,
- unsigned comp_id,
- unsigned cand_id);
-
} pj_ice_strans_cb;
/**
- * Various flags that can be specified when creating a component with
- * #pj_ice_strans_create_comp(). These options may be combined together
- * with bitmask operation.
+ * This structure describes ICE stream transport configuration. Application
+ * should initialize the structure by calling #pj_ice_strans_cfg_default()
+ * before changing the settings.
*/
-enum pj_ice_strans_option
+typedef struct pj_ice_strans_cfg
{
/**
- * If this option is specified, only a listening socket will be
- * created for the component, and no candidate will be added to
- * the component. Application must add the component manually
- * by inspecting the socket and transport address of the component.
+ * Address family, IPv4 or IPv6. Currently only pj_AF_INET() (IPv4)
+ * is supported, and this is the default value.
*/
- PJ_ICE_ST_OPT_DONT_ADD_CAND = 1,
+ int af;
/**
- * If this option is specified, then no STUN reflexive candidate
- * will be added to the component.
- */
- PJ_ICE_ST_OPT_DISABLE_STUN = 2,
-
- /**
- * If this option is specified, then no STUN relay candidate
- * will be added to the component.
- */
- PJ_ICE_ST_OPT_DISABLE_RELAY = 4,
-
- /**
- * If this option is specified, then when the function fails to
- * bind the socket to the specified port, it WILL NOT try to
- * bind the socket to the next available port.
+ * STUN configuration which contains the timer heap and
+ * ioqueue instance to be used, and STUN retransmission
+ * settings. This setting is mandatory.
*
- * If this option is NOT specified, then the function will try to
- * bind the socket to next port+2, repetitively until the socket
- * is bound successfully.
+ * The default value is all zero. Application must initialize
+ * this setting with #pj_stun_config_init().
*/
- PJ_ICE_ST_OPT_NO_PORT_RETRY = 8,
-};
+ pj_stun_config stun_cfg;
-
-/**
- * This structure describes ICE stream transport candidate. A "candidate"
- * in ICE stream transport can be viewed as alias transport address
- * for the socket.
- */
-typedef struct pj_ice_strans_cand
-{
/**
- * Candidate type.
- */
- pj_ice_cand_type type;
-
- /**
- * Status of this candidate. This status is useful for ICE reflexive
- * and relay candidate, where the address needs to be resolved
- * asynchronously by sending STUN request to STUN server.
+ * DNS resolver to be used to resolve servers. If DNS SRV
+ * resolution is required, the resolver must be set.
*
- * The value will be PJ_SUCCESS if candidate address has been resolved
- * successfully, PJ_EPENDING when the address resolution process is
- * in progress, or other value when the address resolution has
- * completed with failure.
+ * The default value is NULL.
*/
- pj_status_t status;
+ pj_dns_resolver *resolver;
/**
- * The candidate transport address.
+ * STUN and local transport settings. This specifies the
+ * settings for local UDP socket, which will be resolved
+ * to get the STUN mapped address.
*/
- pj_sockaddr addr;
+ struct {
+ /**
+ * Optional configuration for STUN transport. The default
+ * value will be initialized with #pj_stun_sock_cfg_default().
+ */
+ pj_stun_sock_cfg cfg;
+
+ /**
+ * Disable host candidates. When this option is set, no
+ * host candidates will be added.
+ *
+ * Default: PJ_FALSE
+ */
+ pj_bool_t no_host_cands;
+
+ /**
+ * Include loopback addresses in the host candidates.
+ *
+ * Default: PJ_FALSE
+ */
+ pj_bool_t loop_addr;
+
+ /**
+ * Specify the STUN server domain or hostname or IP address.
+ * If DNS SRV resolution is required, application must fill
+ * in this setting with the domain name of the STUN server
+ * and set the resolver instance in the \a resolver field.
+ * Otherwise if the \a resolver setting is not set, this
+ * field will be resolved with hostname resolution and in
+ * this case the \a port field must be set.
+ *
+ * The \a port field should also be set even when DNS SRV
+ * resolution is used, in case the DNS SRV resolution fails.
+ *
+ * When this field is empty, STUN mapped address resolution
+ * will not be performed. In this case only ICE host candidates
+ * will be added to the ICE transport, unless if \a no_host_cands
+ * field is set. In this case, both host and srflx candidates
+ * are disabled.
+ *
+ * The default value is empty.
+ */
+ pj_str_t server;
+
+ /**
+ * The port number of the STUN server, when \a server
+ * field specifies a hostname rather than domain name. This
+ * field should also be set even when the \a server
+ * specifies a domain name, to allow DNS SRV resolution
+ * to fallback to DNS A/AAAA resolution when the DNS SRV
+ * resolution fails.
+ *
+ * The default value is PJ_STUN_PORT.
+ */
+ pj_uint16_t port;
+
+ } stun;
/**
- * The ICE session candidate ID after this candidate has been registered
- * to an ICE session. Before ICE session is created, or after ICE
- * session has been destroyed, the value will be -1.
+ * TURN specific settings.
*/
- int ice_cand_id;
+ struct {
+ /**
+ * Specify the TURN server domain or hostname or IP address.
+ * If DNS SRV resolution is required, application must fill
+ * in this setting with the domain name of the TURN server
+ * and set the resolver instance in the \a resolver field.
+ * Otherwise if the \a resolver setting is not set, this
+ * field will be resolved with hostname resolution and in
+ * this case the \a port field must be set.
+ *
+ * The \a port field should also be set even when DNS SRV
+ * resolution is used, in case the DNS SRV resolution fails.
+ *
+ * When this field is empty, relay candidate will not be
+ * created.
+ *
+ * The default value is empty.
+ */
+ pj_str_t server;
+
+ /**
+ * The port number of the TURN server, when \a server
+ * field specifies a hostname rather than domain name. This
+ * field should also be set even when the \a server
+ * specifies a domain name, to allow DNS SRV resolution
+ * to fallback to DNS A/AAAA resolution when the DNS SRV
+ * resolution fails.
+ *
+ * Default is zero.
+ */
+ pj_uint16_t port;
+
+ /**
+ * Type of connection to the TURN server.
+ *
+ * Default is PJ_TURN_TP_UDP.
+ */
+ pj_turn_tp_type conn_type;
+
+ /**
+ * Credential to be used for the TURN session. This setting
+ * is mandatory.
+ *
+ * Default is to have no credential.
+ */
+ pj_stun_auth_cred auth_cred;
+
+ /**
+ * Optional TURN Allocate parameter. The default value will be
+ * initialized by #pj_turn_alloc_param_default().
+ */
+ pj_turn_alloc_param alloc_param;
+
+ } turn;
+
+} pj_ice_strans_cfg;
- /**
- * Local preference value, which typically is 65535.
- */
- pj_uint16_t local_pref;
-
- /**
- * Foundation associated with this candidate, which value normally will be
- * calculated by the function.
- */
- pj_str_t foundation;
-} pj_ice_strans_cand;
-
-
-/**
- * This structure describes an ICE stream transport component. A component
- * in ICE stream transport typically corresponds to a single socket created
- * for this component, and bound to a specific transport address. This
- * component may have multiple alias addresses, for example one alias
- * address for each interfaces in multi-homed host, another for server
- * reflexive alias, and another for relayed alias. For each transport
- * address alias, an ICE stream transport candidate (#pj_ice_strans_cand) will
- * be created, and these candidates will eventually registered to the ICE
- * session.
+/**
+ * Initialize ICE transport configuration with default values.
+ *
+ * @param cfg The configuration to be initialized.
*/
-typedef struct pj_ice_strans_comp
-{
- pj_ice_strans *ice_st; /**< ICE stream transport. */
- unsigned comp_id; /**< Component ID. */
- pj_uint32_t options; /**< Option flags. */
- pj_sock_t sock; /**< Socket descriptor. */
-
- pj_stun_session *stun_sess; /**< STUN session. */
- pj_uint8_t ka_tsx_id[12]; /**< ID for keep STUN alives */
-
- pj_sockaddr local_addr; /**< Local/base address. */
-
- unsigned pending_cnt; /**< Pending resolution cnt. */
- pj_status_t last_status; /**< Last status. */
-
- unsigned cand_cnt; /**< # of candidates/aliaes. */
- pj_ice_strans_cand cand_list[PJ_ICE_ST_MAX_CAND]; /**< Cand array */
- int default_cand; /**< Default candidate selected */
-
- pj_ioqueue_key_t *key; /**< ioqueue key. */
- pj_uint8_t pkt[1500]; /**< Incoming packet buffer. */
- pj_ioqueue_op_key_t read_op; /**< ioqueue read operation key */
- pj_ioqueue_op_key_t write_op; /**< ioqueue write op. key */
- pj_sockaddr src_addr; /**< source packet address buf. */
- int src_addr_len; /**< length of src addr. buf. */
-
-} pj_ice_strans_comp;
+PJ_DECL(void) pj_ice_strans_cfg_default(pj_ice_strans_cfg *cfg);
/**
- * This structure represents the ICE stream transport.
+ * Copy configuration.
+ *
+ * @param pool Pool.
+ * @param dst Destination.
+ * @param src Source.
*/
-struct pj_ice_strans
-{
- char obj_name[PJ_MAX_OBJ_NAME]; /**< Log ID. */
-
- pj_pool_t *pool; /**< Pool used by this object. */
- void *user_data; /**< Application data. */
- pj_stun_config stun_cfg; /**< STUN settings. */
- pj_ice_strans_cb cb; /**< Application callback. */
-
- pj_ice_sess *ice; /**< ICE session. */
-
- unsigned comp_cnt; /**< Number of components. */
- pj_ice_strans_comp **comp; /**< Components array. */
-
- pj_dns_resolver *resolver; /**< The resolver instance. */
- pj_bool_t has_rjob; /**< Has pending resolve? */
- pj_sockaddr_in stun_srv; /**< STUN server address. */
- pj_sockaddr_in turn_srv; /**< TURN server address. */
-
- pj_timer_entry ka_timer; /**< STUN keep-alive timer. */
-};
+PJ_DECL(void) pj_ice_strans_cfg_copy(pj_pool_t *pool,
+ pj_ice_strans_cfg *dst,
+ const pj_ice_strans_cfg *src);
/**
- * Create the ICE stream transport containing the specified number of
- * components. After the ICE stream transport is created, application
- * may initialize the STUN server settings, and after that it has to
- * initialize each components by calling #pj_ice_strans_create_comp()
- * function.
+ * Create and initialize the ICE stream transport with the specified
+ * parameters.
*
- * @param stun_cfg The STUN settings.
* @param name Optional name for logging identification.
+ * @param cfg Configuration.
* @param comp_cnt Number of components.
* @param user_data Arbitrary user data to be associated with this
* ICE stream transport.
@@ -399,8 +297,8 @@ struct pj_ice_strans
* @return PJ_SUCCESS if ICE stream transport is created
* successfully.
*/
-PJ_DECL(pj_status_t) pj_ice_strans_create(pj_stun_config *stun_cfg,
- const char *name,
+PJ_DECL(pj_status_t) pj_ice_strans_create(const char *name,
+ const pj_ice_strans_cfg *cfg,
unsigned comp_cnt,
void *user_data,
const pj_ice_strans_cb *cb,
@@ -419,133 +317,24 @@ PJ_DECL(pj_status_t) pj_ice_strans_destroy(pj_ice_strans *ice_st);
/**
- * Set the domain to be used when resolving the STUN servers. If application
- * wants to utillize STUN, then STUN server must be specified, either by
- * calling this function or by calling #pj_ice_strans_set_stun_srv().
- *
- * If application calls this function, then the STUN/TURN servers will
- * be resolved by querying DNS SRV records for the specified domain.
- *
- * @param ice_st The ICE stream transport.
- * @param resolver The resolver instance that will be used to
- * resolve the STUN/TURN servers.
- * @param domain The target domain.
- *
- * @return PJ_SUCCESS if DNS SRV resolution job can be
- * started. The resolution process itself will
- * complete asynchronously.
- */
-PJ_DECL(pj_status_t) pj_ice_strans_set_stun_domain(pj_ice_strans *ice_st,
- pj_dns_resolver *resolver,
- const pj_str_t *domain);
-
-/**
- * Set the STUN and TURN server addresses. If application
- * wants to utillize STUN, then STUN server must be specified, either by
- * calling this function or by calling #pj_ice_strans_set_stun_domain().
- *
- * With this function, the STUN and TURN server addresses will be
- * assigned immediately, that is no DNS resolution will need to be
- * performed.
+ * Get the user data associated with the ICE stream transport.
*
* @param ice_st The ICE stream transport.
- * @param stun_srv The STUN server address, or NULL if STUN
- * reflexive candidate is not to be used.
- * @param turn_srv The TURN server address, or NULL if STUN
- * relay candidate is not to be used.
*
- * @return PJ_SUCCESS, or the appropriate error code.
+ * @return The user data.
*/
-PJ_DECL(pj_status_t)
-pj_ice_strans_set_stun_srv( pj_ice_strans *ice_st,
- const pj_sockaddr_in *stun_srv,
- const pj_sockaddr_in *turn_srv);
+PJ_DECL(void*) pj_ice_strans_get_user_data(pj_ice_strans *ice_st);
-/**
- * Create and initialize the specified component. This function will
- * instantiate the socket descriptor for this component, optionally
- * bind the socket to the specified address (or bind to any address/port
- * if the \a addr parameter is NULL), and start finding all alias
- * addresses for this socket. For each alias addresses that if finds,
- * it will add an ICE stream transport candidate for this component.
- *
- * After all components have been initialized, application should poll
- * the #pj_ice_strans_get_comps_status() peridically to check if STUN
- * server reflexive and relayed candidates have been obtained
- * successfully.
- *
- * @param ice_st The ICE stream transport.
- * @param comp_id The component ID, which value must be greater than
- * zero and less than or equal to the number of
- * components in this ICE stream transport.
- * @param options Options, see #pj_ice_strans_option.
- * @param addr Local address where socket will be bound to. This
- * address will be used as follows:
- * - if the value is NULL, then socket will be bound
- * to any available port.
- * - if the value is not NULL, then if the port number
- * is not zero, it will used as the starting port
- * where the socket will be bound to. If bind() to
- * this port fails, this function will try to bind
- * to port+2, repeatedly until it succeeded.
- * If application doesn't want this function to
- * retry binding the socket to other port, it can
- * specify PJ_ICE_ST_OPT_NO_PORT_RETRY option.
- * - if the value is not NULL, then if the address
- * is not INADDR_ANY, this function will bind the
- * socket to this particular interface only, and
- * no other host candidates will be added for this
- * socket.
- *
- *
- * @return PJ_SUCCESS, or the appropriate error code.
- */
-PJ_DECL(pj_status_t) pj_ice_strans_create_comp(pj_ice_strans *ice_st,
- unsigned comp_id,
- pj_uint32_t options,
- const pj_sockaddr_in *addr);
-
-/**
- * Manually add a candidate (transport address alias) for the specified
- * component. Normally application shouldn't need to use this function,
- * as candidates will be added automatically when component is created
- * with #pj_ice_strans_create_comp().
- *
- * @param ice_st ICE stream transport.
- * @param comp_id The component ID.
- * @param type The candidate type.
- * @param local_pref The local preference for this candidate
- * (typically the value is 65535).
- * @param addr The candidate address.
- * @param set_default Set to non-zero to make this candidate the
- * default candidate for this component.
- *
- * @return PJ_SUCCESS, or the appropriate error code.
- */
-PJ_DECL(pj_status_t) pj_ice_strans_add_cand(pj_ice_strans *ice_st,
- unsigned comp_id,
- pj_ice_cand_type type,
- pj_uint16_t local_pref,
- const pj_sockaddr_in *addr,
- pj_bool_t set_default);
-
-/**
- * Get the status of components in the ICE stream transports. Since
- * some IP address candidates have to be obtained asynchronously (for
- * example, the STUN reflexive or relay candidate), application can
- * use this function to know whether the address resolution has
- * completed.
- *
- * @param ice_st The ICE stream transport.
- *
- * @return PJ_SUCCESS if all candidates have been resolved
- * successfully, PJ_EPENDING if transport resolution
- * is still in progress, or other status on failure.
- */
-PJ_DECL(pj_status_t) pj_ice_strans_get_comps_status(pj_ice_strans *ice_st);
/**
* Initialize the ICE session in the ICE stream transport.
+ * When application is about to send an offer containing ICE capability,
+ * or when it receives an offer containing ICE capability, it must
+ * call this function to initialize the internal ICE session. This would
+ * register all transport address aliases for each component to the ICE
+ * session as candidates. Then application can enumerate all local
+ * candidates by calling #pj_ice_strans_enum_cands(), and encode these
+ * candidates in the SDP to be sent to remote agent.
*
* @param ice_st The ICE stream transport.
* @param role ICE role.
@@ -560,10 +349,10 @@ PJ_DECL(pj_status_t) pj_ice_strans_init_ice(pj_ice_strans *ice_st,
const pj_str_t *local_passwd);
/**
- * Enumerate the local candidates. This function can only be called
- * after the ICE session has been created in the ICE stream transport.
+ * Enumerate the local candidates for the specified component.
*
* @param ice_st The ICE stream transport.
+ * @param comp_id Component ID.
* @param count On input, it specifies the maximum number of
* elements. On output, it will be filled with
* the number of candidates copied to the
@@ -573,38 +362,113 @@ PJ_DECL(pj_status_t) pj_ice_strans_init_ice(pj_ice_strans *ice_st,
* @return PJ_SUCCESS, or the appropriate error code.
*/
PJ_DECL(pj_status_t) pj_ice_strans_enum_cands(pj_ice_strans *ice_st,
+ unsigned comp_id,
unsigned *count,
pj_ice_sess_cand cand[]);
/**
+ * Get the default candidate for the specified component. When this
+ * function is called before ICE negotiation completes, the default
+ * candidate is selected according to local preference criteria. When
+ * this function is called after ICE negotiation completes, the
+ * default candidate is the candidate that forms the valid pair.
+ *
+ * @param ice_st The ICE stream transport.
+ * @param comp_id Component ID.
+ * @param cand Pointer to receive the default candidate
+ * information.
+ */
+PJ_DECL(pj_status_t) pj_ice_strans_get_def_cand(pj_ice_strans *ice_st,
+ unsigned comp_id,
+ pj_ice_sess_cand *cand);
+
+/**
+ * Get the current ICE role. ICE session must have been initialized
+ * before this function can be called.
+ *
+ * @param ice_st The ICE stream transport.
+ *
+ * @return Current ICE role.
+ */
+PJ_DECL(pj_ice_sess_role) pj_ice_strans_get_role(pj_ice_strans *ice_st);
+
+
+/**
+ * Change session role. This happens for example when ICE session was
+ * created with controlled role when receiving an offer, but it turns out
+ * that the offer contains "a=ice-lite" attribute when the SDP gets
+ * inspected. ICE session must have been initialized before this function
+ * can be called.
+ *
+ * @param ice_st The ICE stream transport.
+ * @param new_role The new role to be set.
+ *
+ * @return PJ_SUCCESS on success, or the appropriate error.
+ */
+PJ_DECL(pj_status_t) pj_ice_strans_change_role(pj_ice_strans *ice_st,
+ pj_ice_sess_role new_role);
+
+
+/**
* Start ICE connectivity checks. This function can only be called
- * after the ICE session has been created in the ICE stream transport.
+ * after the ICE session has been created in the ICE stream transport
+ * with #pj_ice_strans_init_ice().
*
- * This function will pair the local and remote candidates to create
- * check list. Once the check list is created and sorted based on the
- * priority, ICE periodic checks will be started. This function will
- * return immediately, and application will be notified about the
- * connectivity check status in the callback.
+ * This function must be called once application has received remote
+ * candidate list (typically from the remote SDP). This function pairs
+ * local candidates with remote candidates, and starts ICE connectivity
+ * checks. The ICE session/transport will then notify the application
+ * via the callback when ICE connectivity checks completes, either
+ * successfully or with failure.
*
* @param ice_st The ICE stream transport.
* @param rem_ufrag Remote ufrag, as seen in the SDP received from
* the remote agent.
* @param rem_passwd Remote password, as seen in the SDP received from
* the remote agent.
- * @param rem_cand_cnt Number of remote candidates.
- * @param rem_cand Remote candidate array.
+ * @param rcand_cnt Number of remote candidates in the array.
+ * @param rcand Remote candidates array.
*
* @return PJ_SUCCESS, or the appropriate error code.
*/
-PJ_DECL(pj_status_t)
-pj_ice_strans_start_ice( pj_ice_strans *ice_st,
- const pj_str_t *rem_ufrag,
- const pj_str_t *rem_passwd,
- unsigned rem_cand_cnt,
- const pj_ice_sess_cand rem_cand[]);
+PJ_DECL(pj_status_t) pj_ice_strans_start_ice(pj_ice_strans *ice_st,
+ const pj_str_t *rem_ufrag,
+ const pj_str_t *rem_passwd,
+ unsigned rcand_cnt,
+ const pj_ice_sess_cand rcand[]);
+
+/**
+ * Retrieve the candidate pair that has been nominated and successfully
+ * checked for the specified component. If ICE negotiation is still in
+ * progress or it has failed, this function will return NULL.
+ *
+ * @param ice_st The ICE stream transport.
+ * @param comp_id Component ID.
+ *
+ * @return The valid pair as ICE checklist structure if the
+ * pair exist.
+ */
+PJ_DECL(const pj_ice_sess_check*)
+pj_ice_strans_get_valid_pair(const pj_ice_strans *ice_st,
+ unsigned comp_id);
/**
- * Stop and destroy the ICE session inside this media transport.
+ * Stop and destroy the ICE session inside this media transport. Application
+ * needs to call this function once the media session is over (the call has
+ * been disconnected).
+ *
+ * Application MAY reuse this ICE stream transport for subsequent calls.
+ * In this case, it must call #pj_ice_strans_stop_ice() when the call is
+ * disconnected, and reinitialize the ICE stream transport for subsequent
+ * call with #pj_ice_strans_init_ice()/#pj_ice_strans_start_ice(). In this
+ * case, the ICE stream transport will maintain the internal sockets and
+ * continue to send STUN keep-alive packets and TURN Refresh request to
+ * keep the NAT binding/TURN allocation open and to detect change in STUN
+ * mapped address.
+ *
+ * If application does not want to reuse the ICE stream transport for
+ * subsequent calls, it must call #pj_ice_strans_destroy() to destroy the
+ * ICE stream transport altogether.
*
* @param ice_st The ICE stream transport.
*
@@ -614,11 +478,16 @@ PJ_DECL(pj_status_t) pj_ice_strans_stop_ice(pj_ice_strans *ice_st);
/**
- * Send outgoing packet using this transport. If ICE checks have not
- * produced a valid check for the specified component ID, this function
- * send to the destination address. Otherwise it will send the packet to
- * remote destination using the nominated local candidate as have been checked
- * previously.
+ * Send outgoing packet using this transport.
+ * Application can send data (normally RTP or RTCP packets) at any time
+ * by calling this function. This function takes a destination
+ * address as one of the arguments, and this destination address should
+ * be taken from the default transport address of the component (that is
+ * the address in SDP c= and m= lines, or in a=rtcp attribute).
+ * If ICE negotiation is in progress, this function will send the data
+ * to the destination address. Otherwise if ICE negotiation has completed
+ * successfully, this function will send the data to the nominated remote
+ * address, as negotiated by ICE.
*
* @param ice_st The ICE stream transport.
* @param comp_id Component ID.