Change in osmocom-bb[master]: trxcon/sched_prim.c: properly handle both TCH/H and FACCH/H prims

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/.

Harald Welte gerrit-no-reply at lists.osmocom.org
Wed Aug 15 07:57:57 UTC 2018


Harald Welte has submitted this change and it was merged. ( https://gerrit.osmocom.org/10455 )

Change subject: trxcon/sched_prim.c: properly handle both TCH/H and FACCH/H prims
......................................................................

trxcon/sched_prim.c: properly handle both TCH/H and FACCH/H prims

Initially it was assumed that FACCH prioritization should be done
in the same way for both TCH/F and TCH/H. Moreover, it was not
possible to confirm this, because TCH/H was (and still) not
implemented yet. But according to the specs:

  - unlike FACCH/F, FACCH/H transmissions shall be aligned
    within a multiframe, i.e. can only be initiated on
    particular frame numbers (see GSM 05.02, clause 7);

  - unlike FACCH/F, a FACCH/H frame steals two TCH/F frames;

so the TCH/H (including FACCH/H) primitives should be handled
separately from the TCH/F (including FACCH/F) primitives.

Change-Id: I9b59f60e1cbac8fb8fd557b6c67b5e376c0a6bbb
---
M src/host/trxcon/sched_prim.c
M src/host/trxcon/sched_trx.c
M src/host/trxcon/sched_trx.h
3 files changed, 86 insertions(+), 6 deletions(-)

Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved



diff --git a/src/host/trxcon/sched_prim.c b/src/host/trxcon/sched_prim.c
index 4987379..acd08bf 100644
--- a/src/host/trxcon/sched_prim.c
+++ b/src/host/trxcon/sched_prim.c
@@ -223,25 +223,105 @@
 }
 
 /**
+ * Dequeues either a TCH/H, or a FACCH/H prim (preferred).
+ * If a FACCH/H prim is found, two TCH/H prims are being
+ * dropped (i.e. replaced).
+ *
+ * According to GSM 05.02, the following blocks can be used
+ * to carry FACCH/H data (see clause 7, table 1 of 9):
+ *
+ * UL FACCH/H0:
+ * B0(0,2,4,6,8,10), B1(8,10,13,15,17,19), B2(17,19,21,23,0,2)
+ *
+ * UL FACCH/H1:
+ * B0(1,3,5,7,9,11), B1(9,11,14,16,18,20), B2(18,20,22,24,1,3)
+ *
+ * where the numbers within brackets are fn % 26.
+ *
+ * @param  queue      transmit queue to take a prim from
+ * @param  fn         the current frame number
+ * @param  lchan_type required channel type of a primitive,
+ * @return            either a FACCH/H, or a TCH/H primitive,
+ *                    otherwise NULL
+ */
+static struct trx_ts_prim *prim_dequeue_tch_h(struct llist_head *queue,
+	uint32_t fn, enum trx_lchan_type lchan_type)
+{
+	struct trx_ts_prim *facch;
+	struct trx_ts_prim *tch;
+	bool facch_now = false;
+	uint32_t fn_mf;
+
+	/* Traffic multiframe period */
+	fn_mf = fn % 26;
+
+	/* FACCH/H0 frame alignment */
+	if (lchan_type == TRXC_TCHH_0)
+		if (fn_mf == 0 || fn_mf == 8 || fn_mf == 17)
+			facch_now = true;
+
+	/* FACCH/H1 frame alignment */
+	if (lchan_type == TRXC_TCHH_1)
+		if (fn_mf == 1 || fn_mf == 9 || fn_mf == 18)
+			facch_now = true;
+
+	/* If FACCH/H is not allowed for a given frame number */
+	if (!facch_now) /* Just dequeue a TCH/H prim */
+		goto no_facch;
+
+	/* If there are no FACCH/H prims in the queue */
+	facch = prim_dequeue_tch(queue, lchan_type, true);
+	if (!facch) /* Just dequeue a TCH/H prim */
+		goto no_facch;
+
+	/* FACCH/H prim replaces two TCH/F prims */
+	tch = prim_dequeue_tch(queue, lchan_type, false);
+	if (tch) {
+		/* At least one TCH/H prim is dropped */
+		talloc_free(tch);
+
+		/* Attempt to find another */
+		tch = prim_dequeue_tch(queue, lchan_type, false);
+		if (tch) /* Drop the second TCH/H prim */
+			talloc_free(tch);
+	}
+
+	return facch;
+
+no_facch:
+	return prim_dequeue_tch(queue, lchan_type, false);
+}
+
+/**
  * Dequeues a single primitive of required type
  * from a specified transmit queue.
  *
  * @param  queue      a transmit queue to take a prim from
+ * @param  fn         the current frame number (used for FACCH/H)
  * @param  lchan_type required primitive type
  * @return            a primitive or NULL if not found
  */
 struct trx_ts_prim *sched_prim_dequeue(struct llist_head *queue,
-	enum trx_lchan_type lchan_type)
+	uint32_t fn, enum trx_lchan_type lchan_type)
 {
 	/* There is nothing to dequeue */
 	if (llist_empty(queue))
 		return NULL;
 
-	/* TCH requires FACCH prioritization, so handle it separately */
-	if (CHAN_IS_TCH(lchan_type))
+	switch (lchan_type) {
+	/* TCH/F requires FACCH/F prioritization */
+	case TRXC_TCHF:
 		return prim_dequeue_tch_f(queue);
 
-	return prim_dequeue_one(queue, lchan_type);
+	/* FACCH/H prioritization is a bit more complex */
+	case TRXC_TCHH_0:
+	case TRXC_TCHH_1:
+		return prim_dequeue_tch_h(queue, fn, lchan_type);
+
+	/* Other kinds of logical channels */
+	default:
+		return prim_dequeue_one(queue, lchan_type);
+	}
 }
 
 /**
diff --git a/src/host/trxcon/sched_trx.c b/src/host/trxcon/sched_trx.c
index c263ce7..fd43a56 100644
--- a/src/host/trxcon/sched_trx.c
+++ b/src/host/trxcon/sched_trx.c
@@ -95,7 +95,7 @@
 		 * attempt to obtain a new one from queue
 		 */
 		if (lchan->prim == NULL)
-			lchan->prim = sched_prim_dequeue(&ts->tx_prims, chan);
+			lchan->prim = sched_prim_dequeue(&ts->tx_prims, fn, chan);
 
 		/* TODO: report TX buffers health to the higher layers */
 
diff --git a/src/host/trxcon/sched_trx.h b/src/host/trxcon/sched_trx.h
index cd9c0e4..f3fa9df 100644
--- a/src/host/trxcon/sched_trx.h
+++ b/src/host/trxcon/sched_trx.h
@@ -302,7 +302,7 @@
 	(CHAN_IS_TCH(prim->chan) && prim->payload_len == GSM_MACBLOCK_LEN)
 
 struct trx_ts_prim *sched_prim_dequeue(struct llist_head *queue,
-	enum trx_lchan_type lchan_type);
+	uint32_t fn, enum trx_lchan_type lchan_type);
 int sched_prim_dummy(struct trx_lchan_state *lchan);
 void sched_prim_drop(struct trx_lchan_state *lchan);
 void sched_prim_flush_queue(struct llist_head *list);

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

Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: I9b59f60e1cbac8fb8fd557b6c67b5e376c0a6bbb
Gerrit-Change-Number: 10455
Gerrit-PatchSet: 1
Gerrit-Owner: Vadim Yanitskiy <axilirator at gmail.com>
Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Jenkins Builder
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20180815/5ee70f5b/attachment.htm>


More information about the gerrit-log mailing list