diff --git a/library/GSM_Types.ttcn b/library/GSM_Types.ttcn index 134edbd65..0068cb81a 100644 --- a/library/GSM_Types.ttcn +++ b/library/GSM_Types.ttcn @@ -443,8 +443,11 @@ function f_enc_BcdMccMnc(GsmMcc mcc, GsmMnc mnc) return BcdMccMnc { /* 3GPP TS 24.008, Figure 10.5.13 * | MCC digit 2 | MCC digit 1 | octet 1 * | MNC digit 3 | MCC digit 3 | octet 2 - * | MNC digit 2 | MNC digit 1 | octet 3 */ - return mcc[1] & mcc[0] & mnc[2] & mcc[2] & mnc[1] & mnc[0]; + * | MNC digit 2 | MNC digit 1 | octet 3 + * + * NOTE: TITAN takes care of swapping the nibbles in octets, + * so we use the normal (low-to-high) ordering here. */ + return mcc[0] & mcc[1] & mcc[2] & mnc[2] & mnc[0] & mnc[1]; } /* Compute BcdMccMnc from integer values */ @@ -460,6 +463,22 @@ function f_enc_BcdMccMnc_int(uint16_t mcc, uint16_t mnc, boolean mnc_3_digits) r } } +testcase TC_selftest_enc_BcdMccMnc() runs on Dummy_CT { + if (not match('62F224'O, decmatch BcdMccMnc:'262F42'H)) { setverdict(fail); } + if (not match('21F354'O, decmatch BcdMccMnc:'123F45'H)) { setverdict(fail); } + if (not match('216354'O, decmatch BcdMccMnc:'123645'H)) { setverdict(fail); } + + if (not match(f_enc_BcdMccMnc('262'H, '42'H), BcdMccMnc:'262F42'H)) { setverdict(fail); } + if (not match(f_enc_BcdMccMnc('123'H, '45'H), BcdMccMnc:'123F45'H)) { setverdict(fail); } + if (not match(f_enc_BcdMccMnc('123'H, '456'H), BcdMccMnc:'123645'H)) { setverdict(fail); } + + if (not match(f_enc_BcdMccMnc_int(262, 42, false), BcdMccMnc:'262F42'H)) { setverdict(fail); } + if (not match(f_enc_BcdMccMnc_int(123, 45, false), BcdMccMnc:'123F45'H)) { setverdict(fail); } + if (not match(f_enc_BcdMccMnc_int(123, 456, true), BcdMccMnc:'123645'H)) { setverdict(fail); } + + setverdict(pass); +} + /* 24.008 10.5.1.3 */ type record LocationAreaIdentification { BcdMccMnc mcc_mnc,