28#include "NetSim_utility.h"
29#include "../Firewall/Firewall.h"
31#include "../SupportFunction/Scheduling.h"
32#include "AdvancedPlots.h"
33#pragma comment(lib,"AdvancedPlots.lib")
35_declspec(dllexport)
int fn_NetSim_IP_VPN_Init();
36NETWORK_LAYER_PROTOCOL fnGetLocalNetworkProtocol(NetSim_EVENTDETAILS* pstruEventDetails);
37int freeVPN(
void* vpn);
38int freeDNS(
void* dns);
39int freeVPNPacket(
void* vpnPacket);
40void* copyVPNPacket(
void* vpnPacket);
41static void add_default_ip_table_entry(NETSIM_ID d);
42void set_public_ip(NETSIM_ID d);
43void configure_static_ip_route(NETSIM_ID d,
char* file);
44static void init_ip_anim();
48_declspec(dllexport)
int fn_NetSim_IP_ICMP_GenerateDstUnreachableMsg();
49_declspec(dllexport)
int fn_NetSim_IP_ICMP_EchoRequest();
50_declspec(dllexport)
int fn_NetSim_IP_ICMP_EchoReply();
51_declspec(dllexport)
int fn_NetSim_IP_ICMP_ProcessRouterAdvertisement();
52_declspec(dllexport)
int fn_NetSim_IP_ICMP_ProcessDestUnreachableMsg();
53_declspec(dllexport)
int fn_NetSim_IP_ICMP_Init();
54_declspec(dllexport)
int fn_NetSim_IP_ICMP_POLL();
55_declspec(dllexport)
int fn_NetSim_IP_ICMP_AdvertiseRouter();
57int fn_NetSim_IP_ConfigStaticIPTable(
char* szVal);
59static IP_PROTOCOL_ACTION decide_action_for_packet(NetSim_PACKET* packet, NETSIM_ID dev)
61 NETSIM_IPAddress dest = packet->pstruNetworkData->szDestIP;
62 NETSIM_IPAddress recv = packet->pstruNetworkData->szNextHopIp;
64 if (isBroadcastIP(dest))
72 if (isMulticastIP(dest))
74 return check_ip_in_multicastgroup(dest, dev, packet);
76 switch (packet->pstruNetworkData->IPProtocol)
79 return pim_decide_action(packet, dev);
83 if (isDestFoundinPacket(packet, dev))
86 return ACTION_REROUTE;
93 NetSim_EVENTDETAILS *pstruEventDetails_Formal,
94 char *pszAppPath_Formal,
95 char *pszWritePath_Formal,
99 fnNetSim_buffer_log_init();
102 if (nVersion_Type / 10 != VERSION)
104 printf(
"IP---Version number mismatch\nDll Version=%d\nNetSim Version=%d\nFileName=%s\nLine=%d\n", VERSION, nVersion_Type / 10, __FILE__, __LINE__);
107 pstruEventDetails->dEventTime = 0;
110 ipMetrics = calloc(NETWORK->nDeviceCount,
sizeof* ipMetrics);
111 for (loop = 0; loop < NETWORK->nDeviceCount; loop++)
113 if (!DEVICE_NWLAYER(loop + 1))
116 NETSIM_ID nInterface;
119 set_public_ip(loop + 1);
121 add_default_ip_table_entry(loop + 1);
123 IP_DEVVAR* devVar = NETWORK->ppstruDeviceList[loop]->pstruNetworkLayer->ipVar;
125 if (devVar->staticIPTableFile && *devVar->staticIPTableFile)
126 configure_static_ip_route(loop + 1, devVar->staticIPTableFile);
128 if (devVar->nGatewayCount)
129 devVar->nGatewayId = calloc(devVar->nGatewayCount,
sizeof* devVar->nGatewayId);
130 for (i = 0; i < devVar->nGatewayCount; i++)
131 devVar->nGatewayId[i] = fn_NetSim_Stack_GetDeviceId_asIP(devVar->GatewayIPAddress[i], &nInterface);
132 if (devVar && devVar->isFirewallConfigured)
135 fn_NetSim_FirewallConfig(loop + 1);
137 ipMetrics[loop] = calloc(1,
sizeof* ipMetrics[loop]);
138 ipMetrics[loop]->nDeviceId = fn_NetSim_Stack_GetConfigIdOfDeviceById(loop + 1);
141 if (devVar->isIGMPConfigured)
145 if (devVar->isPIMConfigured)
146 Router_PIM_Init(loop + 1);
150 fn_NetSim_IP_ICMP_Init();
153 fn_NetSim_IP_VPN_Init();
158static ptrIP_FORWARD_ROUTE build_route(NetSim_PACKET* packet)
160 NETSIM_ID d = pstruEventDetails->nDeviceId;
161 NETSIM_ID in = pstruEventDetails->nInterfaceId;
165 if (!packet->pstruNetworkData->szNextHopIp)
168 ptrIP_FORWARD_ROUTE route = calloc(1,
sizeof* route);
171 route->nextHop = calloc(1,
sizeof* route->nextHop);
172 route->nextHop[0] = packet->pstruNetworkData->szNextHopIp;
174 route->gateway = calloc(1,
sizeof* route->gateway);
175 route->gateway[0] = DEVICE_NWADDRESS(d, in);
177 route->interfaceId = calloc(1,
sizeof* route->interfaceId);
178 route->interfaceId[0] = in;
180 route->nextHopId = calloc(1,
sizeof* route->nextHopId);
181 route->nextHopId[0] = fn_NetSim_Stack_GetDeviceId_asIP(route->nextHop[0], &in);
186static void ip_handle_processing_delay()
188 NETSIM_ID d = pstruEventDetails->nDeviceId;
189 NETSIM_ID in = pstruEventDetails->nInterfaceId;
190 NetSim_EVENTDETAILS pevent;
192 if (DEVICE_INTERFACE(d, in)->nLocalNetworkProtocol)
194 memcpy(&pevent, pstruEventDetails,
sizeof pevent);
195 pstruEventDetails->nEventType = NETWORK_OUT_EVENT;
196 pstruEventDetails->nProtocolId = DEVICE_INTERFACE(d, in)->nLocalNetworkProtocol;
197 pstruEventDetails->nSubEventType = 0;
198 pstruEventDetails->szOtherDetails = NULL;
200 fnCallProtocol(DEVICE_INTERFACE(d, in)->nLocalNetworkProtocol);
201 memcpy(pstruEventDetails, &pevent,
sizeof * pstruEventDetails);
205 NetSim_BUFFER* buffer = DEVICE_INTERFACE(d, in)->pstruAccessInterface->pstruAccessBuffer;
206 NetSim_PACKET* packet = pstruEventDetails->pPacket;
208 if (!fn_NetSim_GetBufferStatus(buffer))
210 memcpy(&pevent, pstruEventDetails,
sizeof pevent);
213 pevent.nEventType = MAC_OUT_EVENT;
214 pevent.nProtocolId = fn_NetSim_Stack_GetMacProtocol(d, in);
215 pevent.pPacket = NULL;
216 pevent.nSubEventType = 0;
217 fnpAddEvent(&pevent);
219 fn_NetSim_Packet_AddPacketToList(buffer, packet, 0);
227_declspec(dllexport)
int fn_NetSim_IP_Run()
229 switch (pstruEventDetails->nEventType)
231 case NETWORK_OUT_EVENT:
233 ptrIP_FORWARD_ROUTE route = NULL;
234 NetSim_PACKET* packet = pstruEventDetails->pPacket;
235 NETWORK_LAYER_PROTOCOL nLocalNetworkProtcol;
236 nLocalNetworkProtcol = fnGetLocalNetworkProtocol(pstruEventDetails);
237 if (nLocalNetworkProtcol)
239 fnCallProtocol(nLocalNetworkProtcol);
242 if (packet->pstruNetworkData->nTTL == 0)
245 packet->nPacketStatus = PacketStatus_TTL_Expired;
246 packet->nTransmitterId = pstruEventDetails->nDeviceId;
247 packet->nReceiverId = pstruEventDetails->nDeviceId;
248 fn_NetSim_WritePacketTrace(packet);
249 fn_NetSim_Packet_FreePacket(packet);
250 pstruEventDetails->pPacket = NULL;
251 ipMetrics[pstruEventDetails->nDeviceId - 1]->nTTLDrop++;
255 packet->pstruNetworkData->dStartTime = pstruEventDetails->dEventTime;
256 packet->pstruNetworkData->dArrivalTime = pstruEventDetails->dEventTime;
258 if (packet->pstruTransportData)
259 packet->pstruNetworkData->dPayload = packet->pstruTransportData->dPacketSize;
262 if (packet->pstruNetworkData->szNextHopIp)
264 route = build_route(packet);
268 if (packet->pstruNetworkData->szNextHopIp == NULL)
271 route = fn_NetSim_IP_RoutePacketViaStaticEntry(packet,
272 pstruEventDetails->nDeviceId);
275 packet = pstruEventDetails->pPacket;
280 if (route && route->count)
284 fn_NetSim_NAT_NetworkOut(pstruEventDetails->nDeviceId, packet);
287 if (packet->pstruNetworkData->szNextHopIp == NULL)
290 route = fn_NetSim_IP_RoutePacketViaStaticEntry(packet,
291 pstruEventDetails->nDeviceId);
294 packet = pstruEventDetails->pPacket;
299 if (route && route->count)
304 if (DEVICE_NWLAYER(pstruEventDetails->nDeviceId)->routerFunction)
305 DEVICE_NWLAYER(pstruEventDetails->nDeviceId)->routerFunction();
307 packet = pstruEventDetails->pPacket;
311 if (packet->pstruNetworkData->szNextHopIp)
313 route = build_route(packet);
318 if (DEVICE_NWLAYER(pstruEventDetails->nDeviceId)->nRoutingProtocolId)
320 fnCallProtocol(DEVICE_NWLAYER(pstruEventDetails->nDeviceId)->nRoutingProtocolId);
323 packet = pstruEventDetails->pPacket;
327 if (packet->pstruNetworkData->szNextHopIp)
329 route = build_route(packet);
334 packet = pstruEventDetails->pPacket;
335 route = fn_NetSim_IP_RoutePacket(packet,
336 pstruEventDetails->nDeviceId);
338 if (!route || !route->count)
345 ipMetrics[pstruEventDetails->nDeviceId - 1]->nPacketDiscarded++;
347 IP_DEVVAR* var = GET_IP_DEVVAR(pstruEventDetails->nDeviceId);
348 if (var && var->isICMP)
349 fn_NetSim_IP_ICMP_GenerateDstUnreachableMsg();
351 free_ip_route(route);
361 for (i = 0; i < route->count; i++)
363 if (i != route->count - 1)
364 p = fn_NetSim_Packet_CopyPacket(packet);
368 p->pstruNetworkData->szNextHopIp = route->nextHop[i];
369 pass_to_lower_layer(p, route, i);
375 pass_to_lower_layer(packet, NULL, 0);
377 free_ip_route(route);
380 case NETWORK_IN_EVENT:
382 NetSim_PACKET* packet = pstruEventDetails->pPacket;
383 if (pstruEventDetails->nInterfaceId && NETWORK->ppstruDeviceList[pstruEventDetails->nDeviceId - 1]->ppstruInterfaceList[pstruEventDetails->nInterfaceId - 1]->nLocalNetworkProtocol)
386 fnCallProtocol(NETWORK->ppstruDeviceList[pstruEventDetails->nDeviceId - 1]->ppstruInterfaceList[pstruEventDetails->nInterfaceId - 1]->nLocalNetworkProtocol);
388 if (pstruEventDetails->pPacket == NULL)
390 packet = pstruEventDetails->pPacket;
392 NETSIM_IPAddress gateway = packet->pstruNetworkData->szGatewayIP;
393 NETSIM_IPAddress my = DEVICE_NWADDRESS(pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId);
394 NETSIM_IPAddress sub = DEVICE_INTERFACE(pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId)->szSubnetMask;
395 UINT prefix = DEVICE_INTERFACE(pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId)->prefix_len;
396 if (!IP_IS_IN_SAME_NETWORK(gateway, my, sub, prefix))
398 fn_NetSim_Packet_FreePacket(packet);
402 if (wireshark_trace.convert_sim_to_real_packet &&
403 !DEVICE_MACLAYER(pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId)->isWiresharkWriter)
405 wireshark_trace.convert_sim_to_real_packet(packet,
406 wireshark_trace.pcapWriterlist[pstruEventDetails->nDeviceId - 1][pstruEventDetails->nInterfaceId - 1],
407 pstruEventDetails->dEventTime);
411 packet->pstruNetworkData->nTTL--;
414 packet->pstruNetworkData->dOverhead -= IPV4_HEADER_SIZE;
415 packet->pstruNetworkData->dPacketSize -= IPV4_HEADER_SIZE;
416 if ((((IP_DEVVAR*)DEVICE_NWLAYER(pstruEventDetails->nDeviceId)->ipVar)->nVPNStatus == VPN_SERVER ||
417 ((IP_DEVVAR*)DEVICE_NWLAYER(pstruEventDetails->nDeviceId)->ipVar)->nVPNStatus == VPN_CLIENT) &&
418 packet->pstruNetworkData->nPacketFlag == PACKET_VPN)
419 fn_NetSim_IP_VPN_Run();
420 packet = pstruEventDetails->pPacket;
425 if (fn_NetSim_NETWORK_Firewall(pstruEventDetails->nDeviceId,
426 pstruEventDetails->nInterfaceId,
427 pstruEventDetails->pPacket,
428 ACLTYPE_INBOUND) == ACLACTION_DENY)
430 ipMetrics[pstruEventDetails->nDeviceId - 1]->nFirewallBlocked++;
431 fn_NetSim_Packet_FreePacket(pstruEventDetails->pPacket);
432 pstruEventDetails->pPacket = NULL;
437 if (DEVICE_NWLAYER(pstruEventDetails->nDeviceId)->nRoutingProtocolId)
438 fnCallProtocol(DEVICE_NWLAYER(pstruEventDetails->nDeviceId)->nRoutingProtocolId);
439 packet = pstruEventDetails->pPacket;
444 fn_NetSim_NAT_NetworkIn(pstruEventDetails->nDeviceId, packet);
446 IP_PROTOCOL_ACTION action = decide_action_for_packet(packet, pstruEventDetails->nDeviceId);
448 if (action == ACTION_DROP)
451 fn_NetSim_Packet_FreePacket(packet);
452 pstruEventDetails->pPacket = NULL;
456 if (action == ACTION_MOVEUP)
458 TRANSPORT_LAYER_PROTOCOL txProtocol = TX_PROTOCOL_NULL;
459 IP_PROTOCOL_NUMBER num = packet->pstruNetworkData->IPProtocol;
462 case IPPROTOCOL_ICMP:
463 process_icmp_packet();
465 case IPPROTOCOL_IGMP:
466 process_igmp_packet();
469 process_pim_packet();
475 if (txProtocol == TX_PROTOCOL_NULL)
476 txProtocol = TX_PROTOCOL_TCP;
478 if(txProtocol == TX_PROTOCOL_NULL)
479 txProtocol = TX_PROTOCOL_UDP;
484 pstruEventDetails->dPacketSize = packet->pstruNetworkData->dPacketSize;
485 pstruEventDetails->nEventType = TRANSPORT_IN_EVENT;
486 pstruEventDetails->nProtocolId = txProtocol;
487 pstruEventDetails->nSubEventType = 0;
488 pstruEventDetails->szOtherDetails = NULL;
489 fnpAddEvent(pstruEventDetails);
492 ipMetrics[pstruEventDetails->nDeviceId - 1]->nPacketReceived++;
496 else if (action == ACTION_REROUTE)
499 packet->pstruNetworkData->szNextHopIp = NULL;
500 packet->pstruNetworkData->szGatewayIP = NULL;
502 pstruEventDetails->dPacketSize = packet->pstruNetworkData->dPacketSize;
503 pstruEventDetails->nEventType = NETWORK_OUT_EVENT;
504 pstruEventDetails->nProtocolId = DEVICE_INTERFACE(pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId)->nProtocolId;
505 pstruEventDetails->nSubEventType = 0;
506 pstruEventDetails->szOtherDetails = NULL;
507 fnpAddEvent(pstruEventDetails);
510 ipMetrics[pstruEventDetails->nDeviceId - 1]->nPacketForwarded++;
516 switch (pstruEventDetails->nSubEventType)
518 case EVENT_ICMP_POLL:
519 fn_NetSim_IP_ICMP_POLL();
521 case EVENT_ADVERTISE_ROUTER:
522 fn_NetSim_IP_ICMP_AdvertiseRouter();
524 case SUBEVENT_JOIN_MULTICAST_GROUP:
525 multicast_join_group();
527 case EVENT_IGMP_SendStartupQuery:
528 case EVENT_IGMP_SendQuery:
529 send_query_msg(pstruEventDetails->nDeviceId,
530 pstruEventDetails->szOtherDetails,
531 pstruEventDetails->dEventTime);
533 case EVENT_IGMP_OtherQuerierPresentTimer:
534 igmp_router_processOtherQuerierPresentTime();
536 case EVENT_IGMP_DelayTimer:
539 case EVENT_IGMP_GroupMembershipTimer:
540 igmp_router_ProcessGroupMembershipTimer();
542 case EVENT_IGMP_Unsolicited_report:
543 host_handle_unsolicited_report_timer();
545 case EVENT_PIM_SEND_HELLO:
546 case EVENT_PIM_NEIGHBOR_TIMEOUT:
549 pim_handle_timer_event();
551 case EVENT_IP_INIT_TABLE:
552 iptable_add(IP_WRAPPER_GET(pstruEventDetails->nDeviceId),
553 NULL, NULL, 0, NULL, 0, NULL, NULL, 0, NULL);
555 case EVENT_ICMP_SEND_ECHO:
556 icmp_send_echo_request();
558 case EVENT_IP_PROCESSING_DELAY:
559 ip_handle_processing_delay();
564 sprintf(error,
"Unknown sub event %d for IP", pstruEventDetails->nSubEventType);
565 fnNetSimError(error);
574 sprintf(error,
"Unknown event %d for IP", pstruEventDetails->nEventType);
575 fnNetSimError(error);
586_declspec(dllexport)
int fn_NetSim_IP_Finish()
588 fn_NetSim_buffer_log_close();
591 for (i = 0; i < NETWORK->nDeviceCount; i++)
593 if (DEVICE_NWLAYER(i + 1))
595 ptrIP_ROUTINGTABLE table = IP_TABLE_GET(i+1);
596 IP_DEVVAR* devVar = NETWORK->ppstruDeviceList[i]->pstruNetworkLayer->ipVar;
599 fn_NetSim_Firewall_Free(i + 1);
600 free(devVar->firewallConfig);
601 free(devVar->GatewayIPAddress);
602 free(devVar->nGatewayId);
603 free(devVar->nGatewayState);
604 free(devVar->nInterfaceId);
605 freeVPN(devVar->vpn);
606 freeDNS(devVar->dnsList);
612 LIST_FREE(&table, table);
625_declspec(dllexport)
char* fn_NetSim_IP_Trace(NETSIM_ID nSubeventid)
629 case EVENT_ICMP_POLL:
631 case EVENT_ADVERTISE_ROUTER:
632 return "ICMP_Advertise_Router";
633 case EVENT_IGMP_DelayTimer:
634 return "IGMP_DelayTimer";
635 case EVENT_IGMP_GroupMembershipTimer:
636 return "IGMP_GroupMembershipTimer";
637 case EVENT_IGMP_OtherQuerierPresentTimer:
638 return "IGMP_OtherQueierPresentTimer";
639 case EVENT_IGMP_SendQuery:
640 return "IGMP_SendQuery";
641 case EVENT_IGMP_SendStartupQuery:
642 return "IGMP_SendStartupQuery";
643 case EVENT_IGMP_Unsolicited_report:
644 return "IGMP_UnsolicitedReportTimer";
645 case EVENT_IP_INIT_TABLE:
646 return "IP_INIT_TABLE";
647 case EVENT_PIM_SEND_HELLO:
648 return "PIM_SEND_HELLO";
649 case EVENT_PIM_NEIGHBOR_TIMEOUT:
650 return "PIM_NEIGHBOR_TIMEOUT";
655 case EVENT_ICMP_SEND_ECHO:
656 return "ICMP_SEND_ECHO";
657 case EVENT_IP_PROCESSING_DELAY:
658 return "IP_PROCESSING_DELAY";
660 return "IP_UNKNOWN_SUBEVENT";
664#pragma region SCHEDULER_CONFIG
665#define QUEUING_MAX_TH_MB_DEFAULT 7.0
666#define QUEUING_MIN_TH_MB_DEFAULT 4.0
668#define QUEUING_MAX_P_DEFAULT 0.05
669#define QUEUING_WQ_DEFAULT 0.0002
671#define QUEUING_LOW_MAX_TH_MB_DEFAULT 7.0
672#define QUEUING_NORMAL_MAX_TH_MB_DEFAULT 7.0
673#define QUEUING_MEDIUM_MAX_TH_MB_DEFAULT 7.0
674#define QUEUING_HIGH_MAX_TH_MB_DEFAULT 7.0
675#define QUEUING_LOW_MIN_TH_MB_DEFAULT 4.0
676#define QUEUING_NORMAL_MIN_TH_MB_DEFAULT 4.5
677#define QUEUING_MEDIUM_MIN_TH_MB_DEFAULT 5.0
678#define QUEUING_HIGH_MIN_TH_MB_DEFAULT 5.5
680#define QUEUING_LOW_MAX_P_DEFAULT 0.05
681#define QUEUING_NORMAL_MAX_P_DEFAULT 0.05
682#define QUEUING_MEDIUM_MAX_P_DEFAULT 0.05
683#define QUEUING_HIGH_MAX_P_DEFAULT 0.05
685#define SCHEDULING_MAX_LATENCY_UGS_MS_DEFAULT 100
686#define SCHEDULING_MAX_LATENCY_rtPS_MS_DEFAULT 150
687#define SCHEDULING_MAX_LATENCY_ertPS_MS_DEFAULT 300
688#define SCHEDULING_MAX_LATENCY_nrtPS_MS_DEFAULT 300
689#define SCHEDULING_MAX_LATENCY_BE_MS_DEFAULT 100000
691static void ip_queuing_read_config(NETSIM_ID d, NETSIM_ID in,
void* xmlNetSimNode)
694 NetSim_BUFFER* pstruBuffer = DEVICE_ACCESSBUFFER(d, in);
696 szVal = fn_NetSim_xmlConfig_GetVal(xmlNetSimNode,
"QUEUING_TYPE", 0);
699 if (_stricmp(szVal,
"DROP_TAIL") == 0)
700 pstruBuffer->queuingTechnique = QUEUING_DROPTAIL;
701 else if (_stricmp(szVal,
"RED") == 0)
703 pstruBuffer->queuingTechnique = QUEUING_RED;
705 ptrQUEUING_RED_VAR queuing_var = calloc(1,
sizeof * queuing_var);
706 queuing_var->max_th = fn_NetSim_Config_read_dataLen(xmlNetSimNode,
"MAX_TH", QUEUING_MAX_TH_MB_DEFAULT,
"MB");
707 queuing_var->min_th = fn_NetSim_Config_read_dataLen(xmlNetSimNode,
"MIN_TH", QUEUING_MIN_TH_MB_DEFAULT,
"MB");
708 getXmlVar(&queuing_var->max_p, MAX_P, xmlNetSimNode, 1, _DOUBLE, QUEUING);
709 getXmlVar(&queuing_var->wq, WQ, xmlNetSimNode, 1, _DOUBLE, QUEUING);
711 queuing_var->avg_queue_size = 0;
712 queuing_var->count = -1;
713 queuing_var->random_value = NETSIM_RAND_01();
714 queuing_var->q_time = 0;
715 pstruBuffer->queuingParam = queuing_var;
717 else if (_stricmp(szVal,
"WRED") == 0)
719 pstruBuffer->queuingTechnique = QUEUING_WRED;
720 ptrQUEUING_WRED_VAR queuing_var = calloc(1,
sizeof * queuing_var);
721 double* min_th_values = calloc(4,
sizeof * min_th_values);
722 double* max_th_values = calloc(4,
sizeof * max_th_values);
723 double* max_p_values = calloc(4,
sizeof * max_p_values);
724 int* count_values = calloc(4,
sizeof * count_values);
725 double* random_values = calloc(4,
sizeof * random_values);
726 min_th_values[0] = fn_NetSim_Config_read_dataLen(xmlNetSimNode,
"LOW_MIN_TH", QUEUING_LOW_MIN_TH_MB_DEFAULT,
"MB");
727 min_th_values[1] = fn_NetSim_Config_read_dataLen(xmlNetSimNode,
"NORMAL_MIN_TH", QUEUING_NORMAL_MIN_TH_MB_DEFAULT,
"MB");
728 min_th_values[2] = fn_NetSim_Config_read_dataLen(xmlNetSimNode,
"MEDIUM_MIN_TH", QUEUING_MEDIUM_MIN_TH_MB_DEFAULT,
"MB");
729 min_th_values[3] = fn_NetSim_Config_read_dataLen(xmlNetSimNode,
"HIGH_MIN_TH", QUEUING_HIGH_MIN_TH_MB_DEFAULT,
"MB");
730 max_th_values[0] = fn_NetSim_Config_read_dataLen(xmlNetSimNode,
"LOW_MAX_TH", QUEUING_LOW_MAX_TH_MB_DEFAULT,
"MB");
731 max_th_values[1] = fn_NetSim_Config_read_dataLen(xmlNetSimNode,
"NORMAL_MAX_TH", QUEUING_NORMAL_MAX_TH_MB_DEFAULT,
"MB");
732 max_th_values[2] = fn_NetSim_Config_read_dataLen(xmlNetSimNode,
"MEDIUM_MAX_TH", QUEUING_MEDIUM_MAX_TH_MB_DEFAULT,
"MB");
733 max_th_values[3] = fn_NetSim_Config_read_dataLen(xmlNetSimNode,
"HIGH_MAX_TH", QUEUING_HIGH_MAX_TH_MB_DEFAULT,
"MB");
734 getXmlVar(&max_p_values[0], LOW_MAX_P, xmlNetSimNode, 1, _DOUBLE, QUEUING);
735 getXmlVar(&max_p_values[1], NORMAL_MAX_P, xmlNetSimNode, 1, _DOUBLE, QUEUING);
736 getXmlVar(&max_p_values[2], MEDIUM_MAX_P, xmlNetSimNode, 1, _DOUBLE, QUEUING);
737 getXmlVar(&max_p_values[3], HIGH_MAX_P, xmlNetSimNode, 1, _DOUBLE, QUEUING);
738 getXmlVar(&queuing_var->wq, WQ, xmlNetSimNode, 1, _DOUBLE, QUEUING);
741 count_values[0] = -1;
742 count_values[1] = -1;
743 count_values[2] = -1;
744 count_values[3] = -1;
745 random_values[0] = NETSIM_RAND_01();
746 random_values[1] = NETSIM_RAND_01();
747 random_values[2] = NETSIM_RAND_01();
748 random_values[3] = NETSIM_RAND_01();
750 queuing_var->max_th = max_th_values;
751 queuing_var->min_th = min_th_values;
752 queuing_var->max_p = max_p_values;
753 queuing_var->avg_queue_size = 0;
754 queuing_var->count = count_values;
755 queuing_var->random_value = random_values;
756 pstruBuffer->queuingParam = queuing_var;
760 fnNetSimError(
"Unknwon queuing technique %s for router %d-%d.\n",
762 pstruBuffer->queuingTechnique = QUEUING_NULL;
766 pstruBuffer->queuingTechnique = QUEUING_NULL;
770static void ip_scheduling_read_config(NETSIM_ID d, NETSIM_ID in,
void* xmlNetSimNode)
772 NetSim_BUFFER* pstruBuffer = DEVICE_ACCESSBUFFER(d, in);
773 char* szVal = fn_NetSim_xmlConfig_GetVal(xmlNetSimNode,
"SCHEDULING_TYPE", 0);
777 if (strcmp(szVal,
"FIFO") == 0)
778 pstruBuffer->nSchedulingType = SCHEDULING_FIFO;
779 else if (strcmp(szVal,
"PRIORITY") == 0)
780 pstruBuffer->nSchedulingType = SCHEDULING_PRIORITY;
781 else if (strcmp(szVal,
"ROUND_ROBIN") == 0)
782 pstruBuffer->nSchedulingType = SCHEDULING_ROUNDROBIN;
783 else if (strcmp(szVal,
"WFQ") == 0)
784 pstruBuffer->nSchedulingType = SCHEDULING_WFQ;
785 else if (strcmp(szVal,
"EDF") == 0)
787 pstruBuffer->nSchedulingType = SCHEDULING_EDF;
788 ptrSCHEDULING_EDF_VAR scheduling_var = calloc(1,
sizeof * scheduling_var);
789 double* max_latency_values = calloc(5,
sizeof * max_latency_values);
791 max_latency_values[0] = fn_NetSim_Config_read_time(xmlNetSimNode,
"MAX_LATENCY_UGS", SCHEDULING_MAX_LATENCY_UGS_MS_DEFAULT,
"ms");
792 max_latency_values[1] = fn_NetSim_Config_read_time(xmlNetSimNode,
"MAX_LATENCY_rtPS", SCHEDULING_MAX_LATENCY_rtPS_MS_DEFAULT,
"ms");
793 max_latency_values[2] = fn_NetSim_Config_read_time(xmlNetSimNode,
"MAX_LATENCY_ertPS", SCHEDULING_MAX_LATENCY_ertPS_MS_DEFAULT,
"ms");
794 max_latency_values[3] = fn_NetSim_Config_read_time(xmlNetSimNode,
"MAX_LATENCY_nrtPS", SCHEDULING_MAX_LATENCY_nrtPS_MS_DEFAULT,
"ms");
795 max_latency_values[4] = fn_NetSim_Config_read_time(xmlNetSimNode,
"MAX_LATENCY_BE", SCHEDULING_MAX_LATENCY_BE_MS_DEFAULT,
"ms");
797 scheduling_var->max_latency = max_latency_values;
798 pstruBuffer->schedulingParam = scheduling_var;
802 fnNetSimError(
"Unknown scheduling technique %s for router %d-%d.\n",
804 pstruBuffer->nSchedulingType = SCHEDULING_NONE;
808 pstruBuffer->nSchedulingType = SCHEDULING_NONE;
817_declspec(dllexport)
int fn_NetSim_IP_Configure(
void** var)
821 NETSIM_ID nDeviceId = 0;
822 NETSIM_ID nInterfaceId = 0;
823 LAYER_TYPE nLayerType = 0;
826 fpConfigLog = var[0];
827 xmlNetSimNode = var[2];
829 nDeviceId = *((NETSIM_ID*)var[3]);
831 nInterfaceId = *((NETSIM_ID*)var[4]);
833 nLayerType = *((LAYER_TYPE*)var[5]);
836 devVar = NETWORK->ppstruDeviceList[nDeviceId - 1]->pstruNetworkLayer->ipVar;
839 devVar = calloc(1,
sizeof* devVar);
840 NETWORK->ppstruDeviceList[nDeviceId - 1]->pstruNetworkLayer->ipVar = devVar;
844 if (nDeviceId && nInterfaceId)
847 NetSim_BUFFER* pstruBuffer;
849 nDeviceType = DEVICE_TYPE(nDeviceId);
851 szVal = fn_NetSim_xmlConfig_GetVal(xmlNetSimNode,
"BUFFER_SIZE", 0);
854 pstruBuffer = DEVICE_ACCESSBUFFER(nDeviceId, nInterfaceId);
856 pstruBuffer->deviceId = nDeviceId;
857 pstruBuffer->interfaceId = nInterfaceId;
859 pstruBuffer->dMaxBufferSize = atof(szVal);
863 ip_queuing_read_config(nDeviceId, nInterfaceId, xmlNetSimNode);
866 ip_scheduling_read_config(nDeviceId, nInterfaceId, xmlNetSimNode);
869 if (NETWORK->ppstruDeviceList[nDeviceId - 1]->ppstruInterfaceList[nInterfaceId - 1]->nProtocolId == NW_PROTOCOL_IPV4)
871 else if (NETWORK->ppstruDeviceList[nDeviceId - 1]->ppstruInterfaceList[nInterfaceId - 1]->nProtocolId == NW_PROTOCOL_IPV6)
874 szVal = fn_NetSim_xmlConfig_GetVal(xmlNetSimNode,
"IP_ADDRESS", 1);
875 NETWORK->ppstruDeviceList[nDeviceId - 1]->ppstruInterfaceList[nInterfaceId - 1]->szAddress = STR_TO_IP(szVal, iptype);
881 szVal = fn_NetSim_xmlConfig_GetVal(xmlNetSimNode,
"SUBNET_MASK", 1);
882 NETWORK->ppstruDeviceList[nDeviceId - 1]->ppstruInterfaceList[nInterfaceId - 1]->szSubnetMask = STR_TO_IP4(szVal);
885 else if (iptype == 6)
888 szVal = fn_NetSim_xmlConfig_GetVal(xmlNetSimNode,
"PREFIX_LENGTH", 1);
889 NETWORK->ppstruDeviceList[nDeviceId - 1]->ppstruInterfaceList[nInterfaceId - 1]->prefix_len = atoi(szVal);
896 szVal = fn_NetSim_xmlConfig_GetVal(xmlNetSimNode,
"DEFAULT_GATEWAY", 0);
898 NETWORK->ppstruDeviceList[nDeviceId - 1]->ppstruInterfaceList[nInterfaceId - 1]->szDefaultGateWay = STR_TO_IP(szVal, iptype);
903 devVar->processingDelay = fn_NetSim_Config_read_time(xmlNetSimNode,
"PROCESSING_DELAY", IP_PROCESSING_DELAY_DEFAULT,
"us");
905 getXmlVar(&devVar->isIGMPConfigured, IGMP_STATUS, xmlNetSimNode, 0, _BOOL, IP);
907 getXmlVar(&devVar->staticIPTableFile, STATIC_IP_ROUTE, xmlNetSimNode, 0, _STRING, IP);
909 if (devVar->isIGMPConfigured)
910 igmp_configure(nDeviceId, xmlNetSimNode);
912 getXmlVar(&devVar->isPIMConfigured, PIM_STATUS, xmlNetSimNode, 0, _BOOL, IP);
913 if (devVar->isPIMConfigured)
914 pim_configure(nDeviceId, xmlNetSimNode);
917 szVal = fn_NetSim_xmlConfig_GetVal(xmlNetSimNode,
"ACL_STATUS", 0);
918 if (szVal && _strupr(szVal) && !strcmp(szVal,
"ENABLE"))
920 devVar->isFirewallConfigured =
true;
922 szVal = fn_NetSim_xmlConfig_GetVal(xmlNetSimNode,
"ACL_CONFIG_FILE", 1);
924 devVar->firewallConfig = szVal;
926 devVar->isFirewallConfigured =
false;
931 getXmlVar(&devVar->isICMP, ICMP_STATUS, xmlNetSimNode, 0, _BOOL, IP);
936 szVal = fn_NetSim_xmlConfig_GetVal(xmlNetSimNode,
"ICMP_CONTINUOUS_POLLING_TIME", 0);
939 devVar->nICMPPollingTime = atoi(szVal);
942 szVal = fn_NetSim_xmlConfig_GetVal(xmlNetSimNode,
"ROUTER_ADVERTISEMENT", 0);
946 if (!strcmp(szVal,
"TRUE"))
947 devVar->nRouterAdvertisementFlag = 1;
950 if (devVar->nRouterAdvertisementFlag)
952 szVal = fn_NetSim_xmlConfig_GetVal(xmlNetSimNode,
"ROUTER_ADVERTISEMENT_MIN_INTERVAL", 0);
955 devVar->nRouterAdverMinInterval = atoi(szVal);
958 szVal = fn_NetSim_xmlConfig_GetVal(xmlNetSimNode,
"ROUTER_ADVERTISEMENT_MAX_INTERVAL", 0);
961 devVar->nRouterAdverMaxInterval = atoi(szVal);
964 szVal = fn_NetSim_xmlConfig_GetVal(xmlNetSimNode,
"ROUTER_ADVERTISEMENT_LIFE_TIME", 0);
967 devVar->nRouterAdverLifeTime = atoi(szVal);
974 szVal = fn_NetSim_xmlConfig_GetVal(xmlNetSimNode,
"VPN_STATUS", 0);
978 if (!strcmp(szVal,
"SERVER"))
980 devVar->nVPNStatus = VPN_SERVER;
982 szVal = fn_NetSim_xmlConfig_GetVal(xmlNetSimNode,
"IP_POOL_START", 1);
985 devVar->ipPoolStart = STR_TO_IP4(szVal);
988 devVar->nVPNStatus = VPN_DISABLE;
990 szVal = fn_NetSim_xmlConfig_GetVal(xmlNetSimNode,
"IP_POOL_END", 1);
993 devVar->ipPoolEnd = STR_TO_IP4(szVal);
996 devVar->nVPNStatus = VPN_DISABLE;
998 szVal = fn_NetSim_xmlConfig_GetVal(xmlNetSimNode,
"IP_POOL_MASK", 1);
1001 devVar->ipPoolMask = STR_TO_IP4(szVal);
1004 devVar->nVPNStatus = VPN_DISABLE;
1007 else if (!strcmp(szVal,
"CLIENT"))
1009 devVar->nVPNStatus = VPN_CLIENT;
1011 szVal = fn_NetSim_xmlConfig_GetVal(xmlNetSimNode,
"SERVER_IP", 1);
1014 devVar->serverIP = STR_TO_IP4(szVal);
1017 devVar->nVPNStatus = VPN_DISABLE;
1030_declspec(dllexport)
int fn_NetSim_IP_FreePacket(NetSim_PACKET* pstruPacket)
1032 if (pstruPacket->pstruNetworkData->nPacketFlag == PACKET_VPN)
1034 freeVPNPacket(pstruPacket->pstruNetworkData->Packet_NetworkProtocol);
1036 switch (pstruPacket->pstruNetworkData->IPProtocol)
1038 case IPPROTOCOL_IGMP:
1039 IGMP_FreePacket(pstruPacket);
1047_declspec(dllexport)
int fn_NetSim_IP_CopyPacket(NetSim_PACKET* pstruDestPacket, NetSim_PACKET* pstruSrcPacket)
1049 if (pstruSrcPacket->pstruNetworkData->nPacketFlag == PACKET_VPN)
1050 pstruDestPacket->pstruNetworkData->Packet_NetworkProtocol = copyVPNPacket(pstruSrcPacket->pstruNetworkData->Packet_NetworkProtocol);
1051 switch (pstruSrcPacket->pstruNetworkData->IPProtocol)
1053 case IPPROTOCOL_ICMP:
1054 ICMP_copyPacket(pstruDestPacket, pstruSrcPacket);
1056 case IPPROTOCOL_IGMP:
1057 copy_igmp_packet(pstruDestPacket, pstruSrcPacket);
1065_declspec(dllexport)
int fn_NetSim_IP_Metrics(PMETRICSWRITER metricsWriter)
1068 PMETRICSNODE menu = init_metrics_node(MetricsNode_Menu,
"IP_Metrics", NULL);
1069 PMETRICSNODE table = init_metrics_node(MetricsNode_Table,
"IP_Metrics", NULL);
1070 add_node_to_menu(menu, table);
1072 add_table_heading(table,
"Device Id",
true, 0);
1073 add_table_heading(table,
"Packet sent",
true, 0);
1074 add_table_heading(table,
"Packet forwarded",
true, 0);
1075 add_table_heading(table,
"Packet received",
true, 0);
1076 add_table_heading(table,
"Packet discarded",
false, 0);
1077 add_table_heading(table,
"TTL expired",
false, 0);
1078 add_table_heading(table,
"Firewall blocked",
false, 0);
1080 for (loop = 0; loop < NETWORK->nDeviceCount; loop++)
1082 if (ipMetrics[loop])
1084 add_table_row_formatted(
false, table,
"%d,%d,%d,%d,%d,%d,%d,",
1085 ipMetrics[loop]->nDeviceId,
1086 ipMetrics[loop]->nPacketSent,
1087 ipMetrics[loop]->nPacketForwarded,
1088 ipMetrics[loop]->nPacketReceived,
1089 ipMetrics[loop]->nPacketDiscarded,
1090 ipMetrics[loop]->nTTLDrop,
1091 ipMetrics[loop]->nFirewallBlocked);
1094 write_metrics_node(metricsWriter, WriterPosition_Current, NULL, menu);
1095 delete_metrics_node(menu);
1097 menu = init_metrics_node(MetricsNode_Menu,
"IP_Forwarding_Table", NULL);
1098 for (loop = 0; loop < NETWORK->nDeviceCount; loop++)
1100 if (NETWORK->ppstruDeviceList[loop]->pstruNetworkLayer &&
1101 IP_TABLE_GET(loop+1))
1103 ptrIP_ROUTINGTABLE routeTable = IP_TABLE_GET(loop + 1);
1105 PMETRICSNODE submenu = init_metrics_node(MetricsNode_Menu, NETWORK->ppstruDeviceList[loop]->szDeviceName, NULL);
1106 add_node_to_menu(menu, submenu);
1107 table = init_metrics_node(MetricsNode_Table, NETWORK->ppstruDeviceList[loop]->szDeviceName, NULL);
1108 add_node_to_menu(submenu, table);
1110 add_table_heading(table,
"Network Destination",
true, 0);
1111 add_table_heading(table,
"Netmask/Prefix len",
true, 0);
1112 add_table_heading(table,
"Gateway",
true, 0);
1113 add_table_heading(table,
"Interface",
true, 0);
1114 add_table_heading(table,
"Metrics",
false, 0);
1115 add_table_heading(table,
"Type",
false, 0);
1119 char ipStr[_NETSIM_IP_LEN];
1120 IP_TO_STR(routeTable->networkDestination, ipStr);
1121 add_table_row_formatted(
false, table,
"%s,", ipStr);
1122 if (routeTable->networkDestination && routeTable->networkDestination->type == 4)
1124 IP_TO_STR(routeTable->netMask, ipStr);
1125 add_table_row_formatted(
true, table,
"%s,", ipStr);
1127 else if (routeTable->networkDestination && routeTable->networkDestination->type == 6)
1129 add_table_row_formatted(
true, table,
"%d,", routeTable->prefix_len);
1131 if (routeTable->gateway)
1133 IP_TO_STR(routeTable->gateway, ipStr);
1134 add_table_row_formatted(
true, table,
"%s,", ipStr);
1137 add_table_row_formatted(
true, table,
"on-link,");
1140 char str[BUFSIZ] =
"";
1141 for (i = 0; i < routeTable->interfaceCount; i++)
1143 strcat(str, routeTable->Interface[i]->str_ip);
1146 add_table_row_formatted(
true, table,
"%s,", str);
1148 add_table_row_formatted(
true, table,
"%d,", routeTable->Metric);
1150 if (routeTable->szType && *routeTable->szType)
1152 add_table_row_formatted(
true, table,
"%s,", routeTable->szType);
1156 switch (routeTable->type)
1158 case RoutingType_DEFAULT:
1159 add_table_row_formatted(
true, table,
"Default,");
1161 case RoutingType_STATIC:
1162 add_table_row_formatted(
true, table,
"Static,");
1165 add_table_row_formatted(
true, table,
"-,");
1169 routeTable = LIST_NEXT(routeTable);
1173 write_metrics_node(metricsWriter, WriterPosition_Current, NULL, menu);
1174 delete_metrics_node(menu);
1177int IP_packetTraceFiledFlag[4] = { 0,0,0,0 };
1178char pszTrace[BUFSIZ];
1182_declspec(dllexport)
char* fn_NetSim_IP_ConfigPacketTrace(
const void* xmlNetSimNode)
1186 szStatus = fn_NetSim_xmlConfigPacketTraceField(xmlNetSimNode,
"SOURCE_IP");
1188 if (!strcmp(szStatus,
"ENABLE"))
1190 IP_packetTraceFiledFlag[0] = 1;
1191 strcat(pszTrace,
"SOURCE_IP,");
1194 IP_packetTraceFiledFlag[0] = 0;
1196 szStatus = fn_NetSim_xmlConfigPacketTraceField(xmlNetSimNode,
"DESTINATION_IP");
1198 if (!strcmp(szStatus,
"ENABLE"))
1200 IP_packetTraceFiledFlag[1] = 1;
1201 strcat(pszTrace,
"DESTINATION_IP,");
1204 IP_packetTraceFiledFlag[1] = 0;
1206 szStatus = fn_NetSim_xmlConfigPacketTraceField(xmlNetSimNode,
"GATEWAY_IP");
1208 if (!strcmp(szStatus,
"ENABLE"))
1210 IP_packetTraceFiledFlag[2] = 1;
1211 strcat(pszTrace,
"GATEWAY_IP,");
1214 IP_packetTraceFiledFlag[2] = 0;
1216 szStatus = fn_NetSim_xmlConfigPacketTraceField(xmlNetSimNode,
"NEXT_HOP_IP");
1218 if (!strcmp(szStatus,
"ENABLE"))
1220 IP_packetTraceFiledFlag[3] = 1;
1221 strcat(pszTrace,
"NEXT_HOP_IP,");
1224 IP_packetTraceFiledFlag[3] = 0;
1231_declspec(dllexport)
int fn_NetSim_IP_WritePacketTrace(NetSim_PACKET* pstruPacket,
char** ppszTrace)
1234 char ip[_NETSIM_IP_LEN];
1236 *ppszTrace = calloc(BUFSIZ,
sizeof(
char));
1237 if (pstruPacket->pstruNetworkData == NULL)
1239 sprintf(*ppszTrace,
"-,-,-,-,");
1244 if (IP_packetTraceFiledFlag[i++] == 1)
1246 if (pstruPacket->pstruNetworkData->szSourceIP)
1247 IP_TO_STR(pstruPacket->pstruNetworkData->szSourceIP, ip);
1250 sprintf(pszTrace,
"%s%s,", pszTrace, ip);
1252 if (IP_packetTraceFiledFlag[i++] == 1)
1254 if (pstruPacket->pstruNetworkData->szDestIP)
1255 IP_TO_STR(pstruPacket->pstruNetworkData->szDestIP, ip);
1258 sprintf(pszTrace,
"%s%s,", pszTrace, ip);
1260 if (IP_packetTraceFiledFlag[i++] == 1)
1262 if (pstruPacket->pstruNetworkData->szGatewayIP)
1263 IP_TO_STR(pstruPacket->pstruNetworkData->szGatewayIP, ip);
1266 sprintf(pszTrace,
"%s%s,", pszTrace, ip);
1268 if (IP_packetTraceFiledFlag[i++] == 1)
1270 if (pstruPacket->pstruNetworkData->szNextHopIp)
1271 IP_TO_STR(pstruPacket->pstruNetworkData->szNextHopIp, ip);
1274 sprintf(pszTrace,
"%s%s,", pszTrace, ip);
1276 strcpy(*ppszTrace, pszTrace);
1282NETWORK_LAYER_PROTOCOL fnGetLocalNetworkProtocol(NetSim_EVENTDETAILS* pstruEventDetails)
1284 switch (pstruEventDetails->nSubEventType / 100)
1286 case NW_PROTOCOL_ARP:
1287 return NW_PROTOCOL_ARP;
1289 switch (pstruEventDetails->pPacket->nControlDataType / 100)
1291 case NW_PROTOCOL_ARP:
1292 return NW_PROTOCOL_ARP;
1297static bool isSameIPForOtherInterface(NETSIM_ID d, NETSIM_ID in)
1300 bool isDefault =
false;
1301 bool isFound =
false;
1303 if (DEVICE_NWADDRESS(d, in) == NULL)
return false;
1305 if (DEVICE_INTERFACE(d, in)->szDefaultGateWay)
1308 for (i = 0; i < DEVICE(d)->nNumOfInterface; i++)
1310 if (DEVICE_NWADDRESS(d, i + 1) == NULL)
continue;
1312 if (!IP_COMPARE(DEVICE_NWADDRESS(d, i + 1), DEVICE_NWADDRESS(d, in)))
1317 if (DEVICE_INTERFACE(d, i + 1)->szDefaultGateWay)
1321 else if (in <= i + 1)
1331static void add_default_ip_table_entry(NETSIM_ID d)
1335 if (!DEVICE_NWLAYER(d))
1338 for (i = 1; i <= DEVICE(d)->nNumOfInterface; i++)
1340 NETSIM_IPAddress dest = NULL;
1341 NETSIM_IPAddress mask = NULL;
1342 NETSIM_IPAddress gate;
1345 IP_DEVVAR* devVar = DEVICE_NWLAYER(d)->ipVar;
1346 NETSIM_IPAddress ip = DEVICE_NWADDRESS(d, i);
1347 NETSIM_IPAddress subnet = DEVICE_INTERFACE(d, i)->szSubnetMask;
1348 NETSIM_IPAddress gateway = DEVICE_INTERFACE(d, i)->szDefaultGateWay;
1349 UINT prefix = DEVICE_INTERFACE(d, i)->prefix_len;
1353 if (isSameIPForOtherInterface(d, i))
1356 iptable_add(IP_WRAPPER_GET(d),
1357 IP_NETWORK_ADDRESS(ip, subnet, prefix),
1367 if (gateway && IP_COMPARE(ip, gateway))
1371 mask = STR_TO_IP4(
"0.0.0.0");
1372 dest = STR_TO_IP4(
"0.0.0.0");
1374 else if (ip->type == 6)
1377 dest = STR_TO_IP6(
"0:0:0:0:0:0:0:0");
1379 iptable_add(IP_WRAPPER_GET(d),
1389 devVar->nGatewayCount++;
1390 devVar->GatewayIPAddress = realloc(devVar->GatewayIPAddress, devVar->nGatewayCount*(
sizeof* devVar->GatewayIPAddress));
1391 devVar->GatewayIPAddress[devVar->nGatewayCount - 1] = gateway;
1392 devVar->nGatewayState = realloc(devVar->nGatewayState, devVar->nGatewayCount*(
sizeof* devVar->nGatewayState));
1393 devVar->nGatewayState[devVar->nGatewayCount - 1] = GATEWAYSTATE_UP;
1394 devVar->nInterfaceId = realloc(devVar->nInterfaceId, devVar->nGatewayCount*(
sizeof* devVar->nInterfaceId));
1395 devVar->nInterfaceId[devVar->nGatewayCount - 1] = i;
1397 if (DEVICE_INTERFACE(d, i)->nInterfaceType != INTERFACE_WAN_ROUTER)
1401 mask = STR_TO_IP4(
"255.255.255.255");
1402 dest = STR_TO_IP4(
"255.255.255.255");
1405 else if (ip->type == 6)
1407 dest = STR_TO_IP6(
"FF00:0:0:0:0:0:0:0");
1412 iptable_add(IP_WRAPPER_GET(d),
1427 mask = STR_TO_IP4(
"240.0.0.0");
1428 dest = STR_TO_IP4(
"224.0.0.0");
1431 else if (ip->type == 6)
1433 dest = STR_TO_IP6(
"FFX2:0:0:0:0:0:0:0");
1438 iptable_add(IP_WRAPPER_GET(d),
1451 mask = STR_TO_IP4(
"255.255.255.255");
1452 dest = STR_TO_IP4(
"224.0.0.1");
1455 else if (ip->type == 6)
1457 dest = STR_TO_IP6(
"FFX2:0:0:0:0:0:0:1");
1462 iptable_add(IP_WRAPPER_GET(d),
1475void ip_write_to_pcap(NetSim_PACKET* packet,
1480 if (!wireshark_trace.convert_sim_to_real_packet)
1483 if (DEVICE_MACLAYER(d, i)->isWiresharkWriter)
1486 wireshark_trace.convert_sim_to_real_packet(packet,
1487 wireshark_trace.pcapWriterlist[d - 1][i - 1],
1491static void init_event_to_write(NETSIM_ID d)
1493 NetSim_EVENTDETAILS pe;
1495 memset(&pe, 0,
sizeof pe);
1497 pe.nDeviceType = DEVICE_TYPE(d);
1498 pe.nEventType = TIMER_EVENT;
1499 pe.nSubEventType = EVENT_IP_INIT_TABLE;
1500 pe.nProtocolId = NW_PROTOCOL_IPV4;
1504static void init_ip_anim()
1507 ANIM_HANDLE chandle;
1508 handle = anim_add_new_menu(NULL,
"IP Table",
false,
false,
false, 0, ANIMFILETYPE_TABLE);
1510 for (i = 0; i < NETWORK->nDeviceCount; i++)
1512 if (DEVICE_NWLAYER(i + 1))
1514 chandle = anim_add_new_menu(handle,
1520 ANIMFILETYPE_TABLE);
1521 DEVICE_NWLAYER(i + 1)->ipWrapper->handle = chandle;
1522 init_event_to_write(i + 1);