1#ifndef _EFI_IP_H
2#define _EFI_IP_H
3
4/*++
5Copyright (c) 2013  Intel Corporation
6
7--*/
8
9#define EFI_IP4_SERVICE_BINDING_PROTOCOL \
10   {0xc51711e7,0xb4bf,0x404a,{0xbf,0xb8,0x0a,0x04, 0x8e,0xf1,0xff,0xe4}}
11
12#define EFI_IP4_PROTOCOL \
13    {0x41d94cd2,0x35b6,0x455a,{0x82,0x58,0xd4,0xe5,0x13,0x34,0xaa,0xdd}}
14
15#define EFI_IP6_SERVICE_BINDING_PROTOCOL \
16    {0xec835dd3,0xfe0f,0x617b,{0xa6,0x21,0xb3,0x50,0xc3,0xe1,0x33,0x88}}
17
18#define EFI_IP6_PROTOCOL \
19    {0x2c8759d5,0x5c2d,0x66ef,{0x92,0x5f,0xb6,0x6c,0x10,0x19,0x57,0xe2}}
20
21INTERFACE_DECL(_EFI_IP4);
22INTERFACE_DECL(_EFI_IP6);
23
24typedef struct {
25    EFI_HANDLE       InstanceHandle;
26    EFI_IPv4_ADDRESS Ip4Address;
27    EFI_IPv4_ADDRESS SubnetMask;
28} EFI_IP4_ADDRESS_PAIR;
29
30typedef struct {
31    EFI_HANDLE           DriverHandle;
32    UINT32               AddressCount;
33    EFI_IP4_ADDRESS_PAIR AddressPairs[1];
34} EFI_IP4_VARIABLE_DATA;
35
36typedef struct {
37    UINT8            DefaultProtocol;
38    BOOLEAN          AcceptAnyProtocol;
39    BOOLEAN          AcceptIcmpErrors;
40    BOOLEAN          AcceptBroadcast;
41    BOOLEAN          AcceptPromiscuous;
42    BOOLEAN          UseDefaultAddress;
43    EFI_IPv4_ADDRESS StationAddress;
44    EFI_IPv4_ADDRESS SubnetMask;
45    UINT8            TypeOfService;
46    UINT8            TimeToLive;
47    BOOLEAN          DoNotFragment;
48    BOOLEAN          RawData;
49    UINT32           ReceiveTimeout;
50    UINT32           TransmitTimeout;
51} EFI_IP4_CONFIG_DATA;
52
53typedef struct {
54    EFI_IPv4_ADDRESS SubnetAddress;
55    EFI_IPv4_ADDRESS SubnetMask;
56    EFI_IPv4_ADDRESS GatewayAddress;
57} EFI_IP4_ROUTE_TABLE;
58
59typedef struct {
60    UINT8 Type;
61    UINT8 Code;
62} EFI_IP4_ICMP_TYPE;
63
64typedef struct {
65    BOOLEAN             IsStarted;
66    UINT32              MaxPacketSize;
67    EFI_IP4_CONFIG_DATA ConfigData;
68    BOOLEAN             IsConfigured;
69    UINT32              GroupCount;
70    EFI_IPv4_ADDRESS    *GroupTable;
71    UINT32              RouteCount;
72    EFI_IP4_ROUTE_TABLE *RouteTable;
73    UINT32              IcmpTypeCount;
74    EFI_IP4_ICMP_TYPE   *IcmpTypeList;
75} EFI_IP4_MODE_DATA;
76
77typedef
78EFI_STATUS
79(EFIAPI *EFI_IP4_GET_MODE_DATA) (
80    IN struct _EFI_IP4                  *This,
81    OUT EFI_IP4_MODE_DATA               *Ip4ModeData   OPTIONAL,
82    OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL,
83    OUT EFI_SIMPLE_NETWORK_MODE         *SnpModeData   OPTIONAL
84    );
85
86typedef
87EFI_STATUS
88(EFIAPI *EFI_IP4_CONFIGURE) (
89    IN struct _EFI_IP4     *This,
90    IN EFI_IP4_CONFIG_DATA *IpConfigData OPTIONAL
91    );
92
93typedef
94EFI_STATUS
95(EFIAPI *EFI_IP4_GROUPS) (
96    IN struct _EFI_IP4  *This,
97    IN BOOLEAN          JoinFlag,
98    IN EFI_IPv4_ADDRESS *GroupAddress OPTIONAL
99    );
100
101typedef
102EFI_STATUS
103(EFIAPI *EFI_IP4_ROUTES) (
104    IN struct _EFI_IP4  *This,
105    IN BOOLEAN          DeleteRoute,
106    IN EFI_IPv4_ADDRESS *SubnetAddress,
107    IN EFI_IPv4_ADDRESS *SubnetMask,
108    IN EFI_IPv4_ADDRESS *GatewayAddress
109    );
110
111#pragma pack(1)
112typedef struct {
113    UINT8            HeaderLength:4;
114    UINT8            Version:4;
115    UINT8            TypeOfService;
116    UINT16           TotalLength;
117    UINT16           Identification;
118    UINT16           Fragmentation;
119    UINT8            TimeToLive;
120    UINT8            Protocol;
121    UINT16           Checksum;
122    EFI_IPv4_ADDRESS SourceAddress;
123    EFI_IPv4_ADDRESS DestinationAddress;
124} EFI_IP4_HEADER;
125#pragma pack()
126
127typedef struct {
128    UINT32 FragmentLength;
129    VOID   *FragmentBuffer;
130} EFI_IP4_FRAGMENT_DATA;
131
132typedef struct {
133    EFI_TIME              TimeStamp;
134    EFI_EVENT             RecycleSignal;
135    UINT32                HeaderLength;
136    EFI_IP4_HEADER        *Header;
137    UINT32                OptionsLength;
138    VOID                  *Options;
139    UINT32                DataLength;
140    UINT32                FragmentCount;
141    EFI_IP4_FRAGMENT_DATA FragmentTable[1];
142} EFI_IP4_RECEIVE_DATA;
143
144typedef struct {
145    EFI_IPv4_ADDRESS SourceAddress;
146    EFI_IPv4_ADDRESS GatewayAddress;
147    UINT8            Protocol;
148    UINT8            TypeOfService;
149    UINT8            TimeToLive;
150    BOOLEAN          DoNotFragment;
151} EFI_IP4_OVERRIDE_DATA;
152
153typedef struct {
154    EFI_IPv4_ADDRESS      DestinationAddress;
155    EFI_IP4_OVERRIDE_DATA *OverrideData;
156    UINT32                OptionsLength;
157    VOID                  *OptionsBuffer;
158    UINT32                TotalDataLength;
159    UINT32                FragmentCount;
160    EFI_IP4_FRAGMENT_DATA FragmentTable[1];
161} EFI_IP4_TRANSMIT_DATA;
162
163typedef struct {
164    EFI_EVENT                 Event;
165    EFI_STATUS                Status;
166    union {
167        EFI_IP4_RECEIVE_DATA  *RxData;
168        EFI_IP4_TRANSMIT_DATA *TxData;
169    } Packet;
170} EFI_IP4_COMPLETION_TOKEN;
171
172typedef
173EFI_STATUS
174(EFIAPI *EFI_IP4_TRANSMIT) (
175    IN struct _EFI_IP4          *This,
176    IN EFI_IP4_COMPLETION_TOKEN *Token
177    );
178
179typedef
180EFI_STATUS
181(EFIAPI *EFI_IP4_RECEIVE) (
182    IN struct _EFI_IP4          *This,
183    IN EFI_IP4_COMPLETION_TOKEN *Token
184    );
185
186typedef
187EFI_STATUS
188(EFIAPI *EFI_IP4_CANCEL)(
189    IN struct _EFI_IP4          *This,
190    IN EFI_IP4_COMPLETION_TOKEN *Token OPTIONAL
191    );
192
193typedef
194EFI_STATUS
195(EFIAPI *EFI_IP4_POLL) (
196    IN struct _EFI_IP4 *This
197    );
198
199typedef struct _EFI_IP4 {
200    EFI_IP4_GET_MODE_DATA GetModeData;
201    EFI_IP4_CONFIGURE     Configure;
202    EFI_IP4_GROUPS        Groups;
203    EFI_IP4_ROUTES        Routes;
204    EFI_IP4_TRANSMIT      Transmit;
205    EFI_IP4_RECEIVE       Receive;
206    EFI_IP4_CANCEL        Cancel;
207    EFI_IP4_POLL          Poll;
208} EFI_IP4;
209
210typedef struct {
211    UINT8            DefaultProtocol;
212    BOOLEAN          AcceptAnyProtocol;
213    BOOLEAN          AcceptIcmpErrors;
214    BOOLEAN          AcceptPromiscuous;
215    EFI_IPv6_ADDRESS DestinationAddress;
216    EFI_IPv6_ADDRESS StationAddress;
217    UINT8            TrafficClass;
218    UINT8            HopLimit;
219    UINT32           FlowLabel;
220    UINT32           ReceiveTimeout;
221    UINT32           TransmitTimeout;
222} EFI_IP6_CONFIG_DATA;
223
224typedef struct {
225    EFI_IPv6_ADDRESS Address;
226    UINT8            PrefixLength;
227} EFI_IP6_ADDRESS_INFO;
228
229typedef struct {
230    EFI_IPv6_ADDRESS Gateway;
231    EFI_IPv6_ADDRESS Destination;
232    UINT8            PrefixLength;
233} EFI_IP6_ROUTE_TABLE;
234
235typedef enum {
236    EfiNeighborInComplete,
237    EfiNeighborReachable,
238    EfiNeighborStale,
239    EfiNeighborDelay,
240    EfiNeighborProbe
241} EFI_IP6_NEIGHBOR_STATE;
242
243typedef struct {
244    EFI_IPv6_ADDRESS       Neighbor;
245    EFI_MAC_ADDRESS        LinkAddress;
246    EFI_IP6_NEIGHBOR_STATE State;
247} EFI_IP6_NEIGHBOR_CACHE;
248
249typedef struct {
250    UINT8 Type;
251    UINT8 Code;
252} EFI_IP6_ICMP_TYPE;
253
254//***********************************************************
255// ICMPv6 type definitions for error messages
256//***********************************************************
257#define ICMP_V6_DEST_UNREACHABLE     0x1
258#define ICMP_V6_PACKET_TOO_BIG       0x2
259#define ICMP_V6_TIME_EXCEEDED        0x3
260#define ICMP_V6_PARAMETER_PROBLEM    0x4
261
262//***********************************************************
263// ICMPv6 type definition for informational messages
264//***********************************************************
265#define ICMP_V6_ECHO_REQUEST         0x80
266#define ICMP_V6_ECHO_REPLY           0x81
267#define ICMP_V6_LISTENER_QUERY       0x82
268#define ICMP_V6_LISTENER_REPORT      0x83
269#define ICMP_V6_LISTENER_DONE        0x84
270#define ICMP_V6_ROUTER_SOLICIT       0x85
271#define ICMP_V6_ROUTER_ADVERTISE     0x86
272#define ICMP_V6_NEIGHBOR_SOLICIT     0x87
273#define ICMP_V6_NEIGHBOR_ADVERTISE   0x88
274#define ICMP_V6_REDIRECT             0x89
275#define ICMP_V6_LISTENER_REPORT_2    0x8F
276
277//***********************************************************
278// ICMPv6 code definitions for ICMP_V6_DEST_UNREACHABLE
279//***********************************************************
280#define ICMP_V6_NO_ROUTE_TO_DEST     0x0
281#define ICMP_V6_COMM_PROHIBITED      0x1
282#define ICMP_V6_BEYOND_SCOPE         0x2
283#define ICMP_V6_ADDR_UNREACHABLE     0x3
284#define ICMP_V6_PORT_UNREACHABLE     0x4
285#define ICMP_V6_SOURCE_ADDR_FAILED   0x5
286#define ICMP_V6_ROUTE_REJECTED       0x6
287
288//***********************************************************
289// ICMPv6 code definitions for ICMP_V6_TIME_EXCEEDED
290//***********************************************************
291#define ICMP_V6_TIMEOUT_HOP_LIMIT    0x0
292#define ICMP_V6_TIMEOUT_REASSEMBLE   0x1
293
294//***********************************************************
295// ICMPv6 code definitions for ICMP_V6_PARAMETER_PROBLEM
296//***********************************************************
297#define ICMP_V6_ERRONEOUS_HEADER     0x0
298#define ICMP_V6_UNRECOGNIZE_NEXT_HDR 0x1
299#define ICMP_V6_UNRECOGNIZE_OPTION   0x2
300
301typedef struct {
302    BOOLEAN                IsStarted;
303    UINT32                 MaxPacketSize;
304    EFI_IP6_CONFIG_DATA    ConfigData;
305    BOOLEAN                IsConfigured;
306    UINT32                 AddressCount;
307    EFI_IP6_ADDRESS_INFO   *AddressList;
308    UINT32                 GroupCount;
309    EFI_IPv6_ADDRESS       *GroupTable;
310    UINT32                 RouteCount;
311    EFI_IP6_ROUTE_TABLE    *RouteTable;
312    UINT32                 NeighborCount;
313    EFI_IP6_NEIGHBOR_CACHE *NeighborCache;
314    UINT32                 PrefixCount;
315    EFI_IP6_ADDRESS_INFO   *PrefixTable;
316    UINT32                 IcmpTypeCount;
317    EFI_IP6_ICMP_TYPE      *IcmpTypeList;
318} EFI_IP6_MODE_DATA;
319
320typedef
321EFI_STATUS
322(EFIAPI *EFI_IP6_GET_MODE_DATA) (
323    IN struct _EFI_IP6                  *This,
324    OUT EFI_IP6_MODE_DATA               *Ip6ModeData   OPTIONAL,
325    OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL,
326    OUT EFI_SIMPLE_NETWORK_MODE         *SnpModeData   OPTIONAL
327    );
328
329typedef
330EFI_STATUS
331(EFIAPI *EFI_IP6_CONFIGURE) (
332    IN struct _EFI_IP6     *This,
333    IN EFI_IP6_CONFIG_DATA *Ip6ConfigData OPTIONAL
334    );
335typedef
336EFI_STATUS
337(EFIAPI *EFI_IP6_GROUPS) (
338    IN struct _EFI_IP6  *This,
339    IN BOOLEAN          JoinFlag,
340    IN EFI_IPv6_ADDRESS *GroupAddress OPTIONAL
341    );
342
343typedef
344EFI_STATUS
345(EFIAPI *EFI_IP6_ROUTES) (
346    IN struct _EFI_IP6  *This,
347    IN BOOLEAN          DeleteRoute,
348    IN EFI_IPv6_ADDRESS *Destination    OPTIONAL,
349    IN UINT8            PrefixLength,
350    IN EFI_IPv6_ADDRESS *GatewayAddress OPTIONAL
351    );
352
353typedef
354EFI_STATUS
355(EFIAPI *EFI_IP6_NEIGHBORS) (
356    IN struct _EFI_IP6  *This,
357    IN BOOLEAN          DeleteFlag,
358    IN EFI_IPv6_ADDRESS *TargetIp6Address,
359    IN EFI_MAC_ADDRESS  *TargetLinkAddress OPTIONAL,
360    IN UINT32           Timeout,
361    IN BOOLEAN          Override
362    );
363
364typedef struct _EFI_IP6_FRAGMENT_DATA {
365    UINT32 FragmentLength;
366    VOID   *FragmentBuffer;
367} EFI_IP6_FRAGMENT_DATA;
368
369typedef struct _EFI_IP6_OVERRIDE_DATA {
370    UINT8  Protocol;
371    UINT8  HopLimit;
372    UINT32 FlowLabel;
373} EFI_IP6_OVERRIDE_DATA;
374
375typedef struct _EFI_IP6_TRANSMIT_DATA {
376    EFI_IPv6_ADDRESS      DestinationAddress;
377    EFI_IP6_OVERRIDE_DATA *OverrideData;
378    UINT32                ExtHdrsLength;
379    VOID                  *ExtHdrs;
380    UINT8                 NextHeader;
381    UINT32                DataLength;
382    UINT32                FragmentCount;
383    EFI_IP6_FRAGMENT_DATA FragmentTable[1];
384} EFI_IP6_TRANSMIT_DATA;
385
386#pragma pack(1)
387typedef struct _EFI_IP6_HEADER {
388    UINT8            TrafficClassH:4;
389    UINT8            Version:4;
390    UINT8            FlowLabelH:4;
391    UINT8            TrafficClassL:4;
392    UINT16           FlowLabelL;
393    UINT16           PayloadLength;
394    UINT8            NextHeader;
395    UINT8            HopLimit;
396    EFI_IPv6_ADDRESS SourceAddress;
397    EFI_IPv6_ADDRESS DestinationAddress;
398} EFI_IP6_HEADER;
399#pragma pack()
400
401typedef struct _EFI_IP6_RECEIVE_DATA {
402    EFI_TIME              TimeStamp;
403    EFI_EVENT             RecycleSignal;
404    UINT32                HeaderLength;
405    EFI_IP6_HEADER        *Header;
406    UINT32                DataLength;
407    UINT32                FragmentCount;
408    EFI_IP6_FRAGMENT_DATA FragmentTable[1];
409} EFI_IP6_RECEIVE_DATA;
410
411typedef struct {
412    EFI_EVENT                 Event;
413    EFI_STATUS                Status;
414    union {
415	EFI_IP6_RECEIVE_DATA  *RxData;
416	EFI_IP6_TRANSMIT_DATA *TxData;
417    }                         Packet;
418} EFI_IP6_COMPLETION_TOKEN;
419
420typedef
421EFI_STATUS
422(EFIAPI *EFI_IP6_TRANSMIT) (
423    IN struct _EFI_IP6          *This,
424    IN EFI_IP6_COMPLETION_TOKEN *Token
425    );
426
427typedef
428EFI_STATUS
429(EFIAPI *EFI_IP6_RECEIVE) (
430    IN struct _EFI_IP6          *This,
431    IN EFI_IP6_COMPLETION_TOKEN *Token
432    );
433
434typedef
435EFI_STATUS
436(EFIAPI *EFI_IP6_CANCEL)(
437    IN struct _EFI_IP6          *This,
438    IN EFI_IP6_COMPLETION_TOKEN *Token OPTIONAL
439    );
440
441typedef
442EFI_STATUS
443(EFIAPI *EFI_IP6_POLL) (
444    IN struct _EFI_IP6 *This
445    );
446
447typedef struct _EFI_IP6 {
448    EFI_IP6_GET_MODE_DATA GetModeData;
449    EFI_IP6_CONFIGURE     Configure;
450    EFI_IP6_GROUPS        Groups;
451    EFI_IP6_ROUTES        Routes;
452    EFI_IP6_NEIGHBORS     Neighbors;
453    EFI_IP6_TRANSMIT      Transmit;
454    EFI_IP6_RECEIVE       Receive;
455    EFI_IP6_CANCEL        Cancel;
456    EFI_IP6_POLL          Poll;
457} EFI_IP6;
458
459#endif /* _EFI_IP_H */
460