1 | /** @file
|
---|
2 | Definitions for the Socket layer driver.
|
---|
3 |
|
---|
4 | Copyright (c) 2011, Intel Corporation
|
---|
5 | All rights reserved. This program and the accompanying materials
|
---|
6 | are licensed and made available under the terms and conditions of the BSD License
|
---|
7 | which accompanies this distribution. The full text of the license may be found at
|
---|
8 | http://opensource.org/licenses/bsd-license
|
---|
9 |
|
---|
10 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
---|
11 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
---|
12 |
|
---|
13 | **/
|
---|
14 | #ifndef _SOCKET_H_
|
---|
15 | #define _SOCKET_H_
|
---|
16 |
|
---|
17 | #include <Efi/EfiSocketLib.h>
|
---|
18 |
|
---|
19 | //------------------------------------------------------------------------------
|
---|
20 | // Constants
|
---|
21 | //------------------------------------------------------------------------------
|
---|
22 |
|
---|
23 | #define DEBUG_SOCKET 0x20000000 ///< Display Socket related messages
|
---|
24 | #define DEBUG_BIND 0x10000000 ///< Display bind related messages
|
---|
25 | #define DEBUG_LISTEN 0x08000000 ///< Display listen related messages
|
---|
26 | #define DEBUG_CONNECTION 0x04000000 ///< Display connection list related messages
|
---|
27 | #define DEBUG_POLL 0x02000000 ///< Display poll messages
|
---|
28 | #define DEBUG_ACCEPT 0x01000000 ///< Display accept related messages
|
---|
29 | #define DEBUG_RX 0x00800000 ///< Display receive messages
|
---|
30 | #define DEBUG_TX 0x00400000 ///< Display transmit messages
|
---|
31 | #define DEBUG_CLOSE 0x00200000 ///< Display close messages
|
---|
32 | #define DEBUG_CONNECT 0x00100000 ///< Display connect messages
|
---|
33 | #define DEBUG_OPTION 0x00080000 ///< Display option messages
|
---|
34 |
|
---|
35 | #define MAX_PENDING_CONNECTIONS 1 ///< Maximum connection FIFO depth
|
---|
36 | #define MAX_RX_DATA 0x01000000 ///< Maximum receive data size
|
---|
37 | #define MAX_TX_DATA ( MAX_RX_DATA * 2 ) ///< Maximum buffered transmit data in bytes
|
---|
38 | #define RX_PACKET_DATA 0x00100000 ///< Maximum number of bytes in a RX packet
|
---|
39 | #define MAX_UDP_RETRANSMIT 16 ///< UDP retransmit attempts to handle address not mapped
|
---|
40 |
|
---|
41 | #define ESL_STRUCTURE_ALIGNMENT_BYTES 15 ///< Number of bytes for structure alignment
|
---|
42 | #define ESL_STRUCTURE_ALIGNMENT_MASK ( ~ESL_STRUCTURE_ALIGNMENT_BYTES ) ///< Mask to align structures
|
---|
43 |
|
---|
44 | #define LAYER_SIGNATURE SIGNATURE_32 ('S','k','t','L') ///< ESL_LAYER memory signature
|
---|
45 | #define SERVICE_SIGNATURE SIGNATURE_32 ('S','k','t','S') ///< ESL_SERVICE memory signature
|
---|
46 | #define SOCKET_SIGNATURE SIGNATURE_32 ('S','c','k','t') ///< ESL_SOCKET memory signature
|
---|
47 | #define PORT_SIGNATURE SIGNATURE_32 ('P','o','r','t') ///< ESL_PORT memory signature
|
---|
48 |
|
---|
49 |
|
---|
50 | /**
|
---|
51 | Socket states
|
---|
52 | **/
|
---|
53 | typedef enum
|
---|
54 | {
|
---|
55 | SOCKET_STATE_NOT_CONFIGURED = 0, ///< socket call was successful
|
---|
56 | SOCKET_STATE_BOUND, ///< bind call was successful
|
---|
57 | SOCKET_STATE_LISTENING, ///< listen call was successful
|
---|
58 | SOCKET_STATE_NO_PORTS, ///< No ports available
|
---|
59 | SOCKET_STATE_IN_FIFO, ///< Socket on FIFO
|
---|
60 | SOCKET_STATE_CONNECTING, ///< Connecting to a remote system
|
---|
61 | SOCKET_STATE_CONNECTED, ///< Accept or connect call was successful
|
---|
62 |
|
---|
63 | //
|
---|
64 | // Close state must be the last in the list
|
---|
65 | //
|
---|
66 | SOCKET_STATE_CLOSED ///< Close call was successful
|
---|
67 | } SOCKET_STATE;
|
---|
68 |
|
---|
69 |
|
---|
70 | /**
|
---|
71 | Port states
|
---|
72 | **/
|
---|
73 | typedef enum
|
---|
74 | {
|
---|
75 | PORT_STATE_ALLOCATED = 0, ///< Port allocated
|
---|
76 | PORT_STATE_OPEN, ///< Port opened
|
---|
77 | PORT_STATE_RX_ERROR, ///< Receive error detected
|
---|
78 |
|
---|
79 | //
|
---|
80 | // Close state must be last in the list!
|
---|
81 | //
|
---|
82 | // Using < <= > >= in tests code to detect port close state
|
---|
83 | // machine has started
|
---|
84 | //
|
---|
85 | PORT_STATE_CLOSE_STARTED, ///< Close started on port
|
---|
86 | PORT_STATE_CLOSE_TX_DONE, ///< Transmits shutdown
|
---|
87 | PORT_STATE_CLOSE_DONE, ///< Port close operation complete
|
---|
88 | PORT_STATE_CLOSE_RX_DONE ///< Receives shutdown
|
---|
89 | } PORT_STATE;
|
---|
90 |
|
---|
91 | //------------------------------------------------------------------------------
|
---|
92 | // Data Types
|
---|
93 | //------------------------------------------------------------------------------
|
---|
94 |
|
---|
95 | typedef struct _ESL_IO_MGMT ESL_IO_MGMT;///< Forward declaration
|
---|
96 | typedef struct _ESL_PACKET ESL_PACKET; ///< Forward declaration
|
---|
97 | typedef struct _ESL_PORT ESL_PORT; ///< Forward declaration
|
---|
98 | typedef struct _ESL_SOCKET ESL_SOCKET; ///< Forward declaration
|
---|
99 |
|
---|
100 | /**
|
---|
101 | Receive context for SOCK_RAW sockets using IPv4.
|
---|
102 | **/
|
---|
103 | typedef struct
|
---|
104 | {
|
---|
105 | EFI_IP4_RECEIVE_DATA * pRxData; ///< Receive operation description
|
---|
106 | } ESL_IP4_RX_DATA;
|
---|
107 |
|
---|
108 |
|
---|
109 | /**
|
---|
110 | Transmit context for SOCK_RAW sockets using IPv4.
|
---|
111 | **/
|
---|
112 | typedef struct
|
---|
113 | {
|
---|
114 | EFI_IP4_OVERRIDE_DATA Override; ///< Override data
|
---|
115 | EFI_IP4_TRANSMIT_DATA TxData; ///< Transmit operation description
|
---|
116 | UINT8 Buffer[ 1 ]; ///< Data buffer
|
---|
117 | } ESL_IP4_TX_DATA;
|
---|
118 |
|
---|
119 |
|
---|
120 | /**
|
---|
121 | Receive context for SOCK_STREAM and SOCK_SEQPACKET sockets using TCPv4.
|
---|
122 | **/
|
---|
123 | typedef struct
|
---|
124 | {
|
---|
125 | EFI_TCP4_RECEIVE_DATA RxData; ///< Receive operation description
|
---|
126 | UINT8 Buffer[ RX_PACKET_DATA ]; ///< Data buffer
|
---|
127 | } ESL_TCP4_RX_DATA;
|
---|
128 |
|
---|
129 |
|
---|
130 | /**
|
---|
131 | Transmit context for SOCK_STREAM and SOCK_SEQPACKET sockets using TCPv4.
|
---|
132 | **/
|
---|
133 | typedef struct
|
---|
134 | {
|
---|
135 | EFI_TCP4_TRANSMIT_DATA TxData; ///< Transmit operation description
|
---|
136 | UINT8 Buffer[ 1 ]; ///< Data buffer
|
---|
137 | } ESL_TCP4_TX_DATA;
|
---|
138 |
|
---|
139 |
|
---|
140 | /**
|
---|
141 | Receive context for SOCK_STREAM and SOCK_SEQPACKET sockets using TCPv6.
|
---|
142 | **/
|
---|
143 | typedef struct
|
---|
144 | {
|
---|
145 | EFI_TCP6_RECEIVE_DATA RxData; ///< Receive operation description
|
---|
146 | UINT8 Buffer[ RX_PACKET_DATA ]; ///< Data buffer
|
---|
147 | } ESL_TCP6_RX_DATA;
|
---|
148 |
|
---|
149 |
|
---|
150 | /**
|
---|
151 | Transmit context for SOCK_STREAM and SOCK_SEQPACKET sockets using TCPv6.
|
---|
152 | **/
|
---|
153 | typedef struct
|
---|
154 | {
|
---|
155 | EFI_TCP6_TRANSMIT_DATA TxData; ///< Transmit operation description
|
---|
156 | UINT8 Buffer[ 1 ]; ///< Data buffer
|
---|
157 | } ESL_TCP6_TX_DATA;
|
---|
158 |
|
---|
159 |
|
---|
160 | /**
|
---|
161 | Receive context for SOCK_DGRAM sockets using UDPv4.
|
---|
162 | **/
|
---|
163 | typedef struct
|
---|
164 | {
|
---|
165 | EFI_UDP4_SESSION_DATA Session; ///< Remote network address
|
---|
166 | EFI_UDP4_RECEIVE_DATA * pRxData; ///< Receive operation description
|
---|
167 | } ESL_UDP4_RX_DATA;
|
---|
168 |
|
---|
169 |
|
---|
170 | /**
|
---|
171 | Transmit context for SOCK_DGRAM sockets using UDPv4.
|
---|
172 | **/
|
---|
173 | typedef struct
|
---|
174 | {
|
---|
175 | EFI_UDP4_SESSION_DATA Session; ///< Remote network address
|
---|
176 | EFI_UDP4_TRANSMIT_DATA TxData; ///< Transmit operation description
|
---|
177 | UINTN RetransmitCount; ///< Retransmit to handle ARP negotiation
|
---|
178 | UINT8 Buffer[ 1 ]; ///< Data buffer
|
---|
179 | } ESL_UDP4_TX_DATA;
|
---|
180 |
|
---|
181 |
|
---|
182 | /**
|
---|
183 | Receive context for SOCK_DGRAM sockets using UDPv6.
|
---|
184 | **/
|
---|
185 | typedef struct
|
---|
186 | {
|
---|
187 | EFI_UDP6_SESSION_DATA Session; ///< Remote network address
|
---|
188 | EFI_UDP6_RECEIVE_DATA * pRxData; ///< Receive operation description
|
---|
189 | } ESL_UDP6_RX_DATA;
|
---|
190 |
|
---|
191 |
|
---|
192 | /**
|
---|
193 | Transmit context for SOCK_DGRAM sockets using UDPv6.
|
---|
194 | **/
|
---|
195 | typedef struct
|
---|
196 | {
|
---|
197 | EFI_UDP6_SESSION_DATA Session; ///< Remote network address
|
---|
198 | EFI_UDP6_TRANSMIT_DATA TxData; ///< Transmit operation description
|
---|
199 | UINTN RetransmitCount; ///< Retransmit to handle ARP negotiation
|
---|
200 | UINT8 Buffer[ 1 ]; ///< Data buffer
|
---|
201 | } ESL_UDP6_TX_DATA;
|
---|
202 |
|
---|
203 |
|
---|
204 | /**
|
---|
205 | Network specific context for transmit and receive packets.
|
---|
206 | **/
|
---|
207 | typedef struct _ESL_PACKET {
|
---|
208 | ESL_PACKET * pNext; ///< Next packet in the receive list
|
---|
209 | size_t PacketSize; ///< Size of this data structure
|
---|
210 | size_t ValidBytes; ///< Length of valid data in bytes
|
---|
211 | UINT8 * pBuffer; ///< Current data pointer
|
---|
212 | union {
|
---|
213 | ESL_IP4_RX_DATA Ip4Rx; ///< Receive operation description
|
---|
214 | ESL_IP4_TX_DATA Ip4Tx; ///< Transmit operation description
|
---|
215 | ESL_TCP4_RX_DATA Tcp4Rx; ///< Receive operation description
|
---|
216 | ESL_TCP4_TX_DATA Tcp4Tx; ///< Transmit operation description
|
---|
217 | ESL_TCP6_RX_DATA Tcp6Rx; ///< Receive operation description
|
---|
218 | ESL_TCP6_TX_DATA Tcp6Tx; ///< Transmit operation description
|
---|
219 | ESL_UDP4_RX_DATA Udp4Rx; ///< Receive operation description
|
---|
220 | ESL_UDP4_TX_DATA Udp4Tx; ///< Transmit operation description
|
---|
221 | ESL_UDP6_RX_DATA Udp6Rx; ///< Receive operation description
|
---|
222 | ESL_UDP6_TX_DATA Udp6Tx; ///< Transmit operation description
|
---|
223 | } Op; ///< Network specific context
|
---|
224 | } GCC_ESL_PACKET;
|
---|
225 |
|
---|
226 | /**
|
---|
227 | Service control structure
|
---|
228 |
|
---|
229 | The driver uses this structure to manage the network devices.
|
---|
230 | **/
|
---|
231 | typedef struct _ESL_SERVICE {
|
---|
232 | UINTN Signature; ///< Structure identification
|
---|
233 |
|
---|
234 | //
|
---|
235 | // Links
|
---|
236 | //
|
---|
237 | ESL_SERVICE * pNext; ///< Next service in the service list
|
---|
238 |
|
---|
239 | //
|
---|
240 | // Service data
|
---|
241 | //
|
---|
242 | CONST ESL_SOCKET_BINDING * pSocketBinding; ///< Name and shutdown routine
|
---|
243 | EFI_HANDLE Controller; ///< Controller for the service
|
---|
244 | EFI_SERVICE_BINDING_PROTOCOL * pServiceBinding; ///< Network layer service binding interface
|
---|
245 |
|
---|
246 | //
|
---|
247 | // Network data
|
---|
248 | //
|
---|
249 | ESL_PORT * pPortList; ///< List of ports using this service
|
---|
250 | }GCC_ESL_SERVICE;
|
---|
251 |
|
---|
252 | /**
|
---|
253 | IO management structure
|
---|
254 |
|
---|
255 | This structure manages a single operation with the network.
|
---|
256 | **/
|
---|
257 | typedef struct _ESL_IO_MGMT {
|
---|
258 | ESL_IO_MGMT * pNext; ///< Next TX management structure
|
---|
259 | ESL_PORT * pPort; ///< Port structure address
|
---|
260 | ESL_PACKET * pPacket; ///< Packet structure address
|
---|
261 | union {
|
---|
262 | EFI_IP4_COMPLETION_TOKEN Ip4Rx; ///< IP4 receive token
|
---|
263 | EFI_IP4_COMPLETION_TOKEN Ip4Tx; ///< IP4 transmit token
|
---|
264 | EFI_TCP4_IO_TOKEN Tcp4Rx; ///< TCP4 receive token
|
---|
265 | EFI_TCP4_IO_TOKEN Tcp4Tx; ///< TCP4 transmit token
|
---|
266 | EFI_TCP6_IO_TOKEN Tcp6Rx; ///< TCP6 receive token
|
---|
267 | EFI_TCP6_IO_TOKEN Tcp6Tx; ///< TCP6 transmit token
|
---|
268 | EFI_UDP4_COMPLETION_TOKEN Udp4Rx; ///< UDP4 receive token
|
---|
269 | EFI_UDP4_COMPLETION_TOKEN Udp4Tx; ///< UDP4 transmit token
|
---|
270 | EFI_UDP6_COMPLETION_TOKEN Udp6Rx; ///< UDP6 receive token
|
---|
271 | EFI_UDP6_COMPLETION_TOKEN Udp6Tx; ///< UDP6 transmit token
|
---|
272 | } Token; ///< Completion token for the network operation
|
---|
273 | } GCC_IO_MGMT;
|
---|
274 |
|
---|
275 | /**
|
---|
276 | IP4 context structure
|
---|
277 |
|
---|
278 | The driver uses this structure to manage the IP4 connections.
|
---|
279 | **/
|
---|
280 | typedef struct {
|
---|
281 | //
|
---|
282 | // IP4 context
|
---|
283 | //
|
---|
284 | EFI_IP4_MODE_DATA ModeData; ///< IP4 mode data, includes configuration data
|
---|
285 | EFI_IPv4_ADDRESS DestinationAddress; ///< Default destination address
|
---|
286 | } ESL_IP4_CONTEXT;
|
---|
287 |
|
---|
288 |
|
---|
289 | /**
|
---|
290 | TCP4 context structure
|
---|
291 |
|
---|
292 | The driver uses this structure to manage the TCP4 connections.
|
---|
293 | **/
|
---|
294 | typedef struct {
|
---|
295 | //
|
---|
296 | // TCP4 context
|
---|
297 | //
|
---|
298 | EFI_TCP4_CONFIG_DATA ConfigData; ///< TCP4 configuration data
|
---|
299 | EFI_TCP4_OPTION Option; ///< TCP4 port options
|
---|
300 |
|
---|
301 | //
|
---|
302 | // Tokens
|
---|
303 | //
|
---|
304 | EFI_TCP4_LISTEN_TOKEN ListenToken; ///< Listen control
|
---|
305 | EFI_TCP4_CONNECTION_TOKEN ConnectToken; ///< Connection control
|
---|
306 | EFI_TCP4_CLOSE_TOKEN CloseToken; ///< Close control
|
---|
307 | } ESL_TCP4_CONTEXT;
|
---|
308 |
|
---|
309 | /**
|
---|
310 | TCP6 context structure
|
---|
311 |
|
---|
312 | The driver uses this structure to manage the TCP6 connections.
|
---|
313 | **/
|
---|
314 | typedef struct {
|
---|
315 | //
|
---|
316 | // TCP6 context
|
---|
317 | //
|
---|
318 | EFI_TCP6_CONFIG_DATA ConfigData; ///< TCP6 configuration data
|
---|
319 | EFI_TCP6_OPTION Option; ///< TCP6 port options
|
---|
320 |
|
---|
321 | //
|
---|
322 | // Tokens
|
---|
323 | //
|
---|
324 | EFI_TCP6_LISTEN_TOKEN ListenToken; ///< Listen control
|
---|
325 | EFI_TCP6_CONNECTION_TOKEN ConnectToken; ///< Connection control
|
---|
326 | EFI_TCP6_CLOSE_TOKEN CloseToken; ///< Close control
|
---|
327 | } ESL_TCP6_CONTEXT;
|
---|
328 |
|
---|
329 | /**
|
---|
330 | UDP4 context structure
|
---|
331 |
|
---|
332 | The driver uses this structure to manage the UDP4 connections.
|
---|
333 | **/
|
---|
334 | typedef struct {
|
---|
335 | //
|
---|
336 | // UDP4 context
|
---|
337 | //
|
---|
338 | EFI_UDP4_CONFIG_DATA ConfigData; ///< UDP4 configuration data
|
---|
339 | } ESL_UDP4_CONTEXT;
|
---|
340 |
|
---|
341 | /**
|
---|
342 | UDP6 context structure
|
---|
343 |
|
---|
344 | The driver uses this structure to manage the UDP6 connections.
|
---|
345 | **/
|
---|
346 | typedef struct {
|
---|
347 | //
|
---|
348 | // UDP6 context
|
---|
349 | //
|
---|
350 | EFI_UDP6_CONFIG_DATA ConfigData; ///< UDP6 configuration data
|
---|
351 | } ESL_UDP6_CONTEXT;
|
---|
352 |
|
---|
353 |
|
---|
354 | /**
|
---|
355 | Configure the network layer.
|
---|
356 |
|
---|
357 | @param [in] pProtocol Protocol structure address
|
---|
358 | @param [in] pConfigData Address of the confiuration data
|
---|
359 |
|
---|
360 | @return Returns EFI_SUCCESS if the operation is successfully
|
---|
361 | started.
|
---|
362 | **/
|
---|
363 | typedef
|
---|
364 | EFI_STATUS
|
---|
365 | (EFIAPI * PFN_NET_CONFIGURE) (
|
---|
366 | IN VOID * pProtocol,
|
---|
367 | IN VOID * pConfigData
|
---|
368 | );
|
---|
369 |
|
---|
370 | /**
|
---|
371 | Hand an I/O operation to the network layer.
|
---|
372 |
|
---|
373 | @param [in] pProtocol Protocol structure address
|
---|
374 | @param [in] pToken Completion token address
|
---|
375 |
|
---|
376 | @return Returns EFI_SUCCESS if the operation is successfully
|
---|
377 | started.
|
---|
378 | **/
|
---|
379 | typedef
|
---|
380 | EFI_STATUS
|
---|
381 | (EFIAPI * PFN_NET_IO_START) (
|
---|
382 | IN VOID * pProtocol,
|
---|
383 | IN VOID * pToken
|
---|
384 | );
|
---|
385 |
|
---|
386 | /**
|
---|
387 | Poll the LAN adapter for receive packets.
|
---|
388 |
|
---|
389 | @param [in] pProtocol Protocol structure address
|
---|
390 | @param [in] pToken Completion token address
|
---|
391 |
|
---|
392 | @return Returns EFI_SUCCESS if the operation is successfully
|
---|
393 | started.
|
---|
394 | **/
|
---|
395 | typedef
|
---|
396 | EFI_STATUS
|
---|
397 | (EFIAPI * PFN_NET_POLL) (
|
---|
398 | IN VOID * pProtocol
|
---|
399 | );
|
---|
400 |
|
---|
401 | /**
|
---|
402 | Port control structure
|
---|
403 |
|
---|
404 | The driver uses this structure to manager the socket's connection
|
---|
405 | with the network driver.
|
---|
406 | **/
|
---|
407 | typedef struct _ESL_PORT {
|
---|
408 | UINTN Signature; ///< Structure identification
|
---|
409 |
|
---|
410 | //
|
---|
411 | // List links
|
---|
412 | //
|
---|
413 | ESL_PORT * pLinkService; ///< Link in service port list
|
---|
414 | ESL_PORT * pLinkSocket; ///< Link in socket port list
|
---|
415 |
|
---|
416 | //
|
---|
417 | // Structures
|
---|
418 | //
|
---|
419 | ESL_SERVICE * pService; ///< Service for this port
|
---|
420 | ESL_SOCKET * pSocket; ///< Socket for this port
|
---|
421 |
|
---|
422 | //
|
---|
423 | // Eliminate the pService references during port close
|
---|
424 | //
|
---|
425 | EFI_SERVICE_BINDING_PROTOCOL * pServiceBinding; ///< Service binding for network layer
|
---|
426 | CONST ESL_SOCKET_BINDING * pSocketBinding; ///< Socket binding for network layer
|
---|
427 |
|
---|
428 | //
|
---|
429 | // Port management
|
---|
430 | //
|
---|
431 | EFI_HANDLE Handle; ///< Network port handle
|
---|
432 | PORT_STATE State; ///< State of the port
|
---|
433 | UINTN DebugFlags; ///< Debug flags used to close the port
|
---|
434 | BOOLEAN bCloseNow; ///< TRUE = Close the port immediately
|
---|
435 | BOOLEAN bConfigured; ///< TRUE = Configure call made to network layer
|
---|
436 | PFN_NET_CONFIGURE pfnConfigure; ///< Configure the network layer
|
---|
437 |
|
---|
438 | //
|
---|
439 | // Transmit data management
|
---|
440 | //
|
---|
441 | BOOLEAN bTxFlowControl; ///< TX flow control applied
|
---|
442 | PFN_NET_IO_START pfnTxStart; ///< Start a transmit on the network
|
---|
443 | ESL_IO_MGMT * pTxActive; ///< Normal data queue
|
---|
444 | ESL_IO_MGMT * pTxFree; ///< Normal free queue
|
---|
445 |
|
---|
446 | ESL_IO_MGMT * pTxOobActive; ///< Urgent data queue
|
---|
447 | ESL_IO_MGMT * pTxOobFree; ///< Urgent free queue
|
---|
448 |
|
---|
449 | //
|
---|
450 | // Receive data management
|
---|
451 | //
|
---|
452 | PFN_NET_IO_START pfnRxCancel; ///< Cancel a receive on the network
|
---|
453 | PFN_NET_POLL pfnRxPoll; ///< Poll the LAN adapter for receive packets
|
---|
454 | PFN_NET_IO_START pfnRxStart; ///< Start a receive on the network
|
---|
455 | ESL_IO_MGMT * pRxActive; ///< Active receive operation queue
|
---|
456 | ESL_IO_MGMT * pRxFree; ///< Free structure queue
|
---|
457 |
|
---|
458 | //
|
---|
459 | // Protocol specific management data
|
---|
460 | //
|
---|
461 | union {
|
---|
462 | VOID * v; ///< VOID pointer
|
---|
463 | EFI_IP4_PROTOCOL * IPv4; ///< IP4 protocol pointer
|
---|
464 | EFI_TCP4_PROTOCOL * TCPv4; ///< TCP4 protocol pointer
|
---|
465 | EFI_TCP6_PROTOCOL * TCPv6; ///< TCP6 protocol pointer
|
---|
466 | EFI_UDP4_PROTOCOL * UDPv4; ///< UDP4 protocol pointer
|
---|
467 | EFI_UDP6_PROTOCOL * UDPv6; ///< UDP6 protocol pointer
|
---|
468 | } pProtocol; ///< Protocol structure address
|
---|
469 | union {
|
---|
470 | ESL_IP4_CONTEXT Ip4; ///< IPv4 management data
|
---|
471 | ESL_TCP4_CONTEXT Tcp4; ///< TCPv4 management data
|
---|
472 | ESL_TCP6_CONTEXT Tcp6; ///< TCPv6 management data
|
---|
473 | ESL_UDP4_CONTEXT Udp4; ///< UDPv4 management data
|
---|
474 | ESL_UDP6_CONTEXT Udp6; ///< UDPv6 management data
|
---|
475 | } Context; ///< Network specific context
|
---|
476 | }GCC_ESL_PORT;
|
---|
477 |
|
---|
478 | /**
|
---|
479 | Accept a network connection.
|
---|
480 |
|
---|
481 | @param [in] pSocket Address of the socket structure.
|
---|
482 |
|
---|
483 | @param [in] pSockAddr Address of a buffer to receive the remote
|
---|
484 | network address.
|
---|
485 |
|
---|
486 | @param [in, out] pSockAddrLength Length in bytes of the address buffer.
|
---|
487 | On output specifies the length of the
|
---|
488 | remote network address.
|
---|
489 |
|
---|
490 | @retval EFI_SUCCESS Remote address is available
|
---|
491 | @retval Others Remote address not available
|
---|
492 |
|
---|
493 | **/
|
---|
494 | typedef
|
---|
495 | EFI_STATUS
|
---|
496 | (* PFN_API_ACCEPT) (
|
---|
497 | IN ESL_SOCKET * pSocket,
|
---|
498 | IN struct sockaddr * pSockAddr,
|
---|
499 | IN OUT socklen_t * pSockAddrLength
|
---|
500 | );
|
---|
501 |
|
---|
502 | /**
|
---|
503 | Poll for completion of the connection attempt.
|
---|
504 |
|
---|
505 | @param [in] pSocket Address of an ::ESL_SOCKET structure.
|
---|
506 |
|
---|
507 | @retval EFI_SUCCESS The connection was successfully established.
|
---|
508 | @retval EFI_NOT_READY The connection is in progress, call this routine again.
|
---|
509 | @retval Others The connection attempt failed.
|
---|
510 |
|
---|
511 | **/
|
---|
512 | typedef
|
---|
513 | EFI_STATUS
|
---|
514 | (* PFN_API_CONNECT_POLL) (
|
---|
515 | IN ESL_SOCKET * pSocket
|
---|
516 | );
|
---|
517 |
|
---|
518 | /**
|
---|
519 | Attempt to connect to a remote TCP port
|
---|
520 |
|
---|
521 | This routine starts the connection processing for a SOCK_STREAM
|
---|
522 | or SOCK_SEQPAKCET socket using the TCP network layer.
|
---|
523 |
|
---|
524 | This routine is called by ::EslSocketConnect to initiate the TCP
|
---|
525 | network specific connect operations.
|
---|
526 |
|
---|
527 | @param [in] pSocket Address of an ::ESL_SOCKET structure.
|
---|
528 |
|
---|
529 | @retval EFI_SUCCESS The connection was successfully established.
|
---|
530 | @retval EFI_NOT_READY The connection is in progress, call this routine again.
|
---|
531 | @retval Others The connection attempt failed.
|
---|
532 |
|
---|
533 | **/
|
---|
534 | typedef
|
---|
535 | EFI_STATUS
|
---|
536 | (* PFN_API_CONNECT_START) (
|
---|
537 | IN ESL_SOCKET * pSocket
|
---|
538 | );
|
---|
539 |
|
---|
540 | /**
|
---|
541 | Get the local socket address
|
---|
542 |
|
---|
543 | @param [in] pPort Address of an ::ESL_PORT structure.
|
---|
544 |
|
---|
545 | @param [out] pAddress Network address to receive the local system address
|
---|
546 |
|
---|
547 | **/
|
---|
548 | typedef
|
---|
549 | VOID
|
---|
550 | (* PFN_API_LOCAL_ADDR_GET) (
|
---|
551 | IN ESL_PORT * pPort,
|
---|
552 | OUT struct sockaddr * pAddress
|
---|
553 | );
|
---|
554 |
|
---|
555 | /**
|
---|
556 | Set the local port address.
|
---|
557 |
|
---|
558 | This routine sets the local port address.
|
---|
559 |
|
---|
560 | This support routine is called by ::EslSocketPortAllocate.
|
---|
561 |
|
---|
562 | @param [in] ppPort Address of an ESL_PORT structure
|
---|
563 | @param [in] pSockAddr Address of a sockaddr structure that contains the
|
---|
564 | connection point on the local machine. An IPv4 address
|
---|
565 | of INADDR_ANY specifies that the connection is made to
|
---|
566 | all of the network stacks on the platform. Specifying a
|
---|
567 | specific IPv4 address restricts the connection to the
|
---|
568 | network stack supporting that address. Specifying zero
|
---|
569 | for the port causes the network layer to assign a port
|
---|
570 | number from the dynamic range. Specifying a specific
|
---|
571 | port number causes the network layer to use that port.
|
---|
572 | @param [in] bBindTest TRUE = run bind testing
|
---|
573 |
|
---|
574 | @retval EFI_SUCCESS The operation was successful
|
---|
575 |
|
---|
576 | **/
|
---|
577 | typedef
|
---|
578 | EFI_STATUS
|
---|
579 | (* PFN_API_LOCAL_ADDR_SET) (
|
---|
580 | IN ESL_PORT * pPort,
|
---|
581 | IN CONST struct sockaddr * pSockAddr,
|
---|
582 | IN BOOLEAN bBindTest
|
---|
583 | );
|
---|
584 |
|
---|
585 | /**
|
---|
586 | Process the completion event
|
---|
587 |
|
---|
588 | This routine handles the I/O completion event.
|
---|
589 |
|
---|
590 | This routine is called by the low level network driver when
|
---|
591 | the operation is completed.
|
---|
592 |
|
---|
593 | @param [in] Event The receive completion event
|
---|
594 |
|
---|
595 | @param [in] pIo The address of an ::ESL_IO_MGMT structure
|
---|
596 |
|
---|
597 | **/
|
---|
598 | typedef
|
---|
599 | VOID
|
---|
600 | (* PFN_API_IO_COMPLETE) (
|
---|
601 | IN EFI_EVENT Event,
|
---|
602 | IN ESL_IO_MGMT * pIo
|
---|
603 | );
|
---|
604 |
|
---|
605 | /**
|
---|
606 | Determine if the socket is configured.
|
---|
607 |
|
---|
608 |
|
---|
609 | @param [in] pSocket Address of a ESL_SOCKET structure
|
---|
610 |
|
---|
611 | @retval EFI_SUCCESS - The port is connected
|
---|
612 | @retval EFI_NOT_STARTED - The port is not connected
|
---|
613 |
|
---|
614 | **/
|
---|
615 | typedef
|
---|
616 | EFI_STATUS
|
---|
617 | (* PFN_API_IS_CONFIGURED) (
|
---|
618 | IN ESL_SOCKET * pSocket
|
---|
619 | );
|
---|
620 |
|
---|
621 | /**
|
---|
622 | Establish the known port to listen for network connections.
|
---|
623 |
|
---|
624 | @param [in] pSocket Address of the socket structure.
|
---|
625 |
|
---|
626 | @retval EFI_SUCCESS - Socket successfully created
|
---|
627 | @retval Other - Failed to enable the socket for listen
|
---|
628 |
|
---|
629 | **/
|
---|
630 | typedef
|
---|
631 | EFI_STATUS
|
---|
632 | (* PFN_API_LISTEN) (
|
---|
633 | IN ESL_SOCKET * pSocket
|
---|
634 | );
|
---|
635 |
|
---|
636 | /**
|
---|
637 | Get the option value
|
---|
638 |
|
---|
639 | Retrieve the protocol options one at a time by name.
|
---|
640 |
|
---|
641 | @param [in] pSocket Address of a ESL_SOCKET structure
|
---|
642 | @param [in] OptionName Name of the option
|
---|
643 | @param [out] ppOptionData Buffer to receive address of option value
|
---|
644 | @param [out] pOptionLength Buffer to receive the option length
|
---|
645 |
|
---|
646 | @retval EFI_SUCCESS - Socket data successfully received
|
---|
647 |
|
---|
648 | **/
|
---|
649 | typedef
|
---|
650 | EFI_STATUS
|
---|
651 | (* PFN_API_OPTION_GET) (
|
---|
652 | IN ESL_SOCKET * pSocket,
|
---|
653 | IN int OptionName,
|
---|
654 | OUT CONST void ** __restrict ppOptionData,
|
---|
655 | OUT socklen_t * __restrict pOptionLength
|
---|
656 | );
|
---|
657 |
|
---|
658 | /**
|
---|
659 | Set the option value
|
---|
660 |
|
---|
661 | Adjust the protocol options one at a time by name.
|
---|
662 |
|
---|
663 | @param [in] pSocket Address of a ESL_SOCKET structure
|
---|
664 | @param [in] OptionName Name of the option
|
---|
665 | @param [in] pOptionValue Buffer containing the option value
|
---|
666 | @param [in] OptionLength Length of the buffer in bytes
|
---|
667 |
|
---|
668 | @retval EFI_SUCCESS - Option successfully set
|
---|
669 |
|
---|
670 | **/
|
---|
671 | typedef
|
---|
672 | EFI_STATUS
|
---|
673 | (* PFN_API_OPTION_SET) (
|
---|
674 | IN ESL_SOCKET * pSocket,
|
---|
675 | IN int OptionName,
|
---|
676 | IN CONST void * pOptionValue,
|
---|
677 | IN socklen_t OptionLength
|
---|
678 | );
|
---|
679 |
|
---|
680 | /**
|
---|
681 | Free a receive packet
|
---|
682 |
|
---|
683 | This routine performs the network specific operations necessary
|
---|
684 | to free a receive packet.
|
---|
685 |
|
---|
686 | This routine is called by ::EslSocketPortCloseTxDone to free a
|
---|
687 | receive packet.
|
---|
688 |
|
---|
689 | @param [in] pPacket Address of an ::ESL_PACKET structure.
|
---|
690 | @param [in, out] pRxBytes Address of the count of RX bytes
|
---|
691 |
|
---|
692 | **/
|
---|
693 | typedef
|
---|
694 | VOID
|
---|
695 | (* PFN_API_PACKET_FREE) (
|
---|
696 | IN ESL_PACKET * pPacket,
|
---|
697 | IN OUT size_t * pRxBytes
|
---|
698 | );
|
---|
699 |
|
---|
700 | /**
|
---|
701 | Initialize the network specific portions of an ::ESL_PORT structure.
|
---|
702 |
|
---|
703 | This routine initializes the network specific portions of an
|
---|
704 | ::ESL_PORT structure for use by the socket.
|
---|
705 |
|
---|
706 | This support routine is called by ::EslSocketPortAllocate
|
---|
707 | to connect the socket with the underlying network adapter
|
---|
708 | running the IPv4 protocol.
|
---|
709 |
|
---|
710 | @param [in] ppPort Address of an ESL_PORT structure
|
---|
711 | @param [in] DebugFlags Flags for debug messages
|
---|
712 |
|
---|
713 | @retval EFI_SUCCESS - Socket successfully created
|
---|
714 |
|
---|
715 | **/
|
---|
716 | typedef
|
---|
717 | EFI_STATUS
|
---|
718 | (* PFN_API_PORT_ALLOC) (
|
---|
719 | IN ESL_PORT * pPort,
|
---|
720 | IN UINTN DebugFlags
|
---|
721 | );
|
---|
722 |
|
---|
723 | /**
|
---|
724 | Close a network specific port.
|
---|
725 |
|
---|
726 | This routine releases the resources allocated by the
|
---|
727 | network specific PortAllocate routine.
|
---|
728 |
|
---|
729 | This routine is called by ::EslSocketPortCloseRxDone as
|
---|
730 | the last step of closing processing.
|
---|
731 | See the \ref PortCloseStateMachine section.
|
---|
732 |
|
---|
733 | @param [in] pPort Address of an ::ESL_PORT structure.
|
---|
734 |
|
---|
735 | @retval EFI_SUCCESS The port is closed
|
---|
736 | @retval other Port close error
|
---|
737 |
|
---|
738 | **/
|
---|
739 | typedef
|
---|
740 | EFI_STATUS
|
---|
741 | (* PFN_API_PORT_CLOSE) (
|
---|
742 | IN ESL_PORT * pPort
|
---|
743 | );
|
---|
744 |
|
---|
745 | /**
|
---|
746 | Perform the network specific close operation on the port.
|
---|
747 |
|
---|
748 | This routine performs the network specific operation to
|
---|
749 | shutdown receive operations on the port.
|
---|
750 |
|
---|
751 | This routine is called by the ::EslSocketPortCloseTxDone
|
---|
752 | routine after the port completes all of the transmission.
|
---|
753 |
|
---|
754 | @param [in] pPort Address of an ::ESL_PORT structure.
|
---|
755 |
|
---|
756 | @retval EFI_SUCCESS The port is closed, not normally returned
|
---|
757 | @retval EFI_NOT_READY The port is still closing
|
---|
758 | @retval EFI_ALREADY_STARTED Error, the port is in the wrong state,
|
---|
759 | most likely the routine was called already.
|
---|
760 |
|
---|
761 | **/
|
---|
762 | typedef
|
---|
763 | EFI_STATUS
|
---|
764 | (* PFN_API_PORT_CLOSE_OP) (
|
---|
765 | IN ESL_PORT * pPort
|
---|
766 | );
|
---|
767 |
|
---|
768 | /**
|
---|
769 | Receive data from a network connection.
|
---|
770 |
|
---|
771 | This routine attempts to return buffered data to the caller. The
|
---|
772 | data is removed from the urgent queue if the message flag MSG_OOB
|
---|
773 | is specified, otherwise data is removed from the normal queue.
|
---|
774 | See the \ref ReceiveEngine section.
|
---|
775 |
|
---|
776 | This routine is called by ::EslSocketReceive to handle the network
|
---|
777 | specific receive operation.
|
---|
778 |
|
---|
779 | @param [in] pPort Address of an ::ESL_PORT structure.
|
---|
780 |
|
---|
781 | @param [in] pPacket Address of an ::ESL_PACKET structure.
|
---|
782 |
|
---|
783 | @param [in] pbConsumePacket Address of a BOOLEAN indicating if the packet is to be consumed
|
---|
784 |
|
---|
785 | @param [in] BufferLength Length of the the buffer
|
---|
786 |
|
---|
787 | @param [in] pBuffer Address of a buffer to receive the data.
|
---|
788 |
|
---|
789 | @param [in] pDataLength Number of received data bytes in the buffer.
|
---|
790 |
|
---|
791 | @param [out] pAddress Network address to receive the remote system address
|
---|
792 |
|
---|
793 | @param [out] pSkipBytes Address to receive the number of bytes skipped
|
---|
794 |
|
---|
795 | @return Returns the address of the next free byte in the buffer.
|
---|
796 |
|
---|
797 | **/
|
---|
798 | typedef
|
---|
799 | UINT8 *
|
---|
800 | (* PFN_API_RECEIVE) (
|
---|
801 | IN ESL_PORT * pPort,
|
---|
802 | IN ESL_PACKET * pPacket,
|
---|
803 | IN BOOLEAN * pbConsumePacket,
|
---|
804 | IN size_t BufferLength,
|
---|
805 | IN UINT8 * pBuffer,
|
---|
806 | OUT size_t * pDataLength,
|
---|
807 | OUT struct sockaddr * pAddress,
|
---|
808 | OUT size_t * pSkipBytes
|
---|
809 | );
|
---|
810 |
|
---|
811 | /**
|
---|
812 | Get the remote socket address
|
---|
813 |
|
---|
814 | @param [in] pPort Address of an ::ESL_PORT structure.
|
---|
815 |
|
---|
816 | @param [out] pAddress Network address to receive the remote system address
|
---|
817 |
|
---|
818 | **/
|
---|
819 | typedef
|
---|
820 | VOID
|
---|
821 | (* PFN_API_REMOTE_ADDR_GET) (
|
---|
822 | IN ESL_PORT * pPort,
|
---|
823 | OUT struct sockaddr * pAddress
|
---|
824 | );
|
---|
825 |
|
---|
826 | /**
|
---|
827 | Set the remote address
|
---|
828 |
|
---|
829 | This routine sets the remote address in the port.
|
---|
830 |
|
---|
831 | This routine is called by ::EslSocketConnect to specify the
|
---|
832 | remote network address.
|
---|
833 |
|
---|
834 | @param [in] pPort Address of an ::ESL_PORT structure.
|
---|
835 |
|
---|
836 | @param [in] pSockAddr Network address of the remote system.
|
---|
837 |
|
---|
838 | @param [in] SockAddrLength Length in bytes of the network address.
|
---|
839 |
|
---|
840 | @retval EFI_SUCCESS The operation was successful
|
---|
841 |
|
---|
842 | **/
|
---|
843 | typedef
|
---|
844 | EFI_STATUS
|
---|
845 | (* PFN_API_REMOTE_ADDR_SET) (
|
---|
846 | IN ESL_PORT * pPort,
|
---|
847 | IN CONST struct sockaddr * pSockAddr,
|
---|
848 | IN socklen_t SockAddrLength
|
---|
849 | );
|
---|
850 |
|
---|
851 | /**
|
---|
852 | Start a receive operation
|
---|
853 |
|
---|
854 | This routine prepares a packet for the receive operation.
|
---|
855 | See the \ref ReceiveEngine section.
|
---|
856 |
|
---|
857 | This support routine is called by EslSocketRxStart.
|
---|
858 |
|
---|
859 | @param [in] pPort Address of an ::ESL_PORT structure.
|
---|
860 | @param [in] pIo Address of an ::ESL_IO_MGMT structure.
|
---|
861 |
|
---|
862 | **/
|
---|
863 | typedef
|
---|
864 | VOID
|
---|
865 | (* PFN_API_RX_START) (
|
---|
866 | IN ESL_PORT * pPort,
|
---|
867 | IN ESL_IO_MGMT * pIo
|
---|
868 | );
|
---|
869 |
|
---|
870 | /**
|
---|
871 | Buffer data for transmission over a network connection.
|
---|
872 |
|
---|
873 | @param [in] pSocket Address of a ESL_SOCKET structure
|
---|
874 |
|
---|
875 | @param [in] Flags Message control flags
|
---|
876 |
|
---|
877 | @param [in] BufferLength Length of the the buffer
|
---|
878 |
|
---|
879 | @param [in] pBuffer Address of a buffer to receive the data.
|
---|
880 |
|
---|
881 | @param [in] pDataLength Number of received data bytes in the buffer.
|
---|
882 |
|
---|
883 | @param [in] pAddress Network address of the remote system address
|
---|
884 |
|
---|
885 | @param [in] AddressLength Length of the remote network address structure
|
---|
886 |
|
---|
887 | @retval EFI_SUCCESS - Socket data successfully buffered
|
---|
888 |
|
---|
889 | **/
|
---|
890 | typedef
|
---|
891 | EFI_STATUS
|
---|
892 | (* PFN_API_TRANSMIT) (
|
---|
893 | IN ESL_SOCKET * pSocket,
|
---|
894 | IN int Flags,
|
---|
895 | IN size_t BufferLength,
|
---|
896 | IN CONST UINT8 * pBuffer,
|
---|
897 | OUT size_t * pDataLength,
|
---|
898 | IN const struct sockaddr * pAddress,
|
---|
899 | IN socklen_t AddressLength
|
---|
900 | );
|
---|
901 |
|
---|
902 | /**
|
---|
903 | Process the transmit completion
|
---|
904 |
|
---|
905 | This routine calls ::EslSocketTxComplete to handle the
|
---|
906 | transmit completion.
|
---|
907 |
|
---|
908 | This routine is called by the network layers upon the completion
|
---|
909 | of a transmit operation.
|
---|
910 |
|
---|
911 | @param [in] Event The urgent transmit completion event
|
---|
912 |
|
---|
913 | @param [in] pIo The ESL_IO_MGMT structure address
|
---|
914 |
|
---|
915 | **/
|
---|
916 | typedef
|
---|
917 | VOID
|
---|
918 | (* PFN_API_TX_COMPLETE) (
|
---|
919 | IN EFI_EVENT Event,
|
---|
920 | IN ESL_IO_MGMT * pIo
|
---|
921 | );
|
---|
922 |
|
---|
923 | /**
|
---|
924 | Verify the adapter's IP address
|
---|
925 |
|
---|
926 | This support routine is called by EslSocketBindTest.
|
---|
927 |
|
---|
928 | @param [in] pPort Address of an ::ESL_PORT structure.
|
---|
929 | @param [in] pConfigData Address of the configuration data
|
---|
930 |
|
---|
931 | @retval EFI_SUCCESS - The IP address is valid
|
---|
932 | @retval EFI_NOT_STARTED - The IP address is invalid
|
---|
933 |
|
---|
934 | **/
|
---|
935 | typedef
|
---|
936 | EFI_STATUS
|
---|
937 | (* PFN_API_VERIFY_LOCAL_IP_ADDRESS) (
|
---|
938 | IN ESL_PORT * pPort,
|
---|
939 | IN VOID * pConfigData
|
---|
940 | );
|
---|
941 |
|
---|
942 | /**
|
---|
943 | Socket type control structure
|
---|
944 |
|
---|
945 | This driver uses this structure to define the API for the socket type.
|
---|
946 | **/
|
---|
947 | typedef struct {
|
---|
948 | CONST CHAR8 * pName; ///< Protocol name
|
---|
949 | int DefaultProtocol; ///< Default protocol
|
---|
950 | UINTN ConfigDataOffset; ///< Offset in ::ESL_PORT to the configuration data
|
---|
951 | UINTN ServiceListOffset; ///< Offset in ::ESL_LAYER for the list of services
|
---|
952 | socklen_t MinimumAddressLength; ///< Minimum address length in bytes
|
---|
953 | socklen_t AddressLength; ///< Address length in bytes
|
---|
954 | sa_family_t AddressFamily; ///< Address family
|
---|
955 | UINTN RxPacketBytes; ///< Length of the RX packet allocation
|
---|
956 | UINTN RxZeroBytes; ///< Number of bytes to zero in RX packet
|
---|
957 | UINTN RxBufferOffset; ///< Offset of buffer address in ESL_IO_MGMT structure
|
---|
958 | BOOLEAN bOobSupported; ///< TRUE if out-of-band messages are supported
|
---|
959 | int BindTestErrno; ///< errno value if EslSocketBindTest fails
|
---|
960 | PFN_API_ACCEPT pfnAccept; ///< Accept a network connection
|
---|
961 | PFN_API_CONNECT_POLL pfnConnectPoll; ///< Poll for connection complete
|
---|
962 | PFN_API_CONNECT_START pfnConnectStart; ///< Start the connection to a remote system
|
---|
963 | PFN_API_IS_CONFIGURED pfnIsConfigured; ///< Determine if the socket is configured
|
---|
964 | PFN_API_LOCAL_ADDR_GET pfnLocalAddrGet; ///< Get the local address
|
---|
965 | PFN_API_LOCAL_ADDR_SET pfnLocalAddrSet; ///< Set the local address
|
---|
966 | PFN_API_LISTEN pfnListen; ///< Listen for connections on known server port
|
---|
967 | PFN_API_OPTION_GET pfnOptionGet; ///< Get the option value
|
---|
968 | PFN_API_OPTION_SET pfnOptionSet; ///< Set the option value
|
---|
969 | PFN_API_PACKET_FREE pfnPacketFree; ///< Free the receive packet
|
---|
970 | PFN_API_PORT_ALLOC pfnPortAllocate; ///< Allocate the network specific resources for the port
|
---|
971 | PFN_API_PORT_CLOSE pfnPortClose; ///< Close the network specific resources for the port
|
---|
972 | PFN_API_PORT_CLOSE_OP pfnPortCloseOp; ///< Perform the close operation on the port
|
---|
973 | BOOLEAN bPortCloseComplete; ///< TRUE = Close is complete after close operation
|
---|
974 | PFN_API_RECEIVE pfnReceive; ///< Attempt to receive some data
|
---|
975 | PFN_API_REMOTE_ADDR_GET pfnRemoteAddrGet; ///< Get remote address
|
---|
976 | PFN_API_REMOTE_ADDR_SET pfnRemoteAddrSet; ///< Set the remote system address
|
---|
977 | PFN_API_IO_COMPLETE pfnRxComplete; ///< RX completion
|
---|
978 | PFN_API_RX_START pfnRxStart; ///< Start a network specific receive operation
|
---|
979 | PFN_API_TRANSMIT pfnTransmit; ///< Attempt to buffer a packet for transmit
|
---|
980 | PFN_API_TX_COMPLETE pfnTxComplete; ///< TX completion for normal data
|
---|
981 | PFN_API_TX_COMPLETE pfnTxOobComplete; ///< TX completion for urgent data
|
---|
982 | PFN_API_VERIFY_LOCAL_IP_ADDRESS pfnVerifyLocalIpAddress; ///< Verify the local IP address
|
---|
983 | } ESL_PROTOCOL_API;
|
---|
984 |
|
---|
985 |
|
---|
986 | /**
|
---|
987 | Socket control structure
|
---|
988 |
|
---|
989 | The driver uses this structure to manage the socket.
|
---|
990 | **/
|
---|
991 | typedef struct _ESL_SOCKET {
|
---|
992 | UINTN Signature; ///< Structure identification
|
---|
993 |
|
---|
994 | //
|
---|
995 | // Protocol binding
|
---|
996 | //
|
---|
997 | EFI_SOCKET_PROTOCOL SocketProtocol; ///< Socket protocol declaration
|
---|
998 | CONST ESL_PROTOCOL_API * pApi; ///< API for the protocol
|
---|
999 |
|
---|
1000 | //
|
---|
1001 | // Socket management
|
---|
1002 | //
|
---|
1003 | ESL_SOCKET * pNext; ///< Next socket in the list of sockets
|
---|
1004 | int errno; ///< Error information for this socket
|
---|
1005 | EFI_STATUS Status; ///< Asyncronous error information for this socket
|
---|
1006 | SOCKET_STATE State; ///< Socket state
|
---|
1007 | UINT32 DebugFlags; ///< Debug flags
|
---|
1008 |
|
---|
1009 | //
|
---|
1010 | // Socket options
|
---|
1011 | //
|
---|
1012 | BOOLEAN bIncludeHeader; ///< TRUE if including the IP header
|
---|
1013 | BOOLEAN bListenCalled; ///< TRUE if listen was successfully called
|
---|
1014 | BOOLEAN bOobInLine; ///< TRUE if out-of-band messages are to be received inline with normal data
|
---|
1015 | BOOLEAN bReUseAddr; ///< TRUE if using same address is allowed
|
---|
1016 |
|
---|
1017 | //
|
---|
1018 | // Socket data
|
---|
1019 | //
|
---|
1020 | int Domain; ///< Specifies family of protocols
|
---|
1021 | int Type; ///< Specifies how to make network connection
|
---|
1022 | int Protocol; ///< Specifies lower layer protocol to use
|
---|
1023 | BOOLEAN bAddressSet; ///< Set when the address is specified
|
---|
1024 | BOOLEAN bConfigured; ///< Set after the socket is configured
|
---|
1025 |
|
---|
1026 | BOOLEAN bRxDisable; ///< Receive disabled via shutdown
|
---|
1027 | size_t RxBytes; ///< Total Rx bytes
|
---|
1028 | size_t RxOobBytes; ///< Urgent Rx bytes
|
---|
1029 | EFI_STATUS RxError; ///< Error during receive
|
---|
1030 |
|
---|
1031 | BOOLEAN bTxDisable; ///< Transmit disabled via shutdown
|
---|
1032 | size_t TxBytes; ///< Normal Tx bytes
|
---|
1033 | size_t TxOobBytes; ///< Urgent Tx bytes
|
---|
1034 | EFI_STATUS TxError; ///< Error during transmit
|
---|
1035 |
|
---|
1036 | //
|
---|
1037 | // Pending connection data
|
---|
1038 | //
|
---|
1039 | BOOLEAN bConnected; ///< Set when connected, cleared by poll
|
---|
1040 | EFI_STATUS ConnectStatus; ///< Connection status
|
---|
1041 | UINTN MaxFifoDepth; ///< Maximum FIFO depth
|
---|
1042 | UINTN FifoDepth; ///< Number of sockets in the FIFO
|
---|
1043 | ESL_SOCKET * pFifoHead; ///< Head of the FIFO
|
---|
1044 | ESL_SOCKET * pFifoTail; ///< Tail of the FIFO
|
---|
1045 | ESL_SOCKET * pNextConnection; ///< Link in the FIFO
|
---|
1046 |
|
---|
1047 | //
|
---|
1048 | // Network use
|
---|
1049 | //
|
---|
1050 | ESL_PORT * pPortList; ///< List of ports managed by this socket
|
---|
1051 | EFI_EVENT WaitAccept; ///< Wait for accept completion
|
---|
1052 |
|
---|
1053 | //
|
---|
1054 | // Receive data management
|
---|
1055 | //
|
---|
1056 | UINT32 MaxRxBuf; ///< Maximum size of the receive buffer
|
---|
1057 | struct timeval RxTimeout; ///< Receive timeout
|
---|
1058 | ESL_PACKET * pRxFree; ///< Free packet list
|
---|
1059 | ESL_PACKET * pRxOobPacketListHead;///< Urgent data list head
|
---|
1060 | ESL_PACKET * pRxOobPacketListTail;///< Urgent data list tail
|
---|
1061 | ESL_PACKET * pRxPacketListHead; ///< Normal data list head
|
---|
1062 | ESL_PACKET * pRxPacketListTail; ///< Normal data list tail
|
---|
1063 |
|
---|
1064 | //
|
---|
1065 | // Transmit data management
|
---|
1066 | //
|
---|
1067 | UINTN TxPacketOffset; ///< Offset for data pointer in ::ESL_PACKET
|
---|
1068 | UINTN TxTokenEventOffset; ///< Offset to the Event in the TX token
|
---|
1069 | UINTN TxTokenOffset; ///< Offset for data pointer in TX token
|
---|
1070 | UINT32 MaxTxBuf; ///< Maximum size of the transmit buffer
|
---|
1071 | ESL_PACKET * pTxOobPacketListHead;///< Urgent data list head
|
---|
1072 | ESL_PACKET * pTxOobPacketListTail;///< Urgent data list tail
|
---|
1073 | ESL_PACKET * pTxPacketListHead; ///< Normal data list head
|
---|
1074 | ESL_PACKET * pTxPacketListTail; ///< Normal data list tail
|
---|
1075 | }GCC_ESL_SOCKET;
|
---|
1076 |
|
---|
1077 | #define SOCKET_FROM_PROTOCOL(a) CR (a, ESL_SOCKET, SocketProtocol, SOCKET_SIGNATURE) ///< Locate ESL_SOCKET from protocol
|
---|
1078 |
|
---|
1079 | /**
|
---|
1080 | Socket layer control structure
|
---|
1081 |
|
---|
1082 | The driver uses this structure to manage the driver.
|
---|
1083 | **/
|
---|
1084 | typedef struct {
|
---|
1085 | UINTN Signature; ///< Structure identification
|
---|
1086 |
|
---|
1087 | //
|
---|
1088 | // Service binding interface
|
---|
1089 | //
|
---|
1090 | CONST EFI_SERVICE_BINDING_PROTOCOL * pServiceBinding; ///< Driver's binding
|
---|
1091 |
|
---|
1092 | //
|
---|
1093 | // Image data
|
---|
1094 | //
|
---|
1095 | EFI_HANDLE ImageHandle; ///< Image handle
|
---|
1096 |
|
---|
1097 | //
|
---|
1098 | // Network services
|
---|
1099 | //
|
---|
1100 | ESL_SERVICE * pIp4List; ///< List of Ip4 services
|
---|
1101 | ESL_SERVICE * pTcp4List; ///< List of Tcp4 services
|
---|
1102 | ESL_SERVICE * pTcp6List; ///< List of Tcp6 services
|
---|
1103 | ESL_SERVICE * pUdp4List; ///< List of Udp4 services
|
---|
1104 | ESL_SERVICE * pUdp6List; ///< List of Udp6 services
|
---|
1105 |
|
---|
1106 | //
|
---|
1107 | // Socket management
|
---|
1108 | //
|
---|
1109 | ESL_SOCKET * pSocketList; ///< List of sockets
|
---|
1110 | } ESL_LAYER;
|
---|
1111 |
|
---|
1112 | #define LAYER_FROM_SERVICE(a) CR (a, ESL_LAYER, ServiceBinding, LAYER_SIGNATURE) ///< Locate ESL_LAYER from service binding
|
---|
1113 |
|
---|
1114 | //------------------------------------------------------------------------------
|
---|
1115 | // Data
|
---|
1116 | //------------------------------------------------------------------------------
|
---|
1117 |
|
---|
1118 | extern ESL_LAYER mEslLayer;
|
---|
1119 |
|
---|
1120 | extern CONST ESL_PROTOCOL_API cEslIp4Api;
|
---|
1121 | extern CONST ESL_PROTOCOL_API cEslIp6Api;
|
---|
1122 | extern CONST ESL_PROTOCOL_API cEslTcp4Api;
|
---|
1123 | extern CONST ESL_PROTOCOL_API cEslTcp6Api;
|
---|
1124 | extern CONST ESL_PROTOCOL_API cEslUdp4Api;
|
---|
1125 | extern CONST ESL_PROTOCOL_API cEslUdp6Api;
|
---|
1126 |
|
---|
1127 | extern CONST EFI_SERVICE_BINDING_PROTOCOL mEfiServiceBinding;
|
---|
1128 |
|
---|
1129 | //------------------------------------------------------------------------------
|
---|
1130 | // Socket Support Routines
|
---|
1131 | //------------------------------------------------------------------------------
|
---|
1132 |
|
---|
1133 | /**
|
---|
1134 | Allocate and initialize a ESL_SOCKET structure.
|
---|
1135 |
|
---|
1136 | This support function allocates an ::ESL_SOCKET structure
|
---|
1137 | and installs a protocol on ChildHandle. If pChildHandle is a
|
---|
1138 | pointer to NULL, then a new handle is created and returned in
|
---|
1139 | pChildHandle. If pChildHandle is not a pointer to NULL, then
|
---|
1140 | the protocol installs on the existing pChildHandle.
|
---|
1141 |
|
---|
1142 | @param [in, out] pChildHandle Pointer to the handle of the child to create.
|
---|
1143 | If it is NULL, then a new handle is created.
|
---|
1144 | If it is a pointer to an existing UEFI handle,
|
---|
1145 | then the protocol is added to the existing UEFI
|
---|
1146 | handle.
|
---|
1147 | @param [in] DebugFlags Flags for debug messages
|
---|
1148 | @param [in, out] ppSocket The buffer to receive an ::ESL_SOCKET structure address.
|
---|
1149 |
|
---|
1150 | @retval EFI_SUCCESS The protocol was added to ChildHandle.
|
---|
1151 | @retval EFI_INVALID_PARAMETER ChildHandle is NULL.
|
---|
1152 | @retval EFI_OUT_OF_RESOURCES There are not enough resources available to create
|
---|
1153 | the child
|
---|
1154 | @retval other The child handle was not created
|
---|
1155 |
|
---|
1156 | **/
|
---|
1157 | EFI_STATUS
|
---|
1158 | EFIAPI
|
---|
1159 | EslSocketAllocate (
|
---|
1160 | IN OUT EFI_HANDLE * pChildHandle,
|
---|
1161 | IN UINTN DebugFlags,
|
---|
1162 | IN OUT ESL_SOCKET ** ppSocket
|
---|
1163 | );
|
---|
1164 |
|
---|
1165 | /**
|
---|
1166 | Test the bind configuration.
|
---|
1167 |
|
---|
1168 | @param [in] pPort Address of the ::ESL_PORT structure.
|
---|
1169 | @param [in] ErrnoValue errno value if test fails
|
---|
1170 |
|
---|
1171 | @retval EFI_SUCCESS The connection was successfully established.
|
---|
1172 | @retval Others The connection attempt failed.
|
---|
1173 |
|
---|
1174 | **/
|
---|
1175 | EFI_STATUS
|
---|
1176 | EslSocketBindTest (
|
---|
1177 | IN ESL_PORT * pPort,
|
---|
1178 | IN int ErrnoValue
|
---|
1179 | );
|
---|
1180 |
|
---|
1181 | /**
|
---|
1182 | Copy a fragmented buffer into a destination buffer.
|
---|
1183 |
|
---|
1184 | This support routine copies a fragmented buffer to the caller specified buffer.
|
---|
1185 |
|
---|
1186 | This routine is called by ::EslIp4Receive and ::EslUdp4Receive.
|
---|
1187 |
|
---|
1188 | @param [in] FragmentCount Number of fragments in the table
|
---|
1189 |
|
---|
1190 | @param [in] pFragmentTable Address of an EFI_IP4_FRAGMENT_DATA structure
|
---|
1191 |
|
---|
1192 | @param [in] BufferLength Length of the the buffer
|
---|
1193 |
|
---|
1194 | @param [in] pBuffer Address of a buffer to receive the data.
|
---|
1195 |
|
---|
1196 | @param [in] pDataLength Number of received data bytes in the buffer.
|
---|
1197 |
|
---|
1198 | @return Returns the address of the next free byte in the buffer.
|
---|
1199 |
|
---|
1200 | **/
|
---|
1201 | UINT8 *
|
---|
1202 | EslSocketCopyFragmentedBuffer (
|
---|
1203 | IN UINT32 FragmentCount,
|
---|
1204 | IN EFI_IP4_FRAGMENT_DATA * pFragmentTable,
|
---|
1205 | IN size_t BufferLength,
|
---|
1206 | IN UINT8 * pBuffer,
|
---|
1207 | OUT size_t * pDataLength
|
---|
1208 | );
|
---|
1209 |
|
---|
1210 | /**
|
---|
1211 | Free the socket.
|
---|
1212 |
|
---|
1213 | This routine frees the socket structure and handle resources.
|
---|
1214 |
|
---|
1215 | The ::close routine calls EslServiceFreeProtocol which then calls
|
---|
1216 | this routine to free the socket context structure and close the
|
---|
1217 | handle.
|
---|
1218 |
|
---|
1219 | @param [in] pSocketProtocol Address of an ::EFI_SOCKET_PROTOCOL structure.
|
---|
1220 |
|
---|
1221 | @param [out] pErrno Address to receive the errno value upon completion.
|
---|
1222 |
|
---|
1223 | @retval EFI_SUCCESS The socket resources were returned successfully.
|
---|
1224 |
|
---|
1225 | **/
|
---|
1226 | EFI_STATUS
|
---|
1227 | EslSocketFree (
|
---|
1228 | IN EFI_SOCKET_PROTOCOL * pSocketProtocol,
|
---|
1229 | IN int * pErrno
|
---|
1230 | );
|
---|
1231 |
|
---|
1232 | /**
|
---|
1233 | Free the ESL_IO_MGMT event and structure
|
---|
1234 |
|
---|
1235 | This support routine walks the free list to close the event in
|
---|
1236 | the ESL_IO_MGMT structure and remove the structure from the free
|
---|
1237 | list.
|
---|
1238 |
|
---|
1239 | See the \ref TransmitEngine section.
|
---|
1240 |
|
---|
1241 | @param [in] pPort Address of an ::ESL_PORT structure
|
---|
1242 | @param [in] ppFreeQueue Address of the free queue head
|
---|
1243 | @param [in] DebugFlags Flags for debug messages
|
---|
1244 | @param [in] pEventName Zero terminated string containing the event name
|
---|
1245 |
|
---|
1246 | @retval EFI_SUCCESS - The structures were properly initialized
|
---|
1247 |
|
---|
1248 | **/
|
---|
1249 | EFI_STATUS
|
---|
1250 | EslSocketIoFree (
|
---|
1251 | IN ESL_PORT * pPort,
|
---|
1252 | IN ESL_IO_MGMT ** ppFreeQueue,
|
---|
1253 | IN UINTN DebugFlags,
|
---|
1254 | IN CHAR8 * pEventName
|
---|
1255 | );
|
---|
1256 |
|
---|
1257 | /**
|
---|
1258 | Initialize the ESL_IO_MGMT structures
|
---|
1259 |
|
---|
1260 | This support routine initializes the ESL_IO_MGMT structure and
|
---|
1261 | places them on to a free list.
|
---|
1262 |
|
---|
1263 | This routine is called by the PortAllocate routines to prepare
|
---|
1264 | the transmit engines. See the \ref TransmitEngine section.
|
---|
1265 |
|
---|
1266 | @param [in] pPort Address of an ::ESL_PORT structure
|
---|
1267 | @param [in, out] ppIo Address containing the first structure address. Upon
|
---|
1268 | return this buffer contains the next structure address.
|
---|
1269 | @param [in] TokenCount Number of structures to initialize
|
---|
1270 | @param [in] ppFreeQueue Address of the free queue head
|
---|
1271 | @param [in] DebugFlags Flags for debug messages
|
---|
1272 | @param [in] pEventName Zero terminated string containing the event name
|
---|
1273 | @param [in] pfnCompletion Completion routine address
|
---|
1274 |
|
---|
1275 | @retval EFI_SUCCESS - The structures were properly initialized
|
---|
1276 |
|
---|
1277 | **/
|
---|
1278 | EFI_STATUS
|
---|
1279 | EslSocketIoInit (
|
---|
1280 | IN ESL_PORT * pPort,
|
---|
1281 | IN ESL_IO_MGMT ** ppIo,
|
---|
1282 | IN UINTN TokenCount,
|
---|
1283 | IN ESL_IO_MGMT ** ppFreeQueue,
|
---|
1284 | IN UINTN DebugFlags,
|
---|
1285 | IN CHAR8 * pEventName,
|
---|
1286 | IN PFN_API_IO_COMPLETE pfnCompletion
|
---|
1287 | );
|
---|
1288 |
|
---|
1289 | /**
|
---|
1290 | Determine if the socket is configured
|
---|
1291 |
|
---|
1292 | This support routine is called to determine if the socket if the
|
---|
1293 | configuration call was made to the network layer. The following
|
---|
1294 | routines call this routine to verify that they may be successful
|
---|
1295 | in their operations:
|
---|
1296 | <ul>
|
---|
1297 | <li>::EslSocketGetLocalAddress</li>
|
---|
1298 | <li>::EslSocketGetPeerAddress</li>
|
---|
1299 | <li>::EslSocketPoll</li>
|
---|
1300 | <li>::EslSocketReceive</li>
|
---|
1301 | <li>::EslSocketTransmit</li>
|
---|
1302 | </ul>
|
---|
1303 |
|
---|
1304 | @param [in] pSocket Address of an ::ESL_SOCKET structure
|
---|
1305 |
|
---|
1306 | @retval EFI_SUCCESS - The socket is configured
|
---|
1307 |
|
---|
1308 | **/
|
---|
1309 | EFI_STATUS
|
---|
1310 | EslSocketIsConfigured (
|
---|
1311 | IN ESL_SOCKET * pSocket
|
---|
1312 | );
|
---|
1313 |
|
---|
1314 | /**
|
---|
1315 | Allocate a packet for a receive or transmit operation
|
---|
1316 |
|
---|
1317 | This support routine is called by ::EslSocketRxStart and the
|
---|
1318 | network specific TxBuffer routines to get buffer space for the
|
---|
1319 | next operation.
|
---|
1320 |
|
---|
1321 | @param [in] ppPacket Address to receive the ::ESL_PACKET structure
|
---|
1322 | @param [in] LengthInBytes Length of the packet structure
|
---|
1323 | @param [in] ZeroBytes Length of packet to zero
|
---|
1324 | @param [in] DebugFlags Flags for debug messages
|
---|
1325 |
|
---|
1326 | @retval EFI_SUCCESS - The packet was allocated successfully
|
---|
1327 |
|
---|
1328 | **/
|
---|
1329 | EFI_STATUS
|
---|
1330 | EslSocketPacketAllocate (
|
---|
1331 | IN ESL_PACKET ** ppPacket,
|
---|
1332 | IN size_t LengthInBytes,
|
---|
1333 | IN size_t ZeroBytes,
|
---|
1334 | IN UINTN DebugFlags
|
---|
1335 | );
|
---|
1336 |
|
---|
1337 | /**
|
---|
1338 | Free a packet used for receive or transmit operation
|
---|
1339 |
|
---|
1340 | This support routine is called by the network specific Close
|
---|
1341 | and TxComplete routines and during error cases in RxComplete
|
---|
1342 | and TxBuffer. Note that the network layers typically place
|
---|
1343 | receive packets on the ESL_SOCKET::pRxFree list for reuse.
|
---|
1344 |
|
---|
1345 | @param [in] pPacket Address of an ::ESL_PACKET structure
|
---|
1346 | @param [in] DebugFlags Flags for debug messages
|
---|
1347 |
|
---|
1348 | @retval EFI_SUCCESS - The packet was allocated successfully
|
---|
1349 |
|
---|
1350 | **/
|
---|
1351 | EFI_STATUS
|
---|
1352 | EslSocketPacketFree (
|
---|
1353 | IN ESL_PACKET * pPacket,
|
---|
1354 | IN UINTN DebugFlags
|
---|
1355 | );
|
---|
1356 |
|
---|
1357 | /**
|
---|
1358 | Allocate and initialize a ESL_PORT structure.
|
---|
1359 |
|
---|
1360 | This routine initializes an ::ESL_PORT structure for use by
|
---|
1361 | the socket. This routine calls a routine via
|
---|
1362 | ESL_PROTOCOL_API::pfnPortAllocate to initialize the network
|
---|
1363 | specific resources. The resources are released later by the
|
---|
1364 | \ref PortCloseStateMachine.
|
---|
1365 |
|
---|
1366 | This support routine is called by ::EslSocketBind and
|
---|
1367 | ::EslTcp4ListenComplete to connect the socket with the
|
---|
1368 | underlying network adapter to the socket.
|
---|
1369 |
|
---|
1370 | @param [in] pSocket Address of an ::ESL_SOCKET structure.
|
---|
1371 | @param [in] pService Address of an ::ESL_SERVICE structure.
|
---|
1372 | @param [in] ChildHandle TCP4 child handle
|
---|
1373 | @param [in] pSockAddr Address of a sockaddr structure that contains the
|
---|
1374 | connection point on the local machine. An IPv4 address
|
---|
1375 | of INADDR_ANY specifies that the connection is made to
|
---|
1376 | all of the network stacks on the platform. Specifying a
|
---|
1377 | specific IPv4 address restricts the connection to the
|
---|
1378 | network stack supporting that address. Specifying zero
|
---|
1379 | for the port causes the network layer to assign a port
|
---|
1380 | number from the dynamic range. Specifying a specific
|
---|
1381 | port number causes the network layer to use that port.
|
---|
1382 | @param [in] bBindTest TRUE if EslSocketBindTest should be called
|
---|
1383 | @param [in] DebugFlags Flags for debug messages
|
---|
1384 | @param [out] ppPort Buffer to receive new ::ESL_PORT structure address
|
---|
1385 |
|
---|
1386 | @retval EFI_SUCCESS - Socket successfully created
|
---|
1387 |
|
---|
1388 | **/
|
---|
1389 | EFI_STATUS
|
---|
1390 | EslSocketPortAllocate (
|
---|
1391 | IN ESL_SOCKET * pSocket,
|
---|
1392 | IN ESL_SERVICE * pService,
|
---|
1393 | IN EFI_HANDLE ChildHandle,
|
---|
1394 | IN CONST struct sockaddr * pSockAddr,
|
---|
1395 | IN BOOLEAN bBindTest,
|
---|
1396 | IN UINTN DebugFlags,
|
---|
1397 | OUT ESL_PORT ** ppPort
|
---|
1398 | );
|
---|
1399 |
|
---|
1400 | /**
|
---|
1401 | Close a port.
|
---|
1402 |
|
---|
1403 | This routine releases the resources allocated by ::EslSocketPortAllocate.
|
---|
1404 | This routine calls ESL_PROTOCOL_API::pfnPortClose to release the network
|
---|
1405 | specific resources.
|
---|
1406 |
|
---|
1407 | This routine is called by:
|
---|
1408 | <ul>
|
---|
1409 | <li>::EslIp4PortAllocate - Port initialization failure</li>
|
---|
1410 | <li>::EslSocketPortCloseRxDone - Last step of close processing</li>
|
---|
1411 | <li>::EslTcp4ConnectComplete - Connection failure and reducint the port list to a single port</li>
|
---|
1412 | <li>::EslTcp4PortAllocate - Port initialization failure</li>
|
---|
1413 | <li>::EslUdp4PortAllocate - Port initialization failure</li>
|
---|
1414 | </ul>
|
---|
1415 | See the \ref PortCloseStateMachine section.
|
---|
1416 |
|
---|
1417 | @param [in] pPort Address of an ::ESL_PORT structure.
|
---|
1418 |
|
---|
1419 | @retval EFI_SUCCESS The port is closed
|
---|
1420 | @retval other Port close error
|
---|
1421 |
|
---|
1422 | **/
|
---|
1423 | EFI_STATUS
|
---|
1424 | EslSocketPortClose (
|
---|
1425 | IN ESL_PORT * pPort
|
---|
1426 | );
|
---|
1427 |
|
---|
1428 | /**
|
---|
1429 | Process the port close completion event
|
---|
1430 |
|
---|
1431 | This routine attempts to complete the port close operation.
|
---|
1432 |
|
---|
1433 | This routine is called by the TCP layer upon completion of
|
---|
1434 | the close operation.
|
---|
1435 | See the \ref PortCloseStateMachine section.
|
---|
1436 |
|
---|
1437 | @param [in] Event The close completion event
|
---|
1438 |
|
---|
1439 | @param [in] pPort Address of an ::ESL_PORT structure.
|
---|
1440 |
|
---|
1441 | **/
|
---|
1442 | VOID
|
---|
1443 | EslSocketPortCloseComplete (
|
---|
1444 | IN EFI_EVENT Event,
|
---|
1445 | IN ESL_PORT * pPort
|
---|
1446 | );
|
---|
1447 |
|
---|
1448 | /**
|
---|
1449 | Port close state 3
|
---|
1450 |
|
---|
1451 | This routine determines the state of the receive operations and
|
---|
1452 | continues the close operation after the pending receive operations
|
---|
1453 | are cancelled.
|
---|
1454 |
|
---|
1455 | This routine is called by
|
---|
1456 | <ul>
|
---|
1457 | <li>::EslIp4RxComplete</li>
|
---|
1458 | <li>::EslSocketPortCloseComplete</li>
|
---|
1459 | <li>::EslSocketPortCloseTxDone</li>
|
---|
1460 | <li>::EslUdp4RxComplete</li>
|
---|
1461 | </ul>
|
---|
1462 | to determine the state of the receive operations.
|
---|
1463 | See the \ref PortCloseStateMachine section.
|
---|
1464 |
|
---|
1465 | @param [in] pPort Address of an ::ESL_PORT structure.
|
---|
1466 |
|
---|
1467 | @retval EFI_SUCCESS The port is closed
|
---|
1468 | @retval EFI_NOT_READY The port is still closing
|
---|
1469 | @retval EFI_ALREADY_STARTED Error, the port is in the wrong state,
|
---|
1470 | most likely the routine was called already.
|
---|
1471 |
|
---|
1472 | **/
|
---|
1473 | EFI_STATUS
|
---|
1474 | EslSocketPortCloseRxDone (
|
---|
1475 | IN ESL_PORT * pPort
|
---|
1476 | );
|
---|
1477 |
|
---|
1478 | /**
|
---|
1479 | Start the close operation on a port, state 1.
|
---|
1480 |
|
---|
1481 | This routine marks the port as closed and initiates the \ref
|
---|
1482 | PortCloseStateMachine. The first step is to allow the \ref
|
---|
1483 | TransmitEngine to run down.
|
---|
1484 |
|
---|
1485 | This routine is called by ::EslSocketCloseStart to initiate the socket
|
---|
1486 | network specific close operation on the socket.
|
---|
1487 |
|
---|
1488 | @param [in] pPort Address of an ::ESL_PORT structure.
|
---|
1489 | @param [in] bCloseNow Set TRUE to abort active transfers
|
---|
1490 | @param [in] DebugFlags Flags for debug messages
|
---|
1491 |
|
---|
1492 | @retval EFI_SUCCESS The port is closed, not normally returned
|
---|
1493 | @retval EFI_NOT_READY The port has started the closing process
|
---|
1494 | @retval EFI_ALREADY_STARTED Error, the port is in the wrong state,
|
---|
1495 | most likely the routine was called already.
|
---|
1496 |
|
---|
1497 | **/
|
---|
1498 | EFI_STATUS
|
---|
1499 | EslSocketPortCloseStart (
|
---|
1500 | IN ESL_PORT * pPort,
|
---|
1501 | IN BOOLEAN bCloseNow,
|
---|
1502 | IN UINTN DebugFlags
|
---|
1503 | );
|
---|
1504 |
|
---|
1505 | /**
|
---|
1506 | Port close state 2
|
---|
1507 |
|
---|
1508 | This routine determines the state of the transmit engine and
|
---|
1509 | continue the close operation after the transmission is complete.
|
---|
1510 | The next step is to stop the \ref ReceiveEngine.
|
---|
1511 | See the \ref PortCloseStateMachine section.
|
---|
1512 |
|
---|
1513 | This routine is called by ::EslSocketPortCloseStart to determine
|
---|
1514 | if the transmission is complete.
|
---|
1515 |
|
---|
1516 | @param [in] pPort Address of an ::ESL_PORT structure.
|
---|
1517 |
|
---|
1518 | @retval EFI_SUCCESS The port is closed, not normally returned
|
---|
1519 | @retval EFI_NOT_READY The port is still closing
|
---|
1520 | @retval EFI_ALREADY_STARTED Error, the port is in the wrong state,
|
---|
1521 | most likely the routine was called already.
|
---|
1522 |
|
---|
1523 | **/
|
---|
1524 | EFI_STATUS
|
---|
1525 | EslSocketPortCloseTxDone (
|
---|
1526 | IN ESL_PORT * pPort
|
---|
1527 | );
|
---|
1528 |
|
---|
1529 | /**
|
---|
1530 | Cancel the receive operations
|
---|
1531 |
|
---|
1532 | This routine cancels a pending receive operation.
|
---|
1533 | See the \ref ReceiveEngine section.
|
---|
1534 |
|
---|
1535 | This routine is called by ::EslSocketShutdown when the socket
|
---|
1536 | layer is being shutdown.
|
---|
1537 |
|
---|
1538 | @param [in] pPort Address of an ::ESL_PORT structure
|
---|
1539 | @param [in] pIo Address of an ::ESL_IO_MGMT structure
|
---|
1540 |
|
---|
1541 | **/
|
---|
1542 | VOID
|
---|
1543 | EslSocketRxCancel (
|
---|
1544 | IN ESL_PORT * pPort,
|
---|
1545 | IN ESL_IO_MGMT * pIo
|
---|
1546 | );
|
---|
1547 |
|
---|
1548 | /**
|
---|
1549 | Process the receive completion
|
---|
1550 |
|
---|
1551 | This routine queues the data in FIFO order in either the urgent
|
---|
1552 | or normal data queues depending upon the type of data received.
|
---|
1553 | See the \ref ReceiveEngine section.
|
---|
1554 |
|
---|
1555 | This routine is called when some data is received by:
|
---|
1556 | <ul>
|
---|
1557 | <li>::EslIp4RxComplete</li>
|
---|
1558 | <li>::EslTcp4RxComplete</li>
|
---|
1559 | <li>::EslUdp4RxComplete</li>
|
---|
1560 | </ul>
|
---|
1561 |
|
---|
1562 | @param [in] pIo Address of an ::ESL_IO_MGMT structure
|
---|
1563 | @param [in] Status Receive status
|
---|
1564 | @param [in] LengthInBytes Length of the receive data
|
---|
1565 | @param [in] bUrgent TRUE if urgent data is received and FALSE
|
---|
1566 | for normal data.
|
---|
1567 |
|
---|
1568 | **/
|
---|
1569 | VOID
|
---|
1570 | EslSocketRxComplete (
|
---|
1571 | IN ESL_IO_MGMT * pIo,
|
---|
1572 | IN EFI_STATUS Status,
|
---|
1573 | IN UINTN LengthInBytes,
|
---|
1574 | IN BOOLEAN bUrgent
|
---|
1575 | );
|
---|
1576 |
|
---|
1577 | /**
|
---|
1578 | Poll a socket for pending receive activity.
|
---|
1579 |
|
---|
1580 | This routine is called at elivated TPL and extends the idle
|
---|
1581 | loop which polls a socket down into the LAN driver layer to
|
---|
1582 | determine if there is any receive activity.
|
---|
1583 |
|
---|
1584 | The ::EslSocketPoll, ::EslSocketReceive and ::EslSocketTransmit
|
---|
1585 | routines call this routine when there is nothing to do.
|
---|
1586 |
|
---|
1587 | @param [in] pSocket Address of an ::EFI_SOCKET structure.
|
---|
1588 |
|
---|
1589 | **/
|
---|
1590 | VOID
|
---|
1591 | EslSocketRxPoll (
|
---|
1592 | IN ESL_SOCKET * pSocket
|
---|
1593 | );
|
---|
1594 |
|
---|
1595 | /**
|
---|
1596 | Start a receive operation
|
---|
1597 |
|
---|
1598 | This routine posts a receive buffer to the network adapter.
|
---|
1599 | See the \ref ReceiveEngine section.
|
---|
1600 |
|
---|
1601 | This support routine is called by:
|
---|
1602 | <ul>
|
---|
1603 | <li>::EslIp4Receive to restart the receive engine to release flow control.</li>
|
---|
1604 | <li>::EslIp4RxComplete to continue the operation of the receive engine if flow control is not being applied.</li>
|
---|
1605 | <li>::EslIp4SocketIsConfigured to start the recevie engine for the new socket.</li>
|
---|
1606 | <li>::EslTcp4ListenComplete to start the recevie engine for the new socket.</li>
|
---|
1607 | <li>::EslTcp4Receive to restart the receive engine to release flow control.</li>
|
---|
1608 | <li>::EslTcp4RxComplete to continue the operation of the receive engine if flow control is not being applied.</li>
|
---|
1609 | <li>::EslUdp4Receive to restart the receive engine to release flow control.</li>
|
---|
1610 | <li>::EslUdp4RxComplete to continue the operation of the receive engine if flow control is not being applied.</li>
|
---|
1611 | <li>::EslUdp4SocketIsConfigured to start the recevie engine for the new socket.</li>
|
---|
1612 | </ul>
|
---|
1613 |
|
---|
1614 | @param [in] pPort Address of an ::ESL_PORT structure.
|
---|
1615 |
|
---|
1616 | **/
|
---|
1617 | VOID
|
---|
1618 | EslSocketRxStart (
|
---|
1619 | IN ESL_PORT * pPort
|
---|
1620 | );
|
---|
1621 |
|
---|
1622 | /**
|
---|
1623 | Complete the transmit operation
|
---|
1624 |
|
---|
1625 | This support routine handles the transmit completion processing for
|
---|
1626 | the various network layers. It frees the ::ESL_IO_MGMT structure
|
---|
1627 | and and frees packet resources by calling ::EslSocketPacketFree.
|
---|
1628 | Transmit errors are logged in ESL_SOCKET::TxError.
|
---|
1629 | See the \ref TransmitEngine section.
|
---|
1630 |
|
---|
1631 | This routine is called by:
|
---|
1632 | <ul>
|
---|
1633 | <li>::EslIp4TxComplete</li>
|
---|
1634 | <li>::EslTcp4TxComplete</li>
|
---|
1635 | <li>::EslTcp4TxOobComplete</li>
|
---|
1636 | <li>::EslUdp4TxComplete</li>
|
---|
1637 | </ul>
|
---|
1638 |
|
---|
1639 | @param [in] pIo Address of an ::ESL_IO_MGMT structure
|
---|
1640 | @param [in] LengthInBytes Length of the data in bytes
|
---|
1641 | @param [in] Status Transmit operation status
|
---|
1642 | @param [in] pQueueType Zero terminated string describing queue type
|
---|
1643 | @param [in] ppQueueHead Transmit queue head address
|
---|
1644 | @param [in] ppQueueTail Transmit queue tail address
|
---|
1645 | @param [in] ppActive Active transmit queue address
|
---|
1646 | @param [in] ppFree Free transmit queue address
|
---|
1647 |
|
---|
1648 | **/
|
---|
1649 | VOID
|
---|
1650 | EslSocketTxComplete (
|
---|
1651 | IN ESL_IO_MGMT * pIo,
|
---|
1652 | IN UINT32 LengthInBytes,
|
---|
1653 | IN EFI_STATUS Status,
|
---|
1654 | IN CONST CHAR8 * pQueueType,
|
---|
1655 | IN ESL_PACKET ** ppQueueHead,
|
---|
1656 | IN ESL_PACKET ** ppQueueTail,
|
---|
1657 | IN ESL_IO_MGMT ** ppActive,
|
---|
1658 | IN ESL_IO_MGMT ** ppFree
|
---|
1659 | );
|
---|
1660 |
|
---|
1661 | /**
|
---|
1662 | Transmit data using a network connection.
|
---|
1663 |
|
---|
1664 | This support routine starts a transmit operation on the
|
---|
1665 | underlying network layer.
|
---|
1666 |
|
---|
1667 | The network specific code calls this routine to start a
|
---|
1668 | transmit operation. See the \ref TransmitEngine section.
|
---|
1669 |
|
---|
1670 | @param [in] pPort Address of an ::ESL_PORT structure
|
---|
1671 | @param [in] ppQueueHead Transmit queue head address
|
---|
1672 | @param [in] ppQueueTail Transmit queue tail address
|
---|
1673 | @param [in] ppActive Active transmit queue address
|
---|
1674 | @param [in] ppFree Free transmit queue address
|
---|
1675 |
|
---|
1676 | **/
|
---|
1677 | VOID
|
---|
1678 | EslSocketTxStart (
|
---|
1679 | IN ESL_PORT * pPort,
|
---|
1680 | IN ESL_PACKET ** ppQueueHead,
|
---|
1681 | IN ESL_PACKET ** ppQueueTail,
|
---|
1682 | IN ESL_IO_MGMT ** ppActive,
|
---|
1683 | IN ESL_IO_MGMT ** ppFree
|
---|
1684 | );
|
---|
1685 |
|
---|
1686 | //------------------------------------------------------------------------------
|
---|
1687 |
|
---|
1688 | #endif // _SOCKET_H_
|
---|