xref: /netbsd-src/sys/external/bsd/gnu-efi/dist/inc/efiip.h (revision b2c829d73acfa2ef1ac1967460ebcec8f439b096)
1 /*	$NetBSD: efiip.h,v 1.1.1.1 2014/04/01 16:16:07 jakllsch Exp $	*/
2 
3 #ifndef _EFI_IP_H
4 #define _EFI_IP_H
5 
6 /*++
7 Copyright (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 
23 INTERFACE_DECL(_EFI_IP4);
24 INTERFACE_DECL(_EFI_IP6);
25 
26 typedef struct {
27     EFI_HANDLE       InstanceHandle;
28     EFI_IPv4_ADDRESS Ip4Address;
29     EFI_IPv4_ADDRESS SubnetMask;
30 } EFI_IP4_ADDRESS_PAIR;
31 
32 typedef struct {
33     EFI_HANDLE           DriverHandle;
34     UINT32               AddressCount;
35     EFI_IP4_ADDRESS_PAIR AddressPairs[1];
36 } EFI_IP4_VARIABLE_DATA;
37 
38 typedef 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 
55 typedef struct {
56     EFI_IPv4_ADDRESS SubnetAddress;
57     EFI_IPv4_ADDRESS SubnetMask;
58     EFI_IPv4_ADDRESS GatewayAddress;
59 } EFI_IP4_ROUTE_TABLE;
60 
61 typedef struct {
62     UINT8 Type;
63     UINT8 Code;
64 } EFI_IP4_ICMP_TYPE;
65 
66 typedef 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 
79 typedef
80 EFI_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 
88 typedef
89 EFI_STATUS
90 (EFIAPI *EFI_IP4_CONFIGURE) (
91     IN struct _EFI_IP4     *This,
92     IN EFI_IP4_CONFIG_DATA *IpConfigData OPTIONAL
93     );
94 
95 typedef
96 EFI_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 
103 typedef
104 EFI_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)
114 typedef 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 
129 typedef struct {
130     UINT32 FragmentLength;
131     VOID   *FragmentBuffer;
132 } EFI_IP4_FRAGMENT_DATA;
133 
134 typedef 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 
146 typedef 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 
155 typedef 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 
165 typedef 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 
174 typedef
175 EFI_STATUS
176 (EFIAPI *EFI_IP4_TRANSMIT) (
177     IN struct _EFI_IP4          *This,
178     IN EFI_IP4_COMPLETION_TOKEN *Token
179     );
180 
181 typedef
182 EFI_STATUS
183 (EFIAPI *EFI_IP4_RECEIVE) (
184     IN struct _EFI_IP4          *This,
185     IN EFI_IP4_COMPLETION_TOKEN *Token
186     );
187 
188 typedef
189 EFI_STATUS
190 (EFIAPI *EFI_IP4_CANCEL)(
191     IN struct _EFI_IP4          *This,
192     IN EFI_IP4_COMPLETION_TOKEN *Token OPTIONAL
193     );
194 
195 typedef
196 EFI_STATUS
197 (EFIAPI *EFI_IP4_POLL) (
198     IN struct _EFI_IP4 *This
199     );
200 
201 typedef 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 
212 typedef 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 
226 typedef struct {
227     EFI_IPv6_ADDRESS Address;
228     UINT8            PrefixLength;
229 } EFI_IP6_ADDRESS_INFO;
230 
231 typedef struct {
232     EFI_IPv6_ADDRESS Gateway;
233     EFI_IPv6_ADDRESS Destination;
234     UINT8            PrefixLength;
235 } EFI_IP6_ROUTE_TABLE;
236 
237 typedef enum {
238     EfiNeighborInComplete,
239     EfiNeighborReachable,
240     EfiNeighborStale,
241     EfiNeighborDelay,
242     EfiNeighborProbe
243 } EFI_IP6_NEIGHBOR_STATE;
244 
245 typedef struct {
246     EFI_IPv6_ADDRESS       Neighbor;
247     EFI_MAC_ADDRESS        LinkAddress;
248     EFI_IP6_NEIGHBOR_STATE State;
249 } EFI_IP6_NEIGHBOR_CACHE;
250 
251 typedef 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 
303 typedef 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 
322 typedef
323 EFI_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 
331 typedef
332 EFI_STATUS
333 (EFIAPI *EFI_IP6_CONFIGURE) (
334     IN struct _EFI_IP6     *This,
335     IN EFI_IP6_CONFIG_DATA *Ip6ConfigData OPTIONAL
336     );
337 typedef
338 EFI_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 
345 typedef
346 EFI_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 
355 typedef
356 EFI_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 
366 typedef struct _EFI_IP6_FRAGMENT_DATA {
367     UINT32 FragmentLength;
368     VOID   *FragmentBuffer;
369 } EFI_IP6_FRAGMENT_DATA;
370 
371 typedef struct _EFI_IP6_OVERRIDE_DATA {
372     UINT8  Protocol;
373     UINT8  HopLimit;
374     UINT32 FlowLabel;
375 } EFI_IP6_OVERRIDE_DATA;
376 
377 typedef 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)
389 typedef 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 
403 typedef 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 
413 typedef 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 
422 typedef
423 EFI_STATUS
424 (EFIAPI *EFI_IP6_TRANSMIT) (
425     IN struct _EFI_IP6          *This,
426     IN EFI_IP6_COMPLETION_TOKEN *Token
427     );
428 
429 typedef
430 EFI_STATUS
431 (EFIAPI *EFI_IP6_RECEIVE) (
432     IN struct _EFI_IP6          *This,
433     IN EFI_IP6_COMPLETION_TOKEN *Token
434     );
435 
436 typedef
437 EFI_STATUS
438 (EFIAPI *EFI_IP6_CANCEL)(
439     IN struct _EFI_IP6          *This,
440     IN EFI_IP6_COMPLETION_TOKEN *Token OPTIONAL
441     );
442 
443 typedef
444 EFI_STATUS
445 (EFIAPI *EFI_IP6_POLL) (
446     IN struct _EFI_IP6 *This
447     );
448 
449 typedef 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