1 // Licensed under the Apache License, Version 2.0
2 // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4 // All files in the project carrying such notice may not be copied, modified, or distributed
5 // except according to those terms.
6 // #include <winapifamily.h>
7 // #include <in6addr.h>
8 // #include <inaddr.h>
9 use shared::basetsd::ULONG64;
10 use shared::in6addr::in6_addr;
11 use shared::ntdef::{INT, PUCHAR, PVOID, UCHAR, ULONG, USHORT, WCHAR};
12 pub const MAX_ADAPTER_NAME: usize = 128;
13 pub const MAX_OPT_SIZE: usize = 40;
14 pub type IPAddr = ULONG;
15 pub type IPMask = ULONG;
16 pub type IP_STATUS = ULONG;
17 pub type IPv6Addr = in6_addr;
18 STRUCT!{struct IP_OPTION_INFORMATION {
19     Ttl: UCHAR,
20     Tos: UCHAR,
21     Flags: UCHAR,
22     OptionsSize: UCHAR,
23     OptionsData: PUCHAR,
24 }}
25 pub type PIP_OPTION_INFORMATION = *mut IP_OPTION_INFORMATION;
26 #[cfg(target_arch = "x86_64")]
27 STRUCT!{struct IP_OPTION_INFORMATION32 {
28     Ttl: UCHAR,
29     Tos: UCHAR,
30     Flags: UCHAR,
31     OptionsSize: UCHAR,
32     OptionsData: u32, // UCHAR * POINTER_32
33 }}
34 #[cfg(target_arch = "x86_64")]
35 pub type PIP_OPTION_INFORMATION32 = *mut IP_OPTION_INFORMATION32;
36 STRUCT!{struct ICMP_ECHO_REPLY {
37     Address: IPAddr,
38     Status: ULONG,
39     RoundTripTime: ULONG,
40     DataSize: USHORT,
41     Reserved: USHORT,
42     Data: PVOID,
43     Options: IP_OPTION_INFORMATION,
44 }}
45 pub type PICMP_ECHO_REPLY = *mut ICMP_ECHO_REPLY;
46 #[cfg(target_arch = "x86_64")]
47 STRUCT!{struct ICMP_ECHO_REPLY32 {
48     Address: IPAddr,
49     Status: ULONG,
50     RoundTripTime: ULONG,
51     DataSize: USHORT,
52     Reserved: USHORT,
53     Data: u32, // VOID * POINTER_32
54     Options: IP_OPTION_INFORMATION32,
55 }}
56 #[cfg(target_arch = "x86_64")]
57 pub type PICMP_ECHO_REPLY32 = *mut ICMP_ECHO_REPLY32;
58 STRUCT!{#[repr(packed)] struct IPV6_ADDRESS_EX {
59     sin6_port: USHORT,
60     sin6_flowinfo: ULONG,
61     sin6_addr: [USHORT; 8],
62     sin6_scope_id: ULONG,
63 }}
64 pub type PIPV6_ADDRESS_EX = *mut IPV6_ADDRESS_EX;
65 // #include <packoff.h>
66 STRUCT!{struct ICMPV6_ECHO_REPLY_LH {
67     Address: IPV6_ADDRESS_EX,
68     Status: ULONG,
69     RoundTripTime: INT,
70 }}
71 pub type PICMPV6_ECHO_REPLY_LH = *mut ICMPV6_ECHO_REPLY_LH;
72 pub type ICMPV6_ECHO_REPLY = ICMPV6_ECHO_REPLY_LH;
73 pub type PICMPV6_ECHO_REPLY = *mut ICMPV6_ECHO_REPLY;
74 // #endif
75 STRUCT!{struct ARP_SEND_REPLY {
76     DestAddress: IPAddr,
77     SrcAddress: IPAddr,
78 }}
79 pub type PARP_SEND_REPLY = *mut ARP_SEND_REPLY;
80 STRUCT!{struct TCP_RESERVE_PORT_RANGE {
81     UpperRange: USHORT,
82     LowerRange: USHORT,
83 }}
84 pub type PTCP_RESERVE_PORT_RANGE = *mut TCP_RESERVE_PORT_RANGE;
85 STRUCT!{struct IP_ADAPTER_INDEX_MAP {
86     Index: ULONG,
87     Name: [WCHAR; MAX_ADAPTER_NAME],
88 }}
89 pub type PIP_ADAPTER_INDEX_MAP = *mut IP_ADAPTER_INDEX_MAP;
90 STRUCT!{struct IP_INTERFACE_INFO {
91     NumAdapters: ULONG,
92     Adapter: [IP_ADAPTER_INDEX_MAP; 1],
93 }}
94 pub type PIP_INTERFACE_INFO = *mut IP_INTERFACE_INFO;
95 STRUCT!{struct IP_UNIDIRECTIONAL_ADAPTER_ADDRESS {
96     NumAdapters: ULONG,
97     Address: [IPAddr; 1],
98 }}
99 pub type PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS = *mut IP_UNIDIRECTIONAL_ADAPTER_ADDRESS;
100 STRUCT!{struct IP_ADAPTER_ORDER_MAP {
101     NumAdapters: ULONG,
102     AdapterOrder: [ULONG; 1],
103 }}
104 pub type PIP_ADAPTER_ORDER_MAP = *mut IP_ADAPTER_ORDER_MAP;
105 STRUCT!{struct IP_MCAST_COUNTER_INFO {
106     InMcastOctets: ULONG64,
107     OutMcastOctets: ULONG64,
108     InMcastPkts: ULONG64,
109     OutMcastPkts: ULONG64,
110 }}
111 pub type PIP_MCAST_COUNTER_INFO = *mut IP_MCAST_COUNTER_INFO;
112 // IP_STATUS codes returned from IP APIs
113 pub const IP_STATUS_BASE: IP_STATUS = 11000;
114 pub const IP_SUCCESS: IP_STATUS = 0;
115 pub const IP_BUF_TOO_SMALL: IP_STATUS = IP_STATUS_BASE + 1;
116 pub const IP_DEST_NET_UNREACHABLE: IP_STATUS = IP_STATUS_BASE + 2;
117 pub const IP_DEST_HOST_UNREACHABLE: IP_STATUS = IP_STATUS_BASE + 3;
118 pub const IP_DEST_PROT_UNREACHABLE: IP_STATUS = IP_STATUS_BASE + 4;
119 pub const IP_DEST_PORT_UNREACHABLE: IP_STATUS = IP_STATUS_BASE + 5;
120 pub const IP_NO_RESOURCES: IP_STATUS = IP_STATUS_BASE + 6;
121 pub const IP_BAD_OPTION: IP_STATUS = IP_STATUS_BASE + 7;
122 pub const IP_HW_ERROR: IP_STATUS = IP_STATUS_BASE + 8;
123 pub const IP_PACKET_TOO_BIG: IP_STATUS = IP_STATUS_BASE + 9;
124 pub const IP_REQ_TIMED_OUT: IP_STATUS = IP_STATUS_BASE + 10;
125 pub const IP_BAD_REQ: IP_STATUS = IP_STATUS_BASE + 11;
126 pub const IP_BAD_ROUTE: IP_STATUS = IP_STATUS_BASE + 12;
127 pub const IP_TTL_EXPIRED_TRANSIT: IP_STATUS = IP_STATUS_BASE + 13;
128 pub const IP_TTL_EXPIRED_REASSEM: IP_STATUS = IP_STATUS_BASE + 14;
129 pub const IP_PARAM_PROBLEM: IP_STATUS = IP_STATUS_BASE + 15;
130 pub const IP_SOURCE_QUENCH: IP_STATUS = IP_STATUS_BASE + 16;
131 pub const IP_OPTION_TOO_BIG: IP_STATUS = IP_STATUS_BASE + 17;
132 pub const IP_BAD_DESTINATION: IP_STATUS = IP_STATUS_BASE + 18;
133 pub const IP_DEST_NO_ROUTE: IP_STATUS = IP_STATUS_BASE + 2;
134 pub const IP_DEST_ADDR_UNREACHABLE: IP_STATUS = IP_STATUS_BASE + 3;
135 pub const IP_DEST_PROHIBITED: IP_STATUS = IP_STATUS_BASE + 4;
136 pub const IP_HOP_LIMIT_EXCEEDED: IP_STATUS = IP_STATUS_BASE + 13;
137 pub const IP_REASSEMBLY_TIME_EXCEEDED: IP_STATUS = IP_STATUS_BASE + 14;
138 pub const IP_PARAMETER_PROBLEM: IP_STATUS = IP_STATUS_BASE + 15;
139 pub const IP_DEST_UNREACHABLE: IP_STATUS = IP_STATUS_BASE + 40;
140 pub const IP_TIME_EXCEEDED: IP_STATUS = IP_STATUS_BASE + 41;
141 pub const IP_BAD_HEADER: IP_STATUS = IP_STATUS_BASE + 42;
142 pub const IP_UNRECOGNIZED_NEXT_HEADER: IP_STATUS = IP_STATUS_BASE + 43;
143 pub const IP_ICMP_ERROR: IP_STATUS = IP_STATUS_BASE + 44;
144 pub const IP_DEST_SCOPE_MISMATCH: IP_STATUS = IP_STATUS_BASE + 45;
145 pub const IP_ADDR_DELETED: IP_STATUS = IP_STATUS_BASE + 19;
146 pub const IP_SPEC_MTU_CHANGE: IP_STATUS = IP_STATUS_BASE + 20;
147 pub const IP_MTU_CHANGE: IP_STATUS = IP_STATUS_BASE + 21;
148 pub const IP_UNLOAD: IP_STATUS = IP_STATUS_BASE + 22;
149 pub const IP_ADDR_ADDED: IP_STATUS = IP_STATUS_BASE + 23;
150 pub const IP_MEDIA_CONNECT: IP_STATUS = IP_STATUS_BASE + 24;
151 pub const IP_MEDIA_DISCONNECT: IP_STATUS = IP_STATUS_BASE + 25;
152 pub const IP_BIND_ADAPTER: IP_STATUS = IP_STATUS_BASE + 26;
153 pub const IP_UNBIND_ADAPTER: IP_STATUS = IP_STATUS_BASE + 27;
154 pub const IP_DEVICE_DOES_NOT_EXIST: IP_STATUS = IP_STATUS_BASE + 28;
155 pub const IP_DUPLICATE_ADDRESS: IP_STATUS = IP_STATUS_BASE + 29;
156 pub const IP_INTERFACE_METRIC_CHANGE: IP_STATUS = IP_STATUS_BASE + 30;
157 pub const IP_RECONFIG_SECFLTR: IP_STATUS = IP_STATUS_BASE + 31;
158 pub const IP_NEGOTIATING_IPSEC: IP_STATUS = IP_STATUS_BASE + 32;
159 pub const IP_INTERFACE_WOL_CAPABILITY_CHANGE: IP_STATUS = IP_STATUS_BASE + 33;
160 pub const IP_DUPLICATE_IPADD: IP_STATUS = IP_STATUS_BASE + 34;
161 pub const IP_GENERAL_FAILURE: IP_STATUS = IP_STATUS_BASE + 50;
162 pub const MAX_IP_STATUS: IP_STATUS = IP_GENERAL_FAILURE;
163 pub const IP_PENDING: IP_STATUS = IP_STATUS_BASE + 255;
164 pub const IP_FLAG_REVERSE: UCHAR = 0x1;
165 pub const IP_FLAG_DF: UCHAR = 0x2;
166 pub const IP_OPT_EOL: u8 = 0;
167 pub const IP_OPT_NOP: u8 = 1;
168 pub const IP_OPT_SECURITY: u8 = 0x82;
169 pub const IP_OPT_LSRR: u8 = 0x83;
170 pub const IP_OPT_SSRR: u8 = 0x89;
171 pub const IP_OPT_RR: u8 = 0x7;
172 pub const IP_OPT_TS: u8 = 0x44;
173 pub const IP_OPT_SID: u8 = 0x88;
174 pub const IP_OPT_ROUTER_ALERT: u8 = 0x94;
175