32 #include <sys/queue.h> 39 #include <rte_common.h> 41 #include <rte_errno.h> 42 #include <rte_lcore.h> 43 #include <rte_cycles.h> 44 #include <rte_memory.h> 45 #include <rte_memzone.h> 65 #define DIV_ROUND_OFFSET(X,Y) ( X/Y + ((X%Y)?1:0) ) 67 #define XranOffsetSym(offSym, otaSym, numSymTotal) (((int32_t)offSym > (int32_t)otaSym) ? \ 68 ((int32_t)otaSym + ((int32_t)numSymTotal) - (uint32_t)offSym) : \ 69 (((int32_t)otaSym - (int32_t)offSym) >= numSymTotal) ? \ 70 (((int32_t)otaSym - (int32_t)offSym) - numSymTotal) : \ 71 ((int32_t)otaSym - (int32_t)offSym)) 73 #define MAX_NUM_OF_XRAN_CTX (2) 74 #define XranIncrementCtx(ctx) ((ctx >= (MAX_NUM_OF_XRAN_CTX-1)) ? 0 : (ctx+1)) 75 #define XranDecrementCtx(ctx) ((ctx == 0) ? (MAX_NUM_OF_XRAN_CTX-1) : (ctx-1)) 77 #define MAX_NUM_OF_DPDK_TIMERS (10) 78 #define DpdkTimerIncrementCtx(ctx) ((ctx >= (MAX_NUM_OF_DPDK_TIMERS-1)) ? 0 : (ctx+1)) 79 #define DpdkTimerDecrementCtx(ctx) ((ctx == 0) ? (MAX_NUM_OF_DPDK_TIMERS-1) : (ctx-1)) 90 #define UNIX_TO_GPS_SECONDS_OFFSET 315964782UL 91 #define NUM_OF_FRAMES_PER_SECOND 100 105 static struct rte_timer tti_to_phy_timer[10];
106 static struct rte_timer sym_timer;
124 static uint64_t xran_total_tick = 0, xran_used_tick = 0;
125 static uint32_t xran_core_used = 0;
126 static int32_t first_call = 0;
130 extbuf_free_callback(
void *addr __rte_unused,
void *opaque __rte_unused)
141 struct rte_mbuf *mbuf,
158 struct rte_mbuf *mbuf,
175 struct rte_mbuf *mbuf,
192 void tti_ota_cb(
struct rte_timer *tim,
void *arg);
194 void xran_timer_arm_ex(
struct rte_timer *tim,
void* CbFct,
void *CbArg,
unsigned tim_lcore);
197 static inline uint16_t xran_getSfnSecStart(
void)
216 static inline int32_t xran_getSlotIdxSecond(
void)
218 int32_t frameIdxSecond = xran_getSfnSecStart();
220 return slotIndxSecond;
225 return &g_xran_dev_ctx[0];
233 uint16_t
xran_get_beamid(
void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ant_id, uint8_t slot_id)
247 int32_t is_prach_slot = 0;
251 if (pPrachCPConfig->
isPRACHslot[subframe_id] == 1){
257 else if (slot_id == 1)
269 if ((pPrachCPConfig->
isPRACHslot[slotidx>>1] == 1) && ((slotidx % 2) == 1)){
275 return is_prach_slot;
285 xran_section_id[dir][cell][
ant] = 0;
286 xran_section_id_curslot[dir][cell][
ant] = 255;
325 uint8_t preambleFmrt = pxRANPrachConfigTable->
preambleFmrt[0];
329 printf(
"xRAN open PRACH config: Numerology %u ConfIdx %u, preambleFmrt %u startsymb %u, numSymbol %u, occassionsInPrachSlot %u\n", nNumerology, nPrachConfIdx, preambleFmrt, pxRANPrachConfigTable->
startingSym, pxRANPrachConfigTable->
duration, pxRANPrachConfigTable->
occassionsInPrachSlot);
337 pPrachCPConfig->
x = pxRANPrachConfigTable->
x;
339 pPrachCPConfig->
y[0] = pxRANPrachConfigTable->
y[0];
340 pPrachCPConfig->
y[1] = pxRANPrachConfigTable->
y[1];
353 printf(
"PRACH: x %u y[0] %u, y[1] %u prach slot: %u ..", pPrachCPConfig->
x, pPrachCPConfig->
y[0], pPrachCPConfig->
y[1], pxRANPrachConfigTable->
slotNr[0]);
357 slotNr = pxRANPrachConfigTable->
slotNr[i];
361 printf(
" %u ..", slotNr);
379 inline uint16_t
xran_alloc_sectionid(
void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ant_id, uint8_t slot_id)
386 print_err(
"Invalid antenna ID - %d", ant_id);
392 if(xran_section_id_curslot[dir][cc_id][ant_id] != slot_id) {
393 xran_section_id[dir][cc_id][ant_id] = 0;
394 xran_section_id_curslot[dir][cc_id][ant_id] = slot_id;
397 return(xran_section_id[dir][cc_id][ant_id]++);
407 xran_cp_seq_id_num[cell][dir][ant] = 0;
410 xran_updl_seq_id_num[cell][ant] = 0;
412 xran_upul_seq_id_num[cell][ant] = 0;
418 static inline uint8_t xran_get_cp_seqid(
void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ant_id)
421 print_err(
"Invalid direction - %d", dir);
429 print_err(
"Invalid antenna ID - %d", ant_id);
433 return(xran_cp_seq_id_num[cc_id][dir][ant_id]++);
435 static inline uint8_t xran_get_updl_seqid(
void *pHandle, uint8_t cc_id, uint8_t ant_id)
442 print_err(
"Invalid antenna ID - %d", ant_id);
447 return(xran_updl_seq_id_num[cc_id][ant_id]++);
449 static inline uint8_t *xran_get_updl_seqid_addr(
void *pHandle, uint8_t cc_id, uint8_t ant_id)
456 print_err(
"Invalid antenna ID - %d", ant_id);
461 return(&xran_updl_seq_id_num[cc_id][ant_id]);
463 static inline int8_t xran_check_upul_seqid(
void *pHandle, uint8_t cc_id, uint8_t ant_id, uint8_t slot_id, uint8_t seq_id)
472 print_err(
"Invalid antenna ID - %d", ant_id);
477 xran_upul_seq_id_num[cc_id][ant_id]++;
478 if(xran_upul_seq_id_num[cc_id][ant_id] == seq_id) {
481 print_err(
"expected seqid %u received %u, slot %u, ant %u cc %u", xran_upul_seq_id_num[cc_id][ant_id], seq_id, slot_id, ant_id, cc_id);
482 xran_upul_seq_id_num[cc_id][ant_id] = seq_id;
489 static inline uint8_t xran_get_upul_seqid(
void *pHandle, uint8_t cc_id, uint8_t ant_id)
496 print_err(
"Invalid antenna ID - %d", ant_id);
500 return(xran_upul_seq_id_num[cc_id][ant_id]++);
502 static inline uint8_t *xran_get_upul_seqid_addr(
void *pHandle, uint8_t cc_id, uint8_t ant_id)
509 print_err(
"Invalid antenna ID - %d", ant_id);
513 return(&xran_upul_seq_id_num[cc_id][ant_id]);
515 static inline int8_t xran_check_cp_seqid(
void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ant_id, uint8_t seq_id)
518 print_err(
"Invalid direction - %d", dir);
526 print_err(
"Invalid antenna ID - %d", ant_id);
530 xran_cp_seq_id_num[cc_id][dir][ant_id]++;
531 if(xran_cp_seq_id_num[cc_id][dir][ant_id] == seq_id) {
535 xran_cp_seq_id_num[cc_id][dir][ant_id] = seq_id;
539 static inline int8_t xran_check_updl_seqid(
void *pHandle, uint8_t cc_id, uint8_t ant_id, uint8_t slot_id, uint8_t seq_id)
547 print_err(
"Invalid antenna ID - %d", ant_id);
552 xran_updl_seq_id_num[cc_id][ant_id]++;
553 if(xran_updl_seq_id_num[cc_id][ant_id] == seq_id) {
562 xran_updl_seq_id_num[cc_id][ant_id] = seq_id;
582 void sym_ota_cb(
struct rte_timer *tim,
void *arg,
unsigned long *used_tick)
588 static int32_t ctx = 0;
615 LIST_FOREACH(cb_elm, &p_xran_dev_ctx->sym_cb_list_head[0][
xran_lib_ota_sym], pointers){
634 uint32_t frame_id = 0;
635 uint32_t subframe_id = 0;
636 uint32_t slot_id = 0;
637 uint32_t next_tti = 0;
639 uint32_t mlogVar[10];
640 uint32_t mlogVarCnt = 0;
643 uint32_t reg_tti = 0;
644 uint32_t reg_sfn = 0;
667 mlogVar[mlogVarCnt++] = 0x11111111;
671 mlogVar[mlogVarCnt++] = frame_id;
672 mlogVar[mlogVarCnt++] = subframe_id;
673 mlogVar[mlogVarCnt++] = slot_id;
674 mlogVar[mlogVarCnt++] = 0;
683 print_dbg(
"[%d]SFN %d sf %d slot %d\n",next_tti, frame_id, subframe_id, slot_id);
691 print_dbg(
"[%d]SFN %d sf %d slot %d\n",next_tti, frame_id, subframe_id, slot_id);
705 print_dbg(
"[%d]SFN %d sf %d slot %d\n",xran_lib_ota_tti, frame_id, subframe_id, slot_id);
717 rte_timer_cb_t fct = (rte_timer_cb_t)arg;
730 rte_timer_cb_t fct = (rte_timer_cb_t)CbFct;
732 rte_timer_reset_sync(tim, 0, SINGLE, tim_lcore, fct, CbArg);
743 struct rte_mbuf *mbuf;
745 uint32_t i, j, loc_sym;
746 uint32_t nsection = 0;
753 frame_id = (frame_id & 0xff);
760 pPrbMapElem = &prbMap->
prbMap[0];
762 print_dbg(
"cp[%d:%d:%d] ru_port_id %d dir=%d nsection %d\n",
763 frame_id, subframe_id, slot_id, ru_port_id, dir, nsection);
769 for (i=0; i<nsection; i++)
771 pPrbMapElem = &prbMap->
prbMap[i];
782 print_dbg(
"cp[%d:%d:%d] ru_port_id %d dir=%d\n",
783 frame_id, subframe_id, slot_id, ru_port_id, dir);
785 seq_id = xran_get_cp_seqid(pHandle,
XRAN_DIR_DL, cc_id, ru_port_id);
791 sect_geninfo[0].
info.
id = i;
793 if(sect_geninfo[0].info.id > 7)
794 print_err(
"sectinfo->id %d\n", sect_geninfo[0].info.id);
801 if(p_sec_desc->
pCtrl) {
802 rte_pktmbuf_free(p_sec_desc->
pCtrl);
803 p_sec_desc->
pCtrl = NULL;
804 p_sec_desc->
pData = NULL;
835 pPrbMapElemPrev = &prbMap->
prbMap[i-1];
840 print_err(
"section info error: previous numSymb %d not equal to current numSymb %d\n", pPrbMapElemPrev->
numSymb, pPrbMapElem->
numSymb);
852 sect_geninfo[0].
info.
ef = 0;
865 sect_geninfo[0].
exData[0].
len =
sizeof(m_ext1);
868 sect_geninfo[0].
info.
ef = 1;
871 sect_geninfo[0].
info.
ef = 0;
875 print_err(
"Unsupported Category %d\n", category);
883 if(unlikely(mbuf == NULL)) {
890 print_err(
"Fail to build control plane packet - [%d:%d:%d] dir=%d\n",
891 frame_id, subframe_id, slot_id, dir);
894 struct ether_hdr *
const h = (
void *)rte_pktmbuf_prepend(mbuf,
sizeof(*h));
901 dir, cc_id, ru_port_id,
903 §_geninfo[0].info);
915 uint32_t slot_id, subframe_id, frame_id;
918 uint8_t ant_id,
num_eAxc, num_CCPorts;
928 if(first_call && p_xran_dev_ctx->
enableCP) {
943 print_dbg(
"[%d]SFN %d sf %d slot %d\n", tti, frame_id, subframe_id, slot_id);
944 for(ant_id = 0; ant_id <
num_eAxc; ++ant_id) {
945 for(cc_id = 0; cc_id < num_CCPorts; cc_id++ ) {
954 print_err(
"[%d]SFN %d sf %d slot %d: ant_id %d cc_id %d \n", tti, frame_id, subframe_id, slot_id, ant_id, cc_id);
972 uint32_t nSubframeIdx;
976 uint32_t nXranTime =
xran_get_slot_idx(&nFrameIdx, &nSubframeIdx, &nSlotIdx, &nSecond);
1007 uint32_t nSubframeIdx;
1011 uint32_t nXranTime =
xran_get_slot_idx(&nFrameIdx, &nSubframeIdx, &nSlotIdx, &nSecond);
1050 uint32_t slot_id, subframe_id, frame_id;
1052 int ant_id, prach_port_id;
1083 if(first_call && p_xran_dev_ctx->
enableCP) {
1085 print_dbg(
"[%d]SFN %d sf %d slot %d\n", tti, frame_id, subframe_id, slot_id);
1087 for(ant_id = 0; ant_id <
num_eAxc; ++ant_id) {
1088 for(cc_id = 0; cc_id < num_CCPorts; cc_id++) {
1102 if(((frame_id % pPrachCPConfig->
x) == pPrachCPConfig->
y[0]) && (is_prach_slot==1)) {
1103 for(ant_id = 0; ant_id <
num_eAxc; ++ant_id) {
1104 for(cc_id = 0; cc_id < num_CCPorts; cc_id++) {
1114 frame_id, subframe_id, slot_id,
1115 beam_id, cc_id, prach_port_id,
1116 xran_get_cp_seqid(pHandle,
XRAN_DIR_UL, cc_id, prach_port_id));
1118 send_cpmsg(pHandle, mbuf, ¶ms, sect_geninfo,
1119 cc_id, prach_port_id, xran_get_cp_seqid(pHandle,
XRAN_DIR_UL, cc_id, prach_port_id));
1169 int32_t do_reset = 0;
1172 int32_t result1,i,j;
1173 uint32_t delay_cp_dl;
1174 uint32_t delay_cp_ul;
1176 uint32_t delay_up_ul;
1177 uint32_t delay_cp2up;
1182 struct sched_param sched_param;
1184 uint64_t tWake = 0, tWakePrev = 0, tUsed = 0;
1192 xran_core_used = rte_lcore_id();
1193 printf(
"%s [CPU %2d] [PID: %6d]\n", __FUNCTION__, rte_lcore_id(), getpid());
1196 sched_param.sched_priority = 98;
1200 if (result1 = pthread_setaffinity_np(pthread_self(),
sizeof(cpu_set_t), &cpuset))
1202 printf(
"pthread_setaffinity_np failed: coreId = 2, result1 = %d\n",result1);
1204 if ((result1 = pthread_setschedparam(pthread_self(), 1, &sched_param)))
1206 printf(
"priority is not changed: coreId = 2, result1 = %d\n",result1);
1211 timespec_get(&ts, TIME_UTC);
1212 }
while (ts.tv_nsec >1500);
1213 struct tm * ptm = gmtime(&ts.tv_sec);
1215 strftime(buff,
sizeof buff,
"%D %T", ptm);
1216 printf(
"O-DU: thread_run start time: %s.%09ld UTC [%ld]\n", buff, ts.tv_nsec,
interval_us);
1224 delay_cp2up = delay_up-delay_cp_dl;
1232 printf(
"Start C-plane DL %d us after TTI [trigger on sym %d]\n", delay_cp_dl, sym_cp_dl);
1233 printf(
"Start C-plane UL %d us after TTI [trigger on sym %d]\n", delay_cp_ul, sym_cp_ul);
1234 printf(
"Start U-plane DL %d us before OTA [offset in sym %d]\n", delay_up, sym_up);
1235 printf(
"Start U-plane UL %d us OTA [offset in sym %d]\n", delay_up_ul, sym_up_ul);
1237 printf(
"C-plane to U-plane delay %d us after TTI\n", delay_cp2up);
1242 LIST_INSERT_HEAD(&p_xran_dev_ctx->sym_cb_list_head[0][sym_cp_dl],
1253 LIST_INSERT_HEAD(&p_xran_dev_ctx->sym_cb_list_head[0][sym_cp_ul],
1265 LIST_INSERT_HEAD(&p_xran_dev_ctx->sym_cb_list_head[0][sym_up_ul],
1277 LIST_INSERT_HEAD(&p_xran_dev_ctx->sym_cb_list_head[0][sym_up_ul +
N_SYM_PER_SLOT/2],
1289 printf(
"Start UL U-plane %d us after OTA [offset in sym %d]\n", delay_up, sym_up);
1291 timespec_get(&ts, TIME_UTC);
1292 }
while (ts.tv_nsec >1500);
1293 struct tm * ptm = gmtime(&ts.tv_sec);
1295 strftime(buff,
sizeof buff,
"%D %T", ptm);
1296 printf(
"RU: thread_run start time: %s.%09ld UTC [%ld]\n", buff, ts.tv_nsec,
interval_us);
1302 timespec_get(&ts, TIME_UTC);
1303 }
while (ts.tv_nsec == 0);
1308 xran_used_tick += tUsed;
1328 LIST_FOREACH(cb_elm, &p_xran_dev_ctx->sym_cb_list_head[i][j], pointers){
1330 LIST_REMOVE(cb_elm, pointers);
1337 printf(
"Closing timing source thread...tx counter %lu, rx counter %lu\n",
tx_counter,
rx_counter);
1349 print_err(
"Packet too short - %d bytes", rte_pktmbuf_data_len(pkt));
1355 if(ecpri_hdr == NULL){
1373 print_err(
"O-DU recevied C-Plane message!");
1385 struct rte_mbuf *mbuf,
1386 void *iq_data_start,
1391 uint8_t subframe_id,
1395 uint16_t start_prbu,
1403 uint8_t symb_id_offset;
1406 void *pHandle = NULL;
1407 struct rte_mbuf *mb;
1409 uint16_t iq_sample_size_bits = 16;
1416 status = tti << 16 | symb_id;
1421 if(pos && iq_data_start && size){
1424 uint16_t *psrc = (uint16_t *)iq_data_start;
1425 uint16_t *pdst = (uint16_t *)pos;
1427 for (idx = 0; idx < size/
sizeof(int16_t); idx++){
1428 pdst[idx] = (psrc[idx]>>8) | (psrc[idx]<<8);
1434 rte_pktmbuf_free(mb);
1443 print_err(
"pos %p iq_data_start %p size %d\n",pos, iq_data_start, size);
1446 print_err(
"TTI %d(f_%d sf_%d slot_%d) CC %d Ant_ID %d symb_id %d\n",tti, frame_id, subframe_id, slot_id, CC_ID, Ant_ID, symb_id);
1462 struct rte_mbuf *mbuf,
1463 void *iq_data_start,
1468 uint8_t subframe_id,
1472 uint16_t start_prbu,
1482 void *pHandle = NULL;
1483 struct rte_mbuf *mb = NULL;
1485 uint16_t iq_sample_size_bits = 16;
1492 status = tti << 16 | symb_id;
1496 pos += start_prbu *
N_SC_PER_PRB*(iq_sample_size_bits/8)*2;
1497 if(pos && iq_data_start && size){
1500 uint16_t *psrc = (uint16_t *)iq_data_start;
1501 uint16_t *pdst = (uint16_t *)pos;
1502 rte_panic(
"XRAN_CPU_LE_BYTE_ORDER is not supported 0x16%lx\n", (
long)mb);
1504 for (idx = 0; idx < size/
sizeof(int16_t); idx++){
1505 pdst[idx] = (psrc[idx]>>8) | (psrc[idx]<<8);
1513 rte_pktmbuf_free(mb);
1522 rte_memcpy(pos, iq_data_start, size);
1527 print_err(
"pos %p iq_data_start %p size %d\n",pos, iq_data_start, size);
1530 print_err(
"TTI %d(f_%d sf_%d slot_%d) CC %d Ant_ID %d symb_id %d\n",tti, frame_id, subframe_id, slot_id, CC_ID, Ant_ID, symb_id);
1537 struct rte_mbuf *mbuf,
1538 void *iq_data_start,
1543 uint8_t subframe_id,
1548 uint16_t start_prbu,
1579 struct rte_mbuf *mbuf,
1580 void *iq_data_start,
1585 uint8_t subframe_id,
1589 uint16_t start_prbu,
1599 void *pHandle = NULL;
1600 struct rte_mbuf *mb = NULL;
1604 uint16_t iq_sample_size_bits = 16;
1608 status = tti << 16 | symb_id;
1614 prbMapElm = &pRbMap->
prbMap[sect_id];
1615 if(sect_id >= pRbMap->
nPrbElm) {
1626 pos += start_prbu *
N_SC_PER_PRB*(iq_sample_size_bits/8)*2;
1627 if(pos && iq_data_start && size){
1630 uint16_t *psrc = (uint16_t *)iq_data_start;
1631 uint16_t *pdst = (uint16_t *)pos;
1632 rte_panic(
"XRAN_CPU_LE_BYTE_ORDER is not supported 0x16%lx\n", (
long)mb);
1634 for (idx = 0; idx < size/
sizeof(int16_t); idx++){
1635 pdst[idx] = (psrc[idx]>>8) | (psrc[idx]<<8);
1645 rte_pktmbuf_free(mb);
1653 prbMapElm = &pRbMap->
prbMap[sect_id];
1656 mb = p_sec_desc->
pCtrl;
1658 rte_pktmbuf_free(mb);
1660 p_sec_desc->
pData = iq_data_start;
1661 p_sec_desc->
pCtrl = mbuf;
1673 rte_memcpy(pos, iq_data_start, size);
1678 print_err(
"pos %p iq_data_start %p size %d\n",pos, iq_data_start, size);
1681 print_err(
"TTI %d(f_%d sf_%d slot_%d) CC %d Ant_ID %d symb_id %d\n",tti, frame_id, subframe_id, slot_id, CC_ID, Ant_ID, symb_id);
1689 xran_send_burst(
struct xran_device_ctx *dev, uint16_t n, uint16_t port)
1691 struct rte_mbuf **m_table;
1699 for(i = 0; i < n; i++){
1700 rte_mbuf_sanity_check(m_table[i], 0);
1708 if (unlikely(ret < n)) {
1715 int32_t
xran_process_tx_sym_cp_off(uint8_t ctx_id, uint32_t tti, int32_t cc_id, int32_t ant_id, uint32_t frame_id, uint32_t subframe_id, uint32_t slot_id, uint32_t sym_id,
1721 void *pHandle = NULL;
1723 char *p_sec_iq = NULL;
1724 char *p_sect_iq = NULL;
1727 uint16_t iq_sample_size_bits = 16;
1730 uint8_t num_ant_elm = 0;
1738 struct rte_mbuf *eth_oran_hdr = NULL;
1739 char *ext_buff = NULL;
1740 uint16_t ext_buff_len = 0;
1741 struct rte_mbuf *tmp = NULL;
1742 rte_iova_t ext_buff_iova = 0;
1744 struct rte_mbuf_ext_shared_info * p_share_data = &share_data[tti %
XRAN_N_FE_BUF_LEN];
1761 if(iq_sample_size_bits != 16)
1762 print_err(
"Incorrect iqWidth %d\n", iq_sample_size_bits );
1771 for (elmIdx = 0; elmIdx < prb_map->
nPrbElm; elmIdx++){
1772 uint16_t sec_id = elmIdx;
1776 if(prb_map_elm == NULL){
1777 rte_panic(
"p_sec_desc == NULL\n");
1780 p_sec_desc = prb_map_elm->
p_sec_desc[sym_id];
1782 if(p_sec_desc == NULL){
1783 rte_panic(
"p_sec_desc == NULL\n");
1791 ext_buff = p_sec_iq - (RTE_PKTMBUF_HEADROOM +
1793 sizeof (struct radio_app_common_hdr) +
1794 sizeof(struct data_section_hdr));
1796 ext_buff_len += RTE_PKTMBUF_HEADROOM +
1798 sizeof (struct radio_app_common_hdr) +
1799 sizeof(struct data_section_hdr) + 18;
1808 if (unlikely (( eth_oran_hdr) == NULL)) {
1809 rte_panic(
"Failed rte_pktmbuf_alloc\n");
1812 p_share_data->free_cb = extbuf_free_callback;
1813 p_share_data->fcb_opaque = NULL;
1814 rte_mbuf_ext_refcnt_set(p_share_data, 1);
1816 ext_buff_iova = rte_mempool_virt2iova(mb);
1817 if (unlikely (( ext_buff_iova) == 0)) {
1818 rte_panic(
"Failed rte_mem_virt2iova \n");
1821 if (unlikely (( (rte_iova_t)ext_buff_iova) == RTE_BAD_IOVA)) {
1822 rte_panic(
"Failed rte_mem_virt2iova RTE_BAD_IOVA \n");
1825 rte_pktmbuf_attach_extbuf(eth_oran_hdr,
1827 ext_buff_iova + RTE_PTR_DIFF(ext_buff , mb),
1831 rte_pktmbuf_reset_headroom(eth_oran_hdr);
1833 tmp = (
struct rte_mbuf *)rte_pktmbuf_prepend(eth_oran_hdr,
sizeof(
struct ether_hdr));
1834 if (unlikely (( tmp) == NULL)) {
1835 rte_panic(
"Failed rte_pktmbuf_prepend \n");
1842 (
struct rb_map *)p_sec_iq,
1846 frame_id, subframe_id, slot_id, sym_id,
1850 xran_get_updl_seqid(pHandle, cc_id, ant_id) :
1851 xran_get_upul_seqid(pHandle, cc_id, ant_id),
1854 rte_mbuf_sanity_check((
struct rte_mbuf *)mb, 0);
1860 prb_num = prb_map_elm->
nRBSize;
1862 if( prb_num > 136 || prb_num == 0) {
1864 rte_panic(
"first 136 PRBs\n");
1868 (
struct rb_map *)p_sect_iq,
1870 frame_id, subframe_id, slot_id, sym_id,
1874 xran_get_updl_seqid(pHandle, cc_id, ant_id) :
1875 xran_get_upul_seqid(pHandle, cc_id, ant_id));
1881 (
struct rb_map *)p_sect_iq,
1883 frame_id, subframe_id, slot_id, sym_id,
1887 xran_get_updl_seqid(pHandle, cc_id, ant_id) :
1888 xran_get_upul_seqid(pHandle, cc_id, ant_id));
1894 (
struct rb_map *)p_sect_iq,
1896 frame_id, subframe_id, slot_id, sym_id,
1900 xran_get_updl_seqid(pHandle, cc_id, ant_id) :
1901 xran_get_upul_seqid(pHandle, cc_id, ant_id));
1909 printf(
"(%d %d %d %d) prb_map == NULL\n", tti %
XRAN_N_FE_BUF_LEN, cc_id, ant_id, sym_id);
1915 if(((frame_id % pPrachCPConfig->
x) == pPrachCPConfig->
y[0])
1916 && (is_prach_slot == 1)
1918 && (sym_id <= p_xran_dev_ctx->prach_last_symbol[cc_id])) {
1919 int prach_port_id = ant_id + pPrachCPConfig->
eAxC_offset;
1926 (
struct rte_mbuf *)mb,
1929 frame_id, subframe_id, slot_id, sym_id,
1931 cc_id, prach_port_id,
1932 xran_get_upul_seqid(pHandle, cc_id, prach_port_id));
1939 if( p_srs_cfg->
symbMask & (1 << sym_id)
1941 int32_t ant_elm_id = 0;
1943 for (ant_elm_id = 0; ant_elm_id < num_ant_elm; ant_elm_id++){
1944 int32_t ant_elm_eAxC_id = ant_elm_id + p_srs_cfg->
eAxC_offset;
1949 if( prb_num > 136 || prb_num == 0) {
1957 frame_id, subframe_id, slot_id, sym_id,
1959 cc_id, ant_elm_eAxC_id,
1961 xran_get_updl_seqid(pHandle, cc_id, ant_elm_eAxC_id) :
1962 xran_get_upul_seqid(pHandle, cc_id, ant_elm_eAxC_id));
1970 frame_id, subframe_id, slot_id, sym_id,
1972 cc_id, ant_elm_eAxC_id,
1974 xran_get_updl_seqid(pHandle, cc_id, ant_elm_eAxC_id) :
1975 xran_get_upul_seqid(pHandle, cc_id, ant_elm_eAxC_id));
1979 (
struct rte_mbuf *)mb,
1982 frame_id, subframe_id, slot_id, sym_id,
1984 cc_id, ant_elm_eAxC_id,
1986 xran_get_updl_seqid(pHandle, cc_id, ant_elm_eAxC_id) :
1987 xran_get_upul_seqid(pHandle, cc_id, ant_elm_eAxC_id));
2001 uint32_t slot_id, uint32_t sym_id)
2006 struct rte_mbuf *eth_oran_hdr = NULL;
2007 char *ext_buff = NULL;
2008 uint16_t ext_buff_len = 0;
2009 struct rte_mbuf *tmp = NULL;
2010 rte_iova_t ext_buff_iova = 0;
2011 void *pHandle = NULL;
2013 char *p_sec_iq = NULL;
2016 uint16_t iq_sample_size_bits = 16;
2018 int32_t num_sections = 0;
2027 struct rte_mbuf_ext_shared_info * p_share_data = &share_data[tti %
XRAN_N_FE_BUF_LEN];
2040 while(next < num_sections) {
2043 if(sectinfo == NULL)
2047 print_err(
"Invalid section type in section DB - %d", sectinfo->
type);
2056 iq_sample_size_bits = sectinfo->
iqWidth;
2058 print_dbg(
">>> sym %2d [%d] type%d, id %d, startPrbc=%d, numPrbc=%d, numSymbol=%d\n", sym_id, next,
2079 ext_buff = p_sec_iq - (RTE_PKTMBUF_HEADROOM +
2081 sizeof (struct radio_app_common_hdr) +
2082 sizeof(struct data_section_hdr));
2084 ext_buff_len += RTE_PKTMBUF_HEADROOM +
2086 sizeof (struct radio_app_common_hdr) +
2087 sizeof(struct data_section_hdr) + 18;
2096 if (unlikely (( eth_oran_hdr) == NULL)) {
2097 rte_panic(
"Failed rte_pktmbuf_alloc\n");
2100 p_share_data->free_cb = extbuf_free_callback;
2101 p_share_data->fcb_opaque = NULL;
2102 rte_mbuf_ext_refcnt_set(p_share_data, 1);
2104 ext_buff_iova = rte_mempool_virt2iova(mb);
2105 if (unlikely (( ext_buff_iova) == 0)) {
2106 rte_panic(
"Failed rte_mem_virt2iova \n");
2109 if (unlikely (( (rte_iova_t)ext_buff_iova) == RTE_BAD_IOVA)) {
2110 rte_panic(
"Failed rte_mem_virt2iova RTE_BAD_IOVA \n");
2113 rte_pktmbuf_attach_extbuf(eth_oran_hdr,
2115 ext_buff_iova + RTE_PTR_DIFF(ext_buff , mb),
2119 rte_pktmbuf_reset_headroom(eth_oran_hdr);
2121 tmp = (
struct rte_mbuf *)rte_pktmbuf_prepend(eth_oran_hdr,
sizeof(
struct ether_hdr));
2122 if (unlikely (( tmp) == NULL)) {
2123 rte_panic(
"Failed rte_pktmbuf_prepend \n");
2127 rte_pktmbuf_refcnt_update(mb, 1);
2132 (
struct rb_map *)p_sec_iq,
2136 frame_id, subframe_id, slot_id, sym_id,
2139 xran_get_updl_seqid(pHandle, cc_id, ant_id),
2144 sectinfo->
numPrbc * (3*iq_sample_size_bits + 1))) {
2150 uint8_t * seq_num = xran_get_updl_seqid_addr(pHandle, cc_id, ant_id);
2154 rte_panic(
"pointer to seq number is NULL [CC %d Ant %d]\n", cc_id, ant_id);
2166 rte_pktmbuf_free(mb);
2169 if (unlikely (len2 < 0)){
2176 for (i = len; i < len + len2; i ++) {
2179 struct ether_hdr *eth_hdr = (
struct ether_hdr *)
2180 rte_pktmbuf_prepend(m, (uint16_t)
sizeof(
struct ether_hdr));
2181 if (eth_hdr == NULL) {
2182 rte_panic(
"No headroom in mbuf.\n");
2190 rte_panic(
"XRAN_MAX_PKT_BURST_PER_SYM\n");
2194 xran_send_burst(p_xran_dev_ctx, (uint16_t)len, 0);
2207 uint32_t mlogVar[10];
2208 uint32_t mlogVarCnt = 0;
2212 void *pHandle = NULL;
2216 uint8_t num_CCPorts = 0;
2217 uint8_t num_ant_elm = 0;
2218 uint32_t frame_id = 0;
2219 uint32_t subframe_id = 0;
2220 uint32_t slot_id = 0;
2221 uint32_t sym_id = 0;
2222 uint32_t sym_idx = 0;
2240 frame_id = (frame_id & 0xff);
2245 print_dbg(
"[%d]SFN %d sf %d slot %d\n", tti, frame_id, subframe_id, slot_id);
2248 mlogVar[mlogVarCnt++] = 0xAAAAAAAA;
2250 mlogVar[mlogVarCnt++] = sym_idx;
2251 mlogVar[mlogVarCnt++] = abs(p_xran_dev_ctx->
sym_up);
2252 mlogVar[mlogVarCnt++] = tti;
2253 mlogVar[mlogVarCnt++] = frame_id;
2254 mlogVar[mlogVarCnt++] = subframe_id;
2255 mlogVar[mlogVarCnt++] = slot_id;
2256 mlogVar[mlogVarCnt++] = sym_id;
2268 for(ant_id = 0; ant_id <
num_eAxc; ant_id++) {
2269 for(cc_id = 0; cc_id < num_CCPorts; cc_id++) {
2273 retval =
xran_process_tx_sym_cp_off(ctx_id, tti, cc_id, ant_id, frame_id, subframe_id, slot_id, sym_id, (ant_id == (num_eAxc - 1)));
2286 uint64_t prev_tsc = 0;
2287 uint64_t cur_tsc = rte_rdtsc();
2288 uint64_t diff_tsc = cur_tsc - prev_tsc;
2290 struct sched_param sched_param;
2292 printf(
"%s [CPU %2d] [PID: %6d]\n", __FUNCTION__, rte_lcore_id(), getpid());
2296 if ((res = pthread_setschedparam(pthread_self(), 1, &sched_param)))
2298 printf(
"priority is not changed: coreId = %d, result1 = %d\n",rte_lcore_id(), res);
2303 cur_tsc = rte_rdtsc();
2304 diff_tsc = cur_tsc - prev_tsc;
2314 printf(
"Closing pkts timer thread...\n");
2320 struct xran_fh_init *p_xran_fh_init,
char *appName,
void ** pXranLayerHandle)
2328 int32_t lcore_id = 0;
2330 int64_t offset_sec, offset_nsec;
2335 p_xran_dev_ctx->fh_init = *p_xran_fh_init;
2337 printf(
" %s: MTU %d\n", __FUNCTION__, p_xran_dev_ctx->fh_init.mtu);
2343 p_xran_dev_ctx->enableCP = p_xran_fh_init->
enableCP;
2344 p_xran_dev_ctx->enablePrach = p_xran_fh_init->
prachEnable;
2345 p_xran_dev_ctx->enableSrs = p_xran_fh_init->
srsEnable;
2349 p_xran_dev_ctx->send_upmbuf2ring = NULL;
2350 p_xran_dev_ctx->send_cpmbuf2ring = NULL;
2353 if (p_io_cfg->
id == 0)
2370 for(i = 0; i < 10; i++ )
2371 rte_timer_init(&tti_to_phy_timer[i]);
2373 rte_timer_init(&sym_timer);
2375 rte_timer_init(&dpdk_timer[i]);
2382 LIST_INIT (&p_xran_dev_ctx->sym_cb_list_head[i][j]);
2386 printf(
"Set debug stop %d, debug stop count %d\n", p_xran_fh_init->
debugStop, p_xran_fh_init->
debugStopCount);
2393 *pXranLayerHandle = p_xran_dev_ctx;
2396 offset_sec = p_xran_fh_init->
GPS_Beta / 100;
2397 offset_nsec = (p_xran_fh_init->
GPS_Beta - offset_sec * 100) * 1e7 + p_xran_fh_init->
GPS_Alpha;
2398 p_xran_dev_ctx->offset_sec = offset_sec;
2399 p_xran_dev_ctx->offset_nsec = offset_nsec;
2401 p_xran_dev_ctx->offset_sec = 0;
2402 p_xran_dev_ctx->offset_nsec = 0;
2419 if (!nNumInstances) {
2420 print_dbg(
"Instance is not assigned for this function !!! \n");
2424 for (i = 0; i < nNumInstances; i++) {
2429 if(pCcHandle == NULL)
2437 printf(
"%s [%d]: CC %d handle %p\n", __FUNCTION__, pDev->
xran_port_id, i, pCcHandle);
2438 pLibInstanceHandles[pDev->
xran_port_id][i] = pSectorInstanceHandles[i] = pCcHandle;
2440 printf(
"Handle: %p Instance: %p\n",
2441 &pSectorInstanceHandles[i], pSectorInstanceHandles[i]);
2448 uint32_t nMemorySegmentSize)
2454 int32_t
xran_bm_init (
void * pHandle, uint32_t * pPoolIndex, uint32_t nNumberOfBuffers, uint32_t nBufferSize)
2457 uint32_t nAllocBufferSize;
2459 char pool_name[RTE_MEMPOOL_NAMESIZE];
2461 snprintf(pool_name, RTE_MEMPOOL_NAMESIZE,
"ru_%d_cc_%d_idx_%d",
2464 nAllocBufferSize = nBufferSize +
sizeof(
struct ether_hdr) +
2465 sizeof (struct xran_ecpri_hdr) +
2466 sizeof (struct radio_app_common_hdr) +
2467 sizeof(struct data_section_hdr) + 256;
2469 if(nAllocBufferSize >= UINT16_MAX) {
2470 rte_panic(
"nAllocBufferSize is failed [ handle %p %d %d ] [nPoolIndex %d] nNumberOfBuffers %d nBufferSize %d nAllocBufferSize %d\n",
2475 printf(
"%s: [ handle %p %d %d ] [nPoolIndex %d] nNumberOfBuffers %d nBufferSize %d\n", pool_name,
2479 MBUF_CACHE, 0, nAllocBufferSize, rte_socket_id());
2482 rte_panic(
"rte_pktmbuf_pool_create failed [ handle %p %d %d ] [nPoolIndex %d] nNumberOfBuffers %d nBufferSize %d errno %s\n",
2490 printf(
"CC:[ handle %p ru %d cc_idx %d ] [nPoolIndex %d] mb pool %p \n",
2505 struct rte_mbuf * mb = rte_pktmbuf_alloc(pXranCc->
p_bufferPool[nPoolIndex]);
2508 char * start = rte_pktmbuf_append(mb, pXranCc->
bufferPoolElmSz[nPoolIndex]);
2509 char * ethhdr = rte_pktmbuf_prepend(mb,
sizeof(
struct ether_hdr));
2511 if(start && ethhdr){
2512 char * iq_offset = rte_pktmbuf_mtod(mb,
char * );
2514 iq_offset = iq_offset +
sizeof(
struct ether_hdr) +
2515 sizeof (struct xran_ecpri_hdr) +
2516 sizeof (struct radio_app_common_hdr) +
2517 sizeof(struct data_section_hdr);
2522 *ppData = (
void *)iq_offset;
2523 *ppCtrl = (
void *)mb;
2525 print_err(
"[nPoolIndex %d] start ethhdr failed \n", nPoolIndex );
2529 print_err(
"[nPoolIndex %d] mb alloc failed \n", nPoolIndex );
2533 if (*ppData == NULL){
2534 print_err(
"[nPoolIndex %d] rte_pktmbuf_append for %d failed \n", nPoolIndex, pXranCc->
bufferPoolElmSz[nPoolIndex]);
2546 rte_pktmbuf_free(pCtrl);
2568 printf(
"Handle is NULL!\n");
2572 if (pCallback == NULL)
2574 printf (
"no callback\n");
2648 printf(
"Handle is NULL!\n");
2651 if (pCallback == NULL)
2653 printf (
"no callback\n");
2691 printf(
"Handle is NULL!\n");
2694 if (pCallback == NULL)
2696 printf (
"no callback\n");
2723 *total_time = xran_total_tick;
2724 *used_time = xran_used_tick;
2725 *core_used = xran_core_used;
2729 xran_total_tick = 0;
2738 return rte_malloc(
"External buffer", buf_len, RTE_CACHE_LINE_SIZE);
2743 dst+= (RTE_PKTMBUF_HEADROOM +
2745 sizeof (struct radio_app_common_hdr) +
2746 sizeof(struct data_section_hdr));
2751 dst = RTE_PTR_ALIGN_CEIL(dst, 64);
2759 uint8_t nNumerology = 0;
2760 int32_t lcore_id = 0;
2763 pFhCfg = &(p_xran_dev_ctx->
fh_cfg);
2802 printf(
"%s: interval_us=%ld\n", __FUNCTION__,
interval_us);
2806 for(i = 0 ; i <pConf->
nCC; i++){
2826 if((uint16_t)xran_ethdi_get_ctx()->io_cfg.port[
XRAN_UP_VF] != 0xFFFF &&
2827 (uint16_t)xran_ethdi_get_ctx()->io_cfg.port[
XRAN_CP_VF] != 0xFFFF ){
2833 rte_panic(
"thread_run() failed to start\n");
2835 printf(
"Eth port was not open. Processing thread was not started\n");
2870 #ifdef RTE_LIBRTE_PDUMP 2891 print_err(
"Cannot register callback while running!!\n");
2896 print_err(
"Functionality is not yet implemented !");
2905 print_err(
"Cannot register callback while running!!\n");
2909 p_xran_dev_ctx->
ttiCb[id] = Cb;
2911 p_xran_dev_ctx->
SkipTti[id] = skipTtiNum;
2923 print_err(
"Cannot register callback while running!!\n");
2936 int32_t
xran_get_slot_idx (uint32_t *nFrameIdx, uint32_t *nSubframeIdx, uint32_t *nSlotIdx, uint64_t *nSecond)
2977 return (xran_lib_get_ctx_fhcfg()->prach_conf.nPrachSubcSpacing);
2987 return (xran_lib_get_ctx_fhcfg()->ru_conf.fftSize);
2997 return (xran_lib_get_ctx_fhcfg()->frame_conf.nNumerology);
3009 pFhCfg = xran_lib_get_ctx_fhcfg();
3031 return (xran_lib_get_ctx_fhcfg()->
nCC);
3041 return (xran_lib_get_ctx_fhcfg()->
neAxc);
3061 return (xran_lib_get_ctx_fhcfg()->
neAxcUl);
3071 return (xran_lib_get_ctx_fhcfg()->
nAntElmTRx);
3078 if(pStats && pDev) {
int xran_cp_add_section_info(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ruport_id, uint8_t ctx_id, struct xran_section_info *info)
Add a section information of C-Plane to dabase.
int generate_cpmsg_prach(void *pHandle, struct xran_cp_gen_params *params, struct xran_section_gen_info *sect_geninfo, struct rte_mbuf *mbuf, struct xran_device_ctx *pxran_lib_ctx, uint8_t frame_id, uint8_t subframe_id, uint8_t slot_id, uint16_t beam_id, uint8_t cc_id, uint8_t prach_port_id, uint8_t seq_id)
const xRANPrachConfigTableStruct gxranPrachDataTable_sub6_fdd[XRAN_PRACH_CONFIG_TABLE_SIZE]
uint32_t xran_fs_get_max_slot(void)
#define XranOffsetSym(offSym, otaSym, numSymTotal)
struct rte_mempool * socket_indirect_pool
#define PID_PROCESS_CP_PKT
int timing_set_numerology(uint8_t value)
int32_t xran_init(int argc, char *argv[], struct xran_fh_init *p_xran_fh_init, char *appName, void **pXranLayerHandle)
phy_encoder_poll_fn bbdev_enc
void * TtiCbParam[XRAN_CB_MAX]
int xran_init_seqid(void *pHandle)
const xRANPrachConfigTableStruct gxranPrachDataTable_sub6_tdd[XRAN_PRACH_CONFIG_TABLE_SIZE]
int xran_timing_source_thread(void *args)
#define XRAN_MAX_ANT_ARRAY_ELM_NR
struct rte_mbuf * xran_ethdi_mbuf_alloc(void)
#define XRAN_SYMBOL_TYPE_UL
int xran_init_prach(struct xran_fh_config *pConf, struct xran_device_ctx *p_xran_dev_ctx)
#define XRAN_N_FE_BUF_LEN
int prach_last_symbol[XRAN_MAX_SECTOR_NR]
#define PID_UP_UL_HALF_DEAD_LINE_CB
struct xran_srs_config srs_cfg
void * pPrachCallbackTag[XRAN_MAX_SECTOR_NR]
#define XRAN_STATUS_SUCCESS
struct xran_common_counters fh_counters
#define print_dbg(fmt, args...)
struct xran_device_ctx * xran_dev_get_ctx(void)
uint16_t xran_alloc_sectionid(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ant_id, uint8_t slot_id)
uint32_t xran_fs_slot_limit_init(int32_t tti_interval_us)
end write files for IQ samples for ant
void rx_ul_deadline_half_cb(struct rte_timer *tim, void *arg)
enum xran_if_state xran_if_current_state
uint8_t y[XRAN_PRACH_CANDIDATE_Y]
int32_t xran_process_tx_sym_cp_off(uint8_t ctx_id, uint32_t tti, int32_t cc_id, int32_t ant_id, uint32_t frame_id, uint32_t subframe_id, uint32_t slot_id, uint32_t sym_id, int32_t do_srs)
int32_t xran_process_tx_sym(void *arg)
enum xran_category xran_get_ru_category(void *pHandle)
Get configuration of O-RU (Cat A or Cat B)
uint8_t xran_get_num_cc(void *pHandle)
Get the configuration of the number of component carriers.
uint32_t xran_lib_ota_tti
#define MLogRegisterFrameSubframe(x, y)
struct cb_elem_entry * xran_create_cb(XranSymCallbackFn cb_fn, void *cb_data)
int32_t xran_open(void *pHandle, struct xran_fh_config *pConf)
void xran_timer_arm(struct rte_timer *tim, void *arg)
#define XRAN_SLOT_TYPE_DL
struct mbuf_table tx_mbufs[RTE_MAX_ETHPORTS]
void * xran_malloc(size_t buf_len)
int xran_ethdi_mbuf_send(struct rte_mbuf *mb, uint16_t ethertype)
enum xran_input_byte_order byteOrder
void * pSrsCallbackTag[XRAN_MAX_SECTOR_NR]
int xran_ethdi_mbuf_send_cp(struct rte_mbuf *mb, uint16_t ethertype)
xran_ethdi_mbuf_send_fn send_upmbuf2ring
void rx_ul_deadline_full_cb(struct rte_timer *tim, void *arg)
xran_transport_callback_fn pCallback[XRAN_MAX_SECTOR_NR]
void xran_updateSfnSecStart(void)
BbuIoBufCtrlStruct sFrontHaulTxPrbMapBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR]
struct rte_mempool * socket_direct_pool
uint8_t xran_get_conf_numerology(void *pHandle)
Get the configuration of nummerology.
#define PID_UP_UL_FULL_DEAD_LINE_CB
#define XRAN_MAX_SECTOR_NR
#define DpdkTimerIncrementCtx(ctx)
const xRANPrachConfigTableStruct gxranPrachDataTable_mmw[XRAN_PRACH_CONFIG_TABLE_SIZE]
uint16_t xran_get_beamid(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ant_id, uint8_t slot_id)
xran_transport_callback_fn pPrachCallback[XRAN_MAX_SECTOR_NR]
#define MLogAddVariables(x, y, z)
struct xran_section_info info
xran_ethdi_mbuf_send_fn send_cpmbuf2ring
struct rte_mempool * indirect_pool
struct xran_srs_config srs_conf
int send_cpmsg(void *pHandle, struct rte_mbuf *mbuf, struct xran_cp_gen_params *params, struct xran_section_gen_info *sect_geninfo, uint8_t cc_id, uint8_t ru_port_id, uint8_t seq_id)
struct xran_eaxcid_config eAxCId_conf
uint8_t xran_get_num_ant_elm(void *pHandle)
Get the configuration of the number of antenna elements.
struct xran_flat_buffer sFHSrsRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANT_ARRAY_ELM_NR][XRAN_MAX_NUM_OF_SRS_SYMBOL_PER_SLOT]
#define XRAN_MAX_SECTIONDB_CTX
phy_decoder_poll_fn bbdev_dec
#define XRAN_MAX_ANTENNA_NR
#define TX_TIMER_INTERVAL
uint8_t xran_get_conf_prach_scs(void *pHandle)
Get the configuration of subcarrier spacing for PRACH.
int prach_start_symbol[XRAN_MAX_SECTOR_NR]
struct xran_cp_bf_weight bf_weight
int32_t xran_bm_allocate_buffer(void *pHandle, uint32_t nPoolIndex, void **ppData, void **ppCtrl)
struct xran_flat_buffer sFrontHaulTxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]
int32_t xran_get_slot_idx(uint32_t *nFrameIdx, uint32_t *nSubframeIdx, uint32_t *nSlotIdx, uint64_t *nSecond)
unsigned long get_ticks_diff(unsigned long curr_tick, unsigned long last_tick)
struct rte_mempool * p_bufferPool[XRAN_MAX_POOLS_PER_SECTOR_NR]
struct xran_fh_config fh_cfg
int32_t xran_process_tx_sym_cp_on(uint8_t ctx_id, uint32_t tti, int32_t cc_id, int32_t ant_id, uint32_t frame_id, uint32_t subframe_id, uint32_t slot_id, uint32_t sym_id)
uint8_t occassionsInPrachSlot
uint32_t xran_fs_get_tti_interval(uint8_t nMu)
int32_t prepare_symbol_ex(enum xran_pkt_dir direction, uint16_t section_id, struct rte_mbuf *mb, struct rb_map *data, uint8_t compMeth, uint8_t iqWidth, const enum xran_input_byte_order iq_buf_byte_order, uint8_t frame_id, uint8_t subframe_id, uint8_t slot_id, uint8_t symbol_no, int prb_start, int prb_num, uint8_t CC_ID, uint8_t RU_Port_ID, uint8_t seq_id, uint32_t do_copy)
int32_t xran_close(void *pHandle)
int32_t xran_sector_get_instances(void *pDevHandle, uint16_t nNumInstances, xran_cc_handle_t *pSectorInstanceHandles)
enum xran_input_i_q_order iqOrder
uint8_t occassionsInPrachSlot
uint8_t xran_get_num_eAxc(void *pHandle)
Get the configuration of the number of antenna for UL.
int32_t xran_get_freqoffset(int freqOffset, int scs)
int32_t xran_mm_destroy(void *pHandle)
struct xran_io_cfg io_cfg
xran_fh_tti_callback_fn ttiCb[XRAN_CB_MAX]
struct xran_flat_buffer sFHPrachRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]
uint8_t y[XRAN_PRACH_CANDIDATE_Y]
#define XranGetTtiNum(symIdx, numSymPerTti)
int32_t xran_5g_fronthault_config(void *pHandle, struct xran_buffer_list *pSrcBuffer[XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN], struct xran_buffer_list *pSrcCpBuffer[XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN], struct xran_buffer_list *pDstBuffer[XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN], struct xran_buffer_list *pDstCpBuffer[XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN], xran_transport_callback_fn pCallback, void *pCallbackTag)
int32_t xran_process_rx_sym(void *arg, struct rte_mbuf *mbuf, void *iq_data_start, uint16_t size, uint8_t CC_ID, uint8_t Ant_ID, uint8_t frame_id, uint8_t subframe_id, uint8_t slot_id, uint8_t symb_id, uint16_t num_prbu, uint16_t start_prbu, uint16_t sym_inc, uint16_t rb, uint16_t sect_id, uint32_t *mb_free)
int32_t xran_start(void *pHandle)
#define XranGetSymNum(symIdx, numSymPerTti)
uint8_t xran_get_conf_num_bfweights(void *pHandle)
Get the configuration of the total number of beamforming weights on RU.
#define XRAN_PRACH_CANDIDATE_SLOT
uint32_t bufferPoolElmSz[XRAN_MAX_POOLS_PER_SECTOR_NR]
int32_t xran_mm_init(void *pHandle, uint64_t nMemorySize, uint32_t nMemorySegmentSize)
int xran_destroy_cb(struct cb_elem_entry *cb_elm)
void * pCallbackTag[XRAN_MAX_SECTOR_NR]
#define print_err(fmt, args...)
#define XranGetSubFrameNum(tti, numSlotPerSubFrame, numSubFramePerSystemFrame)
struct rte_mempool * _eth_mbuf_pool_small
void ul_up_full_slot_cb(struct rte_timer *tim, void *arg)
#define PID_PROCESS_TX_SYM
int xran_parse_cp_pkt(struct rte_mbuf *mbuf, struct xran_cp_gen_params *result, struct xran_recv_packet_info *pkt_info)
Parse a C-Plane packet (for RU emulation) Transport layer fragmentation is not supported.
int32_t xran_fs_set_slot_type(uint32_t nPhyInstanceId, uint32_t nFrameDuplexType, uint32_t nTddPeriod, struct xran_slot_config *psSlotConfig)
uint16_t xran_SFN_at_Sec_Start
long poll_next_tick(long interval_ns, unsigned long *used_tick)
struct xran_frame_config frame_conf
#define SLOTS_PER_SYSTEMFRAME
This file provides interface to synchronization related APIs (PTP/1588) for XRAN. ...
phy_decoder_poll_fn bbdev_dec
uint32_t bufferPoolNumElm[XRAN_MAX_POOLS_PER_SECTOR_NR]
uint32_t xran_fs_get_max_slot_SFN(void)
int process_cplane(struct rte_mbuf *pkt)
int xran_packet_and_dpdk_timer_thread(void *args)
void tti_to_phy_cb(struct rte_timer *tim, void *arg)
struct rte_mbuf * m_table[MBUF_TABLE_SIZE]
int timing_set_debug_stop(int value, int count)
#define XranGetSlotNum(tti, numSlotPerSfn)
void tx_cp_ul_cb(struct rte_timer *tim, void *arg)
This file provides interface to Timing for XRAN.
void tx_cp_dl_cb(struct rte_timer *tim, void *arg)
struct xran_flat_buffer sFrontHaulRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]
void tti_ota_cb(struct rte_timer *tim, void *arg)
uint32_t xran_lib_ota_sym
int32_t xran_pkt_validate(void *arg, struct rte_mbuf *mbuf, void *iq_data_start, uint16_t size, uint8_t CC_ID, uint8_t Ant_ID, uint8_t frame_id, uint8_t subframe_id, uint8_t slot_id, uint8_t symb_id, struct ecpri_seq_id *seq_id, uint16_t num_prbu, uint16_t start_prbu, uint16_t sym_inc, uint16_t rb, uint16_t sect_id)
struct xran_flat_buffer * pBuffers
uint8_t xran_get_conf_compmethod(void *pHandle)
Get the configuration of compression method for RU.
BbuIoBufCtrlStruct sFHSrsRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANT_ARRAY_ELM_NR]
int32_t xran_process_srs_sym(void *arg, struct rte_mbuf *mbuf, void *iq_data_start, uint16_t size, uint8_t CC_ID, uint8_t Ant_ID, uint8_t frame_id, uint8_t subframe_id, uint8_t slot_id, uint8_t symb_id, uint16_t num_prbu, uint16_t start_prbu, uint16_t sym_inc, uint16_t rb, uint16_t sect_id, uint32_t *mb_free)
struct xran_cp_header_params hdr
Header file for function to work with 5G NR frame structure and related routines. ...
uint8_t slotNr[XRAN_PRACH_CANDIDATE_SLOT]
struct xran_prach_config prach_conf
#define XRAN_SYMBOL_TYPE_DL
int xran_init_sectionid(void *pHandle)
int xran_ethdi_init_dpdk_io(char *name, const struct xran_io_loop_cfg *io_cfg, int *lcore_id, struct ether_addr *p_lls_cu_addr, struct ether_addr *p_ru_addr, uint16_t cp_vlan, uint16_t up_vlan)
const xRANPrachPreambleLRAStruct gxranPreambleforLRA[13]
int32_t xran_5g_srs_req(void *pHandle, struct xran_buffer_list *pDstBuffer[XRAN_MAX_ANT_ARRAY_ELM_NR][XRAN_N_FE_BUF_LEN], xran_transport_callback_fn pCallback, void *pCallbackTag)
uint64_t timing_get_current_second(void)
uint8_t xran_get_num_eAxcUl(void *pHandle)
Get the configuration of the number of antenna.
BbuIoBufCtrlStruct sFrontHaulRxPrbMapBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR]
int32_t xran_app_fragment_packet(struct rte_mbuf *pkt_in, struct rte_mbuf **pkts_out, uint16_t nb_pkts_out, uint16_t mtu_size, struct rte_mempool *pool_direct, struct rte_mempool *pool_indirect, struct xran_section_info *sectinfo, uint8_t *seqid)
struct xran_flat_buffer sFrontHaulTxPrbMapBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]
This file has all definitions for the Ethernet Data Interface Layer.
void xran_timer_arm_ex(struct rte_timer *tim, void *CbFct, void *CbArg, unsigned tim_lcore)
void(* xran_callback_sym_fn)(void *)
BbuIoBufCtrlStruct sFrontHaulTxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR]
enum xran_category xranCat
#define NUM_OF_FRAMES_PER_SECOND
Header file for functions to perform application level fragmentation.
Modules provide debug prints and utility functions.
struct xran_slot_config sSlotConfig[XRAN_MAX_TDD_PERIODICITY]
struct xran_ecpri_cmn_hdr cmnhdr
#define XRAN_SLOT_TYPE_FDD
uint32_t SkipTti[XRAN_CB_MAX]
uint8_t xran_get_conf_fftsize(void *pHandle)
Get the configuration of FFT size for RU.
This file provides the definitions for User Plane Messages APIs.
#define PID_TIME_ARM_TIMER
struct xran_flat_buffer sFrontHaulRxPrbMapBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]
#define XRAN_MAX_PKT_BURST_PER_SYM
struct xran_eaxcid_config * xran_get_conf_eAxC(void *pHandle)
Get the configuration of eAxC ID.
struct xran_section_info * xran_cp_iterate_section_info(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ruport_id, uint8_t ctx_id, uint32_t *next)
Iterate each section information of C-Plane from the database of eAxC by given information.
XRAN layer common functionality for both lls-CU and RU as well as C-plane and U-plane.
int xran_cp_getsize_section_info(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ruport_id, uint8_t ctx_id)
Get the size of stored entries for the database of eAxC by given information.
int handle_ecpri_ethertype(struct rte_mbuf *pkt, uint64_t rx_time)
struct xran_ru_config ru_conf
int xran_register_cb_mbuf2ring(xran_ethdi_mbuf_send_fn mbuf_send_cp, xran_ethdi_mbuf_send_fn mbuf_send_up)
int xran_cp_reset_section_info(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ruport_id, uint8_t ctx_id)
Reset a database of eAxC by given information.
int(* xran_fh_tti_callback_fn)(void *)
struct xran_section_desc * p_sec_desc[XRAN_NUM_OF_SYMBOL_PER_SLOT]
#define XRAN_MAX_CELLS_PER_PORT
int32_t xran_reg_physide_cb(void *pHandle, xran_fh_tti_callback_fn Cb, void *cbParam, int skipTtiNum, enum callback_to_phy_id id)
#define UNIX_TO_GPS_SECONDS_OFFSET
struct xran_fh_init fh_init
int32_t xran_5g_prach_req(void *pHandle, struct xran_buffer_list *pDstBuffer[XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN], xran_transport_callback_fn pCallback, void *pCallbackTag)
struct xran_timer_ctx timer_ctx[MAX_NUM_OF_XRAN_CTX]
#define XRAN_NUM_OF_SYMBOL_PER_SLOT
xran_transport_callback_fn pSrsCallback[XRAN_MAX_SECTOR_NR]
int32_t DynamicSectionEna
uint8_t * xran_add_hdr_offset(uint8_t *dst, int16_t compMethod)
int xran_is_prach_slot(uint32_t subframe_id, uint32_t slot_id)
int xran_prepare_ctrl_pkt(struct rte_mbuf *mbuf, struct xran_cp_gen_params *params, uint8_t CC_ID, uint8_t Ant_ID, uint8_t seq_id)
Create a C-Plane packet Transport layer fragmentation is not supported.
uint32_t xran_lib_ota_sym_idx
enum xran_if_state xran_get_if_state(void)
Definitions and support functions to process XRAN packet.
uint8_t isPRACHslot[XRAN_PRACH_CANDIDATE_SLOT]
This file provides public interface to xRAN Front Haul layer implementation as defined in the ORAN-WG...
int xran_init_srs(struct xran_fh_config *pConf, struct xran_device_ctx *p_xran_dev_ctx)
void xran_fs_clear_slot_type(uint32_t nPhyInstanceId)
#define SLOTNUM_PER_SUBFRAME
struct xran_prach_cp_config PrachCPConfig
#define XRAN_STATUS_INVALID_PARAM
#define MAX_NUM_OF_DPDK_TIMERS
struct xran_section_desc sec_desc[XRAN_NUM_OF_SYMBOL_PER_SLOT]
struct rte_mempool * direct_pool
struct xran_buffer_list sBufferList
#define XRAN_SLOT_TYPE_SP
XranSymCallbackFn pSymCallback
uint8_t xran_get_conf_iqwidth(void *pHandle)
Get the configuration of IQ bit width for RU.
#define MLogIncrementCounter()
uint8_t preambleFmrt[XRAN_PRACH_CANDIDATE_PREAMBLE]
struct xran_section_gen_info * sections
int rx_packet_callback_tracker[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR]
struct xran_section_gen_info::@2 exData[XRAN_MAX_NUM_EXTENSIONS]
BbuIoBufCtrlStruct sFHPrachRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR]
int32_t xran_reg_sym_cb(void *pHandle, xran_callback_sym_fn symCb, void *symCbParam, uint8_t symb, uint8_t ant)
#define MLogTask(w, x, y)
int32_t xran_stop(void *pHandle)
void sym_ota_cb(struct rte_timer *tim, void *arg, unsigned long *used_tick)
struct xran_prb_elm prbMap[XRAN_MAX_PRBS]
uint32_t xran_get_time_stats(uint64_t *total_time, uint64_t *used_time, uint32_t *core_used, uint32_t clear)
#define PID_TTI_CB_TO_PHY
uint32_t nBufferPoolIndex
int32_t xran_fs_get_slot_type(int32_t nCellIdx, int32_t nSlotdx, int32_t nType)
int(* xran_ethdi_mbuf_send_fn)(struct rte_mbuf *mb, uint16_t ethertype)
int32_t xran_get_common_counters(void *pXranLayerHandle, struct xran_common_counters *pStats)
int process_mbuf(struct rte_mbuf *pkt)
#define CHECK_NOT_NULL(param, returnValue)
void(* xran_transport_callback_fn)(void *, xran_status_t)
#define XRAN_THREAD_DEFAULT_PRIO
#define XRAN_SYMBOL_TYPE_FDD
int xran_cp_init_sectiondb(void *pHandle)
Initialize section database. Allocate required memory space to store section information. Each eAxC allocates dedicated storage and the entry size is the maximum number of sections. Total entry size : number of CC * number of antenna * max number of sections * 2(direction)
#define XRAN_STATUS_RESOURCE
#define XranGetFrameNum(tti, SFNatSecStart, numSubFramePerSystemFrame, numSlotPerSubFrame)
This file provides the definitions for Control Plane Messages APIs.
int32_t xran_process_prach_sym(void *arg, struct rte_mbuf *mbuf, void *iq_data_start, uint16_t size, uint8_t CC_ID, uint8_t Ant_ID, uint8_t frame_id, uint8_t subframe_id, uint8_t slot_id, uint8_t symb_id, uint16_t num_prbu, uint16_t start_prbu, uint16_t sym_inc, uint16_t rb, uint16_t sect_id, uint32_t *mb_free)
int xran_cp_create_and_send_section(void *pHandle, uint8_t ru_port_id, int dir, int tti, int cc_id, struct xran_prb_map *prbMap, enum xran_category category, uint8_t ctx_id)
int32_t xran_fs_get_symbol_type(int32_t nCellIdx, int32_t nSlotdx, int32_t nSymbIdx)
int send_symbol_ex(enum xran_pkt_dir direction, uint16_t section_id, struct rte_mbuf *mb, struct rb_map *data, const enum xran_input_byte_order iq_buf_byte_order, uint8_t frame_id, uint8_t subframe_id, uint8_t slot_id, uint8_t symbol_no, int prb_start, int prb_num, uint8_t CC_ID, uint8_t RU_Port_ID, uint8_t seq_id)
BbuIoBufCtrlStruct sFrontHaulRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR]
int xran_register_ethertype_handler(uint16_t ethertype, ethertype_handler callback)
#define SUBFRAMES_PER_SYSTEMFRAME
phy_encoder_poll_fn bbdev_enc
#define TIMER_RESOLUTION_CYCLES
uint8_t nPrachSubcSpacing
#define XRAN_SLOT_TYPE_UL
int32_t xran_bm_free_buffer(void *pHandle, void *pData, void *pCtrl)
int32_t xran_bm_init(void *pHandle, uint32_t *pPoolIndex, uint32_t nNumberOfBuffers, uint32_t nBufferSize)
#define MAX_NUM_OF_XRAN_CTX