Fix non-SCTP socket communication for P5 messages between PNF and VNF.
Switches the used socket type in pnf_interface.c and vnf_interface.c. These values must always be the same in both components so the same socket type is used in both
This commit is contained in:
@@ -1935,7 +1935,20 @@ int pnf_connect(pnf_t* pnf)
|
|||||||
|
|
||||||
socketConnected = 1;
|
socketConnected = 1;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
|
int error;
|
||||||
|
socklen_t len = sizeof(error);
|
||||||
|
|
||||||
|
if (getsockopt(pnf->p5_sock, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "After getsockopt errno: %d\n", errno);
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
// If error is zero, the socket is connected
|
||||||
|
if (error == 0) {
|
||||||
|
socketConnected = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
NFAPI_TRACE(NFAPI_TRACE_NOTE, "Socket %s\n", socketConnected ? "CONNECTED" : "NOT_CONNECTED");
|
NFAPI_TRACE(NFAPI_TRACE_NOTE, "Socket %s\n", socketConnected ? "CONNECTED" : "NOT_CONNECTED");
|
||||||
return socketConnected;
|
return socketConnected;
|
||||||
@@ -2132,15 +2145,23 @@ int pnf_nr_read_dispatch_message(pnf_t* pnf)
|
|||||||
|
|
||||||
{
|
{
|
||||||
int flags = MSG_PEEK;
|
int flags = MSG_PEEK;
|
||||||
message_size = sctp_recvmsg(pnf->p5_sock,
|
if (pnf->sctp) {
|
||||||
header_buffer,
|
message_size = sctp_recvmsg(pnf->p5_sock,
|
||||||
header_buffer_size,
|
header_buffer,
|
||||||
/*(struct sockaddr*)&addr, &addr_len*/ 0,
|
header_buffer_size,
|
||||||
0,
|
/*(struct sockaddr*)&addr, &addr_len*/
|
||||||
&sndrcvinfo,
|
0,
|
||||||
&flags);
|
0,
|
||||||
|
&sndrcvinfo,
|
||||||
|
&flags);
|
||||||
|
} else {
|
||||||
|
message_size = recv(pnf->p5_sock,
|
||||||
|
header_buffer,
|
||||||
|
header_buffer_size,
|
||||||
|
flags);
|
||||||
|
}
|
||||||
|
|
||||||
if (message_size == -1) {
|
if (message_size < NFAPI_NR_P5_HEADER_LENGTH) {
|
||||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF Failed to peek sctp message size errno:%d\n", errno);
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF Failed to peek sctp message size errno:%d\n", errno);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -2172,8 +2193,20 @@ int pnf_nr_read_dispatch_message(pnf_t* pnf)
|
|||||||
int flags = 0;
|
int flags = 0;
|
||||||
(void)memset(&sndrcvinfo, 0, sizeof(struct sctp_sndrcvinfo));
|
(void)memset(&sndrcvinfo, 0, sizeof(struct sctp_sndrcvinfo));
|
||||||
|
|
||||||
int recvmsg_result =
|
ssize_t recvmsg_result = 0;
|
||||||
sctp_recvmsg(pnf->p5_sock, read_buffer, message_size, (struct sockaddr*)&addr, &addr_len, &sndrcvinfo, &flags);
|
if (pnf->sctp) {
|
||||||
|
recvmsg_result = sctp_recvmsg(pnf->p5_sock,
|
||||||
|
read_buffer,
|
||||||
|
message_size,
|
||||||
|
(struct sockaddr *)&addr,
|
||||||
|
&addr_len,
|
||||||
|
&sndrcvinfo,
|
||||||
|
&flags);
|
||||||
|
} else {
|
||||||
|
if ((recvmsg_result = recv(pnf->p5_sock, read_buffer, message_size, flags))<=0) {
|
||||||
|
recvmsg_result = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (recvmsg_result == -1) {
|
if (recvmsg_result == -1) {
|
||||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "Failed to read sctp message size errno:%d\n", errno);
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "Failed to read sctp message size errno:%d\n", errno);
|
||||||
} else {
|
} else {
|
||||||
@@ -2204,7 +2237,7 @@ int pnf_nr_read_dispatch_message(pnf_t* pnf)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// handle now if complete message in one or more segments
|
// handle now if complete message in one or more segments
|
||||||
if ((flags & 0x80) == 0x80) {
|
if ((flags & 0x80) == 0x80 || !pnf->sctp) {
|
||||||
pnf_nr_handle_p5_message(pnf, read_buffer, message_size);
|
pnf_nr_handle_p5_message(pnf, read_buffer, message_size);
|
||||||
} else {
|
} else {
|
||||||
NFAPI_TRACE(NFAPI_TRACE_WARN, "sctp_recvmsg: unhandled mode with flags 0x%x\n", flags);
|
NFAPI_TRACE(NFAPI_TRACE_WARN, "sctp_recvmsg: unhandled mode with flags 0x%x\n", flags);
|
||||||
|
|||||||
@@ -32,6 +32,9 @@
|
|||||||
#include "nfapi/oai_integration/aerial/fapi_vnf_p5.h"
|
#include "nfapi/oai_integration/aerial/fapi_vnf_p5.h"
|
||||||
#include "nr_fapi_p5.h"
|
#include "nr_fapi_p5.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "nfapi/oai_integration/vendor_ext.h"
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
|
|
||||||
void* vnf_malloc(nfapi_vnf_config_t* config, size_t size)
|
void* vnf_malloc(nfapi_vnf_config_t* config, size_t size)
|
||||||
@@ -434,22 +437,22 @@ void vnf_nr_handle_param_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_conf
|
|||||||
const bool result = config->unpack_func(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config);
|
const bool result = config->unpack_func(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config);
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (msg.error_code == NFAPI_NR_PARAM_MSG_OK)
|
if (msg.error_code == NFAPI_NR_PARAM_MSG_OK)
|
||||||
{
|
{
|
||||||
nfapi_vnf_phy_info_t* phy_info = nfapi_vnf_phy_info_list_find(config, msg.header.phy_id);
|
nfapi_vnf_phy_info_t* phy_info = nfapi_vnf_phy_info_list_find(config, msg.header.phy_id);
|
||||||
|
|
||||||
if(msg.nfapi_config.p7_pnf_address_ipv4.tl.tag)
|
if(msg.nfapi_config.p7_pnf_address_ipv4.tl.tag)
|
||||||
{
|
{
|
||||||
struct sockaddr_in sockAddr;
|
struct sockaddr_in sockAddr;
|
||||||
|
|
||||||
(void)memcpy(&sockAddr.sin_addr.s_addr, msg.nfapi_config.p7_pnf_address_ipv4.address, NFAPI_IPV4_ADDRESS_LENGTH);
|
(void)memcpy(&sockAddr.sin_addr.s_addr, msg.nfapi_config.p7_pnf_address_ipv4.address, NFAPI_IPV4_ADDRESS_LENGTH);
|
||||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF P7 IPv4 address: %s\n", inet_ntoa(sockAddr.sin_addr));
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF P7 IPv4 address: %s\n", inet_ntoa(sockAddr.sin_addr));
|
||||||
|
|
||||||
// store address
|
// store address
|
||||||
phy_info->p7_pnf_address.sin_addr = sockAddr.sin_addr;
|
phy_info->p7_pnf_address.sin_addr = sockAddr.sin_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(msg.nfapi_config.p7_pnf_address_ipv6.tl.tag)
|
if(msg.nfapi_config.p7_pnf_address_ipv6.tl.tag)
|
||||||
{
|
{
|
||||||
struct sockaddr_in6 sockAddr6;
|
struct sockaddr_in6 sockAddr6;
|
||||||
@@ -457,11 +460,11 @@ void vnf_nr_handle_param_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_conf
|
|||||||
(void)memcpy(&sockAddr6.sin6_addr, msg.nfapi_config.p7_pnf_address_ipv6.address, NFAPI_IPV6_ADDRESS_LENGTH);
|
(void)memcpy(&sockAddr6.sin6_addr, msg.nfapi_config.p7_pnf_address_ipv6.address, NFAPI_IPV6_ADDRESS_LENGTH);
|
||||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF P7 IPv6 address: %s\n", inet_ntop(AF_INET6, &sockAddr6.sin6_addr, addr6, sizeof(addr6)));
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF P7 IPv6 address: %s\n", inet_ntop(AF_INET6, &sockAddr6.sin6_addr, addr6, sizeof(addr6)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (msg.nfapi_config.p7_pnf_port.tl.tag)
|
if (msg.nfapi_config.p7_pnf_port.tl.tag)
|
||||||
{
|
{
|
||||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF P7 Port: %d\n", msg.nfapi_config.p7_pnf_port.value);
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF P7 Port: %d\n", msg.nfapi_config.p7_pnf_port.value);
|
||||||
|
|
||||||
// store port
|
// store port
|
||||||
phy_info->p7_pnf_address.sin_port = htons(msg.nfapi_config.p7_pnf_port.value);
|
phy_info->p7_pnf_address.sin_port = htons(msg.nfapi_config.p7_pnf_port.value);
|
||||||
}
|
}
|
||||||
@@ -1268,7 +1271,7 @@ int vnf_nr_read_dispatch_message(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_
|
|||||||
{
|
{
|
||||||
if (1) {
|
if (1) {
|
||||||
int socket_connected = 1;
|
int socket_connected = 1;
|
||||||
|
vnf_t *vnf = (vnf_t *)(config);
|
||||||
// 1. Peek the message header
|
// 1. Peek the message header
|
||||||
// 2. If the message is larger than the stack buffer then create a dynamic buffer
|
// 2. If the message is larger than the stack buffer then create a dynamic buffer
|
||||||
// 3. Read the buffer
|
// 3. Read the buffer
|
||||||
@@ -1293,8 +1296,21 @@ int vnf_nr_read_dispatch_message(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_
|
|||||||
|
|
||||||
{
|
{
|
||||||
int flags = MSG_PEEK;
|
int flags = MSG_PEEK;
|
||||||
message_size =
|
if (vnf->sctp) {
|
||||||
sctp_recvmsg(pnf->p5_sock, header_buffer, header_buffer_size, (struct sockaddr*)&addr, &addr_len, &sndrcvinfo, &flags);
|
message_size =
|
||||||
|
sctp_recvmsg(pnf->p5_sock,
|
||||||
|
header_buffer,
|
||||||
|
header_buffer_size,
|
||||||
|
(struct sockaddr *)&addr,
|
||||||
|
&addr_len,
|
||||||
|
&sndrcvinfo,
|
||||||
|
&flags);
|
||||||
|
} else {
|
||||||
|
message_size = recv(pnf->p5_sock,
|
||||||
|
header_buffer,
|
||||||
|
header_buffer_size,
|
||||||
|
flags);
|
||||||
|
}
|
||||||
|
|
||||||
if (message_size == -1) {
|
if (message_size == -1) {
|
||||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF Failed to peek sctp message size errno:%d\n", errno);
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF Failed to peek sctp message size errno:%d\n", errno);
|
||||||
@@ -1328,8 +1344,22 @@ int vnf_nr_read_dispatch_message(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_
|
|||||||
int flags = 0;
|
int flags = 0;
|
||||||
(void)memset(&sndrcvinfo, 0, sizeof(struct sctp_sndrcvinfo));
|
(void)memset(&sndrcvinfo, 0, sizeof(struct sctp_sndrcvinfo));
|
||||||
|
|
||||||
int recvmsg_result =
|
ssize_t recvmsg_result = 0;
|
||||||
sctp_recvmsg(pnf->p5_sock, read_buffer, message_size, (struct sockaddr*)&addr, &addr_len, &sndrcvinfo, &flags);
|
if (vnf->sctp) {
|
||||||
|
recvmsg_result = sctp_recvmsg(pnf->p5_sock,
|
||||||
|
read_buffer,
|
||||||
|
message_size,
|
||||||
|
(struct sockaddr *)&addr,
|
||||||
|
&addr_len,
|
||||||
|
&sndrcvinfo,
|
||||||
|
&flags);
|
||||||
|
} else {
|
||||||
|
recvmsg_result = recv(pnf->p5_sock,
|
||||||
|
read_buffer,
|
||||||
|
message_size,
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
|
||||||
if (recvmsg_result == -1) {
|
if (recvmsg_result == -1) {
|
||||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "Failed to read sctp message size errno:%d\n", errno);
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "Failed to read sctp message size errno:%d\n", errno);
|
||||||
} else {
|
} else {
|
||||||
@@ -1338,34 +1368,34 @@ int vnf_nr_read_dispatch_message(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_
|
|||||||
|
|
||||||
// todo - handle the events
|
// todo - handle the events
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "Received message fd:%d from %s:%u assoc:%d on stream %d, PPID %d, length %d, flags 0x%x\n",
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "Received message fd:%d from %s:%u assoc:%d on stream %d, PPID %d, length %d, flags 0x%x\n",
|
||||||
pnf->p5_sock,
|
pnf->p5_sock,
|
||||||
inet_ntoa(addr.sin_addr),
|
inet_ntoa(addr.sin_addr),
|
||||||
ntohs(addr.sin_port),
|
ntohs(addr.sin_port),
|
||||||
sndrcvinfo.sinfo_assoc_id,
|
sndrcvinfo.sinfo_assoc_id,
|
||||||
sndrcvinfo.sinfo_stream,
|
sndrcvinfo.sinfo_stream,
|
||||||
ntohl(sndrcvinfo.sinfo_ppid),
|
ntohl(sndrcvinfo.sinfo_ppid),
|
||||||
message_size,
|
message_size,
|
||||||
flags);
|
flags);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// handle now if complete message in one or more segments
|
// handle now if complete message in one or more segments
|
||||||
if ((flags & 0x80) == 0x80) {
|
if ((flags & 0x80) == 0x80 || !vnf->sctp) {
|
||||||
// printf("\nVNF RECEIVES:\n");
|
// printf("\nVNF RECEIVES:\n");
|
||||||
// for(int i=0; i<message_size; i++){
|
// for(int i=0; i<message_size; i++){
|
||||||
// printf("%d", read_buffer[i]);
|
// printf("%d", read_buffer[i]);
|
||||||
// }
|
// }
|
||||||
// printf("\n");
|
// printf("\n");
|
||||||
|
|
||||||
vnf_nr_handle_p4_p5_message(read_buffer, message_size, pnf->p5_idx, config);
|
vnf_nr_handle_p4_p5_message(read_buffer, message_size, pnf->p5_idx, config);
|
||||||
} else {
|
} else {
|
||||||
NFAPI_TRACE(NFAPI_TRACE_WARN, "sctp_recvmsg: unhandled mode with flags 0x%x\n", flags);
|
NFAPI_TRACE(NFAPI_TRACE_WARN, "sctp_recvmsg: unhandled mode with flags 0x%x\n", flags);
|
||||||
|
|
||||||
// assume socket disconnected
|
// assume socket disconnected
|
||||||
NFAPI_TRACE(NFAPI_TRACE_WARN, "Disconnected socket\n");
|
NFAPI_TRACE(NFAPI_TRACE_WARN, "Disconnected socket\n");
|
||||||
socket_connected = 0;
|
socket_connected = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1509,7 +1539,7 @@ int vnf_read_dispatch_message(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_t*
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vnf_send_p5_msg(nfapi_vnf_pnf_info_t* pnf, const void *msg, int len, uint8_t stream)
|
static int vnf_send_p5_msg(vnf_t *vnf, nfapi_vnf_pnf_info_t *pnf, const void *msg, int len, uint8_t stream)
|
||||||
{
|
{
|
||||||
// printf("\n MESSAGE SENT: \n");
|
// printf("\n MESSAGE SENT: \n");
|
||||||
// for(int i=0; i<len; i++){
|
// for(int i=0; i<len; i++){
|
||||||
@@ -1519,7 +1549,21 @@ static int vnf_send_p5_msg(nfapi_vnf_pnf_info_t* pnf, const void *msg, int len,
|
|||||||
|
|
||||||
//NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s len:%d stream:%d\n", __FUNCTION__, len, stream);
|
//NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s len:%d stream:%d\n", __FUNCTION__, len, stream);
|
||||||
|
|
||||||
int result = sctp_sendmsg(pnf->p5_sock, msg, len, (struct sockaddr*)&pnf->p5_pnf_sockaddr, sizeof(pnf->p5_pnf_sockaddr),1, 0, stream, 0, 4);
|
ssize_t result = -1;
|
||||||
|
if (vnf->sctp) {
|
||||||
|
result = sctp_sendmsg(pnf->p5_sock,
|
||||||
|
msg,
|
||||||
|
len,
|
||||||
|
(struct sockaddr *)&pnf->p5_pnf_sockaddr,
|
||||||
|
sizeof(pnf->p5_pnf_sockaddr),
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
stream,
|
||||||
|
0,
|
||||||
|
4);
|
||||||
|
} else {
|
||||||
|
result = send(pnf->p5_sock, msg, len,0);
|
||||||
|
}
|
||||||
|
|
||||||
if(result != len)
|
if(result != len)
|
||||||
{
|
{
|
||||||
@@ -1574,7 +1618,7 @@ bool vnf_nr_send_p5_message(vnf_t* vnf, uint16_t p5_idx, nfapi_nr_p4_p5_message_
|
|||||||
// printf(" msg->msg_buf[%d] = 0x%02x\n", i, ((uint8_t *) vnf->tx_message_buffer)[i]);
|
// printf(" msg->msg_buf[%d] = 0x%02x\n", i, ((uint8_t *) vnf->tx_message_buffer)[i]);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
return vnf_send_p5_msg(pnf, vnf->tx_message_buffer, packedMessageLength, 0);
|
return vnf_send_p5_msg(vnf, pnf, vnf->tx_message_buffer, packedMessageLength, 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() cannot find pnf info for p5_idx:%d\n", __FUNCTION__, p5_idx);
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() cannot find pnf info for p5_idx:%d\n", __FUNCTION__, p5_idx);
|
||||||
@@ -1599,7 +1643,7 @@ int vnf_pack_and_send_p5_message(vnf_t* vnf, uint16_t p5_idx, nfapi_p4_p5_messag
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return vnf_send_p5_msg(pnf, vnf->tx_message_buffer, packedMessageLength, 0/*msg->phy_id*/);
|
return vnf_send_p5_msg(vnf, pnf, vnf->tx_message_buffer, packedMessageLength, 0/*msg->phy_id*/);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1624,7 +1668,7 @@ int vnf_pack_and_send_p4_message(vnf_t* vnf, uint16_t p5_idx, nfapi_p4_p5_messag
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return vnf_send_p5_msg(pnf, vnf->tx_message_buffer, packedMessageLength, 0/*msg->phy_id*/);
|
return vnf_send_p5_msg(vnf, pnf, vnf->tx_message_buffer, packedMessageLength, 0/*msg->phy_id*/);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -237,7 +237,15 @@ int nfapi_nr_vnf_start(nfapi_vnf_config_t* config)
|
|||||||
close(p5ListenSock);
|
close(p5ListenSock);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
int error;
|
||||||
|
socklen_t len = sizeof(error);
|
||||||
|
|
||||||
|
if (getsockopt(p5ListenSock, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "After getsockopt errno: %d\n", errno);
|
||||||
|
close(p5ListenSock);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -359,6 +367,7 @@ int nfapi_nr_vnf_start(nfapi_vnf_config_t* config)
|
|||||||
|
|
||||||
|
|
||||||
// check the connection status
|
// check the connection status
|
||||||
|
if (vnf->sctp)
|
||||||
{
|
{
|
||||||
struct sctp_status status;
|
struct sctp_status status;
|
||||||
(void)memset(&status, 0, sizeof(struct sctp_status));
|
(void)memset(&status, 0, sizeof(struct sctp_status));
|
||||||
|
|||||||
Reference in New Issue
Block a user