NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
CSMACD_Phy.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
17bool isMediumIdle()
18{
19 NETSIM_ID i,j;
20 for(i=0;i<NETWORK->nDeviceCount;i++)
21 {
22 for(j=0;j<DEVICE(i+1)->nNumOfInterface;j++)
23 {
24 if(DEVICE_MACLAYER(i+1,j+1))
25 {
26 PCSMACD_PHYVAR phy = CSMACD_PHY(i+1,j+1);
27 if(phy && phy->link_state == LinkState_UP)
28 return false;
29 }
30 }
31 }
32 return true;
33}
34
35void transmit_packet(NetSim_PACKET* packet)
36{
37 PCSMACD_PHYVAR phyt = CSMACD_PHY(packet->nTransmitterId,1);
38
39 phyt->link_state = LinkState_UP;
40
41 //Add physical in event
42 pstruEventDetails->dEventTime=packet->pstruPhyData->dEndTime;
43 packet->pstruPhyData->dEndTime = pstruEventDetails->dEventTime;
44 pstruEventDetails->dPacketSize=packet->pstruPhyData->dPacketSize;
45 pstruEventDetails->nDeviceId=packet->nReceiverId;
46 pstruEventDetails->nDeviceType=DEVICE_TYPE(packet->nReceiverId);
47 pstruEventDetails->nEventType=PHYSICAL_IN_EVENT;
48 pstruEventDetails->nInterfaceId=1;
49 pstruEventDetails->pPacket=packet;
50 fnpAddEvent(pstruEventDetails);
51}
52
53double calulate_transmission_time(NetSim_PACKET* packet)
54{
55 double size=fnGetPacketSize(packet);
56 NETSIM_ID source=packet->nTransmitterId;
57 double dDataRate=DEVICE_PHYLAYER(source,1)->pstruNetSimLinks->puniMedProp.pstruWiredLink.dDataRateUp;
58 double dTxTime= size*8.0/dDataRate;
59 return dTxTime;
60}
61
62void check_for_collision(NetSim_PACKET* p)
63{
64 NETSIM_ID i;
65 for(i=0;i<NETWORK->nDeviceCount;i++)
66 {
67 PCSMACD_PHYVAR phy = CSMACD_PHY(i+1,1);
68
69 if(i+1==p->nTransmitterId)
70 continue;
71
72 if(phy->link_state != LinkState_DOWN)
73 {
74 p->nPacketStatus = PacketStatus_Collided;
75 phy->collision_count++;
76
77 if(file_collision != NULL)
78 {
79 fprintf(file_collision,"%d\t%d\t%f\n",i+1,phy->collision_count,pstruEventDetails->dEventTime);
80 }
81 break;
82 }
83 }
84}
85
86void reinit_phy(NETSIM_ID id)
87{
88 PCSMACD_PHYVAR phy = CSMACD_PHY(id,1);
89 phy->link_state = LinkState_DOWN;
90
91 if(isMediumIdle())
92 {
93 NETSIM_ID i;
94 for(i=0;i<NETWORK->nDeviceCount;i++)
95 {
96 if(DEVICE_TYPE(i+1)==NODE)
97 {
98 pstruEventDetails->nDeviceId = i+1;
99 pstruEventDetails->dPacketSize = 0;
100 pstruEventDetails->nApplicationId = 0;
101 pstruEventDetails->nSegmentId = 0;
102 pstruEventDetails->nDeviceType = DEVICE_TYPE(i+1);
103 pstruEventDetails->nEventType = MAC_OUT_EVENT;
104 pstruEventDetails->nInterfaceId = 1;
105 pstruEventDetails->nProtocolId = MAC_PROTOCOL_CSMACD;
106 pstruEventDetails->pPacket=NULL;
107 fnpAddEvent(pstruEventDetails);
108 }
109 }
110 }
111}
112
113void fn_NetSim_CSMACD_PhyOut()
114{
115
116 double dTxTime;
117 double* t = &DEVICE_PHYLAYER(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId)->dLastPacketEndTime;
118 NetSim_PACKET* packet= pstruEventDetails->pPacket;
119 packet->pstruPhyData->dArrivalTime=pstruEventDetails->dEventTime;
120 packet->pstruPhyData->dPayload=packet->pstruMacData->dPacketSize;
121 packet->pstruPhyData->dOverhead=CSMACD_PHY_OVERHEAD;
122 packet->pstruPhyData->dPacketSize=packet->pstruPhyData->dOverhead+packet->pstruPhyData->dPayload;
123 packet->pstruPhyData->dStartTime=pstruEventDetails->dEventTime;
124
125 if(*t<packet->pstruPhyData->dStartTime)
126 *t=packet->pstruPhyData->dStartTime;
127 else
128 packet->pstruPhyData->dStartTime=*t;
129
130 dTxTime=calulate_transmission_time(packet);
131
132 CSMACD_CURRMAC->macState=Idle;
133
134
135 packet->pstruPhyData->dEndTime=packet->pstruPhyData->dStartTime+dTxTime;
136 *t = packet->pstruPhyData->dEndTime;
137
138 if(packet->nReceiverId)
139 {
140 transmit_packet(packet);
141 check_for_collision(packet);
142 }
143 else
144 {
145 //Broadcast packet
146 NETSIM_ID loop;
147 for(loop=0;loop<NETWORK->nDeviceCount;loop++)
148 {
149 if(DEVICE_TYPE(loop+1) != HUB && loop+1!=packet->nTransmitterId)
150 {
151 NetSim_PACKET* p = fn_NetSim_Packet_CopyPacket(packet);
152 //Add physical in event
153 p->nReceiverId=loop+1;
154 transmit_packet(p);
155 check_for_collision(p);
156 }
157 }
158 fn_NetSim_Packet_FreePacket(packet);
159 }
160}
161
162void fn_NetSim_CSMACD_PhyIn()
163{
164 double ber;
165 NETSIM_ID tx = pstruEventDetails->pPacket->nTransmitterId;
166
167 check_for_collision(pstruEventDetails->pPacket);
168
169 if(pstruEventDetails->pPacket->nPacketStatus == PacketStatus_Collided)
170 goto RET_PHYIN;
171
172 fn_NetSim_Packet_FreePacket(CSMACD_MAC(tx,1)->currentPacket);
173 CSMACD_MAC(tx,1)->currentPacket=NULL;
174 CSMACD_MAC(tx,1)->nRetryCount = 0;
175
176 ber = DEVICE_PHYLAYER(tx,1)->pstruNetSimLinks->puniMedProp.pstruWiredLink.dErrorRateUp;
177
178 pstruEventDetails->pPacket->nPacketStatus =
179 fn_NetSim_Packet_DecideError(ber,
180 pstruEventDetails->pPacket->pstruPhyData->dPacketSize);
181
182 if(pstruEventDetails->pPacket->nPacketStatus == PacketStatus_Error)
183 goto RET_PHYIN;
184
185 pstruEventDetails->nEventType = MAC_IN_EVENT;
186 fnpAddEvent(pstruEventDetails);
187
188RET_PHYIN:
189 fn_NetSim_WritePacketTrace(pstruEventDetails->pPacket);
190 fn_NetSim_Metrics_Add(pstruEventDetails->pPacket);
191
192 if(pstruEventDetails->pPacket->nPacketStatus != PacketStatus_NoError)
193 fn_NetSim_Packet_FreePacket(pstruEventDetails->pPacket);
194
195 reinit_phy(tx);;
196}