[asterisk-commits] dvossel: branch dvossel/sip_nonblocking_tcp_client r220670 - in /team/dvossel...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Sep 28 09:55:45 CDT 2009


Author: dvossel
Date: Mon Sep 28 09:55:41 2009
New Revision: 220670

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=220670
Log:
moved tcp connect() to tcp helper thread


Modified:
    team/dvossel/sip_nonblocking_tcp_client/channels/chan_sip.c
    team/dvossel/sip_nonblocking_tcp_client/main/tcptls.c

Modified: team/dvossel/sip_nonblocking_tcp_client/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/sip_nonblocking_tcp_client/channels/chan_sip.c?view=diff&rev=220670&r1=220669&r2=220670
==============================================================================
--- team/dvossel/sip_nonblocking_tcp_client/channels/chan_sip.c (original)
+++ team/dvossel/sip_nonblocking_tcp_client/channels/chan_sip.c Mon Sep 28 09:55:41 2009
@@ -2113,7 +2113,7 @@
 /*! \brief Definition of a thread that handles a socket */
 struct sip_threadinfo {
 	int stop;
-	int alert_pipe[2];
+	int alert_pipe[2]; /*! Used to alert tcptls thread when packet is ready to write */
 	pthread_t threadid;
 	struct ast_tcptls_session_instance *tcptls_session;
 	enum sip_transport type;	/*!< We keep a copy of the type here so we can display it in the connection list */
@@ -2922,6 +2922,7 @@
 		ast_free((char *) args->name);
 	}
 }
+
 static void sip_threadinfo_destructor(void *obj)
 {
 	struct sip_threadinfo *th = obj;
@@ -2943,6 +2944,7 @@
 	}
 }
 
+/*! brief\ creates a sip_threadinfo object and links it into the threadl table. */
 static struct sip_threadinfo *sip_threadinfo_create(struct ast_tcptls_session_instance *tcptls_session, int transport)
 {
 	struct sip_threadinfo *th;
@@ -2965,6 +2967,7 @@
 	return th;
 }
 
+/*! brief\ used to indicate to a tcptls thread that data is ready to be written */
 static int sip_tcptls_write(struct ast_tcptls_session_instance *tcptls_session, const void *buf, size_t len)
 {
 	int res = len;
@@ -3007,6 +3010,7 @@
 		ast_log(LOG_ERROR, "write() to alert pipe failed: %s\n", strerror(errno));
 		AST_LIST_REMOVE_HEAD(&th->packet_q, entry);
 		ao2_t_ref(packet, -1, "could not write to alert pipe, remove packet");
+		packet = NULL;
 		res = XMIT_ERROR;
 	}
 
@@ -22871,8 +22875,7 @@
 	 * 1. We need to check to see if a connectin thread exists
 	 *    for this address, if so use that.
 	 * 2. If a thread does not exist for this address, but the tcptls_session
-	 *    exists on the socket, the connect must have been closed. Don't attempt
-	 *    to reopen, dialog is dead.
+	 *    exists on the socket, the connection was closed.
 	 * 3. If no tcptls_session thread exists for the address, and no tcptls_session
 	 *    already exists on the socket, create a new one and launch a new thread.
 	 */
@@ -22889,11 +22892,7 @@
 		return s->fd;
 	/* 2.  Thread not found, if tcptls_session already exists, it once had a thread and is now terminated */
 	} else if (s->tcptls_session) {
-		/* at this point, if the tcptls_session exists, but no thread was found
-		 * for it, that means a thread existed but has been closed. Currently no
-		 * attempt is made to reconnect, XXX whether reconnection is necessary
-		 * needs to be investigated */
-		return -1;
+		return s->fd; /* XXX whether reconnection is ever necessary here needs to be investigated further */
 	}
 
 	/* 3.  Create a new TCP/TLS client connection */
@@ -22907,8 +22906,7 @@
 	ca->remote_address = *(sip_real_dst(p));
 	/* if type is TLS, we need to create a tls cfg for this session arg */
 	if (s->type == SIP_TRANSPORT_TLS) {
-		ca->tls_cfg = ast_calloc(1, sizeof(*ca->tls_cfg));
-		if (!ca->tls_cfg) {
+		if (!(ca->tls_cfg = ast_calloc(1, sizeof(*ca->tls_cfg)))) {
 			goto create_tcptls_session_fail;
 		}
 		memcpy(ca->tls_cfg, &default_tls_cfg, sizeof(*ca->tls_cfg));
@@ -22933,7 +22931,7 @@
 		goto create_tcptls_session_fail;
 	}
 
-	/* Give the new thread a reference */
+	/* Give the new thread a reference to the tcptls_session */
 	ao2_ref(s->tcptls_session, +1);
 
 	if (ast_pthread_create_background(&ca->master, NULL, sip_tcp_worker_fn, s->tcptls_session)) {

Modified: team/dvossel/sip_nonblocking_tcp_client/main/tcptls.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/sip_nonblocking_tcp_client/main/tcptls.c?view=diff&rev=220670&r1=220669&r2=220670
==============================================================================
--- team/dvossel/sip_nonblocking_tcp_client/main/tcptls.c (original)
+++ team/dvossel/sip_nonblocking_tcp_client/main/tcptls.c Mon Sep 28 09:55:41 2009
@@ -363,12 +363,43 @@
  */
 struct ast_tcptls_session_instance *ast_tcptls_client_start(struct ast_tcptls_session_instance *tcptls_session)
 {
+	struct ast_tcptls_session_args *desc;
+	int flags;
+
+	if (!(desc = tcptls_session->parent)) {
+		goto client_start_error;
+	}
+
+	if (connect(desc->accept_fd, (const struct sockaddr *) &desc->remote_address, sizeof(desc->remote_address))) {
+		ast_log(LOG_ERROR, "Unable to connect %s to %s:%d: %s\n",
+			desc->name,
+			ast_inet_ntoa(desc->remote_address.sin_addr), ntohs(desc->remote_address.sin_port),
+			strerror(errno));
+		goto client_start_error;
+	}
+
+	flags = fcntl(desc->accept_fd, F_GETFL);
+	fcntl(desc->accept_fd, F_SETFL, flags & ~O_NONBLOCK);
+
+	if (desc->tls_cfg) {
+		desc->tls_cfg->enabled = 1;
+		__ssl_setup(desc->tls_cfg, 1);
+	}
+
 	return handle_tcptls_connection(tcptls_session);
+
+client_start_error:
+	close(desc->accept_fd);
+	desc->accept_fd = -1;
+	if (tcptls_session) {
+		ao2_ref(tcptls_session, -1);
+	}
+	return NULL;
+
 }
 
 struct ast_tcptls_session_instance *ast_tcptls_client_create(struct ast_tcptls_session_args *desc)
 {
-	int flags;
 	int x = 1;
 	struct ast_tcptls_session_instance *tcptls_session = NULL;
 
@@ -403,33 +434,15 @@
 		}
 	}
 
-	if (connect(desc->accept_fd, (const struct sockaddr *) &desc->remote_address, sizeof(desc->remote_address))) {
-		ast_log(LOG_ERROR, "Unable to connect %s to %s:%d: %s\n",
-			desc->name,
-			ast_inet_ntoa(desc->remote_address.sin_addr), ntohs(desc->remote_address.sin_port),
-			strerror(errno));
-		goto error;
-	}
-
 	if (!(tcptls_session = ao2_alloc(sizeof(*tcptls_session), session_instance_destructor)))
 		goto error;
 
 	ast_mutex_init(&tcptls_session->lock);
-
-	flags = fcntl(desc->accept_fd, F_GETFL);
-	fcntl(desc->accept_fd, F_SETFL, flags & ~O_NONBLOCK);
-
+	tcptls_session->client = 1;
 	tcptls_session->fd = desc->accept_fd;
 	tcptls_session->parent = desc;
 	tcptls_session->parent->worker_fn = NULL;
 	memcpy(&tcptls_session->remote_address, &desc->remote_address, sizeof(tcptls_session->remote_address));
-
-	tcptls_session->client = 1;
-
-	if (desc->tls_cfg) {
-		desc->tls_cfg->enabled = 1;
-		__ssl_setup(desc->tls_cfg, 1);
-	}
 
 	return tcptls_session;
 




More information about the asterisk-commits mailing list