ReactOS  0.4.14-dev-614-gbfd8a84
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 TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
IPv4_RAW_ADDRESS IPv4Address
Definition: ip.h:26
ULONG IPv4_RAW_ADDRESS
Definition: ip.h:15
unsigned char * PUCHAR
Definition: retypes.h:3
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
#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 GLint GLint j
Definition: glfuncs.h:250
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:359
UCHAR Type
Definition: ip.h:24
unsigned int UINT
Definition: ndis.h:50
USHORT IPv6_RAW_ADDRESS[8]
Definition: ip.h:19
#define DEBUG_ROUTER
Definition: debug.h:30
union IP_ADDRESS::@990 Address

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 }
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
_Must_inspect_result_ typedef _In_ ULONG _In_ BOOLEAN Target
Definition: iotypes.h:1068
PNEIGHBOR_CACHE_ENTRY Router
Definition: router.h:19
Definition: typedefs.h:117
PIP_INTERFACE Interface
Definition: neighbor.h:33
LIST_ENTRY FIBListHead
Definition: router.c:17
unsigned int UINT
Definition: ndis.h:50
Definition: router.h:14

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 }
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
PNEIGHBOR_CACHE_ENTRY Router
Definition: router.h:19
Definition: typedefs.h:117
PIP_INTERFACE Interface
Definition: neighbor.h:33
LIST_ENTRY FIBListHead
Definition: router.c:17
unsigned int UINT
Definition: ndis.h:50
Definition: router.h:14

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 */
70  RemoveEntryList(&FIBE->ListEntry);
71 
72  /* And free the FIB entry */
73  FreeFIB(FIBE);
74 }
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
LIST_ENTRY ListEntry
Definition: router.h:15
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
Definition: rtlfuncs.h:105
VOID FreeFIB(PVOID Object)
Definition: router.c:45
#define DEBUG_ROUTER
Definition: debug.h:30

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
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
Definition: typedefs.h:117
LIST_ENTRY FIBListHead
Definition: router.c:17
Definition: router.h:14

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
static IUnknown Object
Definition: main.c:512
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099

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 TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
Definition: neighbor.h:28
PIP_INTERFACE FindOnLinkInterface(PIP_ADDRESS Address)
Definition: interface.c:221
PNEIGHBOR_CACHE_ENTRY RouterGetRoute(PIP_ADDRESS Destination)
Definition: router.c:239
PNEIGHBOR_CACHE_ENTRY NBFindOrCreateNeighbor(PIP_INTERFACE Interface, PIP_ADDRESS Address, BOOLEAN NoTimeout)
Definition: neighbor.c:501
smooth NULL
Definition: ftsmooth.c:416
UINT MTU
Definition: ip.h:157
IN PVOID IN PVOID IN USHORT IN USHORT IN PINTERFACE Interface
Definition: pci.h:359
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
Definition: rtlfuncs.h:2891
#define DEBUG_RCACHE
Definition: debug.h:31
PIP_INTERFACE Interface
Definition: neighbor.h:33
#define MIN_TRACE
Definition: debug.h:14
#define DEBUG_ROUTER
Definition: debug.h:30
PCHAR A2S(PIP_ADDRESS Address)
Definition: address.c:17

Referenced by DispTdiQueryIpHwAddress(), ICMPSendDatagram(), ICMPTransmit(), 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 }
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
LIST_ENTRY ListEntry
Definition: router.h:15
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
#define FIB_TAG
Definition: tags.h:29
IP_ADDRESS NetworkAddress
Definition: router.h:17
IP_ADDRESS Netmask
Definition: router.h:18
smooth NULL
Definition: ftsmooth.c:416
KSPIN_LOCK FIBLock
Definition: router.c:18
UINT Metric
Definition: router.h:20
_Must_inspect_result_ _Out_ PNDIS_STATUS _Outptr_result_bytebuffer_to_ NetworkAddressLength PVOID * NetworkAddress
Definition: ndis.h:3956
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
PNEIGHBOR_CACHE_ENTRY Router
Definition: router.h:19
VOID TcpipInterlockedInsertTailList(PLIST_ENTRY ListHead, PLIST_ENTRY Item, PKSPIN_LOCK Lock)
Definition: lock.c:34
LIST_ENTRY FIBListHead
Definition: router.c:17
IP_ADDRESS Address
Definition: neighbor.h:36
Definition: router.h:14
#define MIN_TRACE
Definition: debug.h:14
#define DEBUG_ROUTER
Definition: debug.h:30
PCHAR A2S(PIP_ADDRESS Address)
Definition: address.c:17

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 {
441  KIRQL OldIrql;
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 
456  if(AddrIsEqual(NetworkAddress, &Current->NetworkAddress) &&
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 }
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
#define TRUE
Definition: types.h:120
Definition: neighbor.h:28
IP_ADDRESS NetworkAddress
Definition: router.h:17
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
IP_ADDRESS Netmask
Definition: router.h:18
smooth NULL
Definition: ftsmooth.c:416
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
KSPIN_LOCK FIBLock
Definition: router.c:18
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
IN PVOID IN PVOID IN USHORT IN USHORT IN PINTERFACE Interface
Definition: pci.h:359
_Must_inspect_result_ _Out_ PNDIS_STATUS _Outptr_result_bytebuffer_to_ NetworkAddressLength PVOID * NetworkAddress
Definition: ndis.h:3956
PNEIGHBOR_CACHE_ENTRY Router
Definition: router.h:19
BOOLEAN AddrIsEqual(PIP_ADDRESS Address1, PIP_ADDRESS Address2)
Definition: address.c:221
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:803
Definition: typedefs.h:117
PIP_INTERFACE Interface
Definition: neighbor.h:33
LIST_ENTRY FIBListHead
Definition: router.c:17
Definition: router.h:14
#define DEBUG_ROUTER
Definition: debug.h:30
PFIB_ENTRY RouterAddRoute(PIP_ADDRESS NetworkAddress, PIP_ADDRESS Netmask, PNEIGHBOR_CACHE_ENTRY Router, UINT Metric)
Definition: router.c:189
PCHAR A2S(PIP_ADDRESS Address)
Definition: address.c:17

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 }
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
Definition: neighbor.h:28
IP_ADDRESS NetworkAddress
Definition: router.h:17
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
PNEIGHBOR_CACHE_ENTRY Router
Definition: router.h:19
Definition: typedefs.h:117
LIST_ENTRY FIBListHead
Definition: router.c:17
IP_ADDRESS Address
Definition: neighbor.h:36
Definition: router.h:14
#define DEBUG_ROUTER
Definition: debug.h:30
PCHAR A2S(PIP_ADDRESS Address)
Definition: address.c:17

Referenced by RouterRemoveRoute().

◆ RouterGetRoute()

PNEIGHBOR_CACHE_ENTRY RouterGetRoute ( PIP_ADDRESS  Destination)

Definition at line 239 of file router.c.

249 {
250  KIRQL OldIrql;
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 }
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
Definition: neighbor.h:28
#define NUD_STALE
Definition: neighbor.h:43
IP_ADDRESS NetworkAddress
Definition: router.h:17
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
IP_ADDRESS Netmask
Definition: router.h:18
smooth NULL
Definition: ftsmooth.c:416
UCHAR State
Definition: neighbor.h:30
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
KSPIN_LOCK FIBLock
Definition: router.c:18
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
UINT CommonPrefixLength(PIP_ADDRESS Address1, PIP_ADDRESS Address2)
Definition: router.c:142
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
Definition: rtlfuncs.h:2891
#define NUD_INCOMPLETE
Definition: neighbor.h:41
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
PNEIGHBOR_CACHE_ENTRY Router
Definition: router.h:19
unsigned char UCHAR
Definition: xmlstorage.h:181
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:803
UINT AddrCountPrefixBits(PIP_ADDRESS Netmask)
Definition: address.c:64
Definition: typedefs.h:117
LIST_ENTRY FIBListHead
Definition: router.c:17
enum State_ State
Definition: pofuncs.h:54
unsigned int UINT
Definition: ndis.h:50
IP_ADDRESS Address
Definition: neighbor.h:36
Definition: router.h:14
#define DEBUG_ROUTER
Definition: debug.h:30
PCHAR A2S(PIP_ADDRESS Address)
Definition: address.c:17

Referenced by RouteGetRouteToDestination().

◆ RouterRemoveRoute()

NTSTATUS RouterRemoveRoute ( PIP_ADDRESS  Target,
PIP_ADDRESS  Router 
)

Definition at line 364 of file router.c.

373 {
374  KIRQL OldIrql;
375  PLIST_ENTRY CurrentEntry;
376  PLIST_ENTRY NextEntry;
377  PFIB_ENTRY Current;
378  BOOLEAN Found = FALSE;
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 }
VOID DestroyFIBE(PFIB_ENTRY FIBE)
Definition: router.c:57
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
#define TRUE
Definition: types.h:120
Definition: neighbor.h:28
IP_ADDRESS NetworkAddress
Definition: router.h:17
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
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
return Found
Definition: dirsup.c:1270
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
KSPIN_LOCK FIBLock
Definition: router.c:18
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
void RouterDumpRoutes()
Definition: router.c:20
_Must_inspect_result_ typedef _In_ ULONG _In_ BOOLEAN Target
Definition: iotypes.h:1068
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
PNEIGHBOR_CACHE_ENTRY Router
Definition: router.h:19
BOOLEAN AddrIsEqual(PIP_ADDRESS Address1, PIP_ADDRESS Address2)
Definition: address.c:221
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:803
Definition: typedefs.h:117
LIST_ENTRY FIBListHead
Definition: router.c:17
IP_ADDRESS Address
Definition: neighbor.h:36
Definition: router.h:14
return STATUS_SUCCESS
Definition: btrfs.c:2938
#define DEBUG_ROUTER
Definition: debug.h:30
PCHAR A2S(PIP_ADDRESS Address)
Definition: address.c:17

Referenced by InfoTdiSetRoute(), and IPRemoveInterfaceRoute().

◆ RouterRemoveRoutesForInterface()

VOID RouterRemoveRoutesForInterface ( PIP_INTERFACE  Interface)

Definition at line 341 of file router.c.

342 {
343  KIRQL OldIrql;
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 }
VOID DestroyFIBE(PFIB_ENTRY FIBE)
Definition: router.c:57
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
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
KSPIN_LOCK FIBLock
Definition: router.c:18
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
IN PVOID IN PVOID IN USHORT IN USHORT IN PINTERFACE Interface
Definition: pci.h:359
PNEIGHBOR_CACHE_ENTRY Router
Definition: router.h:19
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:803
Definition: typedefs.h:117
PIP_INTERFACE Interface
Definition: neighbor.h:33
LIST_ENTRY FIBListHead
Definition: router.c:17
Definition: router.h:14

Referenced by ReconfigureAdapter().

◆ RouterShutdown()

NTSTATUS RouterShutdown ( VOID  )

Definition at line 500 of file router.c.

507 {
508  KIRQL OldIrql;
509 
510  TI_DbgPrint(DEBUG_ROUTER, ("Called.\n"));
511 
512  /* Clear Forward Information Base */
514  DestroyFIBEs();
516 
517  return STATUS_SUCCESS;
518 }
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
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
VOID DestroyFIBEs(VOID)
Definition: router.c:77
KSPIN_LOCK FIBLock
Definition: router.c:18
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:803
return STATUS_SUCCESS
Definition: btrfs.c:2938
#define DEBUG_ROUTER
Definition: debug.h:30

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 }
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
KSPIN_LOCK FIBLock
Definition: router.c:18
LIST_ENTRY FIBListHead
Definition: router.c:17
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
VOID TcpipInitializeSpinLock(PKSPIN_LOCK SpinLock)
Definition: lock.c:14
return STATUS_SUCCESS
Definition: btrfs.c:2938
#define DEBUG_ROUTER
Definition: debug.h:30

Referenced by IPStartup().

Variable Documentation

◆ FIBListHead

◆ FIBLock