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