NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
NAT.c
1/************************************************************************************
2* Copyright (C) 2023 *
3* TETCOS, Bangalore. India *
4* *
5* Tetcos owns the intellectual property rights in the Product and its content. *
6* The copying, redistribution, reselling or publication of any or all of the *
7* Product or its content without express prior written consent of Tetcos is *
8* prohibited. Ownership and / or any other right relating to the software and all *
9* intellectual property rights therein shall remain at all times with Tetcos. *
10* *
11* Author: Shashi Kant Suman *
12* *
13* ---------------------------------------------------------------------------------*/
14#include "main.h"
15
16static void add_new_dest(NetSim_PACKET* packet, NETSIM_IPAddress ip)
17{
18 NetSim_PACKET_NETWORKLAYER* nw = calloc(1, sizeof* nw);
19
20 memcpy(nw, packet->pstruNetworkData, sizeof* nw);
21 nw->next = packet->pstruNetworkData;
22 packet->pstruNetworkData = nw;
23
24 nw->szDestIP = ip;
25 nw->Packet_NetworkProtocol = NULL;
26 nw->Packet_RoutingProtocol = NULL;
27}
28
29static void remove_dest(NetSim_PACKET* packet)
30{
31 NetSim_PACKET_NETWORKLAYER* nw = packet->pstruNetworkData;
32 NetSim_PACKET_NETWORKLAYER* nnw = nw->next;
33 if (nnw)
34 {
35 void* n = nnw->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);
40 nnw->next = n;
41 nnw->szDestIP = i;
42 packet->pstruNetworkData = nnw;
43 nw->next = NULL;
44 free(nw);
45 }
46}
47
48int fn_NetSim_NAT_NetworkOut(NETSIM_ID ndev,NetSim_PACKET* packet)
49{
50 NETSIM_IPAddress dest = packet->pstruNetworkData->szDestIP;
51 NETSIM_ID i;
52 NETSIM_IPAddress newDest = NULL;
53
54 UINT destCount;
55 NETSIM_ID* destList = get_dest_from_packet(packet, &destCount);
56
57 if(destCount>1)
58 return 1; //Broadcast or Multicast
59
60 if (destList[0] == 0)
61 return 1; //Broadcast
62
63 if (isMulticastIP(dest))
64 return 1;
65
66 for(i=0;i<DEVICE(ndev)->nNumOfInterface;i++)
67 {
68 if(DEVICE_INTERFACE(ndev,i+1) && DEVICE_INTERFACE(ndev,i+1)->szAddress)
69 {
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)
75 continue;
76 n1=IP_NETWORK_ADDRESS(ip,mask,prefix);
77 n2=IP_NETWORK_ADDRESS(dest,mask,prefix);
78 if(!IP_COMPARE(n1,n2))
79 return 2;
80 }
81 }
82 for(i=0;i<DEVICE(ndev)->nNumOfInterface;i++)
83 {
84 if(DEVICE_INTERFACE(ndev,i+1) && DEVICE_INTERFACE(ndev,i+1)->szAddress && DEVICE_INTERFACE(ndev,i+1)->szDefaultGateWay)
85 {
86 newDest = DEVICE_INTERFACE(ndev,i+1)->szDefaultGateWay;
87 break;
88 }
89 }
90
91 if (newDest)
92 {
93 //Set me to default
94 add_new_dest(packet, newDest);
95 }
96 else if (DEVICE_FIRST_PUBLICIP(destList[0]))
97 {
98 NETSIM_IPAddress pub = DEVICE_FIRST_PUBLICIP(destList[0]);
99 if (!IP_COMPARE(pub, dest))
100 return -1; // Already public ip is set
101
102 for (i = 0; i < DEVICE(ndev)->nNumOfInterface; i++)
103 {
104 if (DEVICE_INTERFACE(ndev, i + 1) && DEVICE_INTERFACE(ndev, i + 1)->szAddress)
105 {
106 if (!IP_COMPARE(DEVICE_NWADDRESS(ndev, i + 1), pub))
107 return -1; // I am public ip of dest
108 }
109 }
110
111 //set me to public ip
112 add_new_dest(packet, DEVICE_FIRST_PUBLICIP(destList[0]));
113 }
114 return 0;
115}
116
117int fn_NetSim_NAT_NetworkIn(NETSIM_ID ndev,NetSim_PACKET* packet)
118{
119 UINT destCount;
120 NETSIM_ID* dest = get_dest_from_packet(packet, &destCount);
121 if (destCount > 1)
122 return -1; //Broadcast or Multicast
123
124 if (ndev == dest[0])
125 {
126 remove_dest(packet);
127 return -2;
128 }
129
130 if (isBroadcastIP(packet->pstruNetworkData->szDestIP))
131 return -3;
132
133 if (isMulticastIP(packet->pstruNetworkData->szDestIP))
134 return -4;
135
136 NETSIM_ID i;
137 NETSIM_IPAddress ip = packet->pstruNetworkData->szDestIP;
138 bool flag = false;
139 for (i = 0; i < DEVICE(ndev)->nNumOfInterface; i++)
140 {
141 if (DEVICE_INTERFACE(ndev, i + 1) &&
142 DEVICE_INTERFACE(ndev, i + 1)->szAddress &&
143 !IP_COMPARE(ip, DEVICE_NWADDRESS(ndev, i + 1)))
144 {
145 flag = true;
146 break;
147 }
148 }
149
150 if (flag)
151 remove_dest(packet);
152
153 return 0;
154}