#ifndef _NETIODEF_ #define _NETIODEF_ #pragma once #ifdef __cplusplus extern "C" { #endif #include "ws2def.h" #include "ws2ipdef.h" #include "mswsockdef.h" #include "mstcpip.h" #include "nldef.h" #include "ifdef.h" #ifndef ASSERT #define ASSERT(x) ((void)0) #define NETIODEF_DEFINED_ASSERT #endif #ifndef NETIO_INLINE #if DBG #define NETIO_INLINE __inline #else #define NETIO_INLINE __forceinline #endif #endif #define IS_POWER_OF_TWO(x) (((x) != 0) && (((x) & ((x) - 1)) == 0)) #define IS_VALID_IPV4_MASK(x) ((x.S_un.S_addr == (ULONG)-1) || IS_POWER_OF_TWO(~RtlUlongByteSwap(x.S_un.S_addr)+1)) #ifndef BYTE_ORDER #define _LITTLE_ENDIAN 1234 #define _BIG_ENDIAN 4321 #define _PDP_ENDIAN 3412 #if defined(i286) || defined(i386) || defined(_AMD64_) || defined(_IA64_) #define BYTE_ORDER _LITTLE_ENDIAN #endif #endif /* BYTE_ORDER */ typedef UINT8 HANDLE8, *PHANDLE8; typedef UINT16 HANDLE16, *PHANDLE16; typedef UINT32 HANDLE32, *PHANDLE32; typedef UINT64 HANDLE64, *PHANDLE64; #define MAKE_DD_DEVICE_NAME(x) (L"\\Device\\" x) #define MAKE_WIN_DEVICE_NAME(x) (L"\\\\.\\" x) #define DL_ADDRESS_LENGTH_MAXIMUM IF_MAX_PHYS_ADDRESS_LENGTH #define DL_HEADER_LENGTH_MAXIMUM 64 #define DL_ETHERNET_HEADER_LENGTH_MAXIMUM (sizeof(ETHERNET_HEADER) + sizeof(SNAP_HEADER)) #define DL_TUNNEL_HEADER_LENGTH_MAXIMUM max(sizeof(IPV4_HEADER), sizeof(IPV6_HEADER)) #define EUI48_BROADCAST_INIT {0xff, 0xff, 0xff, 0xff, 0xff, 0xff} #define SNAP_DSAP 0xaa #define SNAP_SSAP 0xaa #define SNAP_CONTROL 0x03 #define SNAP_OUI 0x00 #define SNAP_TYPE_ARP ETHERNET_TYPE_ARP #define SNAP_TYPE_IPV4 ETHERNET_TYPE_IPV4 #define SNAP_TYPE_IPV6 ETHERNET_TYPE_IPV6 #define ETH_LENGTH_OF_HEADER 14 #define ETH_LENGTH_OF_VLAN_HEADER 4 #define ETH_LENGTH_OF_SNAP_HEADER 8 #define ETHERNET_TYPE_MINIMUM 0x0600 #define ETHERNET_TYPE_IPV4 0x0800 #define ETHERNET_TYPE_ARP 0x0806 #define ETHERNET_TYPE_IPV6 0x86dd #define ETHERNET_TYPE_802_1Q 0x8100 #define TOKENRING_ACCESSCONTROL 0x10 #define TOKENRING_FRAMECONTROL 0x40 #define SOURCEROUTE_RD_MAXIMUM 8 #define SOURCEROUTE_SIZE_MAXIMUM (sizeof(SOURCEROUTE_HEADER) + 2 * SOURCEROUTE_RD_MAXIMUM) #define SOURCEROUTE_UNSPECIFIED_INIT {{sizeof(SOURCEROUTE_HEADER), TokenRingSpanningTreeExplorer}, {0}} #define TOKENRING_MTU_DEFAULT 1500 #define TOKENRING_SOURCEROUTE_INDICATOR 0x80 #define FDDI_FRAMECODE 0x57 #define FDDI_MTU 4352 #define ARCNET_BROADCAST_MASK 0xff #define ARCNET_BROADCAST_VALUE 0x00 #define ARCNET_PROTOCOL_ARP 0xd5 #define ARCNET_PROTOCOL_IPV4 0xd4 #define ARCNET_PROTOCOL_IPV6 0xc4 #define ip4_hdr _IPV4_HEADER #define ip4_ver_hlen VersionAndHeaderLength #define ip4_ver Version #define ip4_hlen HeaderLength #define ip4_tos TypeOfService #define ip4_len TotalLength #define ip4_id Identification #define ip4_flags_offset FlagsAndOffset #define ip4_flags Flags #define ip4_offset FragmentOffset #define ip4_ttl TimeToLive #define ip4_protocol Protocol #define ip4_xsum HeaderChecksum #define ip4_src SourceAddress #define ip4_dest DestinationAddress #define IP_VER_MASK 0xF0 #define IPV4_VERSION 4 #define IPV4_DEFAULT_VERHLEN ((IPV4_VERSION << 4) | (sizeof(IPV4_HEADER) / sizeof(UINT32))) #define IPV4_TOS_MASK 0xFC #define MAX_IPV4_PACKET 65535 #define MAX_IPV4_PAYLOAD (MAX_IPV4_PACKET - sizeof(IPV4_HEADER)) #define MAX_IPV4_HLEN 60 #define IPV4_MINIMUM_MTU 576 #define IPV4_MINIMUM_ULMTU (IPV4_MINIMUM_MTU - sizeof(IPV4_HEADER)) #define MAX_IP_OPTIONS_LENGTH ((0xF * sizeof(UINT32)) - sizeof(IPV4_HEADER)) #define SIZEOF_IP_OPT_ROUTING_HEADER 3 #define SIZEOF_IP_OPT_TIMESTAMP_HEADER 4 #define SIZEOF_IP_OPT_SECURITY 11 #define SIZEOF_IP_OPT_STREAMIDENTIFIER 4 #define SIZEOF_IP_OPT_ROUTERALERT 4 #define IP4_OFF_MASK 0xff1f #define icmp4_hdr _ICMPV4_MESSAGE #define icmp4_type Header.Type #define icmp4_code Header.Code #define icmp4_cksum Header.Checksum #define icmp4_un_data32 Data32 #define icmp4_un_data16 Data16 #define icmp4_un_data8 Data8 #define icmp4_dataun Data #define icmp4_data32 icmp4_dataun.icmp4_un_data32 #define icmp4_data16 icmp4_dataun.icmp4_un_data16 #define icmp4_data8 icmp4_dataun.icmp4_un_data8 #define icmp4_pptr icmp4_data32[0] #define icmp4_mtu icmp4_data32[0] #define icmp4_id icmp4_data16[0] #define icmp4_seq icmp4_data16[1] #define icmp4_maxdelay icmp4_data16[0] #define RsType RsHeader.icmp4_type #define RsCode RsHeader.icmp4_code #define RsCksum RsHeader.icmp4_cksum #define RsReserved RsHeader.icmp4_data32[0] #define RaType RaHeader.icmp4_type #define RaCode RaHeader.icmp4_code #define RaCksum RaHeader.icmp4_cksum #define RaNumAddr RaHeader.icmp4_data8[0] #define RaAddrEntrySize RaHeader.icmp4_data8[1] #define RaAddrLifetime RaHeader.icmp4_data16[1] #define ICMPV4_INVALID_PREFERENCE_LEVEL 0x80000000 #define icmp4_ts_type Header.icmp4_type #define icmp4_ts_code Header.icmp4_code #define icmp4_ts_cksum Header.icmp4_cksum #define icmp4_ts_id Header.icmp4_id #define icmp4_ts_seq Header.icmp4_seq #define icmp4_ts_originate OriginateTimestamp #define icmp4_ts_receive ReceiveTimestamp #define icmp4_ts_transmit TransmitTimestamp #define IGMP_QUERY_TYPE 0x11 #define IGMP_VERSION1_REPORT_TYPE 0x12 #define IGMP_VERSION2_REPORT_TYPE 0x16 #define IGMP_LEAVE_GROUP_TYPE 0x17 #define IGMP_VERSION3_REPORT_TYPE 0x22 #define ip6_hdr _IPV6_HEADER #define ip6_flow VersionClassFlow #define ip6_plen PayloadLength #define ip6_nxt NextHeader #define ip6_hops HopLimit #define ip6_hlim HopLimit #define ip6_src SourceAddress #define ip6_dst DestinationAddress #define IP_VER_MASK 0xF0 #define IPV6_VERSION 0x60 #define IPV6_TRAFFIC_CLASS_MASK 0x0000C00F #define IPV6_ECN_MASK 0x00003000 #define IPV6_FLOW_LABEL_MASK 0xFFFF0F00 #define MAX_IPV6_PAYLOAD 65535 #define MAX_IPV6_PACKET (MAX_IPV6_PAYLOAD + sizeof(IPV6_HEADER)) #define IPV6_ECN_SHIFT 12 #define IPV6_MINIMUM_MTU 1280 #define IPV6_MINIMUM_ULMTU (IPV6_MINIMUM_MTU - sizeof(IPV6_HEADER)) #define IPV6_TRAFFIC_CLASS(VersionClassFlow) \ ((UCHAR)((((VersionClassFlow) & IPV6_TRAFFIC_CLASS_MASK) >> 12) + \ (((VersionClassFlow) & IPV6_TRAFFIC_CLASS_MASK) << 4))) #define ip6_frag _IPV6_FRAGMENT_HEADER #define ip6f_nxt NextHeader #define ip6f_reserved Reserved #define ip6f_offlg OffsetAndFlags #define ip6f_ident Id #define IP6F_OFF_MASK 0xf8ff #define IP6F_RESERVED_MASK 0x0600 #define IP6F_MORE_FRAG 0x0100 #define EXT_LEN_UNIT 8 #define IPV6_EXTENSION_HEADER_LENGTH(Blocks) ((Blocks + 1) * EXT_LEN_UNIT) #define MAX_IPV6_EXTENSION_HEADER_LENGTH IPV6_EXTENSION_HEADER_LENGTH(0xFF) #define IPV6_EXTENSION_HEADER_BLOCKS(Length) ((Length / EXT_LEN_UNIT) - 1) #define IP_AUTHENTICATION_HEADER_LENGTH(Blocks) ((Blocks + 2) * 4) #define IP_AUTHENTICATION_HEADER_BLOCKS(Length) (((Length + sizeof(AUTHENTICATION_HEADER)) / 4) - 2) #define IPV6_ROUTER_ALERT_LENGTH IPV6_EXTENSION_HEADER_LENGTH(0) #define ip6_hbh _IPV6_EXTENSION_HEADER #define ip6h_nxt NextHeader #define ip6h_len Length #define ip6_dest _IPV6_EXTENSION_HEADER #define ip6d_nxt NextHeader #define ip6d_len Length #define IP6OPT_TYPE(Type) ((Type) & 0xc0) #define IP6OPT_TYPE_SKIP 0x00 #define IP6OPT_TYPE_DISCARD 0x40 #define IP6OPT_TYPE_FORCEICMP 0x80 #define IP6OPT_TYPE_ICMP 0xc0 #define IP6OPT_MUTABLE 0x20 #define IP6OPT_ISMUTABLE(Type) (((Type) & IP6OPT_MUTABLE) != 0) #define ip6_opt_jumbo _IPV6_OPTION_JUMBOGRAM #define ip6oj_type Header.Type #define ip6oj_len Header.DataLength #define ip6oj_jumbo_len JumbogramLength #define ip6_opt_router _IPV6_OPTION_ROUTER_ALERT #define ip6or_type Header.Type #define ip6or_len Header.DataLength #define ip6or_value Value #define SIZEOF_IPV6_ROUTERALERT IPV6_EXTENSION_HEADER_LENGTH(0) #define ip6_rthdr _IPV6_ROUTING_HEADER #define ip6r_nxt NextHeader #define ip6r_len Length #define ip6r_type RoutingType #define ip6r_segleft SegmentsLeft #define icmp6_hdr _ICMPV6_MESSAGE #define icmp6_type Header.Type #define icmp6_code Header.Code #define icmp6_cksum Header.Checksum #define icmp6_un_data32 Data32 #define icmp6_un_data16 Data16 #define icmp6_un_data8 Data8 #define icmp6_dataun Data #define icmp6_data32 icmp6_dataun.icmp6_un_data32 #define icmp6_data16 icmp6_dataun.icmp6_un_data16 #define icmp6_data8 icmp6_dataun.icmp6_un_data8 #define icmp6_pptr icmp6_data32[0] #define icmp6_mtu icmp6_data32[0] #define icmp6_id icmp6_data16[0] #define icmp6_seq icmp6_data16[1] #define icmp6_maxdelay icmp6_data16[0] #define ICMP6_INFOMSG_MASK 0x80 #define ICMP6_DST_UNREACH_NOROUTE 0 #define ICMP6_DST_UNREACH_ADMIN 1 #define ICMP6_DST_UNREACH_BEYONDSCOPE 2 #define ICMP6_DST_UNREACH_ADDR 3 #define ICMP6_DST_UNREACH_NOPORT 4 #define ICMP6_TIME_EXCEED_TRANSIT 0 #define ICMP6_TIME_EXCEED_REASSEMBLY 1 #define ICMP6_PARAMPROB_HEADER 0 #define ICMP6_PARAMPROB_NEXTHEADER 1 #define ICMP6_PARAMPROB_OPTION 2 #define ICMPV6_ECHO_REQUEST_FLAG_REVERSE 0x1 #define nd_rs_type nd_rs_hdr.icmp6_type #define nd_rs_code nd_rs_hdr.icmp6_code #define nd_rs_cksum nd_rs_hdr.icmp6_cksum #define nd_rs_reserved nd_rs_hdr.icmp6_data32[0] #define nd_ra_type nd_ra_hdr.icmp6_type #define nd_ra_code nd_ra_hdr.icmp6_code #define nd_ra_cksum nd_ra_hdr.icmp6_cksum #define nd_ra_curhoplimit nd_ra_hdr.icmp6_data8[0] #define nd_ra_flags_reserved nd_ra_hdr.icmp6_data8[1] #define ND_RA_FLAG_MANAGED 0x80 #define ND_RA_FLAG_OTHER 0x40 #define ND_RA_FLAG_HOME_AGENT 0x20 #define ND_RA_FLAG_PREFERENCE 0x18 #define nd_ra_router_lifetime nd_ra_hdr.icmp6_data16[1] #define nd_ns_type nd_ns_hdr.icmp6_type #define nd_ns_code nd_ns_hdr.icmp6_code #define nd_ns_cksum nd_ns_hdr.icmp6_cksum #define nd_ns_reserved nd_ns_hdr.icmp6_data32[0] #define nd_na_type nd_na_hdr.icmp6_type #define nd_na_code nd_na_hdr.icmp6_code #define nd_na_cksum nd_na_hdr.icmp6_cksum #define nd_na_flags_reserved nd_na_hdr.icmp6_data32[0] #if (BYTE_ORDER == _BIG_ENDIAN) #define ND_NA_FLAG_ROUTER 0x80000000 #define ND_NA_FLAG_SOLICITED 0x40000000 #define ND_NA_FLAG_OVERRIDE 0x20000000 #else #define ND_NA_FLAG_ROUTER 0x00000080 #define ND_NA_FLAG_SOLICITED 0x00000040 #define ND_NA_FLAG_OVERRIDE 0x00000020 #endif /* (BYTE_ORDER == _BIG_ENDIAN) */ #define nd_rd_type nd_rd_hdr.icmp6_type #define nd_rd_code nd_rd_hdr.icmp6_code #define nd_rd_cksum nd_rd_hdr.icmp6_cksum #define nd_rd_reserved nd_rd_hdr.icmp6_data32[0] #define ND_OPT_PI_FLAG_ONLINK 0x80 #define ND_OPT_PI_FLAG_AUTO 0x40 #define ND_OPT_PI_FLAG_ROUTER_ADDR 0x20 #define ND_OPT_PI_FLAG_SITE_PREFIX 0x10 #define ND_OPT_PI_FLAG_ROUTE 0x01 #define ND_OPT_RI_FLAG_PREFERENCE 0x18 #define TH_MAX_LEN (0x0F << 2) #define TH_FIN 0x01 #define TH_SYN 0x02 #define TH_RST 0x04 #define TH_PSH 0x08 #define TH_ACK 0x10 #define TH_URG 0x20 #define TH_ECE 0x40 #define TH_CWR 0x80 #define TH_ALL (TH_FIN | TH_SYN | TH_RST | TH_PSH | TH_ACK | TH_URG | TH_ECE | TH_CWR) #define TH_SYN_ALL (TH_FIN | TH_SYN | TH_RST | TH_ACK) #define TH_OPT_EOL 0x00 #define TH_OPT_NOP 0x01 #define TH_OPT_MSS 0x02 #define TH_OPT_WS 0x03 #define TH_OPT_SACK_PERMITTED 0x04 #define TH_OPT_SACK 0x05 #define TH_OPT_TS 0x08 #define DL_SIZEOF_TUNNEL_ADDRESS(AddressBytes) (FIELD_OFFSET(DL_TUNNEL_ADDRESS, IpAddress) + (AddressBytes)) #define DL_SIZEOF_IPV4_TUNNEL_ADDRESS DL_SIZEOF_TUNNEL_ADDRESS(sizeof(IN_ADDR)) #define DL_SIZEOF_IPV6_TUNNEL_ADDRESS DL_SIZEOF_TUNNEL_ADDRESS(sizeof(IN6_ADDR)) #define FL_PACKET_TYPE_FLAGS (NDIS_PACKET_TYPE_ALL_MULTICAST | NDIS_PACKET_TYPE_PROMISCUOUS) #define mld_type IcmpHeader.Type #define mld_checksum IcmpHeader.Checksum #ifndef _DEFINE_DL_ADDRESS_TYPE_ #define _DEFINE_DL_ADDRESS_TYPE_ typedef enum { DlUnicast, DlMulticast, DlBroadcast } DL_ADDRESS_TYPE, *PDL_ADDRESS_TYPE; #endif union _DL_OUI { UINT8 Byte[3]; struct { UINT8 Group:1; UINT8 Local:1; }; }; typedef union _DL_OUI DL_OUI, *PDL_OUI; union _DL_EI48 { UINT8 Byte[3]; }; typedef union _DL_EI48 DL_EI48, *PDL_EI48; union _DL_EUI48 { UINT8 Byte[6]; struct { DL_OUI Oui; DL_EI48 Ei48; }; }; C_ASSERT(DL_ADDRESS_LENGTH_MAXIMUM >= sizeof(DL_EUI48)); extern CONST DL_EUI48 eui48_broadcast; union _DL_EI64 { UINT8 Byte[5]; }; typedef union _DL_EI64 DL_EI64, *PDL_EI64; union _DL_EUI64 { UINT8 Byte[8]; UINT64 Value; struct { DL_OUI Oui; union { DL_EI64 Ei64; struct { UINT8 Type; UINT8 Tse; DL_EI48 Ei48; }; }; }; }; typedef union _DL_EUI64 DL_EUI64, *PDL_EUI64; typedef struct _SNAP_HEADER { UINT8 Dsap; UINT8 Ssap; UINT8 Control; UINT8 Oui[3]; UINT16 Type; } SNAP_HEADER, *PSNAP_HEADER; typedef struct _ETHERNET_HEADER { DL_EUI48 Destination; DL_EUI48 Source; union { UINT16 Type; UINT16 Length; }; } ETHERNET_HEADER, *PETHERNET_HEADER; C_ASSERT(ETH_LENGTH_OF_HEADER == sizeof(ETHERNET_HEADER)); C_ASSERT(ETH_LENGTH_OF_SNAP_HEADER == sizeof(SNAP_HEADER)); typedef struct _VLAN_TAG { union { UINT16 Tag; struct { UINT16 VID:12; UINT16 CFI:1; UINT16 User_Priority:3; }; }; UINT16 Type; } VLAN_TAG; C_ASSERT(ETH_LENGTH_OF_VLAN_HEADER == sizeof(VLAN_TAG)); NETIO_INLINE DL_ADDRESS_TYPE EthernetAddressType( _In_reads_(sizeof(DL_EUI48)) CONST UCHAR *Address) { if (((PDL_EUI48) Address)->Oui.Group) { if (RtlEqualMemory(Address, &eui48_broadcast, sizeof(DL_EUI48))) { return DlBroadcast; } return DlMulticast; } else { return DlUnicast; } } typedef struct _TOKENRING_HEADER { UINT8 AcccessControl; UINT8 FrameControl; DL_EUI48 Destination; DL_EUI48 Source; } TOKENRING_HEADER, *PTOKENRING_HEADER; typedef struct _SOURCEROUTE_HEADER { union { struct { UINT8 Length:5; UINT8 BroadcastIndicator:3; }; UINT8 Bil; }; union { struct { UINT8 Direction:1; UINT8 LargestFrame:4; UINT8 Reserved:3; }; UINT8 Dlf; }; UINT16 Rd[0]; } SOURCEROUTE_HEADER, *PSOURCEROUTE_HEADER; typedef enum { TokenRingSpecificallyRoutedFrame = 0, TokenRingAllRoutesExplorer = 4, TokenRingSpanningTreeExplorer = 6, } TOKENRING_BROADCAST_INDICATOR, *PTOKENRING_BROADCAST_INDICATOR; extern CONST SOURCEROUTE_HEADER sourceroute_unspecified; C_ASSERT((sizeof(TOKENRING_HEADER) + sizeof(SNAP_HEADER) + SOURCEROUTE_SIZE_MAXIMUM) < DL_HEADER_LENGTH_MAXIMUM); __inline BOOLEAN TokenRingGetSourceRouteIndicator( _In_ CONST UNALIGNED DL_EUI48 *Source) { return ((Source->Byte[0] & TOKENRING_SOURCEROUTE_INDICATOR) != 0); } __inline VOID TokenRingSetSourceRouteIndicator( _Out_ UNALIGNED DL_EUI48 *Source) { Source->Byte[0] |= TOKENRING_SOURCEROUTE_INDICATOR; } __inline VOID TokenRingResetSourceRouteIndicator( _Out_ UNALIGNED DL_EUI48 *Source) { Source->Byte[0] &= ~TOKENRING_SOURCEROUTE_INDICATOR; } NETIO_INLINE DL_ADDRESS_TYPE TokenRingAddressType( _In_ CONST UCHAR *Address) { if (TokenRingGetSourceRouteIndicator((PDL_EUI48) Address)) { if (RtlEqualMemory(Address, &eui48_broadcast, sizeof(DL_EUI48))) { return DlBroadcast; } return DlMulticast; } else { return DlUnicast; } } typedef struct _FDDI_HEADER { UINT8 FrameCode; DL_EUI48 Destination; DL_EUI48 Source; } FDDI_HEADER, *PFDDI_HEADER; typedef struct _ARCNET_HEADER { UINT8 Source; UINT8 Destination; UINT8 Protocol; } ARCNET_HEADER, *PARCNET_HEADER; typedef struct _ICMP_HEADER { UINT8 Type; UINT8 Code; UINT16 Checksum; } ICMP_HEADER, *PICMP_HEADER; typedef struct _ICMP_MESSAGE { ICMP_HEADER Header; union { UINT32 Data32[1]; UINT16 Data16[2]; UINT8 Data8[4]; } Data; } ICMP_MESSAGE, *PICMP_MESSAGE; typedef ICMP_HEADER ICMPV6_HEADER, *PICMPV6_HEADER; typedef ICMP_MESSAGE ICMPV6_MESSAGE, *PICMPV6_MESSAGE; typedef struct _IPV4_HEADER { union { UINT8 VersionAndHeaderLength; struct { UINT8 HeaderLength:4; UINT8 Version:4; }; }; union { UINT8 TypeOfServiceAndEcnField; struct { UINT8 EcnField:2; UINT8 TypeOfService:6; }; }; UINT16 TotalLength; UINT16 Identification; union { UINT16 FlagsAndOffset; struct { UINT16 DontUse1:5; UINT16 MoreFragments:1; UINT16 DontFragment:1; UINT16 Reserved:1; UINT16 DontUse2:8; }; }; UINT8 TimeToLive; UINT8 Protocol; UINT16 HeaderChecksum; IN_ADDR SourceAddress; IN_ADDR DestinationAddress; } IPV4_HEADER, *PIPV4_HEADER; C_ASSERT(sizeof(IPV4_HEADER) == 20); __inline UCHAR Ip4HeaderLengthInBytes( _In_ CONST UNALIGNED IPV4_HEADER *Header) { return (Header->HeaderLength << 2); } #if defined(_NTDDK_) || defined(_NTRTL_) __inline UINT16 Ip4FragmentOffset( _In_ CONST UNALIGNED IPV4_HEADER *Header) { return RtlUshortByteSwap(Header->FlagsAndOffset & IP4_OFF_MASK) << 3; } #endif typedef struct _IPV4_OPTION_HEADER { union { UINT8 OptionType; struct { UINT8 OptionNumber:5; UINT8 OptionClass:2; UINT8 CopiedFlag:1; }; }; UINT8 OptionLength; } IPV4_OPTION_HEADER, *PIPV4_OPTION_HEADER; C_ASSERT(sizeof(IPV4_OPTION_HEADER) == 2); #if !defined(IP_EXPORT_INCLUDED) typedef enum { IP_OPT_EOL = 0x00, IP_OPT_NOP = 0x01, IP_OPT_SECURITY = 0x82, IP_OPT_LSRR = 0x83, IP_OPT_TS = 0x44, IP_OPT_RR = 0x07, IP_OPT_SSRR = 0x89, IP_OPT_SID = 0x88, IP_OPT_ROUTER_ALERT = 0x94, IP_OPT_MULTIDEST = 0x95, } IPV4_OPTION_TYPE; #else typedef ULONG IPV4_OPTION_TYPE; #endif typedef struct _IPV4_TIMESTAMP_OPTION { #ifdef __cplusplus IPV4_OPTION_HEADER OptionHeader; #else IPV4_OPTION_HEADER; #endif UINT8 Pointer; union { UINT8 FlagsOverflow; struct { UINT8 Flags:4; UINT8 Overflow:4; }; }; } IPV4_TIMESTAMP_OPTION, *PIPV4_TIMESTAMP_OPTION; typedef enum { IP_OPTION_TIMESTAMP_ONLY = 0, IP_OPTION_TIMESTAMP_ADDRESS = 1, IP_OPTION_TIMESTAMP_SPECIFIC_ADDRESS = 3 } IP_OPTION_TIMESTAMP_FLAGS; typedef struct _IPV4_ROUTING_HEADER { #ifdef __cplusplus IPV4_OPTION_HEADER OptionHeader; #else IPV4_OPTION_HEADER; #endif UINT8 Pointer; } IPV4_ROUTING_HEADER, UNALIGNED *PIPV4_ROUTING_HEADER; typedef ICMP_HEADER ICMPV4_HEADER, *PICMPV4_HEADER; typedef ICMP_MESSAGE ICMPV4_MESSAGE, *PICMPV4_MESSAGE; typedef enum { ICMP4_UNREACH_NET = 0, ICMP4_UNREACH_HOST = 1, ICMP4_UNREACH_PROTOCOL = 2, ICMP4_UNREACH_PORT = 3, ICMP4_UNREACH_FRAG_NEEDED = 4, ICMP4_UNREACH_SOURCEROUTE_FAILED = 5, ICMP4_UNREACH_NET_UNKNOWN = 6, ICMP4_UNREACH_HOST_UNKNOWN = 7, ICMP4_UNREACH_ISOLATED = 8, ICMP4_UNREACH_NET_ADMIN = 9, ICMP4_UNREACH_HOST_ADMIN = 10, ICMP4_UNREACH_NET_TOS = 11, ICMP4_UNREACH_HOST_TOS = 12, ICMP4_UNREACH_ADMIN = 13, } ICMP4_UNREACH_CODE, *PICMP4_UNREACH_CODE; typedef enum { ICMP4_TIME_EXCEED_TRANSIT = 0, ICMP4_TIME_EXCEED_REASSEMBLY = 1, } ICMP4_TIME_EXCEED_CODE, *PICMP4_TIME_EXCEED_CODE; typedef struct _ICMPV4_ROUTER_SOLICIT { ICMPV4_MESSAGE RsHeader; } ICMPV4_ROUTER_SOLICIT, *PICMPV4_ROUTER_SOLICIT; typedef struct _ICMPV4_ROUTER_ADVERT_HEADER { ICMPV4_MESSAGE RaHeader; } ICMPV4_ROUTER_ADVERT_HEADER, *PICMPV4_ROUTER_ADVERT_HEADER; typedef struct _ICMPV4_ROUTER_ADVERT_ENTRY { IN_ADDR RouterAdvertAddr; LONG PreferenceLevel; } ICMPV4_ROUTER_ADVERT_ENTRY, *PICMPV4_ROUTER_ADVERT_ENTRY; typedef struct _ICMPV4_TIMESTAMP_MESSAGE { ICMPV4_MESSAGE Header; UINT32 OriginateTimestamp; UINT32 ReceiveTimestamp; UINT32 TransmitTimestamp; } ICMPV4_TIMESTAMP_MESSAGE, *PICMPV4_TIMESTAMP_MESSAGE; typedef struct _ICMPV4_ADDRESS_MASK_MESSAGE { ICMPV4_MESSAGE Header; UINT32 AddressMask; } ICMPV4_ADDRESS_MASK_MESSAGE, *PICMPV4_ADDRESS_MASK_MESSAGE; typedef struct _ARP_HEADER { USHORT HardwareAddressSpace; USHORT ProtocolAddressSpace; UCHAR HardwareAddressLength; UCHAR ProtocolAddressLength; USHORT Opcode; UCHAR SenderHardwareAddress[0]; } ARP_HEADER, *PARP_HEADER; typedef enum { ARP_REQUEST = 1, ARP_RESPONSE = 2 } ARP_OPCODE; typedef enum { ARP_HW_ENET = 1, ARP_HW_802 = 6 } ARP_HARDWARE_TYPE; typedef struct _IGMP_HEADER { union { struct { UINT8 Type:4; UINT8 Version:4; }; UINT8 VersionType; }; union { UINT8 Reserved; UINT8 MaxRespTime; UINT8 Code; }; UINT16 Checksum; IN_ADDR MulticastAddress; } IGMP_HEADER, *PIGMP_HEADER; typedef enum { IGMP_MAX_RESP_CODE_TYPE_NORMAL = 0, IGMP_MAX_RESP_CODE_TYPE_FLOAT } IGMP_MAX_RESP_CODE_TYPE; typedef struct _IGMPV3_QUERY_HEADER { UINT8 Type; union { UINT8 MaxRespCode; struct { UINT8 MaxRespCodeMantissa:4; UINT8 MaxRespCodeExponent:3; UINT8 MaxRespCodeType:1; }; }; UINT16 Checksum; IN_ADDR MulticastAddress; UINT8 QuerierRobustnessVariable:3; UINT8 SuppressRouterSideProcessing:1; UINT8 Reserved:4; union { UINT8 QueriersQueryInterfaceCode; struct { UINT8 QQCMantissa:4; UINT8 QQCExponent:3; UINT8 QQCType:1; }; }; UINT16 SourceCount; } IGMPV3_QUERY_HEADER, *PIGMPV3_QUERY_HEADER; typedef struct _IGMPV3_REPORT_RECORD_HEADER { UINT8 Type; UINT8 AuxillaryDataLength; UINT16 SourceCount; IN_ADDR MulticastAddress; } IGMPV3_REPORT_RECORD_HEADER, *PIGMPV3_REPORT_RECORD_HEADER; typedef struct _IGMPV3_REPORT_HEADER_ { UINT8 Type; UINT8 Reserved; UINT16 Checksum; UINT16 Reserved2; UINT16 RecordCount; } IGMPV3_REPORT_HEADER, *PIGMPV3_REPORT_HEADER; typedef struct _IPV6_HEADER { UINT32 VersionClassFlow; UINT16 PayloadLength; UINT8 NextHeader; UINT8 HopLimit; IN6_ADDR SourceAddress; IN6_ADDR DestinationAddress; } IPV6_HEADER, *PIPV6_HEADER; typedef struct _IPV6_FRAGMENT_HEADER { UINT8 NextHeader; UINT8 Reserved; union { struct { UINT16 DontUse1:8; UINT16 MoreFragments:1; UINT16 ReservedBits:2; UINT16 DontUse2:5; }; UINT16 OffsetAndFlags; }; UINT32 Id; } IPV6_FRAGMENT_HEADER, *PIPV6_FRAGMENT_HEADER; C_ASSERT(sizeof(IPV6_FRAGMENT_HEADER) == 8); #if defined(_NTDDK_) || defined(_NTRTL_) __inline UINT16 Ip6FragmentOffset( _In_ CONST UNALIGNED IPV6_FRAGMENT_HEADER *Header) { return RtlUshortByteSwap(Header->OffsetAndFlags & IP6F_OFF_MASK); } #endif typedef struct _IPV6_EXTENSION_HEADER { UINT8 NextHeader; UINT8 Length; } IPV6_EXTENSION_HEADER, *PIPV6_EXTENSION_HEADER; typedef struct _IPV6_OPTION_HEADER { UINT8 Type; UINT8 DataLength; } IPV6_OPTION_HEADER, *PIPV6_OPTION_HEADER; typedef enum { IP6OPT_PAD1 = 0x00, IP6OPT_PADN = 0x01, IP6OPT_TUNNEL_LIMIT = 0x04, IP6OPT_ROUTER_ALERT = 0x05, IP6OPT_JUMBO = 0xc2, IP6OPT_NSAP_ADDR = 0xc3, } IPV6_OPTION_TYPE, *PIPV6_OPTION_TYPE; typedef struct _IPV6_OPTION_JUMBOGRAM { IPV6_OPTION_HEADER Header; UINT8 JumbogramLength[4]; } IPV6_OPTION_JUMBOGRAM, *PIPV6_OPTION_JUMBOGRAM; typedef struct _IPV6_OPTION_ROUTER_ALERT { IPV6_OPTION_HEADER Header; UINT8 Value[2]; } IPV6_OPTION_ROUTER_ALERT, *PIPV6_OPTION_ROUTER_ALERT; typedef _Struct_size_bytes_(_Inexpressible_(Length)) struct _IPV6_ROUTING_HEADER { UCHAR NextHeader; UCHAR Length; UCHAR RoutingType; UCHAR SegmentsLeft; UCHAR Reserved[4]; } IPV6_ROUTING_HEADER, *PIPV6_ROUTING_HEADER; typedef struct nd_router_solicit { ICMPV6_MESSAGE nd_rs_hdr; } ND_ROUTER_SOLICIT_HEADER, *PND_ROUTER_SOLICIT_HEADER; typedef struct nd_router_advert { ICMPV6_MESSAGE nd_ra_hdr; UINT32 nd_ra_reachable; UINT32 nd_ra_retransmit; } ND_ROUTER_ADVERT_HEADER, *PND_ROUTER_ADVERT_HEADER; typedef union _IPV6_ROUTER_ADVERTISEMENT_FLAGS { struct { UINT8 Reserved:3; UINT8 Preference:2; UINT8 HomeAgent:1; UINT8 OtherStatefulConfiguration:1; UINT8 ManagedAddressConfiguration:1; }; UINT8 Value; } IPV6_ROUTER_ADVERTISEMENT_FLAGS, *PIPV6_ROUTER_ADVERTISEMENT_FLAGS; typedef struct nd_neighbor_solicit { ICMPV6_MESSAGE nd_ns_hdr; IN6_ADDR nd_ns_target; } ND_NEIGHBOR_SOLICIT_HEADER, *PND_NEIGHBOR_SOLICIT_HEADER; typedef struct nd_neighbor_advert { ICMPV6_MESSAGE nd_na_hdr; IN6_ADDR nd_na_target; } ND_NEIGHBOR_ADVERT_HEADER, *PND_NEIGHBOR_ADVERT_HEADER; typedef union _IPV6_NEIGHBOR_ADVERTISEMENT_FLAGS { struct { UINT8 Reserved1:5; UINT8 Override:1; UINT8 Solicited:1; UINT8 Router:1; UINT8 Reserved2[3]; }; UINT32 Value; } IPV6_NEIGHBOR_ADVERTISEMENT_FLAGS, *PIPV6_NEIGHBOR_ADVERTISEMENT_FLAGS; typedef struct nd_redirect { ICMPV6_MESSAGE nd_rd_hdr; IN6_ADDR nd_rd_target; IN6_ADDR nd_rd_dst; } ND_REDIRECT_HEADER, *PND_REDIRECT_HEADER; typedef struct nd_opt_hdr { UINT8 nd_opt_type; UINT8 nd_opt_len; } ND_OPTION_HDR, *PND_OPTION_HDR; typedef enum { ND_OPT_SOURCE_LINKADDR = 1, ND_OPT_TARGET_LINKADDR = 2, ND_OPT_PREFIX_INFORMATION = 3, ND_OPT_REDIRECTED_HEADER = 4, ND_OPT_MTU = 5, ND_OPT_NBMA_SHORTCUT_LIMIT = 6, ND_OPT_ADVERTISEMENT_INTERVAL = 7, ND_OPT_HOME_AGENT_INFORMATION = 8, ND_OPT_SOURCE_ADDR_LIST = 9, ND_OPT_TARGET_ADDR_LIST = 10, ND_OPT_ROUTE_INFO = 24, } ND_OPTION_TYPE, *PND_OPTION_TYPE; typedef struct nd_opt_prefix_info { UINT8 nd_opt_pi_type; UINT8 nd_opt_pi_len; UINT8 nd_opt_pi_prefix_len; union { UINT8 nd_opt_pi_flags_reserved; struct { UINT8 Route : 1; // Least significant bit. UINT8 Reserved1 : 3; UINT8 SitePrefix : 1; UINT8 RouterAddress : 1; UINT8 Autonomous : 1; UINT8 OnLink : 1; } Flags; }; UINT32 nd_opt_pi_valid_time; UINT32 nd_opt_pi_preferred_time; union { UINT32 nd_opt_pi_reserved2; struct { UINT8 nd_opt_pi_reserved3[3]; UINT8 nd_opt_pi_site_prefix_len; }; }; IN6_ADDR nd_opt_pi_prefix; } ND_OPTION_PREFIX_INFO, *PND_OPTION_PREFIX_INFO; typedef struct nd_opt_rd_hdr { UINT8 nd_opt_rh_type; UINT8 nd_opt_rh_len; UINT16 nd_opt_rh_reserved1; UINT32 nd_opt_rh_reserved2; } ND_OPTION_RD_HDR, *PND_OPTION_RD_HDR; typedef struct nd_opt_mtu { UINT8 nd_opt_mtu_type; UINT8 nd_opt_mtu_len; UINT16 nd_opt_mtu_reserved; UINT32 nd_opt_mtu_mtu; } ND_OPTION_MTU, *PND_OPTION_MTU; typedef struct nd_opt_route_info { UINT8 nd_opt_ri_type; UINT8 nd_opt_ri_len; UINT8 nd_opt_ri_prefix_len; union { UINT8 nd_opt_ri_flags_reserved; struct { UINT8 Reserved:3; UINT8 Preference:2; } Flags; }; UINT32 nd_opt_ri_route_lifetime; IN6_ADDR nd_opt_ri_prefix; } ND_OPTION_ROUTE_INFO, *PND_OPTION_ROUTE_INFO; typedef struct _MLD_HEADER { ICMPV6_HEADER IcmpHeader; UINT16 MaxRespTime; UINT16 Reserved; IN6_ADDR MulticastAddress; } MLD_HEADER, *PMLD_HEADER; typedef enum { MLD_MAX_RESP_CODE_TYPE_NORMAL = 0, MLD_MAX_RESP_CODE_TYPE_FLOAT } MLD_MAX_RESP_CODE_TYPE; typedef struct _MLDV2_QUERY_HEADER { ICMPV6_HEADER IcmpHeader; union { UINT16 MaxRespCode; struct { UINT16 MaxRespCodeMantissaHi:4; UINT16 MaxRespCodeExponent:3; UINT16 MaxRespCodeType:1; UINT16 MaxRespCodeMantissaLo:8; }; }; UINT16 Reserved; IN6_ADDR MulticastAddress; UINT8 QuerierRobustnessVariable:3; UINT8 SuppressRouterSideProcessing:1; UINT8 QueryReserved:4; union { UINT8 QueriersQueryInterfaceCode; struct { UINT8 QQCMantissa:4; UINT8 QQCExponent:3; UINT8 QQCType:1; }; }; UINT16 SourceCount; } MLDV2_QUERY_HEADER, *PMLDV2_QUERY_HEADER; typedef struct _MLDV2_REPORT_RECORD_HEADER { UINT8 Type; UINT8 AuxillaryDataLength; UINT16 SourceCount; IN6_ADDR MulticastAddress; } MLDV2_REPORT_RECORD_HEADER, *PMLDV2_REPORT_RECORD_HEADER; typedef struct _MLDV2_REPORT_HEADER { ICMPV6_HEADER IcmpHeader; UINT16 Reserved; UINT16 RecordCount; } MLDV2_REPORT_HEADER, *PMLDV2_REPORT_HEADER; typedef UINT32 SEQ_NUM, *PSEQ_NUM; #pragma pack(push, 1) typedef struct tcp_hdr { UINT16 th_sport; UINT16 th_dport; SEQ_NUM th_seq; SEQ_NUM th_ack; UINT8 th_x2:4; UINT8 th_len:4; UINT8 th_flags; UINT16 th_win; UINT16 th_sum; UINT16 th_urp; } TCP_HDR; #if NDIS_RECEIVE_UNALIGNED typedef TCP_HDR UNALIGNED *PTCP_HDR; #else typedef TCP_HDR *PTCP_HDR; #endif typedef struct tcp_opt_mss { UINT8 Kind; UINT8 Length; UINT16 Mss; } TCP_OPT_MSS; typedef struct tcp_opt_ws { UINT8 Kind; UINT8 Length; UINT8 ShiftCnt; } TCP_OPT_WS; typedef struct tcp_opt_sack_permitted { UINT8 Kind; UINT8 Length; } TCP_OPT_SACK_PERMITTED; typedef struct tcp_opt_sack { UINT8 Kind; UINT8 Length; struct tcp_opt_sack_block { SEQ_NUM Left; SEQ_NUM Right; } Block[0]; } TCP_OPT_SACK; typedef struct tcp_opt_ts { UINT8 Kind; UINT8 Length; UINT32 Val; UINT32 EcR; } TCP_OPT_TS; typedef struct tcp_opt_unknown { UINT8 Kind; UINT8 Length; } TCP_OPT_UNKNOWN; #pragma pack(pop) typedef struct DL_TUNNEL_ADDRESS { COMPARTMENT_ID CompartmentId; SCOPE_ID ScopeId; UCHAR IpAddress[0]; } DL_TUNNEL_ADDRESS, *PDL_TUNNEL_ADDRESS; C_ASSERT(DL_ADDRESS_LENGTH_MAXIMUM >= DL_SIZEOF_IPV4_TUNNEL_ADDRESS); C_ASSERT(DL_ADDRESS_LENGTH_MAXIMUM >= DL_SIZEOF_IPV6_TUNNEL_ADDRESS); typedef enum _TUNNEL_SUB_TYPE { TUNNEL_SUB_TYPE_NONE = 0, TUNNEL_SUB_TYPE_CP = 1, TUNNEL_SUB_TYPE_IPTLS = 2 } TUNNEL_SUB_TYPE, *PTUNNEL_SUB_TYPE; #pragma pack(push, 1) typedef struct DL_TEREDO_ADDRESS { UINT8 Reserved[6]; union { DL_EUI64 Eui64; struct { USHORT Flags; USHORT MappedPort; IN_ADDR MappedAddress; }; }; } DL_TEREDO_ADDRESS, *PDL_TEREDO_ADDRESS; typedef struct _IPTLS_METADATA { ULONGLONG SequenceNumber; } IPTLS_METADATA,*PIPTLS_METADATA; #pragma pack(pop) C_ASSERT(DL_ADDRESS_LENGTH_MAXIMUM >= sizeof(DL_TEREDO_ADDRESS)); typedef enum _NPI_MODULEID_TYPE { MIT_GUID = 1, MIT_IF_LUID, } NPI_MODULEID_TYPE; typedef struct _NPI_MODULEID { USHORT Length; NPI_MODULEID_TYPE Type; #ifdef __midl [switch_type(NPI_MODULEID_TYPE), switch_is(Type)] #endif union { #ifdef __midl [case(MIT_GUID)] #endif GUID Guid; #ifdef __midl [case(MIT_IF_LUID)] #endif LUID IfLuid; #ifdef __midl [default]; #endif }; } NPI_MODULEID; typedef CONST NPI_MODULEID *PNPI_MODULEID; #if !defined(__midl) __inline BOOLEAN NmrIsEqualNpiModuleId( _In_ PNPI_MODULEID ModuleId1, _In_ PNPI_MODULEID ModuleId2) { if (ModuleId1->Type == ModuleId2->Type) { if (ModuleId1->Type == MIT_GUID) { #ifdef __cplusplus return !!InlineIsEqualGUID(ModuleId1->Guid, ModuleId2->Guid); #else return (BOOLEAN)InlineIsEqualGUID(&ModuleId1->Guid, &ModuleId2->Guid); #endif } else if (ModuleId1->Type == MIT_IF_LUID) { return (BOOLEAN)RtlEqualMemory(&ModuleId1->IfLuid, &ModuleId2->IfLuid, sizeof(LUID)); } } return FALSE; } #endif typedef GUID NPIID; typedef CONST NPIID *PNPIID; extern CONST NPI_MODULEID NPI_MS_NMR_MODULEID; extern CONST NPIID NPI_FRAMING_LAYER_ID; extern CONST NPI_MODULEID NPI_MS_TUN_MODULEID; extern CONST NPI_MODULEID NPI_MS_FL48_MODULEID; extern CONST NPI_MODULEID NPI_MS_FL68_MODULEID; extern CONST NPI_MODULEID NPI_MS_FL4L_MODULEID; extern CONST NPI_MODULEID NPI_MS_FL6L_MODULEID; extern CONST NPI_MODULEID NPI_MS_FL4T_MODULEID; extern CONST NPI_MODULEID NPI_MS_FL6T_MODULEID; extern CONST NPI_MODULEID NPI_MS_WANARPV4_MODULEID; extern CONST NPI_MODULEID NPI_MS_WANARPV6_MODULEID; extern CONST NPI_MODULEID NPI_MS_FL_WANARP_MODULEID; extern CONST NPI_MODULEID NPI_MS_NDIS_MODULEID; extern CONST NPIID NPI_NETWORK_LAYER_ID; extern CONST NPI_MODULEID NPI_MS_IPV6_MODULEID; extern CONST NPI_MODULEID NPI_MS_IPV4_MODULEID; #ifdef NETIODEF_DEFINED_ASSERT #undef ASSERT #endif #ifdef __cplusplus } #endif #endif /* _NETIODEF_ */