diff --git a/library/PCUIF_Types.ttcn b/library/PCUIF_Types.ttcn index 8144d972f..f0200af9f 100644 --- a/library/PCUIF_Types.ttcn +++ b/library/PCUIF_Types.ttcn @@ -145,6 +145,7 @@ type record PCUIF_InfoTrxTs { uint8_t hopping, uint8_t hsn, uint8_t maio, + uint8_t ma_bit_len, bitstring ma length(64) } with { variant (ma) "BYTEORDER(first), BITORDER(msb)" }; private type record length(8) of PCUIF_InfoTrxTs PCUIF_InfoTrxTsList; @@ -709,12 +710,14 @@ template (value) PCUIF_InfoTrxTs ts_PCUIF_InfoTrxTsH0(template (value) uint3_t t tsc := tsc, hopping := 0, hsn := 0, maio := 0, + ma_bit_len := 0, ma := f_pad_bit(''B, 64, '0'B) }; template PCUIF_InfoTrxTs tr_PCUIF_InfoTrxTsH0(template uint3_t tsc := ?) := { tsc := tsc, hopping := 0, hsn := ?, maio := ?, + ma_bit_len := ?, ma := ? }; @@ -726,16 +729,19 @@ template (value) PCUIF_InfoTrxTs ts_PCUIF_InfoTrxTsH1(template (value) uint3_t t hopping := 1, hsn := hsn, maio := maio, + ma_bit_len := lengthof(valueof(ma)), ma := f_pad_bit(valueof(ma), 64, '0'B) }; template PCUIF_InfoTrxTs tr_PCUIF_InfoTrxTsH1(template uint3_t tsc := ?, template uint6_t hsn := ?, template uint6_t maio := ?, - template bitstring ma := ?) := { + template bitstring ma := ?, + template uint8_t ma_bit_len := ?) := { tsc := tsc, hopping := 1, hsn := hsn, maio := maio, + ma_bit_len := ma_bit_len, ma := ma }; diff --git a/pcu/PCU_Tests.ttcn b/pcu/PCU_Tests.ttcn index 2d209752b..a4596bff8 100644 --- a/pcu/PCU_Tests.ttcn +++ b/pcu/PCU_Tests.ttcn @@ -2193,18 +2193,12 @@ private function f_TC_pcuif_fh_check_imm_ass(in PCUIF_info_ind info_ind, ia.pkt_chan_desc, " vs ", tr_pkt_chan_desc); } - var MobileAllocationLV tr_ma := { len := 0, ma := ''B }; - var octetstring ma_oct := bit2oct(ts.ma); - - /* Calculate length of the useful part of Mobile Allocation */ - for (var integer i := 0; i < lengthof(ma_oct); i := i + 1) { - if (ma_oct[i] != '00'O) { - tr_ma.len := i + 1; - } - } - - /* Strip zero bytes from the right side of MA */ - tr_ma.ma := substr(ts.ma, 0, tr_ma.len * 8); + /* Mobile Allocation is expected to be octet-aligned */ + var uint8_t ma_oct_len := (ts.ma_bit_len + 8 - 1) / 8; + var template MobileAllocationLV tr_ma := { + len := ma_oct_len, /* in bytes */ + ma := substr(ts.ma, 0, ma_oct_len * 8) + }; if (not match(ia.mobile_allocation, tr_ma)) { setverdict(fail, "Mobile Allocation does not match: ", @@ -2284,14 +2278,6 @@ private function f_TC_pcuif_fh_check_pkt_ass(in PCUIF_info_ind info_ind, { /* FIXME: TRX0/TS7 is a hard-coded expectation, make it configurable */ var PCUIF_InfoTrxTs ts := info_ind.trx.v10[0].ts[7]; - var integer ma_bit_len := 0; - - /* Calculate length of the useful part of Mobile Allocation */ - for (var integer i := 0; i < lengthof(ts.ma); i := i + 1) { - if (ts.ma[i] == '1'B) { - ma_bit_len := i + 1; - } - } /* Table 12.8.1: Frequency Parameters information elements */ var template FrequencyParameters tr_fp := { @@ -2307,8 +2293,8 @@ private function f_TC_pcuif_fh_check_pkt_ass(in PCUIF_info_ind info_ind, rfl_number_list_present := '0'B, rfl_number_list := omit, ma_present := '0'B, /* inverted logic */ - ma_length := ma_bit_len, - ma_bitmap := substr(ts.ma, 0, ma_bit_len) + ma_length := ts.ma_bit_len, + ma_bitmap := substr(ts.ma, 0, ts.ma_bit_len) } }, direct2 := omit