12 #include "mswsockdef.h"
19 #define ASSERT(x) ((void)0)
20 #define NETIODEF_DEFINED_ASSERT
25 #define NETIO_INLINE __inline
27 #define NETIO_INLINE __forceinline
31 #define IS_POWER_OF_TWO(x) (((x) != 0) && (((x) & ((x) - 1)) == 0))
32 #define IS_VALID_IPV4_MASK(x) ((x.S_un.S_addr == (ULONG)-1) || IS_POWER_OF_TWO(~RtlUlongByteSwap(x.S_un.S_addr)+1))
36 #define _LITTLE_ENDIAN 1234
37 #define _BIG_ENDIAN 4321
38 #define _PDP_ENDIAN 3412
40 #if defined(i286) || defined(i386) || defined(_AMD64_) || defined(_IA64_)
41 #define BYTE_ORDER _LITTLE_ENDIAN
44 #endif /* BYTE_ORDER */
46 typedef UINT8 HANDLE8
, *PHANDLE8
;
47 typedef UINT16 HANDLE16
, *PHANDLE16
;
48 typedef UINT32 HANDLE32
, *PHANDLE32
;
49 typedef UINT64 HANDLE64
, *PHANDLE64
;
51 #define MAKE_DD_DEVICE_NAME(x) (L"\\Device\\" x)
52 #define MAKE_WIN_DEVICE_NAME(x) (L"\\\\.\\" x)
54 #define DL_ADDRESS_LENGTH_MAXIMUM IF_MAX_PHYS_ADDRESS_LENGTH
55 #define DL_HEADER_LENGTH_MAXIMUM 64
56 #define DL_ETHERNET_HEADER_LENGTH_MAXIMUM (sizeof(ETHERNET_HEADER) + sizeof(SNAP_HEADER))
57 #define DL_TUNNEL_HEADER_LENGTH_MAXIMUM max(sizeof(IPV4_HEADER), sizeof(IPV6_HEADER))
59 #define EUI48_BROADCAST_INIT {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
61 #define SNAP_DSAP 0xaa
62 #define SNAP_SSAP 0xaa
63 #define SNAP_CONTROL 0x03
66 #define SNAP_TYPE_ARP ETHERNET_TYPE_ARP
67 #define SNAP_TYPE_IPV4 ETHERNET_TYPE_IPV4
68 #define SNAP_TYPE_IPV6 ETHERNET_TYPE_IPV6
70 #define ETH_LENGTH_OF_HEADER 14
71 #define ETH_LENGTH_OF_VLAN_HEADER 4
72 #define ETH_LENGTH_OF_SNAP_HEADER 8
74 #define ETHERNET_TYPE_MINIMUM 0x0600
75 #define ETHERNET_TYPE_IPV4 0x0800
76 #define ETHERNET_TYPE_ARP 0x0806
77 #define ETHERNET_TYPE_IPV6 0x86dd
78 #define ETHERNET_TYPE_802_1Q 0x8100
80 #define TOKENRING_ACCESSCONTROL 0x10
81 #define TOKENRING_FRAMECONTROL 0x40
83 #define SOURCEROUTE_RD_MAXIMUM 8
84 #define SOURCEROUTE_SIZE_MAXIMUM (sizeof(SOURCEROUTE_HEADER) + 2 * SOURCEROUTE_RD_MAXIMUM)
86 #define SOURCEROUTE_UNSPECIFIED_INIT {{sizeof(SOURCEROUTE_HEADER), TokenRingSpanningTreeExplorer}, {0}}
88 #define TOKENRING_MTU_DEFAULT 1500
89 #define TOKENRING_SOURCEROUTE_INDICATOR 0x80
91 #define FDDI_FRAMECODE 0x57
94 #define ARCNET_BROADCAST_MASK 0xff
95 #define ARCNET_BROADCAST_VALUE 0x00
96 #define ARCNET_PROTOCOL_ARP 0xd5
97 #define ARCNET_PROTOCOL_IPV4 0xd4
98 #define ARCNET_PROTOCOL_IPV6 0xc4
100 #define ip4_hdr _IPV4_HEADER
101 #define ip4_ver_hlen VersionAndHeaderLength
102 #define ip4_ver Version
103 #define ip4_hlen HeaderLength
104 #define ip4_tos TypeOfService
105 #define ip4_len TotalLength
106 #define ip4_id Identification
107 #define ip4_flags_offset FlagsAndOffset
108 #define ip4_flags Flags
109 #define ip4_offset FragmentOffset
110 #define ip4_ttl TimeToLive
111 #define ip4_protocol Protocol
112 #define ip4_xsum HeaderChecksum
113 #define ip4_src SourceAddress
114 #define ip4_dest DestinationAddress
116 #define IP_VER_MASK 0xF0
117 #define IPV4_VERSION 4
118 #define IPV4_DEFAULT_VERHLEN ((IPV4_VERSION << 4) | (sizeof(IPV4_HEADER) / sizeof(UINT32)))
119 #define IPV4_TOS_MASK 0xFC
121 #define MAX_IPV4_PACKET 65535
122 #define MAX_IPV4_PAYLOAD (MAX_IPV4_PACKET - sizeof(IPV4_HEADER))
124 #define MAX_IPV4_HLEN 60
126 #define IPV4_MINIMUM_MTU 576
127 #define IPV4_MINIMUM_ULMTU (IPV4_MINIMUM_MTU - sizeof(IPV4_HEADER))
129 #define MAX_IP_OPTIONS_LENGTH ((0xF * sizeof(UINT32)) - sizeof(IPV4_HEADER))
130 #define SIZEOF_IP_OPT_ROUTING_HEADER 3
131 #define SIZEOF_IP_OPT_TIMESTAMP_HEADER 4
132 #define SIZEOF_IP_OPT_SECURITY 11
133 #define SIZEOF_IP_OPT_STREAMIDENTIFIER 4
134 #define SIZEOF_IP_OPT_ROUTERALERT 4
135 #define IP4_OFF_MASK 0xff1f
137 #define icmp4_hdr _ICMPV4_MESSAGE
138 #define icmp4_type Header.Type
139 #define icmp4_code Header.Code
140 #define icmp4_cksum Header.Checksum
141 #define icmp4_un_data32 Data32
142 #define icmp4_un_data16 Data16
143 #define icmp4_un_data8 Data8
144 #define icmp4_dataun Data
145 #define icmp4_data32 icmp4_dataun.icmp4_un_data32
146 #define icmp4_data16 icmp4_dataun.icmp4_un_data16
147 #define icmp4_data8 icmp4_dataun.icmp4_un_data8
148 #define icmp4_pptr icmp4_data32[0]
149 #define icmp4_mtu icmp4_data32[0]
150 #define icmp4_id icmp4_data16[0]
151 #define icmp4_seq icmp4_data16[1]
152 #define icmp4_maxdelay icmp4_data16[0]
154 #define RsType RsHeader.icmp4_type
155 #define RsCode RsHeader.icmp4_code
156 #define RsCksum RsHeader.icmp4_cksum
157 #define RsReserved RsHeader.icmp4_data32[0]
159 #define RaType RaHeader.icmp4_type
160 #define RaCode RaHeader.icmp4_code
161 #define RaCksum RaHeader.icmp4_cksum
162 #define RaNumAddr RaHeader.icmp4_data8[0]
163 #define RaAddrEntrySize RaHeader.icmp4_data8[1]
164 #define RaAddrLifetime RaHeader.icmp4_data16[1]
166 #define ICMPV4_INVALID_PREFERENCE_LEVEL 0x80000000
168 #define icmp4_ts_type Header.icmp4_type
169 #define icmp4_ts_code Header.icmp4_code
170 #define icmp4_ts_cksum Header.icmp4_cksum
171 #define icmp4_ts_id Header.icmp4_id
172 #define icmp4_ts_seq Header.icmp4_seq
173 #define icmp4_ts_originate OriginateTimestamp
174 #define icmp4_ts_receive ReceiveTimestamp
175 #define icmp4_ts_transmit TransmitTimestamp
177 #define IGMP_QUERY_TYPE 0x11
178 #define IGMP_VERSION1_REPORT_TYPE 0x12
179 #define IGMP_VERSION2_REPORT_TYPE 0x16
180 #define IGMP_LEAVE_GROUP_TYPE 0x17
181 #define IGMP_VERSION3_REPORT_TYPE 0x22
183 #define ip6_hdr _IPV6_HEADER
184 #define ip6_flow VersionClassFlow
185 #define ip6_plen PayloadLength
186 #define ip6_nxt NextHeader
187 #define ip6_hops HopLimit
188 #define ip6_hlim HopLimit
189 #define ip6_src SourceAddress
190 #define ip6_dst DestinationAddress
192 #define IP_VER_MASK 0xF0
193 #define IPV6_VERSION 0x60
195 #define IPV6_TRAFFIC_CLASS_MASK 0x0000C00F
196 #define IPV6_ECN_MASK 0x00003000
197 #define IPV6_FLOW_LABEL_MASK 0xFFFF0F00
198 #define MAX_IPV6_PAYLOAD 65535
199 #define MAX_IPV6_PACKET (MAX_IPV6_PAYLOAD + sizeof(IPV6_HEADER))
201 #define IPV6_ECN_SHIFT 12
203 #define IPV6_MINIMUM_MTU 1280
204 #define IPV6_MINIMUM_ULMTU (IPV6_MINIMUM_MTU - sizeof(IPV6_HEADER))
206 #define IPV6_TRAFFIC_CLASS(VersionClassFlow) \
207 ((UCHAR)((((VersionClassFlow) & IPV6_TRAFFIC_CLASS_MASK) >> 12) + \
208 (((VersionClassFlow) & IPV6_TRAFFIC_CLASS_MASK) << 4)))
210 #define ip6_frag _IPV6_FRAGMENT_HEADER
211 #define ip6f_nxt NextHeader
212 #define ip6f_reserved Reserved
213 #define ip6f_offlg OffsetAndFlags
214 #define ip6f_ident Id
216 #define IP6F_OFF_MASK 0xf8ff
217 #define IP6F_RESERVED_MASK 0x0600
218 #define IP6F_MORE_FRAG 0x0100
220 #define EXT_LEN_UNIT 8
222 #define IPV6_EXTENSION_HEADER_LENGTH(Blocks) ((Blocks + 1) * EXT_LEN_UNIT)
223 #define MAX_IPV6_EXTENSION_HEADER_LENGTH IPV6_EXTENSION_HEADER_LENGTH(0xFF)
224 #define IPV6_EXTENSION_HEADER_BLOCKS(Length) ((Length / EXT_LEN_UNIT) - 1)
225 #define IP_AUTHENTICATION_HEADER_LENGTH(Blocks) ((Blocks + 2) * 4)
226 #define IP_AUTHENTICATION_HEADER_BLOCKS(Length) (((Length + sizeof(AUTHENTICATION_HEADER)) / 4) - 2)
228 #define IPV6_ROUTER_ALERT_LENGTH IPV6_EXTENSION_HEADER_LENGTH(0)
230 #define ip6_hbh _IPV6_EXTENSION_HEADER
231 #define ip6h_nxt NextHeader
232 #define ip6h_len Length
233 #define ip6_dest _IPV6_EXTENSION_HEADER
234 #define ip6d_nxt NextHeader
235 #define ip6d_len Length
237 #define IP6OPT_TYPE(Type) ((Type) & 0xc0)
238 #define IP6OPT_TYPE_SKIP 0x00
239 #define IP6OPT_TYPE_DISCARD 0x40
240 #define IP6OPT_TYPE_FORCEICMP 0x80
241 #define IP6OPT_TYPE_ICMP 0xc0
243 #define IP6OPT_MUTABLE 0x20
244 #define IP6OPT_ISMUTABLE(Type) (((Type) & IP6OPT_MUTABLE) != 0)
246 #define ip6_opt_jumbo _IPV6_OPTION_JUMBOGRAM
247 #define ip6oj_type Header.Type
248 #define ip6oj_len Header.DataLength
249 #define ip6oj_jumbo_len JumbogramLength
251 #define ip6_opt_router _IPV6_OPTION_ROUTER_ALERT
252 #define ip6or_type Header.Type
253 #define ip6or_len Header.DataLength
254 #define ip6or_value Value
256 #define SIZEOF_IPV6_ROUTERALERT IPV6_EXTENSION_HEADER_LENGTH(0)
258 #define ip6_rthdr _IPV6_ROUTING_HEADER
259 #define ip6r_nxt NextHeader
260 #define ip6r_len Length
261 #define ip6r_type RoutingType
262 #define ip6r_segleft SegmentsLeft
264 #define icmp6_hdr _ICMPV6_MESSAGE
265 #define icmp6_type Header.Type
266 #define icmp6_code Header.Code
267 #define icmp6_cksum Header.Checksum
268 #define icmp6_un_data32 Data32
269 #define icmp6_un_data16 Data16
270 #define icmp6_un_data8 Data8
271 #define icmp6_dataun Data
273 #define icmp6_data32 icmp6_dataun.icmp6_un_data32
274 #define icmp6_data16 icmp6_dataun.icmp6_un_data16
275 #define icmp6_data8 icmp6_dataun.icmp6_un_data8
276 #define icmp6_pptr icmp6_data32[0]
277 #define icmp6_mtu icmp6_data32[0]
278 #define icmp6_id icmp6_data16[0]
279 #define icmp6_seq icmp6_data16[1]
280 #define icmp6_maxdelay icmp6_data16[0]
282 #define ICMP6_INFOMSG_MASK 0x80
284 #define ICMP6_DST_UNREACH_NOROUTE 0
285 #define ICMP6_DST_UNREACH_ADMIN 1
286 #define ICMP6_DST_UNREACH_BEYONDSCOPE 2
287 #define ICMP6_DST_UNREACH_ADDR 3
288 #define ICMP6_DST_UNREACH_NOPORT 4
290 #define ICMP6_TIME_EXCEED_TRANSIT 0
291 #define ICMP6_TIME_EXCEED_REASSEMBLY 1
293 #define ICMP6_PARAMPROB_HEADER 0
294 #define ICMP6_PARAMPROB_NEXTHEADER 1
295 #define ICMP6_PARAMPROB_OPTION 2
297 #define ICMPV6_ECHO_REQUEST_FLAG_REVERSE 0x1
299 #define nd_rs_type nd_rs_hdr.icmp6_type
300 #define nd_rs_code nd_rs_hdr.icmp6_code
301 #define nd_rs_cksum nd_rs_hdr.icmp6_cksum
302 #define nd_rs_reserved nd_rs_hdr.icmp6_data32[0]
304 #define nd_ra_type nd_ra_hdr.icmp6_type
305 #define nd_ra_code nd_ra_hdr.icmp6_code
306 #define nd_ra_cksum nd_ra_hdr.icmp6_cksum
307 #define nd_ra_curhoplimit nd_ra_hdr.icmp6_data8[0]
308 #define nd_ra_flags_reserved nd_ra_hdr.icmp6_data8[1]
309 #define ND_RA_FLAG_MANAGED 0x80
310 #define ND_RA_FLAG_OTHER 0x40
311 #define ND_RA_FLAG_HOME_AGENT 0x20
312 #define ND_RA_FLAG_PREFERENCE 0x18
313 #define nd_ra_router_lifetime nd_ra_hdr.icmp6_data16[1]
315 #define nd_ns_type nd_ns_hdr.icmp6_type
316 #define nd_ns_code nd_ns_hdr.icmp6_code
317 #define nd_ns_cksum nd_ns_hdr.icmp6_cksum
318 #define nd_ns_reserved nd_ns_hdr.icmp6_data32[0]
320 #define nd_na_type nd_na_hdr.icmp6_type
321 #define nd_na_code nd_na_hdr.icmp6_code
322 #define nd_na_cksum nd_na_hdr.icmp6_cksum
323 #define nd_na_flags_reserved nd_na_hdr.icmp6_data32[0]
325 #if (BYTE_ORDER == _BIG_ENDIAN)
326 #define ND_NA_FLAG_ROUTER 0x80000000
327 #define ND_NA_FLAG_SOLICITED 0x40000000
328 #define ND_NA_FLAG_OVERRIDE 0x20000000
330 #define ND_NA_FLAG_ROUTER 0x00000080
331 #define ND_NA_FLAG_SOLICITED 0x00000040
332 #define ND_NA_FLAG_OVERRIDE 0x00000020
333 #endif /* (BYTE_ORDER == _BIG_ENDIAN) */
335 #define nd_rd_type nd_rd_hdr.icmp6_type
336 #define nd_rd_code nd_rd_hdr.icmp6_code
337 #define nd_rd_cksum nd_rd_hdr.icmp6_cksum
338 #define nd_rd_reserved nd_rd_hdr.icmp6_data32[0]
340 #define ND_OPT_PI_FLAG_ONLINK 0x80
341 #define ND_OPT_PI_FLAG_AUTO 0x40
342 #define ND_OPT_PI_FLAG_ROUTER_ADDR 0x20
343 #define ND_OPT_PI_FLAG_SITE_PREFIX 0x10
344 #define ND_OPT_PI_FLAG_ROUTE 0x01
346 #define ND_OPT_RI_FLAG_PREFERENCE 0x18
348 #define TH_MAX_LEN (0x0F << 2)
357 #define TH_ALL (TH_FIN | TH_SYN | TH_RST | TH_PSH | TH_ACK | TH_URG | TH_ECE | TH_CWR)
358 #define TH_SYN_ALL (TH_FIN | TH_SYN | TH_RST | TH_ACK)
360 #define TH_OPT_EOL 0x00
361 #define TH_OPT_NOP 0x01
362 #define TH_OPT_MSS 0x02
363 #define TH_OPT_WS 0x03
364 #define TH_OPT_SACK_PERMITTED 0x04
365 #define TH_OPT_SACK 0x05
366 #define TH_OPT_TS 0x08
368 #define DL_SIZEOF_TUNNEL_ADDRESS(AddressBytes) (FIELD_OFFSET(DL_TUNNEL_ADDRESS, IpAddress) + (AddressBytes))
369 #define DL_SIZEOF_IPV4_TUNNEL_ADDRESS DL_SIZEOF_TUNNEL_ADDRESS(sizeof(IN_ADDR))
370 #define DL_SIZEOF_IPV6_TUNNEL_ADDRESS DL_SIZEOF_TUNNEL_ADDRESS(sizeof(IN6_ADDR))
372 #define FL_PACKET_TYPE_FLAGS (NDIS_PACKET_TYPE_ALL_MULTICAST | NDIS_PACKET_TYPE_PROMISCUOUS)
374 #define mld_type IcmpHeader.Type
375 #define mld_checksum IcmpHeader.Checksum
377 #ifndef _DEFINE_DL_ADDRESS_TYPE_
378 #define _DEFINE_DL_ADDRESS_TYPE_
383 } DL_ADDRESS_TYPE
, *PDL_ADDRESS_TYPE
;
393 typedef union _DL_OUI DL_OUI
, *PDL_OUI
;
398 typedef union _DL_EI48 DL_EI48
, *PDL_EI48
;
408 C_ASSERT(DL_ADDRESS_LENGTH_MAXIMUM
>= sizeof(DL_EUI48
));
410 extern CONST DL_EUI48 eui48_broadcast
;
415 typedef union _DL_EI64 DL_EI64
, *PDL_EI64
;
432 typedef union _DL_EUI64 DL_EUI64
, *PDL_EUI64
;
434 typedef struct _SNAP_HEADER
{
440 } SNAP_HEADER
, *PSNAP_HEADER
;
442 typedef struct _ETHERNET_HEADER
{
443 DL_EUI48 Destination
;
449 } ETHERNET_HEADER
, *PETHERNET_HEADER
;
451 C_ASSERT(ETH_LENGTH_OF_HEADER
== sizeof(ETHERNET_HEADER
));
452 C_ASSERT(ETH_LENGTH_OF_SNAP_HEADER
== sizeof(SNAP_HEADER
));
454 typedef struct _VLAN_TAG
{
460 UINT16 User_Priority
:3;
466 C_ASSERT(ETH_LENGTH_OF_VLAN_HEADER
== sizeof(VLAN_TAG
));
471 _In_reads_(sizeof(DL_EUI48
)) CONST UCHAR
*Address
)
473 if (((PDL_EUI48
) Address
)->Oui
.Group
)
475 if (RtlEqualMemory(Address
, &eui48_broadcast
, sizeof(DL_EUI48
)))
487 typedef struct _TOKENRING_HEADER
{
488 UINT8 AcccessControl
;
490 DL_EUI48 Destination
;
492 } TOKENRING_HEADER
, *PTOKENRING_HEADER
;
494 typedef struct _SOURCEROUTE_HEADER
{
498 UINT8 BroadcastIndicator
:3;
505 UINT8 LargestFrame
:4;
511 } SOURCEROUTE_HEADER
, *PSOURCEROUTE_HEADER
;
514 TokenRingSpecificallyRoutedFrame
= 0,
515 TokenRingAllRoutesExplorer
= 4,
516 TokenRingSpanningTreeExplorer
= 6,
517 } TOKENRING_BROADCAST_INDICATOR
, *PTOKENRING_BROADCAST_INDICATOR
;
519 extern CONST SOURCEROUTE_HEADER sourceroute_unspecified
;
521 C_ASSERT((sizeof(TOKENRING_HEADER
) + sizeof(SNAP_HEADER
) + SOURCEROUTE_SIZE_MAXIMUM
) < DL_HEADER_LENGTH_MAXIMUM
);
525 TokenRingGetSourceRouteIndicator(
526 _In_ CONST UNALIGNED DL_EUI48
*Source
)
528 return ((Source
->Byte
[0] & TOKENRING_SOURCEROUTE_INDICATOR
) != 0);
533 TokenRingSetSourceRouteIndicator(
534 _Out_ UNALIGNED DL_EUI48
*Source
)
536 Source
->Byte
[0] |= TOKENRING_SOURCEROUTE_INDICATOR
;
541 TokenRingResetSourceRouteIndicator(
542 _Out_ UNALIGNED DL_EUI48
*Source
)
544 Source
->Byte
[0] &= ~TOKENRING_SOURCEROUTE_INDICATOR
;
549 TokenRingAddressType(
550 _In_ CONST UCHAR
*Address
)
552 if (TokenRingGetSourceRouteIndicator((PDL_EUI48
) Address
))
554 if (RtlEqualMemory(Address
, &eui48_broadcast
, sizeof(DL_EUI48
)))
566 typedef struct _FDDI_HEADER
{
568 DL_EUI48 Destination
;
570 } FDDI_HEADER
, *PFDDI_HEADER
;
572 typedef struct _ARCNET_HEADER
{
576 } ARCNET_HEADER
, *PARCNET_HEADER
;
578 typedef struct _ICMP_HEADER
{
582 } ICMP_HEADER
, *PICMP_HEADER
;
584 typedef struct _ICMP_MESSAGE
{
591 } ICMP_MESSAGE
, *PICMP_MESSAGE
;
593 typedef ICMP_HEADER ICMPV6_HEADER
, *PICMPV6_HEADER
;
594 typedef ICMP_MESSAGE ICMPV6_MESSAGE
, *PICMPV6_MESSAGE
;
596 typedef struct _IPV4_HEADER
{
598 UINT8 VersionAndHeaderLength
;
600 UINT8 HeaderLength
:4;
605 UINT8 TypeOfServiceAndEcnField
;
608 UINT8 TypeOfService
:6;
612 UINT16 Identification
;
614 UINT16 FlagsAndOffset
;
617 UINT16 MoreFragments
:1;
618 UINT16 DontFragment
:1;
625 UINT16 HeaderChecksum
;
626 IN_ADDR SourceAddress
;
627 IN_ADDR DestinationAddress
;
628 } IPV4_HEADER
, *PIPV4_HEADER
;
630 C_ASSERT(sizeof(IPV4_HEADER
) == 20);
634 Ip4HeaderLengthInBytes(
635 _In_ CONST UNALIGNED IPV4_HEADER
*Header
)
637 return (Header
->HeaderLength
<< 2);
640 #if defined(_NTDDK_) || defined(_NTRTL_)
644 _In_ CONST UNALIGNED IPV4_HEADER
*Header
)
646 return RtlUshortByteSwap(Header
->FlagsAndOffset
& IP4_OFF_MASK
) << 3;
650 typedef struct _IPV4_OPTION_HEADER
{
654 UINT8 OptionNumber
:5;
660 } IPV4_OPTION_HEADER
, *PIPV4_OPTION_HEADER
;
662 C_ASSERT(sizeof(IPV4_OPTION_HEADER
) == 2);
664 #if !defined(IP_EXPORT_INCLUDED)
668 IP_OPT_SECURITY
= 0x82,
674 IP_OPT_ROUTER_ALERT
= 0x94,
675 IP_OPT_MULTIDEST
= 0x95,
678 typedef ULONG IPV4_OPTION_TYPE
;
681 typedef struct _IPV4_TIMESTAMP_OPTION
{
683 IPV4_OPTION_HEADER OptionHeader
;
695 } IPV4_TIMESTAMP_OPTION
, *PIPV4_TIMESTAMP_OPTION
;
698 IP_OPTION_TIMESTAMP_ONLY
= 0,
699 IP_OPTION_TIMESTAMP_ADDRESS
= 1,
700 IP_OPTION_TIMESTAMP_SPECIFIC_ADDRESS
= 3
701 } IP_OPTION_TIMESTAMP_FLAGS
;
703 typedef struct _IPV4_ROUTING_HEADER
{
705 IPV4_OPTION_HEADER OptionHeader
;
710 } IPV4_ROUTING_HEADER
, UNALIGNED
*PIPV4_ROUTING_HEADER
;
712 typedef ICMP_HEADER ICMPV4_HEADER
, *PICMPV4_HEADER
;
713 typedef ICMP_MESSAGE ICMPV4_MESSAGE
, *PICMPV4_MESSAGE
;
716 ICMP4_UNREACH_NET
= 0,
717 ICMP4_UNREACH_HOST
= 1,
718 ICMP4_UNREACH_PROTOCOL
= 2,
719 ICMP4_UNREACH_PORT
= 3,
720 ICMP4_UNREACH_FRAG_NEEDED
= 4,
721 ICMP4_UNREACH_SOURCEROUTE_FAILED
= 5,
722 ICMP4_UNREACH_NET_UNKNOWN
= 6,
723 ICMP4_UNREACH_HOST_UNKNOWN
= 7,
724 ICMP4_UNREACH_ISOLATED
= 8,
725 ICMP4_UNREACH_NET_ADMIN
= 9,
726 ICMP4_UNREACH_HOST_ADMIN
= 10,
727 ICMP4_UNREACH_NET_TOS
= 11,
728 ICMP4_UNREACH_HOST_TOS
= 12,
729 ICMP4_UNREACH_ADMIN
= 13,
730 } ICMP4_UNREACH_CODE
, *PICMP4_UNREACH_CODE
;
733 ICMP4_TIME_EXCEED_TRANSIT
= 0,
734 ICMP4_TIME_EXCEED_REASSEMBLY
= 1,
735 } ICMP4_TIME_EXCEED_CODE
, *PICMP4_TIME_EXCEED_CODE
;
737 typedef struct _ICMPV4_ROUTER_SOLICIT
{
738 ICMPV4_MESSAGE RsHeader
;
739 } ICMPV4_ROUTER_SOLICIT
, *PICMPV4_ROUTER_SOLICIT
;
741 typedef struct _ICMPV4_ROUTER_ADVERT_HEADER
{
742 ICMPV4_MESSAGE RaHeader
;
743 } ICMPV4_ROUTER_ADVERT_HEADER
, *PICMPV4_ROUTER_ADVERT_HEADER
;
745 typedef struct _ICMPV4_ROUTER_ADVERT_ENTRY
{
746 IN_ADDR RouterAdvertAddr
;
747 LONG PreferenceLevel
;
748 } ICMPV4_ROUTER_ADVERT_ENTRY
, *PICMPV4_ROUTER_ADVERT_ENTRY
;
750 typedef struct _ICMPV4_TIMESTAMP_MESSAGE
{
751 ICMPV4_MESSAGE Header
;
752 UINT32 OriginateTimestamp
;
753 UINT32 ReceiveTimestamp
;
754 UINT32 TransmitTimestamp
;
755 } ICMPV4_TIMESTAMP_MESSAGE
, *PICMPV4_TIMESTAMP_MESSAGE
;
757 typedef struct _ICMPV4_ADDRESS_MASK_MESSAGE
{
758 ICMPV4_MESSAGE Header
;
760 } ICMPV4_ADDRESS_MASK_MESSAGE
, *PICMPV4_ADDRESS_MASK_MESSAGE
;
762 typedef struct _ARP_HEADER
{
763 USHORT HardwareAddressSpace
;
764 USHORT ProtocolAddressSpace
;
765 UCHAR HardwareAddressLength
;
766 UCHAR ProtocolAddressLength
;
768 UCHAR SenderHardwareAddress
[0];
769 } ARP_HEADER
, *PARP_HEADER
;
781 typedef struct _IGMP_HEADER
{
795 IN_ADDR MulticastAddress
;
796 } IGMP_HEADER
, *PIGMP_HEADER
;
799 IGMP_MAX_RESP_CODE_TYPE_NORMAL
= 0,
800 IGMP_MAX_RESP_CODE_TYPE_FLOAT
801 } IGMP_MAX_RESP_CODE_TYPE
;
803 typedef struct _IGMPV3_QUERY_HEADER
{
808 UINT8 MaxRespCodeMantissa
:4;
809 UINT8 MaxRespCodeExponent
:3;
810 UINT8 MaxRespCodeType
:1;
814 IN_ADDR MulticastAddress
;
815 UINT8 QuerierRobustnessVariable
:3;
816 UINT8 SuppressRouterSideProcessing
:1;
819 UINT8 QueriersQueryInterfaceCode
;
827 } IGMPV3_QUERY_HEADER
, *PIGMPV3_QUERY_HEADER
;
829 typedef struct _IGMPV3_REPORT_RECORD_HEADER
{
831 UINT8 AuxillaryDataLength
;
833 IN_ADDR MulticastAddress
;
834 } IGMPV3_REPORT_RECORD_HEADER
, *PIGMPV3_REPORT_RECORD_HEADER
;
836 typedef struct _IGMPV3_REPORT_HEADER_
{
842 } IGMPV3_REPORT_HEADER
, *PIGMPV3_REPORT_HEADER
;
844 typedef struct _IPV6_HEADER
{
845 UINT32 VersionClassFlow
;
846 UINT16 PayloadLength
;
849 IN6_ADDR SourceAddress
;
850 IN6_ADDR DestinationAddress
;
851 } IPV6_HEADER
, *PIPV6_HEADER
;
853 typedef struct _IPV6_FRAGMENT_HEADER
{
859 UINT16 MoreFragments
:1;
860 UINT16 ReservedBits
:2;
863 UINT16 OffsetAndFlags
;
866 } IPV6_FRAGMENT_HEADER
, *PIPV6_FRAGMENT_HEADER
;
868 C_ASSERT(sizeof(IPV6_FRAGMENT_HEADER
) == 8);
870 #if defined(_NTDDK_) || defined(_NTRTL_)
874 _In_ CONST UNALIGNED IPV6_FRAGMENT_HEADER
*Header
)
876 return RtlUshortByteSwap(Header
->OffsetAndFlags
& IP6F_OFF_MASK
);
880 typedef struct _IPV6_EXTENSION_HEADER
{
883 } IPV6_EXTENSION_HEADER
, *PIPV6_EXTENSION_HEADER
;
885 typedef struct _IPV6_OPTION_HEADER
{
888 } IPV6_OPTION_HEADER
, *PIPV6_OPTION_HEADER
;
893 IP6OPT_TUNNEL_LIMIT
= 0x04,
894 IP6OPT_ROUTER_ALERT
= 0x05,
896 IP6OPT_NSAP_ADDR
= 0xc3,
897 } IPV6_OPTION_TYPE
, *PIPV6_OPTION_TYPE
;
899 typedef struct _IPV6_OPTION_JUMBOGRAM
{
900 IPV6_OPTION_HEADER Header
;
901 UINT8 JumbogramLength
[4];
902 } IPV6_OPTION_JUMBOGRAM
, *PIPV6_OPTION_JUMBOGRAM
;
904 typedef struct _IPV6_OPTION_ROUTER_ALERT
{
905 IPV6_OPTION_HEADER Header
;
907 } IPV6_OPTION_ROUTER_ALERT
, *PIPV6_OPTION_ROUTER_ALERT
;
909 typedef _Struct_size_bytes_(_Inexpressible_(Length
)) struct _IPV6_ROUTING_HEADER
{
915 } IPV6_ROUTING_HEADER
, *PIPV6_ROUTING_HEADER
;
917 typedef struct nd_router_solicit
{
918 ICMPV6_MESSAGE nd_rs_hdr
;
919 } ND_ROUTER_SOLICIT_HEADER
, *PND_ROUTER_SOLICIT_HEADER
;
921 typedef struct nd_router_advert
{
922 ICMPV6_MESSAGE nd_ra_hdr
;
923 UINT32 nd_ra_reachable
;
924 UINT32 nd_ra_retransmit
;
925 } ND_ROUTER_ADVERT_HEADER
, *PND_ROUTER_ADVERT_HEADER
;
927 typedef union _IPV6_ROUTER_ADVERTISEMENT_FLAGS
{
932 UINT8 OtherStatefulConfiguration
:1;
933 UINT8 ManagedAddressConfiguration
:1;
936 } IPV6_ROUTER_ADVERTISEMENT_FLAGS
, *PIPV6_ROUTER_ADVERTISEMENT_FLAGS
;
938 typedef struct nd_neighbor_solicit
{
939 ICMPV6_MESSAGE nd_ns_hdr
;
940 IN6_ADDR nd_ns_target
;
941 } ND_NEIGHBOR_SOLICIT_HEADER
, *PND_NEIGHBOR_SOLICIT_HEADER
;
943 typedef struct nd_neighbor_advert
{
944 ICMPV6_MESSAGE nd_na_hdr
;
945 IN6_ADDR nd_na_target
;
946 } ND_NEIGHBOR_ADVERT_HEADER
, *PND_NEIGHBOR_ADVERT_HEADER
;
948 typedef union _IPV6_NEIGHBOR_ADVERTISEMENT_FLAGS
{
957 } IPV6_NEIGHBOR_ADVERTISEMENT_FLAGS
, *PIPV6_NEIGHBOR_ADVERTISEMENT_FLAGS
;
959 typedef struct nd_redirect
{
960 ICMPV6_MESSAGE nd_rd_hdr
;
961 IN6_ADDR nd_rd_target
;
963 } ND_REDIRECT_HEADER
, *PND_REDIRECT_HEADER
;
965 typedef struct nd_opt_hdr
{
968 } ND_OPTION_HDR
, *PND_OPTION_HDR
;
971 ND_OPT_SOURCE_LINKADDR
= 1,
972 ND_OPT_TARGET_LINKADDR
= 2,
973 ND_OPT_PREFIX_INFORMATION
= 3,
974 ND_OPT_REDIRECTED_HEADER
= 4,
976 ND_OPT_NBMA_SHORTCUT_LIMIT
= 6,
977 ND_OPT_ADVERTISEMENT_INTERVAL
= 7,
978 ND_OPT_HOME_AGENT_INFORMATION
= 8,
979 ND_OPT_SOURCE_ADDR_LIST
= 9,
980 ND_OPT_TARGET_ADDR_LIST
= 10,
981 ND_OPT_ROUTE_INFO
= 24,
982 } ND_OPTION_TYPE
, *PND_OPTION_TYPE
;
984 typedef struct nd_opt_prefix_info
{
985 UINT8 nd_opt_pi_type
;
987 UINT8 nd_opt_pi_prefix_len
;
989 UINT8 nd_opt_pi_flags_reserved
;
991 UINT8 Route
: 1; // Least significant bit.
993 UINT8 SitePrefix
: 1;
994 UINT8 RouterAddress
: 1;
995 UINT8 Autonomous
: 1;
999 UINT32 nd_opt_pi_valid_time
;
1000 UINT32 nd_opt_pi_preferred_time
;
1002 UINT32 nd_opt_pi_reserved2
;
1004 UINT8 nd_opt_pi_reserved3
[3];
1005 UINT8 nd_opt_pi_site_prefix_len
;
1008 IN6_ADDR nd_opt_pi_prefix
;
1009 } ND_OPTION_PREFIX_INFO
, *PND_OPTION_PREFIX_INFO
;
1011 typedef struct nd_opt_rd_hdr
{
1012 UINT8 nd_opt_rh_type
;
1013 UINT8 nd_opt_rh_len
;
1014 UINT16 nd_opt_rh_reserved1
;
1015 UINT32 nd_opt_rh_reserved2
;
1016 } ND_OPTION_RD_HDR
, *PND_OPTION_RD_HDR
;
1018 typedef struct nd_opt_mtu
{
1019 UINT8 nd_opt_mtu_type
;
1020 UINT8 nd_opt_mtu_len
;
1021 UINT16 nd_opt_mtu_reserved
;
1022 UINT32 nd_opt_mtu_mtu
;
1023 } ND_OPTION_MTU
, *PND_OPTION_MTU
;
1025 typedef struct nd_opt_route_info
{
1026 UINT8 nd_opt_ri_type
;
1027 UINT8 nd_opt_ri_len
;
1028 UINT8 nd_opt_ri_prefix_len
;
1030 UINT8 nd_opt_ri_flags_reserved
;
1036 UINT32 nd_opt_ri_route_lifetime
;
1037 IN6_ADDR nd_opt_ri_prefix
;
1038 } ND_OPTION_ROUTE_INFO
, *PND_OPTION_ROUTE_INFO
;
1040 typedef struct _MLD_HEADER
{
1041 ICMPV6_HEADER IcmpHeader
;
1044 IN6_ADDR MulticastAddress
;
1045 } MLD_HEADER
, *PMLD_HEADER
;
1048 MLD_MAX_RESP_CODE_TYPE_NORMAL
= 0,
1049 MLD_MAX_RESP_CODE_TYPE_FLOAT
1050 } MLD_MAX_RESP_CODE_TYPE
;
1052 typedef struct _MLDV2_QUERY_HEADER
{
1053 ICMPV6_HEADER IcmpHeader
;
1057 UINT16 MaxRespCodeMantissaHi
:4;
1058 UINT16 MaxRespCodeExponent
:3;
1059 UINT16 MaxRespCodeType
:1;
1060 UINT16 MaxRespCodeMantissaLo
:8;
1064 IN6_ADDR MulticastAddress
;
1065 UINT8 QuerierRobustnessVariable
:3;
1066 UINT8 SuppressRouterSideProcessing
:1;
1067 UINT8 QueryReserved
:4;
1069 UINT8 QueriersQueryInterfaceCode
;
1071 UINT8 QQCMantissa
:4;
1072 UINT8 QQCExponent
:3;
1077 } MLDV2_QUERY_HEADER
, *PMLDV2_QUERY_HEADER
;
1079 typedef struct _MLDV2_REPORT_RECORD_HEADER
{
1081 UINT8 AuxillaryDataLength
;
1083 IN6_ADDR MulticastAddress
;
1084 } MLDV2_REPORT_RECORD_HEADER
, *PMLDV2_REPORT_RECORD_HEADER
;
1086 typedef struct _MLDV2_REPORT_HEADER
{
1087 ICMPV6_HEADER IcmpHeader
;
1090 } MLDV2_REPORT_HEADER
, *PMLDV2_REPORT_HEADER
;
1092 typedef UINT32 SEQ_NUM
, *PSEQ_NUM
;
1094 #pragma pack(push, 1)
1096 typedef struct tcp_hdr
{
1108 #if NDIS_RECEIVE_UNALIGNED
1109 typedef TCP_HDR UNALIGNED
*PTCP_HDR
;
1111 typedef TCP_HDR
*PTCP_HDR
;
1114 typedef struct tcp_opt_mss
{
1120 typedef struct tcp_opt_ws
{
1126 typedef struct tcp_opt_sack_permitted
{
1129 } TCP_OPT_SACK_PERMITTED
;
1131 typedef struct tcp_opt_sack
{
1134 struct tcp_opt_sack_block
{
1140 typedef struct tcp_opt_ts
{
1147 typedef struct tcp_opt_unknown
{
1154 typedef struct DL_TUNNEL_ADDRESS
{
1155 COMPARTMENT_ID CompartmentId
;
1158 } DL_TUNNEL_ADDRESS
, *PDL_TUNNEL_ADDRESS
;
1160 C_ASSERT(DL_ADDRESS_LENGTH_MAXIMUM
>= DL_SIZEOF_IPV4_TUNNEL_ADDRESS
);
1161 C_ASSERT(DL_ADDRESS_LENGTH_MAXIMUM
>= DL_SIZEOF_IPV6_TUNNEL_ADDRESS
);
1163 typedef enum _TUNNEL_SUB_TYPE
{
1164 TUNNEL_SUB_TYPE_NONE
= 0,
1165 TUNNEL_SUB_TYPE_CP
= 1,
1166 TUNNEL_SUB_TYPE_IPTLS
= 2
1167 } TUNNEL_SUB_TYPE
, *PTUNNEL_SUB_TYPE
;
1169 #pragma pack(push, 1)
1171 typedef struct DL_TEREDO_ADDRESS
{
1178 IN_ADDR MappedAddress
;
1181 } DL_TEREDO_ADDRESS
, *PDL_TEREDO_ADDRESS
;
1183 typedef struct _IPTLS_METADATA
{
1184 ULONGLONG SequenceNumber
;
1185 } IPTLS_METADATA
,*PIPTLS_METADATA
;
1189 C_ASSERT(DL_ADDRESS_LENGTH_MAXIMUM
>= sizeof(DL_TEREDO_ADDRESS
));
1191 typedef enum _NPI_MODULEID_TYPE
{
1194 } NPI_MODULEID_TYPE
;
1196 typedef struct _NPI_MODULEID
{
1198 NPI_MODULEID_TYPE Type
;
1200 [switch_type(NPI_MODULEID_TYPE
), switch_is(Type
)]
1216 typedef CONST NPI_MODULEID
*PNPI_MODULEID
;
1218 #if !defined(__midl)
1221 NmrIsEqualNpiModuleId(
1222 _In_ PNPI_MODULEID ModuleId1
,
1223 _In_ PNPI_MODULEID ModuleId2
)
1225 if (ModuleId1
->Type
== ModuleId2
->Type
)
1227 if (ModuleId1
->Type
== MIT_GUID
)
1230 return !!InlineIsEqualGUID(ModuleId1
->Guid
, ModuleId2
->Guid
);
1232 return (BOOLEAN
)InlineIsEqualGUID(&ModuleId1
->Guid
,
1236 else if (ModuleId1
->Type
== MIT_IF_LUID
)
1238 return (BOOLEAN
)RtlEqualMemory(&ModuleId1
->IfLuid
,
1248 typedef CONST NPIID
*PNPIID
;
1250 extern CONST NPI_MODULEID NPI_MS_NMR_MODULEID
;
1251 extern CONST NPIID NPI_FRAMING_LAYER_ID
;
1252 extern CONST NPI_MODULEID NPI_MS_TUN_MODULEID
;
1253 extern CONST NPI_MODULEID NPI_MS_FL48_MODULEID
;
1254 extern CONST NPI_MODULEID NPI_MS_FL68_MODULEID
;
1255 extern CONST NPI_MODULEID NPI_MS_FL4L_MODULEID
;
1256 extern CONST NPI_MODULEID NPI_MS_FL6L_MODULEID
;
1257 extern CONST NPI_MODULEID NPI_MS_FL4T_MODULEID
;
1258 extern CONST NPI_MODULEID NPI_MS_FL6T_MODULEID
;
1259 extern CONST NPI_MODULEID NPI_MS_WANARPV4_MODULEID
;
1260 extern CONST NPI_MODULEID NPI_MS_WANARPV6_MODULEID
;
1261 extern CONST NPI_MODULEID NPI_MS_FL_WANARP_MODULEID
;
1262 extern CONST NPI_MODULEID NPI_MS_NDIS_MODULEID
;
1263 extern CONST NPIID NPI_NETWORK_LAYER_ID
;
1264 extern CONST NPI_MODULEID NPI_MS_IPV6_MODULEID
;
1265 extern CONST NPI_MODULEID NPI_MS_IPV4_MODULEID
;
1267 #ifdef NETIODEF_DEFINED_ASSERT
1275 #endif /* _NETIODEF_ */