summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2015-08-07 09:00:52 +0000
committerLiong Sauw Ming <ming@teluu.com>2015-08-07 09:00:52 +0000
commit74acf75a496b739a6a9e47eedb91891f18d4085b (patch)
tree3cd09b9df53bf6dc8029a9e9daa5e1e32cddb0e8
parent332c08359c2214f170722229a8c7864f72b5c666 (diff)
Fixed #1878: Compile time option for TCP/TLS transport to not create a listener
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5152 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjsip/include/pjsip/sip_config.h40
-rw-r--r--pjsip/src/pjsip/sip_transport_tcp.c53
-rw-r--r--pjsip/src/pjsip/sip_transport_tls.c18
3 files changed, 98 insertions, 13 deletions
diff --git a/pjsip/include/pjsip/sip_config.h b/pjsip/include/pjsip/sip_config.h
index 6036ba46..59da2a9f 100644
--- a/pjsip/include/pjsip/sip_config.h
+++ b/pjsip/include/pjsip/sip_config.h
@@ -670,6 +670,46 @@ PJ_INLINE(pjsip_cfg_t*) pjsip_cfg(void)
/**
+ * Specify whether TCP transport should skip creating the listener.
+ * Not having a listener means that application will not be able to
+ * function in server mode and accept incoming connections.
+ *
+ * When enabling this setting, if you use PJSUA, it is recommended to set
+ * pjsua_acc_config.contact_use_src_port to PJ_TRUE.
+ * Warning: If contact_use_src_port is disabled or failed (because it's
+ * unsupported in some platforms or automatically turned off due to
+ * DNS server resolution), Contact header will be generated from
+ * pj_getipinterface()/pj_gethostip(), but the address will not be
+ * able to accept connections.
+ *
+ * Default is FALSE (listener will be created).
+ */
+#ifndef PJSIP_TCP_TRANSPORT_DONT_CREATE_LISTENER
+# define PJSIP_TCP_TRANSPORT_DONT_CREATE_LISTENER 0
+#endif
+
+
+/**
+ * Specify whether TLS transport should skip creating the listener.
+ * Not having a listener means that application will not be able to
+ * function in server mode and accept incoming connections.
+ *
+ * When enabling this setting, if you use PJSUA, it is recommended to set
+ * pjsua_acc_config.contact_use_src_port to PJ_TRUE.
+ * Warning: If contact_use_src_port is disabled or failed (because it's
+ * unsupported in some platforms or automatically turned off due to
+ * DNS server resolution), Contact header will be generated from
+ * pj_getipinterface()/pj_gethostip(), but the address will not be
+ * able to accept connections.
+ *
+ * Default is FALSE (listener will be created).
+ */
+#ifndef PJSIP_TLS_TRANSPORT_DONT_CREATE_LISTENER
+# define PJSIP_TLS_TRANSPORT_DONT_CREATE_LISTENER 0
+#endif
+
+
+/**
* Set the interval to send keep-alive packet for TCP transports.
* If the value is zero, keep-alive will be disabled for TCP.
*
diff --git a/pjsip/src/pjsip/sip_transport_tcp.c b/pjsip/src/pjsip/sip_transport_tcp.c
index 096d813f..839d3294 100644
--- a/pjsip/src/pjsip/sip_transport_tcp.c
+++ b/pjsip/src/pjsip/sip_transport_tcp.c
@@ -258,6 +258,7 @@ PJ_DEF(pj_status_t) pjsip_tcp_transport_start3(
pj_activesock_cb listener_cb;
pj_sockaddr *listener_addr;
int addr_len;
+ pj_bool_t has_listener = PJ_FALSE;
pj_status_t status;
/* Sanity check */
@@ -278,7 +279,7 @@ PJ_DEF(pj_status_t) pjsip_tcp_transport_start3(
}
}
- pool = pjsip_endpt_create_pool(endpt, "tcplis", POOL_LIS_INIT,
+ pool = pjsip_endpt_create_pool(endpt, "tcptp", POOL_LIS_INIT,
POOL_LIS_INC);
PJ_ASSERT_RETURN(pool, PJ_ENOMEM);
@@ -297,7 +298,7 @@ PJ_DEF(pj_status_t) pjsip_tcp_transport_start3(
pj_memcpy(&listener->sockopt_params, &cfg->sockopt_params,
sizeof(cfg->sockopt_params));
- pj_ansi_strcpy(listener->factory.obj_name, "tcplis");
+ pj_ansi_strcpy(listener->factory.obj_name, "tcptp");
if (listener->factory.type==PJSIP_TRANSPORT_TCP6)
pj_ansi_strcat(listener->factory.obj_name, "6");
@@ -306,6 +307,8 @@ PJ_DEF(pj_status_t) pjsip_tcp_transport_start3(
if (status != PJ_SUCCESS)
goto on_error;
+#if !(defined(PJSIP_TCP_TRANSPORT_DONT_CREATE_LISTENER) && \
+ PJSIP_TCP_TRANSPORT_DONT_CREATE_LISTENER != 0)
/* Create socket */
status = pj_sock_socket(cfg->af, pj_SOCK_STREAM(), 0, &sock);
@@ -332,6 +335,10 @@ PJ_DEF(pj_status_t) pjsip_tcp_transport_start3(
if (cfg->sockopt_params.cnt)
status = pj_sock_setsockopt_params(sock, &cfg->sockopt_params);
+#else
+ PJ_UNUSED_ARG(addr_len);
+#endif
+
/* Bind address may be different than factory.local_addr because
* factory.local_addr will be resolved below.
*/
@@ -341,6 +348,9 @@ PJ_DEF(pj_status_t) pjsip_tcp_transport_start3(
listener_addr = &listener->factory.local_addr;
pj_sockaddr_cp(listener_addr, &cfg->bind_addr);
+#if !(defined(PJSIP_TCP_TRANSPORT_DONT_CREATE_LISTENER) && \
+ PJSIP_TCP_TRANSPORT_DONT_CREATE_LISTENER != 0)
+
status = pj_sock_bind(sock, listener_addr,
pj_sockaddr_get_len(listener_addr));
if (status != PJ_SUCCESS)
@@ -352,6 +362,8 @@ PJ_DEF(pj_status_t) pjsip_tcp_transport_start3(
if (status != PJ_SUCCESS)
goto on_error;
+#endif
+
/* If published host/IP is specified, then use that address as the
* listener advertised address.
*/
@@ -392,8 +404,11 @@ PJ_DEF(pj_status_t) pjsip_tcp_transport_start3(
pj_ansi_snprintf(listener->factory.obj_name,
sizeof(listener->factory.obj_name),
- "tcplis:%d", listener->factory.addr_name.port);
+ "tcptp:%d", listener->factory.addr_name.port);
+
+#if !(defined(PJSIP_TCP_TRANSPORT_DONT_CREATE_LISTENER) && \
+ PJSIP_TCP_TRANSPORT_DONT_CREATE_LISTENER != 0)
/* Start listening to the address */
status = pj_sock_listen(sock, PJSIP_TCP_TRANSPORT_BACKLOG);
@@ -408,6 +423,8 @@ PJ_DEF(pj_status_t) pjsip_tcp_transport_start3(
else
asock_cfg.async_cnt = cfg->async_cnt;
+#endif
+
/* Create group lock */
status = pj_grp_lock_create(pool, NULL, &listener->grp_lock);
if (status != PJ_SUCCESS)
@@ -421,11 +438,17 @@ PJ_DEF(pj_status_t) pjsip_tcp_transport_start3(
pj_bzero(&listener_cb, sizeof(listener_cb));
listener_cb.on_accept_complete = &on_accept_complete;
+
+#if !(defined(PJSIP_TCP_TRANSPORT_DONT_CREATE_LISTENER) && \
+ PJSIP_TCP_TRANSPORT_DONT_CREATE_LISTENER != 0)
+
status = pj_activesock_create(pool, sock, pj_SOCK_STREAM(), &asock_cfg,
pjsip_endpt_get_ioqueue(endpt),
&listener_cb, listener,
&listener->asock);
+#endif
+
/* Register to transport manager */
listener->endpt = endpt;
listener->tpmgr = pjsip_endpt_get_tpmgr(endpt);
@@ -439,16 +462,28 @@ PJ_DEF(pj_status_t) pjsip_tcp_transport_start3(
goto on_error;
}
+#if !(defined(PJSIP_TCP_TRANSPORT_DONT_CREATE_LISTENER) && \
+ PJSIP_TCP_TRANSPORT_DONT_CREATE_LISTENER != 0)
+
/* Start pending accept() operations */
status = pj_activesock_start_accept(listener->asock, pool);
if (status != PJ_SUCCESS)
goto on_error;
+
+ has_listener = PJ_TRUE;
- PJ_LOG(4,(listener->factory.obj_name,
- "SIP TCP listener ready for incoming connections at %.*s:%d",
- (int)listener->factory.addr_name.host.slen,
- listener->factory.addr_name.host.ptr,
- listener->factory.addr_name.port));
+#endif
+
+ if (has_listener) {
+ PJ_LOG(4,(listener->factory.obj_name,
+ "SIP TCP listener ready for incoming connections at %.*s:%d",
+ (int)listener->factory.addr_name.host.slen,
+ listener->factory.addr_name.host.ptr,
+ listener->factory.addr_name.port));
+ } else {
+ PJ_LOG(4,(listener->factory.obj_name, "SIP TCP is ready "
+ "(client only)"));
+ }
/* Return the pointer to user */
if (p_factory) *p_factory = &listener->factory;
@@ -518,7 +553,7 @@ static void lis_on_destroy(void *arg)
if (listener->factory.pool) {
pj_pool_t *pool = listener->factory.pool;
- PJ_LOG(4,(listener->factory.obj_name, "SIP TCP listener destroyed"));
+ PJ_LOG(4,(listener->factory.obj_name, "SIP TCP transport destroyed"));
listener->factory.pool = NULL;
pj_pool_release(pool);
diff --git a/pjsip/src/pjsip/sip_transport_tls.c b/pjsip/src/pjsip/sip_transport_tls.c
index 6302a4d4..ac7ac930 100644
--- a/pjsip/src/pjsip/sip_transport_tls.c
+++ b/pjsip/src/pjsip/sip_transport_tls.c
@@ -339,7 +339,7 @@ PJ_DEF(pj_status_t) pjsip_tls_transport_start2( pjsip_endpoint *endpt,
}
}
- pool = pjsip_endpt_create_pool(endpt, "tlslis", POOL_LIS_INIT,
+ pool = pjsip_endpt_create_pool(endpt, "tlstp", POOL_LIS_INIT,
POOL_LIS_INC);
PJ_ASSERT_RETURN(pool, PJ_ENOMEM);
@@ -354,7 +354,7 @@ PJ_DEF(pj_status_t) pjsip_tls_transport_start2( pjsip_endpoint *endpt,
listener->factory.flag =
pjsip_transport_get_flag_from_type(listener->factory.type);
- pj_ansi_strcpy(listener->factory.obj_name, "tlslis");
+ pj_ansi_strcpy(listener->factory.obj_name, "tlstp");
if (is_ipv6)
pj_ansi_strcat(listener->factory.obj_name, "6");
@@ -419,6 +419,9 @@ PJ_DEF(pj_status_t) pjsip_tls_transport_start2( pjsip_endpoint *endpt,
pj_grp_lock_add_handler(listener->grp_lock, pool, listener,
&lis_on_destroy);
+#if !(defined(PJSIP_TLS_TRANSPORT_DONT_CREATE_LISTENER) && \
+ PJSIP_TLS_TRANSPORT_DONT_CREATE_LISTENER != 0)
+
ssock_param.grp_lock = listener->grp_lock;
/* Create SSL socket */
@@ -426,6 +429,8 @@ PJ_DEF(pj_status_t) pjsip_tls_transport_start2( pjsip_endpoint *endpt,
if (status != PJ_SUCCESS)
goto on_error;
+#endif
+
/* Bind address may be different than factory.local_addr because
* factory.local_addr will be resolved below.
*/
@@ -439,6 +444,9 @@ PJ_DEF(pj_status_t) pjsip_tls_transport_start2( pjsip_endpoint *endpt,
pj_sockaddr_init(af, &listener->bound_addr, NULL, 0);
}
+#if !(defined(PJSIP_TLS_TRANSPORT_DONT_CREATE_LISTENER) && \
+ PJSIP_TLS_TRANSPORT_DONT_CREATE_LISTENER != 0)
+
/* Check if certificate/CA list for SSL socket is set */
if (listener->tls_setting.cert_file.slen ||
listener->tls_setting.ca_list_file.slen ||
@@ -480,6 +488,8 @@ PJ_DEF(pj_status_t) pjsip_tls_transport_start2( pjsip_endpoint *endpt,
goto on_error;
}
+#endif
+
/* If published host/IP is specified, then use that address as the
* listener advertised address.
*/
@@ -518,7 +528,7 @@ PJ_DEF(pj_status_t) pjsip_tls_transport_start2( pjsip_endpoint *endpt,
pj_ansi_snprintf(listener->factory.obj_name,
sizeof(listener->factory.obj_name),
- "tlslis:%d", listener->factory.addr_name.port);
+ "tlstp:%d", listener->factory.addr_name.port);
/* Register to transport manager */
listener->endpt = endpt;
@@ -569,7 +579,7 @@ static void lis_on_destroy(void *arg)
if (listener->factory.pool) {
pj_pool_t *pool = listener->factory.pool;
- PJ_LOG(4,(listener->factory.obj_name, "SIP TLS listener destroyed"));
+ PJ_LOG(4,(listener->factory.obj_name, "SIP TLS transport destroyed"));
listener->factory.pool = NULL;
pj_pool_release(pool);