o-du/phy
Intel O-RAN/X-RAN Generated Doxygen Documentation
xran_frame_struct.c
Go to the documentation of this file.
1 /******************************************************************************
2 *
3 * Copyright (c) 2019 Intel.
4 *
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
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
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.
16 *
17 *******************************************************************************/
18 
27 #include <assert.h>
28 #include <err.h>
29 #include <arpa/inet.h>
30 #include <sys/time.h>
31 #include <time.h>
32 
33 #include "xran_frame_struct.h"
34 #include "xran_printf.h"
35 
37 {
41 };
42 
43 // F1 Tables 38.101-1 Table 5.3.2-1. Maximum transmission bandwidth configuration NRB
44 static uint16_t nNumRbsPerSymF1[3][13] =
45 {
46  // 5MHz 10MHz 15MHz 20 MHz 25 MHz 30 MHz 40 MHz 50MHz 60 MHz 70 MHz 80 MHz 90 MHz 100 MHz
47  {25, 52, 79, 106, 133, 160, 216, 270, 0, 0, 0, 0, 0}, // Numerology 0 (15KHz)
48  {11, 24, 38, 51, 65, 78, 106, 133, 162, 0, 217, 245, 273}, // Numerology 1 (30KHz)
49  {0, 11, 18, 24, 31, 38, 51, 65, 79, 0, 107, 121, 135} // Numerology 2 (60KHz)
50 };
51 
52 // F2 Tables 38.101-2 Table 5.3.2-1. Maximum transmission bandwidth configuration NRB
53 static uint16_t nNumRbsPerSymF2[2][4] =
54 {
55  // 50Mhz 100MHz 200MHz 400MHz
56  {66, 132, 264, 0}, // Numerology 2 (60KHz)
57  {32, 66, 132, 264} // Numerology 3 (120KHz)
58 };
59 
60 // 38.211 - Table 4.2.1
61 static uint16_t nSubCarrierSpacing[5] =
62 {
63  15, // mu = 0
64  30, // mu = 1
65  60, // mu = 2
66  120, // mu = 3
67  240 // mu = 4
68 };
69 
70 // TTI interval in us (slot duration)
71 static uint16_t nTtiInterval[4] =
72 {
73  1000, // mu = 0
74  500, // mu = 1
75  250, // mu = 2
76  125, // mu = 3
77 };
78 
79 // F1 Tables 38.101-1 Table F.5.3. Window length for normal CP
80 static uint16_t nCpSizeF1[3][13][2] =
81 {
82  // 5MHz 10MHz 15MHz 20 MHz 25 MHz 30 MHz 40 MHz 50MHz 60 MHz 70 MHz 80 MHz 90 MHz 100 MHz
83  {{40, 36}, {80, 72}, {120, 108}, {160, 144}, {160, 144}, {240, 216}, {320, 288}, {320, 288}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}, // Numerology 0 (15KHz)
84  {{22, 18}, {44, 36}, {66, 54}, {88, 72}, {88, 72}, {132, 108}, {176, 144}, {176, 144}, {264, 216}, {264, 216}, {352, 288}, {352, 288}, {352, 288}}, // Numerology 1 (30KHz)
85  { {0, 0}, {26, 18}, {39, 27}, {52, 36}, {52, 36}, {78, 54}, {104, 72}, {104, 72}, {156, 108}, {156, 108}, {208, 144}, {208, 144}, {208, 144}}, // Numerology 2 (60KHz)
86 };
87 
88 // F2 Tables 38.101-2 Table F.5.3. Window length for normal CP
89 static int16_t nCpSizeF2[2][4][2] =
90 {
91  // 50Mhz 100MHz 200MHz 400MHz
92  { {0, 0}, {104, 72}, {208, 144}, {416, 288}}, // Numerology 2 (60KHz)
93  {{68, 36}, {136, 72}, {272, 144}, {544, 288}}, // Numerology 3 (120KHz)
94 };
95 
96 static uint32_t xran_fs_max_slot_num = 8000;
97 static uint32_t xran_fs_max_slot_num_SFN = 20480; /* max slot number counted as SFN is 0-1023 */
98 static uint16_t xran_fs_num_slot_tdd_loop[XRAN_MAX_SECTOR_NR] = { XRAN_NUM_OF_SLOT_IN_TDD_LOOP };
99 static uint16_t xran_fs_num_dl_sym_sp[XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SLOT_IN_TDD_LOOP] = {0};
100 static uint16_t xran_fs_num_ul_sym_sp[XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SLOT_IN_TDD_LOOP] = {0};
101 static uint8_t xran_fs_slot_type[XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SLOT_IN_TDD_LOOP] = {{XRAN_SLOT_TYPE_INVALID}};
103 static float xran_fs_ul_rate[XRAN_MAX_SECTOR_NR] = {0.0};
104 static float xran_fs_dl_rate[XRAN_MAX_SECTOR_NR] = {0.0};
105 
106 extern uint16_t xran_max_frame;
107 
108 uint32_t xran_fs_get_tti_interval(uint8_t nMu)
109 {
110  if (nMu < 4)
111  {
112  return nTtiInterval[nMu];
113  }
114  else
115  {
116  printf("ERROR: %s Mu[%d] is not valid, setting to 0\n",__FUNCTION__, nMu);
117  return nTtiInterval[0];
118  }
119 }
120 
121 uint32_t xran_fs_get_scs(uint8_t nMu)
122 {
123  if (nMu <= 3)
124  {
125  return nSubCarrierSpacing[nMu];
126  }
127  else
128  {
129  printf("ERROR: %s Mu[%d] is not valid\n",__FUNCTION__, nMu);
130  }
131 
132  return 0;
133 }
134 
135 //-------------------------------------------------------------------------------------------
148 //-------------------------------------------------------------------------------------------
149 uint16_t xran_fs_get_num_rbs(uint32_t nNumerology, uint32_t nBandwidth, uint32_t nAbsFrePointA)
150 {
151  uint32_t error = 1;
152  uint16_t numRBs = 0;
153 
154  if (nAbsFrePointA <= 6000000)
155  {
156  // F1 Tables 38.101-1 Table 5.3.2-1. Maximum transmission bandwidth configuration NRB
157  if (nNumerology < 3)
158  {
159  switch(nBandwidth)
160  {
161  case XRAN_BW_5_0_MHZ:
162  numRBs = nNumRbsPerSymF1[nNumerology][0];
163  error = 0;
164  break;
165  case XRAN_BW_10_0_MHZ:
166  numRBs = nNumRbsPerSymF1[nNumerology][1];
167  error = 0;
168  break;
169  case XRAN_BW_15_0_MHZ:
170  numRBs = nNumRbsPerSymF1[nNumerology][2];
171  error = 0;
172  break;
173  case XRAN_BW_20_0_MHZ:
174  numRBs = nNumRbsPerSymF1[nNumerology][3];
175  error = 0;
176  break;
177  case XRAN_BW_25_0_MHZ:
178  numRBs = nNumRbsPerSymF1[nNumerology][4];
179  error = 0;
180  break;
181  case XRAN_BW_30_0_MHZ:
182  numRBs = nNumRbsPerSymF1[nNumerology][5];
183  error = 0;
184  break;
185  case XRAN_BW_40_0_MHZ:
186  numRBs = nNumRbsPerSymF1[nNumerology][6];
187  error = 0;
188  break;
189  case XRAN_BW_50_0_MHZ:
190  numRBs = nNumRbsPerSymF1[nNumerology][7];
191  error = 0;
192  break;
193  case XRAN_BW_60_0_MHZ:
194  numRBs = nNumRbsPerSymF1[nNumerology][8];
195  error = 0;
196  break;
197  case XRAN_BW_70_0_MHZ:
198  numRBs = nNumRbsPerSymF1[nNumerology][9];
199  error = 0;
200  break;
201  case XRAN_BW_80_0_MHZ:
202  numRBs = nNumRbsPerSymF1[nNumerology][10];
203  error = 0;
204  break;
205  case XRAN_BW_90_0_MHZ:
206  numRBs = nNumRbsPerSymF1[nNumerology][11];
207  error = 0;
208  break;
209  case XRAN_BW_100_0_MHZ:
210  numRBs = nNumRbsPerSymF1[nNumerology][12];
211  error = 0;
212  break;
213  default:
214  error = 1;
215  break;
216  }
217  }
218  }
219  else
220  {
221  if ((nNumerology >= 2) && (nNumerology <= 3))
222  {
223  // F2 Tables 38.101-2 Table 5.3.2-1. Maximum transmission bandwidth configuration NRB
224  switch(nBandwidth)
225  {
226  case XRAN_BW_50_0_MHZ:
227  numRBs = nNumRbsPerSymF2[nNumerology-2][0];
228  error = 0;
229  break;
230  case XRAN_BW_100_0_MHZ:
231  numRBs = nNumRbsPerSymF2[nNumerology-2][1];
232  error = 0;
233  break;
234  case XRAN_BW_200_0_MHZ:
235  numRBs = nNumRbsPerSymF2[nNumerology-2][2];
236  error = 0;
237  break;
238  case XRAN_BW_400_0_MHZ:
239  numRBs = nNumRbsPerSymF2[nNumerology-2][3];
240  error = 0;
241  break;
242  default:
243  error = 1;
244  break;
245  }
246  }
247  }
248 
249 
250  if (error)
251  {
252  printf("ERROR: %s: nNumerology[%d] nBandwidth[%d] nAbsFrePointA[%d]\n",__FUNCTION__, nNumerology, nBandwidth, nAbsFrePointA);
253  }
254  else
255  {
256  printf("%s: nNumerology[%d] nBandwidth[%d] nAbsFrePointA[%d] numRBs[%d]\n",__FUNCTION__, nNumerology, nBandwidth, nAbsFrePointA, numRBs);
257  }
258 
259  return numRBs;
260 }
261 
262 //-------------------------------------------------------------------------------------------
273 //-------------------------------------------------------------------------------------------
274 uint32_t xran_fs_cal_nrarfcn(uint32_t nCenterFreq)
275 {
276  uint32_t nDeltaFglobal,nFoffs,nNoffs;
277  uint32_t nNRARFCN = 0;
278 
279  if(nCenterFreq > 0 && nCenterFreq < 3000*1000)
280  {
281  nDeltaFglobal = 5;
282  nFoffs = 0;
283  nNoffs = 0;
284  }
285  else if(nCenterFreq >= 3000*1000 && nCenterFreq < 24250*1000)
286  {
287  nDeltaFglobal = 15;
288  nFoffs = 3000*1000;
289  nNoffs = 600000;
290  }
291  else if(nCenterFreq >= 24250*1000 && nCenterFreq <= 100000*1000)
292  {
293  nDeltaFglobal = 60;
294  nFoffs = 24250080;
295  nNoffs = 2016667;
296  }
297  else
298  {
299  printf("@@@@ incorrect center frerquency %d\n",nCenterFreq);
300  return (0);
301  }
302 
303  nNRARFCN = ((nCenterFreq - nFoffs)/nDeltaFglobal) + nNoffs;
304 
305  printf("%s: nCenterFreq[%d] nDeltaFglobal[%d] nFoffs[%d] nNoffs[%d] nNRARFCN[%d]\n", __FUNCTION__, nCenterFreq, nDeltaFglobal, nFoffs, nNoffs, nNRARFCN);
306  return (nNRARFCN);
307 }
308 
309 uint32_t xran_fs_slot_limit_init(int32_t tti_interval_us)
310 {
311  xran_fs_max_slot_num = (1000/tti_interval_us)*1000;
312  xran_fs_max_slot_num_SFN = (1000/tti_interval_us)*(xran_max_frame+1)*10;
313  return xran_fs_max_slot_num;
314 }
315 
316 uint32_t xran_fs_get_max_slot(void)
317 {
318  return xran_fs_max_slot_num;
319 }
320 
322 {
323  return xran_fs_max_slot_num_SFN;
324 }
325 
326 int32_t xran_fs_slot_limit(int32_t nSfIdx)
327 {
328  while (nSfIdx < 0) {
329  nSfIdx += xran_fs_max_slot_num;
330  }
331 
332  while (nSfIdx >= xran_fs_max_slot_num) {
333  nSfIdx -= xran_fs_max_slot_num;
334  }
335 
336  return nSfIdx;
337 }
338 
339 void xran_fs_clear_slot_type(uint32_t nPhyInstanceId)
340 {
341  xran_fs_ul_rate[nPhyInstanceId] = 0.0;
342  xran_fs_dl_rate[nPhyInstanceId] = 0.0;
343  xran_fs_num_slot_tdd_loop[nPhyInstanceId] = 1;
344 }
345 
346 int32_t xran_fs_set_slot_type(uint32_t nPhyInstanceId, uint32_t nFrameDuplexType, uint32_t nTddPeriod, struct xran_slot_config* psSlotConfig)
347 {
348  uint32_t nSlotNum, nSymNum, nVal, i, j;
349  uint32_t numDlSym, numUlSym, numGuardSym;
350  uint32_t numDlSlots = 0, numUlSlots = 0, numSpDlSlots = 0, numSpUlSlots = 0, numSpSlots = 0;
351  char sSlotPattern[XRAN_SLOT_TYPE_LAST][10] = {"IN\0", "DL\0", "UL\0", "SP\0", "FD\0"};
352 
353  // nPhyInstanceId Carrier ID
354  // nFrameDuplexType 0 = FDD 1 = TDD
355  // nTddPeriod Tdd Periodicity
356  // psSlotConfig[80] Slot Config Structure for nTddPeriod Slots
357 
358  xran_fs_ul_rate[nPhyInstanceId] = 0.0;
359  xran_fs_dl_rate[nPhyInstanceId] = 0.0;
360  xran_fs_num_slot_tdd_loop[nPhyInstanceId] = nTddPeriod;
361 
362  for (i = 0; i < XRAN_NUM_OF_SLOT_IN_TDD_LOOP; i++)
363  {
364  xran_fs_slot_type[nPhyInstanceId][i] = XRAN_SLOT_TYPE_INVALID;
365  xran_fs_num_dl_sym_sp[nPhyInstanceId][i] = 0;
366  xran_fs_num_ul_sym_sp[nPhyInstanceId][i] = 0;
367  }
368 
369  if (nFrameDuplexType == XRAN_FDD)
370  {
371  for (i = 0; i < XRAN_NUM_OF_SLOT_IN_TDD_LOOP; i++)
372  {
373  xran_fs_slot_type[nPhyInstanceId][i] = XRAN_SLOT_TYPE_FDD;
374  for(j = 0; j < XRAN_NUM_OF_SYMBOL_PER_SLOT; j++)
375  xran_fs_slot_symb_type[nPhyInstanceId][i][j] = XRAN_SYMBOL_TYPE_FDD;
376  }
377  xran_fs_num_slot_tdd_loop[nPhyInstanceId] = 1;
378  xran_fs_dl_rate[nPhyInstanceId] = 1.0;
379  xran_fs_ul_rate[nPhyInstanceId] = 1.0;
380  }
381  else
382  {
383  for (nSlotNum = 0; nSlotNum < nTddPeriod; nSlotNum++)
384  {
385  numDlSym = 0;
386  numUlSym = 0;
387  numGuardSym = 0;
388  for (nSymNum = 0; nSymNum < XRAN_NUM_OF_SYMBOL_PER_SLOT; nSymNum++)
389  {
390  switch(psSlotConfig[nSlotNum].nSymbolType[nSymNum])
391  {
392  case XRAN_SYMBOL_TYPE_DL:
393  numDlSym++;
394  xran_fs_slot_symb_type[nPhyInstanceId][nSlotNum][nSymNum] = XRAN_SYMBOL_TYPE_DL;
395  break;
397  xran_fs_slot_symb_type[nPhyInstanceId][nSlotNum][nSymNum] = XRAN_SYMBOL_TYPE_GUARD;
398  numGuardSym++;
399  break;
400  default:
401  xran_fs_slot_symb_type[nPhyInstanceId][nSlotNum][nSymNum] = XRAN_SYMBOL_TYPE_UL;
402  numUlSym++;
403  break;
404  }
405  }
406 
407  print_dbg("nSlotNum[%d] : numDlSym[%d] numGuardSym[%d] numUlSym[%d] ", nSlotNum, numDlSym, numGuardSym, numUlSym);
408 
409  if ((numUlSym == 0) && (numGuardSym == 0))
410  {
411  xran_fs_slot_type[nPhyInstanceId][nSlotNum] = XRAN_SLOT_TYPE_DL;
412  numDlSlots++;
413  print_dbg("XRAN_SLOT_TYPE_DL\n");
414  }
415  else if ((numDlSym == 0) && (numGuardSym == 0))
416  {
417  xran_fs_slot_type[nPhyInstanceId][nSlotNum] = XRAN_SLOT_TYPE_UL;
418  numUlSlots++;
419  print_dbg("XRAN_SLOT_TYPE_UL\n");
420  }
421  else
422  {
423  xran_fs_slot_type[nPhyInstanceId][nSlotNum] = XRAN_SLOT_TYPE_SP;
424  numSpSlots++;
425  print_dbg("XRAN_SLOT_TYPE_SP\n");
426 
427  if (numDlSym)
428  {
429  numSpDlSlots++;
430  xran_fs_num_dl_sym_sp[nPhyInstanceId][nSlotNum] = numDlSym;
431  }
432  if (numUlSym)
433  {
434  numSpUlSlots++;
435  xran_fs_num_ul_sym_sp[nPhyInstanceId][nSlotNum] = numUlSym;
436  }
437  }
438  print_dbg(" numDlSlots[%d] numUlSlots[%d] numSpSlots[%d] numSpDlSlots[%d] numSpUlSlots[%d]\n", numDlSlots, numUlSlots, numSpSlots, numSpDlSlots, numSpUlSlots);
439  }
440 
441  xran_fs_dl_rate[nPhyInstanceId] = (float)(numDlSlots + numSpDlSlots) / (float)nTddPeriod;
442  xran_fs_ul_rate[nPhyInstanceId] = (float)(numUlSlots + numSpUlSlots) / (float)nTddPeriod;
443  }
444 
445  print_dbg("%s: nPhyInstanceId[%d] nFrameDuplexType[%d], nTddPeriod[%d]\n",
446  __FUNCTION__, nPhyInstanceId, nFrameDuplexType, nTddPeriod);
447 
448  print_dbg("DLRate[%f] ULRate[%f]\n", xran_fs_dl_rate[nPhyInstanceId], xran_fs_ul_rate[nPhyInstanceId]);
449 
450  nVal = (xran_fs_num_slot_tdd_loop[nPhyInstanceId] < 10) ? xran_fs_num_slot_tdd_loop[nPhyInstanceId] : 10;
451 
452  print_dbg("SlotPattern:\n");
453  print_dbg("Slot: ");
454  for (nSlotNum = 0; nSlotNum < nVal; nSlotNum++)
455  {
456  print_dbg("%d ", nSlotNum);
457  }
458  print_dbg("\n");
459 
460  print_dbg(" %3d ", 0);
461  for (nSlotNum = 0, i = 0; nSlotNum < xran_fs_num_slot_tdd_loop[nPhyInstanceId]; nSlotNum++)
462  {
463  print_dbg("%s ", sSlotPattern[xran_fs_slot_type[nPhyInstanceId][nSlotNum]]);
464  i++;
465  if ((i == 10) && ((nSlotNum+1) < xran_fs_num_slot_tdd_loop[nPhyInstanceId]))
466  {
467  print_dbg("\n");
468  print_dbg(" %3d ", nSlotNum);
469  i = 0;
470  }
471  }
472  print_dbg("\n\n");
473 
474  return 0;
475 }
476 
477 int32_t xran_fs_get_slot_type(int32_t nCellIdx, int32_t nSlotdx, int32_t nType)
478 {
479  int32_t nSfIdxMod, nSfType, ret = 0;
480 
481  nSfIdxMod = xran_fs_slot_limit(nSlotdx) % ((xran_fs_num_slot_tdd_loop[nCellIdx] > 0) ? xran_fs_num_slot_tdd_loop[nCellIdx]: 1);
482  nSfType = xran_fs_slot_type[nCellIdx][nSfIdxMod];
483 
484  if (nSfType == nType)
485  {
486  ret = 1;
487  }
488  else if (nSfType == XRAN_SLOT_TYPE_SP)
489  {
490  if ((nType == XRAN_SLOT_TYPE_DL) && xran_fs_num_dl_sym_sp[nCellIdx][nSfIdxMod])
491  {
492  ret = 1;
493  }
494 
495  if ((nType == XRAN_SLOT_TYPE_UL) && xran_fs_num_ul_sym_sp[nCellIdx][nSfIdxMod])
496  {
497  ret = 1;
498  }
499  }
500  else if (nSfType == XRAN_SLOT_TYPE_FDD)
501  {
502  ret = 1;
503  }
504 
505  return ret;
506 }
507 
508 int32_t xran_fs_get_symbol_type(int32_t nCellIdx, int32_t nSlotdx, int32_t nSymbIdx)
509 {
510  int32_t nSfIdxMod, nSfType, ret = 0;
511 
512  nSfIdxMod = xran_fs_slot_limit(nSlotdx) % ((xran_fs_num_slot_tdd_loop[nCellIdx] > 0) ? xran_fs_num_slot_tdd_loop[nCellIdx]: 1);
513 
514  return xran_fs_slot_symb_type[nCellIdx][nSfIdxMod][nSymbIdx];
515 }
516 
517 
uint32_t xran_fs_get_max_slot(void)
#define XRAN_SYMBOL_TYPE_GUARD
Definition: xran_fh_o_du.h:148
#define XRAN_SYMBOL_TYPE_UL
Definition: xran_fh_o_du.h:147
#define XRAN_SLOT_TYPE_LAST
Definition: xran_fh_o_du.h:143
#define print_dbg(fmt, args...)
Definition: xran_printf.h:54
uint32_t xran_fs_slot_limit_init(int32_t tti_interval_us)
MHz MHz MHz MHz MHz MHz MHz MHz MHz nNumRbsPerSymF1
Definition: gen_test.m:13
#define XRAN_SLOT_TYPE_DL
Definition: xran_fh_o_du.h:139
uint16_t xran_fs_get_num_rbs(uint32_t nNumerology, uint32_t nBandwidth, uint32_t nAbsFrePointA)
nNumRbsPerSymF2
Definition: gen_test.m:21
#define XRAN_MAX_SECTOR_NR
Definition: xran_fh_o_du.h:110
numRBs
Definition: gen_test.m:96
nXranChBwOptions
#define XRAN_NUM_OF_SLOT_IN_TDD_LOOP
Definition: xran_fh_o_du.h:151
uint32_t xran_fs_get_tti_interval(uint8_t nMu)
uint16_t xran_max_frame
Definition: xran_main.c:116
#define XRAN_SLOT_TYPE_INVALID
Definition: xran_fh_o_du.h:138
int16_t nCpSizeF2[2][4][2]
Definition: common.c:147
int32_t xran_fs_set_slot_type(uint32_t nPhyInstanceId, uint32_t nFrameDuplexType, uint32_t nTddPeriod, struct xran_slot_config *psSlotConfig)
uint32_t xran_fs_cal_nrarfcn(uint32_t nCenterFreq)
uint32_t xran_fs_get_max_slot_SFN(void)
uint16_t nTtiInterval[4]
Definition: common.c:128
uint32_t xran_fs_get_scs(uint8_t nMu)
Header file for function to work with 5G NR frame structure and related routines. ...
#define XRAN_SYMBOL_TYPE_DL
Definition: xran_fh_o_du.h:146
Modules provide debug prints and utility functions.
#define XRAN_SLOT_TYPE_FDD
Definition: xran_fh_o_du.h:142
uint16_t nSubCarrierSpacing[5]
Definition: common.c:118
uint16_t nCpSizeF1[3][13][2]
Definition: common.c:138
#define XRAN_NUM_OF_SYMBOL_PER_SLOT
Definition: xran_fh_o_du.h:122
int32_t xran_fs_slot_limit(int32_t nSfIdx)
void xran_fs_clear_slot_type(uint32_t nPhyInstanceId)
#define XRAN_SLOT_TYPE_SP
Definition: xran_fh_o_du.h:141
int32_t xran_fs_get_slot_type(int32_t nCellIdx, int32_t nSlotdx, int32_t nType)
#define XRAN_SYMBOL_TYPE_FDD
Definition: xran_fh_o_du.h:149
int32_t xran_fs_get_symbol_type(int32_t nCellIdx, int32_t nSlotdx, int32_t nSymbIdx)
#define XRAN_SLOT_TYPE_UL
Definition: xran_fh_o_du.h:140