diff options
Diffstat (limited to 'fw/esp32/components/eos/sock.c')
| -rw-r--r-- | fw/esp32/components/eos/sock.c | 175 |
1 files changed, 85 insertions, 90 deletions
diff --git a/fw/esp32/components/eos/sock.c b/fw/esp32/components/eos/sock.c index b6ed3e9..dcad8b2 100644 --- a/fw/esp32/components/eos/sock.c +++ b/fw/esp32/components/eos/sock.c @@ -101,10 +101,27 @@ static void populate_fds(fd_set *fds, int *max_fd) { } } +static void cmd_xchg(uint8_t *cmd) { + int rv; + + xSemaphoreTake(mutex, portMAX_DELAY); + + rv = write(cmd_fd, cmd, sizeof(uint64_t)); + assert(rv == sizeof(uint64_t)); + + do { + rv = read(rep_fd, cmd, sizeof(uint64_t)); + assert(rv == sizeof(uint64_t)); + } while (cmd[0] == 0); + + xSemaphoreGive(mutex); +} + static void udp_rcvr_task(void *pvParameters) { EOSNetAddr addr; + EOSMessage msg; unsigned char *buffer; - uint16_t buf_len; + uint16_t len; fd_set all_fds, read_fds; uint8_t sock_i; uint8_t cmd[8]; @@ -112,8 +129,6 @@ static void udp_rcvr_task(void *pvParameters) { int sock, max_fd, i; int rv; - assert(sizeof(buffer) == 4); - populate_fds(&all_fds, &max_fd); while (1) { memcpy(&read_fds, &all_fds, sizeof(fd_set)); @@ -126,24 +141,27 @@ static void udp_rcvr_task(void *pvParameters) { for (i=0; i<EOS_SOCK_MAX_SOCK; i++) { sock = _socks[i]; if (sock && FD_ISSET(sock, &read_fds)) { - unsigned char *_buf; - - buffer = eos_net_alloc(); - _rv = t_recvfrom(sock, buffer + EOS_SOCK_SIZE_UDP_HDR, EOS_NET_SIZE_BUF - EOS_SOCK_SIZE_UDP_HDR, &addr); + eos_net_alloc(&msg); + if (msg.size < EOS_SOCK_SIZE_UDP_HDR) { + eos_net_free(&msg); + continue; + } + _rv = t_recvfrom(sock, msg.buffer + EOS_SOCK_SIZE_UDP_HDR, msg.size - EOS_SOCK_SIZE_UDP_HDR, &addr); if (_rv < 0) { - eos_net_free(buffer); + eos_net_free(&msg); ESP_LOGE(TAG, "RECV ERR:%d", _rv); + continue; } - _buf = buffer; - _buf[0] = EOS_SOCK_MTYPE_PKT; - _buf[1] = i + 1; - _buf += 2; - memcpy(_buf, addr.host, sizeof(addr.host)); - _buf += sizeof(addr.host); - _buf[0] = addr.port >> 8; - _buf[1] = addr.port; - _buf += sizeof(addr.port); - rv = eos_net_send(EOS_NET_MTYPE_SOCK, buffer, _rv + EOS_SOCK_SIZE_UDP_HDR); + buffer = msg.buffer; + buffer[0] = EOS_SOCK_MTYPE_PKT; + buffer[1] = i + 1; + buffer += 2; + memcpy(buffer, addr.host, sizeof(addr.host)); + buffer += sizeof(addr.host); + buffer[0] = addr.port >> 8; + buffer[1] = addr.port; + buffer += sizeof(addr.port); + rv = eos_net_send(EOS_NET_MTYPE_SOCK, &msg, _rv + EOS_SOCK_SIZE_UDP_HDR); if (rv) ESP_LOGE(TAG, "NET SEND ERR:%d", rv); } } @@ -167,7 +185,6 @@ static void udp_rcvr_task(void *pvParameters) { populate_fds(&all_fds, &max_fd); } } - memset(cmd, 0, sizeof(cmd)); cmd[1] = sock_i; rv = write(rep_fd, cmd, sizeof(cmd)); @@ -193,21 +210,21 @@ static void udp_rcvr_task(void *pvParameters) { case CMD_SEND: { sock_i = cmd[1] - 1; - buf_len = (uint16_t)cmd[2] << 8; - buf_len |= (uint16_t)cmd[3]; - memcpy(&buffer, cmd + 4, sizeof(buffer)); - sock = _socks[sock_i]; - memcpy(addr.host, buffer, sizeof(addr.host)); - buffer += sizeof(addr.host); - buf_len -= sizeof(addr.host); - addr.port = (uint16_t)buffer[0] << 8; - addr.port |= (uint16_t)buffer[1]; - buffer += sizeof(addr.port); - buf_len -= sizeof(addr.port); - _rv = t_sendto(sock, buffer, buf_len, &addr); - - memset(cmd, 0, sizeof(cmd)); + if (sock) { + len = (uint16_t)cmd[2] << 8; + len |= (uint16_t)cmd[3]; + memcpy(&buffer, cmd + 4, sizeof(buffer)); + + memcpy(addr.host, buffer, sizeof(addr.host)); + buffer += sizeof(addr.host); + len -= sizeof(addr.host); + addr.port = (uint16_t)buffer[0] << 8; + addr.port |= (uint16_t)buffer[1]; + buffer += sizeof(addr.port); + len -= sizeof(addr.port); + _rv = t_sendto(sock, buffer, len, &addr); + } rv = write(rep_fd, cmd, sizeof(cmd)); assert(rv == sizeof(cmd)); @@ -216,9 +233,6 @@ static void udp_rcvr_task(void *pvParameters) { } case CMD_REOPEN: { - buffer = NULL; - buf_len = 0; - for (i=0; i<EOS_SOCK_MAX_SOCK; i++) { sock = _socks[i]; if (sock) { @@ -226,6 +240,9 @@ static void udp_rcvr_task(void *pvParameters) { _socks[i] = -1; } } + + len = 0; + eos_msg_init(&msg, NULL, 0); for (i=0; i<EOS_SOCK_MAX_SOCK; i++) { sock = _socks[i]; if (sock) { @@ -234,20 +251,22 @@ static void udp_rcvr_task(void *pvParameters) { _socks[i] = sock; } else { _socks[i] = 0; - if (buffer) { - buffer[buf_len] = i + 1; - buf_len++; + if (msg.buffer) { + if (msg.size == len) break; + msg.buffer[len] = i + 1; + len++; } else { - buffer = eos_net_alloc(); - buffer[0] = EOS_SOCK_MTYPE_CLOSE; - buffer[1] = i + 1; - buf_len = 2; + eos_net_alloc(&msg); + if (msg.size < 2) break; + msg.buffer[0] = EOS_SOCK_MTYPE_CLOSE; + msg.buffer[1] = i + 1; + len = 2; } } } } - if (buffer) { - rv = eos_net_send(EOS_NET_MTYPE_SOCK, buffer, buf_len); + if (msg.buffer) { + rv = eos_net_send(EOS_NET_MTYPE_SOCK, &msg, len); if (rv) ESP_LOGE(TAG, "NET SEND ERR:%d", rv); } @@ -268,13 +287,13 @@ static void udp_rcvr_task(void *pvParameters) { vTaskDelete(NULL); } -static void sock_handler(unsigned char _mtype, unsigned char *buffer, uint16_t buf_len) { +static void sock_handler(unsigned char _mtype, EOSMessage *msg, uint16_t len) { unsigned char mtype; + unsigned char *buffer = msg->buffer; uint8_t sock_i; uint8_t cmd[8]; - int rv; - if (buf_len < 1) return; + if (len < 1) return; memset(cmd, 0, sizeof(cmd)); @@ -282,72 +301,55 @@ static void sock_handler(unsigned char _mtype, unsigned char *buffer, uint16_t b switch (mtype) { case EOS_SOCK_MTYPE_PKT: { unsigned char *_buf = buffer; + uint16_t _len = len; - if (buf_len < EOS_SOCK_SIZE_UDP_HDR) return; + if (len < EOS_SOCK_SIZE_UDP_HDR) break; sock_i = buffer[1]; - if ((sock_i == 0) || (sock_i > EOS_SOCK_MAX_SOCK)) return; + if ((sock_i == 0) || (sock_i > EOS_SOCK_MAX_SOCK)) break; _buf += 2; + _len -= 2; cmd[0] = CMD_SEND; cmd[1] = sock_i; - cmd[2] = buf_len >> 8; - cmd[3] = buf_len; + cmd[2] = _len >> 8; + cmd[3] = _len; memcpy(cmd + 4, &_buf, sizeof(_buf)); - xSemaphoreTake(mutex, portMAX_DELAY); - - rv = write(cmd_fd, cmd, sizeof(cmd)); - assert(rv == sizeof(cmd)); - - rv = read(rep_fd, cmd, sizeof(cmd)); - assert(rv == sizeof(cmd)); - - xSemaphoreGive(mutex); + cmd_xchg(cmd); assert(cmd[0] == CMD_SEND); break; } case EOS_SOCK_MTYPE_OPEN_DGRAM: { - cmd[0] = CMD_OPEN; - - xSemaphoreTake(mutex, portMAX_DELAY); + if (!(eos_msg_flags(msg) & EOS_MSG_FLAG_RPLY_REQ)) break; + if (msg->size < 2) break; - rv = write(cmd_fd, cmd, sizeof(cmd)); - assert(rv == sizeof(cmd)); - - rv = read(rep_fd, cmd, sizeof(cmd)); - assert(rv == sizeof(cmd)); + cmd[0] = CMD_OPEN; - xSemaphoreGive(mutex); + cmd_xchg(cmd); assert(cmd[0] == CMD_OPEN); + sock_i = cmd[1]; buffer[0] = EOS_SOCK_MTYPE_OPEN_DGRAM; buffer[1] = sock_i; - eos_net_reply(EOS_NET_MTYPE_SOCK, buffer, 2); + + eos_net_reply(EOS_NET_MTYPE_SOCK, msg, 2); break; } case EOS_SOCK_MTYPE_CLOSE: { - if (buf_len < 2) return; + if (len < 2) break; sock_i = buffer[1]; - if ((sock_i == 0) || (sock_i > EOS_SOCK_MAX_SOCK)) return; + if ((sock_i == 0) || (sock_i > EOS_SOCK_MAX_SOCK)) break; cmd[0] = CMD_CLOSE; cmd[1] = sock_i; - xSemaphoreTake(mutex, portMAX_DELAY); - - rv = write(cmd_fd, cmd, sizeof(cmd)); - assert(rv == sizeof(cmd)); - - rv = read(rep_fd, cmd, sizeof(cmd)); - assert(rv == sizeof(cmd)); - - xSemaphoreGive(mutex); + cmd_xchg(cmd); assert(cmd[0] == CMD_CLOSE); break; @@ -388,17 +390,10 @@ void eos_sock_run(void) { void eos_sock_reopen(void) { uint8_t cmd[8]; - int rv; cmd[0] = CMD_REOPEN; - xSemaphoreTake(mutex, portMAX_DELAY); - rv = write(cmd_fd, cmd, sizeof(cmd)); - assert(rv == sizeof(cmd)); + cmd_xchg(cmd); - rv = read(rep_fd, cmd, sizeof(cmd)); - assert(rv == sizeof(cmd)); - - xSemaphoreGive(mutex); assert(cmd[0] == CMD_REOPEN); } |
