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;