summaryrefslogtreecommitdiff
path: root/MdeModulePkg/Include/Library/IpIoLib.h
blob: acee69f22939996e12a2a761b27de40cb3258012 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
/** @file
  This library provides IpIo layer upon EFI IP4 Protocol.

Copyright (c) 2005 - 2008, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution.  The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php

THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

**/

#ifndef _IP_IO_H_
#define _IP_IO_H_

#include <PiDxe.h>
#include <Protocol/Ip4.h>
#include <Library/IpIoLib.h>
#include <Library/NetLib.h>

//
// type and code define for ICMP protocol error got
// from IP
//
#define ICMP_TYPE_UNREACH              3
#define ICMP_TYPE_TIMXCEED            11
#define ICMP_TYPE_PARAMPROB            12
#define ICMP_TYPE_SOURCEQUENCH         4

#define ICMP_CODE_UNREACH_NET          0
#define ICMP_CODE_UNREACH_HOST         1
#define ICMP_CODE_UNREACH_PROTOCOL     2
#define ICMP_CODE_UNREACH_PORT         3
#define ICMP_CODE_UNREACH_NEEDFRAG     4
#define ICMP_CODE_UNREACH_SRCFAIL      5
#define ICMP_CODE_UNREACH_NET_UNKNOWN  6
#define ICMP_CODE_UNREACH_HOST_UNKNOWN 7
#define ICMP_CODE_UNREACH_ISOLATED     8
#define ICMP_CODE_UNREACH_NET_PROHIB   9
#define ICMP_CODE_UNREACH_HOST_PROHIB  10
#define ICMP_CODE_UNREACH_TOSNET       11
#define ICMP_CODE_UNREACH_TOSHOST      12

//
// this error will be delivered to the
// listening transportation layer protocol
// consuming IpIO
//
typedef enum {
  ICMP_ERR_UNREACH_NET      = 0,
  ICMP_ERR_UNREACH_HOST,
  ICMP_ERR_UNREACH_PROTOCOL,
  ICMP_ERR_UNREACH_PORT,
  ICMP_ERR_MSGSIZE,
  ICMP_ERR_UNREACH_SRCFAIL,
  ICMP_ERR_TIMXCEED_INTRANS,
  ICMP_ERR_TIMXCEED_REASS,
  ICMP_ERR_QUENCH,
  ICMP_ERR_PARAMPROB
} ICMP_ERROR;

typedef struct _ICMP_ERROR_INFO {
  BOOLEAN     IsHard;
  BOOLEAN     Notify;
} ICMP_ERROR_INFO;

#define EFI_IP4_HEADER_LEN(HdrPtr) ((HdrPtr)->HeaderLength << 2)

extern EFI_IP4_CONFIG_DATA  mIpIoDefaultIpConfigData;

typedef struct _EFI_NET_SESSION_DATA {
  IP4_ADDR        Source;
  IP4_ADDR        Dest;
  EFI_IP4_HEADER  *IpHdr;
} EFI_NET_SESSION_DATA;

typedef
VOID
(*PKT_RCVD_NOTIFY) (
  IN EFI_STATUS           Status,  // rcvd pkt result
  IN ICMP_ERROR           IcmpErr, // if Status == EFI_ICMP_ERROR, this
                                  // field is valid for user
  IN EFI_NET_SESSION_DATA *NetSession, // the communication point
  IN NET_BUF              *Pkt,    // packet received
  IN VOID                 *Context // the Context provided by user for recive data
  );

typedef
VOID
(*PKT_SENT_NOTIFY) (
  IN EFI_STATUS  Status,      // sent pkt result
  IN VOID        *Context,    // the context provided by user for sending data
  IN VOID        *Sender,     // the sender to be notified
  IN VOID        *NotifyData  // sent pkt related data to notify
  );

typedef struct _IP_IO {

  //
  // the node used to link this IpIo to the active IpIo list.
  //
  LIST_ENTRY                    Entry;

  // the list used to maintain the IP instance for different sending purpose.
  //
  LIST_ENTRY                    IpList;

  //
  // the ip instance consumed by this IP IO
  //
  EFI_HANDLE                    Controller;
  EFI_HANDLE                    Image;
  EFI_HANDLE                    ChildHandle;
  EFI_IP4_PROTOCOL              *Ip;
  BOOLEAN                       IsConfigured;

  //
  // some ip config data can be changed
  //
  UINT8                         Protocol;

  //
  // token and event used to get data from IP
  //
  EFI_IP4_COMPLETION_TOKEN      RcvToken;

  //
  // list entry used to link the token passed to IP_IO
  //
  LIST_ENTRY                    PendingSndList;

  //
  // User interface used to get notify from IP_IO
  //
  VOID                          *RcvdContext;
  VOID                          *SndContext;
  PKT_RCVD_NOTIFY               PktRcvdNotify;
  PKT_SENT_NOTIFY               PktSentNotify;
} IP_IO;

typedef struct _IP_IO_OPEN_DATA {
  EFI_IP4_CONFIG_DATA IpConfigData;
  VOID                *RcvdContext;
  VOID                *SndContext;
  PKT_RCVD_NOTIFY     PktRcvdNotify;
  PKT_SENT_NOTIFY     PktSentNotify;
} IP_IO_OPEN_DATA;

typedef struct _IP_IO_SEND_ENTRY {
  LIST_ENTRY                Entry;
  IP_IO                     *IpIo;
  VOID                      *Context;
  VOID                      *NotifyData;
  EFI_IP4_PROTOCOL          *Ip;
  NET_BUF                   *Pkt;
  EFI_IP4_COMPLETION_TOKEN  *SndToken;
} IP_IO_SEND_ENTRY;

typedef EFI_IP4_OVERRIDE_DATA IP_IO_OVERRIDE;

typedef struct _IP_IO_IP_INFO {
  IP4_ADDR                  Addr;
  IP4_ADDR                  SubnetMask;
  LIST_ENTRY                Entry;
  EFI_HANDLE                ChildHandle;
  EFI_IP4_PROTOCOL          *Ip;
  EFI_IP4_COMPLETION_TOKEN  DummyRcvToken;
  INTN                      RefCnt;
} IP_IO_IP_INFO;

/**
  Create a new IP_IO instance.

  @param  Image                 The image handle of an IP_IO consumer protocol.
  @param  Controller            The controller handle of an IP_IO consumer protocol
                                installed on.

  @return Pointer to a newly created IP_IO instance.

**/
IP_IO *
EFIAPI
IpIoCreate (
  IN EFI_HANDLE Image,
  IN EFI_HANDLE Controller
  );

/**
  Destroy an IP_IO instance.

  @param  IpIo                  Pointer to the IP_IO instance that needs to
                                destroy.

  @retval EFI_SUCCESS           The IP_IO instance destroyed successfully.
  @retval other                 Error condition occurred.

**/
EFI_STATUS
EFIAPI
IpIoDestroy (
  IN IP_IO *IpIo
  );

/**
  Stop an IP_IO instance.

  @param  IpIo                  Pointer to the IP_IO instance that needs to stop.

  @retval EFI_SUCCESS           The IP_IO instance stopped successfully.
  @retval other                 Error condition occurred.

**/
EFI_STATUS
EFIAPI
IpIoStop (
  IN IP_IO *IpIo
  );

/**
  Open an IP_IO instance for use.

  @param  IpIo                  Pointer to an IP_IO instance that needs to open.
  @param  OpenData              The configuration data for the IP_IO instance.

  @retval EFI_SUCCESS           The IP_IO instance opened with OpenData
                                successfully.
  @retval other                 Error condition occurred.

**/
EFI_STATUS
IpIoOpen (
  IN IP_IO           *IpIo,
  IN IP_IO_OPEN_DATA *OpenData
  );

/**
  Send out an IP packet.

  @param  IpIo                  Pointer to an IP_IO instance used for sending IP
                                packet.
  @param  Pkt                   Pointer to the IP packet to be sent.
  @param  Sender                The IP protocol instance used for sending.
  @param  NotifyData
  @param  Dest                  The destination IP address to send this packet to.
  @param  OverrideData          The data to override some configuration of the IP
                                instance used for sending.

  @retval EFI_SUCCESS           The operation is completed successfully.
  @retval EFI_NOT_STARTED       The IpIo is not configured.
  @retval EFI_OUT_OF_RESOURCES  Failed due to resource limit.

**/
EFI_STATUS
EFIAPI
IpIoSend (
  IN IP_IO           *IpIo,
  IN NET_BUF         *Pkt,
  IN IP_IO_IP_INFO   *Sender,
  IN VOID            *Context    OPTIONAL,
  IN VOID            *NotifyData OPTIONAL,
  IN IP4_ADDR        Dest,
  IN IP_IO_OVERRIDE  *OverrideData
  );

/**
  Add a new IP instance for sending data.

  @param  IpIo                  Pointer to a IP_IO instance to add a new IP
                                instance for sending purpose.

  @return Pointer to the created IP_IO_IP_INFO structure, NULL is failed.

**/
VOID
EFIAPI
IpIoCancelTxToken (
  IN IP_IO  *IpIo,
  IN VOID   *Packet
  );

/**
  Add a new IP instance for sending data.

  @param  IpIo                  Pointer to a IP_IO instance to add a new IP
                                instance for sending purpose.

  @return Pointer to the created IP_IO_IP_INFO structure, NULL is failed.

**/
IP_IO_IP_INFO *
EFIAPI
IpIoAddIp (
  IN IP_IO  *IpIo
  );

/**
  Configure the IP instance of this IpInfo and start the receiving if Ip4ConfigData
  is not NULL.

  @param  IpInfo                Pointer to the IP_IO_IP_INFO instance.
  @param  Ip4ConfigData         The IP4 configure data used to configure the ip
                                instance, if NULL the ip instance is reseted. If
                                UseDefaultAddress is set to TRUE, and the configure
                                operation succeeds, the default address information
                                is written back in this Ip4ConfigData.

  @retval EFI_STATUS            The status returned by IP4->Configure or
                                IP4->Receive.

**/
EFI_STATUS
EFIAPI
IpIoConfigIp (
  IN     IP_IO_IP_INFO        *IpInfo,
  IN OUT EFI_IP4_CONFIG_DATA  *Ip4ConfigData OPTIONAL
  );

/**
  Destroy an IP instance maintained in IpIo->IpList for
  sending purpose.

  @param  IpIo                  Pointer to the IP_IO instance.
  @param  IpInfo                Pointer to the IpInfo to be removed.

  @return None.

**/
VOID
EFIAPI
IpIoRemoveIp (
  IN IP_IO            *IpIo,
  IN IP_IO_IP_INFO    *IpInfo
  );

/**
  Find the first IP protocol maintained in IpIo whose local
  address is the same with Src.

  @param  IpIo                  Pointer to the pointer of the IP_IO instance.
  @param  Src                   The local IP address.

  @return Pointer to the IP protocol can be used for sending purpose and its local
  @return address is the same with Src.

**/
IP_IO_IP_INFO *
EFIAPI
IpIoFindSender (
  IN OUT IP_IO     **IpIo,
  IN     IP4_ADDR  Src
  );

/**
  Get the ICMP error map information, the ErrorStatus will be returned.
  The IsHard and Notify are optional. If they are not NULL, this rouine will
  fill them.
  We move IcmpErrMap[] to local variable to enable EBC build.

  @param  IcmpError             IcmpError Type
  @param  IsHard                Whether it is a hard error
  @param  Notify                Whether it need to notify SockError

  @return ICMP Error Status

**/
EFI_STATUS
EFIAPI
IpIoGetIcmpErrStatus (
  IN  ICMP_ERROR  IcmpError,
  OUT BOOLEAN     *IsHard, OPTIONAL
  OUT BOOLEAN     *Notify OPTIONAL
  );

#endif