29 #include <rte_memcpy.h> 48 static int build_ecpri_hdr(
struct rte_mbuf *mbuf,
49 const uint32_t iq_data_num_bytes,
50 const uint32_t iq_data_offset,
56 uint16_t iq_samples_bytes_in_mbuf = rte_pktmbuf_tailroom(mbuf) -
59 iq_samples_bytes_in_mbuf -= (iq_samples_bytes_in_mbuf % alignment);
61 if (NULL == ecpri_hdr)
69 if (iq_data_offset + iq_samples_bytes_in_mbuf > iq_data_num_bytes) {
73 (iq_data_num_bytes - iq_data_offset) +
80 iq_samples_bytes_in_mbuf +
88 iq_samples_bytes_in_mbuf;
105 static int xran_build_ecpri_hdr_ex(
struct rte_mbuf *mbuf,
106 uint8_t ecpri_mesg_type,
113 char *pChar = rte_pktmbuf_mtod(mbuf,
char*);
115 uint16_t ecpri_payl_size = payl_size
123 if (NULL == ecpri_hdr)
153 static int build_application_layer(
154 struct rte_mbuf *mbuf,
157 char *pChar = rte_pktmbuf_mtod(mbuf,
char*);
176 static int build_section_hdr(
177 struct rte_mbuf *mbuf,
180 char *pChar = rte_pktmbuf_mtod(mbuf,
char*);
184 if (NULL == section_hdr)
200 static uint16_t append_iq_samples_ex(
201 struct rte_mbuf *mbuf,
202 const void *iq_data_start,
203 const uint32_t iq_data_num_bytes,
207 char *pChar = rte_pktmbuf_mtod(mbuf,
char*);
208 void *iq_sam_buf = (pChar +
sizeof(
struct ether_hdr) + sizeof (struct
xran_ecpri_hdr)
212 if (iq_sam_buf == NULL){
218 uint16_t *psrc = (uint16_t *)iq_data_start;
219 uint16_t *pdst = (uint16_t *)iq_sam_buf;
221 for (idx = 0; idx < iq_data_num_bytes/
sizeof(int16_t); idx++){
222 pdst[idx] = (psrc[idx]>>8) | (psrc[idx]<<8);
230 rte_memcpy(iq_sam_buf, (uint8_t *)iq_data_start, iq_data_num_bytes);
235 return iq_data_num_bytes;
247 static uint16_t append_iq_samples(
248 struct rte_mbuf *mbuf,
249 const void *iq_data_start,
250 const uint32_t iq_data_num_bytes,
251 const uint32_t iq_data_offset,
252 const uint8_t alignment)
254 uint16_t iq_bytes_to_send = 0;
255 uint16_t free_space_in_pkt = rte_pktmbuf_tailroom(mbuf);
257 if (free_space_in_pkt > iq_data_num_bytes - iq_data_offset)
258 iq_bytes_to_send = iq_data_num_bytes - iq_data_offset;
260 iq_bytes_to_send = free_space_in_pkt;
263 iq_bytes_to_send -= iq_bytes_to_send % alignment;
265 void *iq_sam_buf = (
void *)rte_pktmbuf_append(mbuf, iq_bytes_to_send);
267 rte_memcpy(iq_sam_buf, (uint8_t *)iq_data_start + iq_data_offset,
270 return iq_bytes_to_send;
281 static int build_compression_hdr(
282 struct rte_mbuf *mbuf,
285 char *pChar = rte_pktmbuf_mtod(mbuf,
char*);
290 if (NULL == compression_hdr)
293 rte_memcpy(compression_hdr, compr_hdr,
sizeof(*compression_hdr));
305 static int append_comp_param(
struct rte_mbuf *mbuf,
union compression_params *ud_comp_param)
310 if (NULL == compr_param)
328 void **iq_data_start,
332 uint8_t *subframe_id,
337 uint16_t *start_prbu,
346 uint32_t mlogVar[10];
347 uint32_t mlogVarCnt = 0;
353 if (NULL == iq_data_start)
357 const struct xran_ecpri_hdr *ecpri_hdr = rte_pktmbuf_mtod(mbuf,
void *);
358 if (ecpri_hdr == NULL)
366 *CC_ID = result.
ccId;
371 (
void *)rte_pktmbuf_adj(mbuf,
sizeof(*ecpri_hdr));
372 if (radio_hdr == NULL)
391 (
void *)rte_pktmbuf_adj(mbuf,
sizeof(*radio_hdr));
392 if (data_hdr == NULL)
406 (
void *) rte_pktmbuf_adj(mbuf,
sizeof(*data_hdr));
408 if (data_compr_hdr == NULL)
414 const uint8_t *compr_param =
415 (
void *)rte_pktmbuf_adj(mbuf,
sizeof(*data_compr_hdr));
417 *iq_data_start = (
void *)compr_param; ;
419 *iq_data_start = rte_pktmbuf_adj(mbuf,
sizeof(*data_hdr));
422 if (*iq_data_start == NULL)
426 mlogVar[mlogVarCnt++] = 0xBBBBBBBB;
428 mlogVar[mlogVarCnt++] = radio_hdr->
frame_id;
435 mlogVar[mlogVarCnt++] = rte_pktmbuf_pkt_len(mbuf);
439 return rte_pktmbuf_pkt_len(mbuf);
456 struct rte_mbuf *mbuf,
457 const void *iq_data_start,
459 const uint32_t iq_data_num_bytes,
466 if(xran_build_ecpri_hdr_ex(mbuf,
473 print_err(
"xran_build_ecpri_hdr_ex return 0\n");
477 if (build_application_layer(mbuf, &(params->
app_params)) != 0){
478 print_err(
"build_application_layer return != 0\n");
482 if (build_section_hdr(mbuf, &(params->
sec_hdr)) != 0){
483 print_err(
"build_section_hdr return != 0\n");
499 return append_iq_samples_ex(mbuf, iq_data_start, iq_data_num_bytes, iq_buf_byte_order, do_copy);
struct radio_app_common_hdr app_params
uint32_t xran_lib_ota_tti
union radio_app_common_hdr::@5 sf_slot_sym
void xran_decompose_cid(uint16_t cid, struct xran_eaxc_info *result)
Decompose ecpriRtcid/ecpriPcid.
#define MLogAddVariables(x, y, z)
struct compression_hdr ud_comp_hdr
uint16_t xran_compose_cid(uint8_t CU_Port_ID, uint8_t BandSector_ID, uint8_t CC_ID, uint8_t Ant_ID)
Compose ecpriRtcid/ecpriPcid.
#define print_err(fmt, args...)
int xran_get_ecpri_hdr_size(void)
return eCPRI header size without eCPRI common header
int32_t xran_prepare_iq_symbol_portion(struct rte_mbuf *mbuf, const void *iq_data_start, const enum xran_input_byte_order iq_buf_byte_order, const uint32_t iq_data_num_bytes, struct xran_up_pkt_gen_params *params, uint8_t CC_ID, uint8_t Ant_ID, uint8_t seq_id, uint32_t do_copy)
Function for starting preparion of IQ samples portions to be sent in xRAN packet. ...
struct data_section_hdr sec_hdr
Modules provide debug prints and utility functions.
struct xran_ecpri_cmn_hdr cmnhdr
This file provides the definitions for User Plane Messages APIs.
This file provides public interface to xRAN Front Haul layer implementation as defined in the ORAN-WG...
int32_t xran_extract_iq_samples(struct rte_mbuf *mbuf, void **iq_data_start, 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, int8_t expect_comp, uint8_t *compMeth, uint8_t *iqWidth)
Function for extracting all IQ samples from xRAN packet holding a single data section.
struct ecpri_seq_id ecpri_seq_id
union data_section_hdr::@18 fields
struct data_section_compression_hdr compr_hdr_param
This file provides the definitions for Transport layer (eCPRI) API.