//=============================================================================
// Copyright (c) Microsoft Corporation
// Abstract:
//      This module handles talking to the IPv6 stack.
//=============================================================================

#define MALLOC(dwBytes) HeapAlloc(GetProcessHeap(), 0, dwBytes)
#define FREE(ptr)       HeapFree(GetProcessHeap(), 0, ptr)

typedef enum {
    PUBLISH_NO,
    PUBLISH_AGE,
    PUBLISH_IMMORTAL
} PUBLISH;

typedef enum {
    FORMAT_NORMAL,
    FORMAT_VERBOSE,
    FORMAT_DUMP
} FORMAT;

DWORD AddTunnelInterface(PWCHAR pwszFriendlyName, IN_ADDR *pipLocalAddr, 
                         IN_ADDR *pipRemoteAddr, DWORD dwType, DWORD dwFlags,
                         BOOL bPersistent);
EXTERN_C DWORD AddOrRemoveIpv6(BOOL fAddIpv6);
DWORD DeleteInterface(PWCHAR wszIfFriendlyName, BOOL bPersistent);
DWORD DeletePrefixPolicy(IN6_ADDR *ipAddress, DWORD dwPrefixLength, 
                         BOOL bPersistent);
DWORD FlushNeighborCache(PWCHAR wszIfFriendlyName, IN6_ADDR *pipAddress);
DWORD FlushRouteCache(PWCHAR wszIfFriendlyName, IN6_ADDR *pipAddress);
IPV6_INFO_INTERFACE *GetInterfaceByIpv6IfIndex(DWORD dwIfIndex);
EXTERN_C DWORD IsIpv6Installed(BOOL *bInstalled);
DWORD QueryBindingCache();
DWORD QueryAddressTable(PWCHAR pwszIfFriendlyName, FORMAT Format, 
                        BOOL bPersistent);
DWORD QueryMulticastAddressTable(PWCHAR pwszIfFriendlyName, FORMAT Format);
DWORD QueryGlobalParameters(FORMAT Format, BOOL bPersistent);
DWORD QueryInterface(PWCHAR wszIfFriendlyName, FORMAT Format, BOOL bPersistent);
DWORD QueryMobilityParameters(FORMAT Format, BOOL bPersistent);
DWORD QueryNeighborCache(PWCHAR wszIfFriendlyName, IN6_ADDR *pipAddress);
DWORD QueryPrefixPolicy(FORMAT Format, BOOL bPersistent);
DWORD QueryPrivacyParameters(FORMAT Format, BOOL bPersistent);
DWORD QueryRouteCache(PWCHAR wszIfFriendlyName, IN6_ADDR *pipAddress,
                      FORMAT Format);
DWORD QueryRouteTable(FORMAT Format, BOOL bPersistent);
DWORD QuerySitePrefixTable(FORMAT Format);
DWORD RenewInterface(PWCHAR wszIfFriendlyName);
DWORD ResetIpv6Config(BOOL bPersistent);
DWORD UpdateMobilityParameters(DWORD dwSecurity, DWORD dwBindingCacheLimit,
                               BOOL bPersistent);
DWORD UpdateAddress(PWCHAR pwszIfFriendlyName, IN6_ADDR *pipAddress, 
                    DWORD dwType, DWORD dwValidLifetime,
                    DWORD dwPreferredLifetime, BOOL bPersistent);
DWORD UpdateGlobalParameters(DWORD dwDefaultCurHopLimit, 
                             DWORD dwNeighborCacheLimit, 
                             DWORD dwRouteCacheLimit, DWORD dwReassemblyLimit,
                             BOOL bPersistent);
DWORD UpdateInterface(PWCHAR wszIfFriendlyName, DWORD dwForwarding, 
                      DWORD dwAdvertises, DWORD dwMtu, DWORD dwSiteId, 
                      DWORD dwMetric, BOOL bPersistent);
DWORD UpdatePrefixPolicy(IN6_ADDR *ipAddress, DWORD dwPrefixLength, 
                         DWORD dwPrecedence, DWORD dwLabel, BOOL bPersistent);
DWORD UpdatePrivacyParameters(DWORD dwUseAnonymousAddresses,
                              DWORD dwMaxDadAttempts,
                              DWORD dwMaxValidLifetime,
                              DWORD dwMaxPrefLifetime, 
                              DWORD dwRegenerateTime,
                              DWORD dwMaxRandomTime, 
                              DWORD dwRandomTime, BOOL bPersistent);
DWORD UpdateRouteTable(IN6_ADDR *ipPrefix, DWORD dwPrefixLength, 
                       PWCHAR pwszIfFriendlyName, IN6_ADDR *pipNextHop, 
                       DWORD dwMetric, PUBLISH Publish, 
                       DWORD dwSitePrefixLength, DWORD dwValidLifetime,
                       DWORD dwPreferredLifetime, BOOL bPersistent);
DWORD MyGetAdaptersInfo(OUT PIP_ADAPTER_ADDRESSES *ppAdapterInfo);