blob: 848052e5396dc57a25090d84b9b185f2a9ca0bd7 [file] [log] [blame]
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +02001/* TITAN REW encode/decode definitions for 3GPP TS 44.060 RLC/MAC Blocks */
2
3/* (C) 2017-2018 Harald Welte <laforge@gnumonks.org>
4 * (C) 2020 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
5 * All rights reserved.
6 *
7 * Released under the terms of GNU General Public License, Version 2 or
8 * (at your option) any later version.
9 *
10 * SPDX-License-Identifier: GPL-2.0-or-later
11 */
12
13module RLCMAC_Templates {
14 import from General_Types all;
15 import from Osmocom_Types all;
16 import from GSM_Types all;
17 import from RLCMAC_CSN1_Types all;
18 import from RLCMAC_CSN1_Templates all;
19 import from RLCMAC_Types all;
20
21 /* TS 44.060 10.4.5 */
22 function f_rrbp_fn_delay(MacRrbp rrbp) return uint32_t {
23 select (rrbp) {
24 case (RRBP_Nplus13_mod_2715648) { return 13; }
25 case (RRBP_Nplus17_or_18_mod_2715648) { return 17; }
26 case (RRBP_Nplus21_or_22_mod_2715648) { return 21; }
27 case (RRBP_Nplus26_mod_2715648) { return 26; }
28 }
29 return 0;
30 }
31
Vadim Yanitskiy2742bcd2020-05-10 12:45:18 +070032 function f_rrbp_ack_fn(uint32_t current_fn, MacRrbp rrbp)
33 return uint32_t {
34 return (current_fn + f_rrbp_fn_delay(rrbp)) mod 2715648;
35 }
36
Pau Espin Pedrol27d6af52020-04-30 20:13:32 +020037 function f_rlcmac_mcs2headertype(CodingScheme mcs) return EgprsHeaderType {
38 select (mcs) {
39 case (MCS_0) { return RLCMAC_HDR_TYPE_3; }
40 case (MCS_1) { return RLCMAC_HDR_TYPE_3; }
41 case (MCS_2) { return RLCMAC_HDR_TYPE_3; }
42 case (MCS_3) { return RLCMAC_HDR_TYPE_3; }
43 case (MCS_4) { return RLCMAC_HDR_TYPE_3; }
44 case (MCS_5) { return RLCMAC_HDR_TYPE_2; }
45 case (MCS_6) { return RLCMAC_HDR_TYPE_2; }
46 case (MCS_7) { return RLCMAC_HDR_TYPE_1; }
47 case (MCS_8) { return RLCMAC_HDR_TYPE_1; }
48 case (MCS_9) { return RLCMAC_HDR_TYPE_1; }
49 }
50 return RLCMAC_HDR_TYPE_3;
51 }
52
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +020053 function f_rlcmac_cs_mcs2block_len(CodingScheme cs_mcs) return uint32_t {
54 select (cs_mcs) {
55 case (CS_1) { return 23; }
56 case (CS_2) { return 34; }
57 case (CS_3) { return 40; }
58 case (CS_4) { return 54; }
59 case (MCS_1) { return 27; }
60 case (MCS_2) { return 33; }
61 case (MCS_3) { return 42; }
62 case (MCS_4) { return 49; }
63 case (MCS_5) { return 61; }
64 case (MCS_6) { return 79; }
65 case (MCS_7) { return 119; }
66 case (MCS_8) { return 143; }
67 case (MCS_9) { return 155; }
68 }
69 return 0;
70 }
71
72 function f_rlcmac_block_len2cs_mcs(uint32_t len) return CodingScheme {
73 select (len) {
74 case (23) { return CS_1; }
75 case (34) { return CS_2; }
76 case (40) { return CS_3; }
77 case (54) { return CS_4; }
78 case (27) { return MCS_1; }
79 case (33) { return MCS_2; }
80 case (42) { return MCS_3; }
81 case (49) { return MCS_4; }
82 case (60) { return MCS_5; }
83 case (61) { return MCS_5; }
84 case (78) { return MCS_6; }
85 case (79) { return MCS_6; }
86 case (118) { return MCS_7; }
87 case (119) { return MCS_7; }
88 case (142) { return MCS_8; }
89 case (143) { return MCS_8; }
90 case (154) { return MCS_9; }
91 case (155) { return MCS_9; }
92 }
93 return CS_1;
94 }
95
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +020096 function f_rlcmac_block_ChCodingCommand2cs_mcs(ChCodingCommand chcc) return CodingScheme {
97 select (chcc) {
98 case (CH_CODING_CS1) { return CS_1; }
99 case (CH_CODING_CS2) { return CS_2; }
100 case (CH_CODING_CS3) { return CS_3; }
101 case (CH_CODING_CS4) { return CS_4; }
102 }
103 return CS_1;
104 }
105
106 function f_rlcmac_block_EgprsChCodingCommand2cs_mcs(EgprsChCodingCommand echcc) return CodingScheme {
107 select (echcc) {
108 case (CH_CODING_MCS1) { return MCS_1; }
109 case (CH_CODING_MCS2) { return MCS_2; }
110 case (CH_CODING_MCS3) { return MCS_3; }
111 case (CH_CODING_MCS4) { return MCS_4; }
112 case (CH_CODING_MCS5) { return MCS_5; }
113 case (CH_CODING_MCS6) { return MCS_6; }
114 case (CH_CODING_MCS7) { return MCS_7; }
115 case (CH_CODING_MCS8) { return MCS_8; }
116 case (CH_CODING_MCS9) { return MCS_9; }
117 /* CH_CODING_MCS5_7 */
118 /* CH_CODING_MCS6_9 */
119 }
120 return MCS_1;
121 }
122
123 /* 1 -> CS_1 / MCS_1, 2 -> CS_2 / MCS_2, etc. */
124 function f_rlcmac_block_int2cs_mcs(integer n, boolean is_mcs) return CodingScheme {
125 var CodingScheme cs_mcs;
126 if (not is_mcs) {
127 int2enum(n - 1, cs_mcs);
128 return cs_mcs;
129 } else {
130 cs_mcs := MCS_0;
131 int2enum(enum2int(cs_mcs) + n, cs_mcs);
132 return cs_mcs;
133 }
134 }
135
Pau Espin Pedrol27d6af52020-04-30 20:13:32 +0200136 /* Coding and Puncturing Scheme indicator field for Header type 1 in EGPRS TBF or EC TBF or downlink EGPRS2 TBF */
137 function f_rlcmac_cps_htype1_to_mcs(uint3_t cps) return CodingScheme {
138 var CodingSchemeArray egprs_Header_type1_coding_puncturing_scheme_to_mcs := {
139 MCS_9 /* 0x00, "(MCS-9/P1 ; MCS-9/P1)" */,
140 MCS_9 /* 0x01, "(MCS-9/P1 ; MCS-9/P2)" */,
141 MCS_9 /* 0x02, "(MCS-9/P1 ; MCS-9/P3)" */,
142 MCS_0 /* 0x03, "reserved" */,
143 MCS_9 /* 0x04, "(MCS-9/P2 ; MCS-9/P1)" */,
144 MCS_9 /* 0x05, "(MCS-9/P2 ; MCS-9/P2)" */,
145 MCS_9 /* 0x06, "(MCS-9/P2 ; MCS-9/P3)" */,
146 MCS_0 /* 0x07, "reserved" */,
147 MCS_9 /* 0x08, "(MCS-9/P3 ; MCS-9/P1)" */,
148 MCS_9 /* 0x09, "(MCS-9/P3 ; MCS-9/P2)" */,
149 MCS_9 /* 0x0A, "(MCS-9/P3 ; MCS-9/P3)" */,
150 MCS_8 /* 0x0B, "(MCS-8/P1 ; MCS-8/P1)" */,
151 MCS_8 /* 0x0C, "(MCS-8/P1 ; MCS-8/P2)" */,
152 MCS_8 /* 0x0D, "(MCS-8/P1 ; MCS-8/P3)" */,
153 MCS_8 /* 0x0E, "(MCS-8/P2 ; MCS-8/P1)" */,
154 MCS_8 /* 0x0F, "(MCS-8/P2 ; MCS-8/P2)" */,
155 MCS_8 /* 0x10, "(MCS-8/P2 ; MCS-8/P3)" */,
156 MCS_8 /* 0x11, "(MCS-8/P3 ; MCS-8/P1)" */,
157 MCS_8 /* 0x12, "(MCS-8/P3 ; MCS-8/P2)" */,
158 MCS_8 /* 0x13, "(MCS-8/P3 ; MCS-8/P3)" */,
159 MCS_7 /* 0x14, "(MCS-7/P1 ; MCS-7/P1)" */,
160 MCS_7 /* 0x15, "(MCS-7/P1 ; MCS-7/P2)" */,
161 MCS_7 /* 0x16, "(MCS-7/P1 ; MCS-7/P3)" */,
162 MCS_7 /* 0x17, "(MCS-7/P2 ; MCS-7/P1)" */,
163 MCS_7 /* 0x18, "(MCS-7/P2 ; MCS-7/P2)" */,
164 MCS_7 /* 0x19, "(MCS-7/P2 ; MCS-7/P3)" */,
165 MCS_7 /* 0x1A, "(MCS-7/P3 ; MCS-7/P1)" */,
166 MCS_7 /* 0x1B, "(MCS-7/P3 ; MCS-7/P2)" */,
167 MCS_7 /* 0x1C, "(MCS-7/P3 ; MCS-7/P3)" */,
168 MCS_0 /* 0x1D, "reserved" */,
169 MCS_0 /* 0x1E, "reserved" */,
170 MCS_0 /* 0x1F, "reserved" */
171 };
172 return egprs_Header_type1_coding_puncturing_scheme_to_mcs[cps];
173 }
174
175 /* Coding and Puncturing Scheme indicator field for Header type 2 in (EC-)EGPRS TBF or uplink EGPRS2-A TBF */
176 function f_rlcmac_cps_htype2_to_mcs(uint3_t cps) return CodingScheme {
177 var CodingSchemeArray egprs_Header_type2_coding_puncturing_scheme_to_mcs := {
178 MCS_6 /* {0x00, "MCS-6/P1"} */,
179 MCS_6 /* {0x01, "MCS-6/P2"} */,
180 MCS_6 /* {0x02, "MCS-6/P1 with 6 octet padding"} */,
181 MCS_6 /* {0x03, "MCS-6/P2 with 6 octet padding "} */,
182 MCS_5 /* {0x04, "MCS-5/P1"} */,
183 MCS_5 /* {0x05, "MCS-5/P2"} */,
184 MCS_5 /* {0x06, "MCS-6/P1 with 10 octet padding "} */,
185 MCS_5 /* {0x07, "MCS-6/P2 with 10 octet padding "} */
186 };
187 return egprs_Header_type2_coding_puncturing_scheme_to_mcs[cps];
188 }
189
190 /* Coding and Puncturing Scheme indicator field for Header type 3 */
191 function f_rlcmac_cps_htype3_to_mcs(uint3_t cps) return CodingScheme {
192 var CodingSchemeArray egprs_Header_type3_coding_puncturing_scheme_to_mcs := {
193 MCS_4 /* {0x00, "MCS-4/P1"} */,
194 MCS_4 /* {0x01, "MCS-4/P2"} */,
195 MCS_4 /* {0x02, "MCS-4/P3"} */,
196 MCS_3 /* {0x03, "MCS-3/P1"} */,
197 MCS_3 /* {0x04, "MCS-3/P2"} */,
198 MCS_3 /* {0x05, "MCS-3/P3"} */,
199 MCS_3 /* {0x06, "MCS-3/P1 with padding"} */,
200 MCS_3 /* {0x07, "MCS-3/P2 with padding"} */,
201 MCS_3 /* {0x08, "MCS-3/P3 with padding"} */,
202 MCS_2 /* {0x09, "MCS-2/P1"} */,
203 MCS_2 /* {0x0A, "MCS-2/P2"} */,
204 MCS_1 /* {0x0B, "MCS-1/P1"} */,
205 MCS_1 /* {0x0C, "MCS-1/P2"} */,
206 MCS_2 /* {0x0D, "MCS-2/P1 with padding"} */,
207 MCS_2 /* {0x0E, "MCS-2/P2 with padding"} */,
208 MCS_0 /* {0x0F, "MCS-0"} */
209 };
210 return egprs_Header_type3_coding_puncturing_scheme_to_mcs[cps];
211 }
212
213 function f_rlcmac_cps_htype_to_mcs(uint3_t cps, EgprsHeaderType htype) return CodingScheme {
214 select (htype) {
215 case (RLCMAC_HDR_TYPE_1) { return f_rlcmac_cps_htype1_to_mcs(cps); }
216 case (RLCMAC_HDR_TYPE_2) { return f_rlcmac_cps_htype2_to_mcs(cps); }
217 case (RLCMAC_HDR_TYPE_3) { return f_rlcmac_cps_htype3_to_mcs(cps); }
218 }
219 //TODO: return error here.
220 return CS_1;
221 }
222
223 function f_rlcmac_mcs_to_cps_htype1(CodingScheme mcs, uint2_t part, boolean with_padding) return uint5_t {
224 //TODO: implement similar to f_rlcmac_mcs_to_cps_htype3()
225 //TODO: return error here.
226 return 0;
227 }
228
229 function f_rlcmac_mcs_to_cps_htype2(CodingScheme mcs, uint2_t part, boolean with_padding) return uint5_t {
230 //TODO: implement similar to f_rlcmac_mcs_to_cps_htype3()
231 //TODO: return error here.
232 return 0;
233 }
234
235 function f_rlcmac_mcs_to_cps_htype3(CodingScheme mcs, uint2_t part, boolean with_padding) return uint5_t {
236 select (mcs) {
237 case (MCS_4) {
238 select (part) {
239 case (1) { return 0; /* {0x00, "MCS-4/P1"} */ }
240 case (2) { return 1; /* {0x01, "MCS-4/P2"} */ }
241 case (3) { return 2; /* {0x01, "MCS-4/P2"} */ }
242 }
243 }
244 case (MCS_3) {
245 if (not with_padding) {
246 select (part) {
247 case (1) { return 3; /* {0x03, "MCS-3/P1"} */ }
248 case (2) { return 4; /* {0x04, "MCS-3/P2"} */ }
249 case (3) { return 5; /* {0x05, "MCS-3/P3"} */ }
250 }
251 } else {
252 select (part) {
253 case (1) { return 6; /* {0x06, "MCS-3/P1 with padding"} */ }
254 case (2) { return 7; /* {0x07, "MCS-3/P2 with padding"} */ }
255 case (3) { return 8; /* {0x08, "MCS-3/P3 with padding"} */ }
256 }
257 }
258 }
259 case (MCS_2) {
260 if (not with_padding) {
261 select (part) {
262 case (1) { return 9; /* {0x09, "MCS-2/P1"} */ }
263 case (2) { return 10; /* {0x0A, "MCS-2/P2"} */ }
264 }
265 } else {
266 select (part) {
267 case (1) { return 13; /* {0x0D, "MCS-2/P1 with padding"} */ }
268 case (2) { return 14; /* {0x0E, "MCS-2/P2 with padding"} */}
269 }
270 }
271 }
272 case (MCS_1) {
273 select (part) {
274 case (1) { return 11; /* {0x0B, "MCS-1/P1"} */ }
275 case (2) { return 12; /* {0x0C, "MCS-1/P2"} */ }
276 }
277 }
278 case (MCS_0) { return 15; /* {0x0F, "MCS-0"} */ }
279 }
280 //TODO: return error here.
281 return 0;
282 }
283
284 function f_rlcmac_mcs_to_cps(CodingScheme mcs, uint2_t part, boolean with_padding := false) return uint5_t {
285
286 var EgprsHeaderType htype := f_rlcmac_mcs2headertype(mcs);
287 select (htype) {
288 case (RLCMAC_HDR_TYPE_1) { return f_rlcmac_mcs_to_cps_htype1(mcs, part, with_padding); }
289 case (RLCMAC_HDR_TYPE_2) { return f_rlcmac_mcs_to_cps_htype2(mcs, part, with_padding); }
290 case (RLCMAC_HDR_TYPE_3) { return f_rlcmac_mcs_to_cps_htype3(mcs, part, with_padding); }
291 }
292 //TODO: return error here.
293 return 0;
294 }
295
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +0200296 template (value) RlcmacUlBlock ts_RLC_UL_CTRL_ACK(RlcmacUlCtrlMsg ctrl,
297 MacPayloadType pt := MAC_PT_RLCMAC_NO_OPT,
298 boolean retry := false) := {
299 ctrl := {
300 mac_hdr := {
301 payload_type := pt,
302 spare := '00000'B,
303 retry := retry
304 },
305 payload := ctrl
306 }
307 }
308
309 /* Send Template for Downlink ACK/NACK */
310 template RlcmacUlBlock ts_RLCMAC_DL_ACK_NACK(template uint5_t tfi, AckNackDescription andesc, boolean retry := false) := {
311 ctrl := {
312 mac_hdr := {
313 payload_type := MAC_PT_RLCMAC_NO_OPT,
314 spare := '00000'B,
315 retry := retry
316 },
317 payload := {
318 msg_type := PACKET_DL_ACK_NACK,
319 u := {
320 dl_ack_nack := {
321 dl_tfi := tfi,
322 ack_nack_desc := andesc,
323 chreq_desc_presence := '0'B,
324 chreq_desc := omit,
325 ch_qual_rep := c_ChQualRep_default
326 }
327 }
328 }
329 }
330 }
331
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +0200332 template RlcmacUlBlock ts_RLCMAC_DL_ACK_NACK_CHREQ(template uint5_t tfi,
333 AckNackDescription andesc,
334 boolean retry := false,
335 template ChannelReqDescription chreq_desc := c_ChReqDesc_default)
336 modifies ts_RLCMAC_DL_ACK_NACK := {
337 ctrl := {
338 payload := {
339 u := {
340 dl_ack_nack := {
341 chreq_desc_presence := '1'B,
342 chreq_desc := chreq_desc
343 }
344 }
345 }
346 }
347 }
348
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +0200349 /* Template for uplink Data block */
350 template RlcmacUlBlock t_RLCMAC_UL_DATA(template uint5_t tfi, template uint4_t cv, template uint7_t bsn,
351 template LlcBlocks blocks := {}, template boolean stall := false) := {
352 data := {
353 mac_hdr := {
354 payload_type := MAC_PT_RLC_DATA,
355 countdown := cv,
356 stall_ind := false,
357 retry := false,
358 spare := '0'B,
359 pfi_ind := false,
360 tfi := tfi,
361 tlli_ind := false,
362 bsn := bsn,
363 e := false
364 },
365 tlli := omit,
366 pfi := omit,
367 blocks := blocks
368 }
369 }
370 template RlcmacUlBlock t_RLCMAC_UL_DATA_TLLI(template uint5_t tfi, template uint4_t cv, template uint7_t bsn,
371 template LlcBlocks blocks := {}, template boolean stall := false, template GprsTlli tlli) := {
372 data := {
373 mac_hdr := {
374 payload_type := MAC_PT_RLC_DATA,
375 countdown := cv,
376 stall_ind := false,
377 retry := false,
378 spare := '0'B,
379 pfi_ind := false,
380 tfi := tfi,
381 tlli_ind := true,
382 bsn := bsn,
383 e := false
384 },
385 tlli := tlli,
386 pfi := omit,
387 blocks := blocks
388 }
389 }
390
Pau Espin Pedrol2456dad2020-04-30 20:22:38 +0200391 /* Template for uplink Data block */
392 template RlcmacUlBlock t_RLCMAC_UL_EGPRS_DATA(CodingScheme mcs,
393 template uint5_t tfi, template uint4_t cv,
394 template uint11_t bsn1, template EgprsLlcBlocks blocks := {}) := {
395 data_egprs := {
396 mac_hdr := {
397 header_type := f_rlcmac_mcs2headertype(mcs),
398 tfi := tfi,
399 countdown := cv,
400 foi_si := '0'B,
401 r_ri := '0'B,
402 bsn1 := bsn1,
403 cps := f_rlcmac_mcs_to_cps(mcs, 1, false),
404 pfi_ind := false,
405 rsb := '0'B,
406 spb := '00'B
407 },
408 tlli_ind := false,
409 e := false,
410 tlli := omit,
411 pfi := omit,
412 blocks := blocks
413 }
414 }
415
Vadim Yanitskiy0a9b1482020-05-10 14:43:21 +0700416 template DlMacHeader t_RLCMAC_DlMacH(template (present) MacPayloadType pt,
417 template (present) boolean rrbp_valid,
418 template (present) MacRrbp rrbp,
419 template (present) uint3_t usf) := {
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +0200420 payload_type := pt,
421 rrbp := rrbp,
Vadim Yanitskiy0a9b1482020-05-10 14:43:21 +0700422 rrbp_valid := rrbp_valid,
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +0200423 usf := usf
424 }
425
426 template RlcmacDlBlock tr_RLCMAC_DUMMY_CTRL(template uint3_t usf := ?, template PageMode page_mode := ?) := {
427 ctrl := {
428 mac_hdr := {
429 payload_type := (MAC_PT_RLCMAC_NO_OPT, MAC_PT_RLCMAC_OPT),
430 rrbp:= ?,
431 rrbp_valid := ?,
432 usf := usf
433 },
434 opt := *,
435 payload := {
436 msg_type := PACKET_DL_DUMMY_CTRL,
437 u := {
438 dl_dummy := {
439 page_mode := page_mode,
440 persistence_levels_present := ?,
441 persistence_levels := *
442 }
443 }
444 }
445 }
446 }
447
448 template RlcmacDlBlock tr_RLCMAC_DL_PACKET_ASS(template uint3_t usf := ?) := {
449 ctrl := {
450 mac_hdr := {
451 payload_type := (MAC_PT_RLCMAC_NO_OPT, MAC_PT_RLCMAC_OPT),
452 rrbp:= ?,
453 rrbp_valid := ?,
454 usf := usf
455 },
456 opt := *,
457 payload := {
458 msg_type := PACKET_DL_ASSIGNMENT,
459 u := {
460 dl_assignment := {
461 page_mode := ?,
462 pres1 := ?,
463 persistence_levels := *,
Pau Espin Pedrol984d09f2020-05-19 18:51:58 +0200464 tfi_or_tlli := ?,
465 egprs2 := '0'B,
466 mac_mode := ?,
467 rlc_mode := ?,
468 control_ack := ?,
469 timeslot_alloc := ?,
470 pkt_ta := ?,
471 p0_present := ?,
472 p0 := *,
473 reserved := *,
474 pr_mode := *,
475 freq_par_present := ?,
476 freq_par := *,
477 dl_tfi_ass_present := ?,
478 dl_tfi_assignment := *,
479 pwr_ctrl_present := ?,
480 pwr_ctrl := *,
481 tbf_starting_time_present := ?,
482 tbf_starting_time := *,
483 release1999 := '1'B,
484 sub_present := ?,
485 sub := *,
486 pkt_ext_ta_present := ?,
487 pkt_ext_ta := *,
488 compact_reduced_ma_present := ?,
489 compact_reduced_ma := *
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +0200490 }
491 }
492 }
493 }
494 }
495
496 template RlcmacDlBlock tr_RLCMAC_UL_PACKET_ASS(template uint3_t usf := ?) := {
497 ctrl := {
498 mac_hdr := {
499 payload_type := (MAC_PT_RLCMAC_NO_OPT, MAC_PT_RLCMAC_OPT),
500 rrbp:= ?,
501 rrbp_valid := ?,
502 usf := usf
503 },
504 opt := *,
505 payload := {
506 msg_type := PACKET_UL_ASSIGNMENT,
507 u := {
508 ul_assignment := {
509 page_mode := ?,
510 persistence_levels_present := ?,
511 persistence_levels := *,
512 identity := ?,
513 is_egprs := ?, /* msg escape */
Pau Espin Pedrol45b664b2020-05-14 15:16:40 +0200514 gprs := *,
515 egprs := *
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +0200516 }
517 }
518 }
519 }
520 }
521
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +0200522 template RlcmacDlBlock tr_RLCMAC_UL_PACKET_ASS_GPRS(template uint3_t usf := ?, template PktUlAssGprs gprs := ?)
523 modifies tr_RLCMAC_UL_PACKET_ASS := {
524 ctrl := {
525 payload := {
526 u := {
527 ul_assignment := {
528 is_egprs := '0'B,
Pau Espin Pedrol45b664b2020-05-14 15:16:40 +0200529 gprs := gprs,
530 egprs := omit
531 }
532 }
533 }
534 }
535 }
536
537 template RlcmacDlBlock tr_RLCMAC_UL_PACKET_ASS_EGPRS(template uint3_t usf := ?, template PktUlAssEgprs egprs := ?)
538 modifies tr_RLCMAC_UL_PACKET_ASS := {
539 ctrl := {
540 payload := {
541 u := {
542 ul_assignment := {
543 is_egprs := '1'B,
544 gprs := omit,
545 egprs := egprs
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +0200546 }
547 }
548 }
549 }
550 }
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +0200551
552 /* Receive Template for Uplink ACK/NACK */
Pau Espin Pedrol692222c2020-05-17 00:25:37 +0200553 template RlcmacDlBlock tr_RLCMAC_UL_ACK_NACK(template uint5_t ul_tfi) := {
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +0200554 ctrl := {
555 mac_hdr := {
556 payload_type := (MAC_PT_RLCMAC_NO_OPT, MAC_PT_RLCMAC_OPT),
557 rrbp:= ?,
558 rrbp_valid := ?,
559 usf := ?
560 },
561 opt := *,
562 payload := {
563 msg_type := PACKET_UL_ACK_NACK,
564 u := {
565 ul_ack_nack := {
566 page_mode := ?,
567 msg_excape := ?,
568 uplink_tfi := ul_tfi,
Pau Espin Pedrol692222c2020-05-17 00:25:37 +0200569 is_egprs := ?,
570 gprs := *,
571 egprs := *
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +0200572 }
573 }
574 }
575 }
Pau Espin Pedrol692222c2020-05-17 00:25:37 +0200576 };
577
578 template RlcmacDlBlock tr_RLCMAC_UL_ACK_NACK_GPRS(template uint5_t ul_tfi, template UlAckNackGprs gprs := tr_UlAckNackGprs(*))
579 modifies tr_RLCMAC_UL_ACK_NACK := {
580 ctrl := {
581 payload := {
582 u := {
583 ul_ack_nack := {
584 is_egprs := '0'B,
585 gprs := gprs,
586 egprs := omit
587 }
588 }
589 }
590 }
591 };
592
593 template RlcmacDlBlock tr_RLCMAC_UL_ACK_NACK_EGPRS(template uint5_t ul_tfi, template UlAckNackEgprs egprs := tr_UlAckNackEgprs(*))
594 modifies tr_RLCMAC_UL_ACK_NACK := {
595 ctrl := {
596 payload := {
597 u := {
598 ul_ack_nack := {
599 is_egprs := '1'B,
600 gprs := omit,
601 egprs := egprs
602 }
603 }
604 }
605 }
606 };
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +0200607
608 template RlcmacDlBlock tr_RLCMAC_PACKET_PAG_REQ(template uint3_t usf := ?) := {
609 ctrl := {
610 mac_hdr := {
611 payload_type := MAC_PT_RLCMAC_NO_OPT,
612 rrbp:= ?,
613 rrbp_valid := ?,
614 usf := usf
615 },
616 opt := *,
617 payload := {
618 msg_type := PACKET_PAGING_REQUEST,
619 u := {
620 paging := {
621 page_mode := ?,
622 persistence_levels_present := ?,
623 persistence_levels := *,
624 nln_present := ?,
625 nln := *,
626 repeated_pageinfo_present := ?,
627 repeated_pageinfo := *
628 }
629 }
630 }
631 }
632 }
633
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +0700634 /* Either GPRS or EGPRS data block with arbitrary contents */
635 template RlcmacDlBlock tr_RLCMAC_DATA := (tr_RLCMAC_DATA_GPRS, tr_RLCMAC_DATA_EGPRS);
636
Vadim Yanitskiyd4f22aa2020-05-10 13:13:46 +0700637 template RlcmacDlBlock tr_RLCMAC_DATA_GPRS(template (present) boolean rrbp_valid := ?,
638 template (present) MacRrbp rrbp := ?,
639 template (present) uint3_t usf := ?) := {
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +0200640 data := {
641 mac_hdr := {
642 mac_hdr := {
643 payload_type := MAC_PT_RLC_DATA,
Vadim Yanitskiyd4f22aa2020-05-10 13:13:46 +0700644 rrbp := rrbp,
645 rrbp_valid := rrbp_valid,
646 usf := usf
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +0200647 },
648 hdr_ext := ?
649 },
650 blocks := ?
651 }
652 }
653
654 template RlcmacDlBlock tr_RLCMAC_DATA_EGPRS := {
655 data_egprs := {
656 mac_hdr := ?,
657 fbi := ?,
658 e := ?,
659 blocks := ?
660 }
661 }
662
663 /* Template for Uplink MAC Control Header */
664 template UlMacCtrlHeader t_RLCMAC_UlMacCtrlH(template MacPayloadType pt, template boolean retry := false) := {
665 payload_type := pt,
666 spare := '00000'B,
667 retry := retry
668 }
669
670 /* Template for Uplink Control ACK */
671 template RlcmacUlBlock ts_RLCMAC_CTRL_ACK(GprsTlli tlli, CtrlAck ack := MS_RCVD_TWO_RLC_SAME_RTI_DIFF_RBSN) := {
672 ctrl := {
673 mac_hdr := t_RLCMAC_UlMacCtrlH(MAC_PT_RLCMAC_NO_OPT),
674 payload := {
675 msg_type := PACKET_CONTROL_ACK,
676 u := {
677 ctrl_ack := {
678 tlli := tlli,
679 ctrl_ack := ack
680 }
681 }
682 }
683 }
684 }
685
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +0200686 template LlcBlockHdr t_RLCMAC_LLCBLOCK_HDR(uint16_t length_ind, boolean more, boolean e) := {
687 length_ind := length_ind,
688 more := more, /* 1 = new LLC PDU starts */
689 e := e /* 0 = another extension octet after LLC PDU, 1 = no more extension octets */
690 }
691
692 template EgprsLlcBlockHdr t_RLCMAC_LLCBLOCK_EGPRS_HDR(uint16_t length_ind, boolean e) := {
693 length_ind := length_ind,
694 e := e /* 0 = another extension octet after LLC PDU, 1 = no more extension octets */
695 }
696
697 /* Template for a LlcBlock (part of a LLC frame inside RlcMacDlDataBlock */
698 template LlcBlock t_RLCMAC_LLCBLOCK(octetstring data, template (omit) LlcBlockHdr llc_hdr := omit) := {
699 hdr := llc_hdr, /* omit = let encoder figure out the header */
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +0200700 payload := data
701 }
702
Pau Espin Pedrol2456dad2020-04-30 20:22:38 +0200703 /* Template for a LlcBlock (part of a LLC frame inside RlcMacEgprs?lDataBlock */
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +0200704 template EgprsLlcBlock t_RLCMAC_LLCBLOCK_EGPRS(octetstring data, template (omit) EgprsLlcBlockHdr llc_hdr := omit) := {
Pau Espin Pedrol2456dad2020-04-30 20:22:38 +0200705 /* let encoder figure out the header */
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +0200706 hdr := llc_hdr, /* omit = let encoder figure out the header */
Pau Espin Pedrol2456dad2020-04-30 20:22:38 +0200707 payload := data
708 }
709
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +0200710} with { encode "RAW"; variant "FIELDORDER(msb)" }