svn commit: r245906 - in user/sbruno/head_146698: lib/libstand sys/boot/i386 sys/boot/i386/libi386 sys/boot/i386/loader sys/boot/i386/pxe_http
Sean Bruno
sbruno at FreeBSD.org
Fri Jan 25 14:33:20 UTC 2013
Author: sbruno
Date: Fri Jan 25 14:33:19 2013
New Revision: 245906
URL: http://svnweb.freebsd.org/changeset/base/245906
Log:
Massage the pxe_http soc2007 code drop release tar ball into this 6current
tree that approximates the state of the tree at the time of release.
Everything compiles but nothing actually works. Typical.
Added:
user/sbruno/head_146698/sys/boot/i386/pxe_http/
user/sbruno/head_146698/sys/boot/i386/pxe_http/Makefile
user/sbruno/head_146698/sys/boot/i386/pxe_http/README
user/sbruno/head_146698/sys/boot/i386/pxe_http/httpfs.c
user/sbruno/head_146698/sys/boot/i386/pxe_http/httpfs.h
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_arp.c
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_arp.h
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_await.c
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_await.h
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_buffer.c
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_buffer.h
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_connection.c
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_connection.h
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_core.c
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_core.h
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_dhcp.c
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_dhcp.h
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_dns.c
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_dns.h
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_filter.c
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_filter.h
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_http.c
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_http.h
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_icmp.c
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_icmp.h
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_ip.c
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_ip.h
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_isr.S
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_isr.h
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_mem.c
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_mem.h
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_segment.c
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_segment.h
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_sock.c
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_sock.h
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_tcp.c
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_tcp.h
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_udp.c
user/sbruno/head_146698/sys/boot/i386/pxe_http/pxe_udp.h
Modified:
user/sbruno/head_146698/lib/libstand/printf.c
user/sbruno/head_146698/lib/libstand/stand.h
user/sbruno/head_146698/sys/boot/i386/Makefile
user/sbruno/head_146698/sys/boot/i386/libi386/Makefile
user/sbruno/head_146698/sys/boot/i386/libi386/pxe.c
user/sbruno/head_146698/sys/boot/i386/libi386/pxe.h
user/sbruno/head_146698/sys/boot/i386/loader/Makefile
user/sbruno/head_146698/sys/boot/i386/loader/conf.c
user/sbruno/head_146698/sys/boot/i386/loader/main.c
Modified: user/sbruno/head_146698/lib/libstand/printf.c
==============================================================================
--- user/sbruno/head_146698/lib/libstand/printf.c Fri Jan 25 11:52:56 2013 (r245905)
+++ user/sbruno/head_146698/lib/libstand/printf.c Fri Jan 25 14:33:19 2013 (r245906)
@@ -61,7 +61,7 @@ __FBSDID("$FreeBSD$");
#define MAXNBUF (sizeof(intmax_t) * CHAR_BIT + 1)
static char *ksprintn (char *buf, uintmax_t num, int base, int *len);
-static int kvprintf(char const *fmt, void (*func)(int), void *arg, int radix, va_list ap);
+static int kvprintf(char const *fmt, void (*func)(int), void *arg, int radix, size_t size, va_list ap);
int
printf(const char *fmt, ...)
@@ -70,7 +70,7 @@ printf(const char *fmt, ...)
int retval;
va_start(ap, fmt);
- retval = kvprintf(fmt, putchar, NULL, 10, ap);
+ retval = kvprintf(fmt, putchar, NULL, 10, 0, ap);
va_end(ap);
return retval;
}
@@ -79,7 +79,7 @@ void
vprintf(const char *fmt, va_list ap)
{
- kvprintf(fmt, putchar, NULL, 10, ap);
+ kvprintf(fmt, putchar, NULL, 10, 0, ap);
}
int
@@ -89,18 +89,42 @@ sprintf(char *buf, const char *cfmt, ...
va_list ap;
va_start(ap, cfmt);
- retval = kvprintf(cfmt, NULL, (void *)buf, 10, ap);
+ retval = kvprintf(cfmt, NULL, (void *)buf, 10, 0, ap);
buf[retval] = '\0';
va_end(ap);
return retval;
}
+int
+snprintf(char *buf, size_t size, const char *cfmt, ...)
+{
+ int retval;
+ va_list ap;
+ size_t maxsize = (size > 1) ? size - 1 : 0;
+
+ if (maxsize == 0) {
+ buf[0] = '\0';
+ return (0);
+ }
+
+ va_start(ap, cfmt);
+ retval = kvprintf(cfmt, NULL, (void *)buf, 10, maxsize, ap);
+
+ if (retval < maxsize)
+ buf[retval] = '\0';
+ else
+ buf[maxsize] = '\0';
+
+ va_end(ap);
+ return retval;
+}
+
void
vsprintf(char *buf, const char *cfmt, va_list ap)
{
int retval;
- retval = kvprintf(cfmt, NULL, (void *)buf, 10, ap);
+ retval = kvprintf(cfmt, NULL, (void *)buf, 10, 0, ap);
buf[retval] = '\0';
}
@@ -152,9 +176,11 @@ ksprintn(char *nbuf, uintmax_t num, int
* ("%*D", len, ptr, " " -> XX XX XX XX ...
*/
static int
-kvprintf(char const *fmt, void (*func)(int), void *arg, int radix, va_list ap)
+kvprintf(char const *fmt, void (*func)(int), void *arg, int radix, size_t maxsize, va_list ap)
{
-#define PCHAR(c) {int cc=(c); if (func) (*func)(cc); else *d++ = cc; retval++; }
+#define PCHAR(c) { int cc=(c); if (func) (*func)(cc); else *d++ = cc; retval++; \
+ if (maxsize && (retval == maxsize)) return (retval); \
+ }
char nbuf[MAXNBUF];
char *d;
const char *p, *percent, *q;
Modified: user/sbruno/head_146698/lib/libstand/stand.h
==============================================================================
--- user/sbruno/head_146698/lib/libstand/stand.h Fri Jan 25 11:52:56 2013 (r245905)
+++ user/sbruno/head_146698/lib/libstand/stand.h Fri Jan 25 14:33:19 2013 (r245906)
@@ -250,6 +250,7 @@ extern char *getdisklabel(const char *,
extern int printf(const char *fmt, ...) __printflike(1, 2);
extern void vprintf(const char *fmt, __va_list);
extern int sprintf(char *buf, const char *cfmt, ...) __printflike(2, 3);
+extern int snprintf(char *buf, size_t size, const char *cfmt, ...) __printflike(3, 4);
extern void vsprintf(char *buf, const char *cfmt, __va_list);
extern void twiddle(void);
Modified: user/sbruno/head_146698/sys/boot/i386/Makefile
==============================================================================
--- user/sbruno/head_146698/sys/boot/i386/Makefile Fri Jan 25 11:52:56 2013 (r245905)
+++ user/sbruno/head_146698/sys/boot/i386/Makefile Fri Jan 25 14:33:19 2013 (r245906)
@@ -1,6 +1,6 @@
# $FreeBSD$
-SUBDIR= mbr boot0 boot0sio btx boot2 cdboot kgzldr libi386 loader
+SUBDIR= mbr boot0 boot0sio btx boot2 cdboot kgzldr pxe_http libi386 loader
# special boot programs, 'self-extracting boot2+loader'
SUBDIR+= pxeldr
Modified: user/sbruno/head_146698/sys/boot/i386/libi386/Makefile
==============================================================================
--- user/sbruno/head_146698/sys/boot/i386/libi386/Makefile Fri Jan 25 11:52:56 2013 (r245905)
+++ user/sbruno/head_146698/sys/boot/i386/libi386/Makefile Fri Jan 25 14:33:19 2013 (r245906)
@@ -7,7 +7,7 @@ SRCS= biosacpi.c bioscd.c biosdisk.c bio
biospci.c biossmap.c bootinfo.c bootinfo32.c bootinfo64.c \
comconsole.c devicename.c elf32_freebsd.c \
elf64_freebsd.c gatea20.c \
- i386_copy.c i386_module.c nullconsole.c pxe.c pxetramp.s \
+ i386_copy.c i386_module.c nullconsole.c pxe.c \
time.c vidconsole.c amd64_tramp.S
BOOT_COMCONSOLE_PORT?= 0x3f8
@@ -23,10 +23,14 @@ CFLAGS+= -DDISK_DEBUG
# Include simple terminal emulation (cons25-compatible)
CFLAGS+= -DTERM_EMU
+CDLAGS+= -DPXE_DEBUG
+
+# allow pxe_http perform udpread/udpwrite
+CFLAGS+= -DPXEHTTP_UDP_FOR_LIBSTAND
CFLAGS+= -I${.CURDIR}/../../common -I${.CURDIR}/../btx/lib \
-I${.CURDIR}/../../../contrib/dev/acpica \
- -I${.CURDIR}/../../.. -I.
+ -I${.CURDIR}/../../.. -I. -I${.CURDIR}/../pxe_http/
# the location of libstand
CFLAGS+= -I${.CURDIR}/../../../../lib/libstand/
Modified: user/sbruno/head_146698/sys/boot/i386/libi386/pxe.c
==============================================================================
--- user/sbruno/head_146698/sys/boot/i386/libi386/pxe.c Fri Jan 25 11:52:56 2013 (r245905)
+++ user/sbruno/head_146698/sys/boot/i386/libi386/pxe.c Fri Jan 25 14:33:19 2013 (r245906)
@@ -39,67 +39,61 @@ __FBSDID("$FreeBSD$");
#include <net.h>
#include <netif.h>
+#ifdef LOADER_NFS_SUPPORT
#include <nfsv2.h>
+#endif
#include <iodesc.h>
#include <bootp.h>
#include <bootstrap.h>
#include "btxv86.h"
#include "pxe.h"
+#include "pxe_core.h"
+#include "pxe_dhcp.h"
+#include "pxe_isr.h"
+#include "pxe_ip.h"
+#include "pxe_udp.h"
-/*
- * Allocate the PXE buffers statically instead of sticking grimy fingers into
- * BTX's private data area. The scratch buffer is used to send information to
- * the PXE BIOS, and the data buffer is used to receive data from the PXE BIOS.
- */
-#define PXE_BUFFER_SIZE 0x2000
#define PXE_TFTP_BUFFER_SIZE 512
-static char scratch_buffer[PXE_BUFFER_SIZE];
-static char data_buffer[PXE_BUFFER_SIZE];
+#ifndef PXEHTTP_UDP_FOR_LIBSTAND
+extern uint8_t *scratch_buffer;
+extern uint8_t *data_buffer;
+#endif
+
+extern char servername[256];
static pxenv_t *pxenv_p = NULL; /* PXENV+ */
static pxe_t *pxe_p = NULL; /* !PXE */
-static BOOTPLAYER bootplayer; /* PXE Cached information. */
-static int pxe_debug = 0;
-static int pxe_sock = -1;
+int pxe_sock = -1;
static int pxe_opens = 0;
void pxe_enable(void *pxeinfo);
-static void (*pxe_call)(int func);
-static void pxenv_call(int func);
-static void bangpxe_call(int func);
static int pxe_init(void);
static int pxe_strategy(void *devdata, int flag, daddr_t dblk,
size_t size, char *buf, size_t *rsize);
+
static int pxe_open(struct open_file *f, ...);
static int pxe_close(struct open_file *f);
-static void pxe_print(int verbose);
static void pxe_cleanup(void);
-static void pxe_setnfshandle(char *rootpath);
+static void pxe_print(int verbose);
-static void pxe_perror(int error);
static int pxe_netif_match(struct netif *nif, void *machdep_hint);
static int pxe_netif_probe(struct netif *nif, void *machdep_hint);
static void pxe_netif_init(struct iodesc *desc, void *machdep_hint);
static int pxe_netif_get(struct iodesc *desc, void *pkt, size_t len,
time_t timeout);
+
static int pxe_netif_put(struct iodesc *desc, void *pkt, size_t len);
static void pxe_netif_end(struct netif *nif);
-extern struct netif_stats pxe_st[];
-extern u_int16_t __bangpxeseg;
-extern u_int16_t __bangpxeoff;
-extern void __bangpxeentry(void);
-extern u_int16_t __pxenvseg;
-extern u_int16_t __pxenvoff;
-extern void __pxenventry(void);
-
-struct netif_dif pxe_ifs[] = {
-/* dif_unit dif_nsel dif_stats dif_private */
- {0, 1, &pxe_st[0], 0}
-};
+extern struct netif_stats pxe_st[];
+
+struct netif_dif pxe_ifs[] = {
+ /* dif_unit dif_nsel dif_stats dif_private */
+ {0, 1, &pxe_st[0], 0}
+ };
struct netif_stats pxe_st[NENTS(pxe_ifs)];
@@ -132,277 +126,229 @@ struct devsw pxedisk = {
pxe_cleanup
};
-/*
- * This function is called by the loader to enable PXE support if we
- * are booted by PXE. The passed in pointer is a pointer to the
- * PXENV+ structure.
+/* pxe_enable() - This function is called by the loader to enable PXE support
+ * if we are booted by PXE.
+ * in:
+ * pxeinfo - pointer is a pointer to the PXENV+ structure.
+ * out:
+ * none
*/
void
pxe_enable(void *pxeinfo)
{
+
pxenv_p = (pxenv_t *)pxeinfo;
pxe_p = (pxe_t *)PTOV(pxenv_p->PXEPtr.segment * 16 +
pxenv_p->PXEPtr.offset);
- pxe_call = NULL;
}
-/*
- * return true if pxe structures are found/initialized,
- * also figures out our IP information via the pxe cached info struct
+/* pxe_init() - inits pxe_core structs
+ * in:
+ * none
+ * out:
+ * 2 - already initialized
+ * 1 - if pxe structures are found & initialized
+ * 0 - failed
*/
static int
pxe_init(void)
{
- t_PXENV_GET_CACHED_INFO *gci_p;
- int counter;
- uint8_t checksum;
- uint8_t *checkptr;
-
- if(pxenv_p == NULL)
- return (0);
-
- /* look for "PXENV+" */
- if (bcmp((void *)pxenv_p->Signature, S_SIZE("PXENV+"))) {
- pxenv_p = NULL;
- return (0);
- }
-
- /* make sure the size is something we can handle */
- if (pxenv_p->Length > sizeof(*pxenv_p)) {
- printf("PXENV+ structure too large, ignoring\n");
- pxenv_p = NULL;
- return (0);
- }
-
- /*
- * do byte checksum:
- * add up each byte in the structure, the total should be 0
- */
- checksum = 0;
- checkptr = (uint8_t *) pxenv_p;
- for (counter = 0; counter < pxenv_p->Length; counter++)
- checksum += *checkptr++;
- if (checksum != 0) {
- printf("PXENV+ structure failed checksum, ignoring\n");
- pxenv_p = NULL;
- return (0);
- }
-
- /*
- * PXENV+ passed, so use that if !PXE is not available or
- * the checksum fails.
- */
- pxe_call = pxenv_call;
- if (pxenv_p->Version >= 0x0200) {
- for (;;) {
- if (bcmp((void *)pxe_p->Signature, S_SIZE("!PXE"))) {
- pxe_p = NULL;
- break;
- }
- checksum = 0;
- checkptr = (uint8_t *)pxe_p;
- for (counter = 0; counter < pxe_p->StructLength;
- counter++)
- checksum += *checkptr++;
- if (checksum != 0) {
- pxe_p = NULL;
- break;
- }
- pxe_call = bangpxe_call;
- break;
- }
- }
-
- printf("\nPXE version %d.%d, real mode entry point ",
- (uint8_t) (pxenv_p->Version >> 8),
- (uint8_t) (pxenv_p->Version & 0xFF));
- if (pxe_call == bangpxe_call)
- printf("@%04x:%04x\n",
- pxe_p->EntryPointSP.segment,
- pxe_p->EntryPointSP.offset);
- else
- printf("@%04x:%04x\n",
- pxenv_p->RMEntry.segment, pxenv_p->RMEntry.offset);
-
- gci_p = (t_PXENV_GET_CACHED_INFO *) scratch_buffer;
- bzero(gci_p, sizeof(*gci_p));
- gci_p->PacketType = PXENV_PACKET_TYPE_BINL_REPLY;
- pxe_call(PXENV_GET_CACHED_INFO);
- if (gci_p->Status != 0) {
- pxe_perror(gci_p->Status);
- pxe_p = NULL;
- return (0);
- }
- bcopy(PTOV((gci_p->Buffer.segment << 4) + gci_p->Buffer.offset),
- &bootplayer, gci_p->BufferSize);
- return (1);
+ if (__pxe_nic_irq != 0)
+ return (2);
+
+ return pxe_core_init(pxenv_p, pxe_p);
}
-
+/* block device strategy function */
static int
pxe_strategy(void *devdata, int flag, daddr_t dblk, size_t size,
char *buf, size_t *rsize)
{
+
return (EIO);
}
+static void
+pxe_print(int verbose)
+{
+ printf(" pxenet0: MAC %6D\n", pxe_get_mymac(), ":");
+ printf(" ISR: at %x:%x (chained at: %x:%x)\n",
+ __pxe_entry_seg, __pxe_entry_off,
+ __chained_irq_seg, __chained_irq_off);
+
+ return;
+}
+
static int
pxe_open(struct open_file *f, ...)
{
- va_list args;
- char *devname; /* Device part of file name (or NULL). */
- char temp[FNAME_SIZE];
- int error = 0;
- int i;
-
- va_start(args, f);
- devname = va_arg(args, char*);
- va_end(args);
-
- /* On first open, do netif open, mount, etc. */
- if (pxe_opens == 0) {
- /* Find network interface. */
- if (pxe_sock < 0) {
- pxe_sock = netif_open(devname);
- if (pxe_sock < 0) {
- printf("pxe_open: netif_open() failed\n");
- return (ENXIO);
- }
- if (pxe_debug)
- printf("pxe_open: netif_open() succeeded\n");
- }
- if (rootip.s_addr == 0) {
- /*
- * Do a bootp/dhcp request to find out where our
- * NFS/TFTP server is. Even if we dont get back
- * the proper information, fall back to the server
- * which brought us to life and a default rootpath.
- */
- bootp(pxe_sock, BOOTP_PXE);
- if (rootip.s_addr == 0)
- rootip.s_addr = bootplayer.sip;
- if (!rootpath[1])
- strcpy(rootpath, PXENFSROOTPATH);
-
- for (i = 0; rootpath[i] != '\0' && i < FNAME_SIZE; i++)
- if (rootpath[i] == ':')
- break;
- if (i && i != FNAME_SIZE && rootpath[i] == ':') {
- rootpath[i++] = '\0';
- if (inet_addr(&rootpath[0]) != INADDR_NONE)
- rootip.s_addr = inet_addr(&rootpath[0]);
- bcopy(&rootpath[i], &temp[0], strlen(&rootpath[i])+1);
- bcopy(&temp[0], &rootpath[0], strlen(&rootpath[i])+1);
- }
- printf("pxe_open: server addr: %s\n", inet_ntoa(rootip));
- printf("pxe_open: server path: %s\n", rootpath);
- printf("pxe_open: gateway ip: %s\n", inet_ntoa(gateip));
-
- setenv("boot.netif.ip", inet_ntoa(myip), 1);
- setenv("boot.netif.netmask", intoa(netmask), 1);
- setenv("boot.netif.gateway", inet_ntoa(gateip), 1);
- if (bootplayer.Hardware == ETHER_TYPE) {
- sprintf(temp, "%6D", bootplayer.CAddr, ":");
- setenv("boot.netif.hwaddr", temp, 1);
+ va_list args;
+ char *devname = NULL;
+ int i = 0;
+
+ va_start(args, f);
+ devname = va_arg(args, char*);
+ va_end(args);
+
+ if (pxe_opens == 0) {
+ /* Find network interface. */
+ if (pxe_sock < 0) {
+ pxe_sock = netif_open(devname);
+
+ if (pxe_sock < 0) {
+ printf("pxe_open: netif_open() failed\n");
+ return (ENXIO);
+ }
+
}
- setenv("boot.nfsroot.server", inet_ntoa(rootip), 1);
- setenv("boot.nfsroot.path", rootpath, 1);
- setenv("dhcp.host-name", hostname, 1);
+
+#ifdef PXE_BOOTP_USE_LIBSTAND
+ const PXE_IPADDR *addr = pxe_get_ip(PXE_IP_ROOT);
+
+ if ( (addr->ip == 0)) {
+ pxe_dhcp_query(0);
+ pxe_core_update_bootp();
+
+#ifdef PXEHTTP_UDP_FOR_LIBSTAND
+ gateip.s_addr = pxe_get_ip(PXE_IP_GATEWAY)->ip;
+ rootip.s_addr = pxe_get_ip(PXE_IP_ROOT)->ip;
+ netmask = pxe_get_ip(PXE_IP_NETMASK)->ip;
+ myip.s_addr = pxe_get_ip(PXE_IP_MY)->ip;
+ nameip.s_addr = pxe_get_ip(PXE_IP_NAMESERVER)->ip;
+#endif
+ }
+#endif /* PXE_BOOTP_USE_LIBSTAND */
}
- }
- pxe_opens++;
- f->f_devdata = &pxe_sock;
- return (error);
+ ++pxe_opens;
+ f->f_devdata = &pxe_sock;
+
+ return (0);
}
static int
pxe_close(struct open_file *f)
{
+ /* On last close, do netif close, etc. */
+ f->f_devdata = NULL;
+
+ if (pxe_opens)
+ --pxe_opens;
+
+ /* Not last close? */
+ if (pxe_opens > 0)
+ return (0);
-#ifdef PXE_DEBUG
- if (pxe_debug)
- printf("pxe_close: opens=%d\n", pxe_opens);
+ if (pxe_sock >= 0) {
+#ifdef PXE_DEBUG
+ printf("pxe_close: calling netif_close()\n");
#endif
-
- /* On last close, do netif close, etc. */
- f->f_devdata = NULL;
- /* Extra close call? */
- if (pxe_opens <= 0)
+ netif_close(pxe_sock);
+ pxe_sock = -1;
+ }
+
return (0);
- pxe_opens--;
- /* Not last close? */
- if (pxe_opens > 0)
- return(0);
-
- /* get an NFS filehandle for our root filesystem */
- pxe_setnfshandle(rootpath);
+}
- if (pxe_sock >= 0) {
+static void
+pxe_cleanup(void)
+{
+ pxe_core_shutdown();
+}
+static int
+pxe_netif_match(struct netif *nif, void *machdep_hint)
+{
#ifdef PXE_DEBUG
- if (pxe_debug)
- printf("pxe_close: calling netif_close()\n");
+ printf("pxe_netif_match() called.");
#endif
- netif_close(pxe_sock);
- pxe_sock = -1;
- }
- return (0);
+ return (1);
}
-static void
-pxe_print(int verbose)
+
+static int
+pxe_netif_probe(struct netif *nif, void *machdep_hint)
{
- if (pxe_call != NULL) {
- if (*bootplayer.Sname == '\0') {
- printf(" "IP_STR":%s\n",
- IP_ARGS(htonl(bootplayer.sip)),
- bootplayer.bootfile);
- } else {
- printf(" %s:%s\n", bootplayer.Sname,
- bootplayer.bootfile);
- }
- }
+#ifdef PXE_DEBUG
+ printf("pxe_netif_probe() called.");
+#endif
- return;
+#ifdef PXEHTTP_UDP_FOR_LIBSTAND
+ if (__pxe_nic_irq == 0)
+ return (-1);
+#else
+ t_PXENV_UDP_OPEN *udpopen_p = (t_PXENV_UDP_OPEN *)scratch_buffer;
+
+ bzero(udpopen_p, sizeof(*udpopen_p));
+
+ const PXE_IPADDR *my = pxe_get_ip(PXE_IP_MY);
+ udpopen_p->src_ip = my->ip;
+
+ pxe_core_call(PXENV_UDP_OPEN);
+
+ if (udpopen_p->status != 0) {
+ printf("pxe_netif_probe: failed %x\n", udpopen_p->status);
+ return (-1);
+ }
+#endif
+ return (0);
}
static void
-pxe_cleanup(void)
+pxe_netif_end(struct netif *nif)
{
#ifdef PXE_DEBUG
- t_PXENV_UNLOAD_STACK *unload_stack_p =
- (t_PXENV_UNLOAD_STACK *)scratch_buffer;
- t_PXENV_UNDI_SHUTDOWN *undi_shutdown_p =
- (t_PXENV_UNDI_SHUTDOWN *)scratch_buffer;
+ printf("pxe_netif_end() called.");
#endif
- if (pxe_call == NULL)
- return;
+#ifndef PXEHTTP_UDP_FOR_LIBSTAND
+ t_PXENV_UDP_CLOSE *udpclose_p = (t_PXENV_UDP_CLOSE *)scratch_buffer;
+
+ bzero(udpclose_p, sizeof(*udpclose_p));
+
+ pxe_core_call(PXENV_UDP_CLOSE);
- pxe_call(PXENV_UNDI_SHUTDOWN);
+ if (udpclose_p->status != 0)
+ printf("pxe_end failed %x\n", udpclose_p->status);
+#endif
+}
+static void
+pxe_netif_init(struct iodesc *desc, void *machdep_hint)
+{
+
#ifdef PXE_DEBUG
- if (pxe_debug && undi_shutdown_p->Status != 0)
- printf("pxe_cleanup: UNDI_SHUTDOWN failed %x\n",
- undi_shutdown_p->Status);
+ printf("pxe_netif_init(): called.\n");
#endif
+ uint8_t *mac = (uint8_t *)pxe_get_mymac();
+
+ int i;
+ for (i = 0; i < 6; ++i)
+ desc->myea[i] = mac[i];
- pxe_call(PXENV_UNLOAD_STACK);
+ const PXE_IPADDR *my = pxe_get_ip(PXE_IP_MY);
+ desc->xid = my->ip;
+}
-#ifdef PXE_DEBUG
- if (pxe_debug && unload_stack_p->Status != 0)
- printf("pxe_cleanup: UNLOAD_STACK failed %x\n",
- unload_stack_p->Status);
+static int
+pxe_netif_get(struct iodesc *desc, void *pkt, size_t len, time_t timeout)
+{
+#ifdef PXE_DEBUG
+ printf("pxe_netif_get(): called.\n");
#endif
+ return (len);
}
-void
-pxe_perror(int err)
+static int
+pxe_netif_put(struct iodesc *desc, void *pkt, size_t len)
{
- return;
+#ifdef PXE_DEBUG
+ printf("pxe_netif_put(): called.\n");
+#endif
+ return (len);
}
+#if defined(LOADER_NFS_SUPPORT)
/*
* Reach inside the libstand NFS code and dig out an NFS handle
* for the root filesystem.
@@ -413,6 +359,7 @@ struct nfs_iodesc {
u_char fh[NFS_FHSIZE];
/* structure truncated here */
};
+
extern struct nfs_iodesc nfs_root_node;
extern int rpc_port;
@@ -454,181 +401,127 @@ pxe_setnfshandle(char *rootpath)
sprintf(cp, "X");
setenv("boot.nfsroot.nfshandle", buf, 1);
}
-
-void
-pxenv_call(int func)
-{
-#ifdef PXE_DEBUG
- if (pxe_debug)
- printf("pxenv_call %x\n", func);
#endif
-
- bzero(&v86, sizeof(v86));
- bzero(data_buffer, sizeof(data_buffer));
-
- __pxenvseg = pxenv_p->RMEntry.segment;
- __pxenvoff = pxenv_p->RMEntry.offset;
-
- v86.ctl = V86_ADDR | V86_CALLF | V86_FLAGS;
- v86.es = VTOPSEG(scratch_buffer);
- v86.edi = VTOPOFF(scratch_buffer);
- v86.addr = (VTOPSEG(__pxenventry) << 16) | VTOPOFF(__pxenventry);
- v86.ebx = func;
- v86int();
- v86.ctl = V86_FLAGS;
-}
-void
-bangpxe_call(int func)
+#ifdef PXEHTTP_UDP_FOR_LIBSTAND
+/* new versions of udp send/recv functions */
+ssize_t
+sendudp(struct iodesc *h, void *pkt, size_t len)
{
-#ifdef PXE_DEBUG
- if (pxe_debug)
- printf("bangpxe_call %x\n", func);
+#ifdef PXE_DEBUG_HELL
+ printf("sendudp(): sending %u bytes from me:%u -> %s:%u\n",
+ len, ntohs(h->myport),
+ inet_ntoa(h->destip), ntohs(h->destport));
#endif
+ void *ipdata = pkt - sizeof(PXE_UDP_PACKET);
- bzero(&v86, sizeof(v86));
- bzero(data_buffer, sizeof(data_buffer));
-
- __bangpxeseg = pxe_p->EntryPointSP.segment;
- __bangpxeoff = pxe_p->EntryPointSP.offset;
-
- v86.ctl = V86_ADDR | V86_CALLF | V86_FLAGS;
- v86.edx = VTOPSEG(scratch_buffer);
- v86.eax = VTOPOFF(scratch_buffer);
- v86.addr = (VTOPSEG(__bangpxeentry) << 16) | VTOPOFF(__bangpxeentry);
- v86.ebx = func;
- v86int();
- v86.ctl = V86_FLAGS;
-}
-
-
-time_t
-getsecs()
-{
- time_t n = 0;
- time(&n);
- return n;
-}
-
-static int
-pxe_netif_match(struct netif *nif, void *machdep_hint)
-{
- return 1;
-}
-
+ PXE_IPADDR dst;
+ dst.ip = h->destip.s_addr;
-static int
-pxe_netif_probe(struct netif *nif, void *machdep_hint)
-{
- t_PXENV_UDP_OPEN *udpopen_p = (t_PXENV_UDP_OPEN *)scratch_buffer;
-
- if (pxe_call == NULL)
- return -1;
-
- bzero(udpopen_p, sizeof(*udpopen_p));
- udpopen_p->src_ip = bootplayer.yip;
- pxe_call(PXENV_UDP_OPEN);
-
- if (udpopen_p->status != 0) {
- printf("pxe_netif_probe: failed %x\n", udpopen_p->status);
- return -1;
+ if (!pxe_udp_send(ipdata, &dst, ntohs(h->destport),
+ ntohs(h->myport), len + sizeof(PXE_UDP_PACKET)))
+ {
+ printf("sendudp(): failed\n");
+ return (-1);
}
- return 0;
-}
-
-static void
-pxe_netif_end(struct netif *nif)
-{
- t_PXENV_UDP_CLOSE *udpclose_p = (t_PXENV_UDP_CLOSE *)scratch_buffer;
- bzero(udpclose_p, sizeof(*udpclose_p));
-
- pxe_call(PXENV_UDP_CLOSE);
- if (udpclose_p->status != 0)
- printf("pxe_end failed %x\n", udpclose_p->status);
-}
-
-static void
-pxe_netif_init(struct iodesc *desc, void *machdep_hint)
-{
- int i;
- for (i = 0; i < 6; ++i)
- desc->myea[i] = bootplayer.CAddr[i];
- desc->xid = bootplayer.ident;
+
+ return (len);
}
-static int
-pxe_netif_get(struct iodesc *desc, void *pkt, size_t len, time_t timeout)
+ssize_t
+readudp(struct iodesc *h, void *pkt, size_t len, time_t timeout)
{
- return len;
-}
+ PXE_UDP_DGRAM dgram;
+ struct udphdr *uh = (struct udphdr *) pkt - 1;
+
+ /* process any queued incoming packets */
+ pxe_core_recv_packets();
-static int
-pxe_netif_put(struct iodesc *desc, void *pkt, size_t len)
-{
- return len;
+ /* reading from default socket */
+ int recv = pxe_udp_read(NULL, pkt, len, &dgram);
+
+ if (recv == -1) {
+ printf("readudp(): failed\n");
+ return (-1);
+ }
+#ifdef PXE_DEBUG_HELL
+ printf("readudp(): received %d(%u/%u) bytes from %u port\n",
+ recv, len, dgram.size, dgram.src_port);
+#endif
+ uh->uh_sport = htons(dgram.src_port);
+
+ return (recv);
}
+#else /* !defined(PXEHTTP_UDP_FOR_LIBSTAND) */
+/* old variants of udp send/recv functions */
ssize_t
sendudp(struct iodesc *h, void *pkt, size_t len)
{
- t_PXENV_UDP_WRITE *udpwrite_p = (t_PXENV_UDP_WRITE *)scratch_buffer;
- bzero(udpwrite_p, sizeof(*udpwrite_p));
-
- udpwrite_p->ip = h->destip.s_addr;
- udpwrite_p->dst_port = h->destport;
- udpwrite_p->src_port = h->myport;
- udpwrite_p->buffer_size = len;
- udpwrite_p->buffer.segment = VTOPSEG(pkt);
- udpwrite_p->buffer.offset = VTOPOFF(pkt);
-
- if (netmask == 0 || SAMENET(myip, h->destip, netmask))
- udpwrite_p->gw = 0;
- else
- udpwrite_p->gw = gateip.s_addr;
-
- pxe_call(PXENV_UDP_WRITE);
+ t_PXENV_UDP_WRITE *udpwrite_p = (t_PXENV_UDP_WRITE *)scratch_buffer;
+ bzero(udpwrite_p, sizeof(*udpwrite_p));
+
+ udpwrite_p->ip = h->destip.s_addr;
+ udpwrite_p->dst_port = h->destport;
+ udpwrite_p->src_port = h->myport;
+ udpwrite_p->buffer_size = len;
+ udpwrite_p->buffer.segment = VTOPSEG(pkt);
+ udpwrite_p->buffer.offset = VTOPOFF(pkt);
+
+ if (netmask == 0 || SAMENET(myip, h->destip, netmask))
+ udpwrite_p->gw = 0;
+ else
+ udpwrite_p->gw = gateip.s_addr;
+ pxe_core_call(PXENV_UDP_WRITE);
#if 0
- /* XXX - I dont know why we need this. */
- delay(1000);
+ /* XXX - I dont know why we need this. */
+ delay(1000);
#endif
- if (udpwrite_p->status != 0) {
- /* XXX: This happens a lot. It shouldn't. */
- if (udpwrite_p->status != 1)
- printf("sendudp failed %x\n", udpwrite_p->status);
- return -1;
+ if (udpwrite_p->status != 0) {
+ /* XXX: This happens a lot. It shouldn't. */
+ if (udpwrite_p->status != 1)
+ printf("sendudp failed %x\n", udpwrite_p->status);
+
+ return (-1);
}
- return len;
+
+ return (len);
}
ssize_t
readudp(struct iodesc *h, void *pkt, size_t len, time_t timeout)
{
- t_PXENV_UDP_READ *udpread_p = (t_PXENV_UDP_READ *)scratch_buffer;
- struct udphdr *uh = NULL;
-
- uh = (struct udphdr *) pkt - 1;
- bzero(udpread_p, sizeof(*udpread_p));
-
- udpread_p->dest_ip = h->myip.s_addr;
- udpread_p->d_port = h->myport;
- udpread_p->buffer_size = len;
- udpread_p->buffer.segment = VTOPSEG(data_buffer);
- udpread_p->buffer.offset = VTOPOFF(data_buffer);
-
- pxe_call(PXENV_UDP_READ);
-
+ t_PXENV_UDP_READ *udpread_p = (t_PXENV_UDP_READ *)scratch_buffer;
+ struct udphdr *uh = NULL;
+
+ uh = (struct udphdr *) pkt - 1;
+ bzero(udpread_p, sizeof(*udpread_p));
+
+ udpread_p->dest_ip = h->myip.s_addr;
+ udpread_p->d_port = h->myport;
+ udpread_p->buffer_size = len;
+ udpread_p->buffer.segment = VTOPSEG(data_buffer);
+ udpread_p->buffer.offset = VTOPOFF(data_buffer);
+
+ pxe_core_call(PXENV_UDP_READ);
+
#if 0
- /* XXX - I dont know why we need this. */
- delay(1000);
+ /* XXX - I dont know why we need this. */
+ delay(1000);
#endif
- if (udpread_p->status != 0) {
- /* XXX: This happens a lot. It shouldn't. */
- if (udpread_p->status != 1)
- printf("readudp failed %x\n", udpread_p->status);
- return -1;
+ if (udpread_p->status != 0) {
+ /* XXX: This happens a lot. It shouldn't. */
+ if (udpread_p->status != 1)
+ printf("readudp failed %x\n", udpread_p->status);
+
+ return (-1);
}
- bcopy(data_buffer, pkt, udpread_p->buffer_size);
- uh->uh_sport = udpread_p->s_port;
- return udpread_p->buffer_size;
+
+ bcopy(data_buffer, pkt, udpread_p->buffer_size);
+ uh->uh_sport = udpread_p->s_port;
+
+ return (udpread_p->buffer_size);
}
+
+#endif /* PXEHTTP_UDP_FOR_LIBSTAND */
Modified: user/sbruno/head_146698/sys/boot/i386/libi386/pxe.h
==============================================================================
--- user/sbruno/head_146698/sys/boot/i386/libi386/pxe.h Fri Jan 25 11:52:56 2013 (r245905)
+++ user/sbruno/head_146698/sys/boot/i386/libi386/pxe.h Fri Jan 25 14:33:19 2013 (r245906)
@@ -48,6 +48,9 @@
* structures passed into PXE
* Question: does this really work for PXE's expected ABI?
*/
+#ifndef __PXE__H__
+#define __PXE__H__
+
#define PACKED __packed
#define S_SIZE(s) s, sizeof(s) - 1
@@ -156,7 +159,7 @@ typedef struct {
PXENV_STATUS_t Status;
ADDR32_t ProtocolIni; /* Phys addr of a copy of the driver module */
uint8_t reserved[8];
-} PACKED t_PXENV_UNDI_INITALIZE;
+} PACKED t_PXENV_UNDI_INITIALIZE;
#define MAXNUM_MCADDR 8
@@ -334,6 +337,15 @@ typedef struct {
uint32_t Reserved[4]; /* must be 0 */
} PACKED t_PXENV_UNDI_GET_NDIS_INFO;
+#define PXENV_UNDI_GET_STATE 0x0015
+typedef struct {
+ PXENV_STATUS_t Status;
+#define PXE_UNDI_GET_STATE_STARTED 1
+#define PXE_UNDI_GET_STATE_INITIALIZED 2
+#define PXE_UNDI_GET_STATE_OPENED 3
+ uint8_t UNDIstate; /* UNDI engine state */
+} PACKED t_PXENV_UNDI_GET_STATE;
+
#define PXENV_UNDI_ISR 0x0014
typedef struct {
PXENV_STATUS_t Status;
@@ -520,3 +532,5 @@ typedef struct {
typedef struct {
PXENV_STATUS_t Status;
} PACKED t_PXENV_STOP_BASE;
+
+#endif
Modified: user/sbruno/head_146698/sys/boot/i386/loader/Makefile
==============================================================================
--- user/sbruno/head_146698/sys/boot/i386/loader/Makefile Fri Jan 25 11:52:56 2013 (r245905)
+++ user/sbruno/head_146698/sys/boot/i386/loader/Makefile Fri Jan 25 14:33:19 2013 (r245906)
@@ -7,6 +7,11 @@ NEWVERSWHAT= "bootstrap loader" i386
# architecture-specific loader code
SRCS= main.c conf.c vers.c
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-user
mailing list