Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

789 lines
19 KiB

/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
qoscfg.c
Abstract:
Fns to change configuration for IP QOS
Revision History:
--*/
#include "precomp.h"
#pragma hdrstop
static IPQOS_GLOBAL_CONFIG
g_ipqosGlobalDefault = {
IPQOS_LOGGING_ERROR // Logging level
};
static BYTE* g_pIpqosGlobalDefault = (BYTE*)&g_ipqosGlobalDefault;
static IPQOS_IF_CONFIG
g_ipqosInterfaceDefault = {
IPQOS_STATE_ENABLED,
0 // NULL flow list
};
static BYTE* g_pIpqosInterfaceDefault = (BYTE*)&g_ipqosInterfaceDefault;
//
// If one of the arguments is specified with a name tag
// then all arguments must come with name tags.
// If no name tags, then arguments are assumed to be in a certain order
//
DWORD
MakeQosGlobalInfo(
OUT PBYTE *ppbStart,
OUT PDWORD pdwSize
)
/*++
Routine Descqostion:
Creates a QOS global info block.
Arguments:
ppbStart - Pointer to the info block
pdwSize - Pointer to size of the info block
Return Value:
NO_ERROR, ERROR_NOT_ENOUGH_MEMORY
--*/
{
*pdwSize = sizeof(IPQOS_GLOBAL_CONFIG);
*ppbStart = HeapAlloc(GetProcessHeap(), 0, *pdwSize);
if (*ppbStart is NULL)
{
return ERROR_NOT_ENOUGH_MEMORY;
}
CopyMemory( *ppbStart, g_pIpqosGlobalDefault, *pdwSize);
return NO_ERROR;
}
DWORD
ShowQosGlobalInfo (
HANDLE hFile
)
/*++
Routine Descqostion:
Displays QOS global config info
Arguments:
Return Value:
NO_ERROR, ERROR_NOT_ENOUGH_MEMORY
--*/
{
VALUE_TOKEN vtLogLevelTable1[]
= {IPQOS_LOGGING_NONE,TOKEN_OPT_VALUE_NONE,
IPQOS_LOGGING_ERROR,TOKEN_OPT_VALUE_ERROR,
IPQOS_LOGGING_WARN,TOKEN_OPT_VALUE_WARN,
IPQOS_LOGGING_INFO,TOKEN_OPT_VALUE_INFO};
VALUE_STRING vtLogLevelTable2[]
= {IPQOS_LOGGING_NONE,STRING_LOGGING_NONE,
IPQOS_LOGGING_ERROR,STRING_LOGGING_ERROR,
IPQOS_LOGGING_WARN,STRING_LOGGING_WARN,
IPQOS_LOGGING_INFO,STRING_LOGGING_INFO};
PIPQOS_GLOBAL_CONFIG pigc = NULL;
PTCHAR ptszLogLevel = NULL;
DWORD dwBlkSize, dwCount, dwRes;
do
{
dwRes = IpmontrGetInfoBlockFromGlobalInfo(MS_IP_QOSMGR,
(PBYTE *) &pigc,
&dwBlkSize,
&dwCount);
if (dwBlkSize is 0)
{
dwRes = ERROR_NOT_FOUND;
}
if ( dwRes isnot NO_ERROR )
{
break;
}
//
// getting logging mode string
//
if (hFile)
{
dwRes = GetDisplayStringT(g_hModule,
pigc->LoggingLevel,
vtLogLevelTable1,
NUM_VALUES_IN_TABLE(vtLogLevelTable1),
&ptszLogLevel) ;
}
else
{
dwRes = GetDisplayString(g_hModule,
pigc->LoggingLevel,
vtLogLevelTable2,
NUM_VALUES_IN_TABLE(vtLogLevelTable1),
&ptszLogLevel) ;
}
if (dwRes != NO_ERROR)
return dwRes ;
if ( ptszLogLevel == NULL )
{
dwRes = ERROR_NOT_ENOUGH_MEMORY;
break;
}
if (hFile)
{
//
// dump qos global info
//
// DisplayMessageT(DMP_QOS_GLOBAL_HEADER) ;
// DisplayMessageT(DMP_QOS_UNINSTALL) ;
DisplayMessageT(DMP_QOS_INSTALL) ;
DisplayMessageT(DMP_QOS_SET_GLOBAL,
ptszLogLevel);
// DisplayMessageT(DMP_QOS_GLOBAL_FOOTER) ;
}
else
{
//
// display qos global info
//
DisplayMessage(g_hModule,
MSG_QOS_GLOBAL_INFO,
ptszLogLevel);
}
dwRes = NO_ERROR;
} while ( FALSE );
HEAP_FREE_NOT_NULL(pigc);
if ( ptszLogLevel ) { FreeString( ptszLogLevel ); }
if (hFile is NULL)
{
switch(dwRes)
{
case NO_ERROR:
break;
case ERROR_NOT_FOUND:
DisplayMessage(g_hModule, EMSG_PROTO_NO_GLOBAL_INFO);
break;
case ERROR_NOT_ENOUGH_MEMORY:
DisplayMessage(g_hModule, EMSG_NOT_ENOUGH_MEMORY);
break;
default:
DisplayError(g_hModule, dwRes);
break;
}
}
return NO_ERROR;
}
DWORD
UpdateQosGlobalConfig(
PIPQOS_GLOBAL_CONFIG pigcGlobalCfg,
DWORD dwBitVector
)
/*++
Routine Descqostion:
Updates QOS global config info
Arguments:
pigcGlobalCfg - The new values to be set
dwBitVector - Which fields need to be modified
Return Value:
NO_ERROR, ERROR_NOT_ENOUGH_MEMORY
--*/
{
DWORD dwRes = (DWORD) -1, dwIndex = (DWORD) -1;
DWORD dwSize = 0, dwCount, i, j;
DWORD dwBlkSize, dwNewBlkSize, dwQosCount;
PDWORD pdwAddrTable= NULL, pdwNewAddrTable = NULL;
PDWORD pdwSrcAddrTable = NULL;
PIPQOS_GLOBAL_CONFIG pigcSrc = NULL, pigcDst = NULL;
PBOOL pbToDelete;
DEBUG("In UpdateQosGlobalConfig");
if (dwBitVector is 0)
{
return ERROR_OKAY;
}
//
// Get Global Config info from Registry first
//
do
{
dwRes = IpmontrGetInfoBlockFromGlobalInfo(MS_IP_QOSMGR,
(PBYTE *) &pigcSrc,
&dwBlkSize,
&dwQosCount);
if (dwRes != NO_ERROR)
{
break;
}
if ( pigcSrc == NULL )
{
dwRes = ERROR_NOT_FOUND;
break;
}
//
// We have a fixed len global info - so
// no reallocation and recopy necessary
//
dwNewBlkSize = dwBlkSize;
pigcDst = pigcSrc;
if (dwBitVector & QOS_LOG_MASK)
{
pigcDst->LoggingLevel = pigcGlobalCfg->LoggingLevel;
}
//
// Set the info
//
dwRes = IpmontrSetInfoBlockInGlobalInfo(MS_IP_QOSMGR,
(PBYTE) pigcDst,
dwNewBlkSize,
dwQosCount);
if (dwRes != NO_ERROR)
{
break;
}
} while (FALSE);
HEAP_FREE_NOT_NULL(pigcSrc);
//
// error processing
//
switch(dwRes)
{
case NO_ERROR:
dwRes = ERROR_OKAY;
break;
case ERROR_NOT_FOUND:
DisplayMessage(g_hModule, EMSG_PROTO_NO_GLOBAL_INFO );
dwRes = ERROR_SUPPRESS_OUTPUT;
break;
default:
break;
}
return dwRes;
}
DWORD
MakeQosInterfaceInfo(
IN ROUTER_INTERFACE_TYPE rifType,
OUT PBYTE *ppbStart,
OUT PDWORD pdwSize
)
/*++
Routine Descqostion:
Creates a QOS interface info block.
Arguments:
rifType - Interface type
ppbStart - Pointer to the info block
pdwSize - Pointer to size of the info block
Return Value:
NO_ERROR, ERROR_NOT_ENOUGH_MEMORY
--*/
{
*pdwSize = sizeof(IPQOS_IF_CONFIG);
*ppbStart = HeapAlloc(GetProcessHeap(), 0, *pdwSize);
if (*ppbStart is NULL)
{
return ERROR_NOT_ENOUGH_MEMORY;
}
CopyMemory( *ppbStart, g_pIpqosInterfaceDefault, *pdwSize);
return NO_ERROR;
}
DWORD
ShowQosAllInterfaceInfo(
IN HANDLE hFile
)
/*++
Routine Descqostion:
Displays config info for all
qos enabled interfaces
Arguments:
hFile - NULL, or file handle
--*/
{
DWORD dwErr, dwCount, dwTotal;
DWORD dwNumParsed, i, dwNumBlocks=1, dwSize, dwIfType;
PBYTE pBuffer;
PMPR_INTERFACE_0 pmi0;
WCHAR wszIfDesc[MAX_INTERFACE_NAME_LEN + 1];
//
// dump qos config for all interfaces
//
dwErr = IpmontrInterfaceEnum((PBYTE *) &pmi0,
&dwCount,
&dwTotal);
if(dwErr != NO_ERROR)
{
return dwErr;
}
for(i = 0; i < dwCount; i++)
{
// make sure that Qos is configured on that interface
dwErr = IpmontrGetInfoBlockFromInterfaceInfo(pmi0[i].wszInterfaceName,
MS_IP_QOSMGR,
&pBuffer,
&dwSize,
&dwNumBlocks,
&dwIfType);
if (dwErr isnot NO_ERROR) {
continue;
}
else {
HEAP_FREE(pBuffer) ;
}
ShowQosInterfaceInfo(hFile, pmi0[i].wszInterfaceName) ;
//
// At this point we do not have any flags on interface
//
// if (hFile)
// {
// //
// // only for dump include the flag setting as part of
// // interface settings. Otherwise Interface flag settings
// // are handled by the show flags command
// //
//
// ShowQosInterfaceFlags(hFile, pmi0[i].wszInterfaceName);
// }
}
return NO_ERROR ;
}
DWORD
ShowQosInterfaceInfo(
IN HANDLE hFile,
IN PWCHAR pwszIfGuid
)
/*++
Routine Descqostion:
Displays QOS interface config info
Arguments:
pwszIfGuid - Interface name
Return Value:
NO_ERROR, ERROR_NOT_ENOUGH_MEMORY
--*/
{
WCHAR wszInterfaceName[ MAX_INTERFACE_NAME_LEN + 1 ] = L"\0";
PWCHAR pwszFriendlyIfName = NULL;
DWORD dwBufferSize = sizeof(wszInterfaceName);
DWORD dwRes = (DWORD) -1,
dwCnt = 0;
PDWORD pdwAddr = NULL;
PIPQOS_IF_CONFIG piic = NULL;
PTCHAR ptszState = NULL;
VALUE_TOKEN vtStateTable1[]
= {IPQOS_STATE_ENABLED,TOKEN_OPT_VALUE_ENABLE,
IPQOS_STATE_DISABLED,TOKEN_OPT_VALUE_DISABLE};
VALUE_STRING vtStateTable2[]
= {IPQOS_STATE_ENABLED,STRING_ENABLED,
IPQOS_STATE_DISABLED,STRING_DISABLED};
DWORD dwBlkSize, dwIfType, dwCount;
do
{
dwRes = IpmontrGetInfoBlockFromInterfaceInfo(pwszIfGuid,
MS_IP_QOSMGR,
(PBYTE *) &piic,
&dwBlkSize,
&dwCount,
&dwIfType);
if (dwBlkSize is 0)
dwRes = ERROR_NOT_FOUND;
if (dwRes isnot NO_ERROR)
{
break;
}
//
// get friendly name for interface
//
dwRes = IpmontrGetFriendlyNameFromIfName( pwszIfGuid,
wszInterfaceName,
&dwBufferSize );
if ( dwRes isnot NO_ERROR )
{
break;
}
pwszFriendlyIfName = MakeQuotedString( wszInterfaceName );
if ( pwszFriendlyIfName == NULL )
{
dwRes = ERROR_NOT_ENOUGH_MEMORY;
break;
}
//
// get state of the interface
//
GetAltDisplayString(g_hModule, hFile,
piic->QosState,
vtStateTable1,
vtStateTable2,
NUM_VALUES_IN_TABLE(vtStateTable1),
&ptszState);
if ( ptszState == NULL )
{
dwRes = ERROR_NOT_ENOUGH_MEMORY;
break;
}
if (hFile)
{
DisplayMessageT(DMP_QOS_INTERFACE_HEADER,
pwszFriendlyIfName);
DisplayMessageT(DMP_QOS_DELETE_INTERFACE,
pwszFriendlyIfName);
DisplayMessageT(DMP_QOS_ADD_INTERFACE,
pwszFriendlyIfName,
ptszState);
DisplayMessageT(DMP_QOS_SET_INTERFACE,
pwszFriendlyIfName,
ptszState);
ShowQosFlowsOnIf(hFile, pwszIfGuid, NULL);
DisplayMessageT(DMP_QOS_INTERFACE_FOOTER,
pwszFriendlyIfName);
}
else
{
DisplayMessage(g_hModule, MSG_QOS_IF_INFO,
pwszFriendlyIfName,
ptszState);
ShowQosFlowsOnIf(hFile, pwszIfGuid, NULL);
}
dwRes = NO_ERROR;
} while ( FALSE );
HEAP_FREE_NOT_NULL(piic);
FREE_STRING_NOT_NULL( ptszState ) ;
if ( pwszFriendlyIfName )
{
FreeQuotedString( pwszFriendlyIfName );
}
switch(dwRes)
{
case NO_ERROR:
break;
case ERROR_NOT_FOUND:
DisplayMessage(g_hModule, EMSG_PROTO_NO_IF_INFO,
L"RouterInterfaceConfig");
break;
default:
DisplayError(g_hModule, dwRes);
break;
}
return NO_ERROR;
}
DWORD
UpdateQosInterfaceConfig(
IN PWCHAR pwszIfGuid,
IN PIPQOS_IF_CONFIG pChangeCfg,
IN DWORD dwBitVector,
IN BOOL bAddSet
)
/*++
Routine Descqostion:
Updates QOS interface config info
Arguments:
pwszIfGuid - Interface name
pFinalCfg - The old config(if bSet), or default config(if bAdd)
pChangeCfg - The changes to be applied to pFinalCfg (specified
on cmd line)
dwBitVector - Which fields need to be modified
bAddSet - Is the interface being added or set.
Return Value:
NO_ERROR, ERROR_NOT_ENOUGH_MEMORY
--*/
{
DWORD dwErr = NO_ERROR, dwSize = 0, dwQosCount=1;
DWORD i, dwIfType;
PIPQOS_IF_CONFIG pFinalCfg, piicDst = NULL;
DEBUG("In UpdateQosInterfaceConfig");
do
{
if (bAddSet) {
//
// Create default protocol info block
//
dwErr = IpmontrGetInterfaceType(pwszIfGuid, &dwIfType);
if (dwErr isnot NO_ERROR)
{
break;
}
dwErr = MakeQosInterfaceInfo(dwIfType,(PBYTE *)&pFinalCfg,&dwSize);
if (dwErr isnot NO_ERROR)
{
break;
}
}
else {
//
// get current interface config
//
dwErr = GetInfoBlockFromInterfaceInfoEx(pwszIfGuid,
MS_IP_QOSMGR,
(PBYTE *)&pFinalCfg,
&dwSize,
&dwQosCount,
&dwIfType);
if (dwErr isnot NO_ERROR)
{
return dwErr;
}
}
piicDst = HeapAlloc(GetProcessHeap(), 0, dwSize);
if ( piicDst == NULL )
{
dwErr = ERROR_NOT_ENOUGH_MEMORY;
break;
}
//
// Update the state on interface (and other vars)
//
*piicDst = *pFinalCfg;
if (dwBitVector & QOS_IF_STATE_MASK)
{
piicDst->QosState = pChangeCfg->QosState;
}
//
// Set the info
//
dwErr = IpmontrSetInfoBlockInInterfaceInfo(pwszIfGuid,
MS_IP_QOSMGR,
(PBYTE) piicDst,
dwSize,
dwQosCount);
if (dwErr isnot NO_ERROR)
{
break;
}
} while ( FALSE );
HEAP_FREE_NOT_NULL(pFinalCfg);
HEAP_FREE_NOT_NULL(piicDst);
return dwErr;
}
DWORD
UpdateAllInterfaceConfigs(
VOID
)
{
PMPR_INTERFACE_0 pmi0;
PIPQOS_IF_CONFIG piicBlk;
DWORD dwErr, dwCount, dwTotal, i;
DWORD dwBlkSize, dwBlkCount, dwIfType;
//
// Enumerate all interfaces applicable to QOS
//
dwErr = IpmontrInterfaceEnum((PBYTE *) &pmi0,
&dwCount,
&dwTotal);
if(dwErr != NO_ERROR)
{
DisplayError(g_hModule, dwErr);
return dwErr;
}
for (i = 0; i < dwCount; i++)
{
dwErr = IpmontrGetInfoBlockFromInterfaceInfo(pmi0[i].wszInterfaceName,
MS_IP_QOSMGR,
(PBYTE *) &piicBlk,
&dwBlkSize,
&dwBlkCount,
&dwIfType);
if (dwErr == NO_ERROR)
{
//
// Get and set back the interface info
//
dwErr =IpmontrSetInfoBlockInInterfaceInfo(pmi0[i].wszInterfaceName,
MS_IP_QOSMGR,
(PBYTE) piicBlk,
dwBlkSize,
dwBlkCount);
HEAP_FREE(piicBlk);
}
}
return NO_ERROR;
}