ReactOS 0.4.16-dev-297-gc569aee
router.c File Reference
#include "precomp.h"
Include dependency graph for router.c:

Go to the source code of this file.

Functions

void RouterDumpRoutes ()
 
VOID FreeFIB (PVOID Object)
 
VOID DestroyFIBE (PFIB_ENTRY FIBE)
 
VOID DestroyFIBEs (VOID)
 
UINT CountFIBs (PIP_INTERFACE IF)
 
UINT CopyFIBs (PIP_INTERFACE IF, PFIB_ENTRY Target)
 
UINT CommonPrefixLength (PIP_ADDRESS Address1, PIP_ADDRESS Address2)
 
PFIB_ENTRY RouterAddRoute (PIP_ADDRESS NetworkAddress, PIP_ADDRESS Netmask, PNEIGHBOR_CACHE_ENTRY Router, UINT Metric)
 
PNEIGHBOR_CACHE_ENTRY RouterGetRoute (PIP_ADDRESS Destination)
 
PNEIGHBOR_CACHE_ENTRY RouteGetRouteToDestination (PIP_ADDRESS Destination)
 
VOID RouterRemoveRoutesForInterface (PIP_INTERFACE Interface)
 
NTSTATUS RouterRemoveRoute (PIP_ADDRESS Target, PIP_ADDRESS Router)
 
PFIB_ENTRY RouterCreateRoute (PIP_ADDRESS NetworkAddress, PIP_ADDRESS Netmask, PIP_ADDRESS RouterAddress, PIP_INTERFACE Interface, UINT Metric)
 
NTSTATUS RouterStartup (VOID)
 
NTSTATUS RouterShutdown (VOID)
 

Variables

LIST_ENTRY FIBListHead
 
KSPIN_LOCK FIBLock
 

Function Documentation

◆ CommonPrefixLength()

UINT CommonPrefixLength ( PIP_ADDRESS  Address1,
PIP_ADDRESS  Address2 
)

Definition at line 142 of file router.c.

155{
156 PUCHAR Addr1, Addr2;
157 UINT Size;
158 UINT i, j;
159 UINT Bitmask;
160
161 TI_DbgPrint(DEBUG_ROUTER, ("Called. Address1 (0x%X) Address2 (0x%X).\n", Address1, Address2));
162
163 /*TI_DbgPrint(DEBUG_ROUTER, ("Target (%s) \n", A2S(Address1)));*/
164 /*TI_DbgPrint(DEBUG_ROUTER, ("Adapter (%s).\n", A2S(Address2)));*/
165
166 if (Address1->Type == IP_ADDRESS_V4)
167 Size = sizeof(IPv4_RAW_ADDRESS);
168 else
169 Size = sizeof(IPv6_RAW_ADDRESS);
170
171 Addr1 = (PUCHAR)&Address1->Address.IPv4Address;
172 Addr2 = (PUCHAR)&Address2->Address.IPv4Address;
173
174 /* Find first non-matching byte */
175 for (i = 0; i < Size && Addr1[i] == Addr2[i]; i++);
176 if( i == Size ) return 8 * i;
177
178 /* Find first non-matching bit */
179 Bitmask = 0x80;
180 for (j = 0; (Addr1[i] & Bitmask) == (Addr2[i] & Bitmask); j++)
181 Bitmask >>= 1;
182
183 TI_DbgPrint(DEBUG_ROUTER, ("Returning %d\n", 8 * i + j));
184
185 return 8 * i + j;
186}
#define DEBUG_ROUTER
Definition: debug.h:30
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
USHORT IPv6_RAW_ADDRESS[8]
Definition: ip.h:19
ULONG IPv4_RAW_ADDRESS
Definition: ip.h:15
#define IP_ADDRESS_V4
Definition: ip.h:32
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
unsigned int UINT
Definition: ndis.h:50
UCHAR Type
Definition: ip.h:24
union IP_ADDRESS::@1014 Address
IPv4_RAW_ADDRESS IPv4Address
Definition: ip.h:26
unsigned char * PUCHAR
Definition: typedefs.h:53
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533

Referenced by RouterGetRoute().

◆ CopyFIBs()

UINT CopyFIBs ( PIP_INTERFACE  IF,
PFIB_ENTRY  Target 
)

Definition at line 120 of file router.c.

120 {
121 UINT FibCount = 0;
122 PLIST_ENTRY CurrentEntry;
123 PLIST_ENTRY NextEntry;
124 PFIB_ENTRY Current;
125
126 CurrentEntry = FIBListHead.Flink;
127 while (CurrentEntry != &FIBListHead) {
128 NextEntry = CurrentEntry->Flink;
129 Current = CONTAINING_RECORD(CurrentEntry, FIB_ENTRY, ListEntry);
130 if (Current->Router->Interface == IF)
131 {
132 Target[FibCount] = *Current;
133 FibCount++;
134 }
135 CurrentEntry = NextEntry;
136 }
137
138 return FibCount;
139}
LIST_ENTRY FIBListHead
Definition: router.c:17
PIP_INTERFACE Interface
Definition: neighbor.h:33
Definition: router.h:14
PNEIGHBOR_CACHE_ENTRY Router
Definition: router.h:19
Definition: typedefs.h:120
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
_In_ WDFIOTARGET Target
Definition: wdfrequest.h:306

Referenced by InfoTdiQueryGetRouteTable().

◆ CountFIBs()

UINT CountFIBs ( PIP_INTERFACE  IF)

Definition at line 101 of file router.c.

101 {
102 UINT FibCount = 0;
103 PLIST_ENTRY CurrentEntry;
104 PLIST_ENTRY NextEntry;
105 PFIB_ENTRY Current;
106
107 CurrentEntry = FIBListHead.Flink;
108 while (CurrentEntry != &FIBListHead) {
109 NextEntry = CurrentEntry->Flink;
110 Current = CONTAINING_RECORD(CurrentEntry, FIB_ENTRY, ListEntry);
111 if (Current->Router->Interface == IF)
112 FibCount++;
113 CurrentEntry = NextEntry;
114 }
115
116 return FibCount;
117}

Referenced by InfoTdiQueryGetIPSnmpInfo(), and InfoTdiQueryGetRouteTable().

◆ DestroyFIBE()

VOID DestroyFIBE ( PFIB_ENTRY  FIBE)

Definition at line 57 of file router.c.

66{
67 TI_DbgPrint(DEBUG_ROUTER, ("Called. FIBE (0x%X).\n", FIBE));
68
69 /* Unlink the FIB entry from the list */
71
72 /* And free the FIB entry */
73 FreeFIB(FIBE);
74}
#define RemoveEntryList(Entry)
Definition: env_spec_w32.h:986
VOID FreeFIB(PVOID Object)
Definition: router.c:45
LIST_ENTRY ListEntry
Definition: router.h:15

Referenced by DestroyFIBEs(), RouterRemoveRoute(), and RouterRemoveRoutesForInterface().

◆ DestroyFIBEs()

VOID DestroyFIBEs ( VOID  )

Definition at line 77 of file router.c.

84{
85 PLIST_ENTRY CurrentEntry;
86 PLIST_ENTRY NextEntry;
87 PFIB_ENTRY Current;
88
89 /* Search the list and remove every FIB entry we find */
90 CurrentEntry = FIBListHead.Flink;
91 while (CurrentEntry != &FIBListHead) {
92 NextEntry = CurrentEntry->Flink;
93 Current = CONTAINING_RECORD(CurrentEntry, FIB_ENTRY, ListEntry);
94 /* Destroy the FIB entry */
95 DestroyFIBE(Current);
96 CurrentEntry = NextEntry;
97 }
98}
VOID DestroyFIBE(PFIB_ENTRY FIBE)
Definition: router.c:57

Referenced by RouterShutdown().

◆ FreeFIB()

VOID FreeFIB ( PVOID  Object)

Definition at line 45 of file router.c.

52{
54}
#define FIB_TAG
Definition: tags.h:29
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object

Referenced by DestroyFIBE().

◆ RouteGetRouteToDestination()

PNEIGHBOR_CACHE_ENTRY RouteGetRouteToDestination ( PIP_ADDRESS  Destination)

Definition at line 300 of file router.c.

312{
315
316 TI_DbgPrint(DEBUG_RCACHE, ("Called. Destination (0x%X)\n", Destination));
317
318 TI_DbgPrint(DEBUG_RCACHE, ("Destination (%s)\n", A2S(Destination)));
319
320#if 0
321 TI_DbgPrint(MIN_TRACE, ("Displaying tree (before).\n"));
322 PrintTree(RouteCache);
323#endif
324
325 /* Check if the destination is on-link */
327 if (Interface) {
328 /* The destination address is on-link. Check our neighbor cache */
330 } else {
331 /* Destination is not on any subnets we're on. Find a router to use */
333 }
334
335 if( NCE )
336 TI_DbgPrint(DEBUG_ROUTER,("Interface->MTU: %d\n", NCE->Interface->MTU));
337
338 return NCE;
339}
#define MIN_TRACE
Definition: debug.h:14
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
#define DEBUG_RCACHE
Definition: debug.h:31
PCHAR A2S(PIP_ADDRESS Address)
Definition: address.c:17
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
Definition: rtlfuncs.h:3016
PNEIGHBOR_CACHE_ENTRY NBFindOrCreateNeighbor(PIP_INTERFACE Interface, PIP_ADDRESS Address, BOOLEAN NoTimeout)
Definition: neighbor.c:501
PIP_INTERFACE FindOnLinkInterface(PIP_ADDRESS Address)
Definition: interface.c:221
PNEIGHBOR_CACHE_ENTRY RouterGetRoute(PIP_ADDRESS Destination)
Definition: router.c:239
Definition: neighbor.h:28
UINT MTU
Definition: ip.h:157
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE Interface
Definition: wdffdo.h:465

Referenced by DispTdiQueryIpHwAddress(), ICMPReply(), RawIPSendDatagram(), TCPConnect(), TCPSendDataCallback(), and UDPSendDatagram().

◆ RouterAddRoute()

PFIB_ENTRY RouterAddRoute ( PIP_ADDRESS  NetworkAddress,
PIP_ADDRESS  Netmask,
PNEIGHBOR_CACHE_ENTRY  Router,
UINT  Metric 
)

Definition at line 189 of file router.c.

208{
209 PFIB_ENTRY FIBE;
210
211 TI_DbgPrint(DEBUG_ROUTER, ("Called. NetworkAddress (0x%X) Netmask (0x%X) "
212 "Router (0x%X) Metric (%d).\n", NetworkAddress, Netmask, Router, Metric));
213
214 TI_DbgPrint(DEBUG_ROUTER, ("NetworkAddress (%s) Netmask (%s) Router (%s).\n",
216 A2S(Netmask),
217 A2S(&Router->Address)));
218
220 if (!FIBE) {
221 TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
222 return NULL;
223 }
224
226 sizeof(FIBE->NetworkAddress) );
227 RtlCopyMemory( &FIBE->Netmask, Netmask,
228 sizeof(FIBE->Netmask) );
229 FIBE->Router = Router;
230 FIBE->Metric = Metric;
231
232 /* Add FIB to the forward information base */
234
235 return FIBE;
236}
VOID TcpipInterlockedInsertTailList(PLIST_ENTRY ListHead, PLIST_ENTRY Item, PKSPIN_LOCK Lock)
Definition: lock.c:34
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define NonPagedPool
Definition: env_spec_w32.h:307
_Must_inspect_result_ _Out_ PNDIS_STATUS _Outptr_result_bytebuffer_to_ NetworkAddressLength PVOID * NetworkAddress
Definition: ndis.h:3956
KSPIN_LOCK FIBLock
Definition: router.c:18
IP_ADDRESS Address
Definition: neighbor.h:36
UINT Metric
Definition: router.h:20
IP_ADDRESS Netmask
Definition: router.h:18
IP_ADDRESS NetworkAddress
Definition: router.h:17
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263

Referenced by IPAddInterfaceRoute(), and RouterCreateRoute().

◆ RouterCreateRoute()

PFIB_ENTRY RouterCreateRoute ( PIP_ADDRESS  NetworkAddress,
PIP_ADDRESS  Netmask,
PIP_ADDRESS  RouterAddress,
PIP_INTERFACE  Interface,
UINT  Metric 
)

Definition at line 421 of file router.c.

440{
442 PLIST_ENTRY CurrentEntry;
443 PLIST_ENTRY NextEntry;
444 PFIB_ENTRY Current;
446
448
449 CurrentEntry = FIBListHead.Flink;
450 while (CurrentEntry != &FIBListHead) {
451 NextEntry = CurrentEntry->Flink;
452 Current = CONTAINING_RECORD(CurrentEntry, FIB_ENTRY, ListEntry);
453
454 NCE = Current->Router;
455
457 AddrIsEqual(Netmask, &Current->Netmask) &&
458 NCE->Interface == Interface)
459 {
460 TI_DbgPrint(DEBUG_ROUTER,("Attempting to add duplicate route to %s\n", A2S(NetworkAddress)));
462 return NULL;
463 }
464
465 CurrentEntry = NextEntry;
466 }
467
469
470 /* The NCE references RouterAddress. The NCE is referenced for us */
471 NCE = NBFindOrCreateNeighbor(Interface, RouterAddress, TRUE);
472
473 if (!NCE) {
474 /* Not enough free resources */
475 return NULL;
476 }
477
478 return RouterAddRoute(NetworkAddress, Netmask, NCE, Metric);
479}
BOOLEAN AddrIsEqual(PIP_ADDRESS Address1, PIP_ADDRESS Address2)
Definition: address.c:221
#define TRUE
Definition: types.h:120
VOID TcpipReleaseSpinLock(PKSPIN_LOCK SpinLock, KIRQL Irql)
Definition: lock.c:26
VOID TcpipAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL Irql)
Definition: lock.c:18
UCHAR KIRQL
Definition: env_spec_w32.h:591
PFIB_ENTRY RouterAddRoute(PIP_ADDRESS NetworkAddress, PIP_ADDRESS Netmask, PNEIGHBOR_CACHE_ENTRY Router, UINT Metric)
Definition: router.c:189
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778

Referenced by InfoTdiSetRoute(), and ReadIpConfiguration().

◆ RouterDumpRoutes()

void RouterDumpRoutes ( )

Definition at line 20 of file router.c.

20 {
21 PLIST_ENTRY CurrentEntry;
22 PLIST_ENTRY NextEntry;
23 PFIB_ENTRY Current;
25
26 TI_DbgPrint(DEBUG_ROUTER,("Dumping Routes\n"));
27
28 CurrentEntry = FIBListHead.Flink;
29 while (CurrentEntry != &FIBListHead) {
30 NextEntry = CurrentEntry->Flink;
31 Current = CONTAINING_RECORD(CurrentEntry, FIB_ENTRY, ListEntry);
32
33 NCE = Current->Router;
34
35 TI_DbgPrint(DEBUG_ROUTER,("Examining FIBE %x\n", Current));
36 TI_DbgPrint(DEBUG_ROUTER,("... NetworkAddress %s\n", A2S(&Current->NetworkAddress)));
37 TI_DbgPrint(DEBUG_ROUTER,("... NCE->Address . %s\n", A2S(&NCE->Address)));
38
39 CurrentEntry = NextEntry;
40 }
41
42 TI_DbgPrint(DEBUG_ROUTER,("Dumping Routes ... Done\n"));
43}

Referenced by RouterRemoveRoute().

◆ RouterGetRoute()

PNEIGHBOR_CACHE_ENTRY RouterGetRoute ( PIP_ADDRESS  Destination)

Definition at line 239 of file router.c.

249{
251 PLIST_ENTRY CurrentEntry;
252 PLIST_ENTRY NextEntry;
253 PFIB_ENTRY Current;
254 UCHAR State;
255 UINT Length, BestLength = 0, MaskLength;
256 PNEIGHBOR_CACHE_ENTRY NCE, BestNCE = NULL;
257
258 TI_DbgPrint(DEBUG_ROUTER, ("Called. Destination (0x%X)\n", Destination));
259
260 TI_DbgPrint(DEBUG_ROUTER, ("Destination (%s)\n", A2S(Destination)));
261
263
264 CurrentEntry = FIBListHead.Flink;
265 while (CurrentEntry != &FIBListHead) {
266 NextEntry = CurrentEntry->Flink;
267 Current = CONTAINING_RECORD(CurrentEntry, FIB_ENTRY, ListEntry);
268
269 NCE = Current->Router;
270 State = NCE->State;
271
273 MaskLength = AddrCountPrefixBits(&Current->Netmask);
274
275 TI_DbgPrint(DEBUG_ROUTER,("This-Route: %s (Sharing %d bits)\n",
276 A2S(&NCE->Address), Length));
277
278 if(Length >= MaskLength && (Length > BestLength || !BestNCE) &&
279 ((!(State & NUD_STALE) && !(State & NUD_INCOMPLETE)) || !BestNCE)) {
280 /* This seems to be a better router */
281 BestNCE = NCE;
282 BestLength = Length;
283 TI_DbgPrint(DEBUG_ROUTER,("Route selected\n"));
284 }
285
286 CurrentEntry = NextEntry;
287 }
288
290
291 if( BestNCE ) {
292 TI_DbgPrint(DEBUG_ROUTER,("Routing to %s\n", A2S(&BestNCE->Address)));
293 } else {
294 TI_DbgPrint(DEBUG_ROUTER,("Packet won't be routed\n"));
295 }
296
297 return BestNCE;
298}
UINT AddrCountPrefixBits(PIP_ADDRESS Netmask)
Definition: address.c:64
#define NUD_INCOMPLETE
Definition: neighbor.h:41
#define NUD_STALE
Definition: neighbor.h:43
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
UINT CommonPrefixLength(PIP_ADDRESS Address1, PIP_ADDRESS Address2)
Definition: router.c:142
UCHAR State
Definition: neighbor.h:30
unsigned char UCHAR
Definition: xmlstorage.h:181

Referenced by RouteGetRouteToDestination().

◆ RouterRemoveRoute()

NTSTATUS RouterRemoveRoute ( PIP_ADDRESS  Target,
PIP_ADDRESS  Router 
)

Definition at line 364 of file router.c.

373{
375 PLIST_ENTRY CurrentEntry;
376 PLIST_ENTRY NextEntry;
377 PFIB_ENTRY Current;
380
381 TI_DbgPrint(DEBUG_ROUTER, ("Called\n"));
382 TI_DbgPrint(DEBUG_ROUTER, ("Deleting Route From: %s\n", A2S(Router)));
383 TI_DbgPrint(DEBUG_ROUTER, (" To: %s\n", A2S(Target)));
384
386
388
389 CurrentEntry = FIBListHead.Flink;
390 while (CurrentEntry != &FIBListHead) {
391 NextEntry = CurrentEntry->Flink;
392 Current = CONTAINING_RECORD(CurrentEntry, FIB_ENTRY, ListEntry);
393
394 NCE = Current->Router;
395
396 if( AddrIsEqual( &Current->NetworkAddress, Target ) &&
397 AddrIsEqual( &NCE->Address, Router ) ) {
398 Found = TRUE;
399 break;
400 }
401
402 Current = NULL;
403 CurrentEntry = NextEntry;
404 }
405
406 if( Found ) {
407 TI_DbgPrint(DEBUG_ROUTER, ("Deleting route\n"));
408 DestroyFIBE( Current );
409 }
410
412
414
415 TI_DbgPrint(DEBUG_ROUTER, ("Leaving\n"));
416
418}
unsigned char BOOLEAN
return Found
Definition: dirsup.c:1270
void RouterDumpRoutes()
Definition: router.c:20
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132

Referenced by InfoTdiSetRoute(), and IPRemoveInterfaceRoute().

◆ RouterRemoveRoutesForInterface()

VOID RouterRemoveRoutesForInterface ( PIP_INTERFACE  Interface)

Definition at line 341 of file router.c.

342{
344 PLIST_ENTRY CurrentEntry;
345 PLIST_ENTRY NextEntry;
346 PFIB_ENTRY Current;
347
349
350 CurrentEntry = FIBListHead.Flink;
351 while (CurrentEntry != &FIBListHead) {
352 NextEntry = CurrentEntry->Flink;
353 Current = CONTAINING_RECORD(CurrentEntry, FIB_ENTRY, ListEntry);
354
355 if (Interface == Current->Router->Interface)
356 DestroyFIBE(Current);
357
358 CurrentEntry = NextEntry;
359 }
360
362}

Referenced by ReconfigureAdapter().

◆ RouterShutdown()

NTSTATUS RouterShutdown ( VOID  )

Definition at line 500 of file router.c.

507{
509
510 TI_DbgPrint(DEBUG_ROUTER, ("Called.\n"));
511
512 /* Clear Forward Information Base */
514 DestroyFIBEs();
516
517 return STATUS_SUCCESS;
518}
VOID DestroyFIBEs(VOID)
Definition: router.c:77

Referenced by IPShutdown().

◆ RouterStartup()

NTSTATUS RouterStartup ( VOID  )

Definition at line 482 of file router.c.

489{
490 TI_DbgPrint(DEBUG_ROUTER, ("Called.\n"));
491
492 /* Initialize the Forward Information Base */
495
496 return STATUS_SUCCESS;
497}
VOID TcpipInitializeSpinLock(PKSPIN_LOCK SpinLock)
Definition: lock.c:14
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944

Referenced by IPStartup().

Variable Documentation

◆ FIBListHead

◆ FIBLock