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
;
25 exAllocatePool( NonPagedPool
, sizeof( FIB_ENTRY
) * RtCount
),
27 PIPROUTE_ENTRY RouteEntries
= exAllocatePool( NonPagedPool
, Size
),
28 RtCurrent
= RouteEntries
;
31 TI_DbgPrint(DEBUG_INFO
, ("Called, routes = %d, RCache = %08x\n",
34 if( !RCache
|| !RouteEntries
) {
35 if( RCache
) exFreePool( RCache
);
36 if( RouteEntries
) exFreePool( RouteEntries
);
37 return TDI_NO_RESOURCES
;
40 RtlZeroMemory( RouteEntries
, Size
);
42 RtCount
= CopyFIBs( IF
, RCache
);
44 while( RtCurrent
< RouteEntries
+ RtCount
) {
45 ASSERT(RCacheCur
->Router
);
47 RtlCopyMemory( &RtCurrent
->Dest
,
48 &RCacheCur
->NetworkAddress
.Address
,
49 sizeof(RtCurrent
->Dest
) );
50 RtlCopyMemory( &RtCurrent
->Mask
,
51 &RCacheCur
->Netmask
.Address
,
52 sizeof(RtCurrent
->Mask
) );
53 RtlCopyMemory( &RtCurrent
->Gw
,
54 &RCacheCur
->Router
->Address
.Address
,
55 sizeof(RtCurrent
->Gw
) );
57 RtCurrent
->Metric1
= RCacheCur
->Metric
;
58 RtCurrent
->Type
= TDI_ADDRESS_TYPE_IP
;
62 ("%d: NA %08x NM %08x GW %08x MT %x\n",
63 RtCurrent
- RouteEntries
,
67 RtCurrent
->Metric1
));
69 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
70 for (i
= 0; i
< EntityCount
; i
++)
71 if (EntityList
[i
].context
== IF
)
75 RtCurrent
->Index
= EntityList
[i
].tei_instance
;
79 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
81 RtCurrent
++; RCacheCur
++;
84 Status
= InfoCopyOut( (PCHAR
)RouteEntries
, Size
, Buffer
, BufferSize
);
86 exFreePool( RouteEntries
);
89 TI_DbgPrint(DEBUG_INFO
, ("Returning %08x\n", Status
));
94 TDI_STATUS
InfoTdiQueryGetAddrTable(TDIEntityID ID
,
99 PIPADDR_ENTRY IPEntry
;
100 PIP_INTERFACE CurrentIF
;
103 TI_DbgPrint(DEBUG_INFO
, ("Called.\n"));
106 TcpipAcquireSpinLock(&EntityListLock
, &OldIrql
);
108 for (i
= 0; i
< EntityCount
; i
++)
110 if (EntityList
[i
].tei_entity
== ID
.tei_entity
&&
111 EntityList
[i
].tei_instance
== ID
.tei_instance
)
115 if (i
== EntityCount
)
117 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
118 return TDI_INVALID_PARAMETER
;
121 IPEntry
= exAllocatePool(NonPagedPool
, sizeof(IPADDR_ENTRY
));
124 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
125 return TDI_NO_RESOURCES
;
128 CurrentIF
= EntityList
[i
].context
;
130 IPEntry
->Index
= CurrentIF
->Index
;
131 GetInterfaceIPv4Address(CurrentIF
,
134 GetInterfaceIPv4Address(CurrentIF
,
137 GetInterfaceIPv4Address(CurrentIF
,
139 &IPEntry
->BcastAddr
);
141 TcpipReleaseSpinLock(&EntityListLock
, OldIrql
);
143 InfoCopyOut((PCHAR
)IPEntry
, sizeof(IPADDR_ENTRY
),
151 TDI_STATUS
InfoTdiQueryGetIPSnmpInfo( TDIEntityID ID
,
155 IPSNMP_INFO SnmpInfo
;
156 UINT IfCount
= CountInterfaces();
157 UINT RouteCount
= CountFIBs(IF
);
158 TDI_STATUS Status
= TDI_INVALID_REQUEST
;
160 TI_DbgPrint(DEBUG_INFO
, ("Called.\n"));
162 RtlZeroMemory(&SnmpInfo
, sizeof(IPSNMP_INFO
));
164 SnmpInfo
.NumIf
= IfCount
;
165 SnmpInfo
.NumAddr
= 1;
166 SnmpInfo
.NumRoutes
= RouteCount
;
168 Status
= InfoCopyOut( (PCHAR
)&SnmpInfo
, sizeof(SnmpInfo
),
169 Buffer
, BufferSize
);
171 TI_DbgPrint(DEBUG_INFO
, ("Returning %08x\n", Status
));
176 TDI_STATUS
InfoTdiSetRoute(PIP_INTERFACE IF
, PIPROUTE_ENTRY Route
)
178 IP_ADDRESS Address
, Netmask
, Router
;
180 AddrInitIPv4( &Address
, Route
->Dest
);
181 AddrInitIPv4( &Netmask
, Route
->Mask
);
182 AddrInitIPv4( &Router
, Route
->Gw
);
184 if( Route
->Type
== IP_ROUTE_TYPE_ADD
) { /* Add the route */
185 TI_DbgPrint(DEBUG_INFO
,("Adding route (%s)\n", A2S(&Address
)));
186 if (!RouterCreateRoute( &Address
, &Netmask
, &Router
,
188 return TDI_NO_RESOURCES
;
191 } else if( Route
->Type
== IP_ROUTE_TYPE_DEL
) {
192 TI_DbgPrint(DEBUG_INFO
,("Removing route (%s)\n", A2S(&Address
)));
193 if (NT_SUCCESS(RouterRemoveRoute( &Address
, &Router
)))
196 return TDI_INVALID_PARAMETER
;
199 return TDI_INVALID_REQUEST
;