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 EGTP related functionality */
21 #include "common_def.h"
22 #include "cu_stub_egtp.h"
25 /* Global variable declaration */
28 /**************************************************************************
29 * @brief Task Initiation callback function.
33 * Function : egtpActvInit
36 * This function is supplied as one of parameters during EGTP's
37 * task registration. SSI will invoke this function once, after
38 * it creates and attaches this TAPA Task to a system task.
40 * @param[in] Ent entity, the entity ID of this task.
41 * @param[in] Inst inst, the instance ID of this task.
42 * @param[in] Region region, the region ID registered for memory
44 * @param[in] Reason reason.
45 * @return ROK - success
47 ***************************************************************************/
50 DU_LOG("\n\nEGTP : Initializing");
51 cmMemset ((U8 *)&egtpCb, 0, sizeof(EgtpGlobalCb));
52 protType = CM_INET_PROTO_UDP;
57 /**************************************************************************
58 * @brief Task Activation callback function.
62 * Function : egtpActvTsk
65 * This function handles all EGTP messages received
66 * This API is registered with SSI during the
67 * Task Registration of DU APP.
69 * @param[in] Pst *pst, Post structure of the primitive.
70 * @param[in] Buffer *mBuf, Packed primitive parameters in the
72 * @return ROK - success
75 ***************************************************************************/
84 DU_LOG("\nEGTP : Configuration failed");
88 ret = cuEgtpSrvOpenReq();
91 DU_LOG("\nEGTP : Transport server open request failed");
95 tnlEvt.action = EGTP_TNL_MGMT_ADD;
98 ret = cuEgtpTnlMgmtReq(tnlEvt);
101 DU_LOG("\n EGTP : Tunnel management request failed");
109 /**************************************************************************
110 * @brief EGTP server configuration
114 * Function : egtpCfgReq
117 * This function handles EGTP configuration request.
119 * @return ROK - success
122 * ***********************************************************************/
127 cmMemcpy((U8 *)&egtpCb.egtpCfg, (U8 *)&cuCfgParams.egtpParams, (PTR)sizeof(EgtpParams));
129 egtpCb.recvTptSrvr.addr.address = CM_INET_NTOH_U32(egtpCb.egtpCfg.localIp.ipV4Addr);
130 egtpCb.recvTptSrvr.addr.port = EGTP_DFLT_PORT;
132 egtpCb.dstCb.dstIp = CM_INET_NTOH_U32(egtpCb.egtpCfg.destIp.ipV4Addr);
133 egtpCb.dstCb.dstPort = egtpCb.egtpCfg.destPort;
134 egtpCb.dstCb.sendTptSrvr.addr.address = CM_INET_NTOH_U32(egtpCb.egtpCfg.localIp.ipV4Addr);
135 egtpCb.dstCb.sendTptSrvr.addr.port = egtpCb.egtpCfg.localPort;
136 egtpCb.dstCb.numTunn = 0;
138 ret = cmHashListInit(&(egtpCb.dstCb.teIdLst), 1024, sizeof(EgtpTeIdCb), FALSE, CM_HASH_KEYTYPE_U32MOD, CU_APP_MEM_REG, CU_POOL);
142 DU_LOG("\nEGTP : TeId hash list initialization failed");
147 DU_LOG("\nEGTP : Configuration successful");
153 /**************************************************************************
154 * @brief EGTP server open request
158 * Function : egtpSrvOpenReq
161 * This function handles EGTP open server request.
162 * It opens udp socket to receive/send msgs.
164 * @param[in] Pst *pst, post structure
165 * @return ROK - success
168 ***************************************************************************/
170 S16 cuEgtpSrvOpenReq(Pst *pst)
175 DU_LOG("\nEGTP : Received open server request");
177 sockType = CM_INET_DGRAM;
178 if(ret = (cmInetSocket(sockType, &(egtpCb.recvTptSrvr.sockFd), protType)) != ROK)
180 DU_LOG("\nEGTP : Failed to open UDP socket");
184 ret = cmInetBind(&(egtpCb.recvTptSrvr.sockFd), &(egtpCb.recvTptSrvr.addr));
187 DU_LOG("\nEGTP : Failed to bind socket");
191 if(ret = (cmInetSocket(sockType, &(egtpCb.dstCb.sendTptSrvr.sockFd), protType)) != ROK)
193 DU_LOG("\nEGTP : Failed to open UDP socket");
197 ret = cmInetBind(&(egtpCb.dstCb.sendTptSrvr.sockFd), &(egtpCb.dstCb.sendTptSrvr.addr));
200 DU_LOG("\nEGTP : Failed to bind socket");
204 /* TODO: set socket options */
206 DU_LOG("\nEGTP : Receiver socket[%d] and Sender socket[%d] open", egtpCb.recvTptSrvr.sockFd.fd, egtpCb.dstCb.sendTptSrvr.sockFd.fd);
208 } /* cuEgtpSrvOpenReq */
211 /**************************************************************************
212 * @brief EGTP tunnel management request
216 * Function : cuEgtpTnlMgmtReq
219 * This function handles EGTP tunnel managament request
221 * @param[in] Pst *pst, post structure
222 * Tunnel Eveny structure
223 * @return ROK - success
227 * ***************************************************************************/
228 S16 cuEgtpTnlMgmtReq(EgtpTnlEvt tnlEvt)
232 DU_LOG("\nEGTP : Received tunnel management request");
233 switch(tnlEvt.action)
235 case EGTP_TNL_MGMT_ADD:
237 ret = cuEgtpTnlAdd(tnlEvt);
240 case EGTP_TNL_MGMT_MOD:
242 ret = cuEgtpTnlMod(tnlEvt);
245 case EGTP_TNL_MGMT_DEL:
247 ret = cuEgtpTnlDel(tnlEvt);
252 DU_LOG("\nEGTP : Invalid tunnel management action[%d]", tnlEvt.action);
260 /**************************************************************************
261 * @brief EGTP tunnel addition
265 * Function : cuEgtpTnlAdd
268 * This function handles EGTP tunnel addition
270 * @param[in] Tunnel Event structure
271 * @return ROK - success
274 * ***************************************************************************/
275 S16 cuEgtpTnlAdd(EgtpTnlEvt tnlEvt)
279 EgtpMsgHdr preDefHdr; /* pre-define header for this tunnel */
282 DU_LOG("\nEGTP : Tunnel addition : LocalTeid[%d] Remote Teid[%d]", tnlEvt.lclTeid, tnlEvt.remTeid);
284 CU_ALLOC(teidCb, (Size)sizeof(EgtpTeIdCb));
288 DU_LOG("\nEGTP : Memory allocation failed");
293 cmMemset((U8 *)teidCb, 0, sizeof(EgtpTeIdCb));
294 teidCb->teId = tnlEvt.lclTeid;
295 teidCb->remTeId = tnlEvt.remTeid;
297 ret = cmHashListInsert(&(egtpCb.dstCb.teIdLst), (PTR)teidCb, (U8 *)&(teidCb->teId), sizeof(U32));
300 DU_LOG("\nEGTP : Failed to insert in hash list");
301 CU_FREE(teidCb, (Size)sizeof(EgtpTeIdCb));
304 egtpCb.dstCb.numTunn++;
306 /* Encoding pre-defined header */
307 cmMemset((U8*)&preDefHdr, 0, sizeof(EgtpMsgHdr));
308 preDefHdr.msgType = EGTPU_MSG_GPDU;
309 preDefHdr.teId = teidCb->remTeId;
310 preDefHdr.extHdr.pdcpNmb.pres = FALSE;
311 preDefHdr.extHdr.udpPort.pres = FALSE;
312 preDefHdr.nPdu.pres = FALSE;
314 cuEgtpEncodeHdr((U8 *)teidCb->preEncodedHdr.hdr, &preDefHdr, &(teidCb->preEncodedHdr.cnt));
316 /* SPutSBuf(CU_APP_MEM_REG, CU_POOL, (Data *)teidCb, (Size)sizeof(EgtpTeIdCb));*/
321 /**************************************************************************
322 * @brief EGTP tunnel modification
326 * Function : cuEgtpTnlMod
329 * This function handles EGTP tunnel modification
331 * @param[in] Tunnel Event structure
332 * @return ROK - success
335 * ***************************************************************************/
336 S16 cuEgtpTnlMod(EgtpTnlEvt tnlEvt)
340 EgtpTeIdCb *teidCb = NULLP;
342 printf("\nTunnel modification : LocalTeid[%d] Remote Teid[%d]", tnlEvt.lclTeid, tnlEvt.remTeid);
344 cmHashListFind(&(egtpCb.dstCb.teIdLst), (U8 *)&(tnlEvt.teId), sizeof(U32), 0, (PTR *)&teidCb);
347 printf("\nTunnel id not found");
351 teidCb->teId = tnlEvt.lclTeid;
352 teidCb->remTeId = tnlEvt.remTeid;
357 /**************************************************************************
358 * @brief EGTP tunnel deletion
362 * Function : cuEgtpTnlDel
365 * This function handles EGTP tunnel deletion
367 * @param[in] Tunnel Event structure
368 * @return ROK - success
371 * ***************************************************************************/
372 S16 cuEgtpTnlDel(EgtpTnlEvt tnlEvt)
374 EgtpTeIdCb *teidCb = NULLP;
376 DU_LOG("\nEGTP : Tunnel deletion : Local Teid[%d] Remote Teid[%d]", tnlEvt.lclTeid, tnlEvt.remTeid);
378 cmHashListFind(&(egtpCb.dstCb.teIdLst), (U8 *)&(tnlEvt.lclTeid), sizeof(U32), 0, (PTR *)&teidCb);
381 DU_LOG("\nEGTP : Tunnel id[%d] not configured", tnlEvt.lclTeid);
385 cmHashListDelete(&(egtpCb.dstCb.teIdLst), (PTR)teidCb);
386 CU_FREE(teidCb, (Size)sizeof(EgtpTeIdCb));
387 egtpCb.dstCb.numTunn--;
392 /*******************************************************************
394 * @brief Encodes message header
398 * Function : cuEgtpEncodeHdr
401 * Encodes EGTP message haeder
403 * @params[in] EGTP message
405 * @return ROK - success
408 * ****************************************************************/
409 S16 cuEgtpEncodeHdr(U8 *preEncodedHdr, EgtpMsgHdr *preDefHdr, U8 *hdrIdx)
411 U8 tmpByte = 0; /* Stores one byte of data for enc */
412 U8 cnt = EGTP_MAX_HDR_LEN; /* Stores the position */
413 Bool extPres = FALSE; /* Flag for indication of S, E or P presense flag */
416 /* Encoding header */
417 tmpByte |= EGTP_MASK_BIT6; /* Setting 6th LSB of 1st byte as version */
418 tmpByte |= EGTP_MASK_BIT5; /* Setting 5th LSB of 1st byte as protocol type */
420 if(preDefHdr->extHdr.udpPort.pres || preDefHdr->extHdr.pdcpNmb.pres)
422 tmpByte |= EGTP_MASK_BIT3; /* Setting 3rd LSB of 1st byte if Extension heaeder is present */
425 if(preDefHdr->seqNum.pres)
427 tmpByte |= EGTP_MASK_BIT2;
430 if(preDefHdr->nPdu.pres)
432 tmpByte |= EGTP_MASK_BIT1;
435 if((tmpByte & EGTP_MASK_BIT1) || (tmpByte & EGTP_MASK_BIT2)||(tmpByte & EGTP_MASK_BIT3))
439 preEncodedHdr[--cnt] = tmpByte;
440 preEncodedHdr[--cnt] = preDefHdr->msgType;
442 /* Encode Tunnel endpoint */
443 preEncodedHdr[--cnt] = 0;
444 preEncodedHdr[--cnt] = 0;
445 nwWord = (U16)(GetHiWord(preDefHdr->teId));
446 preEncodedHdr[--cnt] = (U8)(GetHiByte(nwWord));
447 preEncodedHdr[--cnt] = (U8)(GetLoByte(nwWord));
448 nwWord = (U16)(GetLoWord(preDefHdr->teId));
449 preEncodedHdr[--cnt] = (U8)(GetHiByte(nwWord));
450 preEncodedHdr[--cnt] = (U8)(GetLoByte(nwWord));
452 /* Encode sequence number */
453 if(preDefHdr->seqNum.pres)
455 preEncodedHdr[--cnt] = GetHiByte(preDefHdr->seqNum.val);
456 preEncodedHdr[--cnt] = GetLoByte(preDefHdr->seqNum.val);
460 preEncodedHdr[--cnt] = 0;
461 preEncodedHdr[--cnt] = 0;
464 if(preDefHdr->nPdu.pres)
466 preEncodedHdr[--cnt] = preDefHdr->nPdu.val;
470 preEncodedHdr[--cnt] = 0;
473 if(preDefHdr->extHdr.udpPort.pres)
475 preEncodedHdr[--cnt] = EGTP_EXT_HDR_UDP_TYPE;
476 preEncodedHdr[--cnt] = 1;
477 preEncodedHdr[--cnt] = GetHiByte(preDefHdr->extHdr.udpPort.val);
478 preEncodedHdr[--cnt] = GetLoByte(preDefHdr->extHdr.udpPort.val);
481 if(preDefHdr->extHdr.pdcpNmb.pres)
483 preEncodedHdr[--cnt] = EGTP_EXT_HDR_PDCP_TYPE;
484 preEncodedHdr[--cnt] = 1;
485 preEncodedHdr[--cnt] = GetHiByte(preDefHdr->extHdr.pdcpNmb.val);
486 preEncodedHdr[--cnt] = GetLoByte(preDefHdr->extHdr.pdcpNmb.val);
489 if(tmpByte & EGTP_MASK_BIT3)
491 preEncodedHdr[--cnt] = 0;
495 preEncodedHdr[--cnt] = 0;
501 } /* egtpEncodeHdr */
503 S16 cuEgtpHdlRecvMsg(Buffer *mBuf)
505 /*Decoding of EGTP message header */
506 cuEgtpDecodeHdr(mBuf);
508 /* Start Pumping data from CU to DU */
509 return (cuEgtpDatReq());
513 S16 cuEgtpDecodeHdr(Buffer *mBuf)
516 S16 retVal = ROK; /* Holds the return value */
517 U8 tmpByte[5]; /* Holds one byte of data after Dec */
518 U8 version = 0; /* Holds the version type, decoded */
519 MsgLen msgLen = 0; /* Holds the msgLen from the Hdr */
520 MsgLen bufLen = 0; /* Holds the total buffer length */
521 U8 extHdrType = 0; /* Holds the Extension hdr type */
522 U8 extHdrLen = 0; /* Extension hdr length */
523 Bool extPres = FALSE; /* Flag for indication of S, E or P presense flag */
525 ODU_FIND_MSG_LEN(mBuf, &bufLen);
528 ODU_REM_PRE_MSG(&tmpByte[0], mBuf);
529 version = tmpByte[0] >> 5;
531 /* Decode message type */
532 ODU_REM_PRE_MSG((Data*)&(egtpMsg.msgHdr.msgType), mBuf);
534 /* Decode message length */
535 ODU_REM_PRE_MSG(&tmpByte[1], mBuf);
536 ODU_REM_PRE_MSG(&tmpByte[2], mBuf);
537 msgLen = (tmpByte[1] << 8) | tmpByte[2];
539 /* Decode tunnel id */
540 ODU_REM_PRE_MSG(&tmpByte[1], mBuf);
541 ODU_REM_PRE_MSG(&tmpByte[2], mBuf);
542 ODU_REM_PRE_MSG(&tmpByte[3], mBuf);
543 ODU_REM_PRE_MSG(&tmpByte[4], mBuf);
544 egtpMsg.msgHdr.teId = (tmpByte[1] << 24) | (tmpByte[2] << 16) | (tmpByte[3] << 8) | tmpByte[4];
546 if((tmpByte[0] & EGTP_MASK_BIT1) || (tmpByte[0] & EGTP_MASK_BIT2)||(tmpByte[0] & EGTP_MASK_BIT3))
551 /* Decode sequence number */
552 if ( tmpByte[0] & EGTP_MASK_BIT2 )
554 egtpMsg.msgHdr.seqNum.pres = TRUE;
555 ODU_REM_PRE_MSG(&tmpByte[1], mBuf);
556 ODU_REM_PRE_MSG(&tmpByte[2], mBuf);
557 egtpMsg.msgHdr.seqNum.val = (tmpByte[1] << 8) | tmpByte[2];
561 egtpMsg.msgHdr.seqNum.pres = 0;
562 ODU_REM_PRE_MSG(&tmpByte[1], mBuf);
563 ODU_REM_PRE_MSG(&tmpByte[2], mBuf);
564 egtpMsg.msgHdr.seqNum.val = (tmpByte[1] << 8) | tmpByte[2];
567 /* Decode N-PDU number */
568 if ( tmpByte[0] & EGTP_MASK_BIT1 )
570 egtpMsg.msgHdr.nPdu.pres = TRUE;
571 ODU_REM_PRE_MSG(&(egtpMsg.msgHdr.nPdu.val), mBuf);
575 egtpMsg.msgHdr.nPdu.pres = TRUE;
576 ODU_REM_PRE_MSG(&(egtpMsg.msgHdr.nPdu.val), mBuf);
579 if(extPres & EGTP_MASK_BIT1)
581 ODU_REM_PRE_MSG(&extHdrType, mBuf);
582 while( 0 != extHdrType)
586 case EGTP_EXT_HDR_UDP_TYPE:
588 ODU_REM_PRE_MSG(&extHdrLen, mBuf);
589 if(extHdrLen == 0x01)
591 egtpMsg.msgHdr.extHdr.udpPort.pres = TRUE;
592 ODU_REM_PRE_MSG(&tmpByte[1], mBuf);
593 ODU_REM_PRE_MSG(&tmpByte[2], mBuf);
594 egtpMsg.msgHdr.extHdr.udpPort.val = (tmpByte[1] << 8) | tmpByte[2];
599 case EGTP_EXT_HDR_PDCP_TYPE:
601 ODU_REM_PRE_MSG(&extHdrLen, mBuf);
602 if(extHdrLen == 0x01)
604 egtpMsg.msgHdr.extHdr.pdcpNmb.pres = TRUE;
605 ODU_REM_PRE_MSG(&tmpByte[1], mBuf);
606 ODU_REM_PRE_MSG(&tmpByte[2], mBuf);
607 egtpMsg.msgHdr.extHdr.pdcpNmb.val = (tmpByte[1] << 8) | tmpByte[2];
611 } /* End of switch */
613 ODU_REM_PRE_MSG(&extHdrType, mBuf);
616 } /* End of if(extPres & EGTP_MASK_BIT1) */
619 ODU_REM_PRE_MSG(&extHdrType, mBuf);
622 DU_LOG("\nEGTP : Message Buffer after decoding header ");
623 ODU_PRINT_MSG(mBuf, 0, 0);
627 } /* End of cuEgtpDecodeHdr */
634 /* Build Application message that is supposed to come from app to egtp */
635 BuildAppMsg(&egtpMsg);
637 /* Encode EGTP header to build final EGTP message */
638 BuildEgtpMsg(&egtpMsg);
640 /* Send Message to peer */
643 DU_LOG("\nEGTP : Sending message[%d]", cnt+1);
644 cuEgtpSendMsg(egtpMsg.msg);
648 ODU_PUT_MSG(egtpMsg.msg);
654 S16 BuildAppMsg(EgtpMsg *egtpMsg)
656 char data[30] = "This is EGTP data from CU";
661 if(ODU_GET_MSG(CU_APP_MEM_REG, CU_POOL, &mBuf) == ROK)
663 if(ODU_ADD_POST_MSG_MULT((Data *)data, datSize, mBuf) != ROK)
665 DU_LOG("\nEGTP : ODU_ADD_POST_MSG_MULT failed");
672 DU_LOG("\nEGTP : Failed to allocate memory");
676 /* filling IPv4 header */
681 ODU_FIND_MSG_LEN(mBuf, &mLen);
683 cmMemset((U8 *)&ipv4Hdr, 0, sizeof(CmIpv4Hdr));
684 ipv4Hdr.length = CM_IPV4_HDRLEN + mLen;
685 ipv4Hdr.hdrVer = 0x45;
687 ipv4Hdr.srcAddr = CM_INET_NTOH_U32(egtpCb.egtpCfg.localIp.ipV4Addr);
688 ipv4Hdr.destAddr = CM_INET_NTOH_U32(egtpCb.egtpCfg.destIp.ipV4Addr);
690 /* Packing IPv4 header into buffer */
692 Data revPkArray[CM_IPV4_HDRLEN];
693 Data pkArray[CM_IPV4_HDRLEN];
695 /* initialize locals */
697 cmMemset(revPkArray, 0, CM_IPV4_HDRLEN);
698 cmMemset(pkArray, 0, CM_IPV4_HDRLEN);
700 /* Pack Header Version */
701 pkArray[cnt++] = ipv4Hdr.hdrVer;
704 pkArray[cnt++] = ipv4Hdr.tos;
706 pkArray[cnt++] = (Data)GetHiByte(ipv4Hdr.length);
707 pkArray[cnt++] = (Data)GetLoByte(ipv4Hdr.length);
710 pkArray[cnt++] = (Data) GetHiByte(ipv4Hdr.id);
711 pkArray[cnt++] = (Data) GetLoByte(ipv4Hdr.id);
714 pkArray[cnt++] = (Data)GetHiByte(ipv4Hdr.off);
715 pkArray[cnt++] = (Data)GetLoByte(ipv4Hdr.off);
718 pkArray[cnt++] = ipv4Hdr.ttl;
721 pkArray[cnt++] = ipv4Hdr.proto;
724 pkArray[cnt++] = (Data)GetHiByte(ipv4Hdr.chkSum);
725 pkArray[cnt++] = (Data)GetLoByte(ipv4Hdr.chkSum);
727 /* Pack Source Address */
728 pkArray[cnt++] = (Data)GetHiByte(GetHiWord(ipv4Hdr.srcAddr));
729 pkArray[cnt++] = (Data)GetLoByte(GetHiWord(ipv4Hdr.srcAddr));
730 pkArray[cnt++] = (Data)GetHiByte(GetLoWord(ipv4Hdr.srcAddr));
731 pkArray[cnt++] = (Data)GetLoByte(GetLoWord(ipv4Hdr.srcAddr));
733 /* Pack Destination Address */
734 pkArray[cnt++] = (Data)GetHiByte(GetHiWord(ipv4Hdr.destAddr));
735 pkArray[cnt++] = (Data)GetLoByte(GetHiWord(ipv4Hdr.destAddr));
736 pkArray[cnt++] = (Data)GetHiByte(GetLoWord(ipv4Hdr.destAddr));
737 pkArray[cnt++] = (Data)GetLoByte(GetLoWord(ipv4Hdr.destAddr));
739 for (idx = 0; idx < CM_IPV4_HDRLEN; idx++)
740 revPkArray[idx] = pkArray[CM_IPV4_HDRLEN - idx -1];
742 /* this function automatically reverses revPkArray */
743 ret = ODU_ADD_PRE_MSG_MULT(revPkArray, (MsgLen)cnt, mBuf);
745 egtpMsg->msgHdr.msgType = EGTPU_MSG_GPDU;
746 egtpMsg->msgHdr.nPdu.pres = FALSE;
747 egtpMsg->msgHdr.seqNum.pres = FALSE;
748 egtpMsg->msgHdr.extHdr.udpPort.pres = FALSE;
749 egtpMsg->msgHdr.extHdr.pdcpNmb.pres = FALSE;
750 egtpMsg->msgHdr.teId = 10;
757 S16 BuildEgtpMsg(EgtpMsg *egtpMsg)
759 EgtpTeIdCb *teidCb = NULLP;
765 cmHashListFind(&(egtpCb.dstCb.teIdLst), (U8 *)&(egtpMsg->msgHdr.teId), sizeof(U32), 0, (PTR *)&teidCb);
768 DU_LOG("\nEGTP : Tunnel id[%d] not configured", egtpMsg->msgHdr.teId);
769 return (LCM_REASON_INVALID_PAR_VAL);
772 msgHdr = &(egtpMsg->msgHdr);
774 hdrLen = teidCb->preEncodedHdr.cnt;
776 if(msgHdr->extHdr.pdcpNmb.pres)
778 teidCb->preEncodedHdr.hdr[EGTP_MAX_HDR_LEN - 1] |= EGTP_MASK_BIT3;
779 teidCb->preEncodedHdr.hdr[hdrLen] = EGTP_EXT_HDR_PDCP_TYPE;
780 teidCb->preEncodedHdr.hdr[--hdrLen] = 1;
781 teidCb->preEncodedHdr.hdr[--hdrLen] = GetHiByte(msgHdr->extHdr.pdcpNmb.val);
782 teidCb->preEncodedHdr.hdr[--hdrLen] = GetLoByte(msgHdr->extHdr.pdcpNmb.val);
783 teidCb->preEncodedHdr.hdr[--hdrLen] = 0;
787 teidCb->preEncodedHdr.hdr[EGTP_MAX_HDR_LEN - 1] &= ~(EGTP_MASK_BIT3);
790 ODU_FIND_MSG_LEN(egtpMsg->msg, &tPduSize);
792 /*Adjust the header to fill the correct length*/
793 msgLen = tPduSize + (EGTP_MAX_HDR_LEN - hdrLen) - 0x08;
795 /***********************************************
796 * Fill the length field of the message header *
797 ***********************************************/
798 teidCb->preEncodedHdr.hdr[EGTP_MAX_HDR_LEN - 3] = (U8)GetHiByte(msgLen);
799 teidCb->preEncodedHdr.hdr[EGTP_MAX_HDR_LEN - 4] = (U8)GetLoByte(msgLen);
801 /*Update the sequence number*/
802 if(egtpMsg->msgHdr.seqNum.pres)
804 teidCb->preEncodedHdr.hdr[EGTP_MAX_HDR_LEN - 1] |= (EGTP_MASK_BIT2);
805 teidCb->preEncodedHdr.hdr[EGTP_MAX_HDR_LEN - 9] = (U8)GetHiByte(egtpMsg->msgHdr.seqNum.val);
806 teidCb->preEncodedHdr.hdr[EGTP_MAX_HDR_LEN - 10] = (U8)GetLoByte(egtpMsg->msgHdr.seqNum.val);
810 teidCb->preEncodedHdr.hdr[EGTP_MAX_HDR_LEN - 1] &= ~(EGTP_MASK_BIT2);
813 ODU_ADD_PRE_MSG_MULT(&teidCb->preEncodedHdr.hdr[hdrLen], (EGTP_MAX_HDR_LEN - hdrLen), egtpMsg->msg);
815 DU_LOG("\nEGTP : Sending message buffer");
816 ODU_PRINT_MSG(egtpMsg->msg, 0, 0);
821 S16 cuEgtpSendMsg(Buffer *mBuf)
828 info.region = CU_APP_MEM_REG;
831 dstAddr.port = EGTP_DFLT_PORT;
832 dstAddr.address = egtpCb.dstCb.dstIp;
834 ret = cmInetSendMsg(&(egtpCb.dstCb.sendTptSrvr.sockFd), &dstAddr, &info, mBuf, &txLen, CM_INET_NO_FLAG);
835 if(ret != ROK && ret != RWOULDBLOCK)
837 DU_LOG("\nEGTP : Message send failure");
841 DU_LOG("\nEGTP : Message Sent");