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( PIP_INTERFACE IF
, PNDIS_BUFFER Buffer
, PUINT BufferSize
) {
22 UINT RtCount
= CountFIBs(IF
);
23 UINT Size
= sizeof( IPROUTE_ENTRY
) * RtCount
;
24 PFIB_ENTRY RCache
, RCacheCur
;
25 PIPROUTE_ENTRY RouteEntries
, RtCurrent
;
28 TI_DbgPrint(DEBUG_INFO
, ("Called, routes = %d\n",
32 return InfoCopyOut(NULL
, 0, NULL
, BufferSize
);
34 RouteEntries
= ExAllocatePool( NonPagedPool
, Size
);
35 RtCurrent
= RouteEntries
;
37 RCache
= ExAllocatePool( NonPagedPool
, sizeof( FIB_ENTRY
) * RtCount
);
40 if( !RCache
|| !RouteEntries
) {
41 if( RCache
) ExFreePool( RCache
);
42 if( RouteEntries
) ExFreePool( RouteEntries
);
43 return TDI_NO_RESOURCES
;
46 RtlZeroMemory( RouteEntries
, Size
);
48 RtCount
= CopyFIBs( IF
, RCache
);
50 while( RtCurrent
< RouteEntries
+ RtCount
) {
51 ASSERT(RCacheCur
->Router
);
53 RtlCopyMemory( &RtCurrent
->Dest
,
54 &RCacheCur
->NetworkAddress
.Address
,
55 sizeof(RtCurrent
->Dest
) );
56 RtlCopyMemory( &RtCurrent
->Mask
,
57 &RCacheCur
->Netmask
.Address
,
58 sizeof(RtCurrent
->Mask
) );
59 RtlCopyMemory( &RtCurrent
->Gw
,
60 &RCacheCur
->Router
->Address
.Address
,
61 sizeof(RtCurrent
->Gw
) );
63 RtCurrent
->Metric1
= RCacheCur
->Metric
;
64 RtCurrent
->Type
= TDI_ADDRESS_TYPE_IP
;
68 ("%d: NA %08x NM %08x GW %08x MT %x\n",
69 RtCurrent
- RouteEntries
,
73 RtCurrent
->Metric1
));
75 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
76 for (i
= 0; i
< EntityCount
; i
++)
77 if (EntityList
[i
].context
== IF
)
81 RtCurrent
->Index
= EntityList
[i
].tei_instance
;
85 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
87 RtCurrent
++; RCacheCur
++;
90 Status
= InfoCopyOut( (PCHAR
)RouteEntries
, Size
, Buffer
, BufferSize
);
92 ExFreePool( RouteEntries
);
95 TI_DbgPrint(DEBUG_INFO
, ("Returning %08x\n", Status
));
100 TDI_STATUS
InfoTdiQueryGetAddrTable(TDIEntityID ID
,
105 PIPADDR_ENTRY IPEntry
;
106 PIP_INTERFACE CurrentIF
;
109 TI_DbgPrint(DEBUG_INFO
, ("Called.\n"));
112 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
114 for (i
= 0; i
< EntityCount
; i
++)
116 if (EntityList
[i
].tei_entity
== ID
.tei_entity
&&
117 EntityList
[i
].tei_instance
== ID
.tei_instance
)
121 if (i
== EntityCount
)
123 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
124 return TDI_INVALID_PARAMETER
;
127 IPEntry
= ExAllocatePool(NonPagedPool
, sizeof(IPADDR_ENTRY
));
130 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
131 return TDI_NO_RESOURCES
;
134 CurrentIF
= EntityList
[i
].context
;
136 IPEntry
->Index
= CurrentIF
->Index
;
137 GetInterfaceIPv4Address(CurrentIF
,
140 GetInterfaceIPv4Address(CurrentIF
,
143 GetInterfaceIPv4Address(CurrentIF
,
145 &IPEntry
->BcastAddr
);
147 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
149 InfoCopyOut((PCHAR
)IPEntry
, sizeof(IPADDR_ENTRY
),
157 TDI_STATUS
InfoTdiQueryGetIPSnmpInfo( TDIEntityID ID
,
161 IPSNMP_INFO SnmpInfo
;
162 UINT IfCount
= CountInterfaces();
163 UINT RouteCount
= CountFIBs(IF
);
164 TDI_STATUS Status
= TDI_INVALID_REQUEST
;
166 TI_DbgPrint(DEBUG_INFO
, ("Called.\n"));
168 RtlZeroMemory(&SnmpInfo
, sizeof(IPSNMP_INFO
));
170 SnmpInfo
.NumIf
= IfCount
;
171 SnmpInfo
.NumAddr
= 1;
172 SnmpInfo
.NumRoutes
= RouteCount
;
174 Status
= InfoCopyOut( (PCHAR
)&SnmpInfo
, sizeof(SnmpInfo
),
175 Buffer
, BufferSize
);
177 TI_DbgPrint(DEBUG_INFO
, ("Returning %08x\n", Status
));
182 TDI_STATUS
InfoTdiSetRoute(PIP_INTERFACE IF
, PVOID Buffer
, UINT BufferSize
)
184 IP_ADDRESS Address
, Netmask
, Router
;
185 PIPROUTE_ENTRY Route
= Buffer
;
187 AddrInitIPv4( &Address
, Route
->Dest
);
188 AddrInitIPv4( &Netmask
, Route
->Mask
);
189 AddrInitIPv4( &Router
, Route
->Gw
);
191 if (!Buffer
|| BufferSize
< sizeof(IPROUTE_ENTRY
))
192 return TDI_INVALID_PARAMETER
;
196 DbgPrint("Failing attempt to add route to loopback adapter\n");
197 return TDI_INVALID_PARAMETER
;
200 if( Route
->Type
== IP_ROUTE_TYPE_ADD
) { /* Add the route */
201 TI_DbgPrint(DEBUG_INFO
,("Adding route (%s)\n", A2S(&Address
)));
202 if (!RouterCreateRoute( &Address
, &Netmask
, &Router
,
204 return TDI_NO_RESOURCES
;
207 } else if( Route
->Type
== IP_ROUTE_TYPE_DEL
) {
208 TI_DbgPrint(DEBUG_INFO
,("Removing route (%s)\n", A2S(&Address
)));
209 if (NT_SUCCESS(RouterRemoveRoute( &Address
, &Router
)))
212 return TDI_INVALID_PARAMETER
;
215 return TDI_INVALID_REQUEST
;