diff options
Diffstat (limited to 'library/RSL_Types.ttcn')
-rw-r--r-- | library/RSL_Types.ttcn | 857 |
1 files changed, 745 insertions, 112 deletions
diff --git a/library/RSL_Types.ttcn b/library/RSL_Types.ttcn index 2bbbd3b8..1940b096 100644 --- a/library/RSL_Types.ttcn +++ b/library/RSL_Types.ttcn @@ -4,7 +4,7 @@ module RSL_Types { * * RSL is a 3GPP standard protocol used between BTS and BSC in a GSM network. * - * (C) 2017 by Harald Welte <laforge@gnumonks.org> + * (C) 2017-2023 by Harald Welte <laforge@gnumonks.org> * All rights reserved. * * Released under the terms of GNU General Public License, Version 2 or @@ -206,7 +206,7 @@ module RSL_Types { RSL_IE_CBCH_LOAD_INFO ('00101101'B), RSL_IE_SMSCB_CHAN_INDICATOR ('00101110'B), RSL_IE_GROUP_CALL_REF ('00101111'B), - RSL_IE_CHAN_DESC ('00110000'B), + RSL_IE_GROUP_CHAN_DESC ('00110000'B), RSL_IE_NCH_DRX_INFO ('00110001'B), RSL_IE_CMD_INDICATOR ('00110010'B), RSL_IE_EMLPP_PRIO ('00110011'B), @@ -220,6 +220,12 @@ module RSL_Types { RSL_IE_TFO_STATUS ('00111011'B), RSL_IE_LLP_APDU ('00111100'B), + /* Osmocom extensions */ + RSL_IE_OSMO_REP_ACCH_CAP ('01100000'B), + RSL_IE_OSMO_TRAINING_SEQUENCE ('01100001'B), + RSL_IE_OSMO_TOP_ACCH_CAP ('01100010'B), + RSL_IE_OSMO_OSMUX_CID ('01100011'B), + /* ip.access */ RSL_IE_IPAC_SRTP_CONFIG ('11100000'B), RSL_IE_IPAC_PROXY_UDP ('11100001'B), @@ -314,7 +320,7 @@ module RSL_Types { } /* osmocom-style dynamic PDCH */ - const RSL_IE_ActivationType t_RSL_IE_ActType_PDCH := { + const RSL_IE_ActivationType c_RSL_IE_ActType_PDCH := { reactivation := false, reserved := 1, a_bits := ACT_REL_TO_OSMO_PDCH @@ -376,10 +382,14 @@ module RSL_Types { RSL_CHRT_TCH_F_GROUP ('00011000'B), RSL_CHRT_TCH_H_GROUP ('00011001'B), RSL_CHRT_TCH_F_BCAST ('00101000'B), - RSL_CHRT_TCH_H_BCAST ('00101001'B) + RSL_CHRT_TCH_H_BCAST ('00101001'B), + RSL_CHRT_OSMO_TCH_F_VAMOS ('10001000'B), + RSL_CHRT_OSMO_TCH_H_VAMOS ('10001001'B) + } with { variant "FIELDLENGTH(8)" }; + type enumerated RSL_ChanModeOct6Signalling { + RSL_CMOD_NO_RESOURCE ('00000000'B) } with { variant "FIELDLENGTH(8)" }; - type enumerated RSL_SpeechAlgo { - RSL_CMOD_NO_RESOURCE ('00000000'B), + type enumerated RSL_ChanModeOct6SpeechAlgo { RSL_CMOD_SP_GSM1 ('00000001'B), RSL_CMOD_SP_GSM2 ('00010001'B), RSL_CMOD_SP_GSM3 ('00100001'B), @@ -387,6 +397,33 @@ module RSL_Types { RSL_CMOD_SP_GSM5 ('00001001'B), RSL_CMOD_SP_GSM6 ('00001101'B) } with { variant "FIELDLENGTH(8)" }; + type enumerated RSL_ChanModeOct6DataRate { + RSL_CMOD_CSD_NTA_43k5_14k5 ('01100001'B), + RSL_CMOD_CSD_NTA_29k0_14k5 ('01100010'B), + RSL_CMOD_CSD_NTA_43k5_29k0 ('01100011'B), + RSL_CMOD_CSD_NTA_14k5_43k5 ('01101001'B), + RSL_CMOD_CSD_NTA_14k5_29k0 ('01101010'B), + RSL_CMOD_CSD_NTA_29k0_43k5 ('01101011'B), + RSL_CMOD_CSD_NT_43k5 ('01110100'B), + RSL_CMOD_CSD_NT_28k8 ('01110001'B), + RSL_CMOD_CSD_NT_14k5 ('01011000'B), + RSL_CMOD_CSD_NT_12k0 ('01010000'B), + RSL_CMOD_CSD_NT_6k0 ('01010001'B), + RSL_CMOD_CSD_T_32k0 ('00111000'B), + RSL_CMOD_CSD_T_29k0 ('00111001'B), + RSL_CMOD_CSD_T_14k4 ('00011000'B), + RSL_CMOD_CSD_T_9k6 ('00010000'B), + RSL_CMOD_CSD_T_4k8 ('00010001'B), + RSL_CMOD_CSD_T_2k4 ('00010010'B), + RSL_CMOD_CSD_T_1k2 ('00010011'B), + RSL_CMOD_CSD_T_600 ('00010100'B), + RSL_CMOD_CSD_T_1200_75 ('00010101'B) + } with { variant "FIELDLENGTH(8)" }; + type union RSL_ChanModeOct6 { + RSL_ChanModeOct6Signalling sign, + RSL_ChanModeOct6SpeechAlgo speech, + RSL_ChanModeOct6DataRate data + }; type record RSL_IE_ChannelMode { uint8_t len, BIT6 reserved, @@ -394,21 +431,67 @@ module RSL_Types { boolean dtx_u, RSL_SpeechDataInd spd_ind, RSL_ChanRateType ch_rate_type, - RSL_SpeechAlgo coding_alg_rate - } with { variant (len) "LENGTHTO(reserved,dtx_d,dtx_u,spd_ind,ch_rate_type,coding_alg_rate)" } - - template (value) RSL_IE_ChannelMode ts_RSL_ChanMode_SIGN(RSL_ChanRateType t := RSL_CHRT_SDCCH, - boolean dtx_downlink := false) := { + RSL_ChanModeOct6 u + } with { variant (len) "LENGTHTO(reserved,dtx_d,dtx_u,spd_ind,ch_rate_type,u)" + variant (u) "CROSSTAG( + sign, spd_ind = RSL_SPDI_SIGN; + speech, spd_ind = RSL_SPDI_SPEECH; + data, spd_ind = RSL_SPDI_DATA; + )"} + + template (value) RSL_IE_ChannelMode + ts_RSL_ChanMode_SIGN(template (value) RSL_ChanRateType t := RSL_CHRT_SDCCH, + template (value) boolean dtxd := false, + template (value) boolean dtxu := false) := { len := 0, /* overwritten */ reserved := '000000'B, - dtx_d := dtx_downlink, - dtx_u := false, + dtx_d := dtxd, + dtx_u := dtxu, + spd_ind := RSL_SPDI_SIGN, + ch_rate_type := t, + u := { sign := RSL_CMOD_NO_RESOURCE } + } + template RSL_IE_ChannelMode + tr_RSL_ChanMode_SIGN(template (present) RSL_ChanRateType t := ?, + template (present) boolean dtxd := ?, + template (present) boolean dtxu := ?) := { + len := ?, + reserved := ?, + dtx_d := dtxd, + dtx_u := dtxu, spd_ind := RSL_SPDI_SIGN, ch_rate_type := t, - coding_alg_rate := RSL_CMOD_NO_RESOURCE + u := { sign := RSL_CMOD_NO_RESOURCE } + } + + template (value) RSL_IE_ChannelMode + ts_RSL_ChanMode_DATA(template (value) RSL_ChanRateType t, + template (value) RSL_ChanModeOct6DataRate r, + template (value) boolean dtxd := false, + template (value) boolean dtxu := false) := { + len := 0, /* overwritten */ + reserved := '000000'B, + dtx_d := dtxd, + dtx_u := dtxu, + spd_ind := RSL_SPDI_DATA, + ch_rate_type := t, + u := { data := r } + } + template RSL_IE_ChannelMode + tr_RSL_ChanMode_DATA(template (present) RSL_ChanRateType t := ?, + template (present) RSL_ChanModeOct6DataRate r := ?, + template (present) boolean dtxd := ?, + template (present) boolean dtxu := ?) := { + len := ?, + reserved := ?, + dtx_d := dtxd, + dtx_u := dtxu, + spd_ind := RSL_SPDI_DATA, + ch_rate_type := t, + u := { data := r } } - template (value) RSL_IE_ChannelMode ts_RSL_ChanMode(RSL_ChanRateType t, RSL_SpeechAlgo alg, + template (value) RSL_IE_ChannelMode ts_RSL_ChanMode(RSL_ChanRateType t, RSL_ChanModeOct6SpeechAlgo alg, boolean dtx_downlink := false) := { len := 0, /* overwritten */ reserved := '000000'B, @@ -416,17 +499,17 @@ module RSL_Types { dtx_u := false, spd_ind := RSL_SPDI_SPEECH, ch_rate_type := t, - coding_alg_rate := alg + u := { speech := alg } } template RSL_IE_ChannelMode tr_RSL_ChanMode(template RSL_ChanRateType t, - template RSL_SpeechAlgo alg) := { + template RSL_ChanModeOct6SpeechAlgo alg) := { len := ?, reserved := '000000'B, dtx_d := ?, dtx_u := ?, spd_ind := RSL_SPDI_SPEECH, ch_rate_type := t, - coding_alg_rate := alg + u := { speech := alg } } /* 9.3.4 BS Power IE */ @@ -444,6 +527,15 @@ module RSL_Types { fpc := fpc, power_level := power_level } + template RSL_IE_BS_Power + tr_RSL_IE_BS_Power(template (present) uint4_t power_level, + template (present) boolean epc := ?, + template (present) boolean fpc := ?) := { + reserved := ?, + epc := epc, + fpc := fpc, + power_level := power_level + } /* 9.3.7 */ type enumerated RSL_AlgId { @@ -493,6 +585,13 @@ module RSL_Types { uint8_t actual_ta } + template (value) RSL_IE_L1Info ts_RSL_IE_L1Info := { + ms_power_lvl := 0, + fpc := false, + reserved := 0, + actual_ta := 0 + }; + /* 9.3.13 */ type record RSL_IE_MS_Power { uint2_t reserved, @@ -567,6 +666,34 @@ module RSL_Types { frame_nr := tr_RSL_IE_FrameNumber(frame_nr) } + /* 9.3.21 Resource Information */ + type record RSL_IE_ResourceInfo { + uint8_t len, + RSL_ResourceInfo info + } with { variant (len) "LENGTHTO(info)" }; + + type record of RSL_ResourceInfoItem RSL_ResourceInfo; + type record RSL_ResourceInfoItem { + RslChannelNr chan_nr, + uint3_t interf_band, + BIT5 rfu ('00000'B) + }; + + template (value) RSL_ResourceInfoItem + ts_RSL_ResourceInfoItem(template (value) RslChannelNr chan_nr, + template (value) uint3_t interf_band := 0) := { + chan_nr := chan_nr, + interf_band := interf_band, + rfu := '00000'B + } + template RSL_ResourceInfoItem + tr_RSL_ResourceInfoItem(template (present) RslChannelNr chan_nr := ?, + template (present) uint3_t interf_band := ?) := { + chan_nr := chan_nr, + interf_band := interf_band, + rfu := ? /* Tolerate unknown values */ + } + /* Osmocom Extension */ type record RSL_IE_UplinkMeasSuppMeasInfo { int16_t toa256_mean, @@ -589,6 +716,19 @@ module RSL_Types { RSL_IE_UplinkMeasSuppMeasInfo supp_meas_info optional } with { variant (len) "LENGTHTO(rfu,dtx_d,rxlev_f_u,reserved1,rxlev_s_u,reserved2,rxq_f_u,rxq_s_u,supp_meas_info)" }; + template (value) RSL_IE_UplinkMeas ts_RSL_IE_UplinkMeas(uint6_t rxlev := 12, uint3_t rxqual := 0) := { + len := 0, /* overwritten */ + rfu := '0'B, + dtx_d := false, + rxlev_f_u := rxlev, + reserved1 := '00'B, + rxlev_s_u := rxlev, + reserved2 := '00'B, + rxq_f_u := rxqual, + rxq_s_u := rxqual, + supp_meas_info := omit + }; + /* 9.3.26 */ type enumerated RSL_Cause { /* normal event */ @@ -751,6 +891,104 @@ module RSL_Types { slot_count := slot_count } + /* 9.3.45 Group Call Reference */ + type record RSL_IE_GroupCallReference { + uint8_t len, + GroupCallRef group_or_bcast_call_ref + } with { + variant (len) "LENGTHTO(group_or_bcast_call_ref)" + }; + template (value) RSL_IE_GroupCallReference ts_GroupCallRef(template (value) GroupCallRef gcr) := { + len := 0, // overwritten + group_or_bcast_call_ref := gcr + } + template (present) RSL_IE_GroupCallReference tr_GroupCallRef(template (present) GroupCallRef gcr := ?) := { + len := ?, + group_or_bcast_call_ref := gcr + } + + /* 9.3.46 Channel description */ + type record RSL_IE_GroupChannelDescription { + uint8_t len, + octetstring chan_desc + } with { + variant (len) "LENGTHTO(chan_desc)" + }; + template (value) RSL_IE_GroupChannelDescription ts_GroupChanDesc(template (value) octetstring cd) := { + len := 0, // overwritten + chan_desc := cd + } + template (present) RSL_IE_GroupChannelDescription tr_GroupChanDesc(template (present) octetstring cd) := { + len := ?, + chan_desc := cd + } + + /* 9.3.47 NCH DRX Information */ + type record RSL_IE_NchDrxInformation { + uint8_t len, + BIT2 spare, + BIT1 nln_status, + BIT3 emlpp_priority, + BIT2 nln + } with { + variant (len) "LENGTHTO(spare,nln_status,emlpp_priority,nln)" + }; + + /* 9.3.48 Command Indicator */ + type enumerated RSL_CommandIndicator { + CMD_IND_START (0), + CMD_IND_STOP (1) + } with { variant "FIELDLENGTH(8)" }; + type record RSL_IE_CommandIndicator { + uint8_t len, + RSL_CommandIndicator command_value + } with { + variant (len) "LENGTHTO(command_value)" + }; + template (value) RSL_IE_CommandIndicator ts_CommandInd(template (value) RSL_CommandIndicator ci) := { + len := 0, // overwritten + command_value := ci + } + template (present) RSL_IE_CommandIndicator tr_CommandInd(template (present) RSL_CommandIndicator ci) := { + len := ?, + command_value := ci + } + + /* 9.3.50 UIC */ + type record RSL_IE_Uic { + uint8_t len, + BIT2 spare, + uint6_t uic + } with { + variant (len) "LENGTHTO(spare,uic)" + }; + + /* 9.3.52, 3GPP TS 44.018 10.5.2.21aa */ + type record RSL_IE_MultirateCfg { + uint8_t len, + uint3_t mr_speech_ver, + boolean nscb, + boolean icmi, + BIT1 spare, + uint2_t start_mode, + BIT8 codec_modes, + octetstring parameters + } with { + variant (len) "LENGTHTO(mr_speech_ver,nscb,icmi,spare,start_mode,codec_modes,parameters)" + }; + template (value) RSL_IE_MultirateCfg ts_RSL_MultirateCfg(boolean icmi := true, uint2_t start_mode := 0, + BIT8 codec_modes := '00000100'B /* 5,90k */, + octetstring params := ''O) := { + len := 2 + lengthof(params), + mr_speech_ver := 1, + nscb := false, + icmi := icmi, + spare := '0'B, + start_mode := start_mode, + codec_modes := codec_modes, + parameters := params + } + /* 9.3.53 */ type record RSL_IE_MultirateCtrl { uint3_t spare, @@ -820,11 +1058,102 @@ module RSL_Types { RSL_IPA_Codec codec } + type enumerated RSL_IPA_RTP_CSD_FMT_D { + RSL_IPA_RTP_CSD_EXT_TRAU ('0000'B), + RSL_IPA_RTP_CSD_NON_TRAU ('0001'B), + RSL_IPA_RTP_CSD_TRAU_BTS ('0010'B), + RSL_IPA_RTP_CSD_IWF_FREE ('0011'B) + } with { variant "FIELDLENGTH(4)" } + + type enumerated RSL_IPA_RTP_CSD_FMT_IR { + RSL_IPA_RTP_CSD_8k ('0000'B), + RSL_IPA_RTP_CSD_16k ('0001'B), + RSL_IPA_RTP_CSD_32k ('0010'B), + RSL_IPA_RTP_CSD_64 ('0011'B) + } with { variant "FIELDLENGTH(4)" } + + type record RSL_IE_IPA_RTP_CSD_FMT { + RSL_IPA_RTP_CSD_FMT_IR ir, + RSL_IPA_RTP_CSD_FMT_D d + } + /* 9.3.20 */ type enumerated RSL_IE_ReleaseMode { RSL_REL_MODE_NORMAL ('00'B), - REL_REL_MODE_LOCAL ('01'B) + RSL_REL_MODE_LOCAL ('01'B) + } + + type record RSL_IE_OSMO_TrainingSequence { + uint8_t len, + uint8_t tsc_set, + uint8_t tsc + } with { variant (len) "LENGTHTO(tsc_set,tsc)" } + + type record RSL_IE_OSMO_RepAcchCap { + uint8_t len, + BIT1 rfu ('0'B), + uint3_t rxqual, + boolean ul_sacch, + boolean dl_sacch, + boolean dl_facch_all, + boolean dl_facch_cmd + } with { variant (len) "LENGTHTO(rfu,rxqual,ul_sacch,dl_sacch,dl_facch_all,dl_facch_cmd)" } + + type record RSL_IE_OSMO_TopAcchCap { + uint8_t len, + boolean sacch_enable, + boolean facch_enable, + uint3_t rxqual, + uint3_t overpower_db + } with { variant (len) "LENGTHTO(sacch_enable,facch_enable,rxqual,overpower_db)" } + + template (value) RSL_IE_OSMO_TopAcchCap + ts_RSL_IE_OSMO_TopAcchCap(template (value) uint3_t overpower := 2, + template (value) uint3_t rxqual := 4, + boolean facch_enable := true, + boolean sacch_enable := true) := { + len := 0, /* overwritten */ + sacch_enable := sacch_enable, + facch_enable := facch_enable, + rxqual := rxqual, + overpower_db := overpower + }; + template RSL_IE_OSMO_TopAcchCap + tr_RSL_IE_OSMO_TopAcchCap(template (present) uint3_t overpower := ?, + template (present) uint3_t rxqual := ?, + template (present) boolean facch_enable := ?, + template (present) boolean sacch_enable := ?) := { + len := ?, /* overwritten */ + sacch_enable := sacch_enable, + facch_enable := facch_enable, + rxqual := rxqual, + overpower_db := overpower + }; + + type record RSL_IE_OSMO_Osmux_CID { + uint8_t len, + uint8_t cid + } with { variant (len) "LENGTHTO(cid)" } + + template (present) RSL_IE_OSMO_Osmux_CID + tr_RSL_IE_OSMO_Osmux_CID(template (present) uint8_t osmux_cid := ?) := { + len := ?, /* overwritten */ + cid := osmux_cid + }; + function f_tr_RSL_IE_OSMO_Osmux_CID(template uint8_t osmux_cid := *) + return template RSL_IE_OSMO_Osmux_CID { + var template RSL_IE_OSMO_Osmux_CID ie := omit; + if (not istemplatekind(osmux_cid, "omit")) { + ie := tr_RSL_IE_OSMO_Osmux_CID(osmux_cid); + } + return ie; } + template (value) RSL_IE_OSMO_Osmux_CID + ts_RSL_IE_OSMO_Osmux_CID(template (value) uint8_t osmux_cid) := { + len := 0, /* overwritten */ + cid := osmux_cid + }; + /* union of all IE bodies */ type union RSL_IE_Body { @@ -838,9 +1167,11 @@ module RSL_Types { RSL_IE_ChannelMode chan_mode, uint8_t handover_ref, RSL_IE_BS_Power bs_power, + RSL_LV bs_power_params, RSL_IE_MS_Power ms_power, RSL_IE_MS_Power_Parameters ms_power_params, uint8_t timing_adv, + RSL_IE_MultirateCfg multirate_cfg, RSL_IE_MultirateCtrl multirate_ctrl, uint8_t msg_id, RSL_IE_FrameNumber frame_nr, @@ -858,6 +1189,7 @@ module RSL_Types { RSL_IE_CbCommandType cb_cmd_type, RSL_LV smscb_message, RSL_IE_CbchLoadInfo cbch_load_info, + RSL_IE_ResourceInfo resource_info, RSL_SacchInfo sacch_info, RSL_IE_StartingTime starting_time, @@ -867,15 +1199,27 @@ module RSL_Types { RSL_LV full_imm_ass_info, MobileIdentityLV ms_identity, + RSL_IE_GroupCallReference group_call_ref, + RSL_IE_GroupChannelDescription group_chan_desc, + RSL_IE_NchDrxInformation nch_drx_info, + RSL_IE_CommandIndicator cmd_indicator, + RSL_IE_Uic uic, + uint16_t ipa_conn_id, uint16_t ipa_local_port, uint16_t ipa_remote_port, - uint32_t ipa_local_ip, - uint32_t ipa_remote_ip, + OCT4 ipa_local_ip, + OCT4 ipa_remote_ip, uint8_t ipa_rtp_pt, uint8_t ipa_rtp_pt2, RSL_IE_IPA_ConnectionStats ipa_stats, RSL_IE_IPA_SpeechMode ipa_speech_mode, + RSL_IE_IPA_RTP_CSD_FMT ipa_rtp_csd_fmt, + + RSL_IE_OSMO_TrainingSequence osmo_training_sequence, + RSL_IE_OSMO_RepAcchCap rep_acch_cap, + RSL_IE_OSMO_TopAcchCap top_acch_cap, + RSL_IE_OSMO_Osmux_CID osmux_cid, RSL_LV other } @@ -894,9 +1238,11 @@ module RSL_Types { chan_mode, iei = RSL_IE_CHAN_MODE; handover_ref, iei = RSL_IE_HANDO_REF; bs_power, iei = RSL_IE_BS_POWER; + bs_power_params, iei = RSL_IE_BS_POWER_PARAM; ms_power, iei = RSL_IE_MS_POWER; ms_power_params, iei = RSL_IE_MS_POWER_PARAM; timing_adv, iei = RSL_IE_TIMING_ADVANCE; + multirate_cfg, iei = RSL_IE_MR_CONFIG; multirate_ctrl, iei = RSL_IE_MR_CONTROL; msg_id, iei = RSL_IE_MSG_ID; @@ -915,6 +1261,7 @@ module RSL_Types { cb_cmd_type, iei = RSL_IE_CB_CMD_TYPE; smscb_message, iei = RSL_IE_SMSCB_MSG; cbch_load_info, iei = RSL_IE_CBCH_LOAD_INFO; + resource_info, iei = RSL_IE_RESOURCE_INFO; sacch_info, iei = RSL_IE_SACCH_INFO; starting_time, iei = RSL_IE_STARTNG_TIME; encr_info, iei = RSL_IE_ENCR_INFO; @@ -925,6 +1272,12 @@ module RSL_Types { ms_identity, iei = RSL_IE_MS_IDENTITY; other, iei = RSL_IE_FULL_BCCH_INFO; + group_call_ref, iei = RSL_IE_GROUP_CALL_REF; + group_chan_desc, iei = RSL_IE_GROUP_CHAN_DESC; + nch_drx_info, iei = RSL_IE_NCH_DRX_INFO; + cmd_indicator, iei = RSL_IE_CMD_INDICATOR; + uic, iei = RSL_IE_UIC; + ipa_conn_id, iei = RSL_IE_IPAC_CONN_ID; ipa_remote_ip, iei = RSL_IE_IPAC_REMOTE_IP; ipa_remote_port, iei = RSL_IE_IPAC_REMOTE_PORT; @@ -934,6 +1287,12 @@ module RSL_Types { ipa_rtp_pt2, iei = RSL_IE_IPAC_RTP_PAYLOAD2; ipa_stats, iei = RSL_IE_IPAC_CONN_STAT; ipa_speech_mode, iei = RSL_IE_IPAC_SPEECH_MODE; + ipa_rtp_csd_fmt, iei = RSL_IE_IPAC_RTP_CSD_FMT; + + osmo_training_sequence, iei = RSL_IE_OSMO_TRAINING_SEQUENCE; + rep_acch_cap, iei = RSL_IE_OSMO_REP_ACCH_CAP; + top_acch_cap, iei = RSL_IE_OSMO_TOP_ACCH_CAP; + osmux_cid, iei = RSL_IE_OSMO_OSMUX_CID; other, OTHERWISE; )" }; @@ -1001,7 +1360,7 @@ template RSL_Message tr_RSL_MsgTypeD(template RSL_MessageType msg_type) modifies msg_disc := { RSL_MDISC_DCHAN, ? } } -/* Dedicated Channel Management */ +/* TRX Management */ template RSL_Message tr_RSL_MsgTypeT(template RSL_MessageType msg_type) modifies tr_RSL_MsgType := { msg_disc := { RSL_MDISC_TRX_MGMT, ? } } @@ -1278,13 +1637,23 @@ template RSL_Message tr_RSL_MsgTypeDR(template RSL_MessageType msg_type) modifie * } } - template RSL_Message tr_RSL_CHAN_ACT_PDCH(template RslChannelNr chan_nr, - template RSL_IE_ChannelMode mode) := { + + template (value) RSL_Message + ts_RSL_CHAN_ACT_PDCH(template (value) RslChannelNr chan_nr) := { + msg_disc := ts_RSL_MsgDisc(RSL_MDISC_DCHAN, false), + msg_type := RSL_MT_CHAN_ACTIV, + ies :={ + t_RSL_IE(RSL_IE_CHAN_NR, RSL_IE_Body:{chan_nr := chan_nr}), + t_RSL_IE(RSL_IE_ACT_TYPE, RSL_IE_Body:{act_type := c_RSL_IE_ActType_PDCH}) + } + } + template RSL_Message + tr_RSL_CHAN_ACT_PDCH(template (present) RslChannelNr chan_nr) := { msg_disc := tr_RSL_MsgDisc(RSL_MDISC_DCHAN, false), msg_type := RSL_MT_CHAN_ACTIV, ies :={ tr_RSL_IE(RSL_IE_Body:{chan_nr := chan_nr}), - tr_RSL_IE(RSL_IE_Body:{act_type := t_RSL_IE_ActType_PDCH}), + tr_RSL_IE(RSL_IE_Body:{act_type := c_RSL_IE_ActType_PDCH}), /* lots of optional IEs */ * } @@ -1410,12 +1779,27 @@ template RSL_Message tr_RSL_MsgTypeDR(template RSL_MessageType msg_type) modifie } } - /* Receive template for a measurement report that lacks the measurement report + /* Templates for a measurement report that lacks the measurement report * from the MS (l1_info, l3_info and ms timing offset */ - template RSL_Message tr_RSL_MEAS_RES_EMPTY(template RslChannelNr chan_nr, - template uint8_t meas_res_nr := ?, - template RSL_IE_UplinkMeas ul_meas := ?, - template RSL_IE_BS_Power bs_power := ?) := { + template (value) RSL_Message + ts_RSL_MEAS_RES_EMPTY(template (value) RslChannelNr chan_nr, + template (value) uint8_t meas_res_nr, + template (value) RSL_IE_UplinkMeas ul_meas, + template (value) RSL_IE_BS_Power bs_power) := { + msg_disc := ts_RSL_MsgDisc(RSL_MDISC_DCHAN, false), + msg_type := RSL_MT_MEAS_RES, + ies := { + t_RSL_IE(RSL_IE_CHAN_NR, RSL_IE_Body:{chan_nr := chan_nr}), + t_RSL_IE(RSL_IE_MEAS_RES_NR, RSL_IE_Body:{meas_res_nr := meas_res_nr}), + t_RSL_IE(RSL_IE_UPLINK_MEAS, RSL_IE_Body:{uplink_meas := ul_meas}), + t_RSL_IE(RSL_IE_BS_POWER, RSL_IE_Body:{bs_power := bs_power}) + } + } + template RSL_Message + tr_RSL_MEAS_RES_EMPTY(template (present) RslChannelNr chan_nr, + template uint8_t meas_res_nr := ?, + template RSL_IE_UplinkMeas ul_meas := ?, + template RSL_IE_BS_Power bs_power := ?) := { msg_disc := tr_RSL_MsgDisc(RSL_MDISC_DCHAN, false), msg_type := RSL_MT_MEAS_RES, ies := { @@ -1447,6 +1831,26 @@ template RSL_Message tr_RSL_MsgTypeDR(template RSL_MessageType msg_type) modifie } } + template (value) RSL_Message ts_RSL_MEAS_RES(template (value) RslChannelNr chan_nr, + uint8_t meas_res_nr, + template (value) RSL_IE_UplinkMeas ul_meas, + template (value) RSL_IE_BS_Power bs_power, + template (value) RSL_IE_L1Info l1_info, + octetstring l3_info, + uint8_t ms_to) := { + msg_disc := ts_RSL_MsgDisc(RSL_MDISC_DCHAN, false), + msg_type := RSL_MT_MEAS_RES, + ies := { + t_RSL_IE(RSL_IE_CHAN_NR, RSL_IE_Body:{chan_nr := chan_nr}), + t_RSL_IE(RSL_IE_MEAS_RES_NR, RSL_IE_Body:{meas_res_nr := meas_res_nr}), + t_RSL_IE(RSL_IE_UPLINK_MEAS, RSL_IE_Body:{uplink_meas := ul_meas}), + t_RSL_IE(RSL_IE_BS_POWER, RSL_IE_Body:{bs_power := bs_power}), + t_RSL_IE(RSL_IE_L1_INFO, RSL_IE_Body:{l1_info := l1_info}), + t_RSL_IE(RSL_IE_L3_INFO, RSL_IE_Body:{l3_info := ts_RSL_L16V(l3_info)}), + t_RSL_IE(RSL_IE_MS_TIMING_OFFSET, RSL_IE_Body:{ms_timing_offset := ms_to}) + } + } + /* 8.4.9 BSC -> BTS */ template (value) RSL_Message ts_RSL_MODE_MODIFY_REQ(template (value) RslChannelNr chan_nr, template (value) RSL_IE_ChannelMode mode) := { @@ -1469,7 +1873,25 @@ template RSL_Message tr_RSL_MsgTypeDR(template RSL_MessageType msg_type) modifie * } } - + + template RSL_Message tr_RSL_MODE_MODIFY_REQ_with_OSMO_TSC(template RslChannelNr chan_nr, + template RSL_IE_ChannelMode mode, + template uint8_t tsc_set := ?, + template uint8_t tsc := ?) := { + msg_disc := tr_RSL_MsgDisc(RSL_MDISC_DCHAN, false), + msg_type := RSL_MT_MODE_MODIFY_REQ, + ies := { + tr_RSL_IE(RSL_IE_Body:{chan_nr := chan_nr}), + tr_RSL_IE(RSL_IE_Body:{chan_mode := mode}), + tr_RSL_IE(RSL_IE_Body:{osmo_training_sequence := { + len := ?, + tsc_set := tsc_set, + tsc := tsc + } + }) + } + }; + /* 8.4.10 BTS -> BSC */ template (value) RSL_Message ts_RSL_MODE_MODIFY_ACK(template (value) RslChannelNr chan_nr) := { msg_disc := ts_RSL_MsgDisc(RSL_MDISC_DCHAN, false), @@ -1558,6 +1980,16 @@ template RSL_Message tr_RSL_MsgTypeDR(template RSL_MessageType msg_type) modifie /* One optional IE: BS POWER PARAMETERS */ } } + template RSL_Message tr_RSL_BS_PWR_CTRL(template (present) RslChannelNr chan_nr, + template (present) RSL_IE_BS_Power bs_power) := { + msg_disc := tr_RSL_MsgDisc(RSL_MDISC_DCHAN, false), + msg_type := RSL_MT_BS_POWER_CONTROL, + ies := { + tr_RSL_IE(RSL_IE_Body:{chan_nr := chan_nr}), + tr_RSL_IE(RSL_IE_Body:{bs_power := bs_power}) + /* One optional IE: BS POWER PARAMETERS */ + } + } /* 8.4.19 BTS -> BSC */ template (value) RSL_Message ts_RSL_RF_CHAN_REL_ACK(template (value) RslChannelNr chan_nr) := @@ -1585,6 +2017,17 @@ template RSL_Message tr_RSL_MsgTypeDR(template RSL_MessageType msg_type) modifie t_RSL_IE(RSL_IE_L3_INFO, RSL_IE_Body:{l3_info := ts_RSL_L16V(l3_info)}) } } + template RSL_Message tr_RSL_SACCH_INF_MOD(template RslChannelNr chan_nr, + template RSL_IE_SysinfoType si_type := ?, + template octetstring l3_info := ?) := { + msg_disc := tr_RSL_MsgDisc(RSL_MDISC_DCHAN, false), + msg_type := RSL_MT_SACCH_INFO_MODIFY, + ies := { + tr_RSL_IE(RSL_IE_Body:{chan_nr := chan_nr}), + tr_RSL_IE(RSL_IE_Body:{sysinfo_type := si_type}), + tr_RSL_IE(RSL_IE_Body:{l3_info := tr_RSL_L16V(l3_info)}) + } + } /* 8.4.7 BTS -> BSC */ template (value) RSL_Message ts_RSL_HANDO_DET(template (value) RslChannelNr chan_nr) := { @@ -1604,6 +2047,42 @@ template RSL_Message tr_RSL_MsgTypeDR(template RSL_MessageType msg_type) modifie } } + /* 8.4.21 BTS -> BSC */ + template (value) RSL_Message ts_RSL_TALKER_DET(template (value) RslChannelNr chan_nr) := { + msg_disc := ts_RSL_MsgDisc(RSL_MDISC_DCHAN, false), + msg_type := RSL_MT_TALKER_DET, + ies := { + t_RSL_IE(RSL_IE_CHAN_NR, RSL_IE_Body:{chan_nr := chan_nr}) + } + } + template RSL_Message tr_RSL_TALKER_DET(template RslChannelNr chan_nr, + template uint8_t acc_delay := ?) := { + msg_disc := tr_RSL_MsgDisc(RSL_MDISC_DCHAN, false), + msg_type := RSL_MT_TALKER_DET, + ies := { + tr_RSL_IE(RSL_IE_Body:{chan_nr := chan_nr}), + tr_RSL_IE(RSL_IE_Body:{access_delay := acc_delay}) + } + } + + /* 8.4.22 BTS -> BSC */ + template (value) RSL_Message ts_RSL_LISTENER_DET(template (value) RslChannelNr chan_nr) := { + msg_disc := ts_RSL_MsgDisc(RSL_MDISC_DCHAN, false), + msg_type := RSL_MT_LISTENER_DET, + ies := { + t_RSL_IE(RSL_IE_CHAN_NR, RSL_IE_Body:{chan_nr := chan_nr}) + } + } + template RSL_Message tr_RSL_LISTENER_DET(template RslChannelNr chan_nr, + template uint8_t acc_delay := ?) := { + msg_disc := tr_RSL_MsgDisc(RSL_MDISC_DCHAN, false), + msg_type := RSL_MT_LISTENER_DET, + ies := { + tr_RSL_IE(RSL_IE_Body:{chan_nr := chan_nr}), + tr_RSL_IE(RSL_IE_Body:{access_delay := acc_delay}) + } + } + /* COMMON CHANNEL MANAGEMENT MESSAGES */ @@ -1762,12 +2241,6 @@ template RSL_Message tr_RSL_MsgTypeDR(template RSL_MessageType msg_type) modifie } } - template RSL_Message tr_RSL_RF_RES_IND := { - msg_disc := tr_RSL_MsgDisc(RSL_MDISC_TRX_MGMT, false), - msg_type := RSL_MT_RF_RES_IND, - ies := * - } - /* 8.5.8 BTS <- BSC SMS BROADCAST COMMAND */ template RSL_Message tr_RSL_SMSCB_CMD(template RSL_IE_CbCommandType cb_cmd := ?, template octetstring msg := ?, @@ -1840,6 +2313,35 @@ template RSL_Message tr_RSL_MsgTypeDR(template RSL_MessageType msg_type) modifie } + /* 8.6.1 BTS -> BSC */ + template (value) RSL_Message + ts_RSL_RF_RES_IND(template (value) RSL_ResourceInfo info) := { + msg_disc := ts_RSL_MsgDisc(RSL_MDISC_TRX_MGMT, false), + msg_type := RSL_MT_RF_RES_IND, + ies := { + t_RSL_IE(RSL_IE_RESOURCE_INFO, RSL_IE_Body:{ + resource_info := { + len := 0, /* overwritten */ + info := info + } + }) + } + } + template RSL_Message + tr_RSL_RF_RES_IND(template (present) RSL_ResourceInfo info := ?) := { + msg_disc := tr_RSL_MsgDisc(RSL_MDISC_TRX_MGMT, false), + msg_type := RSL_MT_RF_RES_IND, + ies := { + tr_RSL_IE(RSL_IE_Body:{ + resource_info := { + len := ?, + info := info + } + }) + } + } + + /* 8.6.2 BTS <- BSC */ template (value) RSL_Message ts_RSL_SACCH_FILL(RSL_IE_SysinfoType si_type, octetstring l3_info) := { msg_disc := ts_RSL_MsgDisc(RSL_MDISC_TRX_MGMT, false), @@ -1889,6 +2391,49 @@ template RSL_Message tr_RSL_MsgTypeDR(template RSL_MessageType msg_type) modifie /* Abis/IP specific messages */ + private function f_ts_RSL_IPA_CRCX_IEs(template (value) RslChannelNr chan_nr, + template (omit) OCT4 remote_ip, + template (omit) uint16_t remote_port, + template (omit) uint8_t osmux_cid) + return RSL_IE_List { + var RSL_IE_List ies; + + /* Channel Number is a mandatory IE */ + ies := { + valueof(RSL_IE:{ + iei := RSL_IE_CHAN_NR, + body := { chan_nr := chan_nr } + }) + }; + /* Remote IP / Port are optional IEs */ + if (not istemplatekind(remote_ip, "omit")) { + ies := ies & { + valueof(RSL_IE:{ + iei := RSL_IE_IPAC_REMOTE_IP, + body := { ipa_remote_ip := remote_ip } + }) + }; + } + if (not istemplatekind(remote_port, "omit")) { + ies := ies & { + valueof(RSL_IE:{ + iei := RSL_IE_IPAC_REMOTE_PORT, + body := { ipa_remote_port := remote_port } + }) + }; + } + /* Osmux CID extension IE is optional: */ + if (not istemplatekind(osmux_cid, "omit")) { + ies := ies & { + valueof(RSL_IE:{ + iei := RSL_IE_OSMO_OSMUX_CID, + body := { osmux_cid := ts_RSL_IE_OSMO_Osmux_CID(osmux_cid) } + }) + }; + } + + return ies; + } template RSL_Message tr_RSL_IPA_CRCX(template RslChannelNr chan_nr) := { msg_disc := tr_RSL_MsgDisc(RSL_MDISC_IPACCESS, false), msg_type := RSL_MT_IPAC_CRCX, @@ -1897,41 +2442,59 @@ template RSL_Message tr_RSL_MsgTypeDR(template RSL_MessageType msg_type) modifie * } } - template (value) RSL_Message ts_RSL_IPA_CRCX(template (value) RslChannelNr chan_nr) := { + template (value) RSL_Message + ts_RSL_IPA_CRCX(template (value) RslChannelNr chan_nr, + template (omit) OCT4 remote_ip := omit, + template (omit) uint16_t remote_port := omit, + template (omit) uint8_t osmux_cid := omit) := { msg_disc := ts_RSL_MsgDisc(RSL_MDISC_IPACCESS, false), msg_type := RSL_MT_IPAC_CRCX, - ies := { - t_RSL_IE(RSL_IE_CHAN_NR, RSL_IE_Body:{chan_nr := chan_nr}) + ies := f_ts_RSL_IPA_CRCX_IEs(chan_nr, remote_ip, remote_port, osmux_cid) + } + + function ts_RSL_IPA_CRCX_ACK(template (value) RslChannelNr chan_nr, + uint16_t ipa_conn_id, OCT4 local_ip, + uint16_t local_port, uint7_t rtp_pt2, + template (omit) uint8_t osmux_cid := omit) + return template (value) RSL_Message { + var template (value) RSL_Message msg := { + msg_disc := ts_RSL_MsgDisc(RSL_MDISC_IPACCESS, false), + msg_type := RSL_MT_IPAC_CRCX_ACK, + ies := { + t_RSL_IE(RSL_IE_CHAN_NR, RSL_IE_Body:{chan_nr := chan_nr}), + t_RSL_IE(RSL_IE_IPAC_CONN_ID, RSL_IE_Body:{ipa_conn_id := ipa_conn_id}), + t_RSL_IE(RSL_IE_IPAC_LOCAL_IP, RSL_IE_Body:{ipa_local_ip := local_ip}), + t_RSL_IE(RSL_IE_IPAC_LOCAL_PORT, RSL_IE_Body:{ipa_local_port := local_port}), + t_RSL_IE(RSL_IE_IPAC_RTP_PAYLOAD2, RSL_IE_Body:{ipa_rtp_pt2 := rtp_pt2}) + } } - } - - - template (value) RSL_Message ts_RSL_IPA_CRCX_ACK(template (value) RslChannelNr chan_nr, - uint16_t ipa_conn_id, uint32_t local_ip, - uint16_t local_port, uint7_t rtp_pt2) := { - msg_disc := ts_RSL_MsgDisc(RSL_MDISC_IPACCESS, false), - msg_type := RSL_MT_IPAC_CRCX_ACK, - ies := { - t_RSL_IE(RSL_IE_CHAN_NR, RSL_IE_Body:{chan_nr := chan_nr}), - t_RSL_IE(RSL_IE_IPAC_CONN_ID, RSL_IE_Body:{ipa_conn_id := ipa_conn_id}), - t_RSL_IE(RSL_IE_IPAC_LOCAL_IP, RSL_IE_Body:{ipa_local_ip := local_ip}), - t_RSL_IE(RSL_IE_IPAC_LOCAL_PORT, RSL_IE_Body:{ipa_local_port := local_port}), - t_RSL_IE(RSL_IE_IPAC_RTP_PAYLOAD2, RSL_IE_Body:{ipa_rtp_pt2 := rtp_pt2}) + if (not istemplatekind(osmux_cid, "omit")) { + msg.ies[lengthof(msg.ies)] := t_RSL_IE(RSL_IE_OSMO_OSMUX_CID, RSL_IE_Body:{osmux_cid := ts_RSL_IE_OSMO_Osmux_CID(osmux_cid)}); + } + return msg; + } + + function tr_RSL_IPA_CRCX_ACK(template RslChannelNr chan_nr, + template uint16_t ipa_conn_id, + template OCT4 local_ip, + template uint16_t local_port, + template uint8_t osmux_cid := omit) + return template RSL_Message { + var template RSL_Message msg := { + msg_disc := ts_RSL_MsgDisc(RSL_MDISC_IPACCESS, false), + msg_type := RSL_MT_IPAC_CRCX_ACK, + ies := { + tr_RSL_IE(RSL_IE_Body:{chan_nr := chan_nr}), + tr_RSL_IE(RSL_IE_Body:{ipa_conn_id := ipa_conn_id}), + tr_RSL_IE(RSL_IE_Body:{ipa_local_ip := local_ip}), + tr_RSL_IE(RSL_IE_Body:{ipa_local_port := local_port}) + /* Optional: RTP Payload Type 2 IE */ + } } - } - template RSL_Message tr_RSL_IPA_CRCX_ACK(template RslChannelNr chan_nr, - template uint16_t ipa_conn_id, - template uint32_t local_ip, - template uint16_t local_port) := { - msg_disc := tr_RSL_MsgDisc(RSL_MDISC_IPACCESS, false), - msg_type := RSL_MT_IPAC_CRCX_ACK, - ies := { - tr_RSL_IE(RSL_IE_Body:{chan_nr := chan_nr}), - tr_RSL_IE(RSL_IE_Body:{ipa_conn_id := ipa_conn_id}), - tr_RSL_IE(RSL_IE_Body:{ipa_local_ip := local_ip}), - tr_RSL_IE(RSL_IE_Body:{ipa_local_port := local_port}) - /* Optional: RTP Payload Type 2 IE */ + if (not istemplatekind(osmux_cid, "omit")) { + msg.ies[lengthof(msg.ies)] := tr_RSL_IE(RSL_IE_Body:{osmux_cid := f_tr_RSL_IE_OSMO_Osmux_CID(osmux_cid)}); } + return msg; } template (value) RSL_Message ts_RSL_IPA_CRCX_NACK(template (value) RslChannelNr chan_nr, @@ -1953,20 +2516,28 @@ template RSL_Message tr_RSL_MsgTypeDR(template RSL_MessageType msg_type) modifie } } - template (value) RSL_Message ts_RSL_IPA_MDCX(template (value) RslChannelNr chan_nr, - uint16_t ipa_conn_id, - uint32_t remote_ip, uint16_t remote_port, - uint7_t rtp_pt2) := { - msg_disc := ts_RSL_MsgDisc(RSL_MDISC_IPACCESS, false), - msg_type := RSL_MT_IPAC_MDCX, - ies := { - t_RSL_IE(RSL_IE_CHAN_NR, RSL_IE_Body:{chan_nr := chan_nr}), - t_RSL_IE(RSL_IE_IPAC_CONN_ID, RSL_IE_Body:{ipa_conn_id := ipa_conn_id}), - t_RSL_IE(RSL_IE_IPAC_REMOTE_IP, RSL_IE_Body:{ipa_remote_ip := remote_ip}), - t_RSL_IE(RSL_IE_IPAC_REMOTE_PORT, RSL_IE_Body:{ipa_remote_port := remote_port}), - /* optional: RTP Payload Type */ - t_RSL_IE(RSL_IE_IPAC_RTP_PAYLOAD2, RSL_IE_Body:{ipa_rtp_pt2 := rtp_pt2}) + function ts_RSL_IPA_MDCX(template (value) RslChannelNr chan_nr, + uint16_t ipa_conn_id, + OCT4 remote_ip, uint16_t remote_port, + uint7_t rtp_pt2, + template (omit) uint8_t osmux_cid := omit) + return template (value) RSL_Message { + var template (value) RSL_Message msg := { + msg_disc := ts_RSL_MsgDisc(RSL_MDISC_IPACCESS, false), + msg_type := RSL_MT_IPAC_MDCX, + ies := { + t_RSL_IE(RSL_IE_CHAN_NR, RSL_IE_Body:{chan_nr := chan_nr}), + t_RSL_IE(RSL_IE_IPAC_CONN_ID, RSL_IE_Body:{ipa_conn_id := ipa_conn_id}), + t_RSL_IE(RSL_IE_IPAC_REMOTE_IP, RSL_IE_Body:{ipa_remote_ip := remote_ip}), + t_RSL_IE(RSL_IE_IPAC_REMOTE_PORT, RSL_IE_Body:{ipa_remote_port := remote_port}), + /* optional: RTP Payload Type */ + t_RSL_IE(RSL_IE_IPAC_RTP_PAYLOAD2, RSL_IE_Body:{ipa_rtp_pt2 := rtp_pt2}) + } } + if (not istemplatekind(osmux_cid, "omit")) { + msg.ies[lengthof(msg.ies)] := t_RSL_IE(RSL_IE_OSMO_OSMUX_CID, RSL_IE_Body:{osmux_cid := ts_RSL_IE_OSMO_Osmux_CID(osmux_cid)}); + } + return msg; } template RSL_Message tr_RSL_IPA_MDCX(template RslChannelNr chan_nr, template uint16_t ipa_conn_id) := { @@ -1979,38 +2550,54 @@ template RSL_Message tr_RSL_MsgTypeDR(template RSL_MessageType msg_type) modifie } } - template (value) RSL_Message ts_RSL_IPA_MDCX_ACK(template (value) RslChannelNr chan_nr, - uint16_t ipa_conn_id, - uint32_t local_ip, uint16_t local_port, - uint7_t rtp_pt2) := { - msg_disc := ts_RSL_MsgDisc(RSL_MDISC_IPACCESS, false), - msg_type := RSL_MT_IPAC_MDCX_ACK, - ies := { - t_RSL_IE(RSL_IE_CHAN_NR, RSL_IE_Body:{chan_nr := chan_nr}), - /* optional */ - t_RSL_IE(RSL_IE_IPAC_CONN_ID, RSL_IE_Body:{ipa_conn_id := ipa_conn_id}), - t_RSL_IE(RSL_IE_IPAC_LOCAL_IP, RSL_IE_Body:{ipa_local_ip := local_ip}), - t_RSL_IE(RSL_IE_IPAC_LOCAL_PORT, RSL_IE_Body:{ipa_local_port := local_port}), - /* optional: RTP Payload Type */ - t_RSL_IE(RSL_IE_IPAC_RTP_PAYLOAD2, RSL_IE_Body:{ipa_rtp_pt2 := rtp_pt2}) + function ts_RSL_IPA_MDCX_ACK(template (value) RslChannelNr chan_nr, + uint16_t ipa_conn_id, + OCT4 local_ip, uint16_t local_port, + uint7_t rtp_pt2, + template (omit) uint8_t osmux_cid := omit) + return template (value) RSL_Message { + var template (value) RSL_Message msg := { + msg_disc := ts_RSL_MsgDisc(RSL_MDISC_IPACCESS, false), + msg_type := RSL_MT_IPAC_MDCX_ACK, + ies := { + t_RSL_IE(RSL_IE_CHAN_NR, RSL_IE_Body:{chan_nr := chan_nr}), + /* optional */ + t_RSL_IE(RSL_IE_IPAC_CONN_ID, RSL_IE_Body:{ipa_conn_id := ipa_conn_id}), + t_RSL_IE(RSL_IE_IPAC_LOCAL_IP, RSL_IE_Body:{ipa_local_ip := local_ip}), + t_RSL_IE(RSL_IE_IPAC_LOCAL_PORT, RSL_IE_Body:{ipa_local_port := local_port}), + /* optional: RTP Payload Type */ + t_RSL_IE(RSL_IE_IPAC_RTP_PAYLOAD2, RSL_IE_Body:{ipa_rtp_pt2 := rtp_pt2}) + } } - } - template RSL_Message tr_RSL_IPA_MDCX_ACK(template RslChannelNr chan_nr, - template uint16_t ipa_conn_id, - template uint32_t local_ip, - template uint16_t local_port, - template uint7_t rtp_pt2) := { - msg_disc := tr_RSL_MsgDisc(RSL_MDISC_IPACCESS, false), - msg_type := RSL_MT_IPAC_MDCX_ACK, - ies := { - tr_RSL_IE(RSL_IE_Body:{chan_nr := chan_nr}), - /* optional */ - tr_RSL_IE(RSL_IE_Body:{ipa_conn_id := ipa_conn_id}), - tr_RSL_IE(RSL_IE_Body:{ipa_local_ip := local_ip}), - tr_RSL_IE(RSL_IE_Body:{ipa_local_port := local_port}), - /* optional: RTP Payload Type */ - tr_RSL_IE(RSL_IE_Body:{ipa_rtp_pt2 := rtp_pt2}) + if (not istemplatekind(osmux_cid, "omit")) { + msg.ies[lengthof(msg.ies)] := t_RSL_IE(RSL_IE_OSMO_OSMUX_CID, RSL_IE_Body:{osmux_cid := ts_RSL_IE_OSMO_Osmux_CID(osmux_cid)}); + } + return msg; + } + function tr_RSL_IPA_MDCX_ACK(template RslChannelNr chan_nr, + template uint16_t ipa_conn_id, + template OCT4 local_ip, + template uint16_t local_port, + template uint7_t rtp_pt2, + template uint8_t osmux_cid := omit) + return template RSL_Message { + var template RSL_Message msg := { + msg_disc := ts_RSL_MsgDisc(RSL_MDISC_IPACCESS, false), + msg_type := RSL_MT_IPAC_MDCX_ACK, + ies := { + tr_RSL_IE(RSL_IE_Body:{chan_nr := chan_nr}), + /* optional */ + tr_RSL_IE(RSL_IE_Body:{ipa_conn_id := ipa_conn_id}), + tr_RSL_IE(RSL_IE_Body:{ipa_local_ip := local_ip}), + tr_RSL_IE(RSL_IE_Body:{ipa_local_port := local_port}), + /* optional: RTP Payload Type */ + tr_RSL_IE(RSL_IE_Body:{ipa_rtp_pt2 := rtp_pt2}) + } } + if (not istemplatekind(osmux_cid, "omit")) { + msg.ies[lengthof(msg.ies)] := tr_RSL_IE(RSL_IE_Body:{osmux_cid := f_tr_RSL_IE_OSMO_Osmux_CID(osmux_cid)}); + } + return msg; } template (value) RSL_Message ts_RSL_IPA_MDCX_NACK(template (value) RslChannelNr chan_nr, @@ -2122,14 +2709,16 @@ template RSL_Message tr_RSL_MsgTypeDR(template RSL_MessageType msg_type) modifie } - template (value) RSL_Message ts_RSL_IPA_PDCH_ACT(RslChannelNr chan_nr) := { + template (value) RSL_Message + ts_RSL_IPA_PDCH_ACT(template (value) RslChannelNr chan_nr) := { msg_disc := ts_RSL_MsgDisc(RSL_MDISC_DCHAN, false), msg_type := RSL_MT_IPAC_PDCH_ACT, ies := { t_RSL_IE(RSL_IE_CHAN_NR, RSL_IE_Body:{chan_nr := chan_nr}) } } - template RSL_Message tr_RSL_IPA_PDCH_ACT(template RslChannelNr chan_nr) := { + template RSL_Message + tr_RSL_IPA_PDCH_ACT(template (present) RslChannelNr chan_nr) := { msg_disc := ts_RSL_MsgDisc(RSL_MDISC_DCHAN, false), msg_type := RSL_MT_IPAC_PDCH_ACT, ies := { @@ -2242,6 +2831,50 @@ template RSL_Message tr_RSL_MsgTypeDR(template RSL_MessageType msg_type) modifie } } + template (value) RSL_Message ts_RSL_NOTIF_CMD_START(template (value) GroupCallRef group_call_ref, + template (value) octetstring chan_desc) := { + msg_disc := ts_RSL_MsgDisc(RSL_MDISC_CCHAN, false), + msg_type := RSL_MT_NOT_CMD, + ies := { + t_RSL_IE(RSL_IE_CHAN_NR, RSL_IE_Body:{chan_nr := ts_RslChanNr_PCH_AGCH(0)}), + t_RSL_IE(RSL_IE_CMD_INDICATOR, RSL_IE_Body:{cmd_indicator := ts_CommandInd(CMD_IND_START)}), + t_RSL_IE(RSL_IE_GROUP_CALL_REF, RSL_IE_Body:{group_call_ref := ts_GroupCallRef(group_call_ref)}), + t_RSL_IE(RSL_IE_GROUP_CHAN_DESC, RSL_IE_Body:{group_chan_desc := ts_GroupChanDesc(chan_desc)}) + } + } + template RSL_Message tr_RSL_NOTIF_CMD_START(template (present) GroupCallRef group_call_ref, + template (present) octetstring chan_desc := ?) := { + msg_disc := tr_RSL_MsgDisc(RSL_MDISC_CCHAN, false), + msg_type := RSL_MT_NOT_CMD, + ies := { + tr_RSL_IE(RSL_IE_Body:{chan_nr := t_RslChanNr_PCH_AGCH(0)}), + tr_RSL_IE(RSL_IE_Body:{cmd_indicator := tr_CommandInd(CMD_IND_START)}), + tr_RSL_IE(RSL_IE_Body:{group_call_ref := tr_GroupCallRef(group_call_ref)}), + tr_RSL_IE(RSL_IE_Body:{group_chan_desc := tr_GroupChanDesc(chan_desc)}), + * + } + } + + template (value) RSL_Message ts_RSL_NOTIF_CMD_STOP(template (value) GroupCallRef group_call_ref) := { + msg_disc := ts_RSL_MsgDisc(RSL_MDISC_CCHAN, false), + msg_type := RSL_MT_NOT_CMD, + ies := { + t_RSL_IE(RSL_IE_CHAN_NR, RSL_IE_Body:{chan_nr := ts_RslChanNr_PCH_AGCH(0)}), + t_RSL_IE(RSL_IE_CMD_INDICATOR, RSL_IE_Body:{cmd_indicator := ts_CommandInd(CMD_IND_STOP)}), + t_RSL_IE(RSL_IE_GROUP_CALL_REF, RSL_IE_Body:{group_call_ref := ts_GroupCallRef(group_call_ref)}) + } + } + template RSL_Message tr_RSL_NOTIF_CMD_STOP(template (present) GroupCallRef group_call_ref) := { + msg_disc := tr_RSL_MsgDisc(RSL_MDISC_CCHAN, false), + msg_type := RSL_MT_NOT_CMD, + ies := { + tr_RSL_IE(RSL_IE_Body:{chan_nr := t_RslChanNr_PCH_AGCH(0)}), + tr_RSL_IE(RSL_IE_Body:{cmd_indicator := tr_CommandInd(CMD_IND_STOP)}), + tr_RSL_IE(RSL_IE_Body:{group_call_ref := tr_GroupCallRef(group_call_ref)}), + * + } + } + function f_rsl_find_ie(RSL_Message msg, RSL_IE_Type iei, out RSL_IE_Body ret) return boolean { |