ReactOS 0.4.15-dev-8138-g1e75ea8
router.h File Reference
#include <neighbor.h>
Include dependency graph for router.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  _FIB_ENTRY
 

Typedefs

typedef struct _FIB_ENTRY FIB_ENTRY
 
typedef struct _FIB_ENTRYPFIB_ENTRY
 

Functions

PFIB_ENTRY RouterAddRoute (PIP_ADDRESS NetworkAddress, PIP_ADDRESS Netmask, PNEIGHBOR_CACHE_ENTRY Router, UINT Metric)
 
PNEIGHBOR_CACHE_ENTRY RouterGetRoute (PIP_ADDRESS Destination)
 
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)
 
VOID RouterRemoveRoutesForInterface (PIP_INTERFACE Interface)
 
UINT CountFIBs (PIP_INTERFACE IF)
 
UINT CopyFIBs (PIP_INTERFACE IF, PFIB_ENTRY Target)
 

Typedef Documentation

◆ FIB_ENTRY

◆ PFIB_ENTRY

Function Documentation

◆ 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}
unsigned int UINT
Definition: ndis.h:50
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().

◆ 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}
#define MIN_TRACE
Definition: debug.h:14
#define NULL
Definition: types.h:112
#define DEBUG_ROUTER
Definition: debug.h:30
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
VOID TcpipInterlockedInsertTailList(PLIST_ENTRY ListHead, PLIST_ENTRY Item, PKSPIN_LOCK Lock)
Definition: lock.c:34
#define FIB_TAG
Definition: tags.h:29
PCHAR A2S(PIP_ADDRESS Address)
Definition: address.c:17
#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
LIST_ENTRY ListEntry
Definition: router.h:15
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
PNEIGHBOR_CACHE_ENTRY NBFindOrCreateNeighbor(PIP_INTERFACE Interface, PIP_ADDRESS Address, BOOLEAN NoTimeout)
Definition: neighbor.c:501
PFIB_ENTRY RouterAddRoute(PIP_ADDRESS NetworkAddress, PIP_ADDRESS Netmask, PNEIGHBOR_CACHE_ENTRY Router, UINT Metric)
Definition: router.c:189
Definition: neighbor.h:28
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE Interface
Definition: wdffdo.h:465
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778

Referenced by InfoTdiSetRoute(), and ReadIpConfiguration().

◆ 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
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
Definition: rtlfuncs.h:3004
#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
#define FALSE
Definition: types.h:117
VOID DestroyFIBE(PFIB_ENTRY FIBE)
Definition: router.c:57
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().