windows-nt/Source/XPSP1/NT/public/internal/net/inc/ntddip6.h
2020-09-26 16:20:57 +08:00

1080 lines
35 KiB
C

// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil -*- (for GNU Emacs)
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// This file is part of the Microsoft Research IPv6 Network Protocol Stack.
// You should have received a copy of the Microsoft End-User License Agreement
// for this software along with this release; see the file "license.txt".
// If not, please see http://www.research.microsoft.com/msripv6/license.htm,
// or write to Microsoft Research, One Microsoft Way, Redmond, WA 98052-6399.
//
// Abstract:
//
// This header file defines constants and types for accessing
// the MSR IPv6 driver via ioctls.
//
#ifndef _NTDDIP6_
#define _NTDDIP6_
#include <ipexport.h>
//
// We need a definition of CTL_CODE for use below.
// When compiling kernel components in the DDK environment,
// ntddk.h supplies this definition. Otherwise get it
// from devioctl.h in the SDK environment.
//
#ifndef CTL_CODE
#include <devioctl.h>
#endif
#pragma warning(push)
#pragma warning(disable:4201) // nameless struct/union
//
// We also need a definition of TDI_ADDRESS_IP6.
// In the DDK environment, tdi.h supplies this.
// We provide a definition here for the SDK environment.
//
#ifndef TDI_ADDRESS_LENGTH_IP6
#include <packon.h>
typedef struct _TDI_ADDRESS_IP6 {
USHORT sin6_port;
ULONG sin6_flowinfo;
USHORT sin6_addr[8];
ULONG sin6_scope_id;
} TDI_ADDRESS_IP6, *PTDI_ADDRESS_IP6;
#include <packoff.h>
#define TDI_ADDRESS_LENGTH_IP6 sizeof (TDI_ADDRESS_IP6)
#endif
//
// This is the key name of the TCP/IPv6 protocol stack in the registry.
// The protocol driver and the winsock helper both use it.
//
#define TCPIPV6_NAME L"Tcpip6"
//
// Device Name - this string is the name of the device. It is the name
// that should be passed to NtCreateFile when accessing the device.
//
#define DD_TCPV6_DEVICE_NAME L"\\Device\\Tcp6"
#define DD_UDPV6_DEVICE_NAME L"\\Device\\Udp6"
#define DD_RAW_IPV6_DEVICE_NAME L"\\Device\\RawIp6"
#define DD_IPV6_DEVICE_NAME L"\\Device\\Ip6"
//
// The Windows-accessible device name. It is the name that
// (prepended with "\\\\.\\") should be passed to CreateFile.
//
#define WIN_IPV6_BASE_DEVICE_NAME L"Ip6"
#define WIN_IPV6_DEVICE_NAME L"\\\\.\\" WIN_IPV6_BASE_DEVICE_NAME
//
// When an interface is bound, we are passed a name beginning with
// IPV6_BIND_STRING_PREFIX. However, we register our interfaces with
// TDI using names beginning with IPV6_EXPORT_STRING_PREFIX.
//
#define IPV6_BIND_STRING_PREFIX L"\\DEVICE\\"
#define IPV6_EXPORT_STRING_PREFIX L"\\DEVICE\\TCPIP6_"
//
// For buffer sizing convenience, bound the link-layer address size.
//
#define MAX_LINK_LAYER_ADDRESS_LENGTH 64
//
// IPv6 IOCTL code definitions.
//
// The codes that use FILE_ANY_ACCESS are open to all users.
// The codes that use FILE_WRITE_ACCESS require local Administrator privs.
//
#define FSCTL_IPV6_BASE FILE_DEVICE_NETWORK
#define _IPV6_CTL_CODE(function, method, access) \
CTL_CODE(FSCTL_IPV6_BASE, function, method, access)
//
// This IOCTL is used to send an ICMPv6 Echo request.
// It returns the reply (unless there was a timeout or TTL expired).
//
#define IOCTL_ICMPV6_ECHO_REQUEST \
_IPV6_CTL_CODE(0, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct icmpv6_echo_request {
TDI_ADDRESS_IP6 DstAddress; // Destination address.
TDI_ADDRESS_IP6 SrcAddress; // Source address.
unsigned int Timeout; // Request timeout in milliseconds.
unsigned char TTL; // TTL or Hop Count.
unsigned int Flags;
// Request data follows this structure in memory.
} ICMPV6_ECHO_REQUEST, *PICMPV6_ECHO_REQUEST;
#define ICMPV6_ECHO_REQUEST_FLAG_REVERSE 0x1 // Use routing header.
typedef struct icmpv6_echo_reply {
TDI_ADDRESS_IP6 Address; // Replying address.
IP_STATUS Status; // Reply IP_STATUS.
unsigned int RoundTripTime; // RTT in milliseconds.
// Reply data follows this structure in memory.
} ICMPV6_ECHO_REPLY, *PICMPV6_ECHO_REPLY;
//
// This IOCTL retrieves information about an interface,
// given an interface index or guid.
// It takes as input an IPV6_QUERY_INTERFACE structure
// and returns as output an IPV6_INFO_INTERFACE structure.
// To perform an iteration, start with Index set to -1, in which case
// only an IPV6_QUERY_INTERFACE is returned, for the first interface.
// If there are no more interfaces, then the Index in the returned
// IPV6_QUERY_INTERFACE will be -1.
//
#define IOCTL_IPV6_QUERY_INTERFACE \
_IPV6_CTL_CODE(1, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct ipv6_query_interface {
unsigned int Index; // -1 means start/finish iteration,
// 0 means use the Guid.
GUID Guid;
} IPV6_QUERY_INTERFACE;
//
// This IOCTL retrieves persisted information about an interface,
// given a registry index or guid.
// It takes as input an IPV6_PERSISTENT_QUERY_INTERFACE structure
// and returns as output an IPV6_INFO_INTERFACE structure.
//
#define IOCTL_IPV6_PERSISTENT_QUERY_INTERFACE \
_IPV6_CTL_CODE(48, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct ipv6_persistent_query_interface {
unsigned int RegistryIndex; // -1 means use the Guid.
GUID Guid;
} IPV6_PERSISTENT_QUERY_INTERFACE;
typedef struct ipv6_info_interface {
IPV6_QUERY_INTERFACE Next; // For non-persistent queries only.
IPV6_QUERY_INTERFACE This;
//
// Length of this structure in bytes, not including
// any link-layer addresses following in memory.
//
unsigned int Length;
//
// These fields are ignored for updates.
//
unsigned int LinkLayerAddressLength;
unsigned int LocalLinkLayerAddress; // Offset, zero indicates absence.
unsigned int RemoteLinkLayerAddress; // Offset, zero indicates absence.
unsigned int Type; // Ignored for updates.
int RouterDiscovers; // Ignored for updates.
int NeighborDiscovers; // Ignored for updates.
int PeriodicMLD; // Ignored for updates.
int Advertises; // -1 means no change, else boolean.
int Forwards; // -1 means no change, else boolean.
unsigned int MediaStatus; // Ignored for updates.
int OtherStatefulConfig; // Ignored for updates.
unsigned int ZoneIndices[16]; // 0 means no change.
unsigned int TrueLinkMTU; // Ignored for updates.
unsigned int LinkMTU; // 0 means no change.
unsigned int CurHopLimit; // -1 means no change.
unsigned int BaseReachableTime; // Milliseconds, 0 means no change.
unsigned int ReachableTime; // Milliseconds, ignored for updates.
unsigned int RetransTimer; // Milliseconds, 0 means no change.
unsigned int DupAddrDetectTransmits; // -1 means no change.
unsigned int Preference; // -1 means no change.
// Link-layer addresses may follow.
} IPV6_INFO_INTERFACE;
//
// These values should agree with definitions also
// found in llip6if.h and ip6def.h.
//
#define IPV6_IF_TYPE_LOOPBACK 0
#define IPV6_IF_TYPE_ETHERNET 1
#define IPV6_IF_TYPE_FDDI 2
#define IPV6_IF_TYPE_TUNNEL_AUTO 3
#define IPV6_IF_TYPE_TUNNEL_6OVER4 4
#define IPV6_IF_TYPE_TUNNEL_V6V4 5
#define IPV6_IF_TYPE_TUNNEL_6TO4 6
#define IPV6_IF_TYPE_TUNNEL_TEREDO 7
#define IPV6_IF_MEDIA_STATUS_DISCONNECTED 0
#define IPV6_IF_MEDIA_STATUS_RECONNECTED 1
#define IPV6_IF_MEDIA_STATUS_CONNECTED 2
//
// Initialize the fields of the IPV6_INFO_INTERFACE structure
// to values that indicate no change.
//
__inline void
IPV6_INIT_INFO_INTERFACE(IPV6_INFO_INTERFACE *Info)
{
memset(Info, 0, sizeof *Info);
Info->Length = sizeof *Info;
Info->Type = (unsigned int)-1;
Info->RouterDiscovers = -1;
Info->NeighborDiscovers = -1;
Info->PeriodicMLD = -1;
Info->Advertises = -1;
Info->Forwards = -1;
Info->MediaStatus = (unsigned int)-1;
Info->CurHopLimit = (unsigned int)-1;
Info->DupAddrDetectTransmits = (unsigned int)-1;
Info->Preference = (unsigned int)-1;
}
//
// This IOCTL retrieves information about an address
// on an interface.
//
#define IOCTL_IPV6_QUERY_ADDRESS \
_IPV6_CTL_CODE(2, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct ipv6_query_address {
IPV6_QUERY_INTERFACE IF; // Fields that identify an interface.
IPv6Addr Address;
} IPV6_QUERY_ADDRESS;
typedef struct ipv6_info_address {
IPV6_QUERY_ADDRESS Next;
IPV6_QUERY_ADDRESS This;
unsigned int Type;
unsigned int Scope;
unsigned int ScopeId;
union {
struct { // If it's a unicast address.
unsigned int DADState;
unsigned int PrefixConf;
unsigned int InterfaceIdConf;
unsigned int ValidLifetime; // Seconds.
unsigned int PreferredLifetime; // Seconds.
};
struct { // If it's a multicast address.
unsigned int MCastRefCount;
unsigned int MCastFlags;
unsigned int MCastTimer; // Seconds.
};
};
} IPV6_INFO_ADDRESS;
//
// Values for address Type.
//
#define ADE_UNICAST 0x00
#define ADE_ANYCAST 0x01
#define ADE_MULTICAST 0x02
//
// Values for address Scope.
//
#define ADE_SMALLEST_SCOPE 0x00
#define ADE_INTERFACE_LOCAL 0x01
#define ADE_LINK_LOCAL 0x02
#define ADE_SUBNET_LOCAL 0x03
#define ADE_ADMIN_LOCAL 0x04
#define ADE_SITE_LOCAL 0x05
#define ADE_ORG_LOCAL 0x08
#define ADE_GLOBAL 0x0e
#define ADE_LARGEST_SCOPE 0x0f
#define ADE_NUM_SCOPES (ADE_LARGEST_SCOPE - ADE_SMALLEST_SCOPE + 1)
//
// Bit values for MCastFlags.
//
#define MAE_REPORTABLE 0x01
#define MAE_LAST_REPORTER 0x02
//
// Values for PrefixConf.
// These must match the IP_PREFIX_ORIGIN values in iptypes.h.
//
#define PREFIX_CONF_OTHER 0 // None of the ones below.
#define PREFIX_CONF_MANUAL 1 // From a user or administrator.
#define PREFIX_CONF_WELLKNOWN 2 // IANA-assigned.
#define PREFIX_CONF_DHCP 3 // Configured via DHCP.
#define PREFIX_CONF_RA 4 // From a Router Advertisement.
//
// Values for InterfaceIdConf.
// These must match the IP_SUFFIX_ORIGIN values in iptypes.h.
//
#define IID_CONF_OTHER 0 // None of the ones below.
#define IID_CONF_MANUAL 1 // From a user or administrator.
#define IID_CONF_WELLKNOWN 2 // IANA-assigned.
#define IID_CONF_DHCP 3 // Configured via DHCP.
#define IID_CONF_LL_ADDRESS 4 // Derived from the link-layer address.
#define IID_CONF_RANDOM 5 // Random, e.g. anonymous address.
//
// Values for DADState.
//
// The low bit set indicates whether the state is valid.
// Among valid states, bigger is better
// for source address selection.
//
#define DAD_STATE_INVALID 0
#define DAD_STATE_TENTATIVE 1
#define DAD_STATE_DUPLICATE 2
#define DAD_STATE_DEPRECATED 3
#define DAD_STATE_PREFERRED 4
//
// We use this infinite lifetime value for prefix lifetimes,
// router lifetimes, address lifetimes, etc.
//
#define INFINITE_LIFETIME 0xffffffff
//
// This IOCTL retrieves information about an address
// that has been assigned persistently to an interface.
// It takes the IPV6_PERSISTENT_QUERY_ADDRESS structure
// and returns the IPV6_UPDATE_ADDRESS structure.
//
#define IOCTL_IPV6_PERSISTENT_QUERY_ADDRESS \
_IPV6_CTL_CODE(47, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct ipv6_persistent_query_address {
IPV6_PERSISTENT_QUERY_INTERFACE IF;
unsigned int RegistryIndex; // -1 means use the Address.
IPv6Addr Address;
} IPV6_PERSISTENT_QUERY_ADDRESS;
//
// This IOCTL retrieves information from the neighbor cache.
//
#define IOCTL_IPV6_QUERY_NEIGHBOR_CACHE \
_IPV6_CTL_CODE(3, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct ipv6_query_neighbor_cache {
IPV6_QUERY_INTERFACE IF; // Fields that identify an interface.
IPv6Addr Address;
} IPV6_QUERY_NEIGHBOR_CACHE;
typedef struct ipv6_info_neighbor_cache {
IPV6_QUERY_NEIGHBOR_CACHE Query;
unsigned int IsRouter; // Whether neighbor is a router.
unsigned int IsUnreachable; // Whether neighbor is unreachable.
unsigned int NDState; // Current state of entry.
unsigned int ReachableTimer; // Reachable time remaining (in ms).
unsigned int LinkLayerAddressLength;
// Link-layer address follows.
} IPV6_INFO_NEIGHBOR_CACHE;
#define ND_STATE_INCOMPLETE 0
#define ND_STATE_PROBE 1
#define ND_STATE_DELAY 2
#define ND_STATE_STALE 3
#define ND_STATE_REACHABLE 4
#define ND_STATE_PERMANENT 5
//
// This IOCTL retrieves information from the route cache.
//
#define IOCTL_IPV6_QUERY_ROUTE_CACHE \
_IPV6_CTL_CODE(4, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct ipv6_query_route_cache {
IPV6_QUERY_INTERFACE IF; // Fields that identify an interface.
IPv6Addr Address;
} IPV6_QUERY_ROUTE_CACHE;
typedef struct ipv6_info_route_cache {
IPV6_QUERY_ROUTE_CACHE Query;
unsigned int Type;
unsigned int Flags;
int Valid; // Boolean - FALSE means it is stale.
IPv6Addr SourceAddress;
IPv6Addr NextHopAddress;
unsigned int NextHopInterface;
unsigned int PathMTU;
unsigned int PMTUProbeTimer; // Time until next PMTU probe (in ms).
unsigned int ICMPLastError; // Time since last ICMP error sent (in ms).
unsigned int BindingSeqNumber;
unsigned int BindingLifetime; // Seconds.
IPv6Addr CareOfAddress;
} IPV6_INFO_ROUTE_CACHE;
#define RCE_FLAG_CONSTRAINED_IF 0x1
#define RCE_FLAG_CONSTRAINED_SCOPEID 0x2
#define RCE_FLAG_CONSTRAINED 0x3
#define RCE_TYPE_COMPUTED 1
#define RCE_TYPE_REDIRECT 2
#if 0 // obsolete
//
// This IOCTL retrieves information from the prefix list.
//
#define IOCTL_IPV6_QUERY_PREFIX_LIST \
_IPV6_CTL_CODE(5, METHOD_BUFFERED, FILE_ANY_ACCESS)
//
// This IOCTL retrieves information from the default router list.
//
#define IOCTL_IPV6_QUERY_ROUTER_LIST \
_IPV6_CTL_CODE(6, METHOD_BUFFERED, FILE_ANY_ACCESS)
//
// This IOCTL adds a multicast group to the desired interface.
//
#define IOCTL_IPV6_ADD_MEMBERSHIP \
_IPV6_CTL_CODE(7, METHOD_BUFFERED, FILE_ANY_ACCESS)
//
// This IOCTL drops a multicast group.
//
#define IOCTL_IPV6_DROP_MEMBERSHIP \
_IPV6_CTL_CODE(8, METHOD_BUFFERED, FILE_ANY_ACCESS)
#endif
//
// This IOCTL adds an SP to the SP list.
//
#define IOCTL_IPV6_CREATE_SECURITY_POLICY \
_IPV6_CTL_CODE(9, METHOD_BUFFERED, FILE_WRITE_ACCESS)
typedef struct ipv6_create_security_policy {
unsigned long SPIndex; // Index of policy to create.
unsigned int RemoteAddrField;
unsigned int RemoteAddrSelector;
IPv6Addr RemoteAddr; // Remote IP Address.
IPv6Addr RemoteAddrData;
unsigned int LocalAddrField; // Single, range, or wildcard.
unsigned int LocalAddrSelector; // Packet or policy.
IPv6Addr LocalAddr; // Start of range or single value.
IPv6Addr LocalAddrData; // End of range.
unsigned int TransportProtoSelector; // Packet or policy.
unsigned short TransportProto;
unsigned int RemotePortField; // Single, range, or wildcard.
unsigned int RemotePortSelector; // Packet or policy.
unsigned short RemotePort; // Start of range or single value.
unsigned short RemotePortData; // End of range.
unsigned int LocalPortField; // Single, range, or wildcard.
unsigned int LocalPortSelector; // Packet or policy.
unsigned short LocalPort; // Start of range or single value.
unsigned short LocalPortData; // End of range.
unsigned int IPSecProtocol;
unsigned int IPSecMode;
IPv6Addr RemoteSecurityGWAddr;
unsigned int Direction;
unsigned int IPSecAction;
unsigned long SABundleIndex;
unsigned int SPInterface;
} IPV6_CREATE_SECURITY_POLICY;
//
// This IOCTL adds an SA to the SA list.
//
#define IOCTL_IPV6_CREATE_SECURITY_ASSOCIATION \
_IPV6_CTL_CODE(10, METHOD_BUFFERED, FILE_WRITE_ACCESS)
typedef struct ipv6_create_security_association {
unsigned long SAIndex;
unsigned long SPI; // Security Parameter Index.
IPv6Addr SADestAddr;
IPv6Addr DestAddr;
IPv6Addr SrcAddr;
unsigned short TransportProto;
unsigned short DestPort;
unsigned short SrcPort;
unsigned int Direction;
unsigned long SecPolicyIndex;
unsigned int AlgorithmId;
unsigned int RawKeySize;
} IPV6_CREATE_SECURITY_ASSOCIATION;
//
// This IOCTL gets all the SPs from the SP list.
//
#define IOCTL_IPV6_QUERY_SECURITY_POLICY_LIST \
_IPV6_CTL_CODE(11, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct ipv6_query_security_policy_list {
unsigned int SPInterface;
unsigned long Index;
} IPV6_QUERY_SECURITY_POLICY_LIST;
typedef struct ipv6_info_security_policy_list {
IPV6_QUERY_SECURITY_POLICY_LIST Query;
unsigned long SPIndex;
unsigned long NextSPIndex;
unsigned int RemoteAddrField;
unsigned int RemoteAddrSelector;
IPv6Addr RemoteAddr; // Remote IP Address.
IPv6Addr RemoteAddrData;
unsigned int LocalAddrField; // Single, range, or wildcard.
unsigned int LocalAddrSelector; // Packet or policy.
IPv6Addr LocalAddr; // Start of range or single value.
IPv6Addr LocalAddrData; // End of range.
unsigned int TransportProtoSelector; // Packet or policy.
unsigned short TransportProto;
unsigned int RemotePortField; // Single, range, or wildcard.
unsigned int RemotePortSelector; // Packet or policy.
unsigned short RemotePort; // Start of range or single value.
unsigned short RemotePortData; // End of range.
unsigned int LocalPortField; // Single, range, or wildcard.
unsigned int LocalPortSelector; // Packet or policy.
unsigned short LocalPort; // Start of range or single value.
unsigned short LocalPortData; // End of range.
unsigned int IPSecProtocol;
unsigned int IPSecMode;
IPv6Addr RemoteSecurityGWAddr;
unsigned int Direction;
unsigned int IPSecAction;
unsigned long SABundleIndex;
unsigned int SPInterface;
} IPV6_INFO_SECURITY_POLICY_LIST;
//
// This IOCTL gets all the SAs from the SA list.
//
#define IOCTL_IPV6_QUERY_SECURITY_ASSOCIATION_LIST \
_IPV6_CTL_CODE(12, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct ipv6_query_security_association_list {
unsigned long Index;
} IPV6_QUERY_SECURITY_ASSOCIATION_LIST;
typedef struct ipv6_info_security_association_list {
IPV6_QUERY_SECURITY_ASSOCIATION_LIST Query;
unsigned long SAIndex;
unsigned long NextSAIndex;
unsigned long SPI; // Security Parameter Index.
IPv6Addr SADestAddr;
IPv6Addr DestAddr;
IPv6Addr SrcAddr;
unsigned short TransportProto;
unsigned short DestPort;
unsigned short SrcPort;
unsigned int Direction;
unsigned long SecPolicyIndex;
unsigned int AlgorithmId;
} IPV6_INFO_SECURITY_ASSOCIATION_LIST;
//
// This IOCTL retrieves information from the route table.
// It takes the IPV6_QUERY_ROUTE_TABLE structure
// and returns the IPV6_INFO_ROUTE_TABLE structure.
//
//
#define IOCTL_IPV6_QUERY_ROUTE_TABLE \
_IPV6_CTL_CODE(13, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct ipv6_query_route_table {
IPv6Addr Prefix;
unsigned int PrefixLength;
IPV6_QUERY_NEIGHBOR_CACHE Neighbor;
} IPV6_QUERY_ROUTE_TABLE;
typedef struct ipv6_info_route_table {
union {
IPV6_QUERY_ROUTE_TABLE Next; // Non-persistent query results.
IPV6_QUERY_ROUTE_TABLE This; // All other uses.
};
unsigned int SitePrefixLength;
unsigned int ValidLifetime; // Seconds.
unsigned int PreferredLifetime; // Seconds.
unsigned int Preference; // Smaller is better. See below.
unsigned int Type; // See values below.
int Publish; // Boolean.
int Immortal; // Boolean.
} IPV6_INFO_ROUTE_TABLE;
//
// The Type field indicates where the route came from.
// These are RFC 2465 ipv6RouteProtocol values.
// Routing protocols are free to define new values.
//
#define RTE_TYPE_SYSTEM 2
#define RTE_TYPE_MANUAL 3
#define RTE_TYPE_AUTOCONF 4
#define RTE_TYPE_RIP 5
#define RTE_TYPE_OSPF 6
#define RTE_TYPE_BGP 7
#define RTE_TYPE_IDRP 8
#define RTE_TYPE_IGRP 9
//
// Standard route preference values.
// The value zero is reserved for administrative configuration.
//
#define ROUTE_PREF_LOW (16*16*16)
#define ROUTE_PREF_MEDIUM (16*16)
#define ROUTE_PREF_HIGH 16
#define ROUTE_PREF_ON_LINK 8
#define ROUTE_PREF_LOOPBACK 4
#define ROUTE_PREF_HIGHEST 0
//
// This IOCTL retrieves information about a persistent route.
// It takes the IPV6_PERSISTENT_QUERY_ROUTE_TABLE structure
// and returns the IPV6_INFO_ROUTE_TABLE structure.
//
#define IOCTL_IPV6_PERSISTENT_QUERY_ROUTE_TABLE \
_IPV6_CTL_CODE(46, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct ipv6_persistent_query_route_table {
IPV6_PERSISTENT_QUERY_INTERFACE IF;
unsigned int RegistryIndex; // -1 means use the parameters below.
IPv6Addr Neighbor;
IPv6Addr Prefix;
unsigned int PrefixLength;
} IPV6_PERSISTENT_QUERY_ROUTE_TABLE;
//
// This IOCTL adds/removes a route in the route table.
// It uses the IPV6_INFO_ROUTE_TABLE structure.
//
#define IOCTL_IPV6_UPDATE_ROUTE_TABLE \
_IPV6_CTL_CODE(14, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_IPV6_PERSISTENT_UPDATE_ROUTE_TABLE \
_IPV6_CTL_CODE(40, METHOD_BUFFERED, FILE_WRITE_ACCESS)
//
// This IOCTL adds/removes an address on an interface.
// It uses the IPV6_UPDATE_ADDRESS structure.
//
#define IOCTL_IPV6_UPDATE_ADDRESS \
_IPV6_CTL_CODE(15, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_IPV6_PERSISTENT_UPDATE_ADDRESS \
_IPV6_CTL_CODE(38, METHOD_BUFFERED, FILE_WRITE_ACCESS)
typedef struct ipv6_update_address {
IPV6_QUERY_ADDRESS This;
unsigned int Type; // Unicast or anycast.
unsigned int PrefixConf;
unsigned int InterfaceIdConf;
unsigned int PreferredLifetime; // Seconds.
unsigned int ValidLifetime; // Seconds.
} IPV6_UPDATE_ADDRESS;
//
// This IOCTL retrieves information from the binding cache.
//
#define IOCTL_IPV6_QUERY_BINDING_CACHE \
_IPV6_CTL_CODE(16, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct ipv6_query_binding_cache {
IPv6Addr HomeAddress;
} IPV6_QUERY_BINDING_CACHE;
typedef struct ipv6_info_binding_cache {
IPV6_QUERY_BINDING_CACHE Query;
IPv6Addr HomeAddress;
IPv6Addr CareOfAddress;
unsigned int BindingSeqNumber;
unsigned int BindingLifetime; // Seconds.
} IPV6_INFO_BINDING_CACHE;
//
// This IOCTL controls some attributes of an interface.
// It uses the IPV6_INFO_INTERFACE structure.
//
#define IOCTL_IPV6_UPDATE_INTERFACE \
_IPV6_CTL_CODE(17, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_IPV6_PERSISTENT_UPDATE_INTERFACE \
_IPV6_CTL_CODE(36, METHOD_BUFFERED, FILE_WRITE_ACCESS)
//
// This IOCTL flushes entries from the neighbor cache.
// It uses the IPV6_QUERY_NEIGHBOR_CACHE structure.
//
#define IOCTL_IPV6_FLUSH_NEIGHBOR_CACHE \
_IPV6_CTL_CODE(18, METHOD_BUFFERED, FILE_WRITE_ACCESS)
//
// This IOCTL flushes entries from the route cache.
// It uses the IPV6_QUERY_ROUTE_CACHE structure.
//
#define IOCTL_IPV6_FLUSH_ROUTE_CACHE \
_IPV6_CTL_CODE(19, METHOD_BUFFERED, FILE_WRITE_ACCESS)
//
// This IOCTL deletes SA entries from the SA list.
// It uses the IPV6_QUERY_SECURITY_ASSOCIATION_LIST structure.
//
#define IOCTL_IPV6_DELETE_SECURITY_ASSOCIATION \
_IPV6_CTL_CODE(20, METHOD_BUFFERED, FILE_WRITE_ACCESS)
//
// This IOCTL deletes SP entries from the SP list.
// It uses the IPV6_QUERY_SECURITY_POLICY_LIST structure.
//
#define IOCTL_IPV6_DELETE_SECURITY_POLICY \
_IPV6_CTL_CODE(21, METHOD_BUFFERED, FILE_WRITE_ACCESS)
//
// This IOCTL deletes an interface.
// It uses the IPV6_QUERY_INTERFACE structure.
//
// The persistent variant, in addition to deleting the runtime interface,
// also keeps the interface from being (re)created persistently.
// However, it does NOT reset or delete any persistent attributes
// of the interface. For example, suppose you have a persisent tunnel
// interface with a persistent attribute, the interface metric.
// If you delete the tunnel interface and reboot, the tunnel interface
// will be recreated with the non-default interface metric.
// If you persistently delete the tunnel interface and reboot,
// the tunnel interface will not be created. But if you then create
// the tunnel interface, it will get the non-default interface metric.
// This is analogous to persistent attributes on removable ethernet interfaces.
//
#define IOCTL_IPV6_DELETE_INTERFACE \
_IPV6_CTL_CODE(22, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_IPV6_PERSISTENT_DELETE_INTERFACE \
_IPV6_CTL_CODE(44, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#if 0 // obsolete
//
// This IOCTL sets the mobility security to either on or off.
// When mobility security is turned on, Binding Cache Updates
// must be protected via IPsec.
//
#define IOCTL_IPV6_SET_MOBILITY_SECURITY \
_IPV6_CTL_CODE(23, METHOD_BUFFERED, FILE_WRITE_ACCESS)
typedef struct ipv6_set_mobility_security {
unsigned int MobilitySecurity; // See MOBILITY_SECURITY values in ipsec.h.
} IPV6_SET_MOBILITY_SECURITY;
#endif
//
// This IOCTL sorts a list of destination addresses.
// The returned list may contain fewer addresses.
// It uses an array of TDI_ADDRESS_IP6 in/out.
//
#define IOCTL_IPV6_SORT_DEST_ADDRS \
_IPV6_CTL_CODE(24, METHOD_BUFFERED, FILE_ANY_ACCESS)
//
// This IOCTL retrieves information from the site prefix table.
//
#define IOCTL_IPV6_QUERY_SITE_PREFIX \
_IPV6_CTL_CODE(25, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct ipv6_query_site_prefix {
IPv6Addr Prefix;
unsigned int PrefixLength;
IPV6_QUERY_INTERFACE IF;
} IPV6_QUERY_SITE_PREFIX;
typedef struct ipv6_info_site_prefix {
IPV6_QUERY_SITE_PREFIX Query;
unsigned int ValidLifetime; // Seconds.
} IPV6_INFO_SITE_PREFIX;
//
// This IOCTL adds/removes a prefix in the site prefix table.
// It uses the IPV6_INFO_SITE_PREFIX structure.
//
// This ioctl is provided for testing purposes.
// Administrative configuration of site prefixes should never
// be required, because site prefixes are configured from
// Router Advertisements on hosts and from the routing table
// on routers. Hence there is no persistent version of this ioctl.
//
#define IOCTL_IPV6_UPDATE_SITE_PREFIX \
_IPV6_CTL_CODE(26, METHOD_BUFFERED, FILE_WRITE_ACCESS)
//
// This IOCTL create a new interface.
// It uses the IPV6_INFO_INTERFACE structure,
// with many fields ignored.
//
#define IOCTL_IPV6_CREATE_INTERFACE \
_IPV6_CTL_CODE(27, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_IPV6_PERSISTENT_CREATE_INTERFACE \
_IPV6_CTL_CODE(43, METHOD_BUFFERED, FILE_WRITE_ACCESS)
//
// This IOCTL requests a routing change notification.
// It uses the IPV6_RTCHANGE_NOTIFY_REQUEST (input) and
// IPV6_INFO_ROUTE_TABLE (output) structures.
//
// A notification request completes when a route
// that matches is added or deleted.
// A route matches the requested prefix if the route
// prefix and the request prefix intersect.
// So the ::/0 request prefix matches all route updates.
//
#define IOCTL_IPV6_RTCHANGE_NOTIFY_REQUEST \
_IPV6_CTL_CODE(28, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct ipv6_rtchange_notify_request {
unsigned int Flags;
unsigned int PrefixLength;
unsigned long ScopeId;
IPv6Addr Prefix;
} IPV6_RTCHANGE_NOTIFY_REQUEST;
#define IPV6_RTCHANGE_NOTIFY_REQUEST_FLAG_SYNCHRONIZE 0x1
// Only one wakeup per requestor per change.
#define IPV6_RTCHANGE_NOTIFY_REQUEST_FLAG_SUPPRESS_MINE 0x2
// Ignore route changes from this requestor.
#if 0
//
// This IOCTL retrieves an interface index, given a device name.
// It takes a PWSTR for input, and uses the IPV6_QUERY_INTERFACE structure
// for output.
//
#define IOCTL_IPV6_QUERY_INTERFACE_INDEX \
_IPV6_CTL_CODE(29, METHOD_BUFFERED, FILE_ANY_ACCESS)
#endif
//
// This IOCTL queries global IPv6 parameters.
// It uses the IPV6_GLOBAL_PARAMETERS structure.
//
// Note that changing these parameters typically does not affect
// existing uses of them. For example changing DefaultCurHopLimit
// will not affect the CurHopLimit of existing interfaces,
// but it will affect the CurHopLimit of new interfaces.
//
#define IOCTL_IPV6_QUERY_GLOBAL_PARAMETERS \
_IPV6_CTL_CODE(30, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_IPV6_PERSISTENT_QUERY_GLOBAL_PARAMETERS \
_IPV6_CTL_CODE(49, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct ipv6_global_parameters {
unsigned int DefaultCurHopLimit; // -1 means no change.
unsigned int UseAnonymousAddresses; // -1 means no change.
unsigned int MaxAnonDADAttempts; // -1 means no change.
unsigned int MaxAnonValidLifetime; // -1 means no change.
unsigned int MaxAnonPreferredLifetime; // -1 means no change.
unsigned int AnonRegenerateTime; // -1 means no change.
unsigned int MaxAnonRandomTime; // -1 means no change.
unsigned int AnonRandomTime; // -1 means no change.
unsigned int NeighborCacheLimit; // -1 means no change.
unsigned int RouteCacheLimit; // -1 means no change.
unsigned int BindingCacheLimit; // -1 means no change.
unsigned int ReassemblyLimit; // -1 means no change.
int MobilitySecurity; // Boolean, -1 means no change.
} IPV6_GLOBAL_PARAMETERS;
#define USE_ANON_NO 0 // Don't use anonymous addresses.
#define USE_ANON_YES 1 // Use them.
#define USE_ANON_ALWAYS 2 // Always generating random numbers.
#define USE_ANON_COUNTER 3 // Use them with per-interface counter.
//
// Initialize the fields of the IPV6_GLOBAL_PARAMETERS structure
// to values that indicate no change.
//
__inline void
IPV6_INIT_GLOBAL_PARAMETERS(IPV6_GLOBAL_PARAMETERS *Params)
{
Params->DefaultCurHopLimit = (unsigned int) -1;
Params->UseAnonymousAddresses = (unsigned int) -1;
Params->MaxAnonDADAttempts = (unsigned int) -1;
Params->MaxAnonValidLifetime = (unsigned int) -1;
Params->MaxAnonPreferredLifetime = (unsigned int) -1;
Params->AnonRegenerateTime = (unsigned int) -1;
Params->MaxAnonRandomTime = (unsigned int) -1;
Params->AnonRandomTime = (unsigned int) -1;
Params->NeighborCacheLimit = (unsigned int) -1;
Params->RouteCacheLimit = (unsigned int) -1;
Params->BindingCacheLimit = (unsigned int) -1;
Params->ReassemblyLimit = (unsigned int) -1;
Params->MobilitySecurity = -1;
}
//
// This IOCTL sets global IPv6 parameters.
// It uses the IPV6_GLOBAL_PARAMETERS structure.
//
// Note that changing these parameters typically does not affect
// existing uses of them. For example changing DefaultCurHopLimit
// will not affect the CurHopLimit of existing interfaces,
// but it will affect the CurHopLimit of new interfaces.
//
#define IOCTL_IPV6_UPDATE_GLOBAL_PARAMETERS \
_IPV6_CTL_CODE(31, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_IPV6_PERSISTENT_UPDATE_GLOBAL_PARAMETERS \
_IPV6_CTL_CODE(37, METHOD_BUFFERED, FILE_WRITE_ACCESS)
//
// This IOCTL retrieves information from the prefix policy table.
// It takes as input an IPV6_QUERY_PREFIX_POLICY structure
// and returns as output an IPV6_INFO_PREFIX_POLICY structure.
// To perform an iteration, start with PrefixLength set to -1, in which case
// only an IPV6_QUERY_PREFIX_POLICY is returned, for the first policy.
// If there are no more policies, then the PrefixLength in the returned
// IPV6_QUERY_PREFIX_POLICY will be -1.
//
#define IOCTL_IPV6_QUERY_PREFIX_POLICY \
_IPV6_CTL_CODE(32, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct ipv6_query_prefix_policy {
IPv6Addr Prefix;
unsigned int PrefixLength;
} IPV6_QUERY_PREFIX_POLICY;
typedef struct ipv6_info_prefix_policy {
IPV6_QUERY_PREFIX_POLICY Next; // For non-persistent queries only.
IPV6_QUERY_PREFIX_POLICY This;
unsigned int Precedence;
unsigned int SrcLabel;
unsigned int DstLabel;
} IPV6_INFO_PREFIX_POLICY;
//
// This IOCTL retrieves information about persisted prefix policies.
// It takes as input an IPV6_PERSISTENT_QUERY_PREFIX_POLICY structure
// and returns as output an IPV6_INFO_PREFIX_POLICY structure.
// (The Next field is not returned.)
// To perform an iteration, start with index 0 and increment
// until getting STATUS_NO_MORE_ENTRIES / ERROR_NO_MORE_ITEMS.
//
// An IOCTL to retrieve persisted prefix policies via prefix
// (like IPV6_QUERY_PREFIX_POLICY) is conceivable but not supported.
//
#define IOCTL_IPV6_PERSISTENT_QUERY_PREFIX_POLICY \
_IPV6_CTL_CODE(50, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct ipv6_persistent_query_prefix_policy {
unsigned int RegistryIndex;
} IPV6_PERSISTENT_QUERY_PREFIX_POLICY;
//
// This IOCTL adds a prefix to the prefix policy table,
// or updates an existing prefix policy.
// It uses the IPV6_INFO_PREFIX_POLICY structure.
// (The Next field is ignored.)
//
#define IOCTL_IPV6_UPDATE_PREFIX_POLICY \
_IPV6_CTL_CODE(33, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_IPV6_PERSISTENT_UPDATE_PREFIX_POLICY \
_IPV6_CTL_CODE(41, METHOD_BUFFERED, FILE_WRITE_ACCESS)
//
// This IOCTL removes a prefix from the prefix policy table.
// It uses the IPV6_QUERY_PREFIX_POLICY structure.
//
#define IOCTL_IPV6_DELETE_PREFIX_POLICY \
_IPV6_CTL_CODE(34, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_IPV6_PERSISTENT_DELETE_PREFIX_POLICY \
_IPV6_CTL_CODE(42, METHOD_BUFFERED, FILE_WRITE_ACCESS)
//
// This IOCTL deletes all manual configuration.
//
#define IOCTL_IPV6_RESET \
_IPV6_CTL_CODE(39, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_IPV6_PERSISTENT_RESET \
_IPV6_CTL_CODE(45, METHOD_BUFFERED, FILE_WRITE_ACCESS)
//
// This IOCTL sets the link-layer address of a default router
// on a non-broadcast multi-access (NBMA) link, such as the ISATAP
// link, where Router Solicitations, Router Advertistments, and
// Redirects are desired.
//
// There is no persistent version of this ioctl because
// 6to4svc always configures this information dynamically.
//
#define IOCTL_IPV6_UPDATE_ROUTER_LL_ADDRESS \
_IPV6_CTL_CODE(35, METHOD_BUFFERED, FILE_WRITE_ACCESS)
typedef struct ipv6_update_router_ll_address {
IPV6_QUERY_INTERFACE IF;
// Following this structure in memory are:
// Own link-layer address to use for EUI-64 creation.
// Link-layer address of router.
} IPV6_UPDATE_ROUTER_LL_ADDRESS;
//
// This IOCTL renews an interface, meaning that all
// auto-configured state is thrown away and regenerated.
// Same behavior as reconnecting the interface to a link.
// It uses the IPV6_QUERY_INTERFACE structure.
//
#define IOCTL_IPV6_RENEW_INTERFACE \
_IPV6_CTL_CODE(51, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#pragma warning(pop)
#endif // ifndef _NTDDIP6_