From c9e6c33bba13477fc73ecbded61558e1d2d38793 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Wed, 9 Aug 2006 03:00:11 +0000 Subject: [PATCH] Attempt a PXE NBP boot as the TFTP test. --- src/tests/dhcptest.c | 6 +++--- src/tests/tftptest.c | 34 ++++++++++++++++++---------------- 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 #include #include +#include +#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; }