laforge has submitted this change. ( 
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/42915?usp=email )

Change subject: library: add f_gsm_fn_{sum,sub,diff}()
......................................................................

library: add f_gsm_fn_{sum,sub,diff}()

Change-Id: Ie91ccef5d3f170f4a341a6cf9d3323a896b299e6
---
M bts/BTS_Tests.ttcn
M library/GSM_Types.ttcn
M library/RLCMAC_Templates.ttcn
M pcu/PCUIF_Components.ttcn
4 files changed, 31 insertions(+), 11 deletions(-)

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




diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn
index 54238f5..2830973 100644
--- a/bts/BTS_Tests.ttcn
+++ b/bts/BTS_Tests.ttcn
@@ -6063,9 +6063,8 @@
 private function f_next_pcuif_time_ind_block(GsmFrameNumber fn) return 
GsmFrameNumber
 {
        var uint32_t bn := ((fn mod 13) / 4) + 1;
-       fn := fn - (fn mod 13);
-       fn := fn + bn * 4 + bn / 3;
-       return fn mod GsmMaxFrameNumber;
+       return f_gsm_fn_sum(fn - (fn mod 13),
+                           bn * 4 + bn / 3);
 }
 testcase TC_pcu_time_ind() runs on test_CT {
        var integer num_time_ind := 0;
diff --git a/library/GSM_Types.ttcn b/library/GSM_Types.ttcn
index b3b6dc9..7caca43 100644
--- a/library/GSM_Types.ttcn
+++ b/library/GSM_Types.ttcn
@@ -434,6 +434,28 @@
        return (fn / 51) mod 8;
 }

+/* 45.002 4.3.3: TDMA frame number modular arithmetic */
+
+/* Return the sum of two given TDMA frame numbers, wrapping around the 
hyperframe */
+function f_gsm_fn_sum(GsmFrameNumber a, GsmFrameNumber b) return 
GsmFrameNumber {
+       return (a + b) mod GsmMaxFrameNumber;
+}
+
+/* Return the difference of two given TDMA frame numbers, wrapping around the 
hyperframe */
+function f_gsm_fn_sub(GsmFrameNumber a, GsmFrameNumber b) return 
GsmFrameNumber {
+       return (a - b + GsmMaxFrameNumber) mod GsmMaxFrameNumber;
+}
+
+/* Return the *minimum* distance between two given TDMA frame numbers */
+function f_gsm_fn_diff(GsmFrameNumber a, GsmFrameNumber b) return 
GsmFrameNumber {
+       var GsmFrameNumber d1 := f_gsm_fn_sub(a, b);
+       var GsmFrameNumber d2 := f_gsm_fn_sub(b, a);
+       if (d1 < d2) {
+               return d1;
+       }
+       return d2;
+}
+
 type hexstring GsmBcdString with { variant "HEXORDER(low)" };
 type GsmBcdString BcdMccMnc with { variant "FIELDLENGTH(6)" };

@@ -542,9 +564,8 @@
 function f_next_pdtch_block(GsmFrameNumber fn) return GsmFrameNumber
 {
        var uint32_t bn := fn2bn(fn) + 1;
-       fn := fn - (fn mod 52);
-       fn := fn + bn * 4 + bn / 3;
-       return fn mod GsmMaxFrameNumber;
+       return f_gsm_fn_sum(fn - (fn mod 52),
+                           bn * 4 + bn / 3);
 }

 private function ptcch_fn2bn(GsmFrameNumber fn) return uint32_t {
@@ -553,9 +574,8 @@
 function f_next_ptcch_dl_block(GsmFrameNumber fn) return GsmFrameNumber
 {
        var uint32_t bn := ptcch_fn2bn(fn) + 1;
-       fn := fn - (fn mod 416);
-       fn := fn + bn * 104 + 12;
-       return fn mod GsmMaxFrameNumber;
+       return f_gsm_fn_sum(fn - (fn mod 416),
+                           bn * 104 + 12);
 }


diff --git a/library/RLCMAC_Templates.ttcn b/library/RLCMAC_Templates.ttcn
index 5e27341..08de136 100644
--- a/library/RLCMAC_Templates.ttcn
+++ b/library/RLCMAC_Templates.ttcn
@@ -35,7 +35,7 @@

        function f_rrbp_ack_fn(uint32_t current_fn, MacRrbp rrbp)
        return uint32_t {
-               return (current_fn + f_rrbp_fn_delay(rrbp)) mod 2715648;
+               return f_gsm_fn_sum(current_fn, f_rrbp_fn_delay(rrbp));
        }

        function f_rlcmac_cs_mcs_is_mcs(CodingScheme cs_mcs) return boolean {
diff --git a/pcu/PCUIF_Components.ttcn b/pcu/PCUIF_Components.ttcn
index 75e7a35..2f75a6b 100644
--- a/pcu/PCUIF_Components.ttcn
+++ b/pcu/PCUIF_Components.ttcn
@@ -21,6 +21,7 @@

 import from Osmocom_Types all;
 import from General_Types all;
+import from GSM_Types all;
 import from RLCMAC_Types all;
 import from GSM_RR_Types all;

@@ -249,7 +250,7 @@
                }

                /* TDMA hyperframe period is (2048 * 51 * 26) frames */
-               fn := (fn + 1) mod (2048 * 51 * 26);
+               fn := f_gsm_fn_sum(fn, 1);

                /* (Re)start TDMA clock timer and wait */
                T_TDMAClock.start;

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

Gerrit-MessageType: merged
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: Ie91ccef5d3f170f4a341a6cf9d3323a896b299e6
Gerrit-Change-Number: 42915
Gerrit-PatchSet: 3
Gerrit-Owner: fixeria <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-Reviewer: osmith <[email protected]>
Gerrit-CC: pespin <[email protected]>

Reply via email to