2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS TCP/IP protocol driver
5 * PURPOSE: Network information
6 * PROGRAMMERS: Art Yerkes
8 * CSH 01/08-2000 Created
13 #define IP_ROUTE_TYPE_ADD 3
14 #define IP_ROUTE_TYPE_DEL 2
18 /* Get IPRouteEntry s for each of the routes in the system */
19 TDI_STATUS
InfoTdiQueryGetRouteTable( PNDIS_BUFFER Buffer
, PUINT BufferSize
) {
22 UINT RtCount
= CountFIBs();
23 UINT Size
= sizeof( IPROUTE_ENTRY
) * RtCount
;
25 exAllocatePool( NonPagedPool
, sizeof( FIB_ENTRY
) * RtCount
),
27 PIPROUTE_ENTRY RouteEntries
= exAllocatePool( NonPagedPool
, Size
),
28 RtCurrent
= RouteEntries
;
30 TI_DbgPrint(DEBUG_INFO
, ("Called, routes = %d, RCache = %08x\n",
33 if( !RCache
|| !RouteEntries
) {
34 if( RCache
) exFreePool( RCache
);
35 if( RouteEntries
) exFreePool( RouteEntries
);
36 return TDI_NO_RESOURCES
;
39 RtlZeroMemory( RouteEntries
, Size
);
41 RtCount
= CopyFIBs( RCache
);
43 while( RtCurrent
< RouteEntries
+ RtCount
) {
44 ASSERT(RCacheCur
->Router
);
46 RtlCopyMemory( &RtCurrent
->Dest
,
47 &RCacheCur
->NetworkAddress
.Address
,
48 sizeof(RtCurrent
->Dest
) );
49 RtlCopyMemory( &RtCurrent
->Mask
,
50 &RCacheCur
->Netmask
.Address
,
51 sizeof(RtCurrent
->Mask
) );
52 RtlCopyMemory( &RtCurrent
->Gw
,
53 &RCacheCur
->Router
->Address
.Address
,
54 sizeof(RtCurrent
->Gw
) );
56 RtCurrent
->Metric1
= RCacheCur
->Metric
;
57 RtCurrent
->Type
= TDI_ADDRESS_TYPE_IP
;
61 ("%d: NA %08x NM %08x GW %08x MT %x\n",
62 RtCurrent
- RouteEntries
,
66 RtCurrent
->Metric1
));
68 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
69 for( RtCurrent
->Index
= EntityCount
;
70 RtCurrent
->Index
> 0 &&
71 RCacheCur
->Router
->Interface
!=
72 EntityList
[RtCurrent
->Index
- 1].context
;
75 RtCurrent
->Index
= EntityList
[RtCurrent
->Index
- 1].tei_instance
;
76 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
78 RtCurrent
++; RCacheCur
++;
81 Status
= InfoCopyOut( (PCHAR
)RouteEntries
, Size
, Buffer
, BufferSize
);
83 exFreePool( RouteEntries
);
86 TI_DbgPrint(DEBUG_INFO
, ("Returning %08x\n", Status
));
91 TDI_STATUS
InfoTdiQueryGetAddrTable(TDIEntityID ID
,
96 PIPADDR_ENTRY IPEntry
;
97 PIP_INTERFACE CurrentIF
;
100 TI_DbgPrint(DEBUG_INFO
, ("Called.\n"));
103 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
105 for (i
= 0; i
< EntityCount
; i
++)
107 if (EntityList
[i
].tei_entity
== ID
.tei_entity
&&
108 EntityList
[i
].tei_instance
== ID
.tei_instance
)
112 if (i
== EntityCount
)
114 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
115 return TDI_INVALID_PARAMETER
;
118 IPEntry
= exAllocatePool(NonPagedPool
, sizeof(IPADDR_ENTRY
));
121 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
122 return TDI_NO_RESOURCES
;
125 CurrentIF
= EntityList
[i
].context
;
127 IPEntry
->Index
= CurrentIF
->Index
;
128 GetInterfaceIPv4Address(CurrentIF
,
131 GetInterfaceIPv4Address(CurrentIF
,
134 GetInterfaceIPv4Address(CurrentIF
,
136 &IPEntry
->BcastAddr
);
138 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
140 InfoCopyOut((PCHAR
)IPEntry
, sizeof(IPADDR_ENTRY
),
148 TDI_STATUS
InfoTdiQueryGetIPSnmpInfo( TDIEntityID ID
,
151 IPSNMP_INFO SnmpInfo
;
152 UINT IfCount
= CountInterfaces();
153 UINT RouteCount
= CountFIBs();
154 TDI_STATUS Status
= TDI_INVALID_REQUEST
;
156 TI_DbgPrint(DEBUG_INFO
, ("Called.\n"));
158 RtlZeroMemory(&SnmpInfo
, sizeof(IPSNMP_INFO
));
160 SnmpInfo
.NumIf
= IfCount
;
161 SnmpInfo
.NumAddr
= 1;
162 SnmpInfo
.NumRoutes
= RouteCount
;
164 Status
= InfoCopyOut( (PCHAR
)&SnmpInfo
, sizeof(SnmpInfo
),
165 Buffer
, BufferSize
);
167 TI_DbgPrint(DEBUG_INFO
, ("Returning %08x\n", Status
));
172 TDI_STATUS
InfoTdiSetRoute(PIPROUTE_ENTRY Route
)
174 IP_ADDRESS Address
, Netmask
, Router
;
175 PNEIGHBOR_CACHE_ENTRY NCE
;
177 AddrInitIPv4( &Address
, Route
->Dest
);
178 AddrInitIPv4( &Netmask
, Route
->Mask
);
179 AddrInitIPv4( &Router
, Route
->Gw
);
181 if( Route
->Type
== IP_ROUTE_TYPE_ADD
) { /* Add the route */
182 TI_DbgPrint(DEBUG_INFO
,("Adding route (%s)\n", A2S(&Address
)));
183 /* Find the existing route this belongs to */
184 NCE
= RouterGetRoute( &Router
);
185 if (!NCE
) return TDI_INVALID_PARAMETER
;
187 /* Really add the route */
188 if (!RouterCreateRoute( &Address
, &Netmask
, &Router
,
189 NCE
->Interface
, Route
->Metric1
))
190 return TDI_NO_RESOURCES
;
193 } else if( Route
->Type
== IP_ROUTE_TYPE_DEL
) {
194 TI_DbgPrint(DEBUG_INFO
,("Removing route (%s)\n", A2S(&Address
)));
195 if (NT_SUCCESS(RouterRemoveRoute( &Address
, &Router
)))
198 return TDI_INVALID_PARAMETER
;
201 return TDI_INVALID_REQUEST
;