aboutsummaryrefslogtreecommitdiffstats
path: root/src/gsup_server.c
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2020-10-12 16:39:38 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2020-10-12 16:39:58 +0200
commit23ac586522c3f6e4abc89dd29ea449d6f2445abc (patch)
treecfa1b4b9912fb818f463f4a64ae37e784cf5b622 /src/gsup_server.c
parentde50b201167b717e69053c57c42ea26c35cfe5db (diff)
Set TCP NODELAY sockopt to GSUP cli and srv connections
GSUP is message based on top of IPA, and hence TCP. We don't want to have Nagle algorithm enabled, since we are interested in having messages sent as quickly as possible and there's no need for lower layers to wait for more data (because we send all the message data at once). Related: OS#4499 Change-Id: I4653b95ef0d4e1184f81f28408e9eb5d665206ec
Diffstat (limited to 'src/gsup_server.c')
-rw-r--r--src/gsup_server.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/gsup_server.c b/src/gsup_server.c
index 830a5a7..756473a 100644
--- a/src/gsup_server.c
+++ b/src/gsup_server.c
@@ -18,6 +18,8 @@
*/
#include <errno.h>
+#include <netinet/tcp.h>
+#include <netinet/in.h>
#include <osmocom/core/msgb.h>
#include <osmocom/core/logging.h>
@@ -352,6 +354,19 @@ void osmo_gsup_server_add_conn(struct llist_head *clients,
llist_add(&conn->list, &prev_conn->list);
}
+static void update_fd_settings(int fd)
+{
+ int ret;
+ int val;
+
+ /*TODO: Set keepalive settings here. See OS#4312 */
+
+ val = 1;
+ ret = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val));
+ if (ret < 0)
+ LOGP(DLGSUP, LOGL_ERROR, "Failed to set TCP_NODELAY: %s\n", strerror(errno));
+}
+
/* a client has connected to the server socket and we have accept()ed it */
static int osmo_gsup_server_accept_cb(struct ipa_server_link *link, int fd)
{
@@ -376,6 +391,8 @@ static int osmo_gsup_server_accept_cb(struct ipa_server_link *link, int fd)
LOGP(DLGSUP, LOGL_INFO, "New GSUP client %s:%d (IND=%u)\n",
conn->conn->addr, conn->conn->port, conn->auc_3g_ind);
+ update_fd_settings(fd);
+
/* request the identity of the client */
rc = ipa_ccm_send_id_req(fd);
if (rc < 0)