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;