472 lines
13 KiB
C
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
|
||
|
|