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(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(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(compl_list);
	}
	if (not istemplatekind(cell_list, "omit")) {
		ies[lengthof(ies)] := ts_CbspCellList(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(compl_list);
	}
	if (not istemplatekind(cell_list, "omit")) {
		ies[lengthof(ies)] := ts_CbspCellList(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(compl_list);
	}
	if (not istemplatekind(cell_list, "omit")) {
		ies[lengthof(ies)] := ts_CbspCellList(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)
	};
	if (istemplatekind(compl_list, "*")) {
		ies[lengthof(ies)] := *;
	} else if (not istemplatekind(compl_list, "omit")) {
		ies[lengthof(ies)] := tr_CbspNumComplList(compl_list);
	}
	if (istemplatekind(cell_list, "*")) {
		ies[lengthof(ies)] := *;
	} else if (not istemplatekind(cell_list, "omit")) {
		ies[lengthof(ies)] := tr_CbspCellList(cell_list);
	}
	if (istemplatekind(channel_ind, "*")) {
		ies[lengthof(ies)] := *;
	} else if (not istemplatekind(channel_ind, "omit")) {
		ies[lengthof(ies)] := tr_CbspChannelInd(channel_ind);
	}
	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(compl_list);
	}
	if (not istemplatekind(cell_list, "omit")) {
		ies[lengthof(ies)] := ts_CbspCellList(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;
}


}
