16static void add_new_dest(NetSim_PACKET* packet, NETSIM_IPAddress ip)
18 NetSim_PACKET_NETWORKLAYER* nw = calloc(1,
sizeof* nw);
20 memcpy(nw, packet->pstruNetworkData,
sizeof* nw);
21 nw->next = packet->pstruNetworkData;
22 packet->pstruNetworkData = nw;
25 nw->Packet_NetworkProtocol = NULL;
26 nw->Packet_RoutingProtocol = NULL;
29static void remove_dest(NetSim_PACKET* packet)
31 NetSim_PACKET_NETWORKLAYER* nw = packet->pstruNetworkData;
32 NetSim_PACKET_NETWORKLAYER* nnw = nw->next;
36 void* i = nnw->szDestIP;
37 nw->Packet_NetworkProtocol = nnw->Packet_NetworkProtocol;
38 nw->Packet_RoutingProtocol = nnw->Packet_RoutingProtocol;
39 memcpy(nnw, nw,
sizeof* nnw);
42 packet->pstruNetworkData = nnw;
48int fn_NetSim_NAT_NetworkOut(NETSIM_ID ndev,NetSim_PACKET* packet)
50 NETSIM_IPAddress dest = packet->pstruNetworkData->szDestIP;
52 NETSIM_IPAddress newDest = NULL;
55 NETSIM_ID* destList = get_dest_from_packet(packet, &destCount);
63 if (isMulticastIP(dest))
66 for(i=0;i<DEVICE(ndev)->nNumOfInterface;i++)
68 if(DEVICE_INTERFACE(ndev,i+1) && DEVICE_INTERFACE(ndev,i+1)->szAddress)
70 NETSIM_IPAddress ip = DEVICE_INTERFACE(ndev,i+1)->szAddress;
71 NETSIM_IPAddress mask = DEVICE_INTERFACE(ndev,i+1)->szSubnetMask;
72 unsigned int prefix = DEVICE_INTERFACE(ndev,i+1)->prefix_len;
73 NETSIM_IPAddress n1,n2;
74 if(dest->type != ip->type)
76 n1=IP_NETWORK_ADDRESS(ip,mask,prefix);
77 n2=IP_NETWORK_ADDRESS(dest,mask,prefix);
78 if(!IP_COMPARE(n1,n2))
82 for(i=0;i<DEVICE(ndev)->nNumOfInterface;i++)
84 if(DEVICE_INTERFACE(ndev,i+1) && DEVICE_INTERFACE(ndev,i+1)->szAddress && DEVICE_INTERFACE(ndev,i+1)->szDefaultGateWay)
86 newDest = DEVICE_INTERFACE(ndev,i+1)->szDefaultGateWay;
94 add_new_dest(packet, newDest);
96 else if (DEVICE_FIRST_PUBLICIP(destList[0]))
98 NETSIM_IPAddress pub = DEVICE_FIRST_PUBLICIP(destList[0]);
99 if (!IP_COMPARE(pub, dest))
102 for (i = 0; i < DEVICE(ndev)->nNumOfInterface; i++)
104 if (DEVICE_INTERFACE(ndev, i + 1) && DEVICE_INTERFACE(ndev, i + 1)->szAddress)
106 if (!IP_COMPARE(DEVICE_NWADDRESS(ndev, i + 1), pub))
112 add_new_dest(packet, DEVICE_FIRST_PUBLICIP(destList[0]));
117int fn_NetSim_NAT_NetworkIn(NETSIM_ID ndev,NetSim_PACKET* packet)
120 NETSIM_ID* dest = get_dest_from_packet(packet, &destCount);
130 if (isBroadcastIP(packet->pstruNetworkData->szDestIP))
133 if (isMulticastIP(packet->pstruNetworkData->szDestIP))
137 NETSIM_IPAddress ip = packet->pstruNetworkData->szDestIP;
139 for (i = 0; i < DEVICE(ndev)->nNumOfInterface; i++)
141 if (DEVICE_INTERFACE(ndev, i + 1) &&
142 DEVICE_INTERFACE(ndev, i + 1)->szAddress &&
143 !IP_COMPARE(ip, DEVICE_NWADDRESS(ndev, i + 1)))