428 lines
12 KiB
Plaintext
428 lines
12 KiB
Plaintext
/* GPRS RLC/MAC Control Messages as per 3GPP TS 44.060 manually transcribed from the CSN.1 syntax, as no CSN.1
|
|
* tool for Eclipse TITAN could be found. Implements only the minimum necessary messages for Osmocom teseting
|
|
* purposes. */
|
|
|
|
/* (C) 2017-2018 Harald Welte <laforge@gnumonks.org>
|
|
* contributions by sysmocom - s.f.m.c. GmbH
|
|
* 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 RLCMAC_CSN1_Templates {
|
|
import from General_Types all;
|
|
import from Osmocom_Types all;
|
|
import from GSM_Types all;
|
|
import from MobileL3_GMM_SM_Types all;
|
|
import from RLCMAC_CSN1_Types all;
|
|
|
|
/* 11.2.1 Packet Access Reject */
|
|
template PacketAccessRejectStruct tr_PacketAccessRejectStruct_TLLI(template GprsTlli tlli := ?,
|
|
template uint8_t wait_ind := *,
|
|
template BIT1 wait_ind_size := *) := {
|
|
id_type := '0'B,
|
|
id := {
|
|
tlli := tlli
|
|
},
|
|
wait_ind_presence := ?,
|
|
wait_ind := wait_ind,
|
|
wait_ind_size := wait_ind_size
|
|
}
|
|
template RlcmacDlCtrlMsg tr_RlcMacDlCtrl_PKT_ACC_REJ(template PacketAccessRejectStruct rej := ?) := {
|
|
msg_type := PACKET_ACCESS_REJECT,
|
|
u := {
|
|
access_reject := {
|
|
page_mode := ?,
|
|
reject_struct := rej
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) RlcmacUlCtrlMsg ts_RlcMacUlCtrl_PKT_CTRL_ACK(GprsTlli tlli,
|
|
CtrlAck ack := MS_RCVD_TWO_RLC_SAME_RTI_DIFF_RBSN) := {
|
|
msg_type := PACKET_CONTROL_ACK,
|
|
u := {
|
|
ctrl_ack := {
|
|
tlli := tlli,
|
|
ctrl_ack := ack
|
|
}
|
|
}
|
|
}
|
|
|
|
const ILevel iNone := {
|
|
presence := '0'B,
|
|
i_level := omit
|
|
}
|
|
const ChannelQualityReport c_ChQualRep_default := {
|
|
c_value := 0,
|
|
rxqual := 0,
|
|
sign_var := 0,
|
|
i_levels := { iNone, iNone, iNone, iNone, iNone, iNone, iNone, iNone }
|
|
}
|
|
template (value) RlcmacUlCtrlMsg ts_RlcMacUlCtrl_PKT_DL_ACK(uint5_t dl_tfi,
|
|
AckNackDescription andesc,
|
|
ChannelQualityReport qual_rep := c_ChQualRep_default) := {
|
|
msg_type := PACKET_DL_ACK_NACK,
|
|
u := {
|
|
dl_ack_nack := {
|
|
dl_tfi := dl_tfi,
|
|
ack_nack_desc := andesc,
|
|
chreq_desc_presence := '0'B,
|
|
chreq_desc := omit,
|
|
ch_qual_rep := qual_rep
|
|
}
|
|
}
|
|
}
|
|
|
|
private function f_presence_bit_MSRadioAccessCapabilityV(template (omit) MSRadioAccessCapabilityV ms_rac) return BIT1 {
|
|
if (istemplatekind(ms_rac, "omit")) {
|
|
return '0'B;
|
|
}
|
|
return '1'B;
|
|
}
|
|
|
|
private function f_template_MSRadioAccessCapabilityV_to_MSRadioAccCap2(template (omit) MSRadioAccessCapabilityV ms_rac) return template (omit) MSRadioAccCap2 {
|
|
var template (omit) MSRadioAccCap2 ms_rac2 := omit;
|
|
if (istemplatekind(ms_rac, "omit")) {
|
|
return ms_rac2;
|
|
}
|
|
ms_rac2 := { msRadioAccessCapabilityV := ms_rac };
|
|
return ms_rac2;
|
|
}
|
|
|
|
const ChannelReqDescription c_ChReqDesc_default := {
|
|
peak_tput_class := 0,
|
|
priority := 0,
|
|
rlc_mode := RLC_MODE_ACKNOWLEDGED,
|
|
llc_pdu_type := LLC_PDU_IS_NOT_SACK_OR_ACK,
|
|
RlcOctetCount := 0
|
|
}
|
|
|
|
template (value) ChannelReqDescription ts_ChannelReqDescription(uint4_t peak_tput_class := 0,
|
|
uint2_t priority := 0,
|
|
RlcMode rlc_mode := RLC_MODE_ACKNOWLEDGED,
|
|
LlcPduType llc_pdu_type := LLC_PDU_IS_NOT_SACK_OR_ACK,
|
|
uint16_t RlcOctetCount := 0) := {
|
|
peak_tput_class := peak_tput_class,
|
|
priority := priority,
|
|
rlc_mode := rlc_mode,
|
|
llc_pdu_type := llc_pdu_type,
|
|
RlcOctetCount := RlcOctetCount
|
|
};
|
|
|
|
/* TS 44.060 sec 11.2.16 */
|
|
template (value) RlcmacUlCtrlMsg ts_RlcMacUlCtrl_PKT_RES_REQ(GprsTlli tlli,
|
|
template (omit) MSRadioAccessCapabilityV ms_rac,
|
|
ChannelReqDescription ch_req_desc := c_ChReqDesc_default,
|
|
RlcAccessType acc_type := RLC_ACC_TYPE_TWO_PHASE)
|
|
:= {
|
|
msg_type := PACKET_RESOURCE_REQUEST,
|
|
u := {
|
|
resource_req := {
|
|
acc_type_presence := '1'B,
|
|
acc_type := acc_type,
|
|
id_type := '1'B,
|
|
id := { tlli := tlli },
|
|
ms_rac2_presence := f_presence_bit_MSRadioAccessCapabilityV(ms_rac),
|
|
ms_rac2 := f_template_MSRadioAccessCapabilityV_to_MSRadioAccCap2(ms_rac),
|
|
ch_req_desc := ch_req_desc,
|
|
change_mark_presence := '0'B,
|
|
change_mark := omit,
|
|
C_val := '000000'B,
|
|
sign_var_presence := '0'B,
|
|
sign_var := omit,
|
|
I_levels := {
|
|
iNone, iNone, iNone, iNone,
|
|
iNone, iNone, iNone, iNone
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
const CCNMesurementReport ccn_meas_rep_def := {
|
|
rxlev_servig_cell := 0,
|
|
zero := '0'B,
|
|
num_meas := 0,
|
|
meas := { }
|
|
}
|
|
|
|
/* TS 44.060 sec 11.2.3a */
|
|
template (value) RlcmacUlCtrlMsg ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(uint5_t tfi,
|
|
GsmArfcn arfcn,
|
|
uint6_t bsic,
|
|
template (value) CCNMesurementReport ccn_meas_rep := ccn_meas_rep_def)
|
|
:= {
|
|
msg_type := PACKET_CELL_CHANGE_NOTIFICATION,
|
|
u := {
|
|
cell_chg_notif := {
|
|
gtfi := {
|
|
is_dl_tfi := false,
|
|
tfi := tfi
|
|
},
|
|
arfcn_bsic_presence := '0'B,
|
|
arfcn := arfcn,
|
|
bsic := bsic,
|
|
ba_psi3_presence := '0'B,
|
|
ba_used := '0'B,
|
|
psi3_change_mark := omit,
|
|
pmo_used := '0'B,
|
|
pccn_sending := '0'B,
|
|
ccn_meas_rep := ccn_meas_rep
|
|
}
|
|
}
|
|
};
|
|
|
|
/* TS 44.060 sec 11.2.2a */
|
|
template RlcmacDlCtrlMsg tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE(template GlobalTfi tfi := ?)
|
|
:= {
|
|
msg_type := PACKET_CELL_CHANGE_CONTINUE,
|
|
u := {
|
|
cell_chg_continue := {
|
|
page_mode := ?,
|
|
zero := '0'B,
|
|
gtfi := tfi,
|
|
arfcn_bsic_presence := ?,
|
|
arfcn := *,
|
|
bsic := *,
|
|
container_id := *
|
|
}
|
|
}
|
|
};
|
|
|
|
/* TS 44.060 sec 11.2.9 */
|
|
template (value) NCMeasurement ts_NCMeasurement(uint6_t frequency_n, BIT6 bsic, uint6_t rxlev)
|
|
:= {
|
|
frequency_n := frequency_n,
|
|
bsic_n_presence := '1'B,
|
|
bsic_n := bsic,
|
|
rxlev_n := rxlev
|
|
};
|
|
template (value) NCMeasurementReport ts_NCMeasurementReport(BIT1 nc_mode,
|
|
uint6_t rxlev_serving_cell,
|
|
template (value) NCMeasurementList nc_meas_list := {})
|
|
:= {
|
|
nc_mode := nc_mode,
|
|
rxlev_serving_cell := rxlev_serving_cell,
|
|
zero := '0'B,
|
|
num_nc_measurements := 0, /* automatically updated */
|
|
nm_measurements := nc_meas_list
|
|
};
|
|
template RlcmacUlCtrlMsg ts_RlcMacUlCtrl_PKT_MEAS_REPORT(template (value) GprsTlli tlli,
|
|
template (value) NCMeasurementReport nc_meas_rep)
|
|
:= {
|
|
msg_type := PACKET_MEASUREMENT_REPORT,
|
|
u := {
|
|
meas_report := {
|
|
tlli := tlli,
|
|
psi5_change_mark_presence := '0'B,
|
|
psi5_change_mark := omit,
|
|
additions_99 := '0'B,
|
|
nc_meas_report := nc_meas_rep
|
|
}
|
|
}
|
|
};
|
|
|
|
/* TS 44.060 sec 11.2.9b */
|
|
template RepeatedAddFrequencyItem tr_RepeatedAddFrequencyItem(template (present) uint10_t start_frequency := ?,
|
|
template (present) uint6_t bsic := ?)
|
|
:= {
|
|
presence := '1'B,
|
|
item := {
|
|
start_frequency := start_frequency,
|
|
bsic := bsic,
|
|
cell_sel_par_present := ?,
|
|
cell_sel_par := *,
|
|
nr_of_frequencies := 0,
|
|
freq_diff_length := ?
|
|
/* TODO: support Frequency diff list */
|
|
}
|
|
};
|
|
template NCFrequencyList tr_NCFrequencyList(template FreqIndexList removed_freq_index := *, template RepeatedAddFrequencyItemList repeated_add_frequency := *)
|
|
:= {
|
|
removed_freq_present := ?,
|
|
nr_of_removed_freq := *,
|
|
removed_freq_index := removed_freq_index,
|
|
repeated_add_frequency := repeated_add_frequency,
|
|
repeated_add_frequency_term := '0'B
|
|
};
|
|
template NCMeasurementParameters tr_NCMeasurementParameters(template (present) NetworkControlOrder nco := ?,
|
|
template uint3_t nc_non_drx_period := *,
|
|
template uint3_t nc_reporting_period_i := *,
|
|
template uint3_t nc_reporting_period_t := *,
|
|
template NCFrequencyList nc_freq_list := *)
|
|
:= {
|
|
nco := nco,
|
|
nc_period_present := ?,
|
|
nc_non_drx_period := nc_non_drx_period,
|
|
nc_reporting_period_i := nc_reporting_period_i,
|
|
nc_reporting_period_t := nc_reporting_period_t,
|
|
nc_freq_list_present := ?,
|
|
nc_freq_list := nc_freq_list
|
|
};
|
|
/* This template is used by osmo-pcu to reset the GSM Neighbour Cell List of the MS */
|
|
template (value) NCMeasurementParameters ts_NCMeasurementParametersRESET
|
|
:= {
|
|
nco := NC_RESET,
|
|
nc_period_present := '0'B,
|
|
nc_non_drx_period := omit,
|
|
nc_reporting_period_i := omit,
|
|
nc_reporting_period_t := omit,
|
|
nc_freq_list_present := '0'B,
|
|
nc_freq_list := omit
|
|
};
|
|
template RlcmacDlCtrlMsg tr_RlcMacDlCtrl_PKT_MEAS_ORDER(template (present) GlobalTfiOrTlli tfi_or_tlli := ?,
|
|
template (present) uint3_t pmo_index := ?,
|
|
template (present) uint3_t pmo_count := ?,
|
|
template (present) NCMeasurementParameters nc_meas_param := ?)
|
|
:= {
|
|
msg_type := PACKET_MEASUREMENT_ORDER,
|
|
u := {
|
|
meas_order := {
|
|
page_mode := ?,
|
|
tfi_or_tlli := tfi_or_tlli,
|
|
pmo_index := pmo_index,
|
|
pmo_count := pmo_count,
|
|
nc_meas_param_present := '1'B,
|
|
nc_meas_param := nc_meas_param,
|
|
zero := '0'B
|
|
}
|
|
}
|
|
};
|
|
|
|
/* TS 44.060 sec 11.2.9e */
|
|
template RlcmacDlCtrlMsg tr_RlcMacDlCtrl_PKT_NEIGH_CELL_DATA(template (present) GlobalTfi tfi := ?,
|
|
template (present) uint5_t container_index := ?)
|
|
:= {
|
|
msg_type := PACKET_NEIGHBOUR_CELL_DATA,
|
|
u := {
|
|
neighbour_cell_data := {
|
|
page_mode := ?,
|
|
zero := '0'B,
|
|
gtfi := tfi,
|
|
container_id := ?,
|
|
spare := '0'B,
|
|
container_index := container_index,
|
|
arfcn_bsic_presence := ?,
|
|
arfcn := *,
|
|
bsic := *,
|
|
container_list := ?
|
|
}
|
|
}
|
|
};
|
|
|
|
private function f_presence_bit_tfi(template uint5_t tfi) return BIT1 {
|
|
if (istemplatekind(tfi, "omit")) {
|
|
return '0'B;
|
|
}
|
|
return '1'B;
|
|
}
|
|
|
|
template DynamicAllocation tr_DynamicAllocation(template uint5_t tfi:= ?) := {
|
|
extd_dyn_alloc := ?,
|
|
p0_present := ?,
|
|
p0 := *,
|
|
pr_mode := *,
|
|
usf_granularity := ?,
|
|
ul_tfi_ass_present := f_presence_bit_tfi(tfi),
|
|
ul_tfi_assignment := tfi,
|
|
reserved := '0'B,
|
|
tbf_starting_time_present := ?,
|
|
tbf_starting_time := *,
|
|
ts_allocation := ?
|
|
};
|
|
|
|
template PktUlAssGprs tr_PktUlAssGprsDynamic(template DynamicAllocation dyn_alloc := ?) := {
|
|
ch_coding_cmd := ?,
|
|
tlli_block_chan_coding := ?,
|
|
pkt_ta := ?,
|
|
freq_par_present := ?,
|
|
freq_par := *,
|
|
alloc_present := '01'B,
|
|
dyn_block_alloc := dyn_alloc,
|
|
sgl_block_alloc := omit
|
|
};
|
|
|
|
template PktUlAssEgprs tr_PktUlAssEgprsDynamic(template DynamicAllocation dyn_alloc := ?) := {
|
|
dual_carrier := '00'B,
|
|
tlli_present := ?,
|
|
tlli := *,
|
|
compact_reduced_ma_present := ?,
|
|
compact_reduced_ma := *,
|
|
chan_coding_cmd := ?,
|
|
resegment := ?,
|
|
window_size := ?,
|
|
ats_present := ?,
|
|
ats := *, /* ? */
|
|
arac_retrans_req := ?,
|
|
tlli_block_chan_coding := ?,
|
|
bep_period2_present := ?,
|
|
bep_period2 := *,
|
|
pkt_ta := ?,
|
|
pkt_ext_ta_present := ?,
|
|
pkt_ext_ta := *,
|
|
freq_par_present := ?,
|
|
freq_par := *,
|
|
alloc_present := ?,
|
|
dyn_block_alloc := dyn_alloc,
|
|
multi_block_alloc := omit
|
|
};
|
|
|
|
template AckNackDescription tr_AckNackDescription(template BIT1 final_ack := ?) := {
|
|
final_ack := final_ack,
|
|
starting_seq_nr := ?,
|
|
receive_block_bitmap := ?
|
|
};
|
|
|
|
template UlAckNackGprsAdditionsRel99 tr_UlAckNackGprsAdditionsRel99(template boolean tbf_est := ?) := {
|
|
ext_pkt_ta_present := ?,
|
|
ext_pkt_ta := *,
|
|
tbf_est := tbf_est
|
|
};
|
|
|
|
template UlAckNackGprs tr_UlAckNackGprs(template GprsTlli tlli := *,
|
|
template AckNackDescription acknack_desc := ?,
|
|
template UlAckNackGprsAdditionsRel99 rel99 := *) := {
|
|
ch_coding_cmd := ?,
|
|
ack_nack_desc := acknack_desc,
|
|
cont_res_tlli_present := ?,
|
|
cont_res_tlli := tlli,
|
|
pkt_ta_present := ?,
|
|
pkt_ta := *,
|
|
pwr_ctrl_present := ?,
|
|
pwr_ctrl := *,
|
|
extension_bits_present := ?,
|
|
extension_bits := *,
|
|
not_used := '0'B,
|
|
rel99_present := ?,
|
|
rel99 := rel99
|
|
};
|
|
|
|
template UlAckNackEgprs tr_UlAckNackEgprs(template GprsTlli tlli := *) := {
|
|
msg_excape := '00'B,
|
|
ch_coding_cmd := ?,
|
|
resegment := ?,
|
|
preemptive_tx := ?,
|
|
prr_retrans_req := ?,
|
|
arac_retrans_req := ?,
|
|
cont_res_tlli_present := ?,
|
|
cont_res_tlli := tlli,
|
|
tbf_est := ?,
|
|
pkt_ta_present := ?,
|
|
pkt_ta := *,
|
|
pkt_ext_ta_present := ?,
|
|
pkt_ext_ta := *,
|
|
pwr_ctrl_present := ?,
|
|
pwr_ctrl := *
|
|
};
|
|
|
|
template (value) EgprsAckNackDescriptionIE ts_EgprsAckNackDescriptionIE(template (value) EgprsAckNackDescription andesc) := {
|
|
len_present := '1'B,
|
|
len := 0, /* Overwritten by RAW encoder */
|
|
acknack_desc := andesc
|
|
}
|
|
|
|
} with { encode "RAW"; variant "FIELDORDER(msb)" variant "BYTEORDER(last)" };
|