diff --git a/cbc/CBC_Tests.ttcn b/cbc/CBC_Tests.ttcn index 76fc3be10..8e7e1c527 100644 --- a/cbc/CBC_Tests.ttcn +++ b/cbc/CBC_Tests.ttcn @@ -115,7 +115,9 @@ private function f_init_pars_mme(integer mme_sbcap_port, charstring cbc_host, in cbc_host := cbc_host, cbc_sbcap_port := cbc_sbcap_port, start_fn := refers(f_MME_ConnHdlr_start_fn_void), - exp_cbs_msg := omit + exp_cbs_msg := omit, + write_replace_warning_ind_cause := omit, + bcast_cell_id_list := omit }; return pars; } @@ -298,6 +300,12 @@ private function f_bsc_create_and_delete() runs on BSC_ConnHdlr { private function f_mme_create_and_delete() runs on MME_ConnHdlr { f_sbcap_handle_write_replace_warn_req(g_pars.exp_cbs_msg, 0); + if (ispresent(g_pars.write_replace_warning_ind_cause) and + ispresent(g_pars.bcast_cell_id_list)) { + f_sbcap_tx_write_replace_warn_ind(0, g_pars.exp_cbs_msg, + g_pars.write_replace_warning_ind_cause, + g_pars.bcast_cell_id_list) + } f_sbcap_handle_stop_warn_req(0, g_pars.exp_cbs_msg); } @@ -411,10 +419,33 @@ testcase TC_ecbe_create_delete_lai() runs on test_CT { f_shutdown_helper(); } +/* Create and delete message with MME available. MME reports + * Write-Replace-Warning-Indication and Stop-Warning-Indication to CBC + */ +testcase TC_ecbe_create_delete_mme_indication() runs on test_CT { + var template (value) CellId_Broadcast_List bcast_cell_id_li; + var template (value) CBS_Message msg := t_CBSmsg(48, 16752); + + f_init(num_bsc := 0, num_mme := 1); + + bcast_cell_id_li := { + ts_SBCAP_CellId_Broadcast_List_Item(ts_SBCAP_ECGI(f_enc_mcc_mnc('901'H, '70'H), 1234)), + ts_SBCAP_CellId_Broadcast_List_Item(ts_SBCAP_ECGI(f_enc_mcc_mnc('901'H, '70'H), 5678)) + }; + g_pars_MME[0].start_fn := refers(f_mme_create_and_delete); + g_pars_MME[0].exp_cbs_msg := valueof(msg); + g_pars_MME[0].write_replace_warning_ind_cause := SBC_AP_Cause_message_accepted; + g_pars_MME[0].bcast_cell_id_list := valueof(bcast_cell_id_li); + f_start(); + f_create_and_delete(valueof(msg)); + f_shutdown_helper(); +} + /* Create and delete message with both BSC and MME available */ testcase TC_ecbe_create_delete_bsc_and_mme() runs on test_CT { f_init(num_bsc := 1, num_mme := 1); var template (value) BSSMAP_FIELD_CellIdentificationList cell_list_success; + var template (value) CellId_Broadcast_List bcast_cell_id_li; var template (value) CBS_Message msg := t_CBSmsg(43, 16752); cell_list_success := ts_BSSMAP_CIL_CGI({ @@ -425,8 +456,14 @@ testcase TC_ecbe_create_delete_bsc_and_mme() runs on test_CT { g_pars_BSC[0].start_fn := refers(f_bsc_create_and_delete); g_pars_BSC[0].exp_cbs_msg := valueof(msg); g_pars_BSC[0].cell_list_success := valueof(cell_list_success); + + bcast_cell_id_li := { + ts_SBCAP_CellId_Broadcast_List_Item(ts_SBCAP_ECGI(f_enc_mcc_mnc('901'H, '70'H), 1234)) + }; g_pars_MME[0].start_fn := refers(f_mme_create_and_delete); g_pars_MME[0].exp_cbs_msg := valueof(msg); + g_pars_MME[0].write_replace_warning_ind_cause := SBC_AP_Cause_message_accepted; + g_pars_MME[0].bcast_cell_id_list := valueof(bcast_cell_id_li); f_start(); f_create_and_delete(valueof(msg)); f_shutdown_helper(); @@ -440,6 +477,7 @@ control { execute( TC_ecbe_create_delete_lac() ); execute( TC_ecbe_create_delete_ci() ); execute( TC_ecbe_create_delete_lai() ); + execute( TC_ecbe_create_delete_mme_indication() ); execute( TC_ecbe_create_delete_bsc_and_mme() ); } diff --git a/cbc/MME_ConnectionHandler.ttcn b/cbc/MME_ConnectionHandler.ttcn index 055aaa3c2..fec358c9a 100644 --- a/cbc/MME_ConnectionHandler.ttcn +++ b/cbc/MME_ConnectionHandler.ttcn @@ -35,7 +35,9 @@ type record MME_ConnHdlrPars { charstring cbc_host, integer cbc_sbcap_port, void_fn start_fn, - CBS_Message exp_cbs_msg optional + CBS_Message exp_cbs_msg optional, + SBC_AP_Cause write_replace_warning_ind_cause optional, + CellId_Broadcast_List bcast_cell_id_list optional }; function f_MME_ConnHdlr_main(charstring id, MME_ConnHdlrPars pars) runs on MME_ConnHdlr { @@ -53,6 +55,17 @@ runs on MME_ConnHdlr { f_SBC_AP_send(tx, idx); } +function f_sbcap_tx_write_replace_warn_ind(integer idx := 0, CBS_Message msg, + SBC_AP_Cause cause, + template (value) CellId_Broadcast_List bcast_cell_id_li) +runs on MME_ConnHdlr { + var template (value) SBC_AP_PDU tx; + tx := ts_SBCAP_WRITE_WARNING_IND(int2bit(msg.msg_id, 16), + int2bit(msg.ser_nr, 16), + cause, bcast_cell_id_li); + f_SBC_AP_send(tx, idx); +} + function f_sbcap_tx_stop_warn_resp(integer idx := 0, CBS_Message msg) runs on MME_ConnHdlr { var template (value) SBC_AP_PDU tx; diff --git a/library/sbcap/SBC_AP_Templates.ttcn b/library/sbcap/SBC_AP_Templates.ttcn index d5f247106..0a9519e5d 100644 --- a/library/sbcap/SBC_AP_Templates.ttcn +++ b/library/sbcap/SBC_AP_Templates.ttcn @@ -11,6 +11,28 @@ import from SBC_AP_PDU_Descriptions all; import from SBC_AP_Types all; +/* 3GPP TS 36.413 9.2.1.38 */ +template (value) EUTRAN_CGI ts_SBCAP_ECGI(PLMNidentity plmn_id := '09F107'O, integer cell_id := 1) := { + pLMNidentity := plmn_id, + cell_ID := int2bit(cell_id, 28), + iE_Extensions := omit +} + +/* 3GPP TS 36.413 9.2.1.54 */ +template (value) CellId_Broadcast_List_Item ts_SBCAP_CellId_Broadcast_List_Item( + template (value) EUTRAN_CGI ecgi := ts_SBCAP_ECGI()) := { + eCGI := ecgi, + iE_Extensions := omit +} +template (value) Broadcast_Scheduled_Area_List ts_SBCAP_Broadcast_Scheduled_Area_List( + template (value) CellId_Broadcast_List cell_id_li := {ts_SBCAP_CellId_Broadcast_List_Item()}) +:= { + cellId_Broadcast_List := cell_id_li, + tAI_Broadcast_List := omit, + emergencyAreaID_Broadcast_List := omit, + iE_Extensions := omit +} + template (value) SBC_AP_PDU ts_SBCAP_PWS_RESTART( template (value) Restarted_Cell_List restart_cl, @@ -190,6 +212,37 @@ tr_SBCAP_WRITE_WARNING(template (present) BIT16 p_msg_id, template (present) BIT } } +/* 4.3.4.2.5 WRITE REPLACE WARNING INDICATION */ +template (value) SBC_AP_PDU +ts_SBCAP_WRITE_WARNING_IND(template (value) BIT16 p_msg_id, template (value) BIT16 p_ser_nr, + template (value) SBC_AP_Cause cause := SBC_AP_Cause_message_accepted, + template (value) CellId_Broadcast_List bcast_cell_id_li := {ts_SBCAP_CellId_Broadcast_List_Item()}) := { + initiatingMessage := { + procedureCode := id_Write_Replace_Warning_Indication, + criticality := ignore, + value_ := { + write_Replace_Warning_Indication := { + protocolIEs := { + { + id := SBC_AP_Constants.id_Message_Identifier, + criticality := reject, + value_ := { Message_Identifier := p_msg_id } + }, { + id := SBC_AP_Constants.id_Serial_Number, + criticality := reject, + value_ := { Serial_Number := p_ser_nr } + }, { + id := SBC_AP_Constants.id_Broadcast_Scheduled_Area_List, + criticality := reject, + value_ := { broadcast_Scheduled_Area_List := ts_SBCAP_Broadcast_Scheduled_Area_List(bcast_cell_id_li) } + } + }, + protocolExtensions := omit + } + } + } +} + /* 4.3.4.2.3 STOP WARNING REQUEST */ template (value) SBC_AP_PDU ts_SBCAP_WRITE_WARNING_RESP(template (value) BIT16 p_msg_id, template (value) BIT16 p_ser_nr,