NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
OSPF_Msg.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 "OSPF.h"
16#include "OSPF_Msg.h"
17#include "OSPF_Interface.h"
18
20{
21 char name[50];
22 void (*fnNew)(ptrOSPFPACKETHDR hdr);
23 void(*fnFree)(void*);
24 void*(*fnCopy)(void*);
25}OSPFMSG_DATABASE;
26static OSPFMSG_DATABASE pstruOSPFMsgCallback[] = {
27 {"UNKNOWN"},
28 {"OSPF_HELLO",OSPF_HELLO_MSG_NEW,OSPF_HELLO_MSG_FREE,OSPF_HELLO_MSG_COPY},
29 {"OSPF_DD",OSPF_DD_MSG_NEW,OSPF_DD_MSG_FREE,OSPF_DD_MSG_COPY},
30 {"OSPF_LSREQ",OSPF_LSREQ_MSG_NEW,OSPF_LSREQ_MSG_FREE,OSPF_LSREQ_MSG_COPY},
31 {"OSPF_LSUPDATE",OSPF_LSUPDATE_MSG_NEW,OSPF_LSUPDATE_MSG_FREE,OSPF_LSUPDATE_MSG_COPY},
32 {"OSPF_LSACK",OSPF_LSACK_NEW,OSPF_LSACK_FREE,OSPF_LSACK_COPY}
33};
34
35static char* OSPFMSG_TO_STR(OSPFMSG type)
36{
37 return pstruOSPFMsgCallback[type].name;
38}
39
40ptrOSPFPACKETHDR OSPF_HDR_NEW()
41{
42 ptrOSPFPACKETHDR hdr = calloc(1, sizeof* hdr);
43 hdr->Version = OSPF_VERSION;
44 hdr->Packet_length = OSPFPACKETHDR_LEN;
45 return hdr;
46}
47
48ptrOSPFPACKETHDR OSPF_HDR_COPY(ptrOSPFPACKETHDR hdr)
49{
50 if (!hdr)
51 return NULL;
52
53 ptrOSPFPACKETHDR newHdr = calloc(1, sizeof* newHdr);
54 memcpy(newHdr, hdr, sizeof* hdr);
55 newHdr->ospfMSG = pstruOSPFMsgCallback[hdr->Type].fnCopy(hdr->ospfMSG);
56 return newHdr;
57}
58
59void OSPF_HDR_FREE(ptrOSPFPACKETHDR hdr)
60{
61 if (hdr)
62 {
63 if (hdr->Type &&
64 pstruOSPFMsgCallback[hdr->Type].fnFree)
65 pstruOSPFMsgCallback[hdr->Type].fnFree(hdr->ospfMSG);
66 free(hdr);
67 }
68}
69
70void OSPF_HDR_SET_MSG(ptrOSPFPACKETHDR hdr,
71 OSPFMSG type,
72 void* msg,
73 UINT16 len)
74{
75 hdr->Type = type;
76 hdr->ospfMSG = msg;
77 hdr->Packet_length += len;
78}
79
80void OSPF_HDR_INCREASE_LEN(NetSim_PACKET* packet,
81 UINT16 len)
82{
83 ptrOSPFPACKETHDR hdr = OSPF_PACKET_GET_HDR(packet);
84 hdr->Packet_length += len;
85 packet->pstruAppData->dOverhead = (double)hdr->Packet_length;
86 packet->pstruAppData->dPacketSize = packet->pstruAppData->dPayload +
87 packet->pstruAppData->dOverhead;
88}
89
90static void ospf_packet_update_src(NetSim_PACKET* packet,
91 NETSIM_ID d,
92 NETSIM_ID in)
93{
94 packet->nSourceId = d;
95 packet->pstruNetworkData->szSourceIP = DEVICE_NWADDRESS(d, in);
96}
97
98static ptrOSPFPACKETHDR ospf_get_new_hdr(OSPFMSG type)
99{
100 ptrOSPFPACKETHDR hdr = OSPF_HDR_NEW();
101 if(pstruOSPFMsgCallback[type].fnNew)
102 pstruOSPFMsgCallback[type].fnNew(hdr);
103 return hdr;
104}
105
106NetSim_PACKET* OSPF_PACKET_NEW(double time,
107 OSPFMSG type,
108 NETSIM_ID d,
109 NETSIM_ID in)
110{
111 NetSim_PACKET* packet = fn_NetSim_Packet_CreatePacket(APPLICATION_LAYER);
112 packet->nPacketPriority = Priority_High;
113 packet->nPacketType = PacketType_Control;
114 packet->nControlDataType = OSPFMSG_TO_PACKETTYPE(type);
115 packet->pstruAppData->dArrivalTime = time;
116 packet->pstruAppData->dEndTime = time;
117 packet->pstruAppData->dStartTime = time;
118 packet->pstruAppData->nApplicationProtocol = APP_PROTOCOL_OSPF;
119 ptrOSPFPACKETHDR hdr = ospf_get_new_hdr(type);
120 packet->pstruAppData->Packet_AppProtocol = hdr;
121 packet->pstruAppData->dOverhead = OSPF_HDR_GET_LEN(hdr);
122 packet->pstruAppData->dPacketSize = OSPF_HDR_GET_LEN(hdr);
123 packet->dEventTime = time;
124 strcpy(packet->szPacketType, OSPFMSG_TO_STR(type));
125 packet->pstruNetworkData->IPProtocol = IPPROTOCOL_OSPF;
126
127 ospf_packet_update_src(packet, d, in);
128 ptrOSPF_PDS ospf = OSPF_PDS_GET(d);
129 OSPF_HDR_SET_ROUTERID(hdr, ospf->routerId);
130
131 ptrOSPF_IF ospfif = OSPF_IF_GET(ospf, in);
132 OSPF_HDR_SET_AREAID(hdr, ospfif->areaId);
133 return packet;
134}
135
136void OSPF_SEND_PACKET(NetSim_PACKET* packet)
137{
138 static int packetId = 0;
139 packet->pstruTransportData->dPayload = packet->pstruAppData->dPacketSize;
140 packet->pstruTransportData->dPacketSize = packet->pstruAppData->dPacketSize;
141 packet->pstruTransportData->dArrivalTime = pstruEventDetails->dEventTime;
142 packet->pstruTransportData->dEndTime = pstruEventDetails->dEventTime;
143 packet->pstruTransportData->dStartTime = pstruEventDetails->dEventTime;
144 packet->nPacketId = packetId;
145 //--packetId;
146 NetSim_EVENTDETAILS pevent;
147 memset(&pevent, 0, sizeof pevent);
148 pevent.dEventTime = pstruEventDetails->dEventTime;
149 pevent.dPacketSize = packet->pstruAppData->dPacketSize;
150 pevent.nDeviceId = pstruEventDetails->nDeviceId;
151 pevent.nDeviceType = DEVICE_TYPE(pevent.nDeviceId);
152 pevent.nEventType = NETWORK_OUT_EVENT;
153 pevent.nInterfaceId = pstruEventDetails->nInterfaceId;
154 pevent.nPacketId = packet->nPacketId;
155 pevent.pPacket = packet;
156 pevent.nProtocolId = NW_PROTOCOL_IPV4;
157 fnpAddEvent(&pevent);
158}
159
160static bool validate_areaid(NetSim_PACKET* packet)
161{
162 ptrOSPF_IF ospf = OSPF_IF_CURRENT();
163
164 if (!ospf)
165 fnNetSimError("OSPF is not configured for device %d interface %d.\n",
166 DEVICE_CONFIGID(pstruEventDetails->nDeviceId),
167 DEVICE_INTERFACE_CONFIGID(pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId));
168
169 ptrOSPF_PDS pds = OSPF_PDS_CURRENT();
170 ptrOSPFPACKETHDR hdr = OSPF_PACKET_GET_HDR(packet);
171 OSPFID area = ospf->areaId;
172 if (!IP_COMPARE(area, hdr->AreaId))
173 {
174 if (ospf->Type != OSPFIFTYPE_P2P)
175 {
176 NETSIM_IPAddress src = packet->pstruNetworkData->szSourceIP;
177 NETSIM_IPAddress myip = DEVICE_NWADDRESS(pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId);
178 NETSIM_IPAddress mymask = DEVICE_SUBNETMASK(pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId);
179 if (IP_IS_IN_SAME_NETWORK_IPV4(src, myip, mymask))
180 return true;
181 else
182 return false;
183 }
184 else
185 {
186 return true;
187 }
188 }
189 else if (!IP_COMPARE(hdr->AreaId, NullID))
190 {
191 if (pds->routerType != OSPFRTYPE_ABR)
192 return false;
193#pragma message(__LOC__"Change after virtual link implementation")
194 return false;
195 }
196 else
197 {
198 return false;
199 }
200}
201
202bool validate_ospf_packet(NetSim_PACKET* packet,
203 NETSIM_ID d,
204 NETSIM_ID in)
205{
206 //Section 8.2
207 NETSIM_IPAddress dest = packet->pstruNetworkData->szDestIP;
208 NETSIM_IPAddress src = packet->pstruNetworkData->szSourceIP;
209 NETSIM_IPAddress myip = DEVICE_NWADDRESS(d, in);
210
211 if (packet->pstruNetworkData->IPProtocol != IPPROTOCOL_OSPF)
212 return false; // Not a OSPF packet
213
214 if (!(!IP_COMPARE(dest, myip) ||
215 !IP_COMPARE(dest, AllSPFRouters) ||
216 !IP_COMPARE(dest, AllDRouters)))
217 return false; // Not mine
218
219 if (!IP_COMPARE(src, myip))
220 return false; // I received my own packet
221
222 ptrOSPFPACKETHDR hdr = OSPF_PACKET_GET_HDR(packet);
223 ptrOSPF_PDS pds = OSPF_PDS_GET(d);
224 ptrOSPF_IF ospf = OSPF_IF_GET(pds, in);
225
226 if (hdr->Version != OSPF_VERSION)
227 return false;
228
229 if (!validate_areaid(packet))
230 return false;
231
232 if (!IP_COMPARE(dest, AllDRouters))
233 {
234 if (!(ospf->State == OSPFIFSTATE_BACKUP ||
235 ospf->State == OSPFIFSTATE_DR))
236 return false;
237 }
238
239 //No authentication check
240
241 return true;
242}