1 /******************************************************************************
3 * Copyright (c) 2020 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 *******************************************************************************/
21 #include <arpa/inet.h>
26 #include "xran_fh_o_du.h"
28 #include "xran_pkt_up.h"
29 #include "xran_cp_api.h"
30 #include "xran_up_api.h"
32 #include "xran_mlog_lnx.h"
34 extern enum app_state state;
36 int iq_playback_buffer_size_dl = IQ_PLAYBACK_BUFFER_BYTES;
37 int iq_playback_buffer_size_ul = IQ_PLAYBACK_BUFFER_BYTES;
39 int iq_bfw_buffer_size_dl = IQ_PLAYBACK_BUFFER_BYTES;
40 int iq_bfw_buffer_size_ul = IQ_PLAYBACK_BUFFER_BYTES;
42 int iq_srs_buffer_size_ul = IQ_PLAYBACK_BUFFER_BYTES;
44 uint8_t numCCPorts = 1;
45 /* Number of antennas supported by front-end */
48 /* Number of CPRI ports supported by front-end */
50 int16_t *p_tx_play_buffer[MAX_ANT_CARRIER_SUPPORTED];
51 int32_t tx_play_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
52 int32_t tx_play_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
54 int16_t *p_tx_prach_play_buffer[MAX_ANT_CARRIER_SUPPORTED];
55 int32_t tx_prach_play_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
56 int32_t tx_prach_play_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
58 int16_t *p_tx_srs_play_buffer[XRAN_MAX_SECTOR_NR*XRAN_MAX_ANT_ARRAY_ELM_NR];
59 int32_t tx_srs_play_buffer_size[XRAN_MAX_SECTOR_NR*XRAN_MAX_ANT_ARRAY_ELM_NR];
60 int32_t tx_srs_play_buffer_position[XRAN_MAX_SECTOR_NR*XRAN_MAX_ANT_ARRAY_ELM_NR];
62 int16_t *p_rx_log_buffer[MAX_ANT_CARRIER_SUPPORTED];
63 int32_t rx_log_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
64 int32_t rx_log_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
66 int16_t *p_prach_log_buffer[MAX_ANT_CARRIER_SUPPORTED];
67 int32_t prach_log_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
68 int32_t prach_log_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
70 int16_t *p_srs_log_buffer[XRAN_MAX_SECTOR_NR*XRAN_MAX_ANT_ARRAY_ELM_NR];
71 int32_t srs_log_buffer_size[XRAN_MAX_SECTOR_NR*XRAN_MAX_ANT_ARRAY_ELM_NR];
72 int32_t srs_log_buffer_position[XRAN_MAX_SECTOR_NR*XRAN_MAX_ANT_ARRAY_ELM_NR];
74 int16_t *p_tx_buffer[MAX_ANT_CARRIER_SUPPORTED];
75 int32_t tx_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
77 int16_t *p_rx_buffer[MAX_ANT_CARRIER_SUPPORTED];
78 int32_t rx_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
80 /* beamforming weights for UL (O-DU) */
81 int16_t *p_tx_dl_bfw_buffer[MAX_ANT_CARRIER_SUPPORTED];
82 int32_t tx_dl_bfw_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
83 int32_t tx_dl_bfw_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
85 /* beamforming weights for UL (O-DU) */
86 int16_t *p_tx_ul_bfw_buffer[MAX_ANT_CARRIER_SUPPORTED];
87 int32_t tx_ul_bfw_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
88 int32_t tx_ul_bfw_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
90 /* beamforming weights for UL (O-RU) */
91 int16_t *p_rx_dl_bfw_buffer[MAX_ANT_CARRIER_SUPPORTED];
92 int32_t rx_dl_bfw_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
93 int32_t rx_dl_bfw_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
95 /* beamforming weights for UL (O-RU) */
96 int16_t *p_rx_ul_bfw_buffer[MAX_ANT_CARRIER_SUPPORTED];
97 int32_t rx_ul_bfw_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
98 int32_t rx_ul_bfw_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
100 // F1 Tables 38.101-1 Table 5.3.2-1. Maximum transmission bandwidth configuration NRB
101 uint16_t nLteNumRbsPerSymF1[1][4] =
103 // 5MHz 10MHz 15MHz 20 MHz
104 {25, 50, 75, 100}, // Numerology 0 (15KHz)
107 // F1 Tables 38.101-1 Table 5.3.2-1. Maximum transmission bandwidth configuration NRB
108 uint16_t nNumRbsPerSymF1[3][13] =
110 // 5MHz 10MHz 15MHz 20 MHz 25 MHz 30 MHz 40 MHz 50MHz 60 MHz 70 MHz 80 MHz 90 MHz 100 MHz
111 {25, 52, 79, 106, 133, 160, 216, 270, 0, 0, 0, 0, 0}, // Numerology 0 (15KHz)
112 {11, 24, 38, 51, 65, 78, 106, 133, 162, 0, 217, 245, 273}, // Numerology 1 (30KHz)
113 {0, 11, 18, 24, 31, 38, 51, 65, 79, 0, 107, 121, 135} // Numerology 2 (60KHz)
116 // F2 Tables 38.101-2 Table 5.3.2-1. Maximum transmission bandwidth configuration NRB
117 uint16_t nNumRbsPerSymF2[2][4] =
119 // 50Mhz 100MHz 200MHz 400MHz
120 {66, 132, 264, 0}, // Numerology 2 (60KHz)
121 {32, 66, 132, 264} // Numerology 3 (120KHz)
124 // 38.211 - Table 4.2.1
125 uint16_t nSubCarrierSpacing[5] =
134 // TTI interval in us (slot duration)
135 uint16_t nTtiInterval[4] =
144 // F1 Tables 38.101-1 Table F.5.3. Window length for normal CP
145 uint16_t nCpSizeF1[3][13][2] =
147 // 5MHz 10MHz 15MHz 20 MHz 25 MHz 30 MHz 40 MHz 50MHz 60 MHz 70 MHz 80 MHz 90 MHz 100 MHz
148 {{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)
149 {{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)
150 { {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)
153 // F2 Tables 38.101-2 Table F.5.3. Window length for normal CP
154 int16_t nCpSizeF2[2][4][2] =
156 // 50Mhz 100MHz 200MHz 400MHz
157 { {0, 0}, {104, 72}, {208, 144}, {416, 288}}, // Numerology 2 (60KHz)
158 {{68, 36}, {136, 72}, {272, 144}, {544, 288}}, // Numerology 3 (120KHz)
161 uint32_t gMaxSlotNum;
164 uint32_t gDLResetAdvance;
165 uint32_t gDLProcAdvance;
166 uint32_t gULProcAdvance;
168 static uint16_t g_NumSlotTDDLoop[XRAN_MAX_SECTOR_NR] = { XRAN_NUM_OF_SLOT_IN_TDD_LOOP };
169 static uint16_t g_NumDLSymSp[XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SLOT_IN_TDD_LOOP] = {0};
170 static uint16_t g_NumULSymSp[XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SLOT_IN_TDD_LOOP] = {0};
171 static uint8_t g_SlotType[XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SLOT_IN_TDD_LOOP] = {{XRAN_SLOT_TYPE_INVALID}};
172 float g_UlRate[XRAN_MAX_SECTOR_NR] = {0.0};
173 float g_DlRate[XRAN_MAX_SECTOR_NR] = {0.0};
175 uint32_t app_xran_get_tti_interval(uint8_t nMu)
179 return nTtiInterval[nMu];
183 printf("ERROR: %s Mu[%d] is not valid\n",__FUNCTION__, nMu);
189 uint32_t app_xran_get_scs(uint8_t nMu)
193 return nSubCarrierSpacing[nMu];
197 printf("ERROR: %s Mu[%d] is not valid\n",__FUNCTION__, nMu);
206 //-------------------------------------------------------------------------------------------
207 /** @ingroup group_nr5g_source_phy_common
209 * @param[in] nNumerology - Numerology determine sub carrier spacing, Value: 0->4 0: 15khz, 1: 30khz, 2: 60khz 3: 120khz, 4: 240khz
210 * @param[in] nBandwidth - Carrier bandwidth for in MHz. Value: 5->400
211 * @param[in] nAbsFrePointA - Abs Freq Point A of the Carrier Center Frequency for in KHz Value: 450000->52600000
213 * @return Number of RBs in cell
216 * Returns number of RBs based on 38.101-1 and 38.101-2 for the cell
219 //-------------------------------------------------------------------------------------------
220 uint16_t app_xran_get_num_rbs(uint8_t ranTech, uint32_t nNumerology, uint32_t nBandwidth, uint32_t nAbsFrePointA)
225 if (ranTech == XRAN_RAN_LTE) {
229 numRBs = nLteNumRbsPerSymF1[nNumerology][0];
232 case PHY_BW_10_0_MHZ:
233 numRBs = nLteNumRbsPerSymF1[nNumerology][1];
236 case PHY_BW_15_0_MHZ:
237 numRBs = nLteNumRbsPerSymF1[nNumerology][2];
240 case PHY_BW_20_0_MHZ:
241 numRBs = nLteNumRbsPerSymF1[nNumerology][3];
248 } else if (nAbsFrePointA <= 6000000) {
249 // F1 Tables 38.101-1 Table 5.3.2-1. Maximum transmission bandwidth configuration NRB
255 numRBs = nNumRbsPerSymF1[nNumerology][0];
258 case PHY_BW_10_0_MHZ:
259 numRBs = nNumRbsPerSymF1[nNumerology][1];
262 case PHY_BW_15_0_MHZ:
263 numRBs = nNumRbsPerSymF1[nNumerology][2];
266 case PHY_BW_20_0_MHZ:
267 numRBs = nNumRbsPerSymF1[nNumerology][3];
270 case PHY_BW_25_0_MHZ:
271 numRBs = nNumRbsPerSymF1[nNumerology][4];
274 case PHY_BW_30_0_MHZ:
275 numRBs = nNumRbsPerSymF1[nNumerology][5];
278 case PHY_BW_40_0_MHZ:
279 numRBs = nNumRbsPerSymF1[nNumerology][6];
282 case PHY_BW_50_0_MHZ:
283 numRBs = nNumRbsPerSymF1[nNumerology][7];
286 case PHY_BW_60_0_MHZ:
287 numRBs = nNumRbsPerSymF1[nNumerology][8];
290 case PHY_BW_70_0_MHZ:
291 numRBs = nNumRbsPerSymF1[nNumerology][9];
294 case PHY_BW_80_0_MHZ:
295 numRBs = nNumRbsPerSymF1[nNumerology][10];
298 case PHY_BW_90_0_MHZ:
299 numRBs = nNumRbsPerSymF1[nNumerology][11];
302 case PHY_BW_100_0_MHZ:
303 numRBs = nNumRbsPerSymF1[nNumerology][12];
314 if ((nNumerology >= 2) && (nNumerology <= 3))
316 // F2 Tables 38.101-2 Table 5.3.2-1. Maximum transmission bandwidth configuration NRB
319 case PHY_BW_50_0_MHZ:
320 numRBs = nNumRbsPerSymF2[nNumerology-2][0];
323 case PHY_BW_100_0_MHZ:
324 numRBs = nNumRbsPerSymF2[nNumerology-2][1];
327 case PHY_BW_200_0_MHZ:
328 numRBs = nNumRbsPerSymF2[nNumerology-2][2];
331 case PHY_BW_400_0_MHZ:
332 numRBs = nNumRbsPerSymF2[nNumerology-2][3];
345 printf("ERROR: %s: RAN[%s] nNumerology[%d] nBandwidth[%d] nAbsFrePointA[%d]\n",__FUNCTION__, (ranTech ? "LTE" : "5G NR"), nNumerology, nBandwidth, nAbsFrePointA);
349 printf("%s: RAN [%s] nNumerology[%d] nBandwidth[%d] nAbsFrePointA[%d] numRBs[%d]\n",__FUNCTION__, (ranTech ? "LTE" : "5G NR"), nNumerology, nBandwidth, nAbsFrePointA, numRBs);
355 //-------------------------------------------------------------------------------------------
356 /** @ingroup phy_cal_nrarfcn
358 * @param[in] center frequency
363 * This calculates NR-ARFCN value according to center frequency
366 //-------------------------------------------------------------------------------------------
367 uint32_t app_xran_cal_nrarfcn(uint32_t nCenterFreq)
369 uint32_t nDeltaFglobal,nFoffs,nNoffs;
370 uint32_t nNRARFCN = 0;
372 if(nCenterFreq > 0 && nCenterFreq < 3000*1000)
378 else if(nCenterFreq >= 3000*1000 && nCenterFreq < 24250*1000)
384 else if(nCenterFreq >= 24250*1000 && nCenterFreq <= 100000*1000)
392 printf("@@@@ incorrect center frerquency %d\n",nCenterFreq);
396 nNRARFCN = ((nCenterFreq - nFoffs)/nDeltaFglobal) + nNoffs;
398 printf("%s: nCenterFreq[%d] nDeltaFglobal[%d] nFoffs[%d] nNoffs[%d] nNRARFCN[%d]\n", __FUNCTION__, nCenterFreq, nDeltaFglobal, nFoffs, nNoffs, nNRARFCN);
402 int32_t app_xran_slot_limit(int32_t nSfIdx)
405 nSfIdx += gMaxSlotNum;
408 while (nSfIdx >= gMaxSlotNum) {
409 nSfIdx -= gMaxSlotNum;
415 void app_xran_clear_slot_type(uint32_t nPhyInstanceId)
417 g_UlRate[nPhyInstanceId] = 0.0;
418 g_DlRate[nPhyInstanceId] = 0.0;
419 g_NumSlotTDDLoop[nPhyInstanceId] = 1;
422 int32_t app_xran_set_slot_type(uint32_t nPhyInstanceId, uint32_t nFrameDuplexType, uint32_t nTddPeriod, struct xran_slot_config *psSlotConfig)
424 uint32_t nSlotNum, nSymNum, nVal, i;
425 uint32_t numDlSym, numUlSym, numGuardSym;
426 uint32_t numDlSlots = 0, numUlSlots = 0, numSpDlSlots = 0, numSpUlSlots = 0, numSpSlots = 0;
427 char sSlotPattern[XRAN_SLOT_TYPE_LAST][10] = {"IN\0", "DL\0", "UL\0", "SP\0", "FD\0"};
429 // nPhyInstanceId Carrier ID
430 // nFrameDuplexType 0 = FDD 1 = TDD
431 // nTddPeriod Tdd Periodicity
432 // psSlotConfig[80] Slot Config Structure for nTddPeriod Slots
434 g_UlRate[nPhyInstanceId] = 0.0;
435 g_DlRate[nPhyInstanceId] = 0.0;
436 g_NumSlotTDDLoop[nPhyInstanceId] = nTddPeriod;
438 for (i = 0; i < XRAN_NUM_OF_SLOT_IN_TDD_LOOP; i++)
440 g_SlotType[nPhyInstanceId][i] = XRAN_SLOT_TYPE_INVALID;
441 g_NumDLSymSp[nPhyInstanceId][i] = 0;
442 g_NumULSymSp[nPhyInstanceId][i] = 0;
445 if (nFrameDuplexType == XRAN_FDD)
447 for (i = 0; i < XRAN_NUM_OF_SLOT_IN_TDD_LOOP; i++)
449 g_SlotType[nPhyInstanceId][i] = XRAN_SLOT_TYPE_FDD;
451 g_NumSlotTDDLoop[nPhyInstanceId] = 1;
452 g_DlRate[nPhyInstanceId] = 1.0;
453 g_UlRate[nPhyInstanceId] = 1.0;
457 for (nSlotNum = 0; nSlotNum < nTddPeriod; nSlotNum++)
462 for (nSymNum = 0; nSymNum < XRAN_NUM_OF_SYMBOL_PER_SLOT; nSymNum++)
464 switch(psSlotConfig[nSlotNum].nSymbolType[nSymNum])
466 case XRAN_SYMBOL_TYPE_DL:
469 case XRAN_SYMBOL_TYPE_GUARD:
478 // printf("nSlotNum[%d] : numDlSym[%d] numGuardSym[%d] numUlSym[%d]\n", nSlotNum, numDlSym, numGuardSym, numUlSym);
480 if ((numUlSym == 0) && (numGuardSym == 0))
482 g_SlotType[nPhyInstanceId][nSlotNum] = XRAN_SLOT_TYPE_DL;
485 else if ((numDlSym == 0) && (numGuardSym == 0))
487 g_SlotType[nPhyInstanceId][nSlotNum] = XRAN_SLOT_TYPE_UL;
492 g_SlotType[nPhyInstanceId][nSlotNum] = XRAN_SLOT_TYPE_SP;
498 g_NumDLSymSp[nPhyInstanceId][nSlotNum] = numDlSym;
503 g_NumULSymSp[nPhyInstanceId][nSlotNum] = numUlSym;
507 // printf(" numDlSlots[%d] numUlSlots[%d] numSpSlots[%d] numSpDlSlots[%d] numSpUlSlots[%d]\n", numDlSlots, numUlSlots, numSpSlots, numSpDlSlots, numSpUlSlots);
510 g_DlRate[nPhyInstanceId] = (float)(numDlSlots + numSpDlSlots) / (float)nTddPeriod;
511 g_UlRate[nPhyInstanceId] = (float)(numUlSlots + numSpUlSlots) / (float)nTddPeriod;
514 printf("set_slot_type: nPhyInstanceId[%d] nFrameDuplexType[%d], nTddPeriod[%d]\n",
515 nPhyInstanceId, nFrameDuplexType, nTddPeriod);
517 printf("DLRate[%f] ULRate[%f]\n", g_DlRate[nPhyInstanceId], g_UlRate[nPhyInstanceId]);
519 nVal = (g_NumSlotTDDLoop[nPhyInstanceId] < 10) ? g_NumSlotTDDLoop[nPhyInstanceId] : 10;
521 printf("SlotPattern:\n");
523 for (nSlotNum = 0; nSlotNum < nVal; nSlotNum++)
525 printf("%d ", nSlotNum);
530 for (nSlotNum = 0, i = 0; nSlotNum < g_NumSlotTDDLoop[nPhyInstanceId]; nSlotNum++)
532 printf("%s ", sSlotPattern[g_SlotType[nPhyInstanceId][nSlotNum]]);
534 if ((i == 10) && ((nSlotNum+1) < g_NumSlotTDDLoop[nPhyInstanceId]))
537 printf(" %3d ", nSlotNum);
546 int32_t app_xran_get_slot_type(int32_t nCellIdx, int32_t nSlotdx, int32_t nType)
548 int32_t nSfIdxMod, nSfType, ret = 0;
550 nSfIdxMod = app_xran_slot_limit(nSlotdx) % ((g_NumSlotTDDLoop[nCellIdx] > 0) ? g_NumSlotTDDLoop[nCellIdx]: 1);
551 nSfType = g_SlotType[nCellIdx][nSfIdxMod];
553 if (nSfType == nType)
557 else if (nSfType == XRAN_SLOT_TYPE_SP)
559 if ((nType == XRAN_SLOT_TYPE_DL) && g_NumDLSymSp[nCellIdx][nSfIdxMod])
564 if ((nType == XRAN_SLOT_TYPE_UL) && g_NumULSymSp[nCellIdx][nSfIdxMod])
569 else if (nSfType == XRAN_SLOT_TYPE_FDD)
579 void sys_save_buf_to_file(char *filename, char *bufname, unsigned char *pBuffer, unsigned int size, unsigned int buffers_num)
583 if (filename && bufname)
586 printf("Storing %s to file %s: ", bufname, filename);
587 file = fopen(filename, "wb");
590 printf("can't open file %s!!!", filename);
595 num = fwrite(pBuffer, buffers_num, size, file);
598 printf("from addr (0x%lx) size (%d) bytes num (%d)", (uint64_t)pBuffer, size, num);
604 printf(" the file name, buffer name are not set!!!");
609 printf(" the %s is free: size = %d bytes!!!", bufname, size);
613 int sys_load_file_to_buff(char *filename, char *bufname, unsigned char *pBuffer, unsigned int size, unsigned int buffers_num)
615 unsigned int file_size = 0;
620 if (filename && bufname)
623 printf("Loading file %s to %s: ", filename, bufname);
624 file = fopen(filename, "rb");
629 printf("can't open file %s!!!", filename);
634 fseek(file, 0, SEEK_END);
635 file_size = ftell(file);
636 fseek(file, 0, SEEK_SET);
638 if ((file_size > size) || (file_size == 0))
641 printf("Reading IQ samples from file: File Size: %d [Buffer Size: %d]\n", file_size, size);
643 num = fread(pBuffer, buffers_num, size, file);
646 printf("from addr (0x%lx) size (%d) bytes num (%d)", (uint64_t)pBuffer, file_size, num);
653 printf(" the file name, buffer name are not set!!!");
658 printf(" the %s is free: size = %d bytes!!!", bufname, size);
664 void sys_save_buf_to_file_txt(char *filename, char *bufname, unsigned char *pBuffer, unsigned int size, unsigned int buffers_num)
673 if (filename && bufname)
676 printf("Storing %s to file %s: ", bufname, filename);
677 file = fopen(filename, "w");
680 printf("can't open file %s!!!", filename);
687 signed short *ptr = (signed short*)pBuffer;
688 for (i = 0; i < (size/((unsigned int)sizeof(signed short) /** 2 * 2 * 2*/)); i = i + 2)
691 ret = fprintf(file,"%d %d\n", ptr[i], ptr[i + 1]);
693 ret = fprintf(file,"%d %d ", ptr[i], ptr[i + 1]);
694 /* I data => Ramp data, from 1 to 792.
695 Q data => Contains time information of the current symbol:
696 Bits [15:14] = Antenna-ID
697 Bits [13:12] =
\9300
\94
698 Bits [11:8] = Subframe-ID
700 Bits [3:0] = Symbol-ID */
701 fprintf(file, "0x%04x: ant %d Subframe-ID %d Slot-ID %d Symbol-ID %d\n",
702 ptr[i + 1], (ptr[i + 1]>>14) & 0x3, (ptr[i + 1]>>8) & 0xF, (ptr[i + 1]>>4) & 0xF, (ptr[i + 1]>>0) & 0xF);
706 printf("fprintf %d\n", ret);
714 printf("from addr (0x%lx) size (%d) IQ num (%d)", (uint64_t)pBuffer, size, num);
720 printf(" the file name, buffer name are not set!!!");
725 printf(" the %s is free: size = %d bytes!!!", bufname, size);