[sr-dev] git:master:dc6d44b6: core: execute event_route[core:worker-one-init] for sctp or tcp

Daniel-Constantin Mierla miconda at gmail.com
Fri Mar 12 18:18:10 CET 2021


Module: kamailio
Branch: master
Commit: dc6d44b603b126c43757a53560d692e5f5f147a7
URL: https://github.com/kamailio/kamailio/commit/dc6d44b603b126c43757a53560d692e5f5f147a7

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: 2021-03-12T18:15:34+01:00

core: execute event_route[core:worker-one-init] for sctp or tcp

- if no udp worker is started, the event route is executed by next
available transport, in the order: sctp, tcp (or tls)

---

Modified: src/core/tcp_init.h
Modified: src/core/tcp_main.c
Modified: src/main.c

---

Diff:  https://github.com/kamailio/kamailio/commit/dc6d44b603b126c43757a53560d692e5f5f147a7.diff
Patch: https://github.com/kamailio/kamailio/commit/dc6d44b603b126c43757a53560d692e5f5f147a7.patch

---

diff --git a/src/core/tcp_init.h b/src/core/tcp_init.h
index ddabbc5fce..70a193a0e2 100644
--- a/src/core/tcp_init.h
+++ b/src/core/tcp_init.h
@@ -13,8 +13,8 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License 
- * along with this program; if not, write to the Free Software 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
@@ -54,7 +54,7 @@ struct tcp_child{
 int init_tcp(void);
 void destroy_tcp(void);
 int tcp_init(struct socket_info* sock_info);
-int tcp_init_children(void);
+int tcp_init_children(int *woneinit);
 void tcp_main_loop(void);
 void tcp_receive_loop(int unix_sock);
 int tcp_fix_child_sockets(int* fd);
diff --git a/src/core/tcp_main.c b/src/core/tcp_main.c
index aecf3a88c1..1fda94ec27 100644
--- a/src/core/tcp_main.c
+++ b/src/core/tcp_main.c
@@ -5034,16 +5034,16 @@ int tcp_fix_child_sockets(int* fd)
 
 
 /* starts the tcp processes */
-int tcp_init_children()
+int tcp_init_children(int *woneinit)
 {
 	int r, i;
 	int reader_fd_1; /* for comm. with the tcp children read  */
 	pid_t pid;
 	char si_desc[MAX_PT_DESC];
 	struct socket_info *si;
-	
+
 	/* estimate max fd. no:
-	 * 1 tcp send unix socket/all_proc, 
+	 * 1 tcp send unix socket/all_proc,
 	 *  + 1 udp sock/udp proc + 1 tcp_child sock/tcp child*
 	 *  + no_listen_tcp */
 	for(r=0, si=tcp_listen; si; si=si->next, r++);
@@ -5051,12 +5051,12 @@ int tcp_init_children()
 	if (! tls_disable)
 		for (si=tls_listen; si; si=si->next, r++);
 #endif
-	
+
 	register_fds(r+tcp_max_connections+get_max_procs()-1 /* tcp main */);
 #if 0
 	tcp_max_fd_no=get_max_procs()*2 +r-1 /* timer */ +3; /* stdin/out/err*/
 	/* max connections can be temporarily exceeded with estimated_process_count
-	 * - tcp_main (tcpconn_connect called simultaneously in all all the 
+	 * - tcp_main (tcpconn_connect called simultaneously in all all the
 	 *  processes) */
 	tcp_max_fd_no+=tcp_max_connections+get_max_procs()-1 /* tcp main */;
 #endif
@@ -5095,7 +5095,7 @@ int tcp_init_children()
 
 	/* create the tcp sock_info structures */
 	/* copy the sockets --moved to main_loop*/
-	
+
 	/* fork children & create the socket pairs*/
 	for(r=0; r<tcp_children_no; r++){
 		child_rank++;
@@ -5108,10 +5108,16 @@ int tcp_init_children()
 			goto error;
 		}else if (pid>0){
 			/* parent */
+			*woneinit = 1;
 		}else{
 			/* child */
 			bind_address=0; /* force a SEGFAULT if someone uses a non-init.
 							   bind address on tcp */
+			if(*woneinit==0) {
+				if(run_child_one_init_route()<0)
+					goto error;
+			}
+
 			tcp_receive_loop(reader_fd_1);
 		}
 	}
diff --git a/src/main.c b/src/main.c
index 6f8b354d22..e9d66ed449 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1720,8 +1720,14 @@ int main_loop(void)
 						/* child */
 						bind_address=si; /* shortcut */
 
+						if(woneinit==0) {
+							if(run_child_one_init_route()<0)
+								goto error;
+						}
+
 						return sctp_core_rcv_loop();
 					}
+					woneinit = 1;
 				}
 			/*parent*/
 			/*close(sctp_sock)*/; /*if closed=>sendto invalid fd errors?*/
@@ -1777,7 +1783,7 @@ int main_loop(void)
 #ifdef USE_TCP
 		if (!tcp_disable){
 				/* start tcp  & tls receivers */
-			if (tcp_init_children()<0) goto error;
+			if (tcp_init_children(&woneinit)<0) goto error;
 				/* start tcp+tls main attendant proc */
 			pid = fork_process(PROC_TCP_MAIN, "tcp main process", 0);
 			if (pid<0){




More information about the sr-dev mailing list