summaryrefslogtreecommitdiff
path: root/fw/esp32/components/eos/sock.c
diff options
context:
space:
mode:
Diffstat (limited to 'fw/esp32/components/eos/sock.c')
-rw-r--r--fw/esp32/components/eos/sock.c175
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);
}