diff options
author | Benny Prijono <bennylp@teluu.com> | 2009-11-09 08:51:34 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2009-11-09 08:51:34 +0000 |
commit | d74a1707948d51e98826aa4507ff1dd1a6c02601 (patch) | |
tree | 6f9d6d852f0ad80e27ca3d2fde00befbf8c28b32 | |
parent | 23363ea696574b1f6e40c3e8c800cb12e2c5ff57 (diff) |
Ticket #950 and #957:
- added QoS options on PJLIB/PJLIB SSL/TLS socket/transport
- added demo in Symbian ua.cpp
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2998 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r-- | pjlib/include/pj/ssl_sock.h | 30 | ||||
-rw-r--r-- | pjlib/src/pj/sock_qos_symbian.cpp | 4 | ||||
-rw-r--r-- | pjlib/src/pj/ssl_sock_common.c | 2 | ||||
-rw-r--r-- | pjlib/src/pj/ssl_sock_ossl.c | 21 | ||||
-rw-r--r-- | pjlib/src/pj/ssl_sock_symbian.cpp | 39 | ||||
-rw-r--r-- | pjsip-apps/src/pjsua/pjsua_app.c | 5 | ||||
-rw-r--r-- | pjsip-apps/src/symbian_ua/ua.cpp | 36 | ||||
-rw-r--r-- | pjsip/include/pjsip/sip_transport_tls.h | 29 | ||||
-rw-r--r-- | pjsip/src/pjsip/sip_transport_tls.c | 8 |
9 files changed, 164 insertions, 10 deletions
diff --git a/pjlib/include/pj/ssl_sock.h b/pjlib/include/pj/ssl_sock.h index ad4556e4..9c392143 100644 --- a/pjlib/include/pj/ssl_sock.h +++ b/pjlib/include/pj/ssl_sock.h @@ -26,6 +26,7 @@ #include <pj/ioqueue.h> #include <pj/sock.h> +#include <pj/sock_qos.h> PJ_BEGIN_DECL @@ -531,7 +532,34 @@ typedef struct pj_ssl_sock_param * Default value is zero/not-set. */ pj_str_t server_name; - + + /** + * QoS traffic type to be set on this transport. When application wants + * to apply QoS tagging to the transport, it's preferable to set this + * field rather than \a qos_param fields since this is more portable. + * + * Default value is PJ_QOS_TYPE_BEST_EFFORT. + */ + pj_qos_type qos_type; + + /** + * Set the low level QoS parameters to the transport. This is a lower + * level operation than setting the \a qos_type field and may not be + * supported on all platforms. + * + * By default all settings in this structure are disabled. + */ + pj_qos_params qos_params; + + /** + * Specify if the transport should ignore any errors when setting the QoS + * traffic type/parameters. + * + * Default: PJ_TRUE + */ + pj_bool_t qos_ignore_error; + + } pj_ssl_sock_param; diff --git a/pjlib/src/pj/sock_qos_symbian.cpp b/pjlib/src/pj/sock_qos_symbian.cpp index f9e3c3dd..4999c84c 100644 --- a/pjlib/src/pj/sock_qos_symbian.cpp +++ b/pjlib/src/pj/sock_qos_symbian.cpp @@ -22,6 +22,8 @@ PJ_DEF(pj_status_t) pj_sock_set_qos_params(pj_sock_t sock, pj_qos_params *param) { + PJ_ASSERT_RETURN(sock!=0 && sock!=PJ_INVALID_SOCKET, PJ_EINVAL); + CPjSocket *pjsock = (CPjSocket*)sock; RSocket & rsock = pjsock->Socket(); pj_status_t last_err = PJ_ENOTSUP; @@ -60,6 +62,8 @@ PJ_DEF(pj_status_t) pj_sock_set_qos_type(pj_sock_t sock, PJ_DEF(pj_status_t) pj_sock_get_qos_params(pj_sock_t sock, pj_qos_params *p_param) { + PJ_ASSERT_RETURN(sock!=0 && sock!=PJ_INVALID_SOCKET, PJ_EINVAL); + CPjSocket *pjsock = (CPjSocket*)sock; RSocket & rsock = pjsock->Socket(); TInt err, dscp; diff --git a/pjlib/src/pj/ssl_sock_common.c b/pjlib/src/pj/ssl_sock_common.c index 30603795..127099c6 100644 --- a/pjlib/src/pj/ssl_sock_common.c +++ b/pjlib/src/pj/ssl_sock_common.c @@ -120,6 +120,8 @@ PJ_DEF(void) pj_ssl_sock_param_default(pj_ssl_sock_param *param) #if !defined(PJ_SYMBIAN) || PJ_SYMBIAN==0 param->read_buffer_size = 1500; #endif + param->qos_type = PJ_QOS_TYPE_BEST_EFFORT; + param->qos_ignore_error = PJ_TRUE; /* Security config */ param->proto = PJ_SSL_SOCK_PROTO_DEFAULT; diff --git a/pjlib/src/pj/ssl_sock_ossl.c b/pjlib/src/pj/ssl_sock_ossl.c index 0c6aab1e..be9b58ca 100644 --- a/pjlib/src/pj/ssl_sock_ossl.c +++ b/pjlib/src/pj/ssl_sock_ossl.c @@ -1207,6 +1207,13 @@ static pj_bool_t asock_on_accept_complete (pj_activesock_t *asock, goto on_return; } + /* Apply QoS, if specified */ + status = pj_sock_apply_qos2(ssock->sock, ssock->param.qos_type, + &ssock->param.qos_params, 1, + ssock->pool->obj_name, NULL); + if (status != PJ_SUCCESS && !ssock->param.qos_ignore_error) + goto on_return; + /* Update local address */ ssock->addr_len = src_addr_len; status = pj_sock_getsockname(ssock->sock, &ssock->local_addr, @@ -1953,6 +1960,13 @@ PJ_DEF(pj_status_t) pj_ssl_sock_start_accept (pj_ssl_sock_t *ssock, if (status != PJ_SUCCESS) goto on_error; + /* Apply QoS, if specified */ + status = pj_sock_apply_qos2(ssock->sock, ssock->param.qos_type, + &ssock->param.qos_params, 2, + ssock->pool->obj_name, NULL); + if (status != PJ_SUCCESS && !ssock->param.qos_ignore_error) + goto on_error; + /* Bind socket */ status = pj_sock_bind(ssock->sock, localaddr, addr_len); if (status != PJ_SUCCESS) @@ -2028,6 +2042,13 @@ PJ_DECL(pj_status_t) pj_ssl_sock_start_connect(pj_ssl_sock_t *ssock, if (status != PJ_SUCCESS) goto on_error; + /* Apply QoS, if specified */ + status = pj_sock_apply_qos2(ssock->sock, ssock->param.qos_type, + &ssock->param.qos_params, 2, + ssock->pool->obj_name, NULL); + if (status != PJ_SUCCESS && !ssock->param.qos_ignore_error) + goto on_error; + /* Bind socket */ status = pj_sock_bind(ssock->sock, localaddr, addr_len); if (status != PJ_SUCCESS) diff --git a/pjlib/src/pj/ssl_sock_symbian.cpp b/pjlib/src/pj/ssl_sock_symbian.cpp index 18dfd7c0..efcf1702 100644 --- a/pjlib/src/pj/ssl_sock_symbian.cpp +++ b/pjlib/src/pj/ssl_sock_symbian.cpp @@ -97,8 +97,11 @@ public: SSL_STATE_ESTABLISHED }; - static CPjSSLSocket *NewL(const TDesC8 &ssl_proto) { - CPjSSLSocket *self = new (ELeave) CPjSSLSocket(); + static CPjSSLSocket *NewL(const TDesC8 &ssl_proto, + pj_qos_type qos_type, + const pj_qos_params &qos_params) + { + CPjSSLSocket *self = new (ELeave) CPjSSLSocket(qos_type, qos_params); CleanupStack::PushL(self); self->ConstructL(ssl_proto); CleanupStack::Pop(self); @@ -130,6 +133,10 @@ private: pj_sock_t sock_; CSecureSocket *securesock_; bool is_connected_; + + pj_qos_type qos_type_; + pj_qos_params qos_params_; + CPjSSLSocketReader *reader_; TBuf<32> ssl_proto_; TInetAddr rem_addr_; @@ -143,11 +150,11 @@ private: void DoCancel(); void RunL(); - CPjSSLSocket() : + CPjSSLSocket(pj_qos_type qos_type, const pj_qos_params &qos_params) : CActive(0), state_(SSL_STATE_NULL), sock_(PJ_INVALID_SOCKET), - securesock_(NULL), - is_connected_(false), reader_(NULL), - cb_(NULL), key_(NULL) + securesock_(NULL), is_connected_(false), + qos_type_(qos_type), qos_params_(qos_params), + reader_(NULL), cb_(NULL), key_(NULL) {} void ConstructL(const TDesC8 &ssl_proto) { @@ -164,7 +171,7 @@ private: securesock_ = NULL; } if (sock_ != PJ_INVALID_SOCKET) { - delete (CPjSocket*)sock_; + pj_sock_close(sock_); sock_ = PJ_INVALID_SOCKET; } } @@ -183,6 +190,10 @@ int CPjSSLSocket::Connect(CPjSSLSocket_cb cb, void *key, if (status != PJ_SUCCESS) return status; + // Apply QoS + status = pj_sock_apply_qos2(sock_, qos_type_, &qos_params_, + 2, THIS_FILE, NULL); + RSocket &rSock = ((CPjSocket*)sock_)->Socket(); local_addr_ = local_addr; @@ -412,6 +423,12 @@ struct pj_ssl_sock_t pj_sockaddr local_addr; pj_sockaddr rem_addr; + /* QoS settings */ + pj_qos_type qos_type; + pj_qos_params qos_params; + pj_bool_t qos_ignore_error; + + pj_ssl_sock_proto proto; pj_time_val timeout; unsigned ciphers_num; @@ -502,6 +519,11 @@ PJ_DEF(pj_status_t) pj_ssl_sock_create (pj_pool_t *pool, } pj_strdup_with_null(pool, &ssock->servername, ¶m->server_name); + ssock->qos_type = param->qos_type; + ssock->qos_ignore_error = param->qos_ignore_error; + pj_memcpy(&ssock->qos_params, ¶m->qos_params, + sizeof(param->qos_params)); + /* Finally */ *p_ssock = ssock; @@ -1061,7 +1083,8 @@ PJ_DEF(pj_status_t) pj_ssl_sock_start_connect (pj_ssl_sock_t *ssock, pj_sockaddr_cp((pj_sockaddr_t*)&ssock->rem_addr, remaddr); /* Init SSL engine */ - TRAPD(err, sock = CPjSSLSocket::NewL(proto)); + TRAPD(err, sock = CPjSSLSocket::NewL(proto, ssock->qos_type, + ssock->qos_params)); if (err != KErrNone) return PJ_ENOMEM; diff --git a/pjsip-apps/src/pjsua/pjsua_app.c b/pjsip-apps/src/pjsua/pjsua_app.c index afca3914..c703fa5c 100644 --- a/pjsip-apps/src/pjsua/pjsua_app.c +++ b/pjsip-apps/src/pjsua/pjsua_app.c @@ -4600,6 +4600,11 @@ pj_status_t app_init(int argc, char *argv[]) pjsua_acc_id acc_id; + /* Copy the QoS settings */ + tcp_cfg.tls_setting.qos_type = tcp_cfg.qos_type; + pj_memcpy(&tcp_cfg.tls_setting.qos_params, &tcp_cfg.qos_params, + sizeof(tcp_cfg.qos_params)); + /* Set TLS port as TCP port+1 */ tcp_cfg.port++; status = pjsua_transport_create(PJSIP_TRANSPORT_TLS, diff --git a/pjsip-apps/src/symbian_ua/ua.cpp b/pjsip-apps/src/symbian_ua/ua.cpp index d4a5c3ec..706a41d2 100644 --- a/pjsip-apps/src/symbian_ua/ua.cpp +++ b/pjsip-apps/src/symbian_ua/ua.cpp @@ -92,6 +92,16 @@ #define USE_SRTP PJSUA_DEFAULT_USE_SRTP // +// Set QoS on transports? Yes! +// As an example, we set SIP transports DSCP value to CS3 (DSCP +// value 24 or 0x18), for no reason, and tag RTP/RTCP packets +// with VOICE type. +// +#define SIP_QOS_DSCP 0x18 +#define RTP_QOS_TYPE PJ_QOS_TYPE_VOICE + + +// // Globals // static pjsua_acc_id g_acc_id = PJSUA_INVALID_ID; @@ -384,6 +394,10 @@ static pj_status_t app_startup() /* Add UDP transport. */ pjsua_transport_config_default(&tcfg); tcfg.port = SIP_PORT; + if (SIP_QOS_DSCP) { + tcfg.qos_params.flags |= PJ_QOS_PARAM_HAS_DSCP; + tcfg.qos_params.dscp_val = SIP_QOS_DSCP; + } status = pjsua_transport_create(PJSIP_TRANSPORT_UDP, &tcfg, &tid); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Error creating UDP transport", status); @@ -396,6 +410,10 @@ static pj_status_t app_startup() /* Add TCP transport */ pjsua_transport_config_default(&tcfg); tcfg.port = SIP_PORT; + if (SIP_QOS_DSCP) { + tcfg.qos_params.flags |= PJ_QOS_PARAM_HAS_DSCP; + tcfg.qos_params.dscp_val = SIP_QOS_DSCP; + } status = pjsua_transport_create(PJSIP_TRANSPORT_TCP, &tcfg, &tid); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Error creating TCP transport", status); @@ -408,6 +426,11 @@ static pj_status_t app_startup() /* Add TLS transport */ pjsua_transport_config_default(&tcfg); tcfg.port = SIP_PORT + 1; + if (SIP_QOS_DSCP) { + tcfg.qos_params.flags |= PJ_QOS_PARAM_HAS_DSCP; + tcfg.qos_params.dscp_val = SIP_QOS_DSCP; + tcfg.tls_setting.qos_params = tcfg.qos_params; + } status = pjsua_transport_create(PJSIP_TRANSPORT_TLS, &tcfg, &tid); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Error creating TLS transport", status); @@ -419,7 +442,18 @@ static pj_status_t app_startup() /* Add account for the transport */ pjsua_acc_add_local(tid, PJ_TRUE, &g_acc_id); - + /* Create media transports */ + pjsua_transport_config mtcfg; + pjsua_transport_config_default(&mtcfg); + mtcfg.port = 4000; + mtcfg.qos_type = RTP_QOS_TYPE; + status = pjsua_media_transports_create(&mtcfg); + if (status != PJ_SUCCESS) { + pjsua_perror(THIS_FILE, "Error creating media transports", status); + pjsua_destroy(); + return status; + } + /* Initialization is done, now start pjsua */ status = pjsua_start(); if (status != PJ_SUCCESS) { diff --git a/pjsip/include/pjsip/sip_transport_tls.h b/pjsip/include/pjsip/sip_transport_tls.h index dbf4b344..8c41e167 100644 --- a/pjsip/include/pjsip/sip_transport_tls.h +++ b/pjsip/include/pjsip/sip_transport_tls.h @@ -27,6 +27,7 @@ #include <pjsip/sip_transport.h> #include <pj/string.h> +#include <pj/sock_qos.h> PJ_BEGIN_DECL @@ -160,6 +161,32 @@ typedef struct pjsip_tls_setting */ pj_time_val timeout; + /** + * QoS traffic type to be set on this transport. When application wants + * to apply QoS tagging to the transport, it's preferable to set this + * field rather than \a qos_param fields since this is more portable. + * + * Default value is PJ_QOS_TYPE_BEST_EFFORT. + */ + pj_qos_type qos_type; + + /** + * Set the low level QoS parameters to the transport. This is a lower + * level operation than setting the \a qos_type field and may not be + * supported on all platforms. + * + * By default all settings in this structure are disabled. + */ + pj_qos_params qos_params; + + /** + * Specify if the transport should ignore any errors when setting the QoS + * traffic type/parameters. + * + * Default: PJ_TRUE + */ + pj_bool_t qos_ignore_error; + } pjsip_tls_setting; @@ -171,6 +198,8 @@ typedef struct pjsip_tls_setting PJ_INLINE(void) pjsip_tls_setting_default(pjsip_tls_setting *tls_opt) { pj_memset(tls_opt, 0, sizeof(*tls_opt)); + tls_opt->qos_type = PJ_QOS_TYPE_BEST_EFFORT; + tls_opt->qos_ignore_error = PJ_TRUE; } diff --git a/pjsip/src/pjsip/sip_transport_tls.c b/pjsip/src/pjsip/sip_transport_tls.c index 4aec16c2..0748896b 100644 --- a/pjsip/src/pjsip/sip_transport_tls.c +++ b/pjsip/src/pjsip/sip_transport_tls.c @@ -250,6 +250,10 @@ PJ_DEF(pj_status_t) pjsip_tls_transport_start (pjsip_endpoint *endpt, ssock_param.send_buffer_size = PJSIP_MAX_PKT_LEN; if (ssock_param.read_buffer_size < PJSIP_MAX_PKT_LEN) ssock_param.read_buffer_size = PJSIP_MAX_PKT_LEN; + ssock_param.qos_type = listener->tls_setting.qos_type; + ssock_param.qos_ignore_error = listener->tls_setting.qos_ignore_error; + pj_memcpy(&ssock_param.qos_params, &listener->tls_setting.qos_params, + sizeof(ssock_param.qos_params)); has_listener = PJ_FALSE; @@ -797,6 +801,10 @@ static pj_status_t lis_create_transport(pjsip_tpfactory *factory, ssock_param.send_buffer_size = PJSIP_MAX_PKT_LEN; if (ssock_param.read_buffer_size < PJSIP_MAX_PKT_LEN) ssock_param.read_buffer_size = PJSIP_MAX_PKT_LEN; + ssock_param.qos_type = listener->tls_setting.qos_type; + ssock_param.qos_ignore_error = listener->tls_setting.qos_ignore_error; + pj_memcpy(&ssock_param.qos_params, &listener->tls_setting.qos_params, + sizeof(ssock_param.qos_params)); switch(listener->tls_setting.method) { case PJSIP_TLSV1_METHOD: |