From 75a5374d79ee0defc46c306731142faccc6eda60 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Tue, 17 May 2005 14:49:46 +0000 Subject: [PATCH] Quickly hacked to use a buffer rather than a processor. These don't yet take advantage of the buffer functionality. --- src/proto/slam.c | 37 +++++++++++++++++++++---------------- src/proto/tftm.c | 41 +++++++++++++++++++---------------------- 2 files changed, 40 insertions(+), 38 deletions(-) diff --git a/src/proto/slam.c b/src/proto/slam.c index 09d53172..50745aec 100644 --- a/src/proto/slam.c +++ b/src/proto/slam.c @@ -2,6 +2,16 @@ #include "proto.h" #include "nic.h" +/* + * IMPORTANT + * + * This file should be rewritten to avoid the use of a bitmap. Our + * buffer routines can cope with being handed blocks in an arbitrary + * order, duplicate blocks, etc. This code could be substantially + * simplified by taking advantage of these features. + * + */ + #define SLAM_PORT 10000 #define SLAM_MULTICAST_IP ((239<<24)|(255<<16)|(1<<8)|(1<<0)) #define SLAM_MULTICAST_PORT 10000 @@ -82,6 +92,7 @@ struct slam_state { unsigned long received_packets; + struct buffer *buffer; unsigned char *image; unsigned char *bitmap; } state; @@ -104,10 +115,8 @@ struct slam_info { struct sockaddr_in server; struct sockaddr_in local; struct sockaddr_in multicast; - int ( * process ) ( unsigned char *data, - unsigned int blocknum, - unsigned int len, int eof ); int sent_nack; + struct buffer *buffer; }; #define SLAM_TIMEOUT 0 @@ -304,12 +313,11 @@ static unsigned char *reinit_slam_state( printf("ALERT: slam blocksize to large\n"); return 0; } - if (state.bitmap) { - forget(state.bitmap); - } bitmap_len = (state.total_packets + 1 + 7)/8; - state.bitmap = allot(bitmap_len); - state.image = allot(total_bytes); + state.image = phys_to_virt ( state.buffer->start ); + /* We don't use the buffer routines properly yet; fake it */ + state.buffer->fill = total_bytes; + state.bitmap = state.image + total_bytes; if ((unsigned long)state.image < 1024*1024) { printf("ALERT: slam filesize to large for available memory\n"); return 0; @@ -440,6 +448,7 @@ static int proto_slam(struct slam_info *info) long timeout; init_slam_state(); + state.buffer = info->buffer; retry = -1; rx_qdrain(); @@ -504,15 +513,11 @@ static int proto_slam(struct slam_info *info) leave_group(IGMP_SERVER); /* FIXME don't overwrite myself */ /* load file to correct location */ - return info->process(state.image, 1, state.total_bytes, 1); + return 1; } -static int url_slam ( char *url __unused, - struct sockaddr_in *server, - char *file, - int ( * process ) ( unsigned char *data, - unsigned int blocknum, - unsigned int len, int eof ) ) { +static int url_slam ( char *url __unused, struct sockaddr_in *server, + char *file, struct buffer *buffer ) { struct slam_info info; /* Set the defaults */ info.server = *server; @@ -520,7 +525,7 @@ static int url_slam ( char *url __unused, info.multicast.sin_port = SLAM_MULTICAST_PORT; info.local.sin_addr.s_addr = arptable[ARP_CLIENT].ipaddr.s_addr; info.local.sin_port = SLAM_LOCAL_PORT; - info.process = process; + info.buffer = buffer; info.sent_nack = 0; if (file[0]) { printf("\nBad url\n"); diff --git a/src/proto/tftm.c b/src/proto/tftm.c index b96736a1..426d0dda 100644 --- a/src/proto/tftm.c +++ b/src/proto/tftm.c @@ -35,6 +35,16 @@ * Indent Options: indent -kr -i8 ***************************************************************************/ +/* + * IMPORTANT + * + * This file should be rewritten to avoid the use of a bitmap. Our + * buffer routines can cope with being handed blocks in an arbitrary + * order, duplicate blocks, etc. This code could be substantially + * simplified by taking advantage of these features. + * + */ + #include "etherboot.h" #include "proto.h" #include "nic.h" @@ -43,9 +53,6 @@ struct tftm_info { struct sockaddr_in server; struct sockaddr_in local; struct sockaddr_in multicast; - int ( * process ) ( unsigned char *data, - unsigned int blocknum, - unsigned int len, int eof ); int sent_nack; const char *name; /* Filename */ }; @@ -56,6 +63,7 @@ struct tftm_state { unsigned long total_packets; char ismaster; unsigned long received_packets; + struct buffer *buffer; unsigned char *image; unsigned char *bitmap; char recvd_oack; @@ -221,17 +229,11 @@ static int proto_tftm(struct tftm_info *info) bitmap_len = (state.total_packets + 7) / 8; if (!state.image) { - state.bitmap = - allot(bitmap_len); - state.image = - allot(filesize); + state.image = phys_to_virt ( state.buffer->start ); + state.bitmap = state.image + filesize; + /* We don't yet use the buffer routines; fake it */ + state.buffer->fill = filesize; - if ((unsigned long) state. - image < 1024 * 1024) { - printf - ("ALERT: tftp filesize to large for available memory\n"); - return 0; - } memset(state.bitmap, 0, bitmap_len); } @@ -360,7 +362,6 @@ static int proto_tftm(struct tftm_info *info) TFTP_MIN_PACKET, &tp); /* ack */ } /* We are done get out */ - forget(state.bitmap); break; } @@ -376,15 +377,11 @@ static int proto_tftm(struct tftm_info *info) } /* Leave the multicast group */ leave_group(IGMP_SERVER); - return info->process(state.image, 1, filesize, 1); + return 1; } -static int url_tftm ( char *url __unused, - struct sockaddr_in *server, - char *file, - int ( * process ) ( unsigned char *data, - unsigned int blocknum, - unsigned int len, int eof ) ) { +static int url_tftm ( char *url __unused, struct sockaddr_in *server, + char *file, struct buffer *buffer ) { int ret; struct tftm_info info; @@ -394,7 +391,6 @@ static int url_tftm ( char *url __unused, info.local.sin_addr.s_addr = arptable[ARP_CLIENT].ipaddr.s_addr; info.local.sin_port = TFTM_PORT; /* Does not matter. */ info.multicast = info.local; - info.process = process; state.ismaster = 0; info.name = file; @@ -402,6 +398,7 @@ static int url_tftm ( char *url __unused, state.total_bytes = 0; state.total_packets = 0; state.received_packets = 0; + state.buffer = buffer; state.image = 0; state.bitmap = 0; state.recvd_oack = 0;