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

1523 lines
53 KiB
C

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
nipxf.c
Abstract:
Novell-ipx instrumentation callbacks.
Author:
Vadim Eydelman (vadime) 30-May-1996
Revision History:
--*/
#include "precomp.h"
///////////////////////////////////////////////////////////////////////////////
// //
// nipxSystem group (1.3.6.1.4.1.23.2.5.1) //
// //
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// //
// nipxBasicSysEntry table (1.3.6.1.4.1.23.2.5.1.1.1) //
// //
///////////////////////////////////////////////////////////////////////////////
UINT
get_nipxBasicSysEntry(
UINT actionId,
AsnAny * objectArray,
UINT * errorIndex
) {
#define Bseb ((buf_nipxBasicSysEntry *)objectArray)
IPX_MIB_GET_INPUT_DATA MibGetInputData;
PIPXMIB_BASE Bep;
DWORD rc;
ULONG BeSize;
if (!EnsureRouterConnection()) {
*errorIndex = 0;
return MIB_S_ENTRY_NOT_FOUND;
}
if (GetAsnInteger (&Bseb->nipxBasicSysInstance,NIPX_DEFAULT_SYS_INSTANCE)!=NIPX_DEFAULT_SYS_INSTANCE) {
*errorIndex = 0;
DbgTrace (DBG_NIPXBASICSYSENTRY, ("NIPX-BSE: ipxBasicSysInstance is not 0.\n"));
return MIB_S_ENTRY_NOT_FOUND;
}
switch (actionId) {
case MIB_ACTION_GETNEXT:
if (!Bseb->nipxBasicSysInstance.asnType) {
ForceAsnInteger (&Bseb->nipxBasicSysInstance, NIPX_DEFAULT_SYS_INSTANCE);
rc = MIB_S_SUCCESS;
}
else {
DbgTrace (DBG_NIPXBASICSYSENTRY,
("NIPX-BSE: End of table reached on GETFIRST/GETNEXT request for instance %ld.\n",
GetAsnInteger (&Bseb->nipxBasicSysInstance,NIPX_INVALID_SYS_INSTANCE)));
rc = MIB_S_NO_MORE_ENTRIES;
break;
}
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) {
SetAsnInteger (&Bseb->nipxBasicSysExistState, NIPX_STATE_ON);
SetAsnOctetString (&Bseb->nipxBasicSysNetNumber, Bseb->NetNumberVal,
Bep->PrimaryNetNumber, sizeof (Bseb->NetNumberVal));
SetAsnOctetString (&Bseb->nipxBasicSysNode, Bseb->NodeVal,
Bep->Node, sizeof (Bseb->NodeVal));
SetAsnDispString (&Bseb->nipxBasicSysName, Bseb->NameVal,
Bep->SysName, sizeof (Bseb->NameVal));
SetAsnCounter (&Bseb->nipxBasicSysInReceives, 0);
SetAsnCounter (&Bseb->nipxBasicSysInHdrErrors, 0);
SetAsnCounter (&Bseb->nipxBasicSysInUnknownSockets, 0);
SetAsnCounter (&Bseb->nipxBasicSysInDiscards, 0);
SetAsnCounter (&Bseb->nipxBasicSysInBadChecksums, 0);
SetAsnCounter (&Bseb->nipxBasicSysInDelivers, 0);
SetAsnCounter (&Bseb->nipxBasicSysNoRoutes, 0);
SetAsnCounter (&Bseb->nipxBasicSysOutRequests, 0);
SetAsnCounter (&Bseb->nipxBasicSysOutMalformedRequests, 0);
SetAsnCounter (&Bseb->nipxBasicSysOutDiscards, 0);
SetAsnCounter (&Bseb->nipxBasicSysOutPackets, 0);
SetAsnCounter (&Bseb->nipxBasicSysConfigSockets, 0);
SetAsnCounter (&Bseb->nipxBasicSysOpenSocketFails, 0);
MprAdminMIBBufferFree (Bep);
DbgTrace (DBG_NIPXBASICSYSENTRY, ("NIPX-BSE: Get request succeded.\n"));
rc = MIB_S_SUCCESS;
}
else {
//
// pmay. Added this so mib walk wouldn't fail with
// GENERR.
//
rc = MIB_S_NO_MORE_ENTRIES;
}
break;
default:
DbgTrace (DBG_NIPXBASICSYSENTRY,
("NIPX-BSE: Get called with unsupported action code %d.\n",
actionId));
rc = MIB_S_INVALID_PARAMETER;
break;
}
return rc;
#undef Bseb
}
/*
All values in nipxBasicSysEntry are implemented as read-only
UINT
set_nipxBasicSysEntry(
UINT actionId,
AsnAny * objectArray,
UINT * errorIndex
) {
return MIB_S_ENTRY_NOT_FOUND;
}
*/
///////////////////////////////////////////////////////////////////////////////
// //
// nipxAdvSysEntry table (1.3.6.1.4.1.23.2.5.1.2.1) //
// //
///////////////////////////////////////////////////////////////////////////////
UINT
get_nipxAdvSysEntry(
UINT actionId,
AsnAny * objectArray,
UINT * errorIndex
) {
#define Aseb ((buf_nipxAdvSysEntry *)objectArray)
IPX_MIB_GET_INPUT_DATA MibGetInputData;
PIPXMIB_BASE Bep;
DWORD rc;
ULONG BeSize;
if (!EnsureRouterConnection()) {
*errorIndex = 0;
return MIB_S_ENTRY_NOT_FOUND;
}
if (GetAsnInteger (&Aseb->nipxAdvSysInstance,NIPX_DEFAULT_SYS_INSTANCE)!=NIPX_DEFAULT_SYS_INSTANCE) {
*errorIndex = 0;
DbgTrace (DBG_NIPXADVSYSENTRY, ("NIPX-ASE: nipxAdvSysInstance is not 0.\n"));
return MIB_S_ENTRY_NOT_FOUND;
}
switch (actionId) {
case MIB_ACTION_GETNEXT:
if (!Aseb->nipxAdvSysInstance.asnType) {
ForceAsnInteger (&Aseb->nipxAdvSysInstance, NIPX_DEFAULT_SYS_INSTANCE);
}
else {
DbgTrace (DBG_NIPXADVSYSENTRY,
("NIPX-ASE: End of table reached on GETFIRST/GETNEXT request for instance %ld.\n",
GetAsnInteger (&Aseb->nipxAdvSysInstance,NIPX_INVALID_SYS_INSTANCE)));
rc = MIB_S_NO_MORE_ENTRIES;
break;
}
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) {
SetAsnInteger (&Aseb->nipxAdvSysMaxPathSplits, Bep->MaxPathSplits);
SetAsnInteger (&Aseb->nipxAdvSysMaxHops, 16);
SetAsnCounter (&Aseb->nipxAdvSysInTooManyHops, 0);
SetAsnCounter (&Aseb->nipxAdvSysInFiltered, 0);
SetAsnCounter (&Aseb->nipxAdvSysInCompressDiscards, 0);
SetAsnCounter (&Aseb->nipxAdvSysNETBIOSPackets, 0);
SetAsnCounter (&Aseb->nipxAdvSysForwPackets, 0);
SetAsnCounter (&Aseb->nipxAdvSysOutFiltered, 0);
SetAsnCounter (&Aseb->nipxAdvSysOutCompressDiscards, 0);
SetAsnCounter (&Aseb->nipxAdvSysCircCount, Bep->IfCount);
SetAsnCounter (&Aseb->nipxAdvSysDestCount, Bep->DestCount);
SetAsnCounter (&Aseb->nipxAdvSysServCount, Bep->ServCount);
MprAdminMIBBufferFree (Bep);
DbgTrace (DBG_NIPXADVSYSENTRY, ("NIPX-ASE: Get request succeded.\n"));
}
else {
//
// pmay. Added this so mib walk wouldn't fail with
// GENERR.
//
rc = MIB_S_NO_MORE_ENTRIES;
}
break;
default:
DbgTrace (DBG_NIPXADVSYSENTRY,
("NIPX-ASE: Get called with unsupported action code %d.\n",
actionId));
rc = MIB_S_INVALID_PARAMETER;
break;
}
return rc;
#undef Aseb
}
/*
All values in nipxAdvSysEntry are implemented as read-only
UINT
set_nipxAdvSysEntry(
UINT actionId,
AsnAny * objectArray,
UINT * errorIndex
) {
return MIB_S_ENTRY_NOT_FOUND;
}
*/
///////////////////////////////////////////////////////////////////////////////
// //
// nipxCircuit group (1.3.6.1.4.1.23.2.5.2) //
// //
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// //
// nipxCircEntry table (1.3.6.1.4.1.23.2.5.2.1.1) //
// //
///////////////////////////////////////////////////////////////////////////////
UINT
get_nipxCircEntry(
UINT actionId,
AsnAny * objectArray,
UINT * errorIndex
) {
#define Ceb ((buf_nipxCircEntry *)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;
if (GetAsnInteger (&Ceb->nipxCircSysInstance, NIPX_DEFAULT_SYS_INSTANCE)!=NIPX_DEFAULT_SYS_INSTANCE) {
*errorIndex = 0;
DbgTrace (DBG_NIPXCIRCENTRY, ("NIPX-Circ: nipxCircSysInstance is not 0.\n"));
return MIB_S_ENTRY_NOT_FOUND;
}
MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex
= (ULONG)GetAsnInteger (&Ceb->nipxCircIndex, ZERO_INTERFACE_INDEX);
switch (actionId) {
case MIB_ACTION_GET:
ASSERTMSG ("No index in GET request for table ",
Ceb->nipxCircSysInstance.asnType
&&Ceb->nipxCircIndex.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 (Ceb->nipxCircIndex.asnType) {
ASSERTMSG ("Second index is present but first is not ",
Ceb->nipxCircSysInstance.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_NIPXCIRCENTRY,
("NIPX-Circ: 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_NIPXCIRCENTRY, ("NIPX-Circ: Get(%d) request succeded for if %ld->%ld.\n",
actionId,
MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex,
Ifp->InterfaceIndex));
ForceAsnInteger (&Ceb->nipxCircSysInstance, NIPX_DEFAULT_SYS_INSTANCE);
ForceAsnInteger (&Ceb->nipxCircIndex, Ifp->InterfaceIndex);
SetAsnInteger (&Ceb->nipxCircExistState, NIPX_STATE_ON);
SetAsnInteger (&Ceb->nipxCircOperState, Ifp->IfStats.IfOperState);
SetAsnInteger (&Ceb->nipxCircIfIndex, Ifp->AdapterIndex);
SetAsnDispString (&Ceb->nipxCircName, Ceb->NameVal,
Ifp->InterfaceName, sizeof (Ceb->NameVal));
switch (Ifp->InterfaceType) {
case IF_TYPE_OTHER:
case IF_TYPE_INTERNAL:
SetAsnInteger (&Ceb->nipxCircType, NIPX_CIRCTYPE_OTHER);
SetAsnDispString (&Ceb->nipxCircDialName, Ceb->DialNameVal,
"", sizeof (Ceb->DialNameVal));
break;
case IF_TYPE_LAN:
SetAsnInteger (&Ceb->nipxCircType, NIPX_CIRCTYPE_BCAST);
SetAsnDispString (&Ceb->nipxCircDialName, Ceb->DialNameVal,
"", sizeof (Ceb->DialNameVal));
SetAsnDispString (&Ceb->nipxCircNeighRouterName, Ceb->NeighRouterNameVal,
"", sizeof (Ceb->NeighRouterNameVal));
break;
case IF_TYPE_WAN_ROUTER:
case IF_TYPE_PERSONAL_WAN_ROUTER:
SetAsnInteger (&Ceb->nipxCircType, NIPX_CIRCTYPE_DYNAMIC);
SetAsnDispString (&Ceb->nipxCircDialName, Ceb->DialNameVal,
Ifp->InterfaceName, sizeof (Ceb->DialNameVal));
SetAsnDispString (&Ceb->nipxCircNeighRouterName, Ceb->NeighRouterNameVal,
Ifp->InterfaceName, sizeof (Ceb->NeighRouterNameVal));
break;
case IF_TYPE_WAN_WORKSTATION:
case IF_TYPE_ROUTER_WORKSTATION_DIALOUT:
case IF_TYPE_STANDALONE_WORKSTATION_DIALOUT:
SetAsnInteger (&Ceb->nipxCircType, NIPX_CIRCTYPE_WANWS);
SetAsnDispString (&Ceb->nipxCircDialName, Ceb->DialNameVal,
Ifp->InterfaceName, sizeof (Ceb->DialNameVal));
SetAsnDispString (&Ceb->nipxCircNeighRouterName, Ceb->NeighRouterNameVal,
"", sizeof (Ceb->NeighRouterNameVal));
break;
}
SetAsnInteger (&Ceb->nipxCircLocalMaxPacketSize, Ifp->IfStats.MaxPacketSize);
SetAsnInteger (&Ceb->nipxCircCompressState, NIPX_STATE_OFF);
SetAsnInteger (&Ceb->nipxCircCompressSlots, 16);
SetAsnInteger (&Ceb->nipxCircStaticStatus, NIPX_STATIC_STATUS_UNKNOWN);
SetAsnCounter (&Ceb->nipxCircCompressedSent, 0);
SetAsnCounter (&Ceb->nipxCircCompressedInitSent, 0);
SetAsnCounter (&Ceb->nipxCircCompressedRejectsSent, 0);
SetAsnCounter (&Ceb->nipxCircUncompressedSent, 0);
SetAsnCounter (&Ceb->nipxCircCompressedReceived, 0);
SetAsnCounter (&Ceb->nipxCircCompressedInitReceived, 0);
SetAsnCounter (&Ceb->nipxCircCompressedRejectsReceived, 0);
SetAsnCounter (&Ceb->nipxCircUncompressedReceived, 0);
SetAsnMediaType (&Ceb->nipxCircMediaType, Ceb->MediaTypeVal, Ifp->MediaType);
SetAsnOctetString (&Ceb->nipxCircNetNumber, Ceb->NetNumberVal,
Ifp->NetNumber, sizeof (Ceb->NetNumberVal));
SetAsnCounter (&Ceb->nipxCircStateChanges, 0);
SetAsnCounter (&Ceb->nipxCircInitFails, 0);
SetAsnInteger (&Ceb->nipxCircDelay, Ifp->Delay);
SetAsnInteger (&Ceb->nipxCircThroughput, Ifp->Throughput);
SetAsnOctetString (&Ceb->nipxCircNeighInternalNetNum, Ceb->NeighInternalNetNumVal,
ZERO_NET_NUM, sizeof (Ceb->NeighInternalNetNumVal));
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_NIPXCIRCENTRY,
("NIPX-Circ: End of table reached on GETFIRST/GETNEXT request for if %ld.\n",
MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex));
return MIB_S_NO_MORE_ENTRIES;
default:
*errorIndex = 1;
DbgTrace (DBG_NIPXCIRCENTRY,
("NIPX-Circ: Get request for if %ld failed with error %ld.\n",
MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex, rc));
return MIB_S_ENTRY_NOT_FOUND;
}
#undef Ceb
}
UINT
set_nipxCircEntry(
UINT actionId,
AsnAny * objectArray,
UINT * errorIndex
) {
#define Ceb ((sav_nipxCircEntry *)objectArray)
PIPX_INTERFACE Ifp;
IPX_MIB_GET_INPUT_DATA MibGetInputData;
DWORD rc;
ULONG IfSize;
if (!EnsureRouterConnection()) {
*errorIndex = 0;
return MIB_S_ENTRY_NOT_FOUND;
}
if (GetAsnInteger (&Ceb->nipxCircSysInstance, NIPX_INVALID_SYS_INSTANCE)!=NIPX_DEFAULT_SYS_INSTANCE) {
*errorIndex = 0;
DbgTrace (DBG_NIPXCIRCENTRY, ("NIPX-Circ: nipxCircSysInstance is not 0.\n"));
return MIB_S_ENTRY_NOT_FOUND;
}
switch (actionId) {
case MIB_ACTION_VALIDATE:
ASSERTMSG ("No index in VALIDATE request for table ",
Ceb->nipxCircSysInstance.asnType
&&Ceb->nipxCircIndex.asnType);
MibGetInputData.TableId = IPX_INTERFACE_TABLE;
MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex
= (ULONG)GetAsnInteger (&Ceb->nipxCircIndex, 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) {
Ceb->MibSetInputData.MibRow.Interface = *Ifp;
MprAdminMIBBufferFree (Ifp);
if (Ceb->nipxCircOperState.asnType) {
switch (GetAsnInteger(&Ceb->nipxCircOperState, OPER_STATE_SLEEPING)) {
case OPER_STATE_DOWN:
Ceb->MibSetInputData.MibRow.Interface.AdminState = ADMIN_STATE_DISABLED;
break;
case OPER_STATE_UP:
Ceb->MibSetInputData.MibRow.Interface.AdminState = ADMIN_STATE_ENABLED;
break;
default:
DbgTrace (DBG_NIPXCIRCENTRY,
("NIPX-Circ: Validate failed: invalid oper state: %d.\n",
GetAsnInteger(&Ceb->nipxCircOperState, OPER_STATE_SLEEPING)));
return MIB_S_INVALID_PARAMETER;
}
}
DbgTrace (DBG_NIPXCIRCENTRY, ("NIPX-Circ: Validated if %ld.\n",
MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex));
return MIB_S_SUCCESS;
}
else {
DbgTrace (DBG_NIPXCIRCENTRY,
("NIPX-Circ: 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,
&Ceb->MibSetInputData,
sizeof(IPX_MIB_SET_INPUT_DATA));
if (rc==NO_ERROR) {
DbgTrace (DBG_NIPXCIRCENTRY, ("NIPX-Circ: Set succeded on if %ld\n",
Ceb->MibSetInputData.MibRow.Interface.InterfaceIndex));
return MIB_S_SUCCESS;
}
else {
DbgTrace (DBG_NIPXCIRCENTRY,
("NIPX-Circ: Set failed on if %ld with error %ld\n",
Ceb->MibSetInputData.MibRow.Interface.InterfaceIndex, rc));
return MIB_S_ENTRY_NOT_FOUND;
}
case MIB_ACTION_CLEANUP:
return MIB_S_SUCCESS;
default:
DbgTrace (DBG_NIPXCIRCENTRY,
("NIPX-Circ: Set called with unsupported action code %d.\n",
actionId));
return MIB_S_INVALID_PARAMETER;
}
#undef Ceb
}
///////////////////////////////////////////////////////////////////////////////
// //
// nipxForwarding group (1.3.6.1.4.1.23.2.5.3) //
// //
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// //
// nipxDestEntry table (1.3.6.1.4.1.23.2.5.3.1.1) //
// //
///////////////////////////////////////////////////////////////////////////////
UINT
get_nipxDestEntry(
UINT actionId,
AsnAny * objectArray,
UINT * errorIndex
) {
#define Deb ((buf_nipxDestEntry *)objectArray)
PIPX_ROUTE Rtp;
IPX_MIB_GET_INPUT_DATA MibGetInputData;
DWORD rc;
ULONG RtSize;
if (!EnsureRouterConnection()) {
*errorIndex = 0;
return MIB_S_ENTRY_NOT_FOUND;
}
if (GetAsnInteger (&Deb->nipxDestSysInstance, NIPX_DEFAULT_SYS_INSTANCE)!=NIPX_DEFAULT_SYS_INSTANCE) {
*errorIndex = 0;
DbgTrace (DBG_NIPXDESTENTRY, ("NIPX-Dest: nipxDestSysInstance is not 0.\n"));
return MIB_S_ENTRY_NOT_FOUND;
}
MibGetInputData.TableId = IPX_DEST_TABLE;
GetAsnOctetString (MibGetInputData.MibIndex.RoutingTableIndex.Network,
&Deb->nipxDestNetNum,
sizeof (MibGetInputData.MibIndex.RoutingTableIndex.Network),
ZERO_NET_NUM);
switch (actionId) {
case MIB_ACTION_GET:
ASSERTMSG ("No index in GET request for table ",
Deb->nipxDestSysInstance.asnType
&&Deb->nipxDestNetNum.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 (Deb->nipxDestNetNum.asnType) {
ASSERTMSG ("Second index is present but first is not ",
Deb->nipxDestSysInstance.asnType);
rc = MprAdminMIBEntryGetNext(g_MibServerHandle,
PID_IPX,
IPX_PROTOCOL_BASE,
&MibGetInputData,
sizeof(IPX_MIB_GET_INPUT_DATA),
&Rtp,
&RtSize);
if (rc==NO_ERROR) {
FreeAsnString (&Deb->nipxDestNetNum);
}
}
else
rc = MprAdminMIBEntryGetFirst (g_MibServerHandle,
PID_IPX,
IPX_PROTOCOL_BASE,
&MibGetInputData,
sizeof(IPX_MIB_GET_INPUT_DATA),
&Rtp,
&RtSize);
break;
default:
DbgTrace (DBG_NIPXDESTENTRY,
("NIPX-Dest: Get called with unsupported action code %d.\n",
actionId));
return MIB_S_INVALID_PARAMETER;
}
switch (rc) {
case NO_ERROR:
DbgTrace (DBG_NIPXDESTENTRY,
("NIPX-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]));
ForceAsnInteger (&Deb->nipxDestSysInstance, NIPX_DEFAULT_SYS_INSTANCE);
ForceAsnOctetString (&Deb->nipxDestNetNum, Deb->NetNumVal,
Rtp->Network, sizeof (Deb->NetNumVal));
switch (Rtp->Protocol) {
case IPX_PROTOCOL_LOCAL:
SetAsnInteger (&Deb->nipxDestProtocol, 2);
break;
case IPX_PROTOCOL_STATIC:
SetAsnInteger (&Deb->nipxDestProtocol, 5);
break;
case IPX_PROTOCOL_RIP:
SetAsnInteger (&Deb->nipxDestProtocol, 3);
break;
case IPX_PROTOCOL_NLSP:
SetAsnInteger (&Deb->nipxDestProtocol, 4);
break;
default:
SetAsnInteger (&Deb->nipxDestProtocol, 1); // other
break;
}
SetAsnInteger (&Deb->nipxDestTicks, Rtp->TickCount);
SetAsnInteger (&Deb->nipxDestHopCount, Rtp->HopCount);
SetAsnInteger (&Deb->nipxDestNextHopCircIndex, Rtp->InterfaceIndex);
SetAsnOctetString (&Deb->nipxDestNextHopNICAddress, Deb->NextHopNICAddressVal,
Rtp->NextHopMacAddress, sizeof (Deb->NextHopNICAddressVal));
SetAsnOctetString (&Deb->nipxDestNextHopNetNum, Deb->NextHopNetNumVal,
ZERO_NET_NUM, sizeof (Deb->NextHopNetNumVal));
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_NIPXDESTENTRY,
("NIPX-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 = 1;
DbgTrace (DBG_NIPXDESTENTRY,
("NIPX-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 Deb
}
///////////////////////////////////////////////////////////////////////////////
// //
// nipxStaticRouteEntry table (1.3.6.1.4.1.23.2.5.3.1.2) //
// //
///////////////////////////////////////////////////////////////////////////////
UINT
get_nipxStaticRouteEntry(
UINT actionId,
AsnAny * objectArray,
UINT * errorIndex
) {
#define Sreb ((buf_nipxStaticRouteEntry *)objectArray)
PIPX_ROUTE Rtp;
IPX_MIB_GET_INPUT_DATA MibGetInputData;
DWORD rc;
ULONG RtSize;
if (!EnsureRouterConnection()) {
*errorIndex = 0;
return MIB_S_ENTRY_NOT_FOUND;
}
if (GetAsnInteger (&Sreb->nipxStaticRouteSysInstance, NIPX_DEFAULT_SYS_INSTANCE)!=NIPX_DEFAULT_SYS_INSTANCE) {
*errorIndex = 0;
DbgTrace (DBG_NIPXSTATICRTENTRY,
("NIPX-staticRoutes: nipxStaticRouteSysInstance is not 0.\n"));
return MIB_S_ENTRY_NOT_FOUND;
}
MibGetInputData.TableId = IPX_STATIC_ROUTE_TABLE;
MibGetInputData.MibIndex.StaticRoutesTableIndex.InterfaceIndex
= (ULONG)GetAsnInteger (&Sreb->nipxStaticRouteCircIndex, ZERO_INTERFACE_INDEX);
GetAsnOctetString (
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network,
&Sreb->nipxStaticRouteNetNum,
sizeof (MibGetInputData.MibIndex.StaticRoutesTableIndex.Network),
ZERO_NET_NUM);
switch (actionId) {
case MIB_ACTION_GET:
ASSERTMSG ("No index in GET request for table ",
Sreb->nipxStaticRouteSysInstance.asnType
&&Sreb->nipxStaticRouteCircIndex.asnType
&&Sreb->nipxStaticRouteNetNum.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 (Sreb->nipxStaticRouteCircIndex.asnType) {
ASSERTMSG ("Second index is present but first is not ",
Sreb->nipxStaticRouteSysInstance.asnType);
if (!Sreb->nipxStaticRouteNetNum.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 (Sreb->nipxStaticRouteNetNum.asnType) {
FreeAsnString (&Sreb->nipxStaticRouteNetNum);
}
}
}
else {
ASSERTMSG ("Third index is present but second is not ",
!Sreb->nipxStaticRouteNetNum.asnType);
rc = MprAdminMIBEntryGetFirst (g_MibServerHandle,
PID_IPX,
IPX_PROTOCOL_BASE,
&MibGetInputData,
sizeof(IPX_MIB_GET_INPUT_DATA),
&Rtp,
&RtSize);
}
break;
default:
DbgTrace (DBG_NIPXSTATICRTENTRY,
("NIPX-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_NIPXSTATICRTENTRY,
("NIPX-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 (&Sreb->nipxStaticRouteSysInstance, NIPX_DEFAULT_SYS_INSTANCE);
ForceAsnInteger (&Sreb->nipxStaticRouteCircIndex, Rtp->InterfaceIndex);
ForceAsnOctetString (&Sreb->nipxStaticRouteNetNum, Sreb->NetNumVal,
Rtp->Network, sizeof (Sreb->NetNumVal));
SetAsnInteger (&Sreb->nipxStaticRouteExistState, NIPX_STATE_ON);
SetAsnInteger (&Sreb->nipxStaticRouteTicks, Rtp->TickCount);
SetAsnInteger (&Sreb->nipxStaticRouteHopCount, Rtp->HopCount);
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_NIPXSTATICRTENTRY,
("NIPX-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 = 1;
DbgTrace (DBG_NIPXSTATICRTENTRY,
("NIPX-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 Sreb
}
UINT
set_nipxStaticRouteEntry(
UINT actionId,
AsnAny * objectArray,
UINT * errorIndex
) {
#define Sreb ((sav_nipxStaticRouteEntry *)objectArray)
PIPX_ROUTE Rtp;
IPX_MIB_GET_INPUT_DATA MibGetInputData;
DWORD rc;
ULONG RtSize;
if (!EnsureRouterConnection()) {
*errorIndex = 0;
return MIB_S_ENTRY_NOT_FOUND;
}
if (GetAsnInteger (&Sreb->nipxStaticRouteSysInstance, NIPX_INVALID_SYS_INSTANCE)!=NIPX_DEFAULT_SYS_INSTANCE) {
*errorIndex = 0;
DbgTrace (DBG_NIPXSTATICRTENTRY,
("NIPX-staticRoutes: nipxStaticRouteSysInstance is not 0.\n"));
return MIB_S_ENTRY_NOT_FOUND;
}
switch (actionId) {
case MIB_ACTION_VALIDATE:
ASSERTMSG ("No index in VALIDATE request for table ",
Sreb->nipxStaticRouteCircIndex.asnType
&&Sreb->nipxStaticRouteNetNum.asnType);
MibGetInputData.TableId = IPX_STATIC_ROUTE_TABLE;
MibGetInputData.MibIndex.StaticRoutesTableIndex.InterfaceIndex
= (ULONG)GetAsnInteger (&Sreb->nipxStaticRouteCircIndex,INVALID_INTERFACE_INDEX);
GetAsnOctetString (
MibGetInputData.MibIndex.StaticRoutesTableIndex.Network,
&Sreb->nipxStaticRouteNetNum,
sizeof (MibGetInputData.MibIndex.StaticRoutesTableIndex.Network),
INVALID_NET_NUM);
Sreb->ActionFlag
= (BOOLEAN)GetAsnInteger (&Sreb->nipxStaticRouteExistState,
NIPX_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;
DbgTrace (DBG_NIPXSTATICRTENTRY,
("NIPX-staticRoutes: 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;
}
if (rc==NO_ERROR) {
Sreb->MibSetInputData.MibRow.Route = *Rtp;
if (Sreb->ActionFlag == NIPX_STATE_ON)
Sreb->ActionFlag = NIPX_STATE_NOACTION;
MprAdminMIBBufferFree (Rtp);
DbgTrace (DBG_NIPXSTATICRTENTRY,
("NIPX-staticRoutes: 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 (Sreb->ActionFlag == MIPX_EXIST_STATE_CREATED) {
DbgTrace (DBG_NIPXSTATICRTENTRY,
("NIPX-staticRoutes: 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));
Sreb->MibSetInputData.MibRow.Route.InterfaceIndex
= (ULONG)GetAsnInteger (&Sreb->nipxStaticRouteCircIndex,
INVALID_INTERFACE_INDEX);
GetAsnOctetString (Sreb->MibSetInputData.MibRow.Route.Network,
&Sreb->nipxStaticRouteNetNum,
sizeof (Sreb->MibSetInputData.MibRow.Route.Network),
NULL);
Sreb->MibSetInputData.MibRow.Route.Protocol = IPX_PROTOCOL_STATIC;
Sreb->MibSetInputData.MibRow.Route.Flags = 0;
Sreb->MibSetInputData.MibRow.Route.TickCount = MAXSHORT;
Sreb->MibSetInputData.MibRow.Route.HopCount = 15;
memset (Sreb->MibSetInputData.MibRow.Route.NextHopMacAddress,
0xFF,
sizeof (Sreb->MibSetInputData.MibRow.Route.NextHopMacAddress));
}
else {
DbgTrace (DBG_NIPXSTATICRTENTRY,
("NIPX-staticRoutes: 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;
}
Sreb->MibSetInputData.MibRow.Route.TickCount
= (USHORT)GetAsnInteger (&Sreb->nipxStaticRouteTicks,
Sreb->MibSetInputData.MibRow.Route.TickCount);
Sreb->MibSetInputData.MibRow.Route.HopCount
= (USHORT)GetAsnInteger (&Sreb->nipxStaticRouteHopCount,
Sreb->MibSetInputData.MibRow.Route.HopCount);
return MIB_S_SUCCESS;
case MIB_ACTION_SET:
switch (Sreb->ActionFlag) {
case MIPX_EXIST_STATE_NOACTION:
rc = MprAdminMIBEntrySet (g_MibServerHandle,
PID_IPX,
IPX_PROTOCOL_BASE,
&Sreb->MibSetInputData,
sizeof(IPX_MIB_SET_INPUT_DATA));
break;
case MIPX_EXIST_STATE_DELETED:
rc = MprAdminMIBEntryDelete (g_MibServerHandle,
PID_IPX,
IPX_PROTOCOL_BASE,
&Sreb->MibSetInputData,
sizeof(IPX_MIB_SET_INPUT_DATA));
break;
case MIPX_EXIST_STATE_CREATED:
rc = MprAdminMIBEntryCreate (g_MibServerHandle,
PID_IPX,
IPX_PROTOCOL_BASE,
&Sreb->MibSetInputData,
sizeof(IPX_MIB_SET_INPUT_DATA));
break;
}
if (rc==NO_ERROR) {
DbgTrace (DBG_NIPXSTATICRTENTRY,
("NIPX-staticRoutes: Set succeded for"
" network %.2x.2x.2x.2x on if %ld\n",
Sreb->MibSetInputData.MibRow.Route.Network[0],
Sreb->MibSetInputData.MibRow.Route.Network[1],
Sreb->MibSetInputData.MibRow.Route.Network[2],
Sreb->MibSetInputData.MibRow.Route.Network[3],
Sreb->MibSetInputData.MibRow.Route.InterfaceIndex));
return MIB_S_SUCCESS;
}
else {
DbgTrace (DBG_NIPXSTATICRTENTRY,
("NIPX-staticRoutes: Set failed for"
" network %.2x.2x.2x.2x on if %ld with error %ld\n",
Sreb->MibSetInputData.MibRow.Route.Network[0],
Sreb->MibSetInputData.MibRow.Route.Network[1],
Sreb->MibSetInputData.MibRow.Route.Network[2],
Sreb->MibSetInputData.MibRow.Route.Network[3],
Sreb->MibSetInputData.MibRow.Route.InterfaceIndex, rc));
return MIB_S_ENTRY_NOT_FOUND;
}
case MIB_ACTION_CLEANUP:
return MIB_S_SUCCESS;
default:
DbgTrace (DBG_NIPXSTATICRTENTRY,
("NIPX-staticRoutes: Set called with unsupported action code %d.\n",
actionId));
return MIB_S_INVALID_PARAMETER;
}
#undef Sreb
}
///////////////////////////////////////////////////////////////////////////////
// //
// nipxServices group (1.3.6.1.4.1.23.2.5.4) //
// //
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// //
// nipxServEntry table (1.3.6.1.4.1.23.2.5.4.1.1) //
// //
///////////////////////////////////////////////////////////////////////////////
UINT
get_nipxServEntry(
UINT actionId,
AsnAny * objectArray,
UINT * errorIndex
) {
#define Seb ((buf_nipxServEntry *)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;
}
if (GetAsnInteger (&Seb->nipxServSysInstance, NIPX_DEFAULT_SYS_INSTANCE)!=NIPX_DEFAULT_SYS_INSTANCE) {
*errorIndex = 0;
DbgTrace (DBG_NIPXSERVENTRY, ("NIPX-Serv: nipxServSysInstance is not 0.\n"));
return MIB_S_ENTRY_NOT_FOUND;
}
MibGetInputData.TableId = IPX_SERV_TABLE;
MibGetInputData.MibIndex.ServicesTableIndex.ServiceType
= GetAsnServType (&Seb->nipxServType, ZERO_SERVER_TYPE);
GetAsnDispString (MibGetInputData.MibIndex.ServicesTableIndex.ServiceName,
&Seb->nipxServName, ZERO_SERVER_NAME);
switch (actionId) {
case MIB_ACTION_GET:
ASSERTMSG ("No index in GET request for table ",
Seb->nipxServSysInstance.asnType
&&Seb->nipxServType.asnType
&& Seb->nipxServName.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 (Seb->nipxServType.asnType) {
ASSERTMSG ("Second index is present but first is not ",
Seb->nipxServSysInstance.asnType);
if (!Seb->nipxServName.asnType) {
rc = MprAdminMIBEntryGet(g_MibServerHandle,
PID_IPX,
IPX_PROTOCOL_BASE,
&MibGetInputData,
sizeof(IPX_MIB_GET_INPUT_DATA),
&Svp,
&SvSize);
if (rc==NO_ERROR) {
FreeAsnString (&Seb->nipxServType);
break;
}
}
rc = MprAdminMIBEntryGetNext(g_MibServerHandle,
PID_IPX,
IPX_PROTOCOL_BASE,
&MibGetInputData,
sizeof(IPX_MIB_GET_INPUT_DATA),
&Svp,
&SvSize);
if (rc==NO_ERROR) {
FreeAsnString (&Seb->nipxServType);
if (Seb->nipxServName.asnType) {
FreeAsnString (&Seb->nipxServName);
}
}
}
else {
ASSERTMSG ("Third index is present but second is not ",
!Seb->nipxServName.asnType);
rc = MprAdminMIBEntryGetFirst(g_MibServerHandle,
PID_IPX,
IPX_PROTOCOL_BASE,
&MibGetInputData,
sizeof(IPX_MIB_GET_INPUT_DATA),
&Svp,
&SvSize);
}
break;
default:
DbgTrace (DBG_NIPXSERVENTRY,
("NIPX-Serv: Get called with unsupported action code %d.\n",
actionId));
return MIB_S_INVALID_PARAMETER;
}
switch (rc) {
case NO_ERROR:
DbgTrace (DBG_NIPXSERVENTRY,
("NIPX-Serv: 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));
ForceAsnInteger (&Seb->nipxServSysInstance, NIPX_DEFAULT_SYS_INSTANCE);
ForceAsnServType (&Seb->nipxServType, Seb->TypeVal, Svp->Server.Type);
ForceAsnDispString (&Seb->nipxServName, Seb->NameVal,
Svp->Server.Name, sizeof (Seb->NameVal));
switch (Svp->Protocol) {
case IPX_PROTOCOL_LOCAL:
SetAsnInteger (&Seb->nipxServProtocol, 2);
break;
case IPX_PROTOCOL_STATIC:
SetAsnInteger (&Seb->nipxServProtocol, 5);
break;
case IPX_PROTOCOL_SAP:
SetAsnInteger (&Seb->nipxServProtocol, 6);
break;
case IPX_PROTOCOL_NLSP:
SetAsnInteger (&Seb->nipxServProtocol, 4);
break;
default:
SetAsnInteger (&Seb->nipxServProtocol, 1); // other
break;
}
SetAsnOctetString (&Seb->nipxServNetNum, Seb->NetNumVal,
Svp->Server.Network, sizeof (Seb->NetNumVal));
SetAsnOctetString (&Seb->nipxServNode, Seb->NodeVal,
Svp->Server.Node, sizeof (Seb->NodeVal));
SetAsnOctetString (&Seb->nipxServSocket, Seb->SocketVal,
Svp->Server.Socket, sizeof (Seb->SocketVal));
SetAsnInteger (&Seb->nipxServHopCount, 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_NIPXSERVENTRY,
("NIPX-Serv: 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_NIPXSERVENTRY,
("NIPX-Serv: 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 Seb
}
///////////////////////////////////////////////////////////////////////////////
// //
// nipxDestServEntry table (1.3.6.1.4.1.23.2.5.4.2.1) //
// //
///////////////////////////////////////////////////////////////////////////////
UINT
get_nipxDestServEntry(
UINT actionId,
AsnAny * objectArray,
UINT * errorIndex
) {
switch (actionId) {
case MIB_ACTION_GET:
return MIB_S_ENTRY_NOT_FOUND;
case MIB_ACTION_GETNEXT:
return MIB_S_NO_MORE_ENTRIES;
default:
return MIB_S_INVALID_PARAMETER;
}
}
///////////////////////////////////////////////////////////////////////////////
// //
// nipxStaticServEntry table (1.3.6.1.4.1.23.2.5.4.3.1) //
// //
///////////////////////////////////////////////////////////////////////////////
UINT
get_nipxStaticServEntry(
UINT actionId,
AsnAny * objectArray,
UINT * errorIndex
) {
#define Sseb ((buf_nipxStaticServEntry *)objectArray)
PIPX_SERVICE Svp;
IPX_MIB_GET_INPUT_DATA MibGetInputData;
DWORD rc;
ULONG SvSize;
if (!EnsureRouterConnection()) {
*errorIndex = 0;
return MIB_S_ENTRY_NOT_FOUND;
}
if (GetAsnInteger (&Sseb->nipxStaticServSysInstance, NIPX_DEFAULT_SYS_INSTANCE)!=NIPX_DEFAULT_SYS_INSTANCE) {
*errorIndex = 0;
DbgTrace (DBG_NIPXSTATICSERVENTRY, ("NIPX-StaticServ: nipxStaticServSysInstance is not 0.\n"));
return MIB_S_ENTRY_NOT_FOUND;
}
MibGetInputData.TableId = IPX_STATIC_SERV_TABLE;
MibGetInputData.MibIndex.StaticServicesTableIndex.InterfaceIndex
= (ULONG)GetAsnInteger (&Sseb->nipxStaticServCircIndex,
ZERO_INTERFACE_INDEX);
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceType
= GetAsnServType (&Sseb->nipxStaticServType, ZERO_SERVER_TYPE);
GetAsnDispString (
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceName,
&Sseb->nipxStaticServName, ZERO_SERVER_NAME);
switch (actionId) {
case MIB_ACTION_GET:
ASSERTMSG ("No index in GET request for table ",
Sseb->nipxStaticServSysInstance.asnType
&&Sseb->nipxStaticServCircIndex.asnType
&&Sseb->nipxStaticServType.asnType
&&Sseb->nipxStaticServName.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 (Sseb->nipxStaticServCircIndex.asnType) {
if (!Sseb->nipxStaticServType.asnType
|| !Sseb->nipxStaticServName.asnType) {
rc = MprAdminMIBEntryGet(g_MibServerHandle,
PID_IPX,
IPX_PROTOCOL_BASE,
&MibGetInputData,
sizeof(IPX_MIB_GET_INPUT_DATA),
&Svp,
&SvSize);
if (rc==NO_ERROR) {
if (Sseb->nipxStaticServType.asnType) {
FreeAsnString (&Sseb->nipxStaticServType);
}
if (Sseb->nipxStaticServName.asnType) {
FreeAsnString (&Sseb->nipxStaticServName);
}
break;
}
}
rc = MprAdminMIBEntryGetNext(g_MibServerHandle,
PID_IPX,
IPX_PROTOCOL_BASE,
&MibGetInputData,
sizeof(IPX_MIB_GET_INPUT_DATA),
&Svp,
&SvSize);
if (rc==NO_ERROR) {
if (Sseb->nipxStaticServType.asnType) {
FreeAsnString (&Sseb->nipxStaticServType);
}
if (Sseb->nipxStaticServName.asnType) {
FreeAsnString (&Sseb->nipxStaticServName);
}
}
}
else {
ASSERTMSG ("Third or fourth indeces present but first is not ",
!Sseb->nipxStaticServType.asnType
&&!Sseb->nipxStaticServName.asnType);
rc = MprAdminMIBEntryGetFirst (g_MibServerHandle,
PID_IPX,
IPX_PROTOCOL_BASE,
&MibGetInputData,
sizeof(IPX_MIB_GET_INPUT_DATA),
&Svp,
&SvSize);
}
break;
default:
DbgTrace (DBG_NIPXSTATICSERVENTRY,
("NIPX-StaticServ: 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_NIPXSTATICSERVENTRY,
("NIPX-StaticServ: 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 (&Sseb->nipxStaticServSysInstance, NIPX_DEFAULT_SYS_INSTANCE);
ForceAsnInteger (&Sseb->nipxStaticServCircIndex, Svp->InterfaceIndex);
ForceAsnServType (&Sseb->nipxStaticServType, Sseb->TypeVal, Svp->Server.Type);
ForceAsnDispString (&Sseb->nipxStaticServName, Sseb->NameVal,
Svp->Server.Name, sizeof (Sseb->NameVal));
SetAsnInteger (&Sseb->nipxStaticServExistState, NIPX_STATE_ON);
SetAsnOctetString (&Sseb->nipxStaticServNetNum, Sseb->NetNumVal,
Svp->Server.Network, sizeof (Sseb->NetNumVal));
SetAsnOctetString (&Sseb->nipxStaticServNode, Sseb->NodeVal,
Svp->Server.Node, sizeof (Sseb->NodeVal));
SetAsnOctetString (&Sseb->nipxStaticServSocket, Sseb->SocketVal,
Svp->Server.Socket, sizeof (Sseb->SocketVal));
SetAsnInteger (&Sseb->nipxStaticServHopCount, 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_NIPXSTATICSERVENTRY,
("NIPX-StaticServ: 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_NIPXSTATICSERVENTRY,
("NIPX-StaticServ: 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 Sseb
}
UINT
set_nipxStaticServEntry(
UINT actionId,
AsnAny * objectArray,
UINT * errorIndex
) {
#define Sseb ((sav_nipxStaticServEntry *)objectArray)
PIPX_SERVICE Svp;
IPX_MIB_GET_INPUT_DATA MibGetInputData;
DWORD rc;
ULONG SvSize;
if (!EnsureRouterConnection()) {
*errorIndex = 0;
return MIB_S_ENTRY_NOT_FOUND;
}
if (GetAsnInteger (&Sseb->nipxStaticServSysInstance, NIPX_INVALID_SYS_INSTANCE)!=NIPX_DEFAULT_SYS_INSTANCE) {
*errorIndex = 0;
DbgTrace (DBG_NIPXSTATICSERVENTRY, ("NIPX-StaticServ: nipxStaticServSysInstance is not 0.\n"));
return MIB_S_ENTRY_NOT_FOUND;
}
switch (actionId) {
case MIB_ACTION_VALIDATE:
ASSERTMSG ("No index in VALIDATE request for table ",
Sseb->nipxStaticServSysInstance.asnType
&&Sseb->nipxStaticServCircIndex.asnType
&&Sseb->nipxStaticServType.asnType
&&Sseb->nipxStaticServName.asnType);
MibGetInputData.TableId = IPX_STATIC_SERV_TABLE;
MibGetInputData.MibIndex.StaticServicesTableIndex.InterfaceIndex
= (ULONG)GetAsnInteger (&Sseb->nipxStaticServCircIndex,
INVALID_INTERFACE_INDEX);
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceType
= GetAsnServType (&Sseb->nipxStaticServType, INVALID_SERVER_TYPE);
GetAsnDispString (
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceName,
&Sseb->nipxStaticServName,
INVALID_SERVER_NAME);
Sseb->ActionFlag
= (BOOLEAN)GetAsnInteger (&Sseb->nipxStaticServExistState,
NIPX_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)
{
rc = ERROR_CAN_NOT_COMPLETE;
DbgTrace (DBG_NIPXSTATICSERVENTRY,
("NIPX-StaticServ: 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;
}
if (rc==NO_ERROR) {
Sseb->MibSetInputData.MibRow.Service = *Svp;
if (Sseb->ActionFlag == NIPX_STATE_ON)
Sseb->ActionFlag = NIPX_STATE_NOACTION;
MprAdminMIBBufferFree (Svp);
DbgTrace (DBG_NIPXSTATICSERVENTRY,
("NIPX-StaticServ: Validated"
" service %.4x-%.48s on if %ld.\n",
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceType,
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceName,
MibGetInputData.MibIndex.StaticServicesTableIndex.InterfaceIndex));
}
else if (Sseb->ActionFlag == NIPX_STATE_ON) {
DbgTrace (DBG_NIPXSTATICSERVENTRY,
("NIPX-StaticServ: Prepared to add"
" service %.4x-%.48s on if %ld.\n",
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceType,
MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceName,
MibGetInputData.MibIndex.StaticServicesTableIndex.InterfaceIndex));
Sseb->MibSetInputData.MibRow.Service.InterfaceIndex
= (ULONG) GetAsnInteger (&Sseb->nipxStaticServCircIndex,
INVALID_INTERFACE_INDEX);
Sseb->MibSetInputData.MibRow.Service.Protocol = IPX_PROTOCOL_STATIC;
Sseb->MibSetInputData.MibRow.Service.Server.Type
= GetAsnServType (&Sseb->nipxStaticServType,
INVALID_SERVER_TYPE);
GetAsnDispString (
Sseb->MibSetInputData.MibRow.Service.Server.Name,
&Sseb->nipxStaticServName,
INVALID_SERVER_NAME);
memset (Sseb->MibSetInputData.MibRow.Service.Server.Network, 0,
sizeof (Sseb->MibSetInputData.MibRow.Service.Server.Network));
memset (Sseb->MibSetInputData.MibRow.Service.Server.Node, 0,
sizeof (Sseb->MibSetInputData.MibRow.Service.Server.Node));
memset (Sseb->MibSetInputData.MibRow.Service.Server.Socket, 0,
sizeof (Sseb->MibSetInputData.MibRow.Service.Server.Socket));
Sseb->MibSetInputData.MibRow.Service.Server.HopCount = 15;
}
else {
DbgTrace (DBG_NIPXSTATICSERVENTRY,
("NIPX-StaticServ: 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 (Sseb->MibSetInputData.MibRow.Service.Server.Network,
&Sseb->nipxStaticServNetNum,
sizeof (Sseb->MibSetInputData.MibRow.Service.Server.Network),
NULL);
GetAsnOctetString (Sseb->MibSetInputData.MibRow.Service.Server.Node,
&Sseb->nipxStaticServNode,
sizeof (Sseb->MibSetInputData.MibRow.Service.Server.Node),
NULL);
GetAsnOctetString (Sseb->MibSetInputData.MibRow.Service.Server.Socket,
&Sseb->nipxStaticServSocket,
sizeof (Sseb->MibSetInputData.MibRow.Service.Server.Socket),
NULL);
Sseb->MibSetInputData.MibRow.Service.Server.HopCount =
(USHORT)GetAsnInteger (&Sseb->nipxStaticServHopCount,
Sseb->MibSetInputData.MibRow.Service.Server.HopCount);
return MIB_S_SUCCESS;
case MIB_ACTION_SET:
switch (Sseb->ActionFlag) {
case NIPX_STATE_NOACTION:
rc = MprAdminMIBEntrySet (g_MibServerHandle,
PID_IPX,
IPX_PROTOCOL_BASE,
&Sseb->MibSetInputData,
sizeof(IPX_MIB_SET_INPUT_DATA));
break;
case NIPX_STATE_OFF:
rc = MprAdminMIBEntryDelete (g_MibServerHandle,
PID_IPX,
IPX_PROTOCOL_BASE,
&Sseb->MibSetInputData,
sizeof(IPX_MIB_SET_INPUT_DATA));
break;
case NIPX_STATE_ON:
rc = MprAdminMIBEntryCreate (g_MibServerHandle,
PID_IPX,
IPX_PROTOCOL_BASE,
&Sseb->MibSetInputData,
sizeof(IPX_MIB_SET_INPUT_DATA));
break;
}
if (rc==NO_ERROR) {
DbgTrace (DBG_NIPXSTATICSERVENTRY,
("NIPX-StaticServ: Set succeded"
" for service %.4x-%.48s on if %ld.\n",
Sseb->MibSetInputData.MibRow.Service.Server.Type,
Sseb->MibSetInputData.MibRow.Service.Server.Name,
Sseb->MibSetInputData.MibRow.Service.InterfaceIndex));
return MIB_S_SUCCESS;
}
else {
DbgTrace (DBG_NIPXSTATICSERVENTRY,
("NIPX-StaticServ: Set failed for"
" for service %.4x-%.48s on if %ld with error %ld.\n",
Sseb->MibSetInputData.MibRow.Service.Server.Type,
Sseb->MibSetInputData.MibRow.Service.Server.Name,
Sseb->MibSetInputData.MibRow.Service.InterfaceIndex,
rc));
return MIB_S_ENTRY_NOT_FOUND;
}
case MIB_ACTION_CLEANUP:
return MIB_S_SUCCESS;
default:
DbgTrace (DBG_NIPXSTATICSERVENTRY,
("NIPX-StaticServ: Set called with unsupported action code %d.\n",
actionId));
return MIB_S_INVALID_PARAMETER;
}
#undef Sseb
}