15#define _CRT_SECURE_NO_DEPRECATE
31int fn_NetSim_Generate_ARP_Reply(NetSim_EVENTDETAILS *pstruEventDetails,
struct stru_NetSim_Network *NETWORK)
35 NETSIM_ID nInterfaceId;
38 unsigned int unProtocolId;
39 NETSIM_IPAddress szSrcIPadd;
40 NETSIM_IPAddress szDestIPadd;
41 PNETSIM_MACADDRESS szTargetMAC;
43 NetSim_PACKET *pstruTemp_Data;
44 NetSim_PACKET *pstruControlPacket;
45 ARP_PACKET *pstruArpRequestPkt;
46 ARP_PACKET *pstruArpReplyPkt;
47 ARP_TABLE *pstruTableHead,*pstruCurrentTable;
48 ARP_VARIABLES *pstruArpVariables;
51 pstruTemp_Data =pstruEventDetails->pPacket;
52 pstruControlPacket = pstruEventDetails->pPacket;
54 pstruArpRequestPkt = pstruTemp_Data->pstruNetworkData->Packet_NetworkProtocol;
56 nInterfaceId = pstruEventDetails->nInterfaceId;
57 nDeviceId = pstruEventDetails->nDeviceId;
59 if(pstruArpRequestPkt->
n_ar$hrd != IEEE802)
60 fnNetSimError(
"Mismatch in ARP Hardware Type");
61 if(pstruArpRequestPkt->
usn_ar$hln != HARDWARE_ADDRESS_LENGTH)
62 fnNetSimError(
"Mismatch in ARP Hardware/MAC Adress Length ");
63 if(pstruArpRequestPkt->
n_ar$pro != ARP_TO_RESOLVE_IP)
64 fnNetSimError(
"Mismatch in ARP Protocol Type");
65 unProtocolId = fn_NetSim_Stack_GetNWProtocol(nDeviceId);
66 if(unProtocolId == NW_PROTOCOL_IPV4)
68 if(pstruArpRequestPkt->
usn_ar$pln != IPV4_PROTOCOL_ADDREES_LENGTH)
69 fnNetSimError(
"Mismatch in ARP Protocol IPV4 Adress Length ");
73 if(pstruArpRequestPkt->
usn_ar$pln != IPV6_PROTOCOL_ADDREES_LENGTH)
74 fnNetSimError(
"Mismatch in ARP Protocol IPV6 Adress Length ");
77 pstruArpVariables = DEVICE_INTERFACE(nDeviceId,nInterfaceId)->ipVar;
78 pstruTableHead = pstruArpVariables->pstruArpTable;
79 pstruCurrentTable = pstruTableHead;
81 szSrcIPadd = pstruArpRequestPkt->
sz_ar$spa;
83 while(pstruCurrentTable != NULL)
85 if(IP_COMPARE(pstruCurrentTable->
szIPAddress,szSrcIPadd)== 0)
97 fn_NetSim_Add_IP_MAC_AddressTo_ARP_Table(&pstruTableHead,pstruArpRequestPkt->
sz_ar$spa,pstruArpRequestPkt->
sz_ar$sha,nType);
98 pstruArpVariables->pstruArpTable = pstruTableHead;
103 if(pstruArpRequestPkt->
n_ar$op == ares_opSREQUEST)
106 pstruArpReplyPkt = fnpAllocateMemory(1,
sizeof(ARP_PACKET));
109 pstruArpReplyPkt->
sz_ar$sha = DEVICE_INTERFACE(nDeviceId,nInterfaceId)->pstruMACLayer->szMacAddress;
112 pstruArpReplyPkt->
n_ar$op = ares_opSREPLY;
115 pstruArpReplyPkt->
szSrcMac = (DEVICE_INTERFACE(nDeviceId,nInterfaceId)->pstruMACLayer->szMacAddress);
116 pstruArpReplyPkt->
nEther_type = ADDRESS_RESOLUTION;
118 pstruArpReplyPkt->
n_ar$hrd = IEEE802;
119 pstruArpReplyPkt->
n_ar$pro = ARP_TO_RESOLVE_IP;
120 pstruArpReplyPkt->
usn_ar$hln = HARDWARE_ADDRESS_LENGTH;
122 pstruControlPacket = fn_NetSim_Packet_CreatePacket(NETWORK_LAYER);
124 pstruControlPacket->dEventTime = pstruEventDetails->dEventTime;
125 add_dest_to_packet(pstruControlPacket, pstruEventDetails->pPacket->nSourceId);
126 pstruControlPacket->nPacketType = PacketType_Control;
127 pstruControlPacket->nControlDataType = REPLY_PACKET;
128 pstruControlPacket->nTransmitterId=pstruEventDetails->nDeviceId;
129 pstruControlPacket->nReceiverId = pstruEventDetails->pPacket->nTransmitterId;
130 pstruControlPacket->nSourceId = pstruEventDetails->nDeviceId;
132 pstruControlPacket->pstruNetworkData->szSourceIP = IP_COPY(DEVICE_NWADDRESS(nDeviceId,nInterfaceId));
133 pstruControlPacket->pstruNetworkData->szDestIP = IP_COPY(pstruArpRequestPkt->
sz_ar$spa);
135 pstruControlPacket->pstruMacData->szSourceMac = DEVICE_INTERFACE(nDeviceId,nInterfaceId)->pstruMACLayer->szMacAddress;
136 pstruControlPacket->pstruMacData->szDestMac = pstruArpRequestPkt->
sz_ar$sha;
138 pstruControlPacket->pstruNetworkData->dArrivalTime = pstruEventDetails->dEventTime;
139 pstruControlPacket->pstruNetworkData->dEndTime = pstruEventDetails->dEventTime;
140 pstruControlPacket->pstruNetworkData->dStartTime = pstruEventDetails->dEventTime;
141 pstruControlPacket->nPacketPriority = Priority_High;
143 unProtocolId = fn_NetSim_Stack_GetNWProtocol(nDeviceId);
144 if(unProtocolId == NW_PROTOCOL_IPV4)
146 pstruArpReplyPkt->
usn_ar$pln = IPV4_PROTOCOL_ADDREES_LENGTH;
147 pstruControlPacket->pstruNetworkData->dPayload = IPV4_ARP_PACKET_SIZE_WITH_ETH_HEADER;
148 pstruControlPacket->pstruNetworkData->dOverhead =IPV4_NETWORK_OVERHEADS;
152 pstruArpReplyPkt->
usn_ar$pln = IPV6_PROTOCOL_ADDREES_LENGTH;
153 pstruControlPacket->pstruNetworkData->dPayload = IPV6_ARP_PACKET_SIZE_WITH_ETH_HEADER;
154 pstruControlPacket->pstruNetworkData->dOverhead = IPV6_NETWORK_OVERHEADS;
156 pstruControlPacket->pstruNetworkData->dPacketSize=pstruControlPacket->pstruNetworkData->dPayload + pstruControlPacket->pstruNetworkData->dOverhead;
158 pstruControlPacket->pstruNetworkData->nNetworkProtocol= NW_PROTOCOL_ARP;
160 pstruControlPacket->pstruNetworkData->Packet_NetworkProtocol = pstruArpReplyPkt;
161 pstruControlPacket->pstruNextPacket=NULL;
164 if(!fn_NetSim_GetBufferStatus(DEVICE_INTERFACE(nDeviceId,nInterfaceId)->pstruAccessInterface->pstruAccessBuffer))
166 pstruEventDetails->nSubEventType = 0;
167 pstruEventDetails->dPacketSize = pstruControlPacket->pstruNetworkData->dPacketSize;
168 pstruEventDetails->nProtocolId = fn_NetSim_Stack_GetMacProtocol(nDeviceId,nInterfaceId);
169 pstruEventDetails->nEventType=MAC_OUT_EVENT;
170 pstruEventDetails->pPacket = NULL;
171 fnpAddEvent( pstruEventDetails);
174 fn_NetSim_Packet_AddPacketToList(DEVICE_INTERFACE(nDeviceId,nInterfaceId)->pstruAccessInterface->pstruAccessBuffer,pstruControlPacket,0);
180 szDestIPadd = DEVICE_NWADDRESS(nDeviceId,nInterfaceId);
181 szTargetMAC = pstruArpReplyPkt->
sz_ar$sha;
182 printf(
"ARP---ARP_ReplySent\tEventTime:%0.3lf\tSrcIP:%s\tMAC_Add:%s\tDestIP:%s \n",
183 pstruEventDetails->dEventTime,
185 szTargetMAC->szmacaddress,
191 fnNetSimError(
"Error in ARP REQEUST. This function should never be called");
194 fn_NetSim_Packet_FreePacket(pstruTemp_Data);
195 pstruTemp_Data = NULL;
196 pstruEventDetails->pPacket = NULL;
ARP_METRICS * pstruArpMetrics
NetSim specific ARP metrics structure.
int nArpReplySentCount
Number of replies sent from the destination.
struct stru_ARP_Table * pstruNextEntry
Next entry pointer.
NETSIM_IPAddress szIPAddress
IP address of the deivce.
PNETSIM_MACADDRESS szDestMac
Destination MAC address.
unsigned short int usn_ar$pln
Protocol address length 1 byte,specifies the sizes of the protocol address in bytes.
ETHERNET_TYPE nEther_type
Ethernet Type.
NETSIM_IPAddress sz_ar$spa
Protocol address of the sender.
PNETSIM_MACADDRESS sz_ar$tha
Hardware address of target (if know) otherwise empty 6 bytes.
OPCODE n_ar$op
Operation REQUEST/REPLY 2 bytes.
unsigned short int usn_ar$hln
H/W address length 1 byte ,specifies the sizes of the H/W address in bytes.
HARDWARETYPE n_ar$hrd
Hardware Type 2 bytes.
PNETSIM_MACADDRESS sz_ar$sha
Hardware address of the sender.
PNETSIM_MACADDRESS szSrcMac
Source MAC address.
PROTOCOLTYPE n_ar$pro
Protocol Type 2 bytes.
NETSIM_IPAddress sz_ar$tpa
Protocol address of target.