summaryrefslogtreecommitdiffstats
path: root/src/tests
diff options
context:
space:
mode:
authorMichael Brown2006-08-09 05:00:11 +0200
committerMichael Brown2006-08-09 05:00:11 +0200
commitc9e6c33bba13477fc73ecbded61558e1d2d38793 (patch)
tree11d0c2baa633214ce97c878591e90b331cd7d085 /src/tests
parentImplement enough of PXENV_GET_CACHED_INFO to support pxelinux. (diff)
downloadipxe-c9e6c33bba13477fc73ecbded61558e1d2d38793.tar.gz
ipxe-c9e6c33bba13477fc73ecbded61558e1d2d38793.tar.xz
ipxe-c9e6c33bba13477fc73ecbded61558e1d2d38793.zip
Attempt a PXE NBP boot as the TFTP test.
Diffstat (limited to 'src/tests')
-rw-r--r--src/tests/dhcptest.c6
-rw-r--r--src/tests/tftptest.c34
2 files changed, 21 insertions, 19 deletions
diff --git a/src/tests/dhcptest.c b/src/tests/dhcptest.c
index 2afe6faf..47e0e8b4 100644
--- a/src/tests/dhcptest.c
+++ b/src/tests/dhcptest.c
@@ -57,7 +57,7 @@ static int test_dhcp_hello ( char *helloname ) {
return 0;
}
-static int test_dhcp_tftp ( char *tftpname ) {
+static int test_dhcp_tftp ( struct net_device *netdev, char *tftpname ) {
union {
struct sockaddr_in sin;
struct sockaddr_tcpip st;
@@ -69,7 +69,7 @@ static int test_dhcp_tftp ( char *tftpname ) {
find_global_dhcp_ipv4_option ( DHCP_EB_SIADDR,
&target.sin.sin_addr );
- return test_tftp ( &target.st, tftpname );
+ return test_tftp ( netdev, &target.st, tftpname );
}
static int test_dhcp_boot ( struct net_device *netdev, char *filename ) {
@@ -80,7 +80,7 @@ static int test_dhcp_boot ( struct net_device *netdev, char *filename ) {
} else if ( strncmp ( filename, "hello:", 6 ) == 0 ) {
return test_dhcp_hello ( &filename[6] );
} else {
- return test_dhcp_tftp ( filename );
+ return test_dhcp_tftp ( netdev, filename );
}
}
diff --git a/src/tests/tftptest.c b/src/tests/tftptest.c
index ba4c5d0f..e09ef585 100644
--- a/src/tests/tftptest.c
+++ b/src/tests/tftptest.c
@@ -4,32 +4,34 @@
#include <gpxe/udp.h>
#include <gpxe/tftp.h>
#include <gpxe/async.h>
+#include <gpxe/uaccess.h>
+#include "pxe.h"
-static void test_tftp_callback ( struct tftp_session *tftp __unused,
- unsigned int block __unused,
+static void test_tftp_callback ( struct tftp_session *tftp, unsigned int block,
void *data, size_t len ) {
- unsigned int i;
- char c;
+ unsigned long offset = ( ( block - 1 ) * tftp->blksize );
+ userptr_t pxe_buffer = real_to_user ( 0, 0x7c00 );
- for ( i = 0 ; i < len ; i++ ) {
- c = * ( ( char * ) data + i );
- if ( c == '\r' ) {
- /* Print nothing */
- } else if ( ( c == '\n' ) || ( c >= 32 ) || ( c <= 126 ) ) {
- putchar ( c );
- } else {
- putchar ( '.' );
- }
- }
+ copy_to_user ( pxe_buffer, offset, data, len );
}
-int test_tftp ( struct sockaddr_tcpip *target, const char *filename ) {
+int test_tftp ( struct net_device *netdev, struct sockaddr_tcpip *target,
+ const char *filename ) {
struct tftp_session tftp;
+ int rc;
memset ( &tftp, 0, sizeof ( tftp ) );
udp_connect ( &tftp.udp, target );
tftp.filename = filename;
tftp.callback = test_tftp_callback;
- return async_wait ( tftp_get ( &tftp ) );
+ printf ( "Fetching \"%s\" via TFTP\n", filename );
+ if ( ( rc = async_wait ( tftp_get ( &tftp ) ) ) != 0 )
+ return rc;
+
+ printf ( "Attempting PXE boot\n" );
+ pxe_netdev = netdev;
+ rc = pxe_boot();
+ printf ( "PXE NBP returned with status %04x\n", rc );
+ return 0;
}