]>
Commit | Line | Data |
---|---|---|
5d6a636c | 1 | /** @file\r |
2 | The EFI UDPv6 (User Datagram Protocol version 6) Protocol Definition, which is built upon\r | |
3 | the EFI IPv6 Protocol and provides simple packet-oriented services to transmit and receive\r | |
4 | UDP packets.\r | |
5 | \r | |
6 | Copyright (c) 2008 - 2009, Intel Corporation \r | |
7 | All rights reserved. This program and the accompanying materials \r | |
8 | are licensed and made available under the terms and conditions of the BSD License \r | |
9 | which accompanies this distribution. The full text of the license may be found at \r | |
10 | http://opensource.org/licenses/bsd-license.php \r | |
11 | \r | |
12 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r | |
13 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r | |
14 | \r | |
15 | **/\r | |
16 | \r | |
17 | #ifndef __EFI_UDP6_PROTOCOL_H__\r | |
18 | #define __EFI_UDP6_PROTOCOL_H__\r | |
19 | \r | |
20 | #include <Protocol/Ip6.h>\r | |
21 | \r | |
22 | #define EFI_UDP6_SERVICE_BINDING_PROTOCOL_GUID \\r | |
23 | { \\r | |
24 | 0x66ed4721, 0x3c98, 0x4d3e, {0x81, 0xe3, 0xd0, 0x3d, 0xd3, 0x9a, 0x72, 0x54 } \\r | |
25 | }\r | |
26 | \r | |
27 | #define EFI_UDP6_PROTOCOL_GUID \\r | |
28 | { \\r | |
29 | 0x4f948815, 0xb4b9, 0x43cb, {0x8a, 0x33, 0x90, 0xe0, 0x60, 0xb3, 0x49, 0x55 } \\r | |
30 | }\r | |
31 | \r | |
32 | typedef struct {\r | |
33 | ///\r | |
34 | /// The EFI UDPv6 Protocol instance handle that is using this address/port pair.\r | |
35 | ///\r | |
36 | EFI_HANDLE InstanceHandle;\r | |
37 | ///\r | |
38 | /// The IPv6 address to which this instance of the EFI UDPv6 Protocol is bound.\r | |
39 | /// Set to 0::/128, if this instance is used to listen all packets from any\r | |
40 | /// source address.\r | |
41 | ///\r | |
42 | EFI_IPv6_ADDRESS LocalAddress;\r | |
43 | ///\r | |
44 | /// The port number in host byte order on which the service is listening.\r | |
45 | ///\r | |
46 | UINT16 LocalPort;\r | |
47 | ///\r | |
48 | /// The IPv6 address of the remote host. May be 0::/128 if it is not connected\r | |
49 | /// to any remote host or connected with more than one remote host.\r | |
50 | ///\r | |
51 | EFI_IPv6_ADDRESS RemoteAddress;\r | |
52 | ///\r | |
53 | /// The port number in host byte order on which the remote host is \r | |
54 | /// listening. Maybe zero if it is not connected to any remote host.\r | |
55 | ///\r | |
56 | UINT16 RemotePort;\r | |
57 | } EFI_UDP6_SERVICE_POINT;\r | |
58 | \r | |
59 | typedef struct {\r | |
60 | ///\r | |
61 | /// The handle of the driver that creates this entry.\r | |
62 | ///\r | |
63 | EFI_HANDLE DriverHandle;\r | |
64 | ///\r | |
65 | /// The number of address/port pairs that follow this data structure.\r | |
66 | ///\r | |
67 | UINT32 ServiceCount;\r | |
68 | ///\r | |
69 | /// List of address/port pairs that are currently in use.\r | |
70 | ///\r | |
71 | EFI_UDP6_SERVICE_POINT Services[1];\r | |
72 | } EFI_UDP6_VARIABLE_DATA;\r | |
73 | \r | |
74 | typedef struct _EFI_UDP6_PROTOCOL EFI_UDP6_PROTOCOL;\r | |
75 | \r | |
76 | ///\r | |
77 | /// EFI_UDP6_FRAGMENT_DATA allows multiple receive or transmit buffers to be specified.\r | |
78 | /// The purpose of this structure is to avoid copying the same packet multiple times.\r | |
79 | ///\r | |
80 | typedef struct {\r | |
81 | UINT32 FragmentLength; ///< Length of the fragment data buffer.\r | |
82 | VOID *FragmentBuffer; ///< Pointer to the fragment data buffer.\r | |
83 | } EFI_UDP6_FRAGMENT_DATA;\r | |
84 | \r | |
85 | ///\r | |
86 | /// The EFI_UDP6_SESSION_DATA is used to retrieve the settings when receiving packets or\r | |
87 | /// to override the existing settings (only DestinationAddress and DestinationPort can\r | |
88 | /// be overridden) of this EFI UDPv6 Protocol instance when sending packets.\r | |
89 | ///\r | |
90 | typedef struct {\r | |
91 | ///\r | |
92 | /// Address from which this packet is sent. This field should not be used when\r | |
93 | /// sending packets.\r | |
94 | ///\r | |
95 | EFI_IPv6_ADDRESS SourceAddress;\r | |
96 | ///\r | |
97 | /// Port from which this packet is sent. It is in host byte order. This field should\r | |
98 | /// not be used when sending packets.\r | |
99 | ///\r | |
100 | UINT16 SourcePort;\r | |
101 | ///\r | |
17664848 | 102 | /// Address to which this packet is sent. When sending packet, it'll be ignored\r |
5d6a636c | 103 | /// if it is zero.\r |
104 | ///\r | |
105 | EFI_IPv6_ADDRESS DestinationAddress;\r | |
106 | ///\r | |
17664848 | 107 | /// Port to which this packet is sent. When sending packet, it'll be \r |
5d6a636c | 108 | /// ignored if it is zero.\r |
109 | ///\r | |
110 | UINT16 DestinationPort;\r | |
111 | } EFI_UDP6_SESSION_DATA;\r | |
112 | \r | |
113 | typedef struct {\r | |
114 | ///\r | |
115 | /// Set to TRUE to accept UDP packets that are sent to any address.\r | |
116 | ///\r | |
117 | BOOLEAN AcceptPromiscuous;\r | |
118 | ///\r | |
119 | /// Set to TRUE to accept UDP packets that are sent to any port.\r | |
120 | ///\r | |
121 | BOOLEAN AcceptAnyPort;\r | |
122 | ///\r | |
123 | /// Set to TRUE to allow this EFI UDPv6 Protocol child instance to open a port number\r | |
124 | /// that is already being used by another EFI UDPv6 Protocol child instance.\r | |
125 | ///\r | |
126 | BOOLEAN AllowDuplicatePort;\r | |
127 | ///\r | |
128 | /// TrafficClass field in transmitted IPv6 packets.\r | |
129 | ///\r | |
130 | UINT8 TrafficClass;\r | |
131 | ///\r | |
132 | /// HopLimit field in transmitted IPv6 packets.\r | |
133 | ///\r | |
134 | UINT8 HopLimit;\r | |
135 | ///\r | |
136 | /// The receive timeout value (number of microseconds) to be associated with each\r | |
137 | /// incoming packet. Zero means do not drop incoming packets.\r | |
138 | ///\r | |
139 | UINT32 ReceiveTimeout;\r | |
140 | ///\r | |
141 | /// The transmit timeout value (number of microseconds) to be associated with each\r | |
142 | /// outgoing packet. Zero means do not drop outgoing packets.\r | |
143 | ///\r | |
144 | UINT32 TransmitTimeout;\r | |
145 | ///\r | |
146 | /// The station IP address that will be assigned to this EFI UDPv6 Protocol instance.\r | |
147 | /// The EFI UDPv6 and EFI IPv6 Protocol drivers will only deliver incoming packets\r | |
148 | /// whose destination matches this IP address exactly. Address 0::/128 is also accepted\r | |
149 | /// as a special case. Under this situation, underlying IPv6 driver is responsible for\r | |
150 | /// binding a source address to this EFI IPv6 protocol instance according to source\r | |
151 | /// address selection algorithm. Only incoming packet from the selected source address\r | |
152 | /// is delivered. This field can be set and changed only when the EFI IPv6 driver is\r | |
153 | /// transitioning from the stopped to the started states. If no address is available\r | |
154 | /// for selecting, the EFI IPv6 Protocol driver will use EFI_IP6_CONFIG_PROTOCOL to\r | |
155 | /// retrieve the IPv6 address.\r | |
156 | EFI_IPv6_ADDRESS StationAddress;\r | |
157 | ///\r | |
158 | /// The port number to which this EFI UDPv6 Protocol instance is bound. If a client\r | |
159 | /// of the EFI UDPv6 Protocol does not care about the port number, set StationPort\r | |
160 | /// to zero. The EFI UDPv6 Protocol driver will assign a random port number to transmitted \r | |
161 | /// UDP packets. Ignored it if AcceptAnyPort is TRUE.\r | |
162 | ///\r | |
163 | UINT16 StationPort;\r | |
164 | ///\r | |
165 | /// The IP address of remote host to which this EFI UDPv6 Protocol instance is connecting.\r | |
166 | /// If RemoteAddress is not 0::/128, this EFI UDPv6 Protocol instance will be connected to\r | |
167 | /// RemoteAddress; i.e., outgoing packets of this EFI UDPv6 Protocol instance will be sent\r | |
168 | /// to this address by default and only incoming packets from this address will be delivered\r | |
169 | /// to client. Ignored for incoming filtering if AcceptPromiscuous is TRUE.\r | |
170 | EFI_IPv6_ADDRESS RemoteAddress;\r | |
171 | ///\r | |
172 | /// The port number of the remote host to which this EFI UDPv6 Protocol instance is connecting.\r | |
173 | /// If it is not zero, outgoing packets of this EFI UDPv6 Protocol instance will be sent to\r | |
174 | /// this port number by default and only incoming packets from this port will be delivered\r | |
175 | /// to client. Ignored if RemoteAddress is 0::/128 and ignored for incoming filtering if\r | |
176 | /// AcceptPromiscuous is TRUE.\r | |
177 | UINT16 RemotePort;\r | |
178 | } EFI_UDP6_CONFIG_DATA;\r | |
179 | \r | |
180 | ///\r | |
181 | /// The EFI UDPv6 Protocol client must fill this data structure before sending a packet.\r | |
182 | /// The packet may contain multiple buffers that may be not in a continuous memory location.\r | |
183 | ///\r | |
184 | typedef struct {\r | |
185 | ///\r | |
186 | /// If not NULL, the data that is used to override the transmitting settings.Only the two\r | |
187 | /// filed UdpSessionData.DestinationAddress and UdpSessionData.DestionPort can be used as\r | |
188 | /// the transmitting setting filed.\r | |
189 | ///\r | |
190 | EFI_UDP6_SESSION_DATA *UdpSessionData;\r | |
191 | ///\r | |
192 | /// Sum of the fragment data length. Must not exceed the maximum UDP packet size.\r | |
193 | ///\r | |
194 | UINT32 DataLength;\r | |
195 | ///\r | |
196 | /// Number of fragments.\r | |
197 | ///\r | |
198 | UINT32 FragmentCount;\r | |
199 | ///\r | |
200 | /// Array of fragment descriptors.\r | |
201 | ///\r | |
202 | EFI_UDP6_FRAGMENT_DATA FragmentTable[1];\r | |
203 | } EFI_UDP6_TRANSMIT_DATA;\r | |
204 | \r | |
205 | ///\r | |
206 | /// EFI_UDP6_RECEIVE_DATA is filled by the EFI UDPv6 Protocol driver when this EFI UDPv6\r | |
207 | /// Protocol instance receives an incoming packet. If there is a waiting token for incoming\r | |
208 | /// packets, the CompletionToken.Packet.RxData field is updated to this incoming packet and\r | |
209 | /// the CompletionToken.Event is signaled. The EFI UDPv6 Protocol client must signal the\r | |
210 | /// RecycleSignal after processing the packet.\r | |
211 | /// FragmentTable could contain multiple buffers that are not in the continuous memory locations. \r | |
212 | /// The EFI UDPv6 Protocol client might need to combine two or more buffers in FragmentTable to \r | |
213 | /// form their own protocol header.\r | |
214 | ///\r | |
215 | typedef struct {\r | |
216 | ///\r | |
217 | /// Time when the EFI UDPv6 Protocol accepted the packet.\r | |
218 | ///\r | |
219 | EFI_TIME TimeStamp;\r | |
220 | ///\r | |
221 | /// Indicates the event to signal when the received data has been processed.\r | |
222 | ///\r | |
223 | EFI_EVENT RecycleSignal;\r | |
224 | ///\r | |
225 | /// The UDP session data including SourceAddress, SourcePort, DestinationAddress,\r | |
226 | /// and DestinationPort.\r | |
227 | ///\r | |
228 | EFI_UDP6_SESSION_DATA UdpSession;\r | |
229 | ///\r | |
230 | /// The sum of the fragment data length.\r | |
231 | ///\r | |
232 | UINT32 DataLength;\r | |
233 | ///\r | |
234 | /// Number of fragments. Maybe zero.\r | |
235 | ///\r | |
236 | UINT32 FragmentCount;\r | |
237 | ///\r | |
238 | /// Array of fragment descriptors. Maybe zero.\r | |
239 | ///\r | |
240 | EFI_UDP6_FRAGMENT_DATA FragmentTable[1];\r | |
241 | } EFI_UDP6_RECEIVE_DATA;\r | |
242 | \r | |
243 | ///\r | |
244 | /// The EFI_UDP6_COMPLETION_TOKEN structures are used for both transmit and receive operations.\r | |
245 | /// When used for transmitting, the Event and TxData fields must be filled in by the EFI UDPv6\r | |
246 | /// Protocol client. After the transmit operation completes, the Status field is updated by the\r | |
247 | /// EFI UDPv6 Protocol and the Event is signaled.\r | |
248 | /// When used for receiving, only the Event field must be filled in by the EFI UDPv6 Protocol\r | |
249 | /// client. After a packet is received, RxData and Status are filled in by the EFI UDPv6 Protocol\r | |
250 | /// and the Event is signaled.\r | |
251 | ///\r | |
252 | typedef struct {\r | |
253 | ///\r | |
254 | /// This Event will be signaled after the Status field is updated by the EFI UDPv6 Protocol\r | |
255 | /// driver. The type of Event must be EVT_NOTIFY_SIGNAL.\r | |
256 | ///\r | |
257 | EFI_EVENT Event;\r | |
258 | ///\r | |
259 | /// Will be set to one of the following values:\r | |
260 | /// - EFI_SUCCESS: The receive or transmit operation completed successfully.\r | |
261 | /// - EFI_ABORTED: The receive or transmit was aborted.\r | |
262 | /// - EFI_TIMEOUT: The transmit timeout expired.\r | |
263 | /// - EFI_NETWORK_UNREACHABLE: The destination network is unreachable. RxData is set to \r | |
264 | /// NULL in this situation.\r | |
265 | /// - EFI_HOST_UNREACHABLE: The destination host is unreachable. RxData is set to NULL in \r | |
266 | /// this situation.\r | |
267 | /// - EFI_PROTOCOL_UNREACHABLE: The UDP protocol is unsupported in the remote system. \r | |
268 | /// RxData is set to NULL in this situation.\r | |
269 | /// - EFI_PORT_UNREACHABLE: No service is listening on the remote port. RxData is set to \r | |
270 | /// NULL in this situation.\r | |
271 | /// - EFI_ICMP_ERROR: Some other Internet Control Message Protocol (ICMP) error report was \r | |
272 | /// received. For example, packets are being sent too fast for the destination to receive them\r | |
273 | /// and the destination sent an ICMP source quench report. RxData is set to NULL in this situation.\r | |
274 | /// - EFI_DEVICE_ERROR: An unexpected system or network error occurred.\r | |
275 | /// - EFI_SECURITY_VIOLATION: The transmit or receive was failed because of IPsec policy check.\r | |
276 | ///\r | |
277 | EFI_STATUS Status;\r | |
278 | union {\r | |
279 | ///\r | |
280 | /// When this token is used for receiving, RxData is a pointer to EFI_UDP6_RECEIVE_DATA.\r | |
281 | ///\r | |
282 | EFI_UDP6_RECEIVE_DATA *RxData;\r | |
283 | ///\r | |
284 | /// When this token is used for transmitting, TxData is a pointer to EFI_UDP6_TRANSMIT_DATA.\r | |
285 | ///\r | |
286 | EFI_UDP6_TRANSMIT_DATA *TxData;\r | |
287 | } Packet;\r | |
288 | } EFI_UDP6_COMPLETION_TOKEN;\r | |
289 | \r | |
290 | /**\r | |
291 | Read the current operational settings.\r | |
292 | \r | |
293 | The GetModeData() function copies the current operational settings of this EFI UDPv6 Protocol\r | |
294 | instance into user-supplied buffers. This function is used optionally to retrieve the operational\r | |
295 | mode data of underlying networks or drivers. \r | |
296 | \r | |
297 | @param[in] This Pointer to the EFI_UDP6_PROTOCOL instance.\r | |
298 | @param[out] Udp6ConfigData The buffer in which the current UDP configuration data is returned.\r | |
299 | @param[out] Ip6ModeData The buffer in which the current EFI IPv6 Protocol mode data is returned.\r | |
300 | @param[out] MnpConfigData The buffer in which the current managed network configuration data is\r | |
301 | returned.\r | |
302 | @param[out] SnpModeData The buffer in which the simple network mode data is returned.\r | |
303 | \r | |
304 | @retval EFI_SUCCESS The mode data was read.\r | |
305 | @retval EFI_NOT_STARTED When Udp6ConfigData is queried, no configuration data is available\r | |
306 | because this instance has not been started.\r | |
307 | @retval EFI_INVALID_PARAMETER This is NULL.\r | |
308 | \r | |
309 | **/\r | |
310 | typedef\r | |
311 | EFI_STATUS\r | |
312 | (EFIAPI *EFI_UDP6_GET_MODE_DATA)(\r | |
313 | IN EFI_UDP6_PROTOCOL *This,\r | |
314 | OUT EFI_UDP6_CONFIG_DATA *Udp6ConfigData OPTIONAL,\r | |
315 | OUT EFI_IP6_MODE_DATA *Ip6ModeData OPTIONAL,\r | |
316 | OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL,\r | |
317 | OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL\r | |
318 | );\r | |
319 | \r | |
320 | /**\r | |
321 | Initializes, changes, or resets the operational parameters for this instance of the EFI UDPv6 \r | |
322 | Protocol.\r | |
323 | \r | |
324 | The Configure() function is used to do the following:\r | |
325 | - Initialize and start this instance of the EFI UDPv6 Protocol.\r | |
326 | - Change the filtering rules and operational parameters.\r | |
327 | - Reset this instance of the EFI UDPv6 Protocol. \r | |
328 | \r | |
329 | Until these parameters are initialized, no network traffic can be sent or received by this instance.\r | |
330 | This instance can be also reset by calling Configure() with UdpConfigData set to NULL.\r | |
331 | Once reset, the receiving queue and transmitting queue are flushed and no traffic is allowed through\r | |
332 | this instance.\r | |
333 | \r | |
334 | With different parameters in UdpConfigData, Configure() can be used to bind this instance to specified\r | |
335 | port.\r | |
336 | \r | |
337 | @param[in] This Pointer to the EFI_UDP6_PROTOCOL instance.\r | |
338 | @param[in] UdpConfigData Pointer to the buffer contained the configuration data.\r | |
339 | \r | |
340 | @retval EFI_SUCCESS The configuration settings were set, changed, or reset successfully.\r | |
341 | @retval EFI_NO_MAPPING The underlying IPv6 driver was responsible for choosing a source \r | |
342 | address for this instance, but no source address was available for use.\r | |
343 | @retval EFI_INVALID_PARAMETER One or more following conditions are TRUE:\r | |
344 | - This is NULL.\r | |
345 | - UdpConfigData.StationAddress neither zero nor one of the configured IP\r | |
346 | addresses in the underlying IPv6 driver.\r | |
347 | - UdpConfigData.RemoteAddress is not a valid unicast IPv6 address if it\r | |
348 | is not zero.\r | |
349 | @retval EFI_ALREADY_STARTED The EFI UDPv6 Protocol instance is already started/configured and must be\r | |
350 | stopped/reset before it can be reconfigured. Only TrafficClass, HopLimit,\r | |
351 | ReceiveTimeout, and TransmitTimeout can be reconfigured without stopping\r | |
352 | the current instance of the EFI UDPv6 Protocol.\r | |
353 | @retval EFI_ACCESS_DENIED UdpConfigData.AllowDuplicatePort is FALSE and UdpConfigData.StationPort\r | |
354 | is already used by other instance. \r | |
355 | @retval EFI_OUT_OF_RESOURCES The EFI UDPv6 Protocol driver cannot allocate memory for this EFI UDPv6\r | |
356 | Protocol instance.\r | |
357 | @retval EFI_DEVICE_ERROR An unexpected network or system error occurred and this instance was not\r | |
358 | opened.\r | |
359 | \r | |
360 | **/\r | |
361 | typedef\r | |
362 | EFI_STATUS\r | |
363 | (EFIAPI *EFI_UDP6_CONFIGURE)(\r | |
364 | IN EFI_UDP6_PROTOCOL *This,\r | |
365 | IN EFI_UDP6_CONFIG_DATA *UdpConfigData OPTIONAL\r | |
366 | );\r | |
367 | \r | |
368 | /**\r | |
369 | Joins and leaves multicast groups.\r | |
370 | \r | |
371 | The Groups() function is used to join or leave one or more multicast group.\r | |
372 | If the JoinFlag is FALSE and the MulticastAddress is NULL, then all currently joined groups are left.\r | |
373 | \r | |
374 | @param[in] This Pointer to the EFI_UDP6_PROTOCOL instance.\r | |
375 | @param[in] JoinFlag Set to TRUE to join a multicast group. Set to FALSE to leave one\r | |
376 | or all multicast groups.\r | |
377 | @param[in] MulticastAddress Pointer to multicast group address to join or leave.\r | |
378 | \r | |
379 | @retval EFI_SUCCESS The operation completed successfully.\r | |
380 | @retval EFI_NOT_STARTED The EFI UDPv6 Protocol instance has not been started.\r | |
381 | @retval EFI_OUT_OF_RESOURCES Could not allocate resources to join the group.\r | |
382 | @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:\r | |
383 | - This is NULL.\r | |
384 | - JoinFlag is TRUE and MulticastAddress is NULL.\r | |
385 | - JoinFlag is TRUE and *MulticastAddress is not a valid multicast address.\r | |
386 | @retval EFI_ALREADY_STARTED The group address is already in the group table (when JoinFlag is TRUE).\r | |
387 | @retval EFI_NOT_FOUND The group address is not in the group table (when JoinFlag is FALSE).\r | |
388 | @retval EFI_DEVICE_ERROR An unexpected system or network error occurred.\r | |
389 | \r | |
390 | **/\r | |
391 | typedef\r | |
392 | EFI_STATUS\r | |
393 | (EFIAPI *EFI_UDP6_GROUPS)(\r | |
394 | IN EFI_UDP6_PROTOCOL *This,\r | |
395 | IN BOOLEAN JoinFlag,\r | |
396 | IN EFI_IPv6_ADDRESS *MulticastAddress OPTIONAL\r | |
397 | );\r | |
398 | \r | |
399 | /**\r | |
400 | Queues outgoing data packets into the transmit queue.\r | |
401 | \r | |
402 | The Transmit() function places a sending request to this instance of the EFI UDPv6 Protocol,\r | |
403 | alongside the transmit data that was filled by the user. Whenever the packet in the token is\r | |
404 | sent out or some errors occur, the Token.Event will be signaled and Token.Status is updated.\r | |
405 | Providing a proper notification function and context for the event will enable the user to\r | |
406 | receive the notification and transmitting status.\r | |
407 | \r | |
408 | @param[in] This Pointer to the EFI_UDP6_PROTOCOL instance.\r | |
409 | @param[in] Token Pointer to the completion token that will be placed into the \r | |
410 | transmit queue.\r | |
411 | \r | |
412 | @retval EFI_SUCCESS The data has been queued for transmission.\r | |
413 | @retval EFI_NOT_STARTED This EFI UDPv6 Protocol instance has not been started.\r | |
414 | @retval EFI_NO_MAPPING The underlying IPv6 driver was responsible for choosing a source\r | |
415 | address for this instance, but no source address was available\r | |
416 | for use.\r | |
417 | @retval EFI_INVALID_PARAMETER One or more of the following are TRUE:\r | |
418 | - This is NULL.\r | |
419 | - Token is NULL.\r | |
420 | - Token.Event is NULL.\r | |
421 | - Token.Packet.TxData is NULL.\r | |
422 | - Token.Packet.TxData.FragmentCount is zero.\r | |
423 | - Token.Packet.TxData.DataLength is not equal to the sum of fragment\r | |
424 | lengths.\r | |
425 | - One or more of the Token.Packet.TxData.FragmentTable[].FragmentLength\r | |
426 | fields is zero.\r | |
427 | - One or more of the Token.Packet.TxData.FragmentTable[].FragmentBuffer\r | |
428 | fields is NULL.\r | |
429 | - Token.Packet.TxData.UdpSessionData.DestinationAddress is not zero\r | |
430 | and is not valid unicast Ipv6 address if UdpSessionData is not NULL.\r | |
17664848 | 431 | - Token.Packet.TxData.UdpSessionData is NULL and this instance's \r |
5d6a636c | 432 | UdpConfigData.RemoteAddress is unspecified.\r |
433 | - Token.Packet.TxData.UdpSessionData.DestinationAddress is non-zero\r | |
434 | when DestinationAddress is configured as non-zero when doing Configure()\r | |
435 | for this EFI Udp6 protocol instance.\r | |
436 | - Token.Packet.TxData.UdpSesionData.DestinationAddress is zero when \r | |
437 | DestinationAddress is unspecified when doing Configure() for this\r | |
438 | EFI Udp6 protocol instance.\r | |
439 | @retval EFI_ACCESS_DENIED The transmit completion token with the same Token.Event was already\r | |
440 | in the transmit queue.\r | |
441 | @retval EFI_NOT_READY The completion token could not be queued because the transmit queue\r | |
442 | is full.\r | |
443 | @retval EFI_OUT_OF_RESOURCES Could not queue the transmit data.\r | |
444 | @retval EFI_NOT_FOUND There is no route to the destination network or address.\r | |
445 | @retval EFI_BAD_BUFFER_SIZE The data length is greater than the maximum UDP packet size.\r | |
446 | \r | |
447 | **/\r | |
448 | typedef\r | |
449 | EFI_STATUS\r | |
450 | (EFIAPI *EFI_UDP6_TRANSMIT)(\r | |
451 | IN EFI_UDP6_PROTOCOL *This,\r | |
452 | IN EFI_UDP6_COMPLETION_TOKEN *Token\r | |
453 | );\r | |
454 | \r | |
455 | /**\r | |
456 | Places an asynchronous receive request into the receiving queue.\r | |
457 | \r | |
458 | The Receive() function places a completion token into the receive packet queue. This function is\r | |
459 | always asynchronous.\r | |
460 | The caller must fill in the Token.Event field in the completion token, and this field cannot be \r | |
461 | NULL. When the receive operation completes, the EFI UDPv6 Protocol driver updates the Token.Status\r | |
462 | and Token.Packet.RxData fields and the Token.Event is signaled.\r | |
463 | Providing a proper notification function and context for the event will enable the user to receive\r | |
464 | the notification and receiving status. That notification function is guaranteed to not be re-entered.\r | |
465 | \r | |
466 | @param[in] This Pointer to the EFI_UDP6_PROTOCOL instance.\r | |
467 | @param[in] Token Pointer to a token that is associated with the receive data descriptor.\r | |
468 | \r | |
469 | @retval EFI_SUCCESS The receive completion token was cached.\r | |
470 | @retval EFI_NOT_STARTED This EFI UDPv6 Protocol instance has not been started.\r | |
471 | @retval EFI_NO_MAPPING The underlying IPv6 driver was responsible for choosing a source\r | |
472 | address for this instance, but no source address was available\r | |
473 | for use.\r | |
474 | @retval EFI_INVALID_PARAMETER One or more of the following is TRUE:\r | |
475 | - This is NULL.\r | |
476 | - Token is NULL.\r | |
477 | - Token.Event is NULL.\r | |
478 | @retval EFI_OUT_OF_RESOURCES The receive completion token could not be queued due to a lack of system \r | |
479 | resources (usually memory).\r | |
480 | @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. The EFI UDPv6 Protocol\r | |
481 | instance has been reset to startup defaults.\r | |
482 | @retval EFI_ACCESS_DENIED A receive completion token with the same Token.Event was already in \r | |
483 | the receive queue.\r | |
484 | @retval EFI_NOT_READY The receive request could not be queued because the receive queue is full.\r | |
485 | \r | |
486 | **/\r | |
487 | typedef\r | |
488 | EFI_STATUS\r | |
489 | (EFIAPI *EFI_UDP6_RECEIVE)(\r | |
490 | IN EFI_UDP6_PROTOCOL *This,\r | |
491 | IN EFI_UDP6_COMPLETION_TOKEN *Token\r | |
492 | );\r | |
493 | \r | |
494 | /**\r | |
495 | Aborts an asynchronous transmit or receive request.\r | |
496 | \r | |
497 | The Cancel() function is used to abort a pending transmit or receive request. If the token is in the\r | |
498 | transmit or receive request queues, after calling this function, Token.Status will be set to\r | |
499 | EFI_ABORTED and then Token.Event will be signaled. If the token is not in one of the queues,\r | |
500 | which usually means that the asynchronous operation has completed, this function will not signal the\r | |
501 | token and EFI_NOT_FOUND is returned.\r | |
502 | \r | |
503 | @param[in] This Pointer to the EFI_UDP6_PROTOCOL instance.\r | |
504 | @param[in] Token Pointer to a token that has been issued by EFI_UDP6_PROTOCOL.Transmit()\r | |
505 | or EFI_UDP6_PROTOCOL.Receive().If NULL, all pending tokens are aborted.\r | |
506 | \r | |
507 | @retval EFI_SUCCESS The asynchronous I/O request was aborted and Token.Event was signaled.\r | |
508 | When Token is NULL, all pending requests are aborted and their events\r | |
509 | are signaled.\r | |
510 | @retval EFI_INVALID_PARAMETER This is NULL.\r | |
511 | @retval EFI_NOT_STARTED This instance has not been started.\r | |
512 | @retval EFI_NOT_FOUND When Token is not NULL, the asynchronous I/O request was not found in\r | |
513 | the transmit or receive queue. It has either completed or was not issued\r | |
514 | by Transmit() and Receive().\r | |
515 | \r | |
516 | **/\r | |
517 | typedef\r | |
518 | EFI_STATUS\r | |
519 | (EFIAPI *EFI_UDP6_CANCEL)(\r | |
520 | IN EFI_UDP6_PROTOCOL *This,\r | |
521 | IN EFI_UDP6_COMPLETION_TOKEN *Token OPTIONAL\r | |
522 | );\r | |
523 | \r | |
524 | /**\r | |
525 | Polls for incoming data packets and processes outgoing data packets.\r | |
526 | \r | |
527 | The Poll() function can be used by network drivers and applications to increase the rate that data\r | |
528 | packets are moved between the communications device and the transmit and receive queues.\r | |
529 | In some systems, the periodic timer event in the managed network driver may not poll the underlying\r | |
530 | communications device fast enough to transmit and/or receive all data packets without missing incoming\r | |
531 | packets or dropping outgoing packets. Drivers and applications that are experiencing packet loss should\r | |
532 | try calling the Poll() function more often.\r | |
533 | \r | |
534 | @param[in] This Pointer to the EFI_UDP6_PROTOCOL instance.\r | |
535 | \r | |
536 | @retval EFI_SUCCESS Incoming or outgoing data was processed.\r | |
537 | @retval EFI_INVALID_PARAMETER This is NULL.\r | |
538 | @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. \r | |
539 | @retval EFI_TIMEOUT Data was dropped out of the transmit and/or receive queue.\r | |
540 | Consider increasing the polling rate.\r | |
541 | \r | |
542 | **/\r | |
543 | typedef\r | |
544 | EFI_STATUS\r | |
545 | (EFIAPI *EFI_UDP6_POLL)(\r | |
546 | IN EFI_UDP6_PROTOCOL *This\r | |
547 | );\r | |
548 | \r | |
549 | ///\r | |
550 | /// The EFI_UDP6_PROTOCOL defines an EFI UDPv6 Protocol session that can be used by any network drivers,\r | |
551 | /// applications, or daemons to transmit or receive UDP packets. This protocol instance can either be\r | |
552 | /// bound to a specified port as a service or connected to some remote peer as an active client.\r | |
553 | /// Each instance has its own settings, such as group table, that are independent from each other.\r | |
554 | /// \r | |
555 | struct _EFI_UDP6_PROTOCOL {\r | |
556 | EFI_UDP6_GET_MODE_DATA GetModeData;\r | |
557 | EFI_UDP6_CONFIGURE Configure;\r | |
558 | EFI_UDP6_GROUPS Groups;\r | |
559 | EFI_UDP6_TRANSMIT Transmit;\r | |
560 | EFI_UDP6_RECEIVE Receive;\r | |
561 | EFI_UDP6_CANCEL Cancel;\r | |
562 | EFI_UDP6_POLL Poll;\r | |
563 | };\r | |
564 | \r | |
565 | extern EFI_GUID gEfiUdp6ServiceBindingProtocolGuid;\r | |
566 | extern EFI_GUID gEfiUdp6ProtocolGuid;\r | |
5d6a636c | 567 | \r |
568 | #endif\r |