diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn index 926e8cc0c..2e48e0bec 100644 --- a/bsc/BSC_Tests.ttcn +++ b/bsc/BSC_Tests.ttcn @@ -22,7 +22,7 @@ import from GSM_RR_Types all; import from RSL_Tests all; -const integer NUM_BTS := 1; +const integer NUM_BTS := 3; const float T3101_MAX := 12.0; @@ -88,7 +88,7 @@ runs on test_CT { map(clnt.vc_IPA:IPA_PORT, system:IPA_CODEC_PT); connect(clnt.vc_IPA:IPA_RSL_PORT, self:IPA_RSL[i]); - clnt.vc_IPA.start(IPA_Emulation.main_client(bsc_host, bsc_port, "", -1, clnt.ccm_pars)); + clnt.vc_IPA.start(IPA_Emulation.main_client(bsc_host, bsc_port, "", 10000+i, clnt.ccm_pars)); /* wait for IPA RSL link to connect and send ID ACK */ T.start; @@ -606,10 +606,21 @@ type record Cell_Identity { }; private const Cell_Identity cid := { '001'H, '001'H, 1, 0 }; +type set of integer BtsIdList; + +private function f_bts_in_list(integer bts_id, BtsIdList bts_ids) return boolean { + for (var integer j := 0; j < sizeof(bts_ids); j := j + 1) { + if (bts_id == bts_ids[j]) { + return true; + } + } + return false; +} /* core paging test helper function; used by most paging test cases */ private function f_pageing_helper(hexstring imsi, template BSSMAP_FIELD_CellIdentificationList cid_list, + BtsIdList bts_ids := { 0 }, template RSL_ChanNeeded rsl_chneed := omit, template OCT4 tmsi := omit) runs on test_CT { @@ -618,12 +629,15 @@ private function f_pageing_helper(hexstring imsi, var template octetstring id_enc; /* FIXME */ var RSL_Message rx_rsl; var integer paging_group := hex2int(imsi[lengthof(imsi)-1]); + var integer i; f_init(); f_bssap_reset(); /* Clear the queue, it might still contain stuff like BCCH FILLING */ - IPA_RSL[0].clear; + for (i := 0; i < sizeof(bts_ids); i := i + 1) { + IPA_RSL[bts_ids[i]].clear; + } if (isvalue(rsl_chneed)) { /* The values of 08.08 3.2.2.36 and 08.58 9.3.40 are luckily identical */ @@ -643,95 +657,116 @@ private function f_pageing_helper(hexstring imsi, id_enc := enc_MobileIdentity(mi); */ id_enc := ?; - rx_rsl := f_exp_ipa_rx(0, tr_RSL_PAGING_CMD(id_enc)); - /* check channel type, paging group */ - if (rx_rsl.ies[1].body.paging_group != paging_group) { - setverdict(fail, "Paging for wrong paging group"); + for (i := 0; i < sizeof(bts_ids); i := i + 1) { + rx_rsl := f_exp_ipa_rx(bts_ids[i], tr_RSL_PAGING_CMD(id_enc)); + /* check channel type, paging group */ + if (rx_rsl.ies[1].body.paging_group != paging_group) { + setverdict(fail, "Paging for wrong paging group"); + } + if (ispresent(rsl_chneed) and + rx_rsl.ies[3].body.chan_needed.chan_needed != valueof(rsl_chneed)) { + setverdict(fail, "RSL Channel Needed != BSSMAP Channel Needed"); + } } - if (ispresent(rsl_chneed) and - rx_rsl.ies[3].body.chan_needed.chan_needed != valueof(rsl_chneed)) { - setverdict(fail, "RSL Channel Needed != BSSMAP Channel Needed"); + /* do a quick check on all not-included BTSs if they received paging */ + for (i := 0; i < NUM_BTS; i := i + 1) { + timer T := 0.1; + if (f_bts_in_list(i, bts_ids)) { + continue; + } + T.start; + alt { + [] IPA_RSL[i].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0, tr_RSL_PAGING_CMD(id_enc))) { + setverdict(fail, "Paging on BTS ", i, " which is not part of ", bts_ids); + } + [] IPA_RSL[i].receive { repeat; } + [] T.timeout { } + } } setverdict(pass); } +const BtsIdList c_BtsId_all := { 0, 1, 2 }; +const BtsIdList c_BtsId_LAC1 := { 0, 1 }; +const BtsIdList c_BtsId_LAC2 := { 2 }; + /* PAGING by IMSI + TMSI */ testcase TC_paging_imsi_nochan() runs on test_CT { var BSSMAP_FIELD_CellIdentificationList cid_list; cid_list := valueof(ts_BSSMAP_CIL_noCell); - f_pageing_helper('001010123456789'H, cid_list); + f_pageing_helper('001010123456789'H, cid_list, c_BtsId_all); } /* PAGING by IMSI + TMSI */ testcase TC_paging_tmsi_nochan() runs on test_CT { var BSSMAP_FIELD_CellIdentificationList cid_list; cid_list := valueof(ts_BSSMAP_CIL_noCell); - f_pageing_helper('001010100000001'H, cid_list, omit, 'A1B2C301'O); + f_pageing_helper('001010100000001'H, cid_list, c_BtsId_all, omit, 'A1B2C301'O); } /* Paging with different "channel needed' values */ testcase TC_paging_tmsi_any() runs on test_CT { var BSSMAP_FIELD_CellIdentificationList cid_list; cid_list := valueof(ts_BSSMAP_CIL_noCell); - f_pageing_helper('001010100000002'H, cid_list, RSL_CHANNEED_ANY, 'A1B2C302'O); + f_pageing_helper('001010100000002'H, cid_list, c_BtsId_all, RSL_CHANNEED_ANY, 'A1B2C302'O); } testcase TC_paging_tmsi_sdcch() runs on test_CT { var BSSMAP_FIELD_CellIdentificationList cid_list; cid_list := valueof(ts_BSSMAP_CIL_noCell); - f_pageing_helper('001010100000003'H, cid_list, RSL_CHANNEED_SDCCH, 'A1B2C303'O); + f_pageing_helper('001010100000003'H, cid_list, c_BtsId_all, RSL_CHANNEED_SDCCH, 'A1B2C303'O); } testcase TC_paging_tmsi_tch_f() runs on test_CT { var BSSMAP_FIELD_CellIdentificationList cid_list; cid_list := valueof(ts_BSSMAP_CIL_noCell); - f_pageing_helper('001010000000004'H, cid_list, RSL_CHANNEED_TCH_F, 'A1B2C304'O); + f_pageing_helper('001010000000004'H, cid_list, c_BtsId_all, RSL_CHANNEED_TCH_F, 'A1B2C304'O); } testcase TC_paging_tmsi_tch_hf() runs on test_CT { var BSSMAP_FIELD_CellIdentificationList cid_list; cid_list := valueof(ts_BSSMAP_CIL_noCell); - f_pageing_helper('001010000000005'H, cid_list, RSL_CHANNEED_TCH_ForH, 'A1B2C305'O); + f_pageing_helper('001010000000005'H, cid_list, c_BtsId_all, RSL_CHANNEED_TCH_ForH, 'A1B2C305'O); } /* Paging by CGI */ testcase TC_paging_imsi_nochan_cgi() runs on test_CT { var template BSSMAP_FIELD_CellIdentificationList cid_list; cid_list := { cIl_CGI := { ts_BSSMAP_CI_CGI(cid.mcc, cid.mnc, cid.lac, cid.ci) } }; - f_pageing_helper('001010000000006'H, cid_list); + f_pageing_helper('001010000000006'H, cid_list, { 0 }); } /* Paging by LAC+CI */ testcase TC_paging_imsi_nochan_lac_ci() runs on test_CT { var template BSSMAP_FIELD_CellIdentificationList cid_list; cid_list := { cIl_LAC_CI := { ts_BSSMAP_CI_LAC_CI(cid.lac, cid.ci) } }; - f_pageing_helper('001010000000007'H, cid_list); + f_pageing_helper('001010000000007'H, cid_list, { 0 }); } /* Paging by CI */ testcase TC_paging_imsi_nochan_ci() runs on test_CT { var template BSSMAP_FIELD_CellIdentificationList cid_list; cid_list := { cIl_CI := { ts_BSSMAP_CI_CI(cid.ci) } }; - f_pageing_helper('001010000000008'H, cid_list); + f_pageing_helper('001010000000008'H, cid_list, { 0 }); } /* Paging by LAI */ testcase TC_paging_imsi_nochan_lai() runs on test_CT { var template BSSMAP_FIELD_CellIdentificationList cid_list; cid_list := { cIl_LAI := { ts_BSSMAP_CI_LAI(cid.mcc, cid.mnc, cid.lac) } }; - f_pageing_helper('001010000000009'H, cid_list); + f_pageing_helper('001010000000009'H, cid_list, c_BtsId_LAC1); } /* Paging by LAC */ testcase TC_paging_imsi_nochan_lac() runs on test_CT { var template BSSMAP_FIELD_CellIdentificationList cid_list; cid_list := { cIl_LAC := { ts_BSSMAP_CI_LAC(cid.lac) } }; - f_pageing_helper('001010000000010'H, cid_list); + f_pageing_helper('001010000000010'H, cid_list, c_BtsId_LAC1); } /* Paging by "all in BSS" */ testcase TC_paging_imsi_nochan_all() runs on test_CT { var template BSSMAP_FIELD_CellIdentificationList cid_list; cid_list := { cIl_allInBSS := ''O }; - f_pageing_helper('001010000000011'H, cid_list); + f_pageing_helper('001010000000011'H, cid_list, c_BtsId_all); } /* Paging by PLMN+LAC+RNC */ @@ -749,7 +784,7 @@ testcase TC_paging_imsi_load() runs on test_CT { var BSSMAP_FIELD_CellIdentificationList cid_list; timer T := 4.0; cid_list := valueof(ts_BSSMAP_CIL_noCell); - f_pageing_helper('001010123456789'H, cid_list); + f_pageing_helper('001010123456789'H, cid_list, c_BtsId_all); /* tell BSC there is no paging space anymore */ f_ipa_tx(0, ts_RSL_PAGING_LOAD_IND(0)); @@ -773,7 +808,7 @@ testcase TC_paging_imsi_a_reset() runs on test_CT { var BSSMAP_FIELD_CellIdentificationList cid_list; timer T := 3.0; cid_list := valueof(ts_BSSMAP_CIL_noCell); - f_pageing_helper('001010123456789'H, cid_list); + f_pageing_helper('001010123456789'H, cid_list, c_BtsId_all); /* Perform a BSSMAP Reset and wait for ACK */ BSSAP.send(ts_BSSAP_UNITDATA_req(g_sccp_addr_peer, g_sccp_addr_own, ts_BSSMAP_Reset(0))); @@ -792,6 +827,14 @@ testcase TC_paging_imsi_a_reset() runs on test_CT { setverdict(fail, "Received PAGING after A-RESET"); self.stop; } + [] IPA_RSL[1].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0, tr_RSL_PAGING_CMD(?))) { + setverdict(fail, "Received PAGING after A-RESET"); + self.stop; + } + [] IPA_RSL[2].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0, tr_RSL_PAGING_CMD(?))) { + setverdict(fail, "Received PAGING after A-RESET"); + self.stop; + } [] T.timeout { setverdict(pass); } diff --git a/bsc/osmo-bsc.cfg b/bsc/osmo-bsc.cfg index 488ba0967..ac1553efd 100644 --- a/bsc/osmo-bsc.cfg +++ b/bsc/osmo-bsc.cfg @@ -176,6 +176,186 @@ network timeslot 7 phys_chan_config PDCH hopping enabled 0 + bts 1 + type sysmobts + band DCS1800 + cell_identity 1 + location_area_code 2 + dtx uplink force + dtx downlink + base_station_id_code 63 + ms max power 15 + cell reselection hysteresis 4 + rxlev access min 0 + radio-link-timeout 32 + channel allocator ascending + rach tx integer 9 + rach max transmission 7 + channel-descrption attach 1 + channel-descrption bs-pa-mfrms 5 + channel-descrption bs-ag-blks-res 1 + early-classmark-sending forbidden + ip.access unit_id 1235 0 + oml ip.access stream_id 255 line 0 + neighbor-list mode manual-si5 + neighbor-list add arfcn 100 + neighbor-list add arfcn 200 + si5 neighbor-list add arfcn 10 + si5 neighbor-list add arfcn 20 + codec-support fr + gprs mode gprs + gprs 11bit_rach_support_for_egprs 0 + gprs routing area 0 + gprs network-control-order nc0 + gprs cell bvci 1235 + gprs cell timer blocking-timer 3 + gprs cell timer blocking-retries 3 + gprs cell timer unblocking-retries 3 + gprs cell timer reset-timer 3 + gprs cell timer reset-retries 3 + gprs cell timer suspend-timer 10 + gprs cell timer suspend-retries 3 + gprs cell timer resume-timer 10 + gprs cell timer resume-retries 3 + gprs cell timer capability-update-timer 10 + gprs cell timer capability-update-retries 3 + gprs nsei 1235 + gprs ns timer tns-block 3 + gprs ns timer tns-block-retries 3 + gprs ns timer tns-reset 3 + gprs ns timer tns-reset-retries 3 + gprs ns timer tns-test 30 + gprs ns timer tns-alive 3 + gprs ns timer tns-alive-retries 10 + gprs nsvc 0 nsvci 1235 + gprs nsvc 0 local udp port 23000 + gprs nsvc 0 remote udp port 23000 + gprs nsvc 0 remote ip 192.168.100.239 + gprs nsvc 1 nsvci 0 + gprs nsvc 1 local udp port 0 + gprs nsvc 1 remote udp port 0 + gprs nsvc 1 remote ip 0.0.0.0 + no force-combined-si + trx 0 + rf_locked 0 + arfcn 871 + nominal power 23 + max_power_red 20 + rsl e1 tei 0 + timeslot 0 + phys_chan_config CCCH+SDCCH4 + hopping enabled 0 + timeslot 1 + phys_chan_config TCH/F + hopping enabled 0 + timeslot 2 + phys_chan_config TCH/F + hopping enabled 0 + timeslot 3 + phys_chan_config TCH/F + hopping enabled 0 + timeslot 4 + phys_chan_config TCH/F + hopping enabled 0 + timeslot 5 + phys_chan_config TCH/F + hopping enabled 0 + timeslot 6 + phys_chan_config PDCH + hopping enabled 0 + timeslot 7 + phys_chan_config PDCH + hopping enabled 0 + bts 2 + type sysmobts + band DCS1800 + cell_identity 1 + location_area_code 1 + dtx uplink force + dtx downlink + base_station_id_code 63 + ms max power 15 + cell reselection hysteresis 4 + rxlev access min 0 + radio-link-timeout 32 + channel allocator ascending + rach tx integer 9 + rach max transmission 7 + channel-descrption attach 1 + channel-descrption bs-pa-mfrms 5 + channel-descrption bs-ag-blks-res 1 + early-classmark-sending forbidden + ip.access unit_id 1236 0 + oml ip.access stream_id 255 line 0 + neighbor-list mode manual-si5 + neighbor-list add arfcn 100 + neighbor-list add arfcn 200 + si5 neighbor-list add arfcn 10 + si5 neighbor-list add arfcn 20 + codec-support fr + gprs mode gprs + gprs 11bit_rach_support_for_egprs 0 + gprs routing area 0 + gprs network-control-order nc0 + gprs cell bvci 1236 + gprs cell timer blocking-timer 3 + gprs cell timer blocking-retries 3 + gprs cell timer unblocking-retries 3 + gprs cell timer reset-timer 3 + gprs cell timer reset-retries 3 + gprs cell timer suspend-timer 10 + gprs cell timer suspend-retries 3 + gprs cell timer resume-timer 10 + gprs cell timer resume-retries 3 + gprs cell timer capability-update-timer 10 + gprs cell timer capability-update-retries 3 + gprs nsei 1236 + gprs ns timer tns-block 3 + gprs ns timer tns-block-retries 3 + gprs ns timer tns-reset 3 + gprs ns timer tns-reset-retries 3 + gprs ns timer tns-test 30 + gprs ns timer tns-alive 3 + gprs ns timer tns-alive-retries 10 + gprs nsvc 0 nsvci 1236 + gprs nsvc 0 local udp port 23000 + gprs nsvc 0 remote udp port 23000 + gprs nsvc 0 remote ip 192.168.100.239 + gprs nsvc 1 nsvci 0 + gprs nsvc 1 local udp port 0 + gprs nsvc 1 remote udp port 0 + gprs nsvc 1 remote ip 0.0.0.0 + no force-combined-si + trx 0 + rf_locked 0 + arfcn 871 + nominal power 23 + max_power_red 20 + rsl e1 tei 0 + timeslot 0 + phys_chan_config CCCH+SDCCH4 + hopping enabled 0 + timeslot 1 + phys_chan_config TCH/F + hopping enabled 0 + timeslot 2 + phys_chan_config TCH/F + hopping enabled 0 + timeslot 3 + phys_chan_config TCH/F + hopping enabled 0 + timeslot 4 + phys_chan_config TCH/F + hopping enabled 0 + timeslot 5 + phys_chan_config TCH/F + hopping enabled 0 + timeslot 6 + phys_chan_config PDCH + hopping enabled 0 + timeslot 7 + phys_chan_config PDCH + hopping enabled 0 msc 0 ip.access rtp-base 4000 timeout-ping 20 diff --git a/library/BSSMAP_Templates.ttcn b/library/BSSMAP_Templates.ttcn index 22fefdd3c..54e3f79b5 100644 --- a/library/BSSMAP_Templates.ttcn +++ b/library/BSSMAP_Templates.ttcn @@ -449,7 +449,7 @@ template BSSMAP_FIELD_CellIdentificationList ts_BSSMAP_CIL_noCell := { } private function f_enc_mcc_mnc(GsmMcc mcc, GsmMnc mnc) return OCT3 { - return hex2oct(mcc[1] & mcc[0] & mnc[0] & mnc[3] & mnc[2]); + return hex2oct(mcc[1] & mcc[0] & mnc[0] & mnc[2] & mnc[1]); } template BSSMAP_FIELD_CellIdentification_CGI ts_BSSMAP_CI_CGI(GsmMcc mcc, GsmMnc mnc, GsmLac lac, GsmCellId ci) := {