Change in osmocom-bb[master]: trxcon/scheduler: introduce TDMA frame math helpers

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

Vadim Yanitskiy gerrit-no-reply at lists.osmocom.org
Thu Sep 13 16:56:14 UTC 2018


Vadim Yanitskiy has uploaded this change for review. ( https://gerrit.osmocom.org/10942


Change subject: trxcon/scheduler: introduce TDMA frame math helpers
......................................................................

trxcon/scheduler: introduce TDMA frame math helpers

The 'normal' math operations, such as addition and substraction,
are not applicable for TDMA frame numbers because they may result
in out-of-range values.

Having TDMA frame math helpers in a single place would allow
one to avoid possible out-of-range result mistakes.

Change-Id: Ibb66ba846cc3d6c2eaa88414569e5f3751128047
---
M src/host/trxcon/sched_clck.c
M src/host/trxcon/sched_trx.c
M src/host/trxcon/scheduler.h
3 files changed, 16 insertions(+), 12 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/42/10942/1

diff --git a/src/host/trxcon/sched_clck.c b/src/host/trxcon/sched_clck.c
index 56b89a2..8a9527c 100644
--- a/src/host/trxcon/sched_clck.c
+++ b/src/host/trxcon/sched_clck.c
@@ -84,8 +84,7 @@
 		timespecadd(tv_clock, &frame_duration, tv_clock);
 		elapsed_us -= FRAME_DURATION_uS;
 
-		sched->fn_counter_proc = (sched->fn_counter_proc + 1)
-			% GSM_HYPERFRAME;
+		sched->fn_counter_proc = TDMA_FN_INC(sched->fn_counter_proc);
 
 		/* Call frame callback */
 		if (sched->clock_cb)
@@ -143,8 +142,7 @@
 	/* Calculate elapsed time / frames since last processed fn */
 	timespecsub(&tv_now, tv_clock, &elapsed);
 	elapsed_us = (elapsed.tv_sec * 1000000) + (elapsed.tv_nsec / 1000);
-	elapsed_fn = (fn + GSM_HYPERFRAME - sched->fn_counter_proc)
-		% GSM_HYPERFRAME;
+	elapsed_fn = TDMA_FN_SUB(fn, sched->fn_counter_proc);
 
 	if (elapsed_fn >= 135774)
 		elapsed_fn -= GSM_HYPERFRAME;
@@ -182,8 +180,7 @@
 
 	/* Transmit what we still need to transmit */
 	while (fn != sched->fn_counter_proc) {
-		sched->fn_counter_proc = (sched->fn_counter_proc + 1)
-			% GSM_HYPERFRAME;
+		sched->fn_counter_proc = TDMA_FN_INC(sched->fn_counter_proc);
 
 		/* Call frame callback */
 		if (sched->clock_cb)
diff --git a/src/host/trxcon/sched_trx.c b/src/host/trxcon/sched_trx.c
index 8bd3c72..e20da39 100644
--- a/src/host/trxcon/sched_trx.c
+++ b/src/host/trxcon/sched_trx.c
@@ -65,8 +65,8 @@
 		 * Advance frame number, giving the transceiver more
 		 * time until a burst must be transmitted...
 		 */
-		fn = (sched->fn_counter_proc + sched->fn_counter_advance)
-			% GSM_HYPERFRAME;
+		fn = TDMA_FN_SUM(sched->fn_counter_proc,
+			sched->fn_counter_advance);
 
 		/* Get frame from multiframe */
 		offset = fn % ts->mf_layout->period;
@@ -608,15 +608,14 @@
 	}
 
 	/* Calculate how many frames have been elapsed */
-	elapsed  = (burst_fn + GSM_HYPERFRAME - ts->mf_last_fn);
-	elapsed %= GSM_HYPERFRAME;
+	elapsed = TDMA_FN_SUB(burst_fn, ts->mf_last_fn);
 
 	/**
 	 * If not too many frames have been elapsed,
 	 * start counting from last fn + 1
 	 */
 	if (elapsed < 10)
-		fn = (ts->mf_last_fn + 1) % GSM_HYPERFRAME;
+		fn = TDMA_FN_INC(ts->mf_last_fn);
 	else
 		fn = burst_fn;
 
@@ -658,7 +657,7 @@
 		if (fn == burst_fn)
 			break;
 
-		fn = (fn + 1) % GSM_HYPERFRAME;
+		fn = TDMA_FN_INC(fn);
 	}
 
 	/* Set last processed frame number */
diff --git a/src/host/trxcon/scheduler.h b/src/host/trxcon/scheduler.h
index 6c3a2f2..6b70b41 100644
--- a/src/host/trxcon/scheduler.h
+++ b/src/host/trxcon/scheduler.h
@@ -8,6 +8,14 @@
 #define GSM_SUPERFRAME		(26 * 51)
 #define GSM_HYPERFRAME		(2048 * GSM_SUPERFRAME)
 
+/* TDMA frame number arithmetics */
+#define TDMA_FN_INC(fn) \
+	((fn + 1) % GSM_HYPERFRAME)
+#define TDMA_FN_SUM(a, b) \
+	((a + b) % GSM_HYPERFRAME)
+#define TDMA_FN_SUB(a, b) \
+	((a + GSM_HYPERFRAME - b) % GSM_HYPERFRAME)
+
 enum tdma_sched_clck_state {
 	SCH_CLCK_STATE_WAIT,
 	SCH_CLCK_STATE_OK,

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

Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibb66ba846cc3d6c2eaa88414569e5f3751128047
Gerrit-Change-Number: 10942
Gerrit-PatchSet: 1
Gerrit-Owner: Vadim Yanitskiy <axilirator at gmail.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20180913/f5e1b14f/attachment.htm>


More information about the gerrit-log mailing list