windows-nt/Source/XPSP1/NT/net/rras/ip/sample/test.c
2020-09-26 16:20:57 +08:00

472 lines
13 KiB
C

/*++
Copyright (c) 1999, Microsoft Corporation
Module Name:
sample\test.c
Abstract:
The file contains test utilities.
--*/
#include "pchsample.h"
#pragma hdrstop
#ifdef TEST
#define TEST_NUM_IE 230
#define TEST_NUM_INTERFACE 2
#define TEST_SLEEP_TIME 3*PERIODIC_INTERVAL
#define TEST_NUM_START_STOP 2
VOID
ErrorCodes()
{
TRACE1(DEBUG, "ERROR_CAN_NOT_COMPLETE: %u",
ERROR_CAN_NOT_COMPLETE);
TRACE1(DEBUG, "ERROR_INSUFFICIENT_BUFFER: %u",
ERROR_INSUFFICIENT_BUFFER);
TRACE1(DEBUG, "ERROR_NO_MORE_ITEMS: %u",
ERROR_NO_MORE_ITEMS);
TRACE1(DEBUG, "ERROR_INVALID_PARAMETER: %u",
ERROR_INVALID_PARAMETER);
}
VOID
HT_Test()
{
ULONG i, ulNumDeleted = 0, ulNumGotten = 0;
DWORD dwErr;
PNETWORK_ENTRY pneNetworkEntry;
PINTERFACE_ENTRY pieInterfaceEntry;
INTERFACE_ENTRY ieKey;
PLIST_ENTRY plePtr;
WCHAR pwszIfName[20];
do // breakout loop
{
dwErr = NE_Create(&pneNetworkEntry);
if (dwErr != NO_ERROR)
{
TRACE0(DEBUG, "HT_Test: Could not create NetworkEntry");
break;
}
for (i = 0; i < TEST_NUM_IE; i++)
{
swprintf(pwszIfName, L"if%u", i);
dwErr = IE_Create(pwszIfName,
i,
IEFLAG_MULTIACCESS,
&pieInterfaceEntry);
if (dwErr != NO_ERROR)
{
TRACE1(DEBUG, "HT_Test: Could not Create %u", i);
break;
}
dwErr = HT_InsertEntry(pneNetworkEntry->phtInterfaceTable,
&(pieInterfaceEntry->leInterfaceTableLink));
if (dwErr != NO_ERROR)
{
TRACE1(DEBUG, "HT_Test: Could not Insert %u", i);
break;
}
}
TRACE1(DEBUG, "Hash Table Size %u",
HT_Size(pneNetworkEntry->phtInterfaceTable));
for (i = 0; i < TEST_NUM_IE; i += 2)
{
ieKey.dwIfIndex = i;
dwErr = HT_DeleteEntry(pneNetworkEntry->phtInterfaceTable,
&(ieKey.leInterfaceTableLink),
&plePtr);
if (dwErr != NO_ERROR)
{
TRACE1(DEBUG, "HT_Test: Could not Delete %u", i);
break;
}
// indicate deletion
InitializeListHead(plePtr);
IE_Destroy(CONTAINING_RECORD(plePtr,
INTERFACE_ENTRY,
leInterfaceTableLink));
ulNumDeleted++;
}
TRACE2(DEBUG, "NumDeleted %u Hash Table Size %u",
ulNumDeleted, HT_Size(pneNetworkEntry->phtInterfaceTable));
for (i = 0; i < TEST_NUM_IE; i++)
{
ieKey.dwIfIndex = i;
if (HT_IsPresentEntry(pneNetworkEntry->phtInterfaceTable,
&(ieKey.leInterfaceTableLink)))
{
dwErr = HT_GetEntry(pneNetworkEntry->phtInterfaceTable,
&(ieKey.leInterfaceTableLink),
&plePtr);
if (dwErr != NO_ERROR)
{
TRACE1(DEBUG, "HT_Test: Could not Get %u", i);
break;
}
ulNumGotten++;
}
}
TRACE1(DEBUG, "NumGotten %u", ulNumGotten);
} while (FALSE);
NE_Destroy(pneNetworkEntry);
}
VOID
MM_Test(HANDLE hEvent)
{
ROUTING_PROTOCOL_EVENTS rpeEvent;
MESSAGE mMessage;
ULONG ulSize;
BYTE byBuffer[100];
PIPSAMPLE_GLOBAL_CONFIG pigc;
PIPSAMPLE_IP_ADDRESS piia;
PIPSAMPLE_IF_BINDING piib;
PIPSAMPLE_IF_CONFIG piic;
IPSAMPLE_MIB_GET_INPUT_DATA imgid;
PIPSAMPLE_MIB_SET_INPUT_DATA pimsid =
(PIPSAMPLE_MIB_SET_INPUT_DATA) byBuffer;
PIPSAMPLE_MIB_GET_OUTPUT_DATA pimgod =
(PIPSAMPLE_MIB_GET_OUTPUT_DATA) byBuffer;
// mib set global configuration
pimsid->IMSID_TypeID = IPSAMPLE_GLOBAL_CONFIG_ID;
pimsid->IMSID_BufferSize = sizeof(IPSAMPLE_GLOBAL_CONFIG);
pigc = (PIPSAMPLE_GLOBAL_CONFIG) pimsid->IMSID_Buffer;
pigc->dwLoggingLevel = IPSAMPLE_LOGGING_ERROR;
MM_MibSet(pimsid);
TRACE2(MIB, "MIB SET: %u %u", pimsid->IMSID_TypeID, pigc->dwLoggingLevel);
WaitForSingleObject(hEvent, INFINITE);
CM_GetEventMessage(&rpeEvent, &mMessage);
TRACE1(DEBUG, "SetMib %u", rpeEvent);
// mib get global configuration
ulSize = 0;
imgid.IMGID_TypeID = IPSAMPLE_GLOBAL_CONFIG_ID;
pigc = (PIPSAMPLE_GLOBAL_CONFIG) pimgod->IMGOD_Buffer;
MM_MibGet(&imgid, pimgod, &ulSize, GET_EXACT);
TRACE3(MIB, "MIB GET: %u %u %u",
ulSize, pimgod->IMGOD_TypeID, pigc->dwLoggingLevel);
MM_MibGet(&imgid, pimgod, &ulSize, GET_EXACT);
TRACE3(MIB, "MIB GET: %u %u %u",
ulSize, pimgod->IMGOD_TypeID, pigc->dwLoggingLevel);
// mib get first interface binding
ulSize = 0;
imgid.IMGID_TypeID = IPSAMPLE_IF_BINDING_ID;
imgid.IMGID_IfIndex = 0;
piib = (PIPSAMPLE_IF_BINDING) pimgod->IMGOD_Buffer;
piia = IPSAMPLE_IF_ADDRESS_TABLE(piib);
MM_MibGet(&imgid, pimgod, &ulSize, GET_FIRST);
TRACE4(MIB, "MIB GET: %u %u %u %u",
ulSize, pimgod->IMGOD_TypeID, piib->dwState, piib->ulCount);
MM_MibGet(&imgid, pimgod, &ulSize, GET_FIRST);
TRACE5(MIB, "MIB GET: %u %u %u %u %u",
ulSize, pimgod->IMGOD_TypeID, piib->dwState, piib->ulCount,
piia->dwAddress);
// mib get next interface binding
ulSize = 0;
MM_MibGet(&imgid, pimgod, &ulSize, GET_NEXT);
TRACE4(MIB, "MIB GET: %u %u %u %u",
ulSize, pimgod->IMGOD_TypeID, piib->dwState, piib->ulCount);
MM_MibGet(&imgid, pimgod, &ulSize, GET_NEXT);
TRACE5(MIB, "MIB GET: %u %u %u %u %u",
ulSize, pimgod->IMGOD_TypeID, piib->dwState, piib->ulCount,
piia->dwAddress);
// mib set interface configuration
pimsid->IMSID_TypeID = IPSAMPLE_IF_CONFIG_ID;
pimsid->IMSID_IfIndex = 0;
pimsid->IMSID_BufferSize = sizeof(IPSAMPLE_IF_CONFIG);
piic = (PIPSAMPLE_IF_CONFIG) pimsid->IMSID_Buffer;
piic->ulMetric = 0;
MM_MibSet(pimsid);
TRACE1(MIB, "MIB SET: %u", pimsid->IMSID_TypeID);
WaitForSingleObject(hEvent, INFINITE);
CM_GetEventMessage(&rpeEvent, &mMessage);
TRACE1(DEBUG, "SetMib %u", rpeEvent);
// mib get interface configuration
ulSize = 0;
imgid.IMGID_TypeID = IPSAMPLE_IF_CONFIG_ID;
imgid.IMGID_IfIndex = 0;
piic = (PIPSAMPLE_IF_CONFIG) pimgod->IMGOD_Buffer;
MM_MibGet(&imgid, pimgod, &ulSize, GET_EXACT);
TRACE3(MIB, "MIB GET: %u %u %u",
ulSize, pimgod->IMGOD_TypeID, piic->ulMetric);
MM_MibGet(&imgid, pimgod, &ulSize, GET_EXACT);
TRACE3(MIB, "MIB GET: %u %u %u",
ulSize, pimgod->IMGOD_TypeID, piic->ulMetric);
}
VOID
NM_Test(HANDLE hEvent)
{
DWORD dwErr = NO_ERROR;
ULONG i;
WCHAR pwszIfName[20];
ROUTING_PROTOCOL_EVENTS rpeEvent;
MESSAGE mMessage;
IPSAMPLE_IF_CONFIG iic = { 1 };
PIP_ADAPTER_BINDING_INFO pBinding;
MALLOC(&pBinding,
(sizeof(IP_ADAPTER_BINDING_INFO) + 3 * sizeof(IP_LOCAL_BINDING)),
&dwErr);
pBinding->AddressCount = 3;
pBinding->Address[0].Address = 0xfffffffd;
pBinding->Address[0].Mask = 0xffffffff;
pBinding->Address[1].Address = INADDR_ANY;
pBinding->Address[1].Mask = 0xffffffff;
pBinding->Address[2].Address = 0xfffffffe;
pBinding->Address[2].Mask = 0xffffffff;
// add interfaces
for (i = 0; i < TEST_NUM_INTERFACE; i++)
{
swprintf(pwszIfName, L"if%u", i);
dwErr = NM_AddInterface(pwszIfName,
i,
PERMANENT,
&iic);
if (dwErr != NO_ERROR)
{
TRACE1(DEBUG, "NM_Test: Could not Add Interface %u", i);
break;
}
}
TRACE1(DEBUG, "...AddInterface %u", dwErr);
CE_Display(&g_ce);
// bind interfaces
for (i = 0; i < TEST_NUM_INTERFACE; i++)
{
pBinding->Address[0].Address = i;
dwErr = NM_InterfaceStatus(i,
FALSE,
RIS_INTERFACE_ADDRESS_CHANGE,
(PVOID) pBinding);
if (dwErr != NO_ERROR)
{
TRACE1(DEBUG, "NM_Test: Could not Bind Interface %u", i);
break;
}
}
TRACE1(DEBUG, "...BindInterface %u", dwErr);
CE_Display(&g_ce);
// activate interfaces
for (i = 0; i < TEST_NUM_INTERFACE; i++)
{
dwErr = NM_InterfaceStatus(i,
TRUE,
RIS_INTERFACE_ENABLED,
NULL);
if (dwErr != NO_ERROR)
{
TRACE1(DEBUG, "NM_Test: Could not Activate Interface %u", i);
break;
}
}
TRACE1(DEBUG, "...ActivateInterface %u", dwErr);
CE_Display(&g_ce);
for (i = 0; i < TEST_NUM_INTERFACE; i++)
{
dwErr = NM_DoUpdateRoutes(i);
if (dwErr != NO_ERROR)
{
TRACE1(DEBUG, "NM_Test: Couldn't UpdateRoutes on Interface %u", i);
break;
}
dwErr = WaitForSingleObject(hEvent, INFINITE);
dwErr = CM_GetEventMessage(&rpeEvent, &mMessage);
TRACE2(DEBUG, "DidUpdateRoutes %u %u", rpeEvent, dwErr);
}
TRACE1(DEBUG, "...DoUpdateRoutes %u", dwErr);
CE_Display(&g_ce);
// interface is active (enabled and bound)
TRACE1(DEBUG, "Sleeping...", dwErr);
Sleep(SECTOMILLISEC(TEST_SLEEP_TIME));
TRACE1(DEBUG, "...Awake", dwErr);
// mib manager test
MM_Test(hEvent);
TRACE0(DEBUG, "...MM_Test");
// deactivate interfaces
for (i = 0; i < TEST_NUM_INTERFACE; i++)
{
dwErr = NM_InterfaceStatus(i,
FALSE,
RIS_INTERFACE_DISABLED,
NULL);
if (dwErr != NO_ERROR)
{
TRACE1(DEBUG, "NM_Test: Could not Deactivate Interface %u", i);
break;
}
}
TRACE1(DEBUG, "...DeactivateInterface %u", dwErr);
CE_Display(&g_ce);
// unbind interfaces
pBinding->AddressCount = 0;
for (i = 0; i < TEST_NUM_INTERFACE; i++)
{
dwErr = NM_InterfaceStatus(i,
FALSE,
RIS_INTERFACE_ADDRESS_CHANGE,
(PVOID) pBinding);
if (dwErr != NO_ERROR)
{
TRACE1(DEBUG, "NM_Test: Could not Unbind Interface %u", i);
break;
}
}
TRACE1(DEBUG, "...UnbindInterface %u", dwErr);
CE_Display(&g_ce);
// delete interfaces
for (i = 0; i < TEST_NUM_INTERFACE; i++)
{
dwErr = NM_DeleteInterface(i);
if (dwErr != NO_ERROR)
{
TRACE1(DEBUG, "CM_Test: Could not Delete Interface %u", i);
break;
}
}
TRACE1(DEBUG, "...DeleteInterface %u", dwErr);
CE_Display(&g_ce);
}
VOID
CM_Test()
{
DWORD dwErr = NO_ERROR;
IPSAMPLE_GLOBAL_CONFIG igc = { IPSAMPLE_LOGGING_INFO };
ROUTING_PROTOCOL_EVENTS rpeEvent;
MESSAGE mMessage;
HANDLE hEvent;
hEvent = CreateEvent(NULL, FALSE, FALSE, "RouterManagerEvent");
// start protocol
dwErr = CM_StartProtocol(hEvent, NULL, (PVOID) (&igc));
TRACE1(DEBUG, "StartProtocol %u", dwErr);
CE_Display(&g_ce);
// network manager test
NM_Test(hEvent);
TRACE0(DEBUG, "...NM_Test");
// stop protocol
dwErr = CM_StopProtocol();
TRACE1(DEBUG, "StopProtocol %u", dwErr);
CE_Display(&g_ce);
// wait for stop event
dwErr = WaitForSingleObject(hEvent, INFINITE);
dwErr = CM_GetEventMessage(&rpeEvent, &mMessage);
TRACE2(DEBUG, "Stopped %u %u", rpeEvent, dwErr);
CE_Display(&g_ce);
CloseHandle(hEvent);
}
VOID
WINAPI
TestProtocol(VOID)
{
ULONG i;
TRACE0(DEBUG, "Hello World!!!");
for (i = 0; i < TEST_NUM_START_STOP; i++)
{
CM_Test();
TRACE1(DEBUG, "...CM_Test (%u)", i);
}
HT_Test();
TRACE0(DEBUG, "...HT_Test");
ErrorCodes();
TRACE0(DEBUG, "...ErrorCodes");
}
#else // TEST
VOID
WINAPI
TestProtocol(VOID)
{
TRACE0(ANY, "Hello World!");
}
#endif // TEST