aboutsummaryrefslogtreecommitdiffstats
path: root/library
diff options
context:
space:
mode:
authorVadim Yanitskiy <vyanitskiy@sysmocom.de>2020-07-01 03:13:13 +0700
committerNeels Hofmeyr <neels@hofmeyr.de>2020-07-03 03:30:00 +0200
commitd5f6bfe7bd3b995d45e9ec22c2ea44ef5b0820d6 (patch)
tree7c0751ff5497f43025eb560d01fccf82a85d7aee /library
parent9656e923bf0353bc44ce0f7dcadfe81b381458a3 (diff)
library/GSM_RestOctets: initial SI2quater Rest Octets definition
This is a very minimalistic (incomplete) implementation of SI2quater Rest Octets as per 3GPP TS 44.018, table 10.5.2.33b.1. Should be enough to decode some of the E-UTRAN specific parameters though. Some BITn fields might need to be replaced with more specific enumerated or integer types. Beware [1], the bit ordering rules are different for integer and bitstring (sub-)types if a field ends up on boundary of the two octets! [1] https://bugs.eclipse.org/bugs/show_bug.cgi?id=562488 Change-Id: I6a12c9ee12f8df8b4fc0976dd593152dc1195718 Related: SYS#4870
Diffstat (limited to 'library')
-rw-r--r--library/GSM_RestOctets.ttcn505
1 files changed, 505 insertions, 0 deletions
diff --git a/library/GSM_RestOctets.ttcn b/library/GSM_RestOctets.ttcn
index 531528cd..3bc93490 100644
--- a/library/GSM_RestOctets.ttcn
+++ b/library/GSM_RestOctets.ttcn
@@ -1,6 +1,7 @@
/**
* GSM Rest Octets definitions as per 3GPP TS 44.018.
*
+ * (C) 2020 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
* (C) 2020 Vadim Yanitskiy <axilirator@gmail.com>
* All rights reserved.
*
@@ -15,6 +16,504 @@ module GSM_RestOctets {
import from General_Types all;
import from Osmocom_Types all;
+/* 10.5.2.33b SI 2quater Rest Octets */
+type record SI2quaterRestOctets {
+ BIT1 ba_ind,
+ BIT1 ba_3g_ind,
+ BIT1 mp_change_mark,
+ uint4_t si2quater_index,
+ uint4_t si2quater_count,
+
+ /* Measurement Parameters Description */
+ MeasParamsDescOpt meas_params_desc,
+ /* GPRS specific parameters */
+ record {
+ GPRS_RealTimeDiffDescOpt rt_diff_desc,
+ GPRS_BSICDescOpt bsic_desc,
+ GPRS_ReportPrioDescOpt rep_prio_desc,
+ MeasParamsDescOpt meas_params_desc
+ } gprs,
+ /* NC Measurement Parameters Description */
+ NCMeasParamsOpt nc_meas_params,
+ /* SI2quater Extension Information */
+ SI2quaterExtInfoOpt ext_info,
+
+ /* 3G Neighbour Cell Description */
+ UTRAN_NeighDescOpt utran_neigh_desc,
+ /* 3G Measurement Parameters Description */
+ UTRAN_MeasParamsDescOpt utran_meas_params_desc,
+ /* GPRS 3G Measurement Parameters Description */
+ UTRAN_GPRSMeasParamsDescOpt utran_gprs_meas_params_desc,
+
+ /* SI2quater Rel-{5,6,7,8,9,10} Additions (Matrioshka!) */
+ SI2quaterAdditions rel_additions
+} with {
+ /* The TITAN's RAW encoder generates an octet-aligned octetstring,
+ * so we should make sure that unused bits contain proper padding. */
+ variant "PADDING(yes), PADDING_PATTERN('00101011'B)"
+};
+
+/* Measurement Parameters Description */
+private type record MeasParamsDescOpt {
+ BIT1 presence, // 0/1
+ MeasParamsDesc desc optional
+} with {
+ variant (desc) "PRESENCE(presence = '1'B)"
+};
+
+private type record MeasParamsDesc {
+ BIT1 report_type,
+ BIT2 serving_band_reporting
+} with { variant "" };
+
+/* GPRS Real Time Difference Description (not implemented) */
+private type record GPRS_RealTimeDiffDescOpt {
+ BIT1 presence ('0'B), // 0/1
+ bitstring desc optional // TODO
+} with {
+ variant (desc) "PRESENCE(presence = '1'B)"
+};
+
+/* GPRS BSIC Description (not implemented) */
+private type record GPRS_BSICDescOpt {
+ BIT1 presence ('0'B), // 0/1
+ bitstring desc optional // TODO
+} with {
+ variant (desc) "PRESENCE(presence = '1'B)"
+};
+
+/* GPRS Report Priority Description (not implemented) */
+private type record GPRS_ReportPrioDescOpt {
+ BIT1 presence ('0'B), // 0/1
+ bitstring desc optional // TODO
+} with {
+ variant (desc) "PRESENCE(presence = '1'B)"
+};
+
+/* NC (Network Controlled?) Measurement Parameters */
+private type record NCMeasParams {
+ /* Network Control Order */
+ BIT2 nco,
+ BIT1 p_presence,
+ NCMeasPeriods p optional
+} with {
+ variant (p) "PRESENCE(p_presence = '1'B)"
+};
+
+/* NC Measurement Periods */
+private type record NCMeasParamsOpt {
+ BIT1 presence, // 0/1
+ NCMeasParams params optional
+} with {
+ variant (params) "PRESENCE(presence = '1'B)"
+};
+
+private type record NCMeasPeriods {
+ BIT3 non_drx_period,
+ BIT3 rep_period_i,
+ BIT3 rep_period_t
+} with { variant "" };
+
+/* SI2quater Extersion Information */
+private type record SI2quaterExtInfoOpt {
+ BIT1 presence, // 0/1
+ SI2quaterExtInfo info optional
+} with {
+ variant (info) "PRESENCE(presence = '1'B)"
+};
+
+private type record SI2quaterExtInfo {
+ uint8_t len,
+ CCNSupportDescOpt ccn_supp_desc optional,
+ bitstring padding /* Octet alignment? */
+} with {
+ variant (len) "LENGTHTO(ccn_supp_desc,padding) + 1"
+ variant (len) "UNIT(bits)"
+};
+
+/* CCN Support Description */
+private type record CCNSupportDescOpt {
+ BIT1 presence, // 0/1
+ CCNSupportDesc desc optional
+} with {
+ variant (desc) "PRESENCE(presence = '1'B)"
+};
+
+private type record CCNSupportDesc {
+ uint7_t nr_of_cells,
+ bitstring ccn_supported
+} with {
+ variant (nr_of_cells) "LENGTHTO(ccn_supported)"
+ variant (nr_of_cells) "UNIT(bits)"
+};
+
+/* 3G Neighbour Cell Description */
+private type record UTRAN_NeighDescOpt {
+ BIT1 presence, // 0/1
+ UTRAN_NeighDesc desc optional
+} with {
+ variant (desc) "PRESENCE(presence = '1'B)"
+};
+
+private type record UTRAN_NeighDesc {
+ BIT1 idx_start_3g_presence,
+ uint7_t idx_start_3g optional,
+ BIT1 abs_idx_start_emr_presence,
+ uint7_t abs_idx_start_emr optional,
+ UTRAN_FDDDescOpt fdd_desc,
+ UTRAN_TDDDescOpt tdd_desc
+} with {
+ variant (idx_start_3g) "PRESENCE(idx_start_3g_presence = '1'B)"
+ variant (abs_idx_start_emr) "PRESENCE(abs_idx_start_emr_presence = '1'B)"
+};
+
+/* UTRAN (3G) FDD/TDD Description (not implementaed).
+ *
+ * TODO: Repeated UTRAN FDD/TDD Neighbour Cells structure contains a variable length
+ * field, that needs to be computed using tables (see 9.1.54.1a and 9.1.54.1b) with
+ * magic numbers. This cannot be described uing TITAN's RAW codec attributes. */
+private type record UTRAN_FDDDescOpt {
+ BIT1 presence ('0'B), // 0/1
+ bitstring desc optional // TODO
+} with {
+ variant (desc) "PRESENCE(presence = '1'B)"
+};
+
+private type record UTRAN_TDDDescOpt {
+ BIT1 presence ('0'B), // 0/1
+ bitstring desc optional // TODO
+} with {
+ variant (desc) "PRESENCE(presence = '1'B)"
+};
+
+/* 3G Measurement Parameters Description (not implemented) */
+private type record UTRAN_MeasParamsDescOpt {
+ BIT1 presence ('0'B), // 0/1
+ bitstring desc optional // TODO
+} with {
+ variant (desc) "PRESENCE(presence = '1'B)"
+};
+
+/* GPRS 3G Measurement Parameters Description (not implemented) */
+private type record UTRAN_GPRSMeasParamsDescOpt {
+ BIT1 presence ('0'B), // 0/1
+ bitstring desc optional // TODO
+} with {
+ variant (desc) "PRESENCE(presence = '1'B)"
+};
+
+/* SI2quater Rel-{5,6,7,8,9,10} Additions */
+private type record SI2quaterAdditions {
+ BIT1 rel5_presence, // L/H
+ SI2quaterR5Additions rel5 optional
+} with {
+ variant (rel5_presence) "CSN.1 L/H"
+ variant (rel5) "PRESENCE(rel5_presence = '1'B)"
+};
+
+/* SI2quater Rel-5 and Rel-{6,7,8,9,10} Additions */
+private type record SI2quaterR5Additions {
+ UMTS_AddMeasParamsDescOpt umts_add_meas_params_desc,
+ UMTS_AddMeasParamsDesc2Opt umts_add_meas_params_desc2,
+ BIT1 rel6_presence, // L/H
+ SI2quaterR6Additions rel6 optional
+} with {
+ variant (rel6_presence) "CSN.1 L/H"
+ variant (rel6) "PRESENCE(rel6_presence = '1'B)"
+};
+
+/* 3G Additional Measurement Parameters Description */
+private type record UMTS_AddMeasParamsDescOpt {
+ BIT1 presence, // 0/1
+ UMTS_AddMeasParamsDesc desc optional
+} with {
+ variant (desc) "PRESENCE(presence = '1'B)"
+};
+
+private type record UMTS_AddMeasParamsDesc {
+ BIT3 fdd_qmin_offset,
+ BIT4 fdd_rscpmin
+} with { variant "" };
+
+/* 3G Additional Measurement Parameters Description 2 */
+private type record UMTS_AddMeasParamsDesc2Opt {
+ BIT1 presence, // 0/1
+ UMTS_AddMeasParamsDesc desc optional
+} with {
+ variant (desc) "PRESENCE(presence = '1'B)"
+};
+
+private type record UMTS_AddMeasParamsDesc2 {
+ /* FDD Reporting Threshold 2 */
+ BIT1 presence, // 0/1
+ uint6_t threshold optional
+} with {
+ variant (threshold) "PRESENCE(presence = '1'B)"
+};
+
+/* SI2quater Rel-6 and Rel-{7,8,9,10} Additions */
+private type record SI2quaterR6Additions {
+ BIT1 umts_ccn_active,
+ BIT1 rel7_presence, // L/H
+ SI2quaterR7Additions rel7 optional
+} with {
+ variant (rel7_presence) "CSN.1 L/H"
+ variant (rel7) "PRESENCE(rel7_presence = '1'B)"
+};
+
+/* SI2quater Rel-7 and Rel-{8,9,10} Additions */
+private type record SI2quaterR7Additions {
+ Rel7RepOffseThresholdOpt rep700,
+ Rel7RepOffseThresholdOpt rep810,
+ BIT1 rel8_presence, // L/H
+ SI2quaterR8Additions rel8 optional
+} with {
+ variant (rel8_presence) "CSN.1 L/H"
+ variant (rel8) "PRESENCE(rel8_presence = '1'B)"
+};
+
+/* Additions in Rel-7: Reporting Offset & Threshold */
+private type record Rel7RepOffseThresholdOpt {
+ BIT1 presence, // 0/1
+ Rel7RepOffseThreshold val optional
+} with {
+ variant (val) "PRESENCE(presence = '1'B)"
+};
+
+private type record Rel7RepOffseThreshold {
+ BIT3 offset,
+ BIT3 threshold
+} with { variant "" };
+
+/* SI2quater Rel-8 and Rel-{9,10} Additions */
+private type record SI2quaterR8Additions {
+ Rel8PrioEUTRANParamsDescOpt prio_eutran_params_desc,
+ Rel8UTRANCSGDescOpt utran_csg_desc,
+ Rel8EUTRANCSGDescOpt eutran_csg_desc
+ // TODO: Rel9 Additions (not implemented)
+} with { variant "" };
+
+/* Additions in Rel-8: Priority and E-UTRAN Parameters Description */
+private type record Rel8PrioEUTRANParamsDescOpt {
+ BIT1 presence, // 0/1
+ Rel8PrioEUTRANParamsDesc desc optional
+} with {
+ variant (desc) "PRESENCE(presence = '1'B)"
+};
+
+private type record Rel8PrioEUTRANParamsDesc {
+ ServingCellPrioParamsDescOpt sc_prio_params_desc,
+ UTRAN_PrioParamsDescOpt utran_prio_params_desc,
+ EUTRAN_ParamsDescOpt eutran_params_desc
+} with { variant "" };
+
+/* Serving Cell Priority Parameters Description */
+private type record ServingCellPrioParamsDescOpt {
+ BIT1 presence, // 0/1
+ ServingCellPrioParamsDesc desc optional
+} with {
+ variant (desc) "PRESENCE(presence = '1'B)"
+};
+
+private type record ServingCellPrioParamsDesc {
+ uint3_t geran_priority,
+ uint4_t thresh_priority_search,
+ uint4_t thresh_gsm_low,
+ uint2_t h_prio,
+ uint2_t t_reselection
+} with { variant "" };
+
+/* 3G Priority Parameters Description (not implemented) */
+private type record UTRAN_PrioParamsDescOpt {
+ BIT1 presence, // 0/1
+ bitstring desc optional // TODO
+} with {
+ variant (desc) "PRESENCE(presence = '1'B)"
+};
+
+/* E-UTRAN Parameters Description */
+private type record EUTRAN_ParamsDescOpt {
+ BIT1 presence, // 0/1
+ EUTRAN_ParamsDesc desc optional
+} with {
+ variant (desc) "PRESENCE(presence = '1'B)"
+};
+
+private type record EUTRAN_ParamsDesc {
+ BIT1 ccn_active,
+ BIT1 e_start,
+ BIT1 e_stop,
+
+ /* E-UTRAN Measurement Parameters Description */
+ EUTRAN_MeasParamsDescOpt meas_params_desc,
+ /* GPRS E-UTRAN Measurement Parameters Description */
+ EUTRAN_GPRSMeasParamsDescOpt gprs_meas_params_desc,
+
+ /* { 1 < Repeated E-UTRAN Neighbour Cells > } ** 0 */
+ EUTRAN_NeighbourCells neigh_cell_list optional,
+ BIT1 neigh_cell_list_term ('0'B),
+ /* { 1 < Repeated E-UTRAN Not Allowed Cells > } ** 0 */
+ EUTRAN_NotAllowedCells not_allowed_cell_list optional,
+ BIT1 not_allowed_cell_list_term ('0'B),
+ /* { 1 < Repeated E-UTRAN PCID to TA mapping > } ** 0 */
+ EUTRAN_PCID2TAMaps pcid2ta_map_list optional,
+ BIT1 pcid2ta_map_list_term ('0'B)
+} with { variant "" };
+
+/* E-UTRAN Measurement Parameters Description (not implemented) */
+private type record EUTRAN_MeasParamsDescOpt {
+ BIT1 presence, // 0/1
+ bitstring desc optional // TODO
+} with {
+ variant (desc) "PRESENCE(presence = '1'B)"
+};
+
+/* GPRS E-UTRAN Measurement Parameters Description (not implemented) */
+private type record EUTRAN_GPRSMeasParamsDescOpt {
+ BIT1 presence, // 0/1
+ bitstring desc optional // TODO
+} with {
+ variant (desc) "PRESENCE(presence = '1'B)"
+};
+
+/* Repeated E-UTRAN Neighbour Cell List */
+private type record of EUTRAN_NeighbourCell EUTRAN_NeighbourCells;
+private type record EUTRAN_NeighbourCell {
+ BIT1 item_ind ('1'B),
+ /* { 1 < Repeated E-UTRAN Neighbour Cells > } ** 0 */
+ EUTRAN_CellDescs cell_desc_list optional,
+ BIT1 cell_desc_list_term ('0'B),
+ BIT1 prio_presence, // 0/1
+ uint3_t prio optional,
+ uint5_t thresh_high,
+ BIT1 thresh_low_presence, // 0/1
+ uint5_t thresh_low optional,
+ BIT1 qrxlevmin_presence, // 0/1
+ uint5_t qrxlevmin optional
+} with {
+ variant "PRESENCE(item_ind = '1'B)"
+ variant (prio) "PRESENCE(prio_presence = '1'B)"
+ variant (thresh_low) "PRESENCE(thresh_low_presence = '1'B)"
+ variant (qrxlevmin) "PRESENCE(qrxlevmin_presence = '1'B)"
+};
+
+/* Repeated E-UTRAN Cell Description (E-ARFCN & Measurement Bandwidth) List */
+private type record of EUTRAN_CellDesc EUTRAN_CellDescs;
+private type record EUTRAN_CellDesc {
+ BIT1 item_ind ('1'B),
+ uint16_t e_arfcn,
+ BIT1 meas_bw_presence, // 0/1
+ uint3_t meas_bw optional
+} with {
+ variant "PRESENCE(item_ind = '1'B)"
+ variant (meas_bw) "PRESENCE(meas_bw_presence = '1'B)"
+};
+
+/* Repeated E-UTRAN Not Allowed Cell List */
+private type record of EUTRAN_NotAllowedCell EUTRAN_NotAllowedCells;
+private type record EUTRAN_NotAllowedCell {
+ BIT1 item_ind ('1'B),
+ /* FIXME: Not Allowed Cells : < PCID Group IE > (not implemented) */
+ BIT1 pcid_group_presence ('0'B),
+ /* { 1 < Repeated E-UTRAN_FREQUENCY_INDEX > } ** 0 */
+ EUTRAN_FreqIndexes freq_idx_list optional,
+ BIT1 freq_idx_list_term ('0'B)
+} with {
+ variant "PRESENCE(item_ind = '1'B)"
+};
+
+/* Repeated E-UTRAN PCID to TA mapping List */
+private type record of EUTRAN_PCID2TAMap EUTRAN_PCID2TAMaps;
+private type record EUTRAN_PCID2TAMap {
+ BIT1 item_ind ('1'B),
+ /* FIXME: PCID to TA mapping : < PCID Group IE > (not implemented) */
+ BIT1 pcid_group_presence ('0'B),
+ /* { 1 < Repeated E-UTRAN_FREQUENCY_INDEX > } ** 0 */
+ EUTRAN_FreqIndexes freq_idx_list optional,
+ BIT1 freq_idx_list_term ('0'B)
+} with {
+ variant "PRESENCE(item_ind = '1'B)"
+};
+
+/* Repeated E-UTRAN Frequency Index List */
+private type record of EUTRAN_FreqIndex EUTRAN_FreqIndexes;
+private type record EUTRAN_FreqIndex {
+ BIT1 item_ind ('1'B),
+ uint3_t idx
+} with {
+ variant "PRESENCE(item_ind = '1'B)"
+};
+
+/* Additions in Rel-8: 3G CSG Description (not implemented) */
+private type record Rel8UTRANCSGDescOpt {
+ BIT1 presence, // 0/1
+ bitstring desc optional // TODO
+} with {
+ variant (desc) "PRESENCE(presence = '1'B)"
+};
+
+/* Additions in Rel-8: E-UTRAN CSG Description (not implemented) */
+private type record Rel8EUTRANCSGDescOpt {
+ BIT1 presence, // 0/1
+ bitstring desc optional // TODO
+} with {
+ variant (desc) "PRESENCE(presence = '1'B)"
+};
+
+
+/* Basic any-/omit-matching templates. To be inherited by other templates (see below).
+ * The point is that you cannot fit everything into 20 octets, so usually several kinds
+ * of SI2quater are being sub-multiplexed by the BTS. This is achieved using both
+ * 'si2quater_index' and 'si2quater_count' fields. */
+template SI2quaterRestOctets tra_SI2quaterRestOctets_base := {
+ ba_ind := ?,
+ ba_3g_ind := ?,
+ mp_change_mark := ?,
+ si2quater_index := ?,
+ si2quater_count := ?,
+
+ meas_params_desc := { presence := ?, desc := * },
+ gprs := {
+ rt_diff_desc := { presence := ?, desc := * },
+ bsic_desc := { presence := ?, desc := * },
+ rep_prio_desc := { presence := ?, desc := * },
+ meas_params_desc := { presence := ?, desc := * }
+ },
+ nc_meas_params := { presence := ?, params := * },
+ ext_info := { presence := ?, info := * },
+
+ utran_neigh_desc := { presence := ?, desc := * },
+ utran_meas_params_desc := { presence := ?, desc := * },
+ utran_gprs_meas_params_desc := { presence := ?, desc := * },
+
+ rel_additions := ?
+};
+
+template SI2quaterRestOctets tro_SI2quaterRestOctets_base := {
+ ba_ind := ?,
+ ba_3g_ind := ?,
+ mp_change_mark := ?,
+ si2quater_index := ?,
+ si2quater_count := ?,
+
+ meas_params_desc := { presence := '0'B, desc := omit },
+ gprs := {
+ rt_diff_desc := { presence := '0'B, desc := omit },
+ bsic_desc := { presence := '0'B, desc := omit },
+ rep_prio_desc := { presence := '0'B, desc := omit },
+ meas_params_desc := { presence := '0'B, desc := omit }
+ },
+ nc_meas_params := { presence := '0'B, params := omit },
+ ext_info := { presence := '0'B, info := omit },
+
+ utran_neigh_desc := { presence := '0'B, desc := omit },
+ utran_meas_params_desc := { presence := '0'B, desc := omit },
+ utran_gprs_meas_params_desc := { presence := '0'B, desc := omit },
+
+ rel_additions := { rel5_presence := CSN1_L, rel5 := omit }
+};
+
+
/* 10.5.2.34 SI 3 Rest Octets */
type record SI3RestOctets {
SelectionParamsOpt sel_params,
@@ -131,6 +630,12 @@ type record SI21IndicatorOpt {
variant (pos) "PRESENCE(presence = '1'B)"
};
+
+external function enc_SI2quaterRestOctets(in SI2quaterRestOctets ro) return octetstring
+ with { extension "prototype(convert) encode(RAW)" };
+external function dec_SI2quaterRestOctets(in octetstring stream) return SI2quaterRestOctets
+ with { extension "prototype(convert) decode(RAW)" };
+
external function enc_SI3RestOctets(in SI3RestOctets ro) return octetstring
with { extension "prototype(convert) encode(RAW)" };
external function dec_SI3RestOctets(in octetstring stream) return SI3RestOctets