1 /******************************************************************************
3 * Copyright (c) 2019 Intel.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 *******************************************************************************/
20 * @brief This file provides the definition of Control Plane Messages
21 * for XRAN Front Haul layer as defined in XRAN-FH.CUS.0-v02.01.
24 * @ingroup group_lte_source_xran
25 * @author Intel Corporation
29 #ifndef _XRAN_PKT_CP_H_
30 #define _XRAN_PKT_CP_H_
37 /**********************************************************************
38 * Common structures for C/U-plane
39 **********************************************************************/
41 * @ingroup xran_cp_pkt
44 * user data compression header defined in 5.4.4.10 / 6.3.3.13
46 struct xran_radioapp_udComp_header {
47 uint8_t udCompMeth:4; /**< Compression method, XRAN_COMPMETHOD_xxxx */
48 uint8_t udIqWidth:4; /**< IQ bit width, 1 ~ 16 */
49 } __attribute__((__packed__));
52 /**********************************************************************
53 * Definition of C-Plane Protocol 5.4
54 **********************************************************************/
56 * @ingroup xran_cp_pkt
59 * Common Radio Application Header for C-Plane
61 struct xran_cp_radioapp_common_header { /* 6bytes, first 4bytes need the conversion for byte order */
62 uint32_t startSymbolId:6; /**< 5.4.4.7 start symbol identifier */
63 uint32_t slotId:6; /**< 5.4.4.6 slot identifier */
64 uint32_t subframeId:4; /**< 5.4.4.5 subframe identifier */
65 uint32_t frameId:8; /**< 5.4.4.4 frame identifier */
66 uint32_t filterIndex:4; /**< 5.4.4.3 filter index, XRAN_FILTERINDEX_xxxx */
67 uint32_t payloadVer:3; /**< 5.4.4.2 payload version, should be 1 */
68 uint32_t dataDirection:1; /**< 5.4.4.1 data direction (gNB Tx/Rx) */
69 uint8_t numOfSections; /**< 5.4.4.8 number of sections */
70 uint8_t sectionType; /**< 5.4.4.9 section type */
71 } __attribute__((__packed__));
74 * @ingroup xran_cp_pkt
77 * frame structure defined in 5.4.4.13
79 struct xran_cp_radioapp_frameStructure {
80 uint8_t uScs:4; /**< sub-carrier spacing, XRAN_SCS_xxx */
81 uint8_t fftSize:4; /**< FFT size, XRAN_FFTSIZE_xxx */
82 } __attribute__((__packed__));
85 * @ingroup xran_cp_pkt
88 * Section headers definition for C-Plane.
89 * Section type 6 and 7 are not present since those have different fields.
91 struct xran_cp_radioapp_section_header { /* 8bytes, need the conversion for byte order */
95 uint32_t numSymbol:4; /**< 5.4.5.7 number of symbols */
96 uint32_t reMask:12; /**< 5.4.5.5 resource element mask */
99 uint32_t beamId:15; /**< 5.4.5.9 beam identifier */
100 uint32_t ef:1; /**< 5.4.5.8 extension flag */
101 uint32_t numSymbol:4; /**< 5.4.5.7 number of symbols */
102 uint32_t reMask:12; /**< 5.4.5.5 resource element mask */
105 uint32_t beamId:15; /**< 5.4.5.9 beam identifier */
106 uint32_t ef:1; /**< 5.4.5.8 extension flag */
107 uint32_t numSymbol:4; /**< 5.4.5.7 number of symbols */
108 uint32_t reMask:12; /**< 5.4.5.5 resource element mask */
111 uint32_t ueId:15; /**< 5.4.5.10 UE identifier */
112 uint32_t ef:1; /**< 5.4.5.8 extension flag */
113 uint32_t numSymbol:4; /**< 5.4.5.7 number of symbols */
114 uint32_t reMask:12; /**< 5.4.5.5 resource element mask */
118 uint32_t numPrbc:8; /**< 5.4.5.6 number of contiguous PRBs per control section 0000 0000b = all PRBs */
119 uint32_t startPrbc:10; /**< 5.4.5.4 starting PRB of control section */
120 uint32_t symInc:1; /**< 5.4.5.3 symbol number increment command XRAN_SYMBOLNUMBER_xxxx */
121 uint32_t rb:1; /**< 5.4.5.2 resource block indicator, XRAN_RBIND_xxx */
122 uint32_t sectionId:12; /**< 5.4.5.1 section identifier */
123 } __attribute__((__packed__));
126 struct xran_cp_radioapp_section_ext_hdr {
127 /* 12 bytes, need to convert byte order for two parts respectively
128 * - 2 and 8 bytes, reserved1 would be OK if it is zero
130 uint16_t extLen:8; /**< 5.4.6.3 extension length, in 32bits words */
131 uint16_t extType:7; /**< 5.4.6.1 extension type */
132 uint16_t ef:1; /**< 5.4.6.2 extension flag */
133 } __attribute__((__packed__));
136 * @ingroup xran_cp_pkt
139 * Beamforming Weights Extension Type(ExtType 1) defined in 5.4.7.1
140 * The structure is reordered for byte order conversion.
142 struct xran_cp_radioapp_section_ext1 {
143 /* variable length, need to be careful to convert byte order
144 * - does not need to convert first 3 bytes */
145 uint8_t extType:7; /**< 5.4.6.1 extension type */
146 uint8_t ef:1; /**< 5.4.6.2 extension flag */
147 uint8_t extLen; /**< 5.4.6.3 extension length, in 32bits words */
149 uint8_t bfwCompMeth:4; /**< 5.4.7.1.1 Beamforming weight Compression method */
150 uint8_t bfwIqWidth:4; /**< 5.4.7.1.1 Beamforming weight IQ bit width */
158 * zero padding for 4-byte alignment
160 } __attribute__((__packed__));
163 * @ingroup xran_cp_pkt
166 * Beamforming Attributes Extension Type(ExtType 2) defined in 5.4.7.2
167 * The structure is reordered for byte order conversion.
169 struct xran_cp_radioapp_section_ext2 {
170 /* variable length, need to be careful to convert byte order
171 * - first 4 bytes can be converted at once
173 uint32_t bfZe3ddWidth:3; /**< 5.4.7.2.1 beamforming zenith beamwidth parameter bitwidth, Table 5-21 */
174 uint32_t bfAz3ddWidth:3; /**< 5.4.7.2.1 beamforming azimuth beamwidth parameter bitwidth, Table 5-20 */
175 uint32_t bfaCompResv1:2;
176 uint32_t bfZePtWidth:3; /**< 5.4.7.2.1 beamforming zenith pointing parameter bitwidth, Table 5-19 */
177 uint32_t bfAzPtWidth:3; /**< 5.4.7.2.1 beamforming azimuth pointing parameter bitwidth, Table 5-18 */
178 uint32_t bfaCompResv0:2;
179 uint32_t extLen:8; /**< 5.4.6.3 extension length, in 32bits words */
180 uint32_t extType:7; /**< 5.4.6.1 extension type */
181 uint32_t ef:1; /**< 5.4.6.2 extension flag */
184 * would be better to use bit manipulation directly to add these parameters
186 * bfAzPt: var by bfAzPtWidth
187 * bfZePt: var by bfZePtWidth
188 * bfAz3dd: var by bfAz3ddWidth
189 * bfZe3dd: var by bfZe3ddWidth
190 * bfAzSI:5 (including zero-padding for unused bits)
192 * padding for 4-byte alignment
195 } __attribute__((__packed__));
198 * @ingroup xran_cp_pkt
201 * DL Precoding Extension Type(ExtType 3) for first data layer.
202 * Defined in 5.4.7.3 Table 5-22.
203 * Only be used for LTE TM2-4 and not for other LTE TMs nor NR.
204 * The structure is reordered for byte order conversion. Not supported.
206 struct xran_cp_radioapp_section_ext3_first {
207 /* 16 bytes, need to convert byte order for two parts
210 uint32_t reserved1:8;
211 uint32_t crsSymNum:4; /**< 5.4.7.3.6 CRS symbol number indication */
212 uint32_t reserved0:3;
213 uint32_t crsShift:1; /**< 5.4.7.3.7 CRS shift used for DL transmission */
214 uint32_t crsReMask:12; /**< 5.4.7.3.5 CRS resource element mask */
215 uint32_t txScheme:4; /**< 5.4.7.3.3 transmission scheme */
216 uint32_t numLayers:4; /**< 5.4.7.3.4 number of layers used for DL transmission */
217 uint32_t layerId:4; /**< 5.4.7.3.2 Layer ID for DL transmission */
218 uint32_t codebookIndex:8; /**< 5.4.7.3.1 precoder codebook used for transmission */
219 uint32_t extLen:8; /**< 5.4.6.3 extension length, in 32bits words */
220 uint32_t extType:7; /**< 5.4.6.1 extension type */
221 uint32_t ef:1; /**< 5.4.6.2 extension flag */
223 uint16_t beamIdAP3; /**< 5.4.7.3.10 beam id to be used for antenna port 3 */
224 uint16_t beamIdAP2; /**< 5.4.7.3.9 beam id to be used for antenna port 2 */
225 uint16_t beamIdAP1; /**< 5.4.7.3.8 beam id to be used for antenna port 1 */
227 } __attribute__((__packed__));
230 * @ingroup xran_cp_pkt
233 * DL Precoding Extension Type(ExtType 3) for non-first data layer.
234 * Defined in 5.4.7.3 Table 5-23.
235 * Only be used for LTE TM2-4 and not for other LTE TMs nor NR.
236 * The structure is reordered for byte order conversion. Not supported.
238 struct xran_cp_radioapp_section_ext3_non_first {
239 /* 4 bytes, need to convert byte order at once */
240 uint32_t numLayers:4; /**< 5.4.7.3.4 number of layers used for DL transmission */
241 uint32_t layerId:4; /**< 5.4.7.3.2 Layer ID for DL transmission */
242 uint32_t codebookIndex:8; /**< 5.4.7.3.1 precoder codebook used for transmission */
244 uint32_t extLen:8; /**< 5.4.6.3 extension length, in 32bits words */
245 uint32_t extType:7; /**< 5.4.6.1 extension type */
246 uint32_t ef:1; /**< 5.4.6.2 extension flag */
247 } __attribute__((__packed__));
250 * @ingroup xran_cp_pkt
253 * Modulation Compression Parameter Extension Type(ExtType 4), 5.4.7.4
254 * Only applies to section type 1 and 3.
255 * The structure is reordered for byte order conversion.
257 struct xran_cp_radioapp_section_ext4 {
258 /* 4 bytes, need to convert byte order at once */
259 uint32_t modCompScaler:15; /**< 5.4.7.4.2 modulation compression scaler value */
260 uint32_t csf:1; /**< 5.4.7.4.1 constellation shift flag */
262 uint32_t extLen:8; /**< 5.4.6.3 extension length, in 32bits words */
263 uint32_t extType:7; /**< 5.4.6.1 extension type */
264 uint32_t ef:1; /**< 5.4.6.2 extension flag */
265 } __attribute__((__packed__));
269 * @ingroup xran_cp_pkt
272 * Modulation Compression Additional Parameter Extension Type(ExtType 5) for one scaler value.
273 * Defined in 5.4.7.5 Table 5-26
274 * Only applies to section type 1 3, and 5.
275 * The structure is reordered for byte order conversion.
277 struct xran_cp_radioapp_section_ext5_1 {
278 /* 8 bytes, need to convert byte order at once */
279 uint32_t reserved:20;
280 uint32_t mcScaleOffset:15; /**< 5.4.7.5.3 scaling value for modulation compression */
281 uint32_t csf:1; /**< 5.4.7.5.2 constellation shift flag */
282 uint32_t mcScaleReMask:12; /**< 5.4.7.5.1 modulation compression power scale RE mask */
284 uint32_t extLen:8; /**< 5.4.6.3 extension length, in 32bits words */
285 uint32_t extType:7; /**< 5.4.6.1 extension type */
286 uint32_t ef:1; /**< 5.4.6.2 extension flag */
287 } __attribute__((__packed__));
290 * @ingroup xran_cp_pkt
293 * Modulation Compression Additional Parameter Extension Type(ExtType 5) for two scaler values.
294 * Defined in 5.4.7.5 Table 5-27
295 * Only applies to section type 1 3, and 5.
296 * The structure is reordered for byte order conversion.
298 struct xran_cp_radioapp_section_ext5_2 {
299 /* 12 bytes, need to convert byte order for two parts respectively
300 * - 2 and 8 bytes, reserved1 would be OK if it is zero
302 uint16_t extLen:8; /**< 5.4.6.3 extension length, in 32bits words */
303 uint16_t extType:7; /**< 5.4.6.1 extension type */
304 uint16_t ef:1; /**< 5.4.6.2 extension flag */
306 uint32_t reserved0:8;
307 uint32_t mcScaleOffset2:15; /**< 5.4.7.5.3 scaling value for modulation compression */
308 uint32_t csf2:1; /**< 5.4.7.5.2 constellation shift flag */
309 uint32_t mcScaleReMask2:12; /**< 5.4.7.5.1 modulation compression power scale RE mask */
310 uint32_t mcScaleOffset1:15; /**< 5.4.7.5.3 scaling value for modulation compression */
311 uint32_t csf1:1; /**< 5.4.7.5.2 constellation shift flag */
312 uint32_t mcScaleReMask1:12; /**< 5.4.7.5.1 modulation compression power scale RE mask */
315 } __attribute__((__packed__));
318 struct xran_cp_radioapp_section_ext5 {
319 uint32_t reserved0:8;
320 uint32_t mcScaleOffset2:15; /**< 5.4.7.5.3 scaling value for modulation compression */
321 uint32_t csf2:1; /**< 5.4.7.5.2 constellation shift flag */
322 uint32_t mcScaleReMask2:12; /**< 5.4.7.5.1 modulation compression power scale RE mask */
323 uint32_t mcScaleOffset1:15; /**< 5.4.7.5.3 scaling value for modulation compression */
324 uint32_t csf1:1; /**< 5.4.7.5.2 constellation shift flag */
325 uint32_t mcScaleReMask1:12; /**< 5.4.7.5.1 modulation compression power scale RE mask */
326 } __attribute__((__packed__));
328 /**********************************************************
329 * Scheduling and Beam-forming Commands 5.4.2
330 **********************************************************/
332 * @ingroup xran_cp_pkt
335 * Section header definition for type 0
337 struct xran_cp_radioapp_section0_header { // 12bytes (6+2+1+2+1)
338 struct xran_cp_radioapp_common_header cmnhdr;
339 uint16_t timeOffset; /**< 5.4.4.12 time offset */
341 struct xran_cp_radioapp_frameStructure frameStructure;
342 uint16_t cpLength; /**< 5.4.4.14 cyclic prefix length */
344 } __attribute__((__packed__));
347 * @ingroup xran_cp_pkt
350 * Section definition for type 0: Unused RB or Symbols in DL or UL (Table 5-2)
351 * Not supported in this release
353 struct xran_cp_radioapp_section0 { // 8bytes (4+4)
354 struct xran_cp_radioapp_section_header hdr;
355 } __attribute__((__packed__));
358 * @ingroup xran_cp_pkt
361 * Section header definition for type 1
363 struct xran_cp_radioapp_section1_header { // 8bytes (6+1+1)
364 struct xran_cp_radioapp_common_header cmnhdr;
365 struct xran_radioapp_udComp_header udComp;
367 } __attribute__((__packed__));
370 * @ingroup xran_cp_pkt
373 * Section definition for type 1: Most DL/UL Radio Channels (Table 5-3)
375 struct xran_cp_radioapp_section1 { // 8bytes (4+4)
376 struct xran_cp_radioapp_section_header hdr;
378 // section extensions // 5.4.6 & 5.4.7
380 } __attribute__((__packed__));
383 * @ingroup xran_cp_pkt
386 * Section header definition for type 3
388 struct xran_cp_radioapp_section3_header { // 12bytes (6+2+1+2+1)
389 struct xran_cp_radioapp_common_header cmnhdr;
390 uint16_t timeOffset; /**< 5.4.4.12 time offset */
392 struct xran_cp_radioapp_frameStructure frameStructure;
393 uint16_t cpLength; /**< 5.4.4.14 cyclic prefix length */
394 struct xran_radioapp_udComp_header udComp;
395 } __attribute__((__packed__));
398 * @ingroup xran_cp_pkt
401 * Section definition for type 3: PRACH and Mixed-numerology Channels (Table 5-4)
403 struct xran_cp_radioapp_section3 { // 12bytes (4+4+4)
404 struct xran_cp_radioapp_section_header hdr;
405 uint32_t freqOffset:24; /**< 5.4.5.11 frequency offset */
408 // section extensions // 5.4.6 & 5.4.7
410 } __attribute__((__packed__));
413 * @ingroup xran_cp_pkt
416 * Section header definition for type 5
418 struct xran_cp_radioapp_section5_header { // 8bytes (6+1+1)
419 struct xran_cp_radioapp_common_header cmnhdr;
420 struct xran_radioapp_udComp_header udComp;
422 } __attribute__((__packed__));
425 * @ingroup xran_cp_pkt
428 * Section definition for type 5: UE scheduling information (Table 5-5)
429 * Not supported in this release
431 struct xran_cp_radioapp_section5 {
432 struct xran_cp_radioapp_section_header hdr;
434 // section extensions // 5.4.6 & 5.4.7
436 } __attribute__((__packed__));
439 * @ingroup xran_cp_pkt
442 * Section header definition for type 6
444 struct xran_cp_radioapp_section6_header { // 8bytes (6+1+1)
445 struct xran_cp_radioapp_common_header cmnhdr;
446 uint8_t numberOfUEs; /**< 5.4.4.11 number of UEs */
448 } __attribute__((__packed__));
451 * @ingroup xran_cp_pkt
454 * Section definition for type 5: Channel Information (Table 5-6)
455 * Not supported in this release
457 struct xran_cp_radioapp_section6 {
458 uint32_t regularizationFactor:16;/**< 5.4.5.12 regularization Factor */
459 uint32_t ueId:15; /**< 5.4.5.10 UE identifier */
460 uint32_t ef:1; /**< 5.4.5.8 extension flag */
461 uint8_t startPrbch:2; /**< 5.4.5.4 starting PRB of control section */
462 uint8_t symInc:1; /**< 5.4.5.3 symbol number increment command XRAN_SYMBOLNUMBER_xxxx */
463 uint8_t rb:1; /**< 5.4.5.2 resource block indicator, XRAN_RBIND_xxx */
465 uint8_t startPrbcl:8; /**< 5.4.5.4 starting PRB of control section */
466 uint8_t numPrbc:8; /**< 5.4.5.6 number of contiguous PRBs per control section */
468 // ciIQsamples start from here // 5.4.5.13 channel information I and Q values
471 // section extensions // 5.4.6 & 5.4.7
473 } __attribute__((__packed__));
476 * @ingroup xran_cp_pkt
479 * Section header definition for type 7: LAA
480 * Not supported in this release
482 struct xran_cp_radioapp_section7_header {
483 struct xran_cp_radioapp_common_header cmnhdr;
485 uint8_t laaMsgLen:4; /**< 5.4.5.15 LAA message length */
486 uint8_t laaMsgType:4; /**< 5.4.5.14 LAA message type */
488 // Payload start from here // 5.4.5.16 ~ 5.4.5.32
489 } __attribute__((__packed__));
495 #endif /* _XRAN_PKT_CP_H_ */