25#ifndef _NETSIM_LTENR_RLC_H_
26#define _NETSIM_LTENR_RLC_H_
32#pragma region HEADER_FILES
33#include "LTENR_Buffer.h"
34#include "LTENR_RLCMSG.h"
40#if RLC_AM_SN_SIZE == 12
41#define AM_Window_Size 0x800
42#elif RLC_AM_SN_SIZE == 18
43#define AM_Window_Size 0x20000
46#if RLC_UM_SN_SIZE == 6
47#define UM_Window_Size 0x20
48#elif RLC_UM_SN_SIZE == 12
49#define UM_Window_Size 0x800
53#define LTENR_RLC_IS_LOGICALCHANNEL_FOR_TM(ch) (((ch) == LTENR_LOGICALCHANNEL_BCCH) || \
54 ((ch) == LTENR_LOGICALCHANNEL_CCCH) || \
55 ((ch) == LTENR_LOGICALCHANNEL_PCCH))
57#define LTENR_RLC_IS_LOGICALCHANNEL_FOR_UM(ch) (((ch) == LTENR_LOGICALCHANNEL_DTCH))
59#define LTENR_RLC_IS_LOGICALCHANNEL_FOR_AM(ch) (((ch) == LTENR_LOGICALCHANNEL_DCCH) || \
60 ((ch) == LTENR_LOGICALCHANNEL_DTCH))
63#define LTENR_RLC_UM_IsSNFallsInReassemblyWindows(entity,sn) ((((entity)->UM.RX_Next_Highest - UM_Window_Size) <= (sn)) && ((sn)<(entity)->UM.RX_Next_Highest))
66#pragma region RLC_RECEPTION_BUFFER
72 bool isLastSDUReceived;
76 }LTENR_RLC_RECEPTIONBUFFER, *ptrLTENR_RLC_RECEPTIONBUFFER;
77#define LTENR_RLC_RECEPTIONBUFFER_ALLOC() ((ptrLTENR_RLC_RECEPTIONBUFFER)list_alloc(sizeof(LTENR_RLC_RECEPTIONBUFFER),offsetof(LTENR_RLC_RECEPTIONBUFFER,ele)))
78#define LTENR_RLC_RECEPTIONBUFFER_NEXT(buf) ((ptrLTENR_RLC_RECEPTIONBUFFER)LIST_NEXT(buf))
79#define LTENR_RLC_RECEPTIONBUFFER_ADD(ls,mem) (LIST_ADD_LAST(ls,mem))
82#pragma region RLC_BUFFER
90 LTENR_LOGICALCHANNEL channel;
91 NetSim_PACKET* packet;
92 bool isMarkedForRemoval;
96 }LTENR_RLCBUFFER_DATA, *ptrLTENR_RLCBUFFER_DATA;
100 ptrLTENR_RLCBUFFER_DATA head;
101 ptrLTENR_RLCBUFFER_DATA tail;
102 }LTENR_RLCBUFFER, * ptrLTENR_RLCBUFFER;
103 ptrLTENR_RLCBUFFER LTENR_RLCBUFFER_ALLOC();
104 void LTENR_RLCBUFFER_FREE(ptrLTENR_RLCBUFFER buffer);
105 void LTENR_RLCBUFFER_ADD_DATA(ptrLTENR_RLCBUFFER buffer, ptrLTENR_RLCBUFFER_DATA data);
106 void LTENR_RLCBUFFER_REMOVE_DATA(ptrLTENR_RLCBUFFER buffer, ptrLTENR_RLCBUFFER_DATA data);
107 ptrLTENR_RLCBUFFER_DATA LTENR_RLCBUFFER_GETHEAD(ptrLTENR_RLCBUFFER buffer);
108#define LTENR_RLCBUFFER_NEXT(buf) ((buf) = (buf)->next)
109#define LTENR_RLCBuffer_MarkForRemoval(buf) ((buf)->isMarkedForRemoval = true)
112#pragma region RLC_FUN_DEF
113 void LTENR_RLCBuffer_AddPacket(ptrLTENR_RLCBUFFER buffer, NetSim_PACKET* packet,
114 UINT sn, UINT16 so, LTENR_LOGICALCHANNEL channel);
115 void LTENR_RLCBuffer_UpdateBuffer(ptrLTENR_RLCBUFFER buffer);
116 ptrLTENR_RLCBUFFER LTENR_RLCBUFFER_FindAndRemoveAllBySN(ptrLTENR_RLCBUFFER buffer, UINT sn);
117 ptrLTENR_RLCBUFFER_DATA LTENR_RLCBUFFER_FindAndRemoveBySNSO(ptrLTENR_RLCBUFFER buffer, UINT sn, UINT16 so);
120#pragma region RLC_AM_STATUS
127 }LTENR_RLCAM_STATUS, *ptrLTENR_RLCAM_STATUS;
128#define LTENR_RLCAM_STATUS_ALLOC() ((ptrLTENR_RLCAM_STATUS)list_alloc(sizeof(LTENR_RLCAM_STATUS),offsetof(LTENR_RLCAM_STATUS,ele)))
129#define LTENR_RLCAM_STATUS_NEXT(status) (status=(ptrLTENR_RLCAM_STATUS)LIST_NEXT(status))
132#pragma region RLC_ENTITY
140 LTENR_RLCMODE rlcMode;
141 bool isTransmittingRLCEntity;
142 bool isReceivingRLCEntity;
153 UINT PDU_WITHOUT_POLL;
154 UINT BYTE_WITHOUT_POLL;
159 UINT RX_Next_Status_Trigger;
160 UINT RX_Highest_Status;
161 UINT RX_Next_Highest;
163 ptrLTENR_RLC_RECEPTIONBUFFER receptionBuffer;
164 bool isStatusReportDelayed;
165 bool isConstructStatusReortDelayed;
166 ptrLTENR_RLCAM_STATUS recvdInfo;
175 UINT RX_Timer_Trigger;
176 UINT RX_Next_Reassembly;
177 UINT RX_Next_Highest;
179 ptrLTENR_RLC_RECEPTIONBUFFER receptionBuffer;
183 double t_PollRetransmit;
184 bool isPollRetransmitTimerStarted;
185 UINT64 pollRetransmitTimerId;
188 bool isReassemblyTimerStarted;
189 UINT64 reassemblyTimerId;
191 double t_StatusProhibit;
192 bool isStatusProhibitTimerStarted;
193 UINT64 statusProhibitTimerId;
196 UINT maxRetxThreshold;
201 ptrLTENR_RLCBUFFER transmissionBuffer;
202 ptrLTENR_RLCBUFFER transmittedBuffer;
203 ptrLTENR_RLCBUFFER retransmissionBuffer;
204 UINT bufferStatus[LTENR_LOGICALCHANNEL_LAST];
207 }LTENR_RLCENTITY, *ptrLTENR_RLCENTITY;
208#define LTENR_RLCENTITY_ALLOC() (list_alloc(sizeof(LTENR_RLCENTITY),offsetof(LTENR_RLCENTITY,ele)))
209#define LTENR_RLCENTITY_NEXT(entity) (LIST_NEXT(entity))
210#define LTENR_RLCENTITY_ADD(rlc,e) (LIST_ADD_LAST(&((rlc)->rlcEntities),e))
211#define LTENR_RLCENTITY_REMOVE(rlc,e) (LIST_REMOVE(&((rlc)->rlcEntities),e))
216#pragma region RLC_VAR_AND_ITS_API
221 ptrLTENR_RLCENTITY***** rlcEntities;
222 }LTENR_RLCVAR, *ptrLTENR_RLCVAR;
223#define LTENR_RLC_GET_TM_TRANSMITTING_ENTITY(d,in,r,rin) (LTENR_RLC_FINDENTITY(d,in,r,rin,LTENR_RLCMODE_TM,true,false))
224#define LTENR_RLC_GET_TM_RECEIVING_ENTITY(d,in,r,rin) (LTENR_RLC_FINDENTITY(d,in,r,rin,LTENR_RLCMODE_TM,false,true))
225#define LTENR_RLC_GET_UM_TRANSMITTING_ENTITY(d,in,r,rin) (LTENR_RLC_FINDENTITY(d,in,r,rin,LTENR_RLCMODE_UM,true,false))
226#define LTENR_RLC_GET_UM_RECEIVING_ENTITY(d,in,r,rin) (LTENR_RLC_FINDENTITY(d,in,r,rin,LTENR_RLCMODE_UM,false,true))
227#define LTENR_RLC_GET_AM_TRANSMITTING_ENTITY(d,in,r,rin) (LTENR_RLC_FINDENTITY(d,in,r,rin,LTENR_RLCMODE_AM,true,true))
228#define LTENR_RLC_GET_AM_RECEIVING_ENTITY(d,in,r,rin) (LTENR_RLC_FINDENTITY(d,in,r,rin,LTENR_RLCMODE_AM,true,true))
231#pragma region FUN_DEF
234 void LTENR_RLC_TM_HandlePDUFromUpperLayer();
237 void LTENR_RLC_UM_HandlePDUFromUpperLayer();
238 UINT LTENR_RLC_UM_SEND_PDU(NETSIM_ID d, NETSIM_ID in,
239 NETSIM_ID r, NETSIM_ID rin,
240 UINT size, LTENR_LOGICALCHANNEL logicalChannel);
241 void LTENR_RLC_UM_RECEIVE_PDU();
242 void LTENR_RLC_UM_Handle_t_reassemblyTimer();
245 void LTENR_RLCAM_HandlePDUFromUpperLayer();
246 UINT LTENR_RLCAM_SEND_PDU(NETSIM_ID d, NETSIM_ID in,
247 NETSIM_ID r, NETSIM_ID rin,
248 UINT size, LTENR_LOGICALCHANNEL logicalChannel);
249 void LTENR_RLC_AM_RECEIVE_PDU();
250 void LTENR_RLCAM_Start_t_ReassemblyTimer(ptrLTENR_RLCENTITY entity);
251 void LTENR_RLCAM_Handle_t_reassemblyTimer();
252 void LTENR_RLCAM_Handle_t_PollRetransmitTimer();
253 void LTENR_RLCAM_Handle_t_StatusProhibitTimer();
254 void LTENR_RLCAM_ReceiveStatusPDU();
255 void LTENR_RLCAM_Start_t_PollRetransmitTimer(ptrLTENR_RLCENTITY entity);
256 void LTENR_RLCAM_Stop_t_PollRetransmitTimer(ptrLTENR_RLCENTITY entity);
258 ptrLTENR_RLCENTITY LTENR_RLC_FINDENTITY(NETSIM_ID d, NETSIM_ID in,
259 NETSIM_ID peerId, NETSIM_ID peerIf,
263 void LTENR_RLC_ESTABLISHENTITYALL(NETSIM_ID d, NETSIM_ID in,
264 NETSIM_ID peerId, NETSIM_ID peerIf);
265 void LTENR_RLC_TMESTABLISHENTITYALL(NETSIM_ID d, NETSIM_ID in,
266 NETSIM_ID peerId, NETSIM_ID peerIf);
267 void LTENR_RLC_ASSOCIATION(NETSIM_ID d, NETSIM_ID in,
268 NETSIM_ID peerId, NETSIM_ID peerIf,