From d74a1707948d51e98826aa4507ff1dd1a6c02601 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Mon, 9 Nov 2009 08:51:34 +0000 Subject: 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 --- pjlib/src/pj/sock_qos_symbian.cpp | 4 ++++ pjlib/src/pj/ssl_sock_common.c | 2 ++ pjlib/src/pj/ssl_sock_ossl.c | 21 +++++++++++++++++++++ pjlib/src/pj/ssl_sock_symbian.cpp | 39 +++++++++++++++++++++++++++++++-------- 4 files changed, 58 insertions(+), 8 deletions(-) (limited to 'pjlib/src/pj') 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; -- cgit v1.2.3