25#pragma region HEADER_FILES
28#include "LTENR_RLCMSG.h"
31#pragma region RLC_GLOBAL_VAIABLE
34#pragma region RLC_FUNCTIONPROTOTYPE
35static void LTENR_RLC_ESTABLISHENTITY(NETSIM_ID d, NETSIM_ID in,
36 NETSIM_ID peerId, NETSIM_ID peerIf,
40void LTENR_RLC_ESTABLISHENTITYALL(NETSIM_ID d, NETSIM_ID in,
41 NETSIM_ID peerId, NETSIM_ID peerIf);
42static void LTENR_RLC_ESTABLISHBROADCASTENTITY(NETSIM_ID d, NETSIM_ID in);
43void LTENR_RLC_Handle_t_reassemblyTimer();
46#pragma region RLC_INIT
47void fn_NetSim_LTENR_RLC_Init()
51 LTENR_SUBEVENT_REGISTER(LTENR_SUBEVNT_RLC_TREASSEMBLYTIMER,
52 "LTENR_RLC_t_reassemblyTimer",
53 LTENR_RLC_Handle_t_reassemblyTimer);
54 LTENR_SUBEVENT_REGISTER(LTENR_SUBEVNT_RLC_TPOLLRETRANSMITTIMER,
55 "LTENR_RLCAM_t_PollRetransmitTimer",
56 LTENR_RLCAM_Handle_t_PollRetransmitTimer);
58 LTENR_SUBEVENT_REGISTER(LTENR_SUBEVNT_RLC_TSTATUSPROHIBITTIMER,
59 "LTENR_RLCAM_t_StatusProhibitTimer",
60 LTENR_RLCAM_Handle_t_StatusProhibitTimer);
61 fn_NetSim_LTENR_RegisterCallBackForAssociation(LTENR_RLC_ASSOCIATION);
64void fn_NetSim_LTENR_UERLC_Init(NETSIM_ID ueId, NETSIM_ID ueIf)
66 ptrLTENR_PROTODATA pd = LTENR_PROTODATA_GET(ueId, ueIf);
68 ptrLTENR_RLCVAR rlc = calloc(1,
sizeof * rlc);
69 LTENR_UERLC_SET(ueId, ueIf, rlc);
71 rlc->t_reassembly = str_to_time(pd->t_reassembly);
73 ptrLTENR_ASSOCIATIONINFO info = LTENR_ASSOCIATEINFO_FIND(ueId, ueIf, 0, 0);
80 LTENR_RLC_ESTABLISHBROADCASTENTITY(ueId, ueIf);
83void fn_NetSim_LTENR_GNBRLC_Init(NETSIM_ID gnbId, NETSIM_ID gnbIf)
85 ptrLTENR_PROTODATA pd = LTENR_PROTODATA_GET(gnbId, gnbIf);
86 ptrLTENR_RLCVAR rlc = calloc(1,
sizeof * rlc);
87 LTENR_GNBRLC_SET(gnbId, gnbIf, rlc);
89 rlc->t_reassembly = str_to_time(pd->t_reassembly);
91 ptrLTENR_ASSOCIATIONINFO info = LTENR_ASSOCIATEINFO_FIND(gnbId, gnbIf, 0, 0);
98 LTENR_RLC_ESTABLISHBROADCASTENTITY(gnbId, gnbIf);
102#pragma region RLC_ENTITY
103ptrLTENR_RLCENTITY LTENR_RLC_FINDENTITY(NETSIM_ID d, NETSIM_ID in,
104 NETSIM_ID peerId, NETSIM_ID peerIf,
109 ptrLTENR_RLCVAR rlc = LTENR_RLC_GET(d, in);
110 ptrLTENR_RLCENTITY entity = rlc ? rlc->rlcEntities : NULL;
113 if (entity->d == d && entity->in == in &&
114 entity->peerId == peerId && entity->peerIf == peerIf &&
115 entity->rlcMode == mode &&
116 entity->isTransmittingRLCEntity == isTransmitting &&
117 entity->isReceivingRLCEntity == isReceiving)
119 entity = LTENR_RLCENTITY_NEXT(entity);
125static void LTENR_RLC_ESTABLISHENTITY(NETSIM_ID d, NETSIM_ID in,
126 NETSIM_ID peerId, NETSIM_ID peerIf,
131 ptrLTENR_RLCENTITY entity = LTENR_RLC_FINDENTITY(d, in,
133 mode, isTransmitting, isReceiving);
138 ptrLTENR_PROTODATA pd = LTENR_PROTODATA_GET(d, in);
139 ptrLTENR_RLCVAR rlc = LTENR_RLC_GET(d, in);
142 entity = LTENR_RLCENTITY_ALLOC();
143 entity->retransmissionBuffer = LTENR_RLCBUFFER_ALLOC();
144 entity->transmissionBuffer = LTENR_RLCBUFFER_ALLOC();
145 entity->transmittedBuffer = LTENR_RLCBUFFER_ALLOC();
146 LTENR_RLCENTITY_ADD(rlc, entity);
148 entity->t_Reassembly = rlc->t_reassembly;
152 entity->peerId = peerId;
153 entity->peerIf = peerIf;
155 entity->rlcMode = mode;
156 entity->isReceivingRLCEntity = isReceiving;
157 entity->isTransmittingRLCEntity = isTransmitting;
160 entity->t_PollRetransmit = str_to_time(pd->t_pollRetransmit);
161 entity->t_StatusProhibit = str_to_time(pd->t_statusProhibit);
162 entity->t_Reassembly = str_to_time(pd->t_reassembly);
163 entity->pollByte = str_to_bytes(pd->pollBytes);
164 entity->pollPDU = atoi(pd->pollPdu + 1);
165 entity->maxRetxThreshold = atoi(pd->maxRetxThreshold + 1);
168static void LTENR_RLC_UNESTABLISHENTITY(NETSIM_ID d, NETSIM_ID in,
169 NETSIM_ID peerId, NETSIM_ID peerIf,
174 ptrLTENR_RLCVAR rlc = LTENR_RLC_GET(d, in);
177 ptrLTENR_RLCENTITY entity = LTENR_RLC_FINDENTITY(d, in,
179 mode, isTransmitting, isReceiving);
181 LTENR_RLCENTITY_REMOVE(rlc, entity);
184void LTENR_RLC_ESTABLISHENTITYALL(NETSIM_ID d, NETSIM_ID in,
185 NETSIM_ID peerId, NETSIM_ID peerIf)
187 LTENR_RLC_ESTABLISHENTITY(d, in, peerId, peerIf, LTENR_RLCMODE_TM,
true,
false);
188 LTENR_RLC_ESTABLISHENTITY(d, in, peerId, peerIf, LTENR_RLCMODE_TM,
false,
true);
189 LTENR_RLC_ESTABLISHENTITY(d, in, peerId, peerIf, LTENR_RLCMODE_UM,
true,
false);
190 LTENR_RLC_ESTABLISHENTITY(d, in, peerId, peerIf, LTENR_RLCMODE_UM,
false,
true);
191 LTENR_RLC_ESTABLISHENTITY(d, in, peerId, peerIf, LTENR_RLCMODE_AM,
true,
true);
194void LTENR_RLC_UNESTABLISHENTITYALL(NETSIM_ID d, NETSIM_ID in,
195 NETSIM_ID peerId, NETSIM_ID peerIf)
197 LTENR_RLC_UNESTABLISHENTITY(d, in, peerId, peerIf, LTENR_RLCMODE_TM,
true,
false);
198 LTENR_RLC_UNESTABLISHENTITY(d, in, peerId, peerIf, LTENR_RLCMODE_TM,
false,
true);
199 LTENR_RLC_UNESTABLISHENTITY(d, in, peerId, peerIf, LTENR_RLCMODE_UM,
true,
false);
200 LTENR_RLC_UNESTABLISHENTITY(d, in, peerId, peerIf, LTENR_RLCMODE_UM,
false,
true);
201 LTENR_RLC_UNESTABLISHENTITY(d, in, peerId, peerIf, LTENR_RLCMODE_AM,
true,
true);
204void LTENR_RLC_TMESTABLISHENTITYALL(NETSIM_ID d, NETSIM_ID in,
205 NETSIM_ID peerId, NETSIM_ID peerIf) {
206 LTENR_RLC_ESTABLISHENTITY(d, in, peerId, peerIf, LTENR_RLCMODE_TM,
true,
false);
207 LTENR_RLC_ESTABLISHENTITY(d, in, peerId, peerIf, LTENR_RLCMODE_TM,
false,
true);
210static void LTENR_RLC_ESTABLISHBROADCASTENTITY(NETSIM_ID d, NETSIM_ID in)
212 LTENR_RLC_ESTABLISHENTITY(d, in, 0, 0, LTENR_RLCMODE_TM,
true,
false);
213 LTENR_RLC_ESTABLISHENTITY(d, in, 0, 0, LTENR_RLCMODE_TM,
false,
true);
214 LTENR_RLC_ESTABLISHENTITY(d, in, 0, 0, LTENR_RLCMODE_UM,
true,
false);
215 LTENR_RLC_ESTABLISHENTITY(d, in, 0, 0, LTENR_RLCMODE_UM,
false,
true);
216 LTENR_RLC_ESTABLISHENTITY(d, in, 0, 0, LTENR_RLCMODE_AM,
true,
true);
220#pragma region RLC_ASSOCIATION
221void LTENR_RLC_ASSOCIATION(NETSIM_ID gnbId, NETSIM_ID gnbIf,
222 NETSIM_ID ueId, NETSIM_ID ueIf,
225 ptrLTENR_RLCVAR grlc = LTENR_GNBRLC_GET(gnbId, gnbIf);
229 ptrLTENR_RLCVAR urlc = LTENR_UERLC_GET(ueId, ueIf);
235 LTENR_RLC_ESTABLISHENTITYALL(gnbId, gnbIf, ueId, ueIf);
236 LTENR_RLC_ESTABLISHENTITYALL(ueId, ueIf, gnbId, gnbIf);
240 LTENR_RLC_UNESTABLISHENTITYALL(gnbId, gnbIf, ueId, ueIf);
241 LTENR_RLC_UNESTABLISHENTITYALL(ueId, ueIf, gnbId, gnbIf);
247void LTENR_RLC_TM_HandlePDUFromUpperLayer()
249 print_ltenr_log(
"Packet is TM mode.\n");
250 NETSIM_ID d = pstruEventDetails->nDeviceId;
251 NETSIM_ID in = pstruEventDetails->nInterfaceId;
252 NetSim_PACKET* packet = pstruEventDetails->pPacket;
253 ptrLTENR_RLCENTITY entity;
255 if (packet->nReceiverId)
257 rin = LTENR_FIND_ASSOCIATEINTERFACE(d, in, packet->nReceiverId);
258 entity = LTENR_RLC_FINDENTITY(d, in,
259 packet->nReceiverId, rin,
265 entity = LTENR_RLC_FINDENTITY(d, in,
273 fnNetSimError(
"LTENR-RLCTM, No entity is found between device %d-%d and %d-%d\n"
274 "Dropping packet.\n",
275 d, in, packet->nReceiverId, rin);
276 fn_NetSim_Packet_FreePacket(packet);
277 pstruEventDetails->pPacket = NULL;
281 print_ltenr_log(
"Adding packet to transmission buffer.\n");
282 LTENR_LOGICALCHANNEL channel = LTENR_PACKET_GET_LOGICALCHANNEL(packet);
283 LTENR_RLCBuffer_AddPacket(entity->transmissionBuffer, packet, 0, 0, channel);
284 entity->bufferStatus[channel] += (UINT)packet->pstruMacData->dPacketSize;
287static UINT LTENR_RLC_TM_SEND_PDU(NETSIM_ID d, NETSIM_ID in,
288 NETSIM_ID r, NETSIM_ID rin,
289 UINT size, LTENR_LOGICALCHANNEL logicalChannel)
291 ptrLTENR_RLCENTITY entity = LTENR_RLC_GET_TM_TRANSMITTING_ENTITY(d, in, r, rin);
292 NetSim_PACKET* tmdpdu = NULL;
295 ptrLTENR_RLCBUFFER_DATA buf = entity->transmissionBuffer->head;
298 tmdpdu = buf->packet;
300 LTENR_LOGICALCHANNEL ch = LTENR_PACKET_GET_LOGICALCHANNEL(tmdpdu);
301 if (ch != logicalChannel)
307 if (LTENR_IS_UPLANE_MSG(tmdpdu) &&
308 tmdpdu->pstruMacData->dPacketSize > left)
310 LTENR_RLCBuffer_MarkForRemoval(buf);
311 fn_NetSim_Packet_FreePacket(tmdpdu);
315 LTENR_RLCBuffer_MarkForRemoval(buf);
317 left -= (UINT)tmdpdu->pstruMacData->dPacketSize;
318 LTENR_RLCMSG_TMHDR_ADD(tmdpdu);
319 LTENR_RLC_SENDPDUTOMAC(d, in, tmdpdu);
321 LTENR_RLCBuffer_UpdateBuffer(entity->transmissionBuffer);
325static void LTENR_RLC_TM_ReceivePDU()
327 NetSim_PACKET* p = pstruEventDetails->pPacket;
328 switch (p->nControlDataType)
330 case LTENR_MSG_RLC_STATUSPDU:
331 LTENR_RLCAM_ReceiveStatusPDU();
333 case LTENR_MSG_RRC_MIB:
334 case LTENR_MSG_RRC_SIB1:
335 case LTENR_MSG_RRC_SI:
336 case LTENR_MSG_RRC_SETUP_REQUEST:
346#pragma region RLC_PACKETPROCESSING
348static bool LTENR_RLC_VALIDATE_PDU(NetSim_PACKET* packet,
char* fun)
352 fnNetSimError(
"LTENR-RLC %s function is called without packet\n", fun);
356 ptrLTENR_MSG msg = packet->pstruMacData->Packet_MACProtocol;
359 fnNetSimError(
"LTENR-RLC %s function is called without LTENR-MSG\n", fun);
363 if (msg->rlcMode == LTENR_RLCMODE_TM)
366 if (!LTENR_RLC_IS_LOGICALCHANNEL_FOR_TM(msg->logicalChannel))
368 fnNetSimError(
"LTENR-RLC TM mode is only supporetd for BCCH, CCCH or PCCH logical channel\n");
373 if (msg->rlcMode == LTENR_RLCMODE_UM)
376 if (!LTENR_RLC_IS_LOGICALCHANNEL_FOR_UM(msg->logicalChannel))
378 fnNetSimError(
"LTENR-RLC UM mode is only supporetd for DTCH logical channel\n");
383 if (msg->rlcMode == LTENR_RLCMODE_AM)
386 if (!LTENR_RLC_IS_LOGICALCHANNEL_FOR_AM(msg->logicalChannel))
388 fnNetSimError(
"LTENR-RLC AM mode is only supporetd for DTCH or DCCH logical channel\n");
396void fn_NetSim_LTENR_RLC_HandlePDUFromUpperLayer()
398 LTENR_RLC_PRINT_PACKET_LOG_OUT();
399 NetSim_PACKET* packet = pstruEventDetails->pPacket;
401 if (!LTENR_RLC_VALIDATE_PDU(packet, __FUNCTION__))
404 ptrLTENR_MSG msg = packet->pstruMacData->Packet_MACProtocol;
405 switch (msg->rlcMode)
407 case LTENR_RLCMODE_TM:
408 LTENR_RLC_TM_HandlePDUFromUpperLayer();
410 case LTENR_RLCMODE_UM:
411 LTENR_RLC_UM_HandlePDUFromUpperLayer();
413 case LTENR_RLCMODE_AM:
414 LTENR_RLCAM_HandlePDUFromUpperLayer();
417 fnNetSimError(
"LTENR-RLC Unknown RLC mode %d\n", msg->rlcMode);
420 print_ltenr_log(
"\n");
423void fn_NetSim_LTENR_RLC_TransmissionStatusNotification(NETSIM_ID d, NETSIM_ID in,
424 NETSIM_ID r, NETSIM_ID rin,
425 UINT size, LTENR_LOGICALCHANNEL logicalChannel)
427#ifdef LTENR_RLC_TRANSMISSIONSTATUSNOTIFICATION_LOG
428 print_ltenr_log(
"LTENR-RLC, Transmission status notification\n"
431 "\tInterface Id = %d\n"
432 "\tRemote device id = %d\n"
433 "\tRemote device interface = %d\n"
434 "\tLogical channel = %s\n",
435 pstruEventDetails->dEventTime,
437 strLTENR_LOGICALCHANNEL[logicalChannel]);
440 UINT tsize, usize, asize;
441 tsize = usize = asize = 0;
442 if (LTENR_RLC_IS_LOGICALCHANNEL_FOR_TM(logicalChannel))
444 tsize = LTENR_RLC_TM_SEND_PDU(d, in, r, rin, size, logicalChannel);
448 if (LTENR_RLC_IS_LOGICALCHANNEL_FOR_UM(logicalChannel))
450 usize = LTENR_RLC_UM_SEND_PDU(d, in, r, rin, size, logicalChannel);
454 if (LTENR_RLC_IS_LOGICALCHANNEL_FOR_AM(logicalChannel))
456 asize = LTENR_RLCAM_SEND_PDU(d, in, r, rin, size, logicalChannel);
459#ifdef LTENR_RLC_TRANSMISSIONSTATUSNOTIFICATION_LOG
460 print_ltenr_log(
"\tTM bytes sent = %d\n"
461 "\tUM bytes sent = %d\n"
462 "\tAM bytes sent = %d\n"
463 "\tTotal bytes sent = %d\n",
465 tsize + usize + asize);
466 print_ltenr_log(
"\n");
470UINT fn_NetSim_LTENR_RLC_BufferStatusNotificaton(NETSIM_ID d, NETSIM_ID in,
471 NETSIM_ID r, NETSIM_ID rin,
472 LTENR_LOGICALCHANNEL logicalChannel)
474 ptrLTENR_RLCENTITY entity;
475 UINT tsize, usize, asize, size;
476 tsize = usize = asize = size = 0;
477 if (LTENR_RLC_IS_LOGICALCHANNEL_FOR_TM(logicalChannel))
479 entity = LTENR_RLC_FINDENTITY(d, in, r, rin, LTENR_RLCMODE_TM,
true,
false);
481 tsize = entity->bufferStatus[logicalChannel];
483 if (LTENR_RLC_IS_LOGICALCHANNEL_FOR_UM(logicalChannel))
485 entity = LTENR_RLC_FINDENTITY(d, in, r, rin, LTENR_RLCMODE_UM,
true,
false);
487 usize = entity->bufferStatus[logicalChannel];
489 if (LTENR_RLC_IS_LOGICALCHANNEL_FOR_AM(logicalChannel))
491 entity = LTENR_RLC_FINDENTITY(d, in, r, rin, LTENR_RLCMODE_AM,
true,
true);
493 asize = entity->bufferStatus[logicalChannel];
496 size = tsize + usize + asize;
497#ifdef LTENR_RLC_BUFFERSTATUSREPORTING_LOG
498 print_ltenr_log(
"LTENR-RLC, Buffer status reporting\n"
501 "\tInterface Id = %d\n"
502 "\tRemote device id = %d\n"
503 "\tRemote device interface = %d\n"
504 "\tLogical channel = %s\n"
505 "\tTM buffer size = %d bytes\n"
506 "\tUM buffer size = %d bytes\n"
507 "\tAM buffer size = %d bytes\n"
508 "\tTotal buffer size = %d bytes\n",
509 pstruEventDetails->dEventTime,
511 strLTENR_LOGICALCHANNEL[logicalChannel],
512 tsize, usize, asize, size);
513 print_ltenr_log(
"\n");
518void fn_NetSim_LTENR_RLC_HandleMACIN()
520 LTENR_RLC_PRINT_PACKET_LOG_IN();
521 LTENR_RLCMODE mode = LTENR_PACKET_GET_RLCMODE(pstruEventDetails->pPacket);
524 case LTENR_RLCMODE_TM:
525 LTENR_RLC_TM_ReceivePDU();
527 case LTENR_RLCMODE_UM:
528 LTENR_RLC_UM_RECEIVE_PDU();
530 case LTENR_RLCMODE_AM:
531 LTENR_RLC_AM_RECEIVE_PDU();
534 fnNetSimError(
"Packet arrives to RLC in has no valid RLC mode.\n"
535 "Dropping packet.\n");
536 fn_NetSim_Packet_FreePacket(pstruEventDetails->pPacket);
537 pstruEventDetails->pPacket = NULL;
543#pragma region RLC_t_ReassemblyTime
544void LTENR_RLC_Handle_t_reassemblyTimer()
546 ptrLTENR_RLCENTITY entity = pstruEventDetails->szOtherDetails;
547 LTENR_RLCMODE mode = entity->rlcMode;
551 case LTENR_RLCMODE_UM:
552 LTENR_RLC_UM_Handle_t_reassemblyTimer();
554 case LTENR_RLCMODE_AM:
555 LTENR_RLCAM_Handle_t_reassemblyTimer();
558 fnNetSimError(
"t_reassembly timer is triggered without valid rlc mode.\n");