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