13#define _CRT_SECURE_NO_DEPRECATE
36int fn_NetSim_Generate_ARP_Request(NetSim_EVENTDETAILS *pstruEventDetails,
struct stru_NetSim_Network *NETWORK)
39 NETSIM_ID nInterfaceId;
40 NETSIM_ID nDestinationId = 0;
42 NETSIM_IPAddress szSrcIPadd,szNextHopIp;
43 NETSIM_IPAddress szSubnetMaskAdd;
44 NETSIM_IPAddress szDestIPadd;
45 unsigned int unProtocolId;
47 NetSim_PACKET *pstruTemp_Data;
48 NetSim_PACKET *pstruControlPacket;
49 ARP_PACKET *pstruArpRequestPkt;
50 ARP_VARIABLES *pstruArpVariables;
53 pstruTemp_Data =pstruEventDetails->pPacket;
55 nInterfaceId = pstruEventDetails->nInterfaceId;
56 nDeviceId = pstruEventDetails->nDeviceId;
58 szSrcIPadd = pstruTemp_Data->pstruNetworkData->szSourceIP;
59 szDestIPadd = pstruTemp_Data->pstruNetworkData->szDestIP;
60 szNextHopIp = pstruTemp_Data->pstruNetworkData->szNextHopIp;
61 if(IP_COMPARE(szSrcIPadd,DEVICE_INTERFACE(nDeviceId,nInterfaceId)->szAddress) != 0)
63 szSrcIPadd = DEVICE_INTERFACE(nDeviceId,nInterfaceId)->szAddress;
66 szDestIPadd = szNextHopIp;
69 szSubnetMaskAdd = DEVICE_INTERFACE(nDeviceId,nInterfaceId)->szSubnetMask;
71 nCheckSubnet = IP_IS_IN_SAME_NETWORK_IPV4(szSrcIPadd,szDestIPadd,szSubnetMaskAdd);
73 pstruArpVariables = DEVICE_INTERFACE(nDeviceId,nInterfaceId)->ipVar;
76 pstruArpRequestPkt = fnpAllocateMemory(1,
sizeof(ARP_PACKET));
80 nDestinationId = get_first_dest_from_packet(pstruEventDetails->pPacket);
81 pstruArpRequestPkt->
sz_ar$tpa = IP_COPY(szDestIPadd);
85 char sip[_NETSIM_IP_LEN],dip[_NETSIM_IP_LEN];
86 IP_TO_STR(szSrcIPadd,sip);
87 IP_TO_STR(szDestIPadd,dip);
88 fnNetSimError(
"ARP--- Packet nexthop and gateway in different LAN\nSrc IP = %s\tDest IP =%s\n",sip,dip);
93 pstruArpRequestPkt->
n_ar$hrd = IEEE802;
94 pstruArpRequestPkt->
n_ar$pro = ARP_TO_RESOLVE_IP;
95 pstruArpRequestPkt->
usn_ar$hln = HARDWARE_ADDRESS_LENGTH;
96 pstruArpRequestPkt->
n_ar$op = ares_opSREQUEST;
98 pstruArpRequestPkt->
sz_ar$sha= DEVICE_INTERFACE(nDeviceId,nInterfaceId)->pstruMACLayer->szMacAddress;
99 pstruArpRequestPkt->
sz_ar$spa = IP_COPY(szSrcIPadd);
102 pstruArpRequestPkt->
szDestMac = BROADCAST_MAC;
103 pstruArpRequestPkt->
szSrcMac = DEVICE_INTERFACE(nDeviceId,nInterfaceId)->pstruMACLayer->szMacAddress;
104 pstruArpRequestPkt->
nEther_type = ADDRESS_RESOLUTION;
106 pstruControlPacket = fn_NetSim_Packet_CreatePacket(NETWORK_LAYER);
108 pstruControlPacket->dEventTime = pstruEventDetails->dEventTime;
109 add_dest_to_packet(pstruControlPacket, 0);
110 pstruControlPacket->nPacketType = PacketType_Control;
111 pstruControlPacket->nControlDataType = REQUEST_PACKET;
112 pstruControlPacket->nTransmitterId = pstruEventDetails->nDeviceId;
113 pstruControlPacket->nReceiverId = 0;
114 pstruControlPacket->nSourceId = pstruEventDetails->nDeviceId;
116 pstruControlPacket->pstruNetworkData->szSourceIP = IP_COPY(DEVICE_NWADDRESS(nDeviceId,nInterfaceId));
118 pstruControlPacket->pstruNetworkData->szDestIP = szBroadcastIPaddress;
120 pstruControlPacket->pstruMacData->szSourceMac = (DEVICE_INTERFACE(nDeviceId,nInterfaceId)->pstruMACLayer->szMacAddress);
122 pstruControlPacket->pstruMacData->szDestMac = BROADCAST_MAC;
124 pstruControlPacket->pstruNetworkData->dArrivalTime = pstruEventDetails->dEventTime;
125 pstruControlPacket->pstruNetworkData->dEndTime = pstruEventDetails->dEventTime;
126 pstruControlPacket->pstruNetworkData->dStartTime = pstruEventDetails->dEventTime;
127 pstruControlPacket->nPacketPriority = Priority_High;
129 unProtocolId = fn_NetSim_Stack_GetNWProtocol(nDeviceId);
130 if(unProtocolId == NW_PROTOCOL_IPV4)
132 pstruArpRequestPkt->
usn_ar$pln = IPV4_PROTOCOL_ADDREES_LENGTH;
133 pstruControlPacket->pstruNetworkData->dPayload = IPV4_ARP_PACKET_SIZE_WITH_ETH_HEADER;
134 pstruControlPacket->pstruNetworkData->dOverhead = IPV4_NETWORK_OVERHEADS;
138 pstruArpRequestPkt->
usn_ar$pln = IPV6_PROTOCOL_ADDREES_LENGTH;
139 pstruControlPacket->pstruNetworkData->dPayload = IPV6_ARP_PACKET_SIZE_WITH_ETH_HEADER;
140 pstruControlPacket->pstruNetworkData->dOverhead = IPV6_NETWORK_OVERHEADS;
142 pstruControlPacket->pstruNetworkData->dPacketSize = pstruControlPacket->pstruNetworkData->dPayload + pstruControlPacket->pstruNetworkData->dOverhead;
144 pstruControlPacket->pstruNetworkData->nNetworkProtocol = NW_PROTOCOL_ARP;
146 pstruControlPacket->pstruNetworkData->Packet_NetworkProtocol = pstruArpRequestPkt;
147 pstruControlPacket->pstruNextPacket=NULL;
150 if(!fn_NetSim_GetBufferStatus(DEVICE_INTERFACE(nDeviceId,nInterfaceId)->pstruAccessInterface->pstruAccessBuffer))
152 pstruEventDetails->nSubEventType = 0;
153 pstruEventDetails->dPacketSize = pstruControlPacket->pstruNetworkData->dPacketSize;
154 pstruEventDetails->nProtocolId = fn_NetSim_Stack_GetMacProtocol(nDeviceId,nInterfaceId);
155 pstruEventDetails->nApplicationId = 0;
156 pstruEventDetails->nPacketId = 0;
157 pstruEventDetails->nSegmentId = 0;
158 pstruEventDetails->nEventType =MAC_OUT_EVENT;
159 pstruEventDetails->pPacket = NULL;
160 fnpAddEvent( pstruEventDetails);
162 fn_NetSim_Packet_AddPacketToList(DEVICE_INTERFACE(nDeviceId,nInterfaceId)->pstruAccessInterface->pstruAccessBuffer,pstruControlPacket,0);
168 printf(
"ARP---ARP_RequestSent\tEventTime:%0.3lf\tSrcIP:%s\tDestIP:%s \n",pstruEventDetails->dEventTime,szSrcIPadd->str_ip,pstruArpRequestPkt->
sz_ar$tpa->str_ip);
171 pstruControlPacket = fn_NetSim_Packet_CopyPacket(pstruTemp_Data);
172 remove_dest_from_packet(pstruControlPacket, 0);
173 add_dest_to_packet(pstruControlPacket, nDestinationId);
175 pstruEventDetails->dEventTime = pstruEventDetails->dEventTime + (pstruArpVariables->
nArpRetryInterval*1000000);
176 pstruEventDetails->nEventType = TIMER_EVENT;
177 pstruEventDetails->nSubEventType = ARP_REQUEST_TIMEOUT;
178 pstruEventDetails->pPacket = pstruControlPacket;
179 pstruEventDetails->nProtocolId = NW_PROTOCOL_ARP;
180 fnpAddEvent(pstruEventDetails);
182 pstruEventDetails->pPacket = NULL;
int * pnArpRequestFlag
Set when generate Request.
int * pnArpRetryCount
To keep track of number of retries.
ARP_METRICS * pstruArpMetrics
NetSim specific ARP metrics structure.
int nArpRetryInterval
Store the ARP_RETRY_INTERVAL from the config file.
int nArpRequestSentCount
Number of requests sent from the source.
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.