diff --git a/nfapi/open-nFAPI/pnf/src/pnf.c b/nfapi/open-nFAPI/pnf/src/pnf.c index 7ed881f7e3..e6fb69bd71 100644 --- a/nfapi/open-nFAPI/pnf/src/pnf.c +++ b/nfapi/open-nFAPI/pnf/src/pnf.c @@ -1935,7 +1935,20 @@ int pnf_connect(pnf_t* pnf) 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"); return socketConnected; @@ -2132,15 +2145,23 @@ int pnf_nr_read_dispatch_message(pnf_t* pnf) { int flags = MSG_PEEK; - message_size = sctp_recvmsg(pnf->p5_sock, - header_buffer, - header_buffer_size, - /*(struct sockaddr*)&addr, &addr_len*/ 0, - 0, - &sndrcvinfo, - &flags); + if (pnf->sctp) { + message_size = sctp_recvmsg(pnf->p5_sock, + header_buffer, + header_buffer_size, + /*(struct sockaddr*)&addr, &addr_len*/ + 0, + 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); return 0; } @@ -2172,8 +2193,20 @@ int pnf_nr_read_dispatch_message(pnf_t* pnf) int flags = 0; (void)memset(&sndrcvinfo, 0, sizeof(struct sctp_sndrcvinfo)); - int recvmsg_result = - sctp_recvmsg(pnf->p5_sock, read_buffer, message_size, (struct sockaddr*)&addr, &addr_len, &sndrcvinfo, &flags); + ssize_t recvmsg_result = 0; + 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) { NFAPI_TRACE(NFAPI_TRACE_INFO, "Failed to read sctp message size errno:%d\n", errno); } else { @@ -2204,7 +2237,7 @@ int pnf_nr_read_dispatch_message(pnf_t* pnf) */ // 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); } else { NFAPI_TRACE(NFAPI_TRACE_WARN, "sctp_recvmsg: unhandled mode with flags 0x%x\n", flags); diff --git a/nfapi/open-nFAPI/vnf/src/vnf.c b/nfapi/open-nFAPI/vnf/src/vnf.c index baac137512..757a4e7d68 100644 --- a/nfapi/open-nFAPI/vnf/src/vnf.c +++ b/nfapi/open-nFAPI/vnf/src/vnf.c @@ -32,6 +32,9 @@ #include "nfapi/oai_integration/aerial/fapi_vnf_p5.h" #include "nr_fapi_p5.h" #endif + +#include + #include "nfapi/oai_integration/vendor_ext.h" 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); if (result) { - + 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); - + if(msg.nfapi_config.p7_pnf_address_ipv4.tl.tag) { struct sockaddr_in sockAddr; - + (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)); - + // store address phy_info->p7_pnf_address.sin_addr = sockAddr.sin_addr; } - + if(msg.nfapi_config.p7_pnf_address_ipv6.tl.tag) { 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); 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) { NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF P7 Port: %d\n", msg.nfapi_config.p7_pnf_port.value); - + // store port 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) { int socket_connected = 1; - + vnf_t *vnf = (vnf_t *)(config); // 1. Peek the message header // 2. If the message is larger than the stack buffer then create a dynamic 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; - message_size = - sctp_recvmsg(pnf->p5_sock, header_buffer, header_buffer_size, (struct sockaddr*)&addr, &addr_len, &sndrcvinfo, &flags); + if (vnf->sctp) { + 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) { 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; (void)memset(&sndrcvinfo, 0, sizeof(struct sctp_sndrcvinfo)); - int recvmsg_result = - sctp_recvmsg(pnf->p5_sock, read_buffer, message_size, (struct sockaddr*)&addr, &addr_len, &sndrcvinfo, &flags); + ssize_t recvmsg_result = 0; + 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) { NFAPI_TRACE(NFAPI_TRACE_INFO, "Failed to read sctp message size errno:%d\n", errno); } else { @@ -1338,34 +1368,34 @@ int vnf_nr_read_dispatch_message(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_ // todo - handle the events } 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", - pnf->p5_sock, - inet_ntoa(addr.sin_addr), - ntohs(addr.sin_port), - sndrcvinfo.sinfo_assoc_id, - sndrcvinfo.sinfo_stream, - ntohl(sndrcvinfo.sinfo_ppid), - message_size, - flags); - */ + /* + 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, + inet_ntoa(addr.sin_addr), + ntohs(addr.sin_port), + sndrcvinfo.sinfo_assoc_id, + sndrcvinfo.sinfo_stream, + ntohl(sndrcvinfo.sinfo_ppid), + message_size, + flags); + */ - // handle now if complete message in one or more segments - if ((flags & 0x80) == 0x80) { - // printf("\nVNF RECEIVES:\n"); - // for(int i=0; isctp) { + // printf("\nVNF RECEIVES:\n"); + // for(int i=0; ip5_idx, config); - } else { - NFAPI_TRACE(NFAPI_TRACE_WARN, "sctp_recvmsg: unhandled mode with flags 0x%x\n", flags); + vnf_nr_handle_p4_p5_message(read_buffer, message_size, pnf->p5_idx, config); + } else { + NFAPI_TRACE(NFAPI_TRACE_WARN, "sctp_recvmsg: unhandled mode with flags 0x%x\n", flags); - // assume socket disconnected - NFAPI_TRACE(NFAPI_TRACE_WARN, "Disconnected socket\n"); - socket_connected = 0; - } + // assume socket disconnected + NFAPI_TRACE(NFAPI_TRACE_WARN, "Disconnected socket\n"); + 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"); // for(int i=0; ip5_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) { @@ -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]); // } - 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 { 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 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 { @@ -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 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 { diff --git a/nfapi/open-nFAPI/vnf/src/vnf_interface.c b/nfapi/open-nFAPI/vnf/src/vnf_interface.c index d964e5b9dc..9eccb45acb 100644 --- a/nfapi/open-nFAPI/vnf/src/vnf_interface.c +++ b/nfapi/open-nFAPI/vnf/src/vnf_interface.c @@ -237,7 +237,15 @@ int nfapi_nr_vnf_start(nfapi_vnf_config_t* config) close(p5ListenSock); 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 + if (vnf->sctp) { struct sctp_status status; (void)memset(&status, 0, sizeof(struct sctp_status));