pespin has submitted this change. ( 
https://gerrit.osmocom.org/c/libosmo-netif/+/41434?usp=email )

Change subject: stream: Support overwriting tx_queue_max_length per srv conn
......................................................................

stream: Support overwriting tx_queue_max_length per srv conn

This allows setting different tx_queue_max_length per server connection.
This is useful where known clients (eg. matching specific addresses) may
have totally different link properties among them towards the server.

Related: SYS#7693
Change-Id: Ibc68612bd8dee4f9b8031ce2c3f5c7ff6bb639e3
---
M TODO-RELEASE
M include/osmocom/netif/stream.h
M src/stream_srv.c
3 files changed, 23 insertions(+), 2 deletions(-)

Approvals:
  fixeria: Looks good to me, approved
  Jenkins Builder: Verified
  osmith: Looks good to me, but someone else must approve




diff --git a/TODO-RELEASE b/TODO-RELEASE
index 6340cdf..87e1b95 100644
--- a/TODO-RELEASE
+++ b/TODO-RELEASE
@@ -9,3 +9,4 @@
 #library       what                    description / commit summary line
 stream    add       OSMO_STREAM_{CLI,SRV,SRV_LINK}_TCP_SOCKOPT_KEEP*, 
osmo_stream_srv_set_param()
 stream    add       OSMO_STREAM_{CLI,SRV,SRV_LINK}_TCP_SOCKOPT_USER_TIMEOUT
+stream    add       osmo_stream_srv_set_tx_queue_max_length()
diff --git a/include/osmocom/netif/stream.h b/include/osmocom/netif/stream.h
index 8c3fad5..b04ebb9 100644
--- a/include/osmocom/netif/stream.h
+++ b/include/osmocom/netif/stream.h
@@ -137,6 +137,7 @@
 void osmo_stream_srv_set_read_cb(struct osmo_stream_srv *conn, 
osmo_stream_srv_read_cb2_t read_cb);
 void osmo_stream_srv_set_closed_cb(struct osmo_stream_srv *conn, 
osmo_stream_srv_closed_cb_t close_cb);
 void *osmo_stream_srv_get_data(struct osmo_stream_srv *conn);
+int osmo_stream_srv_set_tx_queue_max_length(struct osmo_stream_srv *conn, 
unsigned int size);
 struct osmo_stream_srv_link *osmo_stream_srv_get_master(struct osmo_stream_srv 
*conn);
 const char *osmo_stream_srv_get_sockname(const struct osmo_stream_srv *conn);
 struct osmo_fd *osmo_stream_srv_get_ofd(struct osmo_stream_srv *srv);
diff --git a/src/stream_srv.c b/src/stream_srv.c
index cc32dc7..695a46f 100644
--- a/src/stream_srv.c
+++ b/src/stream_srv.c
@@ -743,6 +743,7 @@
        };
        struct llist_head               tx_queue; /* osmo_ofd mode (only): 
Queue of msgbs */
        unsigned int                    tx_queue_count; /* osmo_ofd mode 
(only): Current amount of msgbs queued */
+       unsigned int                    tx_queue_max_length; /* Max amount of 
msgbs which can be enqueued */
        osmo_stream_srv_closed_cb_t     closed_cb;
        osmo_stream_srv_read_cb_t       read_cb;
        osmo_stream_srv_read_cb2_t      iofd_read_cb;
@@ -996,6 +997,8 @@

        osmo_sock_get_name_buf(conn->sockname, sizeof(conn->sockname), fd);

+       conn->tx_queue_max_length = conn->srv->tx_queue_max_length;
+
        if (osmo_fd_register(&conn->ofd) < 0) {
                LOGSSRV(conn, LOGL_ERROR, "could not register FD\n");
                talloc_free(conn);
@@ -1049,7 +1052,8 @@
                return NULL;
        }

-       osmo_iofd_set_txqueue_max_length(conn->iofd, 
conn->srv->tx_queue_max_length);
+       conn->tx_queue_max_length = conn->srv->tx_queue_max_length;
+       osmo_iofd_set_txqueue_max_length(conn->iofd, conn->tx_queue_max_length);
        if (conn->srv->msgb_alloc.set_by_user)
                osmo_iofd_set_alloc_info(conn->iofd, 
conn->srv->msgb_alloc.size, conn->srv->msgb_alloc.headroom);

@@ -1233,6 +1237,21 @@
        return conn->data;
 }

+/*! Set the maximum length queue of the stream server connection.
+ *  \param[in] conn Stream Server to modify
+ *  \param[in] size maximum amount of msgbs which can be queued in the 
internal tx queue.
+ *  \returns 0 on success, negative on error.
+ *
+ *  The default queue size of a osmo_stream_srv is inherited during creation 
time from
+ *  osmo_stream_srv_link. */
+int osmo_stream_srv_set_tx_queue_max_length(struct osmo_stream_srv *conn, 
unsigned int size)
+{
+       conn->tx_queue_max_length = size;
+       if (conn->mode == OSMO_STREAM_MODE_OSMO_IO && conn->iofd)
+               osmo_iofd_set_txqueue_max_length(conn->iofd, 
conn->tx_queue_max_length);
+       return 0;
+}
+
 /*! Retrieve the stream server socket description.
  *  The returned name is stored in a static buffer; it is hence not re-entrant 
or thread-safe!
  *  \param[in] conn Stream Server to examine
@@ -1341,7 +1360,7 @@

        switch (conn->mode) {
        case OSMO_STREAM_MODE_OSMO_FD:
-               if (conn->tx_queue_count >= conn->srv->tx_queue_max_length) {
+               if (conn->tx_queue_count >= conn->tx_queue_max_length) {
                        LOGSSRV(conn, LOGL_ERROR, "send: tx queue full, 
dropping msg!\n");
                        msgb_free(msg);
                        return;

--
To view, visit https://gerrit.osmocom.org/c/libosmo-netif/+/41434?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings?usp=email

Gerrit-MessageType: merged
Gerrit-Project: libosmo-netif
Gerrit-Branch: master
Gerrit-Change-Id: Ibc68612bd8dee4f9b8031ce2c3f5c7ff6bb639e3
Gerrit-Change-Number: 41434
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: daniel <[email protected]>
Gerrit-Reviewer: fixeria <[email protected]>
Gerrit-Reviewer: osmith <[email protected]>
Gerrit-Reviewer: pespin <[email protected]>

Reply via email to