1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /* This file contains all SCTP related functionality */
20 #include "common_def.h"
28 #include "du_app_mac_inf.h"
29 #include "du_e2ap_mgr.h"
33 #include "du_app_rlc_inf.h"
36 /* Global variable declaration */
37 uint8_t socket_type; /* Socket type */
38 bool nonblocking; /* Blocking/Non-blocking socket */
39 bool connUp; /* Is connection up */
41 CmInetNetAddrLst localAddrLst;
42 CmInetNetAddrLst remoteAddrLst;
43 /* Global variable declaration */
44 DuSctpDestCb f1Params; /* SCTP configurations at DU */
45 DuSctpDestCb ricParams; /* SCTP configurations at DU */
47 /**************************************************************************
48 * @brief Task Initiation callback function.
52 * Function : sctpActvInit
55 * This function is supplied as one of parameters during SCTP's
56 * task registration. SSI will invoke this function once, after
57 * it creates and attaches this TAPA Task to a system task.
59 * @param[in] Ent entity, the entity ID of this task.
60 * @param[in] Inst inst, the instance ID of this task.
61 * @param[in] Region region, the region ID registered for memory
63 * @param[in] Reason reason.
64 * @return ROK - success
66 ***************************************************************************/
67 uint8_t sctpActvInit(Ent entity, Inst inst, Region region, Reason reason)
69 DU_LOG("\n\nDEBUG --> SCTP : Initializing");
70 ODU_SET_PROC_ID(DU_PROC);
73 memset(&f1Params, 0, sizeof(DuSctpDestCb));
74 f1Params.assocId = -1;
75 memset(&ricParams, 0, sizeof(DuSctpDestCb));
76 ricParams.assocId = -1;
82 /**************************************************************************
83 * @brief Function prints src, dest, msg infor about all the msgs that received.
87 * Function : callFlowSctpActvTsk
89 * Function prints src, dest, msg infor about all the msgs that received
91 * @param[in] Pst *pst, Post structure of the primitive.
94 ***************************************************************************/
95 void callFlowSctpActvTsk(Pst *pst)
98 char destTask[50]="ENTSCTP";
105 strcpy(sourceTask,"ENTDUAPP");
110 strcpy(message,"EVTSTARTPOLL");
117 DU_LOG("\nCall Flow: %s -> %s : %s\n", sourceTask, destTask, message);
120 /**************************************************************************
121 * @brief Task Activation callback function.
125 * Function : sctpActvTsk
128 * This function handles all SCTP messages received
129 * This API is registered with SSI during the
130 * Task Registration of DU APP.
132 * @param[in] Pst *pst, Post structure of the primitive.
133 * @param[in] Buffer *mBuf, Packed primitive parameters in the
135 * @return ROK - success
138 ***************************************************************************/
139 uint8_t sctpActvTsk(Pst *pst, Buffer *mBuf)
142 #ifdef CALL_FLOW_DEBUG_LOG
143 callFlowSctpActvTsk(pst);
165 /*******************************************************************
167 * @brief Checks the status of the received information
171 * Function : duCheckReqStatus
174 * Checks the status of the received information
176 * @params[in] Confirm status
177 * @return ROK - success
180 ******************************************************************/
181 uint8_t duCheckReqStatus(CmStatus *cfm)
184 if(cfm->status != LCM_PRIM_OK)
186 DU_LOG("\nERROR --> DU_APP : Failed to process the request successfully");
192 /**************************************************************************
193 * @brief Function to configure the Sctp Params during config Request
197 * Function : duSctpCfgReq
200 * This function configures SCTP Params during the config Request
202 * @param[in] SctpParams sctpCfg, common structure which has all the configuration
203 * @param[in] CmStatus cfm, Builds the cfm status and reason
206 * @return ROK - success
209 ***************************************************************************/
211 uint8_t duSctpCfgReq(SctpParams sctpCfg)
216 #ifdef CALL_FLOW_DEBUG_LOG
217 DU_LOG("\nCall Flow: ENTDUAPP -> ENTSCTP : EVENT_CFG_REQ_TO_SCTP\n");
220 f1Params.destIpAddr.ipV4Pres = sctpCfg.cuIpAddr.ipV4Pres;
221 f1Params.destIpAddr.ipV4Addr = sctpCfg.cuIpAddr.ipV4Addr;
222 f1Params.destPort = sctpCfg.cuPort;
223 f1Params.itfState = DU_SCTP_DOWN;
224 f1Params.srcPort = sctpCfg.duPort[F1_INTERFACE];
225 f1Params.recvMsgSet = ROK;
226 memset (&f1Params.sockFd, -1, sizeof(CmInetFd));
227 fillDestNetAddr(&f1Params.destIpNetAddr, &f1Params.destIpAddr);
228 fillAddrLst(&f1Params.destAddrLst, &f1Params.destIpAddr);
230 /* Fill RIC Params */
231 ricParams.destIpAddr.ipV4Pres = sctpCfg.ricIpAddr.ipV4Pres;
232 ricParams.destIpAddr.ipV4Addr = sctpCfg.ricIpAddr.ipV4Addr;
233 ricParams.destPort = sctpCfg.ricPort;
234 ricParams.itfState = DU_SCTP_DOWN;
235 ricParams.srcPort = sctpCfg.duPort[E2_INTERFACE];
236 ricParams.recvMsgSet = ROK;
237 memset (&ricParams.sockFd, -1, sizeof(CmInetFd));
238 fillDestNetAddr(&ricParams.destIpNetAddr, &ricParams.destIpAddr);
239 fillAddrLst(&ricParams.destAddrLst, &ricParams.destIpAddr);
241 /* Fill AddressList */
242 fillAddrLst(&localAddrLst, &sctpCfg.duIpAddr);
244 /* Set polling to FALSE */
245 pollingState = FALSE;
247 /* Fill Cfm Status */
248 cfm.status = LCM_PRIM_OK;
249 cfm.reason = LCM_REASON_NOT_APPL;
251 ret = duCheckReqStatus(&cfm);
256 /*******************************************************************
258 * @brief Fills the address List of the source Ip Address
262 * Function : fillAddrLst
265 * Fills the address List of source Ip Address
267 * @params[in] CmInetNetAddrLst *addrLstPtr, Address List pointer
268 * @params[in] F1IpAddr *srcIpAddr, src Ip Adrress to be filled in the Address List
270 * @return ROK - success
273 ******************************************************************/
275 uint8_t fillAddrLst(CmInetNetAddrLst *addrLstPtr, F1IpAddr *ipAddr)
278 addrLstPtr->addrs[(addrLstPtr->count - 1)].type = CM_INET_IPV4ADDR_TYPE;
279 addrLstPtr->addrs[(addrLstPtr->count - 1)].u.ipv4NetAddr = CM_INET_NTOH_UINT32(ipAddr->ipV4Addr);
284 /******************************************************************************
286 * @brief Fills the address List of the source Ip Address
290 * Function : fillDestNetAddr
293 * Fills the address List of destinatoion Ip Address
295 * @params[in] CmInetNetAddr *destAddrPtr, Address List pointer
296 * @params[in] F1IpAddr *dstIpAddr, destIp Address to be filled in the Address List
298 * @return ROK - success
301 *******************************************************************************/
302 uint8_t fillDestNetAddr(CmInetNetAddr *destAddrPtr, F1IpAddr *dstIpPtr)
304 /* Filling destination address */
305 destAddrPtr->type = CM_INET_IPV4ADDR_TYPE;
306 destAddrPtr->u.ipv4NetAddr = CM_INET_NTOH_UINT32(dstIpPtr->ipV4Addr);
310 /******************************************************************************
312 * @brief Establishes the Assoc Req for the received interface type
316 * Function : establishAssocReq
319 * Eastablishes the Assoc Req for the received interface type
321 * @params[in] DuSctpDestCb *paramPtr
323 * @return ROK - success
326 *******************************************************************************/
328 uint8_t establishReq(DuSctpDestCb *paramPtr)
332 socket_type = CM_INET_STREAM;
334 if((ret = cmInetSocket(socket_type, ¶mPtr->sockFd, IPPROTO_SCTP)) != ROK)
336 DU_LOG("\nERROR --> SCTP : Failed while opening a socket in ODU");
338 else if((ret = cmInetSctpBindx(¶mPtr->sockFd, &localAddrLst, paramPtr->srcPort)) != ROK)
340 DU_LOG("\nERROR --> SCTP: Failed during Binding in ODU");
342 else if((ret = sctpSetSockOpts(¶mPtr->sockFd)) != ROK)
344 DU_LOG("\nERROR --> SCTP : Failed to set Socket Opt in ODU");
350 DU_LOG("\nERROR --> SCTP : Failed while establishing Req at DU");
355 ret = cmInetSctpConnectx(¶mPtr->sockFd, ¶mPtr->destIpNetAddr, ¶mPtr->destAddrLst, paramPtr->destPort);
356 /* 115 error_code indicates that Operation is in progress and hence ignored if SctpConnect failed due to this */
363 if((ret == ROK) & (paramPtr->itfState == DU_SCTP_DOWN))
365 paramPtr->itfState = DU_SCTP_CONNECTING;
368 /* Post the EVTSTARTPOLL Msg */
372 duFillSctpPst(&pst, EVTSTARTPOLL);
378 /******************************************************************************
380 * @brief Processes the assoc Req for the received interface type
384 * Function : duSctpAssocReq
387 * Processes the Assoc Req for the received interface type
389 * @params[in] itfType interface Type,
390 * @params[in] cfm , represents the status of request
392 * @return ROK - success
395 *******************************************************************************/
397 uint8_t duSctpAssocReq(uint8_t itfType)
401 DuSctpDestCb *paramPtr = NULLP;
403 #ifdef CALL_FLOW_DEBUG_LOG
404 DU_LOG("\nCall Flow: ENTDUAPP -> ENTSCTP : EVENT_ASSOC_REQ_TO_SCTP\n");
407 DU_ALLOC(paramPtr, sizeof(DuSctpDestCb));
408 if(paramPtr == NULLP)
410 DU_LOG("\nERROR --> DU_APP : Failed to allocate memory");
417 paramPtr = &f1Params;
418 ret = establishReq(paramPtr);
423 paramPtr = &ricParams;
424 ret = establishReq(paramPtr);
429 DU_LOG("\nERROR --> SCTP : Invalid Interface Type %d", itfType);
435 DU_LOG("\nERROR --> SCTP : ASSOC Req Failed.");
436 cfm.status = LCM_PRIM_NOK;
437 cfm.reason = LCM_REASON_NOT_APPL;
441 cfm.status = LCM_PRIM_OK;
442 cfm.reason = LCM_REASON_NOT_APPL;
444 ret = duCheckReqStatus(&cfm);
448 /*******************************************************************
450 * @brief Fills Pst struct for ENTSCTP
454 * Function : duFillSctpPst
457 * Fills Pst struct for ENTSCTP
460 * @return ROK - success
463 * ****************************************************************/
464 uint8_t duFillSctpPst(Pst *pst, Event event)
467 if(ODU_GET_MSG_BUF(DFLT_REGION, DU_POOL, &mBuf) != ROK)
469 DU_LOG("\nERROR --> DU_APP : Failed to allocate memory");
472 memset(pst, 0, sizeof(Pst));
473 pst->srcEnt = (Ent)ENTDUAPP;
474 pst->srcInst = (Inst)DU_INST;
475 pst->srcProcId = DU_PROC;
476 pst->dstEnt = (Ent)ENTSCTP;
477 pst->dstInst = (Inst)SCTP_INST;
478 pst->dstProcId = pst->srcProcId;
480 pst->selector = ODU_SELECTOR_LC;
482 ODU_POST_TASK(pst, mBuf);
487 /*******************************************************************
489 * @brief Sets socket options as per requirement
493 * Function : sctpSetSockOpts
496 * Sets socket options as per requirement
498 * @params[in] sock_Fd determines the sockFd to be set
499 * @return ROK - success
502 * ****************************************************************/
503 uint8_t sctpSetSockOpts(CmInetFd *sock_Fd)
506 CmSctpEvent sctpEvent;
508 sctpEvent.dataIoEvent = TRUE;
509 sctpEvent.associationEvent = TRUE;
510 sctpEvent.addressEvent = TRUE;
511 sctpEvent.sendFailureEvent = TRUE;
512 sctpEvent.peerErrorEvent = TRUE;
513 sctpEvent.shutdownEvent = TRUE;
514 sctpEvent.partialDeliveryEvent = TRUE;
515 sctpEvent.adaptationLayerEvent = TRUE;
517 if((ret = cmInetSetOpt(sock_Fd, CM_SOCKOPT_LEVEL_SCTP, CM_SOCKOPT_OPT_SCTP_EVENTS, &sctpEvent) != ROK))
525 /*******************************************************************
527 * @brief Post received data/notification to DU APP
531 * Function : sendToDuApp
534 * Post received data/notification to DU APP
536 * @params[in] Message buffer
539 * @return ROK - success
542 * ****************************************************************/
543 void sendToDuApp(Buffer *mBuf, Event event)
546 DU_LOG("\nDEBUG --> SCTP : Forwarding received message to duApp");
547 ODU_PRINT_MSG(mBuf, 0, 0);
550 memset(&(pst), 0, sizeof(Pst));
551 pst.srcEnt = (Ent)ENTSCTP;
552 pst.srcInst = (Inst)SCTP_INST;
553 pst.srcProcId = DU_PROC;
554 pst.dstEnt = (Ent)ENTDUAPP;
555 pst.dstInst = (Inst)DU_INST;
556 pst.dstProcId = pst.srcProcId;
558 pst.selector = ODU_SELECTOR_LC;
560 pst.region = DFLT_REGION;
562 if (ODU_POST_TASK(&pst, mBuf) != ROK)
564 DU_LOG("\nERROR --> SCTP : ODU_POST_TASK failed in duReadCfg");
568 /*******************************************************************
570 * @brief Handles an SCTP notification message
573 * Function : sctpNtfyHdlr
576 * Handles an SCTP notification message
578 * @params[in] Notify message
580 * @return ROK - success
583 * ****************************************************************/
584 uint8_t sctpNtfyHdlr(CmInetSctpNotification *ntfy, uint8_t *itfState, uint8_t interface)
588 switch(ntfy->header.nType)
590 case CM_INET_SCTP_ASSOC_CHANGE :
591 DU_LOG("\nDEBUG --> SCTP : Assoc change notification received");
592 switch(ntfy->u.assocChange.state)
594 case CM_INET_SCTP_COMM_UP:
595 DU_LOG("INFO --> Event : COMMUNICATION UP");
596 *itfState = DU_SCTP_UP;
598 case CM_INET_SCTP_COMM_LOST:
599 DU_LOG("INFO --> Event : COMMUNICATION LOST");
600 *itfState = DU_SCTP_DOWN;
602 case CM_INET_SCTP_RESTART:
603 DU_LOG("INFO --> Event : SCTP RESTART");
604 *itfState = DU_SCTP_DOWN;
606 case CM_INET_SCTP_SHUTDOWN_COMP: /* association gracefully shutdown */
607 DU_LOG("INFO --> Event : SHUTDOWN COMPLETE");
608 *itfState = DU_SCTP_DOWN;
610 case CM_INET_SCTP_CANT_STR_ASSOC:
611 DU_LOG("INFO --> Event : CANT START ASSOC");
612 *itfState = DU_SCTP_DOWN;
615 DU_LOG("\nERROR --> Invalid event %d", ntfy->u.assocChange.state);
619 case CM_INET_SCTP_PEER_ADDR_CHANGE :
620 DU_LOG("\nINFO --> SCTP : Peer Address Change notificarion received");
621 /* Need to add handler */
623 case CM_INET_SCTP_REMOTE_ERROR :
624 DU_LOG("\nINFO --> SCTP : Remote Error notification received");
626 case CM_INET_SCTP_SEND_FAILED :
627 DU_LOG("\nINFO --> SCTP : Send Failed notification received\n");
629 case CM_INET_SCTP_SHUTDOWN_EVENT : /* peer socket gracefully closed */
631 DU_LOG("\nINFO --> SCTP : Shutdown Event notification received\n");
632 *itfState = DU_SCTP_DOWN;
638 removeE2NodeInformation();
645 case CM_INET_SCTP_ADAPTATION_INDICATION :
646 DU_LOG("\nINFO --> SCTP : Adaptation Indication received\n");
648 case CM_INET_SCTP_PARTIAL_DELIVERY_EVENT:
649 DU_LOG("\nINFO --> SCTP : Partial Delivery Event received\n");
652 DU_LOG("\nERROR --> SCTP : Invalid sctp notification type %d", ntfy->header.nType);
656 /* Pack notification and send to APP */
657 DU_LOG("\nDEBUG --> SCTP : Forwarding received message to duApp");
659 memset(&(pst), 0, sizeof(Pst));
660 pst.srcEnt = (Ent)ENTSCTP;
661 pst.srcInst = (Inst)SCTP_INST;
662 pst.srcProcId = DU_PROC;
663 pst.dstEnt = (Ent)ENTDUAPP;
664 pst.dstInst = (Inst)DU_INST;
665 pst.dstProcId = pst.srcProcId;
666 pst.event = EVENT_SCTP_NTFY;
667 pst.selector = ODU_SELECTOR_LC;
669 pst.region = DU_APP_MEM_REGION;
671 if(cmPkSctpNtfy(&pst, ntfy) != ROK)
673 DU_LOG("\nERROR --> SCTP : Failed to pack SCTP notification");
679 /*******************************************************************
681 * @brief checks for valid readFd and process the InetSctpRecvMsg
686 * Function : processPolling
689 * checks for valid readFd and process the InetSctpRecvMsg
692 * @params[in] Params required for polling
693 * @params[in] SockFd for file descriptor
694 * @params[in] timeoutPtr indicates the timeout value
695 * @params[in] MemInfo, recvMsgSet
697 * @return ROK - success
700 * ****************************************************************/
702 uint8_t processPolling(sctpSockPollParams *pollParams, CmInetFd *sockFd, uint32_t *timeoutPtr, CmInetMemInfo *memInfo, bool recvMsgSet)
705 CM_INET_FD_SET(sockFd, &pollParams->readFd);
706 ret = cmInetSelect(&pollParams->readFd, NULLP, timeoutPtr, (int16_t *)&pollParams->numFd);
707 if(CM_INET_FD_ISSET(sockFd, &pollParams->readFd))
709 CM_INET_FD_CLR(sockFd, &pollParams->readFd);
710 ret = cmInetSctpRecvMsg(sockFd, &pollParams->addr, &pollParams->port, memInfo, &(pollParams->mBuf), &pollParams->bufLen, &pollParams->info, &pollParams->flag, &pollParams->ntfy);
714 DU_LOG("\nERROR --> SCTP: Failed to receive sctp msg for sockFd[%d]\n", sockFd->fd);
715 recvMsgSet = RFAILED;
719 #ifdef CALL_FLOW_DEBUG_LOG
720 if(pollParams->port == f1Params.destPort)
721 DU_LOG("\nCall Flow: CU -> ENTSCTP : EVENT_SCTP_MSG\n");
723 DU_LOG("\nCall Flow: RIC -> ENTSCTP : EVENT_SCTP_MSG\n");
725 if((((pollParams->flag & CM_INET_SCTP_MSG_NOTIFICATION) != 0)) && ret == ROK)
727 if(pollParams->port == f1Params.destPort)
729 f1Params.assocId = pollParams->ntfy.u.assocChange.assocId;
730 DU_LOG("\nDEBUG --> SCTP : AssocId assigned to F1Params from PollParams [%d]\n", f1Params.assocId);
731 ret = sctpNtfyHdlr(&pollParams->ntfy, &f1Params.itfState, F1_INTERFACE);
733 else if(pollParams->port == ricParams.destPort)
735 ricParams.assocId = pollParams->ntfy.u.assocChange.assocId;
736 DU_LOG("\nDEBUG --> SCTP : AssocId assigned to ricParams from PollParams [%d]\n", ricParams.assocId);
737 ret = sctpNtfyHdlr(&pollParams->ntfy, &ricParams.itfState, E2_INTERFACE);
741 DU_LOG("\nERROR --> SCTP : Failed to fill AssocId\n");
746 DU_LOG("\nERROR --> SCTP : Failed to process sctp notify msg\n");
749 else if(f1Params.itfState & (pollParams->port == f1Params.destPort))
751 sendToDuApp(pollParams->mBuf, EVENT_CU_DATA);
753 else if(ricParams.itfState & (pollParams->port == ricParams.destPort))
755 sendToDuApp(pollParams->mBuf, EVENT_RIC_DATA);
760 ODU_PUT_MSG_BUF(pollParams->mBuf);
766 /*******************************************************************
768 * @brief Receives message on the socket
772 * Function : sctpSockPoll
775 * Receives message on the socket
778 * @return ROK - success
781 * ****************************************************************/
782 uint8_t sctpSockPoll()
786 uint32_t *timeout_Ptr;
787 CmInetMemInfo memInfo;
788 sctpSockPollParams f1PollParams, e2PollParams;
790 memset(&f1PollParams, 0, sizeof(sctpSockPollParams));
791 memset(&e2PollParams, 0, sizeof(sctpSockPollParams));
793 if (f1Params.sockFd.blocking & ricParams.sockFd.blocking)
802 timeout_Ptr = &timeout;
804 memInfo.region = DU_APP_MEM_REGION;
805 memInfo.pool = DU_POOL;
807 CM_INET_FD_ZERO(&f1PollParams.readFd);
808 CM_INET_FD_ZERO(&e2PollParams.readFd);
810 DU_LOG("\nINFO --> SCTP : Polling started at DU\n");
813 if(f1Params.itfState)
815 if((ret = processPolling(&f1PollParams, &f1Params.sockFd, timeout_Ptr, &memInfo, f1Params.recvMsgSet)) != ROK)
817 DU_LOG("\nERROR --> SCTP : Failed to RecvMsg for F1\n");
820 if(ricParams.itfState)
822 if((ret = processPolling(&e2PollParams, &ricParams.sockFd, timeout_Ptr, &memInfo, ricParams.recvMsgSet)) != ROK)
824 DU_LOG("\nERROR --> SCTP : Failed to RecvMsg for E2\n");
829 }/* End of sctpSockPoll() */
831 /*******************************************************************
833 * @brief Send message on SCTP socket
837 * Function : sctpSend
840 * Send message on SCTP socket
843 * @return ROK - success
846 * ****************************************************************/
847 uint8_t sctpSend(Buffer *mBuf, uint8_t itfType)
850 MsgLen len =0; /* number of actually sent octets */
851 CmInetMemInfo memInfo;
853 memInfo.region = DU_APP_MEM_REGION;
854 memInfo.pool = DU_POOL;
856 #ifdef CALL_FLOW_DEBUG_LOG
857 if(itfType == F1_INTERFACE)
859 DU_LOG("\nCall Flow: ENTDUAPP -> ENTSCTP : EVENT_F1AP_MSG_TO_SCTP\n");
863 DU_LOG("\nCall Flow: ENTDUAPP -> ENTSCTP : EVENT_E2AP_MSG_TO_SCTP\n");
867 if(itfType == F1_INTERFACE)
869 DU_LOG("\nDEBUG --> SCTP : sending the message to CU");
870 #ifdef CALL_FLOW_DEBUG_LOG
871 DU_LOG("\nCall Flow: ENTSCTP -> CU : EVENT_F1AP_MSG_TO_CU\n");
873 ret = cmInetSctpSendMsg(&f1Params.sockFd, &f1Params.destIpNetAddr, f1Params.destPort, &memInfo, mBuf, &len, 0, FALSE, 0, 0/*SCT_PROTID_NONE*/, RWOULDBLOCK);
876 if(itfType == E2_INTERFACE)
878 DU_LOG("\nDEBUG --> SCTP : sending the message to ric");
879 #ifdef CALL_FLOW_DEBUG_LOG
880 DU_LOG("\nCall Flow: ENTSCTP -> RIC : EVENT_E2AP_MSG_TO_RIC\n");
882 ret = cmInetSctpSendMsg(&ricParams.sockFd, &ricParams.destIpNetAddr, ricParams.destPort, &memInfo, mBuf, &len, 0, FALSE, 0, 0/*SCT_PROTID_NONE*/, RWOULDBLOCK);
885 if(ret != ROK && ret != RWOULDBLOCK)
887 DU_LOG("\nERROR --> SCTP : Failed sending the message");
892 } /* End of sctpSend */
894 /**********************************************************************
896 **********************************************************************/