17#define check_for_retry_limit(mac) (mac->nRetryLimit>mac->nRetryCount)
19void wait_for_random_time()
21 double ran = fn_NetSim_Utilities_GenerateRandomNo(DEVICE_SEED(pstruEventDetails->nDeviceId))/NETSIM_RAND_MAX;
24 if(file_contention != NULL)
26 fprintf(file_contention,
"%d\t%d\t%f\n",pstruEventDetails->nDeviceId,(
int)ran,pstruEventDetails->dEventTime);
28 pstruEventDetails->dEventTime+= (int)ran*CSMACD_CURRMAC->dSlotTime;
33 NetSim_PACKET* packet = fn_NetSim_Packet_CopyPacket(CSMACD_CURRMAC->currentPacket);
35 packet->pstruMacData->dArrivalTime = packet->pstruNetworkData->dEndTime;
36 packet->pstruMacData->dStartTime = pstruEventDetails->dEventTime;
37 packet->pstruMacData->dEndTime = pstruEventDetails->dEventTime;
39 packet->pstruMacData->dPayload=packet->pstruNetworkData->dPacketSize;
40 packet->pstruMacData->dOverhead=CSMACD_MAC_OVERHEAD;
41 packet->pstruMacData->dPacketSize =
42 packet->pstruMacData->dPayload+
43 packet->pstruMacData->dOverhead;
45 pstruEventDetails->dPacketSize=fnGetPacketSize(packet);
46 if(packet->pstruAppData)
48 pstruEventDetails->nApplicationId=packet->pstruAppData->nApplicationId;
49 pstruEventDetails->nSegmentId=packet->pstruAppData->nSegmentId;
53 pstruEventDetails->nApplicationId=0;
54 pstruEventDetails->nSegmentId=0;
56 pstruEventDetails->nEventType=PHYSICAL_OUT_EVENT;
57 pstruEventDetails->nPacketId=packet->nPacketId;
58 pstruEventDetails->nProtocolId=MAC_PROTOCOL_CSMACD;
59 pstruEventDetails->nSubEventType=0;
60 pstruEventDetails->pPacket=packet;
61 pstruEventDetails->szOtherDetails=NULL;
62 fnpAddEvent(pstruEventDetails);
65void fn_NetSim_CSMACD_MacOut()
67 NetSim_BUFFER* buffer= DEVICE_MAC_NW_INTERFACE(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId)->pstruAccessBuffer;
68 PCSMACD_MACVAR mac = CSMACD_CURRMAC;
69 NetSim_PACKET* packet;
71 if(mac->macState || !isMediumIdle())
74 if(mac->currentPacket && !mac->iswaited)
76 if(check_for_retry_limit(mac))
79 wait_for_random_time();
80 pstruEventDetails->nEventType = TIMER_EVENT;
81 pstruEventDetails->nSubEventType = WAIT_FOR_RANDOM_TIME;
82 fnpAddEvent(pstruEventDetails);
87 fn_NetSim_Packet_FreePacket(mac->currentPacket);
88 mac->currentPacket=NULL;
90 goto FIRST_TRANSMISSION;
94 mac->iswaited =
false;
96 packet = mac->currentPacket;
98 if(fn_NetSim_GetBufferStatus(buffer) || packet)
104 ran = fn_NetSim_Utilities_GenerateRandomNo(DEVICE_SEED(pstruEventDetails->nDeviceId))/NETSIM_RAND_MAX;
105 if(ran<=mac->dPersistance)
108 packet = fn_NetSim_Packet_GetPacketFromBuffer(buffer,1);
109 mac->currentPacket = packet;
114 pstruEventDetails->dEventTime +=mac->dSlotTime;
115 pstruEventDetails->nEventType = TIMER_EVENT;
116 pstruEventDetails->nSubEventType = PERSISTANCE_WAIT;
117 fnpAddEvent(pstruEventDetails);
123void fn_NetSim_CSMACD_MacIn()
125 pstruEventDetails->nEventType = NETWORK_IN_EVENT;
126 fnpAddEvent(pstruEventDetails);
129void fn_NetSim_CSMACS_PersistanceWait()
132 PCSMACD_MACVAR mac=CSMACD_CURRMAC;
133 NetSim_PACKET* packet;
134 NetSim_BUFFER* buffer= DEVICE_MAC_NW_INTERFACE(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId)->pstruAccessBuffer;
139 mac->iswaited =
true;
143 ran = fn_NetSim_Utilities_GenerateRandomNo(DEVICE_SEED(pstruEventDetails->nDeviceId))/NETSIM_RAND_MAX;
144 if(ran<=mac->dPersistance)
146 if(!mac->currentPacket)
148 packet = fn_NetSim_Packet_GetPacketFromBuffer(buffer,1);
149 mac->currentPacket = packet;
155 pstruEventDetails->dEventTime +=mac->dSlotTime;
156 pstruEventDetails->nEventType = TIMER_EVENT;
157 pstruEventDetails->nSubEventType = PERSISTANCE_WAIT;
158 fnpAddEvent(pstruEventDetails);