/*++

Copyright (c) 1997-1998 Microsoft Corporation

Module Name:

    rtmconst.h

Abstract:
    Private Constants used in the RTMv2 DLL

Author:
    Chaitanya Kodeboyina (chaitk)  17-Aug-1998

Revision History:

--*/

#ifndef __ROUTING_RTMCONST_H__
#define __ROUTING_RTMCONST_H__

//
// Registry Key Names & Limits for configuration parameters
//

#define MAX_CONFIG_KEY_SIZE           260


#define RTM_CONFIG_ROOT               TEXT("SYSTEM"                      \
                                           "\\CurrentControlSet"         \
                                           "\\Services"                  \
                                           "\\RemoteAccess"              \
                                           "\\RoutingTableManager")

#define RTM_CONFIG_ROOT_SIZE          sizeof(RTM_CONFIG_ROOT)


#define REG_KEY_INSTANCE_SUBKEY       TEXT("Instance %05d")

#define REG_KEY_ADDR_FAMILY_SUBKEY    TEXT("AddressFamily %05d")


#define REG_KEY_INSTANCE_TEMPLATE     TEXT("\\Instance %05d")

#define REG_KEY_ADDR_FAMILY_TEMPLATE  TEXT("\\Instance %05d"            \
                                           "\\AddressFamily %05d")

#define DEFAULT_INSTANCE_ID           0

#define REG_KEY_VIEWS_SUPPORTED       TEXT("ViewsSupported")
#define DEFAULT_VIEWS_SUPPORTED       (RTM_VIEW_MASK_UCAST |            \
                                       RTM_VIEW_MASK_MCAST)


#define REG_KEY_ADDRESS_SIZE          TEXT("AddressSize")
#define MINIMUM_ADDRESS_SIZE          1
#define DEFAULT_ADDRESS_SIZE          4
#define MAXIMUM_ADDRESS_SIZE          RTM_MAX_ADDRESS_SIZE


#define REG_KEY_MAX_NOTIFY_REGS       TEXT("MaxChangeNotifyRegistrations")
#define MIN_MAX_NOTIFY_REGS           1
#define DEFAULT_MAX_NOTIFY_REGS       16
#define MAX_MAX_NOTIFY_REGS           32


#define REG_KEY_OPAQUE_INFO_PTRS      TEXT("MaxOpaqueInfoPointers")
#define MIN_OPAQUE_INFO_PTRS          0
#define DEFAULT_OPAQUE_INFO_PTRS      5
#define MAX_OPAQUE_INFO_PTRS          10


#define REG_KEY_NEXTHOPS_IN_ROUTE     TEXT("MaxNextHopsInRoute")
#define MIN_NEXTHOPS_IN_ROUTE         1
#define DEFAULT_NEXTHOPS_IN_ROUTE     3
#define MAX_NEXTHOPS_IN_ROUTE         10


#define REG_KEY_MAX_HANDLES_IN_ENUM   TEXT("MaxHandlesReturnedInEnum")
#define MIN_MAX_HANDLES_IN_ENUM       1
#define DEFAULT_MAX_HANDLES_IN_ENUM   25
#define MAX_MAX_HANDLES_IN_ENUM       100


//
// Number of bits in a byte (or an octet)
//
#define BITS_IN_BYTE          (UINT) 8


//
// RTM supported view related constants
//

#define VIEW_MASK(id) (DWORD) (1 << (id))


//
// RTM supported CN related constants
//

#define CN_MASK(id)   (DWORD) (1 << (id))

#define NUM_CHANGED_DEST_LISTS        16


//
// Types of various data structures
//

#define GENERIC_TYPE                0x00

#define INSTANCE_TYPE               0x01
#define ADDRESS_FAMILY_TYPE         0x02
#define ENTITY_TYPE                 0x03

#define DEST_TYPE                   0x04
#define ROUTE_TYPE                  0x05
#define NEXTHOP_TYPE                0x06

#define DEST_ENUM_TYPE              0x07
#define ROUTE_ENUM_TYPE             0x08
#define NEXTHOP_ENUM_TYPE           0x09

#define NOTIFY_TYPE                 0x0A

#define ROUTE_LIST_TYPE             0x0B
#define LIST_ENUM_TYPE              0x0C

#define V1_REGN_TYPE                0x0D
#define V1_ENUM_TYPE                0x0E


#if DBG_HDL

//
// Type & Signature of allocated structures
//

#define GENERIC_ALLOC              '+GN0'

#define INSTANCE_ALLOC             '+IN1'
#define ADDRESS_FAMILY_ALLOC       '+AF2'
#define ENTITY_ALLOC               '+EN3'

#define DEST_ALLOC                 '+DT4'
#define ROUTE_ALLOC                '+RT5'
#define NEXTHOP_ALLOC              '+NH6'

#define DEST_ENUM_ALLOC            '+DE7'
#define ROUTE_ENUM_ALLOC           '+RE8'
#define NEXTHOP_ENUM_ALLOC         '+NE9'

#define NOTIFY_ALLOC               '+NOA'

#define ROUTE_LIST_ALLOC           '+ELB'
#define LIST_ENUM_ALLOC            '+LEC'

#define V1_REGN_ALLOC              '+1RD'
#define V1_ENUM_ALLOC              '+1EE'

extern const DWORD OBJECT_SIGNATURE[];

//
// Type & Signature of internal structures
// previously allocated, but are now freed
//

#define INSTANCE_FREED             '-IN1'
#define ADDRESS_FAMILY_FREED       '-AF2'
#define ENTITY_FREED               '-EN3'

#define DEST_FREED                 '-DT4'
#define ROUTE_FREED                '-RT5'
#define NEXTHOP_FREED              '-NH6'

#define DEST_ENUM_FREED            '-DE7'
#define ROUTE_ENUM_FREED           '-RE8'
#define NEXTHOP_ENUM_FREED         '-NE9'

#define NOTIFY_FREED               '-NOA'

#define ROUTE_LIST_FREED           '-ELB'
#define LIST_ENUM_FREED            '-LEC'

#define V1_REGN_FREED              '-1RD'
#define V1_ENUM_FREED              '-1EE'

//
// Signature byte that indicates if memory
// allocated for an object has been freed
//

#define ALLOC                      '+'
#define FREED                      '-'

#endif // DBG_HDL


#if _DBG_

//
// Cleanup Functions for internal structures
//

#define DEFINE_DESTROY_FUNC(Name)      \
    DWORD                              \
    Name (PVOID);

DEFINE_DESTROY_FUNC(DestroyGeneric);
DEFINE_DESTROY_FUNC(DestroyInstance);
DEFINE_DESTROY_FUNC(DestroyAddressFamily);
DEFINE_DESTROY_FUNC(DestroyEntity);
DEFINE_DESTROY_FUNC(DestroyDest);
DEFINE_DESTROY_FUNC(DestroyRoute);
DEFINE_DESTROY_FUNC(DestroyNextHop);
DEFINE_DESTROY_FUNC(DestroyDestEnum);
DEFINE_DESTROY_FUNC(DestroyRouteEnum);
DEFINE_DESTROY_FUNC(DestroyNextHopEnum);
DEFINE_DESTROY_FUNC(DestroyChangeNotification);
DEFINE_DESTROY_FUNC(DestroyEntityList);
DEFINE_DESTROY_FUNC(DestroyEntityListEnum);

typedef DWORD (*DestroyFunc) (PVOID Pointer);

const DestroyFunc OBJECT_DESTROY_FUNCTION[] = 
{
    DestroyGeneric,
    DestroyInstance,
    DestroyAddressFamily,
    DestroyEntity,
    DestroyDest,
    DestroyRoute,
    DestroyNextHop,
    DestroyDestEnum,
    DestroyRouteEnum,
    DestroyNextHopEnum,
    DestroyChangeNotification
    DestroyEntityList,
    DestroyEntityListEnum
};

#endif // _DBG_

//
// Reference Counting related constants
//

#define MAX_REFS                   0x10

#define CREATION_REF               0x00
#define ADDR_FAMILY_REF            0x01
#define ENTITY_REF                 0x02

#define DEST_REF                   0x03
#define ROUTE_REF                  0x04
#define NEXTHOP_REF                0x05

#define ENUM_REF                   0x06
#define NOTIFY_REF                 0x07
#define LIST_REF                   0x08

#define HOLD_REF                   0x09

#define TIMER_REF                  0x0D
#define TEMP_USE_REF               0x0E
#define HANDLE_REF                 0x0F

extern const CHAR  *REF_NAME[MAX_REFS];

#endif //__ROUTING_RTMCONST_H__