// -*- 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 // // 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 #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 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 #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_