| module CBSP_Templates { |
| |
| import from Osmocom_Types all; |
| import from BSSAP_Types all; |
| import from CBSP_Types all; |
| |
| /* TODO: receive templates must match IEs in any arbitrary order */ |
| |
| /* For some reason the TTCN-3 RAW codec cannot automatically figure out the IEI |
| * that it needs to set for a given union-choice (body). So we have to explicitly |
| * specify the IEI by the caller :( */ |
| template (value) CBSP_IE ts_CBSP_IE(CBSP_IEI iei, template (value) CBSP_IE_Body body) := { |
| iei := iei, |
| body := body |
| } |
| |
| template CBSP_IE tr_CBSP_IE(template CBSP_IE_Body body) := { |
| iei := ?, |
| body := body |
| } |
| |
| |
| template (value) CBSP_IE ts_CbspMsgId(template (value) uint16_t val) := |
| ts_CBSP_IE(CBSP_IEI_MSG_ID, {msg_id := val}); |
| template CBSP_IE tr_CbspMsgId(template uint16_t val := ?) := |
| tr_CBSP_IE({msg_id := val}); |
| |
| template (value) CBSP_IE ts_NewSerNo(template (value) uint16_t val) := |
| ts_CBSP_IE(CBSP_IEI_NEW_SERIAL_NR, {new_ser_nr := val}); |
| template CBSP_IE tr_NewSerNo(template uint16_t val := ?) := |
| tr_CBSP_IE({new_ser_nr := val}); |
| |
| template (value) CBSP_IE ts_OldSerNo(template (value) uint16_t val) := |
| ts_CBSP_IE(CBSP_IEI_OLD_SERIAL_NR, {old_ser_nr := val}); |
| template CBSP_IE tr_OldSerNo(template uint16_t val := ?) := |
| tr_CBSP_IE({old_ser_nr := val}); |
| |
| template (value) CBSP_IE ts_CbspKARepPeriod(template (value) uint8_t rep_per) := |
| ts_CBSP_IE(CBSP_IEI_KEEP_ALIVE_REP_PERIOD, {keep_alive_rep_period := rep_per}); |
| template CBSP_IE tr_CbspKARepPeriod(template uint8_t rep_per := ?) := |
| tr_CBSP_IE({keep_alive_rep_period := rep_per}); |
| |
| function ts_CbspChannelInd(template (omit) uint8_t val) return template (omit) CBSP_IE { |
| var template (omit) CBSP_IE ie; |
| if (istemplatekind(val, "omit")) { |
| ie := omit; |
| } else { |
| ie := ts_CBSP_IE(CBSP_IEI_CHANNEL_IND, {channel_ind := val}); |
| } |
| return ie; |
| } |
| function tr_CbspChannelInd(template uint8_t val := ?) return template CBSP_IE { |
| var template CBSP_IE ie; |
| if (istemplatekind(val, "omit")) { |
| ie := omit; |
| } else if (istemplatekind(val, "*")) { |
| ie := tr_CBSP_IE({channel_ind := ?}) ifpresent; |
| } else { |
| ie := tr_CBSP_IE({channel_ind := val}); |
| } |
| return ie; |
| } |
| |
| template (value) CBSP_IE ts_CbspCause(template (value) CBSP_Cause c) := |
| ts_CBSP_IE(CBSP_IEI_CAUSE, {cause := c}); |
| template CBSP_IE tr_CbspCause(template CBSP_Cause c := ?) := |
| tr_CBSP_IE({cause := c}); |
| |
| template (value) CBSP_IE ts_CbspCellList(template (value) BSSMAP_FIELD_CellIdentificationList list) := |
| ts_CBSP_IE(CBSP_IEI_CELL_LIST, { |
| cell_list := { |
| len := 0, |
| spare1_4 := '0000'B, |
| cell_id_discr := '0000'B, |
| cell_id := list |
| }}); |
| template CBSP_IE tr_CbspCellList(template BSSMAP_FIELD_CellIdentificationList list := ?) := |
| tr_CBSP_IE({ |
| cell_list := { |
| len := ?, |
| spare1_4 := ?, |
| cell_id_discr := ?, |
| cell_id := list |
| }}); |
| |
| template (value) CBSP_IE ts_CbspCategory(template (value) CBSP_Category cat) := |
| ts_CBSP_IE(CBSP_IEI_CATEGORY, {category := cat}); |
| template CBSP_IE tr_CbspCategory(template CBSP_Category cat := ?) := |
| tr_CBSP_IE({category := cat}); |
| |
| template (value) CBSP_IE ts_CbspRepetitionPeriod(template (value) uint16_t per) := |
| ts_CBSP_IE(CBSP_IEI_REP_PERIOD, {rep_period := per}); |
| template CBSP_IE tr_CbspRepetitionPeriod(template uint16_t per := ?) := |
| tr_CBSP_IE({rep_period := per}); |
| |
| template (value) CBSP_IE ts_CbspNumBcastReq(template (value) uint16_t num) := |
| ts_CBSP_IE(CBSP_IEI_NUM_BCAST_REQ, {num_bcast_req := num}); |
| template CBSP_IE tr_CbspNumBcastReq(template uint16_t num := ?) := |
| tr_CBSP_IE({num_bcast_req := num}); |
| |
| template (value) CBSP_IE ts_CbspNumPages(template (value) uint8_t num) := |
| ts_CBSP_IE(CBSP_IEI_NUM_OF_PAGES, {num_of_pages := num}); |
| template CBSP_IE tr_CbspNumPages(template uint16_t num := ?) := |
| tr_CBSP_IE({num_of_pages := num}); |
| |
| template (value) CBSP_IE ts_EmergencyInd(template (value) uint8_t val) := |
| ts_CBSP_IE(CBSP_IEI_EMERG_IND, {emerg_ind := val}); |
| template CBSP_IE tr_EmergencyInd(template uint8_t val := ?) := |
| tr_CBSP_IE({emerg_ind := val}); |
| |
| template (value) CBSP_IE ts_WarningType(template (value) uint16_t val) := |
| ts_CBSP_IE(CBSP_IEI_WARN_TYPE, {warn_type := val}); |
| template CBSP_IE tr_WarningType(template uint16_t val) := |
| tr_CBSP_IE({warn_type := val}); |
| |
| template (value) CBSP_IE ts_WarnSecInfo(template (value) octetstring payl := ''O) := |
| ts_CBSP_IE(CBSP_IEI_WARN_SEC_INFO, {warn_sec_info := payl}); |
| template CBSP_IE tr_WarnSecInfo(template octetstring payl := ?) := |
| tr_CBSP_IE({warn_sec_info := payl}); |
| |
| template (value) CBSP_IE ts_WarningPeriod(template (value) uint8_t val) := |
| ts_CBSP_IE(CBSP_IEI_WARNING_PERIOD, {warning_period := val}); |
| template CBSP_IE tr_WarningPeriod(template uint8_t val := ?) := |
| tr_CBSP_IE({warning_period := val}); |
| |
| template (value) CBSP_IE ts_CbspFailList(template (value) CBSP_FailureListItems items) := |
| ts_CBSP_IE(CBSP_IEI_FAILURE_LIST, {failure_list := { |
| len := 0, |
| list := items |
| }}); |
| template CBSP_IE tr_CbspFailList(template CBSP_FailureListItems items := ?) := |
| tr_CBSP_IE({failure_list := { |
| len := ?, |
| list := items |
| }}); |
| |
| template (value) CBSP_IE ts_CbspNumComplList(template (value) CBSP_IE_NumBcastComplList list) := |
| ts_CBSP_IE(CBSP_IEI_NUM_BCAST_COMPL_LIST, {num_bcast_compl_list := list}); |
| template CBSP_IE tr_CbspNumComplList(template CBSP_IE_NumBcastComplList list := ?) := |
| tr_CBSP_IE({num_bcast_compl_list := list}); |
| |
| template (value) CBSP_IE ts_CbspBcastMsgType(template (value) CBSP_BcastMsgType bi) := |
| ts_CBSP_IE(CBSP_IEI_BCAST_MSG_TYPE, {bcast_msg_type := { |
| spare1_4 := '0000'B, |
| msg_type := bi |
| }}); |
| template CBSP_IE tr_CbspBcastMsgType(template CBSP_BcastMsgType bi := ?) := |
| tr_CBSP_IE({bcast_msg_type := { |
| spare1_4 := ?, |
| msg_type := bi |
| }}); |
| |
| template (value) CBSP_IE ts_CbspRecoveryInd(template (value) CBSP_RecoveryInd ri) := |
| ts_CBSP_IE(CBSP_IEI_RECOVERY_IND, {recovery_ind := { |
| spare1_4 := '0000'B, |
| recovery := ri |
| }}); |
| template CBSP_IE tr_CbspRecoveryInd(template CBSP_RecoveryInd ri) := |
| tr_CBSP_IE({recovery_ind := { |
| spare1_4 := ?, |
| recovery := ri |
| }}); |
| |
| template (value) CBSP_IE ts_CbspMsgContent(template (value) octetstring payload, uint8_t user_len) := |
| ts_CBSP_IE(CBSP_IEI_MSG_CONTENT, {msg_content := { |
| user_len := user_len, |
| val := payload |
| }}); |
| template CBSP_IE tr_CbspMsgContent(template octetstring payload := ?, template uint8_t user_len := ?) := |
| tr_CBSP_IE({msg_content := { |
| user_len := user_len, |
| val := payload |
| }}); |
| |
| template (value) CBSP_IE ts_CbspDCS(template (value) uint8_t dcs) := |
| ts_CBSP_IE(CBSP_IEI_DCS, {dcs := dcs}); |
| template CBSP_IE tr_CbspDCS(template uint8_t dcs := ?) := |
| tr_CBSP_IE({dcs := dcs}); |
| |
| |
| template (value) CBSP_PDU ts_CBSP(CBSP_MessageType msg_type, template (value) CBSP_IEs ies) := { |
| msg_type := msg_type, |
| len := 0, /* overwritten */ |
| ies := ies |
| } |
| template CBSP_PDU tr_CBSP(template CBSP_MessageType msg_type := ?, template CBSP_IEs ies := *) := { |
| msg_type := msg_type, |
| len := ?, |
| ies := ies |
| } |
| |
| |
| |
| /* 8.1.3.1 WRITE REPLACE */ |
| function ts_CBSP_WRITE_CBS(template (value) uint16_t msg_id, |
| template (value) uint16_t new_ser_nr, |
| template (value) BSSMAP_FIELD_CellIdentificationList cell_list, |
| template (value) uint8_t channel_ind, |
| template (value) CBSP_Category category, |
| template (value) uint16_t rep_period, |
| template (value) uint16_t num_bcast_req, |
| template (value) uint8_t dcs, |
| template (value) CBSP_IEs content) return template (value) CBSP_PDU { |
| var template (value) CBSP_IEs ies := { |
| ts_CbspMsgId(msg_id), |
| ts_NewSerNo(new_ser_nr), |
| ts_CbspCellList(cell_list), |
| ts_CbspChannelInd(channel_ind), |
| ts_CbspCategory(category), |
| ts_CbspRepetitionPeriod(rep_period), |
| ts_CbspNumBcastReq(num_bcast_req), |
| ts_CbspDCS(dcs), |
| ts_CbspNumPages(lengthof(content)) |
| }; |
| return ts_CBSP(CBSP_MSGT_WRITE_REPLACE, valueof(ies) & valueof(content)); |
| } |
| template CBSP_PDU tr_CBSP_WRITE_CBS(template uint16_t msg_id := ?, template uint16_t new_ser_nr := ?, |
| template BSSMAP_FIELD_CellIdentificationList cell_list := ?, |
| template uint8_t channel_ind := ?, |
| template CBSP_Category category := ?, |
| template uint16_t rep_period := ?, |
| template uint16_t num_bcast_req := ?, |
| template uint8_t dcs := ?, |
| template CBSP_IEs content := ? |
| ) := |
| tr_CBSP(CBSP_MSGT_WRITE_REPLACE, ({ |
| tr_CbspMsgId(msg_id), |
| tr_NewSerNo(new_ser_nr), |
| tr_CbspCellList(cell_list), |
| tr_CbspChannelInd(channel_ind), |
| tr_CbspCategory(category), |
| tr_CbspRepetitionPeriod(rep_period), |
| tr_CbspNumBcastReq(num_bcast_req), |
| tr_CbspDCS(dcs), |
| tr_CbspNumPages(lengthof(content)), all from content })); |
| |
| |
| function ts_CBSP_REPLACE_CBS(uint16_t msg_id, uint16_t new_ser_nr, uint16_t old_ser_nr, |
| template (value) BSSMAP_FIELD_CellIdentificationList cell_list, |
| template (value) uint8_t channel_ind, |
| template (value) CBSP_Category category, |
| template (value) uint16_t rep_period, |
| template (value) uint16_t num_bcast_req, |
| template (value) uint8_t dcs, |
| template (value) CBSP_IEs content) return template (value) CBSP_PDU { |
| var template (value) CBSP_IEs ies := { |
| ts_CbspMsgId(msg_id), |
| ts_NewSerNo(new_ser_nr), |
| ts_OldSerNo(old_ser_nr), |
| ts_CbspCellList(cell_list), |
| ts_CbspChannelInd(channel_ind), |
| ts_CbspCategory(category), |
| ts_CbspRepetitionPeriod(rep_period), |
| ts_CbspNumBcastReq(num_bcast_req), |
| ts_CbspDCS(dcs), |
| ts_CbspNumPages(lengthof(content)) |
| }; |
| return ts_CBSP(CBSP_MSGT_WRITE_REPLACE, valueof(ies) & valueof(content)); |
| } |
| template CBSP_PDU tr_CBSP_REPLACE_CBS(template uint16_t msg_id := ?, template uint16_t new_ser_nr := ?, |
| template uint16_t old_ser_nr := ?, |
| template BSSMAP_FIELD_CellIdentificationList cell_list := ?, |
| template uint8_t channel_ind := ?, |
| template CBSP_Category category := ?, |
| template uint16_t rep_period := ?, |
| template uint16_t num_bcast_req := ?, |
| template uint8_t dcs := ?, |
| template CBSP_IEs content := ? |
| ) := |
| tr_CBSP(CBSP_MSGT_WRITE_REPLACE, ({ |
| tr_CbspMsgId(msg_id), |
| tr_NewSerNo(new_ser_nr), |
| tr_OldSerNo(old_ser_nr), |
| tr_CbspCellList(cell_list), |
| tr_CbspChannelInd(channel_ind), |
| tr_CbspCategory(category), |
| tr_CbspRepetitionPeriod(rep_period), |
| tr_CbspNumBcastReq(num_bcast_req), |
| tr_CbspDCS(dcs), |
| tr_CbspNumPages(lengthof(content)), all from content })); |
| |
| template (value) CBSP_PDU ts_CBSP_WRITE_EMERG(uint16_t msg_id, uint16_t new_ser_nr, |
| template (value) BSSMAP_FIELD_CellIdentificationList cell_list, |
| template (value) uint8_t emerg_ind, |
| template (value) uint16_t warn_type, |
| template (value) uint8_t warn_per |
| ) := |
| ts_CBSP(CBSP_MSGT_WRITE_REPLACE, { |
| ts_CbspMsgId(msg_id), |
| ts_NewSerNo(new_ser_nr), |
| ts_CbspCellList(cell_list), |
| ts_EmergencyInd(emerg_ind), |
| ts_WarningType(warn_type), |
| ts_WarnSecInfo, |
| ts_WarningPeriod(warn_per) }); |
| template CBSP_PDU tr_CBSP_WRITE_EMERG(template uint16_t msg_id := ?, template uint16_t new_ser_nr := ?, |
| template BSSMAP_FIELD_CellIdentificationList cell_list := ?, |
| template uint8_t emerg_ind := ?, |
| template uint16_t warn_type := ?, |
| template uint16_t num_bcast_req := ?, |
| template uint8_t warn_per := ? |
| ) := |
| tr_CBSP(CBSP_MSGT_WRITE_REPLACE, { |
| tr_CbspMsgId(msg_id), |
| tr_NewSerNo(new_ser_nr), |
| tr_CbspCellList(cell_list), |
| tr_EmergencyInd(emerg_ind), |
| tr_WarningType(warn_type), |
| tr_WarnSecInfo, |
| tr_WarningPeriod(warn_per) }); |
| |
| |
| template (value) CBSP_PDU ts_CBSP_REPLACE_EMERG(uint16_t msg_id, uint16_t new_ser_nr, uint16_t old_ser_nr, |
| template (value) BSSMAP_FIELD_CellIdentificationList cell_list, |
| template (value) uint8_t emerg_ind, |
| template (value) uint16_t warn_type, |
| template (value) uint16_t num_bcast_req, |
| template (value) uint8_t warn_per |
| ) := |
| ts_CBSP(CBSP_MSGT_WRITE_REPLACE, { |
| ts_CbspMsgId(msg_id), |
| ts_NewSerNo(new_ser_nr), |
| ts_OldSerNo(old_ser_nr), |
| ts_CbspCellList(cell_list), |
| ts_EmergencyInd(emerg_ind), |
| ts_WarningType(warn_type), |
| ts_WarnSecInfo, |
| ts_WarningPeriod(warn_per) }); |
| template CBSP_PDU tr_CBSP_REPLACE_EMERG(template uint16_t msg_id := ?, template uint16_t new_ser_nr := ?, |
| template uint16_t old_ser_nr := ?, |
| template BSSMAP_FIELD_CellIdentificationList cell_list := ?, |
| template uint8_t emerg_ind := ?, |
| template uint16_t warn_type := ?, |
| template uint16_t num_bcast_req := ?, |
| template uint8_t warn_per := ? |
| ) := |
| tr_CBSP(CBSP_MSGT_WRITE_REPLACE, { |
| tr_CbspMsgId(msg_id), |
| tr_NewSerNo(new_ser_nr), |
| tr_OldSerNo(old_ser_nr), |
| tr_CbspCellList(cell_list), |
| tr_EmergencyInd(emerg_ind), |
| tr_WarningType(warn_type), |
| tr_WarnSecInfo, |
| tr_WarningPeriod(warn_per) }); |
| |
| /* 8.1.3.2 WRITE-REPLACE COMPLETE */ |
| function ts_CBSP_WRITE_CBS_COMPL(uint16_t msg_id, uint16_t new_ser_nr, |
| template (omit) BSSMAP_FIELD_CellIdentificationList cell_list, |
| template (value) uint8_t channel_ind) |
| return template (value) CBSP_PDU { |
| var template (value) CBSP_IEs ies := { |
| ts_CbspMsgId(msg_id), |
| ts_NewSerNo(new_ser_nr) |
| }; |
| if (not istemplatekind(cell_list, "omit")) { |
| ies[lengthof(ies)] := ts_CbspCellList(valueof(cell_list)); |
| } |
| ies[lengthof(ies)] := ts_CbspChannelInd(channel_ind); |
| return ts_CBSP(CBSP_MSGT_WRITE_REPLACE_COMPL, ies); |
| } |
| function tr_CBSP_WRITE_CBS_COMPL(template uint16_t msg_id, template uint16_t new_ser_nr, |
| template BSSMAP_FIELD_CellIdentificationList cell_list, |
| template uint8_t channel_ind) |
| return template CBSP_PDU { |
| var template CBSP_IEs ies := { |
| tr_CbspMsgId(msg_id), |
| tr_NewSerNo(new_ser_nr) |
| }; |
| if (istemplatekind(cell_list, "*")) { |
| testcase.stop("TITAN > 6.5.0 doesn't support this"); |
| //ies[lengthof(ies)] := tr_CbspCellList ifpresent; |
| } else if (istemplatekind(cell_list, "?")) { |
| ies[lengthof(ies)] := tr_CbspCellList(?); |
| } else if (not istemplatekind(cell_list, "omit")) { |
| ies[lengthof(ies)] := tr_CbspCellList(cell_list); |
| } |
| if (not istemplatekind(channel_ind, "omit")) { |
| ies[lengthof(ies)] := tr_CbspChannelInd(channel_ind); |
| } |
| return tr_CBSP(CBSP_MSGT_WRITE_REPLACE_COMPL, ies); |
| } |
| |
| |
| function ts_CBSP_REPLACE_CBS_COMPL(uint16_t msg_id, uint16_t new_ser_nr, uint16_t old_ser_nr, |
| template (value) CBSP_IE_NumBcastComplList compl_list, |
| template (omit) BSSMAP_FIELD_CellIdentificationList cell_list, |
| template (value) uint8_t channel_ind) |
| return template (value) CBSP_PDU { |
| var template (value) CBSP_IEs ies := { |
| ts_CbspMsgId(msg_id), |
| ts_NewSerNo(new_ser_nr), |
| ts_OldSerNo(old_ser_nr), |
| ts_CbspNumComplList(compl_list) |
| }; |
| if (not istemplatekind(cell_list, "omit")) { |
| ies[lengthof(ies)] := ts_CbspCellList(valueof(cell_list)); |
| } |
| ies[lengthof(ies)] := ts_CbspChannelInd(channel_ind); |
| return ts_CBSP(CBSP_MSGT_WRITE_REPLACE_COMPL, ies); |
| } |
| function tr_CBSP_REPLACE_CBS_COMPL(template uint16_t msg_id, template uint16_t new_ser_nr, |
| template uint16_t old_ser_nr, |
| template CBSP_IE_NumBcastComplList compl_list, |
| template BSSMAP_FIELD_CellIdentificationList cell_list, |
| template uint8_t channel_ind) |
| return template CBSP_PDU { |
| var template CBSP_IEs ies := { |
| tr_CbspMsgId(msg_id), |
| tr_NewSerNo(new_ser_nr), |
| tr_OldSerNo(old_ser_nr), |
| tr_CbspNumComplList(compl_list) |
| }; |
| if (istemplatekind(cell_list, "*")) { |
| testcase.stop("TITAN > 6.5.0 doesn't support this"); |
| //ies[lengthof(ies)] := tr_CbspCellList ifpresent; |
| } else if (istemplatekind(cell_list, "?")) { |
| ies[lengthof(ies)] := tr_CbspCellList(?); |
| } else if (not istemplatekind(cell_list, "omit")) { |
| ies[lengthof(ies)] := tr_CbspCellList(cell_list); |
| } |
| if (not istemplatekind(channel_ind, "omit")) { |
| ies[lengthof(ies)] := tr_CbspChannelInd(channel_ind); |
| } |
| return tr_CBSP(CBSP_MSGT_WRITE_REPLACE_COMPL, ies); |
| } |
| |
| |
| /* 8.1.3.3 WRITE-REPLACE FAILURE */ |
| function ts_CBSP_WRITE_CBS_FAIL(uint16_t msg_id, uint16_t new_ser_nr, |
| template (value) CBSP_FailureListItems fail_list, |
| template (omit) CBSP_IE_NumBcastComplList compl_list, |
| template (omit) BSSMAP_FIELD_CellIdentificationList cell_list, |
| template (value) uint8_t channel_ind) |
| return template (value) CBSP_PDU { |
| var template (value) CBSP_IEs ies := { |
| ts_CbspMsgId(msg_id), |
| ts_NewSerNo(new_ser_nr), |
| ts_CbspFailList(fail_list) |
| }; |
| if (not istemplatekind(compl_list, "omit")) { |
| ies[lengthof(ies)] := ts_CbspNumComplList(valueof(compl_list)); |
| } |
| if (not istemplatekind(cell_list, "omit")) { |
| ies[lengthof(ies)] := ts_CbspCellList(valueof(cell_list)); |
| } |
| ies[lengthof(ies)] := ts_CbspChannelInd(channel_ind); |
| return ts_CBSP(CBSP_MSGT_WRITE_REPLACE_FAIL, ies); |
| } |
| function tr_CBSP_WRITE_CBS_FAIL(template uint16_t msg_id, template uint16_t new_ser_nr, |
| template CBSP_FailureListItems fail_list, |
| template CBSP_IE_NumBcastComplList compl_list, |
| template BSSMAP_FIELD_CellIdentificationList cell_list, |
| template uint8_t channel_ind) |
| return template CBSP_PDU { |
| var template CBSP_IEs ies := { |
| tr_CbspMsgId(msg_id), |
| tr_NewSerNo(new_ser_nr), |
| tr_CbspFailList(fail_list) |
| }; |
| if (istemplatekind(compl_list, "*")) { |
| //ies[lengthof(ies)] := tr_CbspNumComplList ifpresent; |
| } else if (istemplatekind(compl_list, "?")) { |
| ies[lengthof(ies)] := tr_CbspNumComplList(?); |
| } else if (not istemplatekind(compl_list, "omit")) { |
| ies[lengthof(ies)] := tr_CbspNumComplList(compl_list); |
| } |
| if (istemplatekind(cell_list, "*")) { |
| testcase.stop("TITAN > 6.5.0 doesn't support this"); |
| //ies[lengthof(ies)] := tr_CbspCellList ifpresent; |
| } else if (istemplatekind(cell_list, "?")) { |
| ies[lengthof(ies)] := tr_CbspCellList(?); |
| } else if (not istemplatekind(cell_list, "omit")) { |
| ies[lengthof(ies)] := tr_CbspCellList(cell_list); |
| } |
| if (not istemplatekind(channel_ind, "omit")) { |
| ies[lengthof(ies)] := ts_CbspChannelInd(channel_ind); |
| } |
| return tr_CBSP(CBSP_MSGT_WRITE_REPLACE_FAIL, ies); |
| } |
| |
| |
| function ts_CBSP_REPLACE_CBS_FAIL(uint16_t msg_id, uint16_t new_ser_nr, uint16_t old_ser_nr, |
| template (value) CBSP_FailureListItems fail_list, |
| template (omit) CBSP_IE_NumBcastComplList compl_list, |
| template (omit) BSSMAP_FIELD_CellIdentificationList cell_list, |
| template (value) uint8_t channel_ind) |
| return template (value) CBSP_PDU { |
| var template (value) CBSP_IEs ies := { |
| ts_CbspMsgId(msg_id), |
| ts_NewSerNo(new_ser_nr), |
| ts_OldSerNo(old_ser_nr), |
| ts_CbspFailList(fail_list) |
| }; |
| if (not istemplatekind(compl_list, "omit")) { |
| ies[lengthof(ies)] := ts_CbspNumComplList(valueof(compl_list)); |
| } |
| if (not istemplatekind(cell_list, "omit")) { |
| ies[lengthof(ies)] := ts_CbspCellList(valueof(cell_list)); |
| } |
| ies[lengthof(ies)] := ts_CbspChannelInd(channel_ind); |
| return ts_CBSP(CBSP_MSGT_WRITE_REPLACE_FAIL, ies); |
| } |
| function tr_CBSP_REPLACE_CBS_FAIL(template uint16_t msg_id, template uint16_t new_ser_nr, |
| template uint16_t old_ser_nr, |
| template CBSP_FailureListItems fail_list, |
| template CBSP_IE_NumBcastComplList compl_list, |
| template BSSMAP_FIELD_CellIdentificationList cell_list, |
| template uint8_t channel_ind) |
| return template CBSP_PDU { |
| var template CBSP_IEs ies := { |
| tr_CbspMsgId(msg_id), |
| tr_NewSerNo(new_ser_nr), |
| tr_OldSerNo(old_ser_nr), |
| tr_CbspFailList(fail_list) |
| }; |
| if (istemplatekind(compl_list, "*")) { |
| //ies[lengthof(ies)] := tr_CbspCellList ifpresent; |
| } else if (istemplatekind(compl_list, "?")) { |
| ies[lengthof(ies)] := tr_CbspNumComplList(?); |
| } else if (not istemplatekind(compl_list, "omit")) { |
| ies[lengthof(ies)] := tr_CbspNumComplList(compl_list); |
| } |
| if (istemplatekind(cell_list, "*")) { |
| //ies[lengthof(ies)] := tr_CbspCellList ifpresent; |
| } else if (istemplatekind(cell_list, "?")) { |
| ies[lengthof(ies)] := tr_CbspCellList(?); |
| } else if (not istemplatekind(cell_list, "omit")) { |
| ies[lengthof(ies)] := tr_CbspCellList(cell_list); |
| } |
| ies[lengthof(ies)] := tr_CbspChannelInd(channel_ind); |
| return tr_CBSP(CBSP_MSGT_WRITE_REPLACE_FAIL, ies); |
| } |
| |
| /* 8.1.3.4 KILL */ |
| template (value) CBSP_PDU ts_CBSP_KILL(template (value) uint16_t msg_id, |
| template (value) uint16_t old_ser_nr, |
| template (value) BSSMAP_FIELD_CellIdentificationList cell_list, |
| template (omit) uint8_t channel_ind) := |
| ts_CBSP(CBSP_MSGT_KILL, { |
| ts_CbspMsgId(msg_id), |
| ts_OldSerNo(old_ser_nr), |
| ts_CbspCellList(cell_list), |
| ts_CbspChannelInd(channel_ind)}); |
| template CBSP_PDU tr_CBSP_KILL(template uint16_t msg_id := ?, template uint16_t old_ser_nr := ?, |
| template BSSMAP_FIELD_CellIdentificationList cell_list := ?, |
| template uint8_t channel_ind := ?) := |
| tr_CBSP(CBSP_MSGT_KILL, { |
| tr_CbspMsgId(msg_id), |
| tr_OldSerNo(old_ser_nr), |
| tr_CbspCellList(cell_list), |
| tr_CbspChannelInd(channel_ind) }); |
| |
| /* 8.1.3.5 KILL COMPLETE */ |
| function ts_CBSP_KILL_COMPL(template (value) uint16_t msg_id, template (value) uint16_t old_ser_nr, |
| template (omit) CBSP_IE_NumBcastComplList compl_list, |
| template (omit) BSSMAP_FIELD_CellIdentificationList cell_list, |
| template (omit) uint8_t channel_ind) |
| return template (value) CBSP_PDU { |
| var template (value) CBSP_IEs ies := { |
| ts_CbspMsgId(msg_id), |
| ts_OldSerNo(old_ser_nr) |
| }; |
| if (not istemplatekind(compl_list, "omit")) { |
| ies[lengthof(ies)] := ts_CbspNumComplList(valueof(compl_list)); |
| } |
| if (not istemplatekind(cell_list, "omit")) { |
| ies[lengthof(ies)] := ts_CbspCellList(valueof(cell_list)); |
| } |
| if (not istemplatekind(channel_ind, "omit")) { |
| ies[lengthof(ies)] := ts_CbspChannelInd(channel_ind); |
| } |
| return ts_CBSP(CBSP_MSGT_KILL_COMPL, ies); |
| } |
| function tr_CBSP_KILL_COMPL(template uint16_t msg_id := ?, template uint16_t old_ser_nr := ?, |
| template CBSP_IE_NumBcastComplList compl_list := ?, |
| template BSSMAP_FIELD_CellIdentificationList cell_list := ?, |
| template uint8_t channel_ind) |
| return template CBSP_PDU { |
| var template CBSP_IEs ies := { |
| tr_CbspMsgId(msg_id), |
| tr_OldSerNo(old_ser_nr) |
| }; |
| /* As soon as adding a '*' IE item, lengthof() no longer works on the ies record. So keep track of the |
| * next index to use separately. */ |
| var integer next_idx := lengthof(ies); |
| if (istemplatekind(compl_list, "*")) { |
| ies[next_idx] := *; |
| next_idx := next_idx + 1; |
| } else if (not istemplatekind(compl_list, "omit")) { |
| ies[next_idx] := tr_CbspNumComplList(compl_list); |
| next_idx := next_idx + 1; |
| } |
| if (istemplatekind(cell_list, "*")) { |
| ies[next_idx] := *; |
| next_idx := next_idx + 1; |
| } else if (not istemplatekind(cell_list, "omit")) { |
| ies[next_idx] := tr_CbspCellList(cell_list); |
| next_idx := next_idx + 1; |
| } |
| if (istemplatekind(channel_ind, "*")) { |
| ies[next_idx] := *; |
| next_idx := next_idx + 1; |
| } else if (not istemplatekind(channel_ind, "omit")) { |
| ies[next_idx] := tr_CbspChannelInd(channel_ind); |
| next_idx := next_idx + 1; |
| } |
| return tr_CBSP(CBSP_MSGT_KILL_COMPL, ies); |
| } |
| |
| /* 8.1.3.6 KILL FAILURE */ |
| function ts_CBSP_KILL_FAIL(template (value) uint16_t msg_id, template (value) uint16_t old_ser_nr, |
| template (value) CBSP_FailureListItems fail_list, |
| template (omit) CBSP_IE_NumBcastComplList compl_list, |
| template (omit) BSSMAP_FIELD_CellIdentificationList cell_list, |
| template (omit) uint8_t channel_ind) |
| return template (value) CBSP_PDU { |
| var template (value) CBSP_IEs ies := { |
| ts_CbspMsgId(msg_id), |
| ts_OldSerNo(old_ser_nr), |
| ts_CbspFailList(fail_list) |
| }; |
| if (not istemplatekind(compl_list, "omit")) { |
| ies[lengthof(ies)] := ts_CbspNumComplList(valueof(compl_list)); |
| } |
| if (not istemplatekind(cell_list, "omit")) { |
| ies[lengthof(ies)] := ts_CbspCellList(valueof(cell_list)); |
| } |
| if (not istemplatekind(channel_ind, "omit")) { |
| ies[lengthof(ies)] := ts_CbspChannelInd(channel_ind); |
| } |
| return ts_CBSP(CBSP_MSGT_KILL_FAIL, ies); |
| } |
| function tr_CBSP_KILL_FAIL(template uint16_t msg_id := ?, template uint16_t old_ser_nr := ?, |
| template CBSP_FailureListItems fail_list := ?, |
| template CBSP_IE_NumBcastComplList compl_list := *, |
| template BSSMAP_FIELD_CellIdentificationList cell_list := *, |
| template uint8_t channel_ind := *) |
| return template CBSP_PDU { |
| var template CBSP_IEs ies := { |
| tr_CbspMsgId(msg_id), |
| tr_OldSerNo(old_ser_nr), |
| tr_CbspFailList(fail_list) |
| }; |
| if (istemplatekind(compl_list, "*")) { |
| //ies[lengthof(ies)] := tr_CbspNumComplList ifpresent; |
| } else if (not istemplatekind(compl_list, "omit")) { |
| ies[lengthof(ies)] := tr_CbspNumComplList(compl_list); |
| } |
| if (istemplatekind(cell_list, "*")) { |
| //ies[lengthof(ies)] := tr_CbspCellList ifpresent; |
| } else if (not istemplatekind(cell_list, "omit")) { |
| ies[lengthof(ies)] := tr_CbspCellList(cell_list); |
| } |
| if (istemplatekind(channel_ind, "*")) { |
| testcase.stop("TITAN > 6.5.0 doesn't support this"); |
| //ies[lengthof(ies)] := tr_CbspChannelInd(?) ifpresent; |
| } else if (not istemplatekind(channel_ind, "omit")) { |
| ies[lengthof(ies)] := tr_CbspChannelInd(channel_ind); |
| } |
| return tr_CBSP(CBSP_MSGT_KILL_FAIL, ies); |
| } |
| |
| |
| /* 8.1.3.16 RESET */ |
| template (value) CBSP_PDU ts_CBSP_RESET(template (value) BSSMAP_FIELD_CellIdentificationList cell_list) := |
| ts_CBSP(CBSP_MSGT_RESET, { |
| ts_CbspCellList(cell_list) |
| }); |
| template CBSP_PDU tr_CBSP_RESET(template BSSMAP_FIELD_CellIdentificationList cell_list := ?) := |
| tr_CBSP(CBSP_MSGT_RESET, { |
| tr_CbspCellList(cell_list) |
| }); |
| |
| /* 8.1.3.17 RESET COMPLETE */ |
| template (value) CBSP_PDU ts_CBSP_RESET_COMPL(template (value) BSSMAP_FIELD_CellIdentificationList cell_list) := |
| ts_CBSP(CBSP_MSGT_RESET_COMPL, { |
| ts_CbspCellList(cell_list) |
| }); |
| template CBSP_PDU tr_CBSP_RESET_COMPL(template BSSMAP_FIELD_CellIdentificationList cell_list := ?) := |
| tr_CBSP(CBSP_MSGT_RESET_COMPL, { |
| tr_CbspCellList(cell_list) |
| }); |
| |
| /* 8.1.3.18 RESET FAILURE */ |
| template (value) CBSP_PDU ts_CBSP_RESET_FAIL(template (value) BSSMAP_FIELD_CellIdentificationList cell_list, |
| template (value) CBSP_FailureListItems fail_items) := |
| ts_CBSP(CBSP_MSGT_RESET_FAIL, { |
| ts_CbspFailList(fail_items), |
| ts_CbspCellList(cell_list) |
| }); |
| |
| template CBSP_PDU tr_CBSP_RESET_FAIL(template BSSMAP_FIELD_CellIdentificationList cell_list, |
| template CBSP_FailureListItems fail_items) := |
| tr_CBSP(CBSP_MSGT_RESET_FAIL, { |
| tr_CbspFailList(fail_items), |
| tr_CbspCellList(cell_list) |
| }); |
| |
| /* 8.1.3.18a KEEP-ALIVE */ |
| template (value) CBSP_PDU ts_CBSP_KEEP_ALIVE(uint8_t rep_period) := |
| ts_CBSP(CBSP_MSGT_KEEP_ALIVE, {ts_CbspKARepPeriod(rep_period)}); |
| template CBSP_PDU tr_CBSP_KEEP_ALIVE(template uint8_t rep_period := ?) := |
| tr_CBSP(CBSP_MSGT_KEEP_ALIVE, {tr_CbspKARepPeriod(rep_period)}); |
| |
| /* 8.1.3.18b KEEP-ALIVE COMPLETE */ |
| template (value) CBSP_PDU ts_CBSP_KEEP_ALIVE_COMPL := |
| ts_CBSP(CBSP_MSGT_KEEP_ALIVE_COMPL, {}); |
| template CBSP_PDU tr_CBSP_KEEP_ALIVE_COMPL := |
| tr_CBSP(CBSP_MSGT_KEEP_ALIVE_COMPL, {}); |
| |
| /* 8.1.3.19 RESTART */ |
| template (value) CBSP_PDU ts_CBSP_RESTART(template (value) BSSMAP_FIELD_CellIdentificationList cell_list, |
| template (value) CBSP_BcastMsgType msg_type, |
| template (value) CBSP_RecoveryInd rec_ind) := |
| ts_CBSP(CBSP_MSGT_RESTART, { |
| ts_CbspCellList(cell_list), |
| ts_CbspBcastMsgType(msg_type), |
| ts_CbspRecoveryInd(rec_ind) |
| }); |
| template CBSP_PDU tr_CBSP_RESTART(template BSSMAP_FIELD_CellIdentificationList cell_list := ?, |
| template CBSP_BcastMsgType msg_type := ?, |
| template CBSP_RecoveryInd rec_ind := ?) := |
| tr_CBSP(CBSP_MSGT_RESTART, { |
| tr_CbspCellList(cell_list), |
| tr_CbspBcastMsgType(msg_type), |
| tr_CbspRecoveryInd(rec_ind) |
| }); |
| |
| /* 8.1.3.20 FAILURE */ |
| template (value) CBSP_PDU ts_CBSP_FAILURE(template (value) CBSP_FailureListItems fail_list, |
| template (value) CBSP_BcastMsgType msg_type) := |
| ts_CBSP(CBSP_MSGT_FAILURE, { |
| ts_CbspFailList(fail_list), |
| ts_CbspBcastMsgType(msg_type) |
| }); |
| template CBSP_PDU tr_CBSP_FAILURE(template CBSP_FailureListItems fail_list := ?, |
| template CBSP_BcastMsgType msg_type := ?) := |
| tr_CBSP(CBSP_MSGT_FAILURE, { |
| tr_CbspFailList(fail_list), |
| tr_CbspBcastMsgType(msg_type) |
| }); |
| |
| /* 8.1.3.21 ERROR INDICATION */ |
| template (value) CBSP_PDU ts_CBSP_ERROR_IND(CBSP_Cause cause) := |
| ts_CBSP(CBSP_MSGT_ERROR_IND, {ts_CbspCause(cause)}); |
| template CBSP_PDU tr_CBSP_ERROR_IND(template CBSP_Cause cause) := |
| tr_CBSP(CBSP_MSGT_ERROR_IND, {tr_CbspCause(cause), *}); |
| |
| |
| function f_cbsp_find_ie(CBSP_PDU msg, CBSP_IEI iei, out CBSP_IE ret) return boolean { |
| for (var integer i := 0; i < sizeof(msg.ies); i := i+1) { |
| if (msg.ies[i].iei == iei) { |
| ret := msg.ies[i]; |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| |
| } |