1 /* ----------------------------------------------------------------------- 2 * 3 * Copyright 1999-2008 H. Peter Anvin - All Rights Reserved 4 * Copyright 2009-2011 Intel Corporation; author: H. Peter Anvin 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation, Inc., 53 Temple Place Ste 330, 9 * Boston MA 02111-1307, USA; either version 2 of the License, or 10 * (at your option) any later version; incorporated herein by reference. 11 * 12 * ----------------------------------------------------------------------- */ 13 14 /* 15 * pxe.h 16 * 17 * PXE opcodes 18 * 19 */ 20 #ifndef PXE_H 21 #define PXE_H 22 23 #include <syslinux/pxe_api.h> 24 #include <syslinux/config.h> 25 #include <fcntl.h> /* For OK_FLAGS_MASK */ 26 #include "fs.h" /* Mostly for FILENAME_MAX */ 27 28 /* 29 * Some basic defines... 30 */ 31 #define PKTBUF_SIZE 2048 /* Used mostly by the gPXE backend */ 32 33 #define is_digit(c) (((c) >= '0') && ((c) <= '9')) 34 35 #define BOOTP_OPTION_MAGIC htonl(0x63825363) 36 #define MAC_MAX 32 37 38 /* 39 * structures 40 */ 41 struct pxenv_t { 42 uint8_t signature[6]; /* PXENV+ */ 43 uint16_t version; 44 uint8_t length; 45 uint8_t checksum; 46 segoff16_t rmentry; 47 uint32_t pmoffset; 48 uint16_t pmselector; 49 uint16_t stackseg; 50 uint16_t stacksize; 51 uint16_t bc_codeseg; 52 uint16_t bc_codesize; 53 uint16_t bc_dataseg; 54 uint16_t bc_datasize; 55 uint16_t undidataseg; 56 uint16_t undidatasize; 57 uint16_t undicodeseg; 58 uint16_t undicodesize; 59 segoff16_t pxeptr; 60 } __packed; 61 62 struct pxe_t { 63 uint8_t signature[4]; /* !PXE */ 64 uint8_t structlength; 65 uint8_t structcksum; 66 uint8_t structrev; 67 uint8_t _pad1; 68 segoff16_t undiromid; 69 segoff16_t baseromid; 70 segoff16_t entrypointsp; 71 segoff16_t entrypointesp; 72 segoff16_t statuscallout; 73 uint8_t _pad2; 74 uint8_t segdesccnt; 75 uint16_t firstselector; 76 pxe_segdesc_t seg[7]; 77 } __packed; 78 79 enum pxe_segments { 80 PXE_Seg_Stack = 0, 81 PXE_Seg_UNDIData = 1, 82 PXE_Seg_UNDICode = 2, 83 PXE_Seg_UNDICodeWrite = 3, 84 PXE_Seg_BC_Data = 4, 85 PXE_Seg_BC_Code = 5, 86 PXE_Seg_BC_CodeWrite = 6 87 }; 88 89 struct bootp_t { 90 uint8_t opcode; /* BOOTP/DHCP "opcode" */ 91 uint8_t hardware; /* ARP hreadware type */ 92 uint8_t hardlen; /* Hardware address length */ 93 uint8_t gatehops; /* Used by forwarders */ 94 uint32_t ident; /* Transaction ID */ 95 uint16_t seconds; /* Seconds elapsed */ 96 uint16_t flags; /* Broadcast flags */ 97 uint32_t cip; /* Cient IP */ 98 uint32_t yip; /* "Your" IP */ 99 uint32_t sip; /* Next Server IP */ 100 uint32_t gip; /* Relay agent IP */ 101 uint8_t macaddr[16]; /* Client MAC address */ 102 uint8_t sname[64]; /* Server name (optional) */ 103 char bootfile[128]; /* Boot file name */ 104 uint32_t option_magic; /* Vendor option magic cookie */ 105 uint8_t options[1260]; /* Vendor options */ 106 } __attribute__ ((packed)); 107 108 struct netconn; 109 struct netbuf; 110 struct efi_binding; 111 112 /* 113 * Our inode private information -- this includes the packet buffer! 114 */ 115 struct pxe_conn_ops { 116 void (*fill_buffer)(struct inode *inode); 117 void (*close)(struct inode *inode); 118 int (*readdir)(struct inode *inode, struct dirent *dirent); 119 }; 120 121 union net_private { 122 struct net_private_lwip { 123 struct netconn *conn; /* lwip network connection */ 124 struct netbuf *buf; /* lwip cached buffer */ 125 } lwip; 126 struct net_private_tftp { 127 uint32_t remoteip; /* Remote IP address (0 = disconnected) */ 128 uint16_t localport; /* Local port number (0=not in use) */ 129 } tftp; 130 struct net_private_efi { 131 struct efi_binding *binding; /* EFI binding for protocol */ 132 uint16_t localport; /* Local port number (0=not in use) */ 133 } efi; 134 }; 135 136 struct pxe_pvt_inode { 137 union net_private net; /* Network stack private data */ 138 uint16_t tftp_remoteport; /* Remote port number */ 139 uint32_t tftp_filepos; /* bytes downloaded (including buffer) */ 140 uint32_t tftp_blksize; /* Block size for this connection(*) */ 141 uint16_t tftp_bytesleft; /* Unclaimed data bytes */ 142 uint16_t tftp_lastpkt; /* Sequence number of last packet (HBO) */ 143 char *tftp_dataptr; /* Pointer to available data */ 144 uint8_t tftp_goteof; /* 1 if the EOF packet received */ 145 uint8_t tftp_unused[3]; /* Currently unused */ 146 char *tftp_pktbuf; /* Packet buffer */ 147 struct inode *ctl; /* Control connection (for FTP) */ 148 const struct pxe_conn_ops *ops; 149 }; 150 151 #define PVT(i) ((struct pxe_pvt_inode *)((i)->pvt)) 152 153 /* 154 * Variable externs 155 */ 156 extern struct syslinux_ipinfo IPInfo; 157 158 extern t_PXENV_UNDI_GET_INFORMATION pxe_undi_info; 159 extern t_PXENV_UNDI_GET_IFACE_INFO pxe_undi_iface; 160 161 extern uint8_t MAC[]; 162 extern char BOOTIFStr[]; 163 extern uint8_t MAC_len; 164 extern uint8_t MAC_type; 165 166 extern uint8_t DHCPMagic; 167 extern uint32_t RebootTime; 168 169 extern char boot_file[]; 170 extern char path_prefix[]; 171 extern char LocalDomain[]; 172 173 extern uint32_t dns_server[]; 174 175 extern uint16_t APIVer; 176 extern far_ptr_t PXEEntry; 177 extern uint8_t KeepPXE; 178 179 extern far_ptr_t InitStack; 180 181 extern bool have_uuid; 182 extern uint8_t uuid_type; 183 extern uint8_t uuid[]; 184 185 struct url_info; 186 struct url_scheme { 187 const char *name; 188 void (*open)(struct url_info *, int, struct inode *, const char **); 189 int ok_flags; 190 }; 191 /* Flags which can be specified in url_scheme.ok_flags */ 192 #define OK_FLAGS_MASK (O_DIRECTORY|O_WRONLY) 193 194 extern const struct url_scheme url_schemes[]; 195 196 /* 197 * Compute the suitable gateway for a specific route -- too many 198 * vendor PXE stacks don't do this correctly... 199 */ 200 static inline uint32_t gateway(uint32_t ip) 201 { 202 if ((ip ^ IPInfo.myip) & IPInfo.netmask) 203 return IPInfo.gateway; 204 else 205 return 0; 206 } 207 208 /* 209 * functions 210 */ 211 212 /* pxeisr.inc */ 213 extern uint8_t pxe_irq_vector; 214 extern void pxe_isr(void); 215 extern far_ptr_t pxe_irq_chain; 216 extern void pxe_poll(void); 217 218 /* isr.c */ 219 void pxe_init_isr(void); 220 void pxe_start_isr(void); 221 int reset_pxe(void); 222 223 /* pxe.c */ 224 struct url_info; 225 bool ip_ok(uint32_t); 226 int pxe_getc(struct inode *inode); 227 void free_socket(struct inode *inode); 228 229 /* undiif.c */ 230 int undiif_start(uint32_t ip, uint32_t netmask, uint32_t gw); 231 void undiif_input(t_PXENV_UNDI_ISR *isr); 232 233 /* dhcp_options.c */ 234 void parse_dhcp_options(const void *, int, uint8_t); 235 void parse_dhcp(const void *, size_t); 236 237 /* idle.c */ 238 void pxe_idle_init(void); 239 void pxe_idle_cleanup(void); 240 241 /* tftp.c */ 242 void tftp_open(struct url_info *url, int flags, struct inode *inode, 243 const char **redir); 244 245 /* gpxeurl.c */ 246 void gpxe_open(struct inode *inode, const char *url); 247 #define GPXE 0 248 249 /* http.c */ 250 void http_open(struct url_info *url, int flags, struct inode *inode, 251 const char **redir); 252 253 /* http_readdir.c */ 254 int http_readdir(struct inode *inode, struct dirent *dirent); 255 256 /* ftp.c */ 257 void ftp_open(struct url_info *url, int flags, struct inode *inode, 258 const char **redir); 259 260 /* ftp_readdir.c */ 261 int ftp_readdir(struct inode *inode, struct dirent *dirent); 262 263 /* tcp.c */ 264 const struct pxe_conn_ops tcp_conn_ops; 265 266 extern void gpxe_init(void); 267 extern int pxe_init(bool quiet); 268 269 #endif /* pxe.h */ 270