X-Git-Url: http://git.joshuawise.com/netwatch.git/blobdiff_plain/bbfab4335b270484136e210ca96d24fb92d2c9ce..03bcc4db7995b38ecda927e65d7bf2e657477664:/net/rfb.c diff --git a/net/rfb.c b/net/rfb.c index eff9c41..057c406 100644 --- a/net/rfb.c +++ b/net/rfb.c @@ -177,8 +177,7 @@ static void send_fsm(struct tcp_pcb *pcb, struct rfb_state *state) { hdr.width = htons(fb->curmode.xres); hdr.height = htons(fb->curmode.yres); hdr.enctype = htonl(0); - tcp_write(pcb, &hdr, sizeof(hdr), 0); - tcp_output(pcb); + tcp_write(pcb, &hdr, sizeof(hdr), TCP_WRITE_FLAG_COPY); state->update_pos = 0; state->send_state = SST_SENDING; @@ -186,38 +185,31 @@ static void send_fsm(struct tcp_pcb *pcb, struct rfb_state *state) { /* FALL THROUGH */ case SST_SENDING: - while (1) { + unsigned char mbuf[8192 /* XXX magic */]; + left = state->frame_bytes - state->update_pos; if (left == 0) { state->send_state = SST_IDLE; break; } + + if (left > 8192) + left = 8192; - if (left > tcp_mss(pcb)) { - sndlength = tcp_mss(pcb); - } else { - sndlength = left; - } - + memcpy(mbuf, fb->fbaddr + state->update_pos, left); /* It's OK if it becomes smaller later. */ + + sndlength = left; do { - err = tcp_write(pcb, fb->fbaddr + state->update_pos, sndlength, 0); - if (err == ERR_MEM) { - outputf("RFB: ERR_MEM sending %d", sndlength); + err = tcp_write(pcb, mbuf, sndlength, TCP_WRITE_FLAG_COPY /* This is my memory on the stack, thank you very much. */); + 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) { - outputf("RFB: attempting send %d", sndlength); - } else { - outputf("RFB: send error %d", err); - break; - } - - if (tcp_output(pcb) != ERR_OK) { - outputf("RFB: tcp_output has had enough"); + if (err != ERR_OK) { + /* We'll just give up for now and come back when we have space later. */ + //outputf("RFB: send error %d", err); break; } @@ -230,6 +222,11 @@ static void send_fsm(struct tcp_pcb *pcb, struct rfb_state *state) { break; } + + 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) { @@ -309,7 +306,7 @@ static enum fsm_result recv_fsm(struct tcp_pcb *pcb, struct rfb_state *state) { state->state = ST_MAIN; outputf("RFB: Sending server info", state->version); - tcp_write(pcb, &server_info, sizeof(server_info), 0); + tcp_write(pcb, &server_info, sizeof(server_info), TCP_WRITE_FLAG_COPY); tcp_output(pcb); return OK; @@ -454,7 +451,7 @@ static err_t rfb_recv(void *arg, struct tcp_pcb *pcb, case OK: outputf("RFB FSM: ok"); - /* Might as well send now... */ + /* Kick off a send. */ if (state->send_state == SST_IDLE && state->update_requested) { send_fsm(pcb, state);