17#include "IP_Addressing.h"
19int fn_NetSim_DSR_ForwardRERR(NetSim_EVENTDETAILS* pstruEventDetails);
23NETSIM_IPAddress fnGetPrevHop(NetSim_PACKET* packet)
25 DSR_OPTION_HEADER* option = (DSR_OPTION_HEADER*)packet->pstruNetworkData->Packet_RoutingProtocol;
26 DSR_SOURCE_ROUTE_OPTION* srcRouteOption = (DSR_SOURCE_ROUTE_OPTION*)option->options;
30 if (!srcRouteOption->
Address || nlength == 0)
31 return packet->pstruNetworkData->szSourceIP;
33 NETSIM_IPAddress currIP = dsr_get_curr_ip();
35 for (
unsigned int i = 0; i < nlength; ++i)
37 if (!IP_COMPARE(srcRouteOption->
Address[i], currIP))
39 return srcRouteOption->
Address[i - 1];
42 return packet->pstruNetworkData->szSourceIP;
47int fn_NetSim_DSR_GenerateRERR(DSR_MAINT_BUFFER* maintBuffer,NetSim_EVENTDETAILS* pstruEventDetails)
52 NetSim_EVENTDETAILS pevent;
53 NetSim_PACKET* packet = maintBuffer->
packetList;
54 DSR_OPTION_HEADER* option = (DSR_OPTION_HEADER*)packet->pstruNetworkData->Packet_RoutingProtocol;
55 DSR_SOURCE_ROUTE_OPTION* srcRouteOption = (DSR_SOURCE_ROUTE_OPTION*)option->options;
56 NETSIM_IPAddress nexthop = fnGetPrevHop(packet);
57 NetSim_PACKET* rerrPacket = fn_NetSim_DSR_GenerateCtrlPacket(pstruEventDetails->nDeviceId,
60 pstruEventDetails->dEventTime,
61 ctrlPacket_ROUTE_ERROR);
62 DSR_RERR_OPTION* rerrOption=calloc(1,
sizeof* rerrOption);
63 option = calloc(1,
sizeof* option);
64 rerrPacket->pstruNetworkData->Packet_RoutingProtocol = option;
65 option->nNextHeader = NO_NEXT_HEADER;
66 option->optType = optType_RouteError;
67 option->options = rerrOption;
75 rerrOption->length = length;
76 rerrOption->nSegsLeft = length;
79 rerrOption->Address = calloc(length,
sizeof* rerrOption->Address);
80 for (loop = 0; loop < length; loop++)
81 rerrOption->Address[loop] = IP_COPY(srcRouteOption->
Address[length - loop - 1]);
84 option->nPayloadLength = DSR_RERR_SIZE_FIXED;
85 rerrPacket->pstruNetworkData->nTTL= length +1;
86 rerrPacket->pstruNetworkData->dOverhead = DSR_RERR_SIZE_FIXED+DSR_OPTION_HEADER_SIZE;
87 rerrPacket->pstruNetworkData->dPacketSize = rerrPacket->pstruNetworkData->dOverhead;
88 rerrPacket->pstruNetworkData->szNextHopIp = IP_COPY(nexthop);
89 rerrPacket->nReceiverId = fn_NetSim_Stack_GetDeviceId_asIP(nexthop,&recv);
92 memcpy(&pevent,pstruEventDetails,
sizeof* pstruEventDetails);
93 pevent.nApplicationId = 0;
94 pevent.nEventType = NETWORK_OUT_EVENT;
96 pevent.nProtocolId = NW_PROTOCOL_DSR;
97 pevent.nSegmentId = 0;
98 pevent.nSubEventType = subevent_PROCESS_RERR;
99 pevent.pPacket = rerrPacket;
100 pevent.dPacketSize = rerrPacket->pstruNetworkData->dPacketSize;
101 pevent.szOtherDetails = NULL;
102 fnpAddEvent(&pevent);
104 DSR_DEV_VAR(pstruEventDetails->nDeviceId)->dsrMetrics.rerrSent++;
111int fn_NetSim_DSR_ProcessRerr(NetSim_EVENTDETAILS* pstruEventDetails)
113 char ip[_NETSIM_IP_LEN];
114 NetSim_PACKET* packet = pstruEventDetails->pPacket;
115 DSR_OPTION_HEADER* option = (DSR_OPTION_HEADER*)packet->pstruNetworkData->Packet_RoutingProtocol;
116 DSR_RERR_OPTION* rerr = (DSR_RERR_OPTION*)option->options;
119 DSR_DELETE_ENTRY_CACHE(&(DSR_DEV_VAR(pstruEventDetails->nDeviceId)->pstruRouteCache),
120 rerr->errorSourceAddress,
121 (NETSIM_IPAddress)rerr->TypeSpecificInformation);
123 if(rerr->errorDestinationAddress!= fn_NetSim_Stack_GetIPAddressAsId(pstruEventDetails->pPacket->nReceiverId,1))
124 fn_NetSim_DSR_ForwardRERR(pstruEventDetails);
131int fn_NetSim_DSR_ForwardRERR(NetSim_EVENTDETAILS* pstruEventDetails)
133 NETSIM_ID interfaceId;
134 NetSim_PACKET* packet = pstruEventDetails->pPacket;
135 DSR_OPTION_HEADER* option = packet->pstruNetworkData->Packet_RoutingProtocol;
136 DSR_RERR_OPTION* rerr = option->options;
137 packet->pstruNetworkData->szSourceIP = dsr_get_curr_ip();
138 if(rerr->nSegsLeft == 0)
140 fn_NetSim_Packet_FreePacket(pstruEventDetails->pPacket);
141 pstruEventDetails->pPacket = NULL;
146 if(rerr->nSegsLeft!=2)
147 if(fn_NetSim_Stack_GetDeviceId_asIP(rerr->Address[rerr->nSegsLeft], &interfaceId)!=pstruEventDetails->nDeviceId)
148 packet->pstruNetworkData->szNextHopIp = IP_COPY(rerr->Address[rerr->nSegsLeft]);
150 packet->pstruNetworkData->szNextHopIp = IP_COPY(packet->pstruNetworkData->szDestIP);
152 packet->pstruNetworkData->szNextHopIp = IP_COPY(packet->pstruNetworkData->szDestIP);
154 packet->nTransmitterId = pstruEventDetails->nDeviceId;
155 packet->nReceiverId = fn_NetSim_Stack_GetDeviceId_asIP(packet->pstruNetworkData->szNextHopIp,&interfaceId);
157 pstruEventDetails->nEventType = NETWORK_OUT_EVENT;
158 pstruEventDetails->nSubEventType = 0;
159 fnpAddEvent(pstruEventDetails);
161 DSR_DEV_VAR(pstruEventDetails->nDeviceId)->dsrMetrics.rerrForwarded++;
NetSim_PACKET * packetList
packetList - list of packets sent to the destination
DSR_OPTION_TYPE nOptionType
void * TypeSpecificInformation
enum stru_NetSim_DSR_RERR_Option::@234164063043207073373340307253340021156076321263 nErrorType
NETSIM_IPAddress errorSourceAddress
NETSIM_IPAddress errorDestinationAddress
NETSIM_IPAddress * Address