26#include "Ethernet_enum.h"
27#include "AdvancedPlots.h"
28#pragma comment(lib,"AdvancedPlots.lib")
30static void init_eth_phy_buffer(ptrETH_PHY phy)
32 phy->packet = calloc(1,
sizeof* phy->packet);
33 NETSIM_ID d = pstruEventDetails->nDeviceId;
34 NETSIM_ID in = phy->interfaceId;
35 NetSim_BUFFER* buff = DEVICE_ACCESSBUFFER(d, in);
36 memcpy(phy->packet, buff,
sizeof* phy->packet);
37 phy->packet->nSchedulingType = SCHEDULING_FIFO;
38 phy->packet->queuingTechnique = QUEUING_DROPTAIL;
39 phy->packet->pstruPacketlist = NULL;
42static void eth_phy_packet_add_to_list(ptrETH_PHY phy, NetSim_PACKET* packet)
48 init_eth_phy_buffer(phy);
50 fn_NetSim_Packet_AddPacketToList(phy->packet, packet, 0);
53static NetSim_PACKET* eth_phy_packet_get_from_list(ptrETH_PHY phy)
58 return fn_NetSim_Packet_GetPacketFromBuffer(phy->packet, 1);
61static bool isPhyHasPacket(ptrETH_PHY phy)
64 return fn_NetSim_GetBufferStatus(phy->packet);
69double calculate_txtime(ptrETH_PHY phy,
double size)
71 double rate = phy->speed;
72 return (size * 8.0) / rate;
75static void eth_phy_packet_set_param(NetSim_PACKET* packet,
80 packet->pstruPhyData->dArrivalTime = start;
81 packet->pstruPhyData->dEndTime = end;
82 packet->pstruPhyData->dOverhead = 0;
83 packet->pstruPhyData->dPacketSize = packet->pstruMacData->dPacketSize;
84 packet->pstruPhyData->dPayload = packet->pstruMacData->dPacketSize;
85 packet->pstruPhyData->dStartTime = start + tx;
86 packet->pstruPhyData->nPhyMedium = PHY_MEDIUM_WIRED;
89static void eth_phy_add_phy_in(NetSim_PACKET* packet,
93 packet->nReceiverId = c;
94 packet->nTransmitterId = pstruEventDetails->nDeviceId;
96 NetSim_EVENTDETAILS pevent;
97 memset(&pevent, 0,
sizeof pevent);
98 pevent.dEventTime = packet->pstruPhyData->dEndTime;
99 pevent.dPacketSize = packet->pstruPhyData->dPacketSize;
100 if (packet->pstruAppData)
102 pevent.nApplicationId = packet->pstruAppData->nApplicationId;
103 pevent.nSegmentId = packet->pstruAppData->nSegmentId;
105 pevent.nDeviceId = c;
106 pevent.nDeviceType = DEVICE_TYPE(c);
107 pevent.nEventType = PHYSICAL_IN_EVENT;
108 pevent.nInterfaceId = ci;
109 pevent.nPacketId = packet->nPacketId;
110 pevent.nProtocolId = MAC_PROTOCOL_IEEE802_3;
111 pevent.pPacket = packet;
112 fnpAddEvent(&pevent);
115static void eth_phy_add_phy_out(
double time, NetSim_PACKET* packet)
117 NetSim_EVENTDETAILS pevent;
118 memcpy(&pevent, pstruEventDetails,
sizeof pevent);
119 pevent.dEventTime = time;
120 pevent.dPacketSize = packet->pstruMacData->dPacketSize;
121 if (packet->pstruAppData)
123 pevent.nApplicationId = packet->pstruAppData->nApplicationId;
124 pevent.nSegmentId = packet->pstruAppData->nSegmentId;
128 pevent.nApplicationId = 0;
129 pevent.nSegmentId = 0;
131 pevent.nPacketId = packet->nPacketId;
132 pevent.nSubEventType = 0;
133 pevent.pPacket = NULL;
134 fnpAddEvent(&pevent);
136int fn_NetSim_Ethernet_HandlePhyOut()
138 NETSIM_ID d = pstruEventDetails->nDeviceId;
139 NETSIM_ID in = pstruEventDetails->nInterfaceId;
140 ptrETH_PHY phy = ETH_PHY_GET(d, in);
141 NetSim_PACKET* packet = pstruEventDetails->pPacket;
144 if (isPhyHasPacket(phy))
147 eth_phy_packet_add_to_list(phy, packet);
149 if (phy->lastPacketEndTime > pstruEventDetails->dEventTime)
158 packet = eth_phy_packet_get_from_list(phy);
163 if (phy->lastPacketEndTime + phy->IFG <= pstruEventDetails->dEventTime)
164 start = pstruEventDetails->dEventTime;
166 start = phy->lastPacketEndTime + phy->IFG;
168 double size = packet->pstruMacData->dPacketSize;
170 double txtime = calculate_txtime(phy, size);
171 double end = start + txtime + phy->propagationDelay;
172 eth_phy_packet_set_param(packet, start, end, txtime);
174 eth_phy_add_phy_in(packet, phy->connectedDevice, phy->connectedInterface);
175 phy->lastPacketEndTime = start + txtime;
178 if (isPhyHasPacket(phy))
179 eth_phy_add_phy_out(phy->lastPacketEndTime,
180 fn_NetSim_Packet_GetPacketFromBuffer(phy->packet,0));
184int fn_NetSim_Ethernet_HandlePhyIn()
186 NetSim_PACKET* packet = pstruEventDetails->pPacket;
187 NETSIM_ID d = pstruEventDetails->nDeviceId;
188 NETSIM_ID in = pstruEventDetails->nInterfaceId;
189 ptrETH_PHY phy = ETH_PHY_GET(d, in);
191 if (phy->isErrorChkReqd)
193 packet->nPacketStatus = fn_NetSim_Packet_DecideError(phy->BER, packet->pstruPhyData->dPacketSize);
195 if (packet->nPacketStatus)
197 fn_NetSim_WritePacketTrace(packet);
198 fn_NetSim_Metrics_Add(packet);
199 fn_NetSim_Packet_FreePacket(packet);
204 fn_NetSim_WritePacketTrace(packet);
205 fn_NetSim_Metrics_Add(packet);
206 pstruEventDetails->nEventType = MAC_IN_EVENT;
207 fnpAddEvent(pstruEventDetails);