351 lines
6.9 KiB
C
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;
|
|
}
|