[syslinux:pathbased] sysdump: tftp: use lmalloc(), and set the gateway

syslinux-bot for H. Peter Anvin hpa at linux.intel.com
Fri Jun 18 18:30:19 PDT 2010


Commit-ID:  618d11938982a04070ded7291a9f12c3b0452d1d
Gitweb:     http://syslinux.zytor.com/commit/618d11938982a04070ded7291a9f12c3b0452d1d
Author:     H. Peter Anvin <hpa at linux.intel.com>
AuthorDate: Fri, 18 Jun 2010 18:24:14 -0700
Committer:  H. Peter Anvin <hpa at linux.intel.com>
CommitDate: Fri, 18 Jun 2010 18:24:14 -0700

sysdump: tftp: use lmalloc(), and set the gateway

Use lmalloc() rather than the fixed (obsolete) bounce buffer, and set
the gateway for PXE stacks that need it.

Signed-off-by: H. Peter Anvin <hpa at linux.intel.com>


---
 com32/sysdump/be_tftp.c |   27 +++++++++++++++++++++------
 1 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/com32/sysdump/be_tftp.c b/com32/sysdump/be_tftp.c
index 07fdb08..8c92d4d 100644
--- a/com32/sysdump/be_tftp.c
+++ b/com32/sysdump/be_tftp.c
@@ -21,23 +21,30 @@ enum tftp_opcode {
 struct tftp_state {
     uint32_t my_ip;
     uint32_t srv_ip;
+    uint32_t srv_gw;
     uint16_t my_port;
     uint16_t srv_port;
     uint16_t seq;
 };
 
+#define RCV_BUF	2048
+
 static int send_ack_packet(struct tftp_state *tftp,
 			   const void *pkt, size_t len)
 {
     com32sys_t ireg, oreg;
-    t_PXENV_UDP_WRITE *uw = __com32.cs_bounce;
-    t_PXENV_UDP_READ  *ur = __com32.cs_bounce;
+    t_PXENV_UDP_WRITE *uw;
+    t_PXENV_UDP_READ  *ur;
     clock_t start;
     static const clock_t timeouts[] = {
 	2, 2, 3, 3, 4, 5, 6, 7, 9, 10, 12, 15, 18, 21, 26, 31,
 	37, 44, 53, 64, 77, 92, 110, 132, 159, 191, 229, 0
     };
     const clock_t *timeout;
+    int err = -1;
+
+    uw = lmalloc(sizeof *uw + len);
+    ur = lmalloc(sizeof *ur + RCV_BUF);
 
     memset(&ireg, 0, sizeof ireg);
     ireg.eax.w[0] = 0x0009;
@@ -46,6 +53,7 @@ static int send_ack_packet(struct tftp_state *tftp,
 	memset(uw, 0, sizeof uw);
 	memcpy(uw+1, pkt, len);
 	uw->ip = tftp->srv_ip;
+	uw->gw = tftp->srv_gw;
 	uw->src_port = tftp->my_port;
 	uw->dst_port = tftp->srv_port ? tftp->srv_port : htons(69);
 	uw->buffer_size = len;
@@ -65,7 +73,7 @@ static int send_ack_packet(struct tftp_state *tftp,
 	    ur->dest_ip = tftp->my_ip;
 	    ur->s_port = tftp->srv_port;
 	    ur->d_port = tftp->my_port;
-	    ur->buffer_size = __com32.cs_bounce_size - sizeof *ur;
+	    ur->buffer_size = RCV_BUF;
 	    ur->buffer = FAR_PTR(ur+1);
 
 	    ireg.ebx.w[0] = PXENV_UDP_READ;
@@ -82,15 +90,20 @@ static int send_ack_packet(struct tftp_state *tftp,
 		if (ntohs(xb[0]) == TFTP_ACK &&
 		    ntohs(xb[1]) == tftp->seq) {
 		    tftp->srv_port = ur->s_port;
-		    return 0;		/* All good! */
+		    err = 0;		/* All good! */
+		    goto done;
 		} else if (ntohs(xb[1]) == TFTP_ERROR) {
-		    return -1;		/* All bad! */
+		    goto done;
 		}
 	    }
 	} while ((clock_t)(times(NULL) - start) < *timeout);
     }
 
-    return -1;			/* No success... */
+done:
+    lfree(ur);
+    lfree(uw);
+
+    return err;
 }
 
 static int be_tftp_write(struct backend *be)
@@ -108,6 +121,8 @@ static int be_tftp_write(struct backend *be)
     tftp.my_ip    = sdi->pxe.myip;
     tftp.my_port  = htons(local_port++);
     tftp.srv_ip   = pxe_dns(be->argv[1]);
+    tftp.srv_gw   = ((tftp.srv_ip ^ tftp.my_ip) & sdi->pxe.ipinfo->netmask)
+	? sdi->pxe.ipinfo->gateway : 0;
     tftp.srv_port = 0;
     tftp.seq      = 0;
 



More information about the Syslinux-commits mailing list