#include #include #include #include #include #include #include #include #include #include #include #include #include // [pmay] this will no longer be neccessary when the ipx router // is converted to use MprInfo api's. typedef RTR_INFO_BLOCK_HEADER IPX_INFO_BLOCK_HEADER, *PIPX_INFO_BLOCK_HEADER; VOID PrintInterface(PIPX_INTERFACE ifp); VOID PrintRipInterface(PRIP_INTERFACE ifp); typedef struct _RPNAM { ULONG prot; PUCHAR namep; } RPNAM, *PRPNAM; RPNAM ProtName[] = { { IPX_PROTOCOL_LOCAL, "LOCAL" }, { IPX_PROTOCOL_STATIC, "STATIC" }, { IPX_PROTOCOL_RIP, "RIP" }, { IPX_PROTOCOL_SAP, "SAP" } }; #define MAX_IPX_PROTOCOLS sizeof(ProtName)/sizeof(RPNAM) IPX_INTERFACE IpxIf; VOID GetIpxInterface(PDIM_ROUTER_INTERFACE dimifp) { ULONG ii; DWORD rc; IPX_MIB_GET_INPUT_DATA MibGetInputData; DWORD IfSize; IfSize = sizeof(IPX_INTERFACE); printf("Enter interface index:"); scanf("%d", &ii); MibGetInputData.TableId = IPX_INTERFACE_TABLE; MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex = ii; rc = (*(dimifp->MIBEntryGet))( IPX_PROTOCOL_BASE, sizeof(IPX_MIB_GET_INPUT_DATA), &MibGetInputData, &IfSize, &IpxIf); if(rc != NO_ERROR) { printf("MibEntryGet: failed rc = %d\n", rc); return; } PrintInterface(&IpxIf); } VOID GetRipInterface(PDIM_ROUTER_INTERFACE dimifp) { DWORD rc; ULONG IfSize; RIP_MIB_GET_INPUT_DATA RipMibGetInputData; RIP_INTERFACE RipIf; printf("Enter interface index:"); scanf("%d", &RipMibGetInputData.InterfaceIndex); RipMibGetInputData.TableId = RIP_INTERFACE_TABLE; rc = (*(dimifp->MIBEntryGet))( IPX_PROTOCOL_RIP, sizeof(RIP_MIB_GET_INPUT_DATA), &RipMibGetInputData, &IfSize, &RipIf); if(rc != NO_ERROR) { printf("MibEntryGet: failed rc = %d\n", rc); return; } PrintRipInterface(&RipIf); } VOID GetRipFilters(PDIM_ROUTER_INTERFACE dimifp) { DWORD rc; ULONG GlobalInfoSize, i; RIP_MIB_GET_INPUT_DATA RipMibGetInputData; PRIP_GLOBAL_INFO RipGlobalInfop; PRIP_ROUTE_FILTER_INFO rfip; char *action; RipMibGetInputData.TableId = RIP_GLOBAL_INFO_ENTRY; rc = (*(dimifp->MIBEntryGet))( IPX_PROTOCOL_RIP, sizeof(RIP_MIB_GET_INPUT_DATA), &RipMibGetInputData, &GlobalInfoSize, NULL); if(rc != ERROR_INSUFFICIENT_BUFFER) { printf("MibEntryGet: failed rc = %d\n", rc); return; } RipGlobalInfop = GlobalAlloc(GPTR, GlobalInfoSize); rc = (*(dimifp->MIBEntryGet))( IPX_PROTOCOL_RIP, sizeof(RIP_MIB_GET_INPUT_DATA), &RipMibGetInputData, &GlobalInfoSize, RipGlobalInfop); if(rc != NO_ERROR) { printf("MibEntryGet: failed rc = %d\n", rc); return; } if(RipGlobalInfop->RouteFiltersCount == 0) { printf("No Filters\n"); return; } if(RipGlobalInfop->RouteFilterAction == IPX_ROUTE_FILTER_ADVERTISE) { action = "ADVERTISE"; } else { action = "SUPPRESS"; } printf("There are %d RIP filters configured for %s\n", RipGlobalInfop->RouteFiltersCount, action); for(i=0, rfip=RipGlobalInfop->RouteFilter; iRouteFiltersCount; i++, rfip++) { printf("Route filter # %d Network %.2x%.2x%.2x%.2x\n", i, rfip->Network[0], rfip->Network[1], rfip->Network[2], rfip->Network[3]); } GlobalFree(RipGlobalInfop); } VOID PrintInterface(PIPX_INTERFACE ifp) { char *iftype; char *admin; char *oper; switch(ifp->InterfaceType) { case IF_TYPE_WAN_WORKSTATION: iftype ="WAN WORKSTATION"; break; case IF_TYPE_WAN_ROUTER: iftype = "WAN ROUTER"; break; case IF_TYPE_LAN: iftype = "LAN"; break; case IF_TYPE_INTERNAL: iftype = "INTERNAL"; break; default: iftype = "UNKNOWN"; break; } switch(ifp->AdminState) { case ADMIN_STATE_ENABLED: admin = "ENABLED"; break; case ADMIN_STATE_DISABLED: admin = "DISABLED"; break; default: admin = "UNKNOWN"; break; } switch(ifp->IfStats.IfOperState) { case OPER_STATE_UP: oper = "UP"; break; case OPER_STATE_DOWN: oper = "DOWN"; break; case OPER_STATE_SLEEPING: oper = "SLEEPING"; break; default: oper = "UNKNOWN"; break; } printf("\n"); printf("Interface Index: %d\n", ifp->InterfaceIndex); printf("Name: %s\n", ifp->InterfaceName); printf("Type: %s\n", iftype); printf("Network Number: %.2x%.2x%.2x%.2x\n", ifp->NetNumber[0], ifp->NetNumber[1], ifp->NetNumber[2], ifp->NetNumber[3]); printf("Admin State: %s\n", admin); printf("Oper State: %s\n\n", oper); } #define REPORT_RIP_CONFIG_STATE(report, config) \ switch((config)) {\ case ADMIN_STATE_ENABLED:\ (report) = "ENABLED";\ break;\ case ADMIN_STATE_DISABLED:\ (report) = "DISABLED";\ break;\ default:\ (report) = "UNKNOWN";\ break;\ } VOID PrintRipInterface(PRIP_INTERFACE ifp) { char *admin; char *oper; char *filtering; char *supply; char *listen; char *update; REPORT_RIP_CONFIG_STATE(admin, ifp->RipIfInfo.AdminState); REPORT_RIP_CONFIG_STATE(supply, ifp->RipIfInfo.Supply); REPORT_RIP_CONFIG_STATE(listen, ifp->RipIfInfo.Listen); REPORT_RIP_CONFIG_STATE(filtering, ifp->RipIfInfo.EnableGlobalFiltering); switch(ifp->RipIfStats.RipIfOperState) { case OPER_STATE_UP: oper = "UP"; break; case OPER_STATE_DOWN: oper = "DOWN"; break; case OPER_STATE_SLEEPING: oper = "SLEEPING"; break; default: oper = "UNKNOWN"; break; } switch(ifp->RipIfInfo.UpdateMode) { case IPX_STANDARD_UPDATE: update = "STANDARD"; break; case IPX_NO_UPDATE: update = "NO UPDATE"; break; case IPX_AUTO_STATIC_UPDATE: update = "AUTO-STATIC"; break; default: break; } printf("\n"); printf("Interface Index: %d\n", ifp->InterfaceIndex); printf("Admin State: %s\n", admin); printf("Oper State: %s\n", oper); printf("Supply RIP advertisments: %s\n", supply); printf("Listen to RIP advertisments: %s\n", listen); printf("Enable Global RIP Filtering: %s\n", filtering); printf("Update Mode: %s\n", update); printf("RIP packets recv: %d\n", ifp->RipIfStats.RipIfInputPackets); printf("RIP packets sent: %d\n\n", ifp->RipIfStats.RipIfOutputPackets); } VOID EnumerateIpxInterfaces(PDIM_ROUTER_INTERFACE dimifp) { DWORD rc; IPX_MIB_GET_INPUT_DATA MibGetInputData; DWORD IfSize; IfSize = sizeof(IPX_INTERFACE); MibGetInputData.TableId = IPX_INTERFACE_TABLE; MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex = 0; rc = (*(dimifp->MIBEntryGetFirst))( IPX_PROTOCOL_BASE, sizeof(IPX_MIB_GET_INPUT_DATA), &MibGetInputData, &IfSize, &IpxIf); if(rc != NO_ERROR) { printf("MIBEntryGetFirst: failed rc = %d\n", rc); return; } PrintInterface(&IpxIf); for(;;) { MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex = IpxIf.InterfaceIndex; rc = (*(dimifp->MIBEntryGetNext))( IPX_PROTOCOL_BASE, sizeof(IPX_MIB_GET_INPUT_DATA), &MibGetInputData, &IfSize, &IpxIf); if(rc != NO_ERROR) { printf("EnumerateIpxInterfaces: MIBEntryGetNext failed rc= 0x%x\n", rc); return; } PrintInterface(&IpxIf); } } IPX_ROUTE Route; VOID PrintRoute(VOID); VOID EnumerateAllBestRoutes(PDIM_ROUTER_INTERFACE dimifp) { DWORD rc; IPX_MIB_GET_INPUT_DATA MibGetInputData; DWORD RtSize; RtSize = sizeof(IPX_ROUTE); MibGetInputData.TableId = IPX_DEST_TABLE; memset(MibGetInputData.MibIndex.RoutingTableIndex.Network, 0, 4); rc = (*(dimifp->MIBEntryGetFirst))( IPX_PROTOCOL_BASE, sizeof(IPX_MIB_GET_INPUT_DATA), &MibGetInputData, &RtSize, &Route); if(rc != NO_ERROR) { printf("MIBEntryGetFirst: failed rc = %d\n", rc); return; } PrintRoute(); for(;;) { memcpy(MibGetInputData.MibIndex.RoutingTableIndex.Network, Route.Network, 4); rc = (*(dimifp->MIBEntryGetNext))( IPX_PROTOCOL_BASE, sizeof(IPX_MIB_GET_INPUT_DATA), &MibGetInputData, &RtSize, &Route); if(rc != NO_ERROR) { printf("MIBEntryGetNext failed rc= 0x%x\n", rc); return; } PrintRoute(); } } VOID PrintRoute(VOID) { int i; PUCHAR pn = "BOGUS"; for(i=0; iMIBEntryGetFirst))( IPX_PROTOCOL_BASE, sizeof(IPX_MIB_GET_INPUT_DATA), &MibGetInputData, &RtSize, &Route); if(rc != NO_ERROR) { printf("MIBEntryGetFirst: failed rc = %d\n", rc); return; } PrintRoute(); for(;;) { memcpy(MibGetInputData.MibIndex.StaticRoutesTableIndex.Network, Route.Network, 4); MibGetInputData.MibIndex.StaticRoutesTableIndex.InterfaceIndex = Route.InterfaceIndex; rc = (*(dimifp->MIBEntryGetNext))( IPX_PROTOCOL_BASE, sizeof(IPX_MIB_GET_INPUT_DATA), &MibGetInputData, &RtSize, &Route); if(rc != NO_ERROR) { printf("MIBEntryGetNext failed rc= 0x%x\n", rc); return; } PrintRoute(); } } IPX_SERVICE Service; VOID PrintService(VOID) { int i; PUCHAR pn = "BOGUS"; for(i=0; iMIBEntryGetFirst))( IPX_PROTOCOL_BASE, sizeof(IPX_MIB_GET_INPUT_DATA), &MibGetInputData, &SvSize, &Service); if(rc != NO_ERROR) { printf("MIBEntryGetFirst: failed rc = %d\n", rc); return; } PrintService(); for(;;) { MibGetInputData.MibIndex.ServicesTableIndex.ServiceType = Service.Server.Type; memcpy(MibGetInputData.MibIndex.ServicesTableIndex.ServiceName, Service.Server.Name, 48); rc = (*(dimifp->MIBEntryGetNext))( IPX_PROTOCOL_BASE, sizeof(IPX_MIB_GET_INPUT_DATA), &MibGetInputData, &SvSize, &Service); if(rc != NO_ERROR) { printf("MIBEntryGetNext failed rc= 0x%x\n", rc); return; } PrintService(); } } VOID EnumerateAllServersOfType(PDIM_ROUTER_INTERFACE dimifp, USHORT Type) { DWORD rc; IPX_MIB_GET_INPUT_DATA MibGetInputData; DWORD SvSize; SvSize = sizeof(IPX_SERVICE); MibGetInputData.TableId = IPX_SERV_TABLE; MibGetInputData.MibIndex.ServicesTableIndex.ServiceType = Type; memset(MibGetInputData.MibIndex.ServicesTableIndex.ServiceName, ' ', 40); for(;;) { rc = (*(dimifp->MIBEntryGetNext))( IPX_PROTOCOL_BASE, sizeof(IPX_MIB_GET_INPUT_DATA), &MibGetInputData, &SvSize, &Service); if(rc != NO_ERROR) { printf("MIBEntryGetNext failed rc= 0x%x\n", rc); return; } if(Service.Server.Type != Type) { return; } PrintService(); memcpy(MibGetInputData.MibIndex.ServicesTableIndex.ServiceName, Service.Server.Name, 48); } } VOID EnumerateStaticServers(PDIM_ROUTER_INTERFACE dimifp) { DWORD rc; IPX_MIB_GET_INPUT_DATA MibGetInputData; DWORD SvSize; SvSize = sizeof(IPX_SERVICE); MibGetInputData.TableId = IPX_STATIC_SERV_TABLE; MibGetInputData.MibIndex.StaticServicesTableIndex.InterfaceIndex = 0; MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceType = 0; memset(MibGetInputData.MibIndex.ServicesTableIndex.ServiceName, 0, 48); rc = (*(dimifp->MIBEntryGetFirst))( IPX_PROTOCOL_BASE, sizeof(IPX_MIB_GET_INPUT_DATA), &MibGetInputData, &SvSize, &Service); if(rc != NO_ERROR) { printf("MIBEntryGetFirst: failed rc = %d\n", rc); return; } PrintService(); for(;;) { MibGetInputData.MibIndex.StaticServicesTableIndex.InterfaceIndex = Service.InterfaceIndex; MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceType = Service.Server.Type; memcpy(MibGetInputData.MibIndex.StaticServicesTableIndex.ServiceName, Service.Server.Name, 48); rc = (*(dimifp->MIBEntryGetNext))( IPX_PROTOCOL_BASE, sizeof(IPX_MIB_GET_INPUT_DATA), &MibGetInputData, &SvSize, &Service); if(rc != NO_ERROR) { printf("MIBEntryGetNext failed rc= 0x%x\n", rc); return; } PrintService(); } } VOID TestMib(PDIM_ROUTER_INTERFACE dimifp) { int i; int Type; for(;;) { printf(" MIB TEST OPTIONS MENU:\n"); printf("1. MIB TEST - Get IPX interface\n"); printf("2. MIB TEST - Enumerate IPX Interfaces\n"); printf("3. MIB TEST - Enumerate all best routes\n"); printf("4. MIB TEST - Enumerate static routes\n"); printf("5. MIB TEST - Enumerate all servers\n"); printf("6. MIB TEST - Enumerate all servers of the specified type\n"); printf("7. MIB TEST - Enumerate all static servers\n"); printf("8. MIB TEST - Get RIP Interface\n"); printf("9. MIB TEST - Get RIP Filters\n"); printf("99. MIB TEST - return to main menu\n"); printf("Enter your option:"); scanf("%d", &i); switch(i) { case 1: GetIpxInterface(dimifp); break; case 2: EnumerateIpxInterfaces(dimifp); break; case 3: EnumerateAllBestRoutes(dimifp); break; case 4: EnumerateStaticRoutes(dimifp); break; case 5: EnumerateAllServers(dimifp); break; case 6: printf("Enter server type:"); scanf("%d", &Type); EnumerateAllServersOfType(dimifp, (USHORT)Type); break; case 7: EnumerateStaticServers(dimifp); break; case 8: GetRipInterface(dimifp); break; case 9: GetRipFilters(dimifp); break; case 99: return; default: break; } } }