fixeria has submitted this change. ( 
https://gerrit.osmocom.org/c/libosmocore/+/34520?usp=email )

Change subject: gsm: add gsm0502_fn_compare() for comparing TDMA FNs
......................................................................

gsm: add gsm0502_fn_compare() for comparing TDMA FNs

We need this function in:

* osmocom-bb.git for trxcon and l1gprs,
* osmo-pcu.git replacing fn_cmp().

Change-Id: I9590f2e836fc48650decf1564b6ab46306c4fe2d
Related: OS#5500
---
M include/osmocom/gsm/gsm0502.h
M tests/gsm0502/gsm0502_test.c
2 files changed, 54 insertions(+), 0 deletions(-)

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




diff --git a/include/osmocom/gsm/gsm0502.h b/include/osmocom/gsm/gsm0502.h
index ffd6e20..6624e70 100644
--- a/include/osmocom/gsm/gsm0502.h
+++ b/include/osmocom/gsm/gsm0502.h
@@ -64,6 +64,25 @@
 #define GSM_NBITS_AB_GMSK_TAIL         GSM_NBITS_NB_GMSK_TAIL
 #define GSM_NBITS_AB_GMSK_BURST                GSM_NBITS_NB_GMSK_BURST

+/*! Compare the given TDMA FNs, taking the wrapping into account.
+ * \param[in] fn1 First TDMA Fn value to compare.
+ * \param[in] fn2 Second TDMA Fn value to compare.
+ * \returns similarly to memcmp(), -1 if fn1 goes before fn2;
+ *                                  0 if fn1 equals fn2;
+ *                                  1 if fn1 goes after fn2. */
+static inline int gsm0502_fn_compare(uint32_t fn1, uint32_t fn2)
+{
+       const uint32_t thresh = GSM_TDMA_HYPERFRAME / 2;
+
+       if (fn1 == fn2)
+               return 0;
+       if ((fn1 < fn2 && (fn2 - fn1) < thresh) ||
+           (fn1 > fn2 && (fn1 - fn2) > thresh))
+               return -1;
+
+       return 1;
+}
+
 /* Table 5 Clause 7 TS 05.02 */
 static inline unsigned int
 gsm0502_get_n_pag_blocks(const struct gsm48_control_channel_descr *chan_desc)
diff --git a/tests/gsm0502/gsm0502_test.c b/tests/gsm0502/gsm0502_test.c
index e9deaa9..d78a94d 100644
--- a/tests/gsm0502/gsm0502_test.c
+++ b/tests/gsm0502/gsm0502_test.c
@@ -148,8 +148,28 @@
        printf("\n");
 }

+static void test_gsm0502_fn_compare(void)
+{
+       OSMO_ASSERT(gsm0502_fn_compare(1337, 1337)              ==  0);
+       OSMO_ASSERT(gsm0502_fn_compare(42, 1337)                == -1);
+       OSMO_ASSERT(gsm0502_fn_compare(1337, 42)                ==  1);
+       OSMO_ASSERT(gsm0502_fn_compare(42, 0)                   ==  1);
+
+       /* 2715642 is very close to the Fn period (GSM_TDMA_HYPERFRAME) */
+       OSMO_ASSERT(gsm0502_fn_compare(2715642, 42)             == -1);
+       OSMO_ASSERT(gsm0502_fn_compare(42, 2715642)             ==  1);
+       OSMO_ASSERT(gsm0502_fn_compare(0, 2715642)              ==  1);
+
+       /* 1357824 is half of the Fn period (GSM_TDMA_HYPERFRAME) */
+       OSMO_ASSERT(gsm0502_fn_compare(1357820, 1357824)        == -1);
+       OSMO_ASSERT(gsm0502_fn_compare(1357820, 1357825)        == -1);
+       OSMO_ASSERT(gsm0502_fn_compare(1357824, 1357820)        ==  1);
+       OSMO_ASSERT(gsm0502_fn_compare(1357825, 1357820)        ==  1);
+}
+
 int main(int argc, char **argv)
 {
        test_gsm0502_fn_remap();
+       test_gsm0502_fn_compare();
        return EXIT_SUCCESS;
 }

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

Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: I9590f2e836fc48650decf1564b6ab46306c4fe2d
Gerrit-Change-Number: 34520
Gerrit-PatchSet: 2
Gerrit-Owner: fixeria <vyanits...@sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanits...@sysmocom.de>
Gerrit-Reviewer: laforge <lafo...@osmocom.org>
Gerrit-Reviewer: pespin <pes...@sysmocom.de>
Gerrit-MessageType: merged

Reply via email to