20 for(i=0;i<NETWORK->nDeviceCount;i++)
22 for(j=0;j<DEVICE(i+1)->nNumOfInterface;j++)
24 if(DEVICE_MACLAYER(i+1,j+1))
26 PCSMACD_PHYVAR phy = CSMACD_PHY(i+1,j+1);
27 if(phy && phy->link_state == LinkState_UP)
35void transmit_packet(NetSim_PACKET* packet)
37 PCSMACD_PHYVAR phyt = CSMACD_PHY(packet->nTransmitterId,1);
39 phyt->link_state = LinkState_UP;
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);
53double calulate_transmission_time(NetSim_PACKET* packet)
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;
62void check_for_collision(NetSim_PACKET* p)
65 for(i=0;i<NETWORK->nDeviceCount;i++)
67 PCSMACD_PHYVAR phy = CSMACD_PHY(i+1,1);
69 if(i+1==p->nTransmitterId)
72 if(phy->link_state != LinkState_DOWN)
74 p->nPacketStatus = PacketStatus_Collided;
75 phy->collision_count++;
77 if(file_collision != NULL)
79 fprintf(file_collision,
"%d\t%d\t%f\n",i+1,phy->collision_count,pstruEventDetails->dEventTime);
86void reinit_phy(NETSIM_ID
id)
88 PCSMACD_PHYVAR phy = CSMACD_PHY(
id,1);
89 phy->link_state = LinkState_DOWN;
94 for(i=0;i<NETWORK->nDeviceCount;i++)
96 if(DEVICE_TYPE(i+1)==NODE)
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);
113void fn_NetSim_CSMACD_PhyOut()
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;
125 if(*t<packet->pstruPhyData->dStartTime)
126 *t=packet->pstruPhyData->dStartTime;
128 packet->pstruPhyData->dStartTime=*t;
130 dTxTime=calulate_transmission_time(packet);
132 CSMACD_CURRMAC->macState=Idle;
135 packet->pstruPhyData->dEndTime=packet->pstruPhyData->dStartTime+dTxTime;
136 *t = packet->pstruPhyData->dEndTime;
138 if(packet->nReceiverId)
140 transmit_packet(packet);
141 check_for_collision(packet);
147 for(loop=0;loop<NETWORK->nDeviceCount;loop++)
149 if(DEVICE_TYPE(loop+1) != HUB && loop+1!=packet->nTransmitterId)
151 NetSim_PACKET* p = fn_NetSim_Packet_CopyPacket(packet);
153 p->nReceiverId=loop+1;
155 check_for_collision(p);
158 fn_NetSim_Packet_FreePacket(packet);
162void fn_NetSim_CSMACD_PhyIn()
165 NETSIM_ID tx = pstruEventDetails->pPacket->nTransmitterId;
167 check_for_collision(pstruEventDetails->pPacket);
169 if(pstruEventDetails->pPacket->nPacketStatus == PacketStatus_Collided)
172 fn_NetSim_Packet_FreePacket(CSMACD_MAC(tx,1)->currentPacket);
173 CSMACD_MAC(tx,1)->currentPacket=NULL;
174 CSMACD_MAC(tx,1)->nRetryCount = 0;
176 ber = DEVICE_PHYLAYER(tx,1)->pstruNetSimLinks->puniMedProp.pstruWiredLink.dErrorRateUp;
178 pstruEventDetails->pPacket->nPacketStatus =
179 fn_NetSim_Packet_DecideError(ber,
180 pstruEventDetails->pPacket->pstruPhyData->dPacketSize);
182 if(pstruEventDetails->pPacket->nPacketStatus == PacketStatus_Error)
185 pstruEventDetails->nEventType = MAC_IN_EVENT;
186 fnpAddEvent(pstruEventDetails);
189 fn_NetSim_WritePacketTrace(pstruEventDetails->pPacket);
190 fn_NetSim_Metrics_Add(pstruEventDetails->pPacket);
192 if(pstruEventDetails->pPacket->nPacketStatus != PacketStatus_NoError)
193 fn_NetSim_Packet_FreePacket(pstruEventDetails->pPacket);