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 (present) CBSP_FailureListItem CBSP_FailureListItem_CGI(
				template (present) BSSMAP_FIELD_CellIdentification_CGI cgi := ?,
				template (present) CBSP_Cause cause := ?) :=
{
	spare1_4 := '0000'B,
	cell_id_discr := '0000'B,
	cell_id := {
		cI_CGI := cgi
	},
	cause := cause
};

template (present) CBSP_FailureListItem CBSP_FailureListItem_LAC_CI(
				template (present) BSSMAP_FIELD_CellIdentification_LAC_CI lac_ci := ?,
				template (present) CBSP_Cause cause := ?) :=
{
	spare1_4 := '0000'B,
	cell_id_discr := '0001'B,
	cell_id := {
		cI_LAC_CI := lac_ci
	},
	cause := cause
};

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) 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 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 ts_CBSP_WRITE_EMERG_COMPL(uint16_t msg_id, uint16_t new_ser_nr,
				 template (omit) BSSMAP_FIELD_CellIdentificationList cell_list)
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));
	}
	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 (present) 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);
	}
	ies[lengthof(ies)] := tr_CbspChannelInd(channel_ind);
	return tr_CBSP(CBSP_MSGT_WRITE_REPLACE_COMPL, ies);
}
function tr_CBSP_WRITE_EMERG_COMPL(template uint16_t msg_id, template uint16_t new_ser_nr,
				 template BSSMAP_FIELD_CellIdentificationList cell_list)
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);
	}
	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 ts_CBSP_REPLACE_EMERG_COMPL(uint16_t msg_id, uint16_t new_ser_nr, uint16_t old_ser_nr,
				   template (omit) BSSMAP_FIELD_CellIdentificationList cell_list)
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)
	};
	if (not istemplatekind(cell_list, "omit")) {
		ies[lengthof(ies)] := ts_CbspCellList(valueof(cell_list));
	}
	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 (present) 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)
	};
	if (istemplatekind(compl_list, "*")) {
		testcase.stop("TITAN > 6.5.0 doesn't support this");
		//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)] := tr_CbspChannelInd(channel_ind);
	}
	return tr_CBSP(CBSP_MSGT_WRITE_REPLACE_COMPL, ies);
}
function tr_CBSP_REPLACE_EMERG_COMPL(template uint16_t msg_id, template uint16_t new_ser_nr,
				   template uint16_t old_ser_nr,
				   template BSSMAP_FIELD_CellIdentificationList cell_list)
return template CBSP_PDU {
	var template CBSP_IEs ies := {
		tr_CbspMsgId(msg_id),
		tr_NewSerNo(new_ser_nr),
		tr_OldSerNo(old_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);
	}
	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 (present) 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);
	}
	ies[lengthof(ies)] := ts_CbspChannelInd(channel_ind);
	return tr_CBSP(CBSP_MSGT_WRITE_REPLACE_FAIL, ies);
}
function tr_CBSP_WRITE_EMERG_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)
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);
	}
	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 (present) 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);
}
function tr_CBSP_REPLACE_EMERG_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)
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);
	}
	return tr_CBSP(CBSP_MSGT_WRITE_REPLACE_FAIL, ies);
}

/* 8.1.3.4 KILL */
function 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)
return template (value) CBSP_PDU {
	var template (value) CBSP_IEs ies := {
		ts_CbspMsgId(msg_id),
		ts_OldSerNo(old_ser_nr),
		ts_CbspCellList(cell_list)
	};
	if (not istemplatekind(channel_ind, "omit")) {
		ies[lengthof(ies)] := ts_CbspChannelInd(channel_ind);
	}
	return ts_CBSP(CBSP_MSGT_KILL, ies);
}
function 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 := ?)
return template (present) CBSP_PDU {
	var template CBSP_IEs ies := {
		tr_CbspMsgId(msg_id),
		tr_OldSerNo(old_ser_nr),
		tr_CbspCellList(cell_list)
	};
	if (not istemplatekind(channel_ind, "omit")) {
		ies[lengthof(ies)] := tr_CbspChannelInd(channel_ind);
	}
	return tr_CBSP(CBSP_MSGT_KILL, ies);
}

/* 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.10 MESSAGE STATUS QUERY */
template (value) CBSP_PDU
ts_CBSP_MSG_STATUS_QUERY(template (value) uint16_t msg_id,
			 template (value) uint16_t old_ser_nr,
			 template (value) BSSMAP_FIELD_CellIdentificationList cell_list,
			 template (value) uint8_t channel_ind) :=
	ts_CBSP(CBSP_MSGT_MSG_STATUS_QUERY, {
			ts_CbspMsgId(msg_id),
			ts_OldSerNo(old_ser_nr),
			ts_CbspCellList(cell_list),
			ts_CbspChannelInd(channel_ind)});
template (present) CBSP_PDU
tr_CBSP_MSG_STATUS_QUERY(template (present) uint16_t msg_id := ?,
			 template (present) uint16_t old_ser_nr := ?,
			 template (present) BSSMAP_FIELD_CellIdentificationList cell_list := ?,
			 template (present) uint8_t channel_ind := ?) :=
	ts_CBSP(CBSP_MSGT_MSG_STATUS_QUERY, {
			ts_CbspMsgId(msg_id),
			ts_OldSerNo(old_ser_nr),
			ts_CbspCellList(cell_list),
			ts_CbspChannelInd(channel_ind)});

/* 8.1.3.11 MESSAGE STATUS QUERY COMPLETE */
template (value) CBSP_PDU
ts_CBSP_MSG_STATUS_QUERY_COMPL(template (value) uint16_t msg_id, template (value) uint16_t old_ser_nr,
			       template (value) CBSP_IE_NumBcastComplList compl_list,
			       template (value) uint8_t channel_ind) :=
	ts_CBSP(CBSP_MSGT_MSG_STATUS_QUERY_COMPL, {
		ts_CbspMsgId(msg_id),
		ts_OldSerNo(old_ser_nr),
		ts_CbspNumComplList(valueof(compl_list)),
		ts_CbspChannelInd(channel_ind)});
template (present) CBSP_PDU
tr_CBSP_MSG_STATUS_QUERY_COMPL(template (present) uint16_t msg_id, template (present) uint16_t old_ser_nr,
				template (present) CBSP_IE_NumBcastComplList compl_list,
				template (present) uint8_t channel_ind) :=
	tr_CBSP(CBSP_MSGT_MSG_STATUS_QUERY_COMPL, {
		tr_CbspMsgId(msg_id),
		tr_OldSerNo(old_ser_nr),
		tr_CbspNumComplList(compl_list),
		tr_CbspChannelInd(channel_ind)});

/* 8.1.3.12 MESSAGE STATUS QUERY FAILURE */
function ts_CBSP_MSG_STATUS_QUERY_FAIL(template (value) uint16_t msg_id, template (value) uint16_t old_ser_nr,
				       template (value) CBSP_FailureListItems fail_list,
				       template (value) uint8_t channel_ind,
				       template (omit) CBSP_IE_NumBcastComplList compl_list)
return template (value) CBSP_PDU {
	var template (value) CBSP_IEs ies := {
		ts_CbspMsgId(msg_id),
		ts_OldSerNo(old_ser_nr),
		ts_CbspFailList(fail_list),
		ts_CbspChannelInd(channel_ind)
	};
	if (not istemplatekind(compl_list, "omit")) {
		ies[lengthof(ies)] := ts_CbspNumComplList(valueof(compl_list));
	}
	return ts_CBSP(CBSP_MSGT_MSG_STATUS_QUERY_FAIL, ies);
}
function tr_CBSP_MSG_STATUS_QUERY_FAIL(template (present) uint16_t msg_id := ?, template (present) uint16_t old_ser_nr := ?,
				       template (present) CBSP_FailureListItems fail_list := ?,
				       template (present) uint8_t channel_ind := ?,
				       template CBSP_IE_NumBcastComplList compl_list := *)
return template (present) CBSP_PDU {
	var template (present) CBSP_IEs ies := {
		tr_CbspMsgId(msg_id),
		tr_OldSerNo(old_ser_nr),
		tr_CbspFailList(fail_list),
		tr_CbspChannelInd(channel_ind)
	};
	if (istemplatekind(compl_list, "*")) {
		testcase.stop("TITAN > 6.5.0 doesn't support this");
		//ies[lengthof(ies)] := ts_CbspNumComplList(valueof(compl_list));
	} else if (not istemplatekind(compl_list, "omit")) {
		ies[lengthof(ies)] := tr_CbspNumComplList(compl_list);
	}
	return tr_CBSP(CBSP_MSGT_MSG_STATUS_QUERY_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;
}


}
