summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2009-11-09 08:51:34 +0000
committerBenny Prijono <bennylp@teluu.com>2009-11-09 08:51:34 +0000
commitd74a1707948d51e98826aa4507ff1dd1a6c02601 (patch)
tree6f9d6d852f0ad80e27ca3d2fde00befbf8c28b32
parent23363ea696574b1f6e40c3e8c800cb12e2c5ff57 (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.h30
-rw-r--r--pjlib/src/pj/sock_qos_symbian.cpp4
-rw-r--r--pjlib/src/pj/ssl_sock_common.c2
-rw-r--r--pjlib/src/pj/ssl_sock_ossl.c21
-rw-r--r--pjlib/src/pj/ssl_sock_symbian.cpp39
-rw-r--r--pjsip-apps/src/pjsua/pjsua_app.c5
-rw-r--r--pjsip-apps/src/symbian_ua/ua.cpp36
-rw-r--r--pjsip/include/pjsip/sip_transport_tls.h29
-rw-r--r--pjsip/src/pjsip/sip_transport_tls.c8
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, &param->server_name);
+ ssock->qos_type = param->qos_type;
+ ssock->qos_ignore_error = param->qos_ignore_error;
+ pj_memcpy(&ssock->qos_params, &param->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: