summaryrefslogtreecommitdiff
path: root/pjnath/src/pjnath/turn_sock.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjnath/src/pjnath/turn_sock.c')
-rw-r--r--pjnath/src/pjnath/turn_sock.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/pjnath/src/pjnath/turn_sock.c b/pjnath/src/pjnath/turn_sock.c
index 0c71d5cb..287b0299 100644
--- a/pjnath/src/pjnath/turn_sock.c
+++ b/pjnath/src/pjnath/turn_sock.c
@@ -46,6 +46,7 @@ struct pj_turn_sock
pj_turn_alloc_param alloc_param;
pj_stun_config cfg;
+ pj_turn_sock_cfg setting;
pj_bool_t destroy_request;
pj_timer_entry timer;
@@ -92,6 +93,14 @@ static void destroy(pj_turn_sock *turn_sock);
static void timer_cb(pj_timer_heap_t *th, pj_timer_entry *e);
+/* Init config */
+PJ_DEF(void) pj_turn_sock_cfg_default(pj_turn_sock_cfg *cfg)
+{
+ pj_bzero(cfg, sizeof(*cfg));
+ cfg->qos_type = PJ_QOS_TYPE_BEST_EFFORT;
+ cfg->qos_ignore_error = PJ_TRUE;
+}
+
/*
* Create.
*/
@@ -99,21 +108,26 @@ PJ_DEF(pj_status_t) pj_turn_sock_create(pj_stun_config *cfg,
int af,
pj_turn_tp_type conn_type,
const pj_turn_sock_cb *cb,
- unsigned options,
+ const pj_turn_sock_cfg *setting,
void *user_data,
pj_turn_sock **p_turn_sock)
{
pj_turn_sock *turn_sock;
pj_turn_session_cb sess_cb;
+ pj_turn_sock_cfg default_setting;
pj_pool_t *pool;
const char *name_tmpl;
pj_status_t status;
PJ_ASSERT_RETURN(cfg && p_turn_sock, PJ_EINVAL);
PJ_ASSERT_RETURN(af==pj_AF_INET() || af==pj_AF_INET6(), PJ_EINVAL);
- PJ_ASSERT_RETURN(options==0, PJ_EINVAL);
PJ_ASSERT_RETURN(conn_type!=PJ_TURN_TP_TCP || PJ_HAS_TCP, PJ_EINVAL);
+ if (!setting) {
+ pj_turn_sock_cfg_default(&default_setting);
+ setting = &default_setting;
+ }
+
switch (conn_type) {
case PJ_TURN_TP_UDP:
name_tmpl = "udprel%p";
@@ -139,6 +153,9 @@ PJ_DEF(pj_status_t) pj_turn_sock_create(pj_stun_config *cfg,
/* Copy STUN config (this contains ioqueue, timer heap, etc.) */
pj_memcpy(&turn_sock->cfg, cfg, sizeof(*cfg));
+ /* Copy setting (QoS parameters etc */
+ pj_memcpy(&turn_sock->setting, setting, sizeof(*setting));
+
/* Set callback */
if (cb) {
pj_memcpy(&turn_sock->cb, cb, sizeof(*cb));
@@ -652,6 +669,16 @@ static void turn_on_state(pj_turn_session *sess,
return;
}
+ /* Apply QoS, if specified */
+ status = pj_sock_apply_qos2(sock, turn_sock->setting.qos_type,
+ &turn_sock->setting.qos_params,
+ (turn_sock->setting.qos_ignore_error?2:1),
+ turn_sock->pool->obj_name, NULL);
+ if (status != PJ_SUCCESS && !turn_sock->setting.qos_ignore_error) {
+ pj_turn_sock_destroy(turn_sock);
+ return;
+ }
+
/* Create active socket */
pj_bzero(&asock_cb, sizeof(asock_cb));
asock_cb.on_data_read = &on_data_read;