Change in libosmocore[master]: gprs_ns2: fr: implement a write queue

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/gerrit-log@lists.osmocom.org/.

lynxis lazus gerrit-no-reply at lists.osmocom.org
Thu Dec 17 02:11:19 UTC 2020


lynxis lazus has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/21751 )


Change subject: gprs_ns2: fr: implement a write queue
......................................................................

gprs_ns2: fr: implement a write queue

Change-Id: Id6eba04d5fb744f791b333c168729bbbd28cabd9
---
M src/gb/gprs_ns2_fr.c
1 file changed, 20 insertions(+), 28 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/51/21751/1

diff --git a/src/gb/gprs_ns2_fr.c b/src/gb/gprs_ns2_fr.c
index fc6f166..6aa687c 100644
--- a/src/gb/gprs_ns2_fr.c
+++ b/src/gb/gprs_ns2_fr.c
@@ -50,6 +50,7 @@
 #include <osmocom/core/select.h>
 #include <osmocom/core/socket.h>
 #include <osmocom/core/talloc.h>
+#include <osmocom/core/write_queue.h>
 #include <osmocom/gprs/gprs_ns2.h>
 
 #ifdef ENABLE_LIBMNL
@@ -83,9 +84,9 @@
 };
 
 struct priv_bind {
-	struct osmo_fd fd;
 	char netif[IF_NAMESIZE];
 	struct osmo_fr_link *link;
+	struct osmo_wqueue wqueue;
 	int ifindex;
 	bool if_running;
 };
@@ -142,7 +143,7 @@
 	OSMO_ASSERT(llist_empty(&bind->nsvc));
 
 	osmo_fr_link_free(priv->link);
-	osmo_fd_close(&priv->fd);
+	osmo_fd_close(&priv->wqueue.bfd);
 	talloc_free(priv);
 }
 
@@ -238,22 +239,9 @@
 	return rc;
 }
 
-static int handle_netif_write(struct osmo_fd *bfd)
+static int handle_netif_write(struct osmo_fd *ofd, struct msgb *msg)
 {
-	/* FIXME */
-	return -EIO;
-}
-
-static int fr_fd_cb(struct osmo_fd *bfd, unsigned int what)
-{
-	int rc = 0;
-
-	if (what & OSMO_FD_READ)
-		rc = handle_netif_read(bfd);
-	if (what & OSMO_FD_WRITE)
-		rc = handle_netif_write(bfd);
-
-	return rc;
+	return write(ofd->fd, msgb_data(msg), msgb_length(msg));
 }
 
 /*! determine if given bind is for FR-GRE encapsulation. */
@@ -276,13 +264,15 @@
 {
 	struct gprs_ns2_vc_bind *bind = data;
 	struct priv_bind *priv = bind->priv;
-	int rc;
 
-	/* FIXME half writes */
-	rc = write(priv->fd.fd, msg->data, msg->len);
-	msgb_free(msg);
+	if (osmo_wqueue_enqueue(&priv->wqueue, msg)) {
+		LOGP(DLNS, LOGL_ERROR, "frame relay %s: failed to enqueue message\n",
+		     priv->netif);
+		msgb_free(msg);
+		return -EINVAL;
+	}
 
-	return rc;
+	return 0;
 }
 
 static int devname2ifindex(const char *ifname)
@@ -492,8 +482,6 @@
 		goto err_name;
 	}
 
-	priv->fd.cb = fr_fd_cb;
-	priv->fd.data = bind;
 	if (strlen(netif) > IF_NAMESIZE) {
 		rc = -EINVAL;
 		goto err_priv;
@@ -520,12 +508,16 @@
 		goto err_fr;
 	}
 
-	priv->fd.fd = rc = open_socket(priv->ifindex);
+	osmo_wqueue_init(&priv->wqueue, 10);
+	priv->wqueue.write_cb = handle_netif_write;
+	priv->wqueue.read_cb = handle_netif_read;
+	priv->wqueue.bfd.data = bind;
+	priv->wqueue.bfd.fd = rc = open_socket(priv->ifindex);
 	if (rc < 0)
 		goto err_fr;
 
-	priv->fd.when = OSMO_FD_READ;
-	rc = osmo_fd_register(&priv->fd);
+	priv->wqueue.bfd.when = OSMO_FD_READ;
+	rc = osmo_fd_register(&priv->wqueue.bfd);
 	if (rc < 0)
 		goto err_fd;
 
@@ -545,7 +537,7 @@
 	return rc;
 
 err_fd:
-	close(priv->fd.fd);
+	close(priv->wqueue.bfd.fd);
 err_fr:
 	osmo_fr_link_free(fr_link);
 err_priv:

-- 
To view, visit https://gerrit.osmocom.org/c/libosmocore/+/21751
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: Id6eba04d5fb744f791b333c168729bbbd28cabd9
Gerrit-Change-Number: 21751
Gerrit-PatchSet: 1
Gerrit-Owner: lynxis lazus <lynxis at fe80.eu>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20201217/e21e1588/attachment.htm>


More information about the gerrit-log mailing list