svn commit: r245489 - user/sbruno/pxestuff/sys/boot/i386/loader
Sean Bruno
sbruno at FreeBSD.org
Wed Jan 16 04:35:36 UTC 2013
Author: sbruno
Date: Wed Jan 16 04:35:35 2013
New Revision: 245489
URL: http://svnweb.freebsd.org/changeset/base/245489
Log:
Merge last changes from pxe_http tree into the head version of /boot
looks like I've got some include files problems, clang doesn't handle
this part of the tree yet and I've found unsupported clang bits?
Note: doesn't compile yet, try again after I get some sleep
Modified:
user/sbruno/pxestuff/sys/boot/i386/loader/Makefile
user/sbruno/pxestuff/sys/boot/i386/loader/conf.c
user/sbruno/pxestuff/sys/boot/i386/loader/main.c
Modified: user/sbruno/pxestuff/sys/boot/i386/loader/Makefile
==============================================================================
--- user/sbruno/pxestuff/sys/boot/i386/loader/Makefile Wed Jan 16 03:59:42 2013 (r245488)
+++ user/sbruno/pxestuff/sys/boot/i386/loader/Makefile Wed Jan 16 04:35:35 2013 (r245489)
@@ -26,6 +26,8 @@ LIBZFSBOOT= ${.OBJDIR}/../../zfs/libzfsb
# Enable PXE TFTP or NFS support, not both.
.if defined(LOADER_TFTP_SUPPORT)
CFLAGS+= -DLOADER_TFTP_SUPPORT
+.elif defined(LOADER_HTTP_SUPPORT)
+CFLAGS+= -DLOADER_HTTP_SUPPORT
.else
CFLAGS+= -DLOADER_NFS_SUPPORT
.endif
@@ -37,6 +39,9 @@ HAVE_BCACHE= yes
HAVE_PNP= yes
HAVE_ISABUS= yes
+# Enable more pxe_http functions
+#CFLAGS+= -DPXE_MORE
+
.if ${MK_FORTH} != "no"
# Enable BootForth
BOOT_FORTH= yes
@@ -66,12 +71,15 @@ CFLAGS+= -Wall
LDFLAGS= -static -Ttext 0x0
# i386 standalone support library
-LIBI386= ${.OBJDIR}/../libi386/libi386.a
+LIBI386= ${.OBJDIR}/../libi386/libi386.a ${.OBJDIR}/../pxehttp/libpxe_http.a
CFLAGS+= -I${.CURDIR}/..
# BTX components
CFLAGS+= -I${.CURDIR}/../btx/lib
+# PXE HTTP components
+CFLAGS+= -I$(.CURDIR)/../pxe_http
+
# Debug me!
#CFLAGS+= -g
#LDFLAGS+= -g
Modified: user/sbruno/pxestuff/sys/boot/i386/loader/conf.c
==============================================================================
--- user/sbruno/pxestuff/sys/boot/i386/loader/conf.c Wed Jan 16 03:59:42 2013 (r245488)
+++ user/sbruno/pxestuff/sys/boot/i386/loader/conf.c Wed Jan 16 04:35:35 2013 (r245489)
@@ -45,6 +45,11 @@ __FBSDID("$FreeBSD$");
* XXX as libi386 and biosboot merge, some of these can become linker sets.
*/
+#ifdef LOADER_HTTP_SUPORT
+#undef LOADER_NFS_SUPPORT
+#undef LOADER_TFTP_SUPPO
+#endif
+
#if defined(LOADER_NFS_SUPPORT) && defined(LOADER_TFTP_SUPPORT)
#error "Cannot have both tftp and nfs support yet."
#endif
@@ -57,7 +62,8 @@ extern struct devsw fwohci;
struct devsw *devsw[] = {
&bioscd,
&biosdisk,
-#if defined(LOADER_NFS_SUPPORT) || defined(LOADER_TFTP_SUPPORT)
+#if defined(LOADER_NFS_SUPPORT) || defined(LOADER_TFTP_SUPPORT) || \
+ defined(LOADER_HTTP_SUPPORT)
&pxedisk,
#endif
#if defined(LOADER_FIREWIRE_SUPPORT)
@@ -69,14 +75,32 @@ struct devsw *devsw[] = {
NULL
};
+#if defined(LOADER_HTTP_SUPPORT)
+/* free as much as possible memory, by removing unused by PXE filesystems */
+#undef LOADER_EXT2_SUPPORT
+#undef LOADER_DOS_SUPPORT
+#undef LOADER_CD9660_SUPPORT
+#undef LOADER_SPLITFS_SUPPORT
+#undef LOADER_NFS_SUPPORT
+#undef LOADER_TFTP_SUPPORT
+#else
+#define LOADER_NFS_SUPPORT
+#endif
+
struct fs_ops *file_system[] = {
#if defined(LOADER_ZFS_SUPPORT)
&zfs_fsops,
#endif
&ufs_fsops,
+#if defined(LOADER_EXT2_SUPPORT)
&ext2fs_fsops,
+#endif
+#if defined(LOADER_DOS_SUPPORT)
&dosfs_fsops,
+#endif
+#if defined(LOADER_CD9660_SUPPORT)
&cd9660_fsops,
+#endif
#if defined(LOADER_NANDFS_SUPPORT)
&nandfs_fsops,
#endif
@@ -95,6 +119,9 @@ struct fs_ops *file_system[] = {
#ifdef LOADER_TFTP_SUPPORT
&tftp_fsops,
#endif
+#ifdef LOADER_HTTP_SUPPORT
+ &http_fsops,
+#endif
NULL
};
Modified: user/sbruno/pxestuff/sys/boot/i386/loader/main.c
==============================================================================
--- user/sbruno/pxestuff/sys/boot/i386/loader/main.c Wed Jan 16 03:59:42 2013 (r245488)
+++ user/sbruno/pxestuff/sys/boot/i386/loader/main.c Wed Jan 16 04:35:35 2013 (r245489)
@@ -49,6 +49,19 @@ __FBSDID("$FreeBSD$");
#include "../zfs/libzfs.h"
#endif
+#ifdef PXE_MORE
+#include "pxe_arp.h"
+#include "pxe_connection.h"
+#include "pxe_dns.h"
+#include "pxe_filter.h"
+#include "pxe_http.h"
+#include "pxe_httpls.h"
+#include "pxe_icmp.h"
+#include "pxe_ip.h"
+#include "pxe_sock.h"
+#include "pxe_tcp.h"
+#include "pxe_udp.h"
+#endif
CTASSERT(sizeof(struct bootargs) == BOOTARGS_SIZE);
CTASSERT(offsetof(struct bootargs, bootinfo) == BA_BOOTINFO);
CTASSERT(offsetof(struct bootargs, bootflags) == BA_BOOTFLAGS);
@@ -101,7 +114,8 @@ main(void)
bios_getmem();
#if defined(LOADER_BZIP2_SUPPORT) || defined(LOADER_FIREWIRE_SUPPORT) || \
- defined(LOADER_GPT_SUPPORT) || defined(LOADER_ZFS_SUPPORT)
+ defined(LOADER_GPT_SUPPORT) || defined(LOADER_ZFS_SUPPORT) || \
+ defined(LOADER_HTTP_SUPPORT)
if (high_heap_size > 0) {
heap_top = PTOV(high_heap_base + high_heap_size);
heap_bottom = PTOV(high_heap_base);
@@ -368,6 +382,290 @@ isa_outb(int port, int value)
outb(port, value);
}
+#ifdef PXE_MORE
+/* added for pxe_http */
+static int
+command_route(int argc, char *argv[])
+{
+ PXE_IPADDR net;
+ PXE_IPADDR gw;
+
+ if (argc < 2) {
+ printf("use: route add|del|print [default|net_addr gw_addr] \n");
+ return (CMD_OK);
+ }
+
+ if (!strcmp(argv[1], "print")) {
+ pxe_ip_route_stat();
+ return (CMD_OK);
+ }
+
+ if (argc < 4) {
+ printf("use: route add|del default|net_addr gw_addr\n");
+ return (CMD_OK);
+ }
+
+ if ( (strcmp(argv[1], "add") != 0) && (strcmp(argv[1], "del") != 0))
+ return (CMD_OK);
+
+ if (!strcmp(argv[2], "default")) {
+
+ if (!strcmp(argv[1], "del")) {
+ printf("Cannot delete default gateway.\n");
+ return (CMD_OK);
+ }
+
+ gw.ip = pxe_convert_ipstr(argv[3]);
+
+ pxe_ip_route_default(&gw);
+
+ return (CMD_OK);
+ }
+
+ gw.ip = pxe_convert_ipstr(argv[3]);
+ net.ip = pxe_convert_ipstr(argv[2]);
+
+ if (!strcmp(argv[1], "add")) {
+ pxe_ip_route_add(&net, pxe_ip_get_netmask(&net), &gw);
+ return (CMD_OK);
+ }
+
+ pxe_ip_route_del(&net, pxe_ip_get_netmask(&net), &gw);
+
+ return (CMD_OK);
+}
+
+static int
+command_arp(int argc, char *argv[])
+{
+ PXE_IPADDR *ip;
+
+ if (argc > 1) {
+
+ if (strcmp(argv[1], "stats") != 0)
+ ip = pxe_gethostbyname(argv[1]);
+ else {
+ pxe_arp_stats();
+ return (CMD_OK);
+ }
+
+ } else {
+ printf("use: arp ip4_address|stats\n");
+ return (CMD_OK);
+ }
+
+ printf("searching ip: %s\n", (ip != NULL) ? inet_ntoa(ip->ip) : "?");
+
+ const uint8_t* mac = (const uint8_t *)pxe_arp_ip4mac(ip);
+
+ if (mac != NULL)
+ printf("MAC: %6D\n", mac, ":");
+ else
+ printf("MAC search failed.\n");
+
+ return (CMD_OK);
+}
+
+static int
+command_ping(int argc, char *argv[])
+{
+ PXE_IPADDR *ip = NULL;
+
+ pxe_icmp_init();
+
+ if (argc > 1)
+ ip = pxe_gethostbyname(argv[1]);
+ else {
+ printf("use: ping ip4_address\n");
+ return (CMD_OK);
+ }
+
+ pxe_ping(ip, 5, 1);
+
+ return (CMD_OK);
+}
+
+static int
+command_await()
+{
+
+ while (1) {
+ if (!pxe_core_recv_packets()) {
+ twiddle();
+ delay(10000);
+ }
+ }
+
+ return (0);
+}
+
+static int
+command_sock(int argc, char *argv[])
+{
+ if (argc < 2) {
+ printf("use: socket stats|tcptest\n");
+ return (CMD_OK);
+ }
+
+ if (!strcmp(argv[1], "stats")) {
+ pxe_sock_stats();
+ return (CMD_OK);
+ }
+
+ return (CMD_OK);
+}
+
+static int
+command_resolve(int argc, char *argv[])
+{
+ if (argc < 2) {
+ printf("use: resolve dns_name\n");
+ return (CMD_OK);
+ }
+
+ PXE_IPADDR *ip;
+
+ char* name = argv[1];
+
+ ip = pxe_gethostbyname(name);
+
+ if ( (ip == NULL) || (ip->ip == 0))
+ printf("failed to resolve domain %s\n", name);
+ else
+ printf("%s resolved as %s\n", name, inet_ntoa(ip->ip));
+
+ return (CMD_OK);
+}
+
+static int
+command_ns(int argc, char *argv[])
+{
+ PXE_IPADDR *ip;
+
+ if (argc == 1) {
+ ip = pxe_get_ip32(PXE_IP_NAMESERVER);
+ printf("primary nameserver: %s\n", inet_ntoa(ip->ip));
+ return (CMD_OK);
+ }
+
+ PXE_IPADDR addr;
+
+ addr.ip = pxe_convert_ipstr(argv[1]);
+
+ if (addr.ip != 0)
+ pxe_set_ip32(PXE_IP_NAMESERVER, &addr);
+ else
+ printf("Syntax error in ip address.\n");
+
+ return (CMD_OK);
+}
+
+static int
+command_fetch(int argc, char *argv[])
+{
+ if (argc == 1) {
+ printf("usage: fetch server/path/to/file.ext\n");
+ return (CMD_OK);
+ }
+
+ char *server_name = argv[1];
+ char *filename = server_name;
+
+ while (*filename) {
+ if (*filename == '/') {
+ *filename = '\0';
+ ++filename;
+ break;
+ }
+ ++filename;
+ }
+
+ /* retrieve all file */
+ pxe_fetch(server_name, filename, 0LL, 0L);
+
+ return (CMD_OK);
+}
+
+static int
+command_ls(int argc, char *argv[])
+{
+
+ if (argc == 1) {
+ printf("usage: ls /path/to/dir\n");
+ return (CMD_OK);
+ }
+
+ int fd = open(argv[1], O_RDONLY);
+
+ if (fd == -1)
+ return (CMD_OK);
+
+ http_parse_index(fd);
+
+ close(fd);
+
+ return (CMD_OK);
+}
+
+COMMAND_SET(pxe, "pxe", "pxe test module", command_pxe);
+
+static int
+command_pxe(int argc, char *argv[])
+{
+ if (argc<2) {
+ printf("PXE test module (built at %s %s)\n", __DATE__, __TIME__);
+ printf(" use: pxe arp|await|connections|fetch|filters|\n"
+ "\tping|resolve|route|socket\n");
+ return (CMD_OK);
+ }
+
+ if (!strcmp(argv[1], "arp"))
+ return command_arp(argc - 1, &argv[1]);
+
+ if (!strcmp(argv[1], "ping"))
+ return command_ping(argc - 1, &argv[1]);
+
+ if (!strcmp(argv[1], "route"))
+ return command_route(argc - 1, &argv[1]);
+
+ if (!strcmp(argv[1], "filters")) {
+ pxe_filter_stats();
+ return (CMD_OK);
+ }
+
+ if (!strcmp(argv[1], "socket"))
+ return command_sock(argc - 1, &argv[1]);
+
+ if (!strcmp(argv[1], "resolve"))
+ return command_resolve(argc - 1, &argv[1]);
+
+ if (!strcmp(argv[1], "ns"))
+ return command_ns(argc - 1, &argv[1]);
+
+
+ if (!strcmp(argv[1], "await"))
+ return command_await();
+
+ if (!strcmp(argv[1], "connections")) {
+ pxe_connection_stats();
+ return (CMD_OK);
+ }
+
+ if (!strcmp(argv[1], "fetch")) {
+ return command_fetch(argc - 1, &argv[1]);
+ }
+
+ if (!strcmp(argv[1], "ls")) {
+ return command_ls(argc - 1, &argv[1]);
+ }
+
+ printf("unknown pxe command '%s'\n", argv[1]);
+
+ return (CMD_OK);
+}
+/* pxe_http add end */
+#endif
+
#ifdef LOADER_ZFS_SUPPORT
static void
i386_zfs_probe(void)
More information about the svn-src-user
mailing list