28static bool isPublicIPReqd(NETSIM_ID d)
32 for (i = 0; i < DEVICE(d)->nNumOfInterface; i++)
34 if (DEVICE_INTERFACE(d, i + 1) &&
35 DEVICE_INTERFACE(d, i + 1)->nInterfaceType == INTERFACE_WAN_ROUTER)
38 if (DEVICE_INTERFACE(d, i + 1) &&
39 DEVICE_INTERFACE(d, i + 1)->szDefaultGateWay)
45static NETSIM_IPAddress find_default_gateway(NETSIM_ID d,NETSIM_ID* di)
48 for (i = 0; i < DEVICE(d)->nNumOfInterface; i++)
50 if (DEVICE_INTERFACE(d, i + 1) &&
51 DEVICE_INTERFACE(d, i + 1)->szDefaultGateWay)
54 return DEVICE_INTERFACE(d, i + 1)->szDefaultGateWay;
61static NETSIM_IPAddress find_wan_ip(NETSIM_ID d, NETSIM_ID* wi)
64 for (i = 0; i < DEVICE(d)->nNumOfInterface; i++)
66 if (DEVICE_INTERFACE(d, i + 1) &&
67 DEVICE_INTERFACE(d, i + 1)->nInterfaceType == INTERFACE_WAN_ROUTER)
70 return DEVICE_INTERFACE(d, i + 1)->szAddress;
77static void assign_public_ip(NETSIM_ID d, NETSIM_IPAddress ip)
80 for (i = 0; i < DEVICE(d)->nNumOfInterface; i++)
82 if (DEVICE_INTERFACE(d, i + 1) &&
83 DEVICE_INTERFACE(d, i + 1)->szDefaultGateWay)
85 DEVICE_PUBLICIP(d, i + 1) = ip;
86 fprintf(stdout,
"Public IP of %d-%d is %s\n",
87 d, i + 1, ip->str_ip);
95 NETSIM_IPAddress subnet;
100static void add_route(NETSIM_ID d, ptrIPLIST list,
101 NETSIM_IPAddress interfaceAddress,NETSIM_IPAddress nextHop)
103 NETSIM_ID di = fn_NetSim_Stack_GetInterfaceIdFromIP(d, interfaceAddress);
106 NETSIM_IPAddress dest = IP_NETWORK_ADDRESS(list->ip, list->subnet,list->prefix_len);
108 iptable_add(IP_WRAPPER_GET(d),
109 dest, list->subnet, list->prefix_len,
110 nextHop, 1, &interfaceAddress, &di, 1,
"IP");
115static void setup_route_table_for_all_network(NETSIM_ID d, NETSIM_ID w, NETSIM_ID wi,
124 NETSIM_IPAddress defaultGateway = find_default_gateway(d, &di);
125 c = fn_NetSim_Stack_GetDeviceId_asIP(defaultGateway, &ci);
126 add_route(c, ipList, defaultGateway, DEVICE_NWADDRESS(d, di));
135static void setup_route_table(NETSIM_ID d, NETSIM_ID w, NETSIM_ID wi)
137 NETSIM_IPAddress pubIP = DEVICE_NWADDRESS(w, wi);
139 ptrIPLIST head = NULL;
140 ptrIPLIST tail = NULL;
141 NETSIM_IPAddress defaultGateway = NULL;
144 for (i = 0; i < DEVICE(d)->nNumOfInterface; i++)
146 if (DEVICE_INTERFACE(d, i + 1) &&
147 DEVICE_NWADDRESS(d, i + 1))
149 if (DEVICE_INTERFACE(d, i + 1)->szDefaultGateWay && !defaultGateway)
151 defaultGateway = DEVICE_INTERFACE(d, i + 1)->szDefaultGateWay;
155 ptrIPLIST l = calloc(1,
sizeof * l);
156 l->ip = DEVICE_INTERFACE(d, i + 1)->szAddress;
157 l->subnet = DEVICE_INTERFACE(d, i + 1)->szSubnetMask;
158 l->prefix_len = DEVICE_INTERFACE(d, i + 1)->prefix_len;;
175 setup_route_table_for_all_network(d, w, wi, head);
185void set_public_ip(NETSIM_ID d)
187 if (!isPublicIPReqd(d))
194 NETSIM_IPAddress defaultGateway = find_default_gateway(c, &ci);
198 c = fn_NetSim_Stack_GetDeviceId_asIP(defaultGateway, &ci);
200 NETSIM_IPAddress wanIP = find_wan_ip(c, &ci);
204 assign_public_ip(d, wanIP);
205 c = fn_NetSim_Stack_GetDeviceId_asIP(wanIP, &ci);
206 setup_route_table(d, c, ci);