1/*++
2
3Copyright (c) 2004, Intel Corporation. All rights reserved.<BR>
4This program and the accompanying materials
5are licensed and made available under the terms and conditions of the BSD License
6which accompanies this distribution.  The full text of the license may be found at
7http://opensource.org/licenses/bsd-license.php
8
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12Module Name:
13  PxeDhcp4.h
14
15Abstract:
16  EFI PXE DHCPv4 protocol definition
17
18--*/
19
20#ifndef _PXEDHCP4_H_
21#define _PXEDHCP4_H_
22
23
24/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
25//
26// PXE DHCPv4 GUID definition
27//
28
29#define EFI_PXE_DHCP4_PROTOCOL_GUID \
30  { 0x03c4e624, 0xac28, 0x11d3, {0x9a, 0x2d, 0x00, 0x90, 0x29, 0x3f, 0xc1, 0x4d} }
31
32/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
33//
34// Interface definition
35//
36
37EFI_FORWARD_DECLARATION (EFI_PXE_DHCP4_PROTOCOL);
38
39/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
40//
41// Descriptions of the DHCP version 4 header and options can be found
42// in RFC-2131 and RFC-2132 at www.ietf.org
43//
44
45#pragma pack(1)
46typedef struct {
47
48  UINT8 op;
49#define BOOTP_REQUEST   1
50#define BOOTP_REPLY   2
51
52  UINT8 htype;
53
54  UINT8 hlen;
55
56  UINT8 hops;
57
58  UINT32 xid;
59
60  UINT16 secs;
61#define DHCP4_INITIAL_SECONDS 4
62
63  UINT16 flags;
64#define DHCP4_BROADCAST_FLAG  0x8000
65
66  UINT32 ciaddr;
67
68  UINT32 yiaddr;
69
70  UINT32 siaddr;
71
72  UINT32 giaddr;
73
74  UINT8 chaddr[16];
75
76  UINT8 sname[64];
77
78  UINT8 fname[128];
79
80//
81// This is the minimum option length as specified in RFC-2131.
82// The packet must be padded out this far with DHCP4_PAD.
83// DHCPv4 packets are usually 576 bytes in length.  This length
84// includes the IPv4 and UDPv4 headers but not the media header.
85// Note: Not all DHCP relay agents will forward DHCPv4 packets
86// if they are less than 384 bytes or exceed 576 bytes.  Even if
87// the underlying hardware can handle smaller and larger packets,
88// many older relay agents will not accept them.
89//
90  UINT32 magik;
91#define DHCP4_MAGIK_NUMBER  0x63825363
92
93  UINT8 options[308];
94
95} DHCP4_HEADER;
96#pragma pack()
97
98/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
99//
100// DHCPv4 packet definition.  Room for 576 bytes including IP and
101// UDP header.
102//
103
104#define DHCP4_MAX_PACKET_SIZE     576
105#define DHCP4_UDP_HEADER_SIZE     8
106#define DHCP4_IP_HEADER_SIZE      20
107
108#pragma pack(1)
109typedef union _DHCP4_PACKET {
110  UINT32 _force_data_alignment;
111
112  UINT8 raw[1500];
113
114  DHCP4_HEADER dhcp4;
115} DHCP4_PACKET;
116#pragma pack()
117
118#define DHCP4_SERVER_PORT 67
119#define DHCP4_CLIENT_PORT 68
120
121/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
122//
123// DHCPv4 and PXE option numbers.
124//
125
126#define DHCP4_PAD                             0
127#define DHCP4_END                             255
128#define DHCP4_SUBNET_MASK                     1
129#define DHCP4_TIME_OFFSET                     2
130#define DHCP4_ROUTER_LIST                     3
131#define DHCP4_TIME_SERVERS                    4
132#define DHCP4_NAME_SERVERS                    5
133#define DHCP4_DNS_SERVERS                     6
134#define DHCP4_LOG_SERVERS                     7
135#define DHCP4_COOKIE_SERVERS                  8
136#define DHCP4_LPR_SREVERS                     9
137#define DHCP4_IMPRESS_SERVERS                 10
138#define DHCP4_RESOURCE_LOCATION_SERVERS       11
139#define DHCP4_HOST_NAME                       12
140#define DHCP4_BOOT_FILE_SIZE                  13
141#define DHCP4_DUMP_FILE                       14
142#define DHCP4_DOMAIN_NAME                     15
143#define DHCP4_SWAP_SERVER                     16
144#define DHCP4_ROOT_PATH                       17
145#define DHCP4_EXTENSION_PATH                  18
146#define DHCP4_IP_FORWARDING                   19
147#define DHCP4_NON_LOCAL_SOURCE_ROUTE          20
148#define DHCP4_POLICY_FILTER                   21
149#define DHCP4_MAX_DATAGRAM_SIZE               22
150#define DHCP4_DEFAULT_TTL                     23
151#define DHCP4_MTU_AGING_TIMEOUT               24
152#define DHCP4_MTU_SIZES                       25
153#define DHCP4_MTU_TO_USE                      26
154#define DHCP4_ALL_SUBNETS_LOCAL               27
155#define DHCP4_BROADCAST_ADDRESS               28
156#define DHCP4_PERFORM_MASK_DISCOVERY          29
157#define DHCP4_RESPOND_TO_MASK_REQ             30
158#define DHCP4_PERFORM_ROUTER_DISCOVERY        31
159#define DHCP4_ROUTER_SOLICIT_ADDRESS          32
160#define DHCP4_STATIC_ROUTER_LIST              33
161#define DHCP4_USE_ARP_TRAILERS                34
162#define DHCP4_ARP_CACHE_TIMEOUT               35
163#define DHCP4_ETHERNET_ENCAPSULATION          36
164#define DHCP4_TCP_DEFAULT_TTL                 37
165#define DHCP4_TCP_KEEP_ALIVE_INT              38
166#define DHCP4_KEEP_ALIVE_GARBAGE              39
167#define DHCP4_NIS_DOMAIN_NAME                 40
168#define DHCP4_NIS_SERVERS                     41
169#define DHCP4_NTP_SERVERS                     42
170#define DHCP4_VENDOR_SPECIFIC                 43
171# define PXE_MTFTP_IP                         1
172# define PXE_MTFTP_CPORT                      2
173# define PXE_MTFTP_SPORT                      3
174# define PXE_MTFTP_TMOUT                      4
175# define PXE_MTFTP_DELAY                      5
176# define PXE_DISCOVERY_CONTROL                6
177#  define PXE_DISABLE_BROADCAST_DISCOVERY     0x01
178#  define PXE_DISABLE_MULTICAST_DISCOVERY     0x02
179#  define PXE_ACCEPT_ONLY_PXE_BOOT_SERVERS    0x04
180#  define PXE_DO_NOT_PROMPT                   0x08
181# define PXE_DISCOVERY_MCAST_ADDR             7
182# define PXE_BOOT_SERVERS                     8
183# define PXE_BOOT_MENU                        9
184# define PXE_BOOT_PROMPT                      10
185# define PXE_MCAST_ADDRS_ALLOC                11
186# define PXE_CREDENTIAL_TYPES                 12
187# define PXE_BOOT_ITEM                        71
188#define DHCP4_NBNS_SERVERS                    44
189#define DHCP4_NBDD_SERVERS                    45
190#define DHCP4_NETBIOS_NODE_TYPE               46
191#define DHCP4_NETBIOS_SCOPE                   47
192#define DHCP4_XWINDOW_SYSTEM_FONT_SERVERS     48
193#define DHCP4_XWINDOW_SYSTEM_DISPLAY_MANAGERS 49
194#define DHCP4_REQUESTED_IP_ADDRESS            50
195#define DHCP4_LEASE_TIME                      51
196#define DHCP4_OPTION_OVERLOAD                 52
197# define DHCP4_OVERLOAD_FNAME                 1
198# define DHCP4_OVERLOAD_SNAME                 2
199# define DHCP4_OVERLOAD_FNAME_AND_SNAME       3
200#define DHCP4_MESSAGE_TYPE                    53
201# define DHCP4_MESSAGE_TYPE_DISCOVER          1
202# define DHCP4_MESSAGE_TYPE_OFFER             2
203# define DHCP4_MESSAGE_TYPE_REQUEST           3
204# define DHCP4_MESSAGE_TYPE_DECLINE           4
205# define DHCP4_MESSAGE_TYPE_ACK               5
206# define DHCP4_MESSAGE_TYPE_NAK               6
207# define DHCP4_MESSAGE_TYPE_RELEASE           7
208# define DHCP4_MESSAGE_TYPE_INFORM            8
209#define DHCP4_SERVER_IDENTIFIER               54
210#define DHCP4_PARAMETER_REQUEST_LIST          55
211#define DHCP4_ERROR_MESSAGE                   56
212#define DHCP4_MAX_MESSAGE_SIZE                57
213# define DHCP4_DEFAULT_MAX_MESSAGE_SIZE       576
214#define DHCP4_RENEWAL_TIME                    58
215#define DHCP4_REBINDING_TIME                  59
216#define DHCP4_CLASS_IDENTIFIER                60
217#define DHCP4_CLIENT_IDENTIFIER               61
218#define DHCP4_NISPLUS_DOMAIN_NAME             64
219#define DHCP4_NISPLUS_SERVERS                 65
220#define DHCP4_TFTP_SERVER_NAME                66
221#define DHCP4_BOOTFILE                        67
222#define DHCP4_MOBILE_IP_HOME_AGENTS           68
223#define DHCP4_SMPT_SERVERS                    69
224#define DHCP4_POP3_SERVERS                    70
225#define DHCP4_NNTP_SERVERS                    71
226#define DHCP4_WWW_SERVERS                     72
227#define DHCP4_FINGER_SERVERS                  73
228#define DHCP4_IRC_SERVERS                     74
229#define DHCP4_STREET_TALK_SERVERS             75
230#define DHCP4_STREET_TALK_DIR_ASSIST_SERVERS  76
231#define DHCP4_NDS_SERVERS                     85
232#define DHCP4_NDS_TREE_NAME                   86
233#define DHCP4_NDS_CONTEXT                     87
234#define DHCP4_SYSTEM_ARCHITECTURE             93
235#define DHCP4_NETWORK_ARCHITECTURE            94
236#define DHCP4_PLATFORM_ID                     97
237
238/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
239//
240// DHCP4 option format.
241//
242
243#pragma pack(1)
244typedef struct {
245  UINT8 op;
246  UINT8 len;
247  UINT8 data[1];
248} DHCP4_OP;
249#pragma pack()
250
251/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
252
253typedef struct {
254  DHCP4_PACKET Discover;
255  DHCP4_PACKET Offer;
256  DHCP4_PACKET Request;
257  DHCP4_PACKET AckNak;
258  BOOLEAN SetupCompleted;
259  BOOLEAN InitCompleted;
260  BOOLEAN SelectCompleted;
261  BOOLEAN IsBootp;
262  BOOLEAN IsAck;
263} EFI_PXE_DHCP4_DATA;
264
265/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
266typedef
267EFI_STATUS
268(EFIAPI *EFI_PXE_DHCP4_RUN) (
269  IN EFI_PXE_DHCP4_PROTOCOL *This,
270  IN OPTIONAL UINTN         OpLen,
271  IN OPTIONAL VOID          *OpList
272  );
273
274/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
275typedef
276EFI_STATUS
277(EFIAPI *EFI_PXE_DHCP4_SETUP) (
278  IN EFI_PXE_DHCP4_PROTOCOL          *This,
279  IN OPTIONAL EFI_PXE_DHCP4_DATA     * NewData
280  );
281
282/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
283typedef
284EFI_STATUS
285(EFIAPI *EFI_PXE_DHCP4_INIT) (
286  IN EFI_PXE_DHCP4_PROTOCOL *This,
287  IN UINTN                  SecondsTimeout,
288  OUT UINTN                 *Offers,
289  OUT DHCP4_PACKET          **OfferList
290  );
291
292#define DHCP4_MIN_SECONDS   1
293#define DHCP4_MAX_SECONDS   60
294
295/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
296typedef
297EFI_STATUS
298(EFIAPI *EFI_PXE_DHCP4_SELECT) (
299  IN EFI_PXE_DHCP4_PROTOCOL *This,
300  IN UINTN                  SecondsTimeout,
301  IN DHCP4_PACKET           * offer
302  );
303
304/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
305typedef
306EFI_STATUS
307(EFIAPI *EFI_PXE_DHCP4_RENEW) (
308  IN EFI_PXE_DHCP4_PROTOCOL *This,
309  UINTN                     seconds_timeout
310  );
311
312/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
313typedef
314EFI_STATUS
315(EFIAPI *EFI_PXE_DHCP4_REBIND) (
316  IN EFI_PXE_DHCP4_PROTOCOL *This,
317  UINTN                     seconds_timeout
318  );
319
320/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
321typedef
322EFI_STATUS
323(EFIAPI *EFI_PXE_DHCP4_RELEASE) (
324  IN EFI_PXE_DHCP4_PROTOCOL * This
325  );
326
327/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
328
329#define EFI_PXE_DHCP4_PROTOCOL_REVISION    0x00010000
330
331struct _EFI_PXE_DHCP4_PROTOCOL {
332  UINT64 Revision;
333  EFI_PXE_DHCP4_RUN Run;
334  EFI_PXE_DHCP4_SETUP Setup;
335  EFI_PXE_DHCP4_INIT Init;
336  EFI_PXE_DHCP4_SELECT Select;
337  EFI_PXE_DHCP4_RENEW Renew;
338  EFI_PXE_DHCP4_REBIND Rebind;
339  EFI_PXE_DHCP4_RELEASE Release;
340  EFI_PXE_DHCP4_DATA *Data;
341};
342
343//
344//
345//
346
347extern EFI_GUID gEfiPxeDhcp4ProtocolGuid;
348
349#endif /* _PXEDHCP4_H_ */
350/* EOF - PxeDhcp4.h */
351