NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
OSPF.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#include "NetSim_utility.h"
16#include "OSPF.h"
17#include "OSPF_enum.h"
18#include "OSPF_Msg.h"
19
20#pragma warning(disable:4028)
21char* GetStringOSPF_Subevent(NETSIM_ID);
22#pragma warning(default:4028)
23int fn_NetSim_OSPF_Configure_F(void** var);
24int fn_NetSim_OSPF_Init_F(struct stru_NetSim_Network* net,
25 NetSim_EVENTDETAILS* pevent,
26 char* appPath,
27 char* iopath,
28 int version,
29 void** fnPointer);
30int fn_NetSim_OSPF_Finish_F();
31int fn_NetSim_OSPF_FreePacket_F(NetSim_PACKET* packet);
32int fn_NetSim_OSPF_CopyPacket_F(NetSim_PACKET* dst,
33 NetSim_PACKET* src);
34int fn_NetSim_OSPF_Metrics_F(PMETRICSWRITER metricsWriter);
35char* fn_NetSim_OSPF_ConfigPacketTrace_F(const void* xmlNetSimNode);
36int fn_NetSim_OSPF_WritePacketTrace_F(NetSim_PACKET* pstruPacket, char** ppszTrace);
37static void register_ospf_log();
38
39#pragma comment(lib,"OSPF.lib")
40
41//Function prototype
42static void ospf_handle_appin_event();
43static void ospf_handle_timer_event();
44void ospf_handle_InterfaceUp_Event();
45
46_declspec (dllexport) int fn_NetSim_OSPF_Run()
47{
48 switch (pstruEventDetails->nEventType)
49 {
50 case TIMER_EVENT:
51 ospf_handle_timer_event();
52 break;
53 case APPLICATION_IN_EVENT:
54 ospf_handle_appin_event();
55 break;
56 default:
57 fnNetSimError("Unknown event type %d for OSPF protocol\n",
58 pstruEventDetails->nEventType);
59 break;
60 }
61 return 0;
62}
63
64_declspec(dllexport) int fn_NetSim_OSPF_Configure(void** var)
65{
66 return fn_NetSim_OSPF_Configure_F(var);
67}
68
69_declspec (dllexport) int fn_NetSim_OSPF_Init(struct stru_NetSim_Network *NETWORK_Formal,
70 NetSim_EVENTDETAILS *pstruEventDetails_Formal,
71 char *pszAppPath_Formal,
72 char *pszWritePath_Formal,
73 int nVersion_Type,
74 void **fnPointer)
75{
76 register_ospf_log();
77 return fn_NetSim_OSPF_Init_F(NETWORK_Formal,
78 pstruEventDetails_Formal,
79 pszAppPath_Formal,
80 pszWritePath_Formal,
81 nVersion_Type,
82 fnPointer);
83}
84
85_declspec(dllexport) int fn_NetSim_OSPF_Finish()
86{
87 return fn_NetSim_OSPF_Finish_F();
88}
89
90_declspec (dllexport) char *fn_NetSim_OSPF_Trace(int nSubEvent)
91{
92 return (GetStringOSPF_Subevent(nSubEvent));
93}
94
95_declspec(dllexport) int fn_NetSim_OSPF_FreePacket(NetSim_PACKET* pstruPacket)
96{
97 return fn_NetSim_OSPF_FreePacket_F(pstruPacket);
98}
99
100_declspec(dllexport) int fn_NetSim_OSPF_CopyPacket(NetSim_PACKET* pstruDestPacket, NetSim_PACKET* pstruSrcPacket)
101{
102 return fn_NetSim_OSPF_CopyPacket_F(pstruDestPacket, pstruSrcPacket);
103}
104
105_declspec(dllexport) int fn_NetSim_OSPF_Metrics(PMETRICSWRITER metricsWriter)
106{
107 return fn_NetSim_OSPF_Metrics_F(metricsWriter);
108}
109
110_declspec(dllexport) char* fn_NetSim_OSPF_ConfigPacketTrace(const void* xmlNetSimNode)
111{
112 return fn_NetSim_OSPF_ConfigPacketTrace_F(xmlNetSimNode);
113}
114
115_declspec(dllexport) int fn_NetSim_OSPF_WritePacketTrace(NetSim_PACKET* pstruPacket, char** ppszTrace)
116{
117 return fn_NetSim_OSPF_WritePacketTrace_F(pstruPacket, ppszTrace);
118}
119
120static void ospf_handle_timer_event()
121{
122 if (OSPF_IS_SUBEVENT(pstruEventDetails->nSubEventType))
123 OSPF_CALL_SUBEVENT(pstruEventDetails->nSubEventType);
124 else
125 {
126 fnNetSimError("OSPF: Event call back function is not defined for %s event\n",
127 GetStringOSPF_Subevent(pstruEventDetails->nSubEventType));
128 }
129}
130
131static void ospf_handle_appin_event()
132{
133 NetSim_PACKET* packet = pstruEventDetails->pPacket;
134 NETSIM_ID d = pstruEventDetails->nDeviceId;
135 NETSIM_ID in = pstruEventDetails->nInterfaceId;
136 if (!validate_ospf_packet(packet, d, in))
137 {
138 fnNetSimError("OSPF Packet validation is failed received on %d-%d\n", d, in);
139 return;
140 }
141
142 ptrOSPFPACKETHDR hdr = OSPF_PACKET_GET_HDR(packet);
143 switch (hdr->Type)
144 {
145 case OSPFMSG_HELLO:
146 ospf_process_hello();
147 break;
148 case OSPFMSG_DD:
149 ospf_handle_DD();
150 break;
151 case OSPFMSG_LSUPDATE:
152 ospf_handle_LSUPDATE();
153 break;
154 case OSPFMSG_LSREQUEST:
155 ospf_handle_LSRequest();
156 break;
157 case OSPFMSG_LSACK:
158 ospf_handle_LSAck();
159 break;
160 default:
161 fnNetSimError("Unknown ospf msg %d arrives to router %d-%d\n",
162 hdr->Type,
163 d, in);
164 break;
165 }
166}
167
168char logId[BUFSIZ];
169char* form_dlogId(char* name,
170 NETSIM_ID d)
171{
172 sprintf(logId, "%s_%d",
173 name, d);
174 return logId;
175}
176
177static void register_ospf_log()
178{
179 /*
180 init_ospf_dlog("OSPFROUTE_6", "OSPFROUTE_6");
181 init_ospf_dlog("LSDB_6", "LSDB_6");
182 init_ospf_dlog("OSPFSPF_6", "OSPFSPF_6");
183 init_ospf_dlog("LSDB_1", "LSDB_1");
184 init_ospf_dlog("RCVLSU_1", "RCVLSU_1");
185 init_ospf_dlog("OSPFROUTE_1", "OSPFROUTE_1");
186 init_ospf_dlog("LSULIST_1", "LSULIST_1");
187 init_ospf_dlog("OSPFSPF_1", "OSPFSPF_1");
188 init_ospf_dlog("RXTLIST_1", "RXTLIST_1");
189 init_ospf_dlog("RLSALOG_2", "RLSALOG_2");
190 init_ospf_dlog("RXTLIST_2", "RXTLIST_2");
191 init_ospf_dlog("RCVLSU_1", "RCVLSU_1");
192 init_ospf_dlog("RCVLSU_2", "RCVLSU_2");*/
193 //
194 //init_ospf_dlog("OSPFROUTE_1", "OSPFROUTE_1");
195}
196
197bool get_ospf_log_status()
198{
199 if (get_protocol_log_status("OSPF_LOG"))
200 return true;
201 else
202 return false;
203}
204
205bool get_ospf_hello_log_status()
206{
207 if (get_protocol_log_status("OSPF_HELLO_LOG"))
208 return true;
209 else
210 return false;
211}
212
213bool get_protocol_log_status(char* logname)
214{
215 FILE* fp;
216 char str[BUFSIZ];
217 char data[BUFSIZ];
218
219 sprintf(str, "%s/%s", pszIOPath, "ProtocolLogsConfig.txt");
220 fp = fopen(str, "r");
221 if (!fp)
222 return false;
223
224 sprintf(str, "%s=true", logname);
225
226 while (fgets(data, BUFSIZ, fp))
227 {
228 lskip(data);
229 if (!_strnicmp(data, str, strlen(str)))
230 {
231 fclose(fp);
232 return true;
233 }
234 }
235 fclose(fp);
236
237 return false;
238}
239