Home | History | Annotate | Download | only in pxe
      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