17#include "OSPF_Interface.h"
22 void (*fnNew)(ptrOSPFPACKETHDR hdr);
24 void*(*fnCopy)(
void*);
26static OSPFMSG_DATABASE pstruOSPFMsgCallback[] = {
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}
35static char* OSPFMSG_TO_STR(OSPFMSG type)
37 return pstruOSPFMsgCallback[type].name;
40ptrOSPFPACKETHDR OSPF_HDR_NEW()
42 ptrOSPFPACKETHDR hdr = calloc(1,
sizeof* hdr);
43 hdr->Version = OSPF_VERSION;
44 hdr->Packet_length = OSPFPACKETHDR_LEN;
48ptrOSPFPACKETHDR OSPF_HDR_COPY(ptrOSPFPACKETHDR hdr)
53 ptrOSPFPACKETHDR newHdr = calloc(1,
sizeof* newHdr);
54 memcpy(newHdr, hdr,
sizeof* hdr);
55 newHdr->ospfMSG = pstruOSPFMsgCallback[hdr->Type].fnCopy(hdr->ospfMSG);
59void OSPF_HDR_FREE(ptrOSPFPACKETHDR hdr)
64 pstruOSPFMsgCallback[hdr->Type].fnFree)
65 pstruOSPFMsgCallback[hdr->Type].fnFree(hdr->ospfMSG);
70void OSPF_HDR_SET_MSG(ptrOSPFPACKETHDR hdr,
77 hdr->Packet_length += len;
80void OSPF_HDR_INCREASE_LEN(NetSim_PACKET* packet,
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;
90static void ospf_packet_update_src(NetSim_PACKET* packet,
94 packet->nSourceId = d;
95 packet->pstruNetworkData->szSourceIP = DEVICE_NWADDRESS(d, in);
98static ptrOSPFPACKETHDR ospf_get_new_hdr(OSPFMSG type)
100 ptrOSPFPACKETHDR hdr = OSPF_HDR_NEW();
101 if(pstruOSPFMsgCallback[type].fnNew)
102 pstruOSPFMsgCallback[type].fnNew(hdr);
106NetSim_PACKET* OSPF_PACKET_NEW(
double time,
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;
127 ospf_packet_update_src(packet, d, in);
128 ptrOSPF_PDS ospf = OSPF_PDS_GET(d);
129 OSPF_HDR_SET_ROUTERID(hdr, ospf->routerId);
131 ptrOSPF_IF ospfif = OSPF_IF_GET(ospf, in);
132 OSPF_HDR_SET_AREAID(hdr, ospfif->areaId);
136void OSPF_SEND_PACKET(NetSim_PACKET* packet)
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;
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);
160static bool validate_areaid(NetSim_PACKET* packet)
162 ptrOSPF_IF ospf = OSPF_IF_CURRENT();
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));
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))
174 if (ospf->Type != OSPFIFTYPE_P2P)
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))
189 else if (!IP_COMPARE(hdr->AreaId, NullID))
191 if (pds->routerType != OSPFRTYPE_ABR)
193#pragma message(__LOC__"Change after virtual link implementation")
202bool validate_ospf_packet(NetSim_PACKET* packet,
207 NETSIM_IPAddress dest = packet->pstruNetworkData->szDestIP;
208 NETSIM_IPAddress src = packet->pstruNetworkData->szSourceIP;
209 NETSIM_IPAddress myip = DEVICE_NWADDRESS(d, in);
211 if (packet->pstruNetworkData->IPProtocol != IPPROTOCOL_OSPF)
214 if (!(!IP_COMPARE(dest, myip) ||
215 !IP_COMPARE(dest, AllSPFRouters) ||
216 !IP_COMPARE(dest, AllDRouters)))
219 if (!IP_COMPARE(src, myip))
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);
226 if (hdr->Version != OSPF_VERSION)
229 if (!validate_areaid(packet))
232 if (!IP_COMPARE(dest, AllDRouters))
234 if (!(ospf->State == OSPFIFSTATE_BACKUP ||
235 ospf->State == OSPFIFSTATE_DR))