Merge remote-tracking branch 'origin/nfapi-fixes-4x4-100MHz' into integration_2025_w06 (!3251)
nFAPI: make 4-layer on 100MHz work 5G nFAPI headers specify 32 bits for the length field, so use it also when segmenting messages. This should stabilize 4-layer MIMO operation on 100MHz with nFAPI.
This commit is contained in:
@@ -57,7 +57,7 @@ typedef struct {
|
||||
|
||||
typedef struct {
|
||||
uint8_t* buffer;
|
||||
uint16_t length;
|
||||
uint32_t length;
|
||||
} pnf_p7_rx_message_segment_t;
|
||||
|
||||
typedef struct pnf_p7_rx_message pnf_p7_rx_message_t;
|
||||
|
||||
@@ -629,8 +629,8 @@ typedef struct nfapi_pnf_p7_config
|
||||
uint8_t checksum_enabled;
|
||||
|
||||
/*! The maxium size of a P7 segement. If a message is large that this it
|
||||
* will be segemented */
|
||||
uint16_t segment_size;
|
||||
* will be segmented. Note: u32 to cover 4G and 5G */
|
||||
uint32_t segment_size;
|
||||
|
||||
/*! The dummy subframe buffer structure that should be used in case there
|
||||
* are no 'valid' subframe messages */
|
||||
|
||||
@@ -602,18 +602,20 @@ int pnf_nr_p7_pack_and_send_p7_message(pnf_p7_t* pnf_p7, nfapi_nr_p7_message_hea
|
||||
uint8_t buffer[pnf_p7->_public.segment_size];
|
||||
for (segment = 0; segment < segment_count; ++segment) {
|
||||
uint8_t last = 0;
|
||||
uint16_t size = pnf_p7->_public.segment_size - NFAPI_NR_P7_HEADER_LENGTH;
|
||||
uint32_t size = pnf_p7->_public.segment_size - NFAPI_NR_P7_HEADER_LENGTH;
|
||||
if (segment + 1 == segment_count) {
|
||||
last = 1;
|
||||
size = (msg_body_len) - (seg_body_len * segment);
|
||||
}
|
||||
|
||||
uint16_t segment_size = size + NFAPI_NR_P7_HEADER_LENGTH;
|
||||
uint32_t segment_size = size + NFAPI_NR_P7_HEADER_LENGTH;
|
||||
|
||||
// Update the header with the m and segement
|
||||
memcpy(&buffer[0], tx_buf, NFAPI_NR_P7_HEADER_LENGTH);
|
||||
|
||||
// set the segment length
|
||||
buffer[4] = (segment_size & 0xFF000000) >> 24;
|
||||
buffer[5] = (segment_size & 0xFF0000) >> 16;
|
||||
buffer[6] = (segment_size & 0xFF00) >> 8;
|
||||
buffer[7] = (segment_size & 0xFF);
|
||||
|
||||
@@ -2378,7 +2380,7 @@ void pnf_nr_handle_p7_message(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7,
|
||||
if (rx_msg->num_segments_received == rx_msg->num_segments_expected) {
|
||||
// send the buffer on
|
||||
uint16_t i = 0;
|
||||
uint16_t length = 0;
|
||||
uint32_t length = 0;
|
||||
for (i = 0; i < rx_msg->num_segments_expected; ++i) {
|
||||
length += rx_msg->segments[i].length - (i > 0 ? NFAPI_NR_P7_HEADER_LENGTH : 0);
|
||||
}
|
||||
@@ -2400,7 +2402,7 @@ void pnf_nr_handle_p7_message(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7,
|
||||
pnf_p7->reassemby_buffer_size = length;
|
||||
}
|
||||
|
||||
uint16_t offset = 0;
|
||||
uint32_t offset = 0;
|
||||
for (i = 0; i < rx_msg->num_segments_expected; ++i) {
|
||||
if (i == 0) {
|
||||
memcpy(pnf_p7->reassemby_buffer, rx_msg->segments[i].buffer, rx_msg->segments[i].length);
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
typedef struct {
|
||||
uint8_t* buffer;
|
||||
uint16_t length;
|
||||
uint32_t length;
|
||||
} vnf_p7_rx_message_segment_t;
|
||||
|
||||
typedef struct vnf_p7_rx_message vnf_p7_rx_message_t;
|
||||
|
||||
@@ -669,8 +669,8 @@ typedef struct nfapi_vnf_p7_config
|
||||
uint8_t checksum_enabled;
|
||||
|
||||
/*! The maxium size of a P7 segement. If a message is large that this it
|
||||
* will be segemented */
|
||||
uint16_t segment_size;
|
||||
* will be segmented. Note: u32 to cover 4G and 5G. */
|
||||
uint32_t segment_size;
|
||||
uint16_t max_num_segments;
|
||||
|
||||
/*! Configuration option for the p7 pack unpack functions*/
|
||||
|
||||
@@ -501,7 +501,7 @@ int vnf_nr_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_nr_p7_message_header_
|
||||
|
||||
// segmenting the transmit
|
||||
int msg_body_len = len - NFAPI_NR_P7_HEADER_LENGTH ;
|
||||
int seg_body_len = vnf_p7->_public.segment_size - NFAPI_NR_P7_HEADER_LENGTH ;
|
||||
uint32_t seg_body_len = vnf_p7->_public.segment_size - NFAPI_NR_P7_HEADER_LENGTH ;
|
||||
int segment_count = (msg_body_len / (seg_body_len)) + ((msg_body_len % seg_body_len) ? 1 : 0);
|
||||
|
||||
int segment = 0;
|
||||
@@ -511,19 +511,21 @@ int vnf_nr_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_nr_p7_message_header_
|
||||
for(segment = 0; segment < segment_count; ++segment)
|
||||
{
|
||||
uint8_t last = 0;
|
||||
uint16_t size = vnf_p7->_public.segment_size - NFAPI_NR_P7_HEADER_LENGTH;
|
||||
uint32_t size = vnf_p7->_public.segment_size - NFAPI_NR_P7_HEADER_LENGTH;
|
||||
if(segment + 1 == segment_count)
|
||||
{
|
||||
last = 1;
|
||||
size = (msg_body_len) - (seg_body_len * segment);
|
||||
}
|
||||
|
||||
uint16_t segment_size = size + NFAPI_NR_P7_HEADER_LENGTH;
|
||||
uint32_t segment_size = size + NFAPI_NR_P7_HEADER_LENGTH;
|
||||
|
||||
// Update the header with the m and segement
|
||||
memcpy(&tx_buffer[0], buffer, NFAPI_NR_P7_HEADER_LENGTH);
|
||||
|
||||
// set the segment length
|
||||
tx_buffer[4] = (segment_size & 0xFF000000) >> 24;
|
||||
tx_buffer[5] = (segment_size & 0xFF0000) >> 16;
|
||||
tx_buffer[6] = (segment_size & 0xFF00) >> 8;
|
||||
tx_buffer[7] = (segment_size & 0xFF);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user