/*++

Copyright (c) 1998  Microsoft Corporation

Module Name:

    qosp.h

Abstract:

    Includes for QOS netsh extension

Revision History:

--*/

#ifndef __QOSP_H
#define __QOSP_H

//
// Constants and Defines
//

#define QOS_LOG_MASK                0x00000001

#define QOS_IF_STATE_MASK           0x00000001

#define DIRECTION_INBOUND           0x00000001
#define DIRECTION_OUTBOUND          0x00000002
#define DIRECTION_BIDIRECTIONAL     (DIRECTION_INBOUND | DIRECTION_OUTBOUND)

#define MAX_WSTR_LENGTH             (MAX_STRING_LENGTH * sizeof(WCHAR))

//
// Extern Global Variables
//

extern ULONG                   g_ulQosNumTopCmds;
extern CMD_ENTRY               g_QosCmds[];

extern ULONG                   g_ulQosNumGroups;
extern CMD_GROUP_ENTRY         g_QosCmdGroups[];

extern ULONG                   g_dwNumQosTableEntries; // Num of sub-helpers

#ifdef ALLOW_CHILD_HELPERS
extern ULONG                   g_dwNumQosContexts;     // Num of sub-contexts
extern PIP_CONTEXT_TABLE_ENTRY g_QosContextTable;
#endif

//
// Function Prototypes
//

// Exported Entry Points

NS_CONTEXT_DUMP_FN   QosDump;

// Command Handlers

FN_HANDLE_CMD  HandleQosInstall;
FN_HANDLE_CMD  HandleQosUninstall;

FN_HANDLE_CMD  HandleQosAddHelper;
FN_HANDLE_CMD  HandleQosDelHelper;
FN_HANDLE_CMD  HandleQosShowHelper;

FN_HANDLE_CMD  HandleQosSetGlobal;
FN_HANDLE_CMD  HandleQosShowGlobal;

FN_HANDLE_CMD  HandleQosAddFlowspec;
FN_HANDLE_CMD  HandleQosDelFlowspec;
FN_HANDLE_CMD  HandleQosShowFlowspec;

FN_HANDLE_CMD  HandleQosDelQosObject;
FN_HANDLE_CMD  HandleQosShowQosObject;

FN_HANDLE_CMD  HandleQosAddSdMode;
FN_HANDLE_CMD  HandleQosShowSdMode;

FN_HANDLE_CMD  HandleQosAddDsRule;
FN_HANDLE_CMD  HandleQosDelDsRule;
FN_HANDLE_CMD  HandleQosShowDsMap;

FN_HANDLE_CMD  HandleQosAddIf;
FN_HANDLE_CMD  HandleQosSetIf;
FN_HANDLE_CMD  HandleQosDelIf;
FN_HANDLE_CMD  HandleQosShowIf;

FN_HANDLE_CMD  HandleQosDump;    
FN_HANDLE_CMD  HandleQosHelp;

FN_HANDLE_CMD  HandleQosAddFlowOnIf;
FN_HANDLE_CMD  HandleQosDelFlowOnIf;
FN_HANDLE_CMD  HandleQosShowFlowOnIf;

FN_HANDLE_CMD  HandleQosAddFlowspecOnIfFlow;
FN_HANDLE_CMD  HandleQosDelFlowspecOnIfFlow;

FN_HANDLE_CMD  HandleQosAddQosObjectOnIfFlow;
FN_HANDLE_CMD  HandleQosDelQosObjectOnIfFlow;

FN_HANDLE_CMD  HandleQosAttachFilterToFlow;
FN_HANDLE_CMD  HandleQosDetachFilterFromFlow;
FN_HANDLE_CMD  HandleQosModifyFilterOnFlow;
FN_HANDLE_CMD  HandleQosShowFilterOnFlow;

FN_HANDLE_CMD  HandleQosMibHelp;
FN_HANDLE_CMD  HandleQosMibShowObject;

// Helper Helper functions

BOOL
IsQosCommand(
    IN PWCHAR pwszCmd
    );

// Info Helper functions

DWORD
UpdateAllInterfaceConfigs(
    VOID
    );

DWORD
MakeQosGlobalInfo(
    OUT      PBYTE                 *ppbStart,
    OUT      PDWORD                 pdwSize
    );

DWORD
MakeQosInterfaceInfo(
    IN      ROUTER_INTERFACE_TYPE   rifType,
    OUT     PBYTE                  *ppbStart,
    OUT     PDWORD                  pdwSize
    );

DWORD
ShowQosGlobalInfo (
    IN      HANDLE                  hFile
    );

DWORD
ShowQosInterfaceInfo(
    IN      HANDLE                  hFile,
    IN      PWCHAR                  pwszIfName
    );

DWORD
ShowQosAllInterfaceInfo(
    IN      HANDLE                  hFile
    );

DWORD
UpdateQosGlobalConfig(
    IN      PIPQOS_GLOBAL_CONFIG    pigcGlobalCfg,
    IN      DWORD                   dwBitVector
    );

DWORD
UpdateQosInterfaceConfig( 
    IN      PWCHAR                  pwszIfName,                         
    IN      PIPQOS_IF_CONFIG        pChangeCfg,
    IN      DWORD                   dwBitVector,
    IN      BOOL                    bAddSet
    );

DWORD
GetQosSetIfOpt(
    IN      PTCHAR                 *pptcArguments,
    IN      DWORD                   dwCurrentIndex,
    IN      DWORD                   dwArgCount,
    IN      PWCHAR                  wszIfName,
    IN      DWORD                   dwSizeOfwszIfName,
    OUT     PIPQOS_IF_CONFIG        pChangeCfg,
    OUT     DWORD                  *pdwBitVector,
    IN      BOOL                    bAddSet
    );

DWORD
GetQosAddDelIfFlowOpt(
    IN      PTCHAR                 *pptcArguments,
    IN      DWORD                   dwCurrentIndex,
    IN      DWORD                   dwArgCount,
    IN      BOOL                    bAdd
    );

DWORD
ShowQosFlows(
    IN      HANDLE                  hFile,
    IN      PWCHAR                  pwszIfGuid,
    IN      PWCHAR                  wszFlowName
    );

DWORD
ShowQosFlowsOnIf(
    IN      HANDLE                  hFile,
    IN      PWCHAR                  pwszIfGuid,
    IN      PWCHAR                  wszFlowName
    );

DWORD
GetQosAddDelFlowspecOpt(
    IN      PTCHAR                 *pptcArguments,
    IN      DWORD                   dwCurrentIndex,
    IN      DWORD                   dwArgCount,
    IN      BOOL                    bAdd
    );

DWORD
ShowQosFlowspecs(
    IN      HANDLE                  hFile,
    IN      PWCHAR                  wszFlowspecName
    );

DWORD
GetQosAddDelFlowspecOnFlowOpt(
    IN      PTCHAR                 *pptcArguments,
    IN      DWORD                   dwCurrentIndex,
    IN      DWORD                   dwArgCount,
    IN      BOOL                    bAdd
    );

DWORD
GetQosAddDelDsRuleOpt(
    IN      PTCHAR                 *pptcArguments,
    IN      DWORD                   dwCurrentIndex,
    IN      DWORD                   dwArgCount,
    IN      BOOL                    bAdd
    );

DWORD
HandleQosShowGenericQosObject(
    IN      DWORD                   dwQosObjectType,
    IN      PTCHAR                 *pptcArguments,
    IN      DWORD                   dwCurrentIndex,
    IN      DWORD                   dwArgCount,
    IN      BOOL                   *pbDone
    );

typedef
DWORD
(*PSHOW_QOS_OBJECT)(
    IN      HANDLE                  hFile,
    IN      PWCHAR                  wszGenObjName,
    IN      QOS_OBJECT_HDR         *pGenObj
    );

DWORD
ShowQosDsMap(
    IN      HANDLE                  hFile,
    IN      PWCHAR                  wszDsMapName,
    IN      QOS_OBJECT_HDR         *pDsMap
    );

DWORD
ShowQosSdMode(
    IN      HANDLE                  hFile,
    IN      PWCHAR                  wszSdModeName,
    IN      QOS_OBJECT_HDR         *pSdMode
    );

DWORD
GetQosAddDelQosObject(
    IN      PWCHAR                  pwszQosObjectName,
    IN      QOS_OBJECT_HDR         *pQosObject,
    IN      BOOL                    bAdd
    );

DWORD
GetQosAddDelQosObjectOnFlowOpt(
    IN      PTCHAR                 *pptcArguments,
    IN      DWORD                   dwCurrentIndex,
    IN      DWORD                   dwArgCount,
    IN      BOOL                    bAdd
    );

DWORD
ShowQosObjects(
    IN      HANDLE                  hFile,
    IN      PWCHAR                  wszQosObjectName,
    IN      ULONG                   dwQosObjectType
    );

DWORD
ShowQosGenObj(
    IN      HANDLE                  hFile,
    IN      PWCHAR                  wszGenObjName,
    IN      QOS_OBJECT_HDR         *pGenObj
    );

// Help Helper Functions

DWORD
ShowQosHelp(
    IN      DWORD                   dwDisplayFlags,
    IN      DWORD                   dwCmdFlags,
    IN      DWORD                   dwArgsRemaining,
    IN      PWCHAR                  pwszGroup
    );

DWORD
WINAPI
DisplayQosHelp(
    VOID
    );

// Dump Helper functions

DWORD
DumpQosInformation (
    IN      HANDLE                  hFile
    );

DWORD
DumpQosHelperInformation (
    IN      HANDLE                  hFile
    );

// MIB Helper defs

typedef
VOID
(*PQOS_PRINT_FN)(
    IN      PIPQOS_MIB_GET_OUTPUT_DATA pgodInfo
    );

typedef struct _QOS_MAGIC_TABLE
{
    DWORD          dwId;
    PQOS_PRINT_FN  pfnPrintFunction;
}QOS_MAGIC_TABLE, *PQOS_MAGIC_TABLE;

// MIB Helper functions

VOID
PrintQosGlobalStats(
    IN      PIPQOS_MIB_GET_OUTPUT_DATA pgodInfo
    );

VOID
PrintQosIfStats(
    IN      PIPQOS_MIB_GET_OUTPUT_DATA pgodInfo
    );

DWORD
GetQosMIBIfIndex(
    IN      PTCHAR                 *pptcArguments,
    IN      DWORD                   dwCurrentIndex,
    OUT     PDWORD                  pdwIndices,
    OUT     PDWORD                  pdwNumParsed 
);

//
// Common Macros
//

#define GET_ENUM_TAG_VALUE()                                            \
        dwErr = MatchEnumTag(g_hModule,                                 \
                             pptcArguments[i + dwCurrentIndex],         \
                             NUM_TOKENS_IN_TABLE(rgEnums),              \
                             rgEnums,                                   \
                             &dwRes);                                   \
                                                                        \
        if (dwErr != NO_ERROR)                                          \
        {                                                               \
            DispTokenErrMsg(g_hModule,                                  \
                            EMSG_BAD_OPTION_VALUE,                      \
                            pttTags[pdwTagType[i]].pwszTag,             \
                            pptcArguments[i + dwCurrentIndex]);         \
                                                                        \
            DisplayMessage(g_hModule,                                   \
                           EMSG_BAD_OPTION_ENUMERATION,                 \
                           pttTags[pdwTagType[i]].pwszTag);             \
                                                                        \
            for ( j = 0; j < NUM_TOKENS_IN_TABLE(rgEnums); j++ )        \
            {                                                           \
                DisplayMessageT( L" %1!s!\n", rgEnums[j].pwszToken );   \
            }                                                           \
                                                                        \
            i = dwNumArg;                                               \
            dwErr = ERROR_SUPPRESS_OUTPUT;                              \
            break;                                                      \
        }                                                               \

#endif // __QOSP_H