o-du/phy
Intel O-RAN/X-RAN Generated Doxygen Documentation
config.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 
26 #include "rte_common.h"
27 #include "config.h"
28 #include "common.h"
29 #include "debug.h"
30 
31 #include <rte_ethdev.h>
32 
33 #define MAX_LINE_SIZE 512
34 /* Configuration file maximum supported line length */
35 
36 #define KEY_APP_MODE "appMode"
37 #define KEY_XRAN_MODE "xranMode"
38 #define KEY_MU_NUMBER "mu"
39 #define KEY_NDLABSFREPOINTA "nDLAbsFrePointA"
40 #define KEY_NULABSFREPOINTA "nULAbsFrePointA"
41 #define KEY_NDLBANDWIDTH "nDLBandwidth"
42 #define KEY_NULBANDWIDTH "nULBandwidth"
43 #define KEY_NDLFFTSIZE "nDLFftSize"
44 #define KEY_NULFFTSIZE "nULFftSize"
45 
46 #define KEY_NFRAMEDUPLEXTYPE "nFrameDuplexType"
47 #define KEY_NTDDPERIOD "nTddPeriod"
48 
49 #define KEY_SSLOTCONFIG "sSlotConfig"
50 
51 #define KEY_CC_PER_PORT_NUM "ccNum"
52 #define KEY_ANT_NUM "antNum"
53 #define KEY_UL_ANT_NUM "antNumUL"
54 
55 #define KEY_ANT_ELM_TRX_NUM "antElmTRx"
56 
57 #define KEY_MU_MIMO_UES_NUM "muMimoUEs"
58 #define KEY_DLLAYERS_PER_UE "DlLayersPerUe"
59 #define KEY_ULLAYERS_PER_UE "UlLayersPerUe"
60 #define KEY_FILE_DLBFWUE "DlBfwUe"
61 #define KEY_FILE_ULBFWUE "UlBfwUe"
62 
63 #define KEY_FILE_ULSRS "antSrsC"
64 
65 
66 #define KEY_TTI_PERIOD "ttiPeriod"
67 
68 #define KEY_MTU_SIZE "MTUSize"
69 #define KEY_IO_CORE "ioCore"
70 #define KEY_INSTANCE_ID "instanceId"
71 
72 #define KEY_LLS_CU_MAC "llsCUMac"
73 #define KEY_RU_MAC "ruMac"
74 
75 #define KEY_FILE_NUMSLOTS "numSlots"
76 #define KEY_FILE_AxC "antC"
77 #define KEY_FILE_PRACH_AxC "antPrachC"
78 
79 #define KEY_PRACH_ENABLE "rachEanble"
80 #define KEY_SRS_ENABLE "srsEanble"
81 
82 #define KEY_PRACH_CFGIDX "prachConfigIndex"
83 #define KEY_SRS_SYM_IDX "srsSym"
84 
85 #define KEY_MAX_FRAME_ID "maxFrameId"
86 
87 
88 #define KEY_IQ_SWAP "iqswap"
89 #define KEY_HTONS_SWAP "nebyteorderswap"
90 #define KEY_COMPRESSION "compression"
91 
92 #define KEY_BFW_NUM "totalBFWeights"
93 
94 #define KEY_TADV_CP_DL "Tadv_cp_dl"
95 #define KEY_T2A_MIN_CP_DL "T2a_min_cp_dl"
96 #define KEY_T2A_MAX_CP_DL "T2a_max_cp_dl"
97 #define KEY_T2A_MIN_CP_UL "T2a_min_cp_ul"
98 #define KEY_T2A_MAX_CP_UL "T2a_max_cp_ul"
99 #define KEY_T2A_MIN_UP "T2a_min_up"
100 #define KEY_T2A_MAX_UP "T2a_max_up"
101 #define KEY_TA3_MIN "Ta3_min"
102 #define KEY_TA3_MAX "Ta3_max"
103 #define KEY_T1A_MIN_CP_DL "T1a_min_cp_dl"
104 #define KEY_T1A_MAX_CP_DL "T1a_max_cp_dl"
105 #define KEY_T1A_MIN_CP_UL "T1a_min_cp_ul"
106 #define KEY_T1A_MAX_CP_UL "T1a_max_cp_ul"
107 #define KEY_T1A_MIN_UP "T1a_min_up"
108 #define KEY_T1A_MAX_UP "T1a_max_up"
109 #define KEY_TA4_MIN "Ta4_min"
110 #define KEY_TA4_MAX "Ta4_max"
111 
112 
113 #define KEY_CP_ENABLE "CPenable"
114 #define KEY_CP_VTAG "c_plane_vlan_tag"
115 #define KEY_UP_VTAG "u_plane_vlan_tag"
116 #define KEY_DEBUG_STOP "debugStop"
117 #define KEY_DEBUG_STOP_CNT "debugStopCount"
118 #define KEY_BBDEV_MODE "bbdevMode"
119 #define KEY_DYNA_SEC_ENA "DynamicSectionEna"
120 #define KEY_ALPHA "Gps_Alpha"
121 #define KEY_BETA "Gps_Beta"
122 
123 #define KEY_NPRBELEM_DL "nPrbElemDl"
124 #define KEY_PRBELEM_DL "PrbElemDl"
125 
126 #define KEY_NPRBELEM_UL "nPrbElemUl"
127 #define KEY_PRBELEM_UL "PrbElemUl"
128 
134 static void init_config(RuntimeConfig* config)
135 {
136  memset(config , 0, sizeof(RuntimeConfig));
137 }
138 
141 static void trim(char* input)
142 {
143  uint32_t i;
144  for (i = 0; i<strlen(input); i++)
145  if (input[i] == ' ' || input[i] == '\n' || input[i] == '\t')
146  input[i] = '\0';
147 }
148 
149 static int fillConfigStruct(RuntimeConfig *config, const char *key, const char *value)
150 {
151  int32_t parse_res = 0;
152 
153  if (strcmp(key, KEY_APP_MODE) == 0){
154  config->appMode = atoi(value);
155  } else if (strcmp(key, KEY_XRAN_MODE) == 0) {
156  config->xranCat = atoi(value);
157  } else if (strcmp(key, KEY_CC_PER_PORT_NUM) == 0) {
158  config->numCC= atoi(value);
159  } else if (strcmp(key, KEY_MU_NUMBER) == 0) {
160  config->mu_number= atoi(value);
161  printf("mu_number: %d\n",config->mu_number);
162  } else if (strcmp(key, KEY_NDLABSFREPOINTA) == 0) {
163  config->nDLAbsFrePointA = atoi(value);
164  printf("nDLAbsFrePointA: %d\n",config->nDLAbsFrePointA);
165  } else if (strcmp(key, KEY_NULABSFREPOINTA) == 0) {
166  config->nULAbsFrePointA = atoi(value);
167  printf("nULAbsFrePointA: %d\n",config->nULAbsFrePointA);
168  } else if (strcmp(key, KEY_NDLBANDWIDTH) == 0) {
169  config->nDLBandwidth = atoi(value);
170  printf("nDLBandwidth: %d\n",config->nDLBandwidth);
171  } else if (strcmp(key, KEY_NULBANDWIDTH) == 0) {
172  config->nULBandwidth = atoi(value);
173  printf("nULBandwidth: %d\n",config->nULBandwidth);
174  } else if (strcmp(key, KEY_NDLFFTSIZE) == 0) {
175  config->nDLFftSize = atoi(value);
176  printf("nDLFftSize: %d\n",config->nDLFftSize);
177  } else if (strcmp(key, KEY_NULFFTSIZE) == 0) {
178  config->nULFftSize = atoi(value);
179  printf("nULFftSize: %d\n",config->nULFftSize);
180  } else if (strcmp(key, KEY_NFRAMEDUPLEXTYPE) == 0) {
181  config->nFrameDuplexType = atoi(value);
182  printf("nFrameDuplexType: %d\n",config->nFrameDuplexType);
183  } else if (strcmp(key, KEY_NTDDPERIOD) == 0) {
184  config->nTddPeriod = atoi(value);
185  printf("nTddPeriod: %d\n",config->nTddPeriod);
186  if (config->nTddPeriod > XRAN_MAX_TDD_PERIODICITY)
187  {
188  printf("nTddPeriod is larger than max allowed, invalid!\n");
190  }
191  } else if (strncmp(key, KEY_SSLOTCONFIG, strlen(KEY_SSLOTCONFIG)) == 0) {
192  unsigned int slot_num = 0;
193  int i = 0;
194  sscanf(key,"sSlotConfig%u",&slot_num);
195  if (slot_num >= config->nTddPeriod){
196  printf("slot_num %d exceeds TddPeriod\n",slot_num);
197  }
198  else{
199  sscanf(value, "%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x",
200  (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[0],
201  (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[1],
202  (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[2],
203  (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[3],
204  (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[4],
205  (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[5],
206  (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[6],
207  (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[7],
208  (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[8],
209  (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[9],
210  (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[10],
211  (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[11],
212  (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[12],
213  (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[13]);
214  printf("sSlotConfig%d: ",slot_num);
215  for (i = 0; i< 14; i++){
216  printf("%d ",config->sSlotConfig[slot_num].nSymbolType[i]);
217  }
218  printf("\n");
219  }
220  } else if (strcmp(key, KEY_ANT_NUM) == 0) {
221  config->numAxc = atoi(value);
222  } else if (strcmp(key, KEY_UL_ANT_NUM) == 0) {
223  config->numUlAxc = atoi(value);
224  }else if (strcmp(key, KEY_ANT_ELM_TRX_NUM) == 0) {
225  config->antElmTRx = atoi(value);
226  printf("antElmTRx %d\n", config->antElmTRx);
227  } else if (strcmp(key, KEY_MU_MIMO_UES_NUM) == 0) {
228  config->muMimoUEs = atoi(value);
229  } else if (strcmp(key, KEY_DLLAYERS_PER_UE) == 0) {
230  config->DlLayersPerUe = atoi(value);
231  } else if (strcmp(key, KEY_ULLAYERS_PER_UE) == 0) {
232  config->UlLayersPerUe = atoi(value);
233  } else if (strcmp(key, KEY_TTI_PERIOD) == 0) {
234  config->ttiPeriod = atoi(value);
235  } else if (strcmp(key, KEY_IQ_SWAP) == 0) {
236  config->iqswap = atoi(value);
237  } else if (strcmp(key, KEY_HTONS_SWAP) == 0) {
238  config->nebyteorderswap = atoi(value);
239  } else if (strcmp(key, KEY_COMPRESSION) == 0) {
240  config->compression = atoi(value);
241  } else if (strcmp(key, KEY_MTU_SIZE) == 0) {
242  config->mtu = atoi(value);
243  printf("mtu %d\n", config->mtu);
244  } else if (strcmp(key, KEY_IO_CORE) == 0) {
245  config->io_core = atoi(value);
246  printf("io_core %d\n", config->io_core);
247  }else if (strcmp(key, KEY_INSTANCE_ID) == 0) {
248  config->instance_id = atoi(value);
249  printf("instance_id %d\n", config->instance_id);
250  }else if (strcmp(key, KEY_LLS_CU_MAC) == 0) {
251  sscanf(value, "%02x:%02x:%02x:%02x:%02x:%02x", (uint32_t*)&config->o_du_addr.addr_bytes[0],
252  (uint32_t*)&config->o_du_addr.addr_bytes[1],
253  (uint32_t*)&config->o_du_addr.addr_bytes[2],
254  (uint32_t*)&config->o_du_addr.addr_bytes[3],
255  (uint32_t*)&config->o_du_addr.addr_bytes[4],
256  (uint32_t*)&config->o_du_addr.addr_bytes[5]);
257 
258  printf("lls-CU MAC address: %02X:%02X:%02X:%02X:%02X:%02X\n",
259  config->o_du_addr.addr_bytes[0],
260  config->o_du_addr.addr_bytes[1],
261  config->o_du_addr.addr_bytes[2],
262  config->o_du_addr.addr_bytes[3],
263  config->o_du_addr.addr_bytes[4],
264  config->o_du_addr.addr_bytes[5]);
265 
266  } else if (strcmp(key, KEY_RU_MAC) == 0) {
267  sscanf(value, "%02x:%02x:%02x:%02x:%02x:%02x", (uint32_t*)&config->o_ru_addr.addr_bytes[0],
268  (uint32_t*)&config->o_ru_addr.addr_bytes[1],
269  (uint32_t*)&config->o_ru_addr.addr_bytes[2],
270  (uint32_t*)&config->o_ru_addr.addr_bytes[3],
271  (uint32_t*)&config->o_ru_addr.addr_bytes[4],
272  (uint32_t*)&config->o_ru_addr.addr_bytes[5]);
273 
274  printf("RU MAC address: %02X:%02X:%02X:%02X:%02X:%02X\n",
275  config->o_ru_addr.addr_bytes[0],
276  config->o_ru_addr.addr_bytes[1],
277  config->o_ru_addr.addr_bytes[2],
278  config->o_ru_addr.addr_bytes[3],
279  config->o_ru_addr.addr_bytes[4],
280  config->o_ru_addr.addr_bytes[5]);
281  } else if (strcmp(key, KEY_FILE_NUMSLOTS) == 0) {
282  config->numSlots = atoi(value);
283  printf("numSlots: %d\n",config->numSlots);
284  }else if (strncmp(key, KEY_FILE_AxC, strlen(KEY_FILE_AxC)) == 0) {
285  unsigned int ant_num = 0;
286  sscanf(key,"antC%02u",&ant_num);
287  if (ant_num >= MAX_ANT_CARRIER_SUPPORTED) {
288  printf("antC%d exceeds max antenna supported\n",ant_num);
289  } else {
290  strncpy(&config->ant_file[ant_num][0], value, strlen(value));
291  printf("antC%d: %s\n",ant_num, config->ant_file[ant_num]);
292  }
293  } else if (strncmp(key, KEY_FILE_DLBFWUE, strlen(KEY_FILE_DLBFWUE)) == 0) {
294  unsigned int ue_num = 0;
295  sscanf(key,"DlBfwUe%02u",&ue_num);
296  if (ue_num >= MAX_ANT_CARRIER_SUPPORTED) {
297  printf("DlBfwUe%d exceeds max streams supported\n",ue_num);
298  } else {
299  strncpy(&config->dl_bfw_file[ue_num][0], value, strlen(value));
300  printf("DlBfwUe%d: %s\n",ue_num, config->dl_bfw_file[ue_num]);
301  }
302  }else if (strncmp(key, KEY_FILE_ULBFWUE, strlen(KEY_FILE_ULBFWUE)) == 0) {
303  unsigned int ue_num = 0;
304  sscanf(key,"UlBfwUe%02u",&ue_num);
305  if (ue_num >= MAX_ANT_CARRIER_SUPPORTED) {
306  printf("UlBfwUe%d exceeds max streams supported\n",ue_num);
307  } else {
308  strncpy(&config->ul_bfw_file[ue_num][0], value, strlen(value));
309  printf("UlBfwUe%d: %s\n",ue_num, config->ul_bfw_file[ue_num]);
310  }
311  }else if (strncmp(key, KEY_FILE_ULSRS, strlen(KEY_FILE_ULSRS)) == 0) {
312  unsigned int srs_ant = 0;
313  sscanf(key,"antSrsC%02u",&srs_ant);
314  if (srs_ant >= MAX_ANT_CARRIER_SUPPORTED_CAT_B) {
315  printf("antSrsC%d exceeds max ant elemnets supported [%d]\n", srs_ant, MAX_ANT_CARRIER_SUPPORTED_CAT_B);
316  } else {
317  strncpy(&config->ul_srs_file[srs_ant][0], value, strlen(value));
318  printf("antSrsC%d: %s\n",srs_ant, config->ul_srs_file[srs_ant]);
319  }
320  } else if (strcmp(key, KEY_PRACH_ENABLE) == 0) {
321  config->enablePrach = atoi(value);
322  printf("Prach enable: %d\n",config->enablePrach);
323  }else if (strcmp(key, KEY_MAX_FRAME_ID) == 0) {
324  config->maxFrameId = atoi(value);
325  printf("maxFrameId: %d\n",config->maxFrameId);
326  } else if (strcmp(key, KEY_SRS_ENABLE) == 0) {
327  config->enableSrs = atoi(value);
328  printf("Srs enable: %d\n",config->enablePrach);
329  } else if (strcmp(key, KEY_PRACH_CFGIDX) == 0) {
330  config->prachConfigIndex = atoi(value);
331  printf("Prach config index: %d\n",config->prachConfigIndex);
332  } else if (strcmp(key, KEY_SRS_SYM_IDX) == 0) {
333  config->srsSymMask = atoi(value);
334  printf("Srs symbol [0-13]: %d\n",config->srsSymMask);
335  } else if (strncmp(key, KEY_FILE_PRACH_AxC, strlen(KEY_FILE_PRACH_AxC)) == 0) {
336  unsigned int ant_num = 0;
337  sscanf(key,"antPrachC%02u",&ant_num);
338  if (ant_num >= MAX_ANT_CARRIER_SUPPORTED)
339  {
340  printf("antC%d exceeds max antenna supported\n",ant_num);
341  }
342  else{
343  strncpy(&config->prach_file[ant_num][0], value, strlen(value));
344  printf("antPrachC%d: %s\n",ant_num, config->prach_file[ant_num]);
345  }
346  } else if (strcmp(key, KEY_BFW_NUM) == 0) {
347  config->totalBfWeights = atoi(value);
348  printf("%s : %d\n",KEY_BFW_NUM, config->totalBfWeights);
349  /* timing */
350  } else if (strcmp(key, KEY_TADV_CP_DL ) == 0) {
351  config->Tadv_cp_dl = atoi(value);
352  printf("Tadv_cp_dl: %d\n",config->Tadv_cp_dl);
353  } else if (strcmp(key, KEY_T2A_MIN_CP_DL ) == 0) {
354  config->T2a_min_cp_dl = atoi(value);
355  printf("T2a_min_cp_dl: %d\n",config->T2a_min_cp_dl);
356  } else if (strcmp(key, KEY_T2A_MAX_CP_DL ) == 0) {
357  config->T2a_max_cp_dl = atoi(value);
358  printf("T2a_max_cp_dl: %d\n",config->T2a_max_cp_dl);
359  } else if (strcmp(key, KEY_T2A_MIN_CP_UL ) == 0) {
360  config->T2a_min_cp_ul = atoi(value);
361  printf("T2a_min_cp_ul: %d\n",config->T2a_min_cp_ul);
362  } else if (strcmp(key, KEY_T2A_MAX_CP_UL ) == 0) {
363  config->T2a_max_cp_ul = atoi(value);
364  printf("T2a_max_cp_ul: %d\n",config->T2a_max_cp_ul);
365  } else if (strcmp(key, KEY_T2A_MIN_UP ) == 0) {
366  config->T2a_min_up = atoi(value);
367  printf("T2a_min_up: %d\n",config->T2a_min_up);
368  } else if (strcmp(key, KEY_T2A_MAX_UP ) == 0) {
369  config->T2a_max_up = atoi(value);
370  printf("T2a_max_up: %d\n",config->T2a_max_up);
371  } else if (strcmp(key, KEY_TA3_MIN ) == 0) {
372  config->Ta3_min = atoi(value);
373  printf("Ta3_min: %d\n",config->Ta3_min);
374  } else if (strcmp(key, KEY_TA3_MAX ) == 0) {
375  config->Ta3_max = atoi(value);
376  printf("Ta3_max: %d\n",config->Ta3_max);
377  } else if (strcmp(key, KEY_T1A_MIN_CP_DL ) == 0) {
378  config->T1a_min_cp_dl = atoi(value);
379  printf("T1a_min_cp_dl: %d\n",config->T1a_min_cp_dl);
380  } else if (strcmp(key, KEY_T1A_MAX_CP_DL ) == 0) {
381  config->T1a_max_cp_dl = atoi(value);
382  printf("T1a_max_cp_dl: %d\n",config->T1a_max_cp_dl);
383  } else if (strcmp(key, KEY_T1A_MIN_CP_UL ) == 0) {
384  config->T1a_min_cp_ul = atoi(value);
385  printf("T1a_min_cp_ul: %d\n",config->T1a_min_cp_ul);
386  } else if (strcmp(key, KEY_T1A_MAX_CP_UL ) == 0) {
387  config->T1a_max_cp_ul = atoi(value);
388  printf("T1a_max_cp_ul: %d\n",config->T1a_max_cp_ul);
389  } else if (strcmp(key, KEY_T1A_MIN_UP ) == 0) {
390  config->T1a_min_up = atoi(value);
391  printf("T1a_min_up: %d\n",config->T1a_min_up);
392  } else if (strcmp(key, KEY_T1A_MAX_UP ) == 0) {
393  config->T1a_max_up = atoi(value);
394  printf("T1a_max_up: %d\n",config->T1a_max_up);
395  } else if (strcmp(key, KEY_TA4_MIN ) == 0) {
396  config->Ta4_min = atoi(value);
397  printf("Ta4_min: %d\n",config->Ta4_min);
398  } else if (strcmp(key, KEY_TA4_MAX ) == 0) {
399  config->Ta4_max = atoi(value);
400  printf("Ta4_max: %d\n",config->Ta4_max);
401  /* end of timing */
402  } else if (strcmp(key, KEY_CP_ENABLE ) == 0) {
403  config->enableCP = atoi(value);
404  printf("CPenable: %d\n",config->enableCP);
405  } else if (strcmp(key, KEY_DEBUG_STOP ) == 0) {
406  config->debugStop = atoi(value);
407  printf("debugStop: %d\n",config->debugStop);
408  } else if (strcmp(key, KEY_DEBUG_STOP_CNT) == 0) {
409  config->debugStopCount = atoi(value);
410  printf("debugStopCount: %d\n",config->debugStopCount);
411  } else if (strcmp(key, KEY_BBDEV_MODE) == 0) {
412  config->bbdevMode = atoi(value);
413  printf("bbdevMode: %d\n",config->debugStopCount);
414  } else if (strcmp(key, KEY_DYNA_SEC_ENA) == 0) {
415  config->DynamicSectionEna = atoi(value);
416  printf("DynamicSectionEna: %d\n",config->DynamicSectionEna);
417  } else if (strcmp(key, KEY_ALPHA) == 0) {
418  config->GPS_Alpha = atoi(value);
419  printf("GPS_Alpha: %d\n",config->GPS_Alpha);
420  } else if (strcmp(key, KEY_BETA) == 0) {
421  config->GPS_Beta = atoi(value);
422  printf("GPS_Beta: %d\n",config->GPS_Beta);
423  } else if (strcmp(key, KEY_CP_VTAG ) == 0) {
424  config->cp_vlan_tag = atoi(value);
425  printf("cp_vlan_tag: %d\n",config->cp_vlan_tag);
426  } else if (strcmp(key, KEY_UP_VTAG ) == 0) {
427  config->up_vlan_tag = atoi(value);
428  printf("up_vlan_tag: %d\n",config->up_vlan_tag);
429  } else if (strcmp(key, KEY_NPRBELEM_UL ) == 0) {
430  config->PrbMapUl.nPrbElm = atoi(value);
431  if (config->PrbMapUl.nPrbElm > XRAN_MAX_PRBS)
432  {
433  printf("nTddPeriod is larger than max allowed, invalid!\n");
434  config->PrbMapUl.nPrbElm = XRAN_MAX_PRBS;
435  }
436  printf("nPrbElemUl: %d\n",config->PrbMapUl.nPrbElm);
437  } else if (strncmp(key, KEY_PRBELEM_UL, strlen(KEY_PRBELEM_UL)) == 0) {
438  unsigned int section_idx = 0;
439  sscanf(key,"PrbElemUl%u",&section_idx);
440  if (section_idx >= config->PrbMapUl.nPrbElm){
441  printf("section_idx %d exceeds nPrbElem\n",section_idx);
442  }
443  else{
444  struct xran_prb_elm *pPrbElem = &config->PrbMapUl.prbMap[section_idx];
445  sscanf(value, "%hd,%hd,%hd,%hd,%hd,%hd,%hd,%hd,%hd",
446  (int16_t*)&pPrbElem->nRBStart,
447  (int16_t*)&pPrbElem->nRBSize,
448  (int16_t*)&pPrbElem->nStartSymb,
449  (int16_t*)&pPrbElem->numSymb,
450  (int16_t*)&pPrbElem->nBeamIndex,
451  (int16_t*)&pPrbElem->bf_weight_update,
452  (int16_t*)&pPrbElem->compMethod,
453  (int16_t*)&pPrbElem->iqWidth,
454  (int16_t*)&pPrbElem->BeamFormingType);
455  printf("nPrbElemUl%d: ",section_idx);
456  printf("nRBStart %d,nRBSize %d,nStartSymb %d,numSymb %d,nBeamIndex %d, bf_weight_update %d compMethod %d, iqWidth %d BeamFormingType %d\n",
457  pPrbElem->nRBStart,pPrbElem->nRBSize,pPrbElem->nStartSymb,pPrbElem->numSymb,pPrbElem->nBeamIndex, pPrbElem->bf_weight_update, pPrbElem->compMethod, pPrbElem->iqWidth, pPrbElem->BeamFormingType);
458  }
459  }else if (strcmp(key, KEY_NPRBELEM_DL ) == 0) {
460  config->PrbMapDl.nPrbElm = atoi(value);
461  if (config->PrbMapDl.nPrbElm > XRAN_MAX_PRBS)
462  {
463  printf("nTddPeriod is larger than max allowed, invalid!\n");
464  config->PrbMapDl.nPrbElm = XRAN_MAX_PRBS;
465  }
466  printf("nPrbElemDl: %d\n",config->PrbMapDl.nPrbElm);
467  } else if (strncmp(key, KEY_PRBELEM_DL, strlen(KEY_PRBELEM_DL)) == 0) {
468  unsigned int section_idx = 0;
469  sscanf(key,"PrbElemDl%u",&section_idx);
470  if (section_idx >= config->PrbMapDl.nPrbElm){
471  printf("section_idx %d exceeds nPrbElem\n",section_idx);
472  }
473  else{
474  struct xran_prb_elm *pPrbElem = &config->PrbMapDl.prbMap[section_idx];
475  sscanf(value, "%hd,%hd,%hd,%hd,%hd,%hd,%hd,%hd,%hd",
476  (int16_t*)&pPrbElem->nRBStart,
477  (int16_t*)&pPrbElem->nRBSize,
478  (int16_t*)&pPrbElem->nStartSymb,
479  (int16_t*)&pPrbElem->numSymb,
480  (int16_t*)&pPrbElem->nBeamIndex,
481  (int16_t*)&pPrbElem->bf_weight_update,
482  (int16_t*)&pPrbElem->compMethod,
483  (int16_t*)&pPrbElem->iqWidth,
484  (int16_t*)&pPrbElem->BeamFormingType);
485  printf("nPrbElemDl%d: ",section_idx);
486  printf("nRBStart %d,nRBSize %d,nStartSymb %d,numSymb %d,nBeamIndex %d, bf_weight_update %d compMethod %d, iqWidth %d BeamFormingType %d\n",
487  pPrbElem->nRBStart,pPrbElem->nRBSize,pPrbElem->nStartSymb,pPrbElem->numSymb,pPrbElem->nBeamIndex, pPrbElem->bf_weight_update, pPrbElem->compMethod, pPrbElem->iqWidth, pPrbElem->BeamFormingType);
488  }
489  } else {
490  printf("Unsupported configuration key [%s]\n", key);
491  return -1;
492  }
493 
494  return 0;
495 }
496 
497 int parseConfigFile(char *filename, RuntimeConfig *config)
498 {
499  char inputLine[MAX_LINE_SIZE] = {0};
500  int inputLen = 0;
501  int i;
502  int lineNum = 0;
503  char key[MAX_LINE_SIZE] = {0};
504  char value[MAX_LINE_SIZE] = {0};
505  FILE *file = fopen(filename, "r");
506 
507  if (NULL == file) {
508  log_err("Error while opening config file from: %s", filename);
509  return -1;
510  }
511 
512 // init_config(config);
513 
514  for (;;) {
515  if (fgets(inputLine, MAX_LINE_SIZE, file) == NULL) {
516  if (lineNum > 0) {
517  printf("%d lines of config file has been read.\n", lineNum);
518  break;
519  } else {
520  printf("Configuration file reading error has occurred.\n");
521  fclose(file);
522  return -1;
523  }
524  }
525 
526  if (inputLine[strlen(inputLine)-1] == '\n')
527  inputLine[strlen(inputLine)-1] == '\0';
528 
529  lineNum++;
530  inputLen = strlen(inputLine);
531 
532  for (i=0; i<inputLen; i++)
533  if (inputLine[i] == '#') {
534  inputLine[i] = '\0';
535  inputLen = i + 1;
536  break;
537  }
538 
539  for (i=0; i<inputLen; i++)
540  if (inputLine[i] == '=') {
541  strncpy(key, inputLine, i);
542  key[i] = '\0';
543  trim(key);
544  if ((i + 1 > inputLen - 1) || (i - 2 > inputLen)) {
545  log_err("Parsing config file error at line %d", lineNum);
546  fclose(file);
547  return -1;
548  }
549  strncpy(value, &inputLine[i+1], (sizeof(value) - 1));
550  value[inputLen-i-2] = '\0';
551  trim(value);
552 
553  if (strlen(key) == 0 || strlen(value) == 0) {
554  printf("Parsing config file error at line %d", lineNum);
555  fclose(file);
556  return -1;
557  }
558 
559  if (fillConfigStruct(config, key, value) != 0) {
560  fclose(file);
561  return -1;
562  }
563 
564  break;
565  }
566 
567  memset(&inputLine[0], 0, sizeof(MAX_LINE_SIZE));
568  memset(&key[0], 0, sizeof(MAX_LINE_SIZE));
569  memset(&value[0], 0, sizeof(MAX_LINE_SIZE));
570  }
571  fclose(file);
572 
573  return 0;
574 }
uint8_t enablePrach
Definition: config.h:68
int32_t DynamicSectionEna
Definition: config.h:109
uint8_t xranCat
Definition: config.h:37
int parseConfigFile(char *filename, RuntimeConfig *config)
Definition: config.c:497
struct ether_addr o_du_addr
Definition: config.h:49
#define KEY_SRS_ENABLE
Definition: config.c:80
#define KEY_APP_MODE
Definition: config.c:36
#define KEY_TA4_MIN
Definition: config.c:109
#define MAX_ANT_CARRIER_SUPPORTED
Definition: common.h:51
#define KEY_TADV_CP_DL
Definition: config.c:94
uint16_t Tadv_cp_dl
Definition: config.h:84
uint8_t cp_vlan_tag
Definition: config.h:103
#define KEY_BBDEV_MODE
Definition: config.c:118
#define KEY_DEBUG_STOP_CNT
Definition: config.c:117
#define MAX_LINE_SIZE
Definition: config.c:33
fclose(fileID)
#define KEY_MU_NUMBER
Definition: config.c:38
#define KEY_ANT_NUM
Definition: config.c:52
#define XRAN_MAX_PRBS
Definition: xran_fh_o_du.h:128
#define KEY_PRACH_CFGIDX
Definition: config.c:82
uint16_t T2a_min_cp_ul
Definition: config.h:87
#define KEY_PRBELEM_DL
Definition: config.c:124
#define KEY_RU_MAC
Definition: config.c:73
uint16_t Ta3_max
Definition: config.h:92
char prach_file[XRAN_MAX_SECTOR_NR *XRAN_MAX_ANTENNA_NR][512]
Definition: config.h:60
#define KEY_FILE_ULSRS
Definition: config.c:63
#define KEY_NDLABSFREPOINTA
Definition: config.c:39
uint8_t up_vlan_tag
Definition: config.h:104
#define KEY_ULLAYERS_PER_UE
Definition: config.c:59
int16_t nRBStart
Definition: xran_fh_o_du.h:394
#define KEY_FILE_NUMSLOTS
Definition: config.c:75
int16_t nBeamIndex
Definition: xran_fh_o_du.h:398
uint32_t nPrbElm
Definition: xran_fh_o_du.h:422
struct xran_prb_map PrbMapDl
Definition: config.h:125
uint8_t nebyteorderswap
Definition: config.h:74
int16_t nRBSize
Definition: xran_fh_o_du.h:395
#define KEY_UL_ANT_NUM
Definition: config.c:53
#define KEY_T2A_MAX_UP
Definition: config.c:100
#define KEY_NPRBELEM_UL
Definition: config.c:126
uint8_t prachConfigIndex
Definition: config.h:72
#define KEY_TA4_MAX
Definition: config.c:110
uint16_t T2a_max_cp_dl
Definition: config.h:86
uint16_t srsSymMask
Definition: config.h:80
#define KEY_T1A_MIN_UP
Definition: config.c:107
char dl_bfw_file[XRAN_MAX_SECTOR_NR *XRAN_MAX_ANTENNA_NR][512]
Definition: config.h:62
#define KEY_IQ_SWAP
Definition: config.c:88
#define KEY_FILE_AxC
Definition: config.c:76
int16_t iqWidth
Definition: xran_fh_o_du.h:401
#define KEY_T1A_MAX_CP_DL
Definition: config.c:104
uint32_t muMimoUEs
Definition: config.h:42
uint16_t T1a_min_up
Definition: config.h:97
#define KEY_T2A_MIN_CP_DL
Definition: config.c:95
#define KEY_NDLFFTSIZE
Definition: config.c:43
uint32_t UlLayersPerUe
Definition: config.h:45
uint16_t maxFrameId
Definition: config.h:82
#define KEY_FILE_DLBFWUE
Definition: config.c:60
uint16_t Ta4_min
Definition: config.h:99
uint8_t nSymbolType[XRAN_NUM_OF_SYMBOL_PER_SLOT]
Definition: xran_fh_o_du.h:454
#define KEY_INSTANCE_ID
Definition: config.c:70
#define KEY_NULBANDWIDTH
Definition: config.c:42
uint32_t nULBandwidth
Definition: config.h:117
#define KEY_NULABSFREPOINTA
Definition: config.c:40
uint8_t compression
Definition: config.h:75
uint32_t instance_id
Definition: config.h:53
uint32_t mtu
Definition: config.h:56
uint32_t nDLBandwidth
Definition: config.h:116
#define KEY_T2A_MIN_CP_UL
Definition: config.c:97
#define KEY_CC_PER_PORT_NUM
Definition: config.c:51
uint16_t T2a_max_cp_ul
Definition: config.h:88
#define KEY_MTU_SIZE
Definition: config.c:68
#define KEY_NULFFTSIZE
Definition: config.c:44
#define KEY_DEBUG_STOP
Definition: config.c:116
uint8_t iqswap
Definition: config.h:73
struct ether_addr o_ru_addr
Definition: config.h:50
#define KEY_ALPHA
Definition: config.c:120
#define KEY_ANT_ELM_TRX_NUM
Definition: config.c:55
#define log_err(fmt,...)
Definition: debug.h:59
#define KEY_TA3_MAX
Definition: config.c:102
#define KEY_T1A_MAX_CP_UL
Definition: config.c:106
uint8_t appMode
Definition: config.h:36
uint32_t nDLFftSize
Definition: config.h:118
#define KEY_MU_MIMO_UES_NUM
Definition: config.c:57
#define KEY_T2A_MAX_CP_DL
Definition: config.c:96
uint16_t T1a_max_up
Definition: config.h:98
#define KEY_CP_ENABLE
Definition: config.c:113
#define KEY_FILE_ULBFWUE
Definition: config.c:61
uint16_t T2a_max_up
Definition: config.h:90
#define KEY_UP_VTAG
Definition: config.c:115
#define KEY_LLS_CU_MAC
Definition: config.c:72
#define MAX_ANT_CARRIER_SUPPORTED_CAT_B
Definition: common.h:52
#define KEY_IO_CORE
Definition: config.c:69
uint32_t ttiPeriod
Definition: config.h:47
int16_t bf_weight_update
Definition: xran_fh_o_du.h:399
uint32_t nDLAbsFrePointA
Definition: config.h:114
#define KEY_PRBELEM_UL
Definition: config.c:127
or MHz ant_num
Definition: gen_test.m:82
uint16_t totalBfWeights
Definition: config.h:77
uint16_t T1a_max_cp_ul
Definition: config.h:96
int16_t compMethod
Definition: xran_fh_o_du.h:400
#define KEY_COMPRESSION
Definition: config.c:90
int32_t debugStop
Definition: config.h:106
#define KEY_BFW_NUM
Definition: config.c:92
int16_t nStartSymb
Definition: xran_fh_o_du.h:396
#define KEY_FILE_PRACH_AxC
Definition: config.c:77
#define KEY_T2A_MIN_UP
Definition: config.c:99
#define KEY_TTI_PERIOD
Definition: config.c:66
#define KEY_T1A_MIN_CP_UL
Definition: config.c:105
uint16_t Ta4_max
Definition: config.h:100
#define KEY_SSLOTCONFIG
Definition: config.c:49
uint16_t T2a_min_up
Definition: config.h:89
int32_t bbdevMode
Definition: config.h:108
int32_t debugStopCount
Definition: config.h:107
int16_t BeamFormingType
Definition: xran_fh_o_du.h:402
uint8_t numUlAxc
Definition: config.h:40
#define KEY_T2A_MAX_CP_UL
Definition: config.c:98
uint16_t T1a_min_cp_ul
Definition: config.h:95
char ul_bfw_file[XRAN_MAX_SECTOR_NR *XRAN_MAX_ANTENNA_NR][512]
Definition: config.h:63
#define KEY_DYNA_SEC_ENA
Definition: config.c:119
#define KEY_SRS_SYM_IDX
Definition: config.c:83
uint16_t T1a_min_cp_dl
Definition: config.h:93
int32_t GPS_Alpha
Definition: config.h:110
#define KEY_NDLBANDWIDTH
Definition: config.c:41
#define KEY_T1A_MIN_CP_DL
Definition: config.c:103
#define KEY_NFRAMEDUPLEXTYPE
Definition: config.c:46
#define KEY_MAX_FRAME_ID
Definition: config.c:85
uint8_t nFrameDuplexType
Definition: config.h:122
uint8_t numCC
Definition: config.h:38
uint32_t DlLayersPerUe
Definition: config.h:44
uint8_t nTddPeriod
Definition: config.h:123
#define KEY_XRAN_MODE
Definition: config.c:37
char ant_file[XRAN_MAX_SECTOR_NR *XRAN_MAX_ANTENNA_NR][512]
Definition: config.h:59
uint16_t T2a_min_cp_dl
Definition: config.h:85
uint8_t mu_number
Definition: config.h:113
#define XRAN_MAX_TDD_PERIODICITY
Definition: xran_fh_o_du.h:124
uint8_t numAxc
Definition: config.h:39
#define KEY_TA3_MIN
Definition: config.c:101
int numSlots
Definition: config.h:58
uint32_t io_core
Definition: config.h:54
uint32_t nULFftSize
Definition: config.h:119
uint32_t antElmTRx
Definition: config.h:41
uint16_t T1a_max_cp_dl
Definition: config.h:94
#define KEY_PRACH_ENABLE
Definition: config.c:79
uint8_t enableSrs
Definition: config.h:79
struct xran_prb_elm prbMap[XRAN_MAX_PRBS]
Definition: xran_fh_o_du.h:423
#define KEY_CP_VTAG
Definition: config.c:114
#define KEY_HTONS_SWAP
Definition: config.c:89
struct xran_prb_map PrbMapUl
Definition: config.h:126
#define KEY_T1A_MAX_UP
Definition: config.c:108
#define KEY_BETA
Definition: config.c:121
#define KEY_DLLAYERS_PER_UE
Definition: config.c:58
uint32_t nULAbsFrePointA
Definition: config.h:115
char ul_srs_file[XRAN_MAX_SECTOR_NR *XRAN_MAX_ANT_ARRAY_ELM_NR][512]
Definition: config.h:65
int16_t numSymb
Definition: xran_fh_o_du.h:397
#define KEY_NTDDPERIOD
Definition: config.c:47
struct xran_slot_config sSlotConfig[XRAN_MAX_TDD_PERIODICITY]
Definition: config.h:124
uint8_t enableCP
Definition: config.h:102
uint16_t Ta3_min
Definition: config.h:91
#define KEY_NPRBELEM_DL
Definition: config.c:123
int32_t GPS_Beta
Definition: config.h:111