1/* $FreeBSD: stable/11/stand/efi/include/efitcp.h 346482 2019-04-21 04:26:02Z kevans $ */
2#ifndef _EFI_TCP_H
3#define _EFI_TCP_H
4
5/*++
6Copyright (c) 2013  Intel Corporation
7
8--*/
9
10#define EFI_TCP4_SERVICE_BINDING_PROTOCOL \
11    { 0x00720665, 0x67eb, 0x4a99, {0xba, 0xf7, 0xd3, 0xc3, 0x3a, 0x1c,0x7c, 0xc9}}
12
13#define EFI_TCP4_PROTOCOL \
14    { 0x65530bc7, 0xa359, 0x410f, {0xb0, 0x10, 0x5a, 0xad, 0xc7, 0xec, 0x2b, 0x62}}
15
16#define EFI_TCP6_SERVICE_BINDING_PROTOCOL \
17    { 0xec20eb79, 0x6c1a, 0x4664, {0x9a, 0xd, 0xd2, 0xe4, 0xcc, 0x16, 0xd6, 0x64}}
18
19#define EFI_TCP6_PROTOCOL \
20    { 0x46e44855, 0xbd60, 0x4ab7, {0xab, 0xd, 0xa6, 0x79, 0xb9, 0x44, 0x7d, 0x77}}
21
22INTERFACE_DECL(_EFI_TCP4);
23INTERFACE_DECL(_EFI_TCP6);
24
25typedef struct {
26    BOOLEAN            UseDefaultAddress;
27    EFI_IPv4_ADDRESS   StationAddress;
28    EFI_IPv4_ADDRESS   SubnetMask;
29    UINT16             StationPort;
30    EFI_IPv4_ADDRESS   RemoteAddress;
31    UINT16             RemotePort;
32    BOOLEAN            ActiveFlag;
33} EFI_TCP4_ACCESS_POINT;
34
35typedef struct {
36    UINT32             ReceiveBufferSize;
37    UINT32             SendBufferSize;
38    UINT32             MaxSynBackLog;
39    UINT32             ConnectionTimeout;
40    UINT32             DataRetries;
41    UINT32             FinTimeout;
42    UINT32             TimeWaitTimeout;
43    UINT32             KeepAliveProbes;
44    UINT32             KeepAliveTime;
45    UINT32             KeepAliveInterval;
46    BOOLEAN            EnableNagle;
47    BOOLEAN            EnableTimeStamp;
48    BOOLEAN            EnableWindowScaling;
49    BOOLEAN            EnableSelectiveAck;
50    BOOLEAN            EnablePAthMtuDiscovery;
51} EFI_TCP4_OPTION;
52
53typedef struct {
54    // Receiving Filters
55    // I/O parameters
56    UINT8                 TypeOfService;
57    UINT8                 TimeToLive;
58
59    // Access Point
60    EFI_TCP4_ACCESS_POINT AccessPoint;
61
62    // TCP Control Options
63    EFI_TCP4_OPTION       *ControlOption;
64} EFI_TCP4_CONFIG_DATA;
65
66typedef enum {
67    Tcp4StateClosed      = 0,
68    Tcp4StateListen      = 1,
69    Tcp4StateSynSent     = 2,
70    Tcp4StateSynReceived = 3,
71    Tcp4StateEstablished = 4,
72    Tcp4StateFinWait1    = 5,
73    Tcp4StateFinWait2    = 6,
74    Tcp4StateClosing     = 7,
75    Tcp4StateTimeWait    = 8,
76    Tcp4StateCloseWait   = 9,
77    Tcp4StateLastAck     = 10
78} EFI_TCP4_CONNECTION_STATE;
79
80typedef
81EFI_STATUS
82(EFIAPI *EFI_TCP4_GET_MODE_DATA) (
83    IN struct _EFI_TCP4                 *This,
84    OUT EFI_TCP4_CONNECTION_STATE       *Tcp4State      OPTIONAL,
85    OUT EFI_TCP4_CONFIG_DATA            *Tcp4ConfigData OPTIONAL,
86    OUT EFI_IP4_MODE_DATA               *Ip4ModeData    OPTIONAL,
87    OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData  OPTIONAL,
88    OUT EFI_SIMPLE_NETWORK_MODE         *SnpModeData    OPTIONAL
89    );
90
91typedef
92EFI_STATUS
93(EFIAPI *EFI_TCP4_CONFIGURE) (
94    IN struct _EFI_TCP4     *This,
95    IN EFI_TCP4_CONFIG_DATA *TcpConfigData OPTIONAL
96    );
97
98typedef
99EFI_STATUS
100(EFIAPI *EFI_TCP4_ROUTES) (
101    IN struct _EFI_TCP4 *This,
102    IN BOOLEAN          DeleteRoute,
103    IN EFI_IPv4_ADDRESS *SubnetAddress,
104    IN EFI_IPv4_ADDRESS *SubnetMask,
105    IN EFI_IPv4_ADDRESS *GatewayAddress
106);
107
108typedef struct {
109    EFI_EVENT  Event;
110    EFI_STATUS Status;
111} EFI_TCP4_COMPLETION_TOKEN;
112
113typedef struct {
114    EFI_TCP4_COMPLETION_TOKEN CompletionToken;
115} EFI_TCP4_CONNECTION_TOKEN;
116
117typedef
118EFI_STATUS
119(EFIAPI *EFI_TCP4_CONNECT) (
120    IN struct _EFI_TCP4          *This,
121    IN EFI_TCP4_CONNECTION_TOKEN *ConnectionToken
122    );
123
124typedef struct {
125    EFI_TCP4_COMPLETION_TOKEN CompletionToken;
126    EFI_HANDLE                NewChildHandle;
127} EFI_TCP4_LISTEN_TOKEN;
128
129typedef
130EFI_STATUS
131(EFIAPI *EFI_TCP4_ACCEPT) (
132    IN struct _EFI_TCP4      *This,
133    IN EFI_TCP4_LISTEN_TOKEN *ListenToken
134    );
135
136#define EFI_CONNECTION_FIN     EFIERR(104)
137#define EFI_CONNECTION_RESET   EFIERR(105)
138#define EFI_CONNECTION_REFUSED EFIERR(106)
139
140typedef struct {
141    UINT32 FragmentLength;
142    VOID   *FragmentBuffer;
143} EFI_TCP4_FRAGMENT_DATA;
144
145typedef struct {
146    BOOLEAN                UrgentFlag;
147    UINT32                 DataLength;
148    UINT32                 FragmentCount;
149    EFI_TCP4_FRAGMENT_DATA FragmentTable[1];
150} EFI_TCP4_RECEIVE_DATA;
151
152typedef struct {
153    BOOLEAN                Push;
154    BOOLEAN                Urgent;
155    UINT32                 DataLength;
156    UINT32                 FragmentCount;
157    EFI_TCP4_FRAGMENT_DATA FragmentTable[1];
158} EFI_TCP4_TRANSMIT_DATA;
159
160typedef struct {
161    EFI_TCP4_COMPLETION_TOKEN  CompletionToken;
162    union {
163	EFI_TCP4_RECEIVE_DATA  *RxData;
164	EFI_TCP4_TRANSMIT_DATA *TxData;
165    }                          Packet;
166} EFI_TCP4_IO_TOKEN;
167
168typedef
169EFI_STATUS
170(EFIAPI *EFI_TCP4_TRANSMIT) (
171    IN struct _EFI_TCP4  *This,
172    IN EFI_TCP4_IO_TOKEN *Token
173    );
174
175typedef
176EFI_STATUS
177(EFIAPI *EFI_TCP4_RECEIVE) (
178    IN struct _EFI_TCP4  *This,
179    IN EFI_TCP4_IO_TOKEN *Token
180    );
181
182typedef struct {
183    EFI_TCP4_COMPLETION_TOKEN CompletionToken;
184    BOOLEAN                   AbortOnClose;
185} EFI_TCP4_CLOSE_TOKEN;
186
187typedef
188EFI_STATUS
189(EFIAPI *EFI_TCP4_CLOSE)(
190    IN struct _EFI_TCP4     *This,
191    IN EFI_TCP4_CLOSE_TOKEN *CloseToken
192    );
193
194typedef
195EFI_STATUS
196(EFIAPI *EFI_TCP4_CANCEL)(
197    IN struct _EFI_TCP4 *This,
198    IN EFI_TCP4_COMPLETION_TOKEN *Token OPTIONAL
199);
200
201typedef
202EFI_STATUS
203(EFIAPI *EFI_TCP4_POLL) (
204    IN struct _EFI_TCP4 *This
205    );
206
207typedef struct _EFI_TCP4 {
208    EFI_TCP4_GET_MODE_DATA GetModeData;
209    EFI_TCP4_CONFIGURE     Configure;
210    EFI_TCP4_ROUTES        Routes;
211    EFI_TCP4_CONNECT       Connect;
212    EFI_TCP4_ACCEPT        Accept;
213    EFI_TCP4_TRANSMIT      Transmit;
214    EFI_TCP4_RECEIVE       Receive;
215    EFI_TCP4_CLOSE         Close;
216    EFI_TCP4_CANCEL        Cancel;
217    EFI_TCP4_POLL          Poll;
218} EFI_TCP4;
219
220typedef enum {
221    Tcp6StateClosed      = 0,
222    Tcp6StateListen      = 1,
223    Tcp6StateSynSent     = 2,
224    Tcp6StateSynReceived = 3,
225    Tcp6StateEstablished = 4,
226    Tcp6StateFinWait1    = 5,
227    Tcp6StateFinWait2    = 6,
228    Tcp6StateClosing     = 7,
229    Tcp6StateTimeWait    = 8,
230    Tcp6StateCloseWait   = 9,
231    Tcp6StateLastAck     = 10
232} EFI_TCP6_CONNECTION_STATE;
233
234typedef struct {
235    EFI_IPv6_ADDRESS StationAddress;
236    UINT16           StationPort;
237    EFI_IPv6_ADDRESS RemoteAddress;
238    UINT16           RemotePort;
239    BOOLEAN          ActiveFlag;
240} EFI_TCP6_ACCESS_POINT;
241
242typedef struct {
243    UINT32             ReceiveBufferSize;
244    UINT32             SendBufferSize;
245    UINT32             MaxSynBackLog;
246    UINT32             ConnectionTimeout;
247    UINT32             DataRetries;
248    UINT32             FinTimeout;
249    UINT32             TimeWaitTimeout;
250    UINT32             KeepAliveProbes;
251    UINT32             KeepAliveTime;
252    UINT32             KeepAliveInterval;
253    BOOLEAN            EnableNagle;
254    BOOLEAN            EnableTimeStamp;
255    BOOLEAN            EnableWindbowScaling;
256    BOOLEAN            EnableSelectiveAck;
257    BOOLEAN            EnablePathMtuDiscovery;
258} EFI_TCP6_OPTION;
259
260typedef struct {
261    UINT8                 TrafficClass;
262    UINT8                 HopLimit;
263    EFI_TCP6_ACCESS_POINT AccessPoint;
264    EFI_TCP6_OPTION       *ControlOption;
265} EFI_TCP6_CONFIG_DATA;
266
267typedef
268EFI_STATUS
269(EFIAPI *EFI_TCP6_GET_MODE_DATA) (
270    IN struct _EFI_TCP6                 *This,
271    OUT EFI_TCP6_CONNECTION_STATE       *Tcp6State      OPTIONAL,
272    OUT EFI_TCP6_CONFIG_DATA            *Tcp6ConfigData OPTIONAL,
273    OUT EFI_IP6_MODE_DATA               *Ip6ModeData    OPTIONAL,
274    OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData  OPTIONAL,
275    OUT EFI_SIMPLE_NETWORK_MODE         *SnpModeData    OPTIONAL
276    );
277
278typedef
279EFI_STATUS
280(EFIAPI *EFI_TCP6_CONFIGURE) (
281    IN struct _EFI_TCP6     *This,
282    IN EFI_TCP6_CONFIG_DATA *Tcp6ConfigData OPTIONAL
283    );
284
285typedef struct {
286    EFI_EVENT  Event;
287    EFI_STATUS Status;
288} EFI_TCP6_COMPLETION_TOKEN;
289
290typedef struct {
291    EFI_TCP6_COMPLETION_TOKEN CompletionToken;
292} EFI_TCP6_CONNECTION_TOKEN;
293
294typedef
295EFI_STATUS
296(EFIAPI *EFI_TCP6_CONNECT) (
297    IN struct _EFI_TCP6          *This,
298    IN EFI_TCP6_CONNECTION_TOKEN *ConnectionToken
299    );
300
301typedef struct {
302    EFI_TCP6_COMPLETION_TOKEN CompletionToken;
303    EFI_HANDLE                NewChildHandle;
304} EFI_TCP6_LISTEN_TOKEN;
305
306typedef
307EFI_STATUS
308(EFIAPI *EFI_TCP6_ACCEPT) (
309    IN struct _EFI_TCP6      *This,
310    IN EFI_TCP6_LISTEN_TOKEN *ListenToken
311    );
312
313typedef struct {
314    UINT32 FragmentLength;
315    VOID   *FragmentBuffer;
316} EFI_TCP6_FRAGMENT_DATA;
317
318typedef struct {
319    BOOLEAN                UrgentFlag;
320    UINT32                 DataLength;
321    UINT32                 FragmentCount;
322    EFI_TCP6_FRAGMENT_DATA FragmentTable[1];
323} EFI_TCP6_RECEIVE_DATA;
324
325typedef struct {
326    BOOLEAN                Push;
327    BOOLEAN                Urgent;
328    UINT32                 DataLength;
329    UINT32                 FragmentCount;
330    EFI_TCP6_FRAGMENT_DATA FragmentTable[1];
331} EFI_TCP6_TRANSMIT_DATA;
332
333typedef struct {
334    EFI_TCP6_COMPLETION_TOKEN  CompletionToken;
335    union {
336	EFI_TCP6_RECEIVE_DATA  *RxData;
337	EFI_TCP6_TRANSMIT_DATA *TxData;
338    }                          Packet;
339} EFI_TCP6_IO_TOKEN;
340
341typedef
342EFI_STATUS
343(EFIAPI *EFI_TCP6_TRANSMIT) (
344    IN struct _EFI_TCP6  *This,
345    IN EFI_TCP6_IO_TOKEN *Token
346    );
347
348typedef
349EFI_STATUS
350(EFIAPI *EFI_TCP6_RECEIVE) (
351    IN struct _EFI_TCP6  *This,
352    IN EFI_TCP6_IO_TOKEN *Token
353    );
354
355typedef struct {
356    EFI_TCP6_COMPLETION_TOKEN CompletionToken;
357    BOOLEAN                   AbortOnClose;
358} EFI_TCP6_CLOSE_TOKEN;
359
360typedef
361EFI_STATUS
362(EFIAPI *EFI_TCP6_CLOSE)(
363    IN struct _EFI_TCP6     *This,
364    IN EFI_TCP6_CLOSE_TOKEN *CloseToken
365    );
366
367typedef
368EFI_STATUS
369(EFIAPI *EFI_TCP6_CANCEL)(
370    IN struct _EFI_TCP6          *This,
371    IN EFI_TCP6_COMPLETION_TOKEN *Token OPTIONAL
372    );
373
374typedef
375EFI_STATUS
376(EFIAPI *EFI_TCP6_POLL) (
377    IN struct _EFI_TCP6 *This
378    );
379
380typedef struct _EFI_TCP6 {
381    EFI_TCP6_GET_MODE_DATA GetModeData;
382    EFI_TCP6_CONFIGURE     Configure;
383    EFI_TCP6_CONNECT       Connect;
384    EFI_TCP6_ACCEPT        Accept;
385    EFI_TCP6_TRANSMIT      Transmit;
386    EFI_TCP6_RECEIVE       Receive;
387    EFI_TCP6_CLOSE         Close;
388    EFI_TCP6_CANCEL        Cancel;
389    EFI_TCP6_POLL          Poll;
390} EFI_TCP6;
391
392#endif /* _EFI_TCP_H */
393