NetSim Source Code Help
Loading...
Searching...
No Matches
OSPF_Msg.c
Go to the documentation of this file.
1/************************************************************************************
2* Copyright (C) 2020 *
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*);
27 {"UNKNOWN"},
33};
34
35static char* OSPFMSG_TO_STR(OSPFMSG type)
36{
37 return pstruOSPFMsgCallback[type].name;
38}
39
41{
42 ptrOSPFPACKETHDR hdr = calloc(1, sizeof* hdr);
43 hdr->Version = OSPF_VERSION;
45 return hdr;
46}
47
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
60{
61 if (hdr)
62 {
63 if (hdr->Type &&
66 free(hdr);
67 }
68}
69
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
81 UINT16 len)
82{
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
91 NETSIM_ID d,
92 NETSIM_ID in)
93{
94 packet->nSourceId = d;
96}
97
99{
101 if(pstruOSPFMsgCallback[type].fnNew)
102 pstruOSPFMsgCallback[type].fnNew(hdr);
103 return hdr;
104}
105
107 OSPFMSG type,
108 NETSIM_ID d,
109 NETSIM_ID in)
110{
115 packet->pstruAppData->dArrivalTime = time;
116 packet->pstruAppData->dEndTime = time;
117 packet->pstruAppData->dStartTime = time;
120 packet->pstruAppData->Packet_AppProtocol = hdr;
123 packet->dEventTime = time;
124 strcpy(packet->szPacketType, OSPFMSG_TO_STR(type));
126
127 ospf_packet_update_src(packet, d, in);
128 ptrOSPF_PDS ospf = OSPF_PDS_GET(d);
130
131 ptrOSPF_IF ospfif = OSPF_IF_GET(ospf, in);
132 OSPF_HDR_SET_AREAID(hdr, ospfif->areaId);
133 return packet;
134}
135
137{
138 static int packetId = 0;
144 packet->nPacketId = packetId;
145 //--packetId;
146 NetSim_EVENTDETAILS pevent;
147 memset(&pevent, 0, sizeof pevent);
149 pevent.dPacketSize = packet->pstruAppData->dPacketSize;
151 pevent.nDeviceType = DEVICE_TYPE(pevent.nDeviceId);
154 pevent.nPacketId = packet->nPacketId;
155 pevent.pPacket = packet;
157 fnpAddEvent(&pevent);
158}
159
160static bool validate_areaid(NetSim_PACKET* packet)
161{
163
164 if (!ospf)
165 fnNetSimError("OSPF is not configured for device %d interface %d.\n",
168
171 OSPFID area = ospf->areaId;
172 if (!IP_COMPARE(area, hdr->AreaId))
173 {
174 if (ospf->Type != OSPFIFTYPE_P2P)
175 {
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
203 NETSIM_ID d,
204 NETSIM_ID in)
205{
206 //Section 8.2
210
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
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}
unsigned int NETSIM_ID
Definition: Animation.h:45
#define IP_IS_IN_SAME_NETWORK_IPV4(ip1, ip2, subnet)
Definition: IP_Addressing.h:97
#define IP_COMPARE(ip1, ip2)
Definition: IP_Addressing.h:67
#define fnNetSimError(x,...)
Definition: Linux.h:56
#define UINT16
Definition: Linux.h:33
#define free(p)
Definition: Memory.h:31
#define calloc(c, s)
Definition: Memory.h:29
NETSIM_IPAddress AllDRouters
Definition: OSPF.h:49
ptrOSPF_IF OSPF_IF_GET(ptrOSPF_PDS ospf, NETSIM_ID ifId)
#define OSPF_PDS_CURRENT()
Definition: OSPF.h:151
#define OSPF_IF_CURRENT()
Definition: OSPF.h:179
NETSIM_IPAddress AllSPFRouters
Definition: OSPF.h:48
@ OSPFRTYPE_ABR
Definition: OSPF.h:63
OSPFID NullID
Definition: OSPF.h:50
#define OSPF_PDS_GET(d)
Definition: OSPF.h:150
void OSPF_DD_MSG_NEW(ptrOSPFPACKETHDR hdr)
Definition: OSPF_DD.c:23
ptrOSPFDD OSPF_DD_MSG_COPY(ptrOSPFDD dd)
Definition: OSPF_DD.c:32
void OSPF_DD_MSG_FREE(ptrOSPFDD dd)
Definition: OSPF_DD.c:44
void OSPF_HELLO_MSG_NEW(ptrOSPFPACKETHDR hdr)
Definition: OSPF_Hello.c:24
ptrOSPFHELLO OSPF_HELLO_MSG_COPY(ptrOSPFHELLO hello)
Definition: OSPF_Hello.c:33
void OSPF_HELLO_MSG_FREE(ptrOSPFHELLO hello)
Definition: OSPF_Hello.c:45
@ OSPFIFTYPE_P2P
@ OSPFIFSTATE_DR
@ OSPFIFSTATE_BACKUP
void OSPF_LSACK_NEW(ptrOSPFPACKETHDR hdr)
Definition: OSPF_LSAACK.c:45
ptrOSPFLSACK OSPF_LSACK_COPY(ptrOSPFLSACK ack)
Definition: OSPF_LSAACK.c:23
void OSPF_LSACK_FREE(ptrOSPFLSACK ack)
Definition: OSPF_LSAACK.c:37
ptrOSPFLSREQ OSPF_LSREQ_MSG_COPY(ptrOSPFLSREQ lsr)
Definition: OSPF_LSREQ.c:39
void OSPF_LSREQ_MSG_FREE(ptrOSPFLSREQ lsr)
Definition: OSPF_LSREQ.c:54
void OSPF_LSREQ_MSG_NEW(ptrOSPFPACKETHDR hdr)
Definition: OSPF_LSREQ.c:30
ptrOSPFLSUPDATE OSPF_LSUPDATE_MSG_COPY(ptrOSPFLSUPDATE lsu)
Definition: OSPF_LSUPDATE.c:32
void OSPF_LSUPDATE_MSG_NEW(ptrOSPFPACKETHDR hdr)
Definition: OSPF_LSUPDATE.c:23
void OSPF_LSUPDATE_MSG_FREE(ptrOSPFLSUPDATE lsu)
Definition: OSPF_LSUPDATE.c:44
struct stru_ospf_msg_database OSPFMSG_DATABASE
void OSPF_SEND_PACKET(NetSim_PACKET *packet)
Definition: OSPF_Msg.c:136
static char * OSPFMSG_TO_STR(OSPFMSG type)
Definition: OSPF_Msg.c:35
ptrOSPFPACKETHDR OSPF_HDR_NEW()
Definition: OSPF_Msg.c:40
static OSPFMSG_DATABASE pstruOSPFMsgCallback[]
Definition: OSPF_Msg.c:26
void OSPF_HDR_FREE(ptrOSPFPACKETHDR hdr)
Definition: OSPF_Msg.c:59
void OSPF_HDR_INCREASE_LEN(NetSim_PACKET *packet, UINT16 len)
Definition: OSPF_Msg.c:80
static ptrOSPFPACKETHDR ospf_get_new_hdr(OSPFMSG type)
Definition: OSPF_Msg.c:98
bool validate_ospf_packet(NetSim_PACKET *packet, NETSIM_ID d, NETSIM_ID in)
Definition: OSPF_Msg.c:202
static void ospf_packet_update_src(NetSim_PACKET *packet, NETSIM_ID d, NETSIM_ID in)
Definition: OSPF_Msg.c:90
ptrOSPFPACKETHDR OSPF_HDR_COPY(ptrOSPFPACKETHDR hdr)
Definition: OSPF_Msg.c:48
void OSPF_HDR_SET_MSG(ptrOSPFPACKETHDR hdr, OSPFMSG type, void *msg, UINT16 len)
Definition: OSPF_Msg.c:70
static bool validate_areaid(NetSim_PACKET *packet)
Definition: OSPF_Msg.c:160
NetSim_PACKET * OSPF_PACKET_NEW(double time, OSPFMSG type, NETSIM_ID d, NETSIM_ID in)
Definition: OSPF_Msg.c:106
#define OSPF_HDR_SET_AREAID(hdr, id)
Definition: OSPF_Msg.h:87
#define OSPFMSG_TO_PACKETTYPE(msg)
Definition: OSPF_Msg.h:39
#define OSPFPACKETHDR_LEN
Definition: OSPF_Msg.h:85
#define OSPF_PACKET_GET_HDR(packet)
Definition: OSPF_Msg.h:91
#define OSPF_HDR_SET_ROUTERID(hdr, id)
Definition: OSPF_Msg.h:86
#define OSPF_VERSION
Definition: OSPF_Msg.h:21
#define OSPF_HDR_GET_LEN(hdr)
Definition: OSPF_Msg.h:90
enum enum_ospf_msg OSPFMSG
Definition: OSPF_Typedef.h:38
@ PacketType_Control
Definition: Packet.h:66
@ IPPROTOCOL_OSPF
Definition: Packet.h:132
@ Priority_High
Definition: Packet.h:82
#define DEVICE_TYPE(DeviceId)
Definition: Stack.h:773
#define DEVICE_INTERFACE_CONFIGID(DeviceId, InterfaceId)
Definition: Stack.h:781
#define DEVICE_NWADDRESS(DeviceId, InterfaceId)
Definition: Stack.h:805
@ NW_PROTOCOL_IPV4
Definition: Stack.h:189
@ APP_PROTOCOL_OSPF
Definition: Stack.h:155
#define DEVICE_SUBNETMASK(DeviceId, InterfaceId)
Definition: Stack.h:807
#define DEVICE_CONFIGID(DeviceId)
Definition: Stack.h:779
@ NETWORK_OUT_EVENT
Definition: Stack.h:108
@ APPLICATION_LAYER
Definition: Stack.h:98
EXPORTED struct stru_NetSim_EventDetails * pstruEventDetails
Definition: Stack.h:837
#define fn_NetSim_Packet_CreatePacket(layer)
Definition: main.h:186
#define fnpAddEvent(pstruEvent)
Definition: main.h:191
EVENT_TYPE nEventType
Definition: Stack.h:747
NETSIM_ID nProtocolId
Definition: Stack.h:748
struct stru_NetSim_Packet * pPacket
Definition: Stack.h:754
NETSIM_ID nDeviceId
Definition: Stack.h:750
long long int nPacketId
Definition: Stack.h:755
netsimDEVICE_TYPE nDeviceType
Definition: Stack.h:749
NETSIM_ID nInterfaceId
Definition: Stack.h:751
APPLICATION_LAYER_PROTOCOL nApplicationProtocol
Definition: Packet.h:172
IP_PROTOCOL_NUMBER IPProtocol
Definition: Packet.h:203
NETSIM_IPAddress szDestIP
Definition: Packet.h:199
NETSIM_IPAddress szSourceIP
Definition: Packet.h:198
long long int nPacketId
Definition: Packet.h:256
struct stru_NetSim_Packet_AppLayer * pstruAppData
Definition: Packet.h:273
char szPacketType[MAX_PACKET_TYPE_LEN]
Definition: Packet.h:271
struct stru_NetSim_Packet_NetworkLayer * pstruNetworkData
Definition: Packet.h:275
double dEventTime
Definition: Packet.h:262
unsigned int nControlDataType
Definition: Packet.h:258
PACKET_TYPE nPacketType
Definition: Packet.h:257
struct stru_NetSim_Packet_TransportLayer * pstruTransportData
Definition: Packet.h:274
PACKET_PRIORITY nPacketPriority
Definition: Packet.h:260
NETSIM_ID nSourceId
Definition: Packet.h:263
OSPFIFTYPE Type
OSPFIFSTATE State
void *(* fnCopy)(void *)
Definition: OSPF_Msg.c:24
void(* fnNew)(ptrOSPFPACKETHDR hdr)
Definition: OSPF_Msg.c:22
void(* fnFree)(void *)
Definition: OSPF_Msg.c:23
OSPFRTYPE routerType
Definition: OSPF.h:115
OSPFID routerId
Definition: OSPF.h:114