1 /******************************************************************************
2 ###############################################################################
3 # Copyright (c) [2017-2020] [ICT/CAS] #
4 # Licensed under the ORAN Software License v1.0 (License) #
5 ###############################################################################
6 ******************************************************************************/
9 #include "vos_linklist.h"
11 #include "cuupCommon.h"
15 #include "gnbCommon.h"
16 #include "cuupUeIdTransf.h"
18 #include "cuupTest.h" //for test
20 extern PdcpuUeInfo_t *gPdcpuUeInfo[MAX_UE_NUM];
21 extern CuupUeIdxTable_t gPdcpuUeIdxTable;
22 extern ULONG gPdcpuModuleId;
24 ULONG gPdcpuDlModuleId;
26 INT32 pdcpuDlInit(ULONG userModuleId)
28 gPdcpuDlModuleId = userModuleId;
33 INT32 pdcpuPackPduHead(PdcpRlcMode_e rlc_mode,PdcpSnSize_e snSize, UINT32 sn, MsgbBuff_t *msgb)
37 UINT8 *pPduHead = NULL;
40 if(LEN12BITS == snSize)
42 pduHeadLen = PDCP_SN_12_HEAD_LEN;
43 }else if(LEN18BITS == snSize)
45 pduHeadLen = PDCP_SN_18_HEAD_LEN;
48 pdcpuLog(LOG_ERR,"[PDCPU] sn size is wrong!\n");
51 pPduHead = VOS_Malloc(pduHeadLen,gPdcpuDlModuleId);
52 pdcpuNullCheck(pPduHead);
53 VOS_MemZero(pPduHead, pduHeadLen);
55 if(snSize == LEN12BITS)
57 if(sn >= MAX_PDCP_SN_12)
59 pdcpuLog(LOG_ERR,"[PDCPU] sn too big\n");
62 initBits(&bit, pPduHead, 16, 0);
64 skipBits(&bit, 3, BIT_PACKED);
65 packBits(&bit, 4, ((sn & 0xf00)>>8));
66 packBits(&bit, 8, sn & 0x0ff);
67 }else if(snSize == LEN18BITS)
69 if(sn >= MAX_PDCP_SN_18)
71 pdcpuLog(LOG_ERR,"[PDCPU] sn too big\n");
74 initBits(&bit, pPduHead, 24, 0);
76 skipBits(&bit, 5, BIT_PACKED);
77 packBits(&bit, 2, ((sn & 0x00030000)>>16));
78 packBits(&bit, 8, ((sn & 0x0000ff00)>>8));
79 packBits(&bit, 8, sn & 0x000000ff);
82 pdcpuLog(LOG_ERR,"[PDCPU] sn size error\n");
86 p = msgbHeadPush(msgb, pduHeadLen);
89 VOS_MemCpy(p, pPduHead, pduHeadLen);
92 pdcpuLog(LOG_ERR,"[PDCPU] msgbHeadPush failed!\n");
106 /*******************************************************************************
107 * pdcp-u dl data process
109 * ueE1apId: E1AP ID of the UE
110 * drbId: ID of data radio bearer
115 *******************************************************************************/
116 INT32 pdcpuDlDataProc(UINT64 ueE1apId, UINT8 drbId, MsgbBuff_t *pMsgBuff, UINT8 sdapPduType)
122 PdcpRlcMode_e rlcMode;
123 PdcpDrbEntity_t *pPdcpDrbEntity = NULL;
126 if(VOS_ERROR == cuupGetUeIdx(ueE1apId, &ueIdx, &gPdcpuUeIdxTable))
128 pdcpuLog(LOG_ERR,"[PDCPU] get ueIdx failed,ueE1apId:%d\n",ueE1apId);
131 pdcpuCheckUeIdx(ueIdx);
132 pdcpuCheckDrbId(drbId);
134 pdcpuGetEntity(ueIdx, drbId, pPdcpDrbEntity);
135 pdcpuNullCheck(pPdcpDrbEntity);
136 rlcMode = pPdcpDrbEntity->rlcMode;
139 pdcpuNullCheck(pMsgBuff);
142 UINT32 count = pPdcpDrbEntity->stateVar.txNext++;
144 // check out count wrapping around whether or not
145 if(0xffffffff == count)
147 pdcpuLog(LOG_ERR,"[PDCPU] count value is going to wrap around!\n");
151 snSize = pPdcpDrbEntity->pdcpSnSizeDl;
152 if(snSize == LEN12BITS)
154 sn = GET_SN_12_SN(count);
155 }else if(snSize == LEN18BITS)
157 sn = GET_SN_18_SN(count);
160 pdcpuLog(LOG_ERR,"[PDCPU] sn size is wrong!\n");
165 pduHeadLen = pdcpuPackPduHead(rlcMode, snSize, sn, pMsgBuff);
166 if(VOS_ERROR == pduHeadLen)
168 pdcpuLog(LOG_ERR,"[PDCPU] pack pdcp pdu head failed!\n");
172 //8. 否则:cuf1u将数据发送成功后,释放
173 if(VOS_OK == cuf1uDlDataProc(ueE1apId, drbId, pMsgBuff, NULL))
175 //vos_info_print("there is no buffer\n");
181 pdcpuLog(LOG_ERR,"[PDCPU] cuf1u send failed\n");