#include <sys/cpu.h>
#include "pxe.h"
+int over_load;
+uint8_t uuid_type;
+char uuid[17];
void parse_dhcp_options(void *, int, int);
static void subnet_mask(void *data, int opt_len)
{
if (opt_len != 4)
return;
- Netmask = *(uint32_t *)data;
+ net_mask = *(uint32_t *)data;
}
static void router(void *data, int opt_len)
{
if (opt_len != 4)
return;
- Gateway = *(uint32_t *)data;
+ gate_way = *(uint32_t *)data;
}
static void dns_servers(void *data, int opt_len)
{
if (opt_len != 1)
return;
- OverLoad = *(uint8_t *)data;
+ over_load = *(uint8_t *)data;
}
if (opt_len != 4)
return;
- if (ServerIP)
+ if (server_ip)
return;
ip = *(uint32_t *)data;
if (ip_ok(ip))
- ServerIP = ip;
+ server_ip = ip;
}
static void client_identifier(void *data, int opt_len)
{
if (opt_len > MAC_MAX || opt_len < 2 ||
- MACLen != (opt_len >> 8) ||
- *(uint8_t *)data != MACType)
+ MAC_len != (opt_len >> 8) ||
+ *(uint8_t *)data != MAC_type)
return;
opt_len --;
- MACLen = opt_len & 0xff;
+ MAC_len = opt_len & 0xff;
memcpy(MAC, data+1, opt_len);
MAC[opt_len] = 0;
}
static void bootfile_name(void *data, int opt_len)
{
- strncpy(BootFile, data, opt_len);
- BootFile[opt_len] = 0;
+ strncpy(boot_file, data, opt_len);
+ boot_file[opt_len] = 0;
}
static void uuid_client_identifier(void *data, int opt_len)
{
int type = *(uint8_t *)data;
if (opt_len != 17 ||
- (type | HaveUUID))
+ (type | have_uuid))
return;
- HaveUUID = 1;
- UUIDType = type;
- memcpy(UUID, data+1, 16);
- UUID[16] = 0;
+ have_uuid = 1;
+ uuid_type = type;
+ memcpy(uuid, data+1, 16);
+ uuid[16] = 0;
}
static void pxelinux_configfile(void *data, int opt_len)
static void pxelinux_pathprefix(void *data,int opt_len)
{
DHCPMagic |= 4;
- strncpy(PathPrefix, data, opt_len);
- PathPrefix[opt_len] = 0;
+ strncpy(path_prefix, data, opt_len);
+ path_prefix[opt_len] = 0;
}
static void pxelinux_reboottime(void *data, int opt_len)
; information is present:
;
; MyIP - client IP address
- ; ServerIP - boot server IP address
- ; Netmask - network mask
- ; Gateway - default gateway router IP
- ; BootFile - boot file name
+ ; server_ip - boot server IP address
+ ; net_mask - network mask
+ ; gate_way - default gateway router IP
+ ; boot_file - boot file name
; DNSServers - DNS server IPs
; LocalDomain - Local domain name
- ; MACLen, MAC - Client identifier, if MACLen == 0
+ ; MAC_len, MAC - Client identifier, if MAC_len == 0
;
; This assumes the DHCP packet is in "trackbuf".
;
struct bootp_t *dhcp = (struct bootp_t *)trackbuf;
int opt_len;
- OverLoad = 0;
+ over_load = 0;
if (ip_ok(dhcp->yip))
MyIP = dhcp->yip;
if (ip_ok(dhcp->sip))
- ServerIP = dhcp->sip;
+ server_ip = dhcp->sip;
opt_len = (char *)dhcp + pkt_len - (char *)&dhcp->options;
if (opt_len && (dhcp->option_magic == BOOTP_OPTION_MAGIC))
parse_dhcp_options(&dhcp->options, opt_len, 0);
- if (OverLoad & 1)
+ if (over_load & 1)
parse_dhcp_options(&dhcp->bootfile, 128, 0);
else if (dhcp->bootfile[0])
- strcpy(BootFile, dhcp->bootfile);
+ strcpy(boot_file, dhcp->bootfile);
- if (OverLoad & 2)
+ if (over_load & 2)
parse_dhcp_options(dhcp->sname, 64, 0);
}
continue; /* just move on before runing the time out */
udp_write.status = 0;
udp_write.ip = srv;
- udp_write.gw = ((srv ^ MyIP) & Netmask) ? Gateway : 0;
+ udp_write.gw = ((srv ^ MyIP) & net_mask) ? gate_way : 0;
udp_write.src_port = DNS_LOCAL_PORT;
udp_write.dst_port = DNS_PORT;
udp_write.buffer_size = p - DNSSendBuf;
#define GPXE 1
-uint32_t ServerIP = 0; /* IP address of boot server */
-uint32_t Netmask = 0; /* Netmask of this subnet */
-uint32_t Gateway = 0; /* Default router */
-uint16_t ServerPort = TFTP_PORT; /* TFTP server port */
+uint32_t server_ip = 0; /* IP address of boot server */
+uint32_t net_mask = 0; /* net_mask of this subnet */
+uint32_t gate_way = 0; /* Default router */
+uint16_t server_port = TFTP_PORT; /* TFTP server port */
+uint16_t real_base_mem; /* Amount of DOS memory after freeing */
+
+char MAC_str[3 * (MAC_MAX + 1)]; /* MAC address as a string */
+char MAC[MAC_MAX + 1]; /* Actual MAC address */
+uint8_t MAC_len; /* MAC address len */
+uint8_t MAC_type; /* MAC address type */
+
+char boot_file[256];
+char path_prefix[256];
+char dot_quad_buf[16];
static struct open_file_t Files[MAX_OPEN];
static int has_gpxe;
static uint8_t uuid_dashes[] = {4, 2, 2, 2, 6, 0};
-int HaveUUID = 0;
+int have_uuid = 0;
const uint8_t TimeoutTable[] = {
2, 2, 3, 3, 4, 5, 6, 7, 9, 10, 12, 15, 18, 21, 26, 31, 37, 44, 53, 64, 77,
udp_write.src_port = file->tftp_localport;
udp_write.dst_port = file->tftp_remoteport;
udp_write.ip = file->tftp_remoteip;
- udp_write.gw = ((udp_write.ip ^ MyIP) & Netmask) ? Gateway : 0;
+ udp_write.gw = ((udp_write.ip ^ MyIP) & net_mask) ? gate_way : 0;
udp_write.buffer.offs = OFFS(ack_packet_buf);
udp_write.buffer.seg = SEG(ack_packet_buf);
udp_write.buffer_size = 4;
static void pxe_mangle_name(char *dst, const char *src)
{
const char *p = src;
- uint32_t ip = ServerIP;
+ uint32_t ip = server_ip;
int i = 0;
#if GPXE
p += 4;
if (ip == 0) {
/* Have prefix */
- strcpy(buf, PathPrefix);
- buf += strlen(PathPrefix);
- ip = ServerIP; /* Get the default server */
+ strcpy(buf, path_prefix);
+ buf += strlen(path_prefix);
+ ip = server_ip; /* Get the default server */
}
strcpy(buf, p); /* Copy the filename */
open_file->tftp_remoteip = ip;
tid = open_file->tftp_localport; /* TID(local port No) */
udp_write.ip = ip;
- udp_write.gw = ((udp_write.ip ^ MyIP) & Netmask) ? Gateway : 0;
+ udp_write.gw = ((udp_write.ip ^ MyIP) & net_mask) ? gate_way : 0;
udp_write.src_port = tid;
- udp_write.dst_port = ServerPort;
+ udp_write.dst_port = server_port;
buf += fill_tail(buf);
udp_write.buffer_size = buf - packet_buf;
err = pxe_call(PXENV_UDP_WRITE, &udp_write);
if (DHCPMagic & 0x04) /* Did we get a path prefix option */
goto got_prefix;
- strcpy(PathPrefix, BootFile);
- len = strlen(PathPrefix);
- p = &PathPrefix[len - 1];
+ strcpy(path_prefix, boot_file);
+ len = strlen(path_prefix);
+ p = &path_prefix[len - 1];
while (len--) {
c = *p--;
*(p + 2) = 0; /* Zero-terminate after delimiter */
got_prefix:
- printf("TFTP prefix: %s\n", PathPrefix);
- strcpy(CurrentDirName, PathPrefix);
+ printf("TFTP prefix: %s\n", path_prefix);
+ strcpy(CurrentDirName, path_prefix);
}
/*
*/
/* Try loading by UUID */
- if (HaveUUID) {
+ if (have_uuid) {
uuid_ptr = uuid_dashes;
p = config_file;
while (*uuid_ptr) {
int len = *uuid_ptr;
- char *src = UUID;
+ char *src = uuid;
lchexbytes(p, src, len);
p += len * 2;
}
/* Try loading by MAC address */
- strcpy(config_file, MACStr);
+ strcpy(config_file, MAC_str);
regs->edi.w[0] = OFFS_WRT(ConfigName, 0);
if (try_load(regs))
return;
*/
static void make_bootif_string(void)
{
- char *bootif_str = "BOOTIF=";
- uint8_t *src = &MACType; /* MACType just followed by MAC */
- char *dst;
- int i = MACLen + 1; /* MACType included */
-
- strcpy(BOOTIFStr, bootif_str);
- dst = strchr(BOOTIFStr, '\0');
+ char mac[18];
+ char *src = mac;
+ char *dst = MAC_str;
+ int i = MAC_len + 1;
+
+ *(uint8_t *)src++ = MAC_type;
+ memcpy(src, MAC, MAC_len);
+ src = mac;
for (; i > 0; i--) {
lchexbytes(dst, src, 1);
dst += 2;
*dst++ = '-';
}
*(dst - 1) = 0; /* Drop the last '-' and null-terminate string */
+ strcat(BOOTIFStr, "BOOTIF=");
+ strcat(BOOTIFStr, MAC_str);
#if 0
printf("%s\n", BOOTIFStr);
p += ip_len;
*p++ = ':';
- ip_len = gendotquad(p, ServerIP);
+ ip_len = gendotquad(p, server_ip);
p += ip_len;
*p++ = ':';
- ip_len = gendotquad(p, Gateway);
+ ip_len = gendotquad(p, gate_way);
p += ip_len;
*p++ = ':';
- ip_len = gendotquad(p, Netmask);
+ ip_len = gendotquad(p, net_mask);
}
/* Generate ip= option and print the ip adress */
static void ip_init(void)
{
- int ip = MyIP;
- char *myipaddr_msg = "My IP address seems to be ";
-
+ uint32_t ip = MyIP;
+
genipopt();
-
- gendotquad(DotQuadBuf, ip);
+ gendotquad(dot_quad_buf, ip);
ip = ntohl(ip);
- printf("%s %08X %s\n", myipaddr_msg, ip, DotQuadBuf);
-
+ printf("My IP address seems to be %08X %s\n", ip, dot_quad_buf);
printf("%s\n", IPOption);
}
code_seg = code_seg + ((code_len + 15) >> 4);
data_seg = data_seg + ((data_len + 15) >> 4);
- RealBaseMem = max(code_seg,data_seg) >> 6; /* Convert to kilobytes */
+ real_base_mem = max(code_seg,data_seg) >> 6; /* Convert to kilobytes */
}
/*
* turns out to be problematic it might be better getting it from
* the query info 1 packet
*/
- MACLen = bp->hardlen > 16 ? 0 : bp->hardlen;
- MACType = bp->hardware;
- memcpy(MAC, bp->macaddr, MACLen);
+ MAC_len = bp->hardlen > 16 ? 0 : bp->hardlen;
+ MAC_type = bp->hardware;
+ memcpy(MAC, bp->macaddr, MAC_len);
/*
* Get the boot file and other info. This lives in the CACHED_REPLY
}
flag = 0xff00;
- if (RealBaseMem <= BIOS_fbm) /* Santiy check */
+ if (real_base_mem <= BIOS_fbm) /* Santiy check */
goto cant_free;
flag ++;
/* Check that PXE actually unhooked the INT 0x1A chain */
int_addr = (int)MK_PTR(*(uint16_t *)(4*0x1a+2), *(uint16_t *)(4*0x1a));
int_addr >>= 10;
- if (int_addr >= RealBaseMem || int_addr < BIOS_fbm) {
- BIOS_fbm = RealBaseMem;
+ if (int_addr >= real_base_mem || int_addr < BIOS_fbm) {
+ BIOS_fbm = real_base_mem;
return;
}
} __attribute__ ((packed));
/*
+ * Variable externs
+ */
+extern uint32_t server_ip;
+extern uint32_t MyIP;
+extern uint32_t net_mask;
+extern uint32_t gate_way;
+extern uint16_t server_port;
+
+extern char MAC_str[];
+extern char MAC[];
+extern char BOOTIFStr[];
+extern uint8_t MAC_len;
+extern uint8_t MAC_type;
+
+extern uint8_t DHCPMagic;
+extern uint32_t RebootTime;
+
+extern char boot_file[];
+extern char path_prefix[];
+extern char LocalDomain[];
+
+extern char packet_buf[];
+
+extern char IPOption[];
+extern char dot_quad_buf[];
+
+extern uint32_t dns_server[];
+extern char DNSSendBuf[];
+extern char DNSRecvBuf[];
+
+extern uint16_t real_base_mem;
+extern uint16_t APIVer;
+extern far_ptr_t PXEEntry;
+extern uint8_t KeepPXE;
+
+extern far_ptr_t InitStack;
+
+extern int have_uuid;
+extern uint8_t uuid_type;
+extern char uuid[];
+
+extern volatile uint16_t BIOS_timer;
+extern uint16_t BIOS_fbm;
+extern const uint8_t TimeoutTable[];
+
+
+/*
* functions
*/
__noreturn _kaboom(void);
#define kaboom() _kaboom()
-/*
- * externs for pxelinux
- */
-extern uint32_t ServerIP;
-extern uint32_t MyIP;
-extern uint32_t Netmask;
-extern uint32_t Gateway;
-extern uint16_t ServerPort;
-
-extern char MACStr[]; /* MAC address as a string */
-extern char MAC[]; /* Actual MAC address */
-extern char BOOTIFStr[]; /* Space for "BOOTIF=" */
-extern uint8_t MACLen; /* MAC address len */
-extern uint8_t MACType; /* MAC address type */
-
-extern uint8_t DHCPMagic;
-extern uint8_t OverLoad;
-extern uint32_t RebootTime;
-
-extern char BootFile[];
-extern char PathPrefix[];
-extern char LocalDomain[];
-
-extern char packet_buf[];
-
-extern char IPOption[];
-extern char DotQuadBuf[];
-
-extern uint32_t dns_server[];
-extern char DNSSendBuf[];
-extern char DNSRecvBuf[];
-
-extern uint16_t RealBaseMem;
-extern uint16_t APIVer;
-extern far_ptr_t PXEEntry;
-extern uint8_t KeepPXE;
-
-extern far_ptr_t InitStack;
-
-extern int HaveUUID;
-extern uint8_t UUIDType;
-extern char UUID[];
-
-extern volatile uint16_t BIOS_timer;
-extern uint16_t BIOS_fbm;
-extern const uint8_t TimeoutTable[];
#endif /* CORE_H */
SECTOR_SIZE equ TFTP_BLOCKSIZE
;
-; TFTP operation codes
-;
-TFTP_ACK equ htons(4) ; ACK packet
-TFTP_ERROR equ htons(5) ; ERROR packet
-
-;
-; TFTP error codes
-;
-TFTP_EOPTNEG equ htons(8) ; Option negotiation failure
-
-;
; The following structure is used for "virtual kernels"; i.e. LILO-style
; option labels. The options we permit here are `kernel' and `append
; Since there is no room in the bottom 64K for all of these, we
section .bss16
alignb FILENAME_MAX
- global BootFile, PathPrefix, DotQuadBuf, IPOption
-BootFile resb 256 ; Boot file from DHCP packet
-PathPrefix resb 256 ; Path prefix derived from boot file
-DotQuadBuf resb 16 ; Buffer for dotted-quad IP address
+ global IPOption
IPOption resb 80 ; ip= option buffer
PXEStack resd 1 ; Saved stack during PXE call
alignb 4
- global DHCPMagic, OverLoad, RebootTime, APIVer, RealBaseMem
- global StructPtr
+ global DHCPMagic, RebootTime, APIVer
RebootTime resd 1 ; Reboot timeout, if set by option
StrucPtr resw 2 ; Pointer to PXENV+ or !PXE structure
APIVer resw 1 ; PXE API version found
LocalBootType resw 1 ; Local boot return code
-RealBaseMem resw 1 ; Amount of DOS memory after freeing
-OverLoad resb 1 ; Set if DHCP packet uses "overloading"
DHCPMagic resb 1 ; PXELINUX magic flags
; The relative position of these fields matter!
- global MACStr, MACLen, MACType, MAC, BOOTIFStr
-MAC_MAX equ 32 ; Handle hardware addresses this long
-MACLen resb 1 ; MAC address len
-MACType resb 1 ; MAC address type
-MAC resb MAC_MAX+1 ; Actual MAC address
+ global BOOTIFStr
BOOTIFStr resb 7 ; Space for "BOOTIF="
-MACStr resb 3*(MAC_MAX+1) ; MAC address as a string
-
-; The relative position of these fields matter!
- global UUID, UUIDType
-UUIDType resb 1 ; Type byte from DHCP option
-UUID resb 16 ; UUID, from the PXE stack
-UUIDNull resb 1 ; dhcp_copyoption zero-terminates
-
section .bss16
global packet_buf
db ' H. Peter Anvin et al', CR, LF, 0
err_bootfailed db CR, LF, 'Boot failed: press a key to retry, or wait for reset...', CR, LF, 0
bailmsg equ err_bootfailed
-cant_free_msg db 'Failed to free base memory, error ', 0
localboot_msg db 'Booting from local disk...', CR, LF, 0
syslinux_banner db CR, LF, 'PXELINUX ', VERSION_STR, ' ', DATE_STR, ' ', 0