NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
CSMACDMac.c
1/************************************************************************************
2* Copyright (C) 2023 *
3* TETCOS, Bangalore. India *
4* *
5* Tetcos owns the intellectual property rights in the Product and its content. *
6* The copying, redistribution, reselling or publication of any or all of the *
7* Product or its content without express prior written consent of Tetcos is *
8* prohibited. Ownership and / or any other right relating to the software and all *
9* intellectual property rights therein shall remain at all times with Tetcos. *
10* *
11* Author: Shashi Kant Suman *
12* *
13* ---------------------------------------------------------------------------------*/
14#include "main.h"
15#include "CSMACD.h"
16
17#define check_for_retry_limit(mac) (mac->nRetryLimit>mac->nRetryCount)
18
19void wait_for_random_time()
20{
21 double ran = fn_NetSim_Utilities_GenerateRandomNo(DEVICE_SEED(pstruEventDetails->nDeviceId))/NETSIM_RAND_MAX;
22
23 ran *= 16;
24 if(file_contention != NULL)
25 {
26 fprintf(file_contention,"%d\t%d\t%f\n",pstruEventDetails->nDeviceId,(int)ran,pstruEventDetails->dEventTime);
27 }
28 pstruEventDetails->dEventTime+= (int)ran*CSMACD_CURRMAC->dSlotTime;
29}
30
31void send_to_phy()
32{
33 NetSim_PACKET* packet = fn_NetSim_Packet_CopyPacket(CSMACD_CURRMAC->currentPacket);
34
35 packet->pstruMacData->dArrivalTime = packet->pstruNetworkData->dEndTime;
36 packet->pstruMacData->dStartTime = pstruEventDetails->dEventTime;
37 packet->pstruMacData->dEndTime = pstruEventDetails->dEventTime;
38
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;
44
45 pstruEventDetails->dPacketSize=fnGetPacketSize(packet);
46 if(packet->pstruAppData)
47 {
48 pstruEventDetails->nApplicationId=packet->pstruAppData->nApplicationId;
49 pstruEventDetails->nSegmentId=packet->pstruAppData->nSegmentId;
50 }
51 else
52 {
53 pstruEventDetails->nApplicationId=0;
54 pstruEventDetails->nSegmentId=0;
55 }
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);
63}
64
65void fn_NetSim_CSMACD_MacOut()
66{
67 NetSim_BUFFER* buffer= DEVICE_MAC_NW_INTERFACE(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId)->pstruAccessBuffer;
68 PCSMACD_MACVAR mac = CSMACD_CURRMAC;
69 NetSim_PACKET* packet;
70
71 if(mac->macState || !isMediumIdle())
72 return;
73
74 if(mac->currentPacket && !mac->iswaited)
75 {
76 if(check_for_retry_limit(mac))
77 {
78 mac->macState=Busy;
79 wait_for_random_time();
80 pstruEventDetails->nEventType = TIMER_EVENT;
81 pstruEventDetails->nSubEventType = WAIT_FOR_RANDOM_TIME;
82 fnpAddEvent(pstruEventDetails);
83 return;
84 }
85 else
86 {
87 fn_NetSim_Packet_FreePacket(mac->currentPacket);
88 mac->currentPacket=NULL;
89 mac->nRetryCount=0;
90 goto FIRST_TRANSMISSION;
91 }
92 }
93FIRST_TRANSMISSION:
94 mac->iswaited = false;
95
96 packet = mac->currentPacket;
97
98 if(fn_NetSim_GetBufferStatus(buffer) || packet)
99 {
100 if(isMediumIdle())
101 {
102 double ran;
103 mac->macState=Busy;
104 ran = fn_NetSim_Utilities_GenerateRandomNo(DEVICE_SEED(pstruEventDetails->nDeviceId))/NETSIM_RAND_MAX;
105 if(ran<=mac->dPersistance)
106 {
107 if(!packet) //Take new packet from buffer
108 packet = fn_NetSim_Packet_GetPacketFromBuffer(buffer,1);
109 mac->currentPacket = packet;
110 send_to_phy();
111 }
112 else
113 {
114 pstruEventDetails->dEventTime +=mac->dSlotTime;
115 pstruEventDetails->nEventType = TIMER_EVENT;
116 pstruEventDetails->nSubEventType = PERSISTANCE_WAIT;
117 fnpAddEvent(pstruEventDetails);
118 }
119 }
120 }
121}
122
123void fn_NetSim_CSMACD_MacIn()
124{
125 pstruEventDetails->nEventType = NETWORK_IN_EVENT;
126 fnpAddEvent(pstruEventDetails);
127}
128
129void fn_NetSim_CSMACS_PersistanceWait()
130{
131 double ran;
132 PCSMACD_MACVAR mac=CSMACD_CURRMAC;
133 NetSim_PACKET* packet;
134 NetSim_BUFFER* buffer= DEVICE_MAC_NW_INTERFACE(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId)->pstruAccessBuffer;
135
136 if(!isMediumIdle())
137 {
138 mac->macState=Idle;
139 mac->iswaited = true;
140 return;
141 }
142
143 ran = fn_NetSim_Utilities_GenerateRandomNo(DEVICE_SEED(pstruEventDetails->nDeviceId))/NETSIM_RAND_MAX;
144 if(ran<=mac->dPersistance)
145 {
146 if(!mac->currentPacket)
147 {
148 packet = fn_NetSim_Packet_GetPacketFromBuffer(buffer,1);
149 mac->currentPacket = packet;
150 }
151 send_to_phy();
152 }
153 else
154 {
155 pstruEventDetails->dEventTime +=mac->dSlotTime;
156 pstruEventDetails->nEventType = TIMER_EVENT;
157 pstruEventDetails->nSubEventType = PERSISTANCE_WAIT;
158 fnpAddEvent(pstruEventDetails);
159 }
160}