Added code for MAC-PHY interface, DU_APP, F1AP, SCTP and CU stub
[o-du/l2.git] / src / du_app / du_utils.c
1 /*******************************************************************************
2 ################################################################################
3 #   Copyright (c) [2017-2019] [Radisys]                                        #
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
19 /* This file contains all utility functions */
20 #if 0
21 #include<stdbool.h>
22 #include<netinet/in.h>
23 #include<arpa/inet.h>
24 #include<string.h>
25 #include<stdlib.h>
26 #endif
27 #include "du_mgr.h"
28
29 #define DU_INST 0
30 #define DU_ID 1
31 #define DU_IP_V4_ADDR "168.168.31.12"
32 #define CU_IP_V4_ADDR "168.168.31.57"
33 #define DU_IP_V6_ADDR "0000:0000:0000:0000:0000:0000:0000:0001"
34 #define DU_PORT 38472
35 #define CU_PORT 38472
36 #define NR_PCI 1
37 #define NR_CELL_ID 1
38 #define DU_NAME "Oran_OAM_DU" 
39 #define CELL_DIR UL_DL
40 #define CELL_TYPE SMALL
41 #define DUPLEX_MODE DUP_MODE_TDD
42 #define DU_TAC 1
43 #define PLMN_MCC0 3
44 #define PLMN_MCC1 1
45 #define PLMN_MCC2 1
46 #define PLMN_MNC0 4
47 #define PLMN_MNC1 8
48 #define PLMN_MNC2 0 
49 #define NR_ARFCN  2079427 
50 #define SUL_ARFCN 100
51 #define NR_FREQ_BAND 257
52 #define SUL_BAND 2
53 #define TIME_CFG 10
54 #define NR_RANAC 150
55 #define CARRIER_IDX 1
56 #define NUM_TX_ANT 2
57 #define NUM_RX_ANT 2
58 #define FREQ_SHIFT_7P5KHZ FALSE
59 #define SSB_PBCH_PWR 0
60 #define BCH_PAYLOAD MAC_GEN_FULL_PBCH_PAYLD
61 #define SUBCARRIER_SPACING 3
62 #define PRB_OFFSET 0
63 #define BETA_PSS BETA_PSS_0DB
64 #define SSB_PERIODICITTY SSB_PRDCTY_MS_20
65 #define SSB_SUBCARRIER_OFFSET 0
66 #define SSB_MULT_CARRIER_BAND FALSE
67 #define MULT_CELL_CARRIER FALSE
68
69 #define PRACH_SEQ_LEN SHORT_SEQUENCE
70 #define PRACH_SUBCARRIER_SPACING 3
71 #define PRACH_RESTRICTED_SET_CFG UNRESTRICTED
72 #define NUM_PRACH_FDM 1
73 #define ROOT_SEQ_IDX 0
74 #define NUM_ROOT_SEQ 1
75 #define ZERO_CORRELATION_ZONE_CFG 2
76 #define NUM_UNUSED_ROOT_SEQ 1
77 #define UNUSED_ROOT_SEQ 1
78 #define SSB_PER_RACH 3
79 #define PRACH_MULT_CARRIER_BAND FALSE
80 #define TDD_PERIODICITY TX_PRDCTY_MS_2P5
81 #define RSS_MEASUREMENT_UNIT DONT_REPORT_RSSI
82
83 extern DuCfgParams ducfgparam;
84
85
86 /* Filling Slot configuration as :
87  * Slot Sym 0 Sym 1 Sym 2 Sym 3 Sym 4 Sym 5 Sym 6 Sym 7 Sym 8 Sym 9 Sym10 Sym11 Sym12 Sym13
88  *   0   DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL
89  *   1   DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL
90  *   2   DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL
91  *   3   DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    GD    GD    GD    UL
92  *   4   UL    UL    UL    UL    UL    UL    UL    UL    UL    UL    UL    UL    UL    UL
93 */
94
95 /*******************************************************************
96  *
97  * @brief Fills the Slot configuration 
98  *
99  * @details
100  *
101  *    Function : fillSlotConfig
102  *
103  *    Functionality:Fill the Slot configuration values
104  * 
105  *  @params[in] void
106  * @return ROK     - success
107  *         RFAILED - failure
108  *
109  * ****************************************************************/
110
111
112 void fillSlotConfig()
113 {
114    U8 slot;
115    U8 symbol;
116
117    for(slot = 0; slot <= 3; slot++)
118    {
119       for(symbol = 0; symbol < MAX_SYMB_PER_SLOT; symbol++)
120          ducfgparam.clCellCfg.tddCfg.slotCfg[slot][symbol] = DL_SLOT;
121    }
122
123    ducfgparam.clCellCfg.tddCfg.slotCfg[3][10] = GUARD_SLOT;
124    ducfgparam.clCellCfg.tddCfg.slotCfg[3][11] = GUARD_SLOT;
125    ducfgparam.clCellCfg.tddCfg.slotCfg[3][12] = GUARD_SLOT;
126    ducfgparam.clCellCfg.tddCfg.slotCfg[3][13] = UL_SLOT;
127
128    for(symbol = 0; symbol < MAX_SYMB_PER_SLOT; symbol++)
129       ducfgparam.clCellCfg.tddCfg.slotCfg[4][symbol] = UL_SLOT;
130
131 }
132          
133 /*******************************************************************
134  *
135  * @brief Reads the CL Configuration.
136  *
137  * @details
138  *
139  *    Function : readClCfg
140  *
141  *    Functionality:
142  *       - Fills up the cell configuration for CL.
143  *       - Calls fillSlotConfig()  
144  *
145  * @params[in] void
146  * @return ROK     - success
147  *         RFAILED - failure
148  *
149  * ****************************************************************/
150
151
152 /* This function is used to fill up the cell configuration for CL */
153 void readClCfg()
154 {
155    ducfgparam.clCellCfg.carrierId = CARRIER_IDX;
156
157    /* Cell configuration */
158    ducfgparam.clCellCfg.cellId = NR_CELL_ID;
159    ducfgparam.clCellCfg.phyCellId = NR_PCI;
160    ducfgparam.clCellCfg.dupType = DUPLEX_MODE;
161
162    /* DL carrier configuration */
163    ducfgparam.clCellCfg.dlCarrCfg.pres = TRUE;
164    ducfgparam.clCellCfg.dlCarrCfg.bw = SUL_ARFCN;
165    ducfgparam.clCellCfg.dlCarrCfg.freq = NR_ARFCN;
166    ducfgparam.clCellCfg.dlCarrCfg.k0[0] = 1;
167    ducfgparam.clCellCfg.dlCarrCfg.k0[1] = 1;
168    ducfgparam.clCellCfg.dlCarrCfg.k0[2] = 1;
169    ducfgparam.clCellCfg.dlCarrCfg.k0[3] = 1;
170    ducfgparam.clCellCfg.dlCarrCfg.k0[4] = 1;
171    ducfgparam.clCellCfg.dlCarrCfg.gridSize[0] = 1;
172    ducfgparam.clCellCfg.dlCarrCfg.gridSize[1] = 1;
173    ducfgparam.clCellCfg.dlCarrCfg.gridSize[2] = 1;
174    ducfgparam.clCellCfg.dlCarrCfg.gridSize[3] = 1;
175    ducfgparam.clCellCfg.dlCarrCfg.gridSize[4] = 1;
176    ducfgparam.clCellCfg.dlCarrCfg.numAnt = NUM_TX_ANT;
177
178    /* UL Carrier configuration */
179    ducfgparam.clCellCfg.ulCarrCfg.pres = TRUE;
180    ducfgparam.clCellCfg.ulCarrCfg.bw = SUL_ARFCN;
181    ducfgparam.clCellCfg.ulCarrCfg.freq = NR_ARFCN;
182    ducfgparam.clCellCfg.ulCarrCfg.k0[0] = 1;
183    ducfgparam.clCellCfg.ulCarrCfg.k0[1] = 1;
184    ducfgparam.clCellCfg.ulCarrCfg.k0[2] = 1;
185    ducfgparam.clCellCfg.ulCarrCfg.k0[3] = 1;
186    ducfgparam.clCellCfg.ulCarrCfg.k0[4] = 1;
187    ducfgparam.clCellCfg.ulCarrCfg.gridSize[0] = 1;
188    ducfgparam.clCellCfg.ulCarrCfg.gridSize[1] = 1;
189    ducfgparam.clCellCfg.ulCarrCfg.gridSize[2] = 1;
190    ducfgparam.clCellCfg.ulCarrCfg.gridSize[3] = 1;
191    ducfgparam.clCellCfg.ulCarrCfg.gridSize[4] = 1;
192    ducfgparam.clCellCfg.ulCarrCfg.numAnt = NUM_RX_ANT;
193
194    ducfgparam.clCellCfg.freqShft = FREQ_SHIFT_7P5KHZ;
195
196    /* SSB configuration */
197    ducfgparam.clCellCfg.ssbCfg.ssbPbchPwr = SSB_PBCH_PWR;
198    ducfgparam.clCellCfg.ssbCfg.bchPayload = BCH_PAYLOAD;
199    ducfgparam.clCellCfg.ssbCfg.scsCmn = SUBCARRIER_SPACING;
200    ducfgparam.clCellCfg.ssbCfg.ssbPrbOffset = PRB_OFFSET;
201    ducfgparam.clCellCfg.ssbCfg.betaPss = BETA_PSS;
202    ducfgparam.clCellCfg.ssbCfg.ssbPeriod = SSB_PERIODICITTY;
203    ducfgparam.clCellCfg.ssbCfg.ssbSubcOffset = SSB_SUBCARRIER_OFFSET;
204    ducfgparam.clCellCfg.ssbCfg.mibPdu = 104;
205    ducfgparam.clCellCfg.ssbCfg.nSSBMask[0] = 2162721;
206    ducfgparam.clCellCfg.ssbCfg.nSSBMask[1] = 0;
207    ducfgparam.clCellCfg.ssbCfg.multCarrBand = SSB_MULT_CARRIER_BAND;
208    ducfgparam.clCellCfg.ssbCfg.multCellCarr = MULT_CELL_CARRIER;
209
210    /* PRACH configuration */
211    ducfgparam.clCellCfg.prachCfg.pres = TRUE;
212    ducfgparam.clCellCfg.prachCfg.prachSeqLen = PRACH_SEQ_LEN;
213    ducfgparam.clCellCfg.prachCfg.prachSubcSpacing = PRACH_SUBCARRIER_SPACING;
214    ducfgparam.clCellCfg.prachCfg.prachRstSetCfg = PRACH_RESTRICTED_SET_CFG;
215    ducfgparam.clCellCfg.prachCfg.prachFdm = NUM_PRACH_FDM;
216    ducfgparam.clCellCfg.prachCfg.fdm[0].rootSeqIdx = ROOT_SEQ_IDX;
217    ducfgparam.clCellCfg.prachCfg.fdm[0].numRootSeq = NUM_ROOT_SEQ;
218    ducfgparam.clCellCfg.prachCfg.fdm[0].k1 = 1;
219    ducfgparam.clCellCfg.prachCfg.fdm[0].zeroCorrZoneCfg = ZERO_CORRELATION_ZONE_CFG;
220    ducfgparam.clCellCfg.prachCfg.fdm[0].numUnusedRootSeq = NUM_UNUSED_ROOT_SEQ;
221    *(ducfgparam.clCellCfg.prachCfg.fdm[0].unsuedRootSeq) = UNUSED_ROOT_SEQ;
222    ducfgparam.clCellCfg.prachCfg.ssbPerRach = SSB_PER_RACH;
223    ducfgparam.clCellCfg.prachCfg.prachMultCarrBand = PRACH_MULT_CARRIER_BAND;
224
225    /* TDD configuration */
226    ducfgparam.clCellCfg.tddCfg.pres = TRUE;
227    ducfgparam.clCellCfg.tddCfg.tddPeriod = TDD_PERIODICITY;
228
229    fillSlotConfig();
230
231    /* RSSI Measurement configuration */
232    ducfgparam.clCellCfg.rssiUnit = RSS_MEASUREMENT_UNIT;
233
234    /* This should be calculated based on
235      (number of mandatory parameters) + (number of otional parameters being filled) */
236    ducfgparam.clCellCfg.numTlv = 39;
237
238 }
239 /*******************************************************************
240  *
241  * @brief Configures the DU Parameters
242  *
243  * @details
244  *
245  *    Function : readCfg
246  *
247  *    Functionality:
248  *       - Initializes the DuCfg members.  
249  *       - Calls readClCfg()  
250  *
251  * @params[in] system task ID
252  * @return ROK     - success
253  *         RFAILED - failure
254  *
255  * ****************************************************************/
256
257 void readCfg()
258 {
259    U8 i,j,k;
260    
261    /* F1 DU IP Address and Port*/
262    ducfgparam.sctpParams.duIpAddr.ipV4Pres = TRUE;
263    strcpy(ducfgparam.sctpParams.duIpAddr.ipV4Addr, (char*)DU_IP_V4_ADDR);
264    ducfgparam.sctpParams.duIpAddr.ipV6Pres = FALSE;
265    strcpy(ducfgparam.sctpParams.duIpAddr.ipV6Addr, (char*)DU_IP_V6_ADDR);
266    ducfgparam.sctpParams.duPort = DU_PORT;
267         
268    /* F1 CU IP Address and Port*/
269    ducfgparam.sctpParams.cuIpAddr.ipV4Pres = TRUE;
270    strcpy(ducfgparam.sctpParams.cuIpAddr.ipV4Addr, (char*)CU_IP_V4_ADDR);
271    ducfgparam.sctpParams.cuIpAddr.ipV6Pres = FALSE;
272    strcpy(ducfgparam.sctpParams.cuIpAddr.ipV6Addr, DU_IP_V6_ADDR);
273    ducfgparam.sctpParams.cuPort = CU_PORT;
274         
275    /* DU Info */        
276    ducfgparam.duId = DU_ID;     
277    strcpy(ducfgparam.duName,DU_NAME);
278    
279    for(i=0;i<MAXCELLINGNBDU;i++)
280    { 
281       ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn.mcc[0] = PLMN_MCC0;
282       ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn.mcc[1] = PLMN_MCC1;
283       ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn.mcc[2] = PLMN_MCC2;
284       ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn.mnc[0] = PLMN_MNC0;
285       ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn.mnc[1] = PLMN_MNC1;
286       ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn.mnc[2] = PLMN_MNC2;
287
288       /*Cell ID */
289       ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.cellId = NR_CELL_ID;
290       ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.nrPci = NR_PCI;
291         
292       /* List of Available PLMN */
293       for(j=0;j<MAXNUMOFBPLMN;j++)
294       {
295         ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j].mcc[0] = PLMN_MCC0;
296         ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j].mcc[1] = PLMN_MCC1;
297         ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j].mcc[2] = PLMN_MCC2;
298         ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j].mnc[0] = PLMN_MNC0;
299         ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j].mnc[1] = PLMN_MNC1;
300         ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j].mnc[2] = PLMN_MNC2;
301       }
302       /* List of Extended PLMN */
303       for(j=0;j<MAXNUMOFBPLMN;j++)
304       {
305         ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j].mcc[0] = PLMN_MCC0;
306         ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j].mcc[1] = PLMN_MCC1;
307         ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j].mcc[2] = PLMN_MCC2;
308         ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j].mnc[0] = PLMN_MNC0;
309         ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j].mnc[1] = PLMN_MNC1;
310         ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j].mnc[2] = PLMN_MNC2;
311       } 
312
313       /* TAC and EPSTAC */
314       ducfgparam.srvdCellLst[i].duCellInfo.tac.pres = TRUE;
315       ducfgparam.srvdCellLst[i].duCellInfo.tac.tac = DU_TAC;
316       ducfgparam.srvdCellLst[i].duCellInfo.epsTac.pres = TRUE;  //to check and fill.
317       ducfgparam.srvdCellLst[i].duCellInfo.epsTac.tac =DU_TAC; //to check and fill
318
319       /* NR Mode info */
320       ducfgparam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.nrArfcn = NR_ARFCN;
321       ducfgparam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.pres = TRUE;
322       ducfgparam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulArfcn = SUL_ARFCN;
323       ducfgparam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulTxBw.nrScs = SCS_15;           
324       ducfgparam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulTxBw.nrb = NRB_160;           
325
326       for(j=0;j<MAXNRCELLBANDS;j++)
327       {
328         ducfgparam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.freqBand[j].nrFreqBand = NR_FREQ_BAND;
329          for(k=0;k<MAXNRCELLBANDS;k++)
330          {
331             ducfgparam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.freqBand[j].sulBand[k] = SUL_BAND;  
332          }
333       }
334
335       ducfgparam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrTxBw.nrScs = SCS_15;
336       ducfgparam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrTxBw.nrb = NRB_160;
337
338       /*Measurement Config and Cell Config */ 
339       ducfgparam.srvdCellLst[i].duCellInfo.measTimeCfg = TIME_CFG; 
340
341       ducfgparam.srvdCellLst[i].duCellInfo.cellDir = CELL_DIR; 
342         
343       ducfgparam.srvdCellLst[i].duCellInfo.cellType=CELL_TYPE;
344         
345       /* Broadcast PLMN Identity */
346       for(j=0;j<MAXBPLMNNRMINUS1;j++)
347       {
348         for(k=0;j<MAXNUMOFBPLMN;k++)
349         {
350           ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k].mcc[0] = PLMN_MCC0;
351           ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k].mcc[1] = PLMN_MCC1;
352           ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k].mcc[2] = PLMN_MCC2;
353           ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k].mnc[0] = PLMN_MNC0;
354           ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k].mnc[1] = PLMN_MNC1;                                         
355           ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k].mnc[2] = PLMN_MNC2;
356         }
357         /* Extended PLMN List */         
358         for(k=0;j<MAXNUMOFBPLMN;k++)
359         {
360           ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k].mcc[0] = PLMN_MCC0;
361           ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k].mcc[1] = PLMN_MCC1;
362           ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k].mcc[2] = PLMN_MCC2;
363           ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k].mnc[0] = PLMN_MNC0;
364           ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k].mnc[1] = PLMN_MNC1;
365           ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k].mnc[2] = PLMN_MNC2;
366         }
367         
368         ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].tac.pres = TRUE;
369         ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].tac.tac = DU_TAC;
370         ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].nrCellId = NR_CELL_ID;
371         ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].ranac = NR_RANAC;
372       }
373
374      /*gnb DU System Info */
375      //TODO: uncomment ducfgparam.srvdCellLst[i].duSysInfo.mibMsg;  //to do
376      //TODO: uncomment ducfgparam.srvdCellLst[i].duSysInfo.sib1Msg; //to do
377    }
378
379    /* RRC Version,Extended RRC Version */
380    //TODO: uncomment ducfgparam.rrcVersion.rrcVer; //to do
381    //TODO: uncomment ducfgparam.rrcVersion.extRrcVer; //to do
382
383    readClCfg();
384
385 }
386
387 /*******************************************************************
388  *
389  * @brief Reads config and posts message to du_app on completion
390  *
391  * @details
392  *
393  *    Function : main
394  *
395  *    Functionality:
396  *      - Calls readCfg()
397  *      - Post to du_app for further processing
398  *
399  * @params[in] void
400  * @return ROK     - success
401  *         RFAILED - failure
402  *
403  * ****************************************************************/
404 S16 duReadCfg()
405 {
406    Pst pst;
407    Buffer *mBuf;
408    //Read configs into duCfgParams
409    readCfg();
410
411    //Fill pst structure
412    cmMemset((U8 *)&(pst), 0, sizeof(Pst));
413    pst.srcEnt = (Ent)ENTDUAPP;
414    pst.srcInst = (Inst)DU_INST;
415    pst.srcProcId = DU_PROC;
416    pst.dstEnt = pst.srcEnt;
417    pst.dstInst = pst.srcInst;
418    pst.dstProcId = pst.srcProcId;
419    pst.event = EVTCFG;
420    pst.selector = DU_SELECTOR_TC;
421    pst.pool= DU_POOL;
422
423
424    if(SGetMsg(DFLT_REGION, DU_POOL, &mBuf) != ROK)
425    {
426       printf("\nMemory allocation failed in duReadCfg");
427       return RFAILED;
428    }
429
430    if (SPstTsk(&pst, mBuf) != ROK)
431    {
432       printf("\nSPstTsk failed in duReadCfg");
433       return RFAILED;
434    }
435
436    return ROK;
437 }
438
439 /**********************************************************************
440          End of file
441 **********************************************************************/
442