1pub const PROTOCOL_GUID: crate::base::Guid = crate::base::Guid::from_fields(
7 0x2c8759d5,
8 0x5c2d,
9 0x66ef,
10 0x92,
11 0x5f,
12 &[0xb6, 0x6c, 0x10, 0x19, 0x57, 0xe2],
13);
14
15pub const SERVICE_BINDING_PROTOCOL_GUID: crate::base::Guid = crate::base::Guid::from_fields(
16 0xec835dd3,
17 0xfe0f,
18 0x617b,
19 0xa6,
20 0x21,
21 &[0xb3, 0x50, 0xc3, 0xe1, 0x33, 0x88],
22);
23
24#[repr(C)]
25#[derive(Clone, Copy, Debug)]
26pub struct ModeData {
27 pub is_started: crate::base::Boolean,
28 pub max_packet_size: u32,
29 pub config_data: ConfigData,
30 pub is_configured: crate::base::Boolean,
31 pub address_count: u32,
32 pub address_list: *mut AddressInfo,
33 pub group_count: u32,
34 pub group_table: *mut crate::base::Ipv6Address,
35 pub route_count: u32,
36 pub route_table: *mut RouteTable,
37 pub neighbor_count: u32,
38 pub neighbor_cache: *mut NeighborCache,
39 pub prefix_count: u32,
40 pub prefix_table: *mut AddressInfo,
41 pub icmp_type_count: u32,
42 pub icmp_type_list: *mut IcmpType,
43}
44
45#[repr(C)]
46#[derive(Clone, Copy, Debug)]
47pub struct ConfigData {
48 pub default_protocol: u8,
49 pub accept_any_protocol: crate::base::Boolean,
50 pub accept_icmp_errors: crate::base::Boolean,
51 pub accept_promiscuous: crate::base::Boolean,
52 pub destination_address: crate::base::Ipv6Address,
53 pub station_address: crate::base::Ipv6Address,
54 pub traffic_class: u8,
55 pub hop_limit: u8,
56 pub flow_lable: u32,
57 pub receive_timeout: u32,
58 pub transmit_timeout: u32,
59}
60
61#[repr(C)]
62#[derive(Clone, Copy, Debug)]
63pub struct AddressInfo {
64 pub address: crate::base::Ipv6Address,
65 pub prefix_length: u8,
66}
67
68#[repr(C)]
69#[derive(Clone, Copy, Debug)]
70pub struct RouteTable {
71 pub gateway: crate::base::Ipv6Address,
72 pub destination: crate::base::Ipv6Address,
73 pub prefix_length: u8,
74}
75
76pub type NeighborState = u32;
77
78pub const NEIGHBOR_IN_COMPLETE: NeighborState = 0x00000000;
79pub const NEIGHBOR_REACHABLE: NeighborState = 0x00000001;
80pub const NEIGHBOR_STATE: NeighborState = 0x00000002;
81pub const NEIGHBOR_DELAY: NeighborState = 0x00000003;
82pub const NEIGHBOR_PROBE: NeighborState = 0x00000004;
83
84#[repr(C)]
85#[derive(Clone, Copy, Debug)]
86pub struct NeighborCache {
87 pub neighbor: crate::base::Ipv6Address,
88 pub link_address: crate::base::MacAddress,
89 pub state: NeighborState,
90}
91
92#[repr(C)]
93#[derive(Clone, Copy, Debug)]
94pub struct IcmpType {
95 pub r#type: u8,
96 pub code: u8,
97}
98
99pub const ICMP_V6_DEST_UNREACHABLE: u8 = 0x01;
100pub const ICMP_V6_PACKET_TOO_BIG: u8 = 0x02;
101pub const ICMP_V6_TIME_EXCEEDED: u8 = 0x03;
102pub const ICMP_V6_PARAMETER_PROBLEM: u8 = 0x04;
103
104pub const ICMP_V6_ECHO_REQUEST: u8 = 0x80;
105pub const ICMP_V6_ECHO_REPLY: u8 = 0x81;
106pub const ICMP_V6_LISTENER_QUERY: u8 = 0x82;
107pub const ICMP_V6_LISTENER_REPORT: u8 = 0x83;
108pub const ICMP_V6_LISTENER_DONE: u8 = 0x84;
109pub const ICMP_V6_ROUTER_SOLICIT: u8 = 0x85;
110pub const ICMP_V6_ROUTER_ADVERTISE: u8 = 0x86;
111pub const ICMP_V6_NEIGHBOR_SOLICIT: u8 = 0x87;
112pub const ICMP_V6_NEIGHBOR_ADVERTISE: u8 = 0x88;
113pub const ICMP_V6_REDIRECT: u8 = 0x89;
114pub const ICMP_V6_LISTENER_REPORT_2: u8 = 0x8f;
115
116pub const ICMP_V6_NO_ROUTE_TO_DEST: u8 = 0x00;
117pub const ICMP_V6_COMM_PROHIBITED: u8 = 0x01;
118pub const ICMP_V6_BEYOND_SCOPE: u8 = 0x02;
119pub const ICMP_V6_ADDR_UNREACHABLE: u8 = 0x03;
120pub const ICMP_V6_PORT_UNREACHABLE: u8 = 0x04;
121pub const ICMP_V6_SOURCE_ADDR_FAILED: u8 = 0x05;
122pub const ICMP_V6_ROUTE_REJECTED: u8 = 0x06;
123
124pub const ICMP_V6_TIMEOUT_HOP_LIMIT: u8 = 0x00;
125pub const ICMP_V6_TIMEOUT_REASSEMBLE: u8 = 0x01;
126
127pub const ICMP_V6_ERRONEOUS_HEADER: u8 = 0x00;
128pub const ICMP_V6_UNRECOGNIZE_NEXT_HDR: u8 = 0x01;
129pub const ICMP_V6_UNRECOGNIZE_OPTION: u8 = 0x02;
130
131#[repr(C)]
132#[derive(Clone, Copy)]
133pub struct CompletionToken {
134 pub event: crate::base::Event,
135 pub status: crate::base::Status,
136 pub packet: CompletionTokenPacket,
137}
138
139#[repr(C)]
140#[derive(Clone, Copy)]
141pub union CompletionTokenPacket {
142 pub rx_data: *mut ReceiveData,
143 pub tx_data: *mut TransmitData,
144}
145
146#[repr(C)]
147#[derive(Clone, Copy, Debug)]
148pub struct ReceiveData<const N: usize = 0> {
149 pub time_stamp: crate::system::Time,
150 pub recycle_signal: crate::base::Event,
151 pub header_length: u32,
152 pub header: *mut Header,
153 pub data_length: u32,
154 pub fragment_count: u32,
155 pub fragment_table: [FragmentData; N],
156}
157
158#[repr(C)]
159#[derive(Clone, Copy, Debug)]
160pub struct Header {
161 pub traffic_class_h_version: u8,
162 pub flow_label_h_traffic_class_l: u8,
163 pub flow_label_l: u16,
164 pub payload_length: u16,
165 pub next_header: u8,
166 pub hop_limit: u8,
167 pub source_address: crate::base::Ipv6Address,
168 pub destination_address: crate::base::Ipv6Address,
169}
170
171#[repr(C)]
172#[derive(Clone, Copy, Debug)]
173pub struct FragmentData {
174 pub fragment_length: u32,
175 pub fragment_buffer: *mut core::ffi::c_void,
176}
177
178#[repr(C)]
179#[derive(Clone, Copy, Debug)]
180pub struct TransmitData<const N: usize = 0> {
181 pub destination_address: *mut crate::base::Ipv6Address,
182 pub override_data: *mut OverrideData,
183 pub ext_hdrs_length: u32,
184 pub ext_hdrs: *mut core::ffi::c_void,
185 pub next_header: u8,
186 pub data_length: u32,
187 pub fragment_count: u32,
188 pub fragment_table: [FragmentData; N],
189}
190
191#[repr(C)]
192#[derive(Clone, Copy, Debug)]
193pub struct OverrideData {
194 pub protocol: u8,
195 pub hop_limit: u8,
196 pub flow_label: u32,
197}
198
199pub type ProtocolGetModeData = eficall! {fn(
200 *mut Protocol,
201 *mut ModeData,
202 *mut crate::protocols::managed_network::ConfigData,
203 *mut crate::protocols::simple_network::Mode,
204) -> crate::base::Status};
205
206pub type ProtocolConfigure = eficall! {fn(
207 *mut Protocol,
208 *mut ConfigData,
209) -> crate::base::Status};
210
211pub type ProtocolGroups = eficall! {fn(
212 *mut Protocol,
213 crate::base::Boolean,
214 *mut crate::base::Ipv6Address,
215) -> crate::base::Status};
216
217pub type ProtocolRoutes = eficall! {fn(
218 *mut Protocol,
219 crate::base::Boolean,
220 *mut crate::base::Ipv6Address,
221 u8,
222 *mut crate::base::Ipv6Address,
223) -> crate::base::Status};
224
225pub type ProtocolNeighbors = eficall! {fn(
226 *mut Protocol,
227 crate::base::Boolean,
228 *mut crate::base::Ipv6Address,
229 *mut crate::base::MacAddress,
230 u32,
231 crate::base::Boolean,
232) -> crate::base::Status};
233
234pub type ProtocolTransmit = eficall! {fn(
235 *mut Protocol,
236 *mut CompletionToken,
237) -> crate::base::Status};
238
239pub type ProtocolReceive = eficall! {fn(
240 *mut Protocol,
241 *mut CompletionToken,
242) -> crate::base::Status};
243
244pub type ProtocolCancel = eficall! {fn(
245 *mut Protocol,
246 *mut CompletionToken,
247) -> crate::base::Status};
248
249pub type ProtocolPoll = eficall! {fn(
250 *mut Protocol,
251) -> crate::base::Status};
252
253#[repr(C)]
254pub struct Protocol {
255 pub get_mode_data: ProtocolGetModeData,
256 pub configure: ProtocolConfigure,
257 pub groups: ProtocolGroups,
258 pub routes: ProtocolRoutes,
259 pub neighbors: ProtocolNeighbors,
260 pub transmit: ProtocolTransmit,
261 pub receive: ProtocolReceive,
262 pub cancel: ProtocolCancel,
263 pub poll: ProtocolPoll,
264}