[PATCH 2/4] ipaccess: Use keep alive for all connections

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/OpenBSC@lists.osmocom.org/.

Jacob Erlbeck jerlbeck at sysmocom.de
Thu Jan 9 13:30:56 UTC 2014


Keep alive has only been used for OML so far.

This patch refactors the socket configuration into an own function
and uses it for RSL, too.

Ticket: OW#1060
Sponsored-by: On-Waves ehf
---
 src/input/ipaccess.c |   73 +++++++++++++++++++++++++++++++-------------------
 1 file changed, 45 insertions(+), 28 deletions(-)

diff --git a/src/input/ipaccess.c b/src/input/ipaccess.c
index 8f9865e..6b9d93e 100644
--- a/src/input/ipaccess.c
+++ b/src/input/ipaccess.c
@@ -610,12 +610,54 @@ struct e1inp_driver ipaccess_driver = {
 	.default_delay = 0,
 };
 
+static void update_fd_settings(struct e1inp_line *line, int fd)
+{
+	int ret;
+	int val;
+
+	if (DEFAULT_TCP_KEEPALIVE_RETRY_COUNT) {
+		/* Enable TCP keepalive to find out if the connection is gone */
+		val = 1;
+		ret = setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val));
+		if (ret < 0)
+			LOGP(DLINP, LOGL_NOTICE, "Failed to set keepalive: %s\n",
+			     strerror(errno));
+		else
+			LOGP(DLINP, LOGL_NOTICE, "Keepalive is set: %i\n", ret);
+
+#if defined(TCP_KEEPIDLE) && defined(TCP_KEEPINTVL) && defined(TCP_KEEPCNT)
+		/* The following options are not portable! */
+		val = DEFAULT_TCP_KEEPALIVE_IDLE_TIMEOUT;
+		ret = setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE,
+				 &val, sizeof(val));
+		if (ret < 0)
+			LOGP(DLINP, LOGL_NOTICE,
+			     "Failed to set keepalive idle time: %s\n",
+			     strerror(errno));
+		val = DEFAULT_TCP_KEEPALIVE_INTERVAL;
+		ret = setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL,
+				 &val, sizeof(val));
+		if (ret < 0)
+			LOGP(DLINP, LOGL_NOTICE,
+			     "Failed to set keepalive interval: %s\n",
+			     strerror(errno));
+		val = DEFAULT_TCP_KEEPALIVE_RETRY_COUNT;
+		ret = setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT,
+				 &val, sizeof(val));
+		if (ret < 0)
+			LOGP(DLINP, LOGL_NOTICE,
+			     "Failed to set keepalive count: %s\n",
+			     strerror(errno));
+	}
+#endif
+}
+
 /* callback of the OML listening filedescriptor */
 static int ipaccess_bsc_oml_cb(struct ipa_server_link *link, int fd)
 {
 	int ret;
 	int idx = 0;
-	int i, val;
+	int i;
 	struct e1inp_line *line;
 	struct e1inp_ts *e1i_ts;
 	struct osmo_fd *bfd;
@@ -648,33 +690,7 @@ static int ipaccess_bsc_oml_cb(struct ipa_server_link *link, int fd)
 		goto err_line;
 	}
 
-	/* Enable TCP keepalive to find out if the connection is gone */
-	val = 1;
-	ret = setsockopt(bfd->fd, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val));
-	if (ret < 0)
-		LOGP(DLINP, LOGL_NOTICE, "Failed to set keepalive: %s\n",
-		     strerror(errno));
-	else
-		LOGP(DLINP, LOGL_NOTICE, "Keepalive is set: %i\n", ret);
-
-#if defined(TCP_KEEPIDLE) && defined(TCP_KEEPINTVL) && defined(TCP_KEEPCNT)
-	/* The following options are not portable! */
-	val = DEFAULT_TCP_KEEPALIVE_IDLE_TIMEOUT;
-	ret = setsockopt(bfd->fd, IPPROTO_TCP, TCP_KEEPIDLE, &val, sizeof(val));
-	if (ret < 0)
-		LOGP(DLINP, LOGL_NOTICE, "Failed to set keepalive idle time: %s\n",
-		     strerror(errno));
-	val = DEFAULT_TCP_KEEPALIVE_INTERVAL;
-	ret = setsockopt(bfd->fd, IPPROTO_TCP, TCP_KEEPINTVL, &val, sizeof(val));
-	if (ret < 0)
-		LOGP(DLINP, LOGL_NOTICE, "Failed to set keepalive interval: %s\n",
-		     strerror(errno));
-	val = DEFAULT_TCP_KEEPALIVE_RETRY_COUNT;
-	ret = setsockopt(bfd->fd, IPPROTO_TCP, TCP_KEEPCNT, &val, sizeof(val));
-	if (ret < 0)
-		LOGP(DLINP, LOGL_NOTICE, "Failed to set keepalive count: %s\n",
-		     strerror(errno));
-#endif
+	update_fd_settings(line, bfd->fd);
 
 	/* Request ID. FIXME: request LOCATION, HW/SW VErsion, Unit Name, Serno */
 	ret = ipaccess_send_id_req(bfd->fd);
@@ -736,6 +752,7 @@ static int ipaccess_bsc_rsl_cb(struct ipa_server_link *link, int fd)
 			strerror(errno));
 		goto err_socket;
 	}
+	update_fd_settings(line, bfd->fd);
 	return ret;
 
 err_socket:
-- 
1.7.9.5





More information about the OpenBSC mailing list