/* SABP Templates in TTCN-3
 * (C) 2019 Harald Welte <laforge@gnumonks.org>
 * All rights reserved.
 *
 * Released under the terms of GNU General Public License, Version 2 or
 * (at your option) any later version.
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

module SABP_Templates {

import from General_Types all;

import from SABP_IEs all;
import from SABP_CommonDataTypes all;
import from SABP_Constants all;
import from SABP_Containers all;
import from SABP_PDU_Contents all;
import from SABP_PDU_Descriptions all;

template (value) Service_Area_Identifier ts_SabpSai(template (value) OCT3 plmn_id,
						    template (value) OCT2 lac,
						    template (value) OCT2 sac) := {
	pLMNidentity := plmn_id,
	lac := lac,
	sac := sac
}

/* 9.1.3 WRITE REPLACE */
template (value) SABP_PDU
ts_SABP_Write(template (value) BIT16 msg_id, template (value) BIT16 ser_nr,
	      template (value) Service_Areas_List sa_list, template (value) integer rep_per,
	      template (value) integer num_bcast, template (value) BIT8 dcs,
	      template (value) bitstring content) := {
	initiatingMessage := {
		procedureCode := id_Write_Replace,
		criticality := reject,
		value_ := {
			Write_Replace := {
				protocolIEs := {
					{
						id := SABP_Constants.id_Message_Identifier,
						criticality := reject,
						value_ := { Message_Identifier := msg_id }
					}, {
						id := SABP_Constants.id_New_Serial_Number,
						criticality := reject,
						value_ := { New_Serial_Number := ser_nr }
					}, {
						/* Optional: Old Serial Number */
						id := SABP_Constants.id_Service_Areas_List,
						criticality := reject,
						value_ := { Service_Areas_List := sa_list }
					}, {
						/* Optional: Category */
						id := SABP_Constants.id_Repetition_Period,
						criticality := reject,
						value_ := { Repetition_Period := rep_per }
					}, {
						id := SABP_Constants.id_Number_of_Broadcasts_Requested,
						criticality := reject,
						value_ := { Number_of_Broadcasts_Requested := num_bcast }
					}, {
						id := SABP_Constants.id_Data_Coding_Scheme,
						criticality := reject,
						value_ := { Data_Coding_Scheme := dcs }
					}, {
						id := SABP_Constants.id_Broadcast_Message_Content,
						criticality := reject,
						value_ := { Broadcast_Message_Content := content }
					}
				},
				protocolExtensions := omit
			}
		}
	}
}
template (present) SABP_PDU
tr_SABP_Write(template (present) BIT16 msg_id, template (present) BIT16 ser_nr,
	      template (present) Service_Areas_List sa_list := ?, template (present) integer rep_per := ?,
	      template (present) integer num_bcast := ?, template (present) BIT8 dcs := ?,
	      template (present) bitstring content := ?) := {
	initiatingMessage := {
		procedureCode := id_Write_Replace,
		criticality := reject,
		value_ := {
			Write_Replace := {
				protocolIEs := {
					{
						id := SABP_Constants.id_Message_Identifier,
						criticality := reject,
						value_ := { Message_Identifier := msg_id }
					}, {
						id := SABP_Constants.id_New_Serial_Number,
						criticality := reject,
						value_ := { New_Serial_Number := ser_nr }
					}, *, /* Optional: Old Serial Number */
					{
						id := SABP_Constants.id_Service_Areas_List,
						criticality := reject,
						value_ := { Service_Areas_List := sa_list }
					}, * /* Optional: Category */,
					{
						id := SABP_Constants.id_Repetition_Period,
						criticality := reject,
						value_ := { Repetition_Period := rep_per }
					}, {
						id := SABP_Constants.id_Number_of_Broadcasts_Requested,
						criticality := reject,
						value_ := { Number_of_Broadcasts_Requested := num_bcast }
					}, {
						id := SABP_Constants.id_Data_Coding_Scheme,
						criticality := reject,
						value_ := { Data_Coding_Scheme := dcs }
					}, {
						id := SABP_Constants.id_Broadcast_Message_Content,
						criticality := reject,
						value_ := { Broadcast_Message_Content := content }
					}
				},
				protocolExtensions := *
			}
		}
	}
}

/* 9.1.4 WRITE REPLACE COMPLETE */
template (value) SABP_PDU
ts_SABPWriteCompl(template (value) BIT16 msg_id, template (value) BIT16 ser_nr) := {
	successfulOutcome := {
		procedureCode := id_Write_Replace,
		criticality := reject,
		value_ := {
			Write_Replace_Complete := {
				protocolIEs := {
					{
						id := SABP_Constants.id_Message_Identifier,
						criticality := reject,
						value_ := { Message_Identifier := msg_id }
					}, {
						id := SABP_Constants.id_New_Serial_Number,
						criticality := reject,
						value_ := { New_Serial_Number := ser_nr }
					}
					/* Optional: Number of Broadcasts Completed List */
					/* Optional: Criticality-Diagnostics */
				},
				protocolExtensions := omit
			}
		}
	}
}
template (present) SABP_PDU
tr_SABP_WriteCompl(template (present) BIT16 msg_id, template (present) BIT16 ser_nr) := {
	successfulOutcome := {
		procedureCode := id_Write_Replace,
		criticality := reject,
		value_ := {
			Write_Replace_Complete := {
				protocolIEs := {
					{
						id := SABP_Constants.id_Message_Identifier,
						criticality := reject,
						value_ := { Message_Identifier := msg_id }
					}, {
						id := SABP_Constants.id_New_Serial_Number,
						criticality := reject,
						value_ := { New_Serial_Number := ser_nr }
					}, *
					/* Optional: Number of Broadcasts Completed List */
					/* Optional: Criticality-Diagnostics */
				},
				protocolExtensions := *
			}
		}
	}
}

/* 9.1.5 WRITE REPLACE FAILURE */
template (value) SABP_PDU
ts_SABP_WriteFail(template (value) BIT16 msg_id, template (value) BIT16 ser_nr,
		  template (value) Failure_List fail_list) := {
	unsuccessfulOutcome := {
		procedureCode := id_Write_Replace,
		criticality := reject,
		value_ := {
			Write_Replace_Failure := {
				protocolIEs := {
					{
						id := SABP_Constants.id_Message_Identifier,
						criticality := reject,
						value_ := { Message_Identifier := msg_id }
					}, {
						id := SABP_Constants.id_New_Serial_Number,
						criticality := reject,
						value_ := { New_Serial_Number := ser_nr }
					}, {
						id := SABP_Constants.id_Failure_List,
						criticality := reject,
						value_ := { Failure_List := fail_list }
					}
					/* Optional: Number of Broadcasts Completed List */
					/* Optional: Criticality-Diagnostics */
				},
				protocolExtensions := omit
			}
		}
	}
}
template (present) SABP_PDU
tr_SABP_WriteFail(template (present) BIT16 msg_id, template (present) BIT16 ser_nr,
		  template (present) Failure_List fail_list := ?) := {
	unsuccessfulOutcome := {
		procedureCode := id_Write_Replace,
		criticality := reject,
		value_ := {
			Write_Replace_Failure := {
				protocolIEs := {
					{
						id := SABP_Constants.id_Message_Identifier,
						criticality := reject,
						value_ := { Message_Identifier := msg_id }
					}, {
						id := SABP_Constants.id_New_Serial_Number,
						criticality := reject,
						value_ := { New_Serial_Number := ser_nr }
					}, {
						id := SABP_Constants.id_Failure_List,
						criticality := reject,
						value_ := { Failure_List := fail_list }
					}, *
					/* Optional: Number of Broadcasts Completed List */
					/* Optional: Criticality-Diagnostics */
				},
				protocolExtensions := *
			}
		}
	}
}

/* 9.1.6 KILL */
template (value) SABP_PDU
ts_SABP_Kill(template (value) BIT16 msg_id, template (value) BIT16 ser_nr,
	     template (value) Service_Areas_List sa_list) := {
	initiatingMessage := {
		procedureCode := id_Kill,
		criticality := reject,
		value_ := {
			kill_ := {
				protocolIEs := {
					{
						id := SABP_Constants.id_Message_Identifier,
						criticality := reject,
						value_ := { Message_Identifier := msg_id }
					}, {
						id := SABP_Constants.id_Old_Serial_Number,
						criticality := reject,
						value_ := { Old_Serial_Number := ser_nr }
					}, {
						id := SABP_Constants.id_Service_Areas_List,
						criticality := reject,
						value_ := { Service_Areas_List := sa_list }
					}
				},
				protocolExtensions := omit
			}
		}
	}
}
template (present) SABP_PDU
tr_SABP_Kill(template (present) BIT16 msg_id, template (present) BIT16 ser_nr,
	     template (present) Service_Areas_List sa_list) := {
	initiatingMessage := {
		procedureCode := id_Kill,
		criticality := reject,
		value_ := {
			kill_ := {
				protocolIEs := {
					{
						id := SABP_Constants.id_Message_Identifier,
						criticality := reject,
						value_ := { Message_Identifier := msg_id }
					}, {
						id := SABP_Constants.id_Old_Serial_Number,
						criticality := reject,
						value_ := { Old_Serial_Number := ser_nr }
					}, {
						id := SABP_Constants.id_Service_Areas_List,
						criticality := reject,
						value_ := { Service_Areas_List := sa_list }
					}
				},
				protocolExtensions := *
			}
		}
	}
}

/* 9.1.7 KILL COMPLETE */
template (value) SABP_PDU
ts_SABP_KillCompl(template (value) BIT16 msg_id, template (value) BIT16 ser_nr,
		  template (value) Number_of_Broadcasts_Completed_List num_bcast_compl) := {
	successfulOutcome := {
		procedureCode := id_Kill,
		criticality := reject,
		value_ := {
			Kill_Complete := {
				protocolIEs := {
					{
						id := SABP_Constants.id_Message_Identifier,
						criticality := reject,
						value_ := { Message_Identifier := msg_id }
					}, {
						id := SABP_Constants.id_Old_Serial_Number,
						criticality := reject,
						value_ := { Old_Serial_Number := ser_nr }
					}, {
						id := SABP_Constants.id_Number_of_Broadcasts_Completed_List,
						criticality := reject,
						value_ := { Number_of_Broadcasts_Completed_List := num_bcast_compl }
					}
				},
				protocolExtensions := omit
			}
		}
	}
}
template (present) SABP_PDU
tr_SABP_KillCompl(template (present) BIT16 msg_id, template (present) BIT16 ser_nr,
		  template (present) Number_of_Broadcasts_Completed_List num_bcast_compl := ?) := {
	successfulOutcome := {
		procedureCode := id_Kill,
		criticality := reject,
		value_ := {
			Kill_Complete := {
				protocolIEs := {
					{
						id := SABP_Constants.id_Message_Identifier,
						criticality := reject,
						value_ := { Message_Identifier := msg_id }
					}, {
						id := SABP_Constants.id_Old_Serial_Number,
						criticality := reject,
						value_ := { Old_Serial_Number := ser_nr }
					}, {
						id := SABP_Constants.id_Number_of_Broadcasts_Completed_List,
						criticality := reject,
						value_ := { Number_of_Broadcasts_Completed_List := num_bcast_compl }
					}, *
				},
				protocolExtensions := *
			}
		}
	}
}


/* 9.1.7 KILL FAILURE */
template (value) SABP_PDU
ts_SABP_KillFail(template (value) BIT16 msg_id, template (value) BIT16 ser_nr,
		 template (value) Failure_List fail_list) := {
	unsuccessfulOutcome := {
		procedureCode := id_Kill,
		criticality := reject,
		value_ := {
			Kill_Failure := {
				protocolIEs := {
					{
						id := SABP_Constants.id_Message_Identifier,
						criticality := reject,
						value_ := { Message_Identifier := msg_id }
					}, {
						id := SABP_Constants.id_Old_Serial_Number,
						criticality := reject,
						value_ := { Old_Serial_Number := ser_nr }
					}, {
						id := SABP_Constants.id_Failure_List,
						criticality := reject,
						value_ := { Failure_List := fail_list }
					}
					/* Optional: Number-of-Broadcasts-Completed-List */
					/* Optional: Criticality-Diagnostics */
				},
				protocolExtensions := omit
			}
		}
	}
}
template (present) SABP_PDU
tr_SABP_KillFail(template (present) BIT16 msg_id, template (present) BIT16 ser_nr,
		 template (present) Failure_List fail_list := ?) := {
	unsuccessfulOutcome := {
		procedureCode := id_Kill,
		criticality := reject,
		value_ := {
			Kill_Failure := {
				protocolIEs := {
					{
						id := SABP_Constants.id_Message_Identifier,
						criticality := reject,
						value_ := { Message_Identifier := msg_id }
					}, {
						id := SABP_Constants.id_Old_Serial_Number,
						criticality := reject,
						value_ := { Old_Serial_Number := ser_nr }
					}, {
						id := SABP_Constants.id_Failure_List,
						criticality := reject,
						value_ := { Failure_List := fail_list }
					}, *
					/* Optional: Number-of-Broadcasts-Completed-List */
					/* Optional: Criticality-Diagnostics */
				},
				protocolExtensions := *
			}
		}
	}
}

/* TODO: Load Query + Complete + Failure */
/* TODO: Message Status Query + Complete + Failure */

/* 9.1.15 RESET */
template (value) SABP_PDU
ts_SABP_Reset(template (value) Service_Areas_List sa_list) := {
	initiatingMessage := {
		procedureCode := id_Reset,
		criticality := reject,
		value_ := {
			Reset := {
				protocolIEs := {
					{
						id := SABP_Constants.id_Service_Areas_List,
						criticality := reject,
						value_ := { Service_Areas_List := sa_list }
					}
				},
				protocolExtensions := omit
			}
		}
	}
}
template (present) SABP_PDU
tr_SABP_Reset(template (present) Service_Areas_List sa_list) := {
	initiatingMessage := {
		procedureCode := id_Reset,
		criticality := reject,
		value_ := {
			Reset := {
				protocolIEs := {
					{
						id := SABP_Constants.id_Service_Areas_List,
						criticality := reject,
						value_ := { Service_Areas_List := sa_list }
					}
				},
				protocolExtensions := *
			}
		}
	}
}


/* 9.1.16 RESET COMPLETE */
template (value) SABP_PDU
ts_SABP_ResetCompl(template (value) Service_Areas_List sa_list) := {
	successfulOutcome := {
		procedureCode := id_Reset,
		criticality := reject,
		value_ := {
			Reset_Complete := {
				protocolIEs := {
					{
						id := SABP_Constants.id_Service_Areas_List,
						criticality := reject,
						value_ := { Service_Areas_List := sa_list }
					}
				},
				protocolExtensions := omit
			}
		}
	}
}
template (present) SABP_PDU
tr_SABP_ResetCompl(template (present) Service_Areas_List sa_list) := {
	successfulOutcome := {
		procedureCode := id_Reset,
		criticality := reject,
		value_ := {
			Reset_Complete := {
				protocolIEs := {
					{
						id := SABP_Constants.id_Service_Areas_List,
						criticality := reject,
						value_ := { Service_Areas_List := sa_list }
					}, *
				},
				protocolExtensions := *
			}
		}
	}
}

/* 9.1.17 RESET FAILURE */
template (value) SABP_PDU
ts_SABP_ResetFail(template (value) Failure_List f_list) := {
	unsuccessfulOutcome := {
		procedureCode := id_Reset,
		criticality := reject,
		value_ := {
			Reset_Failure := {
				protocolIEs := {
					{
						id := SABP_Constants.id_Failure_List,
						criticality := reject,
						value_ := { Failure_List := f_list }
					}
					/* Optional: Service Area List */
				},
				protocolExtensions := omit
			}
		}
	}
}
template (present) SABP_PDU
tr_SABP_ResetFail(template (present) Failure_List f_list := ?) := {
	unsuccessfulOutcome := {
		procedureCode := id_Reset,
		criticality := reject,
		value_ := {
			Reset_Failure := {
				protocolIEs := {
					{
						id := SABP_Constants.id_Failure_List,
						criticality := reject,
						value_ := { Failure_List := f_list }
					}, *
					/* Optional: Service Area List */
				},
				protocolExtensions := *
			}
		}
	}
}

/* 9.1.18 RESTART (RNC->CN) */
template (value) SABP_PDU
ts_SABP_Restart(template (value) Service_Areas_List sa_list) := {
	initiatingMessage := {
		procedureCode := id_Restart_Indication,
		criticality := ignore,
		value_ := {
			Restart := {
				protocolIEs := {
					{
						id := SABP_Constants.id_Service_Areas_List,
						criticality := reject,
						value_ := { Service_Areas_List := sa_list }
					}
					/* Optional: Recovery_Indication */
				},
				protocolExtensions := omit
			}
		}
	}
}
template (present) SABP_PDU
tr_SABP_Restart(template (present) Service_Areas_List sa_list) := {
	initiatingMessage := {
		procedureCode := id_Restart_Indication,
		criticality := ignore,
		value_ := {
			Restart := {
				protocolIEs := {
					{
						id := SABP_Constants.id_Service_Areas_List,
						criticality := reject,
						value_ := { Service_Areas_List := sa_list }
					}, *
					/* Optional: Recovery_Indication */
				},
				protocolExtensions := *
			}
		}
	}
}

/* 9.1.19 FAILURE (RNC->CN) */
template (value) SABP_PDU
ts_SABP_Failure(template (value) Service_Areas_List sa_list) := {
	initiatingMessage := {
		procedureCode := id_Failure_Indication,
		criticality := ignore,
		value_ := {
			Failure := {
				protocolIEs := {
					{
						id := SABP_Constants.id_Service_Areas_List,
						criticality := ignore,
						value_ := { Service_Areas_List := sa_list }
					}
				},
				protocolExtensions := omit
			}
		}
	}
}
template (present) SABP_PDU
tr_SABP_Failure(template (present) Service_Areas_List sa_list) := {
	initiatingMessage := {
		procedureCode := id_Failure_Indication,
		criticality := ignore,
		value_ := {
			Failure := {
				protocolIEs := {
					{
						id := SABP_Constants.id_Service_Areas_List,
						criticality := ignore,
						value_ := { Service_Areas_List := sa_list }
					}
				},
				protocolExtensions := *
			}
		}
	}
}

/* 9.1.20 ERROR INDICATION (RNC->CN) */
template (value) SABP_PDU
ts_SABP_ErrorInd(template (value) BIT16 msg_id, template (value) BIT16 ser_nr,
		 template (value) Cause cause) := {
	initiatingMessage := {
		procedureCode := id_Error_Indication,
		criticality := ignore,
		value_ := {
			Error_Indication := {
				protocolIEs := {
					{
						id := SABP_Constants.id_Message_Identifier,
						criticality := ignore,
						value_ := { Message_Identifier := msg_id }
					}, {
						id := SABP_Constants.id_Serial_Number,
						criticality := ignore,
						value_ := { Serial_Number := ser_nr }
					}, {
						id := SABP_Constants.id_Cause,
						criticality := ignore,
						value_ :={ Cause := cause }
					}
					/* Optional: Criticality-Diagnostics */
				},
				protocolExtensions := omit
			}
		}
	}
}
template (present) SABP_PDU
tr_SABP_ErrorInd := {
	initiatingMessage := {
		procedureCode := id_Error_Indication,
		criticality := ignore,
		value_ := {
			Error_Indication := {
				protocolIEs := {
					*
					/* Optional: Message-Identifier */
					/* Optional: Serial-Number */
					/* Optional: Cause */
					/* Optional: Criticality-Diagnostics */
				},
				protocolExtensions := *
			}
		}
	}
}



}

