Mercurial > repos > blastem
comparison megawifi.c @ 1518:713b504dc577
Limit received LSD packets to 1440 bytes to match expectations of wflash code. Use MSG_NOSIGNAL to avoid getting killed with SIGPIPE
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 31 Jan 2018 21:59:08 -0800 |
parents | aaab852803ac |
children | 2781b9551004 |
comparison
equal
deleted
inserted
replaced
1517:9136b7ea1ccb | 1518:713b504dc577 |
---|---|
17 TX_PAYLOAD, | 17 TX_PAYLOAD, |
18 TX_WAIT_ETX | 18 TX_WAIT_ETX |
19 }; | 19 }; |
20 #define STX 0x7E | 20 #define STX 0x7E |
21 #define ETX 0x7E | 21 #define ETX 0x7E |
22 #define MAX_RECV_SIZE 1440 | |
22 | 23 |
23 #define E(N) N | 24 #define E(N) N |
24 enum { | 25 enum { |
25 #include "mw_commands.c" | 26 #include "mw_commands.c" |
26 CMD_ERROR = 255 | 27 CMD_ERROR = 255 |
128 close(mw->sock_fds[channel]); | 129 close(mw->sock_fds[channel]); |
129 mw->channel_state[channel] = 0; | 130 mw->channel_state[channel] = 0; |
130 mw->channel_flags |= 1 << (channel + 1); | 131 mw->channel_flags |= 1 << (channel + 1); |
131 } | 132 } |
132 } else if (mw->channel_state[channel] == 2 && mw->receive_bytes < sizeof(mw->receive_buffer) - 4) { | 133 } else if (mw->channel_state[channel] == 2 && mw->receive_bytes < sizeof(mw->receive_buffer) - 4) { |
133 int bytes = recv( | 134 size_t max = sizeof(mw->receive_buffer) - 4 - mw->receive_bytes; |
134 mw->sock_fds[channel], | 135 if (max > MAX_RECV_SIZE) { |
135 mw->receive_buffer + mw->receive_bytes + 3, | 136 max = MAX_RECV_SIZE; |
136 sizeof(mw->receive_buffer) - 4 - mw->receive_bytes, | 137 } |
137 0 | 138 int bytes = recv(mw->sock_fds[channel], mw->receive_buffer + mw->receive_bytes + 3, max, 0); |
138 ); | |
139 if (bytes > 0) { | 139 if (bytes > 0) { |
140 mw_putc(mw, STX); | 140 mw_putc(mw, STX); |
141 mw_putc(mw, bytes >> 8 | (channel+1) << 4); | 141 mw_putc(mw, bytes >> 8 | (channel+1) << 4); |
142 mw_putc(mw, bytes); | 142 mw_putc(mw, bytes); |
143 mw->receive_bytes += bytes; | 143 mw->receive_bytes += bytes; |
313 printf("Unhandled MegaWiFi command %s(%d) with length %X\n", cmd_names[command], command, size); | 313 printf("Unhandled MegaWiFi command %s(%d) with length %X\n", cmd_names[command], command, size); |
314 break; | 314 break; |
315 } | 315 } |
316 } else if (mw->sock_fds[mw->transmit_channel - 1] >= 0 && mw->channel_state[mw->transmit_channel - 1] == 2) { | 316 } else if (mw->sock_fds[mw->transmit_channel - 1] >= 0 && mw->channel_state[mw->transmit_channel - 1] == 2) { |
317 uint8_t channel = mw->transmit_channel - 1; | 317 uint8_t channel = mw->transmit_channel - 1; |
318 int sent = send(mw->sock_fds[channel], mw->transmit_buffer, mw->transmit_bytes, 0); | 318 int sent = send(mw->sock_fds[channel], mw->transmit_buffer, mw->transmit_bytes, MSG_NOSIGNAL); |
319 if (sent < 0 && errno != EAGAIN && errno != EWOULDBLOCK) { | 319 if (sent < 0 && errno != EAGAIN && errno != EWOULDBLOCK) { |
320 close(mw->sock_fds[channel]); | 320 close(mw->sock_fds[channel]); |
321 mw->sock_fds[channel] = -1; | 321 mw->sock_fds[channel] = -1; |
322 mw->channel_state[channel] = 0; | 322 mw->channel_state[channel] = 0; |
323 mw->channel_flags |= 1 << mw->transmit_channel; | 323 mw->channel_flags |= 1 << mw->transmit_channel; |