module M3UA_Templates { /* M3UA Templates, building on top of M3UA_Types from Ericsson. * * (C) 2019 by Harald Welte * 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 */ import from M3UA_Types all; import from General_Types all; import from Osmocom_Types all; const OCT1 c_M3UA_VERSION := '01'O; const OCT1 c_M3UA_NI_NATIONAL := '02'O; const OCT1 c_M3UA_NI_INTERNATIONAL := '00'O; const OCT2 c_M3UA_ST_T_STATE_CHG := '0001'O; const OCT2 c_M3UA_ST_I_RESERVED := '0001'O; const OCT2 c_M3UA_ST_I_AS_INACTIVE := '0002'O; const OCT2 c_M3UA_ST_I_AS_ACTIVE := '0003'O; const OCT2 c_M3UA_ST_I_AS_PENDING := '0004'O; const OCT2 c_M3UA_ST_T_OTHER := '0002'O; const OCT2 c_M3UA_ST_I_INSUFF_RESRC := '0001'O const OCT2 c_M3UA_ST_I_ALTERNATE_ASP := '0002'O const OCT2 c_M3UA_ST_I_ASP_FAILUREP := '0003'O private function f_aspid_or_omit(template (omit) OCT4 aspid) return template (omit) M3UA_ASP_Identifier { var template (omit) M3UA_ASP_Identifier id; if (istemplatekind(aspid, "omit")) { return omit; } else { id.tag := '0011'O; id.lengthInd := 8; id.aSPIdentifier := aspid; return id; } } function tr_M3UA_asp_id(template OCT4 aspid) return template M3UA_ASP_Identifier { var template M3UA_ASP_Identifier id := { tag := '0011'O, lengthInd := 8, aSPIdentifier := aspid }; if (istemplatekind(aspid, "omit")) { return omit; } else if (istemplatekind(aspid, "*")) { return *; } else { return id; } } /*********************************************************************** * ASPSM Class ***********************************************************************/ template (value) PDU_M3UA ts_M3UA_ASPUP(template (omit) OCT4 aspid := omit, template (omit) octetstring infostr := omit) := { m3UA_ASPUP := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0301'O, messageLength := 0, // overwritten messageParameters := { aSP_Identifier := f_aspid_or_omit(aspid), info_String := omit } } } template (present) PDU_M3UA tr_M3UA_ASPUP(template OCT4 aspid := *, template octetstring infostr := omit) := { m3UA_ASPUP := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0301'O, messageLength := ?, // overwritten messageParameters := { aSP_Identifier := tr_M3UA_asp_id(aspid), info_String := * } } } template (value) PDU_M3UA ts_M3UA_ASPUP_ACK := { m3UA_ASPUP_Ack := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0304'O, messageLength := 0, // overwritten messageParameters := { info_String := omit } } } template (present) PDU_M3UA tr_M3UA_ASPUP_ACK := { m3UA_ASPUP_Ack := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0304'O, messageLength := ?, messageParameters := { info_String := * } } } template (value) PDU_M3UA ts_M3UA_ASPDN := { m3UA_ASPDN := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0302'O, messageLength := 0, // overwritten messageParameters := { info_String := omit } } } template (present) PDU_M3UA tr_M3UA_ASPDN := { m3UA_ASPDN := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0302'O, messageLength := ?, messageParameters := { info_String := * } } } template (value) PDU_M3UA ts_M3UA_ASPDN_ACK := { m3UA_ASPUP_Ack := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0305'O, messageLength := 0, // overwritten messageParameters := { info_String := omit } } } template (present) PDU_M3UA tr_M3UA_ASPDN_ACK := { m3UA_ASPUP_Ack := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0305'O, messageLength := ?, messageParameters := { info_String := * } } } template (value) M3UA_Heartbeat_Data ts_M3UA_hb_data(template (value) octetstring hb_data) := { tag := '0009'O, lengthInd := 0, // overwritten heartbeat_Data := hb_data } template (present) M3UA_Heartbeat_Data tr_M3UA_hb_data(template (present) octetstring hb_data) := { tag := '0009'O, lengthInd := ?, heartbeat_Data := hb_data } template (value) PDU_M3UA ts_M3UA_BEAT(template (omit) M3UA_Heartbeat_Data hbd := omit) := { m3UA_BEAT := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0303'O, messageLength := 0, // overwritten messageParameters := { heartbeat_Data := hbd } } } template (present) PDU_M3UA tr_M3UA_BEAT(template M3UA_Heartbeat_Data hbd := *) := { m3UA_BEAT := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0303'O, messageLength := ?, messageParameters := { heartbeat_Data := hbd } } } template (value) PDU_M3UA ts_M3UA_BEAT_ACK(template (omit) M3UA_Heartbeat_Data hb_data) := { m3UA_BEAT_Ack := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0306'O, messageLength := 0, // overwritten messageParameters := { heartbeat_Data := hb_data } } } template (present) PDU_M3UA tr_M3UA_BEAT_ACK(template M3UA_Heartbeat_Data hb_data := *) := { m3UA_BEAT_Ack := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0306'O, messageLength := ?, messageParameters := { heartbeat_Data := hb_data } } } /*********************************************************************** * ASPTM Class ***********************************************************************/ const M3UA_Traffic_Mode_Type c_M3UA_TMT_override := { tag := '000B'O, lengthInd := 8, trafficModeType := int2oct(1, 4) } const M3UA_Traffic_Mode_Type c_M3UA_TMT_loadshare := { tag := '000B'O, lengthInd := 8, trafficModeType := int2oct(2, 4) } const M3UA_Traffic_Mode_Type c_M3UA_TMT_broadcast := { tag := '000B'O, lengthInd := 8, trafficModeType := int2oct(3, 4) } function ts_M3UA_routing_ctx(template (omit) octetstring rctx) return template (omit) M3UA_Routing_Context { var template (omit) M3UA_Routing_Context id; if (istemplatekind(rctx, "omit")) { return omit; } else { id.tag := '0006'O; id.lengthInd := 0; // overwritten id.routingContext := rctx; return id; } } function tr_M3UA_routing_ctx(template octetstring rctx) return template M3UA_Routing_Context { var template M3UA_Routing_Context id; if (istemplatekind(rctx, "omit")) { return omit; } else if (istemplatekind(rctx, "*")) { return *; } else { id.tag := '0006'O; id.lengthInd := ?; id.routingContext := rctx; return id; } } template (value) PDU_M3UA ts_M3UA_ASPAC(template (omit) M3UA_Traffic_Mode_Type tmt, template (omit) OCT4 rctx) := { m3UA_ASPAC := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0401'O, messageLength := 0, // overwritten messageParameters := { traffic_Mode_Type := tmt, routing_Context := ts_M3UA_routing_ctx(rctx), info_String := omit } } } template (present) PDU_M3UA tr_M3UA_ASPAC(template M3UA_Traffic_Mode_Type tmt, template OCT4 rctx) := { m3UA_ASPAC := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0401'O, messageLength := ?, messageParameters := { traffic_Mode_Type := tmt, routing_Context := tr_M3UA_routing_ctx(rctx), info_String := * } } } template (value) PDU_M3UA ts_M3UA_ASPAC_ACK(template (omit) M3UA_Traffic_Mode_Type tmt, template (omit) OCT4 rctx) := { m3UA_ASPAC_Ack := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0403'O, messageLength := 0, // overwritten messageParameters := { traffic_Mode_Type := tmt, routing_Context := ts_M3UA_routing_ctx(rctx), info_String := omit } } } template (present) PDU_M3UA tr_M3UA_ASPAC_ACK(template M3UA_Traffic_Mode_Type tmt, template OCT4 rctx) := { m3UA_ASPAC_Ack := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0403'O, messageLength := ?, messageParameters := { traffic_Mode_Type := tmt, routing_Context := tr_M3UA_routing_ctx(rctx), info_String := * } } } template (value) PDU_M3UA ts_M3UA_ASPIA(template (omit) OCT4 rctx) := { m3UA_ASPIA := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0402'O, messageLength := 0, // overwritten messageParameters := { routing_Context := ts_M3UA_routing_ctx(rctx), info_String := omit } } } template (present) PDU_M3UA tr_M3UA_ASPIA(template OCT4 rctx) := { m3UA_ASPIA := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0402'O, messageLength := ?, messageParameters := { routing_Context := tr_M3UA_routing_ctx(rctx), info_String := * } } } template (value) PDU_M3UA ts_M3UA_ASPIA_ACK(template (omit) OCT4 rctx) := { m3UA_ASPIA_Ack := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0404'O, messageLength := 0, // overwritten messageParameters := { routing_Context := ts_M3UA_routing_ctx(rctx), info_String := omit } } } template (present) PDU_M3UA tr_M3UA_ASPIA_ACK(template OCT4 rctx) := { m3UA_ASPIA_Ack := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0404'O, messageLength := ?, messageParameters := { routing_Context := tr_M3UA_routing_ctx(rctx), info_String := * } } } /*********************************************************************** * SSNM Class ***********************************************************************/ template (value) M3UA_Point_Code ts_M3UA_PC(uint24_t pc, uint8_t mask := 0) := { mask := int2oct(mask, 1), affected_Point_Code := int2oct(pc, 3) } template (value) M3UA_Affected_Point_Codes ts_M3UA_AffPc(template (value) M3UA_Point_Codes pcs) := { tag := '0012'O, lengthInd := 0, pointCodes := pcs } template (present) M3UA_Affected_Point_Codes tr_M3UA_AffPc(template (present) M3UA_Point_Codes pcs) := { tag := '0012'O, lengthInd := ?, pointCodes := pcs } template (value) M3UA_User_Cause ts_M3UA_UserCause(template (value) OCT2 cause, template (value) OCT2 user) := { tag := '0204'O, lengthInd := 0, cause := cause, user := user } template (present) M3UA_User_Cause tr_M3UA_UserCause(template (present) OCT2 cause, template (present) OCT2 user) := { tag := '0204'O, lengthInd := ?, cause := cause, user := user } template (value) PDU_M3UA ts_M3UA_DUNA(template (value) M3UA_Point_Codes affected_pcs, template (omit) OCT4 rctx := omit) := { m3UA_DUNA := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0201'O, messageLength := 0, messageParameters := { network_Appearance := omit, routing_Context := ts_M3UA_routing_ctx(rctx), affected_Point_Codes := ts_M3UA_AffPc(affected_pcs), info_String := omit } } } template (present) PDU_M3UA tr_M3UA_DUNA(template (present) M3UA_Point_Codes affected_pcs := ?, template OCT4 rctx := *):= { m3UA_DUNA := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0201'O, messageLength := ?, messageParameters := { network_Appearance := *, routing_Context := tr_M3UA_routing_ctx(rctx), affected_Point_Codes := tr_M3UA_AffPc(affected_pcs), info_String := * } } } template (value) PDU_M3UA ts_M3UA_DAVA(template (value) M3UA_Point_Codes affected_pcs, template (omit) OCT4 rctx := omit) := { m3UA_DAVA := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0202'O, messageLength := 0, messageParameters := { network_Appearance := omit, routing_Context := ts_M3UA_routing_ctx(rctx), affected_Point_Codes := ts_M3UA_AffPc(affected_pcs), info_String := omit } } } template (present) PDU_M3UA tr_M3UA_DAVA(template (present) M3UA_Point_Codes affected_pcs := ?, template OCT4 rctx := *):= { m3UA_DAVA := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0202'O, messageLength := ?, messageParameters := { network_Appearance := *, routing_Context := tr_M3UA_routing_ctx(rctx), affected_Point_Codes := tr_M3UA_AffPc(affected_pcs), info_String := * } } } template (value) PDU_M3UA ts_M3UA_DAUD(template (value) M3UA_Point_Codes affected_pcs, template (omit) OCT4 rctx := omit) := { m3UA_DAUD := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0203'O, messageLength := 0, messageParameters := { network_Appearance := omit, routing_Context := ts_M3UA_routing_ctx(rctx), affected_Point_Codes := ts_M3UA_AffPc(affected_pcs), info_String := omit } } } template (present) PDU_M3UA tr_M3UA_DAUD(template (present) M3UA_Point_Codes affected_pcs := ?, template OCT4 rctx := *):= { m3UA_DAUD := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0203'O, messageLength := ?, messageParameters := { network_Appearance := *, routing_Context := tr_M3UA_routing_ctx(rctx), affected_Point_Codes := tr_M3UA_AffPc(affected_pcs), info_String := * } } } template (value) PDU_M3UA ts_M3UA_SCON(template (value) M3UA_Point_Codes affected_pcs, template (omit) OCT4 rctx := omit) := { m3UA_SCON := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0204'O, messageLength := 0, messageParameters := { network_Appearance := omit, routing_Context := ts_M3UA_routing_ctx(rctx), affected_Point_Codes := ts_M3UA_AffPc(affected_pcs), concerned_Destination := omit, congestion_Indicators := omit, info_String := omit } } } template (present) PDU_M3UA tr_M3UA_SCON(template (present) M3UA_Point_Codes affected_pcs := ?, template OCT4 rctx := *):= { m3UA_SCON := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0204'O, messageLength := ?, messageParameters := { network_Appearance := *, routing_Context := tr_M3UA_routing_ctx(rctx), affected_Point_Codes := tr_M3UA_AffPc(affected_pcs), concerned_Destination := *, congestion_Indicators := *, info_String := * } } } template (value) PDU_M3UA ts_M3UA_DUPU(template (value) M3UA_Point_Codes affected_pcs, template (value) OCT2 cause, template (value) OCT2 user, template (omit) OCT4 rctx := omit) := { m3UA_DUPU := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0205'O, messageLength := 0, messageParameters := { network_Appearance := omit, routing_Context := ts_M3UA_routing_ctx(rctx), affected_Point_Codes := ts_M3UA_AffPc(affected_pcs), user_Cause := ts_M3UA_UserCause(cause, user), info_String := omit } } } template (present) PDU_M3UA tr_M3UA_DUPU(template (present) M3UA_Point_Codes affected_pcs := ?, template (present) OCT2 cause := ?, template (present) OCT2 user := ?, template OCT4 rctx := *):= { m3UA_DUPU := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0205'O, messageLength := ?, messageParameters := { network_Appearance := *, routing_Context := tr_M3UA_routing_ctx(rctx), affected_Point_Codes := tr_M3UA_AffPc(affected_pcs), user_Cause := tr_M3UA_UserCause(cause, user), info_String := * } } } template (present) PDU_M3UA tr_M3UA_DRST := { m3UA_DRST := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0206'O, messageLength := ?, messageParameters := ? } } template (present) PDU_M3UA tr_M3UA_SSNM := (tr_M3UA_DUNA, tr_M3UA_DAVA, tr_M3UA_DAUD, tr_M3UA_SCON, tr_M3UA_DUPU, tr_M3UA_DRST); /*********************************************************************** * MGMT Class ***********************************************************************/ template (value) M3UA_Error_Code ts_M3UA_err_code(template (value) OCT4 val) := { tag := '000C'O, lengthInd := 8, errorCode := val } template (present) M3UA_Error_Code tr_M3UA_err_code(template (present) OCT4 val) := { tag := '000C'O, lengthInd := 8, errorCode := val } template (value) M3UA_Status ts_M3UA_status(template (value) OCT2 status_type, template (value) OCT2 status_info) := { tag := '000D'O, lengthInd := 8, statusType := status_type, statusInfo := status_info } template (present) M3UA_Status tr_M3UA_status(template (present) OCT2 status_type, template (present) OCT2 status_info) := { tag := '000D'O, lengthInd := 8, statusType := status_type, statusInfo := status_info } template (value) PDU_M3UA ts_M3UA_ERR(template (value) OCT4 err_code, template (omit) OCT4 rctx) := { m3UA_ERR := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0000'O, messageLength := 0, // overwritten messageParameters := { error_Code := ts_M3UA_err_code(err_code), routing_Context := ts_M3UA_routing_ctx(rctx), affected_Point_Codes := omit, network_Appearance := omit, diagnostic_information := omit } } } template (present) PDU_M3UA tr_M3UA_ERR(template (present) OCT4 err_code, template OCT4 rctx) := { m3UA_ERR := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0000'O, messageLength := ?, messageParameters := { error_Code := tr_M3UA_err_code(err_code), routing_Context := tr_M3UA_routing_ctx(rctx), affected_Point_Codes := *, network_Appearance := *, diagnostic_information := * } } } template (value) PDU_M3UA ts_M3UA_NOTIFY(template (value) OCT2 status_type, template (value) OCT2 status_info, template (omit) OCT4 rctx, template (omit) OCT4 aspid := omit, template (omit) octetstring infostr := omit) := { m3UA_NOTIFY := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0001'O, messageLength := 0, // overwritten messageParameters := { status := ts_M3UA_status(status_type, status_info), aSP_Identifier := f_aspid_or_omit(aspid), routing_Context := ts_M3UA_routing_ctx(rctx), info_String := omit } } } template (present) PDU_M3UA tr_M3UA_NOTIFY(template (present) OCT2 status_type, template (present) OCT2 status_info, template OCT4 rctx, template OCT4 aspid := *, template octetstring infostr := *) := { m3UA_NOTIFY := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0001'O, messageLength := ?, messageParameters := { status := tr_M3UA_status(status_type, status_info), aSP_Identifier := *, routing_Context := tr_M3UA_routing_ctx(rctx), info_String := * } } } /*********************************************************************** * Message Transfer Class ***********************************************************************/ template (value) M3UA_Protocol_Data ts_M3UA_protocol_data(template (value) OCT4 opc, template (value) OCT4 dpc, template (value) OCT1 si, template (value) OCT1 ni, template (value) OCT1 mp, template (value) OCT1 sls, template (value) octetstring data) := { tag := '0210'O, lengthInd := 0, // overwritten oPC := opc, dPC := dpc, sI := si, nI := ni, mP := mp, sLS := sls, userProtocolData := data } template (present) M3UA_Protocol_Data tr_M3UA_protocol_data(template (present) OCT4 opc, template (present) OCT4 dpc, template (present) OCT1 si, template (present) OCT1 ni, template (present) OCT1 mp, template (present) OCT1 sls, template (present) octetstring data) := { tag := '0210'O, lengthInd := ?, oPC := opc, dPC := dpc, sI := si, nI := ni, mP := mp, sLS := sls, userProtocolData := data } template (value) PDU_M3UA ts_M3UA_DATA(template (omit) OCT4 rctx, template (value) M3UA_Protocol_Data data) := { m3UA_DATA := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0101'O, messageLength := 0, // overwritten messageParameters :={ network_Appearance := omit, routing_Context := ts_M3UA_routing_ctx(rctx), protocol_Data := data, correlation_ID := omit } } } template (present) PDU_M3UA tr_M3UA_DATA(template OCT4 rctx, template (present) M3UA_Protocol_Data data) := { m3UA_DATA := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0101'O, messageLength := ?, // overwritten messageParameters := { network_Appearance := *, routing_Context := tr_M3UA_routing_ctx(rctx), protocol_Data := data, correlation_ID := * } } } /*********************************************************************** * Routing Key Management ***********************************************************************/ template (value) M3UA_Local_Routing_Key_Id ts_M3UA_lrkid(template (value) OCT4 id) := { tag := '020a'O, lengthInd := 8, localRkId := id } template (present) M3UA_Local_Routing_Key_Id tr_M3UA_lrkid(template (present) OCT4 id) := { tag := '020a'O, lengthInd := 8, localRkId := id } template (value) M3UA_Routing_Key ts_M3UA_rkey(OCT4 id, OCT3 dpc, template (omit) M3UA_Traffic_Mode_Type tmt := omit, template (omit) OCT4 rctx := omit) := { tag := '0207'O, lengthInd := 0, // overwritten routingKey := { local_Routing_Key_Id := ts_M3UA_lrkid(id), routing_Context := ts_M3UA_routing_ctx(rctx), traffic_Mode_Type := tmt, destination_Point_Code := { tag := '020b'O, lengthInd := 8, pointCode := { '00'O, dpc } }, network_Appearance := omit, service_Indicators := omit, opc_List := omit } } template (present) M3UA_Routing_Key tr_M3UA_rkey(template (present) OCT4 id, template (present) OCT3 dpc, template M3UA_Traffic_Mode_Type tmt := *, template OCT4 rctx := *) := { tag := '0207'O, lengthInd := ?, routingKey := { local_Routing_Key_Id := tr_M3UA_lrkid(id), routing_Context := tr_M3UA_routing_ctx(rctx), traffic_Mode_Type := tmt, destination_Point_Code := { tag := '020b'O, lengthInd := 8, pointCode := { '00'O, dpc } }, network_Appearance := omit, service_Indicators := omit, opc_List := omit } } const OCT4 c_M3UA_REGSTS_SUCCESS := '00000000'O; const OCT4 c_M3UA_REGSTS_ERR_UNKNOWN := '00000001'O; const OCT4 c_M3UA_REGSTS_ERR_INVAL_DPC := '00000002'O; const OCT4 c_M3UA_REGSTS_ERR_INVAL_NA := '00000003'O; const OCT4 c_M3UA_REGSTS_ERR_INVAL_RKEY := '00000004'O; const OCT4 c_M3UA_REGSTS_ERR_EPERM := '00000005'O; // ... const OCT4 c_m3UA_DEREGSTS_SUCCESS := '00000000'O; const OCT4 c_m3UA_DEREGSTS_ERR_UNKNOWN := '00000001'O; const OCT4 c_m3UA_DEREGSTS_ERR_INVAL_RCTX := '00000002'O; const OCT4 c_m3UA_DEREGSTS_ERR_EPERM := '00000003'O; const OCT4 c_m3UA_DEREGSTS_ERR_NOT_REG := '00000004'O; const OCT4 c_m3UA_DEREGSTS_ERR_ASP_ACTIVE := '00000005'O; template (value) M3UA_Registration_Result ts_M3UA_reg_res(template (value) OCT4 id, template (value) OCT4 status, template (value) OCT4 rctx) := { tag := '0208'O, lengthInd := 0, // overwritten registrationResult := { local_Routing_Key_Id := ts_M3UA_lrkid(id), registration_Status := { tag := '0212'O, lengthInd := 8, registrationStatus := status }, routing_Context := ts_M3UA_routing_ctx(rctx) } } template (present) M3UA_Registration_Result tr_M3UA_reg_res(template (present) OCT4 id, template (present) OCT4 status, template (present) OCT4 rctx) := { tag := '0208'O, lengthInd := ?, registrationResult := { local_Routing_Key_Id := tr_M3UA_lrkid(id), registration_Status := { tag := '0212'O, lengthInd := 8, registrationStatus := status }, routing_Context := tr_M3UA_routing_ctx(rctx) } } template (value) M3UA_Deregistration_Result ts_M3UA_dereg_res(template (value) OCT4 rctx, template (value) OCT4 status) := { tag := '0209'O, lengthInd := 0, // overwritten deregistrationResult := { routing_Context := ts_M3UA_routing_ctx(rctx), deregistration_Status := { tag := '0213'O, lengthInd := 8, deregistrationStatus := status } } } template (present) M3UA_Deregistration_Result tr_M3UA_dereg_res(template (present) OCT4 rctx, template (present) OCT4 status) := { tag := '0209'O, lengthInd := ?, deregistrationResult := { routing_Context := tr_M3UA_routing_ctx(rctx), deregistration_Status := { tag := '0213'O, lengthInd := 8, deregistrationStatus := status } } } template (value) PDU_M3UA ts_M3UA_REG_REQ(template (value) M3UA_Routing_Keys rkeys) := { m3UA_REG_REQ := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0901'O, messageLength := 0, // overwritten messageParameters := rkeys } } template (present) PDU_M3UA tr_M3UA_REG_REQ(template (present) M3UA_Routing_Keys rkeys) := { m3UA_REG_REQ := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0901'O, messageLength := ?, messageParameters := rkeys } } template (value) PDU_M3UA ts_M3UA_REG_RSP(template (value) M3UA_Registration_Results res) := { m3UA_REG_RSP := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0902'O, messageLength := 0, // overwritten messageParameters := res } } template (present) PDU_M3UA tr_M3UA_REG_RSP(template (present) M3UA_Registration_Results res) := { m3UA_REG_RSP := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0902'O, messageLength := ?, messageParameters := res } } template (value) PDU_M3UA ts_M3UA_DEREG_REQ(template (value) M3UA_Routing_Context rctx) := { m3UA_DEREG_REQ := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0903'O, messageLength := 0, // overwritten messageParameters := { routing_Context := rctx } } } template (present) PDU_M3UA tr_M3UA_DEREG_REQ(template (present) M3UA_Routing_Context rctx) := { m3UA_DEREG_REQ := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0903'O, messageLength := ?, messageParameters := { routing_Context := rctx } } } template (value) PDU_M3UA ts_M3UA_DEREG_RSP(template (value) M3UA_Deregistration_Results res) := { m3UA_DEREG_RSP := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0904'O, messageLength := 0, // overwritten messageParameters := res } } template (present) PDU_M3UA tr_M3UA_DEREG_RSP(template (present) M3UA_Deregistration_Results res) := { m3UA_DEREG_RSP := { version := c_M3UA_VERSION, reserved := '00'O, messageClassAndType := '0904'O, messageLength := ?, messageParameters := res } } }