1245 lines
43 KiB
C
1245 lines
43 KiB
C
/*++
|
|
|
|
Copyright (c) 1996 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
mipxf.c
|
|
|
|
Abstract:
|
|
|
|
ms-ipx instrumentation callbacks.
|
|
|
|
Author:
|
|
|
|
Vadim Eydelman (vadime) 30-May-1996
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
#include "precomp.h"
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// mipxBase group (1.3.6.1.4.1.311.1.8.1) //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
UINT
|
|
get_mipxBase(
|
|
UINT actionId,
|
|
AsnAny * objectArray,
|
|
UINT * errorIndex
|
|
) {
|
|
#define Beb ((buf_mipxBase *)objectArray)
|
|
IPX_MIB_GET_INPUT_DATA MibGetInputData;
|
|
PIPXMIB_BASE Bep;
|
|
DWORD rc;
|
|
ULONG BeSize;
|
|
|
|
if (!EnsureRouterConnection()) {
|
|
*errorIndex = 0;
|
|
return MIB_S_ENTRY_NOT_FOUND;
|
|
}
|
|
|
|
switch (actionId) {
|
|
case MIB_ACTION_GET:
|
|
MibGetInputData.TableId = IPX_BASE_ENTRY;
|
|
rc = MprAdminMIBEntryGet(g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&MibGetInputData,
|
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
|
&Bep,
|
|
&BeSize);
|
|
if (rc == NO_ERROR && Bep == NULL)
|
|
{
|
|
return MIB_S_ENTRY_NOT_FOUND;
|
|
}
|
|
if (rc==NO_ERROR) {
|
|
SetAsnInteger (&Beb->mipxBaseOperState, Bep->OperState);
|
|
SetAsnOctetString (&Beb->mipxBasePrimaryNetNumber, Beb->PrimaryNetVal,
|
|
Bep->PrimaryNetNumber, sizeof (Beb->PrimaryNetVal));
|
|
SetAsnOctetString (&Beb->mipxBaseNode, Beb->NodeVal,
|
|
Bep->Node, sizeof (Beb->NodeVal));
|
|
SetAsnDispString (&Beb->mipxBaseSysName, Beb->SysNameVal,
|
|
Bep->SysName, sizeof (Beb->SysNameVal));
|
|
SetAsnInteger (&Beb->mipxBaseMaxPathSplits, Bep->MaxPathSplits);
|
|
SetAsnInteger (&Beb->mipxBaseIfCount, Bep->IfCount);
|
|
SetAsnInteger (&Beb->mipxBaseDestCount, Bep->DestCount);
|
|
SetAsnInteger (&Beb->mipxBaseServCount, Bep->ServCount);
|
|
MprAdminMIBBufferFree (Bep);
|
|
DbgTrace (DBG_IPXBASE, ("MIPX-Base: Get request succeded.\n"));
|
|
return MIB_S_SUCCESS;
|
|
}
|
|
else {
|
|
*errorIndex = 0;
|
|
DbgTrace (DBG_IPXBASE,
|
|
("MIPX-Base: Get request failed with error %ld.\n", rc));
|
|
return MIB_S_ENTRY_NOT_FOUND;
|
|
}
|
|
case MIB_ACTION_GETNEXT:
|
|
DbgTrace (DBG_IPXBASE,
|
|
("MIPX-Base:Get called with GET_FIRST/GET_NEXT for scalar.\n"));
|
|
return MIB_S_INVALID_PARAMETER;
|
|
default:
|
|
DbgTrace (DBG_IPXBASE,
|
|
("MIPX-Base:Get called with unsupported action code %d.\n",
|
|
actionId));
|
|
return MIB_S_INVALID_PARAMETER;
|
|
}
|
|
#undef Beb
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// mipxInterface group (1.3.6.1.4.1.311.1.8.2) //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// mipxIfEntry table (1.3.6.1.4.1.311.1.8.2.1.1) //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
UINT
|
|
get_mipxIfEntry(
|
|
UINT actionId,
|
|
AsnAny * objectArray,
|
|
UINT * errorIndex
|
|
) {
|
|
#define Ifb ((buf_mipxIfEntry *)objectArray)
|
|
PIPX_INTERFACE Ifp;
|
|
IPX_MIB_GET_INPUT_DATA MibGetInputData;
|
|
DWORD rc;
|
|
ULONG IfSize;
|
|
|
|
if (!EnsureRouterConnection()) {
|
|
*errorIndex = 0;
|
|
return MIB_S_ENTRY_NOT_FOUND;
|
|
}
|
|
|
|
MibGetInputData.TableId = IPX_INTERFACE_TABLE;
|
|
MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex
|
|
= (ULONG)GetAsnInteger (&Ifb->mipxIfIndex, ZERO_INTERFACE_INDEX);
|
|
|
|
switch (actionId) {
|
|
case MIB_ACTION_GET:
|
|
ASSERTMSG ("No index in GET request for table ",
|
|
Ifb->mipxIfIndex.asnType);
|
|
rc = MprAdminMIBEntryGet(g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&MibGetInputData,
|
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
|
&Ifp,
|
|
&IfSize);
|
|
break;
|
|
case MIB_ACTION_GETNEXT:
|
|
if (Ifb->mipxIfIndex.asnType)
|
|
rc = MprAdminMIBEntryGetNext(g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&MibGetInputData,
|
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
|
&Ifp,
|
|
&IfSize);
|
|
else
|
|
rc = MprAdminMIBEntryGetFirst(g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&MibGetInputData,
|
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
|
&Ifp,
|
|
&IfSize);
|
|
|
|
break;
|
|
default:
|
|
DbgTrace (DBG_IPXINTERFACES,
|
|
("MIPX-if:Get called with unsupported action code %d.\n",
|
|
actionId));
|
|
return MIB_S_INVALID_PARAMETER;
|
|
}
|
|
|
|
if (rc == NO_ERROR && Ifp == NULL)
|
|
{
|
|
rc = ERROR_CAN_NOT_COMPLETE;
|
|
}
|
|
|
|
switch (rc) {
|
|
case NO_ERROR:
|
|
DbgTrace (DBG_IPXINTERFACES, ("MIPX-if: Get(%d) request succeded for if %ld->%ld.\n",
|
|
actionId,
|
|
MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex,
|
|
Ifp->InterfaceIndex));
|
|
ForceAsnInteger (&Ifb->mipxIfIndex, Ifp->InterfaceIndex);
|
|
SetAsnInteger (&Ifb->mipxIfAdminState, Ifp->AdminState);
|
|
SetAsnInteger (&Ifb->mipxIfOperState, Ifp->IfStats.IfOperState);
|
|
SetAsnInteger (&Ifb->mipxIfAdapterIndex, Ifp->AdapterIndex);
|
|
SetAsnDispString (&Ifb->mipxIfName, Ifb->NameVal,
|
|
Ifp->InterfaceName, sizeof (Ifb->NameVal));
|
|
SetAsnInteger (&Ifb->mipxIfType, Ifp->InterfaceType);
|
|
SetAsnInteger (&Ifb->mipxIfLocalMaxPacketSize, Ifp->IfStats.MaxPacketSize);
|
|
SetAsnInteger (&Ifb->mipxIfMediaType, Ifp->MediaType);
|
|
SetAsnOctetString (&Ifb->mipxIfNetNumber, Ifb->NetNumberVal,
|
|
Ifp->NetNumber, sizeof (Ifb->NetNumberVal));
|
|
SetAsnOctetString (&Ifb->mipxIfMacAddress, Ifb->MacAddressVal,
|
|
Ifp->MacAddress, sizeof (Ifb->MacAddressVal));
|
|
SetAsnInteger (&Ifb->mipxIfDelay, Ifp->Delay);
|
|
SetAsnInteger (&Ifb->mipxIfThroughput, Ifp->Throughput);
|
|
SetAsnInteger (&Ifb->mipxIfIpxWanEnable, Ifp->EnableIpxWanNegotiation);
|
|
SetAsnInteger (&Ifb->mipxIfNetbiosAccept, Ifp->NetbiosAccept);
|
|
SetAsnInteger (&Ifb->mipxIfNetbiosDeliver, Ifp->NetbiosDeliver);
|
|
SetAsnCounter (&Ifb->mipxIfInHdrErrors, Ifp->IfStats.InHdrErrors);
|
|
SetAsnCounter (&Ifb->mipxIfInFilterDrops, Ifp->IfStats.InFiltered);
|
|
SetAsnCounter (&Ifb->mipxIfInNoRoutes, Ifp->IfStats.InNoRoutes);
|
|
SetAsnCounter (&Ifb->mipxIfInDiscards, Ifp->IfStats.InDiscards);
|
|
SetAsnCounter (&Ifb->mipxIfInDelivers, Ifp->IfStats.InDelivers);
|
|
SetAsnCounter (&Ifb->mipxIfOutFilterDrops, Ifp->IfStats.OutFiltered);
|
|
SetAsnCounter (&Ifb->mipxIfOutDiscards, Ifp->IfStats.OutDiscards);
|
|
SetAsnCounter (&Ifb->mipxIfOutDelivers, Ifp->IfStats.OutDelivers);
|
|
SetAsnCounter (&Ifb->mipxIfInNetbiosPackets, Ifp->IfStats.NetbiosReceived);
|
|
SetAsnCounter (&Ifb->mipxIfOutNetbiosPackets, Ifp->IfStats.NetbiosSent);
|
|
MprAdminMIBBufferFree (Ifp);
|
|
return MIB_S_SUCCESS;
|
|
case ERROR_NO_MORE_ITEMS:
|
|
ASSERTMSG ("ERROR_NO_MORE_ITEMS returned, but request is not GETNEXT ",
|
|
actionId==MIB_ACTION_GETNEXT);
|
|
DbgTrace (DBG_IPXINTERFACES,
|
|
("MIPX-if: End of table reached on GETFIRST/GETNEXT request for if %ld.\n",
|
|
MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex));
|
|
return MIB_S_NO_MORE_ENTRIES;
|
|
default:
|
|
*errorIndex = 0;
|
|
DbgTrace (DBG_IPXINTERFACES,
|
|
("MIPX-if: Get request for if %ld failed with error %ld.\n",
|
|
MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex, rc));
|
|
return MIB_S_ENTRY_NOT_FOUND;
|
|
}
|
|
#undef Ifb
|
|
}
|
|
|
|
UINT
|
|
set_mipxIfEntry(
|
|
UINT actionId,
|
|
AsnAny * objectArray,
|
|
UINT * errorIndex
|
|
) {
|
|
#define Ifb ((sav_mipxIfEntry *)objectArray)
|
|
PIPX_INTERFACE Ifp;
|
|
IPX_MIB_GET_INPUT_DATA MibGetInputData;
|
|
DWORD rc;
|
|
ULONG IfSize;
|
|
|
|
if (!EnsureRouterConnection()) {
|
|
*errorIndex = 0;
|
|
return MIB_S_ENTRY_NOT_FOUND;
|
|
}
|
|
switch (actionId) {
|
|
case MIB_ACTION_VALIDATE:
|
|
ASSERTMSG ("No index in VALIDATE request for table ",
|
|
Ifb->mipxIfIndex.asnType);
|
|
MibGetInputData.TableId = IPX_INTERFACE_TABLE;
|
|
MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex
|
|
= (ULONG)GetAsnInteger (&Ifb->mipxIfIndex, INVALID_INTERFACE_INDEX);
|
|
rc = MprAdminMIBEntryGet(g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&MibGetInputData,
|
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
|
&Ifp,
|
|
&IfSize);
|
|
if (rc == NO_ERROR && Ifp == NULL)
|
|
{
|
|
rc = ERROR_CAN_NOT_COMPLETE;
|
|
}
|
|
if (rc==NO_ERROR) {
|
|
Ifb->MibSetInputData.MibRow.Interface = *Ifp;
|
|
Ifb->MibSetInputData.MibRow.Interface.AdminState
|
|
= (ULONG)GetAsnInteger(&Ifb->mipxIfAdminState,
|
|
Ifb->MibSetInputData.MibRow.Interface.AdminState);
|
|
GetAsnOctetString (
|
|
Ifb->MibSetInputData.MibRow.Interface.NetNumber,
|
|
&Ifb->mipxIfNetNumber,
|
|
sizeof (Ifb->MibSetInputData.MibRow.Interface.NetNumber),
|
|
NULL);
|
|
GetAsnOctetString (
|
|
Ifb->MibSetInputData.MibRow.Interface.MacAddress,
|
|
&Ifb->mipxIfMacAddress,
|
|
sizeof (Ifb->MibSetInputData.MibRow.Interface.MacAddress),
|
|
NULL);
|
|
Ifb->MibSetInputData.MibRow.Interface.EnableIpxWanNegotiation
|
|
= (ULONG)GetAsnInteger (&Ifb->mipxIfIpxWanEnable,
|
|
Ifb->MibSetInputData.MibRow.Interface.EnableIpxWanNegotiation);
|
|
Ifb->MibSetInputData.MibRow.Interface.NetbiosAccept
|
|
= (ULONG)GetAsnInteger (&Ifb->mipxIfNetbiosAccept,
|
|
Ifb->MibSetInputData.MibRow.Interface.NetbiosAccept);
|
|
Ifb->MibSetInputData.MibRow.Interface.NetbiosDeliver
|
|
= (ULONG)GetAsnInteger (&Ifb->mipxIfNetbiosDeliver,
|
|
Ifb->MibSetInputData.MibRow.Interface.NetbiosDeliver);
|
|
MprAdminMIBBufferFree (Ifp);
|
|
DbgTrace (DBG_IPXINTERFACES, ("MIPX-if: Validated if %ld\n",
|
|
MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex));
|
|
return MIB_S_SUCCESS;
|
|
}
|
|
else {
|
|
DbgTrace (DBG_IPXINTERFACES,
|
|
("MIPX-if: Validate failed on if %ld with error %ld\n",
|
|
MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex, rc));
|
|
return MIB_S_ENTRY_NOT_FOUND;
|
|
}
|
|
case MIB_ACTION_SET:
|
|
rc = MprAdminMIBEntrySet (g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&Ifb->MibSetInputData,
|
|
sizeof(IPX_MIB_SET_INPUT_DATA));
|
|
if (rc==NO_ERROR) {
|
|
DbgTrace (DBG_IPXINTERFACES, ("MIPX-if: Set succeded on if %ld\n",
|
|
Ifb->MibSetInputData.MibRow.Interface.InterfaceIndex));
|
|
return MIB_S_SUCCESS;
|
|
}
|
|
else {
|
|
DbgTrace (DBG_IPXINTERFACES,
|
|
("MIPX-if: Set failed on if %ld with error %ld\n",
|
|
Ifb->MibSetInputData.MibRow.Interface.InterfaceIndex, rc));
|
|
return MIB_S_ENTRY_NOT_FOUND;
|
|
}
|
|
|
|
case MIB_ACTION_CLEANUP:
|
|
return MIB_S_SUCCESS;
|
|
default:
|
|
DbgTrace (DBG_IPXINTERFACES,
|
|
("MIPX-if:Set called with unsupported action code %d.\n",
|
|
actionId));
|
|
return MIB_S_INVALID_PARAMETER;
|
|
}
|
|
#undef Ifb
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// mipxForwarding group (1.3.6.1.4.1.311.1.8.3) //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// mipxDestEntry table (1.3.6.1.4.1.311.1.8.3.1.1) //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
UINT
|
|
get_mipxDestEntry(
|
|
UINT actionId,
|
|
AsnAny * objectArray,
|
|
UINT * errorIndex
|
|
) {
|
|
#define Rtb ((buf_mipxDestEntry *)objectArray)
|
|
PIPX_ROUTE Rtp;
|
|
IPX_MIB_GET_INPUT_DATA MibGetInputData;
|
|
DWORD rc;
|
|
ULONG RtSize;
|
|
|
|
if (!EnsureRouterConnection()) {
|
|
*errorIndex = 0;
|
|
return MIB_S_ENTRY_NOT_FOUND;
|
|
}
|
|
|
|
MibGetInputData.TableId = IPX_DEST_TABLE;
|
|
GetAsnOctetString (MibGetInputData.MibIndex.RoutingTableIndex.Network,
|
|
&Rtb->mipxDestNetNum,
|
|
sizeof (MibGetInputData.MibIndex.RoutingTableIndex.Network),
|
|
ZERO_NET_NUM);
|
|
|
|
switch (actionId) {
|
|
case MIB_ACTION_GET:
|
|
ASSERTMSG ("No index in GET request for table ",
|
|
Rtb->mipxDestNetNum.asnType);
|
|
rc = MprAdminMIBEntryGet(g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&MibGetInputData,
|
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
|
&Rtp,
|
|
&RtSize);
|
|
break;
|
|
case MIB_ACTION_GETNEXT:
|
|
if (Rtb->mipxDestNetNum.asnType) {
|
|
rc = MprAdminMIBEntryGetNext(g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&MibGetInputData,
|
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
|
&Rtp,
|
|
&RtSize);
|
|
if (rc==NO_ERROR) {
|
|
FreeAsnString (&Rtb->mipxDestNetNum);
|
|
}
|
|
}
|
|
else
|
|
rc = MprAdminMIBEntryGetFirst (g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&MibGetInputData,
|
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
|
&Rtp,
|
|
&RtSize);
|
|
break;
|
|
default:
|
|
DbgTrace (DBG_DESTTABLE,
|
|
("MIPX-dest:Get called with unsupported action code %d.\n",
|
|
actionId));
|
|
return MIB_S_INVALID_PARAMETER;
|
|
}
|
|
switch (rc) {
|
|
case NO_ERROR:
|
|
DbgTrace (DBG_DESTTABLE,
|
|
("MIPX-dest: Get(%d) request succeded for net"
|
|
" %.2x%.2x%.2x%.2x -> %.2x%.2x%.2x%.2x.\n", actionId,
|
|
MibGetInputData.MibIndex.RoutingTableIndex.Network[0],
|
|
MibGetInputData.MibIndex.RoutingTableIndex.Network[1],
|
|
MibGetInputData.MibIndex.RoutingTableIndex.Network[2],
|
|
MibGetInputData.MibIndex.RoutingTableIndex.Network[3],
|
|
Rtp->Network[0],
|
|
Rtp->Network[1],
|
|
Rtp->Network[2],
|
|
Rtp->Network[3]));
|
|
ForceAsnOctetString (&Rtb->mipxDestNetNum, Rtb->NetNumVal,
|
|
Rtp->Network, sizeof (Rtb->NetNumVal));
|
|
switch (Rtp->Protocol) {
|
|
case IPX_PROTOCOL_LOCAL:
|
|
SetAsnInteger (&Rtb->mipxDestProtocol, 2);
|
|
break;
|
|
case IPX_PROTOCOL_STATIC:
|
|
SetAsnInteger (&Rtb->mipxDestProtocol, 5);
|
|
break;
|
|
case IPX_PROTOCOL_RIP:
|
|
SetAsnInteger (&Rtb->mipxDestProtocol, 3);
|
|
break;
|
|
case IPX_PROTOCOL_NLSP:
|
|
SetAsnInteger (&Rtb->mipxDestProtocol, 4);
|
|
break;
|
|
default:
|
|
SetAsnInteger (&Rtb->mipxDestProtocol, 1); // other
|
|
break;
|
|
}
|
|
SetAsnInteger (&Rtb->mipxDestTicks, Rtp->TickCount);
|
|
SetAsnInteger (&Rtb->mipxDestHopCount, Rtp->HopCount);
|
|
SetAsnInteger (&Rtb->mipxDestNextHopIfIndex, Rtp->InterfaceIndex);
|
|
SetAsnOctetString (&Rtb->mipxDestNextHopMacAddress, Rtb->NextHopMacAddressVal,
|
|
Rtp->NextHopMacAddress, sizeof (Rtb->NextHopMacAddressVal));
|
|
SetAsnInteger (&Rtb->mipxDestFlags, Rtp->Flags);
|
|
MprAdminMIBBufferFree (Rtp);
|
|
return MIB_S_SUCCESS;
|
|
case ERROR_NO_MORE_ITEMS:
|
|
ASSERTMSG ("ERROR_NO_MORE_ITEMS returned, but request is not GETNEXT ",
|
|
actionId==MIB_ACTION_GETNEXT);
|
|
DbgTrace (DBG_DESTTABLE,
|
|
("MIPX-dest: End of table reached on GETFIRST/GETNEXT request"
|
|
" for network %.2x%.2x%.2x%.2x.\n",
|
|
MibGetInputData.MibIndex.RoutingTableIndex.Network[0],
|
|
MibGetInputData.MibIndex.RoutingTableIndex.Network[1],
|
|
MibGetInputData.MibIndex.RoutingTableIndex.Network[2],
|
|
MibGetInputData.MibIndex.RoutingTableIndex.Network[3]));
|
|
return MIB_S_NO_MORE_ENTRIES;
|
|
default:
|
|
*errorIndex = 0;
|
|
DbgTrace (DBG_DESTTABLE,
|
|
("MIPX-dest: Get request for network %.2x%.2x%.2x%.2x"
|
|
" failed with error %ld.\n",
|
|
MibGetInputData.MibIndex.RoutingTableIndex.Network[0],
|
|
MibGetInputData.MibIndex.RoutingTableIndex.Network[1],
|
|
MibGetInputData.MibIndex.RoutingTableIndex.Network[2],
|
|
MibGetInputData.MibIndex.RoutingTableIndex.Network[3], rc));
|
|
return MIB_S_ENTRY_NOT_FOUND;
|
|
}
|
|
#undef Rtb
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// mipxStaticRouteEntry table (1.3.6.1.4.1.311.1.8.3.2.1) //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
UINT
|
|
get_mipxStaticRouteEntry(
|
|
UINT actionId,
|
|
AsnAny * objectArray,
|
|
UINT * errorIndex
|
|
) {
|
|
#define Rtb ((buf_mipxStaticRouteEntry *)objectArray)
|
|
PIPX_ROUTE Rtp;
|
|
IPX_MIB_GET_INPUT_DATA MibGetInputData;
|
|
DWORD rc;
|
|
ULONG RtSize;
|
|
|
|
if (!EnsureRouterConnection()) {
|
|
*errorIndex = 0;
|
|
return MIB_S_ENTRY_NOT_FOUND;
|
|
}
|
|
|
|
MibGetInputData.TableId = IPX_STATIC_ROUTE_TABLE;
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.InterfaceIndex
|
|
= (ULONG)GetAsnInteger (&Rtb->mipxStaticRouteIfIndex, ZERO_INTERFACE_INDEX);
|
|
GetAsnOctetString (
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network,
|
|
&Rtb->mipxStaticRouteNetNum,
|
|
sizeof (MibGetInputData.MibIndex.StaticRoutesTableIndex.Network),
|
|
ZERO_NET_NUM);
|
|
|
|
switch (actionId) {
|
|
case MIB_ACTION_GET:
|
|
ASSERTMSG ("No index in GET request for table ",
|
|
Rtb->mipxStaticRouteIfIndex.asnType
|
|
&&Rtb->mipxStaticRouteNetNum.asnType);
|
|
rc = MprAdminMIBEntryGet(g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&MibGetInputData,
|
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
|
&Rtp,
|
|
&RtSize);
|
|
break;
|
|
case MIB_ACTION_GETNEXT:
|
|
if (Rtb->mipxStaticRouteIfIndex.asnType) {
|
|
if (!Rtb->mipxStaticRouteNetNum.asnType) {
|
|
rc = MprAdminMIBEntryGet(g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&MibGetInputData,
|
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
|
&Rtp,
|
|
&RtSize);
|
|
if (rc==NO_ERROR)
|
|
break;
|
|
}
|
|
|
|
rc = MprAdminMIBEntryGetNext(g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&MibGetInputData,
|
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
|
&Rtp,
|
|
&RtSize);
|
|
if (rc==NO_ERROR) {
|
|
if (Rtb->mipxStaticRouteNetNum.asnType) {
|
|
FreeAsnString (&Rtb->mipxStaticRouteNetNum);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
ASSERTMSG ("Second index is present but first is not ",
|
|
!Rtb->mipxStaticRouteNetNum.asnType);
|
|
rc = MprAdminMIBEntryGetFirst (g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&MibGetInputData,
|
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
|
&Rtp,
|
|
&RtSize);
|
|
}
|
|
break;
|
|
default:
|
|
DbgTrace (DBG_STATICROUTES,
|
|
("MIPX-staticRoutes: Get called with unsupported action code %d.\n",
|
|
actionId));
|
|
return MIB_S_INVALID_PARAMETER;
|
|
}
|
|
|
|
if (rc == NO_ERROR && Rtp == NULL)
|
|
{
|
|
rc = ERROR_CAN_NOT_COMPLETE;
|
|
}
|
|
|
|
switch (rc) {
|
|
case NO_ERROR:
|
|
DbgTrace (DBG_STATICROUTES,
|
|
("MIPX-staticRoutes: Get(%d) request succeded for net"
|
|
" %.2x%.2x%.2x%.2x -> %.2x%.2x%.2x%.2x on if %ld\n", actionId,
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[0],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[1],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[2],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[3],
|
|
Rtp->Network[0],
|
|
Rtp->Network[1],
|
|
Rtp->Network[2],
|
|
Rtp->Network[3],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.InterfaceIndex));
|
|
ForceAsnInteger (&Rtb->mipxStaticRouteIfIndex, Rtp->InterfaceIndex);
|
|
ForceAsnOctetString (&Rtb->mipxStaticRouteNetNum, Rtb->NetNumVal,
|
|
Rtp->Network, sizeof (Rtb->NetNumVal));
|
|
SetAsnInteger (&Rtb->mipxStaticRouteEntryStatus, MIPX_EXIST_STATE_CREATED);
|
|
SetAsnInteger (&Rtb->mipxStaticRouteTicks, Rtp->TickCount);
|
|
SetAsnInteger (&Rtb->mipxStaticRouteHopCount, Rtp->HopCount);
|
|
SetAsnOctetString (&Rtb->mipxStaticRouteNextHopMacAddress, Rtb->NextHopMacAddressVal,
|
|
Rtp->NextHopMacAddress, sizeof (Rtb->NextHopMacAddressVal));
|
|
MprAdminMIBBufferFree (Rtp);
|
|
return MIB_S_SUCCESS;
|
|
case ERROR_NO_MORE_ITEMS:
|
|
ASSERTMSG ("ERROR_NO_MORE_ITEMS returned, but request is not GETNEXT ",
|
|
actionId==MIB_ACTION_GETNEXT);
|
|
DbgTrace (DBG_STATICROUTES,
|
|
("MIPX-staticRoutes: End of table reached on GETFIRST/GETNEXT request for network"
|
|
" %.2x%.2x%.2x%.2x on if %ld.\n",
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[0],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[1],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[2],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[3],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.InterfaceIndex));
|
|
return MIB_S_NO_MORE_ENTRIES;
|
|
default:
|
|
*errorIndex = 0;
|
|
DbgTrace (DBG_STATICROUTES,
|
|
("MIPX-staticRoutes: Get request for network %.2x%.2x%.2x%.2x."
|
|
" on if %ld failed with error %ld.\n",
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[0],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[1],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[2],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[3],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.InterfaceIndex, rc));
|
|
return MIB_S_ENTRY_NOT_FOUND;
|
|
}
|
|
#undef Rtb
|
|
}
|
|
|
|
UINT
|
|
set_mipxStaticRouteEntry(
|
|
UINT actionId,
|
|
AsnAny * objectArray,
|
|
UINT * errorIndex
|
|
) {
|
|
#define Rtb ((sav_mipxStaticRouteEntry *)objectArray)
|
|
PIPX_ROUTE Rtp;
|
|
IPX_MIB_GET_INPUT_DATA MibGetInputData;
|
|
DWORD rc;
|
|
ULONG RtSize;
|
|
|
|
if (!EnsureRouterConnection()) {
|
|
*errorIndex = 0;
|
|
return MIB_S_ENTRY_NOT_FOUND;
|
|
}
|
|
switch (actionId) {
|
|
case MIB_ACTION_VALIDATE:
|
|
ASSERTMSG ("No index in VALIDATE request for table ",
|
|
Rtb->mipxStaticRouteIfIndex.asnType&&Rtb->mipxStaticRouteIfIndex.asnType);
|
|
MibGetInputData.TableId = IPX_STATIC_ROUTE_TABLE;
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.InterfaceIndex
|
|
= (ULONG)GetAsnInteger (&Rtb->mipxStaticRouteIfIndex,INVALID_INTERFACE_INDEX);
|
|
GetAsnOctetString (
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network,
|
|
&Rtb->mipxStaticRouteNetNum,
|
|
sizeof (MibGetInputData.MibIndex.StaticRoutesTableIndex.Network),
|
|
ZERO_NET_NUM);
|
|
Rtb->ActionFlag
|
|
= (BOOLEAN)GetAsnInteger (&Rtb->mipxStaticRouteEntryStatus,
|
|
MIPX_EXIST_STATE_NOACTION);
|
|
rc = MprAdminMIBEntryGet(g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&MibGetInputData,
|
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
|
&Rtp,
|
|
&RtSize);
|
|
if (rc == NO_ERROR && Rtp == NULL)
|
|
{
|
|
rc = ERROR_CAN_NOT_COMPLETE;
|
|
}
|
|
if (rc==NO_ERROR) {
|
|
Rtb->MibSetInputData.MibRow.Route = *Rtp;
|
|
if (Rtb->ActionFlag == MIPX_EXIST_STATE_CREATED)
|
|
Rtb->ActionFlag = MIPX_EXIST_STATE_NOACTION;
|
|
MprAdminMIBBufferFree (Rtp);
|
|
DbgTrace (DBG_STATICROUTES,
|
|
("MIPX-static routes: Validated"
|
|
" network %.2x.2x.2x.2x on if %ld\n",
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[0],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[1],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[2],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[3],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.InterfaceIndex));
|
|
}
|
|
else if (Rtb->ActionFlag == MIPX_EXIST_STATE_CREATED) {
|
|
DbgTrace (DBG_STATICROUTES,
|
|
("MIPX-static routes: Prepared to add"
|
|
" network %.2x.2x.2x.2x on if %ld\n",
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[0],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[1],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[2],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[3],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.InterfaceIndex));
|
|
Rtb->MibSetInputData.MibRow.Route.InterfaceIndex
|
|
= (ULONG)GetAsnInteger (&Rtb->mipxStaticRouteIfIndex,
|
|
INVALID_INTERFACE_INDEX);
|
|
GetAsnOctetString (Rtb->MibSetInputData.MibRow.Route.Network,
|
|
&Rtb->mipxStaticRouteNetNum,
|
|
sizeof (Rtb->MibSetInputData.MibRow.Route.Network),
|
|
ZERO_NET_NUM);
|
|
Rtb->MibSetInputData.MibRow.Route.Protocol = IPX_PROTOCOL_STATIC;
|
|
Rtb->MibSetInputData.MibRow.Route.Flags = 0;
|
|
Rtb->MibSetInputData.MibRow.Route.TickCount = MAXSHORT;
|
|
Rtb->MibSetInputData.MibRow.Route.HopCount = 15;
|
|
memset (Rtb->MibSetInputData.MibRow.Route.NextHopMacAddress,
|
|
0xFF,
|
|
sizeof (Rtb->MibSetInputData.MibRow.Route.NextHopMacAddress));
|
|
}
|
|
else {
|
|
DbgTrace (DBG_STATICROUTES,
|
|
("MIPX-static routes: Validate failed"
|
|
" for network %.2x.2x.2x.2x on if %ld with error %ld\n",
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[0],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[1],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[2],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network[3],
|
|
MibGetInputData.MibIndex.StaticRoutesTableIndex.InterfaceIndex,rc));
|
|
return MIB_S_ENTRY_NOT_FOUND;
|
|
}
|
|
Rtb->MibSetInputData.MibRow.Route.TickCount
|
|
= (USHORT)GetAsnInteger (&Rtb->mipxStaticRouteTicks,
|
|
Rtb->MibSetInputData.MibRow.Route.TickCount);
|
|
Rtb->MibSetInputData.MibRow.Route.HopCount
|
|
= (USHORT)GetAsnInteger (&Rtb->mipxStaticRouteHopCount,
|
|
Rtb->MibSetInputData.MibRow.Route.HopCount);
|
|
GetAsnOctetString (Rtb->MibSetInputData.MibRow.Route.NextHopMacAddress,
|
|
&Rtb->mipxStaticRouteNextHopMacAddress,
|
|
sizeof (Rtb->MibSetInputData.MibRow.Route.NextHopMacAddress),
|
|
NULL);
|
|
return MIB_S_SUCCESS;
|
|
case MIB_ACTION_SET:
|
|
switch (Rtb->ActionFlag) {
|
|
case MIPX_EXIST_STATE_NOACTION:
|
|
rc = MprAdminMIBEntrySet (g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&Rtb->MibSetInputData,
|
|
sizeof(IPX_MIB_SET_INPUT_DATA));
|
|
break;
|
|
case MIPX_EXIST_STATE_DELETED:
|
|
rc = MprAdminMIBEntryDelete (g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&Rtb->MibSetInputData,
|
|
sizeof(IPX_MIB_SET_INPUT_DATA));
|
|
break;
|
|
case MIPX_EXIST_STATE_CREATED:
|
|
rc = MprAdminMIBEntryCreate (g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&Rtb->MibSetInputData,
|
|
sizeof(IPX_MIB_SET_INPUT_DATA));
|
|
break;
|
|
}
|
|
if (rc==NO_ERROR) {
|
|
DbgTrace (DBG_STATICROUTES,
|
|
("MIPX-static routes: Set succeded for"
|
|
" network %.2x.2x.2x.2x on if %ld\n",
|
|
Rtb->MibSetInputData.MibRow.Route.Network[0],
|
|
Rtb->MibSetInputData.MibRow.Route.Network[1],
|
|
Rtb->MibSetInputData.MibRow.Route.Network[2],
|
|
Rtb->MibSetInputData.MibRow.Route.Network[3],
|
|
Rtb->MibSetInputData.MibRow.Route.InterfaceIndex));
|
|
return MIB_S_SUCCESS;
|
|
}
|
|
else {
|
|
DbgTrace (DBG_STATICROUTES,
|
|
("MIPX-static routes: Set failed for"
|
|
" network %.2x.2x.2x.2x on if %ld with error %ld\n",
|
|
Rtb->MibSetInputData.MibRow.Route.Network[0],
|
|
Rtb->MibSetInputData.MibRow.Route.Network[1],
|
|
Rtb->MibSetInputData.MibRow.Route.Network[2],
|
|
Rtb->MibSetInputData.MibRow.Route.Network[3],
|
|
Rtb->MibSetInputData.MibRow.Route.InterfaceIndex, rc));
|
|
return MIB_S_ENTRY_NOT_FOUND;
|
|
}
|
|
|
|
case MIB_ACTION_CLEANUP:
|
|
return MIB_S_SUCCESS;
|
|
default:
|
|
DbgTrace (DBG_STATICROUTES,
|
|
("MIPX-static routes: Set called with unsupported action code %d.\n",
|
|
actionId));
|
|
return MIB_S_INVALID_PARAMETER;
|
|
}
|
|
#undef Rtb
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// mipxServices group (1.3.6.1.4.1.311.1.8.4) //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// mipxServEntry table (1.3.6.1.4.1.311.1.8.4.1.1) //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
UINT
|
|
get_mipxServEntry(
|
|
UINT actionId,
|
|
AsnAny * objectArray,
|
|
UINT * errorIndex
|
|
) {
|
|
#define Svb ((buf_mipxServEntry *)objectArray)
|
|
PIPX_SERVICE Svp, SvpCur;
|
|
IPX_MIB_GET_INPUT_DATA MibGetInputData;
|
|
DWORD rc;
|
|
ULONG SvSize;
|
|
INT lenPrev, lenNext, lenCur;
|
|
|
|
if (!EnsureRouterConnection()) {
|
|
*errorIndex = 0;
|
|
return MIB_S_ENTRY_NOT_FOUND;
|
|
}
|
|
|
|
MibGetInputData.TableId = IPX_SERV_TABLE;
|
|
MibGetInputData.MibIndex.ServicesTableIndex.ServiceType
|
|
= GetAsnServType (&Svb->mipxServType, ZERO_SERVER_TYPE);
|
|
GetAsnDispString (MibGetInputData.MibIndex.ServicesTableIndex.ServiceName,
|
|
&Svb->mipxServName, ZERO_SERVER_NAME);
|
|
|
|
switch (actionId) {
|
|
case MIB_ACTION_GET:
|
|
ASSERTMSG ("No index in GET request for table ",
|
|
Svb->mipxServType.asnType && Svb->mipxServName.asnType);
|
|
|
|
rc = MprAdminMIBEntryGet(g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&MibGetInputData,
|
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
|
&Svp,
|
|
&SvSize);
|
|
break;
|
|
case MIB_ACTION_GETNEXT:
|
|
if (Svb->mipxServType.asnType) {
|
|
if (!Svb->mipxServName.asnType) {
|
|
rc = MprAdminMIBEntryGet(g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&MibGetInputData,
|
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
|
&Svp,
|
|
&SvSize);
|
|
if (rc==NO_ERROR) {
|
|
FreeAsnString (&Svb->mipxServType);
|
|
break;
|
|
}
|
|
}
|
|
rc = MprAdminMIBEntryGetNext(g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&MibGetInputData,
|
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
|
&Svp,
|
|
&SvSize);
|
|
if (rc==NO_ERROR) {
|
|
FreeAsnString (&Svb->mipxServType);
|
|
if (Svb->mipxServName.asnType) {
|
|
FreeAsnString (&Svb->mipxServName);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
ASSERTMSG ("Second index is present but first is not ",
|
|
!Svb->mipxServName.asnType);
|
|
rc = MprAdminMIBEntryGetFirst(g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&MibGetInputData,
|
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
|
&Svp,
|
|
&SvSize);
|
|
}
|
|
break;
|
|
default:
|
|
DbgTrace (DBG_SERVERTABLE,
|
|
("MIPX-servers: Get called with unsupported action code %d.\n",
|
|
actionId));
|
|
return MIB_S_INVALID_PARAMETER;
|
|
}
|
|
switch (rc) {
|
|
case NO_ERROR:
|
|
DbgTrace (DBG_SERVERTABLE,
|
|
("MIPX-servers: Get(%d) request succeded for service"
|
|
" %.4x-%.48s -> %.4x-%.48s.\n", actionId,
|
|
MibGetInputData.MibIndex.ServicesTableIndex.ServiceType,
|
|
MibGetInputData.MibIndex.ServicesTableIndex.ServiceName,
|
|
Svp->Server.Type, Svp->Server.Name));
|
|
ForceAsnServType (&Svb->mipxServType, Svb->TypeVal, Svp->Server.Type);
|
|
ForceAsnDispString (&Svb->mipxServName, Svb->NameVal,
|
|
Svp->Server.Name, sizeof (Svb->NameVal));
|
|
switch (Svp->Protocol) {
|
|
case IPX_PROTOCOL_LOCAL:
|
|
SetAsnInteger (&Svb->mipxServProtocol, 2);
|
|
break;
|
|
case IPX_PROTOCOL_STATIC:
|
|
SetAsnInteger (&Svb->mipxServProtocol, 5);
|
|
break;
|
|
case IPX_PROTOCOL_SAP:
|
|
SetAsnInteger (&Svb->mipxServProtocol, 6);
|
|
break;
|
|
case IPX_PROTOCOL_NLSP:
|
|
SetAsnInteger (&Svb->mipxServProtocol, 4);
|
|
break;
|
|
default:
|
|
SetAsnInteger (&Svb->mipxServProtocol, 1); // other
|
|
break;
|
|
}
|
|
SetAsnInteger (&Svb->mipxServProtocol, Svp->Protocol);
|
|
SetAsnOctetString (&Svb->mipxServNetNum, Svb->NetNumVal,
|
|
Svp->Server.Network, sizeof (Svb->NetNumVal));
|
|
SetAsnOctetString (&Svb->mipxServNode, Svb->NodeVal,
|
|
Svp->Server.Node, sizeof (Svb->NodeVal));
|
|
SetAsnOctetString (&Svb->mipxServSocket, Svb->SocketVal,
|
|
Svp->Server.Socket, sizeof (Svb->SocketVal));
|
|
SetAsnInteger (&Svb->mipxServHopCount, Svp->Server.HopCount);
|
|
MprAdminMIBBufferFree (Svp);
|
|
return MIB_S_SUCCESS;
|
|
case ERROR_NO_MORE_ITEMS:
|
|
ASSERTMSG ("ERROR_NO_MORE_ITEMS returned, but request is not GETNEXT ",
|
|
actionId==MIB_ACTION_GETNEXT);
|
|
DbgTrace (DBG_SERVERTABLE,
|
|
("MIPX-servers: End of table reached on GETFIRST/GETNEXT request"
|
|
" for service %.4x-%.48s.\n",
|
|
MibGetInputData.MibIndex.ServicesTableIndex.ServiceType,
|
|
MibGetInputData.MibIndex.ServicesTableIndex.ServiceName));
|
|
return MIB_S_NO_MORE_ENTRIES;
|
|
default:
|
|
*errorIndex = 0;
|
|
DbgTrace (DBG_SERVERTABLE,
|
|
("MIPX-servers: Get request for service %.4x-%.48s"
|
|
" failed with error %ld.\n",
|
|
MibGetInputData.MibIndex.ServicesTableIndex.ServiceType,
|
|
MibGetInputData.MibIndex.ServicesTableIndex.ServiceName, rc));
|
|
return MIB_S_ENTRY_NOT_FOUND;
|
|
}
|
|
#undef Svb
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// mipxStaticServEntry table (1.3.6.1.4.1.311.1.8.4.2.1) //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
UINT
|
|
get_mipxStaticServEntry(
|
|
UINT actionId,
|
|
AsnAny * objectArray,
|
|
UINT * errorIndex
|
|
) {
|
|
#define Svb ((buf_mipxStaticServEntry *)objectArray)
|
|
PIPX_SERVICE Svp;
|
|
IPX_MIB_GET_INPUT_DATA MibGetInputData;
|
|
DWORD rc;
|
|
ULONG SvSize;
|
|
|
|
if (!EnsureRouterConnection()) {
|
|
*errorIndex = 0;
|
|
return MIB_S_ENTRY_NOT_FOUND;
|
|
}
|
|
|
|
MibGetInputData.TableId = IPX_STATIC_SERV_TABLE;
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.InterfaceIndex
|
|
= (ULONG)GetAsnInteger (&Svb->mipxStaticServIfIndex,
|
|
ZERO_INTERFACE_INDEX);
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceType
|
|
= GetAsnServType (&Svb->mipxStaticServType, ZERO_SERVER_TYPE);
|
|
GetAsnDispString (
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceName,
|
|
&Svb->mipxStaticServName, ZERO_SERVER_NAME);
|
|
|
|
switch (actionId) {
|
|
case MIB_ACTION_GET:
|
|
ASSERTMSG ("No index in GET request for table ",
|
|
Svb->mipxStaticServIfIndex.asnType
|
|
&&Svb->mipxStaticServType.asnType
|
|
&&Svb->mipxStaticServName.asnType);
|
|
rc = MprAdminMIBEntryGet(g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&MibGetInputData,
|
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
|
&Svp,
|
|
&SvSize);
|
|
break;
|
|
case MIB_ACTION_GETNEXT:
|
|
if (Svb->mipxStaticServIfIndex.asnType) {
|
|
if (!Svb->mipxStaticServType.asnType
|
|
|| !Svb->mipxStaticServName.asnType) {
|
|
rc = MprAdminMIBEntryGet(g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&MibGetInputData,
|
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
|
&Svp,
|
|
&SvSize);
|
|
if (rc==NO_ERROR) {
|
|
if (Svb->mipxStaticServType.asnType) {
|
|
FreeAsnString (&Svb->mipxStaticServType);
|
|
}
|
|
if (Svb->mipxStaticServName.asnType) {
|
|
FreeAsnString (&Svb->mipxStaticServName);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
rc = MprAdminMIBEntryGetNext(g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&MibGetInputData,
|
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
|
&Svp,
|
|
&SvSize);
|
|
if (rc==NO_ERROR) {
|
|
if (Svb->mipxStaticServType.asnType) {
|
|
FreeAsnString (&Svb->mipxStaticServType);
|
|
}
|
|
if (Svb->mipxStaticServName.asnType) {
|
|
FreeAsnString (&Svb->mipxStaticServName);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
ASSERTMSG ("Second or third indeces present but first is not ",
|
|
!Svb->mipxStaticServType.asnType
|
|
&&!Svb->mipxStaticServName.asnType);
|
|
rc = MprAdminMIBEntryGetFirst (g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&MibGetInputData,
|
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
|
&Svp,
|
|
&SvSize);
|
|
}
|
|
break;
|
|
default:
|
|
DbgTrace (DBG_STATICSERVERS,
|
|
("MIPX-static servers: Get called with unsupported action code %d.\n",
|
|
actionId));
|
|
return MIB_S_INVALID_PARAMETER;
|
|
}
|
|
|
|
if (rc == NO_ERROR && Svp == NULL)
|
|
{
|
|
rc = ERROR_CAN_NOT_COMPLETE;
|
|
}
|
|
|
|
switch (rc) {
|
|
case NO_ERROR:
|
|
DbgTrace (DBG_STATICSERVERS,
|
|
("MIPX-static servers: Get (%d) request succeded for service"
|
|
" %.4x-%.48s -> %.4x-%.48s on if %ld.\n", actionId,
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceType,
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceName,
|
|
Svp->Server.Type, Svp->Server.Name,
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.InterfaceIndex));
|
|
ForceAsnInteger (&Svb->mipxStaticServIfIndex, Svp->InterfaceIndex);
|
|
ForceAsnServType (&Svb->mipxStaticServType, Svb->TypeVal, Svp->Server.Type);
|
|
ForceAsnDispString (&Svb->mipxStaticServName, Svb->NameVal,
|
|
Svp->Server.Name, sizeof (Svb->NameVal));
|
|
SetAsnInteger (&Svb->mipxStaticServEntryStatus, MIPX_EXIST_STATE_CREATED);
|
|
SetAsnOctetString (&Svb->mipxStaticServNetNum, Svb->NetNumVal,
|
|
Svp->Server.Network, sizeof (Svb->NetNumVal));
|
|
SetAsnOctetString (&Svb->mipxStaticServNode, Svb->NodeVal,
|
|
Svp->Server.Node, sizeof (Svb->NodeVal));
|
|
SetAsnOctetString (&Svb->mipxStaticServSocket, Svb->SocketVal,
|
|
Svp->Server.Socket, sizeof (Svb->SocketVal));
|
|
SetAsnInteger (&Svb->mipxStaticServHopCount, Svp->Server.HopCount);
|
|
MprAdminMIBBufferFree (Svp);
|
|
return MIB_S_SUCCESS;
|
|
case ERROR_NO_MORE_ITEMS:
|
|
ASSERTMSG ("ERROR_NO_MORE_ITEMS returned, but request is not GETNEXT ",
|
|
actionId==MIB_ACTION_GETNEXT);
|
|
DbgTrace (DBG_STATICSERVERS,
|
|
("MIPX-static servers: End of table reached on GETFIRST/GETNEXT request"
|
|
" for service %.4x-%.48s on if %ld.\n",
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceType,
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceName,
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.InterfaceIndex));
|
|
return MIB_S_NO_MORE_ENTRIES;
|
|
default:
|
|
*errorIndex = 0;
|
|
DbgTrace (DBG_STATICSERVERS,
|
|
("MIPX-static servers: Get request for service %.4x-%.48s"
|
|
" on if %ld failed with error %ld.\n",
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceType,
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceName,
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.InterfaceIndex,
|
|
rc));
|
|
return MIB_S_ENTRY_NOT_FOUND;
|
|
}
|
|
#undef Svb
|
|
}
|
|
|
|
UINT
|
|
set_mipxStaticServEntry(
|
|
UINT actionId,
|
|
AsnAny * objectArray,
|
|
UINT * errorIndex
|
|
) {
|
|
#define Svb ((sav_mipxStaticServEntry *)objectArray)
|
|
PIPX_SERVICE Svp;
|
|
IPX_MIB_GET_INPUT_DATA MibGetInputData;
|
|
DWORD rc;
|
|
ULONG SvSize;
|
|
|
|
if (!EnsureRouterConnection()) {
|
|
*errorIndex = 0;
|
|
return MIB_S_ENTRY_NOT_FOUND;
|
|
}
|
|
switch (actionId) {
|
|
case MIB_ACTION_VALIDATE:
|
|
ASSERTMSG ("No index in VALIDATE request for table ",
|
|
Svb->mipxStaticServIfIndex.asnType
|
|
&&Svb->mipxStaticServType.asnType
|
|
&&Svb->mipxStaticServName.asnType);
|
|
MibGetInputData.TableId = IPX_STATIC_SERV_TABLE;
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.InterfaceIndex
|
|
= (ULONG)GetAsnInteger (&Svb->mipxStaticServIfIndex,
|
|
INVALID_INTERFACE_INDEX);
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceType
|
|
= GetAsnServType (&Svb->mipxStaticServType, INVALID_SERVER_TYPE);
|
|
GetAsnDispString (
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceName,
|
|
&Svb->mipxStaticServName,
|
|
INVALID_SERVER_NAME);
|
|
Svb->ActionFlag
|
|
= (BOOLEAN)GetAsnInteger (&Svb->mipxStaticServEntryStatus,
|
|
MIPX_EXIST_STATE_NOACTION);
|
|
rc = MprAdminMIBEntryGet(g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&MibGetInputData,
|
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
|
&Svp,
|
|
&SvSize);
|
|
if (rc == NO_ERROR && Svp == NULL)
|
|
{
|
|
return MIB_S_ENTRY_NOT_FOUND;
|
|
}
|
|
|
|
if (rc==NO_ERROR) {
|
|
Svb->MibSetInputData.MibRow.Service = *Svp;
|
|
if (Svb->ActionFlag == MIPX_EXIST_STATE_CREATED)
|
|
Svb->ActionFlag = MIPX_EXIST_STATE_NOACTION;
|
|
MprAdminMIBBufferFree (Svp);
|
|
DbgTrace (DBG_STATICSERVERS,
|
|
("MIPX-static servers: Validated"
|
|
" service %.4x-%.48s on if %ld.\n",
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceType,
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceName,
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.InterfaceIndex));
|
|
}
|
|
else if (Svb->ActionFlag == MIPX_EXIST_STATE_CREATED) {
|
|
DbgTrace (DBG_STATICSERVERS,
|
|
("MIPX-static servers: Prepared to add"
|
|
" service %.4x-%.48s on if %ld.\n",
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceType,
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceName,
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.InterfaceIndex));
|
|
Svb->MibSetInputData.MibRow.Service.InterfaceIndex
|
|
= (ULONG) GetAsnInteger (&Svb->mipxStaticServIfIndex,
|
|
INVALID_INTERFACE_INDEX);
|
|
Svb->MibSetInputData.MibRow.Service.Protocol = IPX_PROTOCOL_STATIC;
|
|
Svb->MibSetInputData.MibRow.Service.Server.Type
|
|
= GetAsnServType (&Svb->mipxStaticServType,
|
|
INVALID_SERVER_TYPE);
|
|
GetAsnDispString (
|
|
Svb->MibSetInputData.MibRow.Service.Server.Name,
|
|
&Svb->mipxStaticServName,
|
|
INVALID_SERVER_NAME);
|
|
memset (Svb->MibSetInputData.MibRow.Service.Server.Network, 0,
|
|
sizeof (Svb->MibSetInputData.MibRow.Service.Server.Network));
|
|
memset (Svb->MibSetInputData.MibRow.Service.Server.Node, 0,
|
|
sizeof (Svb->MibSetInputData.MibRow.Service.Server.Node));
|
|
memset (Svb->MibSetInputData.MibRow.Service.Server.Socket, 0,
|
|
sizeof (Svb->MibSetInputData.MibRow.Service.Server.Socket));
|
|
Svb->MibSetInputData.MibRow.Service.Server.HopCount = 15;
|
|
}
|
|
else {
|
|
DbgTrace (DBG_STATICSERVERS,
|
|
("MIPX-static servers: Validate failed"
|
|
" for service %.4x-%.48s on if %ld with error %ld.\n",
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceType,
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceName,
|
|
MibGetInputData.MibIndex.StaticServicesTableIndex.InterfaceIndex,
|
|
rc));
|
|
return MIB_S_ENTRY_NOT_FOUND;
|
|
}
|
|
GetAsnOctetString (Svb->MibSetInputData.MibRow.Service.Server.Network,
|
|
&Svb->mipxStaticServNetNum,
|
|
sizeof (Svb->MibSetInputData.MibRow.Service.Server.Network),
|
|
NULL);
|
|
GetAsnOctetString (Svb->MibSetInputData.MibRow.Service.Server.Node,
|
|
&Svb->mipxStaticServNode,
|
|
sizeof (Svb->MibSetInputData.MibRow.Service.Server.Node),
|
|
NULL);
|
|
GetAsnOctetString (Svb->MibSetInputData.MibRow.Service.Server.Socket,
|
|
&Svb->mipxStaticServSocket,
|
|
sizeof (Svb->MibSetInputData.MibRow.Service.Server.Socket),
|
|
NULL);
|
|
Svb->MibSetInputData.MibRow.Service.Server.HopCount =
|
|
(USHORT)GetAsnInteger (&Svb->mipxStaticServHopCount,
|
|
Svb->MibSetInputData.MibRow.Service.Server.HopCount);
|
|
return MIB_S_SUCCESS;
|
|
case MIB_ACTION_SET:
|
|
switch (Svb->ActionFlag) {
|
|
case MIPX_EXIST_STATE_NOACTION:
|
|
rc = MprAdminMIBEntrySet (g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&Svb->MibSetInputData,
|
|
sizeof(IPX_MIB_SET_INPUT_DATA));
|
|
break;
|
|
case MIPX_EXIST_STATE_DELETED:
|
|
rc = MprAdminMIBEntryDelete (g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&Svb->MibSetInputData,
|
|
sizeof(IPX_MIB_SET_INPUT_DATA));
|
|
break;
|
|
case MIPX_EXIST_STATE_CREATED:
|
|
rc = MprAdminMIBEntryCreate (g_MibServerHandle,
|
|
PID_IPX,
|
|
IPX_PROTOCOL_BASE,
|
|
&Svb->MibSetInputData,
|
|
sizeof(IPX_MIB_SET_INPUT_DATA));
|
|
break;
|
|
}
|
|
|
|
if (rc==NO_ERROR) {
|
|
DbgTrace (DBG_STATICSERVERS,
|
|
("MIPX-static servers: Set succeded"
|
|
" for service %.4x-%.48s on if %ld.\n",
|
|
Svb->MibSetInputData.MibRow.Service.Server.Type,
|
|
Svb->MibSetInputData.MibRow.Service.Server.Name,
|
|
Svb->MibSetInputData.MibRow.Service.InterfaceIndex));
|
|
return MIB_S_SUCCESS;
|
|
}
|
|
else {
|
|
DbgTrace (DBG_STATICSERVERS,
|
|
("MIPX-static servers: Set failed for"
|
|
" for service %.4x-%.48s on if %ld with error %ld.\n",
|
|
Svb->MibSetInputData.MibRow.Service.Server.Type,
|
|
Svb->MibSetInputData.MibRow.Service.Server.Name,
|
|
Svb->MibSetInputData.MibRow.Service.InterfaceIndex,
|
|
rc));
|
|
return MIB_S_ENTRY_NOT_FOUND;
|
|
}
|
|
|
|
case MIB_ACTION_CLEANUP:
|
|
return MIB_S_SUCCESS;
|
|
default:
|
|
DbgTrace (DBG_STATICSERVERS,
|
|
("MIPX-static servers: Set called with unsupported action code %d.\n",
|
|
actionId));
|
|
return MIB_S_INVALID_PARAMETER;
|
|
}
|
|
#undef Svb
|
|
}
|