/******************************************************************************
*
-* Copyright (c) 2019 Intel.
+* Copyright (c) 2020 Intel.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
extern "C" {
#endif
-
#include "xran_fh_o_du.h"
#include "xran_pkt_cp.h"
#include "xran_transport.h"
XRAN_FILTERINDEX_PRACH_3 = 2, /**< UL filter for PRACH preamble format 3 */
XRAN_FILTERINDEX_PRACH_ABC = 3, /**< UL filter for PRACH preamble format A1~3, B1~4, C0, C2 */
XRAN_FILTERINDEX_NPRACH = 4, /**< UL filter for NPRACH */
+ XRAN_FILTERINDEX_LTE4 = 5, /**< UL filter for PRACH preamble format LTE-4 */
XRAN_FILTERINDEX_MAX
};
XRAN_CP_SECTIONEXTCMD_3 = 3, /**< DL Precoding configuration parameters and indications, not supported */
XRAN_CP_SECTIONEXTCMD_4 = 4, /**< Modulation compression parameter */
XRAN_CP_SECTIONEXTCMD_5 = 5, /**< Modulation compression additional scaling parameters */
- XRAN_CP_SECTIONEXTCMD_MAX /* 6~127 reserved for future use */
+ XRAN_CP_SECTIONEXTCMD_6 = 6, /**< Non-contiguous PRB allocation */
+ XRAN_CP_SECTIONEXTCMD_7 = 7, /**< Multiple-eAxC designation */
+ XRAN_CP_SECTIONEXTCMD_8 = 8, /**< MMSE parameters */
+ XRAN_CP_SECTIONEXTCMD_9 = 9, /**< Dynamic Spectrum Sharing parameters */
+ XRAN_CP_SECTIONEXTCMD_10 = 10, /**< Multiple ports grouping */
+ XRAN_CP_SECTIONEXTCMD_11 = 11, /**< Flexible BF weights */
+ XRAN_CP_SECTIONEXTCMD_MAX /* 12~127 reserved for future use */
};
/** Macro to convert bfwIqWidth defined in 5.4.7.1.1, Table 5-15 */
#define XRAN_TXS_SMUXNOCDD 1 /**< Spatial Multiplexing (no CDD) */
#define XRAN_TXS_TXDIV 2 /**< Transmit diversity */
+/** Resource Block Group Size 5.4.7.6.1 */
+enum xran_cp_rbgsize {
+ XRAN_RBGSIZE_1RB = 1, /**< 1 RB */
+ XRAN_RBGSIZE_2RB = 2, /**< 2 RBs */
+ XRAN_RBGSIZE_3RB = 3, /**< 3 RBs */
+ XRAN_RBGSIZE_4RB = 4, /**< 4 RBs */
+ XRAN_RBGSIZE_6RB = 5, /**< 6 RBs */
+ XRAN_RBGSIZE_8RB = 6, /**< 8 RBs */
+ XRAN_RBGSIZE_16RB = 7, /**< 16 RBs */
+};
+
+/** Technology for Dynamic Spectrum Sharing operation 5,4,7.9.1 */
+#define XRAN_DSSTECH_LTE 0 /**< LTE support */
+#define XRAN_DSSTECH_NR 1 /**< NR support */
+
+/** The type of beam grouping 5.4.7.10.1 */
+#define XRAN_BEAMGT_COMMON 0 /** common beam */
+#define XRAN_BEAMGT_MATRIXIND 1 /** beam matrix indication */
+#define XRAN_BEAMGT_VECTORLIST 2 /** beam vector listing */
+
+#define XRAN_MAX_NUMPORTC_EXT10 64 /* defined in 5.4.7.10.2 */
/**
* This structure contains the information to generate the section body of C-Plane message */
struct xran_sectionext1_info {
uint16_t rbNumber; /**< number RBs to ext1 chain */
uint16_t bfwNumber; /**< number of bf weights in this section */
- uint8_t bfwiqWidth;
+ uint8_t bfwIqWidth;
uint8_t bfwCompMeth;
int16_t *p_bfwIQ; /**< pointer to formed section extention */
int16_t bfwIQ_sz; /**< size of buffer with section extention information */
} mc[XRAN_MAX_MODCOMP_ADDPARMS];
};
+struct xran_sectionext6_info {
+ uint8_t rbgSize;
+ uint8_t pad;
+ uint16_t symbolMask;
+ uint32_t rbgMask;
+};
+
+struct xran_sectionext7_info {
+ uint16_t eAxCmask;
+};
+
+struct xran_sectionext8_info {
+ uint16_t regularizationFactor;
+};
+
+struct xran_sectionext9_info {
+ uint8_t technology;
+};
+
+struct xran_sectionext10_info {
+ uint8_t numPortc;
+ uint8_t beamGrpType;
+ uint16_t beamID[XRAN_MAX_NUMPORTC_EXT10];
+};
+
+struct xran_sectionext11_info {
+ uint8_t RAD;
+ uint8_t disableBFWs;
+
+ uint8_t numBundPrb;
+ uint8_t numSetBFWs; /* Total number of beam forming weights set (L) */
+
+ uint8_t bfwCompMeth;
+ uint8_t bfwIqWidth;
+
+ int32_t totalBfwIQLen;
+ int32_t maxExtBufSize; /* Maximum space of external buffer */
+ uint8_t *pExtBuf; /* pointer to start of external buffer */
+ void *pExtBufShinfo; /* Pointer to rte_mbuf_ext_shared_info */
+};
+
+union xran_ext_bfwcompparam_info {
+ uint8_t exponent;
+// uint8_t blockScaler; /* Not supported */
+// uint8_t compBitWidthShift; /* Not supported */
+// uint8_t *pActBeamspaceCoeffMask; /* Not supported */
+ };
+struct xran_ext11_prbbundle_info {
+ union xran_ext_bfwcompparam_info bfwCompParam;
+ uint16_t beamId; /* 15bits, needs to strip MSB */
+ uint16_t BFWSize; /* actual size of bfws in bytes */
+ uint8_t *pBFWs; /* external buffer pointer */
+};
+struct xran_sectionext11_recv_info {
+ uint8_t RAD;
+ uint8_t disableBFWs;
+
+ uint8_t numBundPrb;
+ uint8_t numSetBFWs; /* Total number of beam forming weights set (L) */
+
+ uint8_t bfwCompMeth;
+ uint8_t bfwIqWidth;
+
+ int32_t totalBfwIQLen;
+ int32_t maxExtBufSize; /* Maximum space of external buffer */
+ uint8_t *pExtBuf; /* pointer to start of external buffer */
+ void *pExtBufShinfo; /* Pointer to rte_mbuf_ext_shared_info */
+
+ /* For parsing */
+ struct xran_ext11_prbbundle_info bundInfo[XRAN_MAX_SET_BFWS];
+};
+
struct xran_sectionext_info {
uint16_t type;
uint16_t len;
void *data;
};
-
/**
* This structure contains the information to generate the section header of C-Plane message */
struct xran_cp_header_params {
uint32_t exDataSize; /**< The number of Extensions or type 6/7 data */
/** the array to store section extension */
struct xran_section_ext_gen_info exData[XRAN_MAX_NUM_EXTENSIONS];
-
- struct xran_sectionext1_info m_ext1[XRAN_MAX_NUM_EXTENSIONS];
- struct xran_sectionext2_info m_ext2[XRAN_MAX_NUM_EXTENSIONS];
- struct xran_sectionext3_info m_ext3[XRAN_MAX_NUM_EXTENSIONS];
- struct xran_sectionext4_info m_ext4[XRAN_MAX_NUM_EXTENSIONS];
- struct xran_sectionext5_info m_ext5[XRAN_MAX_NUM_EXTENSIONS];
};
-
/**
* This structure to hold the information to generate a C-Plane message */
struct xran_cp_gen_params {
/**< Array of the section information */
};
+/** The structure to store received section extension */
+struct xran_section_ext_recv_info {
+ uint16_t type; /**< the type of section extension */
+ uint16_t size;
+ union {
+ struct xran_sectionext1_info ext1;
+ struct xran_sectionext2_info ext2;
+ struct xran_sectionext3_info ext3;
+ struct xran_sectionext4_info ext4;
+ struct xran_sectionext5_info ext5;
+ struct xran_sectionext6_info ext6;
+ struct xran_sectionext10_info ext10;
+ struct xran_sectionext11_recv_info ext11;
+ } u;
+};
+
+/**
+ * This structure to hold the information of received sections of C-Plane message */
+struct xran_section_recv_info {
+ struct xran_section_info info; /**< The information for received section */
+
+ int32_t numExts;
+ /** the array to store section extension */
+ struct xran_section_ext_recv_info exts[XRAN_MAX_NUM_EXTENSIONS];
+};
+
+/**
+ * This structure to store received C-Plane message */
+struct xran_cp_recv_params {
+ uint8_t dir; /**< UL or DL */
+ uint8_t sectionType; /**< each section must have same type with this */
+ uint16_t numSections; /**< the number of sections received */
+
+ struct xran_cp_header_params hdr;
+ /**< The information for C-Plane message header */
+ struct xran_section_recv_info *sections;
+ /**< Array of the section information */
+};
+
/**
* This structure to hold the information of RB allocation from PHY
* to send data for allocated RBs only. */
uint8_t pad0;
};
+typedef struct tagSECTION_DB_TYPE {
+ struct xran_sectioninfo_db* p_sectiondb_elm[XRAN_MAX_SECTIONDB_CTX][XRAN_DIR_MAX][XRAN_COMPONENT_CARRIERS_MAX][XRAN_MAX_ANTENNA_NR * 2 + XRAN_MAX_ANT_ARRAY_ELM_NR];
+} SECTION_DB_TYPE, * PSECTION_DB_TYPE;
-uint16_t xran_get_cplength(int cpLength);
-int32_t xran_get_freqoffset(int freqOffset, int scs);
+uint16_t xran_get_cplength(int32_t cpLength);
+int32_t xran_get_freqoffset(int32_t freqOffset, int32_t scs);
int32_t xran_prepare_ctrl_pkt(struct rte_mbuf *mbuf,
struct xran_cp_gen_params *params,
uint8_t seq_id);
int32_t xran_parse_cp_pkt(struct rte_mbuf *mbuf,
- struct xran_cp_gen_params *result,
+ struct xran_cp_recv_params *result,
struct xran_recv_packet_info *pkt_info);
int32_t xran_cp_init_sectiondb(void *pHandle);
uint8_t dir, uint8_t cc_id, uint8_t ruport_id,
uint8_t ctx_id, uint32_t *next);
-int xran_cp_getsize_section_info(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ruport_id, uint8_t ctx_id);
-int xran_cp_reset_section_info(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ruport_id, uint8_t ctx_id);
+int32_t xran_cp_getsize_section_info(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ruport_id, uint8_t ctx_id);
+int32_t xran_cp_reset_section_info(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ruport_id, uint8_t ctx_id);
int32_t xran_cp_populate_section_ext_1(int8_t *p_ext1_dst, /**< destination buffer */
uint16_t ext1_dst_len, /**< dest buffer size */
int16_t *p_bfw_iq_src, /**< source buffer of IQs */
uint16_t bfwNumber, /**< number of bf weights in this set of sections */
uint8_t bfwiqWidth, /**< bit size of IQs */
uint8_t bfwCompMeth); /**< compression method */
-struct rte_mbuf *xran_attach_cp_ext_buf(int8_t* p_ext_buff_start, int8_t* p_ext_buff, uint16_t ext_buff_len,
+struct rte_mbuf *xran_attach_cp_ext_buf(uint16_t vf_id, int8_t* p_ext_buff_start, int8_t* p_ext_buff, uint16_t ext_buff_len,
struct rte_mbuf_ext_shared_info * p_share_data);
+int32_t xran_cp_attach_ext_buf(struct rte_mbuf *mbuf, uint8_t *extbuf_start, uint16_t extbuf_len,
+ struct rte_mbuf_ext_shared_info *shinfo);
+int32_t xran_cp_prepare_ext11_bfws(uint8_t numSetBFW, uint8_t numBFW,
+ uint8_t iqWidth, uint8_t compMeth,
+ uint8_t *dst, int16_t dst_maxlen,
+ struct xran_ext11_bfw_info bfwInfo[]);
+int32_t xran_cp_estimate_max_set_bfws(uint8_t numBFWs, uint8_t iqWidth,
+ uint8_t compMeth, uint16_t mtu);
#ifdef __cplusplus
}