Add iBFT code derived from IBM document.
[people/indolent/gpxe.git/.git] / src / include / gpxe / ibft.h
1 #ifndef _GPXE_IBFT_H
2 #define _GPXE_IBFT_H
3
4 /*
5  * Copyright Fen Systems Ltd. 2007.  Portions of this code are derived
6  * from IBM Corporation Sample Programs.  Copyright IBM Corporation
7  * 2004, 2007.  All rights reserved.
8  *
9  * Permission is hereby granted, free of charge, to any person
10  * obtaining a copy of this software and associated documentation
11  * files (the "Software"), to deal in the Software without
12  * restriction, including without limitation the rights to use, copy,
13  * modify, merge, publish, distribute, sublicense, and/or sell copies
14  * of the Software, and to permit persons to whom the Software is
15  * furnished to do so, subject to the following conditions:
16  *
17  * The above copyright notice and this permission notice shall be
18  * included in all copies or substantial portions of the Software.
19  *
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
24  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
25  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
26  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27  * SOFTWARE.
28  *
29  */
30
31 /** @file
32  *
33  * iSCSI boot firmware table
34  *
35  * The information in this file is derived from the document "iSCSI
36  * Boot Firmware Table (iBFT)" as published by IBM at
37  *
38  * ftp://ftp.software.ibm.com/systems/support/system_x_pdf/ibm_iscsi_boot_firmware_table_v1.02.pdf
39  *
40  */
41
42 #include <stdint.h>
43 #include <gpxe/acpi.h>
44 #include <gpxe/in.h>
45
46 /** iSCSI Boot Firmware Table signature */
47 #define IBFT_SIG "iBFT"
48
49 /** An offset from the start of the iBFT */
50 typedef uint16_t ibft_off_t;
51
52 /** Length of a string within the iBFT (excluding terminating NUL) */
53 typedef uint16_t ibft_size_t;
54
55 /** A string within the iBFT */
56 struct ibft_string {
57         /** Length of string */
58         ibft_size_t length;
59         /** Offset to string */
60         ibft_off_t offset;
61 } __attribute__ (( packed ));
62
63 /** An IP address within the iBFT */
64 struct ibft_ipaddr {
65         /** Reserved; must be zero */
66         uint16_t zeroes[5];
67         /** Must be 0xffff if IPv4 address is present, otherwise zero */
68         uint16_t ones;
69         /** The IPv4 address, or zero if not present */
70         struct in_addr in;
71 } __attribute__ (( packed ));
72
73 /**
74  * iBFT structure header
75  *
76  * This structure is common to several sections within the iBFT.
77  */
78 struct ibft_header {
79         /** Structure ID
80          *
81          * This is an IBFT_STRUCTURE_ID_XXX constant
82          */
83         uint8_t structure_id;
84         /** Version (always 1) */
85         uint8_t version;
86         /** Length, including this header */
87         uint16_t length;
88         /** Index 
89          *
90          * This is the number of the NIC or Target, when applicable.
91          */
92         uint8_t index;
93         /** Flags */
94         uint8_t flags;
95 } __attribute__ (( packed ));
96
97 /**
98  * iBFT Control structure
99  *
100  */
101 struct ibft_control {
102         /** Common header */
103         struct ibft_header header;
104         /** Extensions */
105         uint16_t extensions;
106         /** Offset to Initiator structure */
107         ibft_off_t initiator;
108         /** Offset to NIC structure for NIC 0 */
109         ibft_off_t nic_0;
110         /** Offset to Target structure for target 0 */
111         ibft_off_t target_0;
112         /** Offset to NIC structure for NIC 1 */
113         ibft_off_t nic_1;
114         /** Offset to Target structure for target 1 */
115         ibft_off_t target_1;
116 } __attribute__ (( packed ));
117
118 /** Structure ID for Control section */
119 #define IBFT_STRUCTURE_ID_CONTROL 0x01
120
121 /** Attempt login only to specified target
122  *
123  * If this flag is not set, all targets will be logged in to.
124  */
125 #define IBFT_FL_CONTROL_SINGLE_LOGIN_ONLY 0x01
126
127 /**
128  * iBFT Initiator structure
129  *
130  */
131 struct ibft_initiator {
132         /** Common header */
133         struct ibft_header header;
134         /** iSNS server */
135         struct ibft_ipaddr isns_server;
136         /** SLP server */
137         struct ibft_ipaddr slp_server;
138         /** Primary and secondary Radius servers */
139         struct ibft_ipaddr radius[2];
140         /** Initiator name */
141         struct ibft_string initiator_name;
142 } __attribute__ (( packed ));
143
144 /** Structure ID for Initiator section */
145 #define IBFT_STRUCTURE_ID_INITIATOR 0x02
146
147 /** Initiator block valid */
148 #define IBFT_FL_INITIATOR_BLOCK_VALID 0x01
149
150 /** Initiator firmware boot selected */
151 #define IBFT_FL_INITIATOR_FIRMWARE_BOOT_SELECTED 0x02
152
153 /**
154  * iBFT NIC structure
155  *
156  */
157 struct ibft_nic {
158         /** Common header */
159         struct ibft_header header;
160         /** IP address */
161         struct ibft_ipaddr ip_address;
162         /** Subnet mask
163          *
164          * This is the length of the subnet mask in bits (e.g. /24).
165          */
166         uint8_t subnet_mask_prefix;
167         /** Origin */
168         uint8_t origin;
169         /** Default gateway */
170         struct ibft_ipaddr gateway;
171         /** Primary and secondary DNS servers */
172         struct ibft_ipaddr dns[2];
173         /** DHCP server */
174         struct ibft_ipaddr dhcp;
175         /** VLAN tag */
176         uint16_t vlan;
177         /** MAC address */
178         uint8_t mac_address[6];
179         /** PCI bus:dev:fn */
180         uint16_t pci_bus_dev_func;
181         /** Hostname */
182         struct ibft_string hostname;
183 } __attribute__ (( packed ));
184
185 /** Structure ID for NIC section */
186 #define IBFT_STRUCTURE_ID_NIC 0x03
187
188 /** NIC block valid */
189 #define IBFT_FL_NIC_BLOCK_VALID 0x01
190
191 /** NIC firmware boot selected */
192 #define IBFT_FL_NIC_FIRMWARE_BOOT_SELECTED 0x02
193
194 /** NIC global / link local */
195 #define IBFT_FL_NIC_GLOBAL 0x04
196
197 /**
198  * iBFT Target structure
199  *
200  */
201 struct ibft_target {
202         /** Common header */
203         struct ibft_header header;
204         /** IP address */
205         struct ibft_ipaddr ip_address;
206         /** TCP port */
207         uint16_t socket;
208         /** Boot LUN */
209         uint64_t boot_lun;
210         /** CHAP type
211          *
212          * This is an IBFT_CHAP_XXX constant.
213          */
214         uint8_t chap_type;
215         /** NIC association */
216         uint8_t nic_association;
217         /** Target name */
218         struct ibft_string target_name;
219         /** CHAP name */
220         struct ibft_string chap_name;
221         /** CHAP secret */
222         struct ibft_string chap_secret;
223         /** Reverse CHAP name */
224         struct ibft_string reverse_chap_name;
225         /** Reverse CHAP secret */
226         struct ibft_string reverse_chap_secret;
227 } __attribute__ (( packed ));
228
229 /** Structure ID for Target section */
230 #define IBFT_STRUCTURE_ID_TARGET 0x04
231
232 /** Target block valid */
233 #define IBFT_FL_TARGET_BLOCK_VALID 0x01
234
235 /** Target firmware boot selected */
236 #define IBFT_FL_TARGET_FIRMWARE_BOOT_SELECTED 0x02
237
238 /** Target use Radius CHAP */
239 #define IBFT_FL_TARGET_USE_CHAP 0x04
240
241 /** Target use Radius rCHAP */
242 #define IBFT_FL_TARGET_USE_RCHAP 0x08
243
244 /* Values for chap_type */
245 #define IBFT_CHAP_NONE          0       /**< No CHAP authentication */
246 #define IBFT_CHAP_ONE_WAY       1       /**< One-way CHAP */
247 #define IBFT_CHAP_MUTUAL        2       /**< Mutual CHAP */
248
249 /**
250  * iSCSI Boot Firmware Table (iBFT)
251  */
252 struct ibft_table {
253         /** ACPI header */
254         struct acpi_description_header acpi;
255         /** Reserved */
256         uint8_t reserved[12];
257         /** Control structure */
258         struct ibft_control control;
259 } __attribute__ (( packed ));
260
261 /**
262  * iSCSI string block descriptor
263  *
264  * This is an internal structure that we use to keep track of the
265  * allocation of string data.
266  */
267 struct ibft_string_block {
268         /** The iBFT containing these strings */
269         struct ibft_table *table;
270         /** Offset of first free byte within iBFT */
271         unsigned int offset;
272 };
273
274 /** Amount of space reserved for strings in a gPXE iBFT */
275 #define IBFT_STRINGS_SIZE 384
276
277 /**
278  * An iBFT created by gPXE
279  *
280  */
281 struct gpxe_ibft {
282         /** The fixed section */
283         struct ibft_table table;
284         /** The Initiator section */
285         struct ibft_initiator initiator __attribute__ (( aligned ( 16 ) ));
286         /** The NIC section */
287         struct ibft_nic nic __attribute__ (( aligned ( 16 ) ));
288         /** The Target section */
289         struct ibft_target target __attribute__ (( aligned ( 16 ) ));
290         /** Strings block */
291         char strings[IBFT_STRINGS_SIZE];
292 } __attribute__ (( packed, aligned ( 16 ) ));
293
294 struct net_device;
295 struct iscsi_session;
296
297 extern int ibft_fill_data ( struct net_device *netdev,
298                             struct iscsi_session *iscsi );
299
300 #endif /* _GPXE_IBFT_H */