break;
}
- /* potential FALL THROUGH */
-
+ /* FALL THROUGH to SST_NEEDS_UPDATE*/
case SST_NEEDS_UPDATE:
outputf("RFB send: sending header");
/* Send a header */
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) {
break;
}
- if (left > 8192)
+ if (left > 8192) /* Sounds good enough to me. */
left = 8192;
- if (left > tcp_mss(pcb)) {
- sndlength = tcp_mss(pcb);
- } else {
- sndlength = left;
- }
-
- memcpy(mbuf, fb->fbaddr + state->update_pos, sndlength); /* 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. */);
- if (err == ERR_MEM) {
- outputf("RFB: ERR_MEM sending %d", sndlength);
+ 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) {
- outputf("RFB: attempting send %d", sndlength);
- } else {
- outputf("RFB: send error %d", err);
+ 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. */
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) {
for (i = 0; i < ntohs(req->num); i++) {
outputf("RFB: Encoding: %d", ntohl(req->encodings[i]));
/* XXX ... */
-
}
state->readpos += pktsize;
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);