windows-nt/Source/XPSP1/NT/net/rras/ipx/rtrmgr/mibroute.c
2020-09-26 16:20:57 +08:00

351 lines
6.9 KiB
C

/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
mibroute.c
Abstract:
The MIB handling functions for the Forwarding Group (Routes & Static Routes)
Author:
Stefan Solomon 05/02/1995
Revision History:
--*/
#include "precomp.h"
#pragma hdrstop
DWORD
MibGetRoute(PIPX_MIB_INDEX mip,
PIPX_ROUTE Route,
PULONG RouteSize)
{
if((Route == NULL) || (*RouteSize < sizeof(IPX_ROUTE))) {
*RouteSize = sizeof(IPX_ROUTE);
return ERROR_INSUFFICIENT_BUFFER;
}
memcpy(Route->Network, mip->RoutingTableIndex.Network, 4);
return(GetRoute(IPX_DEST_TABLE, Route));
}
DWORD
MibGetFirstRoute(PIPX_MIB_INDEX mip,
PIPX_ROUTE Route,
PULONG RouteSize)
{
if((Route == NULL) || (*RouteSize < sizeof(IPX_ROUTE))) {
*RouteSize = sizeof(IPX_ROUTE);
return ERROR_INSUFFICIENT_BUFFER;
}
return(GetFirstRoute(IPX_DEST_TABLE, Route));
}
DWORD
MibGetNextRoute(PIPX_MIB_INDEX mip,
PIPX_ROUTE Route,
PULONG RouteSize)
{
if((Route == NULL) || (*RouteSize < sizeof(IPX_ROUTE))) {
*RouteSize = sizeof(IPX_ROUTE);
return ERROR_INSUFFICIENT_BUFFER;
}
memcpy(Route->Network, mip->RoutingTableIndex.Network, 4);
return(GetNextRoute(IPX_DEST_TABLE, Route));
}
DWORD
MibCreateStaticRoute(PIPX_MIB_ROW MibRowp)
{
PIPX_ROUTE NewRoutep;
IPX_ROUTE OldRoute;
PICB icbp;
IPX_STATIC_ROUTE_INFO strtinfo;
DWORD rc;
NewRoutep = &MibRowp->Route;
OldRoute = *NewRoutep;
ACQUIRE_DATABASE_LOCK;
if((icbp = GetInterfaceByIndex(NewRoutep->InterfaceIndex)) == NULL) {
RELEASE_DATABASE_LOCK;
return ERROR_INVALID_PARAMETER;
}
// if this static route already exists, delete it
if(GetRoute(IPX_STATIC_ROUTE_TABLE, &OldRoute) == NO_ERROR) {
memcpy(&strtinfo.Network,
OldRoute.Network,
4);
strtinfo.TickCount = OldRoute.TickCount;
strtinfo.HopCount = OldRoute.HopCount;
memcpy(&strtinfo.NextHopMacAddress,
OldRoute.NextHopMacAddress,
6);
if(DeleteStaticRoute(OldRoute.InterfaceIndex,
&strtinfo) != NO_ERROR) {
RELEASE_DATABASE_LOCK;
return ERROR_CAN_NOT_COMPLETE;
}
}
memcpy(&strtinfo.Network,
NewRoutep->Network,
4);
strtinfo.TickCount = NewRoutep->TickCount;
strtinfo.HopCount = NewRoutep->HopCount;
memcpy(&strtinfo.NextHopMacAddress,
NewRoutep->NextHopMacAddress,
6);
rc = CreateStaticRoute(icbp, &strtinfo);
RELEASE_DATABASE_LOCK;
return rc;
}
DWORD
MibDeleteStaticRoute(PIPX_MIB_ROW MibRowp)
{
PIPX_ROUTE Route;
PICB icbp;
IPX_STATIC_ROUTE_INFO strtinfo;
DWORD rc;
Route = &MibRowp->Route;
ACQUIRE_DATABASE_LOCK;
if((icbp = GetInterfaceByIndex(Route->InterfaceIndex)) == NULL) {
RELEASE_DATABASE_LOCK;
return ERROR_INVALID_PARAMETER;
}
memcpy(&strtinfo.Network,
Route->Network,
4);
strtinfo.TickCount = Route->TickCount;
strtinfo.HopCount = Route->HopCount;
memcpy(&strtinfo.NextHopMacAddress,
Route->NextHopMacAddress,
6);
rc = DeleteStaticRoute(Route->InterfaceIndex,
&strtinfo);
RELEASE_DATABASE_LOCK;
return rc;
}
DWORD
MibGetStaticRoute(PIPX_MIB_INDEX mip,
PIPX_ROUTE Route,
PULONG RouteSize)
{
DWORD rc;
if((Route == NULL) || (*RouteSize < sizeof(IPX_ROUTE))) {
*RouteSize = sizeof(IPX_ROUTE);
return ERROR_INSUFFICIENT_BUFFER;
}
Route->InterfaceIndex = mip->StaticRoutesTableIndex.InterfaceIndex;
memcpy(Route->Network, mip->StaticRoutesTableIndex.Network, 4);
return(GetRoute(IPX_STATIC_ROUTE_TABLE, Route));
}
DWORD
MibGetFirstStaticRoute(PIPX_MIB_INDEX mip,
PIPX_ROUTE Route,
PULONG RouteSize)
{
ULONG InterfaceIndex;
DWORD rc;
if((Route == NULL) || (*RouteSize < sizeof(IPX_ROUTE))) {
*RouteSize = sizeof(IPX_ROUTE);
return ERROR_INSUFFICIENT_BUFFER;
}
ACQUIRE_DATABASE_LOCK;
if(EnumerateFirstInterfaceIndex(&InterfaceIndex)) {
RELEASE_DATABASE_LOCK;
return ERROR_NO_MORE_ITEMS;
}
RELEASE_DATABASE_LOCK;
Route->InterfaceIndex = InterfaceIndex;
rc = GetFirstRoute(IPX_STATIC_ROUTE_TABLE, Route);
if(rc == NO_ERROR) {
return rc;
}
// no more static routes for this interface. Find the next interface
// which has static routes
ACQUIRE_DATABASE_LOCK;
while(rc != NO_ERROR)
{
if(EnumerateNextInterfaceIndex(&InterfaceIndex)) {
rc = ERROR_NO_MORE_ITEMS;
break;
}
else
{
Route->InterfaceIndex = InterfaceIndex;
rc = GetFirstRoute(IPX_STATIC_ROUTE_TABLE, Route);
}
}
RELEASE_DATABASE_LOCK;
return rc;
}
DWORD
MibGetNextStaticRoute(PIPX_MIB_INDEX mip,
PIPX_ROUTE Route,
PULONG RouteSize)
{
DWORD rc;
ULONG InterfaceIndex;
if((Route == NULL) || (*RouteSize < sizeof(IPX_ROUTE))) {
*RouteSize = sizeof(IPX_ROUTE);
return ERROR_INSUFFICIENT_BUFFER;
}
Route->InterfaceIndex = mip->StaticRoutesTableIndex.InterfaceIndex;
memcpy(Route->Network, mip->StaticRoutesTableIndex.Network, 4);
rc = GetNextRoute(IPX_STATIC_ROUTE_TABLE, Route);
if(rc == NO_ERROR) {
return rc;
}
// no more static routes for this interface. Find the next interface
// which has static routes
InterfaceIndex = mip->StaticRoutesTableIndex.InterfaceIndex;
ACQUIRE_DATABASE_LOCK;
while(rc != NO_ERROR)
{
if(EnumerateNextInterfaceIndex(&InterfaceIndex)) {
rc = ERROR_NO_MORE_ITEMS;
break;
}
else
{
Route->InterfaceIndex = InterfaceIndex;
rc = GetFirstRoute(IPX_STATIC_ROUTE_TABLE, Route);
}
}
RELEASE_DATABASE_LOCK;
return rc;
}
DWORD
MibSetStaticRoute(PIPX_MIB_ROW MibRowp)
{
PIPX_ROUTE NewRoutep;
IPX_ROUTE OldRoute;
PICB icbp;
IPX_STATIC_ROUTE_INFO strtinfo;
DWORD rc;
NewRoutep = &MibRowp->Route;
OldRoute = *NewRoutep;
ACQUIRE_DATABASE_LOCK;
if((icbp = GetInterfaceByIndex(OldRoute.InterfaceIndex)) == NULL) {
RELEASE_DATABASE_LOCK;
return ERROR_INVALID_PARAMETER;
}
// first, delete this route if it exists
if(GetRoute(IPX_STATIC_ROUTE_TABLE, &OldRoute) != NO_ERROR) {
// route doesn't exist
RELEASE_DATABASE_LOCK;
return ERROR_INVALID_PARAMETER;
}
memcpy(&strtinfo.Network,
OldRoute.Network,
4);
strtinfo.TickCount = OldRoute.TickCount;
strtinfo.HopCount = OldRoute.HopCount;
memcpy(&strtinfo.NextHopMacAddress,
OldRoute.NextHopMacAddress,
6);
if(DeleteStaticRoute(OldRoute.InterfaceIndex,
&strtinfo) != NO_ERROR) {
RELEASE_DATABASE_LOCK;
return ERROR_CAN_NOT_COMPLETE;
}
memcpy(&strtinfo.Network,
NewRoutep->Network,
4);
strtinfo.TickCount = NewRoutep->TickCount;
strtinfo.HopCount = NewRoutep->HopCount;
memcpy(&strtinfo.NextHopMacAddress,
NewRoutep->NextHopMacAddress,
6);
// add it again with the new parameters
rc = CreateStaticRoute(icbp,
&strtinfo);
RELEASE_DATABASE_LOCK;
return rc;
}