NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
DistanceVectorAlgorithm.c
1/************************************************************************************
2* Copyright (C) 2023
3*
4* TETCOS, Bangalore. India *
5
6* Tetcos owns the intellectual property rights in the Product and its content. *
7* The copying, redistribution, reselling or publication of any or all of the *
8* Product or its content without express prior written consent of Tetcos is *
9* prohibited. Ownership and / or any other right relating to the software and all *
10* intellectual property rights therein shall remain at all times with Tetcos. *
11
12* Author: Thangarasu.K *
13* ---------------------------------------------------------------------------------*/
14#include "main.h"
15#include "Routing.h"
16#include "List.h"
17#include "../IP/IP.h"
18/**
19~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20
21This function runs the distance vector routing algorithm for optimized routing of packets from
22source to destination. The optimization is done per a particular metric, i.e the shortest distance.
23This algorithm runs inside a single Autonomous System
24
25~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
26*/
27int fn_NetSim_RIP_DistanceVectorAlgorithm(struct stru_NetSim_Network *NETWORK,NetSim_EVENTDETAILS *pstruEventDetails)
28{
29 NETSIM_ID nDeviceId,i;
30 RIP_ROUTING_DATABASE *pstru_Router_RIP_TempTable=NULL;
31 RIP_ROUTING_DATABASE *pstru_Router_RIP_TempTraverse=NULL,*pstru_Router_RIP_InsertTable=NULL;
32 // NetSim packet To store the RIP packet
33 NetSim_PACKET *pstruControlPacket = NULL;
34 RIP_ENTRY *pstru_Router_RIP_RIPEntry=NULL;
35 // RIP PACKET to store RIP packet data
36 RIP_PACKET *pstruPacketRIP = NULL;
37 pstruControlPacket=pstruEventDetails->pPacket;
38 nDeviceId=pstruEventDetails->nDeviceId;
39 pstruPacketRIP=pstruControlPacket->pstruAppData->Packet_AppProtocol;
40 pstru_Router_RIP_RIPEntry=pstruPacketRIP->pstruRIPEntry;
41 //Get the Routing database of the router
42 pstru_Router_RIP_TempTable = ((DEVICE_ROUTER*)DEVICE_APPVAR(nDeviceId, APP_PROTOCOL_RIP))->pstruRoutingTables->pstruRIP_RoutingTable;
43 fn_NetSim_Stack_GetDeviceId_asIP(pstruControlPacket->pstruNetworkData->szNextHopIp,&i);
44 while(pstru_Router_RIP_RIPEntry)
45 {
46 pstru_Router_RIP_TempTraverse=pstru_Router_RIP_TempTable;
47
48 while(pstru_Router_RIP_TempTraverse)
49 {
50 if(!IP_COMPARE(pstru_Router_RIP_TempTraverse->szAddress,pstru_Router_RIP_RIPEntry->szIPv4_address)&& !IP_COMPARE(pstru_Router_RIP_TempTraverse->szSubnetmask,pstru_Router_RIP_RIPEntry->szSubnet_Mask) )
51 {
52 if((pstru_Router_RIP_TempTraverse->nMetric > pstru_Router_RIP_RIPEntry->nMetric+1))
53 {
54 IP_FREE(pstru_Router_RIP_TempTraverse->szAddress);
55 IP_FREE(pstru_Router_RIP_TempTraverse->szRouter);
56 pstru_Router_RIP_TempTraverse->szAddress = IP_COPY(pstru_Router_RIP_RIPEntry->szIPv4_address);
57 pstru_Router_RIP_TempTraverse->szRouter = IP_COPY(pstruControlPacket->pstruNetworkData->szGatewayIP);
58 pstru_Router_RIP_TempTraverse->nMetric = pstru_Router_RIP_RIPEntry->nMetric + 1;
59 pstru_Router_RIP_TempTraverse->nInterface = i;
60 pstru_Router_RIP_TempTraverse->dTimer = pstruEventDetails->dEventTime;
61 {
62 iptable_add(IP_WRAPPER_GET(nDeviceId),
63 pstru_Router_RIP_RIPEntry->szIPv4_address,
64 pstru_Router_RIP_RIPEntry->szSubnet_Mask,
65 0,
66 pstruControlPacket->pstruNetworkData->szGatewayIP,
67 1,
68 &pstruControlPacket->pstruNetworkData->szNextHopIp,
69 &i,
70 pstru_Router_RIP_RIPEntry->nMetric + 1,
71 "RIP");
72 }
73 }
74 break;
75 }
76 pstru_Router_RIP_TempTraverse = pstru_Router_RIP_TempTraverse->pstru_Router_NextEntry;
77 }
78 // If any new entry update that entry in the routing database
79 if(!pstru_Router_RIP_TempTraverse)
80 {
81
82 pstru_Router_RIP_InsertTable=calloc(1,sizeof(RIP_ROUTING_DATABASE));
83 pstru_Router_RIP_InsertTable->szAddress=pstru_Router_RIP_RIPEntry->szIPv4_address;
84 pstru_Router_RIP_InsertTable->szSubnetmask = IP_COPY(pstru_Router_RIP_RIPEntry->szSubnet_Mask);
85 pstru_Router_RIP_InsertTable->szRouter= IP_COPY(pstruControlPacket->pstruNetworkData->szGatewayIP);
86 pstru_Router_RIP_InsertTable->nInterface=i;
87 pstru_Router_RIP_InsertTable->nMetric=pstru_Router_RIP_RIPEntry->nMetric+1;
88 pstru_Router_RIP_InsertTable->dTimer=pstruEventDetails->dEventTime;
89 fn_NetSim_UpdateEntryinRoutingTable(NETWORK,pstruEventDetails,nDeviceId,pstru_Router_RIP_InsertTable->nInterface,0,pstru_Router_RIP_InsertTable->szAddress,pstru_Router_RIP_InsertTable->szRouter,pstru_Router_RIP_InsertTable->szSubnetmask,0,pstru_Router_RIP_InsertTable->nMetric,1);
90 ((DEVICE_ROUTER*)(DEVICE_APPVAR(nDeviceId,APP_PROTOCOL_RIP)))->uniInteriorRouting.struRIP.nRIP_Update++;
91
92 //Adding the entries in IP table
93 {
94 iptable_add(IP_WRAPPER_GET(nDeviceId),
95 pstru_Router_RIP_RIPEntry->szIPv4_address,
96 pstru_Router_RIP_RIPEntry->szSubnet_Mask,
97 0,
98 pstruControlPacket->pstruNetworkData->szGatewayIP,
99 1,
100 &pstruControlPacket->pstruNetworkData->szNextHopIp,
101 &i,
102 pstru_Router_RIP_RIPEntry->nMetric + 1,
103 "RIP");
104 }
105 fnpFreeMemory(pstru_Router_RIP_InsertTable);
106
107 }
108 pstru_Router_RIP_RIPEntry=pstru_Router_RIP_RIPEntry->pstru_RIP_NextEntry;
109 }
110 if(pstruControlPacket)
111 {
112 fn_NetSim_Packet_FreePacket(pstruControlPacket);
113 pstruEventDetails->pPacket=NULL;
114 }
115 return 0;
116}
unsigned int nMetric
Cost to reach the destination.
Definition RIP.h:136
NETSIM_IPAddress szSubnet_Mask
Destination Subnet Mask.
Definition RIP.h:133
NETSIM_IPAddress szIPv4_address
Destination IPv4 address.
Definition RIP.h:132
NETSIM_ID nInterface
The physical network which must be used to reach the first router.
Definition RIP.h:77
double dTimer
The amount of time since the entry was last updated.
Definition RIP.h:79
unsigned int nMetric
Distance to the destination.
Definition RIP.h:78
NETSIM_IPAddress szRouter
The first router along the route to the destination.
Definition RIP.h:76
NETSIM_IPAddress szAddress
IP address of the destination host or destination network.
Definition RIP.h:74
NETSIM_IPAddress szSubnetmask
Subnet mask for the destination network.
Definition RIP.h:75