NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
OSPF_Msg.h
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
15#ifndef _NETSIM_OSPF_MSG_H_
16#define _NETSIM_OSPF_MSG_H_
17#ifdef __cplusplus
18extern "C" {
19#endif
20
21#define OSPF_VERSION 2
22#ifndef OSPFID
23 typedef NETSIM_IPAddress OSPFID;
24#endif // !OSPFID
25#define INTERFACE_MTU_DEFAULT 1500 //Bytes
26#define IP_HDR_LEN 20 //Bytes
27#define OSPF_INITIAL_SEQUENCE_NUMBER 0x80000001
28#define OSPF_MAX_SEQUENCE_NUMBER 0x7FFFFFFF
29
30
31 enum enum_ospf_msg
32 {
33 OSPFMSG_HELLO = 1,
34 OSPFMSG_DD,
35 OSPFMSG_LSREQUEST,
36 OSPFMSG_LSUPDATE,
37 OSPFMSG_LSACK,
38 };
39#define OSPFMSG_TO_PACKETTYPE(msg) (APP_PROTOCOL_OSPF*100+msg)
40#define OSPFMSG_FROM_PACKETTYPE(type) (type/100==APP_PROTOCOL_OSPF?type%100:0)
41
42 // Type of link.
43 typedef enum
44 {
45 OSPFLINKTYPE_POINT_TO_POINT = 1,
46 OSPFLINKTYPE_TRANSIT = 2,
47 OSPFLINKTYPE_STUB = 3,
48 OSPFLINKTYPE_VIRTUAL = 4
49 } OSPFLINKTYPE;
50 static char strOSPFLINKTYPE[][50] = { "NULL","Point_to_Point","Transit","Stub","Virtual" };
51
52 /*
53 A.3.1 The OSPF packet header
54 0 1 2 3
55 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
56 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
57 | Version # | Type | Packet length |
58 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
59 | Router ID |
60 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
61 | Area ID |
62 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
63 | Checksum | AuType |
64 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
65 | Authentication |
66 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
67 | Authentication |
68 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
69
70 */
71
73 {
74 UINT8 Version;
75 OSPFMSG Type;
76 UINT16 Packet_length;
77 OSPFID RouterId;
78 OSPFID AreaId;
79 UINT16 Checksum;
80 UINT16 AuType;
81 UINT Authentication[2];
82
83 void* ospfMSG;
84 };
85#define OSPFPACKETHDR_LEN 24 //Bytes
86#define OSPF_HDR_SET_ROUTERID(hdr,id) ((hdr)->RouterId = id)
87#define OSPF_HDR_SET_AREAID(hdr,id) ((hdr)->AreaId = id)
88#define OSPF_MSG_TYPE(hdr) ((hdr)->Type)
89#define OSPF_MSG_IS_TYPE(hdr,type) ((hdr)->Type==type)
90#define OSPF_HDR_GET_LEN(hdr) ((hdr)->Packet_length)
91#define OSPF_PACKET_GET_HDR(packet) ((ptrOSPFPACKETHDR)((packet)->pstruAppData->Packet_AppProtocol))
92#define OSPF_PACKET_SET_HDR(packet,hdr) ((packet)->pstruAppData->Packet_AppProtocol=hdr)
93#define OSPF_HDR_GET_MSG(hdr) ((hdr)->ospfMSG)
94#define OSPF_PACKET_GET_MSG(packet) (OSPF_HDR_GET_MSG(OSPF_PACKET_GET_HDR(packet)))
95#define OSPF_PACKET_GET_MSG_TYPE(packet) (OSPF_MSG_TYPE(OSPF_PACKET_GET_HDR(packet)))
96 void OSPF_HDR_INCREASE_LEN(NetSim_PACKET* packet,
97 UINT16 len);
98 void OSPF_HDR_SET_MSG(ptrOSPFPACKETHDR hdr,
99 OSPFMSG type,
100 void* msg,
101 UINT16 len);
102 void OSPF_HDR_FREE(ptrOSPFPACKETHDR hdr);
103 ptrOSPFPACKETHDR OSPF_HDR_COPY(ptrOSPFPACKETHDR hdr);
104
105 //OSPF Option
106#define OPT_E_BIT_INDEX 2
107#define OPT_MC_BIT_INDEX 3
108#define OPT_NP_BIT_INDEX 4
109#define OPT_EA_BIT_INDEX 5
110#define OPT_DC_BIT_INDEX 6
111#define OPT_SET_E(opt) ((opt) = setBit((opt),OPT_E_BIT_INDEX))
112#define OPT_SET_MC(opt) ((opt) = setBit((opt),OPT_MC_BIT_INDEX))
113#define OPT_SET_NP(opt) ((opt) = setBit((opt),OPT_NP_BIT_INDEX))
114#define OPT_SET_EA(opt) ((opt) = setBit((opt),OPT_EA_BIT_INDEX))
115#define OPT_SET_DC(opt) ((opt) = setBit((opt),OPT_DC_BIT_INDEX))
116#define OPT_IS_E(opt) (isBitSet((opt),OPT_E_BIT_INDEX))
117#define OPT_IS_MC(opt) (isBitSet((opt),OPT_MC_BIT_INDEX))
118#define OPT_IS_NP(opt) (isBitSet((opt),OPT_NP_BIT_INDEX))
119#define OPT_IS_EA(opt) (isBitSet((opt),OPT_EA_BIT_INDEX))
120#define OPT_IS_DC(opt) (isBitSet((opt),OPT_DC_BIT_INDEX))
121
122 /*
123 A.3.2 The Hello packet
124 0 1 2 3
125 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
126 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
127 | Version # | 1 | Packet length |
128 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
129 | Router ID |
130 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
131 | Area ID |
132 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
133 | Checksum | AuType |
134 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
135 | Authentication |
136 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
137 | Authentication |
138 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
139 | Network Mask |
140 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
141 | HelloInterval | Options | Rtr Pri |
142 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
143 | RouterDeadInterval |
144 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
145 | Designated Router |
146 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
147 | Backup Designated Router |
148 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
149 | Neighbor |
150 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
151 | ... |
152 */
154 {
155 NETSIM_IPAddress NetworkMask;
156 UINT16 HelloInterval;
157 UINT8 Options;
158 UINT8 RtrPri;
159 UINT RouterDeadInterval;
160 NETSIM_IPAddress DesignatedRouter;
161 NETSIM_IPAddress BackupDesignatedRouter;
162 NETSIM_IPAddress* Neighbor;
163
164 UINT neighCount;
165 };
166#define OSPFHELLO_LEN_FIXED 20 //Bytes
167 void OSPF_HELLO_MSG_NEW(ptrOSPFPACKETHDR hdr);
168 ptrOSPFHELLO OSPF_HELLO_MSG_COPY(ptrOSPFHELLO hello);
169 void OSPF_HELLO_MSG_FREE(ptrOSPFHELLO hello);
170
171 /*
172 A.3.3 The Database Description packet
173 0 1 2 3
174 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
175 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
176 | Version # | 2 | Packet length |
177 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
178 | Router ID |
179 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
180 | Area ID |
181 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
182 | Checksum | AuType |
183 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
184 | Authentication |
185 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
186 | Authentication |
187 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
188 | Interface MTU | Options |0|0|0|0|0|I|M|MS
189 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
190 | DD sequence number |
191 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
192 | |
193 +- -+
194 | |
195 +- An LSA Header -+
196 | |
197 +- -+
198 | |
199 +- -+
200 | |
201 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
202 | ... |
203 */
204 typedef struct stru_ospf_DD
205 {
206 UINT16 InterfaceMTU;
207 UINT8 Option;
208 UINT8 IMMS;
209 UINT DDSequenceNumber;
210 UINT16 numLSA;
211 ptrOSPFLSAHDR* LSAHeader;
212 }OSPFDD,*ptrOSPFDD;
213#define OSPFDD_LEN_FIXED 8 //Bytes
214#define DD_INIT_BIT_INDEX 3
215#define DD_MORE_BIT_INDEX 2
216#define DD_MASTER_BIT_INDEX 1
217#define DD_SET_INIT(dd) ((dd)->IMMS = (UINT8)setBit((dd)->IMMS,DD_INIT_BIT_INDEX))
218#define DD_SET_MORE(dd) ((dd)->IMMS = (UINT8)setBit((dd)->IMMS,DD_MORE_BIT_INDEX))
219#define DD_SET_MASTER(dd) ((dd)->IMMS = (UINT8)setBit((dd)->IMMS,DD_MASTER_BIT_INDEX))
220#define DD_IS_INIT(dd) (isBitSet((dd)->IMMS,DD_INIT_BIT_INDEX))
221#define DD_IS_MORE(dd) (isBitSet((dd)->IMMS,DD_MORE_BIT_INDEX))
222#define DD_IS_MASTER(dd) (isBitSet((dd)->IMMS,DD_MASTER_BIT_INDEX))
223#define OSPF_DD_MAX_LSA_COUNT() ((INTERFACE_MTU_DEFAULT - IP_HDR_LEN - OSPFDD_LEN_FIXED - OSPFPACKETHDR_LEN) / OSPFLSAHDR_LEN);
224 void OSPF_DD_MSG_NEW(ptrOSPFPACKETHDR hdr);
225 ptrOSPFDD OSPF_DD_MSG_COPY(ptrOSPFDD dd);
226 void OSPF_DD_MSG_FREE(ptrOSPFDD dd);
227
228 /*
229 A.3.4 The Link State Request packet
230 0 1 2 3
231 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
232 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
233 | Version # | 3 | Packet length |
234 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
235 | Router ID |
236 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
237 | Area ID |
238 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
239 | Checksum | AuType |
240 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
241 | Authentication |
242 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
243 | Authentication |
244 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
245 | LS type |
246 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
247 | Link State ID |
248 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
249 | Advertising Router |
250 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
251 | ... |
252 */
254 {
255 UINT LSType;
256 NETSIM_IPAddress LinkStateId;
257 NETSIM_IPAddress AdvertisingRouter;
258 }OSPFLSREQOBJ,*ptrOSPFLSREQOBJ;
259
260 typedef struct stru_ospf_lsrequest
261 {
262 UINT count;
263 ptrOSPFLSREQOBJ* lsrObj;
264 }OSPFLSREQ, *ptrOSPFLSREQ;
265#define OSPFLSREQ_LEN_SINGLE 12 //Bytes
266 void OSPF_LSREQ_MSG_NEW(ptrOSPFPACKETHDR hdr);
267 ptrOSPFLSREQ OSPF_LSREQ_MSG_COPY(ptrOSPFLSREQ lsr);
268 void OSPF_LSREQ_MSG_FREE(ptrOSPFLSREQ lsr);
269
270 /*
271 A.3.5 The Link State Update packet
272 0 1 2 3
273 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
274 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
275 | Version # | 4 | Packet length |
276 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
277 | Router ID |
278 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
279 | Area ID |
280 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
281 | Checksum | AuType |
282 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
283 | Authentication |
284 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
285 | Authentication |
286 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
287 | # LSAs |
288 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
289 | |
290 +- +-+
291 | LSAs |
292 +- +-+
293 | ... |
294
295 */
296 typedef struct stur_ospf_lsupdate
297 {
298 UINT LSAsCount;
299 void** LSAs;
300 }OSPFLSUPDATE,*ptrOSPFLSUPDATE;
301#define OSPFLSUPDATE_LEN_FIXED 4 //Bytes
302 void OSPF_LSUPDATE_MSG_NEW(ptrOSPFPACKETHDR hdr);
303 ptrOSPFLSUPDATE OSPF_LSUPDATE_MSG_COPY(ptrOSPFLSUPDATE lsu);
304 void OSPF_LSUPDATE_MSG_FREE(ptrOSPFLSUPDATE lsu);
305
306 /*
307 A.3.6 The Link State Acknowledgment packet
308 0 1 2 3
309 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
310 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
311 | Version # | 5 | Packet length |
312 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
313 | Router ID |
314 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
315 | Area ID |
316 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
317 | Checksum | AuType |
318 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
319 | Authentication |
320 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
321 | Authentication |
322 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
323 | |
324 +- -+
325 | |
326 +- An LSA Header -+
327 | |
328 +- -+
329 | |
330 +- -+
331 | |
332 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
333 | ... |
334 */
335 typedef struct stru_ospf_lsack
336 {
337 UINT count;
338 ptrOSPFLSAHDR* LSAHeader;
339 }OSPFLSACK,*ptrOSPFLSACK;
340#define OSPFLSACK_LEN_FIXED 0 //Bytes
341 void OSPF_LSACK_NEW(ptrOSPFPACKETHDR hdr);
342 ptrOSPFLSACK OSPF_LSACK_COPY(ptrOSPFLSACK ack);
343 void OSPF_LSACK_FREE(ptrOSPFLSACK ack);
344
345 /*
346 LS Type Description
347 ___________________________________
348 1 Router-LSAs
349 2 Network-LSAs
350 3 Summary-LSAs (IP network)
351 4 Summary-LSAs (ASBR)
352 5 AS-external-LSAs
353 */
354 enum enum_ls_type
355 {
356 LSTYPE_ROUTERLSA = 1,
357 LSTYPE_NETWORKLSA,
358 LSTYPE_SUMMARYLSA_ROUTER,
359 LSTYPE_SUMMARYLSA_NETWORK,
360 LSTYPE_ASEXTERNALLSA,
361 LSTYPE_UNDEFINED,
362 };
363 static char strLSTYPE[][50] = { "UNKNOWN",
364 "ROUTER_LSA",
365 "NETWORK_LSA",
366 "SUMMARY_LSA_ROUTER",
367 "SUMMARY_LSA_NETWORK",
368 "AS_EXTERNAL_LSA"
369 "UNDEFINED"};
370
371 /*
372 A.4.1 The LSA header
373 0 1 2 3
374 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
375 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
376 | LS age | Options | LS type |
377 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
378 | Link State ID |
379 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
380 | Advertising Router |
381 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
382 | LS sequence number |
383 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
384 | LS checksum | length |
385 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
386 */
388 {
389 UINT16 LSAge;
390 UINT8 Options;
391 LSTYPE LSType;
392 OSPFID LinkStateID;
393 OSPFID AdvertisingRouter;
394 UINT LSSequenceNumber;
395 UINT16 LSChecksum;
396 UINT16 length;
397 void* lsaInfo;
398
399 //Simulation specific.
400 double time;
401 };
402#define OSPFLSAHDR_LEN 20 //Bytes
403 void OSPF_LSA_MSG_FREE(ptrOSPFLSAHDR hdr);
404 ptrOSPFLSAHDR OSPF_LSA_MSG_COPY(ptrOSPFLSAHDR hdr);
405 ptrOSPFLSAHDR OSPF_LSA_HDR_COPY(ptrOSPFLSAHDR lsa);
406 void OSPF_LSA_HDR_FREE(ptrOSPFLSAHDR lsa);
407
408 /*
409 A.4.2 Router-LSAs
410 0 1 2 3
411 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
412 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
413 | LS age | Options | 1 |
414 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
415 | Link State ID |
416 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
417 | Advertising Router |
418 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
419 | LS sequence number |
420 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
421 | LS checksum | length |
422 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
423 | 0 |V|E|B| 0 | # links |
424 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
425 | Link ID |
426 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
427 | Link Data |
428 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
429 | Type | # TOS | metric |
430 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
431 | ... |
432 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
433 | TOS | 0 | TOS metric |
434 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
435 | Link ID |
436 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
437 | Link Data |
438 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
439 | ... |
440 */
441 typedef struct stru_ospf_rlsa_link
442 {
443 OSPFID linkId;
444 OSPFID linkData;
445 OSPFLINKTYPE type;
446 UINT8 tosCount;
447 UINT16 metric;
448 UINT8* TOS;
449 UINT8* TOSMetric;
450 }OSPFRLSALINK,*ptrOSPFRLSALINK;
451 #define OSPFRLSALINK_LEN_FIXED 12 //Bytes
452
454 {
455 UINT8 VEB;
456 UINT8 reserved;
457 UINT16 linksCount;
458 ptrOSPFRLSALINK* rlsaLink;
459 };
460#define OSPFRLSA_LEN_FIXED 4 //Bytes
461 void OSPFLSAINFO_FREE_RLSA(ptrOSPFRLSA rlsa);
462 ptrOSPFRLSA OSPFLSAINFO_COPY_RLSA(ptrOSPFRLSA rlsa);
463
464 //Function prototype
465 NetSim_PACKET* OSPF_PACKET_NEW(double time,
466 OSPFMSG type,
467 NETSIM_ID d,
468 NETSIM_ID in);
469 void OSPF_SEND_PACKET(NetSim_PACKET* packet);
470 bool validate_ospf_packet(NetSim_PACKET* packet,
471 NETSIM_ID d,
472 NETSIM_ID in);
473
474#ifdef __cplusplus
475}
476#endif
477#endif //_NETSIM_OSPF_MSG_H_