From 8cc40c4dafdeb2d5786695c19163c8e7cc757a46 Mon Sep 17 00:00:00 2001
From: Joshua Wise <joshua@nyus.joshuawise.com>
Date: Sat, 6 Dec 2008 08:00:02 -0500
Subject: [PATCH] Only memcpy as much as we need to when we need to.

---
 net/rfb.c | 21 +++++++--------------
 1 file changed, 7 insertions(+), 14 deletions(-)

diff --git a/net/rfb.c b/net/rfb.c
index 057c406..1f620f0 100644
--- a/net/rfb.c
+++ b/net/rfb.c
@@ -164,8 +164,7 @@ static void send_fsm(struct tcp_pcb *pcb, struct rfb_state *state) {
 			break;
 		}
 	
-		/* potential FALL THROUGH */
-
+		/* FALL THROUGH to SST_NEEDS_UPDATE*/
 	case SST_NEEDS_UPDATE:
 		outputf("RFB send: sending header");
 		/* Send a header */
@@ -182,12 +181,9 @@ static void send_fsm(struct tcp_pcb *pcb, struct rfb_state *state) {
 		state->update_pos = 0;
 		state->send_state = SST_SENDING;
 
-		/* FALL THROUGH */
-
+		/* FALL THROUGH to SST_SENDING*/
 	case SST_SENDING:
 		while (1) {
-			unsigned char mbuf[8192	/* XXX magic */];
-			
 			left = state->frame_bytes - state->update_pos;
 
 			if (left == 0) {
@@ -195,21 +191,21 @@ static void send_fsm(struct tcp_pcb *pcb, struct rfb_state *state) {
 				break;
 			}
 			
-			if (left > 8192)
+			if (left > 8192)	/* Sounds good enough to me. */
 				left = 8192;
 
-			memcpy(mbuf, fb->fbaddr + state->update_pos, left);	/* It's OK if it becomes smaller later. */
-			
 			sndlength = left;
 			do {
-				err = tcp_write(pcb, mbuf, sndlength, TCP_WRITE_FLAG_COPY /* This is my memory on the stack, thank you very much. */);
+				err = tcp_write(pcb, fb->fbaddr + state->update_pos, sndlength, TCP_WRITE_FLAG_COPY /* The card can't DMA from there. */);
 				if (err == ERR_MEM)		/* Back down until lwip says we've got space. */
 					sndlength /= 2;
 			} while (err == ERR_MEM && sndlength > 1);
 
 			if (err != ERR_OK) {
+				if (err != ERR_MEM)
+					outputf("RFB: send error %d", err);
+				
 				/* We'll just give up for now and come back when we have space later. */
-				//outputf("RFB: send error %d", err);
 				break;
 			}
 
@@ -224,9 +220,7 @@ static void send_fsm(struct tcp_pcb *pcb, struct rfb_state *state) {
 	}
 	
 	if (tcp_output(pcb) != ERR_OK)
-	{
 		outputf("RFB: tcp_output bailed in send_fsm?");
-	}
 }
 
 static err_t rfb_sent(void *arg, struct tcp_pcb *pcb, uint16_t len) {
@@ -344,7 +338,6 @@ static enum fsm_result recv_fsm(struct tcp_pcb *pcb, struct rfb_state *state) {
 			for (i = 0; i < ntohs(req->num); i++) {
 				outputf("RFB: Encoding: %d", ntohl(req->encodings[i]));
 				/* XXX ... */
-
 			}
 
 			state->readpos += pktsize;
-- 
2.43.0