21static bool isInPresentInRoute(NETSIM_ID d, NETSIM_ID in, ptrIP_FORWARD_ROUTE route)
24 for (i = 0; i < route->count; i++)
26 if (!IP_COMPARE(DEVICE_NWADDRESS(d, in), route->gateway[i]))
32static bool isIamSrc(NetSim_PACKET* packet, NETSIM_ID d)
35 for (i = 0; i < DEVICE(d)->nNumOfInterface; i++)
37 if (!IP_COMPARE(DEVICE_NWADDRESS(d, i + 1), packet->pstruNetworkData->szSourceIP))
43#define isBroadcastInterface(d,i) (DEVICE_INTERFACE(d,i)->nInterfaceType != INTERFACE_WAN_ROUTER)
44static bool isIamDR(NETSIM_ID d, NETSIM_ID in)
46 ptrPIM_VAR pim = GET_PIM_VAR(d);
48 if (isBroadcastInterface(d, in))
50 if (!pim->DR[in - 1] || !IP_COMPARE(pim->DR[in - 1],
51 DEVICE_NWADDRESS(d, in)))
61 bool isMsgArrivesFromBroadcastInterface =
false;
63 NETSIM_ID d = pstruEventDetails->nDeviceId;
64 NetSim_PACKET* packet = pstruEventDetails->pPacket;
65 NETSIM_IPAddress gip = packet->pstruNetworkData->szDestIP;
67 if (!isMulticastIP(gip))
70 NETSIM_IPAddress src = packet->pstruNetworkData->szSourceIP;
71 ptrPIM_GROUP gr = pim_find_group(d, gip);
72 ptrPIM_VAR pim = GET_PIM_VAR(d);
73 NETSIM_ID in = pstruEventDetails->nInterfaceId;
79 if (isIamSrc(packet, d))
82 if (DEVICE_INTERFACE(d, in)->nInterfaceType != INTERFACE_WAN_ROUTER)
83 isMsgArrivesFromBroadcastInterface =
true;
84 NetSim_PACKET* dummy = fn_NetSim_Packet_CreatePacket(NETWORK_LAYER);
86 sid = fn_NetSim_Stack_GetDeviceId_asIP(src, &sin);
87 dummy->pstruNetworkData->szDestIP = DEVICE_PUBLICIP(sid, sin);
88 dummy->pstruNetworkData->szSourceIP = DEVICE_NWADDRESS(d, 1);
90 ptrIP_FORWARD_ROUTE route = fn_NetSim_IP_RoutePacket(dummy, d);
94 fnNetSimError(
"Packet is reached to router without valid route to source\n");
96 fn_NetSim_Packet_FreePacket(dummy);
98 if (!isMsgArrivesFromBroadcastInterface)
100 if (!isInPresentInRoute(d, in, route))
105 for (i = 0; i < DEVICE(d)->nNumOfInterface; i++)
110 if (isBroadcastInterface(d, i + 1))
112 NETSIM_IPAddress subnet = DEVICE_INTERFACE(d, i + 1)->szSubnetMask;
113 if (IP_IS_IN_SAME_NETWORK_IPV4(src, DEVICE_NWADDRESS(d, i + 1), subnet))
117 if (isInPresentInRoute(d, i+1, route) && !isMsgArrivesFromBroadcastInterface)
120 if (!isIamDR(d, i + 1))
124 NetSim_PACKET* fpacket = fn_NetSim_Packet_CopyPacket(packet);
125 if (isBroadcastInterface(d, i + 1))
127 fpacket->pstruNetworkData->szNextHopIp = gip;
129 fpacket->pstruNetworkData->szGatewayIP = DEVICE_NWADDRESS(d, i + 1);
131 NETSIM_ID l = fn_NetSim_Stack_GetConnectedDevice(d, i + 1, &c, &ci);
132 if (DEVICE_NWADDRESS(c, ci))
133 fpacket->pstruNetworkData->szNextHopIp = DEVICE_NWADDRESS(c, ci);
135 NetSim_EVENTDETAILS pevent;
136 memcpy(&pevent, pstruEventDetails,
sizeof pevent);
137 pevent.dPacketSize = fpacket->pstruNetworkData->dPacketSize;
138 pevent.nEventType = NETWORK_OUT_EVENT;
139 pevent.nInterfaceId = i + 1;
140 pevent.pPacket = fpacket;
141 fnpAddEvent(&pevent);
144 fn_NetSim_Packet_FreePacket(packet);
145 pstruEventDetails->pPacket = NULL;